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;
那么您的解析器语法应该包括适当的
tokenVocab
在its中
options { ... }
块:
parser grammar TSqlParser;
options {
tokenVocab=TSqlLexer;
}
...
编辑
你知道模式块停在哪里吗?还是运行到EOF?
模式块在
EOF
,或在下一个
mode
。
提示:定义
fragment
在你语法的最上面的部分,你可以使用这些
碎片
来自所有模式:
lexer grammar TSqlLexer;
BACKUP : 'BACKUP' -> pushMode(BackupTokens);
fragment DIGIT : [0-9];
mode BackupTokens;
...
A_RULE: DIGIT;
mode OtherMode;
...
SOME_RULE: DIGIT+;