module Pione::PNML::LabelExtractor

LabelExtractor extracts PIONE string from node label.

Public Class Methods

extract_data_expr(label) click to toggle source

Extract a data expression.

@param label [String]

node label

@return [String]

data expression without modifier and comment
# File lib/pione/pnml/label-extractor.rb, line 22
def extract_data_expr(label)
  extract_string(label, :data_place, :expr)
end
extract_data_from_param_sentence(label) click to toggle source

Extract key and value pairs from parameter set string.

@param label [String]

node label

@return [Hash]

key and value pairs
# File lib/pione/pnml/label-extractor.rb, line 136
def extract_data_from_param_sentence(label)
  param_sentence = LabelExtractor.extract_param_sentence(label)
  parsed = Parser.new.param_sentence.parse(param_sentence)

  # variable
  var = parsed[:param_sentence][:expr1][:expr][:variable][:name].to_s

  # value
  expr2 = parsed[:param_sentence][:expr2]
  expr2_offset = find_head_character_position(expr2)
  tail_offset = offset_of(parsed[:tail]) || label.size
  value = label[expr2_offset, tail_offset - expr2_offset]

  return {var => value}
end
extract_data_from_param_set(label) click to toggle source

Extract key and value pairs from parameter set string.

@param label [String]

node label

@return [Hash]

key and value pairs
# File lib/pione/pnml/label-extractor.rb, line 105
def extract_data_from_param_set(label)
  param_set = LabelExtractor.extract_param_set(label)

  parsed = Parser.new.expr_place.parse(param_set)
  tail_offset = parsed[:tail] ? parsed[:tail].offset : label.size

  keys = []
  values = []

  found = find_all_by_tree_names(parsed, [:key, :value, :separator, :footer])
  found.each_with_index do |item, index|
    if index % 3 == 0
      keys << item.to_s
    end

    if index % 3 == 1
      offset = find_head_character_position(item)
      separator_offset = found[index + 1] ? found[index + 1].offset : tail_offset
      values << label[offset, separator_offset - offset]
    end
  end

  return Hash[keys.zip(values)]
end
extract_feature(label) click to toggle source

Extract a feature.

@param label [String]

node label

@return [String]

feature string without modifier and comment
# File lib/pione/pnml/label-extractor.rb, line 52
def extract_feature(label)
  extract_string(label, :expr_place, :expr)
end
extract_feature_sentence(label) click to toggle source

Extract a feature sentence.

@param label [String]

node label

@return [String]

feature sentence string without modifier and comment
# File lib/pione/pnml/label-extractor.rb, line 72
def extract_feature_sentence(label)
  extract_string(label, :feature_sentence, :feature_sentence)
end
extract_param_sentence(label) click to toggle source

Extract a param sentence.

@param label [String]

node label

@return [String]

data expression without modifier and comment
# File lib/pione/pnml/label-extractor.rb, line 62
def extract_param_sentence(label)
  extract_string(label, :param_sentence, :param_sentence)
end
extract_param_set(label) click to toggle source

Extract a param set.

@param name [String]

node label

@return [String]

parameter set string without modifier and comment
# File lib/pione/pnml/label-extractor.rb, line 32
def extract_param_set(label)
  extract_string(label, :expr_place, :expr)
end
extract_priority(label) click to toggle source

Extract priority.

@param label [String]

node label

@return [Integer]

priority
# File lib/pione/pnml/label-extractor.rb, line 92
def extract_priority(label)
  matched = Parser.new.data_priority.parse(label)
  return matched[:priority].to_i
rescue Parslet::ParseFailed
  return nil
end
extract_rule_expr(label) click to toggle source

Extract a rule expression.

@param label [String]

node label

@return [String]

rule expression without modifier and comment
# File lib/pione/pnml/label-extractor.rb, line 12
def extract_rule_expr(label)
  extract_string(label, :rule_transition, :expr)
end
extract_ticket(label) click to toggle source

Extract a ticket.

@param label [String]

node label

@return [String]

ticket string without modifier and comment
# File lib/pione/pnml/label-extractor.rb, line 42
def extract_ticket(label)
  extract_string(label, :expr_place, :expr)
end
extract_variable_binding(label) click to toggle source

Extract a variable binding sentence.

@param label [String]

node label

@return [String]

variable binding sentence string without modifier and comment
# File lib/pione/pnml/label-extractor.rb, line 82
def extract_variable_binding(label)
  extract_string(label, :variable_binding_sentence, :variable_binding_sentence)
end

Private Class Methods

extract_string(label, parser_name, tree_name) click to toggle source

Extract the string of expression.

@param label [String]

node label

@param paser_name [Symbol]

parser name

@param tree_name [Symbol]

tree name

@return [String]

expression without modifier and comment
# File lib/pione/pnml/label-extractor.rb, line 164
def extract_string(label, parser_name, tree_name)
  return nil if label.nil?

  parsed = Parser.new.send(parser_name).parse(label)
  offset = find_head_character_position(parsed[tree_name])
  tail_offset = offset_of(find_parsed_element(parsed, :tail)) || label.size
  return label[offset, tail_offset - offset]
end
find_all_by_tree_names(parsed, names) click to toggle source
# File lib/pione/pnml/label-extractor.rb, line 231
def find_all_by_tree_names(parsed, names)
  list = []
  return list if parsed.nil?

  parsed.each do |key, value|
    if names.include?(key)
      list << value
    else
      if value.kind_of?(Hash)
        list += find_all_by_tree_names(value, names)
      end

      if value.kind_of?(Array)
        value.each do |elt|
          if elt.kind_of?(Hash)
            list += find_all_by_tree_names(elt, names)
          end
        end
      end
    end
  end

  return list
end
find_head_character_position(parsed) click to toggle source

Find position of head character of parsed tree.

@param parsed [Hash]

parsed tree

@return [Integer]

position of head character or nil
# File lib/pione/pnml/label-extractor.rb, line 179
def find_head_character_position(parsed)
  return nil if parsed.nil?

  pos = nil
  parsed.values.each do |value|
    if value.kind_of?(Hash)
      if _pos = find_head_character_position(value)
        if pos.nil? or pos > _pos
          pos = _pos
        end
      end
    else
      if value.kind_of?(Parslet::Slice) and (pos.nil? or pos > value.offset)
        pos = value.offset
      end
    end
  end
  return pos
end
find_parsed_element(parsed, name) click to toggle source

Find a parsed element by the name.

@param parsed [Hash]

parsed tree

@param name [Symbol]

element name

@return [Object]

parsed element
# File lib/pione/pnml/label-extractor.rb, line 213
def find_parsed_element(parsed, name)
  return nil if parsed.nil?

  parsed.each do |key, value|
    if key == name
      return value
    else
      if value.kind_of?(Hash)
        if elt = find_parsed_element(value, name)
          return elt
        end
      end
    end
  end

  return nil
end
offset_of(value) click to toggle source
# File lib/pione/pnml/label-extractor.rb, line 199
def offset_of(value)
  if value.kind_of?(Parslet::Slice)
    value.offset
  end
end