词汇标记在特定模式下消失

问题描述 投票:0回答:1

我有这个词法分析器配置:

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
)?

预期的解决方案是什么?

谢谢。

antlr antlr4
1个回答
0
投票

如果在输入

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>'
© www.soinside.com 2019 - 2024. All rights reserved.