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.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/.travis.yml +3 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +30 -0
- data/README.md +1 -0
- data/Rakefile +7 -0
- data/lib/parser/binary_operator.rb +64 -0
- data/lib/parser/grammar/code_block.treetop +46 -0
- data/lib/parser/grammar/declaration/constant_declaration.treetop +38 -0
- data/lib/parser/grammar/declaration/declaration.treetop +16 -0
- data/lib/parser/grammar/declaration/function_declaration.treetop +302 -0
- data/lib/parser/grammar/declaration/variable_declaration.treetop +38 -0
- data/lib/parser/grammar/expression/binary_expression.treetop +75 -0
- data/lib/parser/grammar/expression/closure_expression.treetop +188 -0
- data/lib/parser/grammar/expression/expression.treetop +83 -0
- data/lib/parser/grammar/expression/function_call_expression.treetop +32 -0
- data/lib/parser/grammar/expression/literal_expression.treetop +8 -0
- data/lib/parser/grammar/expression/parenthesized_expression.treetop +146 -0
- data/lib/parser/grammar/expression/postfix_expression.treetop +8 -0
- data/lib/parser/grammar/expression/prefix_expression.treetop +29 -0
- data/lib/parser/grammar/expression/primary_expression.treetop +8 -0
- data/lib/parser/grammar/expression/range_expression.treetop +53 -0
- data/lib/parser/grammar/expression/self_expression.treetop +25 -0
- data/lib/parser/grammar/expression/super_expression.treetop +25 -0
- data/lib/parser/grammar/expression/wildcard_expression.treetop +8 -0
- data/lib/parser/grammar/generics/generic_argument_clause.treetop +89 -0
- data/lib/parser/grammar/generics/generics.treetop +9 -0
- data/lib/parser/grammar/grammar.treetop +76 -0
- data/lib/parser/grammar/identifier.treetop +56 -0
- data/lib/parser/grammar/implicit_parameter_name.treetop +26 -0
- data/lib/parser/grammar/literal/literal.treetop +45 -0
- data/lib/parser/grammar/literal/literal_array.treetop +98 -0
- data/lib/parser/grammar/literal/literal_boolean.treetop +50 -0
- data/lib/parser/grammar/literal/literal_decimal_floating_point.treetop +49 -0
- data/lib/parser/grammar/literal/literal_dictionary.treetop +157 -0
- data/lib/parser/grammar/literal/literal_hexadecimal_floating_point.treetop +47 -0
- data/lib/parser/grammar/literal/literal_integer_binary.treetop +47 -0
- data/lib/parser/grammar/literal/literal_integer_decimal.treetop +47 -0
- data/lib/parser/grammar/literal/literal_integer_hexadecimal.treetop +47 -0
- data/lib/parser/grammar/literal/literal_integer_octal.treetop +47 -0
- data/lib/parser/grammar/literal/literal_nil.treetop +25 -0
- data/lib/parser/grammar/literal/literal_numeric.treetop +69 -0
- data/lib/parser/grammar/literal/literal_string.treetop +207 -0
- data/lib/parser/grammar/operator.treetop +35 -0
- data/lib/parser/grammar/pattern/pattern.treetop +16 -0
- data/lib/parser/grammar/pattern/pattern_identifier.treetop +8 -0
- data/lib/parser/grammar/pattern/pattern_initializer.treetop +189 -0
- data/lib/parser/grammar/pattern/pattern_wildcard.treetop +8 -0
- data/lib/parser/grammar/statement/branch/branch.treetop +16 -0
- data/lib/parser/grammar/statement/branch/if.treetop +63 -0
- data/lib/parser/grammar/statement/loop/do_while.treetop +32 -0
- data/lib/parser/grammar/statement/loop/for.treetop +127 -0
- data/lib/parser/grammar/statement/loop/for_in.treetop +35 -0
- data/lib/parser/grammar/statement/loop/loop.treetop +22 -0
- data/lib/parser/grammar/statement/loop/while.treetop +34 -0
- data/lib/parser/grammar/statement/statement.treetop +97 -0
- data/lib/parser/grammar/type/type.treetop +18 -0
- data/lib/parser/grammar/type/type_annotation.treetop +29 -0
- data/lib/parser/grammar/type/type_array.treetop +43 -0
- data/lib/parser/grammar/type/type_dictionary.treetop +59 -0
- data/lib/parser/grammar/type/type_identifier.treetop +39 -0
- data/lib/parser/grammar/whitespace.treetop +40 -0
- data/lib/parser/grammar/wildcard.treetop +25 -0
- data/lib/parser/parse_result.rb +17 -0
- data/lib/parser/parser.rb +34 -0
- data/lib/parser/tools/converter/binary_string_to_int_converter.rb +20 -0
- data/lib/parser/tools/converter/converter.rb +12 -0
- data/lib/parser/tools/converter/decimal_float_string_to_float_converter.rb +22 -0
- data/lib/parser/tools/converter/decimal_string_to_int_converter.rb +20 -0
- data/lib/parser/tools/converter/hexadecimal_float_string_to_float_converter.rb +42 -0
- data/lib/parser/tools/converter/hexadecimal_string_to_int_converter.rb +20 -0
- data/lib/parser/tools/converter/octal_string_to_int_converter.rb +20 -0
- data/lib/parser/tools/quote_stripper.rb +18 -0
- data/lib/parser/tools/shunting_yard.rb +80 -0
- data/lib/parser/tools/tokens.rb +112 -0
- data/lib/parser/version.rb +5 -0
- data/lib/parser.rb +2 -0
- data/parser.gemspec +25 -0
- metadata +163 -0
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'parser/grammar/whitespace'
|
2
|
+
require 'parser/grammar/literal/literal'
|
3
|
+
require 'parser/grammar/identifier'
|
4
|
+
require 'parser/grammar/declaration/declaration'
|
5
|
+
require 'parser/grammar/statement/statement'
|
6
|
+
require 'parser/grammar/expression/expression'
|
7
|
+
require 'parser/grammar/generics/generics'
|
8
|
+
require 'parser/grammar/type/type'
|
9
|
+
require 'parser/grammar/code_block'
|
10
|
+
require 'parser/grammar/pattern/pattern'
|
11
|
+
require 'parser/grammar/wildcard'
|
12
|
+
require 'parser/grammar/operator'
|
13
|
+
|
14
|
+
require 'parser/tools/tokens'
|
15
|
+
|
16
|
+
module Jievro
|
17
|
+
grammar Swift
|
18
|
+
|
19
|
+
include Kauri::Whitespace
|
20
|
+
include Kauri::Literal
|
21
|
+
include Kauri::Identifier
|
22
|
+
include Kauri::Declaration
|
23
|
+
include Kauri::Statement
|
24
|
+
include Kauri::Expression
|
25
|
+
include Kauri::Generics
|
26
|
+
include Kauri::Type
|
27
|
+
include Kauri::CodeBlock
|
28
|
+
include Kauri::Pattern
|
29
|
+
include Kauri::Wildcard
|
30
|
+
include Kauri::Operator
|
31
|
+
|
32
|
+
rule root
|
33
|
+
(
|
34
|
+
declaration:declaration
|
35
|
+
/
|
36
|
+
statement:statement
|
37
|
+
/
|
38
|
+
expression:expression
|
39
|
+
/
|
40
|
+
identifier:identifier
|
41
|
+
/
|
42
|
+
whitespaces:whitespaces
|
43
|
+
) {
|
44
|
+
def tokens
|
45
|
+
unless elements.any?
|
46
|
+
tokens = []
|
47
|
+
else
|
48
|
+
tokens = elements[0].tokens
|
49
|
+
end
|
50
|
+
|
51
|
+
tokens
|
52
|
+
end
|
53
|
+
|
54
|
+
def ast
|
55
|
+
body = []
|
56
|
+
|
57
|
+
if elements.length
|
58
|
+
e = elements[0]
|
59
|
+
if e.respond_to?(:ast)
|
60
|
+
body = e.ast
|
61
|
+
end
|
62
|
+
|
63
|
+
{
|
64
|
+
block_type: 'program',
|
65
|
+
body: body
|
66
|
+
}
|
67
|
+
end
|
68
|
+
end
|
69
|
+
}
|
70
|
+
end
|
71
|
+
|
72
|
+
rule sign
|
73
|
+
'+' / '-'
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'parser/grammar/implicit_parameter_name'
|
2
|
+
|
3
|
+
module Kauri
|
4
|
+
grammar Identifier
|
5
|
+
|
6
|
+
include Kauri::ImplicitParameterName
|
7
|
+
|
8
|
+
rule identifier
|
9
|
+
implicit_parameter_name / backticked_identifier / regular_identifier
|
10
|
+
end
|
11
|
+
|
12
|
+
rule regular_identifier
|
13
|
+
'_' [A-Za-z0-9_]+ / [A-Za-z] [A-Za-z0-9_]* {
|
14
|
+
def tokens
|
15
|
+
[
|
16
|
+
{
|
17
|
+
type: 'T_IDENTIFIER',
|
18
|
+
value: text_value
|
19
|
+
}
|
20
|
+
]
|
21
|
+
end
|
22
|
+
|
23
|
+
def ast
|
24
|
+
[
|
25
|
+
{
|
26
|
+
block_type: 'identifier',
|
27
|
+
value: text_value
|
28
|
+
}
|
29
|
+
]
|
30
|
+
end
|
31
|
+
}
|
32
|
+
end
|
33
|
+
|
34
|
+
rule backticked_identifier
|
35
|
+
'`' regular_identifier:regular_identifier '`' {
|
36
|
+
def tokens
|
37
|
+
[
|
38
|
+
{
|
39
|
+
type: 'T_BACKTICKED_IDENTIFIER',
|
40
|
+
value: text_value
|
41
|
+
}
|
42
|
+
]
|
43
|
+
end
|
44
|
+
|
45
|
+
def ast
|
46
|
+
[
|
47
|
+
{
|
48
|
+
block_type: 'identifier',
|
49
|
+
value: regular_identifier.text_value
|
50
|
+
}
|
51
|
+
]
|
52
|
+
end
|
53
|
+
}
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Kauri
|
2
|
+
grammar ImplicitParameterName
|
3
|
+
|
4
|
+
rule implicit_parameter_name
|
5
|
+
'$' literal_integer_decimal:literal_integer_decimal {
|
6
|
+
def tokens
|
7
|
+
[
|
8
|
+
{
|
9
|
+
type: 'T_IMPLICIT_PARAMETER_NAME',
|
10
|
+
value: text_value
|
11
|
+
}
|
12
|
+
]
|
13
|
+
end
|
14
|
+
|
15
|
+
def ast
|
16
|
+
[
|
17
|
+
{
|
18
|
+
block_type: 'implicit-parameter-name',
|
19
|
+
value: literal_integer_decimal.text_value,
|
20
|
+
}
|
21
|
+
]
|
22
|
+
end
|
23
|
+
}
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'parser/grammar/literal/literal_nil'
|
2
|
+
require 'parser/grammar/literal/literal_boolean'
|
3
|
+
require 'parser/grammar/literal/literal_numeric'
|
4
|
+
require 'parser/grammar/literal/literal_string'
|
5
|
+
require 'parser/grammar/literal/literal_array'
|
6
|
+
require 'parser/grammar/literal/literal_dictionary'
|
7
|
+
|
8
|
+
module Kauri
|
9
|
+
grammar Literal
|
10
|
+
|
11
|
+
include Kauri::LiteralNil
|
12
|
+
include Kauri::LiteralBoolean
|
13
|
+
include Kauri::LiteralNumeric
|
14
|
+
include Kauri::LiteralString
|
15
|
+
include Kauri::LiteralArray
|
16
|
+
include Kauri::LiteralDictionary
|
17
|
+
|
18
|
+
rule literal
|
19
|
+
(literal_nil / literal_boolean / literal_numeric / literal_string / literal_array / literal_dictionary) {
|
20
|
+
def ast
|
21
|
+
|
22
|
+
if defined?(super)
|
23
|
+
return super
|
24
|
+
end
|
25
|
+
|
26
|
+
if elements.nil?
|
27
|
+
return []
|
28
|
+
end
|
29
|
+
|
30
|
+
unless elements.any?
|
31
|
+
return []
|
32
|
+
end
|
33
|
+
|
34
|
+
first_element = elements.first
|
35
|
+
|
36
|
+
if first_element.respond_to?(:ast)
|
37
|
+
return first_element.ast
|
38
|
+
end
|
39
|
+
|
40
|
+
[]
|
41
|
+
end
|
42
|
+
}
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
module Kauri
|
2
|
+
grammar LiteralArray
|
3
|
+
|
4
|
+
rule literal_array
|
5
|
+
'[' ws1:_ items:literal_array_items? ws2:_ ']' {
|
6
|
+
def tokens
|
7
|
+
tokens = []
|
8
|
+
|
9
|
+
tokens.push({
|
10
|
+
type: 'T_OPEN_SQUARE_BRACKET',
|
11
|
+
value: '['
|
12
|
+
})
|
13
|
+
|
14
|
+
unless ws1.text_value.empty?
|
15
|
+
tokens.concat(ws1.tokens)
|
16
|
+
end
|
17
|
+
|
18
|
+
unless items.text_value.empty?
|
19
|
+
tokens.concat(items.tokens)
|
20
|
+
end
|
21
|
+
|
22
|
+
unless ws2.text_value.empty?
|
23
|
+
tokens.concat(ws2.tokens)
|
24
|
+
end
|
25
|
+
|
26
|
+
tokens.push({
|
27
|
+
type: 'T_CLOSE_SQUARE_BRACKET',
|
28
|
+
value: ']'
|
29
|
+
})
|
30
|
+
|
31
|
+
tokens
|
32
|
+
end
|
33
|
+
|
34
|
+
def ast
|
35
|
+
|
36
|
+
values = []
|
37
|
+
|
38
|
+
unless items.text_value.empty?
|
39
|
+
values = items.ast
|
40
|
+
end
|
41
|
+
|
42
|
+
[
|
43
|
+
{
|
44
|
+
block_type: 'literal-array',
|
45
|
+
values: values
|
46
|
+
}
|
47
|
+
]
|
48
|
+
end
|
49
|
+
}
|
50
|
+
end
|
51
|
+
|
52
|
+
rule literal_array_items
|
53
|
+
head:(expression:expression ws1:_ ',' ws2:_)* tail:expression {
|
54
|
+
def tokens
|
55
|
+
tokens = []
|
56
|
+
|
57
|
+
unless head.text_value.empty?
|
58
|
+
head.elements.each { |e|
|
59
|
+
|
60
|
+
tokens.concat(e.expression.tokens)
|
61
|
+
|
62
|
+
unless e.ws1.text_value.empty?
|
63
|
+
tokens.concat(e.ws1.tokens)
|
64
|
+
end
|
65
|
+
|
66
|
+
tokens.push({
|
67
|
+
type: 'T_COMMA',
|
68
|
+
value: ','
|
69
|
+
})
|
70
|
+
|
71
|
+
unless e.ws2.text_value.empty?
|
72
|
+
tokens.concat(e.ws2.tokens)
|
73
|
+
end
|
74
|
+
}
|
75
|
+
end
|
76
|
+
|
77
|
+
tokens.concat(tail.tokens)
|
78
|
+
|
79
|
+
tokens
|
80
|
+
end
|
81
|
+
|
82
|
+
def ast
|
83
|
+
ast = []
|
84
|
+
|
85
|
+
unless head.text_value.empty?
|
86
|
+
head.elements.each { |e|
|
87
|
+
ast.concat(e.expression.ast)
|
88
|
+
}
|
89
|
+
end
|
90
|
+
|
91
|
+
ast.concat(tail.ast)
|
92
|
+
|
93
|
+
ast
|
94
|
+
end
|
95
|
+
}
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module Kauri
|
2
|
+
grammar LiteralBoolean
|
3
|
+
|
4
|
+
rule literal_boolean
|
5
|
+
literal_true / literal_false
|
6
|
+
end
|
7
|
+
|
8
|
+
rule literal_true
|
9
|
+
'true' {
|
10
|
+
def tokens
|
11
|
+
[
|
12
|
+
{
|
13
|
+
type: 'T_TRUE',
|
14
|
+
value: text_value
|
15
|
+
}
|
16
|
+
]
|
17
|
+
end
|
18
|
+
def ast
|
19
|
+
[
|
20
|
+
{
|
21
|
+
block_type: 'literal-boolean',
|
22
|
+
value: true
|
23
|
+
}
|
24
|
+
]
|
25
|
+
end
|
26
|
+
}
|
27
|
+
end
|
28
|
+
|
29
|
+
rule literal_false
|
30
|
+
'false' {
|
31
|
+
def tokens
|
32
|
+
[
|
33
|
+
{
|
34
|
+
type: 'T_FALSE',
|
35
|
+
value: text_value
|
36
|
+
}
|
37
|
+
]
|
38
|
+
end
|
39
|
+
def ast
|
40
|
+
[
|
41
|
+
{
|
42
|
+
block_type: 'literal-boolean',
|
43
|
+
value: false
|
44
|
+
}
|
45
|
+
]
|
46
|
+
end
|
47
|
+
}
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'parser/tools/converter/converter'
|
2
|
+
|
3
|
+
module Kauri
|
4
|
+
grammar LiteralDecimalFloatingPoint
|
5
|
+
|
6
|
+
rule literal_decimal_floating_point
|
7
|
+
(
|
8
|
+
(literal_integer_decimal decimal_fraction decimal_exponent)
|
9
|
+
/
|
10
|
+
(literal_integer_decimal decimal_fraction)
|
11
|
+
/
|
12
|
+
(literal_integer_decimal decimal_exponent)
|
13
|
+
) {
|
14
|
+
def tokens
|
15
|
+
[
|
16
|
+
{
|
17
|
+
type: 'T_LITERAL_FLOATING_POINT_DECIMAL',
|
18
|
+
value: text_value
|
19
|
+
}
|
20
|
+
]
|
21
|
+
end
|
22
|
+
|
23
|
+
def ast
|
24
|
+
|
25
|
+
converter = Kauri::Tools::Converter::DecimalFloatStringToFloatConverter.new
|
26
|
+
|
27
|
+
[
|
28
|
+
{
|
29
|
+
block_type: 'literal-double',
|
30
|
+
value: converter.convert(text_value)
|
31
|
+
}
|
32
|
+
]
|
33
|
+
end
|
34
|
+
}
|
35
|
+
end
|
36
|
+
|
37
|
+
rule decimal_fraction
|
38
|
+
'.' literal_integer_decimal
|
39
|
+
end
|
40
|
+
|
41
|
+
rule decimal_exponent
|
42
|
+
floating_point_e sign? literal_integer_decimal
|
43
|
+
end
|
44
|
+
|
45
|
+
rule floating_point_e
|
46
|
+
'e' / 'E'
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,157 @@
|
|
1
|
+
module Kauri
|
2
|
+
grammar LiteralDictionary
|
3
|
+
|
4
|
+
rule literal_dictionary
|
5
|
+
'[' ws1:_ content:literal_dictionary_content ws2:_ ']' {
|
6
|
+
def tokens
|
7
|
+
tokens = []
|
8
|
+
|
9
|
+
tokens.push({
|
10
|
+
type: 'T_OPEN_SQUARE_BRACKET',
|
11
|
+
value: '['
|
12
|
+
})
|
13
|
+
|
14
|
+
unless ws1.text_value.empty?
|
15
|
+
tokens.concat(ws1.tokens)
|
16
|
+
end
|
17
|
+
|
18
|
+
tokens.concat(content.tokens)
|
19
|
+
|
20
|
+
unless ws2.text_value.empty?
|
21
|
+
tokens.concat(ws2.tokens)
|
22
|
+
end
|
23
|
+
|
24
|
+
tokens.push({
|
25
|
+
type: 'T_CLOSE_SQUARE_BRACKET',
|
26
|
+
value: ']'
|
27
|
+
})
|
28
|
+
|
29
|
+
tokens
|
30
|
+
end
|
31
|
+
|
32
|
+
def ast
|
33
|
+
content.ast
|
34
|
+
end
|
35
|
+
}
|
36
|
+
end
|
37
|
+
|
38
|
+
rule literal_dictionary_content
|
39
|
+
(items:literal_dictionary_items / ':') {
|
40
|
+
def tokens
|
41
|
+
|
42
|
+
if defined? items
|
43
|
+
tokens = items.tokens
|
44
|
+
else
|
45
|
+
tokens = [{
|
46
|
+
type: 'T_COLON',
|
47
|
+
value: ':'
|
48
|
+
}]
|
49
|
+
end
|
50
|
+
|
51
|
+
tokens
|
52
|
+
end
|
53
|
+
|
54
|
+
def ast
|
55
|
+
|
56
|
+
if defined? items
|
57
|
+
ast = items.ast
|
58
|
+
else
|
59
|
+
ast = [{
|
60
|
+
block_type: 'literal-dictionary',
|
61
|
+
pairs: []
|
62
|
+
}]
|
63
|
+
end
|
64
|
+
|
65
|
+
ast
|
66
|
+
end
|
67
|
+
}
|
68
|
+
end
|
69
|
+
|
70
|
+
rule literal_dictionary_item
|
71
|
+
key:expression ws1:_ ':' ws2:_ value:expression {
|
72
|
+
def tokens
|
73
|
+
tokens = []
|
74
|
+
|
75
|
+
tokens.concat(key.tokens)
|
76
|
+
|
77
|
+
unless ws1.text_value.empty?
|
78
|
+
tokens.concat(ws1.tokens)
|
79
|
+
end
|
80
|
+
|
81
|
+
tokens.push({
|
82
|
+
type: 'T_COLON',
|
83
|
+
value: ':'
|
84
|
+
})
|
85
|
+
|
86
|
+
unless ws2.text_value.empty?
|
87
|
+
tokens.concat(ws2.tokens)
|
88
|
+
end
|
89
|
+
|
90
|
+
tokens.concat(value.tokens)
|
91
|
+
|
92
|
+
tokens
|
93
|
+
end
|
94
|
+
|
95
|
+
def ast
|
96
|
+
[
|
97
|
+
{
|
98
|
+
key: key.ast.first,
|
99
|
+
value: value.ast.first
|
100
|
+
}
|
101
|
+
]
|
102
|
+
end
|
103
|
+
}
|
104
|
+
end
|
105
|
+
|
106
|
+
rule literal_dictionary_items
|
107
|
+
head:(item:literal_dictionary_item ws1:_ ',' ws2:_)* tail:literal_dictionary_item {
|
108
|
+
def tokens
|
109
|
+
tokens = []
|
110
|
+
|
111
|
+
unless head.text_value.empty?
|
112
|
+
head.elements.each { |e|
|
113
|
+
|
114
|
+
tokens.concat(e.item.tokens)
|
115
|
+
|
116
|
+
unless e.ws1.text_value.empty?
|
117
|
+
tokens.concat(e.ws1.tokens)
|
118
|
+
end
|
119
|
+
|
120
|
+
tokens.push({
|
121
|
+
type: 'T_COMMA',
|
122
|
+
value: ','
|
123
|
+
})
|
124
|
+
|
125
|
+
unless e.ws2.text_value.empty?
|
126
|
+
tokens.concat(e.ws2.tokens)
|
127
|
+
end
|
128
|
+
}
|
129
|
+
end
|
130
|
+
|
131
|
+
tokens.concat(tail.tokens)
|
132
|
+
|
133
|
+
tokens
|
134
|
+
end
|
135
|
+
|
136
|
+
def ast
|
137
|
+
pairs = []
|
138
|
+
|
139
|
+
unless head.text_value.empty?
|
140
|
+
head.elements.each { |e|
|
141
|
+
pairs.concat(e.item.ast)
|
142
|
+
}
|
143
|
+
end
|
144
|
+
|
145
|
+
pairs.concat(tail.ast)
|
146
|
+
|
147
|
+
[
|
148
|
+
{
|
149
|
+
block_type: 'literal-dictionary',
|
150
|
+
pairs: pairs
|
151
|
+
}
|
152
|
+
]
|
153
|
+
end
|
154
|
+
}
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'parser/tools/converter/converter'
|
2
|
+
|
3
|
+
module Kauri
|
4
|
+
grammar LiteralHexadecimalFloatingPoint
|
5
|
+
|
6
|
+
rule literal_hexadecimal_floating_point
|
7
|
+
(
|
8
|
+
(literal_integer_hexadecimal hexadecimal_fraction hexadecimal_exponent)
|
9
|
+
/
|
10
|
+
(literal_integer_hexadecimal hexadecimal_exponent)
|
11
|
+
) {
|
12
|
+
def tokens
|
13
|
+
[
|
14
|
+
{
|
15
|
+
type: 'T_LITERAL_FLOATING_POINT_HEXADECIMAL',
|
16
|
+
value: text_value
|
17
|
+
}
|
18
|
+
]
|
19
|
+
end
|
20
|
+
|
21
|
+
def ast
|
22
|
+
|
23
|
+
converter = Kauri::Tools::Converter::HexadecimalFloatStringToFloatConverter.new
|
24
|
+
|
25
|
+
[
|
26
|
+
{
|
27
|
+
block_type: 'literal-double',
|
28
|
+
value: converter.convert(text_value)
|
29
|
+
}
|
30
|
+
]
|
31
|
+
end
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
35
|
+
rule hexadecimal_fraction
|
36
|
+
'.' hexadecimal_digit hexadecimal_literal_characters?
|
37
|
+
end
|
38
|
+
|
39
|
+
rule hexadecimal_exponent
|
40
|
+
floating_point_p sign? literal_integer_decimal
|
41
|
+
end
|
42
|
+
|
43
|
+
rule floating_point_p
|
44
|
+
'p' / 'P'
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'parser/tools/converter/converter'
|
2
|
+
|
3
|
+
module Kauri
|
4
|
+
grammar LiteralIntegerBinary
|
5
|
+
|
6
|
+
rule literal_integer_binary
|
7
|
+
'0b' binary_digit binary_literal_characters? {
|
8
|
+
def tokens
|
9
|
+
[
|
10
|
+
{
|
11
|
+
type: 'T_LITERAL_INTEGER_BINARY',
|
12
|
+
value: text_value
|
13
|
+
}
|
14
|
+
]
|
15
|
+
end
|
16
|
+
|
17
|
+
def ast
|
18
|
+
|
19
|
+
converter = Kauri::Tools::Converter::BinaryStringToIntConverter.new
|
20
|
+
|
21
|
+
[
|
22
|
+
{
|
23
|
+
block_type: 'literal-integer',
|
24
|
+
value: converter.convert(text_value)
|
25
|
+
}
|
26
|
+
]
|
27
|
+
end
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
rule binary_literal_characters
|
32
|
+
binary_literal_character+
|
33
|
+
end
|
34
|
+
|
35
|
+
rule binary_literal_character
|
36
|
+
binary_digit / '_'
|
37
|
+
end
|
38
|
+
|
39
|
+
rule binary_digits
|
40
|
+
binary_digit+
|
41
|
+
end
|
42
|
+
|
43
|
+
rule binary_digit
|
44
|
+
[0-1]+
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'parser/tools/converter/converter'
|
2
|
+
|
3
|
+
module Kauri
|
4
|
+
grammar LiteralIntegerDecimal
|
5
|
+
|
6
|
+
rule literal_integer_decimal
|
7
|
+
decimal_digit decimal_literal_characters? {
|
8
|
+
def tokens
|
9
|
+
[
|
10
|
+
{
|
11
|
+
type: 'T_LITERAL_INTEGER_DECIMAL',
|
12
|
+
value: text_value
|
13
|
+
}
|
14
|
+
]
|
15
|
+
end
|
16
|
+
|
17
|
+
def ast
|
18
|
+
|
19
|
+
converter = Kauri::Tools::Converter::DecimalStringToIntConverter.new
|
20
|
+
|
21
|
+
[
|
22
|
+
{
|
23
|
+
block_type: 'literal-integer',
|
24
|
+
value: converter.convert(text_value)
|
25
|
+
}
|
26
|
+
]
|
27
|
+
end
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
rule decimal_literal_characters
|
32
|
+
decimal_literal_character+
|
33
|
+
end
|
34
|
+
|
35
|
+
rule decimal_literal_character
|
36
|
+
decimal_digit / '_'
|
37
|
+
end
|
38
|
+
|
39
|
+
rule decimal_digits
|
40
|
+
decimal_digit+
|
41
|
+
end
|
42
|
+
|
43
|
+
rule decimal_digit
|
44
|
+
[0-9]+
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|