antlr中的Lexer命令'more'与期望值不匹配

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

我在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”命令将匹配所有非数字的内容,并将其恢复为默认模式,因此它可以成为另一个标记的一部分。有人可以告诉我我的错误在哪里吗?谢谢。

command antlr lexer
1个回答
1
投票

假设您省略了跳过/隐藏空格的规则,这是在标记SMTH CLASS时发生的情况:

  1. 为文本文本KEYWORD_SMTH创建令牌"SMTH"
  2. 模式从DEFAULT_MODE更改为NUMBER_MODE
  3. 为文本"C"NO_NUMBER...)创建令牌的开头
  4. 模式从NUMBER_MODE更改为DEFAULT_MODE
  5. DEFAULT_MODE内,先前匹配的"C"被粘贴到标记为"LASS"的任何东西上(注意,这将与KEYWORD_CLASS不匹配!]

因此,假设"LASS"被标记为IDENTIFIER令牌或类似令牌,您将最终获得2个令牌:

  1. [KEYWORD_SMTH(文本"SMTH"
  2. [IDENTIFIER(文本"C" + "LASS"
© www.soinside.com 2019 - 2024. All rights reserved.