解析器规则的ANTLR4片段

时间:2016-07-27 22:14:30

标签: scala antlr antlr4

假设我有以下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()都失败了。

我有办法让像片段一样但是对于解析器规则?

1 个答案:

答案 0 :(得分:0)

而不是检查F|G|H检查通用标识符并在exitCall()中执行呼叫名称验证。