Ejemplo n.º 1
0
 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)
Ejemplo n.º 2
0
 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
Ejemplo n.º 3
0
 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
Ejemplo n.º 4
0
 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)
Ejemplo n.º 5
0
 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
Ejemplo n.º 6
0
 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)
Ejemplo n.º 7
0
 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)
Ejemplo n.º 8
0
 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)