Last active
May 8, 2022 21:03
-
-
Save lhorie/3095cf62023b74d27fc9 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var readtable = { | |
"(": form, | |
" ": space, "\t": space, "\n": space, "\r": space, | |
} | |
var white = " \t\n\r" | |
var atomEnd = " \t\n\r);" | |
var formEnd = ")" | |
var escape = "\\" | |
function parse(s) { | |
s.marker = s.cursor | |
return (readtable[s.ch] || atom)(s) | |
} | |
function next(s) {s.ch = s.code.charAt(++s.cursor)} | |
function token(s) {return s.code.slice(s.marker, s.cursor)} | |
function is(set, s) {return set.indexOf(s.ch) > -1} | |
function form(s) { | |
var list = [] | |
next(s) | |
while (!is(formEnd, s)) { | |
var item = parse(s) | |
if (item) list.push(item) | |
} | |
next(s) | |
return list | |
} | |
function space(s) { | |
next(s) | |
while (is(white, s)) next(s) | |
} | |
function atom(s) { | |
do {ch(s)} while (!is(atomEnd, s) && !(s.ch in readtable)) | |
return token(s) | |
} | |
function ch(s) { | |
if (is(escape, s)) next(s) | |
next(s) | |
} | |
function p(s) { | |
return parse({cursor: 0, marker: 0, ch: "(", code: "(program " + s + ")"}) | |
} |
yeah maybe I should clean up the code and put it up in a repo when I get some time. I was mostly just toying w/ this code, but it's grown quite a bit since I posted this gist and it's not so toy-ish anymore.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Your
unary()
function is broken for the increment/decrement expressions. The correct version is below:Throw this into a new repo. It would make it easier for you and those of us with suggestions.
Idea: try adding this function and converting all your nodes to use this. It'll simplify things a little and make things look nice. (this style look familiar? 😉)
Here's what the result would look like (bug fix incorporated):