如何将解析树缩减为抽象语法树?

sda*_*das 5 compiler-construction grammar parsing abstract-syntax-tree concrete-syntax-tree

将解析树(即具体语法树)简化为抽象语法树的一般策略是什么?

例如,我有以下语法规则:

statement_list : statement
               | statement_list statement
Run Code Online (Sandbox Code Playgroud)

如果保留为解析树,它将生成看起来像扇形输出

program
        statement_list
                statement_list
                        statement
                                definition
                                        p_type
                                        assignment
                statement
                        definition
        statement
                assign
                        assignment
Run Code Online (Sandbox Code Playgroud)

如果我连接每个节点的子节点(因为语句列表在解析后没有固有含义),我可以实现以下内容

program
        definition
                p_type
                assignment
        definition
        assign
                assignment
Run Code Online (Sandbox Code Playgroud)

这很好用 - 但是,我没有意识到这样做的任何"规则".是否有特定的语法规则我​​应该简化?这是一种感觉问题,还是一个更机械化的过程?

Apa*_*ala 5

这不是“感觉”的问题。抽象语法树取决于所解析内容的含义(语义),我认为这些将是规则:

  1. 删除不增加意义的标记的节点。这些是中间关键字(如“then”)、分隔符(如逗号)和括号(如括号)。
  2. 将有意义的标记(如“if”)提升为同一规则中其他标记的父代。

没有单一的食谱。这取决于目标语言中的短语的含义。