Правильная рекурсивная грамматика или левая рекурсивная?

0

Мне мало что известно о том, что я собираюсь спросить, поэтому я хотел бы предложить предложение, основанное на уровне навыков, необходимых для реализации парсера для данной грамматики (поскольку я новичок в таком формальном подходе к парсеров и языков).

Просто, возвращаясь через пару лет, эта ситуация напоминает мне немного грамматики Паскаля против C/C++, это левое и правильное.

Но я не собираюсь делать этого, моя цель - реализовать простой парсер для языка разметки для таких документов, как Markdown.

Поэтому, учитывая, что я начинаю с языка разметки, я хочу, чтобы все было просто, что проще всего обрабатывать между этими двумя вариантами и почему. Другой вид грамматики может быть более легким вариантом для меня? Если да, то какой из них вы предлагаете?

Теги:
parsing
markup

3 ответа

2

Рекурсивная рекурсивная или левая рекурсия в основном сводится к тому, как вы собираетесь внедрять парсер.

Если вы собираетесь использовать парсер сверху вниз (например, рекурсивный спуск), вы обычно хотите использовать правильную рекурсию в грамматике (и для чисто рекурсивного спуска, это единственный вариант).

Если вы собираетесь делать синтаксический анализатор снизу вверх, вы обычно хотите использовать левую рекурсию. Анализаторы нижнего уровня обычно генерируются с помощью генератора синтаксического анализатора, такого как Yacc или Bison, большинство из которых могут обрабатывать правильную рекурсию, если это необходимо, но могут обрабатывать левую рекурсию несколько более эффективно.

  • 0
    Не могли бы вы назначить определенное место для грамматики PEG ( en.wikipedia.org/wiki/Parsing_expression_grammar )? Я имею в виду, если я собираюсь написать парсер для PEG, я могу предположить, что что-то будет работать лучше, чем другие варианты? Я могу сократить варианты до меньшего числа или более конкретной области?
  • 0
    @ user2485710: Извините, но случайно я не уверен.
Показать ещё 5 комментариев
1

Ну, есть два основных типа грамматик:

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)
  • 0
    спасибо, у меня уже есть некоторые имена для уже доступных парсеров или библиотек и инструментов, которые могут генерировать парсер. Моя настоящая проблема в том, что грамматики PEG, похоже, не очень популярны, и, например, я не могу найти эквивалент бизона или antlr для грамматики PEG, может быть, я просто что-то неправильно понимаю, или эти грамматики не так популярны, как левые или правильные грамматики.
  • 0
    Ну, я до сих пор работал только с CUP и Bison и сумел написать паскаль-компилятор, так что все это довольно мощно. ИМХО, хороший лексер (подсказка по гибкой подсказке) и хороший генератор синтаксических анализаторов удовлетворят все ваши потребности, когда дело доходит до создания новых языков надежным способом :)
Показать ещё 2 комментария
1

Это зависит от того, какой тип парсера вы используете. Если вы используете тип LL, вы должны использовать правильную рекурсию.

Если вы используете тип LR, вы можете использовать левую или правую рекурсию. Однако левая рекурсия минимизирует глубину стека.

  • 0
    что вы подразумеваете под "типом парсера", сколько типов парсера существует?
  • 0
    Существует много типов парсеров. Две основные группы - LL и LR. У них есть подгруппы, такие как LR (1), LALR (1).
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню