Skip to content

Instantly share code, notes, and snippets.

@pib
Created November 23, 2009 07:57

Revisions

  1. pib created this gist Nov 23, 2009.
    38 changes: 38 additions & 0 deletions sexp.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,38 @@
    from string import whitespace

    atom_end = set('()"\'') | set(whitespace)

    def parse(sexp):
    stack, i, length = [[]], 0, len(sexp)
    while i < length:
    c = sexp[i]

    print c, stack
    reading = type(stack[-1])
    if reading == list:
    if c == '(': stack.append([])
    elif c == ')':
    stack[-2].append(stack.pop())
    if stack[-1][0] == ('quote',): stack[-2].append(stack.pop())
    elif c == '"': stack.append('')
    elif c == "'": stack.append([('quote',)])
    elif c in whitespace: pass
    else: stack.append((c,))
    elif reading == str:
    if c == '"':
    stack[-2].append(stack.pop())
    if stack[-1][0] == ('quote',): stack[-2].append(stack.pop())
    elif c == '\\':
    i += 1
    stack[-1] += sexp[i]
    else: stack[-1] += c
    elif reading == tuple:
    if c in atom_end:
    atom = stack.pop()
    if atom[0][0].isdigit(): stack[-1].append(eval(atom[0]))
    else: stack[-1].append(atom)
    if stack[-1][0] == ('quote',): stack[-2].append(stack.pop())
    continue
    else: stack[-1] = ((stack[-1][0] + c),)
    i += 1
    return stack.pop()