假设我有以下ANTLR4语法:
grammar test;
call : name=(F | G | H) LPAREN RPAREN
F : 'f';
G : 'g';
H : 'h';
LPAREN : '(';
RPAREN : ')';
我能够在听众中做这样的事情(scala代码):
override def exitCall( ctx : testParser.CallContext ) = {
ctx.name.getType match{
case testParser.F => //handle F
case testParser.G => //handle G
case testParser.H => //handle H
case _ =>
}
}
但如果我想在其他地方重新使用替代F | G | H
,我需要这样做
复制并粘贴或执行alt : (F | G | H);
之类的操作,我无法再使用getType
进行匹配。我需要做一些丑陋的if(ctx.name.F() != null)
。
Antlr愉快地编译
call : name=ALT LPAREN RPAREN
ALT : F | G | H;
但它不起作用,我甚至无法弄清楚解析器的期望。所有f()
,ALT()
,F | G | H()
都失败了。
我有办法让像片段一样但是对于解析器规则?
答案 0 :(得分:0)
而不是检查F|G|H
检查通用标识符并在exitCall()
中执行呼叫名称验证。