2013-05-06 7 views
13

Używam zwraca dla moich reguł parsera, które działają dla wszystkich reguł parsera z wyjątkiem pierwszego. Jeśli pierwsza reguła parser w moim Grammer wykorzystuje Przywraca deklarację ANTLR4 skarży się następująco:Kłopoty z deklaracją zwrotów na pierwszej regule parsera w gramatyce ANTLR4

spodziewa ARG_ACTION dopasowując regułę

Jeśli dodać kolejną regułę parsera powyżej której nie używa „przychody” ANTLR nie narzeka.

Tutaj masz gramatyki zredukowane do problemu:

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

Szukałem znaleźć szczególną rolę pierwszej reguły, które mogłyby wyjaśnić zachowanie, ale nie znalazłem nic. Czy to błąd? Czy brakuje mi zrozumienia?

Odpowiedz

13

Musisz umieścić reguły analizatora składni (zaczynają się od małej litery) przed regułami leksykalnymi (zaczynają się od dużej litery) w gramatyce. Po napotkaniu reguły lexer, [ wyzwala LEXER_CHAR_SET zamiast ARG_ACTION, więc strumień token widziany przez kompilator wygląda tak, jakbyś przekazywał zestaw znaków, gdzie powinna znajdować się zwracana wartość.

+0

To wygląda na błąd w ANTLR, prawda? –