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 не выдает ошибки при неверном вводе

Другие вопросы по тегам