antlr, как исправить грамматику так (varname)? не в состоянии разбора, если он существует, но это неправильно
Я переписываю этот пост (тот же вопрос, но меньше слов).
Я переписал мою грамматику, чтобы просто на верхнем уровне это
statement: SELECT EOF!;
#removed all other rules and tokens and still not working
SELECT : ('S'|'s')('E'|'e')('L'|'l')('E'|'e')('C'|'c')('T'|'t');
Затем у меня есть следующий код Java (нет метода синтаксического анализа в моем Parser, как я вижу в сообщениях всех остальных:(:()...
@Test
public void testGrammar() throws RecognitionException {
String sql = "select p FROM TABLE p left join p.security s where p.numShares = :shares and s.securityType = :type";
ANTLRStringStream stream = new ANTLRStringStream(sql);
NoSqlLexer lexer = new NoSqlLexer(stream);
CommonTokenStream tokenStream = new CommonTokenStream(lexer);
NoSqlParser parser = new NoSqlParser(tokenStream);
try {
CommonTree tree = (CommonTree) parser.statement().getTree();
Assert.fail("should fail parsing");
} catch(Exception e) {
log.info("Exception", e);
}
}
Я должен получить исключение при разборе, но я не делаю:(:(. Это очень простая грамматика с EOF, но она просто не работает. Есть идеи, почему? Я называю неправильное утверждение синтаксического анализа?
ПРИМЕЧАНИЕ. Я пытаюсь упростить гораздо большую проблему, сократив ее до этой простой вещи, которая, похоже, не работает.
полный (очень маленький) файл грамматики здесь
grammar NoSql;
options {
output = AST;
language = Java;
}
tokens {
}
@header {
package com.alvazan.orm.parser.antlr;
}
@lexer::header {
package com.alvazan.orm.parser.antlr;
}
@rulecatch {
catch (RecognitionException e)
{
throw e;
}
}
statement: SELECT EOF!;
SELECT : ('S'|'s')('E'|'e')('L'|'l')('E'|'e')('C'|'c')('T'|'t');
WS :
( ' '
| '\t'
| '\r'
| '\n'
)+
{ $channel=HIDDEN; }
;
ESC :
'\\' ('"'|'\''|'\\')
;
спасибо, Дин
1 ответ
Я должен получить исключение при разборе, но я не делаю:(:(. Это очень простая грамматика с EOF, но она просто не работает.
Если вы не "сказали" ANTLR выдать исключение, ANTLR может не выдать исключение / ошибку в случае неверного ввода. Во многих случаях ANTLR пытается восстановить данные из несоответствующего / недопустимого ввода и пытается продолжить анализ. Вы увидите вывод записи на stderr
в вашем случае, но вы не можете получить исключение.
Если вы хотите исключение в вашем случае, смотрите: ANTLR не выдает ошибки при неверном вводе