def term(tk):
    s1 = factor(tk)
    token_num, token_value = current().token_num, current().token_value

    value = s1

    while token_value == "*" or token_value == "/":
        next(tk)

        s2 = term(tk)
        if token_value == "*":
            value = BinaryOpNode(2, value, s2)
        else:
            value = BinaryOpNode(3, value, s2)
        token_num, token_value = current().token_num, current().token_value

    return value
def expr(tk):
    s1 = term(tk)
    token_num, token_value = current().token_num, current().token_value

    value = s1

    while token_value == "+" or token_value == "-":
        next(tk)

        s2 = term(tk)
        if token_value == "+":
            value = BinaryOpNode(0, value, s2)
        else:
            value = BinaryOpNode(1, value, s2)
        token_num, token_value = current().token_num, current().token_value

    return value
예제 #3
0
def term(tk):
    s1 = factor(tk)
    token_num, token_value = current().token_num, current().token_value

    value = s1

    while token_value == "*" or token_value == "/":
        next(tk)

        s2 = term(tk)
        if token_value == "*":
            value = MulNode(value, s2)
        else:
            value = DivNode(value, s2)
        token_num, token_value = current().token_num, current().token_value

    return value
예제 #4
0
def expr(tk):
    s1 = term(tk)
    token_num, token_value = current().token_num, current().token_value

    value = s1

    while token_value == "+" or token_value == "-":
        next(tk)

        s2 = term(tk)
        if token_value == "+":
            value = AddNode(value, s2)
        else:
            value = SubNode(value, s2)
        token_num, token_value = current().token_num, current().token_value

    return value
def factor(tk):
    if current().token_num == tokenize.NUMBER:
        value = current().token_value
        next(tk)
        return ConstNode(int(value))
    elif current().token_value == "(":
        next(tk)
        f = expr(tk)
        if current().token_value != ")":
            print("parse error! value = %s" % current().token_value)
        value = f
        next(tk)
        return value
            value = BinaryOpNode(2, value, s2)
        else:
            value = BinaryOpNode(3, value, s2)
        token_num, token_value = current().token_num, current().token_value

    return value


def factor(tk):
    if current().token_num == tokenize.NUMBER:
        value = current().token_value
        next(tk)
        return ConstNode(int(value))
    elif current().token_value == "(":
        next(tk)
        f = expr(tk)
        if current().token_value != ")":
            print("parse error! value = %s" % current().token_value)
        value = f
        next(tk)
        return value


if __name__ == '__main__':
    with open(sys.argv[1], "r") as f:
        tk = tokenize.generate_tokens(f.readline)
        next(tk)
        vs = Visitor()
        AST = expr(tk)
        print("FINAL VALUE %d" % vs.visit(AST))