@@ -26,10 +26,11 @@
2626::
2727+$ expr
2828 $%
29− :: [%string ~]
29+ [%string string]
3030 [%binop expr binop expr]
3131 [%prefix-expr prefix-expr]
3232 [%num numeral]
33+ [%table table]
3334 [%true ~]
3435 [%false ~]
3536 [%nil ~]
@@ -51,6 +52,14 @@
5152 %+ cook
5253 |=(=prefix-expr [%prefix-expr prefix-expr])
5354 (knee *prefix-expr |.(parse-prefix-expr))
55+ ::
56+ %+ cook
57+ |=(=table [%table table])
58+ parse-table
59+ ::
60+ %+ cook
61+ |=(=string [%string string])
62+ parse-string
5463 ==
5564++ parse-expr-list
5665 %+ knee *(interlist binop expr)
@@ -91,6 +100,134 @@
91100 (print-expr +>+.expr)
92101 ==
93102 %num (print-numeral +.expr)
103+ %table (print-table +.expr)
104+ %string (print-string +.expr)
105+ ==
106+:: string
107+::
108++$ string @t
109+++ print-string
110+ |= =string
111+ %- zing
112+ :~
113+ "\""
114+ (trip string)
115+ "\""
116+ ==
117+++ parse-string
118+ %+ knee *string
119+ |.
120+ =>
121+ |%
122+ ++ parse-string
123+ |= quot=char
124+ =/ quot (just quot)
125+ %+ cook
126+ |=([* =tape *] (crip tape))
127+ ;~ plug
128+ quot
129+ (star ;~(less quot next))
130+ quot
131+ ==
132+ --
133+ ;~ pose
134+ (parse-string '"')
135+ (parse-string '\'')
136+ ==
137+:: table
138+::
139++$ table field-list
140+++ print-table
141+ |= =table
142+ ^- tape
143+ %- zing
144+ :~
145+ "\{"
146+ (print-field-list table)
147+ "}"
148+ ==
149+++ parse-table
150+ %+ knee *table
151+ |.
152+ %+ cook
153+ |=([* =table *] table)
154+ ;~ (glue gaw)
155+ (just '{')
156+ parse-field-list
157+ (just '}')
158+ ==
159+:: field-list
160+::
161++$ field-list (list field)
162+++ print-field-list
163+ |= =field-list
164+ ^- tape
165+ %- commaed
166+ %+ turn field-list print-field
167+++ parse-field-list
168+ %+ knee *field-list
169+ |.
170+ =>
171+ |%
172+ ++ field-sep
173+ ;~ pose
174+ com
175+ mic
176+ ==
177+ --
178+ %+ cook
179+ |=([=field-list *] field-list)
180+ ;~ (glue gaw)
181+ (more (ifix [gaw gaw] field-sep) parse-field)
182+ (punt field-sep)
183+ ==
184+:: field
185+::
186++$ field
187+ $%
188+ [%keyed expr expr]
189+ [%unkeyed expr]
190+ ==
191+++ print-field
192+ |= =field
193+ ^- tape
194+ ?- -.field
195+ %keyed
196+ %- zing
197+ :~
198+ "["
199+ (print-expr +<.field)
200+ "] = "
201+ (print-expr +>.field)
202+ ==
203+ %unkeyed
204+ (print-expr +.field)
205+ ==
206+++ parse-field
207+ %+ knee *field
208+ |.
209+ ;~ pose
210+ %+ cook
211+ |=([* key=expr * * val=expr] [%keyed key val])
212+ ;~ (glue gaw)
213+ (just '[')
214+ parse-expr
215+ (just ']')
216+ tis
217+ parse-expr
218+ ==
219+ ::
220+ %+ cook
221+ |=([=name * =expr] [%keyed [%string name] expr])
222+ ;~ (glue gaw)
223+ parse-name
224+ tis
225+ parse-expr
226+ ==
227+ ::
228+ %+ cook
229+ |=(=expr [%unkeyed expr])
230+ parse-expr
94231 ==
95232:: binop
96233::