Name: Anonymous 2011-05-14 19:15
Let me hear you...
Which one
Is
The best
Language?
Which one
Is
The best
Language?
digit X:{\0;\1;\2;\3;\4;\5;\6;\7;\8;\9} -> X,asInt-(\0),asInt
number [@Xs] -> {N [X:!digit @Xs] -> r 10N+X Xs; N [] -> N} 0 Xs
op [X:{\+; \-; \*; \/}]->X,asSym
term [\( A:@expr \)]->[A]; [A:@number]->A
expr [A:@term O:@op B:@expr]->[O A B]; [A:@term]->A
parse X -> strip \Space X,asList | expr
def getExpr(ss):
global curr_tok,curr_val,s,curr_err
def getToken():
global curr_tok,curr_val,s,curr_err
s=s.lstrip()
if s=='':
#curr_tok='end'
return
c=s[0]
j=1
if c=='+':
curr_tok='plus'
elif c=='-':
curr_tok='minus'
elif c=='*':
curr_tok='mul'
elif c=='/':
curr_tok='div'
elif c=='(':
curr_tok='lp'
elif c==')':
curr_tok='rp'
elif s[0].isdigit():
for j in range(len(s)):
if not (s[j].isdigit() or s[j]=='.'):# or s[j].lower()=='e' or s[j]=='+' or s[j]=='-'):
break
curr_val=float(s[:j])
curr_tok='num'
else:
#curr_tok='err'
curr_err=(1,'bad token')
j=0
s=s[j:]
def Expr1():
global curr_tok,curr_val,s,curr_err
left=Expr2()
while 1:
if curr_tok=='plus':
getToken()
left+=Expr2()
elif curr_tok=='minus':
getToken()
left-=Expr2()
else:
return left
def Expr2():
global curr_tok,curr_val,s,curr_err
left=Expr3()
while 1:
if curr_tok=='mul':
getToken()
left*=Expr3()
elif curr_tok=='div':
getToken()
d=Expr3()
if d==0:
curr_err=(1,'division by zero')
return 1
left/=d
else:
return left
def Expr3():
global curr_tok,curr_val,s,curr_err
if curr_tok=='num':
d=curr_val
getToken()
#d=curr_val
return d
elif curr_tok=='minus':
getToken()
return -Expr3()
elif curr_tok=='lp':
getToken()
d=Expr1()
if curr_tok!='rp':
curr_err=(1,'no right parenthesis')
return 1
getToken()
return d
elif curr_tok=='end':
return 1
else:
curr_err=(1,'must by something')
return 1
curr_err=(0,'')
s=ss
getToken()
return (Expr1(),curr_err[0],curr_err[1])
print eval('2 + 4 - 5 * (6/2)')
print getExpr('2 + 4 - 5 * (6/2)')