Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ГЭ-2013-анн-130515.doc
Скачиваний:
5
Добавлен:
01.05.2025
Размер:
2 Мб
Скачать
☆

7.6. Дерево вывода для кс-грамматик. Восходящий и нисходящий синтаксический анализ. Алгоритм нисходящего разбора с возвратами

Определение. Дерево вывода в КС-грамматике (A, V, P, s) – это помеченное упорядоченное дерево (граф), каждая внутренняя вершина (узел) которого помечена символом из V, а листья дерева – символом из A. При этом, если вершина помечена символом uV, то подвершины помечаются символами x1, x2…xk, если u x1 x2…xk P.

Алгоритм нисходящего разбора с возвратами описывается в терминах конфигурации: (состояние, входной указатель, магазин L1, магазин L2).

Шаги алгоритма для грамматики G = (A, V, P, s):

  1. замена нетерминала (q, i, , u) (q, i, u1, )

  2. успешное сравнение (q, i, , C) (q, i+1, C, )

  3. успешное завершение (q, n+1, , #) (t, n+1, , e)

  4. неуспешное сравнение (q, i, , C) (b, i, , )

  5. возврат по входу (b, i, C, ) (b, i-1, , C)

  6. испытание очередной альтернативы

(b,i,uj, ) (q, i, uj', ') или (b, i, uj, ) (b, i, , u), если j-я альтернатива последняя, и общий неуспех, если u=s и s имеет j альтернатив.

Алгоритм пригоден для любой КС-грамматики без левой рекурсии.

[АУ] п.2.4.1, 4.1.3

7.7. Промежуточные представления программ: атрибутно-синтаксическое дерево, триадное представление, тетрады, обратная польская запись. Байт-коды внутреннего представления (Java-код, p-код и др.)

Промежуточное (внутреннее) представление программы – это форма представления информации о типе и структуре синтаксических конструкций. В нём, как правило, присутствует два типа элементов: операторы и операнды. Для выражений существует три формы записи: инфиксная, префиксная постфиксная (обратная польская – ПОЛИЗ), различающиеся по положению оператора относительно операндов (между, перед и после соответственно).

Известны следующие формы внутреннего представления программ:

  • связные списочные структуры (синтаксические деревья);

  • многоадресный код с явно адресуемым результатом (тетрады);

  • многоадресный код с неявно адресуемым результатом (триады);

  • ассемблерный код или машинные команды.

Машинными командами могут быть коды как реальной, так и виртуальной машин. В последнем случае, их называют байт-кодом.

Наиболее известные промежуточные представления в виде байт-кода: P-код для Паскаля, Java-код для языка программирования Java и MSIL (Microsoft Intermediate Language) для исполнителя CLI (Common Language RunTime) в многоязыковой платформе .NET.

Пример триад и тетрад для арифметического выражения X = A+B*C:

Триады (абстрактная двухадресная машина с сумматором):

(1) * B C

(2) + A (1)

(3) = (2) X

Тетрады (абстрактная трехадресная машина):

* B C R

+ A R X

[М] гл.5.

[Х] гл 8

[С] с.278-284.

7.8. Ll(k)-грамматики, соотношение классов ll(k). Множества first(k) и follow(k) и их построение. Разделенная грамматика

Определение. КС-грамматика G = (A, V, P, s) называется LL(k)-грамматикой, если из существования двух левых выводов s =>* wu => w => wx и s =>* wu => wγ => wy, для которых FIRSTk(x) = FIRSTk(y), вытекает, что = γ. Т.е. выбор правила при левом выводе однозначно определяется k символами входной цепочки, начиная с текущей.

Для определения того, является ли грамматика LL(1)-грамматикой, необходимо и достаточно установить следующее свойство: для каждого нетерминала u и различных правил u и u выполняется FIRST( FOLLOW(u)) FIRST( FOLLOW(u)) = , где функции FIRST и FOLLOW определяется так:

FIRST() = {e | если * e} {B A | если * B},

FOLLOW(u) = {e | если s * u} {B A | если s * u и B FIRST()}.

Если все альтернативы нетерминалов начинаются с различных терминалов, КС-грамматика (без e-правил) называется разделенной или простой LL(1)-грамматикой.

[АУ] п.5.5.1, п.2.4.4.

[M] гл.4 [Х] гл 4. [K] 5.8