On Fri, Feb 3, 2012 at 12:58 PM, Waldemar Horwat <span dir="ltr"><<a href="mailto:waldemar@google.com">waldemar@google.com</a>></span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="HOEnZb"><div class="h5">On 02/02/2012 06:27 PM, Waldemar Horwat wrote:<br></div></div></blockquote><div>[...] </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="HOEnZb"><div class="h5"></div></div>
Note that this is more complex than just having the parser switch modes for the treatment of / as division vs. regexp.  Here comments and white space are also affected, which can in turn the structure of the lexer upside down.  The kinds of cases I'm thinking of are:<br>

<br>
`abc$/*comment*/identifier//<br>
`<br>
(here we have a /**/ comment and a // comment)<br></blockquote><div><br></div><div>There is no valid quasiHole above, so the whole thing matches a QuasiOnly. The QuasiOnly includes all characters between the backticks. Nothing is taken to be a comment, just like it wouldn't be if it appeared within a string.</div>
<div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
`abc$/**/{/**//re//**/}/**/<u></u>def`<br>
vs:<br>
`abc$/**/{/**//re//**/}/*def`<br>
(in the former all four "/**/"'s are comments.  Not sure what the latter would do.)<br></blockquote><div><br></div><div>Same thing. There is no valid quasiHole here.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<br>
`abc$id def`<br>
`abc$ id def`<br>
(the lexer removes spaces before all tokens, so the quasi would not contain a space before the "def")</blockquote><div><br></div><div>The first has a valid quasiHole, and so would parse as QuasiOpen("abc"), Identifier("id"), QuasiClose(" def"). (Note space captured in the QuasiClose text.)</div>
<div><br></div><div>The second has no valid quasiHole, and so the whole thing would again parse as a QuasiOnly. </div><div><br></div><div>I think of, for example, QuasiMiddle as being much like DoubleStringChars. Once you're lexing that, all spaces are significant. As a lexing context, I don't really see how quasis are weirder than strings.</div>
<div><br></div><div>However, from your example, I think I see what you're getting at. I forgot to state that a quasiExpr is only started if a QuasiOpen or QuasiMiddle ends with an (unescaped by previous $\ ) $ followed *immediately*, with no intervening characters, by either an Identifier or a "{". I don't see this as weirder than having a string terminate by (\ ") but not by (\"). The " is only processed specially if it comes immediately after an (unescaped by previous \ ) \ . </div>
<div><br></div><div>Similarly, you go back into quasi context *immediately* following the identifier or matching } respectively, i.e., exactly when the quasiHole production is over.</div><div><br></div></div>-- <br>    Cheers,<br>
    --MarkM<br>