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




НазваниеКонспект лекций доцента и. А. Волковой по курсу «системы программирования»
страница14/20
Дата публикации24.05.2014
Размер0.69 Mb.
ТипКонспект
literature-edu.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Республики Беларусь Учреждение образования «белорусский государственный...
Конспект лекций по курсу «Основы алгоритмизации и программирования» для студентов всех специальностей и всех форм обучения. Мн.:...

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

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

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

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

Конспект лекций доцента и. А. Волковой по курсу «системы программирования» iconКонспект лекций для студентов специальности 1-25 01 04 «Финансы и...
...

Конспект лекций доцента и. А. Волковой по курсу «системы программирования» iconКонспект лекций для студентов специальности 1-54 01 01-04 «Метрология,...
Конспект лекций предназначен для студентов специальности 1-54 01 01-04 «Метрология, стандартизация и сертификация (лёгкая промышленность)»...

Конспект лекций доцента и. А. Волковой по курсу «системы программирования» iconАвтор: Медведева Г. В
Курс лекций содержит основные разделы языка программирования t-pascal, предусмотренные образовательным стандартом

Конспект лекций доцента и. А. Волковой по курсу «системы программирования» iconКонспект лекций для студентов пятого курса специальности 220400 Программное...
Данный конспект лекций составлен для студентов четвёртого курса специальности “Программное обеспечение вычислительной техники и автоматизированных...

Конспект лекций доцента и. А. Волковой по курсу «системы программирования» iconУчебник Толубеевой Т. И., доцента кафедры пти «Основы проектирования крупноузорчатых тканей»
Особенность Декады – 25- летие выхода в свет стандартов исо серии 9000 на системы менеджмента качества

Литература


При копировании материала укажите ссылку © 2015
контакты
literature-edu.ru
Поиск на сайте

Главная страница  Литература  Доклады  Рефераты  Курсовая работа  Лекции