【问题标题】:LR(1) parse straight to Abstract syntax treeLR(1) 直接解析为抽象语法树
【发布时间】:2015-05-28 00:25:25
【问题描述】:

所以我最近问了一个question 关闭这个并得到了一个很好的答案。然而,所描述的步骤似乎更像是创建具体语法树的步骤。

LR解析过程中的每一次约简对应一个内部 解析树中的节点。减少的规则是内部 AST 节点,从堆栈中弹出的项目对应于 那个内部节点。为 goto 推送的项目对应于 内部节点,而由 shift 动作推送的节点对应于 AST 的叶子(令牌)。

将所有这些放在一起,您可以通过创建一个 每次进行减少和接线时都会有新的内部节点 适当地在一起。 ~克里斯·多德

我知道所采取的步骤暗示了解析树,但是我不想显式构建解析树。并且每次减少生成一个节点似乎会导致整个解析树。我考虑过,如果看到某个状态,我只构建一个节点。但是,这似乎无法正常工作。

【问题讨论】:

    标签: java parsing tree abstract-syntax-tree lr


    【解决方案1】:

    您不需要在 every 缩减时构建一个节点,并且您构建的节点也不需要包含 every 正在缩减的符号。简化后的符号也不需要以与解析相同的顺序出现。

    在许多情况下,AST 是完整解析树的简化,对应于上述内容。

    简单示例,对于表达式语法,使用类似 yacc 的解析器生成器:

    expr: term            { $$ = $1; /* see below */ }
        | expr '+' term   { $$ = new_sum_node($1, $3); }
    term: factor          { $$ = $1; /* see below */ }
        | term '*' factor { $$ = new_product_node($1, $3); }
    factor: '(' expr ')'  { $$ = $2; /* See below */ }
          | ID            { $$ = new_variable_node($1); }
          | NUMBER        { $$ = new_literal_node($1); }
    

    AST 被构建为非终结符的语义值。函数new_*_node 应返回指定类型的新分配节点。 (这里我们假设有一些机制可以从指针推断出它是什么类型的节点。例如,可以使用子类型和虚函数。)

    在 Yacc(和类似的解析器生成器)中,每个符号(终端或非终端)都有一个关联的“值”,每个产生式都有一个关联的动作,当产生式减少时执行。产生式的动作可以分配被减少的非终结符的“值”。该动作可以利用右侧组件的“值”,因为每个都是终端(其值由扫描仪设置)或已减少的非终端。实际上,这是一个S-attributed grammar

    上面的一些减少根本没有出现在 AST 中。特别是,单位缩减(expr:termterm:factor)仅通过右侧的 AST。类似地,括号缩减term:'(' expr ')' 仅通过expr 的AST,结果括号有效地从AST 中消失。 (这在所有语言中都不正确;在某些语言中,明显冗余的括号实际上会影响语义,您需要创建一个 AST 节点来记录事实。)

    在 Yacc 中,如果未指定操作,$$ = $1 是默认的缩减操作,并且由于大多数单位缩减已从 AST 中消除,因此它们通常会在没有缩减操作的情况下显示。出于教学目的,我将它们明确表示;实际上,您不应该这样做。

    【讨论】:

    • 请您详细说明传递和默认操作,您介意吗?我也不熟悉 $$ 符号。这只是代表一个变量吗?抱歉,如果这是一个愚蠢的问题,出于某种原因,我的大脑很难解决这个特定的问题。不过谢谢你的回复!
    • @devin:对不起,我假设是一个类似 yacc 的解析器生成器,我应该更明确一点。在 yacc 中,设置 $$ 设置缩减非终结符的“值”。右侧符号的“值”是 $1、$2 等。
    • @DevinWall:希望额外的解释有所帮助。
    • 好的,谢谢。它应该。实际上,我一直在努力编写自己的 LR(1) 表生成器和解析器框架。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-01
    • 2012-01-15
    • 2013-07-30
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    相关资源
    最近更新 更多