代码之家  ›  专栏  ›  技术社区  ›  Jesse Hallam

antlr 3.x-如何格式化重写规则

  •  3
  • Jesse Hallam  · 技术社区  · 15 年前

    我发现自己在如何在原始规则中出现某些条件时正确格式化重写规则方面遇到了挑战。

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

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

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

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

    Antlr不喜欢或“”,并抛出语法错误。

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

    ---编辑----

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

    multExpression : unaryExpression (MULT_OP unaryExpression)* ;

    非常简单:我的期望是将每个匹配的令牌都包含在父(虚)令牌中 MULT 所以我最终得到的结果是:

     MULT
      o
      |
      o---o---o---o---o
      |   |   |   |   |
     '3' '*' '6' '%'  2
    
    1 回复  |  直到 11 年前
        1
  •  2
  •   Sam Harwell    15 年前
    unaryExpression
        :    (op='!' | op='-') term
             -> ^(UNARY_EXPR[$op] $op term)
        ;
    

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

    推荐文章