@@ -75,7 +75,7 @@ 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 )
78
+ return @default ps @closer ps :block parse_blockexpr (ps, :struct , allow_const_field = true )
79
79
elseif k === Tokens. MUTABLE
80
80
return @default ps @closer ps :block parse_mutable (ps)
81
81
elseif k === Tokens. OUTER
@@ -246,7 +246,7 @@ function parse_blockexpr_sig(ps::ParseState, head)
246
246
if isendoflinews (ps. ws)
247
247
return EXPR (:block , EXPR[], nothing )
248
248
else
249
- arg = @closer ps :comma @closer ps :ws parse_expression (ps)
249
+ arg = @closer ps :comma @closer ps :ws parse_expression (ps)
250
250
if iscomma (ps. nt) || ! (is_wrapped_assignment (arg) || isidentifier (arg))
251
251
arg = EXPR (:block , EXPR[arg])
252
252
prevpos = position (ps)
@@ -273,15 +273,23 @@ function parse_blockexpr_sig(ps::ParseState, head)
273
273
end
274
274
return EXPR (:tuple , args, trivia)
275
275
elseif head === :module || head === :baremodule
276
- return isidentifier (ps. nt) ? EXPR (:IDENTIFIER , next (ps)) :
276
+ return if isidentifier (ps. nt)
277
+ if is_nonstd_identifier (ps)
278
+ parse_nonstd_identifier (ps)
279
+ else
280
+ EXPR (:IDENTIFIER , next (ps))
281
+ end
282
+ else
277
283
@precedence ps 15 @closer ps :ws parse_expression (ps)
284
+ end
278
285
end
279
286
return nothing
280
287
end
281
288
282
289
function parse_do (ps:: ParseState , pre:: EXPR )
283
290
args, trivia = EXPR[pre], EXPR[EXPR (next (ps))]
284
291
args1, trivia1 = EXPR[], EXPR[]
292
+
285
293
@closer ps :comma @closer ps :block while ! closer (ps)
286
294
push! (args1, @closer ps :ws a = parse_expression (ps))
287
295
if kindof (ps. nt) === Tokens. COMMA
@@ -370,7 +378,7 @@ function parse_try(ps::ParseState)
370
378
kw = EXPR (ps)
371
379
args = EXPR[]
372
380
trivia = EXPR[kw]
373
- tryblockargs = parse_block (ps, EXPR[], (Tokens. END, Tokens. CATCH, Tokens. FINALLY))
381
+ tryblockargs = parse_block (ps, EXPR[], (Tokens. END, Tokens. CATCH, Tokens. ELSE, Tokens . FINALLY))
374
382
push! (args, EXPR (:block , tryblockargs, nothing ))
375
383
376
384
# catch block
@@ -387,7 +395,7 @@ function parse_try(ps::ParseState)
387
395
caught = @closer ps :ws parse_expression (ps)
388
396
end
389
397
390
- catchblockargs = parse_block (ps, EXPR[], (Tokens. END, Tokens. FINALLY))
398
+ catchblockargs = parse_block (ps, EXPR[], (Tokens. END, Tokens. FINALLY, Tokens . ELSE ))
391
399
if ! (is_either_id_op_interp (caught) || headof (caught) === :FALSE )
392
400
pushfirst! (catchblockargs, caught)
393
401
caught = EXPR (:FALSE , 0 , 0 , " " )
@@ -402,14 +410,33 @@ function parse_try(ps::ParseState)
402
410
push! (args, caught)
403
411
push! (args, catchblock)
404
412
405
- # finally block
406
- if kindof (ps. nt) === Tokens. FINALLY
413
+ else_trivia = else_arg = nothing
414
+ # else block
415
+ if kindof (ps. nt) === Tokens. ELSE
407
416
if isempty (catchblock. args)
417
+ args[3 ] = EXPR (:block , 0 , 0 , " " )
418
+ end
419
+ else_trivia = EXPR (next (ps))
420
+ else_arg = EXPR (:block , parse_block (ps, EXPR[], (Tokens. FINALLY,Tokens. END)))
421
+ end
422
+
423
+ has_finally = false
424
+ if kindof (ps. nt) === Tokens. FINALLY
425
+ has_finally = true
426
+ if isempty (catchblock. args) && else_trivia === nothing
408
427
args[3 ] = EXPR (:FALSE , 0 , 0 , " " )
409
428
end
410
429
push! (trivia, EXPR (next (ps)))
411
- finallyblockargs = parse_block (ps)
412
- push! (args, EXPR (:block , finallyblockargs))
430
+ push! (args, EXPR (:block , parse_block (ps)))
431
+ end
432
+
433
+ if else_trivia != = nothing
434
+ if ! has_finally
435
+ push! (trivia, EXPR (:FALSE , 0 , 0 , " " ))
436
+ push! (args, EXPR (:FALSE , 0 , 0 , " " ))
437
+ end
438
+ push! (trivia, else_trivia)
439
+ push! (args, else_arg)
413
440
end
414
441
415
442
push! (trivia, accept_end (ps))
0 commit comments