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

时间:2013-07-30 01:25:46

标签: parsing compiler-construction grammar abstract-syntax-tree concrete-syntax-tree

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

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

statement_list : statement
               | statement_list statement

,如果保留为解析树,将生成看起来像

的扇形输出
program
        statement_list
                statement_list
                        statement
                                definition
                                        p_type
                                        assignment
                statement
                        definition
        statement
                assign
                        assignment

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

program
        definition
                p_type
                assignment
        definition
        assign
                assignment

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

1 个答案:

答案 0 :(得分:4)

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

  1. 删除不添加含义的令牌节点。那些是 中间关键字(如“then”),分隔符(如逗号)和 括号(如括号)。
  2. 将有意义的令牌(如“if”)推广为同一规则中其他令牌的父级。
  3. 没有单一食谱。这取决于目标语言中的短语是什么意思。