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); }
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(); } }
public Simbolo Busca(Simbolo s) { return(Busca(s.Cadeia, s.Escopo)); }
private static void Error(Simbolo simbolo) { throw new Exception(simbolo.MsgErro); }
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); }