def __parseSe(self) -> Se: if self.__retornaTokenAtual().retornaTipo() == palavras_chaves.se: self.__avancaToken() cond = self.__parseExpr() if self.__retornaTokenAtual().retornaTipo() == palavras_chaves.entao: self.__avancaToken() else: msgErro = f"Espera-se '{palavras_chaves.entao}' ao invés de '{self.__retornaTokenAtual().retornaTipo()}'" posErro = self.__retornaTokenAtual().retornaPosicao() self.__registraErro(ErroSintaxe(msg=msgErro, pos=posErro)) self.__avancaToken() tabela_simb_pai = self.__retornaTabelaSimboloAtual() tabela_simb_se = TabelaDeSimbolos(pai=tabela_simb_pai) self.__trocaTabelaSimbolos(tabela_simb_se) instrucoes = Instrucao() while self.__retornaTokenAtual().retornaTipo() not in [palavras_chaves.senao, palavras_chaves.senaose, palavras_chaves.fim_se, tipos_tokens.EOF]: inst = self.__parseInstrucao() instrucoes.adicionaInstrucao(inst) self.__trocaTabelaSimbolos(tabela_simb_pai) senaose = None senao = None if self.__retornaTokenAtual().retornaTipo() == palavras_chaves.senaose: senaose = self.__parseSenaoSe() elif self.__retornaTokenAtual().retornaTipo() == palavras_chaves.senao: tabela_simb_senao = TabelaDeSimbolos(pai=tabela_simb_pai) self.__trocaTabelaSimbolos(tabela_simb_senao) senao = self.__parseInstrucao() self.__trocaTabelaSimbolos(tabela_simb_pai) if self.__retornaTokenAtual().retornaTipo() != palavras_chaves.fim_se: msgErro = f"Espera-se '{palavras_chaves.fim_se}' ao invés de '{self.__retornaTokenAtual().retornaValor()}'." posErro = self.__retornaTokenAtual().retornaPosicao() self.__registraErro(ErroSintaxe(msg=msgErro, pos=posErro)) self.__avancaToken() return Se(cond=cond, corpo=instrucoes, senaose=senaose, senao=senao)
def parse(self) -> No: instrucoes = Instrucao() tkn_atual = self.__retornaTokenAtual() while tkn_atual.retornaTipo() != tipos_tokens.EOF: inst = self.__parseInstrucao() if inst != None: instrucoes.adicionaInstrucao(inst) tkn_atual = self.__retornaTokenAtual() return instrucoes
def __parseSenao(self) -> List[Instrucao]: if not self.__retornaTokenAtual().retornaTipo() == palavras_chaves.senao: msgErro = f"Espera-se '{palavras_chaves.senao}' ao invés de '{self.__retornaTokenAtual().retornaTipo()}'." posErro = self.__retornaTokenAtual().retornaPosicao() self.__registraErro(ErroSintaxe(msg=msgErro, pos=posErro)) self.__avancaToken() tabela_simb_pai = self.__retornaTabelaSimboloAtual() tabela_simb_se = TabelaDeSimbolos(pai=tabela_simb_pai) self.__trocaTabelaSimbolos(tabela_simb_se) instrucoes = Instrucao() while self.__retornaTokenAtual().retornaTipo() not in [palavras_chaves.senao, palavras_chaves.senaose, palavras_chaves.fim_se]: instrucoes.adicionaInstrucao(self.__parseInstrucao()) self.__trocaTabelaSimbolos(tabela_simb_pai) return instrucoes
def __parseRepitaAte(self): expr = self.__parseExpr() if self.__retornaTokenAtual().retornaTipo() != palavras_chaves.entao: msgErro = f"Espera-se '{palavras_chaves.entao}' ao invés de '{self.__retornaTokenAtual().retornaValor()}'." posErro = self.__retornaTokenAtual().retornaPosicao() self.__registraErro(ErroSintaxe(msg=msgErro, pos=posErro)) self.__avancaToken() instrucoes = Instrucao() while self.__retornaTokenAtual().retornaTipo() not in [palavras_chaves.fim_repita, tipos_tokens.EOF]: instrucoes.adicionaInstrucao(self.__parseInstrucao()) if self.__retornaTokenAtual().retornaTipo() != palavras_chaves.fim_repita: msgErro = f"Espera-se '{palavras_chaves.fim_repita}' ao invés de '{self.__retornaTokenAtual().retornaValor()}'." posErro = self.__retornaTokenAtual().retornaPosicao() self.__registraErro(ErroSintaxe(msg=msgErro, pos=posErro)) self.__avancaToken() return RepitaAte(expr=expr, instrucoes=instrucoes)
def gera_instrucoes(self, no_instrucoes: Instrucao): instrucoes_txt = "" instrucoes = no_instrucoes.retornaInstrucoes() for inst in instrucoes: res = self.gera_instrucao(inst) instrucoes_txt += f"{res}\n" return instrucoes_txt
def __parseFuncao(self): self.__avancaToken() tabela_simb_pai = self.__retornaTabelaSimboloAtual() tabela_simb_func = TabelaDeSimbolos(pai=tabela_simb_pai) self.__trocaTabelaSimbolos(tabela_simb_func) if self.__retornaTokenAtual().retornaTipo() not in palavras_chaves.todos_tipos_funcao: msgErro = f"Espera-se '{palavras_chaves.todos_tipos_funcao}' ao invés de '{self.__retornaTokenAtual().retornaValor()}'." self.__registraErro(ErroSintaxe(msg=msgErro, pos=self.__retornaTokenAtual().retornaPosicao())) tipo = self.__retornaTokenAtual().retornaTipo() self.__avancaToken() if self.__retornaTokenAtual().retornaTipo() != tipos_tokens.identificador: msgErro = f"Espera-se '{tipos_tokens.identificador}' ao invés de '{self.__retornaTokenAtual().retornaValor()}'." self.__registraErro(ErroSintaxe(msg=msgErro, pos=self.__retornaTokenAtual().retornaPosicao())) ident = self.__retornaTokenAtual() registroJaExiste = self.__retornaTabelaSimbolosGlobal().retornaRegistro(ident.retornaValor()) if registroJaExiste: msgErro = f"Este identificador já foi declarado: '{tipos_tokens.identificador}'." self.__registraErro(ErroIdentJaDefinidoNoEscopo(msg=msgErro, pos=self.__retornaTokenAtual().retornaPosicao())) self.__avancaToken() if self.__retornaTokenAtual().retornaTipo() != op_arit.parent_esq: msgErro = f"Espera-se '{op_arit.parent_esq}' ao invés de '{self.__retornaTokenAtual().retornaValor()}'." self.__registraErro(ErroSintaxe(msg=msgErro, pos=self.__retornaTokenAtual().retornaPosicao())) self.__avancaToken() parametros = self.__parseDefParametrosFuncao() if self.__retornaTokenAtual().retornaTipo() != op_arit.parent_dir: msgErro = f"Espera-se '{op_arit.parent_dir}' ao invés de '{self.__retornaTokenAtual().retornaValor()}'." self.__registraErro(ErroSintaxe(msg=msgErro, pos=self.__retornaTokenAtual().retornaPosicao())) self.__avancaToken() if self.__retornaTokenAtual().retornaTipo() != palavras_chaves.entao: msgErro = f"Espera-se '{palavras_chaves.entao}' ao invés de '{self.__retornaTokenAtual().retornaValor()}'." self.__registraErro(ErroSintaxe(msg=msgErro, pos=self.__retornaTokenAtual().retornaPosicao())) self.__avancaToken() tabela_simb_pai.registraFuncao(tipo=tipo, ident=ident.retornaValor(), parametros=parametros) instrucoes = Instrucao() while self.__retornaTokenAtual().retornaTipo() not in [palavras_chaves.fim_funcao, tipos_tokens.EOF]: res_instr = self.__parseInstrucao() if res_instr: instrucoes.adicionaInstrucao(res_instr) if self.__retornaTokenAtual().retornaTipo() != palavras_chaves.fim_funcao: msgErro = f"Espera-se '{palavras_chaves.fim_funcao}' ao invés de '{self.__retornaTokenAtual().retornaValor()}'." posErro = self.__retornaTokenAtual().retornaPosicao() self.__registraErro(ErroSintaxe(msg=msgErro, pos=posErro)) self.__avancaToken() self.__trocaTabelaSimbolos(tabela_simb_pai) # tabela_simb_pai.registraFuncao(tipo=tipo, ident=ident.retornaValor(), parametros=parametros) return Funcao(ident=ident, params=parametros, instrucao=instrucoes)
def __parseRepitaComCond(self): decl_var = self.__parseDeclaracaoVariavel() if self.__retornaTokenAtual().retornaTipo() != tipos_tokens.delimitador: msgErro = f"Espera-se '{tipos_tokens.delimitador}' ao invés de '{self.__retornaTokenAtual().retornaValor()}'." posErro = self.__retornaTokenAtual().retornaPosicao() self.__registraErro(ErroSintaxe(msg=msgErro, pos=posErro)) self.__avancaToken() self.__avancaToken() cond = self.__parseExpr() if self.__retornaTokenAtual().retornaTipo() != tipos_tokens.delimitador: msgErro = f"Espera-se '{tipos_tokens.delimitador}' ao invés de '{self.__retornaTokenAtual().retornaValor()}'." posErro = self.__retornaTokenAtual().retornaPosicao() self.__registraErro(ErroSintaxe(msg=msgErro, pos=posErro)) self.__avancaToken() self.__avancaToken() atrib_var = self.__parseAtribuicaoVariavel() if self.__retornaTokenAtual().retornaTipo() != palavras_chaves.entao: msgErro = f"Espera-se '{palavras_chaves.entao}' ao invés de '{self.__retornaTokenAtual().retornaValor()}'." posErro = self.__retornaTokenAtual().retornaPosicao() self.__registraErro(ErroSintaxe(msg=msgErro, pos=posErro)) self.__avancaToken() instrucoes = Instrucao() while self.__retornaTokenAtual().retornaTipo() not in [palavras_chaves.fim_repita, tipos_tokens.EOF]: instrucoes.adicionaInstrucao(self.__parseInstrucao()) instrucoes.adicionaInstrucao(atrib_var) if self.__retornaTokenAtual().retornaTipo() != palavras_chaves.fim_repita: msgErro = f"Espera-se '{palavras_chaves.fim_repita}' ao invés de '{self.__retornaTokenAtual().retornaValor()}'." posErro = self.__retornaTokenAtual().retornaPosicao() self.__registraErro(ErroSintaxe(msg=msgErro, pos=posErro)) self.__avancaToken() return RepitaComCond(decl_var=decl_var, cond=cond, atrib_var=atrib_var, instrucoes=instrucoes)
def __parseRepitaIdentAte(self): ident = Variavel(self.__retornaTokenAtual()) # Adiciona uma instrução de atribuição no loop op_soma = Token(op_arit.soma, pos=self.__retornaTokenAtual().retornaPosicao()) valor_soma = Numero(Token(tipo=valores.inteiro, pos=self.__retornaTokenAtual().retornaPosicao(), val=1)) op_bin_soma = OpBin(esq=ident, op=op_soma, dir=valor_soma) var_atrib = AtribuicaoVariavel(ident=self.__retornaTokenAtual(), op=op_soma, val=op_bin_soma) self.__avancaToken() if self.__retornaTokenAtual().retornaTipo() != palavras_chaves.ate: msgErro = f"Espera-se '{palavras_chaves.ate}' ao invés de '{self.__retornaTokenAtual().retornaValor()}'." posErro = self.__retornaTokenAtual().retornaPosicao() self.__registraErro(ErroSintaxe(msg=msgErro, pos=posErro)) self.__avancaToken() expr = self.__parseExpr() if self.__retornaTokenAtual().retornaTipo() != palavras_chaves.entao: msgErro = f"Espera-se '{palavras_chaves.entao}' ao invés de '{self.__retornaTokenAtual().retornaValor()}'." posErro = self.__retornaTokenAtual().retornaPosicao() self.__registraErro(ErroSintaxe(msg=msgErro, pos=posErro)) self.__avancaToken() instrucoes = Instrucao() while self.__retornaTokenAtual().retornaTipo() not in [palavras_chaves.fim_repita, tipos_tokens.EOF]: instrucoes.adicionaInstrucao(self.__parseInstrucao()) instrucoes.adicionaInstrucao(var_atrib) if self.__retornaTokenAtual().retornaTipo() != palavras_chaves.fim_repita: msgErro = f"Espera-se '{palavras_chaves.fim_repita}' ao invés de '{self.__retornaTokenAtual().retornaValor()}'." posErro = self.__retornaTokenAtual().retornaPosicao() self.__registraErro(ErroSintaxe(msg=msgErro, pos=posErro)) self.__avancaToken() return RepitaIdentAte(ident=ident, expr=expr, instrucoes=instrucoes)