jievro-parser 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/.travis.yml +3 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +30 -0
- data/README.md +1 -0
- data/Rakefile +7 -0
- data/lib/parser/binary_operator.rb +64 -0
- data/lib/parser/grammar/code_block.treetop +46 -0
- data/lib/parser/grammar/declaration/constant_declaration.treetop +38 -0
- data/lib/parser/grammar/declaration/declaration.treetop +16 -0
- data/lib/parser/grammar/declaration/function_declaration.treetop +302 -0
- data/lib/parser/grammar/declaration/variable_declaration.treetop +38 -0
- data/lib/parser/grammar/expression/binary_expression.treetop +75 -0
- data/lib/parser/grammar/expression/closure_expression.treetop +188 -0
- data/lib/parser/grammar/expression/expression.treetop +83 -0
- data/lib/parser/grammar/expression/function_call_expression.treetop +32 -0
- data/lib/parser/grammar/expression/literal_expression.treetop +8 -0
- data/lib/parser/grammar/expression/parenthesized_expression.treetop +146 -0
- data/lib/parser/grammar/expression/postfix_expression.treetop +8 -0
- data/lib/parser/grammar/expression/prefix_expression.treetop +29 -0
- data/lib/parser/grammar/expression/primary_expression.treetop +8 -0
- data/lib/parser/grammar/expression/range_expression.treetop +53 -0
- data/lib/parser/grammar/expression/self_expression.treetop +25 -0
- data/lib/parser/grammar/expression/super_expression.treetop +25 -0
- data/lib/parser/grammar/expression/wildcard_expression.treetop +8 -0
- data/lib/parser/grammar/generics/generic_argument_clause.treetop +89 -0
- data/lib/parser/grammar/generics/generics.treetop +9 -0
- data/lib/parser/grammar/grammar.treetop +76 -0
- data/lib/parser/grammar/identifier.treetop +56 -0
- data/lib/parser/grammar/implicit_parameter_name.treetop +26 -0
- data/lib/parser/grammar/literal/literal.treetop +45 -0
- data/lib/parser/grammar/literal/literal_array.treetop +98 -0
- data/lib/parser/grammar/literal/literal_boolean.treetop +50 -0
- data/lib/parser/grammar/literal/literal_decimal_floating_point.treetop +49 -0
- data/lib/parser/grammar/literal/literal_dictionary.treetop +157 -0
- data/lib/parser/grammar/literal/literal_hexadecimal_floating_point.treetop +47 -0
- data/lib/parser/grammar/literal/literal_integer_binary.treetop +47 -0
- data/lib/parser/grammar/literal/literal_integer_decimal.treetop +47 -0
- data/lib/parser/grammar/literal/literal_integer_hexadecimal.treetop +47 -0
- data/lib/parser/grammar/literal/literal_integer_octal.treetop +47 -0
- data/lib/parser/grammar/literal/literal_nil.treetop +25 -0
- data/lib/parser/grammar/literal/literal_numeric.treetop +69 -0
- data/lib/parser/grammar/literal/literal_string.treetop +207 -0
- data/lib/parser/grammar/operator.treetop +35 -0
- data/lib/parser/grammar/pattern/pattern.treetop +16 -0
- data/lib/parser/grammar/pattern/pattern_identifier.treetop +8 -0
- data/lib/parser/grammar/pattern/pattern_initializer.treetop +189 -0
- data/lib/parser/grammar/pattern/pattern_wildcard.treetop +8 -0
- data/lib/parser/grammar/statement/branch/branch.treetop +16 -0
- data/lib/parser/grammar/statement/branch/if.treetop +63 -0
- data/lib/parser/grammar/statement/loop/do_while.treetop +32 -0
- data/lib/parser/grammar/statement/loop/for.treetop +127 -0
- data/lib/parser/grammar/statement/loop/for_in.treetop +35 -0
- data/lib/parser/grammar/statement/loop/loop.treetop +22 -0
- data/lib/parser/grammar/statement/loop/while.treetop +34 -0
- data/lib/parser/grammar/statement/statement.treetop +97 -0
- data/lib/parser/grammar/type/type.treetop +18 -0
- data/lib/parser/grammar/type/type_annotation.treetop +29 -0
- data/lib/parser/grammar/type/type_array.treetop +43 -0
- data/lib/parser/grammar/type/type_dictionary.treetop +59 -0
- data/lib/parser/grammar/type/type_identifier.treetop +39 -0
- data/lib/parser/grammar/whitespace.treetop +40 -0
- data/lib/parser/grammar/wildcard.treetop +25 -0
- data/lib/parser/parse_result.rb +17 -0
- data/lib/parser/parser.rb +34 -0
- data/lib/parser/tools/converter/binary_string_to_int_converter.rb +20 -0
- data/lib/parser/tools/converter/converter.rb +12 -0
- data/lib/parser/tools/converter/decimal_float_string_to_float_converter.rb +22 -0
- data/lib/parser/tools/converter/decimal_string_to_int_converter.rb +20 -0
- data/lib/parser/tools/converter/hexadecimal_float_string_to_float_converter.rb +42 -0
- data/lib/parser/tools/converter/hexadecimal_string_to_int_converter.rb +20 -0
- data/lib/parser/tools/converter/octal_string_to_int_converter.rb +20 -0
- data/lib/parser/tools/quote_stripper.rb +18 -0
- data/lib/parser/tools/shunting_yard.rb +80 -0
- data/lib/parser/tools/tokens.rb +112 -0
- data/lib/parser/version.rb +5 -0
- data/lib/parser.rb +2 -0
- data/parser.gemspec +25 -0
- metadata +163 -0
@@ -0,0 +1,188 @@
|
|
1
|
+
module Kauri
|
2
|
+
grammar ClosureExpression
|
3
|
+
|
4
|
+
rule closure_expression
|
5
|
+
'{' ws1:_ closure_signature:closure_signature? ws2:_ statement_list:statement_list ws3:_ '}' {
|
6
|
+
def tokens
|
7
|
+
tokens = []
|
8
|
+
|
9
|
+
tokens.push({
|
10
|
+
type: 'T_OPEN_CURLY_BRACKET',
|
11
|
+
value: '{'
|
12
|
+
})
|
13
|
+
|
14
|
+
unless ws1.text_value.empty?
|
15
|
+
tokens.concat(ws1.tokens)
|
16
|
+
end
|
17
|
+
|
18
|
+
unless closure_signature.text_value.empty?
|
19
|
+
tokens.concat(closure_signature.tokens)
|
20
|
+
end
|
21
|
+
|
22
|
+
unless ws2.text_value.empty?
|
23
|
+
tokens.concat(ws2.tokens)
|
24
|
+
end
|
25
|
+
|
26
|
+
tokens.concat(statement_list.tokens)
|
27
|
+
|
28
|
+
unless ws3.text_value.empty?
|
29
|
+
tokens.concat(ws3.tokens)
|
30
|
+
end
|
31
|
+
|
32
|
+
tokens.push({
|
33
|
+
type: 'T_CLOSE_CURLY_BRACKET',
|
34
|
+
value: '}'
|
35
|
+
})
|
36
|
+
|
37
|
+
tokens
|
38
|
+
end
|
39
|
+
|
40
|
+
def ast
|
41
|
+
|
42
|
+
ast = {
|
43
|
+
block_type: 'closure-expression',
|
44
|
+
body: statement_list.ast
|
45
|
+
}
|
46
|
+
|
47
|
+
unless closure_signature.text_value.empty?
|
48
|
+
ast[:signature] = closure_signature.ast
|
49
|
+
end
|
50
|
+
|
51
|
+
[ast]
|
52
|
+
end
|
53
|
+
}
|
54
|
+
end
|
55
|
+
|
56
|
+
rule closure_signature
|
57
|
+
capture_list:capture_list ws:whitespaces 'in' {
|
58
|
+
def tokens
|
59
|
+
tokens = []
|
60
|
+
|
61
|
+
tokens.concat(capture_list.tokens)
|
62
|
+
tokens.concat(ws.tokens)
|
63
|
+
|
64
|
+
tokens.push({
|
65
|
+
type: 'T_IN',
|
66
|
+
value: 'in'
|
67
|
+
})
|
68
|
+
|
69
|
+
tokens
|
70
|
+
end
|
71
|
+
|
72
|
+
def ast
|
73
|
+
capture_list.ast
|
74
|
+
end
|
75
|
+
}
|
76
|
+
end
|
77
|
+
|
78
|
+
rule capture_list
|
79
|
+
'[' ws1:_ capture_specifier:capture_specifier ws2:_ expression:expression ws3:_ ']' {
|
80
|
+
def tokens
|
81
|
+
tokens = []
|
82
|
+
|
83
|
+
tokens.push({
|
84
|
+
type: 'T_OPEN_SQUARE_BRACKET',
|
85
|
+
value: '['
|
86
|
+
})
|
87
|
+
|
88
|
+
unless ws1.text_value.empty?
|
89
|
+
tokens.concat(ws1.tokens)
|
90
|
+
end
|
91
|
+
|
92
|
+
tokens.concat(capture_specifier.tokens)
|
93
|
+
|
94
|
+
unless ws2.text_value.empty?
|
95
|
+
tokens.concat(ws2.tokens)
|
96
|
+
end
|
97
|
+
|
98
|
+
tokens.concat(expression.tokens)
|
99
|
+
|
100
|
+
unless ws3.text_value.empty?
|
101
|
+
tokens.concat(ws3.tokens)
|
102
|
+
end
|
103
|
+
|
104
|
+
tokens.push({
|
105
|
+
type: 'T_CLOSE_SQUARE_BRACKET',
|
106
|
+
value: ']'
|
107
|
+
})
|
108
|
+
|
109
|
+
tokens
|
110
|
+
end
|
111
|
+
|
112
|
+
def ast
|
113
|
+
{
|
114
|
+
capture: {
|
115
|
+
specifier: capture_specifier.ast,
|
116
|
+
expression: expression.ast.first
|
117
|
+
}
|
118
|
+
}
|
119
|
+
end
|
120
|
+
}
|
121
|
+
end
|
122
|
+
|
123
|
+
rule capture_specifier
|
124
|
+
unowned_safe_or_unsafe_capture_specifier / weak_or_unowned_capture_specifier
|
125
|
+
end
|
126
|
+
|
127
|
+
rule weak_or_unowned_capture_specifier
|
128
|
+
('weak' / 'unowned') {
|
129
|
+
def tokens
|
130
|
+
[{
|
131
|
+
type: 'T_' + text_value.upcase,
|
132
|
+
value: text_value
|
133
|
+
}]
|
134
|
+
end
|
135
|
+
|
136
|
+
def ast
|
137
|
+
text_value
|
138
|
+
end
|
139
|
+
}
|
140
|
+
end
|
141
|
+
|
142
|
+
rule unowned_safe_or_unsafe_capture_specifier
|
143
|
+
'unowned' ws1:_ '(' ws2:_ safe_or_unsafe:('safe' / 'unsafe') ws3:_ ')' {
|
144
|
+
def tokens
|
145
|
+
tokens = []
|
146
|
+
|
147
|
+
tokens.push({
|
148
|
+
type: 'T_UNOWNED',
|
149
|
+
value: 'unowned'
|
150
|
+
})
|
151
|
+
|
152
|
+
unless ws1.text_value.empty?
|
153
|
+
tokens.concat(ws1.tokens)
|
154
|
+
end
|
155
|
+
|
156
|
+
tokens.push({
|
157
|
+
type: 'T_OPEN_ROUND_BRACKET',
|
158
|
+
value: '('
|
159
|
+
})
|
160
|
+
|
161
|
+
unless ws2.text_value.empty?
|
162
|
+
tokens.concat(ws2.tokens)
|
163
|
+
end
|
164
|
+
|
165
|
+
tokens.push({
|
166
|
+
type: 'T_' + safe_or_unsafe.text_value.upcase,
|
167
|
+
value: safe_or_unsafe.text_value
|
168
|
+
})
|
169
|
+
|
170
|
+
unless ws3.text_value.empty?
|
171
|
+
tokens.concat(ws3.tokens)
|
172
|
+
end
|
173
|
+
|
174
|
+
tokens.push({
|
175
|
+
type: 'T_CLOSE_ROUND_BRACKET',
|
176
|
+
value: ')'
|
177
|
+
})
|
178
|
+
|
179
|
+
tokens
|
180
|
+
end
|
181
|
+
|
182
|
+
def ast
|
183
|
+
'unowned' + '-' + safe_or_unsafe.text_value
|
184
|
+
end
|
185
|
+
}
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'parser/grammar/expression/literal_expression'
|
2
|
+
require 'parser/grammar/expression/prefix_expression'
|
3
|
+
require 'parser/grammar/expression/postfix_expression'
|
4
|
+
require 'parser/grammar/expression/binary_expression'
|
5
|
+
require 'parser/grammar/expression/range_expression'
|
6
|
+
require 'parser/grammar/expression/primary_expression'
|
7
|
+
require 'parser/grammar/expression/parenthesized_expression'
|
8
|
+
require 'parser/grammar/expression/wildcard_expression'
|
9
|
+
require 'parser/grammar/expression/function_call_expression'
|
10
|
+
require 'parser/grammar/expression/closure_expression'
|
11
|
+
require 'parser/grammar/expression/self_expression'
|
12
|
+
require 'parser/grammar/expression/super_expression'
|
13
|
+
|
14
|
+
module Kauri
|
15
|
+
grammar Expression
|
16
|
+
|
17
|
+
include Kauri::LiteralExpression
|
18
|
+
include Kauri::PrefixExpression
|
19
|
+
include Kauri::PostfixExpression
|
20
|
+
include Kauri::BinaryExpression
|
21
|
+
include Kauri::RangeExpression
|
22
|
+
include Kauri::PrimaryExpression
|
23
|
+
include Kauri::ParenthesizedExpression
|
24
|
+
include Kauri::WildcardExpression
|
25
|
+
include Kauri::FunctionCallExpression
|
26
|
+
include Kauri::ClosureExpression
|
27
|
+
include Kauri::SelfExpression
|
28
|
+
include Kauri::SuperExpression
|
29
|
+
|
30
|
+
rule expression
|
31
|
+
super_expression
|
32
|
+
/
|
33
|
+
self_expression
|
34
|
+
/
|
35
|
+
closure_expression
|
36
|
+
/
|
37
|
+
function_call_expression
|
38
|
+
/
|
39
|
+
binary_expression
|
40
|
+
/
|
41
|
+
range_expression
|
42
|
+
/
|
43
|
+
primary_expression
|
44
|
+
/
|
45
|
+
prefix_expression
|
46
|
+
end
|
47
|
+
|
48
|
+
rule expression_list
|
49
|
+
head:(expression:expression ws1:_ ',' ws2:_)* tail:expression {
|
50
|
+
def tokens
|
51
|
+
tokens = []
|
52
|
+
|
53
|
+
unless head.text_value.empty?
|
54
|
+
head.elements.each { |e|
|
55
|
+
tokens.concat(e.expression.tokens)
|
56
|
+
tokens.concat(e.ws1.tokens) unless e.ws1.text_value.empty?
|
57
|
+
tokens.push(T_COMMA)
|
58
|
+
tokens.concat(e.ws2.tokens) unless e.ws2.text_value.empty?
|
59
|
+
}
|
60
|
+
end
|
61
|
+
|
62
|
+
tokens.concat(tail.tokens)
|
63
|
+
|
64
|
+
tokens
|
65
|
+
end
|
66
|
+
|
67
|
+
def ast
|
68
|
+
ast = []
|
69
|
+
|
70
|
+
unless head.text_value.empty?
|
71
|
+
head.elements.each { |e|
|
72
|
+
ast.concat(e.expression.ast)
|
73
|
+
}
|
74
|
+
end
|
75
|
+
|
76
|
+
ast.concat(tail.ast)
|
77
|
+
|
78
|
+
ast
|
79
|
+
end
|
80
|
+
}
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Kauri
|
2
|
+
grammar FunctionCallExpression
|
3
|
+
|
4
|
+
rule function_call_expression
|
5
|
+
callee:postfix_expression ws:_ parameters:parenthesized_expression {
|
6
|
+
def tokens
|
7
|
+
tokens = []
|
8
|
+
|
9
|
+
tokens.concat(callee.tokens)
|
10
|
+
|
11
|
+
unless ws.text_value.empty?
|
12
|
+
tokens.concat(ws.tokens)
|
13
|
+
end
|
14
|
+
|
15
|
+
tokens.concat(parameters.tokens)
|
16
|
+
|
17
|
+
tokens
|
18
|
+
end
|
19
|
+
|
20
|
+
def ast
|
21
|
+
[
|
22
|
+
{
|
23
|
+
block_type: 'function-call-expression',
|
24
|
+
callee: callee.ast.first,
|
25
|
+
parameters: parameters.ast
|
26
|
+
}
|
27
|
+
]
|
28
|
+
end
|
29
|
+
}
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,146 @@
|
|
1
|
+
module Kauri
|
2
|
+
grammar ParenthesizedExpression
|
3
|
+
|
4
|
+
rule parenthesized_expression
|
5
|
+
'(' ws1:_ expression:expression_element_list? ws2:_ ')' {
|
6
|
+
def tokens
|
7
|
+
|
8
|
+
tokens = []
|
9
|
+
|
10
|
+
tokens.push({
|
11
|
+
type: 'T_OPEN_ROUND_BRACKET',
|
12
|
+
value: '('
|
13
|
+
})
|
14
|
+
|
15
|
+
unless ws1.text_value.empty?
|
16
|
+
tokens.concat(ws1.tokens)
|
17
|
+
end
|
18
|
+
|
19
|
+
unless expression.text_value.empty?
|
20
|
+
tokens.concat(expression.tokens)
|
21
|
+
end
|
22
|
+
|
23
|
+
unless ws2.text_value.empty?
|
24
|
+
tokens.concat(ws2.tokens)
|
25
|
+
end
|
26
|
+
|
27
|
+
tokens.push({
|
28
|
+
type: 'T_CLOSE_ROUND_BRACKET',
|
29
|
+
value: ')'
|
30
|
+
})
|
31
|
+
|
32
|
+
tokens
|
33
|
+
end
|
34
|
+
|
35
|
+
def ast
|
36
|
+
ast = []
|
37
|
+
|
38
|
+
unless expression.text_value.empty?
|
39
|
+
ast = expression.ast
|
40
|
+
end
|
41
|
+
|
42
|
+
ast
|
43
|
+
end
|
44
|
+
}
|
45
|
+
end
|
46
|
+
|
47
|
+
rule expression_element_list
|
48
|
+
head:(expression:expression_element ws1:_ ',' ws2:_)* tail:expression_element {
|
49
|
+
def tokens
|
50
|
+
tokens = []
|
51
|
+
|
52
|
+
unless head.text_value.empty?
|
53
|
+
head.elements.each { |e|
|
54
|
+
|
55
|
+
tokens.concat(e.expression.tokens)
|
56
|
+
|
57
|
+
unless e.ws1.text_value.empty?
|
58
|
+
tokens.concat(e.ws1.tokens)
|
59
|
+
end
|
60
|
+
|
61
|
+
tokens.push({
|
62
|
+
type: 'T_COMMA',
|
63
|
+
value: ','
|
64
|
+
})
|
65
|
+
|
66
|
+
unless e.ws2.text_value.empty?
|
67
|
+
tokens.concat(e.ws2.tokens)
|
68
|
+
end
|
69
|
+
}
|
70
|
+
end
|
71
|
+
|
72
|
+
tokens.concat(tail.tokens)
|
73
|
+
|
74
|
+
tokens
|
75
|
+
end
|
76
|
+
|
77
|
+
def ast
|
78
|
+
ast = []
|
79
|
+
|
80
|
+
unless head.text_value.empty?
|
81
|
+
head.elements.each { |e|
|
82
|
+
ast.concat(e.expression.ast)
|
83
|
+
}
|
84
|
+
end
|
85
|
+
|
86
|
+
ast.concat(tail.ast)
|
87
|
+
|
88
|
+
ast
|
89
|
+
end
|
90
|
+
}
|
91
|
+
end
|
92
|
+
|
93
|
+
rule expression_element
|
94
|
+
expression_element_with_identifier / only_expression
|
95
|
+
end
|
96
|
+
|
97
|
+
rule only_expression
|
98
|
+
expression:expression {
|
99
|
+
def tokens
|
100
|
+
expression.tokens
|
101
|
+
end
|
102
|
+
|
103
|
+
def ast
|
104
|
+
expression.ast
|
105
|
+
end
|
106
|
+
}
|
107
|
+
end
|
108
|
+
|
109
|
+
rule expression_element_with_identifier
|
110
|
+
identifier:identifier ws1:_ ':' ws2:_ expression:expression {
|
111
|
+
def tokens
|
112
|
+
tokens = []
|
113
|
+
|
114
|
+
tokens.concat(identifier.tokens)
|
115
|
+
|
116
|
+
unless ws1.text_value.empty?
|
117
|
+
tokens.concat(ws1.tokens)
|
118
|
+
end
|
119
|
+
|
120
|
+
tokens.push({
|
121
|
+
type: 'T_COLON',
|
122
|
+
value: ':'
|
123
|
+
})
|
124
|
+
|
125
|
+
unless ws2.text_value.empty?
|
126
|
+
tokens.concat(ws2.tokens)
|
127
|
+
end
|
128
|
+
|
129
|
+
tokens.concat(expression.tokens)
|
130
|
+
|
131
|
+
tokens
|
132
|
+
end
|
133
|
+
|
134
|
+
def ast
|
135
|
+
[
|
136
|
+
{
|
137
|
+
block_type: 'expression-element',
|
138
|
+
identifier: identifier.ast.first,
|
139
|
+
expression: expression.ast.first
|
140
|
+
}
|
141
|
+
]
|
142
|
+
end
|
143
|
+
}
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Kauri
|
2
|
+
grammar PrefixExpression
|
3
|
+
|
4
|
+
rule prefix_expression
|
5
|
+
operator:prefix_operator expression:postfix_expression {
|
6
|
+
def tokens
|
7
|
+
[
|
8
|
+
operator.tokens.first,
|
9
|
+
expression.tokens.first
|
10
|
+
]
|
11
|
+
end
|
12
|
+
|
13
|
+
def ast
|
14
|
+
[
|
15
|
+
{
|
16
|
+
block_type: 'prefix-expression',
|
17
|
+
operator: operator.operator,
|
18
|
+
argument: expression.ast.first
|
19
|
+
}
|
20
|
+
]
|
21
|
+
end
|
22
|
+
}
|
23
|
+
end
|
24
|
+
|
25
|
+
rule prefix_operator
|
26
|
+
operator
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module Kauri
|
2
|
+
grammar RangeExpression
|
3
|
+
|
4
|
+
rule range_expression
|
5
|
+
left:primary_expression ws1:_ range_operator:range_operator ws2:_ right:primary_expression {
|
6
|
+
def tokens
|
7
|
+
|
8
|
+
tokens = []
|
9
|
+
|
10
|
+
tokens.concat(left.tokens)
|
11
|
+
|
12
|
+
unless ws1.text_value.empty?
|
13
|
+
tokens.concat(ws1.tokens)
|
14
|
+
end
|
15
|
+
|
16
|
+
tokens.concat(range_operator.tokens)
|
17
|
+
|
18
|
+
unless ws2.text_value.empty?
|
19
|
+
tokens.concat(ws2.tokens)
|
20
|
+
end
|
21
|
+
|
22
|
+
tokens.concat(right.tokens)
|
23
|
+
|
24
|
+
tokens
|
25
|
+
end
|
26
|
+
|
27
|
+
def ast
|
28
|
+
[
|
29
|
+
{
|
30
|
+
block_type: 'binary-expression',
|
31
|
+
operator: range_operator.text_value,
|
32
|
+
left: left.ast.first,
|
33
|
+
right: right.ast.first
|
34
|
+
}
|
35
|
+
]
|
36
|
+
end
|
37
|
+
}
|
38
|
+
end
|
39
|
+
|
40
|
+
rule range_operator
|
41
|
+
('...' / '..<') {
|
42
|
+
def tokens
|
43
|
+
[
|
44
|
+
{
|
45
|
+
type: 'T_OPERATOR',
|
46
|
+
value: text_value
|
47
|
+
}
|
48
|
+
]
|
49
|
+
end
|
50
|
+
}
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Kauri
|
2
|
+
grammar SelfExpression
|
3
|
+
|
4
|
+
rule self_expression
|
5
|
+
'self' {
|
6
|
+
def tokens
|
7
|
+
[
|
8
|
+
{
|
9
|
+
type: 'T_SELF',
|
10
|
+
value: 'self'
|
11
|
+
}
|
12
|
+
]
|
13
|
+
end
|
14
|
+
|
15
|
+
def ast
|
16
|
+
[
|
17
|
+
{
|
18
|
+
block_type: 'self-expression'
|
19
|
+
}
|
20
|
+
]
|
21
|
+
end
|
22
|
+
}
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Kauri
|
2
|
+
grammar SuperExpression
|
3
|
+
|
4
|
+
rule super_expression
|
5
|
+
'super' {
|
6
|
+
def tokens
|
7
|
+
[
|
8
|
+
{
|
9
|
+
type: 'T_SUPER',
|
10
|
+
value: 'super'
|
11
|
+
}
|
12
|
+
]
|
13
|
+
end
|
14
|
+
|
15
|
+
def ast
|
16
|
+
[
|
17
|
+
{
|
18
|
+
block_type: 'super-expression'
|
19
|
+
}
|
20
|
+
]
|
21
|
+
end
|
22
|
+
}
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
module Kauri
|
2
|
+
grammar GenericArgumentClause
|
3
|
+
|
4
|
+
rule generic_argument_clause
|
5
|
+
'<' ws1:_ generic_argument_list:generic_argument_list ws2:_ '>' {
|
6
|
+
def tokens
|
7
|
+
tokens = []
|
8
|
+
|
9
|
+
tokens.push({
|
10
|
+
type: 'T_OPEN_ANGLE_BRACKET',
|
11
|
+
value: '<'
|
12
|
+
})
|
13
|
+
|
14
|
+
unless ws1.text_value.empty?
|
15
|
+
tokens.concat(ws1.tokens)
|
16
|
+
end
|
17
|
+
|
18
|
+
tokens.concat(generic_argument_list.tokens)
|
19
|
+
|
20
|
+
unless ws2.text_value.empty?
|
21
|
+
tokens.concat(ws2.tokens)
|
22
|
+
end
|
23
|
+
|
24
|
+
tokens.push({
|
25
|
+
type: 'T_CLOSE_ANGLE_BRACKET',
|
26
|
+
value: '>'
|
27
|
+
})
|
28
|
+
|
29
|
+
tokens
|
30
|
+
end
|
31
|
+
|
32
|
+
def ast
|
33
|
+
generic_argument_list.ast
|
34
|
+
end
|
35
|
+
}
|
36
|
+
end
|
37
|
+
|
38
|
+
rule generic_argument_list
|
39
|
+
head:(generic_argument:generic_argument ws1:_ ',' ws2:_)* tail:generic_argument {
|
40
|
+
def tokens
|
41
|
+
tokens = []
|
42
|
+
|
43
|
+
unless head.text_value.empty?
|
44
|
+
head.elements.each { |e|
|
45
|
+
|
46
|
+
tokens.concat(e.generic_argument.tokens)
|
47
|
+
|
48
|
+
unless e.ws1.text_value.empty?
|
49
|
+
tokens.concat(e.ws1.tokens)
|
50
|
+
end
|
51
|
+
|
52
|
+
tokens.push({
|
53
|
+
type: 'T_COMMA',
|
54
|
+
value: ','
|
55
|
+
})
|
56
|
+
|
57
|
+
unless e.ws2.text_value.empty?
|
58
|
+
tokens.concat(e.ws2.tokens)
|
59
|
+
end
|
60
|
+
}
|
61
|
+
end
|
62
|
+
|
63
|
+
tokens.concat(tail.tokens)
|
64
|
+
|
65
|
+
tokens
|
66
|
+
end
|
67
|
+
|
68
|
+
def ast
|
69
|
+
|
70
|
+
ast = []
|
71
|
+
|
72
|
+
unless head.text_value.empty?
|
73
|
+
head.elements.each { |e|
|
74
|
+
ast.concat(e.generic_argument.ast)
|
75
|
+
}
|
76
|
+
end
|
77
|
+
|
78
|
+
ast.concat(tail.ast)
|
79
|
+
|
80
|
+
ast
|
81
|
+
end
|
82
|
+
}
|
83
|
+
end
|
84
|
+
|
85
|
+
rule generic_argument
|
86
|
+
type
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|