module ANTLR3::Test::GrammarManager

Constants

ANTLR_JAR
DEFAULT_COMPILE_OPTIONS

Public Class Methods

add_default_compile_option( name, value ) click to toggle source
# File lib/antlr3/test/functional.rb, line 63
def add_default_compile_option( name, value )
  DEFAULT_COMPILE_OPTIONS[ name ] = value
end

Public Instance Methods

compile( grammar, options = {} ) click to toggle source
# File lib/antlr3/test/functional.rb, line 134
def compile( grammar, options = {} )
  grammar.compile( compile_options.merge( options ) )
  import_grammar_targets( grammar )
  return grammar
end
compile_options( defaults = nil ) click to toggle source
# File lib/antlr3/test/functional.rb, line 128
def compile_options( defaults = nil )
  @compile_options ||= DEFAULT_COMPILE_OPTIONS.clone
  @compile_options.update( defaults ) if defaults
  return @compile_options
end
const_missing( name ) click to toggle source

Compile and load inline grammars on demand when their constant name is referenced in the code. This makes it easier to catch big errors quickly as test cases are run, instead of waiting a few minutes for all grammars to compile, and then discovering there’s a big dumb error ruining most of the grammars.

Calls superclass method
# File lib/antlr3/test/functional.rb, line 81
def const_missing( name )
  if g = grammars[ name.to_s ]
    compile( g )
    grammars.delete( name.to_s )
    const_get( name )
  elsif superclass.respond_to?( :grammars )
    superclass.const_missing( name )
    # ^-- for some reason, in ruby 1.9, rspec runs examples as instances of
    # anonymous subclasses, of the actual test class, which messes up the
    # assumptions made in the test code. Grammars are stored in @grammars belonging
    # to the test class, so in 1.9, this method is called with @grammars = {}
    # since it's a subclass
  else
    super
  end
end
grammar_count() click to toggle source
# File lib/antlr3/test/functional.rb, line 106
def grammar_count
  grammars.length
end
grammars() click to toggle source

An index of grammar file objects created in the test class (defined inline or loaded from a file)

# File lib/antlr3/test/functional.rb, line 102
def grammars
  @grammars ||= {}
end
inline_grammar( source, options = {} ) click to toggle source
# File lib/antlr3/test/functional.rb, line 118
def inline_grammar( source, options = {} )
  call = call_stack.find { |call| call.file != __FILE__ }
  grammar = Grammar.inline source,
              :output_directory => output_directory,
              :file => ( call.file rescue nil ),
              :line => ( call.line rescue nil )
  register_grammar( grammar )
  return grammar
end
load_grammar( name ) click to toggle source
# File lib/antlr3/test/functional.rb, line 110
def load_grammar( name )
  path = local_path( name.to_s )
  path =~ /\.g$/ or path << '.g'
  grammar = Grammar.new( path, :output_directory => output_directory )
  register_grammar( grammar )
  return grammar
end

Private Instance Methods

add_default_compile_option( name, value ) click to toggle source
# File lib/antlr3/test/functional.rb, line 63
def add_default_compile_option( name, value )
  DEFAULT_COMPILE_OPTIONS[ name ] = value
end
register_grammar( grammar ) click to toggle source
# File lib/antlr3/test/functional.rb, line 142
def register_grammar( grammar )
  name = grammar.name
  @grammars ||= {}
  
  if conflict = @grammars[ name ] and conflict.source != grammar.source
    message = "Multiple grammars exist with the name ``#{ name }''"
    raise NameError, message
  else
    @grammars[ name ] = grammar
  end
end