antlr 错误 "no viable alternative at input"

antlr error "no viable alternative at input"

我正在按照此处给出的示例进行操作- 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 帖子,但似乎无法弄清楚语法有什么问题。

我尝试了 运行 宁你的例子,但在 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 或任何适用于 os 你正在使用。当我从 linux 文本编辑器在 linux 上保存一个文件并尝试使用相同生成的解析器在 windows 上 运行 它时遇到了这个问题。所以我的建议是尝试重新保存您的文本输入 - 'Abishek AND (country=India OR city=NY) LOGIN 404 | show name city' 并确保每次编码都不同,以防这是原因。

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

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

因为编码错误会导致它尝试解析与编码无关的内容,导致找不到匹配项。

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