我問這個(gè)問題的一些背景。我正在閱讀 Writing An Interpreter In Go,在書中,Tokenstruct is inside of AST Nodes。Node是一種可以通過實(shí)現(xiàn)tokenLiteral()和實(shí)現(xiàn)的類型String()type IntegerLiteral struct { Token token.Token Value int64}type Node interface { TokenLiteral() string String() string}我了解到在現(xiàn)實(shí)生活中,編譯器必須提供錯(cuò)誤的行和列位置,而詞法分析器無法檢測到錯(cuò)誤,因此必須將此信息傳遞給解析器。例如go編譯器使用下面作為 AST 節(jié)點(diǎn)。type Pos int// All node types implement the Node interface.type Node interface { Pos() token.Pos // position of first character belonging to the node End() token.Pos // position of first character immediately after the node}我的問題的長版AFAIK,編譯前端的工作方式如下stream of chars -> streams of tokens -> AST:在每個(gè)級別中,“某些東西”被抽象出來。在我眼里,一個(gè)Token不應(yīng)該是的一部分AST Node如果令牌是AST Node你能舉例說明 PL 選擇哪種方式嗎
1 回答

白衣染霜花
TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超10個(gè)贊
AST 的確切性質(zhì)是編譯器(或解析庫)的實(shí)現(xiàn)細(xì)節(jié),不同的 AST 實(shí)現(xiàn)將具有不同的字段,甚至相同語言的不同 AST 實(shí)現(xiàn)。
幾乎總是有某種機(jī)制可以從 AST 節(jié)點(diǎn)中提取源位置信息,用于錯(cuò)誤消息和嵌入在編譯輸出中的調(diào)試信息。這可以通過向每個(gè) AST 節(jié)點(diǎn)類型添加一個(gè)(或多個(gè))位置對象來完成?;蛘?,位置信息可以保存在可以從 AST 節(jié)點(diǎn)以某種方式發(fā)現(xiàn)的令牌對象中。或者混合使用這些策略并提供 Location getter 方法。
我想不出一個(gè)很好的理由來堅(jiān)持或禁止 AST 中的令牌對象。引用單個(gè)令牌文字或標(biāo)識符的 AST 節(jié)點(diǎn)很可能保存在令牌對象中。為什么不?
- 1 回答
- 0 關(guān)注
- 87 瀏覽
添加回答
舉報(bào)
0/150
提交
取消