// deve receber um arquivo public Compilador(string arquivo) { // this.tokensLexico = new List<Token>(); this.geradorCodigo = new GeradorCodigo(); // this.sintatico = new Sintatico(arquivo,geradorCodigo, ref tokensLexico); this.sintatico = new Sintatico(arquivo, geradorCodigo); this.arquivoCompilado = arquivo; }
//public Sintatico(string dados,GeradorCodigo gerador, ref List<Token> tokens) public Sintatico(string dados,GeradorCodigo gerador) { this.token = new Token(); //this.lexico = new Lexico(dados, ref tokens); this.lexico = new Lexico(dados); this.tabelaSimbolos = new TabelaSimbolo(); this.semantico = new Semantico(tabelaSimbolos); this.retornoFuncaoFlag = false; this.geradorCodigo = gerador; }
/// <summary> /// Método responsável por Analisar o tipo de cada membro da expressao e validar o tipo final da expressâo /// </summary> /// <param name="tabelaSimbolos"></param> /// <param name="tokenAtual"></param> /// <param name="simboloValido"></param> /// <param name="comando"></param> public void AnalisaExpressaoSemanticamente(GeradorCodigo gerador,Token tokenAtual,Simbolo simboloValido, String comando) { posFixa.DesimpilharPilhaPrioridade(); // remove os membros restantes da pilha, caso venha ter. // verifica se o tipo da expressao retornada é de fato igual ao tipo exigido if (AnalisaExpressaoPosFixa() != simboloValido) { if (simboloValido == Simbolo.Sbooleano) throw new ErroException(String.Format("Linha: {0}. Erro Semântico! {1} deve conter uma expressão booleana!", tokenAtual.Linha, comando), tokenAtual.Linha); else throw new ErroException(String.Format("Linha: {0}. Erro Semântico! {1} deve conter uma expressão inteira!", tokenAtual.Linha, comando), tokenAtual.Linha); } //gera código da expressao pos fixa GeraCodigoExpressao(gerador); // limpar lista da pos fixa posFixa.ResetarPosFixa(); }
/// <summary> /// método responsável por gerar o código da expressão pos-fixa gerada. /// </summary> /// <param name="geradorCodigo"></param> private void GeraCodigoExpressao(GeradorCodigo geradorCodigo) { foreach (Token item in posFixa.ObterListaPosfixa()) { if (item.Simbolo == Simbolo.Sidentificador) { //pesquisa o item na tabela de simbolos para saber se é variável ou função ItemSimbolo variavelFuncao = tabelaSimbolos.PesquisaItem(item.Lexema); if (variavelFuncao.GetType() == typeof(VariavelSimbolo)) { geradorCodigo.GerarCodigo(Codigo.LDV, new string[] { ((VariavelSimbolo)variavelFuncao).Memoria.ToString() }); } else if (variavelFuncao.GetType() == typeof(FuncaoSimbolo)) { geradorCodigo.GerarCodigo(Codigo.CALL, new string[] { ((FuncaoSimbolo)variavelFuncao).Nivel.ToString() }); } } else if (item.Simbolo == Simbolo.Snumero) { geradorCodigo.GerarCodigo(Codigo.LDC, new string[] { item.Lexema }); } else if (item.Simbolo == Simbolo.Snao) { geradorCodigo.GerarCodigo(Codigo.NEG, new string[] { }); } else if (item.Simbolo == Simbolo.Sverdadeiro || item.Simbolo == Simbolo.Sfalso) { geradorCodigo.GerarCodigo(Codigo.LDC, new string[] { ((int)item.Simbolo).ToString() }); } else if (item.Simbolo == Simbolo.Smaisunario) //checar { // geradorCodigo.GerarCodigo(Codigo.INV, new string[] { }); } else if (item.Simbolo == Simbolo.Smenosunario) { geradorCodigo.GerarCodigo(Codigo.INV, new string[] { }); } else if (item.Simbolo == Simbolo.Smult) { geradorCodigo.GerarCodigo(Codigo.MULT, new string[] { }); } else if (item.Simbolo == Simbolo.Sdiv) { geradorCodigo.GerarCodigo(Codigo.DIVI, new string[] { }); } else if (item.Simbolo == Simbolo.Smais) { geradorCodigo.GerarCodigo(Codigo.ADD, new string[] { }); } else if (item.Simbolo == Simbolo.Smenos) { geradorCodigo.GerarCodigo(Codigo.SUB, new string[] { }); } else if (item.Simbolo == Simbolo.Sig) { geradorCodigo.GerarCodigo(Codigo.CEQ, new string[] { }); } else if (item.Simbolo == Simbolo.Sdif) { geradorCodigo.GerarCodigo(Codigo.CDIF, new string[] { }); } else if (item.Simbolo == Simbolo.Smenor) { geradorCodigo.GerarCodigo(Codigo.CME, new string[] { }); } else if (item.Simbolo == Simbolo.Smenorig) { geradorCodigo.GerarCodigo(Codigo.CMEQ, new string[] { }); } else if (item.Simbolo == Simbolo.Smaior) { geradorCodigo.GerarCodigo(Codigo.CMA, new string[] { }); } else if (item.Simbolo == Simbolo.Smaiorig) { geradorCodigo.GerarCodigo(Codigo.CMAQ, new string[] { }); } else if (item.Simbolo == Simbolo.Se) { geradorCodigo.GerarCodigo(Codigo.AND, new string[] { }); } else if (item.Simbolo == Simbolo.Sou) { geradorCodigo.GerarCodigo(Codigo.OR, new string[] { }); } } }