Module: Bparity::Formal::Deductive::ModelParser

Defined in:
lib/bparity/formal/deductive.rb

Class Method Summary collapse

Class Method Details

.call(output) ⇒ Object



330
331
332
333
334
335
336
337
338
# File 'lib/bparity/formal/deductive.rb', line 330

def call(output)
  expressions = parse_all(output.scan(/"(?:[^"]|"")*"|[()]|[^\s()]+/))
  definitions = expressions.flat_map { |expression| find_definitions(expression) }
  definitions.to_h do |definition|
    [definition.fetch(1), ruby_value(definition.fetch(3), definition.fetch(4))]
  end
rescue StandardError
  {}
end

.find_definitions(value) ⇒ Object



356
357
358
359
360
361
# File 'lib/bparity/formal/deductive.rb', line 356

def find_definitions(value)
  return [] unless value.is_a?(Array)

  found = value.first == "define-fun" ? [value] : []
  found + value.flat_map { |child| find_definitions(child) }
end

.parse(tokens) ⇒ Object



346
347
348
349
350
351
352
353
354
# File 'lib/bparity/formal/deductive.rb', line 346

def parse(tokens)
  token = tokens.shift
  return token unless token == "("

  values = []
  values << parse(tokens) until tokens.first == ")" || tokens.empty?
  tokens.shift
  values
end

.parse_all(tokens) ⇒ Object



340
341
342
343
344
# File 'lib/bparity/formal/deductive.rb', line 340

def parse_all(tokens)
  values = []
  values << parse(tokens) until tokens.empty?
  values
end

.ruby_value(sort, value) ⇒ Object



363
364
365
366
367
368
369
# File 'lib/bparity/formal/deductive.rb', line 363

def ruby_value(sort, value)
  case sort
  when "Int" then value.is_a?(Array) ? -Integer(value.fetch(1), 10) : Integer(value, 10)
  when "Bool" then value == "true"
  when "String" then value.delete_prefix('"').delete_suffix('"').gsub('""', '"')
  end
end