Вопрос, который я хочу задать, явно указан в названии. Позвольте мне привести пример рассматриваемой грамматики:
identifier_list
: identifier
| identifier_list identifier;
lambda_arguments
: '(' identifier_list ')'
| identifier;
lambda
: lambda_arguments '=>' expression
Затем мы добавляем грамматику выражения нормали C, в частности,
primary_expression
: '(' expression ')'
| identifier
| lambda;
Реальный вопрос заключается в том, является ли эта грамматика LALR (1) понятной, то есть способной анализироваться автоматическими генераторами парсера? Или это требует ручного или GLR-анализатора? Обратите внимание, что я хочу знать конкретно об этом подразделе, а не в контекстно-зависимом ключевом слове или в любом другом разделе.
То, что я сейчас думаю, состоит в том, что если парсер видит '(' identifier ')'
, у него есть два действительных разбора, поэтому, если синтаксический анализатор видит identifier
, смотрит вперед на ')'
, он не сможет решить которые обрабатывают дерево, чтобы спуститься вниз. Это может быть просто конфликт смены/сокращения, хотя я мог бы устранить, назначив некоторый произвольный приоритет (вероятно, способствующий '(' identifier ')'
).
Изменить: На самом деле, я рассматривал кражу, используя этот подраздел грамматики для аналогичной функции на новом языке. У меня уже есть анонимные функции, похожие на JavaScript в грамматической форме, но мои отзывы жалуются, что они слишком многословны для многих применений, и указали выражения лямбда С# как более идеальное решение. Я был обеспокоен потенциальной двусмысленностью, вызванной этим решением. Итак, действительно, меня интересовал только этот подраздел. Другие вещи, такие как generics и casts, не являются вопросами для меня.
Предыдущие выпуски моей грамматики механически разборчивы, и я не хочу потерять это свойство, и мой предыдущий опыт работы с механическим генератором говорит мне, что лучше всего проверить здесь, а не попробовать себя. Для моего ручного парсера я мог бы, конечно, просто специальный случай '(' identifier
смотреть вперед немного дальше, чем обычно.