Antlr4如何修复Lexer模式隐式令牌误差



我与某些文本有象征性的碰撞,并且正在考虑使用Lexer模式解决问题。

我在Lexer文件中创建模式,但是当我补充解析器文件时,我会收到以下警告:

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();

您的Lexer语法中有几个错误:

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

所以,当您将Lexer语法称为TSqlLexer时,具有以下内容:

lexer grammar TSqlLexer;
BACKUP : 'BACKUP' -> pushMode(BackupTokens);
mode BackupTokens;
  DISK : 'DISK' -> popMode;
  TAPE : 'TAPE' -> popMode;
  URL  : 'URL'  -> popMode;

然后,您的解析器语法应在其options { ... }块中包含适当的tokenVocab

parser grammar TSqlParser;
options {
  tokenVocab=TSqlLexer;
}
...

编辑

您知道模式块停止的位置吗?还是它运行到eof?

模式块停止在EOF或下一个mode

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

lexer grammar TSqlLexer;
BACKUP : 'BACKUP' -> pushMode(BackupTokens);
fragment DIGIT : [0-9];
mode BackupTokens;
  ...
  A_RULE: DIGIT;
mode OtherMode;
  ...
  SOME_RULE: DIGIT+;

最新更新