on bbd4189 help sign in
606 lines 12 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```
292#### Examples
294```
295 > (scan "~pillyt" nuck:so)
296 [% p=[p=~.p q=32.819]]
297 > (scan "0x12" nuck:so)
298 [% p=[p=~.ux q=18]]
299 > (scan ".127.0.0.1" nuck:so)
300 [% p=[p=~.if q=2.130.706.433]]
301 > `@ud`.127.0.0.1
302 2.130.706.433
303 > (scan "._20_0w25_sam__" nuck:so)
304 [ %many
305 p
306 ~[[% p=[p=~.ud q=20]] [% p=[p=~.uw q=133]] [% p=[p=~.tas q=7.168.371]]]
307 ]
308 > `@`%sam
309 7.168.371
310 > (scan "~0ph" nuck:so)
311 [%blob p=[1 1]]
312 > ~0ph
313 [1 1]
314 > `@uv`(jam [1 1])
315 0vph
316```
318---
320### `++nusk:so`
322Parse coin literal with escapes
324Parsing rule. Parses a coin literal with escapes. (See also: xx tuple
325formatting).
327#### Accepts
329#### Produces
331#### Source
333```hoon
334 ++ nusk
335 (sear |=(a/@ta (rush (wick a) nuck)) urt:ab)
336```
338#### Examples
340```
341 > ~.asd_a
342 ~.asd_a
343 > ._1_~~.asd~-a__
344 [1 ~.asd_a]
345 > (scan "~~.asd~-a" nusk:so)
346 [% p=[p=~.ta q=418.212.246.369]]
347 > ([~ %ta @ta] (scan "~~.asd~-a" nusk:so))
348 [~ %ta ~.asd_a]
349```
351---
353### `++perd:so`
355Parsing rule.
357Parsing rule. Parses a dime or tuple without their respective standard
358prefixes.
360#### Accepts
362#### Produces
364#### Source
366```hoon
367 ++ perd
368 ;~ pose
369 (stag ~ zust)
370 (stag %many (ifix [cab ;~(plug cab cab)] (more cab nusk)))
371 ==
372```
374#### Examples
376```
377 > (scan "y" perd:so)
378 [~ [%f %.y]]
379 > (scan "n" perd:so)
380 [~ [%f %.n]]
381 > |
382 %.n
383 > (scan "_20_x__" perd:so)
384 [%many [[% p=[p=~.ud q=20]] ~[[% p=[p=~.tas q=120]]]]]
385```
387---
389### `++royl:so`
391Parse dime float
393Parsing rule. Parses a number into a `++dime` float.
395#### Accepts
397#### Produces
399#### Source
401```hoon
402 ++ royl
403 ~+
404 =+ ^= moo
405 |= a/tape
406 :- (lent a)
407 (scan a (bass 10 (plus sid:ab)))
408 =+ ^= voy
409 %+ cook royl-cell
410 ;~ pose
411 ;~ plug
412 (easy %d)
413 ;~ pose (cold | hep) (easy &) ==
414 ;~ plug dim:ag
415 ;~ pose
416 ;~(pfix dot (cook moo (plus (shim '0' '9'))))
417 (easy [0 0])
418 ==
419 ;~ pose
420 ;~ pfix
421 (just 'e')
422 ;~(plug ;~(pose (cold | hep) (easy &)) dim:ag)
423 ==
424 (easy [& 0])
425 ==
426 ==
427 ==
428 ;~ plug
429 (easy %i)
430 ;~ sfix
431 ;~ pose (cold | hep) (easy &) ==
432 (jest 'inf')
433 ==
434 ==
435 ;~ plug
436 (easy %n)
437 (cold ~ (jest 'nan'))
438 ==
439 ==
440 ;~ pose
441 (stag %rh (cook rylh ;~(pfix ;~(plug sig sig) voy)))
442 (stag %rq (cook rylq ;~(pfix ;~(plug sig sig sig) voy)))
443 (stag %rd (cook ryld ;~(pfix sig voy)))
444 (stag %rs (cook ryls voy))
445 ==
446 ::
447```
449#### Examples
451```
452 > (scan "~3.14" royl:so)
453 [%rd .~3.13999999999999]
454 > .~3.14
455 .~3.13999999999999
456```
458---
460### `++royl-cell:so`
462XX still not fully functional
464Intermediate parsed float convereter
466```hoon
467 ++ royl-cell
468 |= rn
469 ^- dn
470 ?. ?=({$d *} +<) +<
471 =+ ^= h
472 (dif:si (new:si f.b i.b) (sun:si d.b))
473 [%d a h (add (mul c.b (pow 10 d.b)) e.b)]
474 ::
475```
477---
479### `++tash:so`
481Parse signed dime
483#### Accepts
485#### Produces
487Parsing rule. Parses a signed number into a `++dime`.
489#### Source
491```hoon
492 ++ tash
493 ~+
494 =+ ^= neg
495 |= {syn/? mol/dime} ^- dime
496 ?> =('u' (end 3 1 p.mol))
497 [(cat 3 's' (rsh 3 1 p.mol)) (new:si syn q.mol)]
498 ;~ pfix hep
499 ;~ pose
500 (cook |=(a/dime (neg | a)) bisk)
501 ;~(pfix hep (cook |=(a/dime (neg & a)) bisk))
502 ==
503 ==
504 ::
505```
507#### Examples
509```
510 > (scan "-20" tash:so)
511 [p=~.sd q=39]
512 > (,[%sd @sd] (scan "-20" tash:so))
513 [%sd -20]
514 > (,[%sd @sd] (scan "--20" tash:so))
515 [%sd --20]
516 > (,[%sx @sx] (scan "--0x2e" tash:so))
517 [%sx --0x2e]
518```
520---
522### `++twid:so`
524Parse coins without `~` prefix
526Parsing rule. Parses coins after a leading sig, `~`.
528#### Accepts
530#### Produces
532#### Source
534```hoon
535 ++ twid
536 ;~ pose
537 (cook |=(a/@ [%blob (cue a)]) ;~(pfix (just '0') vum:ag))
538 (stag ~ crub)
539 ==
540 ::
541```
543#### Examples
545```
546 > (scan "zod" twid:so)
547 [~ [%p 0]]
548 > (scan ".sam" twid:so)
549 [~ [%ta 7.168.371]]
550 > `@ud`~.sam
551 7.168.371
552 > `@t`~.sam
553 'sam'
554 > (scan "0ph" twid:so)
555 [%blob [1 1]]
556```
558---
560### `++zust:so`
562Parse prefixed dimes from `@if`, `@f`, `@rd`
564Parsing rule. Parses an atom of either `@if` (IP address), `@f`
565(loobean), or `rf`(floating point) into a `++dime`.
567#### Accepts
569#### Produces
571#### Source
573```hoon
574 ++ zust
575 ;~ pose
576 (stag %is bip:ag)
577 (stag %if lip:ag)
578 (stag %f ;~(pose (cold & (just 'y')) (cold | (just 'n'))))
579 royl
580 ==
581 --
582```
584#### Examples
586```
587 > (scan "127.0.0.1" zust:so)
588 [%if q=2.130.706.433]
590 > (scan "af.0.0.0.0.e7a5.30d2.7" zust:so)
591 [%is q=908.651.950.243.594.834.993.091.554.288.205.831]
593 > (,[%is @is] (scan "af.0.0.0.0.e7a5.30d2.7" zust:so))
594 [%is .af.0.0.0.0.e7a5.30d2.7]
596 > (,[%is @ux] (scan "af.0.0.0.0.e7a5.30d2.7" zust:so))
597 [%is 0xaf.0000.0000.0000.0000.e7a5.30d2.0007]
599 > (scan "y" zust:so)
600 [%f %.y]
602 > (scan "12.09" zust:so)
603 [%rd .~12.00999999999999]
604```
606---