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); } }
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(); } } }
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); }