diff options
Diffstat (limited to '')
-rw-r--r-- | stdlib/source/lux/lexer/regex.lux | 27 | ||||
-rw-r--r-- | stdlib/test/test/lux/lexer/regex.lux | 16 |
2 files changed, 41 insertions, 2 deletions
diff --git a/stdlib/source/lux/lexer/regex.lux b/stdlib/source/lux/lexer/regex.lux index c41e38590..616f02086 100644 --- a/stdlib/source/lux/lexer/regex.lux +++ b/stdlib/source/lux/lexer/regex.lux @@ -9,7 +9,7 @@ (coll [list "" Fold<List> "List/" Monad<List>])) [compiler #- run] (macro [ast] - [syntax #+ syntax:]) + ["s" syntax #+ syntax:]) ["&" lexer #+ Lexer Monad<Lexer>])) ## [Utils] @@ -415,7 +415,7 @@ (:: Monad<Lexer> map product;right (re-alternative^ true re-scoped^ current-module))) ## [Syntax] -(syntax: #export (regex [pattern syntax;text]) +(syntax: #export (regex [pattern s;text]) {#;doc (doc "Create lexers using regular-expression syntax." "For example:" @@ -484,3 +484,26 @@ (#;Right regex) (wrap (list regex)) ))) + +(syntax: #export (^regex [[pattern bindings] (s;form (s;seq s;text (s;opt s;any)))] + body + [branches (s;many s;any)]) + {#;doc (doc "Allows you to test text against regular expressions." + (case some-text + (^regex "(\\d{3})-(\\d{3})-(\\d{4})" + [_ country-code area-code place-code]) + do-some-thing-when-number + + (^regex "\\w+") + do-some-thing-when-word + + _ + do-something-else))} + (do @ + [g!temp (compiler;gensym "temp")] + (wrap (list& (` (^=> (~ g!temp) + [(&;run (~ g!temp) (regex (~ (ast;text pattern)))) + (#;Right (~ (default g!temp + bindings)))])) + body + branches)))) diff --git a/stdlib/test/test/lux/lexer/regex.lux b/stdlib/test/test/lux/lexer/regex.lux index c5c21df2a..1a21111f8 100644 --- a/stdlib/test/test/lux/lexer/regex.lux +++ b/stdlib/test/test/lux/lexer/regex.lux @@ -267,3 +267,19 @@ (&;regex "(\\d{3})-((\\d{3})-(\\d{4}))|b(.)d") "809-345-6789"))) )) + +(test: "Pattern-matching" + [sample1 (R;text +3) + sample2 (R;text +3) + sample3 (R;text +4)] + (case (format sample1 "-" sample2 "-" sample3) + (&;^regex "(.{3})-(.{3})-(.{4})" + [_ match1 match2 match3]) + (assert "Can pattern-match using regular-expressions." + (and (T/= sample1 match1) + (T/= sample2 match2) + (T/= sample3 match3))) + + _ + (assert "Cannot pattern-match using regular-expressions." + false))) |