我跟随这里给出的例子 - 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帖子,但似乎无法弄清楚语法有什么问题。
答案 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");
由于编码错误会导致它尝试解析与编码无关的结果,导致找不到匹配项。
让我知道在以几种不同的方式保存编码后它是否有效,我会尝试进一步提供帮助。希望这会有所帮助。