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); }
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; } } }
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; } }