我在antlr中使用了不同的词法分析器模式,并且在词法分析器中遇到了'more'命令的问题,因为它与相应令牌中的所有内容都不匹配。为了使事情更清楚,我的代码大致如下:
//DEFAULT_MODE
fragment A: ('A'); //same done for A-Z
KEYWORD_CLASS: C L A S S;
NUM: [0-9];
KEYWORD_SMTH: S M T H->mode(NUMBER_MODE);
mode NUMBER_MODE;
NUMBER: NUM+ ->mode(ANOTHER_MODE);
NO_NUMBER: ~[0-9]->more, mode(DEFAULT_MODE);
现在,当我尝试测试解析器规则时
rule: KEYWORD_SMTH NUMBER? CLASS;
然后,我希望匹配以下短语:
SMTH CLASS
但是由于某些原因,C的第一个字母与令牌不匹配。我必须输入类似
的内容SMTH gCLASS
为了匹配关键字CLASS。如果我理解正确,那么“ more”命令将匹配所有非数字的内容,并将其恢复为默认模式,因此它可以成为另一个标记的一部分。有人可以告诉我我的错误在哪里吗?谢谢。
假设您省略了跳过/隐藏空格的规则,这是在标记SMTH CLASS
时发生的情况:
KEYWORD_SMTH
创建令牌"SMTH"
DEFAULT_MODE
更改为NUMBER_MODE
"C"
(NO_NUMBER...
)创建令牌的开头NUMBER_MODE
更改为DEFAULT_MODE
DEFAULT_MODE
内,先前匹配的"C"
被粘贴到标记为"LASS"
的任何东西上(注意,这将与KEYWORD_CLASS
不匹配!]因此,假设"LASS"
被标记为IDENTIFIER
令牌或类似令牌,您将最终获得2个令牌:
KEYWORD_SMTH
(文本"SMTH"
)IDENTIFIER
(文本"C"
+ "LASS"
)