Семантика языков программирования. Преобразование программы в постфиксную запись и псевдокод

Страницы работы

Фрагмент текста работы

Министерство образования и науки Российской Федерации

Федеральное агентство по образованию

Государственное образовательное учреждение

высшего профессионального образования

Новосибирский государственный технический университет

Кафедра ВТ

NSTU1

Лабораторная работа №7

по дисциплине «Системное программное обеспечение»

«Семантика языков программирования. Преобразование программы в постфиксную запись и псевдокод.»

Вариант: 1121414

Группа:  АМ-709

Студент:

Максименко Д.С.

Преподаватель:

Малявко А.А.

Новосибирск, 2010


1. Цели работы.

Цели работы: изучение задач и методов преобразования текста транслируемой программы вначале в постфиксную запись (ПФЗ) для выявления заложенной в алгоритм последовательности операций, затем в последовательность тетрад для построения псевдокода, приобретение навыков разработки действий, реализующих семантические проверки и преобразования.

2. Ход работы.

Для преобразования текста в ПФЗ используются следующие глобальные переменные и функции:

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)

Похожие материалы

Информация о работе