Exemplo n.º 1
0
    def Exp4(self):
        noExp4 = No()
        tempToken = Token(self.token.getNome(), self.token.getLexema(),
                          self.token.getLinha(), self.token.getColuna())

        # Exp4 -> ID Exp4’
        if (self.eat(Tag.ID)):
            self.Exp4Linha()
            noExp4.setTipo(tempToken.getTipo())
            if (noExp4.getTipo() == Tag.TIPO_VAZIO):
                noExp4.setTipo(Tag.ERROR)
                self.sinalizaErroSemantico('ID não declarado')
                return noExp4
        # Exp4 -> ConstInteger | ConstDouble
        elif (self.eat(Tag.INT) or self.eat(Tag.DOUBLE)):
            noExp4.setTipo(Tag.NUMERICO)
            return noExp4
        # Exp4 -> ConstString
        elif (self.eat(Tag.STRING)):
            noExp4.setTipo(Tag.STRING)
            return noExp4
        # Exp4 -> ConstString
        elif (self.eat(Tag.KW_TRUE) or self.eat(Tag.KW_FALSE)):
            noExp4.setTipo(Tag.LOGICO)
            return noExp4
        # Exp4 -> OpUnario Exp4
        elif (self.token.getNome() in (Tag.OP_UNAR, Tag.OP_NOT)):
            noUnario = self.OpUnario()
            noExp4Filho = self.Exp4()
            if (noExp4Filho.getTipo() == noUnario.getTipo()
                    and noUnario.getTipo() == Tag.NUMERICO):
                noExp4.setTipo(Tag.NUMERICO)
            elif (noExp4Filho.getTipo() == noUnario.getTipo()
                  and noUnario.getTipo() == Tag.LOGICO):
                noExp4.setTipo(Tag.LOGICO)
            else:
                noExp4.setTipo(Tag.ERROR)
            return noExp4
        # Exp4 -> ( Expressao )
        elif (self.eat(Tag.KW_OPN_PARENTH)):
            noExp = self.Expressao()
            if (self.eat(Tag.KW_CLS_PARENTH)):
                noExp4.setTipo(noExp.getTipo())
                return noExp4
            else:
                self.sinalizaErroSintatico('Esperado ")", encontrado ' + '"' +
                                           self.token.getLexema() + '"')
                noExp4.setTipo(Tag.ERROR)
                return noExp4
        else:
            self.sinalizaErroSintatico(
                'Esperado "ID , ConstInteger , ConstDouble , ConstString , true , false'
                + ' , - , ! , (", encontrado ' + '"' + self.token.getLexema() +
                '"')
            noExp4.setTipo(Tag.ERROR)
            return noExp4