哪里有最简单的示例来解释“解析树”和“抽象语法树”之间的区别?


14

据我了解,解析器会创建一个解析树,然后将其丢弃。但是,它也可以弹出一个抽象语法树,编译器据称可以利用它。

我的印象是解析树和抽象语法树都是在解析阶段创建的。那么有人可以解释为什么这些不同吗?


3
为什么它们必须有所不同?从两个略有不同的角度来看,它们不是同一件事吗?
S.Lott

1
不确定我是否理解这两种“略有不同的观点” :-(
组合逻辑

这才是重点。他们是同一回事,因此很混乱。根据您的观点,您只是使用了不同的单词:解析与代码生成(在解释器的情况下为执行)。
S.Lott 2012年

没有区别。稍加想象,就可以为任何可能的抽象语法树发明一种语法表示。由于缺乏想象力,Lisp的S表达式将成为适用于所有内容的默认语法。
SK-logic

1
大家在发表评论之前应该已经阅读了答案。有所不同,但是将它们分开或组合是一个实现问题。
保罗

Answers:


20

解析树也称为具体语法树。

基本上,抽象树比具体树具有更少的信息。具体的树包含语言中的每个元素,而抽象的树则丢弃了无趣的部分。

例如表达式: (2 + 5) * 8

混凝土看​​起来像这样

  ( 2  + 5 )  * 8
  |  \ | / |  | |
  |   \|/  |  | |
   \___|__/   | |
       \______|/

而抽象树具有:

2  5 
 \/   
  +  8
   \/
   *

在具体情况下,括号和语言的所有部分都已合并到树中。在抽象的情况下,括号消失了,因为它们的信息已被合并到树结构中。


您忘了提到以哪种语言在哪种编译器中实现这种方式。因为,您知道,您不必...解析器也可以立即丢弃括号。
Ingo 2014年

1
@Ingo,我的回答中没有任何关于编译器何时丢弃括号的内容。它询问具体的分析树和抽象的分析树之间有什么区别。
Winston Ewert

因此,您当然可以为索赔指定来源吗?还是这只是您的私人定义?
Ingo 2014年

1
@ Ingo,en.wikipedia.org / wiki / Abstract_syntax_tree 和en.wikipedia.org/wiki/Concrete_syntax_tree
Winston Ewert


0

您需要了解的第一件事是,没有人会强迫您以某种方式编写解析器或编译器。具体而言,解析器的结果不一定必须是树。它可以是适合表示输入的任何数据结构。

例如,以下语言:

prog:
      definition 
    | definition ';' prog
    ;

definition: .....

可以表示为定义列表。(Nitpickers会指出,列表一棵退化的树,但是无论如何。)

其次,不需要保留解析树(解析器返回的任何数据结构)。相反,编译器通常构造为通过序列,以转换前一遍的结果。因此,编译器的总体布局可以是:

parser :: String             -> Maybe [Definitions]      -- parser
pass1  :: [Definitions]      -> Maybe DesugaredProg      -- desugarer
pass2  :: DesugaredProg      -> Maybe TypedProg          -- type checker
pass3  :: TypedProg          -> Maybe AbstractTargetLang -- code generation
pass4  :: AbstractTargetLang -> Maybe String             -- pretty printer

compiler :: String           -> Maybe String    -- transform source code to target code
compiler source = do
   defs  <- parser source
   desug <- pass1 defs
   typed <- pass2 desug
   targt <- pass3 typed
   pass4 targt

底线:如果您听到人们谈论语法分析树抽象语法树具体语法树等,请始终用适合给定目的数据结构代替,这很好。


2
这如何回答问题?
Winston Ewert 2014年

@WinstonEwert我声称“解析树”和“抽象语法树”是抽象的,仅表示“合适的数据结构”。因此,答案是,其共性的问题是没有意义的,除非你要求解析器的返回类型和语言L的编译器XY其他一些传球的返回类型之间的区别
英戈
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.