Почему праворекурсивная грамматика не подходит для анализа LR (k) снизу вверх?

  • Почему праворекурсивная грамматика не подходит для анализа LR (k) снизу вверх?

Я знаю, что парсинг снизу вверх начинается с листьев и наращивается до корневого узла, тогда как сверху вниз начинается с корня и идет вниз, провел небольшое исследование по этим вопросам и получил, как их можно изменить, но не смог получить прямой ответ о том, почему это не работает. Любая помощь приветствуется.


person Nick Powers    schedule 02.03.2016    source источник
comment
Кто сказал, что правильные рекурсивные грамматики не подходят для синтаксического анализа LR (k)? Работают нормально.   -  person rici    schedule 03.03.2016
comment
@rici Очевидно, мой профессор. Я завершаю тестовый обзор, и это один из вопросов. Я был немного сбит с толку, потому что об этом никогда раньше не упоминали в классе, и я ничего не нашел по этому поводу в своем учебнике или PowerPoint.   -  person Nick Powers    schedule 03.03.2016
comment
Вы можете использовать лево- или праворекурсивные правила с любым алгоритмом синтаксического анализа LR (k). Если вы собираетесь строить деревья, у правильной рекурсии есть забавное свойство: вы должны держать стек такой же глубиной, как и правильная рекурсия, чтобы отслеживать собранные узлы. Люди предоставят вам исходные файлы, содержащие миллион элементов в списке, поэтому ваш стек должен быть таким глубоким. С леворекурсивным правилом вы уменьшаете после каждого шага, и стек может быть по существу единичной глубины. Итак, вы можете использовать любое правило. Правильный рекурсивный метод может пойти глубже; люди со стопками фиксированного размера иногда выбегают.   -  person Ira Baxter    schedule 03.03.2016
comment
... так что ваш профессор может сказать вам что-то глубокое, или это может быть просто глупо. Трудно сказать без обоснования.   -  person Ira Baxter    schedule 03.03.2016
comment
@IraBaxter Я написал ему по электронной почте, и он в основном подтвердил то, что вы сказали. Фактически вы можете использовать праворекурсивную грамматику с алгоритмом анализа LR (k), но ответ, который он искал, заключался в части глубины стека. Он в основном повторил то, что вы сказали о том, что нужно создавать стек настолько глубоким, насколько правильная рекурсия, и что теоретически он может быть бесконечным. Спасибо за вклад, очень признателен.   -  person Nick Powers    schedule 03.03.2016


Ответы (1)


[OP изменил заголовок вопроса с «почему нельзя ... использовать» на «почему не подходит ...» Это, в свою очередь, превращает мой комментарий в ответ, поэтому я публикую его как единое целое.]

Вы можете использовать лево- или праворекурсивные правила с любым алгоритмом синтаксического анализа LR (k).

Правильные рекурсивные правила вызывают забавное свойство процесса синтаксического анализа, если вы собираетесь строить деревья: вы должны держать стек настолько глубоким, насколько нужна правильная рекурсия, чтобы отслеживать собранные узлы.

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

Часто стек синтаксического анализатора реализуется с использованием естественного стека процессора. Наши общие ОС (Windows, Linux) и их общие компиляторы могут предложить вам именно такие стеки с фиксированным размером, так что в некотором смысле они усугубляют эту проблему.

С помощью левого рекурсивного правила вы уменьшаете после каждого элемента списка, так что стек может быть по существу единичной глубины. Это намного удобнее: не дает сбоев и хорошо использует кеш.

person Ira Baxter    schedule 03.03.2016