class Frepl::MultiDeclaration

Attributes

variable_names[R]

Public Instance Methods

accept(visitor) click to toggle source
# File lib/frepl/statements/multi_declaration.rb, line 5
def accept(visitor)
  visitor.visit_multi_declaration(self)
end
declarations() click to toggle source
# File lib/frepl/statements/multi_declaration.rb, line 9
def declarations
  @declarations ||= @variable_parts.map do |varpart|
    str = "#{@type}"
    str << "#{@kind_len}" if @kind_len
    str << "#{@parameter}" if @parameter
    str << "#{@dimension}" if @dimension
    str << "#{@target}" if @target
    str << "#{@pointer}" if @pointer
    str << " :: #{varpart}"
    Declaration.new(str)
  end
end

Private Instance Methods

parse() click to toggle source

TODO regex needs better parameter/dimension parsing

# File lib/frepl/statements/multi_declaration.rb, line 25
def parse
  match_data = line.match(Frepl::Classifier::DECLARATION_REGEX)
  @type = match_data[1]
  kind_len = match_data[2]
  if @kind_len
    if @kind_len.match(/len/)
      @len = @kind_len.match(/=(\d+)/)[1]
    else
      @kind = @kind_len.match(/=(\d+)/)[1]
    end
  end
  @parameter = match_data[3]
  @dimension = match_data[4]
  @target = match_data[5]
  @pointer = match_data[6]
  @variable_names = match_data[7].gsub(/\s*=\s*/, '=').scan(Frepl::Classifier::VARIABLE_NAME_REGEX)
  @variable_assignments = match_data[7].gsub(/\s*=\s*/, '=').
    split(Frepl::Classifier::VARIABLE_NAME_REGEX)[1..-1].
    map { |a| a.gsub(/,\s*$/, '') }
  if @variable_assignments && @variable_assignments.any?
    if @variable_assignments.size < @variable_names.size
      # e.g., integer :: a = 1, b, c
      mask = match_data[7].gsub(/\s*=\s*/, '=').
        scan(/#{Frepl::Classifier::VARIABLE_NAME_REGEX}[=,$\z]?/).
        map { |x| x.match(/=/) ? '=' : '' }
      arr = []
      # pad var assignments array, determine correct locations
      mask.each do |m|
        if m == '='
          arr.push(@variable_assignments.shift)
        else
          arr.push('')
        end
      end
      @variable_assignments = arr
    end
    # should be something like [['a', 'b'], ['=1', '']]
    @variable_parts = [@variable_names, @variable_assignments].transpose.map do |variable_parts|
      variable_parts.join('')
    end
  else
    @variable_parts = @variable_names
  end
end