rere-0.1: Regular-expressions extended with fixpoints for context-free powers

Safe HaskellTrustworthy
LanguageHaskell2010

RERE.Examples

Contents

Description

Various examples of using rere, as used in the blog post.

Synopsis

Documentation

>>> import Test.QuickCheck.Random (mkQCGen)
>>> import Test.QuickCheck.Gen (unGen)
>>> import Control.Monad.ST (runST)
>>> let runGen seed = maybe "<<null>>" (\g' -> unGen g' (mkQCGen seed) 10)
>>> let showRef re = matchDebugR re ""

Syntax

syntaxExamples :: IO () Source #

Demonstrates how various constructors are pretty printed.

Example 1

ex1 :: RE Void Source #

>>> match ex1 "abab"
True
>>> match ex1 "ababa"
False
>>> ex1
Star (App (Ch "a") (Ch "b"))
>>> charClasses ex1
fromList "\NULabc"
>>> showRef ex1
size: 4
show: Star (App (Ch "a") (Ch "b"))
null: True
>>> matchR ex1 "abab"
True
>>> matchR ex1 "ababa"
False
>>> runGen 42 (generate 10 20 ex1)
"ababab"
>>> runGen 44 (generate 10 20 ex1)
"abababababababababab"

Example 2

ex2 :: RE Void Source #

>>> match ex2 "aaa"
True

Note: how "sharing" is preserved.

>>> showRef ex2
size: 5
show: App (Star (Ch "a")) (Star (Ch "a"))
null: True
> matchR ex2 "aaa"

True

>>> runGen 42 (generate 10 20 ex2)
"aaaaaaaaaaa"
>>> runGen 44 (generate 10 20 ex2)
"aaaaaaaaaa"

Example 3

ex3 :: RE Void Source #

>>> match ex3 "abab"
True
>>> match ex3 "ababa"
False
>>> showRef ex3
size: 8
show: Ref 0 (Alt Eps (App (Ch "a") (App (Ch "b") (Ref 0 <<loop>>))))
null: True
>>> matchR ex3 "abab"
True
>>> matchR ex3 "ababa"
False
>>> runGen 42 (generate 10 20 ex3)
"ab"
>>> runGen 50 (generate 10 20 ex3)
"ababab"

Example 4

ex4 :: RE Void Source #

>>> match ex4 "aaaabbbb"
True
>>> showRef ex4
size: 8
show: Ref 0 (Alt Eps (App (Ch "a") (App (Ref 0 <<loop>>) (Ch "b"))))
null: True
>>> matchR ex4 "aaaabbbb"
True
>>> runGen 42 (generate 10 20 ex4)
"aabb"
>>> runGen 45 (generate 10 20 ex4)
"aaabbb"

Example 5

ex5 :: RE Void Source #

>>> match ex5 "abab"
True
>>> match ex5 "ababa"
False
>>> showRef ex5
size: 8
show: Ref 0 (Alt Eps (App (Ref 0 <<loop>>) (App (Ch "a") (Ch "b"))))
null: True
>>> matchR ex5 "abab"
True
>>> matchR ex5 "ababa"
False
>>> runGen 42 (generate 10 20 ex5)
"ab"
>>> runGen 45 (generate 10 20 ex5)
"ababab"

Example 6

ex6 :: RE Void Source #

Using fix-point operator:

fix expr = "(" expr ")" | "1" | "2" | ... | "9" | expr "+" expr | expr "*" expr

which in BNF is almost he same

expr ::= "(" expr ")" | "1" | "2" | ... | "9" | expr "+" expr | expr "*" expr
>>> matchR ex6 "(1+2)*3"
True
>>> runGen 42 (generate 5 5 ex6)
"96+(09493+90790)*19"

Example 7

exCfg :: Ord a => CFG Nat5 a Source #

ex7 :: Ord a => RE a Source #

>>> matchR ex7 "12"
True
>>> matchR ex7 "(1+2)*3"
True
>>> charClasses ex7
fromList "\NUL()*+,0:"
>>> runGen 42 (generate 5 5 ex7)
"(0181+912595*00+((1228)+467+(80)+(216406))*(65)+4+5*5149+994734)"

Example 8

Example 9