2013-03-17 57 views
0

我正在学习关于计算机科学课程中的解析/解析。为此我们使用ANTLR。ANTLR:规则令牌由于可从alts获得的递归规则调用而具有非LL(*)决策

我在修改一个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 

的问题是其中i “固定” 的语法。所以我的问题是 - >这个语法有什么问题,我怎样才能使它工作?任何帮助是极大的赞赏!

回答

2

尝试融通规则是这样的:

element_body 
    : element element_body? 
; 
+0

这真是棒极了!谢谢! – Andersnk 2013-03-17 22:51:28