class MODL::Parser::GlobalParseContext
Each time we run the parser on a MODL
file we need to keep track of a few things so they can be made available to other areas of the code. This class is the container for that contextual information, which is gathered as the MODL::Parser:Parsed object processes the parse tree.
Attributes
interpreter_syntax_version[R]
loaded_files[R]
max_files_allowed[RW]
structures[RW]
syntax_version[RW]
Public Class Methods
new()
click to toggle source
# File lib/modl/parser/global_parse_context.rb, line 38 def initialize # This keeps track of all loaded structures from parsed files. @structures = [] # This is set to true if we encounter a *L[OAD] instruction @max_files_allowed = 2147483647 # Holds the index array from a MODL file, e.g. '?=a:b:c:d' @index = [] # Contains all pairs as they are encountered in the parsing process. @pairs = {} # Contains all defined and loaded classes for the current MODL document. @classes_by_id = {} @classes_by_name = {} # Hold the user-defined methods. @methods_hash = {} @methods_by_id = {} # Tracks the nesting depth for conditional clauses. @conditional = 0 # Defaults to 1 and can be overridden by the *version command. @syntax_version = 1 @interpreter_syntax_version = 1 @loaded_files = [] # Arrays @arrays_by_id = {} @arrays_by_name = {} end
Public Instance Methods
add_to_index(item)
click to toggle source
# File lib/modl/parser/global_parse_context.rb, line 150 def add_to_index(item) @index << item end
allow_list()
click to toggle source
# File lib/modl/parser/global_parse_context.rb, line 227 def allow_list result = {} @classes_by_id.each do |c| result[c[0]] = c[1].allow.nil? ? nil : c[1].allow.extract_hash end result end
arrays(key)
click to toggle source
# File lib/modl/parser/global_parse_context.rb, line 109 def arrays(key) if key.is_a? String result = @arrays_by_id[key] result = @arrays_by_name[key] if result.nil? result elsif key.is_a? MODLArray @arrays_by_id[key.id] = key if key.id @arrays_by_name[key.name] = key if key.name end end
assign_list()
click to toggle source
# File lib/modl/parser/global_parse_context.rb, line 211 def assign_list result = {} @classes_by_id.each do |c| result[c[0]] = c[1].assign end result end
class_list()
click to toggle source
# File lib/modl/parser/global_parse_context.rb, line 165 def class_list result = [] @classes_by_id.values.each do |clazz| new_item = {} new_item[clazz.id] = class_to_hash(clazz) result << new_item end result end
classs(key)
click to toggle source
# File lib/modl/parser/global_parse_context.rb, line 98 def classs(key) if key.is_a? String result = @classes_by_id[key] result = @classes_by_name[key] if result.nil? result elsif key.is_a? MODLClass @classes_by_id[key.id] = key if key.id @classes_by_name[key.name] = key if key.name end end
enter_condition()
click to toggle source
# File lib/modl/parser/global_parse_context.rb, line 84 def enter_condition @conditional += 1 end
exit_condition()
click to toggle source
# File lib/modl/parser/global_parse_context.rb, line 88 def exit_condition @conditional -= 1 end
file_list()
click to toggle source
# File lib/modl/parser/global_parse_context.rb, line 185 def file_list @loaded_files.dup end
freeze_max_files(plus)
click to toggle source
# File lib/modl/parser/global_parse_context.rb, line 80 def freeze_max_files(plus) @max_files_allowed = @loaded_files.length + plus end
has_array?(key)
click to toggle source
# File lib/modl/parser/global_parse_context.rb, line 142 def has_array?(key) @arrays_by_id.keys.include?(key) || @arrays_by_name.keys.include?(key) end
has_class?(key)
click to toggle source
# File lib/modl/parser/global_parse_context.rb, line 138 def has_class?(key) @classes_by_id.keys.include?(key) || @classes_by_name.keys.include?(key) end
has_pairs?()
click to toggle source
# File lib/modl/parser/global_parse_context.rb, line 134 def has_pairs? @pairs.length.positive? end
has_user_method?(key)
click to toggle source
# File lib/modl/parser/global_parse_context.rb, line 146 def has_user_method?(key) @methods_hash.keys.include?(key) end
id_list()
click to toggle source
# File lib/modl/parser/global_parse_context.rb, line 189 def id_list ids = {} ids['methods'] = @methods_by_id.keys.dup.sort! ids['classes'] = @classes_by_id.keys.dup.sort! ids end
in_condition?()
click to toggle source
# File lib/modl/parser/global_parse_context.rb, line 76 def in_condition? @conditional.positive? end
index_value(n, default)
click to toggle source
# File lib/modl/parser/global_parse_context.rb, line 70 def index_value(n, default) return default if n > @index.length @index[n] end
loaded_file(str)
click to toggle source
# File lib/modl/parser/global_parse_context.rb, line 64 def loaded_file(str) @loaded_files << str unless str.nil? raise InterpreterError, 'Cannot load multiple files after *LOAD instruction' if @loaded_files.length > @max_files_allowed end
merge_classes(other)
click to toggle source
# File lib/modl/parser/global_parse_context.rb, line 124 def merge_classes(other) @classes_by_id.merge!(other.all_classes_by_id) @classes_by_name.merge!(other.all_classes_by_name) end
merge_loaded_files(other)
click to toggle source
# File lib/modl/parser/global_parse_context.rb, line 129 def merge_loaded_files(other) @loaded_files.concat(other.loaded_files) raise InterpreterError, 'Cannot load multiple files after *LOAD instruction' if @loaded_files.length > @max_files_allowed end
merge_pairs(other)
click to toggle source
# File lib/modl/parser/global_parse_context.rb, line 120 def merge_pairs(other) @pairs.merge!(other.all_pairs) end
method_list()
click to toggle source
# File lib/modl/parser/global_parse_context.rb, line 175 def method_list result = [] @methods_by_id.values.each do |m| new_item = {} new_item[m.id] = method_to_hash(m) result << new_item end result end
name_list()
click to toggle source
# File lib/modl/parser/global_parse_context.rb, line 196 def name_list names = {} names['methods'] = @methods_hash.keys.dup.sort! names['classes'] = @classes_by_name.keys.dup.sort! names end
pair(key, val = nil)
click to toggle source
# File lib/modl/parser/global_parse_context.rb, line 92 def pair(key, val = nil) return @pairs[key] unless val @pairs[key] = val end
superclass_list()
click to toggle source
# File lib/modl/parser/global_parse_context.rb, line 203 def superclass_list result = {} @classes_by_id.each do |c| result[c[0]] = c[1].superclass end result end
transform_list()
click to toggle source
# File lib/modl/parser/global_parse_context.rb, line 219 def transform_list result = {} @methods_by_id.each do |c| result[c[0]] = c[1].transform end result end
user_method(key, val = nil)
click to toggle source
# File lib/modl/parser/global_parse_context.rb, line 154 def user_method(key, val = nil) return @methods_hash[key] unless val @methods_hash[key] = val end
user_method_id(key, val)
click to toggle source
# File lib/modl/parser/global_parse_context.rb, line 160 def user_method_id(key, val) @methods_hash[key] = val @methods_by_id[key] = val end
Protected Instance Methods
all_classes_by_id()
click to toggle source
# File lib/modl/parser/global_parse_context.rb, line 237 def all_classes_by_id @classes_by_id end
all_classes_by_name()
click to toggle source
# File lib/modl/parser/global_parse_context.rb, line 241 def all_classes_by_name @classes_by_name end
all_pairs()
click to toggle source
# File lib/modl/parser/global_parse_context.rb, line 245 def all_pairs result = {} @pairs.keys.each do |k| result[k] = @pairs[k] unless k.start_with?('*') end result end
Private Instance Methods
class_to_hash(clazz)
click to toggle source
# File lib/modl/parser/global_parse_context.rb, line 255 def class_to_hash(clazz) map = {} # name map['name'] = clazz.name # superclass map['superclass'] = clazz.superclass # assign if clazz.assign map['assign'] = clazz.assign end # allow if clazz.allow map['allow'] = clazz.allow.extract_hash end # expect if clazz.expect map['expect'] = clazz.expect.extract_hash end # content if clazz.content.length.positive? clazz.content.each do |item| map[item[0]] = item[1].extract_hash end end map end
method_to_hash(mthd)
click to toggle source
# File lib/modl/parser/global_parse_context.rb, line 288 def method_to_hash(mthd) map = {} # name map['name'] = mthd.name # superclass map['transform'] = mthd.transform map end
new_map_item(key, value)
click to toggle source
# File lib/modl/parser/global_parse_context.rb, line 299 def new_map_item(key, value) map_item = Parsed::ParsedMapItem.new(self) map_item.pair = Parsed::ParsedPair.new(self) map_item.pair.key = key map_item.pair.valueItem = Parsed::ParsedValueItem.new(self) if value.is_a? Parsed::ParsedValue map_item.pair.valueItem.value = value else map_item.pair.valueItem.value = Parsed::ParsedValue.new(self) map_item.pair.valueItem.value.primitive = Parsed::ParsedPrimitive.new(self) map_item.pair.valueItem.value.primitive = Parsed::ParsedPrimitive.new(self) map_item.pair.valueItem.value.primitive.string = Parsed::ParsedString.new(value) map_item.pair.valueItem.value.primitive.text = value map_item.pair.valueItem.value.text = value end map_item end