diff options
author | bnewbold <bnewbold@robocracy.org> | 2016-04-21 03:27:45 -0400 |
---|---|---|
committer | bnewbold <bnewbold@robocracy.org> | 2016-04-21 03:27:45 -0400 |
commit | cf385d4bf9cfcb4b8ee27cdac05cd4b00124b7bf (patch) | |
tree | 3944853364bff2b6a8ac3087254bd04bf21e18ba /python/sexpr.py | |
parent | ba0b2d5a96fa08f9698958527f61f5a5f4efc4de (diff) | |
download | spectrum-cf385d4bf9cfcb4b8ee27cdac05cd4b00124b7bf.tar.gz spectrum-cf385d4bf9cfcb4b8ee27cdac05cd4b00124b7bf.zip |
mvoe implementations into subdirs
Diffstat (limited to 'python/sexpr.py')
-rw-r--r-- | python/sexpr.py | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/python/sexpr.py b/python/sexpr.py new file mode 100644 index 0000000..61bb09c --- /dev/null +++ b/python/sexpr.py @@ -0,0 +1,40 @@ + +def tokenize(s, sep="()", ws=" \t\n"): + L = [] + food = 0 + for i, c in enumerate(s): + if c in sep or c in ws: + if food > 0: + L.append(s[i-food:i]) + if c in sep: + L.append(c) + food = 0 + elif i+1 == len(s): + L.append(s[i-food:]) + else: + food += 1 + return L + +def _parse_tokens(tokens, depth=0): + L = [] + i = 0 + while i < len(tokens): + el = tokens[i] + if el == '(': + expr, skip = _parse_tokens(tokens[i+1:], depth+1) + L.append(expr) + i += skip + 1 + elif el == ')': + assert depth > 0, "Missing open bracket..." + return L, i+1 + else: + L.append(el) + i += 1 + assert depth == 0, "Missing close bracket..." + return L, i + +def parse(s): + tokens = tokenize(s) + expr, size = _parse_tokens(tokens) + return expr[0] + |