hello-world.nils.jets.nv
· 3.7 KiB · Text
Sin formato
Playground
|:: documentation for NILS Form|
:@doc string:
"Nova In-Language Static Form is a possible structure for lowering
Nova code into a bytecode language describable in Nova. This is not
intended to be written by hand."
|:: match $stack $arity :failed:?|
|:: match $stack $symbol|
:@jet:
"
local s = stacks[$stack]
local s_top = s.n
local tuple = s[s_top]
if not tuple or tuple[1] ~= $symbol then
push("failed", { })
else
pop($stack)
push($stack .. " (r)", { $symbol })
end
"
|:: bind $stack $symbol :failed:?|
|:: bind $stack $register|
:@jet:
"
local s = stacks[$stack]
local s_top = s.n
local r = stacks[$register]
local r_top = r.n
local s_tuple = s[s_top]
local r_tuple = r[r_top]
if not s_tuple or r_tuple and s_tuple[1] ~= r_tuple[1] then
push("failed", { })
else
pop($stack)
push($stack .. " (r)", s_tuple)
if not r_tuple then push($register, s_tuple) end
end
"
|:: consume $stack :failed:?|
:@jet:
"
local r = pop($stack .. " (r)")
if r then push($stack, r) end
"
|:: consume $stack |
:@jet:
"
pop($stack .. " (r)")
"
|:: push $stack $symbol :failed:?|
|:: push $stack $symbol|
:@jet:
"
push($stack, { $symbol })
"
|:: pushvar $stack $reg :failed:?|
|:: pushvar $stack $reg|
:@jet:
"
local r_tuple = pop($reg)
push($stack, r_tuple)
push($reg, r_tuple)
"
|:: unbind $n|
:@jet:
"
if stacks[$n].n > 0 then
pop($n)
end
"
|:: jet @stdio write/1 :failed:?|
|:: jet @stdio write/1|
:@jet: "io.write(string.char(tonumber(stacks["1"][1][1])))"
|:stacks:|
:@stdio.arity: :@stdio.1: :@stdio.2:
:@stdio.arity (r): :@stdio.1 (r): :@stdio.2 (r):
:.arity: :.1: :.2:
:.arity (r): :.1 (r): :.2 (r):
:message.arity: :message.1:
:message.arity (r): :message.1 (r):
|:registers:|
:1:
|:: rule 1 succeeded :failed:| :: rule 2
|:: rule 2 succeeded :failed:| :: rule 3
|:: rule 3 succeeded :failed:| :: rule 4
|:: rule $x succeeded :failed:?|
|:: rule $x succeeded| :: rule 1
|:/:| :: print message :message: "Hello, World!"
|:: rule 0|
:: push .arity 2 :: push .1 print :: push .2 message
:: push message.arity 1 :: push message.1 33
:: push message.arity 1 :: push message.1 100
:: push message.arity 1 :: push message.1 108
:: push message.arity 1 :: push message.1 114
:: push message.arity 1 :: push message.1 111
:: push message.arity 1 :: push message.1 87
:: push message.arity 1 :: push message.1 32
:: push message.arity 1 :: push message.1 44
:: push message.arity 1 :: push message.1 111
:: push message.arity 1 :: push message.1 108
:: push message.arity 1 :: push message.1 108
:: push message.arity 1 :: push message.1 101
:: push message.arity 1 :: push message.1 72
:: rule 0 succeeded
|:@stdio: write $char|
:@jet: "io.write(string.char(tonumber($char)))"
|:: rule 1|
:: match @stdio.arity 2 :: match @stdio.1 write :: bind @stdio.2 1
:: consume @stdio.arity
:: consume @stdio.1
:: consume @stdio.2
:: jet @stdio write/1
:: unbind 1
:: rule 1 succeeded
|:: print message? :message: $char|
:@stdio: write $char
|:: rule 2|
:: match .arity 2 :: match .1 print :: match .2 message
:: match message.arity 1 :: bind message.1 1
:: consume .arity :: consume .1 :: consume .2
:: consume message.arity :: consume message.1
:: push @stdio.arity 2 :: push @stdio.1 write :: pushvar @stdio.2 1
:: push .arity 2 :: push .1 print :: push .2 message
:: unbind 1
:: rule 2 succeeded
|:: print message|
:@stdio: write 10
|:: rule 3|
:: match .arity 2 :: match .1 print :: match .2 message
:: consume .arity :: consume .1 :: consume .2
:: push @stdio.arity 2 :: push @stdio.1 write :: push @stdio.2 10
:: unbind 1
:: rule 3 succeeded
|| :: rule 0
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 |