コード例 #1
0
ファイル: Parser.cs プロジェクト: RepNazar/Univer
        private static int ParseKeyWords(string line, int position)
        {
            int    i = position;
            string Key_Word;

            while (
                (line[i] >= 'A' && line[i] <= 'Z') ||
                (line[i] >= 'a' && line[i] <= 'z') ||
                line[i] == '1' ||
                line[i] == '6' ||
                line[i] == '_' ||
                line[i] == '<' ||
                line[i] == '>' ||
                line[i] == '=' ||
                line[i] == '!' ||
                line[i] == '&' ||
                line[i] == '|'
                )
            {
                i++;
            }
            Key_Word = line.Remove(0, position);
            Key_Word = Key_Word.Remove(i - position);
            string[] KeyWords = { "STARTPROGRAM", "STARTBLOK", "ENDBLOK", "VARIABLE", "INPUT", "<<", ">>", "!!", "&&", "||", "OUTPUT", "WHILE", "Goto", "=", "!=", "DIV", "MOD", "BOOLEAN", "INT16", "TRUE", "FALSE", "Else" };
            foreach (string st in KeyWords)
            {
                if (st.Equals(Key_Word))
                {
                    lexem    = new Lexem();
                    lexem.Id = num;
                    num++;
                    lexem.Lex      = Key_Word;
                    lexem.Type     = 0;
                    lexem.Comments = "Ключове слово";
                    switch (Key_Word)
                    {
                    case "STARTPROGRAM":
                        lexem.TypeKeyword = 0;
                        break;

                    case "VARIABLE":
                        lexem.TypeKeyword = 1;
                        break;

                    case "STARTBLOK":
                        isStart           = true;
                        lexem.TypeKeyword = 2;
                        break;

                    case "ENDBLOK":
                        lexem.TypeKeyword = 3;
                        break;

                    case "INT16":
                        lexem.TypeKeyword = 4;
                        break;

                    case "BOOLEAN":
                        lexem.TypeKeyword = 5;
                        break;

                    case "INPUT":
                        lexem.TypeKeyword = 6;
                        break;

                    case "OUTPUT":
                        lexem.TypeKeyword = 7;
                        break;

                    case "DIV":
                        lexem.TypeKeyword = 15;
                        break;

                    case "MOD":
                        lexem.TypeKeyword = 16;
                        break;

                    case "TRUE":
                        lexem.TypeKeyword = 10;
                        break;

                    case "FALSE":
                        lexem.TypeKeyword = 11;
                        break;

                    case "WHILE":
                        lexem.TypeKeyword = 12;
                        break;

                    case "ELSE":
                        lexem.TypeKeyword = 13;
                        break;

                    case "Goto":
                        lexem.TypeKeyword = 19;
                        break;

                    case "<<":
                        lexem.TypeKeyword = 17;
                        break;

                    case ">>":
                        lexem.TypeKeyword = 18;
                        break;

                    case "=":
                        lexem.Type = 5;
                        break;

                    case "!=":
                        lexem.Type = 9;
                        break;

                    case "!!":
                        lexem.Type = 6;
                        break;

                    case "&&":
                        lexem.Type = 7;
                        break;

                    case "||":
                        lexem.Type = 8;
                        break;
                    }
                    lexems.Add(lexem);
                    return(i);
                }
            }
            lexem    = new Lexem();
            lexem.Id = num;
            num++;
            lexem.Lex      = Key_Word;
            lexem.Type     = -1;
            lexem.Comments = "Нерозпізнана лексема";
            lexems.Add(lexem);
            return(i);
        }
コード例 #2
0
ファイル: Parser.cs プロジェクト: RepNazar/Univer
        public static void Parse(string line)
        {
            line = line + '\n';
            for (int i = 0; i < line.Length; i++)
            {
                if (line.Length == 1)
                {
                    continue;
                }
                if (isComment)
                {
                    i = ParseComments(line, i) - 1;
                }

                if ((line[i] >= 'A' && line[i] <= 'Z') ||
                    line[i] == '<' ||
                    line[i] == '>' ||
                    line[i] == '=' ||
                    line[i] == '!' ||
                    line[i] == '&' ||
                    line[i] == '|')
                {
                    i = ParseKeyWords(line, i) - 1;
                    continue;
                }
                if (line[i] == '_')
                {
                    i = ParseIdent(line, i) - 1;
                    continue;
                }

                if ((line[i] >= '0' && line[i] <= '9') || (line[i] == '-' && line[i + 1] >= '0' && line[i + 1] <= '9'))
                {
                    i = ParseNum(line, i) - 1;
                    continue;
                }
                switch (line[i])
                {
                case ':':
                    if (line[i + 1] == ':' && line[i + 2] == '=')
                    {
                        lexem    = new Lexem();
                        lexem.Id = num;
                        num++;
                        lexem.Lex      = "::=";
                        lexem.Type     = 10;
                        lexem.Comments = "Оператор присвоєння";
                        lexems.Add(lexem);
                        i = i + 2;
                    }
                    else
                    {
                        lexem    = new Lexem();
                        lexem.Id = num;
                        num++;
                        lexem.Lex      = ":";
                        lexem.Type     = -1;
                        lexem.Comments = "Нерозпізнана лексема";
                        lexems.Add(lexem);
                    }
                    break;

                case '+':
                    lexem    = new Lexem();
                    lexem.Id = num;
                    num++;
                    lexem.Lex         = "+";
                    lexem.Type        = 0;
                    lexem.TypeKeyword = 8;
                    lexem.Comments    = "Арифметичний оператор";
                    lexems.Add(lexem);
                    i++;
                    break;

                case '-':
                    lexem    = new Lexem();
                    lexem.Id = num;
                    num++;
                    lexem.Lex         = "-";
                    lexem.Type        = 0;
                    lexem.TypeKeyword = 9;
                    lexem.Comments    = "Арифметичний оператор";
                    lexems.Add(lexem);
                    i++;
                    break;

                case '*':
                    lexem    = new Lexem();
                    lexem.Id = num;
                    num++;
                    lexem.Lex         = "*";
                    lexem.Type        = 0;
                    lexem.TypeKeyword = 14;
                    lexem.Comments    = "Арифметичний оператор";
                    lexems.Add(lexem);
                    i++;
                    break;

                case '/':
                    i = ParseComments(line, i) - 1;
                    break;



                case '\"':
                    i = ParseString(line, i) - 1;
                    break;

                case ';':
                    lexem    = new Lexem();
                    lexem.Id = num;
                    num++;
                    lexem.Lex      = ";";
                    lexem.Type     = 11;
                    lexem.Comments = "Розділювач";
                    lexems.Add(lexem);
                    break;

                case ',':
                    lexem    = new Lexem();
                    lexem.Id = num;
                    num++;
                    lexem.Lex      = ",";
                    lexem.Type     = 12;
                    lexem.Comments = "Розділювач";
                    lexems.Add(lexem);
                    break;

                case ')':
                    lexem    = new Lexem();
                    lexem.Id = num;
                    num++;
                    lexem.Lex      = ")";
                    lexem.Type     = 13;
                    lexem.Comments = "Розділювач";
                    lexems.Add(lexem);
                    break;

                case '(':
                    lexem    = new Lexem();
                    lexem.Id = num;
                    num++;
                    lexem.Lex      = "(";
                    lexem.Type     = 14;
                    lexem.Comments = "Розділювач";
                    lexems.Add(lexem);
                    break;

                case ' ':
                    break;

                case '\t':
                    break;

                case '\n':
                    lines.Add(num);
                    break;

                default:
                    i = ParseNoLex(line, i) - 1;
                    break;
                }
            }
        }
コード例 #3
0
ファイル: Lexical analysis.cs プロジェクト: RepNazar/Univer
        private void Lexical_analysis_Load(object sender, EventArgs e)
        {
            listView1.Items.Clear();
            listView1.GridLines = true;
            listView1.Columns.Add("Номер", 60);
            listView1.Columns.Add("Лексема", 100);
            listView1.Columns.Add("Коментар", 200);
            listView1.Columns.Add("Клас", 100);
            foreach (Lexem lexem in Parser.lexems)
            {
                ListViewItem lwi = new ListViewItem(new [] { lexem.Id.ToString(), lexem.Lex, lexem.Comments, lexem.Type.ToString() });
                listView1.Items.Add(lwi);
            }
            listView2.Items.Clear();
            listView2.GridLines = true;
            listView2.Columns.Add("Номер", 60);
            listView2.Columns.Add("Ідентифікатор", 200);
            listView2.Columns.Add("Тип", 200);
            listView2.Columns.Add("Значення", 200);
            Iden_info id;
            int       i    = 0;
            int       line = 0;

            foreach (DictionaryEntry de in Parser.identy)
            {
                id = (Iden_info)de.Value;
                ListViewItem lwi = new ListViewItem(new[] { i.ToString(), id.Id, id.Type, id.Value });
                listView2.Items.Add(lwi);
                i++;
            }
            listView3.Items.Clear();
            listView3.GridLines = true;
            listView3.Columns.Add("Номер", 60);
            listView3.Columns.Add("Рядкова константа", 400);
            listView3.Columns.Add("Номер лексеми", 200);
            i = 0;
            Const_Strings str_1;

            foreach (DictionaryEntry str in Parser.const_str)
            {
                str_1 = (Const_Strings)str.Value;
                ListViewItem lwi = new ListViewItem(new[] { i.ToString(), str_1.Value, str_1.Number.ToString() });
                listView3.Items.Add(lwi);
                i++;
            }
            listView4.Items.Clear();
            listView4.GridLines = true;
            listView4.Columns.Add("Номер", 60);
            listView4.Columns.Add("Лексема", 200);
            listView4.Columns.Add("Коментар", 400);
            listView4.Columns.Add("Номер рядока", 200);
            i = 0;
            foreach (State st in Syntactic.errors)
            {
                Lexem lex = (Lexem)Parser.lexems[st.Num_Lex];
                if (st.Num_Lex < (int)Parser.lines[0])
                {
                    line = 1;
                }
                else
                {
                    for (int j = 1; j < Parser.lines.Count; j++)
                    {
                        if (st.Num_Lex > (int)Parser.lines[j - 1] && st.Num_Lex <= (int)Parser.lines[j])
                        {
                            line = j + 1;
                        }
                    }
                }
                ListViewItem lwi = new ListViewItem(new[] { i.ToString(), lex.Lex, st.Error_Text, line.ToString() });
                listView4.Items.Add(lwi);
                i++;
            }
            if (Syntactic.errors.Count == 0)
            {
                richTextBox1.Text = Generation.Code;
            }
        }