Разница между левым факторингом и левой рекурсией

В чем разница между Left Factoring и Left Recursion? Я понимаю, что Left Factoring - это интеллектуальный метод синтаксического анализа сверху вниз. Но я смущаюсь, когда слышу эти два термина.

Ответы

Ответ 1

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

A → qB | Qc
где A, B, C - нетерминалы, q - предложение. В этом случае синтаксический анализатор будет запутан в отношении того, какое из двух постановок выбрать, и ему, возможно, придется отследить. После левого факторинга грамматика преобразуется в -

A → qD

D → B | С

В этом случае анализатор с опережением всегда будет выбирать правильную постановку.

Левая рекурсия - это случай, когда самый левый нетерминал при производстве нетерминала - это сам нетерминал (прямая левая рекурсия) или через некоторые другие нетерминальные определения, переписывает на нетерминальный снова (косвенная левая рекурсия). Рассмотрим эти примеры -

(1) A → Aq (прямой)

(2) A → Bq   B → Ar (косвенный)

Левая рекурсия должна быть удалена, если парсер выполняет синтаксический анализ сверху вниз

Ответ 2

Левый Факторинг - это метод преобразования грамматики. Он состоит в "выделении" префиксов, которые являются общими для двух или более производств.

Например, из:

A → α β | α γ

чтобы:

A → α A '

A '→ β | γ


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

Например:

A → A α

или же

A → B α

B → A γ

Существует метод преобразования грамматики под названием "Устранение левой рекурсии", который предоставляет метод для генерации с учетом левой рекурсивной грамматики другой грамматики, которая эквивалентна и не является левой рекурсивной.


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

Ответ 3

Так я видел два используемых термина:

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

Ответ 4

левый фактор:

Пусть заданная грамматика: A--> ab1 | ab2 | ab3

1) мы видим, что для каждого производства есть общий префикс, и если мы выберем какое-либо производство здесь, это не подтвердит, что нам не нужно будет возвращаться назад.
2) оно не является детерминированным, потому что мы не можем выбирать какую-либо продукцию и быть уверены, что достигнем желаемой строки, создав правильное дерево разбора. но если мы переписываем грамматику способом, который является детерминированным и также оставляет нас достаточно гибкими, чтобы преобразовать ее в любую строку, которая возможна без возврата назад, это будет:

A → aA ', A' → b1 | b2 | b3

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

Левая рекурсия:

A → Aa | b здесь ясно, что левый потомок A всегда будет A, если мы выберем первую продукцию, это левая рекурсия. потому что A вызывает себя снова и снова. сгенерированная строка из этой грамматики: ba *, поскольку это не может быть в грамматике... мы исключаем левую рекурсию, записывая:

A → bA 'A' → E | aA 'теперь у нас не останется рекурсии, а также мы можем генерировать ba *.

Ответ 5

Левая рекурсия: Грамматика остается рекурсивной, если она имеет нетерминал A такой, что существует вывод A → Aα | β, где α и β - последовательности терминалов и нетерминалов, которые не начинаются с A.

При проектировании верхнего вниз-парсера, если левая рекурсия существует в грамматике, тогда синтаксический анализатор попадает в бесконечный цикл, потому что A пытается совместить A, что невозможно. Мы можем устранить вышеупомянутую левую рекурсию, переписывая оскорбительное производство. Как -

A → βA '

A '- > αA' | эпсилон

Левый факторинг: Левый факторинг необходим для устранения недетерминизма грамматики. Предположим, что грамматика S → abS | ASB

Здесь S выводит один и тот же терминал a в производственном правиле (два альтернативных варианта для S), который следует за недетерминированностью. Мы можем переписать производство, чтобы отложить решение S как -

S → aS '

S '- > bS | Sb

Таким образом, S 'можно заменить на bS или Sb

Ответ 6

левая рекурсия: = когда левая нон-терминал такая же, как и правая не-терминальная. Пример: A- > A & B, где и является альфа. Мы можем удалить левый рикурсион, переписывая это производство как.

А- > В" А '- > & A' | €

Среднее значение левого фактора не должно быть недетерминированным., Пример: А → & A | & B | & С