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

Автор: Пользователь скрыл имя, 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 Кб (Скачать)

             string data =  ";-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n";

                    data += ";        DATA BLOCK\n";

                    data += ";-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n";

                    data += ".data\ntemp dd 0\n";

                    for (int i = 0; i < SyntaxAnaliz.StringTable.Count; i++)

                    {

                        data += SyntaxAnaliz.StringTable[i].Name + " db " + SyntaxAnaliz.StringTable[i].Value + ",0\n";

                    }

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

                    {

                        data += SyntaxAnaliz.IdentTable[i].Name + " dd " + SyntaxAnaliz.IdentTable[i].Value.ToString() + "\n";

                    }

                    data += ".const\n";

                    for (int i = 0; i < SyntaxAnaliz.ConstTable.Count; i++)

                    {

                        data += SyntaxAnaliz.ConstTable[i].Name + " dd " + SyntaxAnaliz.ConstTable[i].Value.ToString() + "\n";

                    }

                    asmcode = macros + head + data + ".code\n" + code;

            }

        }

        private string asmcode;

        private void ErrorsView_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)

        {

            InputBox.TabIndex = 99;

            int SavePosition = InputBox.SelectionStart;

            InputBox.SelectAll();

            InputBox.SelectionBackColor = Color.White;

            InputBox.DeselectAll();

            int Line = 0;

            int Start = 0;

            for (; (Line < Convert.ToInt32(e.Node.Name)) & (Start < InputBox.Text.Length); Start++)

            {

                if (InputBox.Text[Start] == '\n')

                {

                    Line++;

                }

            }

            int End = Start;

            for (; (Line < Convert.ToInt32(e.Node.Name) + 1) & (End < InputBox.Text.Length); End++)

            {

                if (InputBox.Text[End] == '\n')

                {

                    Line++;

                }

            }

            InputBox.Select(Start, End - Start);

            InputBox.SelectionBackColor = Color.Red;

            InputBox.DeselectAll();

            InputBox.SelectionStart = SavePosition;

        }

        Form PriorTableEdit;

        Form ShowTree;

        private int TableSize;

        public TextBox[][] EditorFields;

        private void exitToolStripMenuItem_Click(object sender, EventArgs e)

        {

            this.Dispose();

        }

        private void newToolStripMenuItem_Click(object sender, EventArgs e)

        {

            InputBox.ResetText();

        }

        private void openToolStripMenuItem_Click(object sender, EventArgs e)

        {

            op_file_dlg.Reset();

            if (op_file_dlg.ShowDialog() == DialogResult.OK)

            {

                InputBox.LoadFile(op_file_dlg.OpenFile(), RichTextBoxStreamType.PlainText);

                InputBox.SelectionStart = InputBox.Text.Length - 1;

                TextHighlight();

            }

        }

        private void saveToolStripMenuItem_Click(object sender, EventArgs e)

        {

            try

            {

                InputBox.SaveFile(op_file_dlg.InitialDirectory + op_file_dlg.FileName,RichTextBoxStreamType.PlainText);

            }

            catch(ArgumentException)

            {

                SaveAs();

            }

        }

        private void SaveAs()

        {

            if (sv_file_dlg.ShowDialog() == DialogResult.OK)

            {

                InputBox.SaveFile(sv_file_dlg.OpenFile(), RichTextBoxStreamType.PlainText);

                sv_file_dlg.Reset();

            }

        }

        private void saveAsToolStripMenuItem_Click(object sender, EventArgs e)

        {

            SaveAs();

        }

        private void cutToolStripMenuItem_Click(object sender, EventArgs e)

        {

            InputBox.Cut();

        }

        private void copyToolStripMenuItem_Click(object sender, EventArgs e)

        {

            InputBox.Copy();

        }

        private void pasteToolStripMenuItem_Click(object sender, EventArgs e)

        {

            InputBox.Paste();

        }

        private void undoToolStripMenuItem_Click(object sender, EventArgs e)

        {

            InputBox.Undo();

        }

        private void redoToolStripMenuItem_Click(object sender, EventArgs e)

        {

            InputBox.Redo();

        }

        private void clearToolStripMenuItem_Click(object sender, EventArgs e)

        {

            InputBox.Clear();

        }

        private void viewTreeToolStripMenuItem_Click(object sender, EventArgs e)

        {

            ShowTree = new Form();

            ShowTree.Size = new System.Drawing.Size(1150, 470);

            ShowTree.Text = "Gramatic tree view";

            TreeView view = new TreeView();

            view.Dock = DockStyle.Fill;

            view.Nodes.Add(ViewTree);

            view.ExpandAll();

            ShowTree.Controls.Add(view);

            ShowTree.Show();

        }

 

        private void Tables_mvi_Click(object sender, EventArgs e)

        {

            //Create form

            ShowTree = new Form();

            ShowTree.Size = new System.Drawing.Size(1150, 470);

            ShowTree.Text = "Output tables";

            //Add tab control

            TabControl tab = new TabControl();

            tab.Dock = DockStyle.Fill;

            TabPage tpage = new TabPage();

            tpage.Text = "Lexem table";

            tab.TabPages.Add(tpage);

            tpage = new TabPage();

            tpage.Text = "Identificator table";

            tab.TabPages.Add(tpage);

            tpage = new TabPage();

            tpage.Text = "Constant table";

            tab.TabPages.Add(tpage);

            tpage = new TabPage();

            tpage.Text = "String table";

            tab.TabPages.Add(tpage);

            //Add Lexem Table

            ListView List = new ListView();

            List.GridLines = true;

            List.Dock = DockStyle.Fill;

            List.View = View.Details;

            ColumnHeader tmp = new ColumnHeader();

            tmp.Text = "Text";

            tmp.Width = 120;

            List.Columns.Add(tmp);

            tmp = new ColumnHeader();

            tmp.Text = "Type";

            tmp.Width = 120;

            List.Columns.Add(tmp);

            tmp = new ColumnHeader();

            tmp.Text = "Value";

            tmp.Width = 120;

            List.Columns.Add(tmp);

            tmp = new ColumnHeader();

            tmp.Text = "Line";

            tmp.Width = 120;

            List.Columns.Add(tmp);

            for (int i = 0; i < LexTable.Count; i++)

            {

                List.Items.Add(LexTable[i].Text);

                List.Items[i].SubItems.Add(LexTable[i].Type.ToString());

                List.Items[i].SubItems.Add(LexTable[i].Value.ToString());

                List.Items[i].SubItems.Add(LexTable[i].Line.ToString());

            }

            tab.TabPages[0].Controls.Add(List);

            //Add ident table

            List = new ListView();

            List.GridLines = true;

            List.Dock = DockStyle.Fill;

            List.View = View.Details;

            tmp = new ColumnHeader();

            tmp.Text = "Name";

            tmp.Width = 120;

            List.Columns.Add(tmp);

            tmp = new ColumnHeader();

            tmp.Text = "Value";

            tmp.Width = 120;

            List.Columns.Add(tmp);

            tmp = new ColumnHeader();

            tmp.Text = "Is declared";

            tmp.Width = 120;

            List.Columns.Add(tmp);

            tmp = new ColumnHeader();

            tmp.Text = "Line";

            tmp.Width = 120;

            List.Columns.Add(tmp);

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

            {

                List.Items.Add(SyntaxAnaliz.IdentTable[i].Name);

                List.Items[i].SubItems.Add(SyntaxAnaliz.IdentTable[i].Value.ToString());

                List.Items[i].SubItems.Add(SyntaxAnaliz.IdentTable[i].IsDeclared.ToString());

                List.Items[i].SubItems.Add(SyntaxAnaliz.IdentTable[i].Line.ToString());

            }

            tab.TabPages[1].Controls.Add(List);

            //add const table

            List = new ListView();

            List.GridLines = true;

            List.Dock = DockStyle.Fill;

            List.View = View.Details;

            tmp = new ColumnHeader();

            tmp.Text = "Name";

            tmp.Width = 120;

            List.Columns.Add(tmp);

            tmp = new ColumnHeader();

            tmp.Text = "Value";

            tmp.Width = 120;

            List.Columns.Add(tmp);

            tmp = new ColumnHeader();

            tmp.Text = "Is declared";

            tmp.Width = 120;

            List.Columns.Add(tmp);

            tmp = new ColumnHeader();

            tmp.Text = "Line";

            tmp.Width = 120;

            List.Columns.Add(tmp);

            for (int i = 0; i < SyntaxAnaliz.ConstTable.Count; i++)

            {

                List.Items.Add(SyntaxAnaliz.ConstTable[i].Name);

                List.Items[i].SubItems.Add(SyntaxAnaliz.ConstTable[i].Value.ToString());

                List.Items[i].SubItems.Add(SyntaxAnaliz.ConstTable[i].IsDeclared.ToString());

                List.Items[i].SubItems.Add(SyntaxAnaliz.ConstTable[i].Line.ToString());

            }

            tab.TabPages[2].Controls.Add(List);

            //add string table

            List = new ListView();

            List.GridLines = true;

            List.Dock = DockStyle.Fill;

            List.View = View.Details;

            tmp = new ColumnHeader();

            tmp.Text = "Name";

            tmp.Width = 120;

            List.Columns.Add(tmp);

            tmp = new ColumnHeader();

            tmp.Text = "Value";

            tmp.Width = 120;

            List.Columns.Add(tmp);

            for (int i = 0; i < SyntaxAnaliz.StringTable.Count; i++)

            {

                List.Items.Add(SyntaxAnaliz.StringTable[i].Name);

                List.Items[i].SubItems.Add(SyntaxAnaliz.StringTable[i].Value);

            }

            tab.TabPages[3].Controls.Add(List);

            ShowTree.Controls.Add(tab);

            ShowTree.Show();

           

        }

 

        private void asm_mvi_Click(object sender, EventArgs e)

        {

            //Create form

            ShowTree = new Form();

            ShowTree.Size = new System.Drawing.Size(1150, 470);

            ShowTree.Text = "ASM code[Generated by K9(C)]";

            RichTextBox txt = new RichTextBox();

            txt.Dock = DockStyle.Fill;

            txt.ResetText();

            txt.AppendText(asmcode);

            ShowTree.Controls.Add(txt);

            ShowTree.Show();

        }

    }

    public struct Error

    {

        public string Text;

        public int Line;

    }

    public class Errors

    {

        public Errors()

        {

            Container = new Error[100];

            Count = 0;

        }

        public void Add(Error element)

        {

            if(Count < 100)

            Container[Count++] = element;

        }

        public Error[] GetErrors()

        {

            return Container;

        }

        public Error[] Container;

        public int Count;

    }

    public class Lexema

    {

        public Lexema()

        {

            Type = LexemType.Null;

            Line = 0;

            Text = "";

            Value = 0;

        }

        public LexemType Type;

        public int Line;

        public string Text;

        public int Value;

    }

    public class Identificator

    {

        public Identificator()

        {

            Line = 0;

            Name = "";

            Value = 0;

            IsDeclared = false;

        }

        public int Line;

        public string Name;

        public int Value;

        public bool IsDeclared;

    }

    public struct Strings

    {

        public string Name;

        public string Value;

    }

    public enum LexemType

    {

        Start,          //Start

        Finish,         //Finish

        Block,

        Ident,          //Identificator

        For,            //For

        DownTo,         //DownTo

        Do,             //Do

        Input,          //Input

        Output,         //Output

        If,             //If

        OpenBracket,    //(

        CloseBracket,   //)

        Cycle,

        Expression,

        CondStatement,

        IOStream,

        EOF,            //'$'

        Program,        //Program

        Var,            //Var

        Semicolon,      //;

        Equator,        //:=

        Coma,           //,

        Multiplication, //Mul

        Divide,         //Div

        Module,         //Mod

        Addition,       //+

        Substraction,   //-

        And,            //&&

        Or,             //||

        Not,            //!!

        NotEqual,       //!=

        Equal,          //==

        LesserOrEqual,  //Le

        GreaterOrEqual, //Ge

        Const,          //Number

        String,         //"Some Text"

        Block_Content,

        Equation,

        Null,

    }

    public class LexicalAnalizer

    {

        public LexicalAnalizer(string _source)

        {

            Source = _source + '$';

            SourcePointer = 0;

            Line = 0;

            LexErrors = new Errors();

        }

        public List<Lexema> CreateLexTable()

        {

            List<Lexema> LexTable = new List<Lexema>();

            Lexema lex = GetLexem();

            LexTable.Add(lex);

            while (lex.Type != LexemType.EOF)

            {

                LexTable.Add(lex = GetLexem());

            }

            return LexTable;

        }

        private Lexema GetLexem()

        {

            Lexema Lex = new Lexema();

            //Пересуваємось доки не знайдемо правильний початок лексеми

            while ((IsSeparator(Source[SourcePointer])) | (Source[SourcePointer] == '/'))

            {

                //Пропуск роздільників перед наступною лексемою або коментарем

               while (IsSeparator(Source[SourcePointer]))

                {

                    if (Source[SourcePointer] == '\n')

                    {

                        Line++;

                    }

                    SourcePointer++;

                }

                //Якщо кінець файлу

                if (Source[SourcePointer] == '$')

                {

                    Lex.Type = LexemType.EOF;

                    return Lex;

                }

                //Пропуск коментарів

                if (Source[SourcePointer] == '/')

                {

                    if (Source[SourcePointer + 1] != '$')

                    {

                        if (Source[SourcePointer + 1] == '*')

                        {

                            bool IsComentEnded = false;

                            if (Source[SourcePointer + 2] != '$')

                            {

                                SourcePointer += 2;

                                while (true)

                                {

                                    if (Source[SourcePointer] == '\n')

                                    {

                                        Line++;

                                    }

                                    if (Source[SourcePointer] == '*')

                                    {

                                        if (Source[SourcePointer + 1] != '$')

                                        {

                                            if (Source[SourcePointer + 1] == '/')

                                            {

                                                SourcePointer += 2;

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