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).
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-Shares mit einem gemeinsamen Satz lexikalischer Regeln zu teilen.
Wenn Sie in Ihren Parser-Regeln nur Zeichenfolgen verwenden, können Sie dies nicht tun. Wenn Sie Ihre Lexergrammatik nie wiederverwenden möchten, spielt dieser Vorteil keine Rolle.
Außerdem bin ich, und ich vermute die meisten Antlr-Veteranen, eher daran gewöhnt, die Lexer-Regeln in der eigentlichen Lexer-Grammatik zu finden, anstatt mit der Parser-Grammatik gemischt zu werden. Man könnte also argumentieren, dass die Lesbarkeit durch das Einfügen der Regeln erhöht wird der Lexer.Es gibt keine Auswirkung auf die Laufzeitleistung, nachdem der Antlr-Parser für beide Ansätze erstellt wurde.
Noch ein weiterer Unterschied: Wenn Sie Ihre Lexerregeln explizit definieren, können Sie über den Namen, den Sie ihnen gegeben haben, darauf zugreifen (z. B. wenn Sie nach einem bestimmten Tokentyp suchen). Andernfalls verwendet ANTLR willkürliche Nummern (mit einem Präfix).