我与某些文本有象征性的碰撞,并且正在考虑使用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+;