jievro-parser 0.8.0 → 0.9.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 (79) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +3 -3
  3. data/Rakefile +1 -1
  4. data/jievro-parser.gemspec +1 -1
  5. data/lib/jievro/parser/binary_operator.rb +27 -38
  6. data/lib/jievro/parser/grammar/code_block.treetop +1 -1
  7. data/lib/jievro/parser/grammar/declaration/constant_declaration.treetop +2 -8
  8. data/lib/jievro/parser/grammar/declaration/declaration.treetop +47 -5
  9. data/lib/jievro/parser/grammar/declaration/function_declaration.treetop +26 -105
  10. data/lib/jievro/parser/grammar/declaration/initializer_declaration.treetop +16 -0
  11. data/lib/jievro/parser/grammar/declaration/protocol_declaration.treetop +164 -0
  12. data/lib/jievro/parser/grammar/declaration/struct_declaration.treetop +49 -0
  13. data/lib/jievro/parser/grammar/declaration/typealias_declaration.treetop +64 -0
  14. data/lib/jievro/parser/grammar/declaration/variable_declaration.treetop +113 -9
  15. data/lib/jievro/parser/grammar/expression/binary_expression.treetop +5 -22
  16. data/lib/jievro/parser/grammar/expression/closure_expression.treetop +28 -86
  17. data/lib/jievro/parser/grammar/expression/expression.treetop +13 -13
  18. data/lib/jievro/parser/grammar/expression/function_call_expression.treetop +2 -6
  19. data/lib/jievro/parser/grammar/expression/literal_expression.treetop +1 -1
  20. data/lib/jievro/parser/grammar/expression/parenthesized_expression.treetop +15 -54
  21. data/lib/jievro/parser/grammar/expression/postfix_expression.treetop +1 -1
  22. data/lib/jievro/parser/grammar/expression/prefix_expression.treetop +1 -1
  23. data/lib/jievro/parser/grammar/expression/primary_expression.treetop +1 -1
  24. data/lib/jievro/parser/grammar/expression/range_expression.treetop +4 -18
  25. data/lib/jievro/parser/grammar/expression/self_expression.treetop +2 -7
  26. data/lib/jievro/parser/grammar/expression/super_expression.treetop +2 -7
  27. data/lib/jievro/parser/grammar/expression/wildcard_expression.treetop +1 -1
  28. data/lib/jievro/parser/grammar/generics/generic_argument_clause.treetop +8 -34
  29. data/lib/jievro/parser/grammar/generics/generics.treetop +2 -2
  30. data/lib/jievro/parser/grammar/grammar.treetop +35 -28
  31. data/lib/jievro/parser/grammar/identifier.treetop +2 -2
  32. data/lib/jievro/parser/grammar/implicit_parameter_name.treetop +1 -1
  33. data/lib/jievro/parser/grammar/literal/literal.treetop +25 -24
  34. data/lib/jievro/parser/grammar/literal/literal_array.treetop +12 -40
  35. data/lib/jievro/parser/grammar/literal/literal_boolean.treetop +5 -13
  36. data/lib/jievro/parser/grammar/literal/literal_decimal_floating_point.treetop +3 -9
  37. data/lib/jievro/parser/grammar/literal/literal_dictionary.treetop +18 -57
  38. data/lib/jievro/parser/grammar/literal/literal_hexadecimal_floating_point.treetop +3 -9
  39. data/lib/jievro/parser/grammar/literal/literal_integer_binary.treetop +3 -9
  40. data/lib/jievro/parser/grammar/literal/literal_integer_decimal.treetop +3 -9
  41. data/lib/jievro/parser/grammar/literal/literal_integer_hexadecimal.treetop +3 -9
  42. data/lib/jievro/parser/grammar/literal/literal_integer_octal.treetop +3 -9
  43. data/lib/jievro/parser/grammar/literal/literal_nil.treetop +2 -7
  44. data/lib/jievro/parser/grammar/literal/literal_numeric.treetop +11 -18
  45. data/lib/jievro/parser/grammar/literal/literal_string.treetop +14 -46
  46. data/lib/jievro/parser/grammar/operator.treetop +1 -1
  47. data/lib/jievro/parser/grammar/pattern/pattern.treetop +4 -4
  48. data/lib/jievro/parser/grammar/pattern/pattern_identifier.treetop +1 -1
  49. data/lib/jievro/parser/grammar/pattern/pattern_initializer.treetop +18 -70
  50. data/lib/jievro/parser/grammar/pattern/pattern_wildcard.treetop +1 -1
  51. data/lib/jievro/parser/grammar/statement/branch/branch.treetop +2 -2
  52. data/lib/jievro/parser/grammar/statement/branch/if.treetop +1 -1
  53. data/lib/jievro/parser/grammar/statement/loop/do_while.treetop +1 -1
  54. data/lib/jievro/parser/grammar/statement/loop/for.treetop +1 -1
  55. data/lib/jievro/parser/grammar/statement/loop/for_in.treetop +1 -1
  56. data/lib/jievro/parser/grammar/statement/loop/loop.treetop +5 -5
  57. data/lib/jievro/parser/grammar/statement/loop/while.treetop +1 -1
  58. data/lib/jievro/parser/grammar/statement/statement.treetop +3 -3
  59. data/lib/jievro/parser/grammar/type/type.treetop +7 -5
  60. data/lib/jievro/parser/grammar/type/type_annotation.treetop +1 -1
  61. data/lib/jievro/parser/grammar/type/type_array.treetop +1 -1
  62. data/lib/jievro/parser/grammar/type/type_dictionary.treetop +1 -1
  63. data/lib/jievro/parser/grammar/type/type_identifier.treetop +7 -14
  64. data/lib/jievro/parser/grammar/type/type_inheritance_clause.treetop +57 -0
  65. data/lib/jievro/parser/grammar/whitespace.treetop +1 -1
  66. data/lib/jievro/parser/grammar/wildcard.treetop +1 -1
  67. data/lib/jievro/parser/string_parser.rb +2 -7
  68. data/lib/jievro/parser/tools/converter/binary_string_to_int_converter.rb +6 -7
  69. data/lib/jievro/parser/tools/converter/converter.rb +1 -1
  70. data/lib/jievro/parser/tools/converter/decimal_float_string_to_float_converter.rb +5 -6
  71. data/lib/jievro/parser/tools/converter/decimal_string_to_int_converter.rb +5 -6
  72. data/lib/jievro/parser/tools/converter/hexadecimal_float_string_to_float_converter.rb +9 -14
  73. data/lib/jievro/parser/tools/converter/hexadecimal_string_to_int_converter.rb +5 -6
  74. data/lib/jievro/parser/tools/converter/octal_string_to_int_converter.rb +5 -6
  75. data/lib/jievro/parser/tools/quote_stripper.rb +1 -2
  76. data/lib/jievro/parser/tools/shunting_yard.rb +18 -32
  77. data/lib/jievro/parser/tools/tokens.rb +159 -0
  78. data/lib/jievro/parser/version.rb +1 -1
  79. metadata +24 -19
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d56703e726b140d5f670a4612faebbfbf231ec1f
4
- data.tar.gz: 83a92536b8ee7c04845ba217a70f464258328da6
3
+ metadata.gz: aada9eec4d85adbc32e3a819a1a6a65d89e08786
4
+ data.tar.gz: 4d40c2a82ba9259b0fef4a059709c4faf5c6dadc
5
5
  SHA512:
6
- metadata.gz: 13370ace3ab61ee7218449f6a74e1529cda2b89a00b0c1374f4c23c215a53c4062d4c42fbed6f9006a52d9e6b24f110aca5381dba9ae45f3cd483cbdbcf143b8
7
- data.tar.gz: b990775579e54f24dac0144200f23d92b682ec0778e819a65463d8456eb88008a7644c30c51f41d13e24884e713995b8653142d44317f0177fc85499408f0f0e
6
+ metadata.gz: 54a0bc03018a89e087b2b247419323b2e4ab9f81e43ec4fabea34a5b1e86b14a9a68b8760a7ce5ac887ea5d10c12963f64cba4750f236ddb4c30980e1ca92139
7
+ data.tar.gz: 930f50adb765c6e68d8dddf929a3c1815b34f0d37847246396939e95a86d4f6cca87b290228f4976013764e0eb5e9ec1fba560c6b6b01fdee95fda59e2ce6d47
data/Gemfile.lock CHANGED
@@ -1,15 +1,15 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- jievro-parser (0.8.0)
5
- jievro-ast (~> 0.5)
4
+ jievro-parser (0.9.0)
5
+ jievro-ast (~> 0.7)
6
6
  treetop (~> 1.6)
7
7
 
8
8
  GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
11
  diff-lcs (1.2.5)
12
- jievro-ast (0.5.0)
12
+ jievro-ast (0.8.1)
13
13
  polyglot (0.3.5)
14
14
  rake (10.4.2)
15
15
  rspec (3.2.0)
data/Rakefile CHANGED
@@ -2,6 +2,6 @@ require 'rspec'
2
2
  require 'rspec/core/rake_task'
3
3
 
4
4
  RSpec::Core::RakeTask.new(:test) do |t|
5
- t.ruby_opts = %w(-I lib -I spec)
5
+ t.ruby_opts = %w(-I lib -I spec)
6
6
  t.rspec_opts = '--color --format progress --fail-fast'
7
7
  end
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
18
18
 
19
19
  spec.required_ruby_version = '~> 2.0'
20
20
 
21
- spec.add_runtime_dependency 'jievro-ast', '~> 0.5'
21
+ spec.add_runtime_dependency 'jievro-ast', '~> 0.7'
22
22
  spec.add_runtime_dependency 'treetop', '~> 1.6'
23
23
 
24
24
  spec.add_development_dependency 'bundler', '~> 1.9'
@@ -1,6 +1,7 @@
1
1
  module Jievro
2
2
  module Parser
3
3
  class BinaryOperator
4
+ attr_reader :sign, :associativity, :precedence
4
5
 
5
6
  def initialize(sign, associativity, precedence)
6
7
  @sign = sign
@@ -8,54 +9,42 @@ module Jievro
8
9
  @precedence = precedence
9
10
  end
10
11
 
11
- def sign
12
- @sign
13
- end
14
-
15
- def associativity
16
- @associativity
17
- end
18
-
19
- def precedence
20
- @precedence
21
- end
22
-
23
12
  def self.get(sign)
24
13
  case sign
25
- when '<<', '>>'
26
- operator = BinaryOperator.new(sign, :none, 160)
27
- when '*', '/', '%', '&*', '&/', '&%', '&'
28
- operator = BinaryOperator.new(sign, :left, 150)
29
- when '+', '-', '&+', '&-', '|', '^'
30
- operator = BinaryOperator.new(sign, :left, 140)
31
- when '..<', '...'
32
- operator = BinaryOperator.new(sign, :none, 135)
33
- when 'is', 'as'
34
- operator = BinaryOperator.new(sign, :none, 132)
35
- when '<', '<=', '>', '>=', '==', '!=', '===', '!==', '~='
36
- operator = BinaryOperator.new(sign, :left, 130)
37
- when '&&'
38
- operator = BinaryOperator.new(sign, :left, 120)
39
- when '||'
40
- operator = BinaryOperator.new(sign, :left, 110)
41
- when '??'
42
- operator = BinaryOperator.new(sign, :right, 110)
43
- when '?:'
44
- operator = BinaryOperator.new(sign, :right, 100)
45
- when '=', '*=', '/=', '%=', '+=', '-=', '<<=', '>>=', '&=', '^=', '|=', '&&=', '||='
46
- operator = BinaryOperator.new(sign, :right, 90)
47
- else
48
- raise Exception, 'sign not managed'
14
+ when '<<', '>>'
15
+ operator = BinaryOperator.new(sign, :none, 160)
16
+ when '*', '/', '%', '&*', '&/', '&%', '&'
17
+ operator = BinaryOperator.new(sign, :left, 150)
18
+ when '+', '-', '&+', '&-', '|', '^'
19
+ operator = BinaryOperator.new(sign, :left, 140)
20
+ when '..<', '...'
21
+ operator = BinaryOperator.new(sign, :none, 135)
22
+ when 'is', 'as'
23
+ operator = BinaryOperator.new(sign, :none, 132)
24
+ when '<', '<=', '>', '>=', '==', '!=', '===', '!==', '~='
25
+ operator = BinaryOperator.new(sign, :left, 130)
26
+ when '&&'
27
+ operator = BinaryOperator.new(sign, :left, 120)
28
+ when '||'
29
+ operator = BinaryOperator.new(sign, :left, 110)
30
+ when '??'
31
+ operator = BinaryOperator.new(sign, :right, 110)
32
+ when '?:'
33
+ operator = BinaryOperator.new(sign, :right, 100)
34
+ when '=', '*=', '/=', '%=', '+=', '-=', '<<=', '>>=', '&=', '^=', '|=', '&&=', '||='
35
+ operator = BinaryOperator.new(sign, :right, 90)
36
+ else
37
+ fail "sign #{sign} not managed"
49
38
  end
50
39
 
51
40
  operator
52
41
  end
53
42
 
54
- def self.is_operator(sign)
43
+ def self.operator?(sign)
55
44
  begin
56
45
  self.get(sign)
57
46
  is_operator = true
58
- rescue Exception
47
+ rescue StandardError
59
48
  is_operator = false
60
49
  end
61
50
 
@@ -1,4 +1,4 @@
1
- module Kauri
1
+ module Jievro
2
2
  grammar CodeBlock
3
3
 
4
4
  rule code_block
@@ -1,17 +1,12 @@
1
- module Kauri
1
+ module Jievro
2
2
  grammar ConstantDeclaration
3
3
 
4
4
  rule constant_declaration
5
5
  'let' whitespaces:whitespaces pattern_initializer_list:pattern_initializer_list {
6
6
  def tokens
7
-
8
7
  tokens = []
9
8
 
10
- tokens.push({
11
- type: 'T_LET',
12
- value: 'let'
13
- })
14
-
9
+ tokens.push(T_LET)
15
10
  tokens.concat(whitespaces.tokens)
16
11
  tokens.concat(pattern_initializer_list.tokens)
17
12
 
@@ -19,7 +14,6 @@ module Kauri
19
14
  end
20
15
 
21
16
  def ast
22
-
23
17
  ast = []
24
18
 
25
19
  pattern_initializer_list.ast.each { |e|
@@ -1,16 +1,58 @@
1
1
  require 'jievro/parser/grammar/declaration/constant_declaration'
2
2
  require 'jievro/parser/grammar/declaration/variable_declaration'
3
3
  require 'jievro/parser/grammar/declaration/function_declaration'
4
+ require 'jievro/parser/grammar/declaration/struct_declaration'
5
+ require 'jievro/parser/grammar/declaration/protocol_declaration'
6
+ require 'jievro/parser/grammar/declaration/initializer_declaration'
7
+ require 'jievro/parser/grammar/declaration/typealias_declaration'
4
8
 
5
- module Kauri
9
+ module Jievro
6
10
  grammar Declaration
7
11
 
8
- include Kauri::ConstantDeclaration
9
- include Kauri::VariableDeclaration
10
- include Kauri::FunctionDeclaration
12
+ include Jievro::ConstantDeclaration
13
+ include Jievro::VariableDeclaration
14
+ include Jievro::FunctionDeclaration
15
+ include Jievro::StructDeclaration
16
+ include Jievro::ProtocolDeclaration
17
+ include Jievro::InitializerDeclaration
18
+ include Jievro::TypealiasDeclaration
11
19
 
12
20
  rule declaration
13
- constant_declaration / variable_declaration / function_declaration
21
+ constant_declaration
22
+ /
23
+ variable_declaration
24
+ /
25
+ function_declaration
26
+ /
27
+ struct_declaration
28
+ /
29
+ protocol_declaration
30
+ /
31
+ typealias_declaration
32
+ end
33
+
34
+ rule declarations
35
+ declaration+ {
36
+ def tokens
37
+ tokens = []
38
+
39
+ elements.each { |e|
40
+ tokens.concat(e.tokens)
41
+ }
42
+
43
+ tokens
44
+ end
45
+
46
+ def ast
47
+ ast = []
48
+
49
+ elements.each { |e|
50
+ ast.concat(e.ast)
51
+ }
52
+
53
+ ast
54
+ end
55
+ }
14
56
  end
15
57
  end
16
58
  end
@@ -1,4 +1,4 @@
1
- module Kauri
1
+ module Jievro
2
2
  grammar FunctionDeclaration
3
3
 
4
4
  rule function_declaration
@@ -7,30 +7,17 @@ module Kauri
7
7
  tokens = []
8
8
 
9
9
  tokens.concat(function_head.tokens)
10
-
11
- unless ws1.text_value.empty?
12
- tokens.concat(ws1.tokens)
13
- end
14
-
10
+ tokens.concat(ws1.tokens) unless ws1.text_value.empty?
15
11
  tokens.concat(function_name.tokens)
16
-
17
- unless ws2.text_value.empty?
18
- tokens.concat(ws2.tokens)
19
- end
20
-
12
+ tokens.concat(ws2.tokens) unless ws2.text_value.empty?
21
13
  tokens.concat(function_signature.tokens)
22
-
23
- unless ws3.text_value.empty?
24
- tokens.concat(ws3.tokens)
25
- end
26
-
14
+ tokens.concat(ws3.tokens) unless ws3.text_value.empty?
27
15
  tokens.concat(function_body.tokens)
28
16
 
29
17
  tokens
30
18
  end
31
19
 
32
20
  def ast
33
-
34
21
  signature = function_signature.ast
35
22
 
36
23
  name = function_name.ast.first
@@ -54,12 +41,7 @@ module Kauri
54
41
  rule function_head
55
42
  'func' {
56
43
  def tokens
57
- [
58
- {
59
- type: 'T_FUNCTION',
60
- value: 'func'
61
- }
62
- ]
44
+ [T_FUNCTION]
63
45
  end
64
46
  }
65
47
  end
@@ -74,25 +56,15 @@ module Kauri
74
56
  tokens = []
75
57
 
76
58
  tokens.concat(parameter_clause.tokens)
77
-
78
- unless ws.text_value.empty?
79
- tokens.concat(ws.tokens)
80
- end
81
-
82
- unless return_type.text_value.empty?
83
- tokens.concat(return_type.tokens)
84
- end
59
+ tokens.concat(ws.tokens) unless ws.text_value.empty?
60
+ tokens.concat(return_type.tokens) unless return_type.text_value.empty?
85
61
 
86
62
  tokens
87
63
  end
88
64
 
89
65
  def ast
90
-
91
66
  parameters = parameter_clause.ast
92
-
93
- unless return_type.text_value.empty?
94
- type = return_type.ast
95
- end
67
+ type = return_type.ast unless return_type.text_value.empty?
96
68
 
97
69
  {
98
70
  parameters: parameters,
@@ -111,19 +83,9 @@ module Kauri
111
83
  def tokens
112
84
  tokens = []
113
85
 
114
- tokens.push({
115
- type: 'T_OPEN_ROUND_BRACKET',
116
- value: '('
117
- })
118
-
119
- unless ws.text_value.empty?
120
- tokens.concat(ws.tokens)
121
- end
122
-
123
- tokens.push({
124
- type: 'T_CLOSE_ROUND_BRACKET',
125
- value: ')'
126
- })
86
+ tokens.push(T_OPEN_ROUND_BRACKET)
87
+ tokens.concat(ws.tokens) unless ws.text_value.empty?
88
+ tokens.push(T_CLOSE_ROUND_BRACKET)
127
89
 
128
90
  tokens
129
91
  end
@@ -139,25 +101,11 @@ module Kauri
139
101
  def tokens
140
102
  tokens = []
141
103
 
142
- tokens.push({
143
- type: 'T_OPEN_ROUND_BRACKET',
144
- value: '('
145
- })
146
-
147
- unless ws1.text_value.empty?
148
- tokens.concat(ws1.tokens)
149
- end
150
-
104
+ tokens.push(T_OPEN_ROUND_BRACKET)
105
+ tokens.concat(ws1.tokens) unless ws1.text_value.empty?
151
106
  tokens.concat(parameter_list.tokens)
152
-
153
- unless ws2.text_value.empty?
154
- tokens.concat(ws2.tokens)
155
- end
156
-
157
- tokens.push({
158
- type: 'T_CLOSE_ROUND_BRACKET',
159
- value: ')'
160
- })
107
+ tokens.concat(ws2.tokens) unless ws2.text_value.empty?
108
+ tokens.push(T_CLOSE_ROUND_BRACKET)
161
109
 
162
110
  tokens
163
111
  end
@@ -176,19 +124,9 @@ module Kauri
176
124
  unless head.text_value.empty?
177
125
  head.elements.each { |e|
178
126
  tokens.concat(e.parameter.tokens)
179
-
180
- unless e.ws1.text_value.empty?
181
- tokens.concat(e.ws1.tokens)
182
- end
183
-
184
- tokens.push({
185
- type: 'T_COMMA',
186
- value: ','
187
- })
188
-
189
- unless e.ws2.text_value.empty?
190
- tokens.concat(e.ws2.tokens)
191
- end
127
+ tokens.concat(e.ws1.tokens) unless e.ws1.text_value.empty?
128
+ tokens.push(T_COMMA)
129
+ tokens.concat(e.ws2.tokens) unless e.ws2.text_value.empty?
192
130
  }
193
131
  end
194
132
 
@@ -222,35 +160,25 @@ module Kauri
222
160
  def tokens
223
161
  tokens = []
224
162
 
225
- if defined? external_parameter_name
226
- tokens.concat(external_parameter_name.tokens)
227
- end
163
+ tokens.concat(external_parameter_name.tokens) \
164
+ if defined? external_parameter_name
228
165
 
229
166
  if defined? ws1
230
- unless ws1.text_value.empty?
231
- tokens.concat(ws1.tokens)
232
- end
167
+ tokens.concat(ws1.tokens) unless ws1.text_value.empty?
233
168
  end
234
169
 
235
170
  tokens.concat(local_parameter_name.tokens)
236
-
237
- unless ws2.text_value.empty?
238
- tokens.concat(ws2.tokens)
239
- end
240
-
171
+ tokens.concat(ws2.tokens) unless ws2.text_value.empty?
241
172
  tokens.concat(type_annotation.tokens)
242
173
 
243
174
  tokens
244
175
  end
245
176
 
246
177
  def ast
247
-
248
178
  type = type_annotation.ast.first
249
179
  local = local_parameter_name.ast.first
250
-
251
- if defined? external_parameter_name
252
- external = external_parameter_name.ast.first
253
- end
180
+ external = external_parameter_name.ast.first \
181
+ if defined? external_parameter_name
254
182
 
255
183
  {
256
184
  __type: 'function-declaration-parameter',
@@ -276,15 +204,8 @@ module Kauri
276
204
  def tokens
277
205
  tokens = []
278
206
 
279
- tokens.push({
280
- type: 'T_RETURN_TYPE_ARROW',
281
- value: '->'
282
- })
283
-
284
- unless ws.text_value.empty?
285
- tokens.concat(ws.tokens)
286
- end
287
-
207
+ tokens.push(T_RETURN_TYPE_ARROW)
208
+ tokens.concat(ws.tokens) unless ws.text_value.empty?
288
209
  tokens.concat(type.tokens)
289
210
 
290
211
  tokens