close

Вход

Забыли?

вход по аккаунту

?

11 (3)

код для вставкиСкачать
РОСЖЕЛДОР
Федеральное государственное бюджетное образовательное
учреждение высшего профессионального образования
"Ростовский государственный университет путей сообщения"
(ФГБОУ ВПО РГУПС)
Лабораторная работа По дисциплине
"Системное программное обеспечение"
На тему
"Анализ секции объявления"
Вариант №13
№ 11
Выполнил:
Студент Лысак В.В.
Гр. АИ-3-026
Проверил:
Преподаватель Жуков В.В.
Г. Ростов-на-Дону
2013 г.
Цель работы
После того , как компилятор анализировал грамматику <программа > → 'program' I (<блок объявлений> | ) <блок операторов> '.' и не было выявлено ошибок, необходимо перейти к секции объявления:
<блок объявлений> → 'var' I {',' I} ':' <тип> ';' {I{',' I} ':' <тип> ';'}
<тип> → <базовый тип> | <массив>
<базовый тип> → 'integer' | 'char' | 'boolean'
<массив> → 'array' '[' C ']' 'of' <базовый тип>
Рассмотрим реализацию для секции объявления:
Код программы (pascal)
procedure checkVariables;
var
varListBegin, varListEnd, u: integer;
fileStr: string;
begin
identifier := 1;
writeln(asmFile, ';program variables');
scan;
if not((a = 'K') and (n = 22)) then // 'var'
error(12);
scan;
if not(a = 'I') then // I
error(13);
inc(identifier);
if (n <> identifier) then
error(100);
varListBegin := n;
varListEnd := n;
scanp;
if ((a = 'R') and (n = 15)) then // {',' I}
begin
while not((a = 'R') and (n = 8)) do
begin
scan;
if not((a = 'R') and (n = 15)) then
error(14);
scan;
if not(a = 'I') then
error(13);
inc(identifier);
if (n <> identifier) then
error(100);
varListEnd := n;
scanp;
end;
end;
scan;
if not((a = 'R') and (n = 8)) then // ':'
error(15);
checkType; // <type>
for i := varListBegin to varListEnd do
begin
identifierToken[i]._identifierType:=
baseType;
if (baseType = 2) then
begin
identifierToken[i]._arrayType := arrayType;
identifierToken[i]._arraySize := arraySize;
end;
end;
scan;
if not((a = 'R') and (n = 9)) then // ';'
error(16);
// {I {',' I} ':' <type> ';' }
scanp;
while not((a = 'K') and (n = 3)) do
begin
scan;
if not(a = 'I') then // I
error(17);
inc(identifier);
if (n <> identifier) then
error(100);
varListBegin := n;
varListEnd := n;
scanp;
if ((a = 'R') and (n = 15)) then {',' I}
begin
while not((a = 'R') and (n = 8)) do
begin
scan;
if not((a = 'R') and (n = 15)) then
error(14);
scan;
if not(a = 'I') then
error(13);
inc(identifier);
if (n <> identifier) then
error(100);
varListEnd := n;
scanp;
end;
end;
scan;
if not((a = 'R') and (n = 8)) then // ':'
error(15);
checkType; // <type>
for i := varListBegin to varListEnd do
begin
identifierToken[i]._identifierType := baseType;
if (baseType = 2) then
begin
identifierToken[i]._arrayType := arrayType;
identifierToken[i]._arraySize := arraySize;
end;
end;
scan;
if not((a = 'R') and (n = 9)) then // ';'
error(16);
scanp;
end;
for i:= 2 to varListEnd do
begin
write(asmFile, identifierToken[i]._name);
if (identifierToken[i]._identifierType = 2) then
u := identifierToken[i]._arrayType
else
u := identifierToken[i]._identifierType; if (u = 12) then
write(asmFile, ' dw ')
else
write(asmFile, ' db ');
if (identifierToken[i]._identifierType = 2) then
writeln(asmFile, identifierToken[i]._arraySize, ' DUP (?)')
else
writeln(asmFile, '(?)');
end;
if (varListEnd <> totalIdentifier) then
for i := varListEnd + 1 to totalIdentifier do
error(23);
end;
//recursive descent
// <type> -> <base_type> | <array_type> procedure checkType;
begin
scan;
if ((a = 'K') and (n = 2)) then
begin
baseType := 2;
checkArrayType; // <array_type>
end
else
checkBaseType; // <base_type>
end;
//recursive descent
// <base_type> -> 'boolean' | 'char' | 'integer'
procedure checkBaseType;
begin
if not(a = 'K') then
error(18)
else
if ((n = 4) or (n = 5) or (n = 12)) then
// 'boolean' | 'char' | 'integer'
baseType := n
else
error(18);
end;
//recursive descent
// <array_type> -> 'array' '[' C ']' 'of' <base_type>
procedure checkArrayType;
var
tmp: integer;
begin
if not((a = 'K') and (n = 2)) then // 'array'
error(19);
scan;
if not((a = 'R') and (n = 16)) then // '['
error(20);
scan;
if not(a = 'C') then // C
error(21);
arraySize := numberToken[n];
scan;
if not((a = 'R') and (n = 17)) then // ']'
error(4);
scan;
if not((a = 'K') and (n = 15)) then // 'of;
error(22);
scan;
tmp := baseType;
checkBaseType;// <base_type>
arrayType := baseType;
baseType := tmp;
end;
Выполнение
Пусть дан блок объявления:
f: array[3] of char;
mas: array[10] of integer;
x, y, a, b, c, i:integer;
Тогда на Assembler будет выглядеть:
;program variables
f db 3 DUP (?)
mas dw 10 DUP (?)
x dw (?)
y dw (?)
a dw (?)
b dw (?)
c dw (?)
i dw (?)
endVar:
Документ
Категория
Рефераты
Просмотров
9
Размер файла
30 Кб
Теги
1/--страниц
Пожаловаться на содержимое документа