@@ -309,6 +309,54 @@ OpAssign : '*=' { AST.JSTimesAssign (mkJSAnnot $1) }
309
309
| ' ^=' { AST.JSBwXorAssign (mkJSAnnot $1 ) }
310
310
| ' |=' { AST.JSBwOrAssign (mkJSAnnot $1 ) }
311
311
312
+ -- IdentifierName :: See 7.6
313
+ -- IdentifierStart
314
+ -- IdentifierName IdentifierPart
315
+ -- Note : This production needs to precede the productions for all keyword
316
+ -- statements and PrimaryExpression. Contra the Happy documentation , in the
317
+ -- case of a reduce /reduce conflict , the *later * rule takes precedence , and
318
+ -- the ambiguity of , for example , `{break }` needs to resolve in favor of
319
+ -- `break ` as a keyword and not as an identifier in property shorthand
320
+ -- syntax.
321
+ -- TODO : make this include any reserved word too , including future ones
322
+ IdentifierName :: { AST.JSExpression }
323
+ IdentifierName : Identifier {$1 }
324
+ | ' break' { AST.JSIdentifier (mkJSAnnot $1 ) " break" }
325
+ | ' case' { AST.JSIdentifier (mkJSAnnot $1 ) " case" }
326
+ | ' catch' { AST.JSIdentifier (mkJSAnnot $1 ) " catch" }
327
+ | ' const' { AST.JSIdentifier (mkJSAnnot $1 ) " const" }
328
+ | ' continue' { AST.JSIdentifier (mkJSAnnot $1 ) " continue" }
329
+ | ' debugger' { AST.JSIdentifier (mkJSAnnot $1 ) " debugger" }
330
+ | ' default' { AST.JSIdentifier (mkJSAnnot $1 ) " default" }
331
+ | ' delete' { AST.JSIdentifier (mkJSAnnot $1 ) " delete" }
332
+ | ' do' { AST.JSIdentifier (mkJSAnnot $1 ) " do" }
333
+ | ' else' { AST.JSIdentifier (mkJSAnnot $1 ) " else" }
334
+ | ' enum' { AST.JSIdentifier (mkJSAnnot $1 ) " enum" }
335
+ | ' export' { AST.JSIdentifier (mkJSAnnot $1 ) " export" }
336
+ | ' false' { AST.JSIdentifier (mkJSAnnot $1 ) " false" }
337
+ | ' finally' { AST.JSIdentifier (mkJSAnnot $1 ) " finally" }
338
+ | ' for' { AST.JSIdentifier (mkJSAnnot $1 ) " for" }
339
+ | ' function' { AST.JSIdentifier (mkJSAnnot $1 ) " function" }
340
+ | ' if' { AST.JSIdentifier (mkJSAnnot $1 ) " if" }
341
+ | ' in' { AST.JSIdentifier (mkJSAnnot $1 ) " in" }
342
+ | ' instanceof' { AST.JSIdentifier (mkJSAnnot $1 ) " instanceof" }
343
+ | ' let' { AST.JSIdentifier (mkJSAnnot $1 ) " let" }
344
+ | ' new' { AST.JSIdentifier (mkJSAnnot $1 ) " new" }
345
+ | ' null' { AST.JSIdentifier (mkJSAnnot $1 ) " null" }
346
+ | ' of' { AST.JSIdentifier (mkJSAnnot $1 ) " of" }
347
+ | ' return' { AST.JSIdentifier (mkJSAnnot $1 ) " return" }
348
+ | ' switch' { AST.JSIdentifier (mkJSAnnot $1 ) " switch" }
349
+ | ' this' { AST.JSIdentifier (mkJSAnnot $1 ) " this" }
350
+ | ' throw' { AST.JSIdentifier (mkJSAnnot $1 ) " throw" }
351
+ | ' true' { AST.JSIdentifier (mkJSAnnot $1 ) " true" }
352
+ | ' try' { AST.JSIdentifier (mkJSAnnot $1 ) " try" }
353
+ | ' typeof' { AST.JSIdentifier (mkJSAnnot $1 ) " typeof" }
354
+ | ' var' { AST.JSIdentifier (mkJSAnnot $1 ) " var" }
355
+ | ' void' { AST.JSIdentifier (mkJSAnnot $1 ) " void" }
356
+ | ' while' { AST.JSIdentifier (mkJSAnnot $1 ) " while" }
357
+ | ' with' { AST.JSIdentifier (mkJSAnnot $1 ) " with" }
358
+ | ' future' { AST.JSIdentifier (mkJSAnnot $1 ) (tokenLiteral $1 ) }
359
+
312
360
Var :: { AST.JSAnnot }
313
361
Var : ' var' { mkJSAnnot $1 }
314
362
@@ -437,59 +485,13 @@ PrimaryExpression : 'this' { AST.JSLiteral (mkJSAnnot $1) "thi
437
485
438
486
-- Identifier :: See 7.6
439
487
-- IdentifierName but not ReservedWord
440
- -- IdentifierName :: See 7.6
441
- -- IdentifierStart
442
- -- IdentifierName IdentifierPart
443
488
Identifier :: { AST.JSExpression }
444
489
Identifier : ' ident' { AST.JSIdentifier (mkJSAnnot $1 ) (tokenLiteral $1 ) }
445
490
| ' as' { AST.JSIdentifier (mkJSAnnot $1 ) " as" }
446
491
| ' get' { AST.JSIdentifier (mkJSAnnot $1 ) " get" }
447
492
| ' set' { AST.JSIdentifier (mkJSAnnot $1 ) " set" }
448
493
| ' from' { AST.JSIdentifier (mkJSAnnot $1 ) " from" }
449
494
450
- -- TODO : make this include any reserved word too , including future ones
451
- IdentifierName :: { AST.JSExpression }
452
- IdentifierName : Identifier {$1 }
453
- | ' as' { AST.JSIdentifier (mkJSAnnot $1 ) " as" }
454
- | ' break' { AST.JSIdentifier (mkJSAnnot $1 ) " break" }
455
- | ' case' { AST.JSIdentifier (mkJSAnnot $1 ) " case" }
456
- | ' catch' { AST.JSIdentifier (mkJSAnnot $1 ) " catch" }
457
- | ' const' { AST.JSIdentifier (mkJSAnnot $1 ) " const" }
458
- | ' continue' { AST.JSIdentifier (mkJSAnnot $1 ) " continue" }
459
- | ' debugger' { AST.JSIdentifier (mkJSAnnot $1 ) " debugger" }
460
- | ' default' { AST.JSIdentifier (mkJSAnnot $1 ) " default" }
461
- | ' delete' { AST.JSIdentifier (mkJSAnnot $1 ) " delete" }
462
- | ' do' { AST.JSIdentifier (mkJSAnnot $1 ) " do" }
463
- | ' else' { AST.JSIdentifier (mkJSAnnot $1 ) " else" }
464
- | ' enum' { AST.JSIdentifier (mkJSAnnot $1 ) " enum" }
465
- | ' export' { AST.JSIdentifier (mkJSAnnot $1 ) " export" }
466
- | ' false' { AST.JSIdentifier (mkJSAnnot $1 ) " false" }
467
- | ' finally' { AST.JSIdentifier (mkJSAnnot $1 ) " finally" }
468
- | ' for' { AST.JSIdentifier (mkJSAnnot $1 ) " for" }
469
- | ' function' { AST.JSIdentifier (mkJSAnnot $1 ) " function" }
470
- | ' from' { AST.JSIdentifier (mkJSAnnot $1 ) " from" }
471
- | ' get' { AST.JSIdentifier (mkJSAnnot $1 ) " get" }
472
- | ' if' { AST.JSIdentifier (mkJSAnnot $1 ) " if" }
473
- | ' in' { AST.JSIdentifier (mkJSAnnot $1 ) " in" }
474
- | ' instanceof' { AST.JSIdentifier (mkJSAnnot $1 ) " instanceof" }
475
- | ' let' { AST.JSIdentifier (mkJSAnnot $1 ) " let" }
476
- | ' new' { AST.JSIdentifier (mkJSAnnot $1 ) " new" }
477
- | ' null' { AST.JSIdentifier (mkJSAnnot $1 ) " null" }
478
- | ' of' { AST.JSIdentifier (mkJSAnnot $1 ) " of" }
479
- | ' return' { AST.JSIdentifier (mkJSAnnot $1 ) " return" }
480
- | ' set' { AST.JSIdentifier (mkJSAnnot $1 ) " set" }
481
- | ' switch' { AST.JSIdentifier (mkJSAnnot $1 ) " switch" }
482
- | ' this' { AST.JSIdentifier (mkJSAnnot $1 ) " this" }
483
- | ' throw' { AST.JSIdentifier (mkJSAnnot $1 ) " throw" }
484
- | ' true' { AST.JSIdentifier (mkJSAnnot $1 ) " true" }
485
- | ' try' { AST.JSIdentifier (mkJSAnnot $1 ) " try" }
486
- | ' typeof' { AST.JSIdentifier (mkJSAnnot $1 ) " typeof" }
487
- | ' var' { AST.JSIdentifier (mkJSAnnot $1 ) " var" }
488
- | ' void' { AST.JSIdentifier (mkJSAnnot $1 ) " void" }
489
- | ' while' { AST.JSIdentifier (mkJSAnnot $1 ) " while" }
490
- | ' with' { AST.JSIdentifier (mkJSAnnot $1 ) " with" }
491
- | ' future' { AST.JSIdentifier (mkJSAnnot $1 ) (tokenLiteral $1 ) }
492
-
493
495
494
496
SpreadExpression :: { AST.JSExpression }
495
497
SpreadExpression : Spread Expression { AST.JSSpreadExpression $1 $2 {- ' SpreadExpression' -} }
@@ -548,6 +550,7 @@ PropertyNameandValueList : PropertyAssignment { A
548
550
-- TODO : not clear if get /set are keywords , or just used in a specific context. Puzzling.
549
551
PropertyAssignment :: { AST.JSObjectProperty }
550
552
PropertyAssignment : PropertyName Colon AssignmentExpression { AST.JSPropertyNameandValue $1 $2 [$3 ] }
553
+ | IdentifierName { identifierToProperty $1 }
551
554
-- Should be " get" in next , but is not a Token
552
555
| ' get' PropertyName LParen RParen FunctionBody
553
556
{ AST.JSPropertyAccessor (AST.JSAccessorGet (mkJSAnnot $1 )) $2 $3 [] $4 $5 }
@@ -1387,4 +1390,8 @@ propName (AST.JSOctal a s) = AST.JSPropertyNumber a s
1387
1390
propName (AST.JSStringLiteral a s) = AST.JSPropertyString a s
1388
1391
propName x = error $ "Cannot convert '" ++ show x ++ "' to a JSPropertyName."
1389
1392
1393
+ identifierToProperty :: AST.JSExpression -> AST.JSObjectProperty
1394
+ identifierToProperty (AST.JSIdentifier a s) = AST.JSPropertyIdentRef a s
1395
+ identifierToProperty x = error $ "Cannot convert '" ++ show x ++ "' to a JSObjectProperty."
1396
+
1390
1397
}
0 commit comments