Алексей Молчанов - Системное программное обеспечение. Лабораторный практикум
- Название:Системное программное обеспечение. Лабораторный практикум
- Автор:
- Жанр:
- Издательство:Array Издательство «Питер»
- Год:2005
- Город:Санкт-Петербург
- ISBN:978-5-469-00391-4
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Алексей Молчанов - Системное программное обеспечение. Лабораторный практикум краткое содержание
Книга ориентирована на студентов, обучающихся в технических вузах по специальностям, связанным с вычислительной техникой. Но она будет также полезна всем, чья деятельность так или иначе касается разработки программного обеспечения.
Системное программное обеспечение. Лабораторный практикум - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Result:= lexTmp;
Exit;
end; { Если это переменная, то запоминаем ссылку
на таблицу идентификаторов }
Opers[iOp].OpType:= OP_VAR;
Opers[iOp].VarLink:= VarInfo;
end
else
if LexType = LEX_CONST then
begin { Если это константа, то запоминаем ее значение }
Opers[iOp].OpType:= OP_CONST;
Opers[iOp].ConstVal:= ConstVal;
end
else begin { Иначе это ошибка, возвращаем лексему }
Result:= lexTmp; { как указатель на место ошибки }
Exit;
end;
iIns:= iMin; Result:= nil;
end
else { иначе это синтаксическая конструкция }
begin {Вызываем рекурсивно функцию создания списка триад}
Result:= MakeTriadListNOP(symbTop[iSymOp],listTriad);
if Result <> nil then Exit; {Ошибка – прерываем алгоритм}
iIns:= listTriad.Count; { Запоминаем индекс триады }
if iIns <= iMin then {Если индекс меньше минимального —}
begin { это ошибка }
Result:= symbTop[iSymErr].Lexem;
Exit;
end;
Opers[iOp].OpType:= OP_LINK;{Запоминаем ссылку на}
Opers[iOp].TriadNum:= iIns-1; {предыдущую триаду }
end;
end;
function MakeOperation(
Trd: TTriadType{тип создаваемой триады}): TLexem;
{ Функция создания списка триад для линейных операций }
begin { Создаем ссылку на первый операнд }
Result:= MakeOperand(1{op},0{sym},listTriad.Count,
1{sym err},iIns1);
if Result <> nil then Exit; {Ошибка – прерываем алгоритм}
{ Создаем ссылку на второй операнд }
Result:= MakeOperand(2{op},2{sym},iIns1,
1{sym err},iIns2);
if Result <> nil then Exit; {Ошибка – прерываем алгоритм}
{ Создаем саму триаду с двумя ссылками на операнды }
listTriad.Add(TTriad.Create(Trd,Opers));
end;
begin { Тело главной функции }
case symbTop.Rule of { Начинаем с выбора типа правила }
5:{'if(B)EelseE'} { Полный условный оператор }
begin { Запоминаем ссылку на первый операнд
(условие «if(B)») }
Result:= MakeOperand(1{op},2{sym},listTriad.Count,
1{sym err},iIns1);
{ Если произошла ошибка, прерываем выполнение }
if Result <> nil then Exit;
Opers[2].OpType:= OP_LINK; { Второй операнд – }
Opers[2].TriadNum:= 0; {ссылка на триаду, номер
которой пока не известен}
{ Создаем триаду типа «IF» }
listTriad.Add(TTriad.Create(TRD_IF,Opers));
{ Запоминаем ссылку на второй операнд (раздел «(B)E») }
Result:= MakeOperand(2{op},4{sym},iIns1,
3{sym err},iIns2);
{ Если произошла ошибка, прерываем выполнение }
if Result <> nil then Exit;
Opers[1].OpType:= OP_CONST; {Заполняем операнды}
Opers[1].ConstVal:= 1; { для триады типа «JMP»,
которая должна быть в конце раздела «(B)E»}
Opers[2].OpType:= OP_LINK; { Второй операнд – }
Opers[2].TriadNum:= 0; {ссылка на триаду, номер
которой пока не известен}
{ Создаем триаду типа «JMP» }
listTriad.Add(TTriad.Create(TRD_JMP,Opers));
{ Для созданной ранее триады «IF» ставим ссылку
в конец последовательности триад раздела «(B)E» }
listTriad[iIns1].Links[2]:= iIns2+1;
{ Запоминаем ссылку на третий операнд (раздел «elseE») }
Result:= MakeOperand(2{op},6{sym},iIns2,
5{sym err},iIns3);
{ Если произошла ошибка, прерываем выполнение }
if Result <> nil then Exit;
{ Для созданной ранее триады «JMP» ставим ссылку
в конец последовательности триад раздела «elseE» }
listTriad[iIns2].Links[2]:= iIns3;
end;
6:{'if(B)E'} { Неполный условный оператор }
begin { Запоминаем ссылку на первый операнд
(условие «if(B)») }
Result:= MakeOperand(1{op},2{sym},listTriad.Count,
1{sym err},iIns1);
{ Если произошла ошибка, прерываем выполнение }
if Result <> nil then Exit;
Opers[2].OpType:= OP_LINK; { Второй операнд – }
Opers[2].TriadNum:= 0; {ссылка на триаду, номер
которой пока не известен}
{ Создаем триаду типа «IF» }
listTriad.Add(TTriad.Create(TRD_IF,Opers));
{ Запоминаем ссылку на второй операнд (раздел «(B)E») }
Result:= MakeOperand(2{op},4{sym},iIns1,
3{sym err},iIns2);
{ Если произошла ошибка, прерываем выполнение }
if Result <> nil then Exit;
{ Для созданной ранее триады «IF» ставим ссылку
в конец последовательности триад раздела «(B)E» }
listTriad[iIns1].Links[2]:= iIns2;
end;
8:{'while(B)doE'} { Оператор цикла «while» }
begin { Запоминаем ссылку на первый операнд
(условие «while(B)») }
iIns3:= listTriad.Count;
Result:= MakeOperand(1{op},2{sym},iIns3,
1{sym err},iIns1);
{ Если произошла ошибка, прерываем выполнение }
if Result <> nil then Exit;
Opers[2].OpType:= OP_LINK; { Второй операнд – }
Opers[2].TriadNum:= 0; {ссылка на триаду, номер
которой пока не известен}
{ Создаем триаду типа «IF» }
listTriad.Add(TTriad.Create(TRD_IF,Opers));
{ Запоминаем ссылку на второй операнд (раздел «doE») }
Result:= MakeOperand(2{op},5{sym},iIns1,
4{sym err},iIns2);
{ Если произошла ошибка, прерываем выполнение }
if Result <> nil then Exit;
Opers[1].OpType:= OP_CONST; {Заполняем операнды}
Opers[1].ConstVal:= 1; { для триады типа «JMP»,
которая должна быть в конце раздела «doE» }
{ Второй операнд – ссылка на начало списка триад }
Opers[2].OpType:= OP_LINK;
Opers[2].TriadNum:= iIns3;
{ Создаем триаду типа «JMP» }
listTriad.Add(TTriad.Create(TRD_JMP,Opers));
{ Для созданной ранее триады «IF» ставим ссылку
в конец последовательности триад раздела «doE» }
listTriad[iIns1].Links[2]:= iIns2+1;
end;
9:{'a:=E'} { Оператор присвоения }
begin { Если первый операнд не является переменной,
то это ошибка }
if symbTop[0].Lexem.LexType <> LEX_VAR then
begin
Result:= symbTop[0].Lexem; Exit;
end; { Если имя первого операнда совпадает с именем
параметра, то это семантическая ошибка }
if (symbTop[0].Lexem.VarName = NAME_INPVAR)
or (symbTop[0].Lexem.VarName = NAME_RESULT) then
begin
Result:= symbTop[0].Lexem; Exit;
end;
{ Создаем ссылку на первый операнд – переменную }
Opers[1].OpType:= OP_VAR;
Opers[1].VarLink:= symbTop[0].Lexem.VarInfo;
{ Создаем ссылку на второй операнд }
Result:= MakeOperand(2{op},2{sym},listTriad.Count,
1{sym err},iIns1);
{ Если произошла ошибка, прерываем выполнение }
if Result <> nil then Exit;
{ Создаем триаду типа «присваивание» }
listTriad.Add(TTriad.Create(TRD_ASSIGN,Opers));
end;
{ Генерация списка триад для линейных операций }
10:{'BorB'} Result:= MakeOperation(TRD_OR);
11:{'BxorB'} Result:= MakeOperation(TRD_XOR);
13:{'BandB'} Result:= MakeOperation(TRD_AND);
15:{'E
16:{'E>E'} Result:= MakeOperation(TRD_GT);
17:{'E=E'} Result:= MakeOperation(TRD_EQ);
18:{'E<>E'} Result:= MakeOperation(TRD_NEQ);
21:{'E-E'} Result:= MakeOperation(TRD_SUB);
22:{'E+E'} Result:= MakeOperation(TRD_ADD);
20:{not(B)}
begin { Создаем ссылку на первый операнд }
Result:= MakeOperand(1{op},2{sym},listTriad.Count,
1{sym err},iIns1);
{ Если произошла ошибка, прерываем выполнение }
if Result <> nil then Exit;
Opers[2].OpType:= OP_CONST; {Второй операнд для}
Opers[2].ConstVal:= 0; { NOT не имеет значения }
{ Создаем триаду типа «NOT» }
listTriad.Add(TTriad.Create(TRD_NOT,Opers));
end;
24:{uminE}
begin { Создаем ссылку на второй операнд }
Result:= MakeOperand(2{op},1{sym},listTriad.Count,
0{sym err},iIns1);
{ Если произошла ошибка, прерываем выполнение }
if Result <> nil then Exit;
Opers[1].OpType:= OP_CONST; {Первый операнд для}
Opers[1].ConstVal:= 0; { унарной операции "-"
должен быть 0 }
{ Создаем триаду типа «UMIN» }
Читать дальшеИнтервал:
Закладка: