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)
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 __parseChamadaFuncao(self): ident = self.__retornaTokenAtual() if ident.retornaValor() not in funcoes_internas.funcoes_internas and not self.__retornaTabelaSimboloAtual().retornaRegistro(ident.retornaValor()): msgErro = f"A definição da função '{ident.retornaValor()}' não foi encontrada." self.__registraErro(ErroIdentificadorNaoEncontrado(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.__parseParametrosPassadosParaFunc() 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() return ChamadaFuncao(ident=ident, params=parametros)
def __parseDefParametro(self): tipo = self.__retornaTokenAtual() if tipo.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())) self.__avancaToken() ident = self.__retornaTokenAtual() if ident.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())) self.__avancaToken() valor = None if self.__retornaTokenAtual().retornaTipo() == op_arit.op_atribuicao: self.__avancaToken() valor = self.__parseExpr() return Parametro(tipo=tipo, ident=ident, val=valor)
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 __parseDefParametrosFuncao(self): parametros = [] while self.__retornaTokenAtual().retornaTipo() not in [op_arit.parent_dir, tipos_tokens.EOF]: parametros.append(self.__parseDefParametro()) if self.__retornaTokenAtual().retornaTipo() == op_arit.parent_dir: break if self.__retornaTokenAtual().retornaTipo() != tipos_tokens.virgula: msgErro = f"Espera-se '{tipos_tokens.virgula}' ao invés de '{self.__retornaTokenAtual().retornaValor()}'." self.__registraErro(ErroSintaxe(msg=msgErro, pos=self.__retornaTokenAtual().retornaPosicao())) self.__avancaToken() return parametros
def __parseDeclaracaoVariavel(self): tkn_tipo_var = self.__retornaTokenAtual() self.__avancaToken() pos = self.__retornaTokenAtual().retornaPosicao() if self.__retornaTokenAtual().retornaTipo() != tipos_tokens.identificador: msgErro = f"Espera-se '{tipos_tokens.identificador}' ao invés de '{self.__retornaTokenAtual().retornaTipo()}'." self.__registraErro(ErroSintaxe(msg=msgErro, pos=pos)) ident_var = self.__retornaTokenAtual() self.__avancaToken() if self.__retornaTokenAtual().retornaTipo() != op_arit.op_atribuicao: msgErro = f"Espera-se '{op_arit.op_atribuicao}' ao invés de '{self.__retornaTokenAtual().retornaTipo()}'." self.__registraErro(ErroSintaxe(msg=msgErro, pos=pos)) self.__avancaToken() valor = self.__parseExpr() no_declaracao_var = DeclaracaoVariavel(tipo=tkn_tipo_var, ident=ident_var, val=valor) tabela_simb = self.__retornaTabelaSimboloAtual() if tabela_simb.retornaRegistro(ident_var.retornaValor()) != None: msgErro = f"O identificador '{ident_var.retornaValor()}' já foi definido neste escopo ou no escopo pai" self.__registraErro(ErroIdentJaDefinidoNoEscopo(msg=msgErro, pos=pos)) else: tabela_simb.registraVariavel(tipo=tkn_tipo_var.retornaTipo(), ident=ident_var.retornaValor()) return no_declaracao_var
def __parseRepita(self): tabela_simb_pai = self.__retornaTabelaSimboloAtual() tabela_simb_repita = TabelaDeSimbolos(pai=tabela_simb_pai) self.__trocaTabelaSimbolos(tabela_simb_repita) if self.__retornaTokenAtual().retornaTipo() != palavras_chaves.repita: msgErro = f"Espera-se '{palavras_chaves.repita}' ao invés de '{self.__retornaTokenAtual().retornaValor()}'." posErro = self.__retornaTokenAtual().retornaPosicao() self.__registraErro(ErroSintaxe(msg=msgErro, pos=posErro)) self.__avancaToken() token_atual = self.__retornaTokenAtual() if token_atual.retornaTipo() == palavras_chaves.ate: self.__avancaToken() return self.__parseRepitaAte() elif token_atual.retornaTipo() == tipos_tokens.identificador: return self.__parseRepitaIdentAte() elif token_atual.retornaTipo() in [palavras_chaves.tipo_flutuante, palavras_chaves.tipo_inteiro]: return self.__parseRepitaComCond() else: msgErro = f"Espera-se '{palavras_chaves.tipo_inteiro} ou {palavras_chaves.tipo_flutuante}' ao invés de '{self.__retornaTokenAtual().retornaValor()}'." posErro = self.__retornaTokenAtual().retornaPosicao() self.__registraErro(ErroSintaxe(msg=msgErro, pos=posErro)) self.__avancaToken() self.__trocaTabelaSimbolos(tabela_simb_repita)
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 __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)