【发布时间】:2021-02-18 16:34:04
【问题描述】:
我一直在用AST explorer 研究各种语言的语法和 AST 节点。 使用 python,我注意到在解析过程中会发生某种形式的语义分析。例如
x = 2
x = 2
产生以下由 VariableDeclaration 节点和 ExpressionStatement 节点组成的 AST。
所以当解析第一行x = 2 时,它会检查符号表是否存在x,然后注册它并生成VariableDeclaration 节点。然后在解析第二行x = 2的时候,发现x已经定义好了,产生了一个ExpressionStatement节点。
但是,当我尝试使用以下语义不正确的代码时:
2 + "string"
它接受代码,并生成一个ExpressionStatement 节点——即使它在语义上不正确,即int + string,当我尝试使用 python 解释器执行它时会产生错误。
这表明语义分析发生了两次:一次是在解析过程中,另一次是在遍历完整的 AST 时。这个假设正确吗?如果是这样,为什么会这样?在解析过程中做整个语义分析阶段而不是拆分它不是更简单吗?
【问题讨论】:
标签: parsing abstract-syntax-tree semantic-analysis