2016-07-27 13 views
0

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?

Antwort

0

Anstatt nach F|G|H zu suchen, suchen Sie nach einer generischen ID und führen Sie die Validierung des Call-Namens in exitCall() durch.

Verwandte Themen