Ejemplo n.º 1
0
 public string TraformCifra(Lexico.Table_simbols a)
 {
     if (a.token != Lexico.Token.CIFRAO)
     {
         return(a.token.ToString());
     }
     else
     {
         return("$");
     }
 }
Ejemplo n.º 2
0
        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;
            }
        }