2016-08-16 3 views
1

Ich möchte in der Lage sein, eine „Meta-Regel“ in ANTLR4 zu schreiben, die eine Regel als Eingabe Argument nimmt und führen eine Reihe Modifikation von dieser Regel. Hier ist ein Beispiel Grammatik:ANTLR4 Parser Regeln mit anderen Parsern Regeln als Argument (Meta-Regeln)

grammar G; 

WS: [ \t\n\r] + -> skip; 
CHAR: [a-z]; 
term: (CHAR)+; 
sum: term ('+' term)+; 
pterm: '(' term ')' | '(' pterm ')'; 
psum: '(' sum ')' | '(' psum ')'; 
expr: term | sum | pterm | psum; 

Die Regeln für pterm und psum haben die gleiche Wirkung auf term und sum, sie in möglicherweise verschachtelten Klammern umschließen. Ich mag die letzten drei Zeilen weiter oben mit so etwas wie die folgenden ersetzen können:

enclose[rule]: '(' rule ')' | '(' enclose(rule) ')'; 
expr: term | sum | enclose(term) | enclose(sum); 

Gibt es eine Möglichkeit, eine Meta-Regel wie diese zu konstruieren?

Antwort

1

Die kurze Antwort ist nein.

expr: LPAREN sum RPAREN | LPAREN expr RPAREN ; 
sum : term ('+' term)* ; // changed to Kleene star 
term: CHAR+ ; 

LPAREN : '(' ; 
RPAREN : ')' ; 
CHAR : [a-z] ; 
WS  : [ \t\n\r]+ -> skip ; 

Die sum Regel verbrauchen alle term s, so dass die expr Regel braucht nur sum s zu behandeln:

besser durch Refactoring die Grammatik und die Identifizierung der strukturell bedeutsamen Bedingungen zu lösen.

+0

Dank für die Überprüfung, dass dies nicht praktikabel ist. Ich glaube, ich habe versucht, im Parser zu viel zu machen. Ich habe den (komplizierteren) Parser neu geschrieben, um allgemeiner zu sein, und etwas von dem, was ich versucht habe, an den Parser-Handler verschoben. – user2487951

Verwandte Themen