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
@@ -3,15 +3,15 @@ require 'jievro/parser/grammar/statement/loop/for_in'
|
|
3
3
|
require 'jievro/parser/grammar/statement/loop/while'
|
4
4
|
require 'jievro/parser/grammar/statement/loop/do_while'
|
5
5
|
|
6
|
-
module
|
6
|
+
module Jievro
|
7
7
|
module Grammar
|
8
8
|
module Statement
|
9
9
|
grammar Loop
|
10
10
|
|
11
|
-
include
|
12
|
-
include
|
13
|
-
include
|
14
|
-
include
|
11
|
+
include Jievro::StatementFor
|
12
|
+
include Jievro::StatementForIn
|
13
|
+
include Jievro::StatementWhile
|
14
|
+
include Jievro::StatementDoWhile
|
15
15
|
|
16
16
|
rule statement_loop
|
17
17
|
statement_for_in / statement_for / statement_while / statement_do_while
|
@@ -1,11 +1,11 @@
|
|
1
1
|
require 'jievro/parser/grammar/statement/loop/loop'
|
2
2
|
require 'jievro/parser/grammar/statement/branch/branch'
|
3
3
|
|
4
|
-
module
|
4
|
+
module Jievro
|
5
5
|
grammar Statement
|
6
6
|
|
7
|
-
include
|
8
|
-
include
|
7
|
+
include Jievro::Grammar::Statement::Loop
|
8
|
+
include Jievro::Grammar::Statement::Branch
|
9
9
|
|
10
10
|
rule statement
|
11
11
|
statement_loop / statement_branch / expression_statement / declaration_statement
|
@@ -2,14 +2,16 @@ require 'jievro/parser/grammar/type/type_identifier'
|
|
2
2
|
require 'jievro/parser/grammar/type/type_array'
|
3
3
|
require 'jievro/parser/grammar/type/type_dictionary'
|
4
4
|
require 'jievro/parser/grammar/type/type_annotation'
|
5
|
+
require 'jievro/parser/grammar/type/type_inheritance_clause'
|
5
6
|
|
6
|
-
module
|
7
|
+
module Jievro
|
7
8
|
grammar Type
|
8
9
|
|
9
|
-
include
|
10
|
-
include
|
11
|
-
include
|
12
|
-
include
|
10
|
+
include Jievro::TypeIdentifier
|
11
|
+
include Jievro::TypeArray
|
12
|
+
include Jievro::TypeDictionary
|
13
|
+
include Jievro::TypeAnnotation
|
14
|
+
include Jievro::TypeInheritanceClause
|
13
15
|
|
14
16
|
rule type
|
15
17
|
type_identifier / type_dictionary / type_array
|
@@ -1,31 +1,24 @@
|
|
1
|
-
module
|
1
|
+
module Jievro
|
2
2
|
grammar TypeIdentifier
|
3
3
|
|
4
4
|
rule type_identifier
|
5
5
|
type_name:type_name ws:_ generic_argument_clause:generic_argument_clause? {
|
6
6
|
def tokens
|
7
|
-
|
8
7
|
tokens = []
|
9
8
|
|
10
9
|
tokens.concat(type_name.tokens)
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
end
|
15
|
-
|
16
|
-
unless generic_argument_clause.text_value.empty?
|
17
|
-
tokens.concat(generic_argument_clause.tokens)
|
18
|
-
end
|
10
|
+
tokens.concat(ws.tokens) unless ws.text_value.empty?
|
11
|
+
tokens.concat(generic_argument_clause.tokens) \
|
12
|
+
unless generic_argument_clause.text_value.empty?
|
19
13
|
|
20
14
|
tokens
|
21
15
|
end
|
22
|
-
def ast
|
23
16
|
|
17
|
+
def ast
|
24
18
|
ast = type_name.ast
|
25
19
|
|
26
|
-
|
27
|
-
|
28
|
-
end
|
20
|
+
ast.first[:parameters] = generic_argument_clause.ast \
|
21
|
+
unless generic_argument_clause.text_value.empty?
|
29
22
|
|
30
23
|
ast
|
31
24
|
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module Jievro
|
2
|
+
grammar TypeInheritanceClause
|
3
|
+
|
4
|
+
rule type_inheritance_clause
|
5
|
+
':' ws:_ list:type_inheritance_list {
|
6
|
+
def tokens
|
7
|
+
tokens = []
|
8
|
+
|
9
|
+
tokens.push(T_COLON)
|
10
|
+
tokens.concat(ws.tokens) unless ws.text_value.empty?
|
11
|
+
tokens.concat(list.tokens)
|
12
|
+
|
13
|
+
tokens
|
14
|
+
end
|
15
|
+
|
16
|
+
def ast
|
17
|
+
list.ast
|
18
|
+
end
|
19
|
+
}
|
20
|
+
end
|
21
|
+
|
22
|
+
rule type_inheritance_list
|
23
|
+
head:(type:type_identifier ws1:_ ',' ws2:_)* tail:type_identifier {
|
24
|
+
def tokens
|
25
|
+
tokens = []
|
26
|
+
|
27
|
+
unless head.text_value.empty?
|
28
|
+
head.elements.each { |e|
|
29
|
+
tokens.concat(e.type.tokens)
|
30
|
+
tokens.concat(e.ws1.tokens) unless e.ws1.text_value.empty?
|
31
|
+
tokens.push(T_COMMA)
|
32
|
+
tokens.concat(e.ws2.tokens) unless e.ws2.text_value.empty?
|
33
|
+
}
|
34
|
+
end
|
35
|
+
|
36
|
+
tokens.concat(tail.tokens)
|
37
|
+
|
38
|
+
tokens
|
39
|
+
end
|
40
|
+
|
41
|
+
def ast
|
42
|
+
ast = []
|
43
|
+
|
44
|
+
unless head.text_value.empty?
|
45
|
+
head.elements.each { |e|
|
46
|
+
ast.concat(e.type.ast)
|
47
|
+
}
|
48
|
+
end
|
49
|
+
|
50
|
+
ast.concat(tail.ast)
|
51
|
+
|
52
|
+
ast
|
53
|
+
end
|
54
|
+
}
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -8,9 +8,7 @@ module Jievro
|
|
8
8
|
module Parser
|
9
9
|
class StringParser
|
10
10
|
def parse(source)
|
11
|
-
|
12
11
|
parser = Jievro::SwiftParser.new
|
13
|
-
|
14
12
|
tokens = []
|
15
13
|
ast = {
|
16
14
|
__type: 'program',
|
@@ -18,13 +16,10 @@ module Jievro
|
|
18
16
|
}
|
19
17
|
|
20
18
|
unless source.empty?
|
21
|
-
|
22
19
|
parsed = parser.parse(source)
|
23
20
|
|
24
|
-
if parsed.nil?
|
25
|
-
|
26
|
-
end
|
27
|
-
|
21
|
+
fail Exception, parser.failure_reason if parsed.nil?
|
22
|
+
|
28
23
|
tokens = parsed.tokens
|
29
24
|
ast = parsed.ast
|
30
25
|
end
|
@@ -1,18 +1,17 @@
|
|
1
|
-
module
|
1
|
+
module Jievro
|
2
2
|
module Tools
|
3
3
|
module Converter
|
4
4
|
class BinaryStringToIntConverter
|
5
5
|
def convert(binary_string)
|
6
|
+
fail Exception, 'Cannot convert non `String\' values' \
|
7
|
+
unless binary_string.is_a?(String)
|
6
8
|
|
7
|
-
|
8
|
-
unless binary_string.kind_of?(String)
|
9
|
-
|
10
|
-
raise Exception, 'String to convert do not match the regular format' \
|
9
|
+
fail Exception, 'String to convert do not match the regular format' \
|
11
10
|
unless binary_string =~ /^0b[01_]+$/i
|
12
11
|
|
13
|
-
clean_string = binary_string.gsub!
|
12
|
+
clean_string = binary_string.gsub!(/0b|_*/, '')
|
14
13
|
|
15
|
-
clean_string.to_i(
|
14
|
+
clean_string.to_i(2)
|
16
15
|
end
|
17
16
|
end
|
18
17
|
end
|
@@ -1,18 +1,17 @@
|
|
1
|
-
module
|
1
|
+
module Jievro
|
2
2
|
module Tools
|
3
3
|
module Converter
|
4
4
|
class DecimalFloatStringToFloatConverter
|
5
5
|
def convert(decimal_float_string)
|
6
|
-
|
7
|
-
|
8
|
-
unless decimal_float_string.kind_of?(String)
|
6
|
+
fail Exception, 'Cannot convert non `String\' values' \
|
7
|
+
unless decimal_float_string.is_a?(String)
|
9
8
|
|
10
9
|
# the regex that match a decimal floating number is not exact
|
11
10
|
# but for this purpose should be fine
|
12
|
-
|
11
|
+
fail Exception, 'String do not match the regular format' \
|
13
12
|
unless decimal_float_string =~ /^[0-9_]+.?[0-9_]*e?[+-]?[0-9_]*$/i
|
14
13
|
|
15
|
-
clean_string = decimal_float_string.gsub!
|
14
|
+
clean_string = decimal_float_string.gsub!(/_*/, '')
|
16
15
|
|
17
16
|
clean_string.to_f
|
18
17
|
end
|
@@ -1,16 +1,15 @@
|
|
1
|
-
module
|
1
|
+
module Jievro
|
2
2
|
module Tools
|
3
3
|
module Converter
|
4
4
|
class DecimalStringToIntConverter
|
5
5
|
def convert(decimal_string)
|
6
|
+
fail Exception, 'Cannot convert non `String\' values' \
|
7
|
+
unless decimal_string.is_a?(String)
|
6
8
|
|
7
|
-
|
8
|
-
unless decimal_string.kind_of?(String)
|
9
|
-
|
10
|
-
raise Exception, 'String to convert do not match the regular format' \
|
9
|
+
fail Exception, 'String to convert do not match the regular format' \
|
11
10
|
unless decimal_string =~ /^[0-9_]+$/i
|
12
11
|
|
13
|
-
clean_string = decimal_string.gsub!
|
12
|
+
clean_string = decimal_string.gsub!(/_*/, '')
|
14
13
|
|
15
14
|
clean_string.to_i
|
16
15
|
end
|
@@ -1,40 +1,35 @@
|
|
1
|
-
module
|
1
|
+
module Jievro
|
2
2
|
module Tools
|
3
3
|
module Converter
|
4
4
|
class HexadecimalFloatStringToFloatConverter
|
5
5
|
def convert(hexadecimal_float_string)
|
6
|
+
fail Exception, 'Cannot convert non `String\' values' \
|
7
|
+
unless hexadecimal_float_string.is_a?(String)
|
6
8
|
|
7
|
-
|
8
|
-
unless hexadecimal_float_string.kind_of?(String)
|
9
|
-
|
10
|
-
clean_string = hexadecimal_float_string.gsub! /_*/, ''
|
9
|
+
clean_string = hexadecimal_float_string.gsub!(/\_*/, '')
|
11
10
|
|
12
11
|
match = clean_string.match(/^0x([0-9a-f]+).?([0-9a-f]*)p([+-]?)([0-9]+)$/i)
|
13
12
|
|
14
|
-
|
13
|
+
fail Exception, 'String to convert do not match the regular format' \
|
15
14
|
unless match
|
16
15
|
|
17
16
|
captures = match.captures
|
18
17
|
|
19
|
-
integer = captures[0].to_i(
|
18
|
+
integer = captures[0].to_i(16).to_f
|
20
19
|
mantissa_hexadecimal = captures[1]
|
21
20
|
negative_exponent = captures[2] == '-'
|
22
21
|
exponent = captures[3].to_i
|
23
22
|
|
24
23
|
mantissa = 0.0
|
25
|
-
|
26
|
-
if negative_exponent
|
27
|
-
exponent = -exponent
|
28
|
-
end
|
29
|
-
|
24
|
+
exponent = -exponent if negative_exponent
|
30
25
|
mantissa_current_bit_value = 16
|
31
26
|
|
32
27
|
mantissa_hexadecimal.each_byte do |mantissa_hexadecimal_char|
|
33
|
-
mantissa += mantissa_hexadecimal_char.chr.to_i(
|
28
|
+
mantissa += mantissa_hexadecimal_char.chr.to_i(16).to_f / mantissa_current_bit_value
|
34
29
|
mantissa_current_bit_value <<= 4
|
35
30
|
end
|
36
31
|
|
37
|
-
(integer + mantissa) * (2
|
32
|
+
(integer + mantissa) * (2**exponent)
|
38
33
|
end
|
39
34
|
end
|
40
35
|
end
|
@@ -1,18 +1,17 @@
|
|
1
|
-
module
|
1
|
+
module Jievro
|
2
2
|
module Tools
|
3
3
|
module Converter
|
4
4
|
class HexadecimalStringToIntConverter
|
5
5
|
def convert(hexadecimal_string)
|
6
|
+
fail Exception, 'Cannot convert non `String\' values' \
|
7
|
+
unless hexadecimal_string.is_a?(String)
|
6
8
|
|
7
|
-
|
8
|
-
unless hexadecimal_string.kind_of?(String)
|
9
|
-
|
10
|
-
raise Exception, 'String to convert do not match the regular format' \
|
9
|
+
fail Exception, 'String to convert do not match the regular format' \
|
11
10
|
unless hexadecimal_string =~ /^0x[0-9a-f_]+$/i
|
12
11
|
|
13
12
|
clean_string = hexadecimal_string.gsub!(/0x|_*/, '')
|
14
13
|
|
15
|
-
clean_string.to_i(
|
14
|
+
clean_string.to_i(16)
|
16
15
|
end
|
17
16
|
end
|
18
17
|
end
|
@@ -1,18 +1,17 @@
|
|
1
|
-
module
|
1
|
+
module Jievro
|
2
2
|
module Tools
|
3
3
|
module Converter
|
4
4
|
class OctalStringToIntConverter
|
5
5
|
def convert(octal_string)
|
6
|
+
fail Exception, 'Cannot convert non `String\' values' \
|
7
|
+
unless octal_string.is_a?(String)
|
6
8
|
|
7
|
-
|
8
|
-
unless octal_string.kind_of?(String)
|
9
|
-
|
10
|
-
raise Exception, 'String to convert do not match the regular format' \
|
9
|
+
fail Exception, 'String to convert do not match the regular format' \
|
11
10
|
unless octal_string =~ /^0o[0-7_]+$/i
|
12
11
|
|
13
12
|
clean_string = octal_string.gsub!(/_*/, '')
|
14
13
|
|
15
|
-
clean_string.to_i(
|
14
|
+
clean_string.to_i(8)
|
16
15
|
end
|
17
16
|
end
|
18
17
|
end
|