【问题标题】:Getting tree construction with ANTLR使用 ANTLR 构建树
【发布时间】:2010-06-11 18:15:18
【问题描述】:

根据Removing Left Recursion in ANTLR 中的提问和回答,我可以删除左递归

E -> E + T|T T -> T * F|F F -> 整数 | (五)

左递归去除后,得到以下一个

E -> TE' E'-> 空 | + TE' T -> 英尺' T'-> 空 | *英尺'

那么,如何用修改后的语法来构造树呢? 输入1+2,我想要一棵树

^('+' ^(INT 1) ^(INT 2))
。或类似的。 语法 T; 选项 { 输出=AST; 语言=Python; ASTLabelType=CommonTree; } 开始:e -> e ; e : t ep -> ??? ; EP: | '+' t ep -> ??? ; t : f tp -> ??? ; TP: | '*' f tp -> ??? ; f : 整数 | '(' e ')' -> e ; INT : '0'..'9'+ ; WS: (' '|'\n'|'\r')+ {$channel=HIDDEN;} ;

【问题讨论】:

标签: tree antlr compiler-theory


【解决方案1】:

一点意见:尽管有时可以从 LR 语法转到 LL 语法,但正如您所做的那样,结果并不像惯用的那样,对于熟悉的人来说,定义您的语法似乎是一种奇怪的方式LL 语法。

例如,考虑上面的以下摘录:

tp : 
  | '*' f tp -> ???

上面接受一个*,后跟一个f,其第一个集合将包含INT(,其自身的开始作为其右递归。因此,您将永远不会看到您想要根植于* 的表达式的开头,这将使构建您想要的树变得比需要的困难得多。

为了便于在 ANTLR 中创建 AST,您需要同时拥有操作数和运算符。

add:
   INT '+'^ INT;

插入符号^ 使+ 成为树的根,两个INTs 成为它的孩子。

Bart K linked to 示例是一个很棒的示例,我希望看到它使用 LL 语法完成......并且它可以扩展以支持不同优先级的运算符。 p>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多