antlr4 如何修复词法分析器模式隐式标记错误?
antlr4 How to fix lexer mode implicit token error?
我与一些文本发生了令牌冲突,正在考虑使用词法分析器模式来解决这些问题。
我在 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 { ... }
块中包含正确的 tokenVocab
:
parser grammar TSqlParser;
options {
tokenVocab=TSqlLexer;
}
...
编辑
Do you know where the mode block stops? Or does it run to EOF ?
模式块停止在 EOF
,或下一个 mode
。
提示:在语法的 top-most 部分定义 fragment
,这样您就可以在所有模式中使用这些 fragment
:
lexer grammar TSqlLexer;
BACKUP : 'BACKUP' -> pushMode(BackupTokens);
fragment DIGIT : [0-9];
mode BackupTokens;
...
A_RULE: DIGIT;
mode OtherMode;
...
SOME_RULE: DIGIT+;
我与一些文本发生了令牌冲突,正在考虑使用词法分析器模式来解决这些问题。
我在 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 { ... }
块中包含正确的 tokenVocab
:
parser grammar TSqlParser;
options {
tokenVocab=TSqlLexer;
}
...
编辑
Do you know where the mode block stops? Or does it run to EOF ?
模式块停止在 EOF
,或下一个 mode
。
提示:在语法的 top-most 部分定义 fragment
,这样您就可以在所有模式中使用这些 fragment
:
lexer grammar TSqlLexer;
BACKUP : 'BACKUP' -> pushMode(BackupTokens);
fragment DIGIT : [0-9];
mode BackupTokens;
...
A_RULE: DIGIT;
mode OtherMode;
...
SOME_RULE: DIGIT+;