1

我正在阅读“Dragon Book”,我想我理解词法分析器、解析树和语法树的要点以及它们通常应该捕获的错误(假设我们使用的是上下文无关语言),但是如果我错了,我需要有人来抓住我。我的理解是,词法分析器只是对输入进行标记并捕获与代码中的无效结构有关的错误,例如以不包含分号的语言传递分号。解析树用于验证语法是否被遵循以及代码的顺序是否正确,语法树用于实际评估代码中的语句和表达式并生成诸如三地址代码或机器代码之类的东西。这些都是正确的吗?

旁注:具体语法树和解析树是一回事吗?

旁注:在构建 AST 时,整个程序是构建成一个巨大的 AST,还是每个语句/表达式构建一个不同的 AST?

4

1 回答 1

2

严格来说,词法分析器也是解析器。词法分析器和解析器之间的区别在于它们的操作对象。在词法分析器的世界中,一切都是由单个字符组成的,然后通过将它们与它理解的常规语法匹配来进行标记。对于解析器来说,世界是由标记组成的,它通过将它们与它理解的上下文无关语法相匹配来生成语法树。从这个意义上说,他们都在做同样的事情,但在不同的层面上。事实上,您可以在解析器之上构建解析器,在越来越高的级别上运行,因此最高级别语法中的一个符号可以在最低级别表示非常复杂的东西。

对于您的其他问题:

  • 是的,具体的语法树就是解析树。
  • 通常,解析器为整个文件创建一棵树,因为它代表 CFG 中的一个句子。不过,情况不一定总是如此。
于 2013-11-16T00:07:06.227 回答