Я работал с несколькими парсерами (Yacc, Bison и Menhir). Если я правильно помню, все они допускают, чтобы правило было пустым. Вот пример того, что я имею в виду под Менгиром, это то, что я использовал чаще всего.
some_list:
| {[]}
| some_non_empty_list { $1 }
some_non_empty_list:
| SEMICOLON some_list { $2 }
| element { [$1] }
| element some_non_empty_list { $1 :: $2 }
Важная часть заключается в том, что some_list может свести на нет.
Мое нынешнее понимание алгоритма построения таблицы синтаксического анализа (построение NFA, построение DFA из NFA, минимизация) заставляет меня думать, что это приведет к конфликтам сдвига/уменьшения повсюду. Но это явно не так, потому что тогда мой код работал.
Итак, как построить таблицу синтаксического анализа, которая может принимать эти пустые правила?