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

我问这个问题的一些背景。

我正在阅读 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 选择哪种方式吗


qq_笑_17
浏览 94回答 1
1回答

白衣染霜花

AST 的确切性质是编译器(或解析库)的实现细节,不同的 AST 实现将具有不同的字段,甚至相同语言的不同 AST 实现。几乎总是有某种机制可以从 AST 节点中提取源位置信息,用于错误消息和嵌入在编译输出中的调试信息。这可以通过向每个 AST 节点类型添加一个(或多个)位置对象来完成。或者,位置信息可以保存在可以从 AST 节点以某种方式发现的令牌对象中。或者混合使用这些策略并提供 Location getter 方法。我想不出一个很好的理由来坚持或禁止 AST 中的令牌对象。引用单个令牌文字或标识符的 AST 节点很可能保存在令牌对象中。为什么不?
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go