class Ascode::Parser::ConditionBlock

Attributes

block[R]

Public Class Methods

new(code, block_begin) click to toggle source
# File lib/ascode/parser/condition_block.rb, line 8
def initialize(code, block_begin)
  @code = code
  @begin = block_begin + 1

  @true = ""
  @false = ""
end

Public Instance Methods

ast_action() click to toggle source
# File lib/ascode/parser/condition_block.rb, line 69
def ast_action
  @ast = {
    action: "condition",
    true_block: @true,
    false_block: @false
  }
end
find(what) click to toggle source
# File lib/ascode/parser/condition_block.rb, line 30
def find(what)
  level = 0
  skip = 0
  @block.split("").to_enum.each_with_index do |char, index|
    if skip > 0
      skip -= 1
      next
    elsif char == "\""
      literal = Literal.new @block, index
      literal.parse
      skip = literal.length
    else
      return index if char == what && level.zero?
      level += 1 if char == "["
      level -= 1 if char == "]"
    end
  end

  -1
end
parse() click to toggle source
# File lib/ascode/parser/condition_block.rb, line 16
def parse
  @block = @code[@begin..-1]

  @end = find "]"
  raise "Unmatched '[' detected." if @end == -1

  @block = @block[0..(@end - 1)]

  @split_pos = find ":"
  split

  ast_action
end
parse_part(part) click to toggle source
# File lib/ascode/parser/condition_block.rb, line 65
def parse_part(part)
  (Main.new part, false).parse
end
split() click to toggle source
# File lib/ascode/parser/condition_block.rb, line 51
def split
  if @split_pos == -1
    @true = @block
  elsif @split_pos.zero?
    @false = @block
  else
    @true = @block[0..(@split_pos - 1)]
    @false = @block[(@split_pos + 1)..-1]
  end

  @true = parse_part(@true)
  @false = parse_part(@false)
end