русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Контроль контекстных условий в выражении


Дата добавления: 2013-12-23; просмотров: 790; Нарушение авторских прав


Пусть есть функция

char *gettype (char *op, char *t1, char *t2),

которая проверяет допустимость сочетания операндов типа t1 (первый операнд) и типа t2 (второй операнд) в операции op; если типы совместимы, то выдает тип результата этой операции; иначе - строку "no".

Типы операндов и обозначение операции будем хранить в стеке; для этого нам нужны функции для работы со стеком строк:

 

void spush (char *s); /* значение s - в стек */

char *spop (void); /* из стека - строку */

 

Если в выражении встречается лексема - целое_число или логические константы true или false,то соответствующий тип сразу заносим в стек с помощью spush("int") или spush("bool").

Если операнд - лексема-переменная, то необходимо проверить, описана ли она; если описана, то ее тип надо занести в стек. Эти действия можно выполнить с помощью функции checkid:

 

void checkid (void)

{int i;

i = curr_lex.value;

if (TID [i].declare) /* описан? */

spush (TID [i].type); /* тип - в стек */

else ERROR(); /* описание отсутствует */

}

 

Тогда для контроля контекстных условий каждой тройки - "операнд-операция-операнд" будем использовать функцию checkop:

 

 

void checkop (void)

{char *op;

char *t1;char *t2;

char *res;

t2 = spop(); /* из стека - тип второго операнда */

op = spop(); /* из стека - обозначение операции */

t1 = spop(); /* из стека - тип первого операнда */

res = gettype (op,t1,t2); /* допустимо ? */

if (strcmp (res, "no")) spush (res); /* да! */

else ERROR(); /* нет! */

}

 

Для контроля за типом операнда одноместной операции not будем использовать функцию checknot:

 

void checknot (void)

{if (strcmp (spop (), "bool")) ERROR();

else spush ("bool");}



 

Теперь главный вопрос: когда вызывать эти функции?

В грамматике модельного языка задано старшинство операций: наивысший приоритет имеет операция отрицания, затем в порядке убывания приоритета - группа операций умножения (*, /, and), группа операций сложения (+, -, or), операции отношения.

E ® E1 | E1 [ = | < | > ] E1

E1 ® T {[ + | - | or ] T}

T ® F {[ * | / | and ] F}

F ® I | N | [ true | false ] | not F | (E)

 

Именно это свойство грамматики позволит провести синтаксически-управляемый контроль контекстных условий.

Замечание: сравните грамматики, описывающие выражения, состоящие из символов +, *, (, ), i:

G1: E ® E+E | E*E | (E) | i G4: E ® T | E+T

G2: E ® E+T | E*T | T T ® F | T*F

T ® i | (E) F ® i | (E)

G3: E ® T+E | T*E | T G5: E ® T | T+E

T ® i |(E) T ® F | F*T

F ® i | (E),

Оцените, насколько они удобны для трансляции выражений.

 

Правила вывода выражений модельного языка с действиями для контроля контекстных условий:

 

E ® E1 | E1 [ = | < | > ] <spush(TD[curr_lex.value])>E1 <checkop()>

E1 ® T {[ + | - | or ] <spush(TD[curr_lex.value])>T <checkop()>}

T ® F {[ * | / | and ] <spush(TD[curr_lex.value])>F<checkop()>}

F ® I <checkid()> | N <spush("int")> |[ true | false ] <spush ("bool") |

not F <checknot()> | (E)

 

TD - это таблица ограничителей, к которым относятся и знаки операций; будем считать, что это массив

#define MAXSIZE_TD 50

char * TD[MAXSIZE_TD];

Из этой таблицы по номеру лексемы в классе выбираем обозначение операции в виде строки.



<== предыдущая лекция | следующая лекция ==>
Обработка описаний | Пример 4.5


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.004 сек.