5

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

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

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

这运作良好 - 但是,我不知道这样做的任何“规则”。是否有我应该简化的特定语法规则?是感觉的问题,还是有更机械的过程?

4

1 回答 1

5

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

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

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

于 2013-07-31T17:58:28.193 回答