it-roy-ru.com

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

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

24
saplingPro

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

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

A -> QD

D -> B | С

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

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

(1) A -> Aq (прямой)

(2) A -> Bq B -> Ar (непрямой)

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

42
nina

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

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

A → α β | α γ

чтобы:

A → α A '

A '→ β | γ


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

Например:

A → A α

или же

A → B α

B → A γ

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


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

21
user3761508

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

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

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

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

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

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

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

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

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

7
Mushrit Shabnam

Левая рекурсия: Грамматика остается рекурсивной, если она имеет нетерминал 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

3
mogg

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

A-> BA -> & A '».__ A.' | €

Оставленный фактор означает, что продукт не должен быть недетерминированным. ..__ Пример:.. .__ А -> & A | & B | C &

0
Yogendra Sharma