我有这个词法分析器配置:
WS
: ((' ' | '\t' | '\r' | '\n')+ | '\\' '\n') -> skip
;
T_QUOTED
: '"'
;
T_CONFDIR_MYDIR
: 'MyDirective' -> pushMode(mydir)
;
T_COMMENT
: '#' .*? '\r'? '\n'
;
mode mydir;
T_MYDIRARG
: ~([\\" ])+ -> popMode
;
这是输入:
MyDirective "LiteralString"
当我尝试解析(实际上是使用 Python)时,我收到此错误:
line 4:21 token recognition error at: ' '
line 4:22 token recognition error at: '"'
line 4:23 extraneous input 'LiteralString' expecting '"'
line 5:0 mismatched input '<EOF>' expecting T_MYDIRARG
看起来如果状态转到
mydir
,那么默认模式下的令牌(WS
,T_QUOTED
)就会消失。
为什么词法分析器无法识别空格和
"
字符(它们定义为 WS
和 T_QUOTED
)?
预期的解决方案是什么?
谢谢。
如果在输入
mydir
后进入MyDirective
模式,第一个字符将是空格字符,mydir
无法识别。
看起来你想要的是这样的:
WS
: ((' ' | '\t' | '\r' | '\n')+ | '\\' '\n') -> skip
;
T_QUOTED_OPEN
: '"' -> pushMode(mydir)
;
T_CONFDIR_MYDIR
: 'MyDirective'
;
T_COMMENT
: '#' .*? '\r'? '\n'
;
mode mydir;
T_QUOTED_CLOSE
: '"' -> popMode
;
T_MYDIRARG
: ~([\\" ])+
;
这将产生以下结果:
5 tokens:
1 T_CONFDIR_MYDIR 'MyDirective'
2 T_QUOTED_OPEN '"'
3 T_MYDIRARG 'LiteralString'
4 T_QUOTED_CLOSE '"'
5 EOF '<EOF>'