예제 #1
0
        public Simbolo Insere(Simbolo simbolo)
        {
            var s = BuscaForAdd(simbolo);

            if (s == null)
            {
                Tabela[simbolo.SimboloId] = simbolo;
                if (simbolo.Categoria == "procedure")
                {
                    simbolo = new Simbolo(simbolo.Token, simbolo.Cadeia, simbolo.Categoria, simbolo.Valor, simbolo.EnderecoRelativo);
                    Tabela[simbolo.SimboloId] = simbolo;
                }
            }
            return(s);
        }
예제 #2
0
 private static void RestoIdent(Simbolo pEsq)
 {
     if (Lexico.NextTokenIs(":="))
     {
         CurrentToken = Lexico.NextToken();
         Expressao(pEsq);
         MaqHip.C.Add("ARMZ " + pEsq.EnderecoRelativo);
     }
     else
     {
         int retorno = MaqHip.C.Count();
         MaqHip.C.Add("PUSHER");
         Lista_arg(pEsq);
         MaqHip.C.Add("CHPR " + pEsq.PrimeiraInstrucao);
         MaqHip.C[retorno] = "PUSHER " + MaqHip.C.Count();
     }
 }
예제 #3
0
 public Simbolo Busca(Simbolo s)
 {
     return(Busca(s.Cadeia, s.Escopo));
 }
예제 #4
0
 private static void Error(Simbolo simbolo)
 {
     throw new Exception(simbolo.MsgErro);
 }
예제 #5
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);
 }