Example #1
0
def _logical(op):
    return lexeme(pc.char('(').skip(
                  lexeme(string(op.call_name)).skip(
                  many_list(expr).bind(lambda exprs:
                  pc.char(')').skip(
                  inject(op(*exprs)))))))
Example #2
0
fixnum = concat(optional(oneOf('+-')).bind(lambda sign: inject(sign or '')),
                 choice(zero, concat(positive_digit, many(digit)))).bind(lambda i:
                 inject(Fixnum(int(i))))\
    .with_name('fixnum')

bool = pc.char('#').skip(
       oneOf('tf').bind(lambda b:
       inject(Bool(b == 't'))))\
    .with_name('bool')

extended_alph_char = choice(letter, oneOf('+-.*/<=>!?:$%_&~^'))


char = string('#\\').skip(
    letter.bind(lambda c:
                inject(Char(c)))) \
    .with_name('char')

nil = string('()').skip(
    pc.inject(empty_list)).with_name('nil')

immediate = choice(fixnum, char, bool, nil).with_name('immediate')

class _expr(pc.Parser):
    name = '_expr'

    def parse(self,s):
        return pc.choice(immediate, primitive, conditional, logical).parse(s)

expr = _expr().drop_whitespace().with_name('expr')