aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/lux/control/parser/code.lux
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib/source/lux/control/parser/code.lux')
-rw-r--r--stdlib/source/lux/control/parser/code.lux70
1 files changed, 34 insertions, 36 deletions
diff --git a/stdlib/source/lux/control/parser/code.lux b/stdlib/source/lux/control/parser/code.lux
index 56cbe5bc2..1e1287467 100644
--- a/stdlib/source/lux/control/parser/code.lux
+++ b/stdlib/source/lux/control/parser/code.lux
@@ -41,44 +41,42 @@
#.Nil (#error.Failure "There are no tokens to parse!")
(#.Cons [t tokens']) (#error.Success [tokens' t]))))
-(template [<get-name> <type> <tag> <eq> <desc>]
- [(def: #export <get-name>
- {#.doc (code.text ($_ text@compose "Parses the next " <desc> " input Code."))}
- (Parser <type>)
- (function (_ tokens)
- (case tokens
- (#.Cons [[_ (<tag> x)] tokens'])
- (#error.Success [tokens' x])
-
- _
- (#error.Failure ($_ text@compose "Cannot parse " <desc> (remaining-inputs tokens))))))]
-
- [ bit Bit #.Bit bit.equivalence "bit"]
- [ nat Nat #.Nat nat.equivalence "nat"]
- [ int Int #.Int int.equivalence "int"]
- [ rev Rev #.Rev rev.equivalence "rev"]
- [ frac Frac #.Frac frac.equivalence "frac"]
- [ text Text #.Text text.equivalence "text"]
- [identifier Name #.Identifier name.equivalence "identifier"]
- [ tag Name #.Tag name.equivalence "tag"]
+(template [<query> <assertion> <type> <tag> <eq> <desc>]
+ [(with-expansions [<error> (as-is (#error.Failure ($_ text@compose "Cannot parse " <desc> (remaining-inputs tokens))))]
+ (def: #export <query>
+ {#.doc (code.text ($_ text@compose "Parses the next " <desc> " input."))}
+ (Parser <type>)
+ (function (_ tokens)
+ (case tokens
+ (#.Cons [[_ (<tag> x)] tokens'])
+ (#error.Success [tokens' x])
+
+ _
+ <error>)))
+
+ (def: #export (<assertion> expected)
+ (-> <type> (Parser Any))
+ (function (_ tokens)
+ (case tokens
+ (#.Cons [[_ (<tag> actual)] tokens'])
+ (if (:: <eq> = expected actual)
+ (#error.Success [tokens' []])
+ <error>)
+
+ _
+ <error>))))]
+
+ [bit bit! Bit #.Bit bit.equivalence "bit"]
+ [nat nat! Nat #.Nat nat.equivalence "nat"]
+ [int int! Int #.Int int.equivalence "int"]
+ [rev rev! Rev #.Rev rev.equivalence "rev"]
+ [frac frac! Frac #.Frac frac.equivalence "frac"]
+ [text text! Text #.Text text.equivalence "text"]
+ [identifier identifier! Name #.Identifier name.equivalence "identifier"]
+ [tag tag! Name #.Tag name.equivalence "tag"]
)
-(def: #export (this? ast)
- {#.doc "Asks if the given Code is the next input."}
- (-> Code (Parser Bit))
- (function (_ tokens)
- (case tokens
- (#.Cons [token tokens'])
- (let [is-it? (code@= ast token)
- remaining (if is-it?
- tokens'
- tokens)]
- (#error.Success [remaining is-it?]))
-
- _
- (#error.Success [tokens #0]))))
-
-(def: #export (this ast)
+(def: #export (this! ast)
{#.doc "Ensures the given Code is the next input."}
(-> Code (Parser Any))
(function (_ tokens)