on b00decd help sign in
608 lines 13 kB history raw
1+++
2title = "4l: Atom Parsing"
3weight = 39
4template = "doc.html"
5+++
7### `++so`
9Coin parser engine
11Core containing arms that parse `++coin`.
13#### Accepts
15#### Produces
17#### Source
19```hoon
20 ++ so
21 |%
22```
24#### Examples
26```
27 > so
28 <10.mkn 414.hhh 100.xkc 1.ypj %164>
29```
31------------------------------------------------------------------------
33### `++bisk:so`
35Parse aura-atom pair
37Parsing rule. Parses an unsigned integer of any permitted base,
38producing a `++dime`.
40#### Accepts
42#### Produces
44#### Source
46```hoon
47 ++ bisk
48 ;~ pose
49 ;~ pfix (just '0')
50 ;~ pose
51 (stag %ub ;~(pfix (just 'b') bay:ag))
52 (stag %ui ;~(pfix (just 'i') dim:ag))
53 (stag %ux ;~(pfix (just 'x') hex:ag))
54 (stag %uv ;~(pfix (just 'v') viz:ag))
55 (stag %uw ;~(pfix (just 'w') wiz:ag))
56 ==
57 ==
58 (stag %ud dem:ag)
59 ==
60```
62#### Examples
64```
65 > (scan "25" bisk:so)
66 [%ud q=25]
67 > (scan "0x12.6401" bisk:so)
68 [%ux q=1.205.249]
69```
71------------------------------------------------------------------------
73### `++crub:so`
75Parse `@da`, `@dr`, `@p`, `@t`
77Parsing rule. Parses any atom of any of the following auras after a
78leading sig, `~` into a `++dime`: `@da`, `@dr`, `@p`,
79and `@t`, producing a `++dime`.
81#### Accepts
83#### Produces
85#### Source
87```hoon
88 ++ crub
89 ~+
90 ;~ pose
91 %+ cook
92 |=(det/date `dime`[%da (year det)])
93 ;~ plug
94 %+ cook
95 |=({a/@ b/?} [b a])
96 ;~(plug dim:ag ;~(pose (cold | hep) (easy &)))
97 ;~(pfix dot dim:ag) :: month
98 ;~(pfix dot dim:ag) :: day
99 ;~ pose
100 ;~ pfix
101 ;~(plug dot dot)
102 ;~ plug
103 dum:ag
104 ;~(pfix dot dum:ag)
105 ;~(pfix dot dum:ag)
106 ;~(pose ;~(pfix ;~(plug dot dot) (most dot qix:ab)) (easy ~))
107 ==
108 ==
109 (easy [0 0 0 ~])
110 ==
111 ==
112 ::
113 %+ cook
114 |= {a/(list {p/?($d $h $m $s) q/@}) b/(list @)}
115 =+ rop=`tarp`[0 0 0 0 b]
116 |- ^- dime
117 ?~ a
118 [%dr (yule rop)]
119 ?- p.i.a
120 $d $(a t.a, d.rop (add q.i.a d.rop))
121 $h $(a t.a, h.rop (add q.i.a h.rop))
122 $m $(a t.a, m.rop (add q.i.a m.rop))
123 $s $(a t.a, s.rop (add q.i.a s.rop))
124 ==
125 ;~ plug
126 %+ most
127 dot
128 ;~ pose
129 ;~(pfix (just 'd') (stag %d dim:ag))
130 ;~(pfix (just 'h') (stag %h dim:ag))
131 ;~(pfix (just 'm') (stag %m dim:ag))
132 ;~(pfix (just 's') (stag %s dim:ag))
133 ==
134 ;~(pose ;~(pfix ;~(plug dot dot) (most dot qix:ab)) (easy ~))
135 ==
136 ::
137 (stag %p fed:ag)
138 ;~(pfix dot (stag %ta urs:ab))
139 ;~(pfix sig (stag %t urx:ab))
140 ;~(pfix hep (stag %c (cook turf urx:ab)))
141 ==
142 ++ nuck
143 ~/ %nuck |= a/nail %. a
144 %+ knee *coin |. ~+
145 %- stew
146 ^. stet ^. limo
147 :~ :- ['a' 'z'] (cook |=(a/@ta [%$ %tas a]) sym)
148 :- ['0' '9'] (stag %$ bisk)
149 :- '-' (stag %$ tash)
150 :- '.' ;~(pfix dot perd)
151 :- '~' ;~(pfix sig ;~(pose twid (easy [%$ %n 0])))
152 ==
153 ++ nusk
154 ~+
155 :(sear |=(a/@ta (rush a nuck)) wick urt:ab)
156 ++ perd
157 ~+
158 ;~ pose
159 (stag %$ zust)
160 (stag %many (ifix [cab ;~(plug cab cab)] (more cab nusk)))
161 ==
162 ++ royl
163 ~+
164 =+ ^= moo
165 |= a/tape
166 :- (lent a)
167 (scan a (bass 10 (plus sid:ab)))
168 =+ ^= voy
169 %+ cook royl-cell
170 ;~ pose
171 ;~ plug
172 (easy %d)
173 ;~ pose (cold | hep) (easy &) ==
174 ;~ plug dim:ag
175 ;~ pose
176 ;~(pfix dot (cook moo (plus (shim '0' '9'))))
177 (easy [0 0])
178 ==
179 ;~ pose
180 ;~ pfix
181 (just 'e')
182 ;~(plug ;~(pose (cold | hep) (easy &)) dim:ag)
183 ==
184 (easy [& 0])
185 ==
186 ==
187 ==
188 ;~ plug
189 (easy %i)
190 ;~ sfix
191 ;~ pose (cold | hep) (easy &) ==
192 (jest 'inf')
193 ==
194 ==
195 ;~ plug
196 (easy %n)
197 (cold ~ (jest 'nan'))
198 ==
199 ==
200 ;~ pose
201 (stag %rh (cook rylh ;~(pfix ;~(plug sig sig) voy)))
202 (stag %rq (cook rylq ;~(pfix ;~(plug sig sig sig) voy)))
203 (stag %rd (cook ryld ;~(pfix sig voy)))
204 (stag %rs (cook ryls voy))
205 ==
206 ::
207 ++ royl-cell
208 |= rn
209 ^- dn
210 ?. ?=({$d *} +<) +<
211 =+ ^= h
212 (dif:si (new:si f.b i.b) (sun:si d.b))
213 [%d a h (add (mul c.b (pow 10 d.b)) e.b)]
214 ::
215 ++ tash
216 ~+
217 =+ ^= neg
218 |= {syn/? mol/dime} ^- dime
219 ?> =('u' (end 3 1 p.mol))
220 [(cat 3 's' (rsh 3 1 p.mol)) (new:si syn q.mol)]
221 ;~ pfix hep
222 ;~ pose
223 (cook |=(a/dime (neg | a)) bisk)
224 ;~(pfix hep (cook |=(a/dime (neg & a)) bisk))
225 ==
226 ==
227 ::
228 ++ twid
229 ~+
230 ;~ pose
231 (cook |=(a/@ [%blob (cue a)]) ;~(pfix (just '0') vum:ag))
232 (stag %$ crub)
233 ==
234 ::
235 ++ zust
236 ~+
237 ;~ pose
238 (stag %is bip:ag)
239 (stag %if lip:ag)
240 (stag %f ;~(pose (cold & (just 'y')) (cold | (just 'n'))))
241 royl
242 ==
243 --
244```
246#### Examples
248```
249 > (scan "1926.5.12" crub:so)
250 [p=~.da q=170.141.184.449.747.016.871.285.095.307.149.312.000]
251 > ([%da @da] (scan "1926.5.12" crub:so))
252 [%da ~1926.5.12]
253 > (scan "s10" crub:so)
254 [p=~.dr q=184.467.440.737.095.516.160]
255 > ([%dr @dr] (scan "s10" crub:so))
256 [%dr ~s10]
257 > (scan "doznec" crub:so)
258 [%p 256]
259 > (scan ".mas" crub:so)
260 [%ta 7.561.581]
261```
263------------------------------------------------------------------------
265### `++nuck:so`
267Top-level coin parser
269Parsing rule. Switches on the first character and applies the
270corresponding `++coin` parser.
272#### Accepts
274#### Produces
276#### Source
278```hoon
279 ++ nuck
280 ~/ %nuck |= a/nail %. a
281 %+ knee *coin |. ~+
282 %- stew
283 ^. stet ^. limo
284 :~ :- ['a' 'z'] (cook |=(a/@ta [%$ %tas a]) sym)
285 :- ['0' '9'] (stag %$ bisk)
286 :- '-' (stag %$ tash)
287 :- '.' ;~(pfix dot perd)
288 :- '~' ;~(pfix sig ;~(pose twid (easy [%$ %n 0])))
289 ==
290```
293#### Examples
295```
296 > (scan "~pillyt" nuck:so)
297 [% p=[p=~.p q=32.819]]
298 > (scan "0x12" nuck:so)
299 [% p=[p=~.ux q=18]]
300 > (scan ".127.0.0.1" nuck:so)
301 [% p=[p=~.if q=2.130.706.433]]
302 > `@ud`.127.0.0.1
303 2.130.706.433
304 > (scan "._20_0w25_sam__" nuck:so)
305 [ %many
306 p
307 ~[[% p=[p=~.ud q=20]] [% p=[p=~.uw q=133]] [% p=[p=~.tas q=7.168.371]]]
308 ]
309 > `@`%sam
310 7.168.371
311 > (scan "~0ph" nuck:so)
312 [%blob p=[1 1]]
313 > ~0ph
314 [1 1]
315 > `@uv`(jam [1 1])
316 0vph
317```
319------------------------------------------------------------------------
321### `++nusk:so`
323Parse coin literal with escapes
325Parsing rule. Parses a coin literal with escapes. (See also: xx tuple
326formatting).
328#### Accepts
330#### Produces
332#### Source
334```hoon
335 ++ nusk
336 (sear |=(a/@ta (rush (wick a) nuck)) urt:ab)
337```
339#### Examples
341```
342 > ~.asd_a
343 ~.asd_a
344 > ._1_~~.asd~-a__
345 [1 ~.asd_a]
346 > (scan "~~.asd~-a" nusk:so)
347 [% p=[p=~.ta q=418.212.246.369]]
348 > ([~ %ta @ta] (scan "~~.asd~-a" nusk:so))
349 [~ %ta ~.asd_a]
350```
352------------------------------------------------------------------------
354### `++perd:so`
356Parsing rule.
358Parsing rule. Parses a dime or tuple without their respective standard
359prefixes.
361#### Accepts
363#### Produces
365#### Source
367```hoon
368 ++ perd
369 ;~ pose
370 (stag ~ zust)
371 (stag %many (ifix [cab ;~(plug cab cab)] (more cab nusk)))
372 ==
373```
375#### Examples
377```
378 > (scan "y" perd:so)
379 [~ [%f %.y]]
380 > (scan "n" perd:so)
381 [~ [%f %.n]]
382 > |
383 %.n
384 > (scan "_20_x__" perd:so)
385 [%many [[% p=[p=~.ud q=20]] ~[[% p=[p=~.tas q=120]]]]]
386```
388------------------------------------------------------------------------
390### `++royl:so`
392Parse dime float
394Parsing rule. Parses a number into a `++dime` float.
396#### Accepts
398#### Produces
400#### Source
402```hoon
403 ++ royl
404 ~+
405 =+ ^= moo
406 |= a/tape
407 :- (lent a)
408 (scan a (bass 10 (plus sid:ab)))
409 =+ ^= voy
410 %+ cook royl-cell
411 ;~ pose
412 ;~ plug
413 (easy %d)
414 ;~ pose (cold | hep) (easy &) ==
415 ;~ plug dim:ag
416 ;~ pose
417 ;~(pfix dot (cook moo (plus (shim '0' '9'))))
418 (easy [0 0])
419 ==
420 ;~ pose
421 ;~ pfix
422 (just 'e')
423 ;~(plug ;~(pose (cold | hep) (easy &)) dim:ag)
424 ==
425 (easy [& 0])
426 ==
427 ==
428 ==
429 ;~ plug
430 (easy %i)
431 ;~ sfix
432 ;~ pose (cold | hep) (easy &) ==
433 (jest 'inf')
434 ==
435 ==
436 ;~ plug
437 (easy %n)
438 (cold ~ (jest 'nan'))
439 ==
440 ==
441 ;~ pose
442 (stag %rh (cook rylh ;~(pfix ;~(plug sig sig) voy)))
443 (stag %rq (cook rylq ;~(pfix ;~(plug sig sig sig) voy)))
444 (stag %rd (cook ryld ;~(pfix sig voy)))
445 (stag %rs (cook ryls voy))
446 ==
447 ::
448```
450#### Examples
452```
453 > (scan "~3.14" royl:so)
454 [%rd .~3.13999999999999]
455 > .~3.14
456 .~3.13999999999999
457```
459------------------------------------------------------------------------
461### `++royl-cell:so`
463XX still not fully functional
465Intermediate parsed float convereter
467```hoon
468 ++ royl-cell
469 |= rn
470 ^- dn
471 ?. ?=({$d *} +<) +<
472 =+ ^= h
473 (dif:si (new:si f.b i.b) (sun:si d.b))
474 [%d a h (add (mul c.b (pow 10 d.b)) e.b)]
475 ::
476```
478------------------------------------------------------------------------
480### `++tash:so`
482Parse signed dime
484#### Accepts
486#### Produces
488Parsing rule. Parses a signed number into a `++dime`.
490#### Source
492```hoon
493 ++ tash
494 ~+
495 =+ ^= neg
496 |= {syn/? mol/dime} ^- dime
497 ?> =('u' (end 3 1 p.mol))
498 [(cat 3 's' (rsh 3 1 p.mol)) (new:si syn q.mol)]
499 ;~ pfix hep
500 ;~ pose
501 (cook |=(a/dime (neg | a)) bisk)
502 ;~(pfix hep (cook |=(a/dime (neg & a)) bisk))
503 ==
504 ==
505 ::
506```
508#### Examples
510```
511 > (scan "-20" tash:so)
512 [p=~.sd q=39]
513 > (,[%sd @sd] (scan "-20" tash:so))
514 [%sd -20]
515 > (,[%sd @sd] (scan "--20" tash:so))
516 [%sd --20]
517 > (,[%sx @sx] (scan "--0x2e" tash:so))
518 [%sx --0x2e]
519```
521------------------------------------------------------------------------
523### `++twid:so`
525Parse coins without `~` prefix
527Parsing rule. Parses coins after a leading sig, `~`.
529#### Accepts
531#### Produces
533#### Source
535```hoon
536 ++ twid
537 ;~ pose
538 (cook |=(a/@ [%blob (cue a)]) ;~(pfix (just '0') vum:ag))
539 (stag ~ crub)
540 ==
541 ::
542```
544#### Examples
546```
547 > (scan "zod" twid:so)
548 [~ [%p 0]]
549 > (scan ".sam" twid:so)
550 [~ [%ta 7.168.371]]
551 > `@ud`~.sam
552 7.168.371
553 > `@t`~.sam
554 'sam'
555 > (scan "0ph" twid:so)
556 [%blob [1 1]]
557```
559------------------------------------------------------------------------
561### `++zust:so`
563Parse prefixed dimes from `@if`, `@f`, `@rd`
565Parsing rule. Parses an atom of either `@if` (IP address), `@f`
566(loobean), or `rf`(floating point) into a `++dime`.
568#### Accepts
570#### Produces
572#### Source
574```hoon
575 ++ zust
576 ;~ pose
577 (stag %is bip:ag)
578 (stag %if lip:ag)
579 (stag %f ;~(pose (cold & (just 'y')) (cold | (just 'n'))))
580 royl
581 ==
582 --
583```
585#### Examples
587```
588 > (scan "127.0.0.1" zust:so)
589 [%if q=2.130.706.433]
591 > (scan "af.0.0.0.0.e7a5.30d2.7" zust:so)
592 [%is q=908.651.950.243.594.834.993.091.554.288.205.831]
594 > (,[%is @is] (scan "af.0.0.0.0.e7a5.30d2.7" zust:so))
595 [%is .af.0.0.0.0.e7a5.30d2.7]
597 > (,[%is @ux] (scan "af.0.0.0.0.e7a5.30d2.7" zust:so))
598 [%is 0xaf.0000.0000.0000.0000.e7a5.30d2.0007]
600 > (scan "y" zust:so)
601 [%f %.y]
603 > (scan "12.09" zust:so)
604 [%rd .~12.00999999999999]
605```
608---