Return Styles: Pseud0ch, Terminal, Valhalla, NES, Geocities, Blue Moon. Entire thread

LISP x Python - Round 93

Name: Anonymous 2011-05-14 19:15

Let me hear you...


Which one

Is

The best

Language?

Name: Anonymous 2011-05-16 6:58


Lisp

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


Python

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)')

Newer Posts
Don't change these.
Name: Email:
Entire Thread Thread List