Ejemplo n.º 1
0
def parseFactor():
    global count
    global input_tokens

    if ((input_tokens[count] in numbers)
            or (input_tokens[count] in identifiers)):
        try:
            node1 = TreeNode(input_tokens[count])
            return node1
            # return tokens[count]
        finally:
            count = count + 1
    elif (input_tokens[count] == "("):

        bracketTree = TreeNode("()")

        if (input_tokens[count + 1] == "-"):
            count = count + 1

            unaryTree = TreeNode(input_tokens[count])
            count = count + 1
            node4 = TreeNode(input_tokens[count])
            node3 = TreeNode("0")
            unaryTree.addChild(node3)
            unaryTree.addChild(node4)

            count = count + 1
            # print(unaryTree)
            bracketTree.addChild(unaryTree)

            if (input_tokens[count] == ")"):
                count = count + 1
                print(bracketTree)
                return bracketTree
            else:
                print("Expected \')\' but got", tokens[count])
                sys.exit()

        else:
            count = count + 1

            node2 = parseSubtraction()
            bracketTree.addChild(node2)
            # num1 = parseSubtraction()

            if (input_tokens[count] == ")"):
                count = count + 1
                return bracketTree
            else:
                print("Expected \')\' but got", tokens[count])
                sys.exit()

    else:
        print("Expected number but got ", tokens[count])
        sys.exit()
Ejemplo n.º 2
0
def parseSubtraction():
    global count
    global input_tokens

    # num1 = parseFactor()

    node1 = parseAddition()
    subtractTree = TreeNode("-")

    subtractTree.addChild(node1)

    if (count == len(input_tokens)):

        # return num1
        return subtractTree
    if (input_tokens[count] == "-"):
        count = count + 1
        node2 = parseAddition()
        subtractTree.addChild(node2)

        if (count == len(input_tokens)):
            return subtractTree

    while (input_tokens[count] == "-"):
        tree2 = TreeNode(input_tokens[count])

        count = count + 1

        node3 = parseAddition()
        tree2.addChild(node3)
        subtractTree.addChild(tree2)

        # num2 = parseFactor()
        # num1 = float(num1)/float(num2)

        if (count == len(input_tokens)):

            # return num1
            return subtractTree

    # return num1
    return subtractTree
Ejemplo n.º 3
0
def parseAddition():
    global count
    global input_tokens

    # num1 = parseFactor()

    node1 = parseMultiplication()
    addTree = TreeNode("+")

    addTree.addChild(node1)

    if (count == len(input_tokens)):

        # return num1
        return addTree
    if (input_tokens[count] == "+"):
        count = count + 1
        node2 = parseMultiplication()
        addTree.addChild(node2)

        if (count == len(tokens)):
            return addTree
    while (input_tokens[count] == "+"):
        tree2 = TreeNode(input_tokens[count])

        count = count + 1

        node3 = parseMultiplication()
        tree2.addChild(node3)
        addTree.addChild(tree2)

        # num2 = parseFactor()
        # num1 = float(num1)/float(num2)

        if (count == len(input_tokens)):

            # return num1
            return addTree

    # return num1
    return addTree
Ejemplo n.º 4
0
def parseDivision():
    global count
    global input_tokens

    # num1 = parseFactor()

    node1 = parseFactor()
    divTree = TreeNode("/")

    divTree.addChild(node1)

    if (count == len(input_tokens)):

        # return num1
        return divTree
    if (input_tokens[count] == "/"):
        count = count + 1
        node2 = parseFactor()
        divTree.addChild(node2)

        if (count == len(input_tokens)):
            return divTree
    while (input_tokens[count] == "/"):
        tree2 = TreeNode(input_tokens[count])

        count = count + 1

        node3 = parseFactor()
        tree2.addChild(node3)
        divTree.addChild(tree2)

        # num2 = parseFactor()
        # num1 = float(num1)/float(num2)

        if (count == len(input_tokens)):

            # return num1
            return divTree

    # return num1
    return divTree
Ejemplo n.º 5
0
def parsePuts():
    global count
    global input_tokens

    putsTree = TreeNode("<puts>")

    if (count == len(input_tokens)):
        return putsTree

    elif (input_tokens[count] == "puts"):

        node1 = TreeNode(input_tokens[count])
        putsTree.addChild(node1)

        count = count + 1

        node2 = parseOpeningBracket()
        putsTree.addChild(node2)

        if (input_tokens[count] in identifiers
                or input_tokens[count] in numbers):

            node3 = TreeNode(input_tokens[count])
            putsTree.addChild(node3)

            count = count + 1

            node4 = parseClosingBracket()
            putsTree.addChild(node4)

            return putsTree

        else:
            print("Expected number or identifier in  \'puts\' but got ",
                  input_tokens[count])
            sys.exit()
Ejemplo n.º 6
0
def parseRelational():
    global count
    global input_tokens

    relationalTree = TreeNode("<relational>")

    if (count == len(input_tokens)):
        return relationalTree

    elif ((input_tokens[count] in identifiers)
          or (input_tokens[count] in numbers)):
        node1 = TreeNode(input_tokens[count])
        relationalTree.addChild(node1)

        count = count + 1

        if (input_tokens[count] in relationalOperators):
            node2 = TreeNode(input_tokens[count])
            relationalTree.addChild(node2)

            count = count + 1

            if ((input_tokens[count] in identifiers)
                    or (input_tokens[count] in numbers)):
                node3 = TreeNode(input_tokens[count])
                relationalTree.addChild(node3)

                count = count + 1
                return relationalTree

            else:
                print("Expected number or identifier but got ",
                      input_tokens[count])
                sys.exit()

        else:
            print("Expected a relational operator but got ",
                  input_tokens[count])
            sys.exit()

    else:
        print("Expected number or identifier before relational but got ",
              input_tokens[count])
        sys.exit()
Ejemplo n.º 7
0
        elif nodes[i][1] == root.gfv():
            root.addChild(
                add_nodes(TreeNode(nodes[i], 1), nodes[0:i] + nodes[i + 1:]))

    return root


f = open("Day24DB")
cm = []

for l in f.readlines():
    t = l.split('/')
    cm.append((int(t[0]), int(t[1]), 0))

cm = sorted(cm, key=sum, reverse=True)
begs = filter(lambda x: x[0] == 0 or x[1] == 0, cm)
cm = filter(lambda x: not (x[0] == 0 or x[1] == 0), cm)
rts = map(lambda x: TreeNode(x, zdir(x)), begs)
t = TreeNode((0, 0), 2)

for root in rts:
    t.addChild(
        add_nodes(
            root, filter(lambda x: not (x[0] == root.l and x[1] == root.r),
                         cm)))

print "Looking for max"
print t.gwgh()
print t.glen()
print t.glnw()
Ejemplo n.º 8
0
def parseMain():
    global count
    global input_tokens

    mainNode = TreeNode("<main>")

    if (input_tokens[count] == "main"):
        node1 = TreeNode(input_tokens[count])
        mainNode.addChild(node1)

        count = count + 1

        node2 = parseOpeningBracket()
        mainNode.addChild(node2)

        node3 = parseClosingBracket()
        mainNode.addChild(node3)

        node4 = parseOpeningBrace()
        mainNode.addChild(node4)

        node5 = parseStatements()
        mainNode.addChild(node5)

        node6 = parseClosingBrace()
        mainNode.addChild(node6)

        if (count == len(input_tokens)):
            return mainNode
        elif (input_tokens[count]):
            print("Additional tokens detected at", input_tokens[count])
            sys.exit()

        return mainNode

    else:
        print("Expected main but got ", input_tokens[count])
        sys.exit()
Ejemplo n.º 9
0
def parseAssignment():
    global count
    global input_tokens

    assignmentTree = TreeNode("<assignment>")

    if (count == len(input_tokens)):
        return assignmentTree
    elif (input_tokens[count] == "int" or input_tokens[count] == "float"
          or input_tokens[count] == "double"):
        node1 = TreeNode(input_tokens[count])
        assignmentTree.addChild(node1)

        count = count + 1

        if (input_tokens[count] in identifiers):
            node2 = TreeNode(input_tokens[count])
            assignmentTree.addChild(node2)

            count = count + 1

            if (input_tokens[count] == "="):
                node3 = TreeNode(input_tokens[count])
                assignmentTree.addChild(node3)

                count = count + 1

                node4 = parseSubtraction()
                assignmentTree.addChild(node4)
                return assignmentTree

                # if((input_tokens[count] in numbers or input_tokens[count] in identifiers)):
                #     if(input_tokens[count+1] in arithmeticOperators):
                #         node5 = parseSubtraction()
                #         assignmentTree.addChild(node5)
                #         return assignmentTree
                #     else:
                #         if((input_tokens[count] in numbers or input_tokens[count] in identifiers)):
                #             node4 = TreeNode(input_tokens[count])
                #             assignmentTree.addChild(node4)

                #             count = count + 1
                #             return assignmentTree
                #         else:
                #             print("Expected positive integer,decimal or arithmetic expression  but got ",input_tokens[count])

                # # elif(parseArithmetic()==True):
                #     # return

                # else:
                #     print("Expected positive integer,decimal or arithmetic expression  but got ",input_tokens[count])

            else:
                print("Expected \'=\'  but got ", input_tokens[count])
                sys.exit()

        else:
            print("Expected identifier but got ", input_tokens[count])
            sys.exit()

    elif (input_tokens[count] in identifiers):
        node6 = TreeNode(input_tokens[count])
        assignmentTree.addChild(node6)

        count = count + 1
        if (input_tokens[count] == "="):
            node7 = TreeNode(input_tokens[count])
            assignmentTree.addChild(node7)

            count = count + 1
            node8 = parseSubtraction()
            assignmentTree.addChild(node8)
            return assignmentTree
            # if((input_tokens[count] in numbers or input_tokens[count] in identifiers)):
            #         if(input_tokens[count+1] in arithmeticOperators):
            #             node8 = parseSubtraction()
            #             assignmentTree.addChild(node8)
            #             return assignmentTree
            #         else:
            #             if((input_tokens[count] in numbers or input_tokens[count] in identifiers)):
            #                 node9 = TreeNode(input_tokens[count])
            #                 assignmentTree.addChild(node9)

            #                 count = count + 1
            #                 return assignmentTree
            #             else:
            #                 print("Expected positive integer,decimal or arithmetic expression  but got ",input_tokens[count])

        else:
            print("Expected \'=\'  but got ", input_tokens[count])
            sys.exit()

    else:
        print(
            "Expected \'int\' or \'float\' or \'double\' or identifier but got ",
            input_tokens[count])
        sys.exit()
Ejemplo n.º 10
0
def parseWhileStatements():
    global count
    global input_tokens

    whileStatement = TreeNode("<while-statements>")

    if (count == len(input_tokens)):
        return TreeNode(" ")
    while (input_tokens[count] == "int" or input_tokens[count] == "float"
           or input_tokens[count] == "double" or input_tokens[count] == "while"
           or input_tokens[count] == "puts"
           or input_tokens[count] in identifiers):

        if (input_tokens[count] == "int" or input_tokens[count] == "float"
                or input_tokens[count] == "double"
                or input_tokens[count] in identifiers):
            try:
                node1 = parseAssignment()
            # whileStatement.addChild(node1)

            # print(repr(TreeNode("while-statements").addChild(node1)))
            # return (TreeNode("<while-statements").addChild(node1))
            except:
                print("Syntax error when assigning near ", input_tokens[count])
                sys.exit()

            finally:
                whileStatement.addChild(node1)
                # parseWhileStatements()

        elif (input_tokens[count] == "while"):
            node2 = TreeNode(" ")
            try:
                node2 = parseWhile()
            # whileStatement.addChild(node2)

            # print(repr(TreeNode("while-statements").addChild(node2)))
            # return (TreeNode("<while-statements>").addChild(node2))
            except:
                print("Syntax error in while loop near", input_tokens[count])
                sys.exit()
            finally:
                whileStatement.addChild(node2)
                # parseWhileStatements()

        elif (input_tokens[count] == "puts"):
            node3 = TreeNode(" ")
            try:
                node3 = parsePuts()
            # whileStatement.addChild(node3)

            # print(repr((TreeNode("while-statements").addChild(node3))))
            # return (TreeNode("while-statements").addChild(node3))
            # whileStatement.addChild(node3)

            except:
                print("Syntax error in puts statement near",
                      input_tokens[count])
                sys.exit()

            finally:
                whileStatement.addChild(node3)
                # parseWhileStatements()

        elif (input_tokens[count] == "}"):
            return TreeNode(" ")
        else:
            print("Syntax error.Expected a valid statement near ",
                  input_tokens[count])
            sys.exit()

    return whileStatement
Ejemplo n.º 11
0
def parseWhile():
    global count

    global input_tokens

    whileTree = TreeNode("<while>")

    if (count == len(input_tokens)):
        return whileTree

    elif (input_tokens[count] == "while"):

        node1 = TreeNode(input_tokens[count])
        whileTree.addChild(node1)

        count = count + 1

        node2 = parseOpeningBracket()
        whileTree.addChild(node2)

        node3 = parseRelational()
        whileTree.addChild(node3)

        node4 = parseClosingBracket()
        whileTree.addChild(node4)

        node5 = parseOpeningBrace()
        whileTree.addChild(node5)

        node6 = parseWhileStatements()
        whileTree.addChild(node6)
        # print(repr(node6))

        node7 = parseClosingBrace()
        whileTree.addChild(node7)

        return whileTree