Расширение Yacc необязательного предложения с использованием того же ключевого слова, что и следующее предложение - PullRequest
1 голос
/ 22 февраля 2011

Я занимаюсь разработкой небольшого DSL и у меня возникают проблемы с чистым анализом Yacc (Bison) для следующих символов:

START (RETURN expression WHERE expression)* RETURN (expression)?

Это то, что я имею до сих пор, но я получаю сдвиг / уменьшениеконфликты, и я не уверен, как их исправить:

start: START conditional_returns returns |
       START returns;

conditional_returns: conditional_returns conditional_return | conditional_return;

conditional_return: RETURN expression WHERE expression;

returns: RETURN expression | RETURN;

Я вижу, что факт повторного использования ключевого слова RETURN в другом предложении вызывает проблемы, но я хотел бы понять, как разделитьэто правильно, используя это много правил.Любая помощь будет оценена?

1 Ответ

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

Сами по себе вышеприведенные правила не вызывают никаких проблем;yacc / bison может справиться с ними просто без сдвига / уменьшения или уменьшения / уменьшения конфликтов.Проблемы могут возникнуть, если start также является допустимым expression.Если это так, язык неоднозначен - когда у вас есть start в пределах start, WHERE может быть связан с любым из них.Например, вход

START RETURN START RETURN expr WHERE expr RETURN expr

может быть проанализирован как

START RETURN ( START RETURN expr ) WHERE expr RETURN expr

или

START RETURN ( START RETURN expr WHERE expr RETURN expr )

, в зависимости от того, что подходит для вашего DSL, вы можете изменитьграмматика для применения одного или другого значения или запрета вложенных start выражений, если они не имеют смысла.

...