Ich habe die folgende einfache ANTLR Grammatik zu analysieren:einfache Grammatik-Fehler
grammar Grammar;
grammarRules : grammarRule+ ;
grammarRule:
lhs '->' WORD+
;
lhs: ID ;
WORD : LETTER+ ;
ID : LETTER (LETTER|'0'..'9')* ;
fragment
LETTER : [a-zA-Z\u0080-\u00FF_] ;
WS : [ \t] -> skip ;
Wenn ich versuche, die Zeichenfolge „Homepage -> Google-Suche“ zu analysieren, erhalte ich die Fehlermeldung:
line 1:0 mismatched input 'webpage' expecting ID
Ok, der größere Punkt scheint also zu sein, dass der Lexer als eigene Schicht komplett vom Parserschritt abweicht, so dass der Lexer die Verantwortung hat herauszufinden, was in Zweideutigkeiten zu tun ist. In dieser Hinsicht bin ich neugierig, warum das Hinzufügen eines Anweisungsabschlusszeichens das Mehrdeutigkeitsproblem löst. –
@DanielBigham Sie haben Recht. Das wird wahrscheinlich nicht genug sein. Sie müssen etwas wie 'lhs -> ID | tun WORT '. Damit benötigen Sie wahrscheinlich keinen Zeilenabschluss, da ANTLR-Parser LL (*) sind. (Du würdest, wenn sie nur LL (1) wären.) – Gene
Für andere Leute, die das später finden könnten - ich zog mir die Haare aus mit Antlr und bekam allerhand seltsames Verhalten, und dann las ich etwas über das Refactoring meiner Grammatik Die primäre Grammatik ist in einer einzigen Regel enthalten, anstatt in viele Regeln mit verschiedenen Symbolen aufgeteilt zu sein. Dies ermöglicht offensichtlich, dass die Linksrekursion der Grammatik besser behandelt werden kann. Presto, es funktioniert jetzt gut. –