Помогите ... LL грамматика и парсер рекурсивного спуска - PullRequest
1 голос
/ 29 июля 2010

Я использую ANTRL, и это моя некоторая грамматика, которая дает мне ошибку.

statement
:     (name)(
    | BECOMES expression
    | LPAREN (expression (COMMA expression)*)? RPAREN
    | SHIFTLEFT name LPAREN (expression ( COMMA expression )*)? RPAREN
    )
    | OUTPUT LPAREN expression ( COMMA expression)* RPAREN
    | IF expression  THEN statement (ELSE statement)?
    | FOR name BECOMES expression TO expression DO statement
    | REPEAT statement UNTIL expression
    | WHILE expression DO statement
    | body
    | 
;

Это ошибка "Решение может соответствовать вводу, такому как" ELSE ", используя несколько альтернатив".

Как я могу это исправить?

1 Ответ

0 голосов
/ 29 июля 2010

Попробуйте использовать опцию backtrack .

options {
    backtrack = true;
}

Описание

Новая особенность (большая) возврат = истинная опция для грамматики, правило и блок, который позволяет вводить любая старая хрень и ANTLR будут возвращаться если он не может понять, что ты имел в виду. Antlr не сообщает об ошибках во время анализ. Это неявно добавляет син пред перед каждым производством, используя их только если статическая грамматика LL * Анализ не удается. Код син-пред генерируется, если пред не используется в решение. Это по сути быстрый режим прототипирования. Это то, что у меня есть используется на java.g. О, это не запоминать частичные разборы (т.е. правило парсинг результатов) при возврате автоматически сейчас. Вы также должны сказать memoize = верно. Можно сделать ОГРОМНОЕ Разница для включения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...