Помогите... LL грамматика и парсер рекурсивного спуска

Я использую 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 ответ

Решение

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

options {
    backtrack = true;
}

Описание

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

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