Class: PEG::GrammarGenerator

Inherits:
Visitor
  • Object
show all
Defined in:
lib/peg.rb

Class Method Summary collapse

Methods inherited from Visitor

visit

Class Method Details

.class(node, children) ⇒ Object



192
193
194
195
# File 'lib/peg.rb', line 192

def self.class(node, children)
  class_, spacing = children
  Regex.new(class_.text)
end

.definition(node, children) ⇒ Object



197
198
199
200
# File 'lib/peg.rb', line 197

def self.definition(node, children)
  identifier, left_arrow, expression = children
  expression.name(identifier.reference)
end

.dot(node, children) ⇒ Object



188
189
190
# File 'lib/peg.rb', line 188

def self.dot(node, children)
  Regex.new('.')
end

.expression(node, children) ⇒ Object



202
203
204
205
# File 'lib/peg.rb', line 202

def self.expression(node, children)
  sequence, rest = children
  rest.length == 0 ? sequence : Or.new(sequence, *rest)
end

.expression__sequence(node, children) ⇒ Object



211
212
213
214
# File 'lib/peg.rb', line 211

def self.expression__sequence(node, children)
  slash, sequence = children
  sequence
end

.expression__zeroormore(node, children) ⇒ Object



207
208
209
# File 'lib/peg.rb', line 207

def self.expression__zeroormore(node, children)
  children
end

.grammar(node, children) ⇒ Object



216
217
218
219
# File 'lib/peg.rb', line 216

def self.grammar(node, children)
  spacing, definitions = children
  definitions
end

.grammar__oneormore(node, children) ⇒ Object



221
222
223
# File 'lib/peg.rb', line 221

def self.grammar__oneormore(node, children)
  children
end

.identifier(node, children) ⇒ Object



179
180
181
182
# File 'lib/peg.rb', line 179

def self.identifier(node, children)
  identifier_regex, spacing = children
  Reference.new(identifier_regex)
end

.identifier__regex(node, children) ⇒ Object



175
176
177
# File 'lib/peg.rb', line 175

def self.identifier__regex(node, children)
  node.text
end

.literal(node, children) ⇒ Object



184
185
186
# File 'lib/peg.rb', line 184

def self.literal(node, children)
  Literal.new(Kernel.eval(node.text))
end

.prefix(node, children) ⇒ Object



243
244
245
246
# File 'lib/peg.rb', line 243

def self.prefix(node, children)
  prefix, suffix = children
  prefix == '' ? suffix : {'&' => And, '!' => Not}.fetch(prefix).new(suffix)
end

.prefix__optional(node, children) ⇒ Object



239
240
241
# File 'lib/peg.rb', line 239

def self.prefix__optional(node, children)
  node.text.strip  # HACK
end

.primary(node, children) ⇒ Object



225
226
227
# File 'lib/peg.rb', line 225

def self.primary(node, children)
  children[0]
end

.primary__parens(node, children) ⇒ Object



234
235
236
237
# File 'lib/peg.rb', line 234

def self.primary__parens(node, children)
  open, expression, close = children
  expression
end

.primary__sequence(node, children) ⇒ Object



229
230
231
232
# File 'lib/peg.rb', line 229

def self.primary__sequence(node, children)
  identifier, not_left_arrow = children
  identifier
end

.sequence(node, children) ⇒ Object



248
249
250
# File 'lib/peg.rb', line 248

def self.sequence(node, children)
  children.length == 1 ? children[0] : Sequence.new(*children)
end

.suffix(node, children) ⇒ Object



256
257
258
259
260
261
262
263
# File 'lib/peg.rb', line 256

def self.suffix(node, children)
  primary, optional_suffix = children
  optional_suffix == '' ? primary : {
    '?' => Optional,
    '*' => ZeroOrMore,
    '+' => OneOrMore,
  }.fetch(optional_suffix).new(primary)
end

.suffix__optional(node, children) ⇒ Object



252
253
254
# File 'lib/peg.rb', line 252

def self.suffix__optional(node, children)
  node.text.strip  # HACK
end