2015-02-07 143 views
2

我正在學習如何使用「more」詞法分析器命令。我在ANTLR書所示的詞法語法,281頁輸入:ANTLR4:在詞法分析器命令中無法識別常量值

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 

生成此警告消息:

warning(155): Parser_To_Test_More_Command.g4:3:29: rule LQUOTE contains a lexer command with an unrecognized constant value; lexer interpreters may produce incorrect output

我在詞法分析器或解析器中做錯了什麼?

回答

2

組合語法(它們是以grammar開頭的文法,而不是parser grammarlexer grammar)不能使用詞法分析模式。除了使用importfeature¹的,你應該使用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聲明。我上面描述的方法幾乎總是可取的。

+0

好的,我提出了你建議Sam的修改。我仍然得到這個錯誤:Parser_To_Test_More_CommandLexer.java:63:錯誤:找不到符號 case 0:_mode = STR;打破; 符號:變量STR – 2015-02-07 22:08:27

+1

@RogerCostello文件** Parser_To_Test_More_CommandLexer.java **是從組合語法中剩下的。新的源文件名稱略有不同(具體而言,它們不包括** Lexer **或** Parser **後綴)。您需要清理並重建您的項目。 – 2015-02-09 00:53:48

+0

再次感謝山姆。我清理和重建。這解決了符號問題,但導致了一個不同的問題。我在DOS提示符下運行了這個命令:grun Parser_To_Test_More_Command test -gui並且產生了這個錯誤:線程「main」中的異常java.lang.ClassCastException:class Parser_To_Test_More_Command at java.lang.Class.asSubclass(Unknown Source) at org .antlr.v4.runtime.misc.TestRig.process(TestRig.java:159) at org.antlr.v4.runtime.misc.TestRig.main(TestRig.java:143)問題:grun只能用於組合語法? – 2015-02-09 13:31:56