/*
 * expr ::= term | term + expr
 * term ::= factor | factor * term
 * factor ::= (expr) | num
 * num ::= 0..9
 */
var s = "((4+5)*3+2)*8";
var i = 0;
function gettoken () {
    return s[i++];
}
function tokenback () {
    i--;
}
function expr () {
    var x;
    var y = 0;
    x = term ();
    if (gettoken () == '+')
        y = expr ();
    else
        tokenback ();
return x+y;
}
function term () {
    var x;
    var y = 1;
    x = factor ();
    if (gettoken () == '*')
        y = term ();
    else
        tokenback ();
return x*y;
}
function factor () {
    var s = gettoken ();
    var x = parseInt (s);
    if (s == '(') {
        x = expr ();
        if (gettoken () != ')')
            console.log ("Error");
    }
    else if ((x >= 0) \&\& (x <= 9));
    else
        console.log ("Error");
return x;
}
console.log(expr());
console.log(((4+5)*3+2)*8);
Muss ich noch dran arbeiten
# expr ::= term | term + expr
# term ::= factor | factor * term
# factor ::= (expr) | num
s="((4+5)*3+2)*8"
i=0
def gettoken ():
    global i
    j=i
    print(s[i])
    if i < len(s)-1:
        i=i+1
        return s[j]
    else:
        return 'e'
def tokenback ():
    global i
    i = i-1
def expr ():
    y = 0
    x = term ()
    p = gettoken ()
    if p == '+':
        y = expr ()
    elif p == 'e':
        return x
    else:
        tokenback ()
    return x+y
def term ():
    y = 1
    x = factor ()
    if x == -1:
        return 1
    p = gettoken ()
    if p == '*':
        y = term ()
    elif p == 'e':
        return x
    else:
        tokenback ()
    return x*y
def factor ():
    p = gettoken ()
    if p.isdigit():
        x = int(p)
    elif p == '(':
        x = expr ()
        if gettoken () != ')':
            print ("error - Bracket not closed");
            exit ()
    elif p == 'e':
        return -1
    else:
        print ("error - invalid character")
        exit ()
    return x
print(expr())