如何将解析树转换为抽象语法树?

6

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

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

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
你可以选择软绵绵的“外观和感觉”,但这需要很多工作。你可以通过删除可以使用语法重新生成的节点来实现机械化。请参阅https://dev59.com/knI-5IYBdhLWcg3wYXL8#1916687。 - Ira Baxter
1个回答

5
这并不是“感觉”的问题。抽象语法树依赖于已解析内容的含义(语义),我认为以下规则可能适用:
  1. 删除不添加意义的标记节点。这些节点包括中间关键字(如“then”),分隔符(如逗号)和括号(如圆括号)。
  2. 将有意义的标记 (例如“if”)提升为同一规则中其他标记的父级。
没有一个通用的配方。它取决于目标语言中短语的含义。

我很感激你的回答,但感觉你自相矛盾。你说:“这不是什么‘感觉’的问题”,但你的规则取决于语言。如果有一些可参考的度量标准,那么我同意这不是感觉的问题,但据目前情况来看,它肯定是感觉上的。 - sdasdadas
我可以随时承认,设计(特别是语言设计)是50/50的工程和感觉。这样好吗? - Apalala
是的,当然,抱歉 - 我忘记回答这个问题了。感谢你的帮助。 - sdasdadas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接