【问题标题】:How do I reduce my parse tree into an abstract syntax tree?如何将我的解析树简化为抽象语法树?
【发布时间】:2013-07-30 00:04:24
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你可以追求柔软的“外观和感觉”,但这主要是很多工作。您可以通过删除可以使用语法重新生成的节点来机械地执行此操作。见stackoverflow.com/a/1916687/120163

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


【解决方案1】:

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

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

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

【讨论】:

  • 我很欣赏这个答案,但感觉就像你在自相矛盾。你说“这不是‘感觉’的问题”,但你的规则取决于语言。如果有一些指标可供参考,那么我同意这不是感觉问题,但就目前而言,它肯定是那种感觉。
  • 我承认任何一天设计(特别是语言设计)是 50/50 工程/感觉。这样好吗?
  • 是的,当然,抱歉 - 我忘了回到这个问题。感谢您的帮助。
猜你喜欢
  • 2016-09-20
  • 1970-01-01
  • 1970-01-01
  • 2012-01-15
  • 1970-01-01
  • 1970-01-01
  • 2011-08-23
  • 1970-01-01
相关资源
最近更新 更多