Мне мало что известно о том, что я собираюсь спросить, поэтому я хотел бы предложить предложение, основанное на уровне навыков, необходимых для реализации парсера для данной грамматики (поскольку я новичок в таком формальном подходе к парсеров и языков).
Просто, возвращаясь через пару лет, эта ситуация напоминает мне немного грамматики Паскаля против C/C++, это левое и правильное.
Но я не собираюсь делать этого, моя цель - реализовать простой парсер для языка разметки для таких документов, как Markdown.
Поэтому, учитывая, что я начинаю с языка разметки, я хочу, чтобы все было просто, что проще всего обрабатывать между этими двумя вариантами и почему. Другой вид грамматики может быть более легким вариантом для меня? Если да, то какой из них вы предлагаете?
Рекурсивная рекурсивная или левая рекурсия в основном сводится к тому, как вы собираетесь внедрять парсер.
Если вы собираетесь использовать парсер сверху вниз (например, рекурсивный спуск), вы обычно хотите использовать правильную рекурсию в грамматике (и для чисто рекурсивного спуска, это единственный вариант).
Если вы собираетесь делать синтаксический анализатор снизу вверх, вы обычно хотите использовать левую рекурсию. Анализаторы нижнего уровня обычно генерируются с помощью генератора синтаксического анализатора, такого как Yacc или Bison, большинство из которых могут обрабатывать правильную рекурсию, если это необходимо, но могут обрабатывать левую рекурсию несколько более эффективно.
Ну, есть два основных типа грамматик:
LL(k) = Left to tight, leftmost derivation, k symbols look ahead
LR(k) = Left to right, rightmost derivation, k symbols look ahead
Парсеров LR гораздо труднее писать вручную, однако они более мощные, чем LL-парсеры. Если вы смотрите на некоторые популярные инструменты генератора парсера:
ANTLR : a LL parser
BISON: a LALR(1) parser (a type of LR parser but a bit less powerful)
CUP: a LALR(1) parser (outputs Java / C# code)
Это зависит от того, какой тип парсера вы используете. Если вы используете тип LL, вы должны использовать правильную рекурсию.
Если вы используете тип LR, вы можете использовать левую или правую рекурсию. Однако левая рекурсия минимизирует глубину стека.