【问题标题】:ANTLR 3.x - How to format rewrite rulesANTLR 3.x - 如何格式化重写规则
【发布时间】:2010-02-27 03:15:47
【问题描述】:

当原始规则中出现某些情况时,我发现自己面临如何正确格式化重写规则的挑战。

重写这个的适当方法是什么:

unaryExpression: op=('!' | '-') t=term
  -> ^(UNARY_EXPR $op $t)

Antlr 似乎不喜欢我在括号中用标签标记任何东西,“op=”失败。另外,我试过了:

unaryExpression: ('!' | '-') t=term
  -> ^(UNARY_EXPR ('!' | '-') $t)

Antlr 不喜欢 or '|'并引发语法错误。

用标记名称替换字符类确实解决了这个问题,但是它给我的语法带来了其他问题的泥潭。

---编辑----

添加了第二个问题。请帮我用树语法格式化这条规则:

multExpression : unaryExpression (MULT_OP unaryExpression)* ;

非常简单:我的期望是将每个匹配的令牌包含在父(虚构)令牌MULT 中,这样我最终会得到类似的东西:

 MULT
  o
  |
  o---o---o---o---o
  |   |   |   |   |
 '3' '*' '6' '%'  2

【问题讨论】:

    标签: antlr antlr3 tree-grammar


    【解决方案1】:
    unaryExpression
        :    (op='!' | op='-') term
             -> ^(UNARY_EXPR[$op] $op term)
        ;
    

    我使用了UNARY_EXPR[$op],因此根节点可以获得一些有用的行/列信息,而不是默认为 -1。

    【讨论】:

    • 非常感谢。我以前从未听说过使用 TOKEN[$op],但我不是一个广泛的专家。在这种情况下使用它并没有产生我想要的结果。 UNARY_EXPR 标记是虚构的,在此上下文中用于描述它后面的两个标记。然而, op=x|op=y 正是我做的不对。
    猜你喜欢
    • 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
    相关资源
    最近更新 更多