code-ruby 0.5.5 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (218) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -4
  3. data/Gemfile.lock +10 -22
  4. data/code-ruby.gemspec +4 -3
  5. data/lib/code/error.rb +16 -5
  6. data/lib/code/node/base_10.rb +4 -2
  7. data/lib/code/node/base_16.rb +3 -1
  8. data/lib/code/node/base_2.rb +3 -1
  9. data/lib/code/node/base_8.rb +3 -1
  10. data/lib/code/node/boolean.rb +4 -2
  11. data/lib/code/node/call.rb +35 -12
  12. data/lib/code/node/call_argument.rb +16 -5
  13. data/lib/code/node/code.rb +5 -4
  14. data/lib/code/node/decimal.rb +2 -0
  15. data/lib/code/node/{dictionnary.rb → dictionary.rb} +14 -5
  16. data/lib/code/node/function.rb +7 -4
  17. data/lib/code/node/function_parameter.rb +3 -1
  18. data/lib/code/node/if.rb +5 -3
  19. data/lib/code/node/left_operation.rb +63 -0
  20. data/lib/code/node/list.rb +2 -0
  21. data/lib/code/node/negation.rb +2 -0
  22. data/lib/code/node/not.rb +2 -0
  23. data/lib/code/node/nothing.rb +3 -1
  24. data/lib/code/node/number.rb +2 -0
  25. data/lib/code/node/right_operation.rb +70 -0
  26. data/lib/code/node/splat.rb +2 -0
  27. data/lib/code/node/square_bracket.rb +37 -0
  28. data/lib/code/node/statement.rb +13 -5
  29. data/lib/code/node/string.rb +3 -1
  30. data/lib/code/node/ternary.rb +5 -3
  31. data/lib/code/node/unary_minus.rb +2 -0
  32. data/lib/code/node/while.rb +6 -4
  33. data/lib/code/node.rb +11 -5
  34. data/lib/code/object/argument.rb +13 -7
  35. data/lib/code/object/boolean.rb +43 -5
  36. data/lib/code/object/class.rb +17 -0
  37. data/lib/code/object/context.rb +36 -0
  38. data/lib/code/object/decimal.rb +252 -100
  39. data/lib/code/object/dictionary.rb +641 -0
  40. data/lib/code/object/function.rb +54 -27
  41. data/lib/code/object/global.rb +65 -19
  42. data/lib/code/object/identifier_list.rb +47 -0
  43. data/lib/code/object/integer.rb +320 -137
  44. data/lib/code/object/list.rb +140 -138
  45. data/lib/code/object/nothing.rb +10 -4
  46. data/lib/code/object/number.rb +6 -1
  47. data/lib/code/object/range.rb +85 -88
  48. data/lib/code/object/ruby_function.rb +11 -6
  49. data/lib/code/object/string.rb +51 -48
  50. data/lib/code/object.rb +117 -139
  51. data/lib/code/parser/addition.rb +4 -2
  52. data/lib/code/parser/and_operator.rb +4 -2
  53. data/lib/code/parser/bitwise_and.rb +4 -2
  54. data/lib/code/parser/bitwise_or.rb +4 -2
  55. data/lib/code/parser/boolean.rb +3 -1
  56. data/lib/code/parser/call.rb +17 -11
  57. data/lib/code/parser/chained_call.rb +10 -22
  58. data/lib/code/parser/class.rb +9 -6
  59. data/lib/code/parser/code.rb +6 -4
  60. data/lib/code/parser/{dictionnary.rb → dictionary.rb} +16 -13
  61. data/lib/code/parser/equal.rb +9 -36
  62. data/lib/code/parser/equality.rb +4 -2
  63. data/lib/code/parser/function.rb +24 -9
  64. data/lib/code/parser/greater.rb +6 -3
  65. data/lib/code/parser/group.rb +4 -2
  66. data/lib/code/parser/if.rb +6 -4
  67. data/lib/code/parser/if_modifier.rb +5 -25
  68. data/lib/code/parser/left_operation.rb +40 -0
  69. data/lib/code/parser/list.rb +6 -5
  70. data/lib/code/parser/multiplication.rb +4 -2
  71. data/lib/code/parser/name.rb +19 -4
  72. data/lib/code/parser/negation.rb +4 -2
  73. data/lib/code/parser/not_keyword.rb +5 -3
  74. data/lib/code/parser/nothing.rb +3 -10
  75. data/lib/code/parser/number.rb +4 -2
  76. data/lib/code/parser/or_keyword.rb +4 -2
  77. data/lib/code/parser/or_operator.rb +4 -2
  78. data/lib/code/parser/power.rb +4 -28
  79. data/lib/code/parser/range.rb +4 -2
  80. data/lib/code/parser/rescue.rb +6 -26
  81. data/lib/code/parser/right_operation.rb +40 -0
  82. data/lib/code/parser/shift.rb +4 -2
  83. data/lib/code/parser/splat.rb +5 -3
  84. data/lib/code/parser/square_bracket.rb +48 -0
  85. data/lib/code/parser/statement.rb +3 -1
  86. data/lib/code/parser/string.rb +12 -10
  87. data/lib/code/parser/ternary.rb +10 -11
  88. data/lib/code/parser/unary_minus.rb +5 -3
  89. data/lib/code/parser/while.rb +5 -3
  90. data/lib/code/parser/whitespace.rb +2 -0
  91. data/lib/code/parser.rb +10 -3
  92. data/lib/code/ruby.rb +4 -2
  93. data/lib/code/type/hash.rb +38 -0
  94. data/lib/code/type/maybe.rb +29 -0
  95. data/lib/code/type/or.rb +38 -0
  96. data/lib/code/type/repeat.rb +38 -0
  97. data/lib/code/type/sig.rb +130 -0
  98. data/lib/code/type.rb +25 -0
  99. data/lib/code/version.rb +3 -0
  100. data/lib/code-ruby.rb +1 -2
  101. data/lib/code.rb +15 -16
  102. data/spec/code/node/call_spec.rb +39 -0
  103. data/spec/code/object/boolean_spec.rb +18 -0
  104. data/spec/code/object/decimal_spec.rb +51 -0
  105. data/spec/code/object/dictionary_spec.rb +98 -0
  106. data/spec/code/object/function_spec.rb +42 -0
  107. data/spec/code/object/integer_spec.rb +43 -0
  108. data/spec/code/object/nothing_spec.rb +14 -0
  109. data/spec/code/object/range_spec.rb +23 -0
  110. data/spec/code/parser/boolean_spec.rb +5 -10
  111. data/spec/code/parser/chained_call.rb +4 -5
  112. data/spec/code/parser/{dictionnary_spec.rb → dictionary_spec.rb} +5 -6
  113. data/spec/code/parser/function_spec.rb +4 -5
  114. data/spec/code/parser/group_spec.rb +5 -12
  115. data/spec/code/parser/if_modifier_spec.rb +18 -0
  116. data/spec/code/parser/list_spec.rb +4 -5
  117. data/spec/code/parser/number_spec.rb +4 -5
  118. data/spec/code/parser/string_spec.rb +4 -5
  119. data/spec/code/parser_spec.rb +22 -16
  120. data/spec/code/type_spec.rb +21 -0
  121. data/spec/code_spec.rb +171 -0
  122. data/spec/spec_helper.rb +1 -6
  123. metadata +61 -137
  124. data/.cherry.js +0 -21
  125. data/.editorconfig +0 -9
  126. data/.github/workflows/rspec.yml +0 -14
  127. data/.gitignore +0 -2
  128. data/.prettierrc +0 -3
  129. data/.tool-versions +0 -1
  130. data/CHANGELOG.md +0 -55
  131. data/LICENSE +0 -7
  132. data/README.md +0 -103
  133. data/TODO +0 -17
  134. data/bin/code +0 -76
  135. data/bin/format +0 -3
  136. data/bin/publish +0 -19
  137. data/bin/template +0 -85
  138. data/bin/test +0 -17
  139. data/docs/class.code +0 -9
  140. data/docs/euler/1.template +0 -10
  141. data/docs/euler/2.template +0 -16
  142. data/docs/euler/3.template +0 -16
  143. data/docs/euler/4.template +0 -10
  144. data/docs/euler/5.template +0 -13
  145. data/docs/fibonnaci.template +0 -14
  146. data/docs/meetup.code +0 -12
  147. data/docs/precedence.template +0 -36
  148. data/docs/rain.code +0 -22
  149. data/docs/slack.code +0 -17
  150. data/docs/stripe.code +0 -7
  151. data/docs/twitter.code +0 -9
  152. data/language-ruby.gemspec +0 -17
  153. data/lib/code/node/chained_call.rb +0 -23
  154. data/lib/code/node/equal.rb +0 -34
  155. data/lib/code/node/if_modifier.rb +0 -47
  156. data/lib/code/node/operation.rb +0 -38
  157. data/lib/code/node/power.rb +0 -20
  158. data/lib/code/node/rescue.rb +0 -17
  159. data/lib/code/object/dictionnary.rb +0 -96
  160. data/lib/code/parser/equality_lower.rb +0 -9
  161. data/lib/code/parser/operation.rb +0 -35
  162. data/lib/language/atom.rb +0 -342
  163. data/lib/language/output.rb +0 -130
  164. data/lib/language/parser/absent/present.rb +0 -8
  165. data/lib/language/parser/absent.rb +0 -6
  166. data/lib/language/parser/end_of_input.rb +0 -6
  167. data/lib/language/parser/interuption.rb +0 -38
  168. data/lib/language/parser/not_end_of_input.rb +0 -6
  169. data/lib/language/parser/str/not_found.rb +0 -16
  170. data/lib/language/parser/str.rb +0 -6
  171. data/lib/language/parser.rb +0 -53
  172. data/lib/language-ruby.rb +0 -10
  173. data/lib/language.rb +0 -80
  174. data/lib/template/node/code_part.rb +0 -13
  175. data/lib/template/node/part.rb +0 -19
  176. data/lib/template/node/template.rb +0 -15
  177. data/lib/template/node/text_part.rb +0 -13
  178. data/lib/template/node.rb +0 -4
  179. data/lib/template/parser/template.rb +0 -39
  180. data/lib/template/parser.rb +0 -19
  181. data/lib/template/version.rb +0 -3
  182. data/lib/template-ruby.rb +0 -10
  183. data/lib/template.rb +0 -50
  184. data/spec/code/addition_spec.rb +0 -13
  185. data/spec/code/and_operator_spec.rb +0 -13
  186. data/spec/code/bitwise_and_spec.rb +0 -13
  187. data/spec/code/bitwise_or_spec.rb +0 -13
  188. data/spec/code/boolean_spec.rb +0 -13
  189. data/spec/code/call_spec.rb +0 -21
  190. data/spec/code/chained_call_spec.rb +0 -16
  191. data/spec/code/code_spec.rb +0 -11
  192. data/spec/code/dictionnary_spec.rb +0 -17
  193. data/spec/code/equal_spec.rb +0 -26
  194. data/spec/code/equality_spec.rb +0 -13
  195. data/spec/code/function_spec.rb +0 -18
  196. data/spec/code/greater_spec.rb +0 -18
  197. data/spec/code/group_spec.rb +0 -12
  198. data/spec/code/if_modifier_spec.rb +0 -20
  199. data/spec/code/if_spec.rb +0 -25
  200. data/spec/code/list_spec.rb +0 -19
  201. data/spec/code/multiplication_spec.rb +0 -18
  202. data/spec/code/negation_spec.rb +0 -20
  203. data/spec/code/not_keyword_spec.rb +0 -13
  204. data/spec/code/nothing_spec.rb +0 -17
  205. data/spec/code/number_spec.rb +0 -22
  206. data/spec/code/or_keyword_spec.rb +0 -17
  207. data/spec/code/or_operator_spec.rb +0 -16
  208. data/spec/code/parser/call_spec.rb +0 -26
  209. data/spec/code/power_spec.rb +0 -13
  210. data/spec/code/range_spec.rb +0 -16
  211. data/spec/code/rescue_spec.rb +0 -13
  212. data/spec/code/shift_spec.rb +0 -13
  213. data/spec/code/splat_spec.rb +0 -13
  214. data/spec/code/string_spec.rb +0 -27
  215. data/spec/code/ternary_spec.rb +0 -18
  216. data/spec/code/unary_minus_spec.rb +0 -13
  217. data/spec/code/while_spec.rb +0 -18
  218. data/template-ruby.gemspec +0 -19
@@ -1,38 +0,0 @@
1
- class Code
2
- class Node
3
- class Operation < Node
4
- class Operator < Node
5
- attr_reader :operator, :statement
6
-
7
- def initialize(parsed)
8
- @operator = parsed.delete(:operator)
9
- @statement = Node::Statement.new(parsed.delete(:statement))
10
- end
11
- end
12
-
13
- def initialize(parsed)
14
- @first = Node::Statement.new(parsed.delete(:first))
15
- @others =
16
- parsed
17
- .delete(:others)
18
- .map { |operator| Node::Operation::Operator.new(operator) }
19
-
20
- super(parsed)
21
- end
22
-
23
- def evaluate(**args)
24
- first = @first.evaluate(**args)
25
-
26
- @others.reduce(first) do |left, right|
27
- statement = right.statement.evaluate(**args)
28
-
29
- left.call(
30
- operator: right.operator,
31
- arguments: [::Code::Object::Argument.new(statement)],
32
- **args
33
- )
34
- end
35
- end
36
- end
37
- end
38
- end
@@ -1,20 +0,0 @@
1
- class Code
2
- class Node
3
- class Power < Node
4
- def initialize(parsed)
5
- @operator = parsed.delete(:operator)
6
- @left = Node::Statement.new(parsed.delete(:left))
7
- @right = Node::Statement.new(parsed.delete(:right))
8
- super(parsed)
9
- end
10
-
11
- def evaluate(**args)
12
- @left.evaluate(**args).call(
13
- operator: @operator,
14
- arguments: [::Code::Object::Argument.new(@right.evaluate(**args))],
15
- **args
16
- )
17
- end
18
- end
19
- end
20
- end
@@ -1,17 +0,0 @@
1
- class Code
2
- class Node
3
- class Rescue < Node
4
- def initialize(parsed)
5
- @left = Node::Statement.new(parsed.delete(:left))
6
- @right = Node::Statement.new(parsed.delete(:right))
7
- super(parsed)
8
- end
9
-
10
- def evaluate(**args)
11
- @left.evaluate(**args)
12
- rescue ::Code::Error
13
- @right.evaluate(**args)
14
- end
15
- end
16
- end
17
- end
@@ -1,96 +0,0 @@
1
- class Code
2
- class Object
3
- class Dictionnary < ::Code::Object
4
- attr_reader :raw
5
-
6
- def initialize(raw = {})
7
- @raw = raw
8
- end
9
-
10
- def call(**args)
11
- operator = args.fetch(:operator, nil)
12
- arguments = args.fetch(:arguments, [])
13
- globals = multi_fetch(args, *::Code::GLOBALS)
14
- value = arguments.first&.value
15
-
16
- if operator == "values"
17
- sig(arguments)
18
- values
19
- elsif operator == "keys"
20
- sig(arguments)
21
- keys
22
- elsif operator == "each"
23
- sig(arguments) { ::Code::Object::Function }
24
- each(value, **globals)
25
- elsif key?(operator)
26
- result = fetch(operator)
27
-
28
- if result.is_a?(::Code::Object::Function)
29
- result.call(**args.merge(operator: nil))
30
- else
31
- sig(arguments)
32
- result
33
- end
34
- else
35
- super
36
- end
37
- end
38
-
39
- def merge(other)
40
- ::Code::Object::Dictionnary.new(raw.merge(other.raw))
41
- end
42
-
43
- def fetch(key)
44
- raw.fetch(key)
45
- end
46
-
47
- def [](key)
48
- raw[key]
49
- end
50
-
51
- def []=(key, value)
52
- raw[key] = value
53
- end
54
-
55
- def key?(key)
56
- raw.key?(key)
57
- end
58
-
59
- def deep_dup
60
- ::Code::Object::Dictionnary.new(raw.deep_dup)
61
- end
62
-
63
- def to_s
64
- "{#{raw.map { |key, value| "#{key.inspect} => #{value.inspect}" }.join(", ")}}"
65
- end
66
-
67
- def inspect
68
- to_s
69
- end
70
-
71
- private
72
-
73
- def keys
74
- ::Code::Object::List.new(raw.keys)
75
- end
76
-
77
- def values
78
- ::Code::Object::List.new(raw.values)
79
- end
80
-
81
- def each(argument, **globals)
82
- raw.each do |key, value|
83
- argument.call(
84
- arguments: [
85
- ::Code::Object::Argument.new(key),
86
- ::Code::Object::Argument.new(value)
87
- ],
88
- **globals
89
- )
90
- end
91
-
92
- self
93
- end
94
- end
95
- end
96
- end
@@ -1,9 +0,0 @@
1
- class Code
2
- class Parser
3
- class EqualityLower < Equality
4
- def statement
5
- ::Code::Parser::Greater
6
- end
7
- end
8
- end
9
- end
@@ -1,35 +0,0 @@
1
- class Code
2
- class Parser
3
- class Operation < Language
4
- def statement
5
- raise NotImplementedError
6
- end
7
-
8
- def whitespace
9
- ::Code::Parser::Whitespace
10
- end
11
-
12
- def whitespace?
13
- whitespace.maybe
14
- end
15
-
16
- def operator
17
- raise NotImplementedError
18
- end
19
-
20
- def root
21
- (
22
- statement.aka(:first) <<
23
- (
24
- whitespace? << operator.aka(:operator) << whitespace? <<
25
- statement.aka(:statement)
26
- ).repeat(1).aka(:others).maybe
27
- )
28
- .aka(:operation)
29
- .then do |output|
30
- output[:operation][:others] ? output : output[:operation][:first]
31
- end
32
- end
33
- end
34
- end
35
- 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