jievro-parser 0.8.0 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +3 -3
- data/Rakefile +1 -1
- data/jievro-parser.gemspec +1 -1
- data/lib/jievro/parser/binary_operator.rb +27 -38
- data/lib/jievro/parser/grammar/code_block.treetop +1 -1
- data/lib/jievro/parser/grammar/declaration/constant_declaration.treetop +2 -8
- data/lib/jievro/parser/grammar/declaration/declaration.treetop +47 -5
- data/lib/jievro/parser/grammar/declaration/function_declaration.treetop +26 -105
- data/lib/jievro/parser/grammar/declaration/initializer_declaration.treetop +16 -0
- data/lib/jievro/parser/grammar/declaration/protocol_declaration.treetop +164 -0
- data/lib/jievro/parser/grammar/declaration/struct_declaration.treetop +49 -0
- data/lib/jievro/parser/grammar/declaration/typealias_declaration.treetop +64 -0
- data/lib/jievro/parser/grammar/declaration/variable_declaration.treetop +113 -9
- data/lib/jievro/parser/grammar/expression/binary_expression.treetop +5 -22
- data/lib/jievro/parser/grammar/expression/closure_expression.treetop +28 -86
- data/lib/jievro/parser/grammar/expression/expression.treetop +13 -13
- data/lib/jievro/parser/grammar/expression/function_call_expression.treetop +2 -6
- data/lib/jievro/parser/grammar/expression/literal_expression.treetop +1 -1
- data/lib/jievro/parser/grammar/expression/parenthesized_expression.treetop +15 -54
- data/lib/jievro/parser/grammar/expression/postfix_expression.treetop +1 -1
- data/lib/jievro/parser/grammar/expression/prefix_expression.treetop +1 -1
- data/lib/jievro/parser/grammar/expression/primary_expression.treetop +1 -1
- data/lib/jievro/parser/grammar/expression/range_expression.treetop +4 -18
- data/lib/jievro/parser/grammar/expression/self_expression.treetop +2 -7
- data/lib/jievro/parser/grammar/expression/super_expression.treetop +2 -7
- data/lib/jievro/parser/grammar/expression/wildcard_expression.treetop +1 -1
- data/lib/jievro/parser/grammar/generics/generic_argument_clause.treetop +8 -34
- data/lib/jievro/parser/grammar/generics/generics.treetop +2 -2
- data/lib/jievro/parser/grammar/grammar.treetop +35 -28
- data/lib/jievro/parser/grammar/identifier.treetop +2 -2
- data/lib/jievro/parser/grammar/implicit_parameter_name.treetop +1 -1
- data/lib/jievro/parser/grammar/literal/literal.treetop +25 -24
- data/lib/jievro/parser/grammar/literal/literal_array.treetop +12 -40
- data/lib/jievro/parser/grammar/literal/literal_boolean.treetop +5 -13
- data/lib/jievro/parser/grammar/literal/literal_decimal_floating_point.treetop +3 -9
- data/lib/jievro/parser/grammar/literal/literal_dictionary.treetop +18 -57
- data/lib/jievro/parser/grammar/literal/literal_hexadecimal_floating_point.treetop +3 -9
- data/lib/jievro/parser/grammar/literal/literal_integer_binary.treetop +3 -9
- data/lib/jievro/parser/grammar/literal/literal_integer_decimal.treetop +3 -9
- data/lib/jievro/parser/grammar/literal/literal_integer_hexadecimal.treetop +3 -9
- data/lib/jievro/parser/grammar/literal/literal_integer_octal.treetop +3 -9
- data/lib/jievro/parser/grammar/literal/literal_nil.treetop +2 -7
- data/lib/jievro/parser/grammar/literal/literal_numeric.treetop +11 -18
- data/lib/jievro/parser/grammar/literal/literal_string.treetop +14 -46
- data/lib/jievro/parser/grammar/operator.treetop +1 -1
- data/lib/jievro/parser/grammar/pattern/pattern.treetop +4 -4
- data/lib/jievro/parser/grammar/pattern/pattern_identifier.treetop +1 -1
- data/lib/jievro/parser/grammar/pattern/pattern_initializer.treetop +18 -70
- data/lib/jievro/parser/grammar/pattern/pattern_wildcard.treetop +1 -1
- data/lib/jievro/parser/grammar/statement/branch/branch.treetop +2 -2
- data/lib/jievro/parser/grammar/statement/branch/if.treetop +1 -1
- data/lib/jievro/parser/grammar/statement/loop/do_while.treetop +1 -1
- data/lib/jievro/parser/grammar/statement/loop/for.treetop +1 -1
- data/lib/jievro/parser/grammar/statement/loop/for_in.treetop +1 -1
- data/lib/jievro/parser/grammar/statement/loop/loop.treetop +5 -5
- data/lib/jievro/parser/grammar/statement/loop/while.treetop +1 -1
- data/lib/jievro/parser/grammar/statement/statement.treetop +3 -3
- data/lib/jievro/parser/grammar/type/type.treetop +7 -5
- data/lib/jievro/parser/grammar/type/type_annotation.treetop +1 -1
- data/lib/jievro/parser/grammar/type/type_array.treetop +1 -1
- data/lib/jievro/parser/grammar/type/type_dictionary.treetop +1 -1
- data/lib/jievro/parser/grammar/type/type_identifier.treetop +7 -14
- data/lib/jievro/parser/grammar/type/type_inheritance_clause.treetop +57 -0
- data/lib/jievro/parser/grammar/whitespace.treetop +1 -1
- data/lib/jievro/parser/grammar/wildcard.treetop +1 -1
- data/lib/jievro/parser/string_parser.rb +2 -7
- data/lib/jievro/parser/tools/converter/binary_string_to_int_converter.rb +6 -7
- data/lib/jievro/parser/tools/converter/converter.rb +1 -1
- data/lib/jievro/parser/tools/converter/decimal_float_string_to_float_converter.rb +5 -6
- data/lib/jievro/parser/tools/converter/decimal_string_to_int_converter.rb +5 -6
- data/lib/jievro/parser/tools/converter/hexadecimal_float_string_to_float_converter.rb +9 -14
- data/lib/jievro/parser/tools/converter/hexadecimal_string_to_int_converter.rb +5 -6
- data/lib/jievro/parser/tools/converter/octal_string_to_int_converter.rb +5 -6
- data/lib/jievro/parser/tools/quote_stripper.rb +1 -2
- data/lib/jievro/parser/tools/shunting_yard.rb +18 -32
- data/lib/jievro/parser/tools/tokens.rb +159 -0
- data/lib/jievro/parser/version.rb +1 -1
- metadata +24 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aada9eec4d85adbc32e3a819a1a6a65d89e08786
|
4
|
+
data.tar.gz: 4d40c2a82ba9259b0fef4a059709c4faf5c6dadc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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.
|
5
|
-
jievro-ast (~> 0.
|
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.
|
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
data/jievro-parser.gemspec
CHANGED
@@ -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.
|
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
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
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.
|
43
|
+
def self.operator?(sign)
|
55
44
|
begin
|
56
45
|
self.get(sign)
|
57
46
|
is_operator = true
|
58
|
-
rescue
|
47
|
+
rescue StandardError
|
59
48
|
is_operator = false
|
60
49
|
end
|
61
50
|
|
@@ -1,17 +1,12 @@
|
|
1
|
-
module
|
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
|
9
|
+
module Jievro
|
6
10
|
grammar Declaration
|
7
11
|
|
8
|
-
include
|
9
|
-
include
|
10
|
-
include
|
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
|
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
|
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
|
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
|
-
|
116
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
181
|
-
|
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
|
-
|
226
|
-
|
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
|
-
|
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
|
-
|
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
|