Beispiel #1
0
def andToIf(s_exp):
    if isinstance(s_exp,sexprs.Nil):
        return sexprs.true()
    if isinstance(s_exp,sexprs.Pair):
        if isinstance(s_exp.second,sexprs.Nil):
            return s_exp.first
    return sexprs.Pair(sexprs.Symbol("IF"),sexprs.Pair(s_exp.first,sexprs.Pair(
        sexprs.Pair(sexprs.Symbol("AND"),s_exp.second)
        ,sexprs.Pair(sexprs.false(),sexprs.Nil()))))
Beispiel #2
0
def condToIf (s_exp):
    if isinstance(s_exp,sexprs.Pair):
        if isinstance(s_exp.second, sexprs.Nil):
            if isinstance(s_exp.first.first,sexprs.Symbol)and s_exp.first.first.string=="ELSE":
                return s_exp.first.second.first
            return sexprs.Pair(sexprs.Symbol("IF"), sexprs.Pair(s_exp.first.first, sexprs.Pair(s_exp.first.second.first, sexprs.Nil())))
        return sexprs.Pair(sexprs.Symbol("IF"),sexprs.Pair(s_exp.first.first,sexprs.Pair(s_exp.first.second.first,sexprs.Pair(
            sexprs.Pair(sexprs.Symbol("COND"),s_exp.second)
            ,sexprs.Nil()))))
Beispiel #3
0
def condToIf_Rec(exp):
    test = exp.car.car
    action = exp.car.cdr.car
    if exp.getLength() == 2:
        l = [sexprs.Symbol('IF'), test, action, exp.cdr.car.cdr.car]
        return reader.makePair(l, sexprs.Nil())
    else:
        l = [sexprs.Symbol('IF'), test, action, condToIf_Rec(exp.cdr)]
        return reader.makePair(l, sexprs.Nil())
Beispiel #4
0
def letToYagApplic(s_exp):
    body=s_exp.second.first
    if isinstance(s_exp.first,sexprs.Nil):
        return body
    generatedSymbol=genSym.newGenSym()
    param=[];
    values=[];
    temp=s_exp.first
    while isinstance(temp,sexprs.Pair):
        param.append(temp.first.first)
        values.append(temp.first.second.first)
        temp=temp.second
    s_param=sexprs.Nil()
    for x in reversed (param):
        s_param=sexprs.Pair(x,s_param)
    s_param=sexprs.Pair(generatedSymbol,s_param)
    s_values=[]
    for y in values:
        s_values.append(y)
    firstLambda=sexprs.Pair(
        sexprs.Symbol("LAMBDA"),
        sexprs.Pair(
            s_param,
            sexprs.Pair(
                body,
                sexprs.Nil()
            )
        )
    )
    list_of_lambdas=[]
    for x in s_values:
        list_of_lambdas.append(
            sexprs.Pair(
        sexprs.Symbol("LAMBDA"),
        sexprs.Pair(
            s_param,
            sexprs.Pair(
                x,
                sexprs.Nil(
                )
                )))
        )
    pairedListofLambdas=sexprs.Nil()
    for x in reversed(list_of_lambdas):
        pairedListofLambdas=sexprs.Pair(x,pairedListofLambdas)
    pairedListofLambdas=sexprs.Pair(firstLambda,pairedListofLambdas)

    return sexprs.Pair(
        sexprs.Symbol("YAG"),
            pairedListofLambdas
    )
Beispiel #5
0
def QuoteGen(prefix, name):
    return ps.parser(pc.pcWord(prefix)) \
        .pack(removeCatenStar) \
        .delayed_parser(lambda: pSexpr) \
        .caten() \
        .pack(lambda m: sexprs.Pair(sexprs.Symbol(name), sexprs.Pair(m[1], sexprs.Nil()))) \
        .done()
Beispiel #6
0
 def __init__(self,s_exp):
     if isinstance(s_exp,sexprs.Pair):
         if isinstance(s_exp.first,sexprs.Pair):
             self.var=AbstractSchemeExpr.parse_after_reader(s_exp.first.first)
             rest=sexprs.Pair(s_exp.first.second,s_exp.second)
             rest=sexprs.Pair(sexprs.Symbol('LAMBDA'),rest)
             self.body=AbstractSchemeExpr.parse_after_reader(rest)
         else:
             self.var=AbstractSchemeExpr.parse_after_reader(s_exp.first)
             self.body=AbstractSchemeExpr.parse_after_reader(s_exp.second.first)
Beispiel #7
0
def and_To_If_rec(exp):
    if sexprs.getClass(exp) == 'Nil':
        l = [
            sexprs.Symbol('IF'),
            sexprs.Boolean(True),
            sexprs.Boolean(True),
            sexprs.Boolean(True)
        ]
        return reader.makePair(l, sexprs.Nil())
    if exp.getLength() == 1:
        l = [sexprs.Symbol('IF'), exp.car, exp.car, sexprs.Boolean(False)]
        return reader.makePair(l, sexprs.Nil())
    else:
        l = [
            sexprs.Symbol('IF'), exp.car,
            and_To_If_rec(exp.cdr),
            sexprs.Boolean(False)
        ]
        return reader.makePair(l, sexprs.Nil())
Beispiel #8
0
def letStar_To_Let_recursive(bindings, body):
    if sexprs.getClass(bindings) == 'Nil':
        return body
    else:
        l = [
            sexprs.Symbol('LET'),
            reader.makePair([bindings.car], sexprs.Nil()),
            letStar_To_Let_recursive(bindings.cdr, body)
        ]
        return reader.makePair(l, sexprs.Nil())
Beispiel #9
0
def letrec_To_Yag(exp):
    lambda_variabls, lambda_values = get_let_vars(exp.cdr.car), get_let_vals(
        exp.cdr.car)
    lambda_variabls = sexprs.Pair(gensym(), lambda_variabls)
    body = exp.cdr.cdr.car
    l = [
        reader.makePair([sexprs.Symbol('LAMBDA'), lambda_variabls, body],
                        sexprs.Nil())
    ]

    while sexprs.getClass(lambda_values) != 'Nil':
        lambda_l = [
            sexprs.Symbol('LAMBDA'), lambda_variabls, lambda_values.car
        ]
        l.append(reader.makePair(lambda_l, sexprs.Nil()))
        lambda_values = lambda_values.cdr

    final_l = [sexprs.Symbol('Yag')] + l
    return AbstractSchemeExpr.handleParsed(
        reader.makePair(final_l, sexprs.Nil()))
Beispiel #10
0
def let_To_Application(exp):
    lambde_variabls, lambde_values = get_let_vars(exp.cdr.car), get_let_vals(
        exp.cdr.car)
    lambda_body = exp.cdr.cdr.car
    return AbstractSchemeExpr.handleParsed(
        sexprs.Pair(
            sexprs.Pair(
                sexprs.Symbol('LAMBDA'),
                sexprs.Pair(lambde_variabls,
                            sexprs.Pair(lambda_body, sexprs.Nil()))),
            lambde_values))
Beispiel #11
0
def letStarToApplic(s_exp):
    if isinstance(s_exp, sexprs.Pair) and isinstance(s_exp.second, sexprs.Pair):
        body = s_exp.second.first
        if isinstance(s_exp.first, sexprs.Nil):
            return body
        if isinstance(s_exp.first, sexprs.Pair):
            param = s_exp.first.first.first
            value = s_exp.first.first.second.first
            rest = s_exp.first.second
            return sexprs.Pair(
                                sexprs.Pair(sexprs.Symbol("LAMBDA"), sexprs.Pair(
                                        sexprs.Pair(param, sexprs.Nil())
                                    , sexprs.Pair(
                                        sexprs.Pair(sexprs.Symbol("LET*"), sexprs.Pair(
                                            rest
                                            , sexprs.Pair(
                                            body
                                            , sexprs.Nil())))
                                    , sexprs.Nil())))
                            , sexprs.Pair(
                                value
                            , sexprs.Nil()))
Beispiel #12
0
def makeDefine(exp):
    if sexprs.getClass(exp.cdr.car) != 'Pair':
        symbol = AbstractSchemeExpr.handleParsed(exp.cdr.car)
        value = AbstractSchemeExpr.handleParsed(exp.cdr.cdr.car)
        return Def(symbol, value)
    else:
        symbol = exp.cdr.car.car
        lambda_args = exp.cdr.car.cdr
        lambda_body = exp.cdr.cdr.car
        lambda_components = [sexprs.Symbol('LAMBDA'), lambda_args, lambda_body]

        l = [exp.car, symbol, reader.makePair(lambda_components, sexprs.Nil())]
        return AbstractSchemeExpr.handleParsed(reader.makePair(
            l, sexprs.Nil()))
Beispiel #13
0
def QQ_expend(s_exp):
    if isinstance(s_exp,sexprs.Pair):
        if isinstance(s_exp.first,sexprs.Symbol) and  isinstance(s_exp.second,sexprs.Pair):
            if s_exp.first.string=="unquote":
                return s_exp.second.first
            elif s_exp.first.string=="unquote-splicing":
                raise (Exception("unquote-splicing here makes no sense!"))
        a=s_exp.first
        b=s_exp.second
        if isinstance(a,sexprs.Pair) and isinstance(a.first,sexprs.Symbol) and a.first.string=="unquote-splicing":
            if isinstance(b, sexprs.Nil):
                return a.second.first
            return sexprs.Pair(sexprs.Symbol('APPEND'), sexprs.Pair(a.second.first
                    , sexprs.Pair(QQ_expend(b), sexprs.Nil())))
        elif isinstance(b,sexprs.Pair) and isinstance(b.first,sexprs.Symbol) and b.first.string=="unquote-splicing":
            return sexprs.Pair(sexprs.Symbol('CONS'), sexprs.Pair(QQ_expend(a)
                    , sexprs.Pair(b.second.first, sexprs.Nil())))
        return sexprs.Pair(sexprs.Symbol('CONS'), sexprs.Pair(QQ_expend(a)
                    , sexprs.Pair(QQ_expend(b), sexprs.Nil())))
    elif isinstance(s_exp,sexprs.Vector):
        return sexprs.Pair(sexprs.Symbol("LIST->VECTOR") , sexprs.Pair(QQ_expend(vectorToList(s_exp)),sexprs.Nil()))
    elif isinstance(s_exp,sexprs.Nil) or isinstance(s_exp,sexprs.Symbol):
        return sexprs.Pair(sexprs.Symbol("quote"), sexprs.Pair(s_exp,sexprs.Nil()))
    return s_exp
Beispiel #14
0
def letToApplic(s_exp):
    param=[]
    values=[]
    temp=s_exp.first
    while isinstance(temp,sexprs.Pair):
        param.append(temp.first.first)
        values.append(temp.first.second.first)
        temp=temp.second
    body=s_exp.second.first
    s_param=sexprs.Nil()
    for x in reversed (param):
        s_param=sexprs.Pair(x,s_param)
    s_values=sexprs.Nil()
    for y in reversed(values):
        s_values=sexprs.Pair(y,s_values)
    return sexprs.Pair(
        sexprs.Pair(sexprs.Symbol('LAMBDA'), sexprs.Pair(s_param, sexprs.Pair(body, sexprs.Nil()))),
        s_values
    )
Beispiel #15
0
def quasiquote_To_Quote_rec(exp):
    if isUnquote(exp):
        return exp.cdr.car
    elif isUnquoteSplicing(exp):
        raise IllegalQQuoteLocation()
    elif sexprs.getClass(exp) == 'Pair':
        first = exp.car
        rest = exp.cdr
        if isUnquoteSplicing(first):
            return reader.makePair([
                sexprs.Symbol('APPEND'), first.cdr.car,
                quasiquote_To_Quote_rec(rest)
            ], sexprs.Nil())
        elif isUnquoteSplicing(rest):
            return reader.makePair([
                sexprs.Symbol('CONS'),
                quasiquote_To_Quote_rec(first), rest.cdr.car
            ], sexprs.Nil())
        else:
            return reader.makePair([
                sexprs.Symbol('CONS'),
                quasiquote_To_Quote_rec(first),
                quasiquote_To_Quote_rec(rest)
            ], sexprs.Nil())
    elif sexprs.getClass(exp) == 'Vector':
        l = [
            sexprs.Symbol('LIST->VECTOR'),
            quasiquote_To_Quote_rec(
                reader.makePair([sexprs.Symbol('VECTOR->LIST'), exp],
                                sexprs.Nil()))
        ]
        return reader.makePair(l, sexprs.Nil())
    elif sexprs.getClass(exp) == 'Symbol' or sexprs.getClass(exp) == 'Nil':
        l = [sexprs.Symbol('quote'), exp]
        return reader.makePair(l, sexprs.Nil())
    else:
        return exp
Beispiel #16
0
    .parser(pc.pcChar(';')) \
    .delayed_parser(lambda : pSexpr) \
    .caten() \
    .caten() \
    .done()

pCommentsAndWhitespaces= ps.parser(pWhiteSpace) \
    .parser(pSexprsComment) \
    .parser(pLineComment) \
    .disjs(3) \
    .star() \
    .done()

pSymbol= ps.parser(pc.pcEverythingSymbolStar) \
    .pack(removeCatenStar) \
    .pack(lambda x: sexprs.Symbol(x)) \
    .done()

pString= ps.parser(pc.pcChar('"')) \
    .parser(pc.pcWord("\l")) \
    .parser(pc.pcWord("\"")) \
    .parser(pc.pcEverythingStringStar) \
    .pack(removeCatenStar) \
    .disjs(3) \
    .catenRSpecial() \
    .parser(pc.pcChar('"')) \
    .catenRSpecial() \
    .parser(pc.pcChar('"')) \
    .parser(pc.pcChar('"')) \
    .catenRSpecial() \
    .disj() \
Beispiel #17
0
         .done()

number_p =  ps.parser(frac_p) \
            .parser(int_p) \
            .disj() \
            .done() \

symbol_p = ps.parser(pc.pcRange('a','z')) \
           .parser(pc.pcRange('A','Z')) \
           .parser(pc.pcRange('0','9')) \
           .parser(pc.pcOneOf('!$^*-_=+<>/?')) \
           .disjs(4) \
           .plus() \
           .parser(number_p) \
           .butNot() \
           .pack(lambda m: sexprs.Symbol("".join(m).upper())) \
           .done()
'''
string_p = ps.parser(pc.const(lambda x: x=='"')) \
           .parser(pc.const(lambda x: x=="\\")) \
           .parser(pc.pcOneOf('"nrtfl\\')) \
           .caten() \
           .pack(lambda m: m[0]+"".join(m[1])) \
           .parser(pc.const(lambda x: x!='"')) \
           .disj() \
           .star() \
           .parser(pc.const(lambda x: x=='"')) \
           .catens(3) \
           .pack(lambda m: sexprs.String("".join(m[1]))) \
           .done()
'''
Beispiel #18
0
def gensym():
    global Gensym_count
    ans = 'gen_llokk' + str(Gensym_count)
    Gensym_count += 1
    return sexprs.Symbol(ans)
Beispiel #19
0
        .done()

pLetter = ps.const(lambda ch: 'a'<= ch <='z')\
            .pack(lambda s: chr(ord(s)-32))\
            .const(lambda ch:'A'<= ch <='Z' )\
            .disj()\
            .done()

symbol = ps.parser(pc.const(lambda ch : '<' <= ch <= '?' or ch == '$' or ch == '!'\
                            or ('*' <= ch <= '/' and ch != ',' and ch != '.')\
                            or  '^' <= ch <= '_'))\
           .const(lambda ch : '0'<= ch <='9' )\
           .parser(pLetter)\
           .disjs(3)\
           .plus()\
           .pack(lambda s : classes.Symbol("".join(s)))\
           .done()

pString = ps.word('\"')\
                 .const(lambda ch: ch!='\"')\
                 .star()\
                 .word('\"')\
                 .caten()\
                 .pack(lambda s: "".join(s[0]+s[1]))\
                 .star()\
                 .caten()\
                 .pack(lambda s: (classes.String(s[0][0]+"".join(s[1]))) )\
                 .done()

pNamedChar = ps.wordCI('newline')\
                .wordCI('return')\
Beispiel #20
0
    def create_const_table(s_exp):
        exist=False
        notExist=True
        if isinstance(s_exp,AbstractLambda):
            s_exp.body = Const_table.create_const_table(s_exp.body)

        elif isinstance(s_exp,Def):
            s_exp.var = Const_table.create_const_table(sexprs.Symbol(s_exp.var.Var.string.upper()))
            s_exp.body = Const_table.create_const_table(s_exp.body)

        elif isinstance(s_exp,Or):
            for x in s_exp.param:
                x = Const_table.create_const_table(x)

        elif isinstance(s_exp,Constant):
            s_exp.con = Const_table.create_const_table(s_exp.con)
            s_exp.ref=s_exp.con.ref
        if isinstance(s_exp,sexprs.Void):
            s_exp.ref=1
        elif isinstance(s_exp,sexprs.Nil):
            s_exp.ref=2
        elif isinstance(s_exp,sexprs.true):
            s_exp.ref=3
        elif isinstance(s_exp,sexprs.false):
            s_exp.ref=5
        elif isinstance(s_exp,IfThenElse):
            Const_table.create_const_table(s_exp.Condition)
            Const_table.create_const_table(s_exp.Then)
            Const_table.create_const_table(s_exp.Else)

        elif isinstance(s_exp,Applic):
            Const_table.create_const_table(s_exp.applic)
            for x in s_exp.param:
                Const_table.create_const_table(x)
        elif isinstance(s_exp,VarFree):
            s_exp.Var=Const_table.create_const_table(s_exp.Var)
        elif isinstance (s_exp,sexprs.Char):
            for x in range(1,len(Const_table.const_table)):
                if Const_table.const_table[x] == 'T_CHAR':
                    if Const_table.const_table[x+1] == s_exp.char:
                        notExist=False
                        s_exp.ref=x
            if notExist:
                s_exp.ref=Const_table.const_table[0]
                Const_table.const_table.append('T_CHAR')
                if s_exp.char == 'newline':
                    Const_table.const_table.append(10)
                elif s_exp.char == 'page':
                    Const_table.const_table.append(12)
                elif s_exp.char == 'return':
                    Const_table.const_table.append(13)
                elif s_exp.char == 'tab':
                    Const_table.const_table.append(9)
                elif s_exp.char == 'lambda':
                    Const_table.const_table.append(0x03bb)
                else:
                    Const_table.const_table.append(ord(s_exp.char))
                Const_table.const_table[0]+=2

        elif isinstance (s_exp,sexprs.Symbol):
            temp = sexprs.String(s_exp.string);
            temp= Const_table.create_const_table(temp);
            for x in range(1,len(Const_table.const_table)):
                if Const_table.const_table[x] == 'T_SYMBOL':
                    if Const_table.const_table[x+1] == temp.ref:
                        notExist=False
                        s_exp.ref=x
            if notExist:
                s_exp.ref=Const_table.const_table[0]
                Const_table.const_table.append('T_SYMBOL')
                Const_table.const_table.append(temp.ref)
                Const_table.const_table[0]+=2

        elif isinstance (s_exp,sexprs.String):
            for x in range(1,len(Const_table.const_table)):
                if Const_table.const_table[x] == 'T_STRING':
                    temp_symbol=""
                    for i in range(1,int(Const_table.const_table[x+1]+1)):
                        temp_symbol+=chr(Const_table.const_table[x+1+i])
                    if temp_symbol == s_exp.string:
                        notExist=False
                        s_exp.ref=x
            if notExist:
                s_exp.ref=Const_table.const_table[0]
                Const_table.const_table.append('T_STRING')
                Const_table.const_table.append(s_exp.length)
                Const_table.const_table[0]+=2+s_exp.length
                for x in range (0,s_exp.length):
                    Const_table.const_table.append(ord(s_exp.string[x]))


        elif isinstance(s_exp,sexprs.Integer):
            for x in range(1,len(Const_table.const_table)):
                if Const_table.const_table[x] == 'T_INTEGER':
                    if Const_table.const_table[x+1] == s_exp.number:
                        exist = True
                        s_exp.ref=x
            if not exist:
                s_exp.ref=Const_table.const_table[0]
                Const_table.const_table.append('T_INTEGER')
                Const_table.const_table.append(s_exp.number)
                Const_table.const_table[0]+=2

        elif isinstance (s_exp,sexprs.Fraction):
            for x in range(1,len(Const_table.const_table)):
                if Const_table.const_table[x] == 'T_FRACTION':
                    if Const_table.const_table[x+1] == s_exp.nume:
                        if Const_table.const_table[x+2] == s_exp.deno:
                            exist = True
                            s_exp.ref=x
            if not exist:
                s_exp.ref=Const_table.const_table[0]
                Const_table.const_table.append('T_FRACTION')
                Const_table.const_table.append(s_exp.nume)
                Const_table.const_table.append(s_exp.deno)
                Const_table.const_table[0]+=3

        elif isinstance(s_exp,sexprs.Pair):
                s_exp.second = Const_table.create_const_table(s_exp.second)
                s_exp.first = Const_table.create_const_table(s_exp.first)

                for x in range(1,len(Const_table.const_table)):
                    if Const_table.const_table[x] == 'T_PAIR':
                        if Const_table.const_table[x+1] == s_exp.first.ref:
                            if Const_table.const_table[x+2] == s_exp.second.ref:
                                exist = True
                                s_exp.ref=x
                if not exist:
                    s_exp.ref=Const_table.const_table[0]
                    Const_table.const_table.append('T_PAIR')
                    Const_table.const_table.append(s_exp.first.ref)
                    Const_table.const_table.append(s_exp.second.ref)
                    Const_table.const_table[0] += 3

        elif isinstance(s_exp,sexprs.Vector):
            for x in range (0,len(s_exp.elements)):
                s_exp.elements[x]=Const_table.create_const_table(s_exp.elements[x])
            for x in range(1,len(Const_table.const_table)):
                    if Const_table.const_table[x] == 'T_VECTOR':
                        if Const_table.const_table[x+1] == s_exp.length:
                            all=True
                            for y in range (0,len(s_exp.elements)):
                                if Const_table.const_table[x+y+2] != s_exp.elements[y].ref:
                                    all=False
                            if all:
                                exist = True
                                s_exp.ref=x
            if not exist:
                Const_table.const_table.append('T_VECTOR')
                Const_table.const_table.append(s_exp.length)
                s_exp.ref=Const_table.const_table[0]
                start_pos=Const_table.const_table[0]+2
                Const_table.const_table[0] += 2 + s_exp.length
                for i in range (0,s_exp.length):
                    Const_table.const_table.append(0)
                i=0;
                for x in s_exp.elements:
                    temp= Const_table.create_const_table(x)
                    Const_table.const_table[start_pos+i]=(temp.ref)
                    i=i+1


        return s_exp
Beispiel #21
0
 def newGenSym():
     res="@"+'G'+str(genSym.count)
     genSym.count=genSym.count+1
     return sexprs.Symbol(res)