4g: Parsing (Outside Caller)

+rash

Parse or crash.

Parse a $cord with a given $rule and crash if the $cord isn't entirely parsed.

Accepts

.naf is an $atom.

.sab is a $rule.

Produces

The value of the parse result, or crash.

Source

++  rash  |*([naf=@ sab=rule] (scan (trip naf) sab))

Examples

> (rash 'I was the world in which I walked, and what I saw' (star (shim 0 200)))
"I was the world in which I walked, and what I saw"
> (rash 'abc' (just 'a'))
! {1 2}
! 'syntax-error'
! exit
> (rash 'abc' (jest 'abc'))
'abc'
> (rash 'abc' (jest 'ab'))
! {1 3}
! 'syntax-error'
! exit

+rose

Parse to each.

Parse $tape .los with $rule sab, producing an (each @ud (unit *)). If .los was not fully consumed, the result is %.n and .p contains the column number before failure occurred. If .los was fully consumed, the result is %.y and .p contains either sab's result in a +unit, or a null +unit if parsing failed.

Accepts

.los is a $tape.

.sab is a $rule.

Produces

(each @ud (unit *)), where the * is whatever type the $rule produces.

Source

++  rose  |*  [los=tape sab=rule]
          =+  vex=(sab [[1 1] los])
          =+  len=(lent los)
          ?.  =(+(len) q.p.vex)  [%| p=(dec q.p.vex)]
          ?~  q.vex
            [%& p=~]
          [%& p=[~ u=p.u.q.vex]]

Examples

> (rose "!" zap)
[%.y p=[~ u='!']]
> (rose "?" zap)
[%.n p=0]
> (rose "!?" zap)
[%.n p=1]
> (rose "!" ;~(plug zap fail))
[%.y p=~]

+rush

Parse or null.

Parse an $atom with a given $rule and produce null if the $cord isn't entirely parsed.

Accepts

.naf is an $atom.

.sab is a $rule.

Produces

The value of the parse result, or null.

Source

++  rush  |*([naf=@ sab=rule] (rust (trip naf) sab))

Examples

> (rush 'I was the world in which I walked, and what I saw' (star (shim 0 200)))
[~ "I was the world in which I walked, and what I saw"]
> (rush 'abc' (just 'a'))
~
> (rush 'abc' (jest 'abc'))
[~ 'abc']
> (rush 'abc' (jest 'ac'))
~
> (rush 'abc' (jest 'ab'))
~

+rust

Parse $tape or null.

Parse a $tape with a given $rule and produce null if the $tape isn't entirely parsed.

Accepts

.los is a $tape.

.sab is a $rule.

Produces

A (unit *), where * is the type produced by .sab.

Source

++  rust  |*  [los=tape sab=rule]
          =+  vex=((full sab) [[1 1] los])
          ?~(q.vex ~ [~ u=p.u.q.vex])

Examples

> (rust "I was the world in which I walked, and what I saw" (star (shim 0 200)))
[~ "I was the world in which I walked, and what I saw"]
> (rust "Or heard or felt came not but from myself;" (star (shim 0 200)))
[~ "Or heard or felt came not but from myself;"]
> (rust "And there I found myself more truly and more strange." (jest 'And there I'))
~

+scan

Parse $tape or crash.

Parse a $tape with a given $rule and crash if the $tape isn't entirely parsed.

Accepts

.los is a $tape.

.sab is a $rule.

Produces

Either the type produced by your parsing rules or a crash.

Source

++  scan  |*  [los=tape sab=rule]
          =+  vex=((full sab) [[1 1] los])
          ?~  q.vex
            ~_  (show [%m '{%d %d}'] p.p.vex q.p.vex ~)
            ~_(leaf+"syntax error" !!)
          p.u.q.vex

Examples

> (scan "I was the world in which I walked, and what I saw" (star (shim 0 200)))
"I was the world in which I walked, and what I saw"
> (scan "Or heard or felt came not but from myself;" (star (shim 0 200)))
"Or heard or felt came not but from myself;"
> (scan "And there I found myself more truly and more strange." (jest 'And there I'))
! {1 12}
! 'syntax-error'
! exit

Last updated