2013-05-06 5 views
13

Ich verwende gibt für meine Parser-Regeln, die für alle Parser-Regeln mit Ausnahme der ersten funktioniert. Wenn die erste Parser-Regel in meinem grammer verwendet die kehrt Erklärung beklagt ANTLR4 wie folgt:Probleme mit der Deklaration der Rückkehr auf die erste Parser-Regel in einer ANTLR4-Grammatik

ARG_ACTION erwartet, während eine Regel passenden

Wenn ich eine andere Parser-Regel hinzufügen, über die es nicht verwenden „returns“ ANTLR beklagt sich nicht.

Hier haben Sie eine Grammatik auf das Problem reduziert:

grammar FirstParserRuleReturnIssue; 
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*; 
aRule returns [String s]: ID { $s = $ID.text; }; 

ich eine besondere Rolle der ersten Regel zu finden, durchsucht, die das Verhalten erklären könnte, aber nichts gefunden. Ist es ein Fehler? Vermisse ich etwas Verständnis?

Antwort

13

Sie müssen Parser-Regeln (beginnen mit einem Kleinbuchstaben) vor lexer Regeln (beginnen mit einem Großbuchstaben) in Ihrer Grammatik. Nach dem Auftreten einer Lexer-Regel löst der [ einen LEXER_CHAR_SET statt ARG_ACTION aus, sodass der Token-Stream, der vom Compiler gesehen wird, so aussieht, als würden Sie eine Reihe von Zeichen übergeben, bei denen der Rückgabewert sein sollte.

+0

Das scheint wie ein Fehler in ANTLR, oder? –

Verwandte Themen