ANTLR:规则令牌由于可以从alts到达的递归规则调用而具有非LL(*)决策

时间:2013-03-17 21:16:57

标签: antlr antlr3

我正在学习关于计算机科学课程的解析/学习。为此,我们使用的是ANTLR。

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

这是我“修复”语法的地方。所以我的问题是 - &gt;什么拧这个语法,我怎么能让它工作?非常感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

尝试将规则分解为:

element_body
    : element element_body?
;