ANTLR4:词法分析器中无法识别的常量值

时间:2015-02-07 15:59:01

标签: parsing antlr antlr4 lexer

我正在学习如何使用"更多" 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   包含带有无法识别的常量值的词法分析器命令;词法分析器   口译员可能会产生不正确的输出

我在词法分析器或解析器中做错了吗?

1 个答案:

答案 0 :(得分:2)

组合语法(仅以grammar开头的语法,而不是parser grammarlexer 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语句。我上面描述的方法几乎总是优选的。

相关问题