我是新手,因此我需要你的帮助.. 我正在尝试解析维基百科转储,我的第一步是将他们定义的每个规则映射到ANTLR,不幸的是我遇到了第一个障碍:
第1行:8个无关的输入'''''期待'\'\''
我不明白发生了什么,请借给我你的帮助。
我的代码:
grammar Test;
options {
language = Java;
}
parse
: term+ EOF
;
term
: IDENT
| '[[' term ']]'
| '\'\'' term '\'\''
| '\'\'\'' term '\'\'\''
;
IDENT
: ('a'..'z' | 'A'..'Z' | '0'..'9' | '=' | '#' | '"' | ' ')*
;
输入 ''''''Hello World'''''
答案 0 :(得分:1)
词法分析器规则必须始终匹配至少1个字符。你的规则:
IDENT : ('a'..'z' | 'A'..'Z' | '0'..'9' | '=' | '#' | '"' | ' ')*;
匹配一个空字符串(其中包含无限量)。将*
更改为+
:
IDENT : ('a'..'z' | 'A'..'Z' | '0'..'9' | '=' | '#' | '"' | ' ')+;
输入
'''''Hello World'''''
虽然您将文字标记放在解析器规则('\'\'\''
,'\'\''
等)中,但您必须明白它们是在解析器的命令下而不是创建的。词法分析器遵循严格的规则来创建令牌:
让我们为你的文字标记命名:
BRACKET_OPEN : '[[';
BRACKET_CLOSE : ']]';
Q3 : '\'\'\'';
Q2 : '\'\'';
IDENT : ('a'..'z' | 'A'..'Z' | '0'..'9' | '=' | '#' | '"' | ' ')+;
现在,由于规则#1(尽可能匹配),输入'''''Hello World'''''
将被标记为如下:
Q3
Q2
IDENT
Q3
(是的,Q3
!)Q2
但是您的解析器规则term
只接受Q3 Q2 IDENT Q2 Q3
,因此输入无法正确解析是正确的。
另外,我建议你不要使用解释器:它是相当错误的。虽然调试器就像一个魅力!