ANTLR:由于可以从alts访问递归规则调用,规则标记具有非LL(*)决策
我在一门关于计算机科学的课程中学习语法分析/词法分析。为此,我们正在使用ANTLR 我正在修改一种XML语言,因此它不再含糊不清,但当我对语法进行更改时,ANTLR抱怨道 我知道以前有人问过这个问题,但实际上没有什么帮助 当我在突击队提示符下运行ANTLR时,我已经拍摄了错误快照。 以下是XML语法:ANTLR:由于可以从alts访问递归规则调用,规则标记具有非LL(*)决策,antlr,antlr3,Antlr,Antlr3,我在一门关于计算机科学的课程中学习语法分析/词法分析。为此,我们正在使用ANTLR 我正在修改一种XML语言,因此它不再含糊不清,但当我对语法进行更改时,ANTLR抱怨道 我知道以前有人问过这个问题,但实际上没有什么帮助 当我在突击队提示符下运行ANTLR时,我已经拍摄了错误快照。 以下是XML语法: grammar XML; options { language = Java; } @lexer::members { boolean inTag = true; } xml_file re
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
: element element_body?
;
element_body
: element element_body?
;