Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры по тяпу.docx
Скачиваний:
7
Добавлен:
01.04.2025
Размер:
807.52 Кб
Скачать

8. Метод грамматического разбора сверху - вниз. Ll(1) – грамматики.

Суть: начинаем разбор со стартового нетерминала и, применяя продукции, заменяем нетерминал ее левой части на последовательность символов ее правой части. Цель: получить в обрамлении листьев этого дерева исходную последовательность.

Процедура рекурсивного разбора сверху вниз состоит из следующих шагов:

- Для узла дерева, помеченного, как нетерминал А, выбирают одну из продукций вида A. После этого строим от А ветви, соответствующие .

- Если в процессе применения продукций получено обрамление, несоответствующее входной последовательности, то производится откат.

- Находим следующий узел, помеченный нетерминалом, для подстановки правила.

Очень важно уметь правильно выбрать продукцию.

Для этого существует разновидность грамматик, называемых LL(k)-грамматики, которые позволяют сделать выбор продукции на основе первых k символов входной последовательности.

Самый распространенный вид - LL(1)-грамматики, когда выбрать продукцию можно только на основе 1-го символа.

L – входная последовательность обрабатывается слева направо, L – используется левый вывод (заменяется самый левый нетерминал), 1 – количество знаков из входной последовательности, необходимых для выбора продукции.

Как сделать выбор среди двух продукций: A → α | β?

x принадлежит FIRST(α) ≡ α * x γ

ε принадлежит FIRST(α) ≡ α ε

Грамматика относится к классу LL(1) если FIRST(α) ⋂ FIRST(β) = ∅ ,

а если α * ε то должно выполняться FIRST(β) ⋂ FOLLOW(A) = ∅ .

9. Исключение левой рекурсии.

При процедуре рекурсивного разбора сверху вниз может возникнуть проблема бесконечного цикла.

В грамматике для арифметических операций применение второго правила приведет к зацикливанию процедуры разбора. Подобные грамматики называются леворекурсивными. Грамматика называется леворекурсивной, если в ней существует нетерминал А, для которого существует вывод А=>+А. В простых случаях левая рекурсия вызвана правилами вида

AA|

В этом случае вводят новый нетерминал и исходные правила заменяют следующими.

AB

BB|

(если есть нетерминал А, для которого существует вывод А→+А за 1 или более шагов). Левой рекурсии можно избежать, преобразовав грамматику.

Например, продукции A→A

│β

Можно заменить на эквивалентные:

A→ β В

В→  В

│ ε

Для такого случая существует алгоритм, исключающий левую рекурсию:

1) определяем на множестве нетерминалов какой-либо порядок (А1, А2, …, Аn)

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

for i:=1 to n do

for j:=1 to i-1 do

if Ai → Ajγ then Ai→δ1γ

│ δ2γ

│ δkγ, где

Aj → δ1│ δ2│ …│ δk

3) исключаем все случаи непосредственной левой рекурсии (правило1)

Т.о. алгоритм помогает избежать зацикливания.

Исключение левой рекурсии из грамматики арифметических выражений и общий вид правила исключения левой рекурсии:

Общий вид правила исключения левой рекурсии

A → A α1

| A α2

...

| A αM

| β1

| β2

...

| βN

A → β1 A´

| β2 A´

...

| βN A´

A´ → α1 A´

| α2 A´

...

| αM A´

| ε