def Exp3(self): noExp3 = No() if self.token.getNome() == Tag.ID or self.token.getNome() == Tag.OP_APA or self.token.getNome() == Tag.NUM_INTEIRO \ or self.token.getNome() == Tag.NUM_DOUBLE or self.token.getNome() == Tag.LIT or self.token.getNome() == Tag.KW_TRUE \ or self.token.getNome() == Tag.KW_FALSE or self.token.getNome() == Tag.OP_UNARIO_DIFERENTE or self.token.getNome() == Tag.OP_NEGACAO: noExp4 = self.Exp4() noExp3Linha = self.Exp3Linha() if noExp3Linha.tipo == Tag.TIPO_VAZIO: noExp3.tipo = (noExp4.tipo) elif noExp3Linha.tipo == noExp4.tipo and noExp3Linha.tipo == Tag.TIPO_NUMERICO: noExp3.tipo = (Tag.TIPO_NUMERICO) else: noExp3.tipo = (Tag.TIPO_ERRO) return noExp3 else: if self.token.getNome() == Tag.OP_ADICAO or self.token.getNome() == Tag.OP_SUBTRACAO or self.token.getNome() == Tag.OP_MENOR \ or self.token.getNome() == Tag.OP_MENOR_IGUAL or self.token.getNome() == Tag.OP_MAIOR or self.token.getNome() == Tag.OP_MAIOR_IGUAL \ or self.token.getNome() == Tag.OP_IGUAL_IGUAL or self.token.getNome() == Tag.OP_DIFERENTE or self.token.getNome() == Tag.KW_OR \ or self.token.getNome() == Tag.KW_AND or self.token.getNome() == Tag.OP_FPA or self.token.getNome() == Tag.OP_PONTO_VIRGULA \ or self.token.getNome() == Tag.OP_VIRGULA: self.sync( "Esperado \"ID, (, constInt, constDouble, String, true, false, !, -n\", encontrado " + "\"" + self.token.getLexema() + "\"") return noExp3 else: self.skip( "Esperado \"ID, (, constInt, constDouble, String, true, false, !, -n\", encontrado " + "\"" + self.token.getLexema() + "\"") if self.token.getNome() != Tag.EOF: self.Exp3()
def Exp1(self): noExp1 = No() if self.token.getNome() == Tag.ID or self.token.getNome() == Tag.OP_APA or self.token.getNome() == Tag.NUM_INTEIRO \ or self.token.getNome() == Tag.NUM_DOUBLE or self.token.getNome() == Tag.LIT or self.token.getNome() == Tag.KW_TRUE \ or self.token.getNome() == Tag.KW_FALSE or self.token.getNome() == Tag.OP_UNARIO_DIFERENTE or self.token.getNome() == Tag.OP_NEGACAO: noExp2 = self.Exp2() noExp1Linha = self.Exp1Linha() if noExp1Linha == Tag.TIPO_VAZIO: noExp1.tipo = noExp2.tipo elif noExp1Linha.tipo == noExp2.tipo and noExp1Linha.tipo == Tag.TIPO_NUMERICO: noExp1.tipo = (Tag.TIPO_LOGICO) else: noExp1.tipo = (Tag.TIPO_ERRO) return noExp1 else: if self.token.getNome() == Tag.KW_OR or self.token.getNome() == Tag.OP_FPA or self.token.getNome() == Tag.KW_AND or \ self.token.getNome() == Tag.OP_PONTO_VIRGULA or self.token.getNome() == Tag.OP_VIRGULA: self.sync( "Esperado \"ID, constInt, constDouble, constStr, true, false, - , !, (\", encontrado " + "\"" + self.token.getLexema() + "\"") return noExp1 else: self.skip( "Esperado \"ID, constInt, constDouble, constStr, true, false, - , !, (\", encontrado " + "\"" + self.token.getLexema() + "\"") if self.token.getNome() != Tag.EOF: self.Exp1()
def Exp4(self): noExp4 = No() tempToken = copy.copy(self.token) if self.eat(Tag.ID): self.Exp4Linha() if noExp4.tipo == None: noExp4.tipo = (Tag.TIPO_ERRO) self.sinalizaErroSemantico("Id não declarado") return noExp4 elif self.eat(Tag.OP_NEGACAO) or self.eat(Tag.OP_DIFERENTE): noOpUnario = self.OpUnario() noExp4_ = self.Exp4() if noExp4_.tipo == noOpUnario.tipo and noOpUnario.tipo == Tag.TIPO_NUMERICO: noExp4.tipo = (Tag.TIPO_NUMERICO) elif noExp4_.tipo == noOpUnario.tipo and noOpUnario.tipo == Tag.TIPO_LOGICO: noExp4.tipo = (Tag.TIPO_LOGICO) else: noExp4.tipo = (Tag.TIPO_ERRO) return noExp4 elif self.eat(Tag.OP_APA): noExp = self.Expressao() if not self.eat(Tag.OP_FPA): self.sinalizaErroSintatico("Esperado \")\"; encontrado " + "\"" + self.token.getLexema() + "\"") noExp4.tipo = (noExp.tipo) return noExp4 elif self.eat(Tag.NUM_INTEIRO) or self.eat(Tag.NUM_DOUBLE): noExp4.tipo = (Tag.TIPO_NUMERICO) return noExp4 elif self.eat(Tag.LIT): noExp4.tipo = (Tag.KW_STRING) return noExp4 elif self.eat(Tag.KW_FALSE) or self.eat(Tag.KW_TRUE): noExp4.tipo = (Tag.TIPO_LOGICO) return noExp4 elif not self.eat(Tag.NUM_INTEIRO) and not self.eat(Tag.LIT) and not self.eat(Tag.NUM_DOUBLE) and not self.eat( Tag.KW_TRUE) and not self.eat(Tag.KW_FALSE): if self.token.getNome() in (Tag.OP_MULTIPLICACAO, Tag.OP_DIVISAO, Tag.OP_ADICAO , Tag.OP_SUBTRACAO, Tag.OP_MENOR, \ Tag.OP_MENOR_IGUAL, Tag.OP_MAIOR, Tag.OP_MAIOR_IGUAL, Tag.OP_IGUAL_IGUAL, Tag.OP_DIFERENTE,\ Tag.KW_OR, Tag.KW_AND, Tag.OP_FPA, Tag.OP_PONTO_VIRGULA, Tag.OP_VIRGULA): self.sync("Esperado \"ID, constInt, constDouble, String, true, false, !, -n, (\"; encontrado " + "\"" + self.token.getLexema() + "\"") return noExp4 else: self.skip("Esperado \"ID, constInt, constDouble, String, true, false, !, -n, (\"; encontrado " + "\"" + self.token.getLexema() + "\"") if self.token.getNome() != Tag.EOF: self.Exp4()
def TipoPrimitivo(self): noTipoPrimitivo = No() if self.eat(Tag.KW_BOOL): noTipoPrimitivo.tipo = Tag.TIPO_LOGICO return noTipoPrimitivo elif self.eat(Tag.KW_INTEGER): noTipoPrimitivo.tipo = Tag.TIPO_LOGICO return noTipoPrimitivo elif self.eat(Tag.KW_STRING): noTipoPrimitivo.tipo = Tag.TIPO_LOGICO return noTipoPrimitivo elif self.eat(Tag.KW_DOUBLE): noTipoPrimitivo.tipo = Tag.TIPO_LOGICO return noTipoPrimitivo elif self.eat(Tag.KW_VOID): noTipoPrimitivo.tipo = Tag.TIPO_LOGICO return noTipoPrimitivo if self.token.getNome() == Tag.ID: self.sync("Esperado \"bool, integer, String, double, void\", encontrado " + "\"" + self.token.getLexema() + "\"") return else: self.skip( "Esperado \"bool, integer, String, double, void\", encontrado " + "\"" + self.token.getLexema() + "\"") if self.token.getNome() != Tag.EOF: self.TipoPrimitivo() return noTipoPrimitivo
def OpUnario(self): noOpUnario = No() if self.eat(Tag.OP_SUBTRACAO): noOpUnario.tipo = (Tag.TIPO_NUMERICO) return noOpUnario elif self.eat(Tag.OP_NEGACAO): noOpUnario.tipo = (Tag.TIPO_LOGICO) return noOpUnario if not self.eat(Tag.OP_NEGACAO) and not self.eat(Tag.OP_UNARIO_DIFERENTE): if self.token.getNome() in (Tag.ID, Tag.NUM_INTEIRO, Tag.NUM_DOUBLE, Tag.LIT,Tag.KW_TRUE, Tag.KW_FALSE, Tag.OP_NEGACAO, Tag.OP_UNARIO_DIFERENTE, Tag.OP_APA): self.sync("Esperado \"-n, !\", encontrado " + "\"" + self.token.getLexema() + "\"") return noOpUnario else: self.skip("Esperado \"-n, !\", encontrado " + "\"" + self.token.getLexema() + "\"") if self.token.getNome() != Tag.EOF: self.OpUnario()
def ExpLinha(self): noExpLinha = No() if self.eat(Tag.KW_OR) or self.eat(Tag.KW_AND): noExp1 = self.Exp1() noExpLinha_ = self.ExpLinha() if noExpLinha.tipo == Tag.TIPO_VAZIO and noExp1.tipo == Tag.TIPO_LOGICO: noExpLinha.tipo = (Tag.TIPO_LOGICO) elif noExpLinha_.tipo == noExp1.tipo and noExp1.tipo == Tag.TIPO_LOGICO: noExpLinha.tipo = (Tag.TIPO_LOGICO) else: noExpLinha.tipo = (Tag.TIPO_ERRO) return noExpLinha else: if self.token.getNome() == Tag.OP_FPA or self.token.getNome() == Tag.OP_PONTO_VIRGULA or self.token.getNome() == Tag.OP_VIRGULA: return noExpLinha else: self.skip("Esperado \"or, and'\", encontrado " + "\"" + self.token.getLexema() + "\"") if self.token.getNome() != Tag.EOF: self.ExpLinha()
def Exp1Linha(self): noExp1Linha = No() if self.eat(Tag.OP_MENOR) or self.eat(Tag.OP_MENOR_IGUAL) or self.eat(Tag.OP_MAIOR) or self.eat( Tag.OP_MAIOR_IGUAL) or self.eat(Tag.OP_IGUAL_IGUAL) or self.eat(Tag.OP_DIFERENTE): noExp2 = self.Exp2() noExp1Linha_ = self.Exp1Linha() if noExp1Linha_.tipo == Tag.TIPO_VAZIO and noExp2.tipo == Tag.TIPO_NUMERICO: noExp1Linha.setType(Tag.TIPO_NUMERICO) elif noExp1Linha_.tipo == noExp2.tipo and noExp2.tipo == Tag.TIPO_NUMERICO: noExp1Linha.tipo = (Tag.TIPO_NUMERICO) else: noExp1Linha.tipo = (Tag.TIPO_ERRO) return noExp1Linha else: if self.token.getNome() == Tag.KW_OR or not self.token.getNome() == Tag.KW_AND or not self.token.getNome() == \ Tag.OP_FPA or not self.token.getNome() == Tag.OP_PONTO_VIRGULA or not self.token.getNome() == Tag.OP_VIRGULA: return noExp1Linha else: self.skip( "Esperado \"<, <=, >, >=, ',', or, and, ==, !=\"; encontrado " + "\"" + self.token.getLexema() + "\"") if self.token.getNome() != Tag.EOF: self.Exp1Linha()
def Expressao(self): noExpressao = No() if self.token.getNome() == Tag.ID or self.token.getNome() == Tag.NUM_INTEIRO or self.token.getNome() == Tag.NUM_DOUBLE \ or self.token.getNome() == Tag.LIT or self.token.getNome() == Tag.KW_TRUE or self.token.getNome() == Tag.KW_FALSE or \ self.token.getNome() == Tag.OP_APA or self.token.getNome() == Tag.OP_NEGACAO or self.token.getNome() == Tag.OP_UNARIO_DIFERENTE: noExp1 = self.Exp1() noExpLinha = self.ExpLinha() if noExpLinha.tipo == Tag.TIPO_VAZIO: noExpressao.tipo = noExp1.tipo elif noExpLinha.tipo == noExp1.tipo and noExpLinha.tipo == Tag.TIPO_LOGICO: noExpressao.tipo = Tag.TIPO_LOGICO else: noExpressao.tipo = Tag.TIPO_ERRO return noExpressao else: noExpressao.tipo = Tag.TIPO_VAZIO if self.token.getNome() == Tag.OP_FPA or self.token.getNome() == Tag.OP_PONTO_VIRGULA or self.token.getNome() == Tag.OP_VIRGULA: self.sync( "Esperado \"ID, integer, double, String, true, false, !, -, (\", encontrado " + "\"" + self.token.getLexema() + "\"") return noExpressao else: self.skip( "Esperado \"ID, integer, double, String, true, false, !, -, (\", encontrado " + "\"" + self.token.getLexema() + "\"") if self.token.getNome() != Tag.EOF: self.Expressao() return noExpressao
def CmdAtribui(self): noCmdAtribui = No() if self.eat(Tag.OP_UNARIO_IGUAL): noExpressao = self.Expressao() if not self.eat(Tag.OP_PONTO_VIRGULA): self.sinalizaErroSintatico("Esperado \";\"; encontrado " + "\"" + self.token.getLexema() + "\"") noCmdAtribui.tipo = (noExpressao.tipo) return noCmdAtribui else: if self.token.getNome() == Tag.KW_WHILE or self.token.getNome() == Tag.ID or self.token.getNome() == Tag.KW_RETURN or \ self.token.getNome() == Tag.KW_IF or self.token.getNome() == Tag.KW_END or self.token.getNome() == Tag.KW_WRITE: self.sync("Esperado \"=\"; encontrado " + "\"" + self.token.getLexema() + "\"") return else: self.skip("Esperado \"=\"; encontrado " + "\"" + self.token.getLexema() + "\"") if self.token.getNome() != Tag.EOF: self.CmdWrite()
def CmdAtribFunc(self): noCmdAtribFunc = No() if self.token.getNome() == Tag.OP_UNARIO_IGUAL: noCmdAtribui = self.CmdAtribui() noCmdAtribFunc.tipo = (noCmdAtribFunc.tipo) return noCmdAtribFunc elif self.token.getNome() == Tag.OP_APA: self.CmdFuncao() self.noCmdAtribFun.tipo = (Tag.TIPO_VAZIO) return noCmdAtribFunc else: if self.token.getNome() == Tag.KW_WHILE or self.token.getNome() == Tag.KW_IF or self.token.getNome() == Tag.ID \ or self.token.getNome() == Tag.KW_RETURN or self.token.getNome() == Tag.KW_WRITE or \ self.token.getNome() == Tag.KW_END or self.token.getNome() == Tag.KW_ELSE: self.sync("Esperado \"(, =)\", encontrado " + "\"" + self.token.getLexema() + "\"") return noCmdAtribFunc else: self.sync("Esperado \"(, =)\", encontrado " + "\"" + self.token.getLexema() + "\"") if self.token.getNome() != Tag.EOF: self.CmdAtribFunc()
def Exp2Linha(self): noExp2Linha = No() if self.eat(Tag.OP_ADICAO) or self.eat(Tag.OP_SUBTRACAO): noExp3 = self.Exp3() noExp2Linha_ = self.Exp2Linha() if noExp2Linha_.tipo == Tag.TIPO_VAZIO and noExp3.tipo == Tag.TIPO_NUMERICO: noExp2Linha.tipo = (Tag.TIPO_NUMERICO) elif noExp2Linha_.tipo == noExp3.tipo and noExp3.tipo == Tag.TIPO_NUMERICO: noExp2Linha_.tipo = (Tag.TIPO_NUMERICO) else: noExp3.tipo = (Tag.TIPO_ERRO) return noExp2Linha else: if self.token.getNome() == Tag.OP_MAIOR or self.token.getNome() == Tag.OP_MAIOR_IGUAL or \ self.token.getNome() == Tag.OP_MENOR or self.token.getNome() == Tag.OP_MENOR_IGUAL or \ self.token.getNome() == Tag.OP_IGUAL_IGUAL or self.token.getNome() == Tag.OP_DIFERENTE or \ self.token.getNome() == Tag.KW_OR or self.token.getNome() == Tag.KW_AND or self.token.getNome() == Tag.OP_FPA \ or self.token.getNome() == Tag.OP_PONTO_VIRGULA or self.token.getNome() == Tag.OP_VIRGULA: return noExp2Linha else: self.skip( "Esperado \"+, -, ;, ), ',', or, and, <, <=, >, >=, ==, !=\", encontrado " + "\"" + self.token.getLexema() + "\"") if self.token.getNome() != Tag.EOF: self.Exp2Linha()
def Retorno(self): noRetorno = No() if self.eat(Tag.KW_RETURN): noExpressao = self.Expressao() if not self.eat(Tag.OP_PONTO_VIRGULA): self.sinalizaErroSintatico("Esperado \";\"; encontrado " + "\"" + self.token.getLexema() + "\"") noRetorno.tipo = noExpressao.tipo return noRetorno else: if self.token.getNome() == Tag.KW_END: return noRetorno else: self.skip( "Esperado \"void, String, bool, integer, double\", encontrado " + "\"" + self.token.getLexema() + "\"") if self.token.getNome() != Tag.EOF: self.Retorno() return noRetorno
def Exp3Linha(self): noExp3Linha = No() if self.eat(Tag.OP_MULTIPLICACAO) or self.eat(Tag.OP_DIVISAO): noExp4 = self.Exp4() noExp3Linha_ = self.Exp3Linha() if noExp3Linha_.tipo == Tag.TIPO_VAZIO and noExp4.tipo == Tag.TIPO_NUMERICO: noExp3Linha.tipo(Tag.TIPO_NUMERICO) elif noExp3Linha_.tipo == noExp4.tipo and noExp4.tipo == Tag.TIPO_NUMERICO: noExp3Linha.tipo = (Tag.TIPO_NUMERICO) else: noExp3Linha.tipo = (Tag.TIPO_ERRO) return noExp3Linha else: if self.token.getNome() in (Tag.OP_SUBTRACAO, Tag.OP_ADICAO, Tag.OP_MAIOR, Tag.OP_MAIOR_IGUAL, Tag.OP_MENOR, \ Tag.OP_MENOR_IGUAL, Tag.OP_IGUAL_IGUAL, Tag.OP_DIFERENTE, Tag.KW_OR, Tag.KW_AND, \ Tag.OP_FPA, Tag.OP_PONTO_VIRGULA, Tag.OP_VIRGULA): return noExp3Linha else: self.skip( "Esperado \"/,*\", encontrado " + "\"" + self.token.getLexema() + "\"") if self.token.getNome() != Tag.EOF: self.Exp3Linha()