Конструирование компиляторов
Детерминированный нисходящий и восходящий синтаксический анализ (СА), устройство и конфигурация LL(1) анализатора, условия для грамматик. Функции FIRST и FOLLOW и их интерпретация. Вычисления FOLLOW для нетерминала при k=1. Грамматики предшествования.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | шпаргалка |
Язык | русский |
Дата добавления | 24.06.2009 |
Размер файла | 296,3 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
1. Детерминированный нисходящий СА. Устройство LL(1) анализатора. Конфигурация LL(1) анализатора. Структура управляющей таблицы разбора. 1-предсказывающий алгоритм разбора
Детерминированный нисходящий СА - цепочка считывается один раз и процесс разбора полностью детерминирован (в отличие от алгоритмов с возвратом). Это накладывает ограничения на класс грамматик, для которых такой разбор возможен.
Неформальные определения:
LL(k) - грамматики - для которых левый анализатор работает детерминировано, если видит на k символов вперед (то есть если видим следующие k символов, то можем однозначно выбрать подходящее правило выбора).
LR(k) - грамматики-то же самое, только для правого разбора.
Формально:
КС-грамматика называется LL(k) - грамматикой для некоторого фиксированного k, если из существования двух левых выводов:
1)
2)
для которых FIRSTk(x) = FIRSTk(y), вытекает, что .
Соответственно, LL(1) - грамматика позволяет просматривать только один символ из входного потока на каждом шаге. LL(1) - анализатор представляет собой магазинный автомат, состоящий из входной ленты, входной головки, магазина, управляющей таблицы и выходной ленты.
При чтении цепочки головка может заглядывать вперед только на один символ u (аванцепочки). В магазине: X - верхний символ магазина, $ - маркер дна. Алфавит магазинных символов обозначается Г.
Конфигурация предсказывающего алгоритма представляется в виде тройки , где
1) x - неиспользованная часть входной цепочки.
2) - цепочка в магазине.
3) - цепочка на выходной ленте.
Работой 1-предсказывающего алгоритма руководит управляющая таблица M, задающая отображение множества в множество, в которое входят:
(1) , где , а i - номер правила ( - или правая часть этого правила, или некоторое его представление). (2) Выброс. (3) Допуск. (4) Ошибка.
1-предсказывающий алгоритм:
На каждом такте считывается символ u и определяется верхний символ магазина Х. Потом рассматривается элемент управляющей таблицы M (u, X), который и подсказывает, что надо делать:
1) М (u, X)= , тогда (верхний символ магазина заменяется цепочкой, а в выход пишется номер правила).
2) М (u, X)=выброс и , тогда (символ в магазине совпал с входным символом - оба символа выбрасываются).
3) М (u, X)=допуск, значит, разбор завершен успешно и мы в конфигурации
4) М (u, X)=ошибка, значит, разбор не получится - выходим.
2. Детерминированный нисходящий СА. LL(1) - условие. LL(1) - условие для грамматик без e-правил. LL(k) - условие для сильно LL(k) - грамматик. LL(k) - условие (общий случай). Проверка LL(k) - условия
Детерминированный нисходящий СА - цепочка считывается один раз и процесс разбора полностью детерминирован (в отличие от алгоритмов с возвратом). Это накладывает ограничения на класс грамматик, для которых такой разбор возможен.
Неформальные определения:
LL(k) - грамматики - для которых левый анализатор работает детерминировано, если видит на k символов вперед (то есть если видим следующие k символов, то можем однозначно выбрать подходящее правило выбора).
LR(k) - грамматики-то же самое, только для правого разбора.
Формально: КС-грамматика называется LL(k) - грамматикой для некоторого фиксированного k, если из существования двух левых выводов:
1)
2)
для которых FIRSTk(x) = FIRSTk(y), вытекает, что .
и или и
Неформально: FIRSTk(a) - это множество всех терминальных префиксов длины k (или меньше, если из a выводится цепочка длины < k) терминальных цепочек, выводимых из a.
и , где k - целое число,
Неформально: FOLLOWk(A) - это множество терминалов, которые могут встречаться сразу после А в каких-либо выводимых цепочках. Если А - самый правый символ, то e также включается в FOLLOW.
FIRST и FOLLOW иногда употребляются с аргументами-множествами цепочек (происходит объединение результатов функций для каждого элемента из множества-аргумента).
LL(k) - условие (общий случай):
Грамматика является LL(k) тогда и только тогда, когда для двух ее различных правил и пересечение пусто при всех , выводимых из S.
LL(1) - условие:
Грамматика является LL(1) тогда и только тогда, когда для двух ее различных правил и пересечение пусто при всех A.
LL(1) - условие для грамматик без e-правил:
Множества попарно не пересекаются, где - правые части правил вывода.
LL(k) - условие для сильно LL(k) - грамматик:
Грамматика является сильно LL(k) тогда и только тогда, когда для двух ее различных правил и пересечение пусто. Все LL(1) - сильно LL(k).
Проверка LL(k) условия:
(1) Для каждого нетерминала, имеющего две или более альтернативы, вычислить и существует такая цепочка , что и
(2) Если - различные А-правила, то для каждого вычислить . Если , то грамматика не LL(k), выход. Если для всех , повторить шаг (2) для всех различных пар А-правил.
(3) Повторить шаги (1) и (2) для всех нетерминалов.
(4) Если дошли сюда, значит, грамматика LL(k).
Примечание: - подмножества , тогда операция определяется так: для некоторых либо , если , либо состоит из первых k символов цепочки
3. Детерминированный нисходящий СА. Функции FIRST и FOLLOW и их интерпретация. Алгоритм построения корректной управляющей таблицы для LL(1) - грамматики
Детерминированный нисходящий СА - цепочка считывается один раз и процесс разбора полностью детерминирован (в отличие от алгоритмов с возвратом). Это накладывает ограничения на класс грамматик, для которых такой разбор возможен.
Неформальные определения:
LL(k) - грамматики - для которых левый анализатор работает детерминировано, если видит на k символов вперед (то есть если видим следующие k символов, то можем однозначно выбрать подходящее правило выбора).
LR(k) - грамматики-то же самое, только для правого разбора.
Формально:
КС-грамматика называется LL(k) - грамматикой для некоторого фиксированного k, если из существования двух левых выводов:
1)
2)
для которых FIRSTk(x) = FIRSTk(y), вытекает, что .
и или и
Неформально: FIRSTk(a) - это множество всех терминальных префиксов длины k (или меньше, если из a выводится цепочка длины < k) терминальных цепочек, выводимых из a.
и , где k - целое число,
Неформально: FOLLOWk(A) - это множество терминалов, которые могут встречаться сразу после А в каких-либо выводимых цепочках. Если А - самый правый символ, то e также включается в FOLLOW.
Построение корректной управляющей таблицы для LL(1) - грамматики:
Считаем, что $ - маркер дна магазина. Таблица M определяется на множестве следующим образом:
(1). Если - правило грамматики с номером i, то M (A, a)= для всех a!=e, принадлежащих . Если , то M (A, b)= для всех .
(2). M (a, a)=выброс
(3). M($, e)=допуск
(4). В остальных случаях - ошибка
4. Детерминированный нисходящий СА. Функции FIRST и FOLLOW и их интерпретация. Вычисления FIRST для грамматического символа при k=1. Вычисления FOLLOW для нетерминала при k=1. Вычисление FIRST для цепочки символов. Вычисление FIRST для множества цепочек
Детерминированный нисходящий СА - цепочка считывается один раз и процесс разбора полностью детерминирован (в отличие от алгоритмов с возвратом). Это накладывает ограничения на класс грамматик, для которых такой разбор возможен.
Неформальные определения:
LL(k) - грамматики - для которых левый анализатор работает детерминировано, если видит на k символов вперед (то есть если видим следующие k символов, то можем однозначно выбрать подходящее правило выбора).
LR(k) - грамматики-то же самое, только для правого разбора.
Формально:
КС-грамматика называется LL(k) - грамматикой для некоторого фиксированного k, если из существования двух левых выводов:
1)
2)
для которых FIRSTk(x) = FIRSTk(y), вытекает, что .
и или и
Неформально: FIRSTk(a) - это множество всех терминальных префиксов длины k (или меньше, если из a выводится цепочка длины < k) терминальных цепочек, выводимых из a.
и , где k - целое число,
Неформально: FOLLOWk(A) - это множество терминалов, которые могут встречаться сразу после А в каких-либо выводимых цепочках. Если А - самый правый символ, то e также включается в FOLLOW.
Вычисления FIRST для грамматического символа при k=1 (и при всех других k тоже).
(1) Если X - терминал длины меньшей или равной k, то FIRST(X) = {X}
(2) Если есть правило , добавляем e к FIRST(X)
(3) Если есть правило , добавим a в FIRST(X), если для некоторого i и e входит во все множества . Если e входит во все множества , то добавляем e к FIRST(X).
Вычисление FIRST для цепочки символов.
определяется так: добавим к FIRST все не-e символы из . Добавим также все не-e символы из , если . Добавим также все не-e символы из , если и . И т.д.
Вычисление FIRST для множества цепочек.
Объединим множества FIRST для каждой цепочки множества.
Вычисления FOLLOW для нетерминала при k=1 (и при всех других k)
Для всех продукций вида занести в FOLLOW(B) все элементы множества , кроме e. Для всех продукций вида или , где содержит e, все элементы из множества FOLLOW(A) поместить в множество FOLLOW(B). Повторить перечисленные действия, пока ни к одному множеству FOLLOW для нетерминалов нельзя будет добавить ни одного символа.
5. Детерминированный восходящий СА. Устройство LR(1) - анализатора. Конфигурация LR(1) - анализатора. Структура управляющей таблицы разбора. LR(1) - алгоритм разбора
Все определения и алгоритмы даются для LR(k), не проблема перейти к LR(1).
LR(k) - грамматика - для которой можно построить анализатор, осуществляющий детерминированный восходящий анализ, заглядывая на k символов вперед.
Неформально:
Грамматика будет LR(k), если для произвольного правого вывода в каждой промежуточной правовыводимой цепочке, читая ее слева направо, можно выделить основу и определить, каким нетерминалом надо ее заменить, дойдя не более чем до k-го символа правее основы.
Формально:
Даны грамматики G и G' (пополненная от G, т.е. с правилом SS'). Тогда если из условий:
(1)
(2)
(3)
следует, что (т.е. ), то грамматика LR(k).
Анализатор LR(1) - детерминированный преобразователь с магазинной памятью, моделирует в обратном порядке правый вывод входной цепочки. Анализатор строится по пополненной грамматике G'. Работает по принципу «перенос-свертка», за исключением того, что после каждого символа грамматики в магазин записывается информационный символ, называемый состоянием анализатора. Таблица синтаксического анализа состоит из двух частей - функции действий action (возвращает (1) перенос s, где s - состояние (2) свертка в соответствии с правилом i (3) допуск (4) ошибка) и функции переходов goto (возвращает новое состояние). Конфигурация анализатора: (а, б, в), где а - содержимое магазина (изначально там состояние ), б - оставшаяся часть входной цепочки, в-выходная лента.
Алгоритм разбора:
Пусть s - состояние на вершине магазина, a - входной символ.
Если action [s, a] = «перенос s'», то поместить в стек a, затем s'; начать снова.
Если action [s, a] = «свертка i: », то снять с магазина символов. Пусть s' - текущее состояние на вершине магазина. Поместить в стек A, затем goto [s', A], вывести на входную ленту i.
Если action [s, a] = «допуск», то конец разбора.
Если ничего из вышеперечисленного, выход с ошибкой.
6. Детерминированный восходящий СА. LR(0) - ситуации. Алгоритм вычисления closure для SLR(1) - грамматик. Алгоритм вычисления goto для SLR(1) - грамматик. Алгоритм построения канонической системы множеств LR(0) - ситуаций. Алгоритм построения SLR(1) - таблиц разбора
Грамматика будет LR(k), если для произвольного правого вывода в каждой промежуточной правовыводимой цепочке, читая ее слева направо, можно выделить основу и определить, каким нетерминалом надо ее заменить, дойдя не более чем до k-го символа правее основы.
LR(0) - ситуация - это правило грамматики с точкой в некоторой позиции правой части, например, . Одной продукции может соответствовать несколько ситуаций. Ситуация указывает, какую часть правой части мы уже видим. Приведенный пример означает, что у нас есть строка, порожденная X, и мы ожидаем получить из входного потока строку, порождаемую YZ. LR(0) - ситуация допустима, если для активного префикса , если существует вывод .
Идея SLR-метода - построить детерминированный КА для распознавания активных префиксов; ситуации группируются в множества, которые приводят к состояниям SLR-анализатора.
Функция closure (замыкание) от множества I ситуаций грамматики:
(1) Изначально в closure(I) входят все ситуации из I.
(2) Если входит в closure(I) и - правило грамматики, то добавляем в closure(I) ситуацию (если ее там еще нет). Применяем правило, пока есть что добавлять.
Функция goto (I, X), где I - множество ситуаций, X - символ грамматики. goto (I, X) определяется как замыкание множества ситуаций , принадлежащих I.
Алгоритм построения канонической системы С множеств LR(0) - ситуаций (для расширенной грамматики).
(1) Занесем в С closure от множества ситуаций, состоящего из одной ситуации
(2) Для каждого множества ситуаций I из С и каждого символа X, такого, что goto (I, X) не является пустым и не принадлежит С, добавить к С goto (I, X). Повторять шаг (2), пока есть множества, которые можно добавить к С.
Алгоритм построения SLR(1) - таблиц разбора:
(1) Построим - система множеств LR(0) - ситуаций для грамматики G'
(2) Состояние i строится на основе следующим образом:
(а) Если и , то action [i, a] = «перенос j» (a должен быть терминалом).
(б) Если , то action [i, a] = «свертка » для всех a из FOLLOW(A), причем A не равно S'.
(в) Если , то action [i,$] = «допуск».
Если по этим правилам возникают конфликты, значит, грамматика не SLR(1).
(3) Построение goto: если , то
(4) Все записи, оставшиеся пустыми, определяются как «ошибка».
(5) Начальным состоянием будет состояние, построенное из множества ситуаций, содержащего
Пример:
Расширенная грамматика арифметических выражений:
Каноническая система множеств LR(0) - ситуаций для этой грамматики:
Диаграмма переходов детерминированного конечного автомата для активных префиксов:
Таблица SLR(1) разбора для этой грамматики:
Состояние |
action |
goto |
||||||||
Id |
+ |
* |
( |
) |
$ |
E |
T |
F |
||
0 |
П 5 |
П 4 |
1 |
2 |
3 |
|||||
1 |
П 6 |
Д |
||||||||
2 |
С 2 |
П 7 |
С 2 |
С 2 |
||||||
3 |
С 4 |
С 4 |
С 4 |
С 4 |
||||||
4 |
П 5 |
П 4 |
8 |
2 |
3 |
|||||
5 |
С 6 |
С 6 |
С 6 |
С 6 |
||||||
6 |
П 5 |
П 4 |
9 |
3 |
||||||
7 |
П 5 |
П 4 |
10 |
|||||||
8 |
П 6 |
П 11 |
||||||||
9 |
С 7 |
П 7 |
С 1 |
С 1 |
||||||
10 |
С 3 |
С 3 |
С 3 |
С 3 |
||||||
11 |
С 5 |
С 5 |
С 5 |
С 5 |
7. Детерминированный восходящий СА. LR(1) - ситуации. Алгоритм вычисления closure для LR(1) - грамматик. Алгоритм вычисления goto для LR(1) - грамматик. Алгоритм построения канонической системы множеств LR(1) - ситуаций. Алгоритм построения LR(1) - таблиц разбора
Грамматика будет LR(k), если для произвольного правого вывода в каждой промежуточной правовыводимой цепочке, читая ее слева направо, можно выделить основу и определить, каким нетерминалом надо ее заменить, дойдя не более чем до k-го символа правее основы.
LR(1) - ситуация: , где - правило грамматики, a - терминал или маркер конца строки. LR(1) - ситуация допустима для активного префикса , если существует вывод , где и либо a является первым символом w, либо w=e и a=$.
Функция closure (замыкание) от множества I ситуаций грамматики:
Для каждой ситуации , каждого правила и каждого терминала b из , такого, что , добавить в I. Делать все этого, пока есть ситуации, которые можно добавить в I.
Функция goto (I, X), где I - множество ситуаций, X - символ грамматики. goto (I, X) определяется как замыкание множества ситуаций , принадлежащих I.
Алгоритм построения канонической системы С множеств LR(1) - ситуаций (для расширенной грамматики).
(1) Занесем в С closure от множества ситуаций, состоящего из одной ситуации
(2) Для каждого множества ситуаций I из С и каждого символа X, такого, что goto (I, X) не является пустым и не принадлежит С, добавить к С goto (I, X). Повторять шаг (2), пока есть множества, которые можно добавить к С.
Алгоритм построения LR(1) - таблиц разбора:
(1) Построим - система множеств LR(1) - ситуаций для грамматики G'
(2) Состояние i строится на основе следующим образом:
(а) Если и , то action [i, a] = «перенос j» (a должен быть терминалом).
(б) Если , то action [i, a] = «свертка », причем A не равно S'.
(в) Если , то action [i,$] = «допуск».
Если по этим правилам возникают конфликты, значит, грамматика не LR(1).
(3) Построение goto: если , то
(4) Все записи, оставшиеся пустыми, определяются как «ошибка».
(5) Начальным состоянием будет состояние, построенное из множества ситуаций, содержащего
LR-таблица, как правило, содержит на порядок больше строк, чем SLR или LALR.
8. Детерминированный восходящий СА. Ядро множества LR(1) - ситуаций. Алгоритм прямого построения LALR(1) - таблиц разбора
Грамматика будет LR(k), если для произвольного правого вывода в каждой промежуточной правовыводимой цепочке, читая ее слева направо, можно выделить основу и определить, каким нетерминалом надо ее заменить, дойдя не более чем до k-го символа правее основы.
LALR=look ahead LR. Часто используется, поскольку таблицы получаются сильно меньше LR.
Ядро множества LR(1) - ситуаций - подмножество этого множества, первые компоненты (до запятой) ситуаций которых совпадают. Если рассматривать систему множеств, то множества с общими ядрами объединяются. Ядро goto (I, X) зависит только от ядра I, так что значения goto объединяемых множеств также объединяются.
Алгоритм прямого построения LALR(1) - таблицы.
(1) Построим - система множеств LR(1) - ситуаций для грамматики G'
(2) Для каждого ядра, имеющегося среди множества LR(1) - ситуаций, находим все множества, имеющие это ядро, и заменяем эти множества их объединением.
(3) Пусть - полученные в результате множества LR(1) - ситуаций. Состояние i строится на основе следующим образом:
(а) Если и , то action [i, a] = «перенос j» (a должен быть терминалом).
(б) Если , то action [i, a] = «свертка », причем A не равно S'.
(в) Если , то action [i,$] = «допуск».
Если по этим правилам возникают конфликты, значит, грамматика не LALR(1).
(4) Построение goto. Если - объединение одного или нескольких множеств LR(1) - ситуаций, то ядра множеств одни и те же, поскольку все I от 1 до k имеют одно ядро. Обозначим через K объединение всех множеств ситуаций, имеющих то же ядро, что и . Тогда goto (J, X)=K.
9 Грамматики предшествования. Отношения предшествования Вирта-Вебера. Грамматики простого предшествования. Алгоритм типа «перенос-свертка» для грамматик простого предшествования
Отношения предшествования Вирта-Вебера
Для всех грамматических символов вводятся отношения (не одинаковы с = > <):
(при разборе с лева на право для цепочки abw)
> - конец основы, выполняется между последним символом цепочки b и первым символом цепочки w;
<. - начало основы, выполняется между последним символом цепочки a и первым символом цепочки b;
=. - выполняется между смежными символами основы.
а) X<.Y: A => бXBb, что есть такие правила B=>+Yy;
б) X.>a: A=>бBYb; B=>+yX; Y=>*ab; (X.>a - всегда терминальный символ с права, так как конец основы)
в) X.=Y если в P есть правило A=>aXYb; XY - основа (элементы, между которыми имеется отношение эквивалентности)
Прим: S-> aSc|bSc|c (правила 1,2,3)
S |
a |
b |
c |
$ |
||
S |
= |
|||||
a |
= |
< |
< |
< |
||
b |
= |
< |
< |
< |
||
c |
> |
> |
||||
$ |
< |
< |
< |
а) S.=c - есть правило S->aSc (см. в) остальные.= аналогично.
б) a<.a - существует правило S->aSc, если применим правило 1 ещё раз то получим aaSc, как видим a) выполняется.
$<a $<b $<c - по определению ($ <. любого X, если S->+X…), так же можно рассматривать $ и как начальный маркер $aS. $bS. $c
в) с.>c с.>$ обозначают конец основы и дают сигнал к свёртке.
Количество отношений предшествования в ячейке зависит от правил
КС грамматика G=(N, E, P, S) - грамматика предшествования = приведенная (без эпсилон-правил, цепных правил и бесполезных символов) + не более 1 отношения предшествования для любых x, y.
Обратимая гр. Предшествования - гр. простого предшествования
(грамматика обратима = правые части всех правил различны (всегда можно сделать откат))
Алгоритм перенос-свёртка
На каждом шаге алгоритма по состоянию магазина и входной цепочки решается какую операцию сделать - перенос(f) символа в магазин или свёртка(g) символов в магазине. Работу алгоритма можно рассматривать в терминах конфигураций - тройках вида (x, a, p) x - содержимое магазина, a - оставшаяся цепочка, p - цепочка применённых правил. $ - рассматривается как маркер дна магазина / правый концевой маркер
Перенос f (X, a) если X<.a или X.=a
Свёртка f (X, a) если X.>a
Допуск f ($S,$)
В остальных случаях ошибка
( |
a |
* |
+ |
) |
$ |
||
) |
> |
> |
> |
> |
|||
a |
> |
> |
> |
> |
|||
* |
< |
< |
> |
> |
> |
> |
|
+ |
< |
< |
< |
> |
> |
> |
|
( |
< |
< |
< |
< |
= |
||
$ |
< |
< |
< |
< |
Пример:
магазин |
вход |
Выход |
|
$ |
(a+a)*a |
||
$( |
a+a)*a |
||
$(a |
+a)*a |
6 |
|
$(E |
+a)*a |
6 |
|
$(E+ |
a)*a |
6 |
|
$(E+a |
)*a |
6 |
|
$(E+E |
)*a |
66 |
E->E+E (1)
E->E*E (3)
E->(E) (4)
E->a (6)
(a+a)*a
10. Грамматики предшествования. Грамматики расширенного и слабого предшествования. Алгоритм перехода от обратимой грамматики слабого предшествования к грамматике простого предшествования
Расширенного - происходит анализ в на m символов на лево и n на право (см рис!) -(m, n) предшествование; m, n <= 2, > 2 - редко. Чаще всего используется 2,1 предшествование.
Грамматика (m, n) предшествования = приведенная (без эпсилон-правил, цепных правил и бесполезных символов) и отношения предшествования попарно не пересекаются.
S |
a |
b |
$ |
||
$$ |
<. |
||||
$a |
= |
<. |
= |
||
aS |
= |
||||
аa |
= |
<. |
= |
||
аb |
= |
||||
Sb |
= |
||||
bb |
> |
> |
На каждом шаге анализируем m с лева и n с права. Для всех цепочек выводимых из языка выделяют подцепочки длинной m+n (методом полного перебора к примеру / поиск в глубину).
Прим: S->aSbb|abb (на данном примере в гр. Простого предшествования будет конфликт).
Все цепочки длинны 3 из S: $$$ $S$ $a$ aSb Sbb bb$ $ab abb $$a $aa aaS abb bbb aaa. Подцепочки расчленяются на 2 и 1, и строится отношения Вирта-Вебера. (существует только для 7 случаев)
Нет конфликтов (b<->b).
Грамматики слабого предшествования
Допускается пересечение 2 ух отношений <. и.=. Отношение.> по-прежнему используется для локализации правого конца сворачиваемой основы (для выдачи сигнала о свертке).
Предполагается что грамматика обратимая и кандидатом на свёртку берется самая длинная прав. часть. Примером такой грамматики может послужить:
G: E->E+T|+T|T; T->T*F|F; F->(E)|a.
Для грамматики простого предшествования будет 2 конфликта [(, E) [+, T]
Коррективы вносятся для функции свертки:
g(Xb) = i (i - номер правила) если B->b и не существует такого A->aXb (отношения.>.= и.><. можно устранить за счет грамматич. преобразований).
Теорема: любую грамматику слабого предшествования можно всегда преобразовать в грамматику простого предшествования.
(Это делается введением нового нетерминального символа и правил вывода.)
Прим перехода
E->E+T|+T|T; T->T*F|F; F->(E)|a. (подчеркнутое - кандидаты на замену на новый не терминал)
Алгоритм перехода: вход - обратимая грамматика слабого предшествования G
Допустим нашлись X, Y такие что X.=Y X.<Y, Устраняем из P каждое правило вида A=>aXYb и заменяем на A=>aX[Yb] где [Yb] - новый не терминал. Для каждого правила B->Yb заменяем его на B->[Yb] и все Yb заменяем на [Yb]
Подобные документы
Применение правил грамматики. Синтаксический анализатор, нис- и восходящий разбор, полный перебор правил подстановки. Классификация грамматик по Хомскому. Определение языков с помощью автоматов. Форма Бекуса-Наура описания синтаксиса формальных языков.
лекция [270,1 K], добавлен 19.10.2014Основные понятия теории грамматик простого и операторного предшествования, алгоритмы синтаксического разбора предложения для классов КС-грамматик; разработка дерева вывода для грамматики входного языка в форме Бэкуса-Наура с указанием шагов построения.
лабораторная работа [28,0 K], добавлен 24.07.2012Разработка формальной грамматики для выражений, содержащих: логические и арифметические операции, константы, идентификаторы, знаки отношений и т.д., ее отладка в соответствии с требованиями метода параллельного предшествования. Разработка сканера.
контрольная работа [45,8 K], добавлен 24.09.2010Теоретические и практические основы грамматик, теория конечных автоматов-распознавателей. Эквивалентные и недостижимые состояния конечных автоматов. Классификация грамматик и порождаемых ими языков. Разработка программного комплекса построения грамматик.
курсовая работа [654,2 K], добавлен 14.11.2010Проектирование программы-анализатора, состоящей из двух частей: лексического анализатора, разбивающего исходный текст программы на лексемы и заполняющего таблицу имен; синтаксического анализатора, проверяющего соответствие текста заданной грамматике.
курсовая работа [2,0 M], добавлен 14.06.2010Разработка технического задания на проектирование, определение требований к программе. Предварительный выбор метода решения синтаксического анализатора, проектирование программного приложения, конфигурация технических средств программы и её тестирование.
курсовая работа [28,5 K], добавлен 28.06.2011Этапы разработки программного приложения, выполняющего синтаксический анализ программы на языке С и форматирование текста программы на языке С. Требования к программному обеспечению и интерфейсу. Конфигурация технических средств и оценка надежности.
курсовая работа [1,6 M], добавлен 22.06.2011Разработка программы для осуществления приведения КС-грамматики к нормальному виду. Особенности преобразования грамматик. Создание алгоритма удаления бесплодных и недостижимых символов, устранения правил с пустой правой частью. Исключение цепных правил.
курсовая работа [1,5 M], добавлен 06.01.2012Основные методы описания синтаксиса языков программирования: формальные грамматики, формы Бэкуса-Наура и диаграммы Вирта. Разработка алгоритма решения задачи. Лексический и синтаксический анализатор, семантический анализ. Структурная организация данных.
курсовая работа [680,1 K], добавлен 12.06.2011Разработка различных программ для вычисления X и Y по формуле, для вычисления интеграла, для вычисления таблицы значений функции и для вычисления элементов вектора. Составление блок-схемы программы. Ввод значений, описание переменных и условия расчета.
контрольная работа [148,1 K], добавлен 08.11.2013