#!/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