Antlrworks-外部输入
我是新手,因此我需要你的帮助。。 我试图解析Wikipedia转储,我的第一步是将它们定义的每个规则映射到ANTLR,不幸的是,我遇到了第一个障碍: 第1行:8外部输入“预期” 我不明白发生了什么事,请帮我一下 我的代码:Antlrworks-外部输入,antlr,wikipedia,antlrworks,Antlr,Wikipedia,Antlrworks,我是新手,因此我需要你的帮助。。 我试图解析Wikipedia转储,我的第一步是将它们定义的每个规则映射到ANTLR,不幸的是,我遇到了第一个障碍: 第1行:8外部输入“预期” 我不明白发生了什么事,请帮我一下 我的代码: grammar Test; options { language = Java; } parse : term+ EOF ; term : IDENT | '[[' term ']]' | '\'\'' term
grammar Test;
options {
language = Java;
}
parse
: term+ EOF
;
term
: IDENT
| '[[' term ']]'
| '\'\'' term '\'\''
| '\'\'\'' term '\'\'\''
;
IDENT
: ('a'..'z' | 'A'..'Z' | '0'..'9' | '=' | '#' | '"' | ' ')*
;
输入
“Hello World”lexer规则必须始终至少匹配一个字符。你的规则:
IDENT : ('a'..'z' | 'A'..'Z' | '0'..'9' | '=' | '#' | '"' | ' ')*;
匹配一个空字符串(其中有无限多个值)。将*
更改为+
:
IDENT : ('a'..'z' | 'A'..'Z' | '0'..'9' | '=' | '#' | '"' | ' ')+;
编辑
输入“你好,世界”
尽管您将文字标记放在解析器规则中('\'\''\''
,'\'\'\'\'
等),但您必须了解它们不是按照解析器的要求创建的。lexer遵循严格的规则来创建令牌:
BRACKET_OPEN : '[[';
BRACKET_CLOSE : ']]';
Q3 : '\'\'\'';
Q2 : '\'\'';
IDENT : ('a'..'z' | 'A'..'Z' | '0'..'9' | '=' | '#' | '"' | ' ')+;
现在,由于规则1(尽可能匹配),输入的“Hello World”
将标记如下:
Q3
Q2
IDENT
(是的,aQ3
!)Q3
Q2
术语
将只接受Q3 Q2 IDENT Q2 Q3
,因此您的输入无法正确解析是正确的
另外,我建议您不要使用解释器:它相当麻烦。调试器的工作方式很有魅力 我错过了测试,tks我将规则更改为加号(+),但不幸的是没有解决问题:(,已更改解析:term*EOF//现在我可以插入nocharacter@user3216500,然后我需要更多信息。你发布了你的全部语法吗?你能发布你正在解析的输入吗?你是如何测试的:在AntlWorks的解释器或其调试器中?我添加了输入“Hello World”,我正在使用解释器,是的,它是整个语法:)@user3216500 AntlWorks 1.x中的解释器功能经常非常不准确。您不应该相信它的结果能够代表运行语法时实际发生的情况。@user3216500,检查我的编辑