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");
因为编码错误会导致它尝试解析与编码无关的内容,导致找不到匹配项。
让我知道在以几种不同方式保存编码后它是否有效,我会尝试进一步提供帮助。希望这有帮助。
我正在按照此处给出的示例进行操作- 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");
因为编码错误会导致它尝试解析与编码无关的内容,导致找不到匹配项。
让我知道在以几种不同方式保存编码后它是否有效,我会尝试进一步提供帮助。希望这有帮助。