aboutsummaryrefslogtreecommitdiffstats
path: root/sexpr.py
diff options
context:
space:
mode:
authorbnewbold <bnewbold@robocracy.org>2016-04-18 12:50:50 -0400
committerbnewbold <bnewbold@robocracy.org>2016-04-18 12:50:50 -0400
commit4d5770f0f41ccfc84f3e29701151ea29660539e0 (patch)
tree477f837fc333addd0d9f839b5f1018f16ecde4ca /sexpr.py
parent277854dda63c5f6c4dfb30499e16fd7d9e78c575 (diff)
downloadspectrum-4d5770f0f41ccfc84f3e29701151ea29660539e0.tar.gz
spectrum-4d5770f0f41ccfc84f3e29701151ea29660539e0.zip
commit WIP on python and julia s-expressions
Diffstat (limited to 'sexpr.py')
-rw-r--r--sexpr.py40
1 files changed, 40 insertions, 0 deletions
diff --git a/sexpr.py b/sexpr.py
new file mode 100644
index 0000000..61bb09c
--- /dev/null
+++ b/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]
+