class ANTLR3::Main::ParserMain

A class which implements a handy test script which is executed whenever an ANTLR generated parser file is run directly from the command line.

Attributes

lexer_class[RW]
lexer_class_name[RW]
log[RW]
parser_class[RW]
parser_rule[RW]
port[RW]

Public Class Methods

new( parser_class, options = {} ) click to toggle source
Calls superclass method ANTLR3::Main::Main::new
# File lib/antlr3/main.rb, line 368
def initialize( parser_class, options = {} )
  super( options )
  @lexer_class_name = options[ :lexer_class_name ]
  @lexer_class      = options[ :lexer_class ]
  @parser_class     = parser_class
  @parser_rule = options[ :parser_rule ]
  if @debug = ( @parser_class.debug? rescue false )
    @trace = options.fetch( :trace, nil )
    @port = options.fetch( :port, ANTLR3::Debug::DEFAULT_PORT )
    @log  = options.fetch( :log, @error )
  end
  @profile = ( @parser_class.profile? rescue false )
end

Public Instance Methods

present( return_value ) click to toggle source
# File lib/antlr3/main.rb, line 457
def present( return_value )
  ASTBuilder > @parser_class and return_value = return_value.tree
  if return_value
    text = 
      begin
        require 'pp'
        return_value.pretty_inspect
      rescue LoadError, NoMethodError
        return_value.inspect
      end
    puts( text )
  end
end
recognize( in_stream ) click to toggle source
# File lib/antlr3/main.rb, line 440
def recognize( in_stream )
  parser_options = {}
  if @debug
    if @trace
      parser_options[ :debug_listener ] = ANTLR3::Debug::RuleTracer.new
    else
      parser_options[ :port ] = @port
      parser_options[ :log ]  = @log
    end
  end
  lexer = @lexer_class.new( in_stream )
  # token_stream = CommonTokenStream.new( lexer )
  parser = @parser_class.new( lexer, parser_options )
  result = parser.send( @parser_rule ) and present( result )
  @profile and puts( parser.profile.generate_report )
end
setup() click to toggle source
# File lib/antlr3/main.rb, line 422
  def setup
    unless @lexer_class ||= fetch_class( @lexer_class_name )
      if @lexer_class_name
        fail( "unable to locate the lexer class ``#@lexer_class_name''" )
      else
        unless @lexer_class = @parser_class.associated_lexer
          fail( doc( <<-END ) )
          | no lexer class has been specified with the --lexer-name option
          | and #@parser_class does not appear to have an associated
          | lexer class
          END
        end
      end
    end
    @parser_rule ||= @parser_class.default_rule or
      fail( "a parser rule name must be specified via --rule NAME" )
  end
setup_options( opt ) click to toggle source
Calls superclass method ANTLR3::Main::Options#setup_options
# File lib/antlr3/main.rb, line 382
def setup_options( opt )
  super
  
  opt.separator ""
  opt.separator( "Parser Configuration:" )
  
  opt.on( '--lexer-name CLASS_NAME', "name of the lexer class to use" ) { |val|
    @lexer_class_name = val
    @lexer_class = nil
  }
  
  opt.on( '--lexer-file PATH_TO_LIBRARY', "path to library defining the lexer class" ) { |val|
    begin
      test( ?f, val ) ? load( val ) : require( val )
    rescue LoadError
      warn( "unable to load the library specified by --lexer-file: #{ $! }" )
    end
  }
  
  opt.on( '--rule NAME', "name of the parser rule to execute" ) { |val| @parser_rule = val }
  
  if @debug
    opt.separator ''
    opt.separator "Debug Mode Options:"
    
    opt.on( '--trace', '-t', "print rule trace instead of opening a debug socket" ) do
      @trace = true
    end
    
    opt.on( '--port NUMBER', Integer, "port number to use for the debug socket" ) do |number|
      @port = number
    end
    
    opt.on( '--log PATH', "path of file to use to record socket activity",
           "(stderr by default)" ) do |path|
      @log = open( path, 'w' )
    end
  end
end