Розробка системних програмних модулів та компонент систем програмування

Автор: Пользователь скрыл имя, 25 Февраля 2012 в 16:19, курсовая работа

Описание работы

Незважаючи на більш ніж піввікову історію обчислювальної техніки, формально роком народження теорії трансляторів можна вважати 1957, коли з'явився перший транслятор мови Фортран, створений Бекасом. До цього часу створення трансляторів було досить "творчим" процесом. Лише поява теорії формальних мов і строгих математичних моделей дозволило перейти від "творчості" до "науки".

Содержание

Вступ
1. Огляд методів та способів проектування трансляторів
1.1. Основні поняття і визначення
1.2. Узагальнена структура транслятора
1.4. Варіанти взаємодії блоків транслятора
2. Формальний опис вхідної мови програмування
2.1. Деталізований опис вхідної мови в термінах розширеної нотації Бекуса-Наура
2.2. Опис термінальних символів та ключових слів
3. Розробка транслятора вхідної мови програмування
3.1. Вибір технології програмування
3.2. Проектування таблиць транслятора та вибір структур даних
3.3. Розробка лексичного аналізатора
3.3.1. Розробка граф-схеми алгоритму
3.3.2. Опис програмної реалізації лексичного аналізатора
3.4. Розробка синтаксичного та семантичного аналізатора
3.4.1. Розробка граф-схеми алгоритму
3.4.2. Опис програмної реалізації синтаксичного та семантичного аналізатора
3.5. Розробка генератора коду
3.5.1. Розробка граф-схеми алгоритму
3.5.2. Опис програмної реалізації генератора коду
4. Опис інтерфейсу та інструкції користувача
4.1. Опис інтерфейсу
4.1.1. Головне меню та панель інструментів.
4.2. Інструкція програміста
4.2.1. Алфавіт мови
4.2.2. Коментарі
4.2.3. Тип даних
4.2.4. Розділи, використовувані при написанні програм
4.2.5. Типи операцій
4.2.6. Типи операторів
5. Відлагодження та тестування програми
5.1. Виявлення лексичних помилок
5.2. Виявлення синтаксичних помилок
5.3. Виявлення семантичних помилок
5.4. Загальна перевірка коректності роботи транслятора
Висновки
Список літератури
Додатки
А. Лістинг програми

Работа содержит 1 файл

asm_cource_k9.doc

— 1,020.00 Кб (Скачать)

                }

                else

                {

                    GramTree.Nodes.Add("Program_Header");

                    AddError("Unrecognized program header!", LexTable[0].Line);

                }

            }

            return GramTree;

        }

        //check varible definition and build ident table       

        private TreeNode ProcessVarDefinition()

        {

            TreeNode Node = new TreeNode("Variable_Definition");

            Node.Nodes.Add(LexToNode(LexTable[3]));

            int i = 4;

            if (i < LexTable.Count)

            {

                while (true)

                {

                    if ((LexTable[i].Type == LexemType.EOF) | (LexTable[i].Type == LexemType.Semicolon))

                    {

                        break;

                    }

                    if (LexTable[i].Type == LexemType.Ident)

                    {

                        if (i + 3 < LexTable.Count)

                        {

                            if (LexTable[i + 1].Type == LexemType.Equator)

                            {

                                if (LexTable[i + 2].Type == LexemType.Const)

                                {

                                    if ((LexTable[i + 3].Type == LexemType.Coma) | (LexTable[i + 3].Type == LexemType.Semicolon))

                                    {

                                        Node.Nodes.Add(LexToNode(LexTable[i]));

                                        Node.Nodes.Add(LexToNode(LexTable[i + 1]));

                                        Node.Nodes.Add(LexToNode(LexTable[i + 2]));

                                        Identificator Id = new Identificator();

                                        Id.Line = LexTable[i].Line;

                                        Id.Name = LexTable[i].Text;

                                        Id.Value = LexTable[i + 2].Value;

                                        Id.IsDeclared = true;

                                        bool iscont = false;

                                        for (int j = 0; j < IdentTable.Count; j++)

                                        {

                                            if (Id.Name == IdentTable[j].Name)

                                            {

                                                iscont = true;

                                            }

                                        }

                                        if (!iscont)

                                        {

                                            IdentTable.Add(Id);

                                        }

                                        else

                                        {

                                            AddError("Warning [" + LexTable[i].Text + "] is double declared!", LexTable[i].Line);

                                        }

                                        i += 3;

                                    }

                                    else

                                    {

                                        AddError("Unrecognized [" + LexTable[i + 3].Text + "] Expected [,] or [;] !", LexTable[i + 2].Line);

                                        i += 3;

                                    }

                                }

                                else

                                {

                                    AddError("Expected Ident := Const!", LexTable[i + 2].Line);

                                    i += 3;

                                }

                            }

                            else

                            {

                                if ((LexTable[i + 1].Type == LexemType.Coma) | (LexTable[i + 1].Type == LexemType.Semicolon))

                                {

                                    Node.Nodes.Add(LexToNode(LexTable[i]));

                                    Identificator Id = new Identificator();

                                    Id.Line = LexTable[i].Line;

                                    Id.Name = LexTable[i].Text;

                                    bool iscont = false;

                                    for (int j = 0; j < IdentTable.Count; j++)

                                    {

                                        if (Id.Name == IdentTable[j].Name)

                                        {

                                            iscont = true;

                                        }

                                    }

                                    if (!iscont)

                                    {

                                        IdentTable.Add(Id);

                                    }

                                    else

                                    {

                                        AddError("Warning [" + LexTable[i].Text + "] is double declared!", LexTable[i].Line);

                                    }

                                    i++;

                                }

                                else

                                {

                                    AddError("Unrecognized [" + LexTable[i + 1].Text + "] Expected [,] or [;] !", LexTable[i + 1].Line);

                                    i++;

                                }

                            }

                        }

                        else

                        {

                            if ((LexTable[i + 1].Type == LexemType.Coma) | (LexTable[i + 1].Type == LexemType.Semicolon))

                            {

                                Node.Nodes.Add(LexToNode(LexTable[i]));

                                Identificator Id = new Identificator();

                                Id.Line = LexTable[i].Line;

                                Id.Name = LexTable[i].Text;

                                bool iscont = false;

                                for (int j = 0; j < IdentTable.Count; j++)

                                {

                                    if (Id.Name == IdentTable[j].Name)

                                    {

                                        iscont = true;

                                    }

                                }

                                if (!iscont)

                                {

                                    IdentTable.Add(Id);

                                }

                                else

                                {

                                    AddError("Warning [" + LexTable[i].Text + "] is double declared!", LexTable[i].Line);

                                }

                                i++;

                            }

                            else

                            {

                                AddError("Unrecognized [" + LexTable[i + 1].Text + "] Expected [,] or [;] !", LexTable[i + 1].Line);

                                i++;

                            }

                        }

                    }

                    if (LexTable[i].Type == LexemType.Coma)

                    {

                        Node.Nodes.Add(LexToNode(LexTable[i]));

                        i++;

                    }

                }

                if (LexTable[i].Type == LexemType.EOF)

                {

                    AddError("You forget a [;] !", LexTable[i].Line);

                }

                else

                {

                    if (LexTable[i].Type == LexemType.Semicolon)

                    {

                        Node.Nodes.Add(LexToNode(LexTable[i]));

                        i++;

                    }

                    else

                    {

                        AddError("You forget a [;] !", LexTable[i].Line);

                    }

                }

            }

            return Node;

        }

        //check code block and visualise it, build asm code

        private TreeNode ProcessCodeBlock(int index)

        {

            TreeNode Node = new TreeNode("Code_Block");

            Node.StateImageIndex = 0;

            Stack<int> IndexesSt = new Stack<int>();

            Stack<TreeNode> OutSt = new Stack<TreeNode>();

            Stack<TreeNode> InSt = new Stack<TreeNode>();

            for (int i = LexTable.Count - 1; i >= index; i--)

            {

                InSt.Push(LexToNode(LexTable[i]));

            }

            TreeNode eof = LexToNode(LexTable[LexTable.Count - 1]);

            OutSt.Push(eof);

            while (true)

            {

                if ((OutSt.First().ImageKey == "EOF") & (InSt.First().ImageKey == "Block") & (InSt.Count == 2))

                {

                    Node.Nodes.Add(InSt.First());

                    return Node;

                }

                if ((OutSt.First().ImageKey == "EOF") & (InSt.First().ImageKey == "EOF"))

                {

                    break;

                }

                else

                {

                    switch (PriorityTable[Convert.ToInt32(StringToLex(OutSt.First().ImageKey)), Convert.ToInt32(StringToLex(InSt.First().ImageKey))])

                    {

                        case 0:

                            {

                                AddError("Incorrect using [" + OutSt.First().Name + "] with [" + InSt.First().Name + "]", InSt.First().SelectedImageIndex);

                                return Node;

                            }

                        case 1:

                            {

                                IndexesSt.Push(1);

                                OutSt.Push(InSt.Pop());

                                break;

                            }

                        case 2:

                            {

                                try

                                {

                                    int tmp = IndexesSt.Pop();

                                    tmp++;

                                    IndexesSt.Push(tmp);

                                }

                                catch (InvalidOperationException)

                                {

                                    AddError("Wrong balance of open and close lexems", InSt.First().SelectedImageIndex);

                                    return Node;

                                }

                                OutSt.Push(InSt.Pop());

                                break;

                            }

                        case 3:

                            {

                                int tmp = 2;

                                try

                                {

                                    tmp = IndexesSt.Pop();

                                }

                                catch (InvalidOperationException)

                                {

                                    AddError("Wrong balance of open and close lexems", InSt.First().SelectedImageIndex);

                                    return Node;

                                }

                                Stack<TreeNode> ArgForFunct = new Stack<TreeNode>();

                                for (; tmp > 0; tmp--)

                                {

                                    ArgForFunct.Push(OutSt.Pop());

                                }

                                InSt.Push(Coagulation(ArgForFunct));

                                break;

                            }

                        case 4:

                            {

                                Stack<TreeNode> ArgForFunct = new Stack<TreeNode>();

                                int Line = InSt.First().SelectedImageIndex;

                                try

                                {

                                    Stack<TreeNode> tmp = new Stack<TreeNode>();

                                    tmp.Push(InSt.Pop());

                                    while (tmp.First().ImageKey != "Semicolon")

                                    {

                                        tmp.Push(InSt.Pop());

                                    }

                                    while (tmp.Count > 0)

                                    {

                                        ArgForFunct.Push(tmp.Pop());

                                    }

                                }

                                catch (InvalidOperationException)

                                {

                                    try

                                    {

                                        AddError("You forgot a semicolon in expression", ArgForFunct.Last().SelectedImageIndex);

                                    }

                                    catch (InvalidOperationException)

                                    {

                                        AddError("You forgot a semicolon in expression", Line);

                                    }

                                    return Node;

                                }

                                InSt.Push(ProcessEquation(ArgForFunct, true));

                                break;

                            }

                        case 5:

                            {

                                TreeNode BlockFor = new TreeNode("Block");

Информация о работе Розробка системних програмних модулів та компонент систем програмування