template-ruby 0.5.6 → 0.6.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 +4 -4
- data/Gemfile +1 -4
- data/Gemfile.lock +15 -22
- data/lib/template/version.rb +1 -1
- data/lib/template-ruby.rb +2 -3
- data/lib/template.rb +18 -22
- data/spec/spec_helper.rb +0 -5
- data/spec/template_spec.rb +13 -0
- data/template-ruby.gemspec +2 -1
- metadata +34 -222
- data/.cherry.js +0 -21
- data/.editorconfig +0 -9
- data/.github/workflows/rspec.yml +0 -14
- data/.gitignore +0 -2
- data/.prettierrc +0 -3
- data/.tool-versions +0 -1
- data/CHANGELOG.md +0 -55
- data/LICENSE +0 -7
- data/README.md +0 -103
- data/TODO +0 -17
- data/bin/code +0 -76
- data/bin/format +0 -3
- data/bin/publish +0 -19
- data/bin/template +0 -85
- data/bin/test +0 -17
- data/code-ruby.gemspec +0 -17
- data/docs/class.code +0 -9
- data/docs/euler/1.template +0 -10
- data/docs/euler/2.template +0 -16
- data/docs/euler/3.template +0 -16
- data/docs/euler/4.template +0 -10
- data/docs/euler/5.template +0 -13
- data/docs/fibonnaci.template +0 -14
- data/docs/meetup.code +0 -12
- data/docs/precedence.template +0 -36
- data/docs/rain.code +0 -22
- data/docs/slack.code +0 -17
- data/docs/stripe.code +0 -7
- data/docs/twitter.code +0 -9
- data/language-ruby.gemspec +0 -17
- data/lib/code/error.rb +0 -18
- data/lib/code/node/base_10.rb +0 -29
- data/lib/code/node/base_16.rb +0 -13
- data/lib/code/node/base_2.rb +0 -13
- data/lib/code/node/base_8.rb +0 -13
- data/lib/code/node/boolean.rb +0 -22
- data/lib/code/node/call.rb +0 -47
- data/lib/code/node/call_argument.rb +0 -21
- data/lib/code/node/chained_call.rb +0 -23
- data/lib/code/node/code.rb +0 -20
- data/lib/code/node/decimal.rb +0 -26
- data/lib/code/node/dictionnary.rb +0 -33
- data/lib/code/node/equal.rb +0 -34
- data/lib/code/node/function.rb +0 -20
- data/lib/code/node/function_parameter.rb +0 -31
- data/lib/code/node/if.rb +0 -59
- data/lib/code/node/if_modifier.rb +0 -47
- data/lib/code/node/list.rb +0 -16
- data/lib/code/node/negation.rb +0 -15
- data/lib/code/node/not.rb +0 -15
- data/lib/code/node/nothing.rb +0 -12
- data/lib/code/node/number.rb +0 -25
- data/lib/code/node/operation.rb +0 -38
- data/lib/code/node/power.rb +0 -20
- data/lib/code/node/rescue.rb +0 -17
- data/lib/code/node/splat.rb +0 -15
- data/lib/code/node/statement.rb +0 -59
- data/lib/code/node/string.rb +0 -53
- data/lib/code/node/ternary.rb +0 -24
- data/lib/code/node/unary_minus.rb +0 -15
- data/lib/code/node/while.rb +0 -35
- data/lib/code/node.rb +0 -13
- data/lib/code/object/argument.rb +0 -32
- data/lib/code/object/boolean.rb +0 -27
- data/lib/code/object/decimal.rb +0 -162
- data/lib/code/object/dictionnary.rb +0 -96
- data/lib/code/object/function.rb +0 -64
- data/lib/code/object/global.rb +0 -42
- data/lib/code/object/integer.rb +0 -221
- data/lib/code/object/list.rb +0 -207
- data/lib/code/object/nothing.rb +0 -23
- data/lib/code/object/number.rb +0 -6
- data/lib/code/object/range.rb +0 -146
- data/lib/code/object/ruby_function.rb +0 -31
- data/lib/code/object/string.rb +0 -102
- data/lib/code/object.rb +0 -197
- data/lib/code/parser/addition.rb +0 -21
- data/lib/code/parser/and_operator.rb +0 -17
- data/lib/code/parser/bitwise_and.rb +0 -17
- data/lib/code/parser/bitwise_or.rb +0 -21
- data/lib/code/parser/boolean.rb +0 -17
- data/lib/code/parser/call.rb +0 -122
- data/lib/code/parser/chained_call.rb +0 -47
- data/lib/code/parser/class.rb +0 -45
- data/lib/code/parser/code.rb +0 -25
- data/lib/code/parser/dictionnary.rb +0 -67
- data/lib/code/parser/equal.rb +0 -94
- data/lib/code/parser/equality.rb +0 -35
- data/lib/code/parser/equality_lower.rb +0 -9
- data/lib/code/parser/function.rb +0 -85
- data/lib/code/parser/greater.rb +0 -25
- data/lib/code/parser/group.rb +0 -22
- data/lib/code/parser/if.rb +0 -63
- data/lib/code/parser/if_modifier.rb +0 -55
- data/lib/code/parser/list.rb +0 -42
- data/lib/code/parser/multiplication.rb +0 -25
- data/lib/code/parser/name.rb +0 -107
- data/lib/code/parser/negation.rb +0 -30
- data/lib/code/parser/not_keyword.rb +0 -23
- data/lib/code/parser/nothing.rb +0 -22
- data/lib/code/parser/number.rb +0 -154
- data/lib/code/parser/operation.rb +0 -35
- data/lib/code/parser/or_keyword.rb +0 -21
- data/lib/code/parser/or_operator.rb +0 -17
- data/lib/code/parser/power.rb +0 -43
- data/lib/code/parser/range.rb +0 -17
- data/lib/code/parser/rescue.rb +0 -39
- data/lib/code/parser/shift.rb +0 -21
- data/lib/code/parser/splat.rb +0 -31
- data/lib/code/parser/statement.rb +0 -9
- data/lib/code/parser/string.rb +0 -78
- data/lib/code/parser/ternary.rb +0 -46
- data/lib/code/parser/unary_minus.rb +0 -31
- data/lib/code/parser/while.rb +0 -36
- data/lib/code/parser/whitespace.rb +0 -49
- data/lib/code/parser.rb +0 -19
- data/lib/code/ruby.rb +0 -174
- data/lib/code-ruby.rb +0 -10
- data/lib/code.rb +0 -47
- data/lib/language/atom.rb +0 -342
- data/lib/language/output.rb +0 -130
- data/lib/language/parser/absent/present.rb +0 -8
- data/lib/language/parser/absent.rb +0 -6
- data/lib/language/parser/end_of_input.rb +0 -6
- data/lib/language/parser/interuption.rb +0 -38
- data/lib/language/parser/not_end_of_input.rb +0 -6
- data/lib/language/parser/str/not_found.rb +0 -16
- data/lib/language/parser/str.rb +0 -6
- data/lib/language/parser.rb +0 -53
- data/lib/language-ruby.rb +0 -10
- data/lib/language.rb +0 -80
- data/spec/code/addition_spec.rb +0 -13
- data/spec/code/and_operator_spec.rb +0 -13
- data/spec/code/bitwise_and_spec.rb +0 -13
- data/spec/code/bitwise_or_spec.rb +0 -13
- data/spec/code/boolean_spec.rb +0 -13
- data/spec/code/call_spec.rb +0 -21
- data/spec/code/chained_call_spec.rb +0 -16
- data/spec/code/code_spec.rb +0 -29
- data/spec/code/dictionnary_spec.rb +0 -17
- data/spec/code/equal_spec.rb +0 -26
- data/spec/code/equality_spec.rb +0 -13
- data/spec/code/function_spec.rb +0 -18
- data/spec/code/greater_spec.rb +0 -18
- data/spec/code/group_spec.rb +0 -12
- data/spec/code/if_modifier_spec.rb +0 -20
- data/spec/code/if_spec.rb +0 -25
- data/spec/code/list_spec.rb +0 -19
- data/spec/code/multiplication_spec.rb +0 -18
- data/spec/code/negation_spec.rb +0 -20
- data/spec/code/not_keyword_spec.rb +0 -13
- data/spec/code/nothing_spec.rb +0 -17
- data/spec/code/number_spec.rb +0 -22
- data/spec/code/or_keyword_spec.rb +0 -17
- data/spec/code/or_operator_spec.rb +0 -16
- data/spec/code/parser/boolean_spec.rb +0 -16
- data/spec/code/parser/call_spec.rb +0 -26
- data/spec/code/parser/chained_call.rb +0 -17
- data/spec/code/parser/dictionnary_spec.rb +0 -18
- data/spec/code/parser/function_spec.rb +0 -16
- data/spec/code/parser/group_spec.rb +0 -18
- data/spec/code/parser/list_spec.rb +0 -18
- data/spec/code/parser/number_spec.rb +0 -12
- data/spec/code/parser/string_spec.rb +0 -21
- data/spec/code/parser_spec.rb +0 -23
- data/spec/code/power_spec.rb +0 -13
- data/spec/code/range_spec.rb +0 -16
- data/spec/code/rescue_spec.rb +0 -13
- data/spec/code/shift_spec.rb +0 -13
- data/spec/code/splat_spec.rb +0 -13
- data/spec/code/string_spec.rb +0 -27
- data/spec/code/ternary_spec.rb +0 -18
- data/spec/code/unary_minus_spec.rb +0 -13
- data/spec/code/while_spec.rb +0 -18
data/lib/code/ruby.rb
DELETED
@@ -1,174 +0,0 @@
|
|
1
|
-
class Code
|
2
|
-
class Ruby
|
3
|
-
def initialize(raw = {})
|
4
|
-
@raw = raw
|
5
|
-
end
|
6
|
-
|
7
|
-
def self.to_code(raw)
|
8
|
-
new(raw).to_code
|
9
|
-
end
|
10
|
-
|
11
|
-
def self.from_code(raw)
|
12
|
-
new(raw).from_code
|
13
|
-
end
|
14
|
-
|
15
|
-
def to_code
|
16
|
-
if code?
|
17
|
-
raw
|
18
|
-
elsif nil?
|
19
|
-
::Code::Object::Nothing.new
|
20
|
-
elsif true?
|
21
|
-
::Code::Object::Boolean.new(raw)
|
22
|
-
elsif false?
|
23
|
-
::Code::Object::Boolean.new(raw)
|
24
|
-
elsif string?
|
25
|
-
::Code::Object::String.new(raw)
|
26
|
-
elsif symbol?
|
27
|
-
::Code::Object::String.new(raw.to_s)
|
28
|
-
elsif integer?
|
29
|
-
::Code::Object::Integer.new(raw)
|
30
|
-
elsif float?
|
31
|
-
::Code::Object::Decimal.new(raw.to_s)
|
32
|
-
elsif big_decimal?
|
33
|
-
::Code::Object::Decimal.new(raw)
|
34
|
-
elsif hash?
|
35
|
-
::Code::Object::Dictionnary.new(
|
36
|
-
raw
|
37
|
-
.map do |key, value|
|
38
|
-
[::Code::Ruby.to_code(key), ::Code::Ruby.to_code(value)]
|
39
|
-
end
|
40
|
-
.to_h
|
41
|
-
)
|
42
|
-
elsif array?
|
43
|
-
::Code::Object::List.new(
|
44
|
-
raw.map { |element| ::Code::Ruby.to_code(element) }
|
45
|
-
)
|
46
|
-
elsif proc?
|
47
|
-
::Code::Object::RubyFunction.new(raw)
|
48
|
-
else
|
49
|
-
raise "Unsupported class #{raw.class} for Ruby to Code conversion"
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
def from_code
|
54
|
-
if code?
|
55
|
-
if code_nothing?
|
56
|
-
raw.raw
|
57
|
-
elsif code_boolean?
|
58
|
-
raw.raw
|
59
|
-
elsif code_decimal?
|
60
|
-
raw.raw
|
61
|
-
elsif code_integer?
|
62
|
-
raw.raw
|
63
|
-
elsif code_nothing?
|
64
|
-
raw.raw
|
65
|
-
elsif code_range?
|
66
|
-
raw.raw
|
67
|
-
elsif code_string?
|
68
|
-
raw.raw
|
69
|
-
elsif code_dictionnary?
|
70
|
-
raw
|
71
|
-
.raw
|
72
|
-
.map do |key, value|
|
73
|
-
[::Code::Ruby.from_code(key), ::Code::Ruby.from_code(value)]
|
74
|
-
end
|
75
|
-
.to_h
|
76
|
-
elsif code_list?
|
77
|
-
raw.raw.map { |element| ::Code::Ruby.from_code(element) }
|
78
|
-
else
|
79
|
-
raise "Unsupported class #{raw.class} for Code to Ruby conversion"
|
80
|
-
end
|
81
|
-
else
|
82
|
-
raw
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
private
|
87
|
-
|
88
|
-
attr_reader :raw
|
89
|
-
|
90
|
-
def code?
|
91
|
-
raw.is_a?(::Code::Object)
|
92
|
-
end
|
93
|
-
|
94
|
-
def nil?
|
95
|
-
raw.is_a?(::NilClass)
|
96
|
-
end
|
97
|
-
|
98
|
-
def true?
|
99
|
-
raw.is_a?(::TrueClass)
|
100
|
-
end
|
101
|
-
|
102
|
-
def false?
|
103
|
-
raw.is_a?(::FalseClass)
|
104
|
-
end
|
105
|
-
|
106
|
-
def hash?
|
107
|
-
raw.is_a?(::Hash)
|
108
|
-
end
|
109
|
-
|
110
|
-
def array?
|
111
|
-
raw.is_a?(::Array)
|
112
|
-
end
|
113
|
-
|
114
|
-
def string?
|
115
|
-
raw.is_a?(::String)
|
116
|
-
end
|
117
|
-
|
118
|
-
def symbol?
|
119
|
-
raw.is_a?(::Symbol)
|
120
|
-
end
|
121
|
-
|
122
|
-
def integer?
|
123
|
-
raw.is_a?(::Integer)
|
124
|
-
end
|
125
|
-
|
126
|
-
def float?
|
127
|
-
raw.is_a?(::Float)
|
128
|
-
end
|
129
|
-
|
130
|
-
def big_decimal?
|
131
|
-
raw.is_a?(::BigDecimal)
|
132
|
-
end
|
133
|
-
|
134
|
-
def proc?
|
135
|
-
raw.is_a?(::Proc)
|
136
|
-
end
|
137
|
-
|
138
|
-
def code_nothing?
|
139
|
-
raw.is_a?(::Code::Object::Nothing)
|
140
|
-
end
|
141
|
-
|
142
|
-
def code_boolean?
|
143
|
-
raw.is_a?(::Code::Object::Boolean)
|
144
|
-
end
|
145
|
-
|
146
|
-
def code_decimal?
|
147
|
-
raw.is_a?(::Code::Object::Decimal)
|
148
|
-
end
|
149
|
-
|
150
|
-
def code_integer?
|
151
|
-
raw.is_a?(::Code::Object::Integer)
|
152
|
-
end
|
153
|
-
|
154
|
-
def code_nothing?
|
155
|
-
raw.is_a?(::Code::Object::Nothing)
|
156
|
-
end
|
157
|
-
|
158
|
-
def code_range?
|
159
|
-
raw.is_a?(::Code::Object::Range)
|
160
|
-
end
|
161
|
-
|
162
|
-
def code_string?
|
163
|
-
raw.is_a?(::Code::Object::String)
|
164
|
-
end
|
165
|
-
|
166
|
-
def code_dictionnary?
|
167
|
-
raw.is_a?(::Code::Object::Dictionnary)
|
168
|
-
end
|
169
|
-
|
170
|
-
def code_list?
|
171
|
-
raw.is_a?(::Code::Object::List)
|
172
|
-
end
|
173
|
-
end
|
174
|
-
end
|
data/lib/code-ruby.rb
DELETED
@@ -1,10 +0,0 @@
|
|
1
|
-
require "bigdecimal"
|
2
|
-
require "stringio"
|
3
|
-
require "timeout"
|
4
|
-
require "zeitwerk"
|
5
|
-
|
6
|
-
loader = Zeitwerk::Loader.for_gem(warn_on_extra_files: false)
|
7
|
-
loader.ignore("#{__dir__}/template-ruby.rb")
|
8
|
-
loader.ignore("#{__dir__}/code-ruby.rb")
|
9
|
-
loader.ignore("#{__dir__}/language-ruby.rb")
|
10
|
-
loader.setup
|
data/lib/code.rb
DELETED
@@ -1,47 +0,0 @@
|
|
1
|
-
class Code
|
2
|
-
EMPTY_STRING = ""
|
3
|
-
GLOBALS = %i[io context object]
|
4
|
-
DEFAULT_TIMEOUT = Template::DEFAULT_TIMEOUT
|
5
|
-
|
6
|
-
def initialize(input, io: StringIO.new, timeout: DEFAULT_TIMEOUT, ruby: {})
|
7
|
-
@input = input
|
8
|
-
@parsed = Timeout.timeout(timeout) { ::Code::Parser.parse(@input).to_raw }
|
9
|
-
@io = io
|
10
|
-
@timeout = timeout || DEFAULT_TIMEOUT
|
11
|
-
@ruby = ::Code::Ruby.to_code(ruby || {})
|
12
|
-
end
|
13
|
-
|
14
|
-
def self.evaluate(
|
15
|
-
input,
|
16
|
-
context = "",
|
17
|
-
io: StringIO.new,
|
18
|
-
timeout: DEFAULT_TIMEOUT,
|
19
|
-
ruby: {}
|
20
|
-
)
|
21
|
-
new(input, io: io, timeout: timeout, ruby: ruby).evaluate(context)
|
22
|
-
end
|
23
|
-
|
24
|
-
def evaluate(context = "")
|
25
|
-
Timeout.timeout(timeout) do
|
26
|
-
if context != EMPTY_STRING
|
27
|
-
context = ::Code.evaluate(context, timeout: timeout, io: io, ruby: ruby)
|
28
|
-
else
|
29
|
-
context = ::Code::Object::Dictionnary.new
|
30
|
-
end
|
31
|
-
|
32
|
-
if !context.is_a?(::Code::Object::Dictionnary)
|
33
|
-
raise ::Code::Error::IncompatibleContext.new(
|
34
|
-
"context must be a dictionnary"
|
35
|
-
)
|
36
|
-
end
|
37
|
-
|
38
|
-
context = context.merge(ruby)
|
39
|
-
|
40
|
-
::Code::Node::Code.new(parsed).evaluate(context: context, io: io)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
private
|
45
|
-
|
46
|
-
attr_reader :input, :parsed, :timeout, :io, :ruby
|
47
|
-
end
|
data/lib/language/atom.rb
DELETED
@@ -1,342 +0,0 @@
|
|
1
|
-
class Language
|
2
|
-
class Atom
|
3
|
-
class Rule < Atom
|
4
|
-
def initialize(name:)
|
5
|
-
@name = name
|
6
|
-
end
|
7
|
-
|
8
|
-
def parse(parser)
|
9
|
-
parser.find_rule!(@name).parse(parser)
|
10
|
-
end
|
11
|
-
|
12
|
-
def to_s
|
13
|
-
"rule(#{@name.inspect})"
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
class Any < Atom
|
18
|
-
def parse(parser)
|
19
|
-
parser.consume(1)
|
20
|
-
end
|
21
|
-
|
22
|
-
def to_s
|
23
|
-
"any"
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
class Then < Atom
|
28
|
-
def initialize(parent:, block:)
|
29
|
-
@parent = parent
|
30
|
-
@block = block
|
31
|
-
end
|
32
|
-
|
33
|
-
def parse(parser)
|
34
|
-
@parent.parse(parser)
|
35
|
-
parser.output = Output.from_raw(@block.call(parser.output.to_raw))
|
36
|
-
end
|
37
|
-
|
38
|
-
def to_s
|
39
|
-
"(#{@parent}).then {}"
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
class Repeat < Atom
|
44
|
-
def initialize(parent: nil, min: 0, max: nil)
|
45
|
-
@parent = parent
|
46
|
-
@min = min
|
47
|
-
@max = max
|
48
|
-
end
|
49
|
-
|
50
|
-
def parse(parser)
|
51
|
-
return unless @parent
|
52
|
-
|
53
|
-
if @max.nil?
|
54
|
-
@min.times { match(parser) }
|
55
|
-
|
56
|
-
begin
|
57
|
-
loop { match(parser) }
|
58
|
-
rescue Parser::Interuption
|
59
|
-
end
|
60
|
-
else
|
61
|
-
@min.times { match(parser) }
|
62
|
-
|
63
|
-
begin
|
64
|
-
(@max - @min).times { match(parser) }
|
65
|
-
rescue Parser::Interuption
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
def to_s
|
71
|
-
min = @min.zero? ? "" : @min.to_s
|
72
|
-
max = @max.nil? ? "" : ", #{@max}"
|
73
|
-
parenthesis = min.empty? && max.empty? ? "" : "(#{min}#{max})"
|
74
|
-
|
75
|
-
@parent ? "(#{@parent}).repeat#{parenthesis}" : "repeat#{parenthesis}"
|
76
|
-
end
|
77
|
-
|
78
|
-
private
|
79
|
-
|
80
|
-
def match(parser)
|
81
|
-
clone =
|
82
|
-
Parser.new(
|
83
|
-
root: self,
|
84
|
-
input: parser.input,
|
85
|
-
cursor: parser.cursor,
|
86
|
-
buffer: parser.buffer
|
87
|
-
)
|
88
|
-
|
89
|
-
@parent.parse(clone)
|
90
|
-
|
91
|
-
parser.cursor = clone.cursor
|
92
|
-
parser.buffer = clone.buffer
|
93
|
-
parser.output << clone.output
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
class Str < Atom
|
98
|
-
def initialize(string:)
|
99
|
-
@string = string
|
100
|
-
end
|
101
|
-
|
102
|
-
def parse(parser)
|
103
|
-
if parser.next?(@string)
|
104
|
-
parser.consume(@string.size)
|
105
|
-
else
|
106
|
-
raise Parser::Str::NotFound.new(parser, @string)
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
def to_s
|
111
|
-
"str(#{@string.inspect})"
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
class Absent < Atom
|
116
|
-
def initialize(parent: nil)
|
117
|
-
@parent = parent
|
118
|
-
end
|
119
|
-
|
120
|
-
def parse(parser)
|
121
|
-
clone =
|
122
|
-
Parser.new(
|
123
|
-
root: self,
|
124
|
-
input: parser.input,
|
125
|
-
cursor: parser.cursor,
|
126
|
-
buffer: parser.buffer
|
127
|
-
)
|
128
|
-
@parent.parse(clone) if @parent
|
129
|
-
rescue Parser::Interuption
|
130
|
-
else
|
131
|
-
raise Parser::Interuption.new(parser, self)
|
132
|
-
end
|
133
|
-
|
134
|
-
def to_s
|
135
|
-
@parent ? "(#{@parent}).absent" : "absent"
|
136
|
-
end
|
137
|
-
end
|
138
|
-
|
139
|
-
class Ignore < Atom
|
140
|
-
def initialize(parent: nil)
|
141
|
-
@parent = parent
|
142
|
-
end
|
143
|
-
|
144
|
-
def parse(parser)
|
145
|
-
clone =
|
146
|
-
Parser.new(
|
147
|
-
root: self,
|
148
|
-
input: parser.input,
|
149
|
-
cursor: parser.cursor,
|
150
|
-
buffer: parser.buffer
|
151
|
-
)
|
152
|
-
@parent.parse(clone) if @parent
|
153
|
-
parser.cursor = clone.cursor
|
154
|
-
end
|
155
|
-
|
156
|
-
def to_s
|
157
|
-
@parent ? "#{@parent}.ignore" : "ignore"
|
158
|
-
end
|
159
|
-
end
|
160
|
-
|
161
|
-
class Maybe < Atom
|
162
|
-
def initialize(parent:)
|
163
|
-
@parent = parent
|
164
|
-
end
|
165
|
-
|
166
|
-
def parse(parser)
|
167
|
-
clone =
|
168
|
-
Parser.new(
|
169
|
-
root: self,
|
170
|
-
input: parser.input,
|
171
|
-
cursor: parser.cursor,
|
172
|
-
buffer: parser.buffer
|
173
|
-
)
|
174
|
-
|
175
|
-
@parent.parse(clone)
|
176
|
-
rescue Parser::Interuption
|
177
|
-
else
|
178
|
-
parser.cursor = clone.cursor
|
179
|
-
parser.output = clone.output
|
180
|
-
end
|
181
|
-
|
182
|
-
def to_s
|
183
|
-
@parent ? "#{@parent}.maybe" : "maybe"
|
184
|
-
end
|
185
|
-
end
|
186
|
-
|
187
|
-
class Aka < Atom
|
188
|
-
def initialize(name:, parent:)
|
189
|
-
@name = name
|
190
|
-
@parent = parent
|
191
|
-
end
|
192
|
-
|
193
|
-
def parse(parser)
|
194
|
-
clone =
|
195
|
-
Parser.new(root: self, input: parser.input, cursor: parser.cursor)
|
196
|
-
|
197
|
-
@parent.parse(clone)
|
198
|
-
|
199
|
-
if clone.output?
|
200
|
-
parser.output = Output.new(@name => clone.output)
|
201
|
-
else
|
202
|
-
parser.output[@name] = Output.new(clone.buffer)
|
203
|
-
parser.buffer = ""
|
204
|
-
end
|
205
|
-
|
206
|
-
parser.cursor = clone.cursor
|
207
|
-
end
|
208
|
-
|
209
|
-
def to_s
|
210
|
-
@parent ? "#{@parent}.aka(#{@name.inspect})" : "aka(#{@name.inspect})"
|
211
|
-
end
|
212
|
-
end
|
213
|
-
|
214
|
-
class Or < Atom
|
215
|
-
def initialize(left:, right:)
|
216
|
-
@left = left
|
217
|
-
@right = right
|
218
|
-
end
|
219
|
-
|
220
|
-
def parse(parser)
|
221
|
-
left_clone =
|
222
|
-
Parser.new(
|
223
|
-
root: self,
|
224
|
-
input: parser.input,
|
225
|
-
cursor: parser.cursor,
|
226
|
-
buffer: parser.buffer
|
227
|
-
)
|
228
|
-
|
229
|
-
right_clone =
|
230
|
-
Parser.new(
|
231
|
-
root: self,
|
232
|
-
input: parser.input,
|
233
|
-
cursor: parser.cursor,
|
234
|
-
buffer: parser.buffer
|
235
|
-
)
|
236
|
-
|
237
|
-
begin
|
238
|
-
@left.parse(left_clone)
|
239
|
-
parser.cursor = left_clone.cursor
|
240
|
-
parser.buffer = left_clone.buffer
|
241
|
-
parser.output.merge(left_clone.output)
|
242
|
-
rescue Parser::Interuption
|
243
|
-
@right.parse(right_clone)
|
244
|
-
parser.cursor = right_clone.cursor
|
245
|
-
parser.buffer = right_clone.buffer
|
246
|
-
parser.output.merge(right_clone.output)
|
247
|
-
end
|
248
|
-
end
|
249
|
-
|
250
|
-
def to_s
|
251
|
-
"((#{@left}) | (#{@right}))"
|
252
|
-
end
|
253
|
-
end
|
254
|
-
|
255
|
-
class And < Atom
|
256
|
-
def initialize(left:, right:)
|
257
|
-
@left = left
|
258
|
-
@right = right
|
259
|
-
end
|
260
|
-
|
261
|
-
def parse(parser)
|
262
|
-
@left.parse(parser)
|
263
|
-
right_clone =
|
264
|
-
Parser.new(
|
265
|
-
root: self,
|
266
|
-
input: parser.input,
|
267
|
-
cursor: parser.cursor,
|
268
|
-
buffer: parser.buffer
|
269
|
-
)
|
270
|
-
@right.parse(right_clone)
|
271
|
-
parser.cursor = right_clone.cursor
|
272
|
-
parser.buffer = right_clone.buffer
|
273
|
-
|
274
|
-
parser.output.merge(right_clone.output)
|
275
|
-
end
|
276
|
-
|
277
|
-
def to_s
|
278
|
-
"#{@left} >> #{@right}".to_s
|
279
|
-
end
|
280
|
-
end
|
281
|
-
|
282
|
-
def any
|
283
|
-
Any.new
|
284
|
-
end
|
285
|
-
|
286
|
-
def str(string)
|
287
|
-
Str.new(string: string)
|
288
|
-
end
|
289
|
-
|
290
|
-
def absent
|
291
|
-
Absent.new(parent: self)
|
292
|
-
end
|
293
|
-
|
294
|
-
def ignore
|
295
|
-
Ignore.new(parent: self)
|
296
|
-
end
|
297
|
-
|
298
|
-
def maybe
|
299
|
-
Maybe.new(parent: self)
|
300
|
-
end
|
301
|
-
|
302
|
-
def repeat(min = 0, max = nil)
|
303
|
-
Repeat.new(parent: self, min: min, max: max)
|
304
|
-
end
|
305
|
-
|
306
|
-
def aka(name)
|
307
|
-
Aka.new(parent: self, name: name)
|
308
|
-
end
|
309
|
-
|
310
|
-
def |(other)
|
311
|
-
Or.new(left: self, right: other)
|
312
|
-
end
|
313
|
-
|
314
|
-
def >>(other)
|
315
|
-
And.new(left: self, right: other)
|
316
|
-
end
|
317
|
-
|
318
|
-
def <<(other)
|
319
|
-
And.new(left: self, right: other)
|
320
|
-
end
|
321
|
-
|
322
|
-
def then(&block)
|
323
|
-
Then.new(parent: self, block: block)
|
324
|
-
end
|
325
|
-
|
326
|
-
def rule(name)
|
327
|
-
Rule.new(name: name)
|
328
|
-
end
|
329
|
-
|
330
|
-
def parse(parser)
|
331
|
-
raise NotImplementedError.new("#{self.class}#parse")
|
332
|
-
end
|
333
|
-
|
334
|
-
def to_s
|
335
|
-
""
|
336
|
-
end
|
337
|
-
|
338
|
-
def inspect
|
339
|
-
to_s
|
340
|
-
end
|
341
|
-
end
|
342
|
-
end
|
data/lib/language/output.rb
DELETED
@@ -1,130 +0,0 @@
|
|
1
|
-
class Language
|
2
|
-
class Output
|
3
|
-
attr_reader :raw
|
4
|
-
|
5
|
-
def initialize(raw = nil)
|
6
|
-
@raw = raw
|
7
|
-
end
|
8
|
-
|
9
|
-
def self.from_raw(raw)
|
10
|
-
if raw.is_a?(Array)
|
11
|
-
new(raw.map { |element| from_raw(element) })
|
12
|
-
elsif raw.is_a?(Hash)
|
13
|
-
new(raw.map { |key, value| [key, from_raw(value)] }.to_h)
|
14
|
-
else
|
15
|
-
new(raw)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
def to_raw
|
20
|
-
if raw.is_a?(Array)
|
21
|
-
raw.map(&:to_raw)
|
22
|
-
elsif raw.is_a?(Hash)
|
23
|
-
raw.map { |key, value| [key, value.to_raw] }.to_h
|
24
|
-
else
|
25
|
-
raw
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
def clone
|
30
|
-
Output.new(@raw.clone)
|
31
|
-
end
|
32
|
-
|
33
|
-
def present?
|
34
|
-
@raw != nil
|
35
|
-
end
|
36
|
-
|
37
|
-
def ==(other)
|
38
|
-
other.is_a?(Output) ? raw == other.raw : raw == other
|
39
|
-
end
|
40
|
-
|
41
|
-
def to_s
|
42
|
-
raw.to_s
|
43
|
-
end
|
44
|
-
|
45
|
-
def inspect
|
46
|
-
raw.inspect
|
47
|
-
end
|
48
|
-
|
49
|
-
def []=(key, value)
|
50
|
-
case @raw
|
51
|
-
when NilClass
|
52
|
-
@raw = { key => value }
|
53
|
-
when String
|
54
|
-
@raw = { key => value }
|
55
|
-
when Array
|
56
|
-
@raw << Output.new({ key => value })
|
57
|
-
when Hash
|
58
|
-
@raw[key] = value
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
def merge(other)
|
63
|
-
case @raw
|
64
|
-
when NilClass
|
65
|
-
@raw = other.raw
|
66
|
-
when String
|
67
|
-
case other.raw
|
68
|
-
when String
|
69
|
-
@raw = @raw + other.raw
|
70
|
-
when Array
|
71
|
-
@raw = other.raw
|
72
|
-
when Hash
|
73
|
-
@raw = other.raw
|
74
|
-
end
|
75
|
-
when Array
|
76
|
-
case other.raw
|
77
|
-
when String
|
78
|
-
return
|
79
|
-
when Array
|
80
|
-
@raw = @raw + other.raw
|
81
|
-
when Hash
|
82
|
-
@raw << other
|
83
|
-
end
|
84
|
-
when Hash
|
85
|
-
case other.raw
|
86
|
-
when String
|
87
|
-
return
|
88
|
-
when Array
|
89
|
-
return
|
90
|
-
when Hash
|
91
|
-
@raw.merge!(other.raw)
|
92
|
-
end
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
def <<(other)
|
97
|
-
case @raw
|
98
|
-
when NilClass
|
99
|
-
case other.raw
|
100
|
-
when String
|
101
|
-
@raw = [other]
|
102
|
-
when Array
|
103
|
-
@raw = [other]
|
104
|
-
when Hash
|
105
|
-
@raw = [other]
|
106
|
-
end
|
107
|
-
when String
|
108
|
-
case other.raw
|
109
|
-
when String
|
110
|
-
@raw = @raw + other.raw
|
111
|
-
when Array
|
112
|
-
@raw = [other]
|
113
|
-
when Hash
|
114
|
-
@raw = [other]
|
115
|
-
end
|
116
|
-
when Array
|
117
|
-
@raw << other
|
118
|
-
when Hash
|
119
|
-
case other.raw
|
120
|
-
when String
|
121
|
-
return
|
122
|
-
when Array
|
123
|
-
return
|
124
|
-
when Hash
|
125
|
-
@raw.merge!(other.raw)
|
126
|
-
end
|
127
|
-
end
|
128
|
-
end
|
129
|
-
end
|
130
|
-
end
|