public string TraformCifra(Lexico.Table_simbols a) { if (a.token != Lexico.Token.CIFRAO) { return(a.token.ToString()); } else { return("$"); } }
public void Semantico(int indexEstate) { switch (indexEstate) { case 1: break; case 2: break; case 3: break; case 4: break; case 5: saidaArquivo.Add("\n\n"); break; case 6: manipulador = ListaParaManipularAtributo[2]; manipulador.tipo = ListaParaManipularAtributo[1].tipo; pilhaDeSimbolos.Push(manipulador); saidaArquivo.Add(Changetype(ListaParaManipularAtributo[1].tipo) + " " + ListaParaManipularAtributo[2].lexema + " ;"); int i = 0; foreach (var element in Lexico.Tables_lexema) { if (element.lexema == manipulador.lexema) { manipulador = Lexico.Tables_lexema[i]; manipulador.tipo = ListaParaManipularAtributo[1].tipo; Lexico.Tables_lexema[i] = manipulador; break; } i++; } break; case 7: manipulador = pilhaDeSimbolos.Pop(); manipulador.tipo = "inteiro"; pilhaDeSimbolos.Push(manipulador); break; case 8: manipulador = pilhaDeSimbolos.Pop(); manipulador.tipo = "real"; pilhaDeSimbolos.Push(manipulador); break; case 9: manipulador = pilhaDeSimbolos.Pop(); manipulador.tipo = "literal"; pilhaDeSimbolos.Push(manipulador); break; case 10: break; case 11: // if (ListaParaManipularAtributo[1].tipo != "") { if (ListaParaManipularAtributo[1].tipo == "literal") { saidaArquivo.Add("scanf(\"%s\"," + ListaParaManipularAtributo[1].lexema + ");"); } if (ListaParaManipularAtributo[1].tipo == "inteiro") { saidaArquivo.Add("scanf(\"%d\", &" + ListaParaManipularAtributo[1].lexema + ");"); } if (ListaParaManipularAtributo[1].tipo == "real") { saidaArquivo.Add("scanf(\"%lf\", &" + ListaParaManipularAtributo[1].lexema + ");"); } } else { Console.Write("ERRO: VARIAVEL NAO DECLARA."); erroSemantico = true; } break; case 12: //verifico se o elemento do scanF é um ID if (Lexico.Tables_lexema.Contains(ListaParaManipularAtributo[1])) { saidaArquivo.Add("printf(" + ListaParaManipularAtributo[1].lexema + ");"); } else { String sup = ListaParaManipularAtributo[1].tipo; if (sup == "inteiro") { sup = "\"%d\","; } else if (sup == "real") { sup = "\"%lf\","; } else if (sup == "literal") { sup = "\"%s\","; } saidaArquivo.Add("printf(" + sup + ListaParaManipularAtributo[1].lexema + ");"); } break; case 13: manipulador = pilhaDeSimbolos.Pop(); manipulador.tipo = "literal"; manipulador.lexema = ListaParaManipularAtributo[0].lexema; manipulador.atributo = ListaParaManipularAtributo[0].lexema; pilhaDeSimbolos.Push(manipulador); break; case 14: manipulador = pilhaDeSimbolos.Pop(); manipulador.tipo = ListaParaManipularAtributo[0].tipo; manipulador.lexema = ListaParaManipularAtributo[0].lexema; manipulador.atributo = ListaParaManipularAtributo[0].lexema; pilhaDeSimbolos.Push(manipulador); break; case 15: if (ListaParaManipularAtributo[0].tipo != "") { manipulador = pilhaDeSimbolos.Pop(); manipulador.tipo = ListaParaManipularAtributo[0].tipo; manipulador.lexema = ListaParaManipularAtributo[0].lexema; manipulador.atributo = ListaParaManipularAtributo[0].lexema; pilhaDeSimbolos.Push(manipulador); } else { Console.Write("ERRO: VARIAVEL NAO DECLARA."); erroSemantico = true; } break; case 16: break; case 17: if (ListaParaManipularAtributo[3].tipo != "") { if (ListaParaManipularAtributo[3].tipo == ListaParaManipularAtributo[1].tipo) { saidaArquivo.Add(ListaParaManipularAtributo[3].lexema + " " + ListaParaManipularAtributo[2].tipo + " " + ListaParaManipularAtributo[1].lexema + ";"); } else { Console.Write("Erro: Tipos diferentes para atribuição"); erroSemantico = true; } } else { Console.Write("Erro: Variável não declarada"); erroSemantico = true; } break; case 18: if ((ListaParaManipularAtributo[2].tipo != "literal") && (ListaParaManipularAtributo[0].tipo == ListaParaManipularAtributo[2].tipo)) { saidaArquivo.Add("T" + indexVariavelTemporaria.ToString() + " = " + ListaParaManipularAtributo[2].lexema + " " + ListaParaManipularAtributo[1].tipo + " " + ListaParaManipularAtributo[0].lexema + ";"); saidaArquivo.Insert(indexVariavelTemporaria, Changetype(ListaParaManipularAtributo[2].tipo) + " T" + indexVariavelTemporaria.ToString() + ";"); manipulador = pilhaDeSimbolos.Pop(); //manipulador.lexema = ListaParaManipularAtributo[2].lexema + " " + ListaParaManipularAtributo[1].tipo + " " + ListaParaManipularAtributo[0].lexema; manipulador.lexema = "T" + indexVariavelTemporaria.ToString(); manipulador.tipo = ListaParaManipularAtributo[2].tipo; pilhaDeSimbolos.Push(manipulador); indexVariavelTemporaria++; } else { Console.Write("Erro: Operandos com tipos incompatíveis"); erroSemantico = true; } break; case 19: manipulador = pilhaDeSimbolos.Pop(); manipulador.tipo = ListaParaManipularAtributo[0].tipo; manipulador.lexema = ListaParaManipularAtributo[0].lexema; manipulador.atributo = ListaParaManipularAtributo[0].lexema; pilhaDeSimbolos.Push(manipulador); break; case 20: if (ListaParaManipularAtributo[0].tipo != "") { manipulador = pilhaDeSimbolos.Pop(); manipulador.tipo = ListaParaManipularAtributo[0].tipo; manipulador.lexema = ListaParaManipularAtributo[0].lexema; manipulador.atributo = ListaParaManipularAtributo[0].lexema; pilhaDeSimbolos.Push(manipulador); } else { Console.Write("ERRO: VARIAVEL NAO DECLARA"); erroSemantico = true; } break; case 21: manipulador = pilhaDeSimbolos.Pop(); manipulador.tipo = ListaParaManipularAtributo[0].tipo; manipulador.lexema = ListaParaManipularAtributo[0].lexema; manipulador.atributo = ListaParaManipularAtributo[0].lexema; pilhaDeSimbolos.Push(manipulador); break; case 22: break; case 23: saidaArquivo.Add("}"); break; case 24: saidaArquivo.Add("if(" + ListaParaManipularAtributo[2].lexema + "){"); break; case 25: if (ListaParaManipularAtributo[0].tipo == ListaParaManipularAtributo[2].tipo) { saidaArquivo.Add("T" + indexVariavelTemporaria.ToString() + " = " + ListaParaManipularAtributo[2].lexema + " " + ListaParaManipularAtributo[1].tipo + " " + ListaParaManipularAtributo[0].lexema + ";"); saidaArquivo.Insert(indexVariavelTemporaria, Changetype(ListaParaManipularAtributo[2].tipo) + " T" + indexVariavelTemporaria.ToString() + ";"); manipulador = pilhaDeSimbolos.Pop(); //manipulador.lexema = ListaParaManipularAtributo[2].lexema + " " + ListaParaManipularAtributo[1].tipo + " " + ListaParaManipularAtributo[0].lexema; manipulador.lexema = "T" + indexVariavelTemporaria.ToString(); manipulador.tipo = ListaParaManipularAtributo[2].tipo; pilhaDeSimbolos.Push(manipulador); indexVariavelTemporaria++; } else { Console.Write("Erro: Operandos com tipos incompatíveis"); erroSemantico = true; } break; default: break; } }