public LexicalAnalyzer() { TableToken.ClearTable(); TableSymbol.ClearTable(); TableSymbol.AddSymbol(new Symbol { Id = 1, Name = "algoritmo" }); TableSymbol.AddSymbol(new Symbol { Id = 2, Name = "var" }); TableSymbol.AddSymbol(new Symbol { Id = 3, Name = "inicio" }); TableSymbol.AddSymbol(new Symbol { Id = 4, Name = "fimalgoritmo" }); TableSymbol.AddSymbol(new Symbol { Id = 5, Name = "inteiro" }); TableSymbol.AddSymbol(new Symbol { Id = 6, Name = "real" }); TableSymbol.AddSymbol(new Symbol { Id = 7, Name = "caractere" }); TableSymbol.AddSymbol(new Symbol { Id = 8, Name = "logico" }); TableSymbol.AddSymbol(new Symbol { Id = 9, Name = "vetor" }); TableSymbol.AddSymbol(new Symbol { Id = 10, Name = "escreval" }); TableSymbol.AddSymbol(new Symbol { Id = 11, Name = "leia" }); TableSymbol.AddSymbol(new Symbol { Id = 12, Name = "para" }); TableSymbol.AddSymbol(new Symbol { Id = 13, Name = "de" }); TableSymbol.AddSymbol(new Symbol { Id = 14, Name = "ate" }); TableSymbol.AddSymbol(new Symbol { Id = 15, Name = "faca" }); TableSymbol.AddSymbol(new Symbol { Id = 16, Name = "fimpara" }); TableSymbol.AddSymbol(new Symbol { Id = 17, Name = "se" }); TableSymbol.AddSymbol(new Symbol { Id = 18, Name = "senao" }); TableSymbol.AddSymbol(new Symbol { Id = 19, Name = "fimse" }); TableSymbol.AddSymbol(new Symbol { Id = 19, Name = "entao" }); }
public void AnalyzeCode(string code) { code = code.ToLower(); StringBuilder str = new StringBuilder(); int estate = 0; Symbol symbol; bool literal = false; for (int i = 0; i < code.Length; i++) { while (estate != -1) { if (i >= code.Length) { break; } if (char.IsDigit(code[i])) { estate = TransitionTable[estate, GetKeywordColumn('d')]; } else if (char.IsLetter(code[i])) { estate = TransitionTable[estate, GetKeywordColumn('l')]; } else if (char.IsWhiteSpace(code[i]) && literal == false) { break; } else if (!char.IsLetterOrDigit(code[i])) { if (!char.IsWhiteSpace(code[i])) { estate = TransitionTable[estate, GetKeywordColumn(code[i])]; if (code[i] == '\"') { if (literal == false) { literal = true; } else { literal = false; } } } if (literal == false && code[i] != '\"') { break; } } if (estate == -1) { break; } str.Append(code[i]); i++; } double num; if (!string.IsNullOrWhiteSpace(str.ToString())) { symbol = new Symbol() { Id = TableSymbol.Table.Count + 1, Name = str.ToString() }; if (!TableSymbol.ContainsSymbol(symbol)) { TableSymbol.AddSymbol(symbol); } if (reservedWords.Contains(symbol.Name)) { TableToken.AddToken(new Token() { Id = TableSymbol.GetSymbolId(symbol), Name = symbol.Name, Type = TypeToken.PALAVRA_RESERVADA }); } else if (separators.Contains(symbol.Name)) { TableToken.AddToken(new Token() { Id = TableSymbol.GetSymbolId(symbol), Name = symbol.Name, Type = TypeToken.SEPARADOR }); } else if (operators.Contains(symbol.Name)) { TableToken.AddToken(new Token() { Id = TableSymbol.GetSymbolId(symbol), Name = symbol.Name, Type = TypeToken.OPERADOR }); } else if (symbol.Name.StartsWith("\\")) { TableToken.AddToken(new Token() { Id = TableSymbol.GetSymbolId(symbol), Name = symbol.Name, Type = TypeToken.COMENTARIO }); } else if (symbol.Name.StartsWith("\"") && symbol.Name.EndsWith("\"")) { TableToken.AddToken(new Token() { Id = TableSymbol.GetSymbolId(symbol), Name = symbol.Name, Type = TypeToken.LITERAL }); } else if (double.TryParse(symbol.Name, out num)) { TableToken.AddToken(new Token() { Id = TableSymbol.GetSymbolId(symbol), Name = symbol.Name, Type = TypeToken.NUMERO }); } else { TableToken.AddToken(new Token() { Id = TableSymbol.GetSymbolId(symbol), Name = symbol.Name, Type = TypeToken.IDENTIFICADOR }); } } str = new StringBuilder(); estate = 0; } }