Beispiel #1
0
    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()
Beispiel #2
0
    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()
Beispiel #3
0
    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()
Beispiel #4
0
    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
Beispiel #5
0
    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()
Beispiel #6
0
    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()
Beispiel #7
0
    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()
Beispiel #8
0
    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
Beispiel #9
0
    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()
Beispiel #10
0
    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()
Beispiel #11
0
    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()
Beispiel #12
0
    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
Beispiel #13
0
    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()