Thanks,<br>adding state to lexer seems to be the way to go.<br><br><div class="gmail_quote">2011/2/16 Mihai Maruseac <span dir="ltr">&lt;<a href="mailto:mihai.maruseac@gmail.com">mihai.maruseac@gmail.com</a>&gt;</span><br>
<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"><div><div></div><div class="h5">On Wed, Feb 16, 2011 at 5:31 PM, Roman Dzvinkovsky &lt;<a href="http://romand.ne" target="_blank">romand.ne</a>@<a href="http://gmail.com" target="_blank">gmail.com</a>&gt; wrote:<br>

&gt; Hi,<br>
&gt;<br>
&gt; using alex+happy, how could I parse lines like these?<br>
&gt;<br>
&gt;&gt; &quot;mr &lt;username&gt; says &lt;message&gt;\n&quot;<br>
&gt;<br>
&gt; where both &lt;username&gt; and &lt;message&gt; may contain arbitrary characters (except<br>
&gt; eol)?<br>
&gt;<br>
&gt; If I make lexer tokens<br>
&gt;<br>
&gt;&gt; &quot;mr &quot;    { T_Mr }<br>
&gt;&gt; &quot; says &quot; { T_Says }<br>
&gt;&gt; \r?\n    { T_Eol }<br>
&gt;&gt; .        { T_Char $$ }<br>
&gt;<br>
&gt; and parser<br>
&gt;<br>
&gt;&gt; &#39;mr &#39;    { T_Mr }<br>
&gt;&gt; &#39; says &#39; { T_Says }<br>
&gt;&gt; eol      { T_Eol }<br>
&gt;&gt; char     { T_Char }<br>
&gt;<br>
&gt; ...<br>
&gt;<br>
&gt;&gt; line :: { (String, String) }<br>
&gt;&gt;      : &#39;mr &#39; string &#39; says &#39; string eol { ($2, $4) }<br>
&gt;<br>
&gt;&gt; string :: { String }<br>
&gt;&gt;        : char        { [ $1 ] }<br>
&gt;&gt;        | char string { $1 : $2 }<br>
&gt;<br>
&gt; then I get error when &lt;username&gt; or &lt;message&gt; contain &quot;mr &quot;<br>
&gt; substrings, because parser encounters T_Mr token.<br>
&gt;<br>
&gt; Workaround is mention all small tokens in my &lt;string&gt; definition:<br>
&gt;<br>
&gt;&gt; string :: { String }<br>
&gt;&gt;        :                 { [] }<br>
&gt;&gt;        | &#39;mr &#39; string    { &quot;mr &quot;    ++ $2 }<br>
&gt;&gt;        | &#39; says &#39; string { &quot; says &quot; ++ $2 }<br>
&gt;&gt;        | char string     { $1 : $2 }<br>
&gt;<br>
&gt; but that is weird and I&#39;m sure there is a better way.<br>
&gt;<br>
<br>
</div></div>I don&#39;t have an implementation right now but you could try having some<br>
states or user data in which to record whether you have already parsed<br>
the &#39;mr &#39; part (etc..) Guess you could use monadUserData parser (just<br>
like I&#39;ve found after a night without sleep [1] - solved now).<br>
<font color="#888888"><br>
--<br>
Mihai<br>
<br>
[1]: <a href="http://www.haskell.org/pipermail/haskell-cafe/2011-February/089330.html" target="_blank">http://www.haskell.org/pipermail/haskell-cafe/2011-February/089330.html</a><br>
</font></blockquote></div><br>