Antlr4 如何修复从ANTLR 4.2.2到4.3的中断

Antlr4 如何修复从ANTLR 4.2.2到4.3的中断,antlr4,Antlr4,我猜我正在修复这里提到的517: 但我不是很确定。我只知道如果我移动,我的xdot解析器就会崩溃 从4.2.2到4.3 xdot有一个成语:N-。广泛使用。 比如说 3-ABC 4-@8& 我在这里只使用了一个片段来实现它,并将字符限制为数字: integer returns [int v] : lhs=integer DIGIT {$v = (10 * $lhs.v) + $DIGIT.int;} | DASH DIGIT {$v = - $DIGIT.int

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

但我不是很确定。我只知道如果我移动,我的xdot解析器就会崩溃 从4.2.2到4.3

xdot有一个成语:N-。广泛使用。 比如说

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引用属于purvey 这是571次突破中的一次。我知道我应该用特殊符号$ctx来代替,
但遗憾的是,我没有看到任何关于我应该如何处理它的例子。

在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...
}
我希望这会有帮助。
善待动物组织

你实际上遇到了第672期。我想发布一个链接,但我在电话上,手边没有。链接是:看起来我需要等到4.4.1?对吗?谢谢你的及时回复!