Nested Quasis

Mark S. Miller erights at google.com
Thu Feb 2 11:40:02 PST 2012


On Thu, Feb 2, 2012 at 11:27 AM, Waldemar Horwat <waldemar at google.com>wrote:

> On 02/02/2012 11:03 AM, Mark S. Miller wrote:
>
>  On Thu, Feb 2, 2012 at 5:09 AM, Douglas Crockford <douglas at crockford.com<mailto:
>> douglas at crockford.com>**> wrote:
>>
>>    On 11:59 AM, Waldemar Horwat wrote:
>>
>>        On 02/01/2012 11:35 AM, Allen Wirfs-Brock wrote:
>>        Here's one which I couldn't express in a lexer grammar: How to
>> restart
>>        the quasi after an included expression is over.
>>
>>
>>    If quasis are not nested, then the lexical rule is really simple: Just
>> match the `s, and within the literal, match the {}s.
>>
>>    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.
>>
>>
>> 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.
>>
>> 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:
>>
>> Lexing grammar has four new token types.
>>
>>     QuasiOnly ::
>>
>>         ` QuasiChar* `
>>
>>     QuasiOpen ::
>>
>>         ` QuasiChar* $
>>
>>     QuasiMiddle ::
>>
>>         QuasiChar*
>>
>>     QuasiEnd ::
>>
>>         QuasiChar `
>>
> (presumably you forgot a * in QuasiEnd?)
>

y. I also messed up one more thing:


     QuasiMiddle ::

         QuasiChar* $

Sorry for the confusion.



> That's not a valid lexer grammar.


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.



>  The input
>
>  if
>
> is now ambiguous -- it can lex as either a keyword or a QuasiMiddle.


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).



>  The input
>
>  3+`
>
> will now lex as QuasiEnd, which may or may not be what you want.


Only if after a quasiHole.


>
>
>    Waldemar
>



-- 
    Cheers,
    --MarkM
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20120202/1cfbe5a6/attachment.html>


More information about the es-discuss mailing list