2016-08-08 5 views
0

Я следующий пример дал здесь- https://datapsyche.wordpress.com/2014/10/23/back-to-learning-grammar-with-antlr/ANTLR ошибка «нет реальной альтернативы на входе»

, который в основном имеет следующие grammar-

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 ; 

Когда я прохожу вход как this-

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

я error- line 1:65 no viable alternative at input '<EOF>'

Я прошел через пару сообщений SO, связанных с ошибкой, но, похоже, не может понять, что не так с грамматикой.

+1

Если вы сбросили поток токенов, у вас есть токены «UQTEXT» с ожидаемым контентом? Другие жетоны? – GRosenberg

ответ

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))) 

И тот же результат дерева, показанного на веб-сайте.

Мое мнение о том, что не так, может быть вашим фактическим вкладом, iv имел проблемы в прошлом с ANTLR, читающим текст из файла, если файл не был закодирован как ascii/ansi/utf-8 или что-то, что работает для вас используются. Я столкнулся с этим, когда я сохранил файл на linux из текстового редактора linux и попытался запустить его в Windows с тем же сгенерированным парсером. Поэтому моя рекомендация - повторить сохранение ввода текста - «Abishek AND (country = India OR city = NY) LOGIN 404 | show name city 'и убедитесь, что кодировка отличается каждый раз, когда это причина.

Примечания Вы можете также указать кодировку, как те или подобные способы:

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

Поскольку имеющая ошибку кодирования заставят его попытаться разобрать значение кодирования и в результате каких-либо совпадений были найдено.

Сообщите мне, если он работает после сохранения, закодированного несколькими способами, и я попытаюсь помочь и дальше. Надеюсь это поможет.