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.
Files changed (80) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -0
  3. data/.travis.yml +3 -0
  4. data/Gemfile +6 -0
  5. data/Gemfile.lock +30 -0
  6. data/README.md +1 -0
  7. data/Rakefile +7 -0
  8. data/lib/parser/binary_operator.rb +64 -0
  9. data/lib/parser/grammar/code_block.treetop +46 -0
  10. data/lib/parser/grammar/declaration/constant_declaration.treetop +38 -0
  11. data/lib/parser/grammar/declaration/declaration.treetop +16 -0
  12. data/lib/parser/grammar/declaration/function_declaration.treetop +302 -0
  13. data/lib/parser/grammar/declaration/variable_declaration.treetop +38 -0
  14. data/lib/parser/grammar/expression/binary_expression.treetop +75 -0
  15. data/lib/parser/grammar/expression/closure_expression.treetop +188 -0
  16. data/lib/parser/grammar/expression/expression.treetop +83 -0
  17. data/lib/parser/grammar/expression/function_call_expression.treetop +32 -0
  18. data/lib/parser/grammar/expression/literal_expression.treetop +8 -0
  19. data/lib/parser/grammar/expression/parenthesized_expression.treetop +146 -0
  20. data/lib/parser/grammar/expression/postfix_expression.treetop +8 -0
  21. data/lib/parser/grammar/expression/prefix_expression.treetop +29 -0
  22. data/lib/parser/grammar/expression/primary_expression.treetop +8 -0
  23. data/lib/parser/grammar/expression/range_expression.treetop +53 -0
  24. data/lib/parser/grammar/expression/self_expression.treetop +25 -0
  25. data/lib/parser/grammar/expression/super_expression.treetop +25 -0
  26. data/lib/parser/grammar/expression/wildcard_expression.treetop +8 -0
  27. data/lib/parser/grammar/generics/generic_argument_clause.treetop +89 -0
  28. data/lib/parser/grammar/generics/generics.treetop +9 -0
  29. data/lib/parser/grammar/grammar.treetop +76 -0
  30. data/lib/parser/grammar/identifier.treetop +56 -0
  31. data/lib/parser/grammar/implicit_parameter_name.treetop +26 -0
  32. data/lib/parser/grammar/literal/literal.treetop +45 -0
  33. data/lib/parser/grammar/literal/literal_array.treetop +98 -0
  34. data/lib/parser/grammar/literal/literal_boolean.treetop +50 -0
  35. data/lib/parser/grammar/literal/literal_decimal_floating_point.treetop +49 -0
  36. data/lib/parser/grammar/literal/literal_dictionary.treetop +157 -0
  37. data/lib/parser/grammar/literal/literal_hexadecimal_floating_point.treetop +47 -0
  38. data/lib/parser/grammar/literal/literal_integer_binary.treetop +47 -0
  39. data/lib/parser/grammar/literal/literal_integer_decimal.treetop +47 -0
  40. data/lib/parser/grammar/literal/literal_integer_hexadecimal.treetop +47 -0
  41. data/lib/parser/grammar/literal/literal_integer_octal.treetop +47 -0
  42. data/lib/parser/grammar/literal/literal_nil.treetop +25 -0
  43. data/lib/parser/grammar/literal/literal_numeric.treetop +69 -0
  44. data/lib/parser/grammar/literal/literal_string.treetop +207 -0
  45. data/lib/parser/grammar/operator.treetop +35 -0
  46. data/lib/parser/grammar/pattern/pattern.treetop +16 -0
  47. data/lib/parser/grammar/pattern/pattern_identifier.treetop +8 -0
  48. data/lib/parser/grammar/pattern/pattern_initializer.treetop +189 -0
  49. data/lib/parser/grammar/pattern/pattern_wildcard.treetop +8 -0
  50. data/lib/parser/grammar/statement/branch/branch.treetop +16 -0
  51. data/lib/parser/grammar/statement/branch/if.treetop +63 -0
  52. data/lib/parser/grammar/statement/loop/do_while.treetop +32 -0
  53. data/lib/parser/grammar/statement/loop/for.treetop +127 -0
  54. data/lib/parser/grammar/statement/loop/for_in.treetop +35 -0
  55. data/lib/parser/grammar/statement/loop/loop.treetop +22 -0
  56. data/lib/parser/grammar/statement/loop/while.treetop +34 -0
  57. data/lib/parser/grammar/statement/statement.treetop +97 -0
  58. data/lib/parser/grammar/type/type.treetop +18 -0
  59. data/lib/parser/grammar/type/type_annotation.treetop +29 -0
  60. data/lib/parser/grammar/type/type_array.treetop +43 -0
  61. data/lib/parser/grammar/type/type_dictionary.treetop +59 -0
  62. data/lib/parser/grammar/type/type_identifier.treetop +39 -0
  63. data/lib/parser/grammar/whitespace.treetop +40 -0
  64. data/lib/parser/grammar/wildcard.treetop +25 -0
  65. data/lib/parser/parse_result.rb +17 -0
  66. data/lib/parser/parser.rb +34 -0
  67. data/lib/parser/tools/converter/binary_string_to_int_converter.rb +20 -0
  68. data/lib/parser/tools/converter/converter.rb +12 -0
  69. data/lib/parser/tools/converter/decimal_float_string_to_float_converter.rb +22 -0
  70. data/lib/parser/tools/converter/decimal_string_to_int_converter.rb +20 -0
  71. data/lib/parser/tools/converter/hexadecimal_float_string_to_float_converter.rb +42 -0
  72. data/lib/parser/tools/converter/hexadecimal_string_to_int_converter.rb +20 -0
  73. data/lib/parser/tools/converter/octal_string_to_int_converter.rb +20 -0
  74. data/lib/parser/tools/quote_stripper.rb +18 -0
  75. data/lib/parser/tools/shunting_yard.rb +80 -0
  76. data/lib/parser/tools/tokens.rb +112 -0
  77. data/lib/parser/version.rb +5 -0
  78. data/lib/parser.rb +2 -0
  79. data/parser.gemspec +25 -0
  80. 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,8 @@
1
+ module Kauri
2
+ grammar LiteralExpression
3
+
4
+ rule literal_expression
5
+ literal
6
+ end
7
+ end
8
+ 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,8 @@
1
+ module Kauri
2
+ grammar PostfixExpression
3
+
4
+ rule postfix_expression
5
+ primary_expression
6
+ end
7
+ end
8
+ 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,8 @@
1
+ module Kauri
2
+ grammar PrimaryExpression
3
+
4
+ rule primary_expression
5
+ parenthesized_expression / literal_expression / wildcard_expression / identifier
6
+ end
7
+ end
8
+ 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,8 @@
1
+ module Kauri
2
+ grammar WildcardExpression
3
+
4
+ rule wildcard_expression
5
+ pattern_wildcard
6
+ end
7
+ end
8
+ 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