class ANTLR3::Main::WalkerMain

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

Attributes

lexer_class[RW]
parser_class[RW]
walker_class[RW]

Public Class Methods

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

Public Instance Methods

recognize( in_stream ) click to toggle source
# File lib/antlr3/main.rb, line 556
def recognize( in_stream )
  walker_options = {}
  if @debug
    walker_options[ :port ] = @port
    walker_options[ :log ] = @log
  end
  @lexer = @lexer_class.new( in_stream )
  @token_stream = ANTLR3::CommonTokenStream.new( @lexer )
  @parser = @parser_class.new( @token_stream )
  if result = @parser.send( @parser_rule )
    result.respond_to?( :tree ) or fail( "Parser did not return an AST for rule #@parser_rule" )
    @node_stream = ANTLR3::CommonTreeNodeStream.new( result.tree )
    @node_stream.token_stream = @token_stream
    @walker = @walker_class.new( @node_stream, walker_options )
    if result = @walker.send( @walker_rule )
      out = result.tree.inspect rescue result.inspect
      puts( out )
    else puts!( "walker.#@walker_rule returned nil" )
    end
  else puts!( "parser.#@parser_rule returned nil" )
  end
end
setup() click to toggle source

TODO: finish the Main modules

# File lib/antlr3/main.rb, line 547
def setup
  unless @lexer_class ||= fetch_class( @lexer_class_name )
    fail( "unable to locate the lexer class #@lexer_class_name" )
  end
  unless @parser_class ||= fetch_class( @parser_class_name )
    fail( "unable to locate the parser class #@parser_class_name" )
  end
end
setup_options( opt ) click to toggle source
Calls superclass method ANTLR3::Main::Options#setup_options
# File lib/antlr3/main.rb, line 496
def setup_options( opt )
  super
  
  opt.separator ''
  opt.separator "Tree Parser Configuration:"
  
  opt.on( '--lexer-name CLASS_NAME', 'full name of the lexer class to use' ) { |val| @lexer_class_name = val }
  opt.on(
    '--lexer-file PATH_TO_LIBRARY',
    'path to load to make the lexer class available'
  ) { |val|
    begin
      test( ?f, val ) ? load( val ) : require( val )
    rescue LoadError
      warn( "unable to load the library `#{ val }' specified by --lexer-file: #{ $! }" )
    end
  }
  
  opt.on(
    '--parser-name CLASS_NAME',
    'full name of the parser class to use'
  ) { |val| @parser_class_name = val }
  opt.on(
    '--parser-file PATH_TO_LIBRARY',
    'path to load to make the parser class available'
  ) { |val|
    begin
      test( ?f, val ) ? load( val ) : require( val )
    rescue LoadError
      warn( "unable to load the library specified by --parser-file: #{ $! }" )
    end
  }
  
  opt.on( '--parser-rule NAME', "name of the parser rule to use on the input" ) { |val| @parser_rule = val }
  opt.on( '--rule NAME', "name of the rule to invoke in the tree parser" ) { |val| @walker_rule = val }
  
  if @debug
    opt.separator ''
    opt.separator "Debug Mode Options:"
    
    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