Redivider/Underload Interpreter
Jump to navigation
Jump to search
An Underload interpreter written in Redivider, by User:MizardX
Code
main: run("").
run(stack):
{ /~/;
fst: head[stack];
snd: next[stack];
stack: rest[stack];
stack: push(fst)[stack];
stack: push(snd)[stack];
run(stack) }
| { /:/;
fst: head[stack];
run(push(fst)[stack]) }
| { /!/;
run(tail[stack]) }
| { /\*/;
fst: head[stack];
snd: next[stack];
stack: rest[stack];
run(push(fst + snd)[stack]) }
| { /\(/;
value: content;
/\)/;
run(push(value)[stack]) }
| { /a/;
fst: head[stack];
rest: tail[stack];
run(push("(" + fst + ")")[stack]) }
| { /[\^]/;
fst: head[stack];
rest: tail[stack];
run(rest)[fst + /.*/] }
| { /S/;
fst: head[stack];
rest: tail[stack];
fst + run(rest) }
#| { invalid: /.+/;
# "\nInvalid command: \"" + invalid + "\"" }
| "".
paren: /\(/ + content + /\)/.
content:
/[^()]+/ + content
| paren + content
| "".
head: { item: /.*?(?=<>)/; /<>/; item }.
tail: { head; /.*/ }.
next: { head; head }.
rest: { head; head; /.*/ }.
push(value): value + "<>" + /.*/.