public Automato(FileIterator iteradorArquivo) { this.iteradorArquivo = iteradorArquivo; this.tabelaSimbolos = new Dictionary <StateValueObject, dynamic>(); s0 = new StateValueObject(false, 0); s0.addTransition(' ', s0); s0.addTransition('\t', s0); s0.addTransition('\n', s0); s0.addTransition('\r', s0); if (!File.Exists("Arquivos/Dicionario_lexemas.txt")) { throw new FileNotFoundException("Arquivo específicado não encontrado"); } var lines = File.ReadLines("Arquivos/Dicionario_lexemas.txt"); foreach (var item in lines) { var split = item.Split("|&!"); tabelaSimbolos.criarTransicaoPalavra(s0, split[0], split[1]); } tabelaSimbolos.criarTransicaoNumerica(s0); }
private static StateValueObject criarEstadoTransicaoUnica(int identificador, StateValueObject estadoAnterior, char caracterTransicao, bool marcado) { StateValueObject s = new StateValueObject(marcado, identificador); if (!estadoAnterior.existsTransition(caracterTransicao)) { estadoAnterior.addTransition(caracterTransicao, s); } else { return(estadoAnterior.getTransition(caracterTransicao)); } return(s); }
public TokenLexeme recuperarProximoTokenLexema() { TokenLexeme tokenLexema; string lexema = ""; StateValueObject estadoAtual = s0; char c = ' '; bool podeSerNumerico = false, eNumerico = false, podeSerString = false, eString = false; while ( //Enquanto for token (eNumerico && (c = iteradorArquivo.nextChar()) != '¨' && !IsSpace(c)) || //Enquanto for lexema (estadoAtual != null && !estadoAtual.isChecked() && (c = iteradorArquivo.nextChar()) != '¨') || //Enquanto for string (eString && estadoAtual is null && (c = iteradorArquivo.nextChar()) != '¨' && !IsSpace(c)) || //Palavra completa que não é string, nem lexema nem inteiro (eNumerico is false && eString is false && estadoAtual is null && (c = iteradorArquivo.nextChar()) != '¨' && !IsSpace(c)) ) { // Validação se o primeiro caracter é uma letra minuscula if ((int)c > 96 && (int)c < 123 && s0.Equals(estadoAtual)) { eString = true; } try { if (!eNumerico) { estadoAtual = estadoAtual.getNextState(c); } } catch (Exception x) { //ignored } if (eString is false && estadoAtual == null && char.IsNumber(c)) { eNumerico = true; }
public static void criarTransicaoPalavra(this Dictionary <StateValueObject, dynamic> tabelaSimbolos, StateValueObject s0, string lexema, string token) { StateValueObject last = s0; if (lexema.Length == 1) { last = criarEstadoTransicaoUnica(1, last, lexema[0], false); } else { for (int i = 0; i <= lexema.Length - 1; i++) { last = criarEstadoTransicaoUnica((i + 1), last, lexema[i], false); } } StateValueObject estadoFinal = new StateValueObject(true, lexema.Length); last.addTransition(' ', estadoFinal); last.addTransition('\t', estadoFinal); last.addTransition('\r', estadoFinal); tabelaSimbolos.Add(estadoFinal, token.ToUpper()); }
public static void criarTransicaoNumerica(this Dictionary <StateValueObject, dynamic> tabelaSimbolos, StateValueObject s0) { for (int i = 0; i <= 9; i++) { criarEstadoTransicaoUnica((i + 1), s0, (char)i, false); } }