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