コード例 #1
0
        private static void Lista_arg(Simbolo pEsq)
        {
            var parametros = TabelaDeSimbolos.BuscaParametros(pEsq);

            if (Lexico.NextTokenIs('('))
            {
                CurrentToken = Lexico.NextToken();
                Argumentos();

                if (parametros.Count() != FilaSimbolos.Count())
                {
                    pEsq.SetMsgErro(MsgErrosSemanticos.PARAMETROS_INCORRETOS, parametros.Count(), FilaSimbolos.Count());
                    Error(pEsq);
                }
                while (FilaSimbolos.Any())
                {
                    var sim   = FilaSimbolos.Dequeue();
                    var param = parametros.Dequeue();
                    if (sim.Tipo != param.Tipo)
                    {
                        pEsq.SetMsgErro(MsgErrosSemanticos.PARAMETRO_ERRADO, sim, param);
                        Error(pEsq);
                    }
                    MaqHip.C.Add("PARAM " + sim.EnderecoRelativo);
                }
                CurrentTokenIs(')');
            }
            if (parametros.Count() != 0)
            {
                pEsq.SetMsgErro(MsgErrosSemanticos.PARAMETROS_INCORRETOS, parametros.Count(), 0);
                Error(pEsq);
            }
        }
コード例 #2
0
 private static void Dc_p()
 {
     if (CurrentTokenIs("procedure"))
     {
         Categoria = "procedure";
         if (CurrentTokenIs(Tag.IDENTIFICADOR))
         {
             var i = MaqHip.C.Count();
             MaqHip.C.Add("DSVI");
             var simbolo   = new Simbolo(CurrentToken, Escopo, Categoria, null, EnderecoRelativo++, i + 1);
             var adicionou = TabelaDeSimbolos.Insere(simbolo) == null;
             if (!adicionou)
             {
                 simbolo.SetMsgErro(MsgErrosSemanticos.JA_DECLARADO);
                 Error(simbolo);
             }
             Escopo = simbolo.Cadeia;
             Parametros();
             Corpo_p();
             var j = TabelaDeSimbolos.CountParametros(simbolo) + TabelaDeSimbolos.CountVariaveis(simbolo);
             MaqHip.C.Add("DESM " + j);
             MaqHip.C.Add("RTPR");
             MaqHip.C[i] = "DSVI " + MaqHip.C.Count();
         }
     }
 }
コード例 #3
0
 private static Simbolo Fator(Simbolo pEsq)
 {
     CurrentToken = Lexico.NextToken();
     if (CurrentToken.Equals('('))
     {
         Expressao(pEsq);
         CurrentTokenIs(')');
     }
     else if (CurrentToken.Tag == Tag.IDENTIFICADOR)
     {
         var simbolo = TabelaDeSimbolos.Busca(CurrentToken.Lexema, Escopo);
         if (simbolo == null)
         {
             Error(new Simbolo(CurrentToken, MsgErrosSemanticos.NAO_DECLARADO));
         }
         if (simbolo.Categoria == "procedure")
         {
             Error(new Simbolo(CurrentToken, MsgErrosSemanticos.NAO_DECLARADO));
         }
         simbolo.Token.Linha = CurrentToken.Linha;
         if (pEsq != null)
         {
             if (simbolo.Tipo != pEsq.Tipo)
             {
                 pEsq.SetMsgErro(MsgErrosSemanticos.ATRIBUICAO_ERRADA, simbolo);
                 Error(pEsq);
             }
             pEsq.Token.Linha = CurrentToken.Linha;
             MaqHip.C.Add("CRVL " + simbolo.EnderecoRelativo);
             return(pEsq);
         }
         MaqHip.C.Add("CRVL " + simbolo.EnderecoRelativo);
         return(simbolo);
     }
     else if (CurrentToken.Tag == Tag.NUMERO_INTEIRO)
     {
         var s = new Simbolo(CurrentToken, Escopo, "", CurrentToken.Lexema, -1);
         MaqHip.C.Add("CRCT " + s.Valor);
         s.Tipo = CurrentToken.GetTagDescription();
         if (pEsq != null)
         {
             if (pEsq.Tipo != "integer")
             {
                 pEsq.SetMsgErro(MsgErrosSemanticos.ATRIBUICAO_ERRADA, s);
                 Error(pEsq);
             }
             pEsq.Token.Linha = CurrentToken.Linha;
             return(pEsq);
         }
         return(s);
     }
     else if (CurrentToken.Tag == Tag.NUMERO_REAL)
     {
         var s = new Simbolo(CurrentToken, Escopo, "", CurrentToken.Lexema, -1);
         MaqHip.C.Add("CRCT " + s.Valor);
         s.Tipo = CurrentToken.GetTagDescription();
         if (pEsq != null)
         {
             if (pEsq.Tipo != "real")
             {
                 pEsq.SetMsgErro(MsgErrosSemanticos.ATRIBUICAO_ERRADA, s);
                 Error(pEsq);
             }
             pEsq.Token.Linha = CurrentToken.Linha;
             return(pEsq);
         }
         return(s);
     }
     else
     {
         Error("N° inteiro, N° real ou identificador");
     }
     return(pEsq);
 }