Skip to content
← Back

src/syntax/parsers/modifiers/modifier.ghul

1
namespace Syntax.Parsers.Modifiers is
2
class MODIFIER(): Base[Trees.Modifiers.Modifier] is
3
super()
4
5
init(..) is
6
add_parsers()
7
si
8
9
add_parsers() is
10
add_parser(
11
context => Trees.Modifiers.PUBLIC(context.location_and_next()),
12
Lexical.TOKEN.PUBLIC
13
)
14
15
add_parser(
16
context => Trees.Modifiers.PRIVATE(context.location_and_next()),
17
Lexical.TOKEN.PRIVATE
18
)
19
20
add_parser(
21
context => Trees.Modifiers.PROTECTED(context.location_and_next()),
22
Lexical.TOKEN.PROTECTED
23
)
24
25
add_parser(
26
context => Trees.Modifiers.STATIC(context.location_and_next()),
27
Lexical.TOKEN.STATIC
28
)
29
30
add_parser(
31
context => Trees.Modifiers.FIELD(context.location_and_next()),
32
Lexical.TOKEN.FIELD
33
)
34
35
add_parser(
36
context => Trees.Modifiers.ABSTRACT(context.location_and_next()),
37
Lexical.TOKEN.ABSTRACT
38
)
39
si
40
41
// `init` and `open` remain contextual: promoting `init` would
42
// break every `init(...)` method declaration, and `open` is a
43
// common identifier in stream/file APIs. In modifier position
44
// the IDENTIFIER token with the right text produces the
45
// corresponding Modifier subtype; everything else falls
46
// through, ending the modifier list. Semantic validity (which
47
// modifiers can appear where) is enforced during later passes.
48
other_token(context: CONTEXT) -> Trees.Modifiers.Modifier? is
49
if context.current.token == Lexical.TOKEN.IDENTIFIER then
50
if context.current.value_string =~ "init" then
51
return Trees.Modifiers.INIT(context.location_and_next())
52
elif context.current.value_string =~ "open" then
53
return Trees.Modifiers.OPEN(context.location_and_next())
54
elif context.current.value_string =~ "pure" then
55
return Trees.Modifiers.PURE(context.location_and_next())
56
elif context.current.value_string =~ "stable" then
57
return Trees.Modifiers.STABLE(context.location_and_next())
58
fi
59
fi
60
return null
61
si
62
si
63
si