Lassen Sie sagen, ich folgende ANTLR4 Grammatik:ANTLR4 Fragment für Parser Regeln
grammar test;
call : name=(F | G | H) LPAREN RPAREN
F : 'f';
G : 'g';
H : 'h';
LPAREN : '(';
RPAREN : ')';
ich in den Hörer der Lage bin, so etwas wie dieses (scala-Code) zu tun:
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 _ =>
}
}
Aber wenn Ich möchte die Alternative F | G | H
woanders wiederverwenden, ich muss entweder kopieren und einfügen oder etwas wie alt : (F | G | H);
tun und ich kann nicht mehr mit getType
übereinstimmen. Ich muss so etwas tun if(ctx.name.F() != null)
was hässlich ist.
Antlr kompiliert glücklich
call : name=ALT LPAREN RPAREN
ALT : F | G | H;
Aber es funktioniert nicht, ich kann nicht einmal herausfinden, was der Parser erwartet. Alle f()
, ALT()
, F | G | H()
sind fehlgeschlagen.
Ich habe da einen Weg, etwas wie Fragmente zu haben, aber für Parser-Regeln?