from typing import List
import operator


def eval_infix(expr: List[str]) -> str:
    """Evals expr sequentially, just respecting precedence of *(* and *)*.
    Consumes the evaluated tokens in *expr*, including the final *)* if its the 
    last token of the expression
    
    Note: expects *expr* to be in infix notation but reversed, as it uses 
    pop/append to manipulate *expr*"""
    ops = {'+': operator.add, '*': operator.mul}
    while len(expr) >= 1:
        arg1 = expr.pop()
        if arg1 == '(': arg1 = eval_infix(expr)
        if len(expr) == 0: return arg1
        op = expr.pop()
        if op == ')': return arg1
        arg2 = expr.pop()
        if arg2 == '(': arg2 = eval_infix(expr)
        expr.append(str(ops[op](int(arg1), int(arg2))))
    return expr[0]