Вопрос, который я хочу задать, явно указан в названии. Позвольте мне привести пример рассматриваемой грамматики:
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 смотреть вперед немного дальше, чем обычно.