Конспект лекций доцента и. А. Волковой по курсу «системы программирования»




НазваниеКонспект лекций доцента и. А. Волковой по курсу «системы программирования»
страница14/20
Дата публикации28.06.2013
Размер0.69 Mb.
ТипКонспект
lit-yaz.ru > Информатика > Конспект
1   ...   10   11   12   13   14   15   16   17   ...   20
^

Контроль соответствия типов операций и операндов.



Функция, проверяющая идентификаторы, входящие в выражение, должна знать, что идентификатор описан. Если описан, его тип необходимо занести в стек.

void parser :: check_id( ) {

if (TID[c_val].get_declare( ))

st_char.push (TID[c_val].get_type( ));

else throw “not declared”;

}


^

Лекция 10. 16/04/2004.



Продолжение.
Расписываем функции в том порядке, в котором они расположены в классе parser.
void parser :: check_op( ) {

char *t2 = st_char.pop( ),

*op = st_char.pop( ),

*t1 = st_char.pop( ),

*t = “int”,

*r = “bool”;

if (!strcmp(op, “+”) || … “-” … || … “*” … || … “/”) r = “int”;

//многоточие обозначает (!strcmp(op,“_”)), _ - определённая операция

if (!strcmp (op, “or”) || … “and” …) t = “bool”;

if (!strcmp (t1,t2) && !strcmp (t1,t)) st_char.push(r);

else throw “wrong types are in operation”;

if (!strcmp(t, “bool”)) //логическая ли операция?

prog.put_lex (lex(1,TW.look(op)));

//здесь узнали, откуда брать названия операций – из списка слов или разделителей

else prog.put_lex (lex(2,TW.look(op)));

}
void parser :: check_not( ) {

if (strcmp (st_char.pop( ), “bool”))

throw “wrong type is in not”;

else { st_char.push(“bool”);

prog.put_lex (lex (1,TW.look(“not”)));

}
Грамматика нашего модельного языка:

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

E1 -> T {[+ | - | or] T} //{ } – итерационные правила

T -> F {[* | / | and] F}

F -> I | N | [true | false] | not F | (E)
G1: E -> E+E # | E*E # | (E) | c # // # - на эти места надо будет подставить

действия

G2: E -> E+T | E*T | T

T -> i | (E)

G3: E -> T+E | T*E | T

T -> i | (E)

G4: E -> T | E+T

T -> F | T*F

F -> i | (E)

G5: E -> T | T+E

T -> F | F*T

F -> i | (E)
Какие из этих четрёх грамматик наиболее удобны для метода рекурсивного спуска?

G1 неоднозначная (для 1 цепочки из языка есть 2 разных типа вывода), не выдаёт приоритет операций. Надо подставить действия #. Кроме того, в G1 есть левая рекурсия, что недопустимо для МРС.

G2: тоже есть левая рекурсия, не выдаёт приоритет операций. Операции группируются слева направо – это важно.

G3: правая рекурсия – допустима для МРС, но приоритет операций не учитывается (+ и *, учитываются только скобки), не корректно обрабатывает записи вида a-b-c (будет переводить в abc-- , что неверно)

G4: левая рекурсия, операции группируются слева направо, учитывается приоритет операций.

G5: идеальна для нашего выражения – учитывается приоритет операций (идёт сверху вниз), нет рекурсии, операции группируются справа налево, но это не важно. Однако не будет работать по МРС, если добавить минус или разделитель.

(F->) должен быть после E-> и T-> и т.д.
Преобразуем выражения грамматики.

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

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

T -> F {[* | / | and] F }

F -> I | N | [true | false] |

| not F | (E)
К моменту обработки Е подставляем преобразованное Е1, в Е1 – Т аналогичным образом, и т.д.

^

Проверка типов операндов



Рассматриваем операторы.
I:=E

void parser :: eq_type( ) {

if (strcmp(st_char.pop( ), str_char.pop( )))

throw “wrong types are in i=”;

}
I := E

//проверяем, описан ли, и заносим тип в стек, если да

if E then S else S | while E do S

read ( I )
void parser :: eq_bool( ) {

if (strcmp(st_char.pop( ), “bool”))

throw “expression is not boolean”;

}
void parser :: check_id_in_read( ) {

if (!TID[c_val].get_declare( ))

throw “not declared”;

}

write (E);
Напишем для нетерминального символа D процедуру на С++ для проверки контекстных условий.
void parser :: D( ) {

st_int.reset( );

if (!curr_lex.is_ident( )) throw curr_lex;

else {

st_int.push(c_val);

gl( );

while (curr_lex.eq(“,”)) {

gl( );

if (!curr_lex.is_ident( )) throw curr_lex;

else {st_int.push(c_val); gl( ); }}

if (!curr_lex.eq(“:”)) throw curr_lex;

else {

gl( );

if (curr_lex.eq(“int”)) {

dec (“int”); gl( ); }

else if (curr_lex.eq (“bool”)) {

dec (“bool”); gl( ); }

else throw curr_lex; }

}}

- Мы закончили рассмотрение фазы анализа правил интерпретатора или компилятора.
Приступим к генерации внутреннего представления программы.

После анализа должна присутствовать такая внутренняя запись программы, отражающая её синтаксическую структуру.

1   ...   10   11   12   13   14   15   16   17   ...   20

Похожие:

Конспект лекций доцента и. А. Волковой по курсу «системы программирования» iconКонспект лекций по курсу «Объектно-ориентированное программирование»
Б. Страуструп. Язык программирования C++, 3-е изд./Пер с англ. – Спб.; М.: «Невский диалект» – «Издательство бином», 1999 г. – 991...

Конспект лекций доцента и. А. Волковой по курсу «системы программирования» iconКонспект лекций «Логистика. Конспект лекций»
Конспект лекций соответствует требованиям Государственного образовательного стандарта высшего профессионального образования

Конспект лекций доцента и. А. Волковой по курсу «системы программирования» iconВ. Г. Баула Введение в архитектуру ЭВМ и системы программирования
Мгу им. М. В. Ломоносова. По данному курсу существует достаточно обширная литература, посвящённая программированию на Ассемблере,...

Конспект лекций доцента и. А. Волковой по курсу «системы программирования» iconРабочая программа по курсу «основы программирования на с++»
Программа предназначена для обучения программирования на языке С++ учреждений начального профессионального образования для овладения...

Конспект лекций доцента и. А. Волковой по курсу «системы программирования» iconМетодические указания к курсовой работе по дисциплине " системы программирования " Киев -2002
Целью курсовой работы по дисциплине "Системы программирования" является закрепление теоретического материала и приобретение практических...

Конспект лекций доцента и. А. Волковой по курсу «системы программирования» iconРабочая программа по курсу «основы Программирования на языке ассемблер»
Программа предназначена для обучения основам программирования на языке низкого уровня Ассемблере учащихся средних школ, учреждений...

Конспект лекций доцента и. А. Волковой по курсу «системы программирования» iconСистемы сбора информации на железнодорожном транспорте хабаровск
Конспект лекций предназначен для студентов дневной формы обучения специальности 0719 ²Информационные системы на ж д транспорте²,...

Конспект лекций доцента и. А. Волковой по курсу «системы программирования» iconУчебная программа курса или дисциплины «Основы программирования»
В частности, в курсе рассматриваются основные конструкции языков программирования, анализируются основные типы и структуры данных,...

Конспект лекций доцента и. А. Волковой по курсу «системы программирования» iconКонспект лекций по дисциплине вгипу, 2009 Конспект лекций по дисциплине «Управление персоналом»
Крупица В. В., Яшкова Е. В., Егоров Е. Е. Управление персоналом: Конспект лекций по дисциплине – вгипу, 2009

Конспект лекций доцента и. А. Волковой по курсу «системы программирования» iconКонспект лекций. (Электронный учебник) Минск: бгэу, 2010. Тема 1...
Короленок Г. А. Менеджмент в торговле. Конспект лекций. (Электронный учебник) Минск: бгэу, 2010



Образовательный материал



При копировании материала укажите ссылку © 2013
контакты
lit-yaz.ru
главная страница