我是这方面的新手,因此我需要你的帮助。
我正在尝试解析 Wikipedia Dump,我的第一步是将它们定义的每个规则映射到 ANTLR,不幸的是我遇到了第一个障碍:
第 1 行:8 外部输入 ''''' 需要 '\'\''
我不明白发生了什么事,请帮助我。
My code:
grammar Test;
options {
language = Java;
}
parse
: term+ EOF
;
term
: IDENT
| '[[' term ']]'
| '\'\'' term '\'\''
| '\'\'\'' term '\'\'\''
;
IDENT
: ('a'..'z' | 'A'..'Z' | '0'..'9' | '=' | '#' | '"' | ' ')*
;
Input'''''你好世界'''''
词法分析器规则必须始终匹配至少 1 个字符。你的规则:
IDENT : ('a'..'z' | 'A'..'Z' | '0'..'9' | '=' | '#' | '"' | ' ')*;
匹配一个空字符串(其数量是无限的)。改变*
to a +
:
IDENT : ('a'..'z' | 'A'..'Z' | '0'..'9' | '=' | '#' | '"' | ' ')+;
EDIT
Input '''''Hello World'''''
尽管您将文字标记放入解析器规则中('\'\'\''
, '\'\''
等),你必须明白它们是not根据解析器的要求创建。词法分析器遵循严格的规则来创建标记:
- 它尝试尽可能多地匹配
- 如果 2 个不同的词法分析器规则匹配相同数量的字符,则第一个定义的规则将优先
让我们为您的文字标记命名:
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
,因此您的输入无法正确解析是正确的。
另外,我建议您不要使用解释器:它有很多问题。不过,调试器的工作方式就像一个魅力!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)