Parsing 试图理解lexer、解析树和语法树

Parsing 试图理解lexer、解析树和语法树,parsing,compiler-construction,lexer,abstract-syntax-tree,Parsing,Compiler Construction,Lexer,Abstract Syntax Tree,我正在读《龙之书》,我想我理解了lexer、解析树和语法树的要点,以及它们通常应该捕获哪些错误(假设我们使用的是上下文无关语言),但如果我错了,我需要有人来捕获我。我的理解是,lexer只是标记输入并捕获与代码中无效构造有关的错误,例如在不包含分号的语言中传递的分号。解析树用于验证语法是否正确,代码的顺序是否正确,语法树用于实际计算代码中的语句和表达式,并生成诸如3地址代码或机器代码之类的内容。这些是正确的吗 旁注:具体语法树和解析树是一回事吗 旁注:在构建AST时,整个程序是构建在一个巨大的A

我正在读《龙之书》,我想我理解了lexer、解析树和语法树的要点,以及它们通常应该捕获哪些错误(假设我们使用的是上下文无关语言),但如果我错了,我需要有人来捕获我。我的理解是,lexer只是标记输入并捕获与代码中无效构造有关的错误,例如在不包含分号的语言中传递的分号。解析树用于验证语法是否正确,代码的顺序是否正确,语法树用于实际计算代码中的语句和表达式,并生成诸如3地址代码或机器代码之类的内容。这些是正确的吗

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


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

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

关于你的其他问题:

  • 是的,具体的语法树就是解析树
  • 通常情况下,解析器会 一棵树代表整个文件,因为它代表 CFG。但情况并非总是如此