template-ruby-parser 0.1.7 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/code-ruby-parser.gemspec +3 -1
- data/lib/code-ruby-parser.rb +1 -7
- data/lib/template-ruby-parser.rb +1 -7
- data/template-ruby-parser.gemspec +3 -1
- metadata +18 -137
- data/.overcommit.yml +0 -4
- data/CHANGELOG.md +0 -31
- data/Gemfile +0 -5
- data/Gemfile.lock +0 -32
- data/bin/code-parser +0 -27
- data/bin/deploy +0 -16
- data/bin/format +0 -3
- data/bin/parse-docs +0 -6
- data/bin/template-parser +0 -27
- data/docs/class.code +0 -9
- data/docs/meetup.code +0 -14
- data/docs/precedence.code +0 -1
- data/docs/precedence.template +0 -35
- data/docs/rain.code +0 -23
- data/docs/slack.code +0 -17
- data/docs/stripe.code +0 -7
- data/docs/twitter.code +0 -7
- data/lib/code/parser/addition.rb +0 -13
- data/lib/code/parser/and_operator.rb +0 -13
- data/lib/code/parser/bitwise_and.rb +0 -13
- data/lib/code/parser/bitwise_or.rb +0 -13
- data/lib/code/parser/boolean.rb +0 -13
- data/lib/code/parser/call.rb +0 -183
- data/lib/code/parser/chained_call.rb +0 -41
- data/lib/code/parser/class.rb +0 -55
- data/lib/code/parser/code.rb +0 -20
- data/lib/code/parser/comments.rb +0 -46
- data/lib/code/parser/dictionnary.rb +0 -52
- data/lib/code/parser/equal.rb +0 -68
- data/lib/code/parser/equality.rb +0 -20
- data/lib/code/parser/error/syntax_error.rb +0 -36
- data/lib/code/parser/error.rb +0 -6
- data/lib/code/parser/function.rb +0 -118
- data/lib/code/parser/greater_than.rb +0 -13
- data/lib/code/parser/group.rb +0 -15
- data/lib/code/parser/if.rb +0 -81
- data/lib/code/parser/if_modifier.rb +0 -39
- data/lib/code/parser/list.rb +0 -20
- data/lib/code/parser/multiplication.rb +0 -13
- data/lib/code/parser/name.rb +0 -14
- data/lib/code/parser/negation.rb +0 -18
- data/lib/code/parser/not_keyword.rb +0 -26
- data/lib/code/parser/nothing.rb +0 -13
- data/lib/code/parser/number.rb +0 -39
- data/lib/code/parser/operation.rb +0 -65
- data/lib/code/parser/or_keyword.rb +0 -13
- data/lib/code/parser/or_operator.rb +0 -13
- data/lib/code/parser/power.rb +0 -33
- data/lib/code/parser/range.rb +0 -13
- data/lib/code/parser/rescue.rb +0 -38
- data/lib/code/parser/shift.rb +0 -13
- data/lib/code/parser/splat.rb +0 -35
- data/lib/code/parser/statement.rb +0 -9
- data/lib/code/parser/string.rb +0 -62
- data/lib/code/parser/ternary.rb +0 -73
- data/lib/code/parser/unary_minus.rb +0 -23
- data/lib/code/parser/while.rb +0 -36
- data/lib/code/parser.rb +0 -237
- data/lib/code.rb +0 -2
- data/lib/template/parser.rb +0 -32
- data/lib/template.rb +0 -2
- data/spec/code/parser/addition_spec.rb +0 -26
- data/spec/code/parser/and_operator_spec.rb +0 -26
- data/spec/code/parser/bitwise_and_spec.rb +0 -26
- data/spec/code/parser/bitwise_or_spec.rb +0 -26
- data/spec/code/parser/boolean_spec.rb +0 -13
- data/spec/code/parser/call_spec.rb +0 -52
- data/spec/code/parser/chained_call_spec.rb +0 -33
- data/spec/code/parser/class_spec.rb +0 -32
- data/spec/code/parser/code_spec.rb +0 -13
- data/spec/code/parser/dictionnary_spec.rb +0 -40
- data/spec/code/parser/equal_spec.rb +0 -42
- data/spec/code/parser/equality_spec.rb +0 -26
- data/spec/code/parser/function_spec.rb +0 -43
- data/spec/code/parser/greater_than_spec.rb +0 -26
- data/spec/code/parser/group_spec.rb +0 -13
- data/spec/code/parser/if_modifier_spec.rb +0 -26
- data/spec/code/parser/if_spec.rb +0 -39
- data/spec/code/parser/list_spec.rb +0 -27
- data/spec/code/parser/multiplication_spec.rb +0 -26
- data/spec/code/parser/negation_spec.rb +0 -13
- data/spec/code/parser/not_keyword_spec.rb +0 -21
- data/spec/code/parser/nothing_spec.rb +0 -20
- data/spec/code/parser/number_spec.rb +0 -24
- data/spec/code/parser/or_keyword_spec.rb +0 -26
- data/spec/code/parser/or_operator_spec.rb +0 -26
- data/spec/code/parser/power_spec.rb +0 -21
- data/spec/code/parser/range_spec.rb +0 -21
- data/spec/code/parser/rescue_spec.rb +0 -26
- data/spec/code/parser/shift_spec.rb +0 -26
- data/spec/code/parser/string_spec.rb +0 -28
- data/spec/code/parser/ternary_spec.rb +0 -26
- data/spec/code/parser/unary_minus_spec.rb +0 -21
- data/spec/code/parser/while_spec.rb +0 -32
- data/spec/code/parser_spec.rb +0 -13
- data/spec/spec_helper.rb +0 -6
- data/spec/template/parser_spec.rb +0 -13
data/lib/code/parser/if.rb
DELETED
@@ -1,81 +0,0 @@
|
|
1
|
-
class Code
|
2
|
-
class Parser
|
3
|
-
class If < ::Code::Parser
|
4
|
-
def parse
|
5
|
-
if first_operator = match([IF_KEYWORD, UNLESS_KEYWORD])
|
6
|
-
previous_cursor = cursor
|
7
|
-
first_comments = parse_comments
|
8
|
-
first_condition = parse_subclass(::Code::Parser::If)
|
9
|
-
|
10
|
-
if first_condition
|
11
|
-
first_body = parse_code
|
12
|
-
|
13
|
-
others = []
|
14
|
-
|
15
|
-
while (other = parse_else) || (other = parse_elsif)
|
16
|
-
others << other
|
17
|
-
end
|
18
|
-
|
19
|
-
others = nil if others.empty?
|
20
|
-
|
21
|
-
match(END_KEYWORD)
|
22
|
-
|
23
|
-
{
|
24
|
-
if: {
|
25
|
-
first_operator: first_operator,
|
26
|
-
first_comments: first_comments,
|
27
|
-
first_condition: first_condition,
|
28
|
-
first_body: first_body,
|
29
|
-
others: others
|
30
|
-
}.compact
|
31
|
-
}
|
32
|
-
else
|
33
|
-
@cursor = previous_cursor
|
34
|
-
buffer!
|
35
|
-
parse_subclass(::Code::Parser::IfModifier)
|
36
|
-
end
|
37
|
-
else
|
38
|
-
parse_subclass(::Code::Parser::IfModifier)
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
private
|
43
|
-
|
44
|
-
def parse_else
|
45
|
-
return unless match(ELSE_KEYWORD)
|
46
|
-
comments_before = parse_comments
|
47
|
-
|
48
|
-
operator = match([IF_KEYWORD, UNLESS_KEYWORD]) || ELSE_KEYWORD
|
49
|
-
|
50
|
-
comments_after = parse_comments
|
51
|
-
|
52
|
-
condition = parse_subclass(::Code::Parser::If)
|
53
|
-
|
54
|
-
body = parse_code
|
55
|
-
|
56
|
-
{
|
57
|
-
operator: operator,
|
58
|
-
comments_before: comments_before,
|
59
|
-
comments_after: comments_after,
|
60
|
-
condition: condition,
|
61
|
-
body: body
|
62
|
-
}.compact
|
63
|
-
end
|
64
|
-
|
65
|
-
def parse_elsif
|
66
|
-
return unless operator = match([ELSIF_KEYWORD, ELSUNLESS_KEYWORD])
|
67
|
-
|
68
|
-
comments = parse_comments
|
69
|
-
condition = parse_subclass(::Code::Parser::If)
|
70
|
-
body = parse_code
|
71
|
-
|
72
|
-
{
|
73
|
-
operator: operator,
|
74
|
-
comments: comments,
|
75
|
-
condition: condition,
|
76
|
-
body: body
|
77
|
-
}.compact
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
@@ -1,39 +0,0 @@
|
|
1
|
-
class Code
|
2
|
-
class Parser
|
3
|
-
class IfModifier < ::Code::Parser
|
4
|
-
def parse
|
5
|
-
left = parse_subclass(::Code::Parser::OrKeyword)
|
6
|
-
|
7
|
-
previous_cursor = cursor
|
8
|
-
|
9
|
-
comments_before = parse_comments(whitespace: [SPACE])
|
10
|
-
|
11
|
-
if left && (operator = match(IF_KEYWORD)) ||
|
12
|
-
(operator = match(UNLESS_KEYWORD))
|
13
|
-
comments_after = parse_comments
|
14
|
-
right = parse_subclass(::Code::Parser::IfModifier)
|
15
|
-
|
16
|
-
if right
|
17
|
-
{
|
18
|
-
if_modifier: {
|
19
|
-
left: left,
|
20
|
-
right: right,
|
21
|
-
operator: operator,
|
22
|
-
comments_before: comments_before,
|
23
|
-
comments_after: comments_after
|
24
|
-
}.compact
|
25
|
-
}
|
26
|
-
else
|
27
|
-
@cursor = previous_cursor
|
28
|
-
buffer!
|
29
|
-
left
|
30
|
-
end
|
31
|
-
else
|
32
|
-
@cursor = previous_cursor
|
33
|
-
buffer!
|
34
|
-
left
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
data/lib/code/parser/list.rb
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
class Code
|
2
|
-
class Parser
|
3
|
-
class List < ::Code::Parser
|
4
|
-
def parse
|
5
|
-
if match(OPENING_SQUARE_BRACKET)
|
6
|
-
list = []
|
7
|
-
|
8
|
-
list << parse_code
|
9
|
-
list << parse_code while match(COMMA) && !end_of_input?
|
10
|
-
|
11
|
-
match(CLOSING_SQUARE_BRACKET)
|
12
|
-
|
13
|
-
{ list: list.reject(&:empty?) }
|
14
|
-
else
|
15
|
-
parse_subclass(::Code::Parser::String)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
data/lib/code/parser/name.rb
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
class Code
|
2
|
-
class Parser
|
3
|
-
class Name < ::Code::Parser
|
4
|
-
def parse
|
5
|
-
return if end_of_input?
|
6
|
-
return if next?(SPECIAL)
|
7
|
-
return if next?(KEYWORDS)
|
8
|
-
consume while !next?(SPECIAL) && !end_of_input?
|
9
|
-
match(QUESTION_MARK) || match(EXCLAMATION_POINT)
|
10
|
-
buffer!
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
data/lib/code/parser/negation.rb
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
class Code
|
2
|
-
class Parser
|
3
|
-
class Negation < ::Code::Parser
|
4
|
-
def parse
|
5
|
-
if operator = match([EXCLAMATION_POINT, TILDE, PLUS])
|
6
|
-
{
|
7
|
-
negation: {
|
8
|
-
operator: operator,
|
9
|
-
statement: parse_subclass(::Code::Parser::Negation)
|
10
|
-
}
|
11
|
-
}
|
12
|
-
else
|
13
|
-
parse_subclass(::Code::Parser::Splat)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
@@ -1,26 +0,0 @@
|
|
1
|
-
class Code
|
2
|
-
class Parser
|
3
|
-
class NotKeyword < ::Code::Parser
|
4
|
-
def parse
|
5
|
-
previous_cursor = cursor
|
6
|
-
|
7
|
-
if match(NOT_KEYWORD)
|
8
|
-
buffer!
|
9
|
-
consume while next?(WHITESPACE)
|
10
|
-
comments = parse_comments
|
11
|
-
right = parse_subclass(::Code::Parser::NotKeyword)
|
12
|
-
|
13
|
-
if right && (comments || buffer?)
|
14
|
-
{ not: { right: right, comments: comments }.compact }
|
15
|
-
else
|
16
|
-
@cursor = previous_cursor
|
17
|
-
buffer!
|
18
|
-
parse_subclass(::Code::Parser::Equal)
|
19
|
-
end
|
20
|
-
else
|
21
|
-
parse_subclass(::Code::Parser::Equal)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
data/lib/code/parser/nothing.rb
DELETED
data/lib/code/parser/number.rb
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
class Code
|
2
|
-
class Parser
|
3
|
-
class Number < ::Code::Parser
|
4
|
-
def parse
|
5
|
-
if match(DIGITS)
|
6
|
-
if match(X)
|
7
|
-
parse_base(16)
|
8
|
-
elsif match(O)
|
9
|
-
parse_base(8)
|
10
|
-
elsif match(B)
|
11
|
-
parse_base(2)
|
12
|
-
else
|
13
|
-
consume while (next?(DIGITS) || next?(UNDERSCORE)) && !end_of_input?
|
14
|
-
|
15
|
-
if next?(DOT) && next_next?(DIGITS)
|
16
|
-
consume
|
17
|
-
while (next?(DIGITS) || next?(UNDERSCORE)) && !end_of_input?
|
18
|
-
consume
|
19
|
-
end
|
20
|
-
|
21
|
-
{ decimal: buffer.gsub(UNDERSCORE, EMPTY_STRING) }
|
22
|
-
else
|
23
|
-
{ integer: buffer.gsub(UNDERSCORE, EMPTY_STRING).to_i }
|
24
|
-
end
|
25
|
-
end
|
26
|
-
else
|
27
|
-
parse_subclass(::Code::Parser::Boolean)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def parse_base(base)
|
32
|
-
buffer!
|
33
|
-
consume while (next?(DIGITS) || next?(UNDERSCORE)) && !end_of_input?
|
34
|
-
|
35
|
-
{ integer: buffer.gsub(UNDERSCORE, EMPTY_STRING).to_i(base) }
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
@@ -1,65 +0,0 @@
|
|
1
|
-
class Code
|
2
|
-
class Parser
|
3
|
-
class Operation < ::Code::Parser
|
4
|
-
def initialize(input, operators:, subclass:, **kargs)
|
5
|
-
super(input, **kargs)
|
6
|
-
|
7
|
-
@operators = operators
|
8
|
-
@subclass = subclass
|
9
|
-
end
|
10
|
-
|
11
|
-
def parse
|
12
|
-
previous_cursor = cursor
|
13
|
-
left = parse_subclass(subclass)
|
14
|
-
if left
|
15
|
-
previous_cursor = cursor
|
16
|
-
comments = parse_comments
|
17
|
-
right = []
|
18
|
-
|
19
|
-
while operator = match(operators)
|
20
|
-
comments_before = parse_comments
|
21
|
-
statement = parse_subclass(subclass)
|
22
|
-
comments_after = parse_comments
|
23
|
-
|
24
|
-
if statement
|
25
|
-
right << {
|
26
|
-
statement: statement,
|
27
|
-
operator: operator,
|
28
|
-
comments_before: comments_before,
|
29
|
-
comments_after: comments_after
|
30
|
-
}.compact
|
31
|
-
else
|
32
|
-
@cursor = previous_cursor
|
33
|
-
buffer!
|
34
|
-
break
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
if right.empty?
|
39
|
-
@cursor = previous_cursor
|
40
|
-
buffer!
|
41
|
-
left
|
42
|
-
else
|
43
|
-
right[-1].delete(:comments_after)
|
44
|
-
|
45
|
-
{
|
46
|
-
operation: {
|
47
|
-
left: left,
|
48
|
-
right: right,
|
49
|
-
comments: comments
|
50
|
-
}.compact
|
51
|
-
}
|
52
|
-
end
|
53
|
-
else
|
54
|
-
@cursor = previous_cursor
|
55
|
-
buffer!
|
56
|
-
return
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
private
|
61
|
-
|
62
|
-
attr_reader :operators, :subclass
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
data/lib/code/parser/power.rb
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
class Code
|
2
|
-
class Parser
|
3
|
-
class Power < ::Code::Parser
|
4
|
-
def parse
|
5
|
-
left = parse_subclass(::Code::Parser::Negation)
|
6
|
-
previous_cursor = cursor
|
7
|
-
comments_before = parse_comments
|
8
|
-
if match(ASTERISK + ASTERISK)
|
9
|
-
comments_after = parse_comments
|
10
|
-
right = parse_subclass(::Code::Parser::Power)
|
11
|
-
if right
|
12
|
-
{
|
13
|
-
power: {
|
14
|
-
left: left,
|
15
|
-
right: right,
|
16
|
-
comments_before: comments_before,
|
17
|
-
comments_after: comments_after
|
18
|
-
}.compact
|
19
|
-
}
|
20
|
-
else
|
21
|
-
@cursor = previous_cursor
|
22
|
-
buffer!
|
23
|
-
left
|
24
|
-
end
|
25
|
-
else
|
26
|
-
@cursor = previous_cursor
|
27
|
-
buffer!
|
28
|
-
left
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
data/lib/code/parser/range.rb
DELETED
data/lib/code/parser/rescue.rb
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
class Code
|
2
|
-
class Parser
|
3
|
-
class Rescue < ::Code::Parser
|
4
|
-
def parse
|
5
|
-
left = parse_subclass(::Code::Parser::Ternary)
|
6
|
-
|
7
|
-
previous_cursor = cursor
|
8
|
-
|
9
|
-
comments_before = parse_comments
|
10
|
-
|
11
|
-
if match(RESCUE_KEYWORD)
|
12
|
-
previous_cursor = cursor
|
13
|
-
comments_after = parse_comments
|
14
|
-
right = parse_subclass(::Code::Parser::Rescue)
|
15
|
-
|
16
|
-
if right
|
17
|
-
{
|
18
|
-
rescue: {
|
19
|
-
left: left,
|
20
|
-
right: right,
|
21
|
-
comments_before: comments_before,
|
22
|
-
comments_after: comments_after
|
23
|
-
}.compact
|
24
|
-
}
|
25
|
-
else
|
26
|
-
@cursor = previous_cursor
|
27
|
-
buffer!
|
28
|
-
{ rescue: { left: left, comments_before: comments_before }.compact }
|
29
|
-
end
|
30
|
-
else
|
31
|
-
@cursor = previous_cursor
|
32
|
-
buffer!
|
33
|
-
left
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
data/lib/code/parser/shift.rb
DELETED
data/lib/code/parser/splat.rb
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
class Code
|
2
|
-
class Parser
|
3
|
-
class Splat < ::Code::Parser
|
4
|
-
def parse
|
5
|
-
previous_cursor = cursor
|
6
|
-
|
7
|
-
if operator = match([AMPERSAND, ASTERISK + ASTERISK, ASTERISK])
|
8
|
-
comments = parse_comments
|
9
|
-
right = parse_next
|
10
|
-
if right
|
11
|
-
{
|
12
|
-
splat: {
|
13
|
-
right: right,
|
14
|
-
operator: operator,
|
15
|
-
comments: comments
|
16
|
-
}.compact
|
17
|
-
}
|
18
|
-
else
|
19
|
-
@cursor = previous_cursor
|
20
|
-
buffer!
|
21
|
-
parse_next
|
22
|
-
end
|
23
|
-
else
|
24
|
-
parse_next
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
private
|
29
|
-
|
30
|
-
def parse_next
|
31
|
-
parse_subclass(::Code::Parser::Function)
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
data/lib/code/parser/string.rb
DELETED
@@ -1,62 +0,0 @@
|
|
1
|
-
class Code
|
2
|
-
class Parser
|
3
|
-
class String < ::Code::Parser
|
4
|
-
def parse
|
5
|
-
if match(SINGLE_QUOTE)
|
6
|
-
parse_string(SINGLE_QUOTE)
|
7
|
-
elsif match(DOUBLE_QUOTE)
|
8
|
-
parse_string(DOUBLE_QUOTE)
|
9
|
-
elsif match(COLON) && !next?(SPECIAL)
|
10
|
-
buffer!
|
11
|
-
consume while !next?(SPECIAL) && !end_of_input?
|
12
|
-
match(QUESTION_MARK) || match(EXCLAMATION_POINT)
|
13
|
-
{ string: buffer }
|
14
|
-
else
|
15
|
-
parse_subclass(::Code::Parser::Number)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
private
|
20
|
-
|
21
|
-
def parse_string(quote)
|
22
|
-
buffer!
|
23
|
-
output = []
|
24
|
-
|
25
|
-
while !next?(quote) && !end_of_input?
|
26
|
-
c = consume
|
27
|
-
|
28
|
-
if c == BACKSLASH
|
29
|
-
match(OPENING_CURLY_BRACKET) || match(quote)
|
30
|
-
elsif c == OPENING_CURLY_BRACKET
|
31
|
-
output << { text: escape_string(buffer![..-2]) } if buffer?
|
32
|
-
|
33
|
-
output << { code: parse_code }
|
34
|
-
|
35
|
-
match(CLOSING_CURLY_BRACKET)
|
36
|
-
buffer!
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
output << { text: escape_string(buffer) } if buffer?
|
41
|
-
|
42
|
-
match(quote)
|
43
|
-
|
44
|
-
if output.empty?
|
45
|
-
{ string: EMPTY_STRING }
|
46
|
-
elsif output.one? && output.first.key?(:text)
|
47
|
-
{ string: output.first[:text] }
|
48
|
-
else
|
49
|
-
{ string: output }
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
def escape_string(string)
|
54
|
-
string
|
55
|
-
.gsub(SPECIAL_NEWLINE, SPECIAL_NEWLINE_ESCAPED)
|
56
|
-
.gsub(BACKSLASH + OPENING_CURLY_BRACKET, OPENING_CURLY_BRACKET)
|
57
|
-
.gsub(BACKSLASH + SINGLE_QUOTE, SINGLE_QUOTE)
|
58
|
-
.gsub(BACKSLASH + DOUBLE_QUOTE, DOUBLE_QUOTE)
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
data/lib/code/parser/ternary.rb
DELETED
@@ -1,73 +0,0 @@
|
|
1
|
-
class Code
|
2
|
-
class Parser
|
3
|
-
class Ternary < ::Code::Parser
|
4
|
-
def parse
|
5
|
-
left = parse_subclass(::Code::Parser::Range)
|
6
|
-
|
7
|
-
previous_cursor = cursor
|
8
|
-
return left if !match(WHITESPACE) && !(first_comments = parse_comments)
|
9
|
-
first_comments ||= parse_comments
|
10
|
-
|
11
|
-
if match(QUESTION_MARK)
|
12
|
-
second_comments = parse_comments
|
13
|
-
|
14
|
-
middle = parse_subclass(::Code::Parser::Ternary)
|
15
|
-
|
16
|
-
if middle
|
17
|
-
previous_cursor = cursor
|
18
|
-
third_comments = parse_comments
|
19
|
-
|
20
|
-
if match(COLON)
|
21
|
-
fourth_comments = parse_comments
|
22
|
-
right = parse_subclass(::Code::Parser::Ternary)
|
23
|
-
|
24
|
-
if right
|
25
|
-
{
|
26
|
-
ternary: {
|
27
|
-
left: left,
|
28
|
-
middle: middle,
|
29
|
-
right: right,
|
30
|
-
first_comments: first_comments,
|
31
|
-
second_comments: second_comments,
|
32
|
-
third_comments: third_comments,
|
33
|
-
fourth_comments: fourth_comments
|
34
|
-
}.compact
|
35
|
-
}
|
36
|
-
else
|
37
|
-
@cursor = previous_cursor
|
38
|
-
buffer!
|
39
|
-
{
|
40
|
-
ternary: {
|
41
|
-
left: left,
|
42
|
-
middle: middle,
|
43
|
-
first_comments: first_comments,
|
44
|
-
second_comments: second_comments
|
45
|
-
}.compact
|
46
|
-
}
|
47
|
-
end
|
48
|
-
else
|
49
|
-
@cursor = previous_cursor
|
50
|
-
buffer!
|
51
|
-
{
|
52
|
-
ternary: {
|
53
|
-
left: left,
|
54
|
-
middle: middle,
|
55
|
-
first_comments: first_comments,
|
56
|
-
second_comments: second_comments
|
57
|
-
}.compact
|
58
|
-
}
|
59
|
-
end
|
60
|
-
else
|
61
|
-
@cursor = previous_cursor
|
62
|
-
buffer!
|
63
|
-
left
|
64
|
-
end
|
65
|
-
else
|
66
|
-
@cursor = previous_cursor
|
67
|
-
buffer!
|
68
|
-
left
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
@@ -1,23 +0,0 @@
|
|
1
|
-
class Code
|
2
|
-
class Parser
|
3
|
-
class UnaryMinus < ::Code::Parser
|
4
|
-
def parse
|
5
|
-
if match(MINUS)
|
6
|
-
previous_cursor = cursor
|
7
|
-
comments = parse_comments
|
8
|
-
right = parse_subclass(::Code::Parser::UnaryMinus)
|
9
|
-
|
10
|
-
if right
|
11
|
-
{ unary_minus: { right: right, comments: comments }.compact }
|
12
|
-
else
|
13
|
-
@cursor = previous_cursor
|
14
|
-
buffer!
|
15
|
-
parse_subclass(::Code::Parser::Power)
|
16
|
-
end
|
17
|
-
else
|
18
|
-
parse_subclass(::Code::Parser::Power)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|