4

Recently I have been trying to create in Haskell a regex interpretor. What I did was create a new data type with all possible constructors (for sequence, *, ^, intervals, etc) and then define a matcher function. It works wonders but my problem is that I have to convert the input (the String, for example "a(b*)(c|d)ef") to my data type ("Seq (Sym a) (Seq (Rep Sym b) (Seq (Or Sym c Sym d) Sym ef))"). I am having trouble with this part of the problem (I tried creating a new data type, a parsing tree, but I failed completely). Any ideas on how I could solve it?

2
  • In case you're not building this just for fun, there is also Text.Regex Commented Apr 18, 2012 at 12:52
  • 1
    haskell.org/haskellwiki/Parsec: I don't know its details, but it's a really good library for parsing... playing with it also teaches you many things about monads. Commented Apr 18, 2012 at 12:53

2 Answers 2

8

The canonical approach is to use a parser combinator library, such as Parsec. Parser combinator libraries (like parser generators) let you write descriptions of your grammar, yielding a parser from strings to tokens in that language.

You simply have to encode your grammar as a Parsec function.

As an example, see this previous SO question: Using Parsec to parse regular expressions

Sign up to request clarification or add additional context in comments.

2 Comments

@Jani Hartikainen: Unfortunately I am not allowed to use Text.Regex
Thank you, I will try to use Parsec and see what I manage to do
4

That's an interesting article (a play) on the implementation of regular expressions:

A Play on Regular Expressions

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.