2016-07-27 5 views
0

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

У меня есть способ иметь что-то вроде фрагментов, но для правил парсера?

ответ

0

Вместо проверки на F|G|H проверьте общий идентификатор и выполните проверку имени звонка в exitCall().

 Смежные вопросы

  • Нет связанных вопросов^_^