class Basic101::Program

Attributes

statements[R]

Public Class Methods

load(source_file) click to toggle source
# File lib/basic101/program.rb, line 19
def self.load(source_file)
  source = source_file.read
  parser = Parser.new
  transform = Transform.new
  tree = parser.parse(source)
  transform.apply(tree)
rescue Parslet::ParseFailed => error
  line_number, column_number =
    error.cause.source.line_and_column(error.cause.pos)
  line = source.lines[line_number - 1]
  raise SyntaxError.new(line, line_number, column_number, error.message)
end
load_file(source_path) click to toggle source
# File lib/basic101/program.rb, line 13
def self.load_file(source_path)
  File.open(source_path, 'r') do |file|
    load(file)
  end
end
new(lines = []) click to toggle source
# File lib/basic101/program.rb, line 32
def initialize(lines = [])
  @statements = []
  @line_number_index = {}
  lines.each do |line|
    @line_number_index[line.line_number] = @statements.size
    @statements += line.statements
  end
  set_statement_indices
  link_if_statements
end

Public Instance Methods

[](i) click to toggle source
# File lib/basic101/program.rb, line 47
def [](i)
  @statements[i]
end
data_items(starting_line_number = nil) click to toggle source
# File lib/basic101/program.rb, line 59
def data_items(starting_line_number = nil)
  if starting_line_number
    statements = @statements.select do |statement|
      statement.line_number >= starting_line_number
    end
  else
    statements = @statements
  end
  statements.flat_map(&:data_items)
end
index_of_line(line_number) click to toggle source
# File lib/basic101/program.rb, line 51
def index_of_line(line_number)
  index = @line_number_index[line_number]
  unless index
    raise UndefinedLineNumberError, "Undefined line number #{line_number}"
  end
  index
end
statement_count() click to toggle source
# File lib/basic101/program.rb, line 43
def statement_count
  @statements.size
end

Protected Instance Methods

state() click to toggle source
# File lib/basic101/program.rb, line 72
def state
  [@statements]
end

Private Instance Methods

set_statement_indices() click to toggle source
# File lib/basic101/program.rb, line 94
def set_statement_indices
  @statements.each.with_index do |statement, i|
    statement.index = i
  end
end