Skip to content
← Back

src/syntax/parsers/modifiers/list.ghul

1
namespace Syntax.Parsers.Modifiers is
2
3
use Source;
4
5
class LIST(modifier_parser: Parser[Trees.Modifiers.Modifier]): Base[Trees.Modifiers.LIST] is
6
super();
7
8
parse(context: CONTEXT) -> Trees.Modifiers.LIST is
9
let start = context.location;
10
let end mut = context.location;
11
let access_modifier: Trees.Modifiers.AccessModifier? mut = null;
12
let storage_class: Trees.Modifiers.StorageClass? mut = null;
13
let is_abstract mut = false;
14
let is_pure mut = false;
15
16
while true do
17
let modifier = modifier_parser.parse(context);
18
19
if !modifier? then
20
break;
21
fi
22
23
end = modifier.location;
24
25
if isa Trees.Modifiers.AccessModifier(modifier) then
26
if access_modifier? then
27
context.error(modifier.location, "duplicate access modifier");
28
else
29
access_modifier = modifier;
30
fi
31
elif modifier.is_abstract then
32
is_abstract = true;
33
elif modifier.is_pure then
34
is_pure = true;
35
elif isa Trees.Modifiers.StorageClass(modifier) then
36
if storage_class? then
37
context.error(modifier.location, "duplicate storage class modifier");
38
else
39
storage_class = modifier;
40
fi
41
else
42
context.error(modifier.location, "unexpected modifier {modifier}");
43
fi
44
od
45
46
let result = Trees.Modifiers.LIST(start::end, access_modifier, storage_class);
47
result.is_abstract = is_abstract;
48
result.is_pure = is_pure;
49
return result;
50
si
51
si
52
si