public TokenResult NextToken() { char character = ' '; while (true) { if (character == '\n') { column = 1; line++; } filePosition++; character = filePosition >= _file.Length? ' ': _file[filePosition]; column++; // if (filePosition == _file.Length){ // return new TokenResult(true, "" , new Token(Tag.EOF, "EOF", line, column)); // } switch (state) { case 1: if (filePosition == _file.Length) { return(new TokenResult(true, "", new Token(Tag.EOF, "EOF", line, column))); } if (character == ' ' || character == '\t' || character == '\n' || character == '\r') { if (character == '\t') { } } else if (Char.IsLetter(character)) { lexema.Append(character); state = 14; } else if (Char.IsDigit(character)) { lexema.Append(character); state = 12; } else if (character == '<') { state = 6; } else if (character == '>') { state = 9; } else if (character == '=') { state = 2; } else if (character == '!') { state = 4; } else if (character == '/') { state = 16; } else if (character == '*') { state = 18; return(new TokenResult(true, "", new Token(Tag.OP_MUL, "*", line, column))); } else if (character == '+') { state = 19; return(new TokenResult(true, "", new Token(Tag.OP_AD, "+", line, column))); } else if (character == '{') { state = 30; return(new TokenResult(true, "", new Token(Tag.SMB_OBC, "{", line, column))); } else if (character == '}') { state = 31; return(new TokenResult(true, "", new Token(Tag.SMB_CBC, "}", line, column))); } else if (character == '-') { state = 20; return(new TokenResult(true, "", new Token(Tag.OP_MIN, "-", line, column))); } else if (character == ';') { state = 21; return(new TokenResult(true, "", new Token(Tag.SMB_SEM, ";", line, column))); } else if (character == ',') { state = 32; return(new TokenResult(true, "", new Token(Tag.SMB_COM, ",", line, column))); } else if (character == '(') { state = 22; return(new TokenResult(true, "", new Token(Tag.SMB_OPA, "(", line, column))); } else if (character == ')') { state = 23; return(new TokenResult(true, "", new Token(Tag.SMB_CPA, ")", line, column))); } else if (character == '\'') { state = 24; } else if (character == '"') { state = 28; } else { var errorMessage = string.Concat("ERRO => Caractere invalido '", character.ToString(), "' na linha ", line, " e coluna ", column); return(new TokenResult(false, errorMessage, null)); } break; case 2: if (character == '=') { // state 3 state = 3; return(new TokenResult(true, "", new Token(Tag.OP_EQ, "==", line, column))); } else { ReturnColumn(); //retornaPonteiro(); return(new TokenResult(true, "", new Token(Tag.OP_ASS, "=", line, column))); } case 4: if (character == '=') { // state 5 state = 5; return(new TokenResult(true, "", new Token(Tag.OP_NE, "!=", line, column))); } else { // ReturnColumn(); ReturnColumn(); state = 1; var errorMessage = string.Concat("ERRO => Token incompleto para o caractere ! na linha ", line, " e coluna ", column); return(new TokenResult(false, errorMessage, null)); // sinalizaErro("Token incompleto para o caractere ! na linha " + line + " e coluna " + column); } case 6: if (character == '=') { // state 7 state = 7; return(new TokenResult(true, "", new Token(Tag.OP_LE, "<=", line, column))); } else { // state 8 state = 8; ReturnColumn(); //retornaPonteiro(); return(new TokenResult(true, "", new Token(Tag.OP_LT, "<", line, column))); } case 9: if (character == '=') { // state 10 state = 10; return(new TokenResult(true, "", new Token(Tag.OP_GE, ">=", line, column))); } else { // state 11 state = 11; ReturnColumn(); // retornaPonteiro(); return(new TokenResult(true, "", new Token(Tag.OP_GT, ">", line, column))); } case 12: if (Char.IsDigit(character)) { lexema.Append(character); // Permanece no state 12 } else if (character == '.') { lexema.Append(character); state = 26; } else { // state 13 state = 13; ReturnColumn(); // retornaPonteiro(); return(new TokenResult(true, "", new Token(Tag.CON_NUM, lexema.ToString(), line, column))); } break; case 29: if (Char.IsLetterOrDigit(character)) { state = 14; //ReturnColumn(); // Permanece no state 14 } else if (character != ' ' && character != '\n') { state = 1; ReturnColumn(); } break; case 14: var tags = Enum.GetValues(typeof(Tag)); var tagsList = new List <string>(); foreach (var item in tags) { var description = EnumModel.GetEnumDescription((Tag)item); if (!string.IsNullOrEmpty(description)) { tagsList.Add(EnumModel.GetEnumDescription((Tag)item)); } } if (Char.IsLetterOrDigit(character)) { lexema.Append(character); //state = 29; // Permanece no state 14 } else if (!Char.IsLetterOrDigit(character) && !tagsList.Contains(character.ToString()) && character != ' ' && character != '\n') { //state = 1; //ReturnColumn(); //state = 29; // Permanece no state 14 var errorMessage = string.Concat("ERRO => Caractere invalido '", character.ToString(), "' na linha ", line, " e coluna ", column); return(new TokenResult(false, errorMessage, null)); } // else if(!Char.IsLetterOrDigit(character) && character != ' ' && character != '\n'){ // var errorMessage = string.Concat("ERRO => Caractere invalido '", character.ToString() , "' na linha " , line , " e coluna " , column); // return new TokenResult(false, errorMessage , null); // } else { // state 15 state = 15; ReturnColumn(); //retornaPonteiro(); var token = _tsService.SymbolstTable().FirstOrDefault(a => a.Lexeme.ToUpper() == lexema.ToString()?.ToUpper()); if (token == null) { return(new TokenResult(true, "", new Token(Tag.ID, lexema.ToString(), line, column))); } else { return(new TokenResult(true, "", new Token(token.Tag, token.Lexeme.ToString(), line, column))); } } break; case 16: if (character == '/') { state = 19; } else if (character == '*') { state = 17; } else { ReturnColumn(); //retornaPonteiro(); return(new TokenResult(true, "", new Token(Tag.OP_DIV, "/", line, column))); } break; case 17: if (character == '*') { state = 18; } else if (filePosition == _file.Length) { state = 1; ReturnColumn(); var errorMessage = "ERRO => O comentário deve terminar com “*/”"; return(new TokenResult(false, errorMessage, null)); } // Se vier outro, permanece no state 17 break; case 18: if (character == '/') { state = 1; } else if (filePosition == _file.Length) { state = 1; ReturnColumn(); var errorMessage = "ERRO => O comentário deve terminar com “*/”"; return(new TokenResult(false, errorMessage, null)); } else { state = 17; } break; case 19: if (character == '\n') { state = 1; } break; case 24: if (character == '\'') { state = 25; return(new TokenResult(true, "", new Token(Tag.CON_CHAR, lexema.ToString(), line, column))); } else if (filePosition == _file.Length) { state = 1; ReturnColumn(); var errorMessage = "ERRO => String deve ser fechada com => \' antes do fim de arquivo"; return(new TokenResult(false, errorMessage, null)); //sinalizaErro("String deve ser fechada com \" antes do fim de arquivo"); } else { // Se vier outro, permanece no state 24 lexema.Append(character); } break; case 26: if (Char.IsDigit(character)) { lexema.Append(character); state = 27; } else if (filePosition == _file.Length) { state = 1; ReturnColumn(); } else if (character == '\n' || character == ' ') { } else { var errorMessage = string.Concat("ERRO => Padrao para número invalido: \"", character.ToString(), "\" na linha ", line, " coluna ", column); return(new TokenResult(false, errorMessage, null)); //sinalizaErro("Padrao para double invalido na linha " + line + " coluna " + column); } break; case 27: if (Char.IsDigit(character)) { lexema.Append(character); } else if (filePosition == _file.Length) { state = 1; ReturnColumn(); } else { ReturnColumn(); // retornaPonteiro(); return(new TokenResult(true, "", new Token(Tag.CON_NUM, lexema.ToString(), line, column))); } break; case 28: if (character == '"') { state = 25; return(new TokenResult(true, "", new Token(Tag.LIT, lexema.ToString(), line, column))); } else if (filePosition == _file.Length) { state = 1; ReturnColumn(); var errorMessage = "ERRO => String deve ser fechada com => \" antes do fim de arquivo"; return(new TokenResult(false, errorMessage, null)); //sinalizaErro("String deve ser fechada com \" antes do fim de arquivo"); } else { // Se vier outro, permanece no state 22 lexema.Append(character); } break; } } }