Министерство образования и науки Российской Федерации
Федеральное агентство по образованию
Государственное образовательное учреждение
высшего профессионального образования
Новосибирский государственный технический университет
Кафедра ВТ
Лабораторная работа №7
по дисциплине «Системное программное обеспечение»
«Семантика языков программирования. Преобразование программы в постфиксную запись и псевдокод.»
Вариант: 1121414
Группа: АМ-709
Студент:
Максименко Д.С.
Преподаватель:
Малявко А.А.
Новосибирск, 2010
Цели работы: изучение задач и методов преобразования текста транслируемой программы вначале в постфиксную запись (ПФЗ) для выявления заложенной в алгоритм последовательности операций, затем в последовательность тетрад для построения псевдокода, приобретение навыков разработки действий, реализующих семантические проверки и преобразования.
Для преобразования текста в ПФЗ используются следующие глобальные переменные и функции:
Stack opd = new Stack(), oprStk = new Stack(), opr = null, labelStk = new Stack();
//Стэки: операндов, стеков операторов, операторов, стеков меток
int labelCnt = 0; - счетчик меток
Vector oper = new Vector(), PFR = new Vector(), tetr;
//множество возможных операций, ПФЗ, тетрады
void VectAdd() // Заполнение множества возможных операций
{
oper.add("!"); // 0
oper.add("!="); oper.add("=="); oper.add(">"); oper.add("<"); oper.add(">="); oper.add("<="); // 1-6
oper.add("||"); oper.add("&&"); oper.add("^^"); // 7-9
oper.add("Fork_p1"); oper.add("Fork_p2"); oper.add("Fork_p3"); oper.add("Fork_p4"); // 10-13
oper.add("DefBuilder"); oper.add("DefMethod"); oper.add("DefVar"); oper.add("DefArg"); // 14-17
oper.add("DefClass"); // 18
oper.add("return"); oper.add("delete"); oper.add("new"); // 19-21
oper.add("#"); oper.add("("); oper.add(")"); oper.add("="); oper.add("*"); oper.add("/"); oper.add("+"); oper.add("-");
oper.add("Func_entry"); oper.add("DefLabel"); oper.add("Call"); oper.add("Arg"); // 30-33
oper.add("."); // 34
oper.add("Find"); // 35
oper.add("jmp"); oper.add("jz"); // 36-37
}
lexem NewLex(String text) // Создание новой лексемы из строки
{
lexem Lexem = new lexem();
Lexem.textOfWord = new StringBuffer(text);
Lexem.groupIndex = Lexem.wordIndex = 0;
return Lexem;
}
void OprChange(boolean nw) // Переход к новому или старому стеку операторов
{
if (nw)
{
oprStk.push(opr);
opr = new Stack();
}
else
{
if (opr.size() > 0)
{
/**ShowStk();/**/
ti.put(666, "Error! opr not empty!");
}
opr = (Stack)oprStk.pop();
/**ShowStk(); ti.put(201, "Opr deleted!");/**/
}
}
String LTS(Object ob) // Lexem to String
{
try
{
return ((lexem)ob).textOfWord.toString();
}
catch(Exception e)
{
return "Error! Unrecognized lexem!";
}
}
void ShowStk() // Показать все стеки
{
String st = "";
for(Object ob:PFR)
st += LTS(ob) + " ";
ti.put(66, "PFR: " + st);
ti.put(66, "opd: " + opd.toString());
if (opr != null)
{
st = "";
for(Object ob:opr)
st += LTS(ob) + " ";
ti.put(66, "opr: [" + st + "]");
}
else ti.put(66, "opr == null");
ti.put(66, "oprStk: " + oprStk.toString());
}
void ToPFR(String st, int typ)
{
ToPFR(NewLex(st), typ);
}
void ToPFR(lexem Lexem, int typ) // Запись в ПФЗ
{
try
{
int ind = oper.indexOf(LTS(Lexem));
switch (typ)
{
case 0:
{
PFR.add(Lexem);
opd.push(LTS(Lexem));
break;
}
case 1:
{
switch (Lexem.textOfWord.toString().charAt(0))
{
case '#':
{
if (opr == null)
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.