我问这个问题的一些背景。我正在阅读 Writing An Interpreter In Go,在书中,Tokenstruct is inside of AST Nodes。Node是一种可以通过实现tokenLiteral()和实现的类型String()type IntegerLiteral struct { Token token.Token Value int64}type Node interface { TokenLiteral() string String() string}我了解到在现实生活中,编译器必须提供错误的行和列位置,而词法分析器无法检测到错误,因此必须将此信息传递给解析器。例如go编译器使用下面作为 AST 节点。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:在每个级别中,“某些东西”被抽象出来。在我眼里,一个Token不应该是的一部分AST Node如果令牌是AST Node你能举例说明 PL 选择哪种方式吗
1 回答

白衣染霜花
TA贡献1796条经验 获得超10个赞
AST 的确切性质是编译器(或解析库)的实现细节,不同的 AST 实现将具有不同的字段,甚至相同语言的不同 AST 实现。
几乎总是有某种机制可以从 AST 节点中提取源位置信息,用于错误消息和嵌入在编译输出中的调试信息。这可以通过向每个 AST 节点类型添加一个(或多个)位置对象来完成。或者,位置信息可以保存在可以从 AST 节点以某种方式发现的令牌对象中。或者混合使用这些策略并提供 Location getter 方法。
我想不出一个很好的理由来坚持或禁止 AST 中的令牌对象。引用单个令牌文字或标识符的 AST 节点很可能保存在令牌对象中。为什么不?
- 1 回答
- 0 关注
- 93 浏览
添加回答
举报
0/150
提交
取消