我猜我正在修复这里提到的#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
代替,
但是,我没有看到任何关于我应该用它做什么的例子。
答案 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...
}
我希望它会有所帮助。 地图