antlr错误“输入时没有可行的选择”

时间:2016-08-08 00:08:41

标签: parsing antlr antlr4

我跟随这里给出的例子 - https://datapsyche.wordpress.com/2014/10/23/back-to-learning-grammar-with-antlr/

基本上有以下语法 -

grammar Simpleql;

statement : expr command* ; 
expr : expr ('AND' | 'OR' | 'NOT') expr # expopexp
 | expr expr # expexp
 | predicate # predicexpr
 | text # textexpr
 | '(' expr ')' # exprgroup
 ;
predicate : text ('=' | '!=' | '>=' | '<=' | '>' | '<') text ; 
command : '| show' text* # showcmd
 | '| show' text (',' text)* # showcsv
 ;
text : NUMBER # numbertxt 
 | QTEXT # quotedtxt
 | UQTEXT # unquotedtxt
 ;

AND : 'AND' ;
OR : 'OR' ;
NOT : 'NOT' ;
EQUALS : '=' ;
NOTEQUALS : '!=' ;
GREQUALS : '>=' ;
LSEQUALS : '<=' ;
GREATERTHAN : '>' ;
LESSTHAN : '<' ;

NUMBER : DIGIT+
 | DIGIT+ '.' DIGIT+
 | '.' DIGIT+
 ;
QTEXT : '"' (ESC|.)*? '"' ;
UQTEXT : ~[ ()=,<>!\r\n]+ ;

fragment
DIGIT : [0-9] ;
fragment
ESC : '\\"' | '\\\\' ; 

WS : [ \t\r\n]+ -> skip ;

当我传递这样的输入时 -

Abishek AND (country=India OR city=NY) LOGIN 404 | show name city

我收到错误 - line 1:65 no viable alternative at input '<EOF>'

我经历了几个与错误相关的SO帖子,但似乎无法弄清楚语法有什么问题。

1 个答案:

答案 0 :(得分:0)

我尝试运行你的例子,但在antlrworks 2中抛出了一些错误。但是我能够在测试台中运行它而没有任何错误,得到以下输出:

(statement (expr (expr (expr (text Abishek)) AND (expr ( (expr (expr (predicate (text country) = (text India))) OR (expr (predicate (text city) = (text NY)))) ))) (expr (expr (text LOGIN)) (expr (text 404)))) (command | show (text name) (text city)))

网站上显示的树的输出相同。

我对你的实际输入有什么错误的看法,如果文件没有被编码为ascii / ansi / utf-8或任何适合的文件,那么过去有一些问题,例如ANTLR从文件中读取文本你正在使用的操作系统。当我从Linux文本编辑器在linux上保存文件并尝试在具有相同生成的解析器的Windows上运行它时,我遇到了这个问题。所以我的建议是尝试重新保存您的文字输入 - &#39; Abishek AND(国家/地区=印度或城市=纽约州)登录404 |显示名称城市&#39;并确保每次出现这种情况时编码都不同。

注意您也可以像这样或类似的方式指定编码:

CharStream charStream = new ANTLRInputStream(inputStream, "UTF-8");

由于编码错误会导致它尝试解析与编码无关的结果,导致找不到匹配项。

让我知道在以几种不同的方式保存编码后它是否有效,我会尝试进一步提供帮助。希望这会有所帮助。