Skip to content

Commit 675189a

Browse files
committed
Refactor underscore ban
1 parent 9c1b160 commit 675189a

File tree

3 files changed

+34
-10
lines changed

3 files changed

+34
-10
lines changed

grammar_to_md.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,8 @@
7878
'BCONST' : '<i>binary-literal</i>',
7979
'FCONST' : '<i>float-literal</i>',
8080
'ELLIPSIS' : '<i>"..."</i>',
81-
'<empty>' : '&lt;empty&gt;'
81+
'<empty>' : '&lt;empty&gt;',
82+
'_' : '<b>_</b>'
8283
}
8384

8485
for k in (reserved_idents

py/dml/dmllex.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
'AFTER', 'ASSERT', 'BITFIELDS', 'CALL', 'CAST', 'DEFINED', 'ERROR',
2222
'FOREACH', 'IN', 'IS', 'LAYOUT', 'LOCAL', 'LOG', 'SELECT',
2323
'SIZEOFTYPE', 'TYPEOF', 'UNDEFINED', 'VECT', '_WARNING', 'WHERE',
24-
'EACH', 'SESSION', 'SEQUENCE',
24+
'EACH', 'SESSION', 'SEQUENCE', '_',
2525

2626
# ANSI C reserved words
2727
'AUTO', 'BREAK', 'CASE', 'CHAR', 'CONST', 'CONTINUE', 'DEFAULT',

py/dml/dmlparse.py

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1773,7 +1773,7 @@ def expression_ident(t):
17731773

17741774
@prod_dml14
17751775
def 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', '_')))
26542660
def 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',)))
26592665
def 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

26682679
reserved_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))
26782689
def 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))
26832694
def 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
26882711
def error(t):

0 commit comments

Comments
 (0)