コード例 #1
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)
コード例 #2
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)
コード例 #3
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)
コード例 #4
0
 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)
コード例 #5
0
 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)
コード例 #6
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)
コード例 #7
0
 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
コード例 #8
0
 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
コード例 #9
0
 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)
コード例 #10
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
コード例 #11
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)