为了账号安全,请及时绑定邮箱和手机立即绑定

代币是否应该成为 AST 节点的一部分

代币是否应该成为 AST 节点的一部分

Go
qq_笑_17 2023-01-03 14:20:35
我问这个问题的一些背景。我正在阅读 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 节点很可能保存在令牌对象中。为什么不?


查看完整回答
反对 回复 2023-01-03
  • 1 回答
  • 0 关注
  • 93 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号