#!/usr/bin/ruby # encoding: utf-8 =begin LICENSE [The "BSD licence"] Copyright (c) 2009-2010 Kyle Yetter All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. =end =begin rdoc ANTLR3 The main namespace for the ANTLR runtime libraries, which are used by Ruby-targeted recognizers generated by ANTLR. The entire library is segmented into several main components, as well as a few additional utility components, each contained within a separate script. == Library Components Not all components of the ANTLR3 library are necessary within ANTLR generated code. Some components are only used within specific types of recognizers and some are simply extra utilities for use by anyone working with ANTLR code. Thus, when requiring 'antlr3', only the essential core components are loaded immediately. The rest are configured to autoload when any of the constant names they define are referenced. The following list gives a brief introduction to each component of the ANTLR3 runtime library. The items are loosely ordered by importance. antlr3/recognizers.rb:: contains the base classes for ANTLR-generated recognizers, and thus, is one of the most important components of the runtime library. loaded by default antlr3/dfa.rb:: defines a single DFA class that is used to simulate state machines for certain decisions recognizers must make in code generated by ANTLR antlr3/streams.rb:: defines the stream classes used by ANTLR recognizers to walk sequentially through strings, tokens, and tree nodes loaded by default antlr3/token.rb:: contains all modules and classes concerned with making tokens, the chunks of text and symbol information produced by lexers and used by parsers and ASTs loaded by default antlr3/error.rb:: defines the Error module, which contains definitions for most of the many error classes used through the runtime library and ANTLR generated recognizers. loaded by default antlr3/constants.rb:: just a module used as a namespace for the named constant values used throughout the library. loaded by default antlr3/tree.rb:: contains everything pertaining to Abstract Syntax Trees (ASTs). This script is not loaded by default when 'antlr3' is required, but it is autloaded on demand when any constant defined in the script is referenced. contents are autoloaded on demand antlr3/debug.rb:: when code is generated by ANTLR using the '-debug' option, all of the additional classes and mixins required by the debug code are contained within the Debug module defined by this library. the Debug module is autoloaded on demand antlr3/main.rb:: defines the Main module. When ANTLR-generated recognizer code is run directly as a script (not loaded as a module), the code will behave as a full command-line script by using functionality implemented in the Main module. the Main module is autloaded on demand antlr3/tree-wizard.rb:: contains extra tools to easily construct ASTs by parsing descriptions written in a special DSL antlr3/dot.rb:: extra utilities to generate DOT map specifications for graphical. representations of ASTs @author Kyle Yetter =end module ANTLR3 # :stopdoc: # BEGIN PATHS -- do not modify LIBRARY_PATH = ::File.expand_path( ::File.dirname( __FILE__ ) ).freeze PROJECT_PATH = ::File.dirname( LIBRARY_PATH ).freeze DATA_PATH = ::File.join( PROJECT_PATH, 'java' ).freeze # END PATHS # :startdoc: # Returns the library path for the module. If any arguments are given, # they will be joined to the end of the libray path using # File.join. # def self.library_path( *args ) ::File.expand_path( ::File.join( LIBRARY_PATH, *args ) ) end # Returns the lpath for the module. If any arguments are given, # they will be joined to the end of the path using # File.join. # def self.data_path( *args ) ::File.expand_path( ::File.join( DATA_PATH, *args ) ) end # This is used internally in a handful of locations in the runtime library # where assumptions have been made that a condition will never happen # under normal usage conditions and thus an ANTLR3::Bug error will be # raised if the condition does occur. def self.bug!( message = nil ) bug = Bug.new( message ) bug.set_backtrace( caller ) raise( bug ) end @antlr_jar = nil def self.antlr_jar=( path ) @antlr_jar = path ? File.expand_path( path.to_s ) : path end def self.antlr_jar @antlr_jar and return( @antlr_jar ) path = data_path "antlr-full-#{ ANTLR_VERSION_STRING }.jar" if env_path = ENV[ 'RUBY_ANTLR_JAR' ] if File.file?( env_path ) then return File.expand_path( env_path ) end warn( "#{ __FILE__ }:#{ __LINE__ }: " << "ignoring environmental variable RUBY_ANTLR_JAR (=%p) " % env_path << "as it is not the path to an existing file\n" << " -> trying default jar path %p instead" % path ) end File.exists?( path ) ? path : nil end ############################################################################################## ############################### Namespace and Load Path Setup ################################ ############################################################################################## # Tree classes are only used by tree parsers or AST-building parsers # Thus, they're not essential for everything ANTLR generates and # are autoloaded on-demand autoload :AST, 'antlr3/tree' tree_classes = [ :Tree, :TreeAdaptor, :BaseTree, :BaseTreeAdaptor, :CommonTree, :CommonErrorNode, :CommonTreeAdaptor, :TreeNodeStream, :CommonTreeNodeStream, :TreeParser, :TreeVisitor, :RewriteRuleElementStream, :RewriteRuleTokenStream, :RewriteRuleSubtreeStream, :RewriteRuleNodeStream ] for klass in tree_classes autoload klass, 'antlr3/tree' end # Set up non-essential components to be loaded on-demand autoload :TokenRewriteStream, 'antlr3/streams/rewrite' autoload :FilterMode, 'antlr3/modes/filter' autoload :ASTBuilder, 'antlr3/modes/ast-builder' autoload :Main, 'antlr3/main' autoload :Debug, 'antlr3/debug' autoload :Profile, 'antlr3/profile' autoload :DOT, 'antlr3/dot' autoload :InteractiveStringStream, 'antlr3/streams/interactive' autoload :Template, 'antlr3/template' $LOAD_PATH.include?( library_path ) or $LOAD_PATH.unshift( library_path ) end # module ANTLR3 require 'set' require 'antlr3/util' require 'antlr3/version' unless $0 == 'antlr4ruby' require 'antlr3/constants' require 'antlr3/error' require 'antlr3/token' require 'antlr3/recognizers' require 'antlr3/dfa' require 'antlr3/streams' end