ANTLR проверяет правильность commontree или Как проверить, соответствует ли данный ввод грамматике ANTLR? - PullRequest
3 голосов
/ 23 февраля 2012

Привет, я хочу сделать java или c # метод, который будет возвращать логическое выражение true или false на основе заданного ввода. Например:

if (входные данные соответствуют грамматике antlr) вернуть истину; еще вернуть ложь; Так что проблема в том, что я не знаю, как проверить, нет ли у пользователя несоответствия. Я попытался пройти по дереву, но он не дает никакого несоответствия как узел дерева. Вероятно, проблема в том, что AST не показывает несоответствующие токены только в дереве разбора. Может также помочь, если кто-нибудь подскажет, как получить парсет из парсера?

Я сделал файл ANTLR .g, и он хорошо работает, теперь мне нужно сделать следующее: я должен проверить, был ли ввод верным или нет, я сделал это, но он не работает:

 public static boolean check() {
    String file = "test.txt";
    ANTLRReaderStream input;
    try{

            input = new ANTLRReaderStream(new FileReader(file));
            regExLexer lexer = new regExLexer(input);
            CommonTokenStream tokens = new CommonTokenStream(lexer);
            regExParser parser = new regExParser(tokens);

            CommonTree root = (CommonTree)parser.goal().getTree();

        return true;}
catch{
return false;}
}

Так что я ожидаю, что мой метод вернет true только тогда, когда входная строка верна, и false в противном случае. То, как я это сделал, всегда возвращает true, но когда строка неверна, она печатает

"строка 1: 4 постороннего ввода '+' ожидающий EOF"

в консоли.

Ответы [ 2 ]

1 голос
/ 23 февраля 2012

Как я намекал в комментариях под вашим вопросом: этот предыдущий вопрос и ответ отвечает на ваш вопрос.Я продемонстрирую на примере.

Допустим, у вас есть грамматика, которая принимает числа (и игнорирует пробелы).Вам нужно только переопределить как парсер, так и лексер reportError и вызвать исключение в этом методе: таким образом парсер (или лексер) не будет продолжаться.Перехватите ошибку и просто верните false с помощью вспомогательного метода * 1007. *

0 голосов
/ 23 февраля 2012

ANTLR любезно восстанавливает для вас некоторые ошибки (например, упущение очевидного взлома), что может быть неприятно, если вы не знакомы с ним.

Если хотите, вы можете переопределить BaseRecognizer.recoverFromMismatchedToken в классе regExParser и всегда выдает исключение, если найден несоответствующий токен.

Справка:

ANTLR: исправление ошибок и создание отчетов

...