3
3
4
4
Dispatch function for when the parser has reached a keyword.
5
5
"""
6
- function parse_kw (ps:: ParseState ; allow_const_field = false )
6
+ function parse_kw (ps:: ParseState )
7
7
k = kindof (ps. t)
8
8
if ps. closer. precedence == 20 && ps. lt. kind === Tokens. EX_OR && k != = Tokens. END
9
9
return EXPR (:IDENTIFIER , ps)
@@ -52,7 +52,7 @@ function parse_kw(ps::ParseState; allow_const_field = false)
52
52
elseif k === Tokens. BAREMODULE
53
53
return @default ps @closer ps :block parse_blockexpr (ps, :baremodule )
54
54
elseif k === Tokens. CONST
55
- return @default ps parse_const (ps; allow_const_field = allow_const_field )
55
+ return @default ps parse_const (ps)
56
56
elseif k === Tokens. GLOBAL
57
57
return @default ps parse_local_global (ps, false )
58
58
elseif k === Tokens. LOCAL
@@ -75,7 +75,10 @@ function parse_kw(ps::ParseState; allow_const_field = false)
75
75
elseif k === Tokens. TYPE
76
76
return EXPR (:IDENTIFIER , ps)
77
77
elseif k === Tokens. STRUCT
78
- return @default ps @closer ps :block parse_blockexpr (ps, :struct , allow_const_field = true )
78
+ enable! (ps, ParserFlags. AllowConstWithoutAssignment)
79
+ ret = @default ps @closer ps :block parse_blockexpr (ps, :struct )
80
+ disable! (ps, ParserFlags. AllowConstWithoutAssignment)
81
+ return ret
79
82
elseif k === Tokens. MUTABLE
80
83
return @default ps @closer ps :block parse_mutable (ps)
81
84
elseif k === Tokens. OUTER
@@ -85,10 +88,14 @@ function parse_kw(ps::ParseState; allow_const_field = false)
85
88
end
86
89
end
87
90
88
- function parse_const (ps:: ParseState ; allow_const_field = false )
91
+ function parse_const (ps:: ParseState )
89
92
kw = EXPR (ps)
93
+ lt = ps. lt
94
+ nt = ps. nt
90
95
arg = parse_expression (ps)
91
- if ! allow_const_field && ! (isassignment (unwrapbracket (arg)) || (headof (arg) === :global && length (arg. args) > 0 && isassignment (unwrapbracket (arg. args[1 ]))))
96
+ allow_no_assignment = has_flag (ps, ParserFlags. AllowConstWithoutAssignment) ||
97
+ has_flag (ps, ParserFlags. InQuote) && (kindof (nt) === Tokens. GLOBAL || kindof (lt) === Tokens. GLOBAL)
98
+ if ! allow_no_assignment && ! (isassignment (unwrapbracket (arg)) || (headof (arg) === :global && length (arg. args) > 0 && isassignment (unwrapbracket (arg. args[1 ]))))
92
99
arg = mErrorToken (ps, arg, ExpectedAssignment)
93
100
end
94
101
ret = EXPR (:const , EXPR[arg], EXPR[kw])
@@ -154,7 +161,11 @@ function parse_mutable(ps::ParseState)
154
161
if kindof (ps. nt) === Tokens. STRUCT
155
162
kw = EXPR (ps)
156
163
next (ps)
157
- ret = parse_blockexpr (ps, :mutable , allow_const_field = true )
164
+
165
+ enable! (ps, ParserFlags. AllowConstWithoutAssignment)
166
+ ret = parse_blockexpr (ps, :mutable )
167
+ disable! (ps, ParserFlags. AllowConstWithoutAssignment)
168
+
158
169
pushfirst! (ret. trivia, setparent! (kw, ret))
159
170
update_span! (ret)
160
171
else
@@ -308,15 +319,15 @@ function parse_do(ps::ParseState, pre::EXPR)
308
319
end
309
320
310
321
"""
311
- parse_blockexpr(ps::ParseState, head; allow_const_field = false )
322
+ parse_blockexpr(ps::ParseState, head)
312
323
313
324
General function for parsing block expressions comprised of a series of statements
314
325
terminated by an `end`.
315
326
"""
316
- function parse_blockexpr (ps:: ParseState , head; allow_const_field = false )
327
+ function parse_blockexpr (ps:: ParseState , head)
317
328
kw = EXPR (ps)
318
329
sig = parse_blockexpr_sig (ps, head)
319
- blockargs = parse_block (ps, EXPR[], (Tokens. END,), docable (head); allow_const_field = allow_const_field )
330
+ blockargs = parse_block (ps, EXPR[], (Tokens. END,), docable (head))
320
331
if head === :begin
321
332
EXPR (:block , blockargs, EXPR[kw, accept_end (ps)])
322
333
elseif sig === nothing
0 commit comments