Exemplo n.º 1
0
class Analyze(object):
    def __init__(self):
        self.scope = Scope()

    def analyze(self, tree):
        def simplifyObject(objectString):
            if isinstance(objectString, basestring):
                objectString = "'{}'".format(objectString)
            objLex = Lexitize().lexitize(str(objectString))[0]
            tree = Treeitize().treeitize(objLex)[0]
            return tree

        def getTopObjectAndParameter(objectVariable):
            return (objectVariable.popleft()["value"], objectVariable.popleft()["value"])

        def analyzeObject(objectVariable):
            topValue, parVal = getTopObjectAndParameter(objectVariable)

            if topValue in ["number", "boolean", "string", None]:
                return parVal
            elif topValue == "list":
                newList = []
                while parVal:
                    newList.append(self.analyze(parVal.popLeftObject()))
                return newList

        def analyzeVariable(objectVariable):
            variable, variableValue = getTopObjectAndParameter(objectVariable)
            if variableValue == None:
                variableTree = self.scope.get(variable)
                return self.analyze(variableTree)
            else:
                simplifiedVariable = simplifyObject(self.analyze(variableValue))
                self.scope.add(variable, simplifiedVariable)

        def analyzeOpComp(objectVariable):
            operator, values = getTopObjectAndParameter(objectVariable)

            val1 = self.analyze(values.popLeftObject())
            val2 = self.analyze(values.popLeftObject())
            if isinstance(val1, basestring):
                val1 = "'{}'".format(val1)
            if isinstance(val2, basestring):
                val2 = "'{}'".format(val2)
            return eval(str(val1) + operator + str(val2))

        def analyzeConditional(objectVariable):
            # conditional currently unused, but needed if eventually diff cond types
            conditional, parVal = getTopObjectAndParameter(objectVariable)

            values = parVal.pop()
            ifValueTree = values.popleft()
            elseValueTree = values.popleft()
            comparisonValue = analyzeOpComp(parVal)

            if comparisonValue:
                executeConditionStructure(ifValueTree)
                # return executeConditionStructure(ifValueTree)
            elif elseValueTree:
                executeConditionStructure(elseValueTree)
                # return executeConditionStructure(elseValueTree)
            else:
                return

        def analyzeLoop(objectVariable):
            loop, parVal = getTopObjectAndParameter(objectVariable)
            if loop == "while":
                analyzeWhileLoop(parVal)
            elif loop == "for":
                analyzeForLoop(parVal)

        # ***PRINTING HERE INSTEAD OF THNAKE
        def analyzeWhileLoop(parVal):
            loopCondition = parVal.popLeftObject()
            while self.analyze(copy.deepcopy(loopCondition)):
                executeConditionStructure(parVal)

        def analyzeForLoop(parVal):
            loopVar = parVal.popLeftObject().popleft()["value"]
            loopList = parVal.popLeftObject()
            loopList = self.analyze(loopList)
            loopList = simplifyObject(loopList).pop()["value"]

            variableExists = False
            if self.scope.get(loopVar):
                variableExists = True

            while loopList:
                currentVarIteration = loopList.popLeftObject()
                self.scope.add(loopVar, currentVarIteration)
                executeConditionStructure(parVal)

            if not variableExists:
                self.scope.pop(loopVar)

        def executeConditionStructure(parVal):
            parVal = copy.deepcopy(parVal)
            while parVal:
                result = self.analyze(parVal.popLeftObject())
                if result is not None:
                    print result
            return result

        def analyzeAttribFunc(objectVariable):
            attribFunc, parVal = getTopObjectAndParameter(objectVariable)

            functionParameterTree = parVal.popleft()
            functionObjectTree = parVal.pop()

            functionParameter = self.analyze(functionParameterTree)
            functionObject = self.analyze(functionObjectTree)
            return eval(str(functionObject) + "[" + str(functionParameter) + "]")

        typeAnalysis = {
            "arithmetic": analyzeOpComp,
            "comparison": analyzeOpComp,
            "object": analyzeObject,
            "variable": analyzeVariable,
            "conditional": analyzeConditional,
            "loop": analyzeLoop,
            "attribFunc": analyzeAttribFunc,
        }

        result = None
        currentObject = tree.popLeftObject()
        currentType = currentObject[0]["type"]

        if currentType in typeAnalysis:
            return typeAnalysis[currentType](currentObject)