240-1651 (664632), страница 2
Текст из файла (страница 2)
2. Подбор грамматики G[Z] по языку L
Построенный формальный язык L, подвергается декомпозиции, в процессе которой выявляются лексические составляющие - идентификаторы, константы и др. терминальные символы.
3. Классификация G[Z]
Для гарантии однозначности и безвозвратности разработанного языкового процессора выбранный язык отнести согласно класси-
фикации формальных грамматик, предложенных Хомским.
4. Выбор метода анализа
Проанализировать и выбрать наиболее подходящий анализ входного языка.
5. Диагностика и нейтрализация ошибок
Разработать алгоритм диагностики и нейтрализации ошибок.
6. Тестирование на программы на символьных цепочках
Протестировать разработанный языковой процессор на конкретных символьных цепочках.
7. Листинг
В конце отчета поместить распечатку программы с подробными коментариями.
Построение формального языка L
< Оператор > à IF ( < УслВыр > ) < Функция >;
[ ELSE < Функция >; ]
< Оператор > -- начальный нетерминальный символ
IF -- входной терминальный символ
ELSE -- входной терминальный символ (может и отсутствовать)
< УВ > -- условное выражение
< Функция > -отражает функциональную конструкцию языка Си
Пример правильного синтаксиса:
if ( a < b ) CallTheFunction( code1 ); else TheNextFunction( code2 );
a < b - есть условное выражение
«CallTheFunction» и «TheNextFunction» -- функции
code1 & code2 -- параметры функции
Подбор грамматики G[Z] по языку L
Любой язык, назовём его G в независимости от его классификации и функционального назначения содержит следующие базисные элементы: G ={ Vt, Vn, Z, P }, где:
Vt - словарь терминальных символов
Vn - словарь нетерминальных символов
Z - начальный нетерминальный символ
P - множество правил вывода
Для языка G <Оператор> имеем следующие множества:
Vt ={ 0, 1, 2, ... , 9 ; a, b, c, d, ... ,z ; A, B, C, ..., Z; , = };
Vn ={«Оператор», «УслВыр», «Терм», «Операнд», «Функция», «Идентификатор», «Скобки», «Целое» };
Z = { «Оператор» };
P = {
-
< Оператор > à IF ( < УслВыр > ) < Функция > [ ELSE < Функция > ]
-
< УслВыр > à T | T T | T = T
-
< Операнд > à «Идентификатор» | «ЦБЗ»
-
< Функция > à < Идентификатор > (< Список параметров >);
-
< Список параметров > à < Параметр > | W
-
< Параметр > à «Идентификатор» | «ЦБЗ» | W
-
< Идентификатор > à Б { Б | Ц }
}
Классификация G[Z]
-
< Оператор > à IF ( < УслВыр > ) < Функция > [ ELSE < Функция > ]
-
< УслВыр > à T | T T | T = T
-
< Операнд > à «Идентификатор» | «ЦБЗ»
-
< Функция > à < Идентификатор > (< Список параметров >);
-
< Список параметров > à < Параметр > | W
-
< Параметр > à «Идентификатор» | «ЦБЗ» | W
-
< Идентификатор > à Б { Б | ЦБЗ }
Сделаем замену нетерминальных символов:
< Оператор > à Z
< УслВыр > à A
< Терм > à B
< Функция > à C
< Список параметров > à D
< Параметр > à E
< Идентификатор > à F
Сделаем замену терминальных символов:
IF à a
( à b
) à c
; à d
ELSE à e
ЦБЗ à f
Б à g
W à h
-
Z à abAcC [ eC ]
-
A à B | B B | B = B
-
B à F | f
-
C à FbDcd
-
D à E | h
-
E à F | f | h
-
F à g { g | f }
Вывод : G[Z] - автоматная грамматика.
Выбор метода анализа
Ссылаясь на однозначность выбранной грамматики, принимая во внимание хорошо разработанные системы анализа выбираем метод рекурсивного спуска – как базовый метод языкового процессора.
Диагностика и нейтрализация ошибок
Разработанный алгоритм относится к общеизвестному методу синтаксического разбора, предложенный Айресом.
Основная идея метода состоит в том, что по контексту без возврата отбрасываюся те символы, которые привели в тупиковую ситуацию и разбор продолжается.
Для наглядности изобразим куст синтаксического разбора для входного языка:
Дано:
IF ( A < Bc ) BULL () ;
-
Z à abAcC [ eC ]
-
A à B | B B | B = B
-
B à F | f
-
C à FbDcd
-
D à E | h
-
E à F | f | h
-
F à g { g | f }
Z
a
b A c C
B B F b c d
F F g { g }
g g {g} g g g g
IF ( A < Bc ) BULL ( ) ;
Тестирование на цепочках
Протестируем данную программу на следующей языковой цепочке:
IF ( A < B ) BULL ( );
< Оператор >
a
b < УслВыражение > c < Функция >
< Терм > < Терм > < Идент > b c d
< Идент > < Идент > g { g }
g g {g} g g g g
IF ( A < B ) BULL ( ) ;
-
Проверка на нетерминальный символ IF
-
Проверка на терминальный символ « ( »
-
Проверка на условное выражение
-
Проверка на терм
-
Проверка на знак
-
Проверка на терм
-
Проверка на терминальный символ « ) »
-
Проверка на функцию
-
Проверка на имя функции
-
Проверка на наличие терминального символа « ( »
-
Проверка на параметр функции (может и отсутствовать)
-
Проверка на наличие терминального символа « ) »
6. Проверка на терминальный символ « ; »
Вывод: ошибок не обнаружено
12