КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Обработка описаний
Семантический анализатор для М-языка Контекстные условия, выполнение которых нам надо контролировать в программах на М-языке, таковы: 1. Любое имя, используемое в программе, должно быть описано и только один раз. 2. В операторе присваивания типы переменной и выражения должны совпадать. 3. В условном операторе и в операторе цикла в качестве условия возможно только логическое выражение. 4. Операнды операции отношения должны быть целочисленными. 5. Тип выражения и совместимость типов операндов в выражении определяются по обычным правилам (как в Паскале).
Проверку контекстных условий совместим с синтаксическим анализом. Для этого в синтаксические правила вставим вызовы процедур, осуществляющих необходимый контроль, а затем перенесем их в процедуры рекурсивного спуска. Для контроля согласованности типов в выражениях и типов выражений в операторах, необходимо знать типы переменных, входящих в эти выражения. Кроме того, нужно проверять, нет ли повторных описаний идентификаторов. Эта информация становится известной в тот момент, когда синтаксический анализатор обрабатывает описания. Следовательно, в синтаксические правила для описаний нужно вставить действия, с помощью которых будем запоминать типы переменных и контролировать единственность их описания. Лексический анализатор запомнил в таблице идентификаторов TID все идентификаторы-лексемы, которые были им обнаружены в тексте исходной программы. Информацию о типе переменных и о наличии их описания естественно заносить в ту же таблицу. Пусть каждая строка в TID имеет вид struct record { char *name; /* идентификатор */ int declare; /* описан? 1-"да", 0-"нет" */ char *type; /* тип переменной */ ... }; Тогда таблица идентификаторов TID - это массив структур #define MAXSIZE_TID 1000 struct record TID [MAXSIZE_TID]; причем i-ая строка соответствует идентификатору-лексеме вида (4,i). Лексический анализатор заполнил поле name; значения полей declare и type будем заполнять на этапе семантического анализа. Для этого нам потребуется следующая функция:
void decid (int i, char *t) - в i-той строке таблицы TID контролирует и заполняет поле declare и, если лексема (4,i) впервые встретилась в разделе описаний, заполняет поле type:
void decid (int i, char *t) {if (TID [i].declare) ERROR(); /*повторное описание */ else {TID [i].declare = 1; /* описан! */ strcpy (TID [i].type, t);} /* тип t! */ }
Раздел описаний имеет вид D ® I {,I}: [int | bool], т.е. имени типа (int или bool) предшествует список идентификаторов. Эти идентификаторы (вернее, номера соответствующих им строк таблицы TID) надо запоминать (например, в стеке), а когда будет проанализировано имя типа, заполнить поля declare и type в этих строках. Для этого будем использовать функции работы со стеком целых чисел:
void ipush (int i); /* значение i - в стек */ int ipop (void); /* из стека - целое */ Будем считать, что (-1) - "дно" стека; тогда функция void dec (char *t) {int i; while ((i = ipop())!= -1) decid(i,t); } считывает из стека номера строк TID и заносит в них информацию о наличии описания и о типе t. С учетом этих функций правило вывода с действиями для обработки описаний будет таким: D ® < ipush (-1) > I < ipush (curr_lex.value) > {,I < ipush (curr_lex.value) > }: [ int < dec ("int") > | bool < dec ("bool") > ]
Дата добавления: 2015-06-27; Просмотров: 460; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |