<br><br><div class="gmail_quote">On Thu, Feb 2, 2012 at 11:27 AM, Waldemar Horwat <span dir="ltr"><<a href="mailto:waldemar@google.com">waldemar@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
On 02/02/2012 11:03 AM, Mark S. Miller wrote:<div class="im"><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
On Thu, Feb 2, 2012 at 5:09 AM, Douglas Crockford <<a href="mailto:douglas@crockford.com" target="_blank">douglas@crockford.com</a> <mailto:<a href="mailto:douglas@crockford.com" target="_blank">douglas@crockford.com</a>><u></u>> wrote:<br>

<br>
    On 11:59 AM, Waldemar Horwat wrote:<br>
<br>
        On 02/01/2012 11:35 AM, Allen Wirfs-Brock wrote:<br>
        Here's one which I couldn't express in a lexer grammar: How to restart<br>
        the quasi after an included expression is over.<br>
<br>
<br>
    If quasis are not nested, then the lexical rule is really simple: Just match the `s, and within the literal, match the {}s.<br>
<br>
    I would prefer to keep it simple, unless there is a compelling requirement to provide nesting. If we do the simple version now, we could allow the nested case in the future.<br>
<br>
<br>
When we came up with this "simplification", I thought I could live with it. Now, having tried to write some examples within these restrictions, I find it unusable.<br>
<br>
I think we're overestimating the parsing difficulty. I'll let Mike speak for the real plan. But I'd like to explain what I do in E, so that we can see that none of this need be complicated. It does involve an interaction between the parsing and lexing levels, but much less complex than you may expect, and comparable (IMO less) than the existing unclean interaction that JS already has:<br>

<br>
Lexing grammar has four new token types.<br>
<br>
     QuasiOnly ::<br>
<br>
         ` QuasiChar* `<br>
<br>
     QuasiOpen ::<br>
<br>
         ` QuasiChar* $<br>
<br>
     QuasiMiddle ::<br>
<br>
         QuasiChar*<br>
<br>
     QuasiEnd ::<br>
<br>
         QuasiChar `<br>
</blockquote></div>
(presumably you forgot a * in QuasiEnd?)<br></blockquote><div><br></div><div>y. I also messed up one more thing:</div><div><br></div><div><br></div><div>     QuasiMiddle ::</div><div><br></div><div>         QuasiChar* $</div>
<div><br></div><div>Sorry for the confusion.</div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
That's not a valid lexer grammar.</blockquote><div><br></div><div>I didn't explain well enough. QuasiMiddle and QuasiEnd apply only after a quasiHole, and they apply immediately after a quasiHole. That's the complexity I was referring to: it introduces yet another lexing context, and the determination about whether we're in that lexing context demands counting curlies -- which a regular expression can't do.</div>
<div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">  The input<br>
<br>
  if<br>
<br>
is now ambiguous -- it can lex as either a keyword or a QuasiMiddle.</blockquote><div><br></div><div>If it occurs immediately after a quasiHole, then it is a QuasiMiddle or QuasiEnd, depending on whether it is terminated by a $ or `. (See correction above).</div>
<div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">  The input<br>
<br>
  3+`<br>
<br>
will now lex as QuasiEnd, which may or may not be what you want.</blockquote><div><br></div><div>Only if after a quasiHole.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<span class="HOEnZb"><font color="#888888"><br>
<br>
    Waldemar<br>
</font></span></blockquote></div><br><br clear="all"><div><br></div>-- <br>    Cheers,<br>    --MarkM<br>