2010-03-23 8 views
8

Was ist der Unterschied zwischen dieser Grammatik ist:ANTLR Grammatik: parser- und Lexer Literale

... 
if_statement : 'if' condition 'then' statement 'else' statement 'end_if'; 
... 

und diese:

... 
if_statement : IF condition THEN statement ELSE statement END_IF; 
... 

IF : 'if'; 
THEN: 'then'; 
ELSE: 'else'; 
END_IF: 'end_if'; 
.... 

?

Wenn es einen Unterschied, da dies Auswirkungen auf die Leistung ... Dank

Antwort

1

Der einzige Unterschied besteht darin, dass implizit in Ihrer ersten Produktions Regel werden die Keyword-Token definiert. Es gibt keine Auswirkung auf die Laufzeitleistung für Token, die implizit oder explizit definiert sind.

8

Zusätzlich zu Wills Antwort ist es am besten, Ihre Lexer-Token explizit zu definieren (in Ihrer Lexer-Grammatik). Falls Sie sie in Ihrer Parser-Grammatik mischen, ist nicht immer klar, in welcher Reihenfolge die Token vom Lexer in Token umgewandelt werden. Wenn sie explizit definiert werden, werden sie immer in der Reihenfolge in die Reihenfolge gebracht, in der sie in die Lexer-Grammatik eingegeben wurden (von oben nach unten).

2

Der größte Unterschied ist einer, der dir vielleicht egal ist. Wenn sich Ihre Lexer-Regeln im Lexer befinden, können Sie die Vererbung verwenden, um mehrere Lexer-Teile mit einem gemeinsamen Satz lexikalischer Regeln zu teilen.

Wenn Sie nur Zeichenfolgen in Ihren Parser-Regeln verwenden, können Sie dies nicht tun. Wenn Sie Ihre Lexergrammatik nie wiederverwenden möchten, spielt dieser Vorteil keine Rolle.

Darüber hinaus bin ich, und ich vermute die meisten Antlr-Veteranen, mehr daran gewöhnt, die Lexerregeln in der tatsächlichen Lexergrammatik zu finden, anstatt mit der Parsergrammatik gemischt zu werden. Man könnte argumentieren, dass die Lesbarkeit durch das Setzen der Regeln erhöht wird im Lexer.

Es gibt keine Auswirkung auf die Laufzeitleistung, nachdem der Antlr-Parser für beide Ansätze erstellt wurde.

0

Ein weiterer Unterschied: Wenn Sie Ihre Lexerregeln explizit definieren, können Sie über den von Ihnen angegebenen Namen darauf zugreifen (z. B. wenn Sie nach einem bestimmten Tokentyp suchen). Andernfalls verwendet ANTLR willkürliche Nummern (mit einem Präfix).