【问题】
参见:
【已解决】antlr出错no viable alternative at input ‘__LBL__show’
中别人的回复:
Hi,你好!对你关于ANTLR的博客表示很感兴趣! 我发现解析器规则(parser rule)中使用的token好像会和词法分析器(lexer)中定义的token冲突!不知道你是否知道如何解决呢? 有个简单的例子: r1: A; A: ‘a’ | ‘b’; grun Test r1 -tree时,输入‘a’会出现和你此处一样的错误: line 1:0 mismatched input ‘a’ expecting A |
所以去解决此问题。
【解决过程】
1. 用antrl v4的语法:
grammar Test; r1: A; r2: ‘a’ ‘c’; A: ‘a’ | ‘b’;
去编译结果出错:
D:\DevRoot\IndustrialMobileAutomation\HandheldDataSetter\ANTLR\projects\v1.5\Test>antlr4 Test.g4 D:\DevRoot\IndustrialMobileAutomation\HandheldDataSetter\ANTLR\projects\v1.5\Test>java org.antlr.v4.Tool Test.g4 org\antlr\v4\parse\GrammarTreeVisitor.g: node from after line 6:4 mismatched tree node: ALT expecting <UP> org\antlr\v4\parse\GrammarTreeVisitor.g: node from line 6:4 required (…)+ loop did not match anything at input ‘a’ org\antlr\v4\parse\GrammarTreeVisitor.g: node from after line 6:4 mismatched tree node: ALT expecting <UP> org\antlr\v4\parse\GrammarTreeVisitor.g: node from line 6:4 required (…)+ loop did not match anything at input ‘a’ org\antlr\v4\parse\GrammarTreeVisitor.g: node from after line 6:4 mismatched tree node: ALT expecting <UP> org\antlr\v4\parse\GrammarTreeVisitor.g: node from line 6:4 required (…)+ loop did not match anything at input ‘a’ org\antlr\v4\parse\GrammarTreeVisitor.g: node from after line 6:4 mismatched tree node: ALT expecting <UP> Exception in thread "main" java.lang.NullPointerException at org.antlr.v4.semantics.SemanticPipeline.process(SemanticPipeline.java:116) at org.antlr.v4.Tool.processNonCombinedGrammar(Tool.java:399) at org.antlr.v4.Tool.process(Tool.java:376) at org.antlr.v4.Tool.processGrammarsOnCommandLine(Tool.java:343) at org.antlr.v4.Tool.main(Tool.java:190) |
2.把lexer的token都放到前面,并且把中文引号"’"改为英文的引号"’":
grammar Test; A: 'a | 'b'; r1: A; r2: 'a' 'c';
试试,结果出现别的错误:
D:\DevRoot\IndustrialMobileAutomation\HandheldDataSetter\ANTLR\projects\v1.5\Test>antlr4 Test.g4 D:\DevRoot\IndustrialMobileAutomation\HandheldDataSetter\ANTLR\projects\v1.5\Test>java org.antlr.v4.Tool Test.g4 error(50): D:\DevRoot\IndustrialMobileAutomation\HandheldDataSetter\ANTLR\projects\v1.5\Test\Test.g4:6:9: syntax error: unterminated rule (missing ‘;’) detected at ‘c <EOF>’ while looking for lexer rule element |
3.再去在最后添加一个换行,变成:
试试,结果问题依旧如上。
4.感觉说是r2这个lexer没有依赖任何的,合法的token规则?
所以随便改为别的,比如:
grammar Test; A: 'a | 'b'; r1: A; r2: 'a' | 'c';
然后再试试,结果错误依旧。
5.把r2删除:
grammar Test; A: 'a | 'b'; r1: A;
试试,结果问题依旧。
6.刚注意,上面不小心把a的右边引号漏掉了。
所以再改正确的为:
grammar Test; A: 'a' | 'b'; r1: A; r2: 'a' 'c';
再去试试,然后就可以正常编译了:
D:\DevRoot\IndustrialMobileAutomation\HandheldDataSetter\ANTLR\projects\v1.5\Test>antlr4 Test.g4 D:\DevRoot\IndustrialMobileAutomation\HandheldDataSetter\ANTLR\projects\v1.5\Test>java org.antlr.v4.Tool Test.g4 D:\DevRoot\IndustrialMobileAutomation\HandheldDataSetter\ANTLR\projects\v1.5\Test> |
7.另外,再试试token放在rule后面的:
grammar Test; r1: A; r2: 'a' 'c'; A: 'a' | 'b';
结果也是可以正常编译的,没有任何错误的。
所以说明:
antlr中,lexer的token和parser的rule,没有强制要求前后关系。
【总结】
antrl中,注意必须,所有的内容(除了注释),全部都要是英文字符。
尤其是单引号,双引号之类的字符:
不能是中文的那个单引号(’)和双引号(“):
而必须是英文的单引号(‘)和双引号(")
否则antlr必然是不能识别的。
转载请注明:在路上 » 【已解决】antlr v4测试Hello结果出错:syntax error: unterminated rule (missing ‘;’) detected at ‘c ‘ while looking for lexer rule element