Пусть говорит, у меня есть следующий 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()
терпят неудачу.
У меня есть способ иметь что-то вроде фрагментов, но для правил парсера?