antlr4 如何修复词法分析器模式隐式标记错误?

标签 antlr antlr4

我与某些文本发生了 token 冲突,并正在考虑使用词法分析器模式来解决这些问题。

我在 Lexer 文件中创建模式,但是当我编译 Parser 文件时,我收到以下警告:

warning(125): TSqlParser.g4:2377:26: implicit definition of token DISK in parser
warning(125): TSqlParser.g4:2377:31: implicit definition of token TAPE in parser
warning(125): TSqlParser.g4:2377:36: implicit definition of token URL in parser

我该如何解决这个问题?

我的模式定义是:

BACKUP:                                'BACKUP' -> pushMode(BackupTokens);

mode BackupTokens:
DISK:                                  'DISK' -> popMode();
TAPE:                                  'TAPE' -> popMode();
URL:                                   'URL' -> popMode();

最佳答案

您的词法分析器语法中有几个错误:

  • 这不是 popMode() 而是 popMode
  • 这不是 mode BackupTokens: 而是 mode BackupTokens;

因此,当您的词法分析器语法被称为 TSqlLexer 时,其内容如下:

lexer grammar TSqlLexer;

BACKUP : 'BACKUP' -> pushMode(BackupTokens);

mode BackupTokens;
  DISK : 'DISK' -> popMode;
  TAPE : 'TAPE' -> popMode;
  URL  : 'URL'  -> popMode;

那么您的解析器语法应在其 options { ... } block 中包含正确的 tokenVocab:

parser grammar TSqlParser;

options {
  tokenVocab=TSqlLexer;
}

...

编辑

Do you know where the mode block stops? Or does it run to EOF ?

模式 block 停止在EOF处,或者在下一个模式处。

提示:在语法的最顶部定义fragment,以便您可以在所有模式中使用这些fragment:

lexer grammar TSqlLexer;

BACKUP : 'BACKUP' -> pushMode(BackupTokens);

fragment DIGIT : [0-9];

mode BackupTokens;
  ...
  A_RULE: DIGIT;

mode OtherMode;
  ...
  SOME_RULE: DIGIT+;

关于antlr4 如何修复词法分析器模式隐式标记错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49585312/

相关文章:

antlr - xtext 中的终端/数据类型/解析器规则

java - 为 Antlr Java 8 语法添加注释

java - Antlr - 输入不匹配错误 - token 无法识别

java - ANTLR4 接受附加 token 有效吗?

angular - 没有'new'就不能调用类构造函数

c# - 无法让 Antlr4 解析器遵循隐式乘法的运算顺序

java - 使用 ANTLR4 检查嵌套函数中数组的最大出现次数

java - XText 验证 - 在验证期间获取原始输入

c# - 如何使用 ANTLR 获得正确的编码?

java - ANTLR 嵌套函数