jievro-parser 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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