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,63 @@
|
|
1
|
+
module Kauri
|
2
|
+
grammar StatementIf
|
3
|
+
|
4
|
+
rule statement_if
|
5
|
+
'if' ws1:whitespaces condition:statement_if_condition ws2:_ body:code_block ws3:_ else_block:statement_if_else? {
|
6
|
+
def tokens
|
7
|
+
tokens = []
|
8
|
+
|
9
|
+
tokens.push(T_IF)
|
10
|
+
tokens.concat(ws1.tokens)
|
11
|
+
tokens.concat(condition.tokens)
|
12
|
+
tokens.concat(ws2.tokens) unless ws2.text_value.empty?
|
13
|
+
tokens.concat(body.tokens)
|
14
|
+
tokens.concat(ws3.tokens) unless ws3.text_value.empty?
|
15
|
+
tokens.concat(else_block.tokens) unless else_block.text_value.empty?
|
16
|
+
|
17
|
+
tokens
|
18
|
+
end
|
19
|
+
|
20
|
+
def ast
|
21
|
+
|
22
|
+
ast = {
|
23
|
+
block_type: 'if-statement',
|
24
|
+
condition: condition.ast.first,
|
25
|
+
body: body.ast
|
26
|
+
}
|
27
|
+
|
28
|
+
unless else_block.text_value.empty?
|
29
|
+
ast[:else] = else_block.ast
|
30
|
+
end
|
31
|
+
|
32
|
+
[ast]
|
33
|
+
end
|
34
|
+
}
|
35
|
+
end
|
36
|
+
|
37
|
+
rule statement_if_condition
|
38
|
+
expression
|
39
|
+
end
|
40
|
+
|
41
|
+
rule statement_if_else
|
42
|
+
(
|
43
|
+
('else' ws:whitespaces block:statement_if)
|
44
|
+
/
|
45
|
+
('else' ws:_ block:code_block)
|
46
|
+
) {
|
47
|
+
def tokens
|
48
|
+
tokens = []
|
49
|
+
|
50
|
+
tokens.push(T_ELSE)
|
51
|
+
tokens.concat(ws.tokens) unless ws.text_value.empty?
|
52
|
+
tokens.concat(block.tokens)
|
53
|
+
|
54
|
+
tokens
|
55
|
+
end
|
56
|
+
|
57
|
+
def ast
|
58
|
+
block.ast
|
59
|
+
end
|
60
|
+
}
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Kauri
|
2
|
+
grammar StatementDoWhile
|
3
|
+
|
4
|
+
rule statement_do_while
|
5
|
+
'do' ws1:_ body:code_block ws2:_ 'while' ws3:whitespaces test:expression {
|
6
|
+
def tokens
|
7
|
+
tokens = []
|
8
|
+
|
9
|
+
tokens.push(T_DO)
|
10
|
+
tokens.concat(ws1.tokens) unless ws1.text_value.empty?
|
11
|
+
tokens.concat(body.tokens)
|
12
|
+
tokens.concat(ws2.tokens) unless ws2.text_value.empty?
|
13
|
+
tokens.push(T_WHILE)
|
14
|
+
tokens.concat(ws3.tokens)
|
15
|
+
tokens.concat(test.tokens)
|
16
|
+
|
17
|
+
tokens
|
18
|
+
end
|
19
|
+
|
20
|
+
def ast
|
21
|
+
[
|
22
|
+
{
|
23
|
+
block_type: 'do-while-statement',
|
24
|
+
body: body.ast,
|
25
|
+
test: test.ast.first
|
26
|
+
}
|
27
|
+
]
|
28
|
+
end
|
29
|
+
}
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,127 @@
|
|
1
|
+
module Kauri
|
2
|
+
grammar StatementFor
|
3
|
+
|
4
|
+
rule statement_for
|
5
|
+
'for' ws1:_ for_block:(for_block_without_parentheses / for_block_with_parentheses) ws2:_ for_body {
|
6
|
+
def tokens
|
7
|
+
tokens = []
|
8
|
+
|
9
|
+
tokens.push(T_FOR)
|
10
|
+
tokens.concat(ws1.tokens) unless ws1.text_value.empty?
|
11
|
+
tokens.concat(for_block.tokens)
|
12
|
+
tokens.concat(ws2.tokens) unless ws2.text_value.empty?
|
13
|
+
tokens.concat(for_body.tokens)
|
14
|
+
|
15
|
+
tokens
|
16
|
+
end
|
17
|
+
|
18
|
+
def ast
|
19
|
+
|
20
|
+
ast_for_block = for_block.ast
|
21
|
+
|
22
|
+
init = ast_for_block[:init]
|
23
|
+
test = ast_for_block[:test]
|
24
|
+
update = ast_for_block[:update]
|
25
|
+
body = for_body.ast
|
26
|
+
|
27
|
+
ast = {
|
28
|
+
block_type: 'for-statement',
|
29
|
+
init: init
|
30
|
+
}
|
31
|
+
|
32
|
+
if test
|
33
|
+
ast[:test] = test
|
34
|
+
end
|
35
|
+
|
36
|
+
if update
|
37
|
+
ast[:update] = update
|
38
|
+
end
|
39
|
+
|
40
|
+
ast[:body] = body
|
41
|
+
|
42
|
+
[ast]
|
43
|
+
end
|
44
|
+
}
|
45
|
+
end
|
46
|
+
|
47
|
+
rule for_block_without_parentheses
|
48
|
+
for_block
|
49
|
+
end
|
50
|
+
|
51
|
+
rule for_block_with_parentheses
|
52
|
+
'(' ws1:_ for_block:for_block ws2:_ ')' {
|
53
|
+
def tokens
|
54
|
+
tokens = []
|
55
|
+
|
56
|
+
tokens.push(T_OPEN_ROUND_BRACKET)
|
57
|
+
tokens.concat(ws1.tokens) unless ws1.text_value.empty?
|
58
|
+
tokens.concat(for_block.tokens)
|
59
|
+
tokens.concat(ws2.tokens) unless ws2.text_value.empty?
|
60
|
+
tokens.push(T_CLOSE_ROUND_BRACKET)
|
61
|
+
|
62
|
+
tokens
|
63
|
+
end
|
64
|
+
|
65
|
+
def ast
|
66
|
+
for_block.ast
|
67
|
+
end
|
68
|
+
}
|
69
|
+
end
|
70
|
+
|
71
|
+
rule for_block
|
72
|
+
for_init:for_init? ws1:_ ';' ws2:_ for_test:for_test? ws3:_ ';' ws4:_ for_update:for_update? {
|
73
|
+
def tokens
|
74
|
+
tokens = []
|
75
|
+
|
76
|
+
tokens.concat(for_init.tokens) unless for_init.text_value.empty?
|
77
|
+
tokens.concat(ws1.tokens) unless ws1.text_value.empty?
|
78
|
+
tokens.push(T_SEMICOLON)
|
79
|
+
tokens.concat(ws2.tokens) unless ws2.text_value.empty?
|
80
|
+
tokens.concat(for_test.tokens) unless for_test.text_value.empty?
|
81
|
+
tokens.concat(ws3.tokens) unless ws3.text_value.empty?
|
82
|
+
tokens.push(T_SEMICOLON)
|
83
|
+
tokens.concat(ws4.tokens) unless ws4.text_value.empty?
|
84
|
+
tokens.concat(for_update.tokens) unless for_update.text_value.empty?
|
85
|
+
|
86
|
+
tokens
|
87
|
+
end
|
88
|
+
|
89
|
+
def ast
|
90
|
+
ast = {}
|
91
|
+
|
92
|
+
unless for_init.text_value.empty?
|
93
|
+
ast[:init] = for_init.ast
|
94
|
+
else
|
95
|
+
ast[:init] = []
|
96
|
+
end
|
97
|
+
|
98
|
+
unless for_test.text_value.empty?
|
99
|
+
ast[:test] = for_test.ast.first
|
100
|
+
end
|
101
|
+
|
102
|
+
unless for_update.text_value.empty?
|
103
|
+
ast[:update] = for_update.ast
|
104
|
+
end
|
105
|
+
|
106
|
+
ast
|
107
|
+
end
|
108
|
+
}
|
109
|
+
end
|
110
|
+
|
111
|
+
rule for_init
|
112
|
+
variable_declaration / expression_list
|
113
|
+
end
|
114
|
+
|
115
|
+
rule for_test
|
116
|
+
expression
|
117
|
+
end
|
118
|
+
|
119
|
+
rule for_update
|
120
|
+
expression_list
|
121
|
+
end
|
122
|
+
|
123
|
+
rule for_body
|
124
|
+
code_block
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Kauri
|
2
|
+
grammar StatementForIn
|
3
|
+
|
4
|
+
rule statement_for_in
|
5
|
+
'for' ws1:whitespaces iterator:pattern ws2:whitespaces 'in' ws3:whitespaces collection:expression ws4:_ body:code_block {
|
6
|
+
def tokens
|
7
|
+
tokens = []
|
8
|
+
|
9
|
+
tokens.push(T_FOR)
|
10
|
+
tokens.concat(ws1.tokens)
|
11
|
+
tokens.concat(iterator.tokens)
|
12
|
+
tokens.concat(ws2.tokens)
|
13
|
+
tokens.push(T_IN)
|
14
|
+
tokens.concat(ws3.tokens)
|
15
|
+
tokens.concat(collection.tokens)
|
16
|
+
tokens.concat(ws4.tokens) unless ws4.text_value.empty?
|
17
|
+
tokens.concat(body.tokens)
|
18
|
+
|
19
|
+
tokens
|
20
|
+
end
|
21
|
+
|
22
|
+
def ast
|
23
|
+
[
|
24
|
+
{
|
25
|
+
block_type: 'for-in-statement',
|
26
|
+
iterator: iterator.ast.first,
|
27
|
+
collection: collection.ast.first,
|
28
|
+
body: body.ast
|
29
|
+
}
|
30
|
+
]
|
31
|
+
end
|
32
|
+
}
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'parser/grammar/statement/loop/for'
|
2
|
+
require 'parser/grammar/statement/loop/for_in'
|
3
|
+
require 'parser/grammar/statement/loop/while'
|
4
|
+
require 'parser/grammar/statement/loop/do_while'
|
5
|
+
|
6
|
+
module Kauri
|
7
|
+
module Grammar
|
8
|
+
module Statement
|
9
|
+
grammar Loop
|
10
|
+
|
11
|
+
include Kauri::StatementFor
|
12
|
+
include Kauri::StatementForIn
|
13
|
+
include Kauri::StatementWhile
|
14
|
+
include Kauri::StatementDoWhile
|
15
|
+
|
16
|
+
rule statement_loop
|
17
|
+
statement_for_in / statement_for / statement_while / statement_do_while
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Kauri
|
2
|
+
grammar StatementWhile
|
3
|
+
|
4
|
+
rule statement_while
|
5
|
+
'while' ws1:whitespaces condition:statement_while_condition ws2:_ body:code_block {
|
6
|
+
def tokens
|
7
|
+
tokens = []
|
8
|
+
|
9
|
+
tokens.push(T_WHILE)
|
10
|
+
tokens.concat(ws1.tokens)
|
11
|
+
tokens.concat(condition.tokens)
|
12
|
+
tokens.concat(ws2.tokens) unless ws2.text_value.empty?
|
13
|
+
tokens.concat(body.tokens)
|
14
|
+
|
15
|
+
tokens
|
16
|
+
end
|
17
|
+
|
18
|
+
def ast
|
19
|
+
[
|
20
|
+
{
|
21
|
+
block_type: 'while-statement',
|
22
|
+
condition: condition.ast.first,
|
23
|
+
body: body.ast
|
24
|
+
}
|
25
|
+
]
|
26
|
+
end
|
27
|
+
}
|
28
|
+
end
|
29
|
+
|
30
|
+
rule statement_while_condition
|
31
|
+
expression
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
require 'parser/grammar/statement/loop/loop'
|
2
|
+
require 'parser/grammar/statement/branch/branch'
|
3
|
+
|
4
|
+
module Kauri
|
5
|
+
grammar Statement
|
6
|
+
|
7
|
+
include Kauri::Grammar::Statement::Loop
|
8
|
+
include Kauri::Grammar::Statement::Branch
|
9
|
+
|
10
|
+
rule statement
|
11
|
+
statement_loop / statement_branch / expression_statement / declaration_statement
|
12
|
+
end
|
13
|
+
|
14
|
+
rule statement_list
|
15
|
+
statement+ {
|
16
|
+
def tokens
|
17
|
+
tokens = []
|
18
|
+
|
19
|
+
elements.each { |e|
|
20
|
+
tokens.concat(e.tokens)
|
21
|
+
}
|
22
|
+
|
23
|
+
tokens
|
24
|
+
end
|
25
|
+
|
26
|
+
def ast
|
27
|
+
ast = []
|
28
|
+
|
29
|
+
elements.each { |e|
|
30
|
+
ast.concat(e.ast)
|
31
|
+
}
|
32
|
+
|
33
|
+
ast
|
34
|
+
end
|
35
|
+
}
|
36
|
+
end
|
37
|
+
|
38
|
+
rule expression_statement
|
39
|
+
expression:expression ws:_ semicolon:semicolon? {
|
40
|
+
def tokens
|
41
|
+
tokens = []
|
42
|
+
|
43
|
+
tokens.concat(expression.tokens)
|
44
|
+
|
45
|
+
unless ws.text_value.empty?
|
46
|
+
tokens.concat(ws.tokens)
|
47
|
+
end
|
48
|
+
|
49
|
+
unless semicolon.text_value.empty?
|
50
|
+
tokens.concat(semicolon.tokens)
|
51
|
+
end
|
52
|
+
|
53
|
+
tokens
|
54
|
+
end
|
55
|
+
|
56
|
+
def ast
|
57
|
+
expression.ast
|
58
|
+
end
|
59
|
+
}
|
60
|
+
end
|
61
|
+
|
62
|
+
rule declaration_statement
|
63
|
+
declaration:declaration ws:_ semicolon:semicolon? {
|
64
|
+
def tokens
|
65
|
+
tokens = []
|
66
|
+
|
67
|
+
tokens.concat(declaration.tokens)
|
68
|
+
|
69
|
+
unless ws.text_value.empty?
|
70
|
+
tokens.concat(ws.tokens)
|
71
|
+
end
|
72
|
+
|
73
|
+
unless semicolon.text_value.empty?
|
74
|
+
tokens.concat(semicolon.tokens)
|
75
|
+
end
|
76
|
+
|
77
|
+
tokens
|
78
|
+
end
|
79
|
+
|
80
|
+
def ast
|
81
|
+
declaration.ast
|
82
|
+
end
|
83
|
+
}
|
84
|
+
end
|
85
|
+
|
86
|
+
rule semicolon
|
87
|
+
';' {
|
88
|
+
def tokens
|
89
|
+
[{
|
90
|
+
type: 'T_SEMICOLON',
|
91
|
+
value: ';'
|
92
|
+
}]
|
93
|
+
end
|
94
|
+
}
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'parser/grammar/type/type_identifier'
|
2
|
+
require 'parser/grammar/type/type_array'
|
3
|
+
require 'parser/grammar/type/type_dictionary'
|
4
|
+
require 'parser/grammar/type/type_annotation'
|
5
|
+
|
6
|
+
module Kauri
|
7
|
+
grammar Type
|
8
|
+
|
9
|
+
include Kauri::TypeIdentifier
|
10
|
+
include Kauri::TypeArray
|
11
|
+
include Kauri::TypeDictionary
|
12
|
+
include Kauri::TypeAnnotation
|
13
|
+
|
14
|
+
rule type
|
15
|
+
type_identifier / type_dictionary / type_array
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Kauri
|
2
|
+
grammar TypeAnnotation
|
3
|
+
|
4
|
+
rule type_annotation
|
5
|
+
':' ws:_ type {
|
6
|
+
def tokens
|
7
|
+
tokens = []
|
8
|
+
|
9
|
+
tokens.push({
|
10
|
+
type: 'T_COLON',
|
11
|
+
value: ':',
|
12
|
+
})
|
13
|
+
|
14
|
+
unless ws.text_value.empty?
|
15
|
+
tokens.concat(ws.tokens)
|
16
|
+
end
|
17
|
+
|
18
|
+
tokens.concat(type.tokens)
|
19
|
+
|
20
|
+
tokens
|
21
|
+
end
|
22
|
+
|
23
|
+
def ast
|
24
|
+
type.ast
|
25
|
+
end
|
26
|
+
}
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Kauri
|
2
|
+
grammar TypeArray
|
3
|
+
|
4
|
+
rule type_array
|
5
|
+
'[' ws1:_ type:type ws2:_ ']' {
|
6
|
+
def tokens
|
7
|
+
tokens = []
|
8
|
+
|
9
|
+
tokens.push({
|
10
|
+
type: 'T_OPEN_SQUARE_BRACKET',
|
11
|
+
value: '[',
|
12
|
+
})
|
13
|
+
|
14
|
+
unless ws1.text_value.empty?
|
15
|
+
tokens.concat(ws1.tokens)
|
16
|
+
end
|
17
|
+
|
18
|
+
tokens.concat(type.tokens)
|
19
|
+
|
20
|
+
unless ws2.text_value.empty?
|
21
|
+
tokens.concat(ws2.tokens)
|
22
|
+
end
|
23
|
+
|
24
|
+
tokens.push({
|
25
|
+
type: 'T_CLOSE_SQUARE_BRACKET',
|
26
|
+
value: ']',
|
27
|
+
})
|
28
|
+
|
29
|
+
tokens
|
30
|
+
end
|
31
|
+
|
32
|
+
def ast
|
33
|
+
[
|
34
|
+
{
|
35
|
+
block_type: 'array',
|
36
|
+
type: type.ast.first
|
37
|
+
}
|
38
|
+
]
|
39
|
+
end
|
40
|
+
}
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module Kauri
|
2
|
+
grammar TypeDictionary
|
3
|
+
|
4
|
+
rule type_dictionary
|
5
|
+
'[' ws1:_ key_type:type ws2:_ ':' ws3:_ value_type:type ws4:_ ']' {
|
6
|
+
def tokens
|
7
|
+
tokens = []
|
8
|
+
|
9
|
+
tokens.push({
|
10
|
+
type: 'T_OPEN_SQUARE_BRACKET',
|
11
|
+
value: '[',
|
12
|
+
})
|
13
|
+
|
14
|
+
unless ws1.text_value.empty?
|
15
|
+
tokens.concat(ws1.tokens)
|
16
|
+
end
|
17
|
+
|
18
|
+
tokens.concat(key_type.tokens)
|
19
|
+
|
20
|
+
unless ws2.text_value.empty?
|
21
|
+
tokens.concat(ws2.tokens)
|
22
|
+
end
|
23
|
+
|
24
|
+
tokens.push({
|
25
|
+
type: 'T_COLON',
|
26
|
+
value: ':',
|
27
|
+
})
|
28
|
+
|
29
|
+
unless ws3.text_value.empty?
|
30
|
+
tokens.concat(ws3.tokens)
|
31
|
+
end
|
32
|
+
|
33
|
+
tokens.concat(value_type.tokens)
|
34
|
+
|
35
|
+
unless ws4.text_value.empty?
|
36
|
+
tokens.concat(ws4.tokens)
|
37
|
+
end
|
38
|
+
|
39
|
+
tokens.push({
|
40
|
+
type: 'T_CLOSE_SQUARE_BRACKET',
|
41
|
+
value: ']',
|
42
|
+
})
|
43
|
+
|
44
|
+
tokens
|
45
|
+
end
|
46
|
+
|
47
|
+
def ast
|
48
|
+
[
|
49
|
+
{
|
50
|
+
block_type: 'dictionary',
|
51
|
+
key_type: key_type.ast.first,
|
52
|
+
value_type: value_type.ast.first
|
53
|
+
}
|
54
|
+
]
|
55
|
+
end
|
56
|
+
}
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Kauri
|
2
|
+
grammar TypeIdentifier
|
3
|
+
|
4
|
+
rule type_identifier
|
5
|
+
type_name:type_name ws:_ generic_argument_clause:generic_argument_clause? {
|
6
|
+
def tokens
|
7
|
+
|
8
|
+
tokens = []
|
9
|
+
|
10
|
+
tokens.concat(type_name.tokens)
|
11
|
+
|
12
|
+
unless ws.text_value.empty?
|
13
|
+
tokens.concat(ws.tokens)
|
14
|
+
end
|
15
|
+
|
16
|
+
unless generic_argument_clause.text_value.empty?
|
17
|
+
tokens.concat(generic_argument_clause.tokens)
|
18
|
+
end
|
19
|
+
|
20
|
+
tokens
|
21
|
+
end
|
22
|
+
def ast
|
23
|
+
|
24
|
+
ast = type_name.ast
|
25
|
+
|
26
|
+
unless generic_argument_clause.text_value.empty?
|
27
|
+
ast.first[:parameters] = generic_argument_clause.ast
|
28
|
+
end
|
29
|
+
|
30
|
+
ast
|
31
|
+
end
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
35
|
+
rule type_name
|
36
|
+
identifier
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Kauri
|
2
|
+
grammar Whitespace
|
3
|
+
|
4
|
+
rule _
|
5
|
+
whitespaces?
|
6
|
+
end
|
7
|
+
|
8
|
+
rule whitespaces
|
9
|
+
whitespace+ {
|
10
|
+
def tokens
|
11
|
+
[
|
12
|
+
{
|
13
|
+
type: 'T_WHITESPACES',
|
14
|
+
value: text_value
|
15
|
+
}
|
16
|
+
]
|
17
|
+
end
|
18
|
+
def ast
|
19
|
+
[]
|
20
|
+
end
|
21
|
+
}
|
22
|
+
end
|
23
|
+
|
24
|
+
rule whitespace
|
25
|
+
space / tab / line_break
|
26
|
+
end
|
27
|
+
|
28
|
+
rule space
|
29
|
+
[ ]
|
30
|
+
end
|
31
|
+
|
32
|
+
rule tab
|
33
|
+
[\t]
|
34
|
+
end
|
35
|
+
|
36
|
+
rule line_break
|
37
|
+
[\n]
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|