Помогите... 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. Может иметь огромное значение, чтобы включить.