@@ -1773,7 +1773,7 @@ def expression_ident(t):
17731773
17741774@prod_dml14
17751775def expression_ident (t ):
1776- '''expression : objident
1776+ '''expression : objident_or_underscore
17771777 | DEFAULT'''
17781778 t [0 ] = ast .variable (site (t ), t [1 ])
17791779
@@ -2643,19 +2643,25 @@ def objident(t):
26432643 | REGISTER'''
26442644 t [0 ] = t [1 ]
26452645
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 )
26482654
26492655# Most DML top-level keywords are also allowed as identifiers.
26502656
26512657@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' , '_' )))
26542660def ident (t ):
26552661 t [0 ] = t [1 ]
26562662
26572663@prod_dml14
2658- @lex .TOKEN (ident_rule (dmllex14 .reserved_idents + ('ID' ,)))
2664+ @lex .TOKEN (ident_rule ('ident' , dmllex14 .reserved_idents + ('ID' ,)))
26592665def ident (t ):
26602666 t [0 ] = t [1 ]
26612667
@@ -2664,6 +2670,11 @@ def ident_enforce_not_discard_ref(site, ident):
26642670 and site .dml_version () != (1 , 2 )
26652671 and compat .discard_ref_shadowing not in dml .globals .enabled_compat ):
26662672 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 ]
26672678
26682679reserved_words_12 = [
26692680 'CLASS' , 'ENUM' , 'NAMESPACE' , 'PRIVATE' , 'PROTECTED' , 'PUBLIC' ,
@@ -2674,15 +2685,27 @@ def ident_enforce_not_discard_ref(site, ident):
26742685 'ASYNC' , 'AWAIT' , 'WITH' ]
26752686
26762687@prod_dml12
2677- @lex .TOKEN (ident_rule (reserved_words_12 ))
2688+ @lex .TOKEN (ident_rule ('ident' , reserved_words_12 ))
26782689def reserved (t ):
26792690 raise ESYNTAX (site (t , 1 ), str (t [1 ]), "reserved word" )
26802691
26812692@prod_dml14
2682- @lex .TOKEN (ident_rule (reserved_words_14 ))
2693+ @lex .TOKEN (ident_rule ('ident' , reserved_words_14 ))
26832694def reserved (t ):
26842695 raise ESYNTAX (site (t , 1 ), str (t [1 ]), "reserved word" )
26852696
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+
26862709# Error handling
26872710@prod
26882711def error (t ):
0 commit comments