antlr4如何修复lexer模式隐式令牌错误?

时间:2018-03-31 07:22:36

标签: antlr antlr4

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

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

1 个答案:

答案 0 :(得分:2)

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

  • 它不是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;

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

parser grammar TSqlParser;

options {
  tokenVocab=TSqlLexer;
}

...

修改

  

你知道模块的停止位置吗?或者它是否运行到EOF?

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

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

lexer grammar TSqlLexer;

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

fragment DIGIT : [0-9];

mode BackupTokens;
  ...
  A_RULE: DIGIT;

mode OtherMode;
  ...
  SOME_RULE: DIGIT+;