[Haskell-cafe] happy + alex parsing question

Roman Dzvinkovsky romand.ne at gmail.com
Thu Feb 17 14:03:36 CET 2011


Thanks,
adding state to lexer seems to be the way to go.

2011/2/16 Mihai Maruseac <mihai.maruseac at gmail.com>

> On Wed, Feb 16, 2011 at 5:31 PM, Roman Dzvinkovsky <romand.ne at gmail.com>
> wrote:
> > Hi,
> >
> > using alex+happy, how could I parse lines like these?
> >
> >> "mr <username> says <message>\n"
> >
> > where both <username> and <message> may contain arbitrary characters
> (except
> > eol)?
> >
> > If I make lexer tokens
> >
> >> "mr "    { T_Mr }
> >> " says " { T_Says }
> >> \r?\n    { T_Eol }
> >> .        { T_Char $$ }
> >
> > and parser
> >
> >> 'mr '    { T_Mr }
> >> ' says ' { T_Says }
> >> eol      { T_Eol }
> >> char     { T_Char }
> >
> > ...
> >
> >> line :: { (String, String) }
> >>      : 'mr ' string ' says ' string eol { ($2, $4) }
> >
> >> string :: { String }
> >>        : char        { [ $1 ] }
> >>        | char string { $1 : $2 }
> >
> > then I get error when <username> or <message> contain "mr "
> > substrings, because parser encounters T_Mr token.
> >
> > Workaround is mention all small tokens in my <string> definition:
> >
> >> string :: { String }
> >>        :                 { [] }
> >>        | 'mr ' string    { "mr "    ++ $2 }
> >>        | ' says ' string { " says " ++ $2 }
> >>        | char string     { $1 : $2 }
> >
> > but that is weird and I'm sure there is a better way.
> >
>
> I don't have an implementation right now but you could try having some
> states or user data in which to record whether you have already parsed
> the 'mr ' part (etc..) Guess you could use monadUserData parser (just
> like I've found after a night without sleep [1] - solved now).
>
> --
> Mihai
>
> [1]:
> http://www.haskell.org/pipermail/haskell-cafe/2011-February/089330.html
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20110217/56323377/attachment.htm>


More information about the Haskell-Cafe mailing list