1#!/usr/bin/ruby
2# encoding: utf-8
3
4=begin LICENSE
5
6[The "BSD licence"]
7Copyright (c) 2009-2010 Kyle Yetter
8All rights reserved.
9
10Redistribution and use in source and binary forms, with or without
11modification, are permitted provided that the following conditions
12are met:
13
14 1. Redistributions of source code must retain the above copyright
15    notice, this list of conditions and the following disclaimer.
16 2. Redistributions in binary form must reproduce the above copyright
17    notice, this list of conditions and the following disclaimer in the
18    documentation and/or other materials provided with the distribution.
19 3. The name of the author may not be used to endorse or promote products
20    derived from this software without specific prior written permission.
21
22THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32
33=end
34
35=begin rdoc ANTLR3
36
37The main namespace for the ANTLR runtime libraries, which are used by
38Ruby-targeted recognizers generated by ANTLR. The entire library is segmented
39into several main components, as well as a few additional utility components,
40each contained within a separate script.
41
42== Library Components
43
44Not all components of the ANTLR3 library are necessary within ANTLR generated
45code. Some components are only used within specific types of recognizers and
46some are simply extra utilities for use by anyone working with ANTLR code. Thus,
47when requiring 'antlr3', only the essential core components are loaded
48immediately. The rest are configured to autoload when any of the constant names
49they define are referenced.
50
51The following list gives a brief introduction to each component of the ANTLR3
52runtime library. The items are loosely ordered by importance.
53
54antlr3/recognizers.rb::
55  contains the base classes for ANTLR-generated recognizers, and thus, is one of
56  the most important components of the runtime library. loaded by default
57antlr3/dfa.rb::
58  defines a single DFA class that is used to simulate state machines for certain
59  decisions recognizers must make in code generated by ANTLR
60antlr3/streams.rb::
61  defines the stream classes used by ANTLR recognizers to walk sequentially
62  through strings, tokens, and tree nodes loaded by default
63antlr3/token.rb::
64  contains all modules and classes concerned with making tokens, the chunks of
65  text and symbol information produced by lexers and used by parsers and ASTs
66  loaded by default
67antlr3/error.rb::
68  defines the Error module, which contains definitions for most of the many
69  error classes used through the runtime library and ANTLR generated
70  recognizers. loaded by default
71antlr3/constants.rb::
72  just a module used as a namespace for the named constant values used
73  throughout the library. loaded by default
74antlr3/tree.rb::
75  contains everything pertaining to Abstract Syntax Trees (ASTs). This script is
76  not loaded by default when 'antlr3' is required, but it is autloaded on demand
77  when any constant defined in the script is referenced. contents are autoloaded
78  on demand
79antlr3/debug.rb::
80  when code is generated by ANTLR using the '-debug' option, all of the
81  additional classes and mixins required by the debug code are contained within
82  the Debug module defined by this library. the Debug module is autoloaded on
83  demand
84antlr3/main.rb::
85  defines the Main module. When ANTLR-generated recognizer code is run directly
86  as a script (not loaded as a module), the code will behave as a full
87  command-line script by using functionality implemented in the Main module. the
88  Main module is autloaded on demand
89antlr3/tree-wizard.rb::
90  contains extra tools to easily construct ASTs by parsing descriptions written
91  in a special DSL
92antlr3/dot.rb::
93  extra utilities to generate DOT map specifications for graphical.
94  representations of ASTs
95
96@author Kyle Yetter
97
98=end
99
100module ANTLR3
101
102  # :stopdoc:
103  # BEGIN PATHS -- do not modify
104
105  LIBRARY_PATH  = ::File.expand_path( ::File.dirname( __FILE__ ) ).freeze
106  PROJECT_PATH  = ::File.dirname( LIBRARY_PATH ).freeze
107  DATA_PATH     = ::File.join( PROJECT_PATH, 'java' ).freeze
108
109  # END PATHS
110  # :startdoc:
111
112  # Returns the library path for the module. If any arguments are given,
113  # they will be joined to the end of the libray path using
114  # <tt>File.join</tt>.
115  #
116  def self.library_path( *args )
117    ::File.expand_path( ::File.join( LIBRARY_PATH, *args ) )
118  end
119
120  # Returns the lpath for the module. If any arguments are given,
121  # they will be joined to the end of the path using
122  # <tt>File.join</tt>.
123  #
124  def self.data_path( *args )
125    ::File.expand_path( ::File.join( DATA_PATH, *args ) )
126  end
127
128  # This is used internally in a handful of locations in the runtime library
129  # where assumptions have been made that a condition will never happen
130  # under normal usage conditions and thus an ANTLR3::Bug error will be
131  # raised if the condition does occur.
132  def self.bug!( message = nil )
133    bug = Bug.new( message )
134    bug.set_backtrace( caller )
135    raise( bug )
136  end
137
138  @antlr_jar = nil
139
140  def self.antlr_jar=( path )
141    @antlr_jar = path ? File.expand_path( path.to_s ) : path
142  end
143
144  def self.antlr_jar
145    @antlr_jar and return( @antlr_jar )
146
147    path = data_path "antlr-full-#{ ANTLR_VERSION_STRING }.jar"
148    if env_path = ENV[ 'RUBY_ANTLR_JAR' ]
149      if File.file?( env_path ) then return File.expand_path( env_path ) end
150
151      warn(
152        "#{ __FILE__ }:#{ __LINE__ }: " <<
153        "ignoring environmental variable RUBY_ANTLR_JAR (=%p) " % env_path <<
154        "as it is not the path to an existing file\n" <<
155        "  -> trying default jar path %p instead" % path
156      )
157    end
158
159    File.exists?( path ) ? path : nil
160  end
161
162  ##############################################################################################
163  ############################### Namespace and Load Path Setup ################################
164  ##############################################################################################
165
166  # Tree classes are only used by tree parsers or AST-building parsers
167  # Thus, they're not essential for everything ANTLR generates and
168  # are autoloaded on-demand
169  autoload :AST, 'antlr3/tree'
170
171  tree_classes = [
172    :Tree, :TreeAdaptor, :BaseTree, :BaseTreeAdaptor,
173    :CommonTree, :CommonErrorNode, :CommonTreeAdaptor,
174    :TreeNodeStream, :CommonTreeNodeStream, :TreeParser,
175    :TreeVisitor, :RewriteRuleElementStream,
176    :RewriteRuleTokenStream, :RewriteRuleSubtreeStream,
177    :RewriteRuleNodeStream
178  ]
179
180  for klass in tree_classes
181    autoload klass, 'antlr3/tree'
182  end
183
184  # Set up non-essential components to be loaded on-demand
185  autoload :TokenRewriteStream, 'antlr3/streams/rewrite'
186  autoload :FilterMode, 'antlr3/modes/filter'
187  autoload :ASTBuilder, 'antlr3/modes/ast-builder'
188  autoload :Main,  'antlr3/main'
189  autoload :Debug, 'antlr3/debug'
190  autoload :Profile, 'antlr3/profile'
191  autoload :DOT, 'antlr3/dot'
192  autoload :InteractiveStringStream, 'antlr3/streams/interactive'
193
194  autoload :Template, 'antlr3/template'
195
196  $LOAD_PATH.include?( library_path ) or $LOAD_PATH.unshift( library_path )
197
198end  # module ANTLR3
199
200
201require 'set'
202require 'antlr3/util'
203require 'antlr3/version'
204
205unless $0 == 'antlr4ruby'
206  require 'antlr3/constants'
207  require 'antlr3/error'
208  require 'antlr3/token'
209  require 'antlr3/recognizers'
210  require 'antlr3/dfa'
211  require 'antlr3/streams'
212end
213