2016-07-02 23 views
0

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 

Antwort

0

Deine Grammatik ist gebrochen. Die Definition von WORD entspricht webpage. Das ist, was der Lexer zurückgibt, so beschwert sich der Parser, dass er keine ID sieht. Wenn Sie versuchen, webpage1 -> google search zu analysieren, sollte es funktionieren, weil webpage1 kein WORD ist.

Die Grammatik ist nicht LL (*). Gegeben z. der Eingang a -> b c d -> e f, der Parser müsste voraus auf den zweiten -> schauen, um Informationen an den Lexer zurückzuleiten, was dazu führt, dass d als ID und nicht als WORD erkannt wird. ANTLER macht das nicht. (Sie würden es wahrscheinlich nicht wollen, da dies den Lexer erheblich komplizieren und folglich verlangsamen könnte.)

Sie können das Problem beheben, indem Sie Ihrer Sprache ein Anweisungsabschlusszeichen wie Newline oder Semikolon hinzufügen.

+0

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. –

+0

@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

+0

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. –