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.
Files changed (184) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -4
  3. data/Gemfile.lock +15 -22
  4. data/lib/template/version.rb +1 -1
  5. data/lib/template-ruby.rb +2 -3
  6. data/lib/template.rb +18 -22
  7. data/spec/spec_helper.rb +0 -5
  8. data/spec/template_spec.rb +13 -0
  9. data/template-ruby.gemspec +2 -1
  10. metadata +34 -222
  11. data/.cherry.js +0 -21
  12. data/.editorconfig +0 -9
  13. data/.github/workflows/rspec.yml +0 -14
  14. data/.gitignore +0 -2
  15. data/.prettierrc +0 -3
  16. data/.tool-versions +0 -1
  17. data/CHANGELOG.md +0 -55
  18. data/LICENSE +0 -7
  19. data/README.md +0 -103
  20. data/TODO +0 -17
  21. data/bin/code +0 -76
  22. data/bin/format +0 -3
  23. data/bin/publish +0 -19
  24. data/bin/template +0 -85
  25. data/bin/test +0 -17
  26. data/code-ruby.gemspec +0 -17
  27. data/docs/class.code +0 -9
  28. data/docs/euler/1.template +0 -10
  29. data/docs/euler/2.template +0 -16
  30. data/docs/euler/3.template +0 -16
  31. data/docs/euler/4.template +0 -10
  32. data/docs/euler/5.template +0 -13
  33. data/docs/fibonnaci.template +0 -14
  34. data/docs/meetup.code +0 -12
  35. data/docs/precedence.template +0 -36
  36. data/docs/rain.code +0 -22
  37. data/docs/slack.code +0 -17
  38. data/docs/stripe.code +0 -7
  39. data/docs/twitter.code +0 -9
  40. data/language-ruby.gemspec +0 -17
  41. data/lib/code/error.rb +0 -18
  42. data/lib/code/node/base_10.rb +0 -29
  43. data/lib/code/node/base_16.rb +0 -13
  44. data/lib/code/node/base_2.rb +0 -13
  45. data/lib/code/node/base_8.rb +0 -13
  46. data/lib/code/node/boolean.rb +0 -22
  47. data/lib/code/node/call.rb +0 -47
  48. data/lib/code/node/call_argument.rb +0 -21
  49. data/lib/code/node/chained_call.rb +0 -23
  50. data/lib/code/node/code.rb +0 -20
  51. data/lib/code/node/decimal.rb +0 -26
  52. data/lib/code/node/dictionnary.rb +0 -33
  53. data/lib/code/node/equal.rb +0 -34
  54. data/lib/code/node/function.rb +0 -20
  55. data/lib/code/node/function_parameter.rb +0 -31
  56. data/lib/code/node/if.rb +0 -59
  57. data/lib/code/node/if_modifier.rb +0 -47
  58. data/lib/code/node/list.rb +0 -16
  59. data/lib/code/node/negation.rb +0 -15
  60. data/lib/code/node/not.rb +0 -15
  61. data/lib/code/node/nothing.rb +0 -12
  62. data/lib/code/node/number.rb +0 -25
  63. data/lib/code/node/operation.rb +0 -38
  64. data/lib/code/node/power.rb +0 -20
  65. data/lib/code/node/rescue.rb +0 -17
  66. data/lib/code/node/splat.rb +0 -15
  67. data/lib/code/node/statement.rb +0 -59
  68. data/lib/code/node/string.rb +0 -53
  69. data/lib/code/node/ternary.rb +0 -24
  70. data/lib/code/node/unary_minus.rb +0 -15
  71. data/lib/code/node/while.rb +0 -35
  72. data/lib/code/node.rb +0 -13
  73. data/lib/code/object/argument.rb +0 -32
  74. data/lib/code/object/boolean.rb +0 -27
  75. data/lib/code/object/decimal.rb +0 -162
  76. data/lib/code/object/dictionnary.rb +0 -96
  77. data/lib/code/object/function.rb +0 -64
  78. data/lib/code/object/global.rb +0 -42
  79. data/lib/code/object/integer.rb +0 -221
  80. data/lib/code/object/list.rb +0 -207
  81. data/lib/code/object/nothing.rb +0 -23
  82. data/lib/code/object/number.rb +0 -6
  83. data/lib/code/object/range.rb +0 -146
  84. data/lib/code/object/ruby_function.rb +0 -31
  85. data/lib/code/object/string.rb +0 -102
  86. data/lib/code/object.rb +0 -197
  87. data/lib/code/parser/addition.rb +0 -21
  88. data/lib/code/parser/and_operator.rb +0 -17
  89. data/lib/code/parser/bitwise_and.rb +0 -17
  90. data/lib/code/parser/bitwise_or.rb +0 -21
  91. data/lib/code/parser/boolean.rb +0 -17
  92. data/lib/code/parser/call.rb +0 -122
  93. data/lib/code/parser/chained_call.rb +0 -47
  94. data/lib/code/parser/class.rb +0 -45
  95. data/lib/code/parser/code.rb +0 -25
  96. data/lib/code/parser/dictionnary.rb +0 -67
  97. data/lib/code/parser/equal.rb +0 -94
  98. data/lib/code/parser/equality.rb +0 -35
  99. data/lib/code/parser/equality_lower.rb +0 -9
  100. data/lib/code/parser/function.rb +0 -85
  101. data/lib/code/parser/greater.rb +0 -25
  102. data/lib/code/parser/group.rb +0 -22
  103. data/lib/code/parser/if.rb +0 -63
  104. data/lib/code/parser/if_modifier.rb +0 -55
  105. data/lib/code/parser/list.rb +0 -42
  106. data/lib/code/parser/multiplication.rb +0 -25
  107. data/lib/code/parser/name.rb +0 -107
  108. data/lib/code/parser/negation.rb +0 -30
  109. data/lib/code/parser/not_keyword.rb +0 -23
  110. data/lib/code/parser/nothing.rb +0 -22
  111. data/lib/code/parser/number.rb +0 -154
  112. data/lib/code/parser/operation.rb +0 -35
  113. data/lib/code/parser/or_keyword.rb +0 -21
  114. data/lib/code/parser/or_operator.rb +0 -17
  115. data/lib/code/parser/power.rb +0 -43
  116. data/lib/code/parser/range.rb +0 -17
  117. data/lib/code/parser/rescue.rb +0 -39
  118. data/lib/code/parser/shift.rb +0 -21
  119. data/lib/code/parser/splat.rb +0 -31
  120. data/lib/code/parser/statement.rb +0 -9
  121. data/lib/code/parser/string.rb +0 -78
  122. data/lib/code/parser/ternary.rb +0 -46
  123. data/lib/code/parser/unary_minus.rb +0 -31
  124. data/lib/code/parser/while.rb +0 -36
  125. data/lib/code/parser/whitespace.rb +0 -49
  126. data/lib/code/parser.rb +0 -19
  127. data/lib/code/ruby.rb +0 -174
  128. data/lib/code-ruby.rb +0 -10
  129. data/lib/code.rb +0 -47
  130. data/lib/language/atom.rb +0 -342
  131. data/lib/language/output.rb +0 -130
  132. data/lib/language/parser/absent/present.rb +0 -8
  133. data/lib/language/parser/absent.rb +0 -6
  134. data/lib/language/parser/end_of_input.rb +0 -6
  135. data/lib/language/parser/interuption.rb +0 -38
  136. data/lib/language/parser/not_end_of_input.rb +0 -6
  137. data/lib/language/parser/str/not_found.rb +0 -16
  138. data/lib/language/parser/str.rb +0 -6
  139. data/lib/language/parser.rb +0 -53
  140. data/lib/language-ruby.rb +0 -10
  141. data/lib/language.rb +0 -80
  142. data/spec/code/addition_spec.rb +0 -13
  143. data/spec/code/and_operator_spec.rb +0 -13
  144. data/spec/code/bitwise_and_spec.rb +0 -13
  145. data/spec/code/bitwise_or_spec.rb +0 -13
  146. data/spec/code/boolean_spec.rb +0 -13
  147. data/spec/code/call_spec.rb +0 -21
  148. data/spec/code/chained_call_spec.rb +0 -16
  149. data/spec/code/code_spec.rb +0 -29
  150. data/spec/code/dictionnary_spec.rb +0 -17
  151. data/spec/code/equal_spec.rb +0 -26
  152. data/spec/code/equality_spec.rb +0 -13
  153. data/spec/code/function_spec.rb +0 -18
  154. data/spec/code/greater_spec.rb +0 -18
  155. data/spec/code/group_spec.rb +0 -12
  156. data/spec/code/if_modifier_spec.rb +0 -20
  157. data/spec/code/if_spec.rb +0 -25
  158. data/spec/code/list_spec.rb +0 -19
  159. data/spec/code/multiplication_spec.rb +0 -18
  160. data/spec/code/negation_spec.rb +0 -20
  161. data/spec/code/not_keyword_spec.rb +0 -13
  162. data/spec/code/nothing_spec.rb +0 -17
  163. data/spec/code/number_spec.rb +0 -22
  164. data/spec/code/or_keyword_spec.rb +0 -17
  165. data/spec/code/or_operator_spec.rb +0 -16
  166. data/spec/code/parser/boolean_spec.rb +0 -16
  167. data/spec/code/parser/call_spec.rb +0 -26
  168. data/spec/code/parser/chained_call.rb +0 -17
  169. data/spec/code/parser/dictionnary_spec.rb +0 -18
  170. data/spec/code/parser/function_spec.rb +0 -16
  171. data/spec/code/parser/group_spec.rb +0 -18
  172. data/spec/code/parser/list_spec.rb +0 -18
  173. data/spec/code/parser/number_spec.rb +0 -12
  174. data/spec/code/parser/string_spec.rb +0 -21
  175. data/spec/code/parser_spec.rb +0 -23
  176. data/spec/code/power_spec.rb +0 -13
  177. data/spec/code/range_spec.rb +0 -16
  178. data/spec/code/rescue_spec.rb +0 -13
  179. data/spec/code/shift_spec.rb +0 -13
  180. data/spec/code/splat_spec.rb +0 -13
  181. data/spec/code/string_spec.rb +0 -27
  182. data/spec/code/ternary_spec.rb +0 -18
  183. data/spec/code/unary_minus_spec.rb +0 -13
  184. 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
@@ -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
@@ -1,8 +0,0 @@
1
- class Language
2
- class Parser
3
- class Absent
4
- class Present < Interuption
5
- end
6
- end
7
- end
8
- end
@@ -1,6 +0,0 @@
1
- class Language
2
- class Parser
3
- class Absent
4
- end
5
- end
6
- end
@@ -1,6 +0,0 @@
1
- class Language
2
- class Parser
3
- class EndOfInput < Interuption
4
- end
5
- end
6
- end