我正在学习如何使用"更多" lexer命令。我输入了ANTLR书中的词法分析器语法,第281页:
lexer grammar Lexer_To_Test_More_Command ;
LQUOTE : '"' -> more, mode(STR) ;
WS : [ \t\r\n]+ -> skip ;
mode STR ;
STRING : '"' -> mode(DEFAULT_MODE) ;
TEXT : . -> more ;
然后我创建了这个简单的解析器来使用词法分析器:
grammar Parser_To_Test_More_Command ;
import Lexer_To_Test_More_Command ;
test: STRING EOF ;
然后我打开了一个DOS窗口并输入了这个命令:
antlr4 Parser_To_Test_More_Command.g4
生成了此警告消息:
警告(155):Parser_To_Test_More_Command.g4:3:29:规则LQUOTE 包含带有无法识别的常量值的词法分析器命令;词法分析器 口译员可能会产生不正确的输出
我在词法分析器或解析器中做错了吗?
答案 0 :(得分:2)
组合语法(仅以grammar
开头的语法,而不是parser grammar
或lexer grammar
)不能使用词法分析器模式。您应该使用import
功能,而不是使用tokenVocab
功能¹:
<强> Lexer_To_Test_More_Command.g4 强>:
lexer grammar Lexer_To_Test_More_Command;
// lexer rules and modes here
<强> Parser_To_Test_More_Command.g4 强>:
parser grammar Parser_To_Test_More_Command;
options {
tokenVocab = Lexer_To_Test_More_Command;
}
// parser rules here
¹我实际上建议在ANTLR中完全避免使用import
语句。我上面描述的方法几乎总是优选的。