@@ -1773,7 +1773,7 @@ def expression_ident(t):
1773
1773
1774
1774
@prod_dml14
1775
1775
def expression_ident (t ):
1776
- '''expression : objident
1776
+ '''expression : objident_or_underscore
1777
1777
| DEFAULT'''
1778
1778
t [0 ] = ast .variable (site (t ), t [1 ])
1779
1779
@@ -2643,19 +2643,25 @@ def objident(t):
2643
2643
| REGISTER'''
2644
2644
t [0 ] = t [1 ]
2645
2645
2646
- def ident_rule (idents ):
2647
- return 'ident : ' + "\n | " .join (idents )
2646
+ @prod_dml14
2647
+ def objident_or_underscore (t ):
2648
+ '''objident_or_underscore : ident_or_underscore
2649
+ | REGISTER'''
2650
+ t [0 ] = t [1 ]
2651
+
2652
+ def ident_rule (name , idents ):
2653
+ return f'{ name } : ' + "\n | " .join (idents )
2648
2654
2649
2655
# Most DML top-level keywords are also allowed as identifiers.
2650
2656
2651
2657
@prod_dml12
2652
- @lex .TOKEN (ident_rule (dmllex12 .reserved_idents + (
2653
- 'ID' , 'EACH' , 'SESSION' , 'SEQUENCE' )))
2658
+ @lex .TOKEN (ident_rule ('ident' , dmllex12 .reserved_idents + (
2659
+ 'ID' , 'EACH' , 'SESSION' , 'SEQUENCE' , '_' )))
2654
2660
def ident (t ):
2655
2661
t [0 ] = t [1 ]
2656
2662
2657
2663
@prod_dml14
2658
- @lex .TOKEN (ident_rule (dmllex14 .reserved_idents + ('ID' ,)))
2664
+ @lex .TOKEN (ident_rule ('ident' , dmllex14 .reserved_idents + ('ID' ,)))
2659
2665
def ident (t ):
2660
2666
t [0 ] = t [1 ]
2661
2667
@@ -2664,6 +2670,11 @@ def ident_enforce_not_discard_ref(site, ident):
2664
2670
and site .dml_version () != (1 , 2 )
2665
2671
and compat .discard_ref_shadowing not in dml .globals .enabled_compat ):
2666
2672
report (ESYNTAX (site , '_' , "reserved identifier" ))
2673
+ @prod_dml14
2674
+ @lex .TOKEN (ident_rule ('ident_or_underscore' ,
2675
+ dmllex14 .reserved_idents + ('ID' , '_' )))
2676
+ def ident_or_underscore (t ):
2677
+ t [0 ] = t [1 ]
2667
2678
2668
2679
reserved_words_12 = [
2669
2680
'CLASS' , 'ENUM' , 'NAMESPACE' , 'PRIVATE' , 'PROTECTED' , 'PUBLIC' ,
@@ -2674,15 +2685,27 @@ def ident_enforce_not_discard_ref(site, ident):
2674
2685
'ASYNC' , 'AWAIT' , 'WITH' ]
2675
2686
2676
2687
@prod_dml12
2677
- @lex .TOKEN (ident_rule (reserved_words_12 ))
2688
+ @lex .TOKEN (ident_rule ('ident' , reserved_words_12 ))
2678
2689
def reserved (t ):
2679
2690
raise ESYNTAX (site (t , 1 ), str (t [1 ]), "reserved word" )
2680
2691
2681
2692
@prod_dml14
2682
- @lex .TOKEN (ident_rule (reserved_words_14 ))
2693
+ @lex .TOKEN (ident_rule ('ident' , reserved_words_14 ))
2683
2694
def reserved (t ):
2684
2695
raise ESYNTAX (site (t , 1 ), str (t [1 ]), "reserved word" )
2685
2696
2697
+ @prod_dml14
2698
+ @lex .TOKEN (ident_rule ('ident_or_underscore' , reserved_words_14 ))
2699
+ def reserved_ (t ):
2700
+ raise ESYNTAX (site (t , 1 ), str (t [1 ]), "reserved word" )
2701
+
2702
+ @prod_dml14
2703
+ @lex .TOKEN (ident_rule ('ident' , ['_' ]))
2704
+ def ident_underscore (t ):
2705
+ if compat .discard_ref_shadowing not in dml .globals .enabled_compat :
2706
+ report (ESYNTAX (site (t ), '_' , "reserved identifier" ))
2707
+ t [0 ] = t [1 ]
2708
+
2686
2709
# Error handling
2687
2710
@prod
2688
2711
def error (t ):
0 commit comments