Example #1
0
def definition(gen):
    box = gen.parse(assign).get_list()

    name = box[0].get_token().value
    args = [a.get_ast() for a in box[1].get_list()]

    body = gen.parse(chain).get_ast()

    return ASTBox(Definition(sym(name), args, body))
Example #2
0
def tag_pattern(gen):
    tag = gen.parse(TAGGED).get_token().value
    args = gen.parse(pattern.many()).get_list()
    pats = [p.get_ast() for p in args]
    return ASTBox(TagPat(sym(tag), pats))
Example #3
0
expr_element = alt(chain, definition)

@generate
def expr(gen):
    box = gen.parse(alt(definition, chain).many())
    elements = [a.get_ast() for a in box.get_list()]

    return ASTBox(Sequence(elements))

@generate('pattern')
def pattern(gen):
    return gen.parse(alt(var_pattern, tag_pattern, named_pattern, paren_pattern))

paren_pattern = LPAREN.then(pattern).skip(RPAREN)
var_pattern = NAME.map(lambda s: ASTBox(VarPat(sym(s.get_token().value))))

@generate
def tag_pattern(gen):
    tag = gen.parse(TAGGED).get_token().value
    args = gen.parse(pattern.many()).get_list()
    pats = [p.get_ast() for p in args]
    return ASTBox(TagPat(sym(tag), pats))

named_pattern = CHECK.map(lambda s: ASTBox(NamedPat(sym(s.get_token().value))))


var = NAME.map(lambda b: ASTBox(Var(sym(b.get_token().value))))
number = INT.map(lambda b: ASTBox(Int(int(b.get_token().value or u''))))
paren = LPAREN.then(expr).skip(RPAREN)
autovar = DOLLAR.map(lambda _: ASTBox(Autovar()))
Example #4
0
def tag(name, values):
    return Tagged(sym(name), values)
Example #5
0
        assert False, 'abstract'

    def dump_nested(self):
        return self.dump()

    def matches_tag(self, tag, arity):
        return False

    def matches_type(self, name):
        return False

    def is_list(self):
        return self.matches_tag(nil_sym, 0) or self.matches_tag(cons_sym, 2)


int_sym = sym(u'int')


class Int(Value):
    def __init__(self, value):
        self.value = value

    def matches_type(self, name):
        return name == int_sym

    def dump(self):
        return unicode(str(self.value))


string_sym = sym(u'str')
Example #6
0
        else:
            return u'(*Token %s %s)' % (tok_name, self.value.value)

class Func(Callable):
    def __init__(self, bytecode, arity):
        self._arity = arity
        self.bytecode = bytecode

    def arity(self):
        return self._arity

    def invoke(self, frame, argv):
        frame = frame.rt.make_frame(self.bytecode, self.arity, argv)
        frame.rt.push(self.bytecode, frame)

cons_sym = sym(u'cons')
nil_sym = sym(u'nil')

class Tagged(Callable):
    def __init__(self, symbol, args):
        self.symbol = symbol
        self.args = args

    def dump(self):
        if self.is_list():
            return self.inspect_cons_list()

        if len(self.args) == 0:
            return u'.%s' % self.symbol.name
        else:
            args = u' '.join([a.dump_nested() for a in self.args])