2013-03-17 1 views
0

Я узнаю о разборе/лексике в курсе об информатике. Для этого мы используем ANTLR.ANTLR: rule Токенс имеет не-LL (*) решение из-за рекурсивных правил, вызываемых из alts

Я изменяю XML-язык, поэтому он уже не является двусмысленным, но когда я вношу изменения в грамматик, ANTLR жалуется.

Я знаю, что этот конкретный вопрос был задан раньше, но это действительно не помогло!

ANTLR: rule Tokens has non-LL(*) decision due to recursive rule invocations reachable from alts 1,2

Я взял снимок ошибки, когда я бегу ANTLR из коммандос-запроса. Snapshot of the error

Вот XML-грамматика:

grammar XML; 

options { 
language = Java; 
} 
@lexer::members { 
boolean inTag = true; 
} 
xml_file returns [TaggedElement value] 
: tagged_element EOF 
; 

tagged_element 
: start_tag element_body end_tag 
; 

element_body 
: element 
| element element_body 
; 

element 
: data_element 
| tagged_element 
; 

data_element 
: PCDATA 
; 

start_tag 
: OPEN_START_TAG NAME CLOSE_TAG 
; 

end_tag 
: OPEN_END_TAG NAME CLOSE_TAG 
; 

OPEN_START_TAG : '<' { inTag = true; }; 
OPEN_END_TAG : '</' { inTag = true; }; 
CLOSE_TAG  : '>' { inTag = false; }; 

NAME : {inTag}?=> ('a'..'z'|'A'..'Z')('a'..'z'|'A'..'Z'|'0'..'9')* ; 
WS  : {inTag}?=> (' '|'\t'|'\r'|'\n')+ { $channel = HIDDEN; } ; 
PCDATA : {!inTag}?=> (~'<')+ { setText($text.trim()); if ($text.length() == 0) $channel = HIDDEN; } ; 

Проблема возникает в

element_body 

который где я "фиксированный" в грамматику. Итак, мой вопрос -> Что зажимает эта грамматика, и как я могу заставить ее работать? Любая помощь очень ценится!

ответ

2

Попробуйте факторинга правило так:

element_body 
    : element element_body? 
; 
+0

Это работало отлично! Благодаря! – Andersnk

Смежные вопросы