如何解决从ANTLR 4.2.2到4.3的中断

时间:2014-11-30 21:14:57

标签: antlr4

我猜我正在修复这里提到的#517:

https://github.com/antlr/antlr4/issues/571

但我不确定。我所知道的是,如果我移动,我的xdot解析器就会中断 从4.2.2到4.3。

xdot有成语:N -<N characters go here>。使用非常普遍。 例如

3 -ABC 4 -#@8&

我一直在使用(这里只是一个片段,并将字符限制为数字):

integer returns [int v]
    :   
      lhs=integer DIGIT {$v = (10 * $lhs.v) + $DIGIT.int;}
    | DASH DIGIT {$v = - $DIGIT.int;}
    | DIGIT {$v = $DIGIT.int;}
    ;

bytes : integer SPACE DASH charSequence[$integer.v] ;

charElement : DIGIT ;

charSequence[int n]
  locals [int i = 1;]
 :  ( {$i<=$n}? charElement  {$i++;} )*  //match n chars
 ;

我的猜测是字节规则中的$integer.v引用属于提供者 571休息。我看到我应该使用特殊符号$ctx代替, 但是,我没有看到任何关于我应该用它做什么的例子。

1 个答案:

答案 0 :(得分:0)

您可以在ANTLR 4中使用访问者,而不是将目标代码写入语法。访问者可以递归访问规则并生成一些您可以定义的操作。

integer
    :   
      lhs=integer DIGIT #lbl1
    | DASH DIGIT #lbl2
    | DIGIT #lbl3
    ;
public class MyVisitor<object> : BaseGrammarNameVisitor<object>
{
    public override object VisitLbl1 (Parser.Lbl1Context context)
    {
        return (10 * Int.ParseInt(Visit(context.integer()))) + Int.ParseInt(context.DIGIT.Text)
    }
    public override object VisitLbl2 (Parser.Lbl2Context context)
    {
        return - Int.ParseInt(context.DIGIT.Text)
    }
    public override object VisitLbl3 (Parser.Lbl3Context context)
    {
        return Int.ParseInt(context.DIGIT.Text)
    }
    //and so on...
}

我希望它会有所帮助。 地图