capitalex revised this gist 6 months ago. Go to revision
1 file changed, 153 insertions
hello-world.nils.jets.nv(file created)
| @@ -0,0 +1,153 @@ | |||
| 1 | + | |:: documentation for NILS Form| | |
| 2 | + | :@doc string: | |
| 3 | + | "Nova In-Language Static Form is a possible structure for lowering | |
| 4 | + | Nova code into a bytecode language describable in Nova. This is not | |
| 5 | + | intended to be written by hand." | |
| 6 | + | ||
| 7 | + | |:: match $stack $arity :failed:?| | |
| 8 | + | |:: match $stack $symbol| | |
| 9 | + | :@jet: | |
| 10 | + | " | |
| 11 | + | local s = stacks[$stack] | |
| 12 | + | local s_top = s.n | |
| 13 | + | local tuple = s[s_top] | |
| 14 | + | if not tuple or tuple[1] ~= $symbol then | |
| 15 | + | push("failed", { }) | |
| 16 | + | else | |
| 17 | + | pop($stack) | |
| 18 | + | push($stack .. " (r)", { $symbol }) | |
| 19 | + | end | |
| 20 | + | " | |
| 21 | + | ||
| 22 | + | |:: bind $stack $symbol :failed:?| | |
| 23 | + | |:: bind $stack $register| | |
| 24 | + | :@jet: | |
| 25 | + | " | |
| 26 | + | local s = stacks[$stack] | |
| 27 | + | local s_top = s.n | |
| 28 | + | local r = stacks[$register] | |
| 29 | + | local r_top = r.n | |
| 30 | + | local s_tuple = s[s_top] | |
| 31 | + | local r_tuple = r[r_top] | |
| 32 | + | if not s_tuple or r_tuple and s_tuple[1] ~= r_tuple[1] then | |
| 33 | + | push("failed", { }) | |
| 34 | + | else | |
| 35 | + | pop($stack) | |
| 36 | + | push($stack .. " (r)", s_tuple) | |
| 37 | + | if not r_tuple then push($register, s_tuple) end | |
| 38 | + | end | |
| 39 | + | " | |
| 40 | + | ||
| 41 | + | |:: consume $stack :failed:?| | |
| 42 | + | :@jet: | |
| 43 | + | " | |
| 44 | + | local r = pop($stack .. " (r)") | |
| 45 | + | if r then push($stack, r) end | |
| 46 | + | " | |
| 47 | + | |:: consume $stack | | |
| 48 | + | :@jet: | |
| 49 | + | " | |
| 50 | + | pop($stack .. " (r)") | |
| 51 | + | " | |
| 52 | + | ||
| 53 | + | |:: push $stack $symbol :failed:?| | |
| 54 | + | |:: push $stack $symbol| | |
| 55 | + | :@jet: | |
| 56 | + | " | |
| 57 | + | push($stack, { $symbol }) | |
| 58 | + | " | |
| 59 | + | ||
| 60 | + | |:: pushvar $stack $reg :failed:?| | |
| 61 | + | |:: pushvar $stack $reg| | |
| 62 | + | :@jet: | |
| 63 | + | " | |
| 64 | + | local r_tuple = pop($reg) | |
| 65 | + | push($stack, r_tuple) | |
| 66 | + | push($reg, r_tuple) | |
| 67 | + | " | |
| 68 | + | ||
| 69 | + | |:: unbind $n| | |
| 70 | + | :@jet: | |
| 71 | + | " | |
| 72 | + | if stacks[$n].n > 0 then | |
| 73 | + | pop($n) | |
| 74 | + | end | |
| 75 | + | " | |
| 76 | + | ||
| 77 | + | |:: jet @stdio write/1 :failed:?| | |
| 78 | + | |:: jet @stdio write/1| | |
| 79 | + | :@jet: "io.write(string.char(tonumber(stacks["1"][1][1])))" | |
| 80 | + | ||
| 81 | + | |:stacks:| | |
| 82 | + | :@stdio.arity: :@stdio.1: :@stdio.2: | |
| 83 | + | :@stdio.arity (r): :@stdio.1 (r): :@stdio.2 (r): | |
| 84 | + | ||
| 85 | + | :.arity: :.1: :.2: | |
| 86 | + | :.arity (r): :.1 (r): :.2 (r): | |
| 87 | + | ||
| 88 | + | :message.arity: :message.1: | |
| 89 | + | :message.arity (r): :message.1 (r): | |
| 90 | + | ||
| 91 | + | |:registers:| | |
| 92 | + | :1: | |
| 93 | + | ||
| 94 | + | |:: rule 1 succeeded :failed:| :: rule 2 | |
| 95 | + | |:: rule 2 succeeded :failed:| :: rule 3 | |
| 96 | + | |:: rule 3 succeeded :failed:| :: rule 4 | |
| 97 | + | |:: rule $x succeeded :failed:?| | |
| 98 | + | |:: rule $x succeeded| :: rule 1 | |
| 99 | + | ||
| 100 | + | ||
| 101 | + | |:/:| :: print message :message: "Hello, World!" | |
| 102 | + | |:: rule 0| | |
| 103 | + | :: push .arity 2 :: push .1 print :: push .2 message | |
| 104 | + | :: push message.arity 1 :: push message.1 33 | |
| 105 | + | :: push message.arity 1 :: push message.1 100 | |
| 106 | + | :: push message.arity 1 :: push message.1 108 | |
| 107 | + | :: push message.arity 1 :: push message.1 114 | |
| 108 | + | :: push message.arity 1 :: push message.1 111 | |
| 109 | + | :: push message.arity 1 :: push message.1 87 | |
| 110 | + | :: push message.arity 1 :: push message.1 32 | |
| 111 | + | :: push message.arity 1 :: push message.1 44 | |
| 112 | + | :: push message.arity 1 :: push message.1 111 | |
| 113 | + | :: push message.arity 1 :: push message.1 108 | |
| 114 | + | :: push message.arity 1 :: push message.1 108 | |
| 115 | + | :: push message.arity 1 :: push message.1 101 | |
| 116 | + | :: push message.arity 1 :: push message.1 72 | |
| 117 | + | :: rule 0 succeeded | |
| 118 | + | ||
| 119 | + | |:@stdio: write $char| | |
| 120 | + | :@jet: "io.write(string.char(tonumber($char)))" | |
| 121 | + | |:: rule 1| | |
| 122 | + | :: match @stdio.arity 2 :: match @stdio.1 write :: bind @stdio.2 1 | |
| 123 | + | :: consume @stdio.arity | |
| 124 | + | :: consume @stdio.1 | |
| 125 | + | :: consume @stdio.2 | |
| 126 | + | :: jet @stdio write/1 | |
| 127 | + | :: unbind 1 | |
| 128 | + | :: rule 1 succeeded | |
| 129 | + | ||
| 130 | + | |:: print message? :message: $char| | |
| 131 | + | :@stdio: write $char | |
| 132 | + | |:: rule 2| | |
| 133 | + | :: match .arity 2 :: match .1 print :: match .2 message | |
| 134 | + | :: match message.arity 1 :: bind message.1 1 | |
| 135 | + | :: consume .arity :: consume .1 :: consume .2 | |
| 136 | + | :: consume message.arity :: consume message.1 | |
| 137 | + | :: push @stdio.arity 2 :: push @stdio.1 write :: pushvar @stdio.2 1 | |
| 138 | + | :: push .arity 2 :: push .1 print :: push .2 message | |
| 139 | + | :: unbind 1 | |
| 140 | + | :: rule 2 succeeded | |
| 141 | + | ||
| 142 | + | ||
| 143 | + | |:: print message| | |
| 144 | + | :@stdio: write 10 | |
| 145 | + | |:: rule 3| | |
| 146 | + | :: match .arity 2 :: match .1 print :: match .2 message | |
| 147 | + | :: consume .arity :: consume .1 :: consume .2 | |
| 148 | + | :: push @stdio.arity 2 :: push @stdio.1 write :: push @stdio.2 10 | |
| 149 | + | :: unbind 1 | |
| 150 | + | :: rule 3 succeeded | |
| 151 | + | ||
| 152 | + | ||
| 153 | + | || :: rule 0 | |
Newer
Older