The top-down approach by default is to parse a cover grammar until an unambiguous decision point is reached, then depending on the decision, rewrite the AST (e.g., to make a labeled statement in a block instead of an object initializer).

A somewhat less intrusive way to disambiguate blocks/objects
might be to separate labels from identifiers - keep the old labels
for backward compatibility,

Why do we need the old useless (unusable, literally) labels for backward compatibility?

Yes, stray labels creep into JS. Typically you find javascript: at the front of scripts. But finding and fixing these is a one time migration step caught by an early error.

I don't understand how these comments relate to my suggestion,
so let me try to clarify what I was suggesting, and why:

- the grammars for block and objects share common prefixes,
   leading to ambiguities that can be resolved by lookahead

- your proposal suggests parsing a cover grammar until
   disambiguation, plus restrictions to LabelledStatement

- both LabelledStatement and PropertyAssignment permit
   IdentifierName followed by ':', followed by something,
   so disambiguation has to be in the something following
   the ':', where overlaps like ExpressionStatement further
   extend the ambiguity

My suggestion was simply to remove IdentifierName from
one of the two, by prefixing labels, thereby moving the
disambiguation point forward. By my estimate, that should
reduce the range of lookahead, the size of cover grammars,
and the need for restricted grammars.

I don't know what that has to do with stray labels, and it
is obviously not possible to remove the old label syntax
immediately. But it would be possible to disambiguate
conflicts between property names and block labels in
favour of property names.

but add labels starting with, say ':' (just to pick a prefix).

We really don't want two label syntaxes, ..

Right. The old syntax could be deprecated (when opting in
for ES/next) - it also doesn't allow label parameters or
label variables.

The block vs. object literal disambiguation part of the proposal is at least as solid as the leading formal parameter list, which parses as a comma expression until you get to the arrow. Indeed TC39 may want the label restriction and block vs. object literal part pulled out -- we shall see.

I'm not trying to decide whether the proposal's version is solid, but it is a non-trivial change, and I've seen non-trivial suggestions shot down because they were thought to be risky. The more options there are for dealing with the object literals vs blocks ambiguity, the better the chances for it actually happening. Also, special-casing labelled
statements increases the complexity of the grammar.

As a third, extreme option, one could disambiguate by
always preferring the object literal interpretation, and ask programmers to start blocks in otherwise ambiguous contexts with an empty statement ('{; ..}' cannot be an object literal). That would require the fewest changes, and perhaps it is all we need, but I'm not sure how well it would work in practice, with existing code.

we should focus on the harder nut to crack (the leading parenthesized parameter list).

Isn't that an example of issues that would not exist if
arrow functions had a prefix marker?

Claus


_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to