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