diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..cceb80d
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,30 @@
+# Maven build folders
+target/
+
+# IntelliJ project files
+*.iml
+*.ipr
+*.iws
+.idea/
+
+# Eclipse project files
+.project
+.classpath
+.settings/
+
+# NetBeans user configuration
+nbactions.xml
+nb-configuration.xml
+
+# Python runtime files
+*.py[co]
+
+# ANTLR C# target build folders
+/runtime/CSharp3/Sources/Antlr3.Runtime/bin/
+/runtime/CSharp3/Sources/Antlr3.Runtime/obj/
+/runtime/CSharp3/Sources/Antlr3.Runtime.Debug/bin/
+/runtime/CSharp3/Sources/Antlr3.Runtime.Debug/obj/
+/runtime/CSharp3/Sources/Antlr3.Runtime.JavaExtensions/bin/
+/runtime/CSharp3/Sources/Antlr3.Runtime.JavaExtensions/obj/
+/runtime/CSharp3/Sources/Antlr3.Runtime.Test/bin/
+/runtime/CSharp3/Sources/Antlr3.Runtime.Test/obj/
diff --git a/BUILD.txt b/BUILD.txt
index f6e41c3..d0d1b16 100644
--- a/BUILD.txt
+++ b/BUILD.txt
@@ -1,493 +1,6 @@
- [The "BSD license"]
- Copyright (c) 2010 Terence Parr
- Maven Plugin - Copyright (c) 2009      Jim Idle
+We have moved instructions for building ANTLR with the maven build system to:
 
- All rights reserved.
+http://www.antlr.org/wiki/display/ANTLR3/Building+ANTLR+with+Maven
 
- 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.
-
-============================================================================
-
-This file contains the build instructions for the ANTLR toolset as
-of version 3.1.3 and beyond.
-
-The ANTLR toolset must be built using the Maven build system as
-this build system updates the version numbers and controls the
-whole build process. However, if you just want the latest build
-and do not care to learn anything about Maven, then visit the 'target'
-directories (for jars) under the depot mirror root here:
-
-   http://antlr.org/depot
-
-If you are looking for the latest released version of ANTLR, then
-visit the downloads page on the main antlr.org website.
-
-These instructions are mainly for the ANTLR development team,
-though you are free to build ANTLR yourself of course.
-
-Source code Structure
------------------------
-
-The main development branch of ANTLR is stored within the Perforce SCM at:
-
-   //depot/code/antlr/main/...
-
-release branches are stored in Perforce like so:
-
-   //depot/code/antlr/release-3.1.3/...
-
-In this top level directory, you will find a master build file for
-Maven called pom.xml and you will also note that there are a number of
-subdirectories:
-
- tool                  - The ANTLR tool itself
- runtime/Java          - The ANTLR Java runtime
- runtime/X             - The runtime for language target X
- gunit                 - The grammar test tool
- antlr3-maven-plugin   - The plugin tool for Maven allowing Maven
- 		          projects to process ANTLR grammars.
-
-Each of these sub-directories also contains a file pom.xml that
-controls the build of each sub-component (or module in Maven
-parlance).
-
-Build Parameters
------------------
-
-Alongside each pom.xml (other than for the antlr3-maven-plugin), you
-will see that there is a file called antlr.config. This file is called
-a filter and should contain a set of key/value pairs in the same
-manner as Java properties files:
-
-antlr.something="Some config thang!"
-
-When the build of any component happens, any values in the
-antlr.config for the master build file and any values in the
-antlr.config file for each component are made available to the
-build. This is mainly used by the resource processor, which will
-filter any file it finds under: src/main/resources/** and replace any
-references such as ${antlr.something} with the actual value at the
-time of the build.
-
-Building
---------
-
-Building ANTLR is trivial, assuming that you have loaded Maven version
-3.0.3 or better on to your build system and installed it as explained
-here:
-
-http://maven.apache.org/download.html
-
-Note that the ANTLR toolset will ONLY build with version 3.0.3 of Maven
-as of release 3.4.
-
-If you are unfamiliar with Maven (and even if you are), the best
-resource for learning about it is The Definitive Guide:
-
-http://www.sonatype.com/books/maven-book/reference/public-book.html
-
-The instructions here assume that Maven is installed and working correctly.
-
-If this is the first time you have built the ANTLR toolset, you will
-possibly need to install the master pom in your local repository
-(however the build may be able to locate this in the ANTLR snapshot or
-release repository). If you try to build sub-modules on their own (as
-in run the mvn command in the sub directory for that tool, such as
-runtime/Java), and you receive a message that maven cannot find the
-master pom, then execute this in the main (or release) directory:
-
-mvn -N install
-
-This command will install the master build pom in your local maven
-repository (it's ~/.m2 on UNIX) and individual builds of sub-modules
-will now work correctly.
-
-To build then, simply cd into the master build directory
-(e.g. $P4ROOT//code/antlr/main) and type:
-
-mvn -Dmaven.test.skip=true
-
-Assuming that everything is correctly installed and synchronized, then
-ANTLR will build and skip any unit tests in the modules (the ANTLR
-tool tests can take a long time).
-
-This command will build each of the tools in the correct order and
-will create the jar artifacts of all the components in your local
-development Maven repository (which takes precedence over remote
-repositories by default). At the end of the build you should see:
-
-[INFO] ------------------------------------------------------------------------
-[INFO] Reactor Summary:
-[INFO] ------------------------------------------------------------------------
-[INFO] ANTLR Master build control POM ........................ SUCCESS [1.373s]
-[INFO] Antlr 3 Runtime ....................................... SUCCESS [0.879s]
-[INFO] ANTLR Grammar Tool .................................... SUCCESS [5.431s]
-[INFO] Maven plugin for ANTLR V3 ............................. SUCCESS [1.277s]
-[INFO] ANTLR gUnit ........................................... SUCCESS [1.566s]
-[INFO] Maven plugin for gUnit ANTLR V3 ....................... SUCCESS [0.079s]
-[INFO] ------------------------------------------------------------------------
-[INFO] ------------------------------------------------------------------------
-[INFO] BUILD SUCCESSFUL
-[INFO] ------------------------------------------------------------------------
-[INFO] Total time: 11 seconds
-
-However, unless you are using Maven exclusively in your projects, you
-will most likely want to build the ANTLR Uber Jar, which is an
-executable jar containing all the components that ANTLR needs to build
-and run parsers (note that at runtime, you need only the runtime
-components you use, such as the Java runtime and say stringtemplate).
-
-Because the Uber jar is not something we want to deploy to Maven
-repositories it is built with a special invocation of Maven:
-
-mvn -Dmaven.test.skip=true package assembly:assembly
-
-Note that Maven will appear to build everything twice, which is a
-quirk of how it calculates the dependencies and makes sure it has
-everything packaged up so it can build the uber-jar assembly.
-
-Somewhere in the build output (towards the end), you will find a line
-like this:
-
-[INFO] Building jar: /home/jimi/antlrsrc/code/antlr/main/target/antlr-master-3.4-SNAPSHOT-completejar.jar
-
-This is the executable jar that you need and you can either copy it
-somewhere or, like me, you can create this script (assuming UNIX)
-somewhere in your PATH:
-
-#! /bin/bash
-java -jar ~/antlrsrc/code/antlr/main/target/antlr-master-3.4-SNAPSHOT-completejar.jar $*
-
-Version Numbering
--------------------
-
-The first and Golden rule is that any pom files stored under the main
-branch of the toolset should never be modified to contain a release
-version number. They should always contain a.b.c-SNAPSHOT
-(e.g. 3.1.3-SNAPSHOT). Only release branches should have their pom
-version numbers set to a release version. You can release as many
-SNAPSHOTS as you like, but only one release version. However, release
-versions may be updated with a patch level: 3.1.3-1, 3.1.3-2 and so
-on.
-
-Fortunately, Maven helps us with the version numbering in a number of
-ways. Firstly, the pom.xml files for the various modules do not
-specify a version of the artifacts themselves. They pick up their
-version number from the master build pom.  However, there is a catch,
-because they need to know what version of the parent pom they inherit
-from and so they DO mention the version number. However, this does
-prevent accidentally releasing different versions of sub-modules than
-the master pom describes.
-
-Fortunately once again, Maven has a neat way of helping us change the
-version.  All you need do is check out all the pom.xml files from
-perforce, then modify the <version>a.b.c-SNAPSHOT</version> in the
-master pom. When the version number is correct in the master pom, you
-make sure your working directory is the location of the master pom and
-type:
-
-mvn versions:update-child-modules
-
-This command will then update the child pom.xml files to reflect the
-version number defined in the master pom.xml.
-
-There is unfortunately one last catch here though and that is that the
-antlr3-maven-plugin and the gunit-maven-plugin are not able to use the
-parent pom. The reason for this is subtle but makes sense as doing so
-would create a circular dependency between the ANTLR tool (which uses
-the plugin to build its own grammar files), and the plugins (which
-uses the tool to build grammar files and gunit to test).
-
-This catch-22 situation means that the pom.xml file in the
-antlr3-maven-plugin directory and the one in the gunit-maven-plugin
-directory MUST be updated manually (or we must write a script to do
-this).
-
-Finally, we need to remember that because the tool is dependent on the
-antlr3-maven-plugin and the plugin is itself dependent on the
-tool, that we must manually update the versions of each that they
-reference. So, when we bump the version of the toolset to say
-3.1.4-SNAPSHOT, we need to change the antlr3-maven-plugin pom.xml and
-the gunit-maven-plugin pom.xml to reference that version of the antlr
-tool. The tool itself is always built with the prior released version
-of the plugin, so when we release we must change the main branch of
-the plugin to use the newly released version of the plugin. This is
-covered in the release checklist.
-
-Deploying
-----------
-
-Deploying the tools at the current version is relatively easy, but to
-deploy to the ANTLR repositories (snapshot or release) you must have
-been granted access to the Sonatype OSS repositories' ANTLR login. 
-Few people will have this access of course.
-
-Next, because we do not publish access information for antlr.org, you
-will need to configure the repository server names locally. You do
-this by creating (or adding to) the file:
-
-~/.m2/settings.xml
-
-Which should look like this:
-
-<?xml version="1.0" encoding="UTF-8"?>
-<settings>
-  <servers>
-    <server>
-      <id>sonatype-nexus-snapshots</id>
-      <username>xxxxxxx</username>
-      <password>xxxxxxx</password>
-    </server>
-    <server>
-      <id>sonatype-nexus-staging</id>
-      <username>xxxxxxx</username>
-      <password>xxxxxxx</password>
-    </server>
-  </servers>
-</settings>
-
-When this configuration is in place, you will be able to deploy the components,
-either individually or from the master directory:
-
-mvn -Dmaven.test.skip=true -Ddeplot deploy
-
-You will then see lots of information about checking existing version
-information and so on, and the components will be deployed once you
-supply the ANTLR public key passphrase to sign the jars.
-
-Note that so long as the artifacts are versioned with a.b.c-SNAPSHOT
-then deployment will always be to the development snapshot
-directory. When the artifacts are versioned with a release version
-then deployment will be to the release stahinh repository, which
-will then be mirrored around the world if closed and release.
-The sonatype documentation should be consulted.
-
-Release Checklist
-------------------
-
-Here is the procedure to use to make a release of ANTLR. Note that we
-should really use the mvn release:release command, but the perforce
-plugin for Maven is not commercial quality and I want to rewrite it.
-
-For this checklist, let's assume that the current development version
-of ANTLR is 3.1.3-SNAPSHOT. This means that it will probably (but not
-necessarily) become release version 3.1.3 and that the development
-version will bump to 3.1.4-SNAPSHOT.
-
-0) Run a build of the main branch and check that it is builds and
-   passes as many tests as you want it to.
-
-1) First make a branch from main into the target release
-   directory. Then submit this to perforce. You could change versions
-   numbers before submitting, but doing that in separate stages will
-   keep things sane;
-
---- Use main development branch from here ---
-
-2) Before we deploy the release, we want to update the versions of the
-   development branch, so we don't deploy what is now the new release
-   as an older snapshot (this is not super important, but procedure is
-   good right?).
-
-   Check out all the pom.xml files (and if you are using any
-   antlr.config parameters that must change, then do that too).
-
-3) Edit the master pom.xml in the main directory and change the version from
-   3.1.3-SNAPSHOT to 3.1.4-SNAPSHOT.
-
-4) Edit the pom.xml file for antlr3-maven-plugin under the main
-   directory and change the version from 3.1.3-SNAPSHOT to
-   3.1.4-SNAPSHOT. Do the same for the pom.xml in the
-   gunit-maven-plugin directory.
-
-   Update the pom.xml for the archetype manually too.
-
-5) Now (from the main directory), run the command:
-
-         mvn versions:update-child-modules
-
-      You should see:
-
-         [INFO] [versions:update-child-modules]
-         [INFO] Module: gunit
-         [INFO]   Parent is org.antlr:antlr-master:3.1.4-SNAPSHOT
-         [INFO] Module: runtime/Java
-         [INFO]   Parent is org.antlr:antlr-master:3.1.4-SNAPSHOT
-         [INFO] Module: tool
-         [INFO]   Parent is org.antlr:antlr-master:3.1.4-SNAPSHOT
-
-6) Run a build of the main branch:
-
-         mvn -Dmaven.test.skip=true
-
-       All should be good.
-
-7) Submit the pom changes of the main branch to perforce.
-
-8) Deploy the new snapshot as a placeholder for the next release. It
-   will go to the snapshot repository of course:
-
-	  mvn -N deploy
-          mvn -Dmaven.test.skip=true deploy
-
-9) You are now finished with the main development branch and should change
-   working directories to the release branch you made earlier.
-
---- Use release branch from here ---
-
-10) Check out all the pom.xml files in the release branch (and if you are
-    using any antlr.config parameters that must change, then do that too).
-
-11) Edit the master pom.xml in the release-3.1.3 directory and change
-    the version from 3.1.3-SNAPSHOT to 3.1.3.
-
-12) Edit the pom.xml file for antlr3-maven-plugin under the
-    release-3.1.3 directory and change the version from 3.1.3-SNAPSHOT
-    to 3.1.3. Also change the version of the tool that the this
-    pom.xml references from 3.1.3-SNAPSHOT to 3.1.3 as we are now
-    releasing the plugin of course and it needs to reference the
-    version we are about to release. You will find this reference in
-    the dependencies section of the antlr3-maven-plugin pom.xml. Also
-    change the version references in the pom for gunit-maven-plugin.
-
-13)  Now (from the release-3.1.3 directory), run the command:
-
-           mvn versions:update-child-modules
-
-        You should see:
-
-	[INFO] [versions:update-child-modules]
-	[INFO] Module: gunit
-	[INFO]   Parent was org.antlr:antlr-master:3.1.3-SNAPSHOT,
-	       now org.antlr:antlr-master:3.1.3
-	[INFO] Module: runtime/Java
-	[INFO]   Parent was org.antlr:antlr-master:3.1.3-SNAPSHOT,
-	       now org.antlr:antlr-master:3.1.3
-	[INFO] Module: tool
-	[INFO]   Parent was org.antlr:antlr-master:3.1.3-SNAPSHOT,
-	       now org.antlr:antlr-master:3.1.3
-
-14)  Run a build of the release-3.1.3 branch:
-
-           mvn   # Note I am letting unit tests run here!
-
-        All should be good, or as good as it gets ;-)
-
-15)  Submit the pom changes of the release-3.1.3 branch to perforce.
-
-16)  Deploy the new release (this is it guys, make sure you are happy):
-
-	  mvn -N deploy
-          mvn -Dmaven.test.skip=true deploy
-
-        Note that we must skip the tests as Maven will not let you
-        deploy releases that fail any junit tests.
-
-17) The final step is that we must update the main branch pom.xml for
-     the tool to reference the newly release version of the
-     antlr3-maven-plugin. This is because each release of ANTLR is
-     built with the prior release of ANTLR, and we have just released
-     a new version. Edit the pom.xml for the tool (main/tool/pom.xml)
-     under the main (that's the MAIN branch, not the release branch)
-     and find the dependency reference to the antlr plugin. If you
-     just released say 3.1.3, then the tool should now reference
-     version 3.1.3 of the plugin. Having done this, you should
-     probably rebuild the main branch and let it run the junit
-     tests. Later, I will automate this dependency update as mvn can
-     do this for us.
-
-18)  Having deployed the release to maven, you will want to create the
-     uber jar for the new release, to make it downloadable from the
-     antlr.org website. This is a repeat of the earlier described step
-     to build the uber jar:
-
-       mvn -Dmaven.test.skip=true package assembly:assembly
-
-     MAven will produce the uber jar in the target directory:
-
-	antlr-master-3.1.3-completejar.jar
-
-     And this is the complete jar that can be downloaded from the web site. You
-     may wish to produce an md5 checksum to go with the jar:
-
-     md5sum target/antlr-master-3.1.3-completejar.jar
-     xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  target/antlr-master-3.1.4-SNAPSHOT-completejar.jar
-
-     The command you just ran will also produce a second jar:
-
-        antlr-master-3.1.3-src.jar
-
-     This is the source code for everythign you just deployed and can
-     be unjarred and built from scratch using the very procedures
-     described here, which means you will now be reading this
-     BUILD.txt file for ever.
-
-19)  Reward anyone around you with good beer.
-
-
-Miscellany
------------
-
-It was a little tricky to get all the interdependencies correct
-because ANTLR builds itself using itself and the maven plugin
-references the ANTLR Tool as well. Hence the maven tool is not a child
-project of the master pom.xml file, even though it is built by it.
-
-An observant person will not that when the assembly:assembly phase is
-run, that it invokes the build of the ANTLR tool using the version of
-the Maven plugin that it has just built, and this results in the
-plugin using the version of ANTLR tool that it has just built. This is
-safe because everything will already be up to date and so we package
-up the version of the tool that we expect, but the Maven plugin we
-deploy will use the correct version of ANTLR, even though there is
-technically a circular dependency.
-
-The master pom.xml does give us a way to cause the build of the ANTLR
-tool to use itself to build itself. This is because in
-dependencyManagement in the master pom.xml, we can reference the
-current version of the Tool and the Maven plugin, even though in the
-pom.xml for the tool itself refers to the previous version of the
-plugin.
-
-What happens is that if we first cd into the tool and maven
-directories and build ANTLR, it will build itself with the prior
-version and this will deploy locally (.m2). We can then clean build
-from the master pom and when ANTLR asks for the prior version of the
-tool, the master pom.xml will override it and build with the interim
-versions we just built manually.
-
-However, strictly speaking, we need a third build where we rebuild the
-tool again with the version of the tool that was built with itself and
-not deploy the version that was built by the version of itself that
-was built by a prior version of itself. I decided that this was not
-particularly useful and complicates things too much. Building with a
-prior version of the tool is fine and if there was ever a need to, we
-could release twice in quick succession.
-
-I have occasionally seen the MAven reactor screw up (or perhaps it is
-the ANTLR tool) when building. If this happens you will see an ANTLR
-Panic - cannot find en.stg message. If this happens to you, then just
-rerun the build and it will eventually work.
-
-Jim Idle - March 2009
-
+The notes are by Jim Idle (and are a bit out of date but we hope to
+update them).
diff --git a/METADATA b/METADATA
index 377e0f8..a19780f 100644
--- a/METADATA
+++ b/METADATA
@@ -1,7 +1,5 @@
 name: "antlr3"
-description:
-    "ANTLR (ANother Tool for Language Recognition) is a language tool that provides a framework for constructing recognizers, interpreters, compilers, and translators from grammatical descriptions containing actions in a variety of target languages."
-
+description: "ANTLR (ANother Tool for Language Recognition) is a language tool that provides a framework for constructing recognizers, interpreters, compilers, and translators from grammatical descriptions containing actions in a variety of target languages."
 third_party {
   url {
     type: HOMEPAGE
@@ -9,8 +7,12 @@
   }
   url {
     type: ARCHIVE
-    value: "https://github.com/antlr/antlr3/archive/antlr-3.4.zip"
+    value: "https://github.com/antlr/antlr3/archive/3.5.2.zip"
   }
-  version: "3.4"
-  last_upgrade_date { year: 2011 month: 11 day: 15 }
+  version: "3.5.2"
+  last_upgrade_date {
+    year: 2018
+    month: 8
+    day: 28
+  }
 }
diff --git a/README.txt b/README.txt
new file mode 100644
index 0000000..c2fa6c4
--- /dev/null
+++ b/README.txt
@@ -0,0 +1,142 @@
+ANTLR v3.5
+January 4, 2013
+
+Terence Parr, parrt at cs usfca edu
+ANTLR project lead and supreme dictator for life
+University of San Francisco
+
+INTRODUCTION
+
+Welcome to ANTLR v3!  ANTLR (ANother Tool for Language Recognition) is
+a language tool that provides a framework for constructing
+recognizers, interpreters, compilers, and translators from grammatical
+descriptions containing actions in a variety of target
+languages. ANTLR provides excellent support for tree construction,
+tree walking, translation, error recovery, and error reporting. I've
+been working on parser generators for 25 years and on this particular
+version of ANTLR for 9 years.
+
+You should use v3 in conjunction with ANTLRWorks:
+
+    http://www.antlr.org/works/index.html
+
+and gUnit (grammar unit testing tool included in distribution):
+
+    http://www.antlr.org/wiki/display/ANTLR3/gUnit+-+Grammar+Unit+Testing
+
+The book will also help you a great deal (printed May 15, 2007); you
+can also buy the PDF:
+
+    http://www.pragmaticprogrammer.com/titles/tpantlr/index.html
+
+2nd book, Language Implementation Patterns:
+
+    http://pragprog.com/titles/tpdsl/language-implementation-patterns
+
+See the getting started document:
+
+    http://www.antlr.org/wiki/display/ANTLR3/FAQ+-+Getting+Started
+
+You also have the examples plus the source to guide you.
+
+See the wiki FAQ:
+
+    http://www.antlr.org/wiki/display/ANTLR3/ANTLR+v3+FAQ
+
+and general doc root:
+
+    http://www.antlr.org/wiki/display/ANTLR3/ANTLR+3+Wiki+Home
+
+Please help add/update FAQ entries.
+
+If all else fails, you can buy support or ask the antlr-interest list:
+
+    http://www.antlr.org/support.html
+
+Per the license in LICENSE.txt, this software is not guaranteed to
+work and might even destroy all life on this planet:
+
+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.
+
+----------------------------------------------------------------------
+
+EXAMPLES
+
+ANTLR v3 sample grammars:
+
+    https://github.com/antlr/examples-v3
+
+Examples from Language Implementation Patterns:
+
+    http://www.pragprog.com/titles/tpdsl/source_code
+
+----------------------------------------------------------------------
+
+What is ANTLR?
+
+ANTLR stands for (AN)other (T)ool for (L)anguage (R)ecognition
+and generates LL(*) recursive-descent parsers. ANTLR is a language tool
+that provides a framework for constructing recognizers, compilers, and
+translators from grammatical descriptions containing actions.
+Target language list:
+
+http://www.antlr.org/wiki/display/ANTLR3/Code+Generation+Targets
+
+----------------------------------------------------------------------
+
+How is ANTLR v3 different than ANTLR v2?
+
+See "What is the difference between ANTLR v2 and v3?"
+
+    http://www.antlr.org/wiki/pages/viewpage.action?pageId=719
+
+See migration guide:
+
+    http://www.antlr.org/wiki/display/ANTLR3/Migrating+from+ANTLR+2+to+ANTLR+3
+
+----------------------------------------------------------------------
+
+How do I install this damn thing?
+
+You will have grabbed either of these:
+
+	http://antlr.org/download/antlr-3.5-complete-no-st3.jar
+	http://antlr.org/download/antlr-3.5-complete.jar
+
+It has all of the jars you need combined into one. Then you need to
+add antlr-3.5-complete.jar to your CLASSPATH or add to arg list; e.g., on unix:
+
+$ java -cp "/usr/local/lib/antlr-3.5-complete.jar:$CLASSPATH" org.antlr.Tool Test.g
+
+Source + java binaries: Just untar antlr-3.5.tar.gz and you'll get:
+
+antlr-3.5/BUILD.txt
+antlr-3.5/antlr3-maven-plugin
+antlr-3.5/antlrjar.xml
+antlr-3.5/antlrsources.xml
+antlr-3.5/gunit
+antlr-3.5/gunit-maven-plugin
+antlr-3.5/pom.xml
+antlr-3.5/runtime
+antlr-3.5/tool
+antlr-3.5/lib
+
+Please see the FAQ
+
+    http://www.antlr.org/wiki/display/ANTLR3/ANTLR+v3+FAQ
+
+-------------------------
+
+How can I contribute to ANTLR v3?
+
+http://www.antlr.org/wiki/pages/viewpage.action?pageId=33947666
diff --git a/README.version b/README.version
deleted file mode 100644
index 7270f7b..0000000
--- a/README.version
+++ /dev/null
@@ -1,3 +0,0 @@
-URL: https://github.com/antlr/website-antlr3/raw/gh-pages/download/antlr-3.4.tar.gz
-Version: 3.4
-BugComponent: 99142
diff --git a/antlr-complete/antlr.config b/antlr-complete/antlr.config
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/antlr-complete/antlr.config
diff --git a/antlr-complete/pom.xml b/antlr-complete/pom.xml
new file mode 100644
index 0000000..aad3c68
--- /dev/null
+++ b/antlr-complete/pom.xml
@@ -0,0 +1,137 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>antlr-complete</artifactId>
+    <packaging>jar</packaging>
+
+    <name>ANTLR 3 Complete</name>
+    <description>Complete distribution for ANTLR 3</description>
+
+  <!--
+
+    Inherit from the ANTLR master pom, which tells us what
+    version we are and allows us to inherit dependencies
+    and so on.
+
+    -->
+    <parent>
+        <groupId>org.antlr</groupId>
+        <artifactId>antlr-master</artifactId>
+        <version>3.5.2</version>
+    </parent>
+
+    <url>http://antlr.org/</url>
+
+    <!--
+        The complete distribution includes the following modules and their dependencies:
+            ANTLR 3 Tool
+            ANTLR 3 Runtime
+            gUnit for ANTLR 3
+            StringTemplate 4 (dependency of code generator in the ANTLR 3 Tool)
+            StringTemplate 3 (dependency of grammars with output=template)
+            ANTLR 2.7.7 (dependency of template parser in StringTemplate 3)
+    -->
+    <dependencies>
+
+        <dependency>
+            <groupId>org.antlr</groupId>
+            <artifactId>antlr</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.antlr</groupId>
+            <artifactId>antlr-runtime</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.antlr</groupId>
+            <artifactId>gunit</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+
+        <plugins>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-shade-plugin</artifactId>
+                <version>2.0</version>
+                <configuration>
+                    <minimizeJar>false</minimizeJar>
+                    <createSourcesJar>true</createSourcesJar>
+                    <filters>
+                        <filter>
+                            <artifact>org.antlr:antlr-complete</artifact>
+                            <includes>
+                                <include>META-INF/**</include>
+                            </includes>
+                        </filter>
+                    </filters>
+                    <transformers>
+                        <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
+                            <mainClass>org.antlr.Tool</mainClass>
+                        </transformer>
+                    </transformers>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>complete-no-st3</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>shade</goal>
+                        </goals>
+                        <configuration>
+                            <createDependencyReducedPom>false</createDependencyReducedPom>
+                            <shadedArtifactAttached>true</shadedArtifactAttached>
+                            <shadedClassifierName>no-st3</shadedClassifierName>
+                            <filters>
+                                <filter>
+                                    <artifact>antlr:antlr</artifact>
+                                    <excludes>
+                                        <exclude>**</exclude>
+                                    </excludes>
+                                </filter>
+                                <filter>
+                                    <artifact>org.antlr:stringtemplate</artifact>
+                                    <excludes>
+                                        <exclude>**</exclude>
+                                    </excludes>
+                                </filter>
+                            </filters>
+                        </configuration>
+                    </execution>
+
+                    <execution>
+                        <id>complete</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>shade</goal>
+                        </goals>
+                        <configuration>
+                            <createDependencyReducedPom>false</createDependencyReducedPom>
+                            <shadedArtifactAttached>false</shadedArtifactAttached>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-javadoc-plugin</artifactId>
+                <configuration>
+                    <includeDependencySources>true</includeDependencySources>
+                </configuration>
+            </plugin>
+        </plugins>
+
+    </build>
+
+</project>
diff --git a/antlr.config b/antlr.config
index 00ac54e..e69de29 100644
--- a/antlr.config
+++ b/antlr.config
@@ -1 +0,0 @@
-fred=99
diff --git a/antlr3-maven-archetype/pom.xml b/antlr3-maven-archetype/pom.xml
index 6de349c..c4b084b 100644
--- a/antlr3-maven-archetype/pom.xml
+++ b/antlr3-maven-archetype/pom.xml
@@ -1,82 +1,27 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 
     
     <modelVersion>4.0.0</modelVersion>
     <groupId>org.antlr</groupId>
     <artifactId>antlr3-maven-archetype</artifactId>
-    <version>3.4</version>
     <packaging>maven-archetype</packaging>
-    <name>ANTLR3 Maven Archetype 3.4</name>
+    <name>ANTLR 3 Maven Archetype</name>
+    <description>ANTLR 3 Maven Archetype</description>
     
-    <properties>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    </properties>
-    
+
     <!--
 
     Inherit from the ANTLR master pom, which tells us what
     version we are and allows us to inherit dependencies
     and so on.
-
-    Unfortunately, because of a bug in the archetype plugin
-    we cannot use the parent pom because it causes the
-    artifactId in the generated pom to be set to antlr3-maven-archetype
-    We will reinstate this parent usage when that is fixed.
-    
+    -->
     <parent>
         <groupId>org.antlr</groupId>
         <artifactId>antlr-master</artifactId>
-        <version>3.4</version>
+        <version>3.5.2</version>
     </parent>
-    -->
-    <!--
-        The ANTLR Maven artifacts are now released via the Sonotype OSS
-        repository, which means that they are synced to Maven central 
-        within a few minutes of hitting the release repo for Sonotype.
-        To enable this, we inherit from the Sonotype provided parent
-        pom. However, we must also configure our .m2/settings.xml to include
-        the snapshot and staging server and the sonotype password. This 
-        means that only ANTLR developers can released the artifacts, but
-        anyone can build locally.
-      -->
-    <parent>
-        <groupId>org.sonatype.oss</groupId>
-        <artifactId>oss-parent</artifactId>
-        <version>7</version>
-    </parent> 
-    
-    <profiles>
-        <profile>
-            <id>release-sign-artifacts</id>
-            <activation>
-                <property>
-                    <name>deploy</name>
-                    <value>true</value>
-                </property>
-            </activation>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-gpg-plugin</artifactId>
-                        <version>1.3</version>
-                        <executions>
-                            <execution>
-                                <id>sign-artifacts</id>
-                                <phase>verify</phase>
-                                <goals>
-                                   <goal>sign</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-    
+
   <build>
 
     <extensions>
@@ -84,7 +29,7 @@
       <extension>
         <groupId>org.apache.maven.archetype</groupId>
         <artifactId>archetype-packaging</artifactId>
-        <version>2.0</version>
+        <version>2.2</version>
       </extension>
 
     </extensions>
@@ -93,38 +38,10 @@
 
             <plugin>
                 <artifactId>maven-archetype-plugin</artifactId>
-                <version>2.0</version>
+                <version>2.2</version>
                 <extensions>true</extensions>
             </plugin>
 
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-source-plugin</artifactId>
-                <version>2.1.2</version>
-                <executions>
-                    <execution>
-                        <id>attach-sources</id>
-                        <goals>
-                            <goal>jar</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-			
-            <plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-javadoc-plugin</artifactId>
-                <version>2.8</version>
-				<executions>
-					<execution>
-						<id>attach-javadocs</id>
-						<goals>
-							<goal>jar</goal>
-						</goals>
-					</execution>
-				</executions>
-			</plugin>
-            
         </plugins>
 
   </build>
diff --git a/antlr3-maven-archetype/src/main/resources/archetype-resources/pom.xml b/antlr3-maven-archetype/src/main/resources/archetype-resources/pom.xml
index e8db114..d0509c9 100644
--- a/antlr3-maven-archetype/src/main/resources/archetype-resources/pom.xml
+++ b/antlr3-maven-archetype/src/main/resources/archetype-resources/pom.xml
@@ -24,7 +24,7 @@
          Archetype by Jim Idle (jimi@temporal-wave.com) - Oct 2009
          Report bugs to the ANTLR interest list at http://www.antlr.org
 
-         Generated by antlr3-maven-archetype version 3.4
+         Generated by antlr3-maven-archetype version 3.4.1-SNAPSHOT
          =======================================================================
       -->
 
@@ -58,7 +58,7 @@
         <dependency>
             <groupId>org.antlr</groupId>
             <artifactId>antlr-runtime</artifactId>
-            <version>3.4</version>
+            <version>3.4.1-SNAPSHOT</version>
             <scope>compile</scope>
         </dependency>
 
@@ -84,7 +84,7 @@
 
                 <groupId>org.antlr</groupId>
                 <artifactId>antlr3-maven-plugin</artifactId>
-                <version>3.4</version>
+                <version>3.4.1-SNAPSHOT</version>
                 <executions>
                     <execution>
                         <goals>
@@ -100,7 +100,7 @@
               the prototype, but we use it to illustrate how you can get
               the JDK 6 Java compiler to accept 1.5 or 1.6 targeted source code
               but produce class files that are compatible with JRE 1.4. As
-              Michael Caine might not say, "Not a lot of people know that!"
+              Michael Caine might say, "Not a lot of people know that!"
               -->
             <plugin>
                 <artifactId>maven-compiler-plugin</artifactId>
diff --git a/antlr3-maven-plugin/antlr.config b/antlr3-maven-plugin/antlr.config
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/antlr3-maven-plugin/antlr.config
diff --git a/antlr3-maven-plugin/pom.xml b/antlr3-maven-plugin/pom.xml
index 58dc982..6fc1770 100644
--- a/antlr3-maven-plugin/pom.xml
+++ b/antlr3-maven-plugin/pom.xml
@@ -33,26 +33,8 @@
 
 
 
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 
-
-    <!--
-        The ANTLR Maven artifacts are now released via the Sonotype OSS
-        repository, which means that they are synced to Maven central 
-        within a few minutes of hitting the release repo for Sonotype.
-        To enable this, we inherit from the Sonotype provided parent
-        pom. However, we must also configure our .m2/settings.xml to include
-        the snapshot and staging server and the sonotype password. This 
-        means that only ANTLR developers can released the artifacts, but
-        anyone can build locally.
-      -->
-    <parent>
-        <groupId>org.sonatype.oss</groupId>
-        <artifactId>oss-parent</artifactId>
-        <version>7</version>
-    </parent>  
-    
     <!-- Maven model we are inheriting from
       -->
     <modelVersion>4.0.0</modelVersion>
@@ -77,12 +59,13 @@
     <artifactId>antlr3-maven-plugin</artifactId>
     <packaging>maven-plugin</packaging>
 
-    <!-- Note that as this plugin depends on the ANTLR tool itself
-         we cannot use the paren pom to control the version number
-         and MUST update <version> in this pom manually!
-         -->
-    <version>3.4</version>
-    <name>Maven plugin for ANTLR V3.4</name>
+    <parent>
+        <groupId>org.antlr</groupId>
+        <artifactId>antlr-master</artifactId>
+        <version>3.5.2</version>
+    </parent>
+
+    <name>ANTLR 3 Maven plugin</name>
     <prerequisites>
         <maven>2.0</maven>
     </prerequisites>
@@ -126,44 +109,13 @@
 
     </description>
 
-    <profiles>
-        <profile>
-            <id>release-sign-artifacts</id>
-            <activation>
-                <property>
-                    <name>deploy</name>
-                    <value>true</value>
-                </property>
-            </activation>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-gpg-plugin</artifactId>
-                        <version>1.3</version>
-                        <executions>
-                            <execution>
-                                <id>sign-artifacts</id>
-                                <phase>verify</phase>
-                                <goals>
-                                   <goal>sign</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-
-
     <developers>
 
         <developer>
             <name>Jim Idle</name>
             <url>http://www.temporal-wave.com</url>
             <roles>
-                <role>Originator, version 3.1.3+</role>
+                <role>Originator, version 3.1.3</role>
             </roles>
         </developer>
 
@@ -193,44 +145,6 @@
 
     </developers>
 
-    <!-- Where do we track bugs for this project?
-      -->
-    <issueManagement>
-        <system>JIRA</system>
-        <url>http://antlr.org/jira/browse/ANTLR</url>
-    </issueManagement>
-
-    <!-- Location of the license description for this project
-      -->
-    <licenses>
-        <license>
-            <distribution>repo</distribution>
-            <name>The BSD License</name>
-            <url>http://www.antlr.org/LICENSE.txt </url>
-        </license>
-    </licenses>
-    
-    <!-- Ancilliary information for completeness
-      -->
-    <inceptionYear>2009</inceptionYear>
-
-    <mailingLists>
-        <mailingList>
-            <archive>http://antlr.markmail.org/</archive>
-            <otherArchives>
-                <otherArchive>http://www.antlr.org/pipermail/antlr-interest/</otherArchive>
-            </otherArchives>
-            <name>ANTLR Users</name>
-            <subscribe>http://www.antlr.org/mailman/listinfo/antlr-interest/</subscribe>
-            <unsubscribe>http://www.antlr.org/mailman/options/antlr-interest/</unsubscribe>
-            <post>antlr-interest@antlr.org</post>
-        </mailingList>
-    </mailingLists>
-
-    <organization>
-        <name>ANTLR.org</name>
-        <url>http://www.antlr.org</url>
-    </organization>
     <!-- ============================================================================= -->
 
     <!--
@@ -261,7 +175,7 @@
         <dependency>
             <groupId>org.codehaus.plexus</groupId>
             <artifactId>plexus-compiler-api</artifactId>
-            <version>1.5.3</version>
+            <version>2.0</version>
         </dependency>
 
         <!--
@@ -272,25 +186,13 @@
         <dependency>
             <groupId>org.antlr</groupId>
             <artifactId>antlr</artifactId>
-            <version>3.4</version>
-        </dependency>
-
-        <!--
-          Testing requirements...
-          -->
-        <dependency>
-
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <version>4.8.2</version>
-            <scope>test</scope>
-
+            <version>${project.version}</version>
         </dependency>
 
         <dependency>
             <groupId>org.apache.maven.shared</groupId>
             <artifactId>maven-plugin-testing-harness</artifactId>
-            <version>1.0</version>
+            <version>1.1</version>
             <scope>test</scope>
         </dependency>
         
@@ -298,64 +200,34 @@
     
     <build>
 
-        <defaultGoal>install</defaultGoal>
-
         <plugins>
 
             <plugin>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <version>2.0.2</version>
-                <configuration>
-                    <source>1.6</source>
-                    <target>jsr14</target>
-                </configuration>
-            </plugin>
-
-            <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-site-plugin</artifactId>
-                <version>2.0</version>
+                <version>3.3</version>
             </plugin>
 
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-project-info-reports-plugin</artifactId>
-                <version>2.1.1</version>
+                <version>2.7</version>
                 <configuration>
                     <dependencyLocationsEnabled>false</dependencyLocationsEnabled>
                 </configuration>
             </plugin>
 
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-source-plugin</artifactId>
-                <version>2.1.2</version>
-                <executions>
-                    <execution>
-                        <id>attach-sources</id>
-                        <goals>
-                            <goal>jar</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-javadoc-plugin</artifactId>
-                <version>2.8</version>
-				<executions>
-					<execution>
-						<id>attach-javadocs</id>
-						<goals>
-							<goal>jar</goal>
-						</goals>
-					</execution>
-				</executions>
-			</plugin>
-            
         </plugins>
 
     </build>
 
+    <reporting>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-plugin-plugin</artifactId>
+                <version>3.2</version>
+            </plugin>
+        </plugins>
+    </reporting>
 </project>
diff --git a/antlr3-maven-plugin/src/main/java/org/antlr/mojo/antlr3/Antlr3ErrorLog.java b/antlr3-maven-plugin/src/main/java/org/antlr/mojo/antlr3/Antlr3ErrorLog.java
index bf2c3c6..5a315da 100644
--- a/antlr3-maven-plugin/src/main/java/org/antlr/mojo/antlr3/Antlr3ErrorLog.java
+++ b/antlr3-maven-plugin/src/main/java/org/antlr/mojo/antlr3/Antlr3ErrorLog.java
@@ -56,7 +56,7 @@
 
     /**
      * Sends an informational message to the Maven log sink.
-     * @param s The message to send to Maven
+     * @param message The message to send to Maven
      */
     public void info(String message) {
         log.info(message);
diff --git a/antlr3-maven-plugin/src/main/java/org/antlr/mojo/antlr3/Antlr3Mojo.java b/antlr3-maven-plugin/src/main/java/org/antlr/mojo/antlr3/Antlr3Mojo.java
index e7225d3..6c18c55 100644
--- a/antlr3-maven-plugin/src/main/java/org/antlr/mojo/antlr3/Antlr3Mojo.java
+++ b/antlr3-maven-plugin/src/main/java/org/antlr/mojo/antlr3/Antlr3Mojo.java
@@ -45,7 +45,6 @@
 import java.util.HashSet;
 import java.util.Set;
 import org.antlr.Tool;
-import org.antlr.runtime.RecognitionException;
 import org.apache.maven.plugin.logging.Log;
 import org.codehaus.plexus.compiler.util.scan.InclusionScanException;
 import org.codehaus.plexus.compiler.util.scan.SimpleSourceInclusionScanner;
@@ -54,13 +53,11 @@
 import org.codehaus.plexus.compiler.util.scan.mapping.SuffixMapping;
 
 /**
- * Goal that picks up all the ANTLR grammars in a project and moves those that
- * are required for generation of the compilable sources into the location
- * that we use to compile them, such as target/generated-sources/antlr3 ...
+ * Parses ANTLR grammar files {@code *.g} and transforms them into Java source
+ * files.
  *
  * @goal antlr
- * 
- * @phase process-sources
+ * @phase generate-sources
  * @requiresDependencyResolution compile
  * @requiresProject true
  * 
@@ -82,7 +79,7 @@
     protected boolean report;
     /**
      * If set to true, then the ANTLR tool will print a version of the input
-     * grammar which is devoid of any actions that may be present in the input file.
+     * grammar(s) which are stripped of any embedded actions.
      *
      * @parameter default-value="false"
      */
@@ -96,119 +93,124 @@
      */
     protected boolean debug;
     /**
-     * If set to true, then then the generated parser will compute and report on
-     * profile information at runtime.
+     * If set to true, then the generated parser will compute and report profile
+     * information at runtime.
      *
      * @parameter default-value="false"
      */
     protected boolean profile;
     /**
-     * If set to true then the ANTLR tool will generate a description of the nfa
-     * for each rule in <a href="http://www.graphviz.org">Dot format</a>
-     * 
+     * If set to true, then the ANTLR tool will generate a description of the
+     * NFA for each rule in <a href="http://www.graphviz.org">Dot format</a>
+     *
      * @parameter default-value="false"
      */
     protected boolean nfa;
     /**
-     * If set to true then the ANTLR tool will generate a description of the DFA
-     * for each decision in the grammar in <a href="http://www.graphviz.org">Dot format</a>
-     * 
+     * If set to true, then the ANTLR tool will generate a description of the
+     * DFA for each decision in the grammar in
+     * <a href="http://www.graphviz.org">Dot format</a>.
+     *
      * @parameter default-value="false"
      */
     protected boolean dfa;
     /**
-     * If set to true, the generated parser code will log rule entry and exit points
-     * to stdout as an aid to debugging.
+     * If set to true, the generated parser code will log rule entry and exit
+     * points to stdout ({@link System#out} for the Java target) as an aid to
+     * debugging.
      *
      * @parameter default-value="false"
      */
     protected boolean trace;
     /**
-     * If this parameter is set, it indicates that any warning or error messages returned
-     * by ANLTR, should be formatted in the specified way. Currently, ANTLR supports the
-     * built-in formats of antlr, gnu and vs2005.
+     * If this parameter is set, it indicates that any warning or error messages
+     * returned by ANLTR, should be formatted in the specified way. Currently,
+     * ANTLR supports the built-in formats {@code antlr}, {@code gnu} and
+     * {@code vs2005}.
      *
      * @parameter default-value="antlr"
      */
     protected String messageFormat;
     /**
-     * If this parameter is set to true, then ANTLR will report all sorts of things
-     * about what it is doing such as the names of files and the version of ANTLR and so on.
+     * If set to true, then ANTLR will report verbose messages during the code
+     * generation process. This includes the names of files, the version of
+     * ANTLR, and more.
      *
      * @parameter default-value="true"
      */
     protected boolean verbose;
 
     /**
-     * The number of alts, beyond which ANTLR will not generate a switch statement
-     * for the DFA.
+     * The maximum number of alternatives allowed in an inline switch statement.
+     * Beyond this, ANTLR will not generate a switch statement for the DFA.
      *
      * @parameter default-value="300"
      */
     private int maxSwitchCaseLabels;
 
     /**
-     * The number of alts, below which ANTLR will not choose to generate a switch
-     * statement over an if statement.
+     * The minimum number of alternatives for ANTLR to generate a switch
+     * statement. For decisions with fewer alternatives, an if/else if/else
+     * statement will be used instead.
+     *
+     * @parameter default-value="3"
      */
     private int minSwitchAlts;
 
     /* --------------------------------------------------------------------
-     * The following are Maven specific parameters, rather than specificlly
+     * The following are Maven specific parameters, rather than specific
      * options that the ANTLR tool can use.
      */
+
     /**
-     * Provides an explicit list of all the grammars that should
-     * be included in the generate phase of the plugin. Note that the plugin
-     * is smart enough to realize that imported grammars should be included but
-     * not acted upon directly by the ANTLR Tool.
-     *
-     * Unless otherwise specified, the include list scans for and includes all
-     * files that end in ".g" in any directory beneath src/main/antlr3. Note that
-     * this version of the plugin looks for the directory antlr3 and not the directory
-     * antlr, so as to avoid clashes and confusion for projects that use both v2 and v3 grammars
-     * such as ANTLR itself.
+     * Provides an explicit list of all the grammars that should be included in
+     * the generate phase of the plugin. Note that the plugin is smart enough to
+     * realize that imported grammars should be included but not acted upon
+     * directly by the ANTLR Tool.
+     * <p>
+     * A set of Ant-like inclusion patterns used to select files from the source
+     * directory for processing. By default, the pattern <code>**&#47;*.g</code>
+     * is used to select grammar files.</p>
      *
      * @parameter
      */
-    protected Set includes = new HashSet();
+    protected Set<String> includes = new HashSet<String>();
     /**
-     * Provides an explicit list of any grammars that should be excluded from
-     * the generate phase of the plugin. Files listed here will not be sent for
-     * processing by the ANTLR tool.
+     * A set of Ant-like exclusion patterns used to prevent certain files from
+     * being processed. By default, this set is empty such that no files are
+     * excluded.
      *
-     * @parameter 
+     * @parameter
      */
-    protected Set excludes = new HashSet();
+    protected Set<String> excludes = new HashSet<String>();
     /**
+     * The current Maven project.
+     *
      * @parameter expression="${project}"
      * @required
      * @readonly
      */
     protected MavenProject project;
     /**
-     * Specifies the Antlr directory containing grammar files. For
-     * antlr version 3.x we default this to a directory in the tree
-     * called antlr3 because the antlr directory is occupied by version
-     * 2.x grammars.
+     * The directory where the ANTLR grammar files ({@code *.g}) are located.
      *
      * @parameter default-value="${basedir}/src/main/antlr3"
-     * @required
      */
     private File sourceDirectory;
     /**
-     * Location for generated Java files. For antlr version 3.x we default
-     * this to a directory in the tree called antlr3 because the antlr
-     * directory is occupied by version 2.x grammars.
+     * The directory where the parser files generated by ANTLR will be stored.
+     * The directory will be registered as a compile source root of the project
+     * such that the generated files will participate in later build phases like
+     * compiling and packaging.
      *
      * @parameter default-value="${project.build.directory}/generated-sources/antlr3"
      * @required
      */
     private File outputDirectory;
     /**
-     * Location for imported token files, e.g. <code>.tokens</code> and imported grammars.
-     * Note that ANTLR will not try to process grammars that it finds to be imported
-     * into other grammars (in the same processing session).
+     * Location for imported token files, e.g. {@code *.tokens} and imported
+     * grammars. Note that ANTLR will not try to process grammars that it finds
+     * to be imported into other grammars (in the same processing session).
      *
      * @parameter default-value="${basedir}/src/main/antlr3/imports"
      */
@@ -230,16 +232,18 @@
         project.addCompileSourceRoot(outputDir.getPath());
     }
     /**
-     * An instance of the ANTLR tool build
+     * An instance of the ANTLR tool build.
      */
     protected Tool tool;
 
     /**
      * The main entry point for this Mojo, it is responsible for converting
      * ANTLR 3.x grammars into the target language specified by the grammar.
-     * 
-     * @throws org.apache.maven.plugin.MojoExecutionException When something is discovered such as a missing source
-     * @throws org.apache.maven.plugin.MojoFailureException When something really bad happens such as not being able to create the ANTLR Tool
+     *
+     * @throws MojoExecutionException if a configuration or grammar error causes
+     * the code generation process to fail
+     * @throws MojoFailureException if an instance of the ANTLR 3 {@link Tool}
+     * cannot be created
      */
     public void execute()
             throws MojoExecutionException, MojoFailureException {
@@ -253,15 +257,13 @@
 
             // Excludes
             //
-            for (String e : (Set<String>) excludes) {
-
+            for (String e : excludes) {
                 log.debug("ANTLR: Exclude: " + e);
             }
 
             // Includes
             //
-            for (String e : (Set<String>) includes) {
-
+            for (String e : includes) {
                 log.debug("ANTLR: Include: " + e);
             }
 
@@ -401,20 +403,18 @@
      *
      * @param sourceDirectory
      * @param outputDirectory
-     * @throws antlr.TokenStreamException
-     * @throws antlr.RecognitionException
-     * @throws java.io.IOException
-     * @throws org.codehaus.plexus.compiler.util.scan.InclusionScanException
+     * @throws IOException
+     * @throws InclusionScanException
      */
     private void processGrammarFiles(File sourceDirectory, File outputDirectory)
-            throws RecognitionException, IOException, InclusionScanException {
+            throws IOException, InclusionScanException {
         // Which files under the source set should we be looking for as grammar files
         //
-        SourceMapping mapping = new SuffixMapping("g", Collections.EMPTY_SET);
+        SourceMapping mapping = new SuffixMapping("g", Collections.<String>emptySet());
 
         // What are the sets of includes (defaulted or otherwise).
         //
-        Set includes = getIncludesPatterns();
+        Set<String> includes = getIncludesPatterns();
 
         // Now, to the excludes, we need to add the imports directory
         // as this is autoscanned for importd grammars and so is auto-excluded from the
@@ -425,7 +425,7 @@
         SourceInclusionScanner scan = new SimpleSourceInclusionScanner(includes, excludes);
 
         scan.addSourceMapping(mapping);
-        Set grammarFiles = scan.getIncludedSources(sourceDirectory, null);
+        Set<File> grammarFiles = scan.getIncludedSources(sourceDirectory, null);
 
         if (grammarFiles.isEmpty()) {
             if (getLog().isInfoEnabled()) {
@@ -440,7 +440,7 @@
             // Iterate each grammar file we were given and add it into the tool's list of
             // grammars to process.
             //
-            for (File grammar : (Set<File>) grammarFiles) {
+            for (File grammar : grammarFiles) {
 
                 if (getLog().isDebugEnabled()) {
                     getLog().debug("Grammar file '" + grammar.getPath() + "' detected.");
@@ -461,7 +461,7 @@
 
     }
 
-    public Set getIncludesPatterns() {
+    public Set<String> getIncludesPatterns() {
         if (includes == null || includes.isEmpty()) {
             return Collections.singleton("**/*.g");
         }
@@ -471,11 +471,11 @@
     /**
      * Given the source directory File object and the full PATH to a
      * grammar, produce the path to the named grammar file in relative
-     * terms to the sourceDirectory. This will then allow ANTLR to
+     * terms to the {@code sourceDirectory}. This will then allow ANTLR to
      * produce output relative to the base of the output directory and
      * reflect the input organization of the grammar files.
      *
-     * @param sourceDirectory The source directory File object
+     * @param sourceDirectory The source directory {@link File} object
      * @param grammarFileName The full path to the input grammar file
      * @return The path to the grammar file relative to the source directory
      */
@@ -487,7 +487,11 @@
         }
 
         File unprefixedGrammarFileName = new File(grammarFileName.substring(srcPath.length()));
-
-        return unprefixedGrammarFileName.getParent() + File.separator;
+	if ( unprefixedGrammarFileName.getParent()!=null ) {
+	    return unprefixedGrammarFileName.getParent() + File.separator;
+        }
+	else {
+            return "";
+	}
     }
 }
diff --git a/antlr3-maven-plugin/src/site/apt/examples/import.apt b/antlr3-maven-plugin/src/site/apt/examples/import.apt
index 06a49f1..befd508 100644
--- a/antlr3-maven-plugin/src/site/apt/examples/import.apt
+++ b/antlr3-maven-plugin/src/site/apt/examples/import.apt
@@ -1,7 +1,7 @@
 Imported Grammar Files
 
  In order to have the ANTLR plugin automatically locate and use grammars used
- as imports in your main .g files, you need to place the imported grammar
+ as imports in your main <<<.g>>> files, you need to place the imported grammar
  files in the imports directory beneath the root directory of your grammar
  files (which is <<<src/main/antlr3>>> by default of course).
 
diff --git a/antlr3-maven-plugin/src/site/apt/examples/libraries.apt b/antlr3-maven-plugin/src/site/apt/examples/libraries.apt
index 73ce796..822a9ac 100644
--- a/antlr3-maven-plugin/src/site/apt/examples/libraries.apt
+++ b/antlr3-maven-plugin/src/site/apt/examples/libraries.apt
@@ -2,23 +2,23 @@
 
  The introduction of the import directive in a grammar allows reuse of common grammar files
  as well as the ability to divide up functional components of large grammars. However it has
- caused some confusion in regard to the fact that generated vocab files (<<<xxx.tokens>>>) can also
+ caused some confusion in regard to the fact that generated vocabulary files (<<<*.tokens>>>) can also
  be searched for with the <<<<libDirectory>>>> directive.
 
  This has confused two separate functions and imposes a structure upon the layout of
  your grammar files in certain cases. If you have grammars that both use the import
- directive and also require the use of a vocab file then you will need to locate
- the grammar that generates the .tokens file alongside the grammar that uses it. This
+ directive and also require the use of a vocabulary file then you will need to locate
+ the grammar that generates the <<<.tokens>>> file alongside the grammar that uses it. This
  is because you will need to use the <<<<libDirectory>>>> directive to specify the
- location of your imported grammars and ANTLR will not find any vocab files in
+ location of your imported grammars and ANTLR will not find any vocabulary files in
  this directory.
 
- The .tokens files for any grammars are generated within the same output directory structure
- as the .java files. So, whereever the .java files are generated, you will also find the .tokens
- files. ANTLR looks for .tokens files in both the <<<<libDirectory>>>> and the output directory
- where it is placing the geenrated .java files. Hence when you locate the grammars that generate
- .tokens files in the same source directory as the ones that use the .tokens files, then
- the Maven plugin will find the expected .tokens files.
+ The <<<.tokens>>> files for any grammars are generated within the same output directory structure
+ as the <<<.java>>> files. So, wherever the <<<.java>>> files are generated, you will also find the <<<.tokens>>>
+ files. ANTLR looks for <<<.tokens>>> files in both the <<<<libDirectory>>>> and the output directory
+ where it is placing the generated <<<.java>>> files. Hence when you locate the grammars that generate
+ <<<.tokens>>> files in the same source directory as the ones that use the <<<.tokens>>> files, then
+ the Maven plugin will find the expected <<<.tokens>>> files.
 
  The <<<<libDirectory>>>> is specified like any other directory parameter in Maven. Here is an
  example:
@@ -27,10 +27,9 @@
 <plugin>
     <groupId>org.antlr</groupId>
     <artifactId>antlr3-maven-plugin</artifactId>
-    <version>3.1.3-1</version>
+    <version>${plugin.version}</version>
 
     <executions>
-
         <execution>
             <configuration>
                 <goals>
diff --git a/antlr3-maven-plugin/src/site/apt/examples/simple.apt b/antlr3-maven-plugin/src/site/apt/examples/simple.apt
index 3e36e84..ed1918b 100644
--- a/antlr3-maven-plugin/src/site/apt/examples/simple.apt
+++ b/antlr3-maven-plugin/src/site/apt/examples/simple.apt
@@ -1,7 +1,7 @@
 Simple configuration
 
  If your grammar files are organized into the default locations as described in the {{{../index.html}introduction}},
- then configuring the pom.xml file for your project is as simple as adding this to it
+ then configuring the <<<pom.xml>>> file for your project is as simple as adding this to it
 
 +--
 <plugins>
@@ -21,12 +21,12 @@
 </plugins>
 +--
 
- When the mvn command is executed all grammar files under <<<src/main/antlr3>>>, except any
+ When the <<<mvn>>> command is executed all grammar files under <<<src/main/antlr3>>>, except any
  import grammars under <<<src/main/antlr3/imports>>> will be analyzed and converted to
- java source code in the output directory <<<target/generated-sources/antlr3>>>.
+ Java source code in the output directory <<<target/generated-sources/antlr3>>>.
 
  Your input files under <<<antlr3>>> should be stored in sub directories that
- reflect the package structure of your java parsers. If your grammar file parser.g contains:
+ reflect the package structure of your java parsers. If your grammar file <<<parser.g>>> contains:
 
 +---
 @header {
@@ -34,7 +34,7 @@
 }
 +---
 
- Then the .g file should be stored in: <<<src/main/antlr3/org/jimi/themuss/parser.g>>>. THis way
- the generated .java files will correctly reflect the package structure in which they will
+ Then the <<<.g>>> file should be stored in: <<<src/main/antlr3/org/jimi/themuss/parser.g>>>. This way
+ the generated <<<.java>>> files will correctly reflect the package structure in which they will
  finally rest as classes.
 
diff --git a/antlr3-maven-plugin/src/site/apt/faq.apt.vm b/antlr3-maven-plugin/src/site/apt/faq.apt.vm
new file mode 100644
index 0000000..d6360a1
--- /dev/null
+++ b/antlr3-maven-plugin/src/site/apt/faq.apt.vm
@@ -0,0 +1 @@
+FAQ
diff --git a/antlr3-maven-plugin/src/site/apt/index.apt b/antlr3-maven-plugin/src/site/apt/index.apt
index 2b2495a..2b57f13 100644
--- a/antlr3-maven-plugin/src/site/apt/index.apt
+++ b/antlr3-maven-plugin/src/site/apt/index.apt
@@ -28,7 +28,7 @@
  use version 3.1.3 of the plugin, you will build your grammars using version 3.1.3 of the
  ANTLR tool, version 3.2 of the plugin will use version 3.2 of the ANTLR tool and so on.
 
- You may also find that there are patch versions of the plugin suchas 3.1.3-1 3.1.3-2 and
+ You may also find that there are patch versions of the plugin such as 3.1.3-1 3.1.3-2 and
  so on. Use the latest patch release of the plugin.
 
  The current version of the plugin is shown at the top of this page after the <<Last Deployed>> date.
@@ -49,10 +49,10 @@
              +--- imports/  .g files that are imported by other grammars.
 +--
 
- If your grammar is intended to be part of a package called org.foo.bar then you would
+ If your grammar is intended to be part of a package called <<<org.foo.bar>>> then you would
  place it in the directory <<<src/main/antlr3/org/foo/bar>>>. The plugin will then produce
- .java and .tokens files in the output directory <<<target/generated-sources/antlr3/org/foo/bar>>>
- When the Java files are compiled they will be in the correct location for the javac
+ <<<.java>>> and <<<.tokens>>> files in the output directory <<<target/generated-sources/antlr3/org/foo/bar>>>
+ When the Java files are compiled they will be in the correct location for the Javac
  compiler without any special configuration. The generated java files are automatically
  submitted for compilation by the plugin.
 
@@ -60,4 +60,3 @@
  any grammar files that are imported by other grammar files (do not make subdirectories here.)
  Such files are never built on their own, but the plugin will automatically tell the ANTLR
  tool to look in this directory for library files.
-
diff --git a/antlr3-maven-plugin/src/site/apt/usage.apt.vm b/antlr3-maven-plugin/src/site/apt/usage.apt.vm
index 9b7ad0f..1b28890 100644
--- a/antlr3-maven-plugin/src/site/apt/usage.apt.vm
+++ b/antlr3-maven-plugin/src/site/apt/usage.apt.vm
@@ -1,193 +1,59 @@
 Usage
 
- The Maven plugin for antlr is simple to use but is at its simplest when you use the default
- layouts for your grammars, as so:
+ The ANTLR 3 plugin for Maven can generate parsers for any number of grammars in
+ your project.
+
+* Compiling Grammars into Parsers
+
+ By default, the <<<{{{./antlr-mojo.html}antlr}}>>> goal will search for grammar
+ files in the directory <<<$\{basedir\}/src/main/antlr3>>> and any additional
+ <<<.tokens>>> files in the directory <<<$\{basedir\}/src/main/antlr3/imports>>>.
+ This can be configured to search other directories using the plugin configuration
+ parameters as described in the <<<{{{./antlr-mojo.html}antlr}}>>> goal
+ documentation.
+
+ The following figure shows the expected layout of files for the default
+ configuration of this plugin.
 
 +--
  src/main/
       |
-      +--- antlr3/... .g files organized in the required package structure
+      +--- antlr3/...       .g files organized in the required package structure
              |
-             +--- imports/  .g files that are imported by other grammars.
+             +--- imports/  user-created .tokens files and .g files that are imported by other grammars
 +--
 
- However, if you are not able to use this structure for whatever reason, you
- can configure the locations of the grammar files, where library/import files
- are located and where the output files should be generated.
-
-* Plugin Descriptor
-
- The current version of the plugin is shown at the top of this page after the <<Last Deployed>> date.
-
- The full layout of the descriptor (at least, those parts that are not standard Maven things),
- showing the default values of the configuration options, is as follows:
+ The next step is to configure your POM to call the plugin. The goals will
+ normally run during the generate-sources phase of the build. Examples of how to
+ configure your POM can be found on the various examples pages, reachable via
+ the page menu. If you stick with the default values, the snippet below will
+ suffice:
 
 +--
-<plugin>
-    <groupId>org.antlr</groupId>
-    <artifactId>antlr3-maven-plugin</artifactId>
-    <version>3.1.3-1</version>
-
-    <executions>
-        
-        <execution>
-            <configuration>
-                <goals>
-                    <goal>antlr</goal>
-                </goals>
-                <conversionTimeout>10000</conversionTimeout>
-                <debug>false</debug>
-                <dfa>false</dfa>
-                <nfa>false</nfa>
-                <excludes><exclude/></excludes>
-                <includes><include/></includes>
-                <libDirectory>src/main/antlr3/imports</libDirectory>
-                <messageFormat>antlr</messageFormat>
-                <outputDirectory>target/generated-sources/antlr3</outputDirectory>
-                <printGrammar>false</printGrammar>
-                <profile>false</profile>
-                <report>false</report>
-                <sourceDirectory>src/main/antlr3</sourceDirectory>
-                <trace>false</trace>
-                <verbose>true</verbose>
-            </configuration>
-        </execution>
-    </executions>
-
-</plugin>
+<project>
+  ...
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.antlr</groupId>
+        <artifactId>antlr3-maven-plugin</artifactId>
+        <version>${project.version}</version>
+        <executions>
+          <execution>
+            <id>antlr</id>
+            <goals>
+              <goal>antlr</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+    ...
+  </build>
+  ...
+</project>
 +--
 
- Note that you can create multiple executions, and thus build some grammars with different
- options to others (such as setting the debug option for instance).
-
-** Configuration parameters
-
-*** report
-
-    If set to true, then after the tool has processed an input grammar file
-    it will report variaous statistics about the parser, such as information
-    on cyclic DFAs, which rules may use backtracking, and so on.
-
-    default-value="false"
-
-*** printGrammar
-
-    If set to true, then the ANTLR tool will print a version of the input
-    grammar which is devoid of any actions that may be present in the input file.
-
-    default-value = "false"
-
-*** debug
-
-     If set to true, then the code generated by the ANTLR code generator will
-     be set to debug mode. This means that when run, the code will 'hang' and
-     wait for a debug connection on a TCP port (49100 by default).
-     
-     default-value="false"
-     
-*** profile
-
-     If set to true, then then the generated parser will compute and report on
-     profile information at runtime.
-     
-     default-value="false"
-     
-*** nfa
-
-     If set to true then the ANTLR tool will generate a description of the nfa
-     for each rule in <a href="http://www.graphviz.org">Dot format</a>
-     
-     default-value="false"
-     
-    protected boolean nfa;
-    
-*** dfa
-
-     If set to true then the ANTLR tool will generate a description of the DFA
-     for each decision in the grammar in <a href="http://www.graphviz.org">Dot format</a>
-     
-     default-value="false"
-     
-*** trace
-
-     If set to true, the generated parser code will log rule entry and exit points
-     to stdout as an aid to debugging.
-     
-     default-value="false"
-     
-*** messageFormat
-
-     If this parameter is set, it indicates that any warning or error messages returned
-     by ANLTR, shoould be formatted in the specified way. Currently, ANTLR supports the
-     built-in formats of antlr, gnu and vs2005.
-
-     default-value="antlr"
-     
-*** verbose
-
-     If this parameter is set to true, then ANTLR will report all sorts of things
-     about what it is doing such as the names of files and the version of ANTLR and so on.
-     
-     default-value="true"
-     
-*** conversionTimeout
-
-     The number of milliseconds ANTLR will wait for analysis of each
-     alternative in the grammar to complete before giving up. You may raise
-     this value if ANTLR gives up on a complicated alt and tells you that
-     there are lots of ambiguties, but you know that it just needed to spend
-     more time on it. Note that this is an absolute time and not CPU time.
-     
-     default-value="10000"
-     
-*** includes
-
-     Provides an explicit list of all the grammars that should
-     be included in the generate phase of the plugin. Note that the plugin
-     is smart enough to realize that imported grammars should be included but
-     not acted upon directly by the ANTLR Tool.
-     
-     Unless otherwise specified, the include list scans for and includes all
-     files that end in ".g" in any directory beneath src/main/antlr3. Note that
-     this version of the plugin looks for the directory antlr3 and not the directory
-     antlr, so as to avoid clashes and confusion for projects that use both v2 and v3 grammars
-     such as ANTLR itself.
-     
-*** excludes
-
-     Provides an explicit list of any grammars that should be excluded from
-     the generate phase of the plugin. Files listed here will not be sent for
-     processing by the ANTLR tool.
-     
-*** sourceDirectory
-
-     Specifies the Antlr directory containing grammar files. For
-     antlr version 3.x we default this to a directory in the tree
-     called antlr3 because the antlr directory is occupied by version
-     2.x grammars.
-
-     <<NB>> Take careful note that the default location for antlr grammars
-     is now <<antlr3>> and NOT <<antlr>>
-
-     default-value="<<<${basedir}/src/main/antlr3>>>"
-     
-*** outputDirectory
-
-     Location for generated Java files. For antlr version 3.x we default
-     this to a directory in the tree called antlr3 because the antlr
-     directory is occupied by version 2.x grammars.
-     
-     default-value="<<<${project.build.directory}/generated-sources/antlr3>>>"
-     
-*** libDirectory
-
-     Location for imported token files, e.g. <code>.tokens</code> and imported grammars.
-     Note that ANTLR will not try to process grammars that it finds in this directory, but
-     will include this directory in the search for .tokens files and import grammars.
-
-     <<NB>> If you change the lib directory from the default but the directory is
-     still under<<<${basedir}/src/main/antlr3>>>, then you will need to exclude
-     the grammars from processing specifically, using the <<<<excludes>>>> option.
-
-     default-value="<<<${basedir}/src/main/antlr3/imports>>>"
-
+ Note that you can create multiple executions, and thus build some grammars with
+ different options to others (such as setting the <<<debug>>> option for
+ instance).
diff --git a/antlr3-maven-plugin/src/site/site.xml b/antlr3-maven-plugin/src/site/site.xml
index 7d0c52b..92bcea3 100644
--- a/antlr3-maven-plugin/src/site/site.xml
+++ b/antlr3-maven-plugin/src/site/site.xml
@@ -6,18 +6,20 @@
   <version position="left"/>
 
   <poweredBy>
-    <logo name="ANTLR Web Site" href="http://antlr.org/"
+    <logo name="ANTLR Web Site" href="http://antlr3.org/"
           img="http://www.antlr.org/wiki/download/attachments/292/ANTLR3"/>
   </poweredBy>
 
   <body>
     <links>
-      <item name="Antlr Web Site" href="http://www.antlr.org/"/>
+      <item name="Antlr Web Site" href="http://www.antlr3.org/"/>
     </links>
 
     <menu name="Overview">
       <item name="Introduction" href="index.html"/>
+      <item name="Goals" href="plugin-info.html"/>
       <item name="Usage" href="usage.html"/>
+      <item name="FAQ" href="faq.html"/>
     </menu>
 
     <menu name="Examples">
diff --git a/antlrjar.xml b/antlrjar.xml
deleted file mode 100644
index 6988f98..0000000
--- a/antlrjar.xml
+++ /dev/null
@@ -1,88 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-    This file defines what goes in to ANTLR Uber jar, which includes
-    all of the classes we need to run an executable jar in standalone
-    mode.
-  -->
-<assembly>
-
-    <!--
-        This is the suffix that will be used to name the uber jar
-        once it is jared up.
-      -->
-    <id>completejar</id>
-
-    <!--
-        The only output format we need is the executable jar file
-      -->
-    <formats>
-        <format>jar</format>
-    </formats>
-
-    <!--
-        Make all jars unpack at the same level and don't include
-        any extraneous directories.
-      -->
-    <includeBaseDirectory>false</includeBaseDirectory>
-
-    <!--
-        Which of the modules that the master pom builds do we
-        wish to include in the uber jar. We are including
-        dependencies, so we only need to name the Tool module
-        and the gunit module.
-      -->
-    <moduleSets>
-
-        <moduleSet>
-            
-            <includes>
-                
-                <include>org.antlr:antlr</include>
-          
-            </includes>
-            <!--
-                Of the binaries, such as the dependencies that the
-                above modules need, which do we want and which do we not.
-                Currently we want all the dependencies in the Tool jar.
-              -->
-            <binaries>
-
-                <dependencySets>
-                    <dependencySet>
-                        <!--
-                            Exclude the antlr-master pom from the jar - we don't need it
-                            and it causes silly things to happen.
-                          -->
-                        <useProjectArtifact>false</useProjectArtifact>
-                    
-                        <!--
-                            Unpack the binary dependencies so we have a nice
-                            uber jar that can run with java -jar and need not have
-                            CLASSPATH configured and so on.
-                          -->
-                        <unpack>true</unpack>
-                    </dependencySet>
-                </dependencySets>
-
-
-            </binaries>
-
-        </moduleSet>
-       
-    </moduleSets>
-
-    <!--
-        What do we want to include in the jar from each project
-      -->
-    <fileSets>
-        <fileSet>
-
-            <!--
-                We need the output classes and resources etc.
-              -->
-            <directory>${project.build.outputDirectory}</directory>
-        </fileSet>
-    </fileSets>
-
-</assembly>
diff --git a/antlrsources.xml b/antlrsources.xml
deleted file mode 100644
index 953c7fc..0000000
--- a/antlrsources.xml
+++ /dev/null
@@ -1,172 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-
-    This is the assembly descriptor for building a full source code
-    distribution of ANTLR and all its related components. This assembly
-    only includes the Java oriented source code, hence only the Java runtime
-    is included in the resulting jar.
-
-    The resulting jar is distribution that can be expanded with:
-
-      jar xvf antlr-master-3.x.x-src.jar
-
-    The output directory will be antlr-master-3.x.x and in here will be
-    the BUILD.txt fie, which explains how to build ANTLR.
-
-    Jim Idle - May, 2009
- -->
-<assembly>
-
-    <!-- The name of this assembly descriptor, which is referenced in
-         the master pom.xml using <assemblyRef> (although in fact we
-         reference the file name that contains it to avoid cluttering
-         the pom.
-      -->
-    <id>src</id>
-
-    <!-- We have elected to produce only a jar output and to use the line
-         endings of whatever platform we are running on. More formats
-         can be added for simultaneous production, such as <format>zip</format>
-      -->
-    <formats>
-        <format>jar</format>
-    </formats>
-
-    <!--
-        The resulting archives will have a base directory named after the master
-        artifact, rather than just extract into the current directory.
-      -->
-    <includeBaseDirectory>true</includeBaseDirectory>
-
-    <!-- We need to described the source code of each of the modules we want
-         including in the archive. In the main this is because we did not store
-         the modules in perforce using directory names that match the module
-         names. This was for historic reasons as we already moved everything
-         about massively, just to move to Maven in the first place.
-      -->
-    <moduleSets>
-
-        <!-- Describe the gUnit source code.
-          -->
-        <moduleSet>
-
-            <!-- The Maven artifact name tells the assembly artifact a bunch
-                 of information to start with, such as its location in the current
-                 tree and so on.
-              -->
-            <includes>
-                <include>org.antlr:antlr-runtime</include>
-            </includes>
-
-            <!-- What sources do we wish to include from this module?
-              -->
-            <sources>
-
-                <!-- Because the Java runtime source is not in a directory
-                     called antlr-runtime, directly underneath the master
-                     directory, we need to map the output directory so that
-                     instead of starting with the name of the artifact, it
-                     is in the place where the build expects it.
-                  -->
-                <outputDirectoryMapping>runtime/Java</outputDirectoryMapping>
-
-                <fileSets>
-                     <!-- We have one file set, being the src sub-directory, which in
-                          the output archive, we also want to be called src/
-                       -->
-                    <fileSet>
-                        <directory>src</directory>
-                        <outputDirectory>src</outputDirectory>
-                    </fileSet>
-
-                    <!-- In the base runtime/Java directory, we need to include a number
-                         of files that either document the module or control the
-                         build. These are not underneath the src directory of course
-                         so they need to be named here (which nicely documents what
-                         is included.
-                      -->
-                    <fileSet>
-                        <includes>
-                            <include>pom.xml</include>
-                            <include>doxyfile</include>
-                            <include>antlr.config</include>
-                        </includes>
-                    </fileSet>
-                </fileSets>
-            </sources>
-
-        </moduleSet>
-
-        <!-- Describe the ANTLR tool source code.
-          -->
-        <moduleSet>
-            <includes>
-                <include>org.antlr:antlr</include>
-            </includes>
-
-            <!-- What sources do we wish to include from this module?
-              -->
-            <sources>
-
-                <!-- Because the tool source code is not in a directory
-                     called antlr, nor directly underneath the master
-                     directory, we need to map the output directory so that
-                     instead of starting with the name of the artifact, it
-                     is in the place where the build expects it.
-                  -->
-                <outputDirectoryMapping>tool</outputDirectoryMapping>
-
-
-                <fileSets>
-
-                    <!-- We have one file set, being the src sub-directory, which in
-                         the output archive, we also want to be called src/
-                      -->
-                    <fileSet>
-                        <directory>src</directory>
-                        <outputDirectory>src</outputDirectory>
-                    </fileSet>
-
-                    <!-- In the base tool directory, we need to include a number
-                         of files that either document the module or control the
-                         build. These are not underneath the src directory of course
-                         so they need to be named here (which nicely documents what
-                         is included.
-                      -->
-                    <fileSet>
-                        <includes>
-                            <include>pom.xml</include>
-                            <include>CHANGES.txt</include>
-                            <include>LICENSE.txt</include>
-                            <include>README.txt</include>
-                            <include>antlr.config</include>
-                        </includes>
-                    </fileSet>
-
-                </fileSets>
-
-            </sources>
-
-        </moduleSet>
-
-    </moduleSets>
-
-    <!-- In the base directory of the master build directory (the root of all
-         the other sources), there are a number of files that describe or control
-         the build (such as the master pom.xml and the BUILD.txt files). Hence
-         we need to describe them in their own fileset. No output mapping is required here
-         of course.
-      -->
-    <fileSets>
-        <fileSet>
-            <includes>
-                <include>pom.xml</include>
-                <include>antlrjar.xml</include>
-                <include>antlrsources.xml</include>
-                <include>BUILD.txt</include>
-            </includes>
-        </fileSet>
-    </fileSets>
-
-</assembly>
diff --git a/contributors.txt b/contributors.txt
new file mode 100644
index 0000000..c5d133d
--- /dev/null
+++ b/contributors.txt
@@ -0,0 +1,59 @@
+ANTLR Project Contributors Certification of Origin and Rights
+
+All contributors to ANTLR v3 must formally agree to abide by this
+certificate of origin by signing on the bottom with their github
+userid, full name, email address (you can obscure your e-mail, but it
+must be computable by human), and date.
+
+By signing this agreement, you are warranting and representing that
+you have the right to release code contributions or other content free
+of any obligations to third parties and are granting Terence Parr and
+ANTLR project contributors, henceforth referred to as The ANTLR
+Project, a license to incorporate it into The ANTLR Project tools
+(such as ANTLRWorks and StringTemplate) or related works under the BSD
+license. You understand that The ANTLR Project may or may not
+incorporate your contribution and you warrant and represent the
+following:
+
+1. I am the creator of all my contributions. I am the author of all
+   contributed work submitted and further warrant and represent that
+   such work is my original creation and I have the right to license
+   it to The ANTLR Project for release under the 3-clause BSD
+   license. I hereby grant The ANTLR Project a nonexclusive,
+   irrevocable, royalty-free, worldwide license to reproduce,
+   distribute, prepare derivative works, and otherwise use this
+   contribution as part of the ANTLR project, associated
+   documentation, books, and tools at no cost to The ANTLR Project.
+
+2. I have the right to submit. This submission does not violate the
+   rights of any person or entity and that I have legal authority over
+   this submission and to make this certification.
+
+3. If I violate another's rights, liability lies with me. I agree to
+   defend, indemnify, and hold The ANTLR Project and ANTLR users
+   harmless from any claim or demand, including reasonable attorney
+   fees, made by any third party due to or arising out of my violation
+   of these terms and conditions or my violation of the rights of
+   another person or entity.
+
+4. I understand and agree that this project and the contribution are
+   public and that a record of the contribution (including all
+   personal information I submit with it, including my sign-off) is
+   maintained indefinitely and may be redistributed consistent with
+   this project or the open source license indicated in the file.
+
+I have read this agreement and do so certify by adding my signoff to
+the end of the following contributors list.
+
+CONTRIBUTORS:
+
+YYYY/MM/DD, github id, Full name, email
+2013/04/17, ibre5041, Ivan Brezina, ibre5041@ibrezina.net
+2013/02/19, murrayju, Justin Murray, murrayju@addpcs.com
+2012/07/12, parrt, Terence Parr, parrt@antlr.org
+2012/08/08, Zannick, Benjamin S Wolf, jokeserver@gmail.com
+2012/09/15, martint, Martin Traverso, mtraverso@gmail.com
+2012/09/16, qmx, Douglas Campos, qmx@qmx.me
+2012/09/17, ksgokul, Gokulakannan Somasundaram, gokul007@gmail.com
+2012/11/22, sharwell, Sam Harwell, sam@tunnelvisionlabs.com
+2012/09/24, mike-lischke, Mike Lischke, mike@lischke-online.de
diff --git a/gunit-maven-plugin/antlr.config b/gunit-maven-plugin/antlr.config
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/gunit-maven-plugin/antlr.config
diff --git a/gunit-maven-plugin/pom.xml b/gunit-maven-plugin/pom.xml
index a11a50e..1a50e34 100644
--- a/gunit-maven-plugin/pom.xml
+++ b/gunit-maven-plugin/pom.xml
@@ -31,25 +31,8 @@
 
   -->
 
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 
-    <!--
-        The ANTLR Maven artifacts are now released via the Sonotype OSS
-        repository, which means that they are synced to Maven central 
-        within a few minutes of hitting the release repo for Sonotype.
-        To enable this, we inherit from the Sonotype provided parent
-        pom. However, we must also configure our .m2/settings.xml to include
-        the snapshot and staging server and the sonotype password. This 
-        means that only ANTLR developers can released the artifacts, but
-        anyone can build locally.
-      -->
-    <parent>
-        <groupId>org.sonatype.oss</groupId>
-        <artifactId>oss-parent</artifactId>
-        <version>7</version>
-    </parent> 
-    
     <modelVersion>4.0.0</modelVersion>
 
     <prerequisites>
@@ -59,86 +42,27 @@
     <groupId>org.antlr</groupId>
     <artifactId>maven-gunit-plugin</artifactId>
     <packaging>maven-plugin</packaging>
-    <version>3.4</version>
 
-    <name>Maven plugin for gUnit ANTLR V3.4</name>
+    <name>ANTLR 3 gUnit Maven plugin</name>
 	<description>A Maven plugin for incorporating gUnit testing of grammars</description>
     <url>http://antlr.org</url>
 
+    <!--
+
+    Inherit from the ANTLR master pom, which tells us what
+    version we are and allows us to inherit dependencies
+    and so on.
+    -->
+    <parent>
+        <groupId>org.antlr</groupId>
+        <artifactId>antlr-master</artifactId>
+        <version>3.5.2</version>
+    </parent>
+
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     </properties>
 
-    <!-- Where do we track bugs for this project?
-      -->
-    <issueManagement>
-        <system>JIRA</system>
-        <url>http://antlr.org/jira/browse/ANTLR</url>
-    </issueManagement>
-
-    <!-- Location of the license description for this project
-      -->
-    <licenses>
-        <license>
-            <distribution>repo</distribution>
-            <name>The BSD License</name>
-            <url>http://www.antlr.org/LICENSE.txt </url>
-        </license>
-    </licenses>
-
-    <profiles>
-        <profile>
-            <id>release-sign-artifacts</id>
-            <activation>
-                <property>
-                    <name>deploy</name>
-                    <value>true</value>
-                </property>
-            </activation>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-gpg-plugin</artifactId>
-                        <version>1.3</version>
-                        <executions>
-                            <execution>
-                                <id>sign-artifacts</id>
-                                <phase>verify</phase>
-                                <goals>
-                                   <goal>sign</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-    
-    <!-- Ancilliary information for completeness
-      -->
-    <inceptionYear>2009</inceptionYear>
-
-    <mailingLists>
-        <mailingList>
-            <archive>http://antlr.markmail.org/</archive>
-            <otherArchives>
-                <otherArchive>http://www.antlr.org/pipermail/antlr-interest/</otherArchive>
-            </otherArchives>
-            <name>ANTLR Users</name>
-            <subscribe>http://www.antlr.org/mailman/listinfo/antlr-interest/</subscribe>
-            <unsubscribe>http://www.antlr.org/mailman/options/antlr-interest/</unsubscribe>
-            <post>antlr-interest@antlr.org</post>
-        </mailingList>
-    </mailingLists>
-
-    <organization>
-        <name>ANTLR.org</name>
-        <url>http://www.antlr.org</url>
-    </organization>
-    <!-- ============================================================================= -->
-
     <!--
 
      What are we depedent on for the Mojos to execute? We need the
@@ -167,7 +91,7 @@
         <dependency>
             <groupId>org.codehaus.plexus</groupId>
             <artifactId>plexus-compiler-api</artifactId>
-            <version>1.5.3</version>
+            <version>2.0</version>
         </dependency>
 
         <!--
@@ -178,34 +102,22 @@
         <dependency>
             <groupId>org.antlr</groupId>
             <artifactId>antlr</artifactId>
-            <version>3.4</version>
+            <version>${project.version}</version>
         </dependency>
 
         <!--
          Dependency on the gUnit artifact.
         -->
         <dependency>
-            <groupId>${groupId}</groupId>
+            <groupId>org.antlr</groupId>
             <artifactId>gunit</artifactId>
-            <version>3.4</version>
-        </dependency>
-
-        <!--
-          Testing requirements...
-          -->
-        <dependency>
-
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <version>4.8.2</version>
-            <scope>test</scope>
-
+            <version>${project.version}</version>
         </dependency>
 
         <dependency>
             <groupId>org.apache.maven.shared</groupId>
             <artifactId>maven-plugin-testing-harness</artifactId>
-            <version>1.0</version>
+            <version>1.1</version>
             <scope>test</scope>
         </dependency>
         
@@ -213,55 +125,17 @@
     
     <build>
 
-        <defaultGoal>install</defaultGoal>
         <plugins>
-            
-            <plugin>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <version>2.0.2</version>
-                <configuration>
-                    <source>1.6</source>
-                    <target>jsr14</target>
-                </configuration>
-            </plugin>
-            
+
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-project-info-reports-plugin</artifactId>
-                <version>2.4</version>
+                <version>2.6</version>
                 <configuration>
                     <dependencyLocationsEnabled>false</dependencyLocationsEnabled>
                 </configuration>
             </plugin>
 
-            <plugin>  
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-source-plugin</artifactId>
-                <version>2.1.2</version>
-                <executions>
-                    <execution>
-                        <id>attach-sources</id>
-                        <goals>
-                            <goal>jar</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-			
-            <plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-javadoc-plugin</artifactId>
-                <version>2.8</version>
-				<executions>
-					<execution>
-						<id>attach-javadocs</id>
-						<goals>
-							<goal>jar</goal>
-						</goals>
-					</execution>
-				</executions>
-			</plugin>
-            
         </plugins>
 
     </build>
diff --git a/gunit-maven-plugin/src/main/java/org/antlr/mojo/antlr3/GUnitExecuteMojo.java b/gunit-maven-plugin/src/main/java/org/antlr/mojo/antlr3/GUnitExecuteMojo.java
index db3f569..a7e2317 100644
--- a/gunit-maven-plugin/src/main/java/org/antlr/mojo/antlr3/GUnitExecuteMojo.java
+++ b/gunit-maven-plugin/src/main/java/org/antlr/mojo/antlr3/GUnitExecuteMojo.java
@@ -85,14 +85,14 @@
      *
      * @parameter
      */
-    private Set includes;
+    private Set<String> includes;
 
     /**
      * A set of exclude patterns.
      *
      * @parameter
      */
-    private Set excludes;
+    private Set<String> excludes;
 
 	/**
      * Specifies directory to which gUnit reports should get written.
@@ -104,22 +104,22 @@
 
 	/**
 	 * Should gUnit functionality be completely by-passed?
-	 * <p/>
-	 * By default we skip gUnit tests if the user requested that all testing be skipped using 'maven.test.skip'
+	 * <p>
+	 * By default we skip gUnit tests if the user requested that all testing be skipped using 'maven.test.skip'</p>
 	 *
 	 * @parameter expression="${maven.test.skip}"
 	 */
 	private boolean skip;
 
-	public Set getIncludePatterns() {
+	public Set<String> getIncludePatterns() {
 		return includes == null || includes.isEmpty()
 				? Collections.singleton( "**/*.testsuite" )
 				: includes;
 	}
 
-	public Set getExcludePatterns() {
+	public Set<String> getExcludePatterns() {
 		return excludes == null
-				? Collections.emptySet()
+				? Collections.<String>emptySet()
 				: excludes;
 	}
 
@@ -346,24 +346,11 @@
 	}
 
 	private Set<File> collectIncludedSourceGrammars() throws MojoExecutionException {
-		SourceMapping mapping = new SuffixMapping( "g", Collections.EMPTY_SET );
+		SourceMapping mapping = new SuffixMapping( "g", Collections.<String>emptySet() );
         SourceInclusionScanner scan = new SimpleSourceInclusionScanner( getIncludePatterns(), getExcludePatterns() );
         scan.addSourceMapping( mapping );
 		try {
-			Set scanResults = scan.getIncludedSources( sourceDirectory, null );
-			Set<File> results = new HashSet<File>();
-			for ( Object result : scanResults ) {
-				if ( result instanceof File ) {
-					results.add( ( File ) result );
-				}
-				else if ( result instanceof String ) {
-					results.add( new File( ( String ) result ) );
-				}
-				else {
-					throw new MojoExecutionException( "Unexpected result type from scanning [" + result.getClass().getName() + "]" );
-				}
-			}
-			return results;
+			return scan.getIncludedSources( sourceDirectory, null );
 		}
 		catch ( InclusionScanException e ) {
 			throw new MojoExecutionException( "Error determining gUnit sources", e );
diff --git a/gunit/pom.xml b/gunit/pom.xml
index cb35b6b..8a8da9e 100644
--- a/gunit/pom.xml
+++ b/gunit/pom.xml
@@ -1,11 +1,12 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
     <modelVersion>4.0.0</modelVersion>
-    <groupId>org.antlr</groupId>
     <artifactId>gunit</artifactId>
     <packaging>jar</packaging>
   
-    <name>ANTLR gUnit v3.4</name>
+    <name>ANTLR 3 gUnit</name>
+    <description>gUnit grammar testing tool for ANTLR 3</description>
+
   <!--
 
     Inherit from the ANTLR master pom, which tells us what
@@ -16,11 +17,11 @@
     <parent>
         <groupId>org.antlr</groupId>
         <artifactId>antlr-master</artifactId>
-        <version>3.4</version>
+        <version>3.5.2</version>
     </parent>
 
     <url>http://www.antlr.org/wiki/display/ANTLR3/gUnit+-+Grammar+Unit+Testing</url>
-  
+
   <!--
 
     Tell Maven which other artifacts we need in order to
@@ -37,7 +38,6 @@
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
-            <version>4.8.2</version>
             <scope>compile</scope>
         </dependency>
 
@@ -48,34 +48,24 @@
             <scope>compile</scope>
             
         </dependency>
-
-        <dependency>
-            <groupId>org.antlr</groupId>
-            <artifactId>ST4</artifactId>
-            <version>4.0.4</version>
-            <scope>compile</scope>
-        </dependency>
-
+        
         <dependency>
             <groupId>org.antlr</groupId>
             <artifactId>stringtemplate</artifactId>
-            <version>3.2.1</version>
             <scope>compile</scope>
         </dependency>
-        
+
     </dependencies>
 
     <build>
 
-        <defaultGoal>install</defaultGoal>
-
         <plugins>
 
             <plugin>
                 <groupId>org.antlr</groupId>
                 <artifactId>antlr3-maven-plugin</artifactId>
                 <version>${project.version}</version>
-                <configuration></configuration>
+                <configuration />
                 <executions>
                     <execution>
                         <goals>
@@ -85,42 +75,8 @@
                 </executions>
             </plugin>
 
-            <plugin>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <configuration>
-                    <source>1.6</source>
-                    <target>jsr14</target>
-                    <sourceDirectory>src</sourceDirectory>
-                </configuration>
-            </plugin>
-
-            <plugin>
-                <artifactId>maven-surefire-plugin</artifactId>
-                <version>2.9</version>
-            </plugin>
-
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>findbugs-maven-plugin</artifactId>
-                <version>2.3.2</version>
-                <configuration>
-                    <findbugsXmlOutput>true</findbugsXmlOutput>
-                    <findbugsXmlWithMessages>true</findbugsXmlWithMessages>
-                    <xmlOutput>true</xmlOutput>
-                </configuration>
-            </plugin>
-
         </plugins>
 
-        <extensions>
-            <extension>
-                <groupId>org.apache.maven.wagon</groupId>
-                <artifactId>wagon-ssh-external</artifactId>
-                <version>1.0-beta-2</version>
-            </extension>
-        </extensions>
-
-    
     </build>
 
 </project>
diff --git a/gunit/src/main/antlr3/org/antlr/gunit/swingui/parsers/StGUnit.g b/gunit/src/main/antlr3/org/antlr/gunit/swingui/parsers/StGUnit.g
index 1701214..e645f62 100644
--- a/gunit/src/main/antlr3/org/antlr/gunit/swingui/parsers/StGUnit.g
+++ b/gunit/src/main/antlr3/org/antlr/gunit/swingui/parsers/StGUnit.g
@@ -76,17 +76,17 @@
 	;
 	
 expect returns [ITestCaseOutput out]
-	:	OK			{$out = adapter.createBoolOutput(true);}
-	|	FAIL		{$out = adapter.createBoolOutput(false);}
-	|	'returns' RETVAL {$out = adapter.createReturnOutput($RETVAL.text);}
-	|	'->' output {$out = adapter.createStdOutput($output.text);}
-	|	'->' AST	{$out = adapter.createAstOutput($AST.text);}
+	:	OK			{$out = TestSuiteAdapter.createBoolOutput(true);}
+	|	FAIL		{$out = TestSuiteAdapter.createBoolOutput(false);}
+	|	'returns' RETVAL {$out = TestSuiteAdapter.createReturnOutput($RETVAL.text);}
+	|	'->' output {$out = TestSuiteAdapter.createStdOutput($output.text);}
+	|	'->' AST	{$out = TestSuiteAdapter.createAstOutput($AST.text);}
 	;
 
 input returns [ITestCaseInput in]
-	:	STRING 		{$in = adapter.createStringInput($STRING.text);}
-	|	ML_STRING	{$in = adapter.createMultiInput($ML_STRING.text);}
-	|	fileInput	{$in = adapter.createFileInput($fileInput.path);}
+	:	STRING 		{$in = TestSuiteAdapter.createStringInput($STRING.text);}
+	|	ML_STRING	{$in = TestSuiteAdapter.createMultiInput($ML_STRING.text);}
+	|	fileInput	{$in = TestSuiteAdapter.createFileInput($fileInput.path);}
 	;
 
 output
diff --git a/gunit/src/main/java/org/antlr/gunit/AbstractTest.java b/gunit/src/main/java/org/antlr/gunit/AbstractTest.java
index 158bf04..9d2c8ec 100644
--- a/gunit/src/main/java/org/antlr/gunit/AbstractTest.java
+++ b/gunit/src/main/java/org/antlr/gunit/AbstractTest.java
@@ -63,7 +63,7 @@
 	public String getTestedRuleName() { return this.testedRuleName; }
 	public int getTestCaseIndex() { return this.testCaseIndex; }
 	
-	public void setHeader(String rule, String lexicalRule, String treeRule, int numOfTest, int line) {
+	public void setHeader(String rule, String lexicalRule, String treeRule, int numOfTest, int line, String input) {
 		StringBuffer buf = new StringBuffer();
 		buf.append("test" + numOfTest + " (");
 		if ( treeRule!=null ) {
@@ -73,6 +73,9 @@
 			buf.append(lexicalRule + ", line"+line+")" + " - ");
 		}
 		else buf.append(rule + ", line"+line+")" + " - ");
+		buf.append( "\"" );
+		buf.append( input );
+		buf.append( "\"" );
 		this.header = buf.toString();
 	}
 	public void setActual(String actual) { this.actual = actual; }
diff --git a/gunit/src/main/java/org/antlr/gunit/JUnitCodeGen.java b/gunit/src/main/java/org/antlr/gunit/JUnitCodeGen.java
index 4713cf7..ed5282e 100644
--- a/gunit/src/main/java/org/antlr/gunit/JUnitCodeGen.java
+++ b/gunit/src/main/java/org/antlr/gunit/JUnitCodeGen.java
@@ -73,7 +73,7 @@
         this.testsuiteDir = testsuiteDir;
         /** Map the name of rules having return value to its return type */
         ruleWithReturn = new HashMap<String, String>();
-        Class parserClass = locateParserClass( grammarInfo, classLoader );
+        Class<?> parserClass = locateParserClass( grammarInfo, classLoader );
         Method[] methods = parserClass.getDeclaredMethods();
         for(Method method : methods) {
             if ( !method.getReturnType().getName().equals("void") ) {
@@ -82,7 +82,7 @@
         }
     }
 
-    private Class locateParserClass(GrammarInfo grammarInfo, ClassLoader classLoader) throws ClassNotFoundException {
+    private Class<?> locateParserClass(GrammarInfo grammarInfo, ClassLoader classLoader) throws ClassNotFoundException {
         String parserClassName = grammarInfo.getGrammarName() + "Parser";
         if ( grammarInfo.getGrammarPackage() != null ) {
             parserClassName = grammarInfo.getGrammarPackage()+ "." + parserClassName;
@@ -189,13 +189,14 @@
     private void genParserMethods(StringTemplateGroup group, StringBuffer buf) {
         for ( gUnitTestSuite ts: grammarInfo.getRuleTestSuites() ) {
             int i = 0;
-            for ( gUnitTestInput input: ts.testSuites.keySet() ) {	// each rule may contain multiple tests
+            for ( Map.Entry<gUnitTestInput, AbstractTest> entry : ts.testSuites.entrySet() ) {	// each rule may contain multiple tests
+                gUnitTestInput input = entry.getKey();
                 i++;
                 StringTemplate testRuleMethodST;
                 /** If rule has multiple return values or ast*/
-                if ( ts.testSuites.get(input).getType()== gUnitParser.ACTION && ruleWithReturn.containsKey(ts.getRuleName()) ) {
+                if ( entry.getValue().getType()== gUnitParser.ACTION && ruleWithReturn.containsKey(ts.getRuleName()) ) {
                     testRuleMethodST = group.getInstanceOf("testRuleMethod2");
-                    String outputString = ts.testSuites.get(input).getText();
+                    String outputString = entry.getValue().getText();
                     testRuleMethodST.setAttribute("methodName", "test"+changeFirstCapital(ts.getRuleName())+i);
                     testRuleMethodST.setAttribute("testRuleName", '"'+ts.getRuleName()+'"');
                     testRuleMethodST.setAttribute("test", input);
@@ -208,21 +209,21 @@
                     if ( ts.isLexicalRule() ) testRuleName = ts.getLexicalRuleName();
                     else testRuleName = ts.getRuleName();
                     testRuleMethodST = group.getInstanceOf("testRuleMethod");
-                    String outputString = ts.testSuites.get(input).getText();
+                    String outputString = entry.getValue().getText();
                     testRuleMethodST.setAttribute("isLexicalRule", ts.isLexicalRule());
                     testRuleMethodST.setAttribute("methodName", "test"+changeFirstCapital(testRuleName)+i);
                     testRuleMethodST.setAttribute("testRuleName", '"'+testRuleName+'"');
                     testRuleMethodST.setAttribute("test", input);
-                    testRuleMethodST.setAttribute("tokenType", getTypeString(ts.testSuites.get(input).getType()));
+                    testRuleMethodST.setAttribute("tokenType", getTypeString(entry.getValue().getType()));
 
                     // normalize whitespace
                     outputString = normalizeTreeSpec(outputString);
 
-                    if ( ts.testSuites.get(input).getType()==gUnitParser.ACTION ) {	// trim ';' at the end of ACTION if there is...
+                    if ( entry.getValue().getType()==gUnitParser.ACTION ) {	// trim ';' at the end of ACTION if there is...
                         //testRuleMethodST.setAttribute("expecting", outputString.substring(0, outputString.length()-1));
                         testRuleMethodST.setAttribute("expecting", outputString);
                     }
-                    else if ( ts.testSuites.get(input).getType()==gUnitParser.RETVAL ) {	// Expected: RETVAL
+                    else if ( entry.getValue().getType()==gUnitParser.RETVAL ) {	// Expected: RETVAL
                         testRuleMethodST.setAttribute("expecting", outputString);
                     }
                     else {	// Attach "" to expected STRING or AST
@@ -239,13 +240,14 @@
     private void genTreeMethods(StringTemplateGroup group, StringBuffer buf) {
         for ( gUnitTestSuite ts: grammarInfo.getRuleTestSuites() ) {
             int i = 0;
-            for ( gUnitTestInput input: ts.testSuites.keySet() ) {	// each rule may contain multiple tests
+            for ( Map.Entry<gUnitTestInput, AbstractTest> entry : ts.testSuites.entrySet() ) {	// each rule may contain multiple tests
+                gUnitTestInput input = entry.getKey();
                 i++;
                 StringTemplate testRuleMethodST;
                 /** If rule has multiple return values or ast*/
-                if ( ts.testSuites.get(input).getType()== gUnitParser.ACTION && ruleWithReturn.containsKey(ts.getTreeRuleName()) ) {
+                if ( entry.getValue().getType()== gUnitParser.ACTION && ruleWithReturn.containsKey(ts.getTreeRuleName()) ) {
                     testRuleMethodST = group.getInstanceOf("testTreeRuleMethod2");
-                    String outputString = ts.testSuites.get(input).getText();
+                    String outputString = entry.getValue().getText();
                     testRuleMethodST.setAttribute("methodName", "test"+changeFirstCapital(ts.getTreeRuleName())+"_walks_"+
                                                                 changeFirstCapital(ts.getRuleName())+i);
                     testRuleMethodST.setAttribute("testTreeRuleName", '"'+ts.getTreeRuleName()+'"');
@@ -256,19 +258,19 @@
                 }
                 else {
                     testRuleMethodST = group.getInstanceOf("testTreeRuleMethod");
-                    String outputString = ts.testSuites.get(input).getText();
+                    String outputString = entry.getValue().getText();
                     testRuleMethodST.setAttribute("methodName", "test"+changeFirstCapital(ts.getTreeRuleName())+"_walks_"+
                                                                 changeFirstCapital(ts.getRuleName())+i);
                     testRuleMethodST.setAttribute("testTreeRuleName", '"'+ts.getTreeRuleName()+'"');
                     testRuleMethodST.setAttribute("testRuleName", '"'+ts.getRuleName()+'"');
                     testRuleMethodST.setAttribute("test", input);
-                    testRuleMethodST.setAttribute("tokenType", getTypeString(ts.testSuites.get(input).getType()));
+                    testRuleMethodST.setAttribute("tokenType", getTypeString(entry.getValue().getType()));
 
-                    if ( ts.testSuites.get(input).getType()==gUnitParser.ACTION ) {	// trim ';' at the end of ACTION if there is...
+                    if ( entry.getValue().getType()==gUnitParser.ACTION ) {	// trim ';' at the end of ACTION if there is...
                         //testRuleMethodST.setAttribute("expecting", outputString.substring(0, outputString.length()-1));
                         testRuleMethodST.setAttribute("expecting", outputString);
                     }
-                    else if ( ts.testSuites.get(input).getType()==gUnitParser.RETVAL ) {	// Expected: RETVAL
+                    else if ( entry.getValue().getType()==gUnitParser.RETVAL ) {	// Expected: RETVAL
                         testRuleMethodST.setAttribute("expecting", outputString);
                     }
                     else {	// Attach "" to expected STRING or AST
diff --git a/gunit/src/main/java/org/antlr/gunit/gUnitBaseTest.java b/gunit/src/main/java/org/antlr/gunit/gUnitBaseTest.java
index bf089c3..2b3b085 100644
--- a/gunit/src/main/java/org/antlr/gunit/gUnitBaseTest.java
+++ b/gunit/src/main/java/org/antlr/gunit/gUnitBaseTest.java
@@ -29,37 +29,30 @@
 
 import junit.framework.TestCase;
 import org.antlr.runtime.*;
-import org.antlr.runtime.tree.CommonTree;
-import org.antlr.runtime.tree.CommonTreeNodeStream;
-import org.antlr.runtime.tree.TreeAdaptor;
-import org.antlr.runtime.tree.TreeNodeStream;
+import org.antlr.runtime.tree.*;
 import org.antlr.stringtemplate.StringTemplate;
 
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.PrintStream;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
+import java.io.*;
+import java.lang.reflect.*;
 
-/** All gUnit-generated JUnit class should extend this class 
+/** All gUnit-generated JUnit class should extend this class
  *  which implements the essential methods for triggering
  *  ANTLR parser/tree walker
  */
 public abstract class gUnitBaseTest extends TestCase {
-	
+
 	public String treeAdaptorPath;
 	public String packagePath;
 	public String lexerPath;
 	public String parserPath;
 	public String treeParserPath;
-	
+
 	protected String stdout;
 	protected String stderr;
-	
+
 	private PrintStream console = System.out;
 	private PrintStream consoleErr = System.err;
-	
+
 	// Invoke target lexer.rule
 	public String execLexer(String testRuleName, int line, String testInput, boolean isFile) throws Exception {
 		CharStream input;
@@ -77,20 +70,18 @@
 		else {
 			input = new ANTLRStringStream(testInput);
 		}
-		Class lexer = null;
+		Class<? extends Lexer> lexer;
 		PrintStream ps = null;		// for redirecting stdout later
 		PrintStream ps2 = null;		// for redirecting stderr later
         try {
             /** Use Reflection to create instances of lexer and parser */
-        	lexer = Class.forName(lexerPath);
-            Class[] lexArgTypes = new Class[]{CharStream.class};				// assign type to lexer's args
-            Constructor lexConstructor = lexer.getConstructor(lexArgTypes);        
-            Object[] lexArgs = new Object[]{input};								// assign value to lexer's args   
-            Lexer lexObj = (Lexer)lexConstructor.newInstance(lexArgs);				// makes new instance of lexer    
+        	lexer = Class.forName(lexerPath).asSubclass(Lexer.class);
+            Constructor<? extends Lexer> lexConstructor = lexer.getConstructor(CharStream.class);
+            Lexer lexObj = lexConstructor.newInstance(input);				// makes new instance of lexer
             input.setLine(line);
 
-            Method ruleName = lexer.getMethod("m"+testRuleName, new Class[0]);
-            
+            Method ruleName = lexer.getMethod("m"+testRuleName);
+
             /** Start of I/O Redirecting */
             ByteArrayOutputStream out = new ByteArrayOutputStream();
             ByteArrayOutputStream err = new ByteArrayOutputStream();
@@ -102,15 +93,15 @@
 
             /** Invoke lexer rule, and get the current index in CharStream */
             ruleName.invoke(lexObj, new Object[0]);
-            Method ruleName2 = lexer.getMethod("getCharIndex", new Class[0]);
+            Method ruleName2 = lexer.getMethod("getCharIndex");
             int currentIndex = (Integer) ruleName2.invoke(lexObj, new Object[0]);
             if ( currentIndex!=input.size() ) {
             	ps2.println("extra text found, '"+input.substring(currentIndex, input.size()-1)+"'");
             }
-			
+
             this.stdout = null;
 			this.stderr = null;
-            
+
 			if ( err.toString().length()>0 ) {
 				this.stderr = err.toString();
 				return this.stderr;
@@ -122,17 +113,17 @@
 				return null;
 			}
         } catch (ClassNotFoundException e) {
-        	e.printStackTrace(); System.exit(1);
+        	handleUnexpectedException(e);
         } catch (SecurityException e) {
-        	e.printStackTrace(); System.exit(1);
+        	handleUnexpectedException(e);
         } catch (NoSuchMethodException e) {
-        	e.printStackTrace(); System.exit(1);
+        	handleUnexpectedException(e);
         } catch (IllegalArgumentException e) {
-        	e.printStackTrace(); System.exit(1);
+        	handleUnexpectedException(e);
         } catch (InstantiationException e) {
-        	e.printStackTrace(); System.exit(1);
+        	handleUnexpectedException(e);
         } catch (IllegalAccessException e) {
-        	e.printStackTrace(); System.exit(1);
+        	handleUnexpectedException(e);
         } catch (InvocationTargetException e) {	// This exception could be caused from ANTLR Runtime Exception, e.g. MismatchedTokenException
         	if ( e.getCause()!=null ) this.stderr = e.getCause().toString();
 			else this.stderr = e.toString();
@@ -149,9 +140,9 @@
         }
         return this.stdout;
 	}
-	
+
 	// Invoke target parser.rule
-	
+
 	public Object execParser(String testRuleName, int line, String testInput, boolean isFile) throws Exception {
 		CharStream input;
 		/** Set up ANTLR input stream based on input source, file or String */
@@ -168,33 +159,28 @@
 		else {
 			input = new ANTLRStringStream(testInput);
 		}
-		Class lexer = null;
-		Class parser = null;
+		Class<? extends Lexer> lexer;
+		Class<? extends Parser> parser;
 		PrintStream ps = null;		// for redirecting stdout later
 		PrintStream ps2 = null;		// for redirecting stderr later
         ByteArrayOutputStream out = null;
         ByteArrayOutputStream err = null;
 		try {
 			/** Use Reflection to create instances of lexer and parser */
-			lexer = Class.forName(lexerPath);
-            Class[] lexArgTypes = new Class[]{CharStream.class};				// assign type to lexer's args
-            Constructor lexConstructor = lexer.getConstructor(lexArgTypes);
-            Object[] lexArgs = new Object[]{input};								// assign value to lexer's args   
-            Lexer lexObj = (Lexer)lexConstructor.newInstance(lexArgs);				// makes new instance of lexer
+			lexer = Class.forName(lexerPath).asSubclass(Lexer.class);
+            Constructor<? extends Lexer> lexConstructor = lexer.getConstructor(CharStream.class);
+            Lexer lexObj = lexConstructor.newInstance(input);				// makes new instance of lexer
             input.setLine(line);
 
             CommonTokenStream tokens = new CommonTokenStream(lexObj);
-            parser = Class.forName(parserPath);
-            Class[] parArgTypes = new Class[]{TokenStream.class};				// assign type to parser's args
-            Constructor parConstructor = parser.getConstructor(parArgTypes);
-            Object[] parArgs = new Object[]{tokens};							// assign value to parser's args  
-            Parser parObj = (Parser)parConstructor.newInstance(parArgs);				// makes new instance of parser
-            
+            parser = Class.forName(parserPath).asSubclass(Parser.class);
+            Constructor<? extends Parser> parConstructor = parser.getConstructor(TokenStream.class);
+            Parser parObj = parConstructor.newInstance(tokens);				// makes new instance of parser
+
             // set up customized tree adaptor if necessary
             if ( treeAdaptorPath!=null ) {
-            	parArgTypes = new Class[]{TreeAdaptor.class};
-            	Method _setTreeAdaptor = parser.getMethod("setTreeAdaptor", parArgTypes);
-            	Class _treeAdaptor = Class.forName(treeAdaptorPath);
+            	Method _setTreeAdaptor = parser.getMethod("setTreeAdaptor", TreeAdaptor.class);
+            	Class<? extends TreeAdaptor> _treeAdaptor = Class.forName(treeAdaptorPath).asSubclass(TreeAdaptor.class);
             	_setTreeAdaptor.invoke(parObj, _treeAdaptor.newInstance());
             }
 
@@ -217,7 +203,7 @@
             if ( ruleReturn!=null ) {
                 if ( ruleReturn.getClass().toString().indexOf(testRuleName+"_return")>0 ) {
                 	try {	// NullPointerException may happen here...
-                		Class _return = Class.forName(parserPath+"$"+testRuleName+"_return");
+                		Class<?> _return = Class.forName(parserPath+"$"+testRuleName+"_return");
                 		Method[] methods = _return.getDeclaredMethods();
                 		for(Method method : methods) {
 			                if ( method.getName().equals("getTree") ) {
@@ -240,13 +226,13 @@
 
 			this.stdout = "";
 			this.stderr = "";
-			
+
 			/** Invalid input */
             if ( tokens.index()!=tokens.size()-1 ) {
             	//throw new InvalidInputException();
             	this.stderr += "Stopped parsing at token index "+tokens.index()+": ";
             }
-            
+
 			// retVal could be actual return object from rule, stderr or stdout
             this.stdout += out.toString();
             this.stderr += err.toString();
@@ -267,16 +253,16 @@
 			}
 		}
         catch (ClassNotFoundException e) {
-			e.printStackTrace(); System.exit(1);
+        	handleUnexpectedException(e);
 		}
         catch (SecurityException e) {
-			e.printStackTrace(); System.exit(1);
+        	handleUnexpectedException(e);
 		}
         catch (NoSuchMethodException e) {
-			e.printStackTrace(); System.exit(1);
+        	handleUnexpectedException(e);
 		}
         catch (IllegalAccessException e) {
-			e.printStackTrace(); System.exit(1);
+        	handleUnexpectedException(e);
 		}
         catch (InvocationTargetException e) {
             this.stdout = out.toString();
@@ -297,7 +283,7 @@
         }
 		return this.stdout;
 	}
-	
+
 	// Invoke target parser.rule
 	public Object execTreeParser(String testTreeRuleName, String testRuleName, String testInput, boolean isFile) throws Exception {
 		CharStream input;
@@ -314,37 +300,32 @@
 		else {
 			input = new ANTLRStringStream(testInput);
 		}
-		Class lexer = null;
-		Class parser = null;
-		Class treeParser = null;
+		Class<? extends Lexer> lexer;
+		Class<? extends Parser> parser;
+		Class<? extends TreeParser> treeParser;
 		PrintStream ps = null;		// for redirecting stdout later
 		PrintStream ps2 = null;		// for redirecting stderr later
 		try {
 			/** Use Reflection to create instances of lexer and parser */
-        	lexer = Class.forName(lexerPath);
-            Class[] lexArgTypes = new Class[]{CharStream.class};				// assign type to lexer's args
-            Constructor lexConstructor = lexer.getConstructor(lexArgTypes);        
-            Object[] lexArgs = new Object[]{input};								// assign value to lexer's args   
-            Object lexObj = lexConstructor.newInstance(lexArgs);				// makes new instance of lexer    
-            
-            CommonTokenStream tokens = new CommonTokenStream((Lexer) lexObj);
-            
-            parser = Class.forName(parserPath);
-            Class[] parArgTypes = new Class[]{TokenStream.class};				// assign type to parser's args
-            Constructor parConstructor = parser.getConstructor(parArgTypes);
-            Object[] parArgs = new Object[]{tokens};							// assign value to parser's args  
-            Object parObj = parConstructor.newInstance(parArgs);				// makes new instance of parser      
-            
+        	lexer = Class.forName(lexerPath).asSubclass(Lexer.class);
+            Constructor<? extends Lexer> lexConstructor = lexer.getConstructor(CharStream.class);
+            Lexer lexObj = lexConstructor.newInstance(input);				// makes new instance of lexer
+
+            CommonTokenStream tokens = new CommonTokenStream(lexObj);
+
+            parser = Class.forName(parserPath).asSubclass(Parser.class);
+            Constructor<? extends Parser> parConstructor = parser.getConstructor(TokenStream.class);
+            Parser parObj = parConstructor.newInstance(tokens);				// makes new instance of parser
+
             // set up customized tree adaptor if necessary
-            TreeAdaptor customTreeAdaptor = null; 
+            TreeAdaptor customTreeAdaptor = null;
             if ( treeAdaptorPath!=null ) {
-            	parArgTypes = new Class[]{TreeAdaptor.class};
-            	Method _setTreeAdaptor = parser.getMethod("setTreeAdaptor", parArgTypes);
-            	Class _treeAdaptor = Class.forName(treeAdaptorPath);
-            	customTreeAdaptor = (TreeAdaptor) _treeAdaptor.newInstance();
+            	Method _setTreeAdaptor = parser.getMethod("setTreeAdaptor", TreeAdaptor.class);
+            	Class<? extends TreeAdaptor> _treeAdaptor = Class.forName(treeAdaptorPath).asSubclass(TreeAdaptor.class);
+            	customTreeAdaptor = _treeAdaptor.newInstance();
             	_setTreeAdaptor.invoke(parObj, customTreeAdaptor);
             }
-            
+
             Method ruleName = parser.getMethod(testRuleName);
 
             /** Start of I/O Redirecting */
@@ -358,8 +339,8 @@
 
             /** Invoke grammar rule, and get the return value */
             Object ruleReturn = ruleName.invoke(parObj);
-            
-            Class _return = Class.forName(parserPath+"$"+testRuleName+"_return");            	
+
+            Class<?> _return = Class.forName(parserPath+"$"+testRuleName+"_return");
         	Method returnName = _return.getMethod("getTree");
         	CommonTree tree = (CommonTree) returnName.invoke(ruleReturn);
 
@@ -374,22 +355,20 @@
         	// AST nodes have payload that point into token stream
         	nodes.setTokenStream(tokens);
         	// Create a tree walker attached to the nodes stream
-        	treeParser = Class.forName(treeParserPath);
-            Class[] treeParArgTypes = new Class[]{TreeNodeStream.class};		// assign type to tree parser's args
-            Constructor treeParConstructor = treeParser.getConstructor(treeParArgTypes);
-            Object[] treeParArgs = new Object[]{nodes};							// assign value to tree parser's args  
-            Object treeParObj = treeParConstructor.newInstance(treeParArgs);	// makes new instance of tree parser      
+        	treeParser = Class.forName(treeParserPath).asSubclass(TreeParser.class);
+            Constructor<? extends TreeParser> treeParConstructor = treeParser.getConstructor(TreeNodeStream.class);
+            TreeParser treeParObj = treeParConstructor.newInstance(nodes);	// makes new instance of tree parser
         	// Invoke the tree rule, and store the return value if there is
             Method treeRuleName = treeParser.getMethod(testTreeRuleName);
             Object treeRuleReturn = treeRuleName.invoke(treeParObj);
-            
+
             String astString = null;
             String stString = null;
             /** If tree rule has return value, determine if it contains an AST or a ST */
             if ( treeRuleReturn!=null ) {
                 if ( treeRuleReturn.getClass().toString().indexOf(testTreeRuleName+"_return")>0 ) {
                 	try {	// NullPointerException may happen here...
-                		Class _treeReturn = Class.forName(treeParserPath+"$"+testTreeRuleName+"_return");
+                		Class<?> _treeReturn = Class.forName(treeParserPath+"$"+testTreeRuleName+"_return");
                 		Method[] methods = _treeReturn.getDeclaredMethods();
 			            for(Method method : methods) {
 			                if ( method.getName().equals("getTree") ) {
@@ -412,12 +391,12 @@
 
 			this.stdout = null;
 			this.stderr = null;
-			
+
 			/** Invalid input */
             if ( tokens.index()!=tokens.size()-1 ) {
             	throw new InvalidInputException();
             }
-			
+
 			// retVal could be actual return object from rule, stderr or stdout
 			if ( err.toString().length()>0 ) {
 				this.stderr = err.toString();
@@ -439,13 +418,13 @@
 				return null;
 			}
 		} catch (ClassNotFoundException e) {
-			e.printStackTrace(); System.exit(1);
+			handleUnexpectedException(e);
 		} catch (SecurityException e) {
-			e.printStackTrace(); System.exit(1);
+			handleUnexpectedException(e);
 		} catch (NoSuchMethodException e) {
-			e.printStackTrace(); System.exit(1);
+			handleUnexpectedException(e);
 		} catch (IllegalAccessException e) {
-			e.printStackTrace(); System.exit(1);
+			handleUnexpectedException(e);
 		} catch (InvocationTargetException e) {
 			if ( e.getCause()!=null ) this.stderr = e.getCause().toString();
 			else this.stderr = e.toString();
@@ -462,11 +441,13 @@
         }
 		return stdout;
 	}
-	
+
 	// Modify the return value if the expected token type is OK or FAIL
-	public Object examineExecResult(int tokenType, Object retVal) {	
+	public Object examineExecResult(int tokenType, Object retVal) {
+		System.out.println("expect "+(tokenType==gUnitParser.OK?"OK":"FAIL")+
+						   "stderr=="+stderr);
 		if ( tokenType==gUnitParser.OK ) {	// expected Token: OK
-			if ( this.stderr==null ) {
+			if ( this.stderr==null || this.stderr.length()==0 ) {
 				return "OK";
 			}
 			else {
@@ -474,7 +455,7 @@
 			}
 		}
 		else if ( tokenType==gUnitParser.FAIL ) {	// expected Token: FAIL
-			if ( this.stderr!=null ) {
+			if ( this.stderr!=null && this.stderr.length()>0 ) {
 				return "FAIL";
 			}
 			else {
@@ -483,7 +464,12 @@
 		}
 		else {	// return the same object for the other token types
 			return retVal;
-		}		
+		}
 	}
-	
+
+	protected void handleUnexpectedException(Exception e) {
+		e.printStackTrace();
+		System.exit(1);
+	}
+
 }
diff --git a/gunit/src/main/java/org/antlr/gunit/gUnitExecutor.java b/gunit/src/main/java/org/antlr/gunit/gUnitExecutor.java
index 8498c65..ab759c8 100644
--- a/gunit/src/main/java/org/antlr/gunit/gUnitExecutor.java
+++ b/gunit/src/main/java/org/antlr/gunit/gUnitExecutor.java
@@ -47,6 +47,8 @@
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
+import org.antlr.runtime.tree.TreeParser;
 
 public class gUnitExecutor implements ITestSuite {
 	public GrammarInfo grammarInfo;
@@ -103,7 +105,7 @@
 		return grammarClassLoader;
 	}
 
-	protected final Class classForName(String name) throws ClassNotFoundException {
+	protected final Class<?> classForName(String name) throws ClassNotFoundException {
 		return getGrammarClassLoader().loadClass( name );
 	}
 
@@ -146,8 +148,7 @@
 			}
 		}
 		catch (Exception e) {
-            e.printStackTrace();
-            System.exit(1);
+			handleUnexpectedException(e);
         }
 		return testResultST.toString();
 	}
@@ -173,11 +174,12 @@
 			String rule = ts.getRuleName();
 			String lexicalRule = ts.getLexicalRuleName();
 			String treeRule = ts.getTreeRuleName();
-			for ( gUnitTestInput input: ts.testSuites.keySet() ) {	// each rule may contain multiple tests
+			for ( Map.Entry<gUnitTestInput, AbstractTest> entry : ts.testSuites.entrySet() ) {	// each rule may contain multiple tests
+				gUnitTestInput input = entry.getKey();
 				numOfTest++;
 				// Run parser, and get the return value or stdout or stderr if there is
 				gUnitTestResult result = null;
-				AbstractTest test = ts.testSuites.get(input);
+				AbstractTest test = entry.getValue();
 				try {
 					// TODO: create a -debug option to turn on logging, which shows progress of running tests
 					//System.out.print(numOfTest + ". Running rule: " + rule + "; input: '" + input.testInput + "'");
@@ -186,7 +188,7 @@
 					//System.out.println("; Expecting " + test.getExpected() + "; Success?: " + test.getExpected().equals(test.getResult(result)));
 				} catch ( InvalidInputException e) {
 					numOfInvalidInput++;
-                    test.setHeader(rule, lexicalRule, treeRule, numOfTest, input.line);
+					test.setHeader(rule, lexicalRule, treeRule, numOfTest, input.line, input.input);
 					test.setActual(input.input);
 					invalids.add(test);
 					continue;
@@ -198,7 +200,7 @@
 
 				if (actual == null) {
 					numOfFailure++;
-                    test.setHeader(rule, lexicalRule, treeRule, numOfTest, input.line);
+					test.setHeader(rule, lexicalRule, treeRule, numOfTest, input.line, input.input);
 					test.setActual("null");
 					failures.add(test);
 					onFail(test);
@@ -211,14 +213,14 @@
 				// TODO: something with ACTIONS - at least create action test type and throw exception.
 				else if ( ts.testSuites.get(input).getType()==gUnitParser.ACTION ) {	// expected Token: ACTION
 					numOfFailure++;
-                    test.setHeader(rule, lexicalRule, treeRule, numOfTest, input.line);
+					test.setHeader(rule, lexicalRule, treeRule, numOfTest, input.line, input.input);
 					test.setActual("\t"+"{ACTION} is not supported in the grammarInfo yet...");
 					failures.add(test);
 					onFail(test);
 				}
 				else {
 					numOfFailure++;
-                    test.setHeader(rule, lexicalRule, treeRule, numOfTest, input.line);
+					test.setHeader(rule, lexicalRule, treeRule, numOfTest, input.line, input.input);
 					failures.add(test);
 					onFail(test);
 				}
@@ -229,7 +231,7 @@
 	// TODO: throw proper exceptions
 	protected gUnitTestResult runLexer(String lexerName, String testRuleName, gUnitTestInput testInput) throws Exception {
 		CharStream input;
-		Class lexer = null;
+		Class<? extends Lexer> lexer;
 		PrintStream ps = null;		// for redirecting stdout later
 		PrintStream ps2 = null;		// for redirecting stderr later
 		try {
@@ -237,13 +239,11 @@
 			input = getANTLRInputStream(testInput);
 
             /** Use Reflection to create instances of lexer and parser */
-        	lexer = classForName(lexerName);
-            Class[] lexArgTypes = new Class[]{CharStream.class};				// assign type to lexer's args
-            Constructor lexConstructor = lexer.getConstructor(lexArgTypes);
-            Object[] lexArgs = new Object[]{input};								// assign value to lexer's args
-            Object lexObj = lexConstructor.newInstance(lexArgs);				// makes new instance of lexer
+        	lexer = classForName(lexerName).asSubclass(Lexer.class);
+            Constructor<? extends Lexer> lexConstructor = lexer.getConstructor(CharStream.class);
+            Lexer lexObj = lexConstructor.newInstance(input);				// makes new instance of lexer
 
-            Method ruleName = lexer.getMethod("m"+testRuleName, new Class[0]);
+            Method ruleName = lexer.getMethod("m"+testRuleName);
 
             /** Start of I/O Redirecting */
             ByteArrayOutputStream out = new ByteArrayOutputStream();
@@ -255,9 +255,9 @@
             /** End of redirecting */
 
             /** Invoke lexer rule, and get the current index in CharStream */
-            ruleName.invoke(lexObj, new Object[0]);
-            Method ruleName2 = lexer.getMethod("getCharIndex", new Class[0]);
-            int currentIndex = (Integer) ruleName2.invoke(lexObj, new Object[0]);
+            ruleName.invoke(lexObj);
+            Method ruleName2 = lexer.getMethod("getCharIndex");
+            int currentIndex = (Integer) ruleName2.invoke(lexObj);
             if ( currentIndex!=input.size() ) {
             	ps2.print("extra text found, '"+input.substring(currentIndex, input.size()-1)+"'");
             }
@@ -275,17 +275,17 @@
 		} catch (IOException e) {
 			return getTestExceptionResult(e);
         } catch (ClassNotFoundException e) {
-        	e.printStackTrace(); System.exit(1);
+        	handleUnexpectedException( e );
         } catch (SecurityException e) {
-        	e.printStackTrace(); System.exit(1);
+        	handleUnexpectedException( e );
         } catch (NoSuchMethodException e) {
-        	e.printStackTrace(); System.exit(1);
+        	handleUnexpectedException( e );
         } catch (IllegalArgumentException e) {
-        	e.printStackTrace(); System.exit(1);
+        	handleUnexpectedException( e );
         } catch (InstantiationException e) {
-        	e.printStackTrace(); System.exit(1);
+        	handleUnexpectedException( e );
         } catch (IllegalAccessException e) {
-        	e.printStackTrace(); System.exit(1);
+        	handleUnexpectedException( e );
         } catch (InvocationTargetException e) {	// This exception could be caused from ANTLR Runtime Exception, e.g. MismatchedTokenException
         	return getTestExceptionResult(e);
         } finally {
@@ -305,8 +305,8 @@
 	// TODO: throw proper exceptions
 	protected gUnitTestResult runParser(String parserName, String lexerName, String testRuleName, gUnitTestInput testInput) throws Exception {
 		CharStream input;
-		Class lexer = null;
-		Class parser = null;
+		Class<? extends Lexer> lexer;
+		Class<? extends Parser> parser;
 		PrintStream ps = null;		// for redirecting stdout later
 		PrintStream ps2 = null;		// for redirecting stderr later
 		try {
@@ -314,25 +314,20 @@
 			input = getANTLRInputStream(testInput);
 
             /** Use Reflection to create instances of lexer and parser */
-        	lexer = classForName(lexerName);
-            Class[] lexArgTypes = new Class[]{CharStream.class};				// assign type to lexer's args
-            Constructor lexConstructor = lexer.getConstructor(lexArgTypes);
-            Object[] lexArgs = new Object[]{input};								// assign value to lexer's args
-            Object lexObj = lexConstructor.newInstance(lexArgs);				// makes new instance of lexer
+        	lexer = classForName(lexerName).asSubclass(Lexer.class);
+            Constructor<? extends Lexer> lexConstructor = lexer.getConstructor(CharStream.class);
+            Lexer lexObj = lexConstructor.newInstance(input);				// makes new instance of lexer
 
-            CommonTokenStream tokens = new CommonTokenStream((Lexer) lexObj);
+            CommonTokenStream tokens = new CommonTokenStream(lexObj);
 
-            parser = classForName(parserName);
-            Class[] parArgTypes = new Class[]{TokenStream.class};				// assign type to parser's args
-            Constructor parConstructor = parser.getConstructor(parArgTypes);
-            Object[] parArgs = new Object[]{tokens};							// assign value to parser's args
-            Object parObj = parConstructor.newInstance(parArgs);				// makes new instance of parser
+            parser = classForName(parserName).asSubclass(Parser.class);
+            Constructor<? extends Parser> parConstructor = parser.getConstructor(TokenStream.class);
+            Parser parObj = parConstructor.newInstance(tokens);				// makes new instance of parser
 
             // set up customized tree adaptor if necessary
             if ( grammarInfo.getAdaptor()!=null ) {
-            	parArgTypes = new Class[]{TreeAdaptor.class};
-            	Method _setTreeAdaptor = parser.getMethod("setTreeAdaptor", parArgTypes);
-            	Class _treeAdaptor = classForName(grammarInfo.getAdaptor());
+            	Method _setTreeAdaptor = parser.getMethod("setTreeAdaptor", TreeAdaptor.class);
+            	Class<? extends TreeAdaptor> _treeAdaptor = classForName(grammarInfo.getAdaptor()).asSubclass(TreeAdaptor.class);
             	_setTreeAdaptor.invoke(parObj, _treeAdaptor.newInstance());
             }
 
@@ -355,7 +350,7 @@
             if ( ruleReturn!=null ) {
                 if ( ruleReturn.getClass().toString().indexOf(testRuleName+"_return")>0 ) {
                 	try {	// NullPointerException may happen here...
-                		Class _return = classForName(parserName+"$"+testRuleName+"_return");
+                		Class<?> _return = classForName(parserName+"$"+testRuleName+"_return");
                 		Method[] methods = _return.getDeclaredMethods();
                 		for(Method method : methods) {
 			                if ( method.getName().equals("getTree") ) {
@@ -376,11 +371,7 @@
                 }
             }
 
-            /** Invalid input */
-            if ( tokens.index()!=tokens.size()-1 ) {
-            	//throw new InvalidInputException();
-            	ps2.print("Invalid input");
-            }
+            checkForValidInput(tokens, ps2);
 
 			if ( err.toString().length()>0 ) {
 				gUnitTestResult testResult = new gUnitTestResult(false, err.toString());
@@ -407,17 +398,17 @@
 		} catch (IOException e) {
 			return getTestExceptionResult(e);
 		} catch (ClassNotFoundException e) {
-        	e.printStackTrace(); System.exit(1);
+			handleUnexpectedException( e );
         } catch (SecurityException e) {
-        	e.printStackTrace(); System.exit(1);
+        	handleUnexpectedException( e );
         } catch (NoSuchMethodException e) {
-        	e.printStackTrace(); System.exit(1);
+        	handleUnexpectedException( e );
         } catch (IllegalArgumentException e) {
-        	e.printStackTrace(); System.exit(1);
+        	handleUnexpectedException( e );
         } catch (InstantiationException e) {
-        	e.printStackTrace(); System.exit(1);
+        	handleUnexpectedException( e );
         } catch (IllegalAccessException e) {
-        	e.printStackTrace(); System.exit(1);
+        	handleUnexpectedException( e );
         } catch (InvocationTargetException e) {	// This exception could be caused from ANTLR Runtime Exception, e.g. MismatchedTokenException
         	return getTestExceptionResult(e);
         } finally {
@@ -437,9 +428,9 @@
 	protected gUnitTestResult runTreeParser(String parserName, String lexerName, String testRuleName, String testTreeRuleName, gUnitTestInput testInput) throws Exception {
 		CharStream input;
 		String treeParserPath;
-		Class lexer = null;
-		Class parser = null;
-		Class treeParser = null;
+		Class<? extends Lexer> lexer;
+		Class<? extends Parser> parser;
+		Class<? extends TreeParser> treeParser;
 		PrintStream ps = null;		// for redirecting stdout later
 		PrintStream ps2 = null;		// for redirecting stderr later
 		try {
@@ -455,27 +446,22 @@
 			}
 
             /** Use Reflection to create instances of lexer and parser */
-        	lexer = classForName(lexerName);
-            Class[] lexArgTypes = new Class[]{CharStream.class};				// assign type to lexer's args
-            Constructor lexConstructor = lexer.getConstructor(lexArgTypes);
-            Object[] lexArgs = new Object[]{input};								// assign value to lexer's args
-            Object lexObj = lexConstructor.newInstance(lexArgs);				// makes new instance of lexer
+        	lexer = classForName(lexerName).asSubclass(Lexer.class);
+            Constructor<? extends Lexer> lexConstructor = lexer.getConstructor(CharStream.class);
+            Lexer lexObj = lexConstructor.newInstance(input);				// makes new instance of lexer
 
-            CommonTokenStream tokens = new CommonTokenStream((Lexer) lexObj);
+            CommonTokenStream tokens = new CommonTokenStream(lexObj);
 
-            parser = classForName(parserName);
-            Class[] parArgTypes = new Class[]{TokenStream.class};				// assign type to parser's args
-            Constructor parConstructor = parser.getConstructor(parArgTypes);
-            Object[] parArgs = new Object[]{tokens};							// assign value to parser's args
-            Object parObj = parConstructor.newInstance(parArgs);				// makes new instance of parser
+            parser = classForName(parserName).asSubclass(Parser.class);
+            Constructor<? extends Parser> parConstructor = parser.getConstructor(TokenStream.class);
+            Parser parObj = parConstructor.newInstance(tokens);				// makes new instance of parser
 
             // set up customized tree adaptor if necessary
             TreeAdaptor customTreeAdaptor = null;
             if ( grammarInfo.getAdaptor()!=null ) {
-            	parArgTypes = new Class[]{TreeAdaptor.class};
-            	Method _setTreeAdaptor = parser.getMethod("setTreeAdaptor", parArgTypes);
-            	Class _treeAdaptor = classForName(grammarInfo.getAdaptor());
-            	customTreeAdaptor = (TreeAdaptor) _treeAdaptor.newInstance();
+            	Method _setTreeAdaptor = parser.getMethod("setTreeAdaptor", TreeAdaptor.class);
+            	Class<? extends TreeAdaptor> _treeAdaptor = classForName(grammarInfo.getAdaptor()).asSubclass(TreeAdaptor.class);
+            	customTreeAdaptor = _treeAdaptor.newInstance();
             	_setTreeAdaptor.invoke(parObj, customTreeAdaptor);
             }
 
@@ -493,7 +479,7 @@
             /** Invoke grammar rule, and get the return value */
             Object ruleReturn = ruleName.invoke(parObj);
 
-            Class _return = classForName(parserName+"$"+testRuleName+"_return");
+            Class<?> _return = classForName(parserName+"$"+testRuleName+"_return");
         	Method returnName = _return.getMethod("getTree");
         	CommonTree tree = (CommonTree) returnName.invoke(ruleReturn);
 
@@ -508,11 +494,9 @@
         	// AST nodes have payload that point into token stream
         	nodes.setTokenStream(tokens);
         	// Create a tree walker attached to the nodes stream
-        	treeParser = classForName(treeParserPath);
-            Class[] treeParArgTypes = new Class[]{TreeNodeStream.class};		// assign type to tree parser's args
-            Constructor treeParConstructor = treeParser.getConstructor(treeParArgTypes);
-            Object[] treeParArgs = new Object[]{nodes};							// assign value to tree parser's args
-            Object treeParObj = treeParConstructor.newInstance(treeParArgs);	// makes new instance of tree parser
+        	treeParser = classForName(treeParserPath).asSubclass(TreeParser.class);
+            Constructor<? extends TreeParser> treeParConstructor = treeParser.getConstructor(TreeNodeStream.class);
+            TreeParser treeParObj = treeParConstructor.newInstance(nodes);	// makes new instance of tree parser
         	// Invoke the tree rule, and store the return value if there is
             Method treeRuleName = treeParser.getMethod(testTreeRuleName);
             Object treeRuleReturn = treeRuleName.invoke(treeParObj);
@@ -523,7 +507,7 @@
             if ( treeRuleReturn!=null ) {
                 if ( treeRuleReturn.getClass().toString().indexOf(testTreeRuleName+"_return")>0 ) {
                 	try {	// NullPointerException may happen here...
-                		Class _treeReturn = classForName(treeParserPath+"$"+testTreeRuleName+"_return");
+                		Class<?> _treeReturn = classForName(treeParserPath+"$"+testTreeRuleName+"_return");
                 		Method[] methods = _treeReturn.getDeclaredMethods();
 			            for(Method method : methods) {
 			                if ( method.getName().equals("getTree") ) {
@@ -544,11 +528,7 @@
                 }
             }
 
-            /** Invalid input */
-            if ( tokens.index()!=tokens.size()-1 ) {
-            	//throw new InvalidInputException();
-            	ps2.print("Invalid input");
-            }
+			checkForValidInput( tokens, ps2 );
 
 			if ( err.toString().length()>0 ) {
 				gUnitTestResult testResult = new gUnitTestResult(false, err.toString());
@@ -576,17 +556,17 @@
 		} catch (IOException e) {
 			return getTestExceptionResult(e);
 		} catch (ClassNotFoundException e) {
-        	e.printStackTrace(); System.exit(1);
+			handleUnexpectedException( e );
         } catch (SecurityException e) {
-        	e.printStackTrace(); System.exit(1);
+        	handleUnexpectedException( e );
         } catch (NoSuchMethodException e) {
-        	e.printStackTrace(); System.exit(1);
+        	handleUnexpectedException( e );
         } catch (IllegalArgumentException e) {
-        	e.printStackTrace(); System.exit(1);
+        	handleUnexpectedException( e );
         } catch (InstantiationException e) {
-        	e.printStackTrace(); System.exit(1);
+        	handleUnexpectedException( e );
         } catch (IllegalAccessException e) {
-        	e.printStackTrace(); System.exit(1);
+        	handleUnexpectedException( e );
         } catch (InvocationTargetException e) {	// note: This exception could be caused from ANTLR Runtime Exception...
         	return getTestExceptionResult(e);
         } finally {
@@ -641,6 +621,23 @@
     	return testResult;
 	}
 
+	/**
+	 * Verify the input has been properly consumed
+	 */
+	protected void checkForValidInput(CommonTokenStream tokens, PrintStream ps2) {
+		if ( tokens.index() != tokens.size() - 1 ) {
+			//At this point we need to check for redundant EOF tokens
+			//which might have been added by the Parser:
+			List<? extends Token> endingTokens = tokens.getTokens(tokens.index(), tokens.size() -1);
+			for (Token endToken : endingTokens) {
+				if (! "<EOF>".equals(endToken.getText())) {
+					//writing to ps2 will mark the test as failed:
+					ps2.print( "Invalid input" );
+					return;
+				}
+			}
+		}
+	}
 
     public void onPass(ITestCase passTest) {
 
@@ -650,4 +647,9 @@
 
     }
 
+	protected void handleUnexpectedException(Exception e) {
+		e.printStackTrace();
+		System.exit(1);
+	}
+
 }
diff --git a/gunit/src/main/java/org/antlr/gunit/swingui/TestCaseEditController.java b/gunit/src/main/java/org/antlr/gunit/swingui/TestCaseEditController.java
index 30cf0ae..2f15229 100644
--- a/gunit/src/main/java/org/antlr/gunit/swingui/TestCaseEditController.java
+++ b/gunit/src/main/java/org/antlr/gunit/swingui/TestCaseEditController.java
@@ -96,9 +96,9 @@
 
     /* END OF MODEL*/
 
-    private static final HashMap<Class, String> TypeNameTable;
+    private static final HashMap<Class<?>, String> TypeNameTable;
     static {
-        TypeNameTable = new HashMap<Class, String> ();
+        TypeNameTable = new HashMap<Class<?>, String> ();
         TypeNameTable.put(TestCaseInputString.class, IN_TYPE_STRING);
         TypeNameTable.put(TestCaseInputMultiString.class, IN_TYPE_MULTI);
         TypeNameTable.put(TestCaseInputFile.class, IN_TYPE_FILE);
diff --git a/gunit/src/main/java/org/antlr/gunit/swingui/model/TestSuite.java b/gunit/src/main/java/org/antlr/gunit/swingui/model/TestSuite.java
index 06e5227..1264f30 100644
--- a/gunit/src/main/java/org/antlr/gunit/swingui/model/TestSuite.java
+++ b/gunit/src/main/java/org/antlr/gunit/swingui/model/TestSuite.java
@@ -95,6 +95,6 @@
     }
     
     // only for stringtemplate use
-    public List getRulesForStringTemplate() {return rules;}
+    public List<Rule> getRulesForStringTemplate() {return rules;}
     
 }
diff --git a/gunit/src/main/java/org/antlr/gunit/swingui/runner/ParserLoader.java b/gunit/src/main/java/org/antlr/gunit/swingui/runner/ParserLoader.java
index 23f5aa0..dcad501 100644
--- a/gunit/src/main/java/org/antlr/gunit/swingui/runner/ParserLoader.java
+++ b/gunit/src/main/java/org/antlr/gunit/swingui/runner/ParserLoader.java
@@ -31,12 +31,12 @@
 import java.util.HashMap;
 
 /**
- * Class loader for parser & lexer generated by antlr.
+ * Class loader for parser &amp; lexer generated by antlr.
  * @author Shaoting
  */
 public class ParserLoader extends ClassLoader {
 
-    private HashMap<String, Class> classList;
+    private HashMap<String, Class<?>> classList;
     private String grammar;
 
     /**
@@ -51,7 +51,7 @@
         // load all the class files in the "classDir" related to the grammarName
         File dir = new File(classDir);
         if(dir.isDirectory()) {
-            classList = new HashMap<String, Class>();
+            classList = new HashMap<String, Class<?>>();
             grammar = grammarName;
             File[] files = dir.listFiles(new ClassFilenameFilter(grammarName));
             for(File f : files) {
@@ -63,7 +63,7 @@
                 in.close();
 
                 // define class
-                final Class newClass = defineClass(null, classData, 0, classData.length);
+                final Class<?> newClass = defineClass(null, classData, 0, classData.length);
                 assert(newClass != null);
                 resolveClass(newClass);
 
@@ -86,7 +86,7 @@
 
 
     @Override
-    public synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException {
+    public synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
         //System.out.print("loading: " + name);
         if(name.startsWith(grammar)) {
             if(classList.containsKey(name)) {
@@ -98,7 +98,7 @@
             }
             
         } else {
-            final Class c = findSystemClass(name);
+            final Class<?> c = findSystemClass(name);
             //System.out.println(" .... system found " + c.getName());
             return c;
         }
diff --git a/lib/antlr-3.4-complete.jar b/lib/antlr-3.4-complete.jar
deleted file mode 100644
index 9c985c7..0000000
--- a/lib/antlr-3.4-complete.jar
+++ /dev/null
Binary files differ
diff --git a/patches/fix_infinite_recursion.diff b/patches/fix_infinite_recursion.diff
new file mode 100644
index 0000000..06d8815
--- /dev/null
+++ b/patches/fix_infinite_recursion.diff
@@ -0,0 +1,24 @@
+From 12f69f5bb0e10f608b1899bab67b1813e0fdaf14 Mon Sep 17 00:00:00 2001
+From: Andreas Gampe <agampe@google.com>
+Date: Tue, 20 Feb 2018 09:51:42 -0800
+Subject: [PATCH] Antlr: Fix infinite recursion
+
+Bug: 73645371
+Test: m javac-check RUN_ERROR_PRONE=true
+Change-Id: Ie8702ad59aab1af7e23038fbffd5bd34902f1f7c
+---
+
+Index: antlr/runtime/Java/src/main/java/org/antlr/runtime/debug/DebugTreeAdaptor.java
+===================================================================
+--- antlr.orig/runtime/Java/src/main/java/org/antlr/runtime/debug/DebugTreeAdaptor.java
++++ antlr/runtime/Java/src/main/java/org/antlr/runtime/debug/DebugTreeAdaptor.java
+@@ -227,7 +227,7 @@ public class DebugTreeAdaptor implements
+ 
+ 	@Override
+ 	public Object deleteChild(Object t, int i) {
+-		return deleteChild(t, i);
++		return adaptor.deleteChild(t, i);
+ 	}
+ 
+ 	@Override
+
diff --git a/pom.xml b/pom.xml
index c2f9cc7..bcec4b5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,32 +1,25 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 
-
-    <!--
-        The ANTLR Maven artifacts are now released via the Sonotype OSS
-        repository, which means that they are synced to Maven central 
-        within a few minutes of hitting the release repo for Sonotype.
-        To enable this, we inherit from the Sonotype provided parent
-        pom. However, we must also configure our .m2/settings.xml to include
-        the snapshot and staging server and the sonotype password. This 
-        means that only ANTLR developers can released the artifacts, but
-        anyone can build locally.
-      -->
     <parent>
         <groupId>org.sonatype.oss</groupId>
         <artifactId>oss-parent</artifactId>
-        <version>7</version>
-    </parent>    
-    
+        <version>9</version>
+    </parent>
+
     <modelVersion>4.0.0</modelVersion>
     <groupId>org.antlr</groupId>
     <artifactId>antlr-master</artifactId>
     <packaging>pom</packaging>
-    <version>3.4</version>
-    <name>ANTLR Master build control POM 3.4</name>
-    <url>http://maven.apache.org</url>
-
-
+    <version>3.5.2</version>
+    <name>ANTLR 3 Master build control POM</name>
+    <description>Master build POM for ANTLR 3</description>
+    <url>http://antlr.org</url>
+    <inceptionYear>1992</inceptionYear>
+    <organization>
+        <name>ANTLR</name>
+        <url>http://www.antlr.org</url>
+    </organization>
 
   <!--
     What version of ANTLR are we building? This sets the
@@ -40,171 +33,59 @@
      This is the master pom for building the ANTLR
      toolset and runtime (Java) at the specific level
      defined above. Hence we specify here the modules that
-     this pom will build when we build this pom in certain profiles.
+     this pom will build when we build this pom
     -->
 
+    <modules>
+        <module>runtime/Java</module>
+        <module>tool</module>
+        <module>antlr3-maven-plugin</module>
+        <module>gunit</module>
+        <module>gunit-maven-plugin</module>
+        <module>antlr3-maven-archetype</module>
+        <module>antlr-complete</module>
+    </modules>
+
   <!--
     Make sure that the build is not platform dependent (I.E show that
     all the files in the source tree are in UTF-8 format.
     -->
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <java5.home>${env.JAVA5_HOME}</java5.home>
+        <java6.home>${env.JAVA6_HOME}</java6.home>
+        <bootclasspath.java5>${java5.home}/lib/rt.jar</bootclasspath.java5>
+        <bootclasspath.java6>${java6.home}/lib/rt.jar</bootclasspath.java6>
+        <bootclasspath.compile>${bootclasspath.java5}</bootclasspath.compile>
+        <bootclasspath.testCompile>${bootclasspath.java6}</bootclasspath.testCompile>
     </properties>
 
-        <profiles>
-            <profile>
-                <id>standard</id>
-                <activation>
-                    <activeByDefault>true</activeByDefault>
-                </activation>
-                <modules>
-                    <module>runtime/Java</module>
-                    <module>tool</module>
-                    <module>antlr3-maven-plugin</module>
-                    <module>gunit</module>
-                    <module>gunit-maven-plugin</module>
-                    <module>antlr3-maven-archetype</module>
-                </modules>
-            </profile>
+    <licenses>
+        <license>
+            <name>BSD licence</name>
+            <url>http://antlr.org/license.html</url>
+            <distribution>repo</distribution>
+        </license>
+    </licenses>
 
-            <!--
-                Activate this profile to build ONLY the Uber jar, which is the
-                ANTLR tool and its dependencies (no plugins etc).
-                
-                mvn -Duber -DskipTests package assembly:assembly
-                
-              -->
-            <profile>
-                <id>uber</id>
-                <activation>
-                    <property>
-                        <name>uber</name>
-                        <value>true</value>
-                    </property>
-                </activation>
-                <modules>
-                    <module>runtime/Java</module>
-                    <module>tool</module>
-                </modules>
-                <build>
-                    <plugins>
-                        <plugin>
+    <issueManagement>
+        <system>GitHub Issues</system>
+        <url>https://github.com/antlr/antlr3/issues</url>
+    </issueManagement>
 
-                        <!--
+    <mailingLists>
+        <mailingList>
+            <name>antlr-discussion</name>
+            <archive>https://groups.google.com/forum/?fromgroups#!forum/antlr-discussion</archive>
+        </mailingList>
+    </mailingLists>
 
-                            Build an uber-jar for the ANTLR Tool that is packaged with all the other dependencies,
-                            such as the antlr-runtime and stringtemplate etc. This will be useful
-                            for developers, who then do not need to download anything else or
-                            remember that they need stringtemplate.jar in their CLASSPATH and so
-                            on.
-
-                            This does not preclude any of the module generated jars from
-                            being used on their own of course.
-
-                            Here, we also build a master source jar as I was unable to pursuade
-                            this plugin to use multiple configurations and not have the thing
-                            screw up because of multiple modules :-(
-
-                          -->
-
-                            <artifactId>maven-assembly-plugin</artifactId>
-                            <version>2.2.1</version>
-                            <!--
-                                Do not make the child modules build an assembly
-                              -->
-                            <inherited>false</inherited>
-
-                            <configuration>
-                                <descriptors>
-                                    <descriptor>antlrjar.xml</descriptor>
-                                    <descriptor>antlrsources.xml</descriptor>
-                                </descriptors>
-                                    <!--
-
-                                        Specify that we want the resulting jar to be executable
-                                        via java -jar, which we do by modifying the manifest
-                                        of course.
-                                      -->
-                                <archive>
-                                    <manifest>
-                                        <mainClass>org.antlr.Tool</mainClass>
-                                    </manifest>
-                                </archive>
-                            </configuration>
-
-                        </plugin>
-                    </plugins>
-                </build>
-            </profile>
-            
-            <profile>
-                <id>release-sign-artifacts</id>
-                <activation>
-                    <property>
-                        <name>deploy</name>
-                        <value>true</value>
-                    </property>
-                </activation>
-                <modules>
-                    <module>runtime/Java</module>
-                    <module>tool</module>
-                    <module>antlr3-maven-plugin</module>
-                    <module>gunit</module>
-                    <module>gunit-maven-plugin</module>
-                    <module>antlr3-maven-archetype</module>
-                </modules>
-                <build>
-                    <plugins>
-                        
-                        <plugin>
-                            <groupId>org.apache.maven.plugins</groupId>
-                            <artifactId>maven-gpg-plugin</artifactId>
-                            <version>1.3</version>
-                            <executions>
-                                <execution>
-                                    <id>sign-artifacts</id>
-                                    <phase>verify</phase>
-                                    <goals>
-                                       <goal>sign</goal>
-                                    </goals>
-                                </execution>
-                            </executions>
-                        </plugin>
-                        
-                        <plugin>
-                            <groupId>org.apache.maven.plugins</groupId>
-                            <artifactId>maven-javadoc-plugin</artifactId>
-                            <version>2.8</version>
-                            <executions>
-                                <execution>
-                                    <id>attach-javadocs</id>
-                                    <goals>
-                                        <goal>jar</goal>
-                                    </goals>
-                                </execution>
-                            </executions>
-                        </plugin>
-                        
-                        <plugin>
-                            <groupId>org.apache.maven.plugins</groupId>
-                            <artifactId>maven-source-plugin</artifactId>
-                            <version>2.1.2</version>
-                            <executions>
-                                <execution>
-                                    <id>attach-sources</id>
-                                    <goals>
-                                       <goal>jar</goal>
-                                    </goals>
-                                </execution>
-                            </executions>
-                        </plugin>
-                        
-                    </plugins>
-                </build>
-            </profile>
-            
-    </profiles>
-
+    <scm>
+        <url>https://github.com/antlr/antlr3/tree/master</url>
+        <connection>scm:git:git://github.com/antlr/antlr3.git</connection>
+        <developerConnection>scm:git:git@github.com:antlr/antlr3.git</developerConnection>
+      <tag>3.5.2</tag>
+  </scm>
   <!--
 
     Tell Maven which other artifacts we need in order to
@@ -220,15 +101,80 @@
             <dependency>
                 <groupId>junit</groupId>
                 <artifactId>junit</artifactId>
-                <version>4.8.2</version>
+                <version>4.10</version>
                 <scope>test</scope>
             </dependency>
 
+            <dependency>
+                <groupId>antlr</groupId>
+                <artifactId>antlr</artifactId>
+                <version>2.7.7</version>
+                <scope>compile</scope>
+            </dependency>
+
+            <dependency>
+              <groupId>org.antlr</groupId>
+              <artifactId>stringtemplate</artifactId>
+              <version>3.2.1</version>
+              <scope>compile</scope>
+            </dependency>
+
+            <dependency>
+                <groupId>org.antlr</groupId>
+                <artifactId>ST4</artifactId>
+                <version>4.0.8</version>
+                <scope>compile</scope>
+            </dependency>
 
         </dependencies>
 
     </dependencyManagement>
 
+    <profiles>
+        <profile>
+            <id>sonatype-oss-release</id>
+            <modules>
+                <module>antlr-complete</module>
+            </modules>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-compiler-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>default-compile</id>
+                                <configuration>
+                                    <source>1.5</source>
+                                    <target>1.5</target>
+                                    <compilerArgs>
+                                        <arg>-Xlint</arg>
+                                        <arg>-Xlint:-serial</arg>
+                                        <arg>-bootclasspath</arg>
+                                        <arg>${bootclasspath.compile}</arg>
+                                    </compilerArgs>
+                                </configuration>
+                            </execution>
+                            <execution>
+                                <id>default-testCompile</id>
+                                <configuration>
+                                    <source>1.6</source>
+                                    <target>1.6</target>
+                                    <compilerArgs>
+                                        <arg>-Xlint</arg>
+                                        <arg>-Xlint:-serial</arg>
+                                        <arg>-bootclasspath</arg>
+                                        <arg>${bootclasspath.testCompile}</arg>
+                                    </compilerArgs>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
+
     <build>
 
         <defaultGoal>install</defaultGoal>
@@ -258,54 +204,121 @@
         </resources>
 
         <plugins>
-
-             <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>buildnumber-maven-plugin</artifactId>
-                <version>1.0-beta-2</version>
-                <configuration>
-                  <format>{0,date,MMM dd, yyyy} {0,time,kk:mm:ss}</format>
-                  <items>
-                    <item>timestamp</item>
-                  </items>
-                </configuration>
-                <executions>
-                  <execution>
-                    <phase>validate</phase>
-                    <goals>
-                      <goal>create</goal>
-                    </goals>
-                  </execution>
-                </executions>
-             </plugin>
-
             <plugin>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <version>2.3.2</version>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+                <version>2.4</version>
                 <configuration>
-                    <source>1.6</source>
-                    <target>jsr14</target>
-                    <sourceDirectory>src</sourceDirectory>
+                    <archive>
+                        <manifest>
+                            <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
+                        </manifest>
+                    </archive>
                 </configuration>
             </plugin>
 
             <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.1</version>
+                <configuration>
+                    <sourceDirectory>src</sourceDirectory>
+                    <showWarnings>true</showWarnings>
+                    <showDeprecation>true</showDeprecation>
+                    <compilerArgs>
+                        <arg>-Xlint</arg>
+                        <arg>-Xlint:-serial</arg>
+                    </compilerArgs>
+                </configuration>
+
+                <executions>
+                    <execution>
+                        <id>default-compile</id>
+                        <configuration>
+                            <source>1.5</source>
+                            <target>1.5</target>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <id>default-testCompile</id>
+                        <configuration>
+                            <source>1.6</source>
+                            <target>1.6</target>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-release-plugin</artifactId>
+                <!-- override the version inherited from the parent -->
+                <version>2.5</version>
+                <configuration>
+                    <arguments>-Psonatype-oss-release ${release.arguments}</arguments>
+                </configuration>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-surefire-plugin</artifactId>
-                <version>2.9</version>
+                <!-- override the version inherited from the parent -->
+                <version>2.17</version>
             </plugin>
 
             <plugin>
                 <groupId>org.codehaus.mojo</groupId>
                 <artifactId>findbugs-maven-plugin</artifactId>
-                <version>2.3.2</version>
+                <!-- override the version inherited from the parent -->
+                <version>2.5.3</version>
                 <configuration>
                     <findbugsXmlOutput>true</findbugsXmlOutput>
-                    <findbugsXmlWithMessages>true</findbugsXmlWithMessages>
                     <xmlOutput>true</xmlOutput>
                 </configuration>
             </plugin>
-            
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-source-plugin</artifactId>
+                <!-- override the version inherited from the parent -->
+                <version>2.2.1</version>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-javadoc-plugin</artifactId>
+                <!-- override the version inherited from the parent -->
+                <version>2.9.1</version>
+                <configuration>
+                    <quiet>true</quiet>
+                </configuration>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-gpg-plugin</artifactId>
+                <!-- override the version inherited from the parent -->
+                <version>1.5</version>
+            </plugin>
+
         </plugins>
 
     </build>
+
+    <reporting>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-javadoc-plugin</artifactId>
+                <version>2.9.1</version>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jxr-plugin</artifactId>
+                <version>2.3</version>
+            </plugin>
+        </plugins>
+    </reporting>
+
 </project>
diff --git a/post_update.sh b/post_update.sh
new file mode 100755
index 0000000..2995f11
--- /dev/null
+++ b/post_update.sh
@@ -0,0 +1,6 @@
+#!/bin/bash
+
+# $1 Path to the new version.
+# $2 Path to the old version.
+
+cp -a -n $2/build.gradle $1/
diff --git a/runtime/C/C.sln b/runtime/C/C.sln
index f841177..e86daeb 100644
--- a/runtime/C/C.sln
+++ b/runtime/C/C.sln
@@ -3,16 +3,6 @@
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "C", "C.vcproj", "{0F0FE03A-78F3-4B34-9DCE-0CDFF1FB5C40}"
 EndProject
 Global
-	GlobalSection(SourceCodeControl) = preSolution
-		SccNumberOfProjects = 2
-		SccProjectName0 = Perforce\u0020Project
-		SccLocalPath0 = ..\\..
-		SccProvider0 = MSSCCI:Perforce\u0020SCM
-		SccProjectFilePathRelativizedFromConnection0 = runtime\\C\\
-		SccProjectUniqueName1 = C.vcproj
-		SccLocalPath1 = ..\\..
-		SccProjectFilePathRelativizedFromConnection1 = runtime\\C\\
-	EndGlobalSection
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Win32 = Debug|Win32
 		Debug|x64 = Debug|x64
diff --git a/runtime/C/C.vcproj b/runtime/C/C.vcproj
index 16d9c2b..25aaf8b 100644
--- a/runtime/C/C.vcproj
+++ b/runtime/C/C.vcproj
@@ -5,9 +5,6 @@
 	Name="C"
 	ProjectGUID="{0F0FE03A-78F3-4B34-9DCE-0CDFF1FB5C40}"
 	RootNamespace="C"
-	SccProjectName="Perforce Project"
-	SccLocalPath="..\.."
-	SccProvider="MSSCCI:Perforce SCM"
 	Keyword="Win32Proj"
 	TargetFrameworkVersion="131072"
 	>
diff --git a/runtime/C/dist/libantlr3c-3.1.4-SNAPSHOT.tar.gz b/runtime/C/dist/libantlr3c-3.1.4-SNAPSHOT.tar.gz
new file mode 100644
index 0000000..a9ad784
--- /dev/null
+++ b/runtime/C/dist/libantlr3c-3.1.4-SNAPSHOT.tar.gz
Binary files differ
diff --git a/runtime/C/dist/libantlr3c-3.3.1-SNAPSHOT.tar.gz b/runtime/C/dist/libantlr3c-3.3.1-SNAPSHOT.tar.gz
new file mode 100644
index 0000000..ca21cf7
--- /dev/null
+++ b/runtime/C/dist/libantlr3c-3.3.1-SNAPSHOT.tar.gz
Binary files differ
diff --git a/runtime/C/dist/libantlr3c-3.4-beta3.tar.gz b/runtime/C/dist/libantlr3c-3.4-beta3.tar.gz
new file mode 100644
index 0000000..f5e9fbb
--- /dev/null
+++ b/runtime/C/dist/libantlr3c-3.4-beta3.tar.gz
Binary files differ
diff --git a/runtime/C/dist/libantlr3c-3.4.tar.gz b/runtime/C/dist/libantlr3c-3.4.tar.gz
deleted file mode 100644
index daeb313..0000000
--- a/runtime/C/dist/libantlr3c-3.4.tar.gz
+++ /dev/null
Binary files differ
diff --git a/runtime/C/include/antlr3convertutf.h b/runtime/C/include/antlr3convertutf.h
index 79cc82c..e0c5603 100644
--- a/runtime/C/include/antlr3convertutf.h
+++ b/runtime/C/include/antlr3convertutf.h
@@ -118,8 +118,6 @@
 #define UNI_SUR_HIGH_END    (UTF32)0xDBFF
 #define UNI_SUR_LOW_START   (UTF32)0xDC00
 #define UNI_SUR_LOW_END     (UTF32)0xDFFF
-#define false	            ANTLR3_FALSE
-#define true	            ANTLR3_TRUE
 #define halfShift           ((UTF32)10)
 #define halfBase            ((UTF32)0x0010000UL)
 #define halfMask            ((UTF32)0x3FFUL)
diff --git a/runtime/C/include/antlr3debugeventlistener.h b/runtime/C/include/antlr3debugeventlistener.h
index c9cd6ce..1d1b38e 100644
--- a/runtime/C/include/antlr3debugeventlistener.h
+++ b/runtime/C/include/antlr3debugeventlistener.h
@@ -73,7 +73,7 @@
 	/** The version of the debugging protocol supported by the providing
 	 *  instance of the debug event listener.
 	 */
-	int					PROTOCOL_VERSION;
+	int					protocol_version;
 
 	/// The name of the grammar file that we are debugging
 	///
diff --git a/runtime/C/include/antlr3defs.h b/runtime/C/include/antlr3defs.h
index 2435b02..84efd01 100644
--- a/runtime/C/include/antlr3defs.h
+++ b/runtime/C/include/antlr3defs.h
@@ -111,6 +111,10 @@
 # define	ANTLR3_WIN64
 # define	ANTLR3_USE_64BIT
 
+#elif __LP64__
+
+# define ANTLR3_USE_64BIT
+
 #else
 
 #ifdef	_WIN32
diff --git a/runtime/C/src/antlr3baserecognizer.c b/runtime/C/src/antlr3baserecognizer.c
index e2eccc6..8c6b105 100644
--- a/runtime/C/src/antlr3baserecognizer.c
+++ b/runtime/C/src/antlr3baserecognizer.c
@@ -345,8 +345,8 @@
 	case    ANTLR3_TOKENSTREAM:
 
 		ex->token		= cts->tstream->_LT						(cts->tstream, 1);	    /* Current input token			    */
-		ex->line		= ((pANTLR3_COMMON_TOKEN)(ex->token))->getLine			(ex->token);
-		ex->charPositionInLine	= ((pANTLR3_COMMON_TOKEN)(ex->token))->getCharPositionInLine	(ex->token);
+		ex->line		= ((pANTLR3_COMMON_TOKEN)(ex->token))->getLine			((pANTLR3_COMMON_TOKEN)(ex->token));
+		ex->charPositionInLine	= ((pANTLR3_COMMON_TOKEN)(ex->token))->getCharPositionInLine	((pANTLR3_COMMON_TOKEN)(ex->token));
 		ex->index		= cts->tstream->istream->index					(cts->tstream->istream);
 		if	(((pANTLR3_COMMON_TOKEN)(ex->token))->type == ANTLR3_TOKEN_EOF)
 		{
@@ -362,8 +362,8 @@
 	case    ANTLR3_COMMONTREENODE:
 
 		ex->token		= tns->_LT						    (tns, 1);	    /* Current input tree node			    */
-		ex->line		= ((pANTLR3_BASE_TREE)(ex->token))->getLine		    (ex->token);
-		ex->charPositionInLine	= ((pANTLR3_BASE_TREE)(ex->token))->getCharPositionInLine   (ex->token);
+		ex->line		= ((pANTLR3_BASE_TREE)(ex->token))->getLine		    ((pANTLR3_BASE_TREE)(ex->token));
+		ex->charPositionInLine	= ((pANTLR3_BASE_TREE)(ex->token))->getCharPositionInLine   ((pANTLR3_BASE_TREE)(ex->token));
 		ex->index		= tns->istream->index					    (tns->istream);
 
 		// Are you ready for this? Deep breath now...
@@ -586,7 +586,7 @@
 		// EOR can follow, but if we are not the start symbol, we
 		// need to remove it.
 		//
-		if	(recognizer->state->following->vector->count >= 0)
+		//if	(recognizer->state->following->vector->count >= 0) ml: always true
 		{
 			followClone->remove(followClone, ANTLR3_EOR_TOKEN_TYPE);
 		}
@@ -1589,7 +1589,7 @@
 	{
 		// We can fake the missing token and proceed
 		//
-		matchedSymbol = recognizer->getMissingSymbol(recognizer, is, recognizer->state->exception, ANTLR3_TOKEN_INVALID, follow);
+		matchedSymbol = (pANTLR3_COMMON_TOKEN)recognizer->getMissingSymbol(recognizer, is, recognizer->state->exception, ANTLR3_TOKEN_INVALID, follow);
 		recognizer->state->exception->type	= ANTLR3_MISSING_TOKEN_EXCEPTION;
 		recognizer->state->exception->token	= matchedSymbol;
 
@@ -2142,6 +2142,13 @@
 		}
 	}
 	
+  // ml: 2013-11-05, added reset of old exceptions.
+  pANTLR3_EXCEPTION thisE = recognizer->state->exception;
+  if	(thisE != NULL)
+  {
+    thisE->freeEx(thisE);
+    recognizer->state->exception = NULL;
+  }
 
     // Install a new following set
     //
@@ -2196,6 +2203,7 @@
 		recognizer->state->tokFactory = antlr3TokenFactoryNew(current->input);
 	}
 	token	= recognizer->state->tokFactory->newToken(recognizer->state->tokFactory);
+	if (token == NULL) { return NULL; }
 
 	// Set some of the token properties based on the current token
 	//
diff --git a/runtime/C/src/antlr3basetree.c b/runtime/C/src/antlr3basetree.c
index bbc81e7..f191f6f 100644
--- a/runtime/C/src/antlr3basetree.c
+++ b/runtime/C/src/antlr3basetree.c
@@ -187,13 +187,16 @@
                 for (i = 0; i < n; i++)
                 {
                     pANTLR3_BASE_TREE entry;
-                    entry = child->children->get(child->children, i);
+                    entry = (pANTLR3_BASE_TREE)child->children->get(child->children, i);
 
                     // ANTLR3 lists can be sparse, unlike Array Lists
                     //
                     if (entry != NULL)
                     {
-                        tree->children->add(tree->children, entry, (void (ANTLR3_CDECL *) (void *))child->free);
+                        ANTLR3_UINT32 count = tree->children->add(tree->children, entry, (void (ANTLR3_CDECL *) (void *))child->free);
+
+                        entry->setChildIndex(entry, count - 1);
+                        entry->setParent(entry, tree);
                     }
                 }
             }
@@ -211,8 +214,9 @@
 			tree->createChildrenList(tree);
 		}
 
-		tree->children->add(tree->children, child, (void (ANTLR3_CDECL *)(void *))child->free);
-		
+		ANTLR3_UINT32 count = tree->children->add(tree->children, child, (void (ANTLR3_CDECL *)(void *))child->free);
+		child->setChildIndex(child, count - 1);
+		child->setParent(child, tree);
 	}
 }
 
@@ -260,7 +264,7 @@
 	ANTLR3_UINT32	i;
 	ANTLR3_UINT32	s;
 
-	newTree = tree->dupNode	    (tree);
+	newTree = (pANTLR3_BASE_TREE)tree->dupNode	    (tree);
 
 	if	(tree->children != NULL)
 	{
@@ -275,7 +279,7 @@
 
 			if  (t!= NULL)
 			{
-				newNode	    = t->dupTree(t);
+				newNode	    = (pANTLR3_BASE_TREE)t->dupTree(t);
 				newTree->addChild(newTree, newNode);
 			}
 		}
@@ -480,7 +484,7 @@
 	{
 		pANTLR3_BASE_TREE	child;
 
-		child = tree->getChild(tree, c);
+		child = (pANTLR3_BASE_TREE)tree->getChild(tree, c);
 
 		child->setChildIndex(child, c);
 		child->setParent(child, tree);
diff --git a/runtime/C/src/antlr3basetreeadaptor.c b/runtime/C/src/antlr3basetreeadaptor.c
index e35878f..1f42751 100644
--- a/runtime/C/src/antlr3basetreeadaptor.c
+++ b/runtime/C/src/antlr3basetreeadaptor.c
@@ -192,7 +192,7 @@
 
 		// Pick up a pointer for the child
 		//
-		child = adaptor->getChild(adaptor, t, i);
+		child = (pANTLR3_BASE_TREE)adaptor->getChild(adaptor, t, i);
 
 		// Name the node
 		//
@@ -275,7 +275,7 @@
 
 		// Next child
 		//
-		child	= adaptor->getChild(adaptor, t, i);
+		child	= (pANTLR3_BASE_TREE)adaptor->getChild(adaptor, t, i);
 
 		// Create the edge relation
 		//
@@ -440,7 +440,7 @@
 static	pANTLR3_BASE_TREE	
 nilNode	    (pANTLR3_BASE_TREE_ADAPTOR adaptor)
 {
-	return	adaptor->create(adaptor, NULL);
+	return	(pANTLR3_BASE_TREE)adaptor->create(adaptor, NULL);
 }
 
 static	pANTLR3_BASE_TREE	
@@ -448,7 +448,7 @@
 {
 	pANTLR3_BASE_TREE t;
 
-	t = adaptor->create				(adaptor, NULL);
+	t = (pANTLR3_BASE_TREE)adaptor->create				(adaptor, NULL);
 	adaptor->debugger->createNode	(adaptor->debugger, t);
 
 	return	t;
@@ -460,7 +460,7 @@
 static	pANTLR3_BASE_TREE	
 dupTree  (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t)
 {
-	return	adaptor->dupTreeTT(adaptor, t, NULL);
+	return	(pANTLR3_BASE_TREE)adaptor->dupTreeTT(adaptor, t, NULL);
 }
 
 pANTLR3_BASE_TREE
@@ -476,7 +476,7 @@
 	{
 		return NULL;
 	}
-	newTree = t->dupNode(t);
+	newTree = (pANTLR3_BASE_TREE)t->dupNode(t);
 
 	// Ensure new subtree root has parent/child index set
 	//
@@ -486,8 +486,8 @@
 
 	for	(i=0; i < n; i++)
 	{
-		child = adaptor->getChild		(adaptor, t, i);
-		newSubTree = adaptor->dupTreeTT	(adaptor, child, t);
+		child = (pANTLR3_BASE_TREE)adaptor->getChild		(adaptor, t, i);
+		newSubTree = (pANTLR3_BASE_TREE)adaptor->dupTreeTT	(adaptor, child, t);
 		adaptor->addChild				(adaptor, newTree, newSubTree);
 	}
 	return	newTree;
@@ -510,7 +510,7 @@
 	n = adaptor->getChildCount(adaptor, tree);
 	for	(i = 0; i < n; i++)
 	{
-		child = adaptor->getChild(adaptor, tree, i);
+		child = (pANTLR3_BASE_TREE)adaptor->getChild(adaptor, tree, i);
 		simulateTreeConstruction(adaptor, child);
 		adaptor->debugger->addChild(adaptor->debugger, tree, child);
 	}
@@ -523,7 +523,7 @@
 
 	// Call the normal dup tree mechanism first
 	//
-	t = adaptor->dupTreeTT(adaptor, tree, NULL);
+	t = (pANTLR3_BASE_TREE)adaptor->dupTreeTT(adaptor, tree, NULL);
 
 	// In order to tell the debugger what we have just done, we now
 	// simulate the tree building mechanism. THis will fire
@@ -578,7 +578,7 @@
 
 	if	(t != NULL && child != NULL)
 	{
-		tc = adaptor->create(adaptor, child);
+		tc = (pANTLR3_BASE_TREE)adaptor->create(adaptor, child);
 		adaptor->addChild(adaptor, t, tc);
 		adaptor->debugger->addChild(adaptor->debugger, t, tc);
 	}
@@ -654,7 +654,7 @@
          * because if it was a Nil Node, then we can reuse it now.
 		 */
         saveRoot    = newRootTree;
-		newRootTree = newRootTree->getChild(newRootTree, 0);
+		newRootTree = (pANTLR3_BASE_TREE)newRootTree->getChild(newRootTree, 0);
 
         // Reclaim the old nilNode()
         //
@@ -718,7 +718,7 @@
 		}
 		else if	(root->getChildCount(root) == 1)
 		{
-			root = root->getChild(root, 0);
+			root = (pANTLR3_BASE_TREE)root->getChild(root, 0);
 			root->setParent(root, NULL);
 			root->setChildIndex(root, -1);
 
@@ -739,14 +739,14 @@
 static	pANTLR3_BASE_TREE	
    becomeRootToken	(pANTLR3_BASE_TREE_ADAPTOR adaptor, void * newRoot, pANTLR3_BASE_TREE oldRoot)
 {
-	return	adaptor->becomeRoot(adaptor, adaptor->create(adaptor, newRoot), oldRoot);
+	return	(pANTLR3_BASE_TREE)adaptor->becomeRoot(adaptor, adaptor->create(adaptor, (pANTLR3_COMMON_TOKEN)newRoot), oldRoot);
 }
 static	pANTLR3_BASE_TREE	
 dbgBecomeRootToken	(pANTLR3_BASE_TREE_ADAPTOR adaptor, void * newRoot, pANTLR3_BASE_TREE oldRoot)
 {
 	pANTLR3_BASE_TREE	t;
 
-	t =	adaptor->becomeRoot(adaptor, adaptor->create(adaptor, newRoot), oldRoot);
+	t =	(pANTLR3_BASE_TREE)adaptor->becomeRoot(adaptor, adaptor->create(adaptor, (pANTLR3_COMMON_TOKEN)newRoot), oldRoot);
 
 	adaptor->debugger->becomeRoot(adaptor->debugger,t, oldRoot);
 
@@ -769,7 +769,7 @@
 
 	/* Return a new node based upon this token
 	 */
-	return	adaptor->create(adaptor, fromToken);
+	return	(pANTLR3_BASE_TREE)adaptor->create(adaptor, fromToken);
 }
 static	pANTLR3_BASE_TREE	
 dbgCreateTypeToken	(pANTLR3_BASE_TREE_ADAPTOR adaptor, ANTLR3_UINT32 tokenType, pANTLR3_COMMON_TOKEN fromToken)
@@ -800,7 +800,7 @@
 
 	/* Return a new node based upon this token
 	 */
-	return	adaptor->create(adaptor, fromToken);
+	return	(pANTLR3_BASE_TREE)adaptor->create(adaptor, fromToken);
 }
 static	pANTLR3_BASE_TREE	
 dbgCreateTypeTokenText	(pANTLR3_BASE_TREE_ADAPTOR adaptor, ANTLR3_UINT32 tokenType, pANTLR3_COMMON_TOKEN fromToken, pANTLR3_UINT8 text)
@@ -825,7 +825,7 @@
 
 	/* Return a new node based upon this token
 	 */
-	return	adaptor->create(adaptor, fromToken);
+	return	(pANTLR3_BASE_TREE)adaptor->create(adaptor, fromToken);
 }
 static	pANTLR3_BASE_TREE	
    dbgCreateTypeText	(pANTLR3_BASE_TREE_ADAPTOR adaptor, ANTLR3_UINT32 tokenType, pANTLR3_UINT8 text)
diff --git a/runtime/C/src/antlr3bitset.c b/runtime/C/src/antlr3bitset.c
index 4e63c79..4434ed1 100644
--- a/runtime/C/src/antlr3bitset.c
+++ b/runtime/C/src/antlr3bitset.c
@@ -101,14 +101,13 @@
 	numelements	= ((numBits -1) >> ANTLR3_BITSET_LOG_BITS) + 1;
 
 	bitset->blist.bits    = (pANTLR3_BITWORD) ANTLR3_MALLOC((size_t)(numelements * sizeof(ANTLR3_BITWORD)));
-	memset(bitset->blist.bits, 0, (size_t)(numelements * sizeof(ANTLR3_BITWORD)));
-	bitset->blist.length  = numelements;
-
 	if	(bitset->blist.bits == NULL)
 	{
 		ANTLR3_FREE(bitset);
 		return	NULL;
 	}
+	memset(bitset->blist.bits, 0, (size_t)(numelements * sizeof(ANTLR3_BITWORD)));
+	bitset->blist.length  = numelements;
 
 	antlr3BitsetSetAPI(bitset);
 
diff --git a/runtime/C/src/antlr3collections.c b/runtime/C/src/antlr3collections.c
index d9e22e9..9d79edd 100644
--- a/runtime/C/src/antlr3collections.c
+++ b/runtime/C/src/antlr3collections.c
@@ -97,7 +97,7 @@
 static	ANTLR3_UINT32		antlr3VectorSize    (pANTLR3_VECTOR vector);
 static	ANTLR3_BOOLEAN      antlr3VectorSwap	(pANTLR3_VECTOR vector, ANTLR3_UINT32 entry1, ANTLR3_UINT32 entry2);
 
-static  void                newPool             (pANTLR3_VECTOR_FACTORY factory);
+static  ANTLR3_BOOLEAN      newPool             (pANTLR3_VECTOR_FACTORY factory);
 static  void				closeVectorFactory  (pANTLR3_VECTOR_FACTORY factory);
 static	pANTLR3_VECTOR		newVector			(pANTLR3_VECTOR_FACTORY factory);
 static	void				returnVector		(pANTLR3_VECTOR_FACTORY factory, pANTLR3_VECTOR vector);
@@ -132,7 +132,7 @@
 
 	ANTLR3_UINT32	bucket;	// Used to traverse the buckets
 
-	table   = ANTLR3_MALLOC(sizeof(ANTLR3_HASH_TABLE));
+	table   = (pANTLR3_HASH_TABLE)ANTLR3_MALLOC(sizeof(ANTLR3_HASH_TABLE));
 
 	// Error out if no memory left
 	if	(table	== NULL)
@@ -653,7 +653,7 @@
     }
     else
     {
-        entry->keybase.key.sKey	= key;                  /* Record the key value								*/
+        entry->keybase.key.sKey	= (pANTLR3_UINT8)key;                  /* Record the key value								*/
     }
 	entry->nextEntry		= NULL;					/* Ensure that the forward pointer ends the chain   */
 
@@ -1285,7 +1285,7 @@
 	return  element;
 }
 
-static  void
+static  ANTLR3_BOOLEAN
 antlr3VectorResize  (pANTLR3_VECTOR vector, ANTLR3_UINT32 hint)
 {
 	ANTLR3_UINT32	newSize;
@@ -1310,7 +1310,13 @@
         // We were already larger than the internal size, so we just
         // use realloc so that the pointers are copied for us
         //
-        vector->elements	= (pANTLR3_VECTOR_ELEMENT)ANTLR3_REALLOC(vector->elements, (sizeof(ANTLR3_VECTOR_ELEMENT)* newSize));
+		pANTLR3_VECTOR_ELEMENT newElements = (pANTLR3_VECTOR_ELEMENT)ANTLR3_REALLOC(vector->elements, (sizeof(ANTLR3_VECTOR_ELEMENT)* newSize));
+		if (newElements == NULL)
+		{
+			// realloc failed, but the old allocation is still there
+			return ANTLR3_FALSE;
+		}
+        vector->elements = newElements;
     }
     else
     {
@@ -1320,10 +1326,16 @@
         // is part of the internal or external entries, so we copy the internal ones to the new space
         //
         vector->elements	= (pANTLR3_VECTOR_ELEMENT)ANTLR3_MALLOC((sizeof(ANTLR3_VECTOR_ELEMENT)* newSize));
+		if (vector->elements == NULL)
+		{
+			// malloc failed
+			return ANTLR3_FALSE;
+		}
         ANTLR3_MEMCPY(vector->elements, vector->internal, ANTLR3_VECTOR_INTERNAL_SIZE * sizeof(ANTLR3_VECTOR_ELEMENT));
     }
 
 	vector->elementsSize	= newSize;
+	return ANTLR3_TRUE;
 }
 
 /// Add the supplied pointer and freeing function pointer to the list,
@@ -1335,7 +1347,12 @@
 	//
 	if	(vector->count == vector->elementsSize)
 	{
-		antlr3VectorResize(vector, 0);	    // Give no hint, we let it add 1024 or double it
+		// Give no hint, we let it add 1024 or double it
+		if (!antlr3VectorResize(vector, 0))
+		{
+			// Resize failed
+			return 0;
+		}
 	}
 
 	// Insert the new entry
@@ -1360,7 +1377,12 @@
 	//
 	if (entry >= vector->elementsSize)
 	{
-		antlr3VectorResize(vector, entry);	// We will get at least this many 
+		// We will get at least this many
+		if (!antlr3VectorResize(vector, entry))
+		{
+			// Resize failed
+			return 0;
+		}
 	}
 
 	// Valid request, replace the current one, freeing any prior entry if told to
@@ -1491,25 +1513,40 @@
 	// TODO: remove this line once happy printf("Returned vector %08X to the pool, stack size is %d\n", vector, factory->freeStack->size(factory->freeStack));
 }
 
-static void
+static ANTLR3_BOOLEAN
 newPool(pANTLR3_VECTOR_FACTORY factory)
 {
+	pANTLR3_VECTOR *newPools;
+
     /* Increment factory count
      */
-    factory->thisPool++;
+    ++factory->thisPool;
 
     /* Ensure we have enough pointers allocated
      */
-    factory->pools = (pANTLR3_VECTOR *)
-		     ANTLR3_REALLOC(	(void *)factory->pools,	    /* Current pools pointer (starts at NULL)	*/
+	newPools = (pANTLR3_VECTOR *)
+		ANTLR3_REALLOC(	(void *)factory->pools,	    /* Current pools pointer (starts at NULL)	*/
 					(ANTLR3_UINT32)((factory->thisPool + 1) * sizeof(pANTLR3_VECTOR *))	/* Memory for new pool pointers */
 					);
+	if (newPools == NULL)
+	{
+		// realloc failed, but we still have the old allocation
+		--factory->thisPool;
+		return ANTLR3_FALSE;
+	}
+	factory->pools = newPools;
 
     /* Allocate a new pool for the factory
      */
     factory->pools[factory->thisPool]	=
 			    (pANTLR3_VECTOR)
 				ANTLR3_MALLOC((size_t)(sizeof(ANTLR3_VECTOR) * ANTLR3_FACTORY_VPOOL_SIZE));
+	if (factory->pools[factory->thisPool] == NULL)
+	{
+		// malloc failed
+		--factory->thisPool;
+		return ANTLR3_FALSE;
+	}
 
 
     /* Reset the counters
@@ -1518,7 +1555,7 @@
 
     /* Done
      */
-    return;
+    return ANTLR3_TRUE;
 }
 
 static  void		
@@ -1641,7 +1678,7 @@
 
 	// If we have anything on the re claim stack, reuse it
 	//
-	vector = factory->freeStack->peek(factory->freeStack);
+	vector = (pANTLR3_VECTOR)factory->freeStack->peek(factory->freeStack);
 
 	if  (vector != NULL)
 	{
@@ -1661,7 +1698,11 @@
     {
         // We ran out of vectors in the current pool, so we need a new pool
         //
-        newPool(factory);
+        if (!newPool(factory))
+		{
+			// new pool creation failed
+			return NULL;
+		}
     }
 
     // Assuming everything went well (we are trying for performance here so doing minimal
@@ -1676,7 +1717,7 @@
     vector->factoryMade = ANTLR3_TRUE;
 
     // We know that the pool vectors are created at the default size, which means they
-    // will start off using their internal entry pointers. We must intialize our pool vector
+    // will start off using their internal entry pointers. We must initialize our pool vector
     // to point to its own internal entry table and not the pre-made one.
     //
     vector->elements = vector->internal;
@@ -1893,7 +1934,6 @@
     pANTLR3_INT_TRIE_NODE   p;
 
     p=trie->root;
-    key = key;
 
     return ANTLR3_FALSE;
 }
@@ -2337,7 +2377,7 @@
     {
         // We don't have any edges yet, so create an array to hold them
         //
-        topo->edges = ANTLR3_CALLOC(sizeof(pANTLR3_BITSET) * (maxEdge + 1), 1);
+        topo->edges = (pANTLR3_BITSET*)ANTLR3_CALLOC(sizeof(pANTLR3_BITSET) * (maxEdge + 1), 1);
         if (topo->edges == NULL)
         {
             return;
@@ -2351,7 +2391,7 @@
     {
         // WE have some edges but not enough
         //
-        topo->edges = ANTLR3_REALLOC(topo->edges, sizeof(pANTLR3_BITSET) * (maxEdge + 1));
+        topo->edges = (pANTLR3_BITSET*)ANTLR3_REALLOC(topo->edges, sizeof(pANTLR3_BITSET) * (maxEdge + 1));
         if (topo->edges == NULL)
         {
             return;
@@ -2529,14 +2569,22 @@
     //
     if  (topo->edges == NULL)
     {
-        return 0;
+        return NULL;
     }
     // First we need a vector to populate with enough
-    // entries to accomodate the sorted list and another to accomodate
+    // entries to accommodate the sorted list and another to accommodate
     // the maximum cycle we could detect which is all nodes such as 0->1->2->3->0
     //
-    topo->sorted    = ANTLR3_MALLOC(topo->limit * sizeof(ANTLR3_UINT32));
-    topo->cycle     = ANTLR3_MALLOC(topo->limit * sizeof(ANTLR3_UINT32));
+    topo->sorted    = (pANTLR3_UINT32)ANTLR3_MALLOC(topo->limit * sizeof(ANTLR3_UINT32));
+	if (topo->sorted == NULL)
+	{
+		return NULL;
+	}
+    topo->cycle     = (pANTLR3_UINT32)ANTLR3_MALLOC(topo->limit * sizeof(ANTLR3_UINT32));
+	if (topo->cycle == NULL)
+	{
+		return NULL;
+	}
 
     // Next we need an empty bitset to show whether we have visited a node
     // or not. This is the bit that gives us linear time of course as we are essentially
@@ -2595,7 +2643,7 @@
     // we are given. This is just a convenience routine that allows you to
     // sort the children of a tree node into topological order before or
     // during an AST walk. This can be useful for optimizations that require
-    // dag reorders and also when the input stream defines thigns that are
+    // dag reorders and also when the input stream defines things that are
     // interdependent and you want to walk the list of the generated trees
     // for those things in topological order so you can ignore the interdependencies
     // at that point.
@@ -2621,8 +2669,8 @@
     }
 
     // Ensure that the vector we are sorting is at least as big as the
-    // the input sequence we were adsked to sort. It does not matter if it is
-    // bigger as thaat probably just means that nodes numbered higher than the
+    // the input sequence we were asked to sort. It does not matter if it is
+    // bigger as that probably just means that nodes numbered higher than the
     // limit had no dependencies and so can be left alone.
     //
     if  (topo->limit > v->count)
@@ -2636,10 +2684,15 @@
     // We need to know the locations of each of the entries
     // in the vector as we don't want to duplicate them in a new vector. We
     // just use an indirection table to get the vector entry for a particular sequence
-    // acording to where we moved it last. Then we can just swap vector entries until
+    // according to where we moved it last. Then we can just swap vector entries until
     // we are done :-)
     //
-    vIndex = ANTLR3_MALLOC(topo->limit * sizeof(ANTLR3_UINT32));
+    vIndex = (pANTLR3_UINT32)ANTLR3_MALLOC(topo->limit * sizeof(ANTLR3_UINT32));
+	if (vIndex == NULL)
+	{
+		// malloc failed
+		return;
+	}
 
     // Start index, each vector entry is located where you think it is
     //
diff --git a/runtime/C/src/antlr3commontoken.c b/runtime/C/src/antlr3commontoken.c
index 2627431..da4ef63 100644
--- a/runtime/C/src/antlr3commontoken.c
+++ b/runtime/C/src/antlr3commontoken.c
@@ -65,7 +65,7 @@
 
 /* Internal management functions
  */
-static	void			newPool		(pANTLR3_TOKEN_FACTORY factory);
+static	ANTLR3_BOOLEAN			newPool		(pANTLR3_TOKEN_FACTORY factory);
 static	pANTLR3_COMMON_TOKEN    newPoolToken	(pANTLR3_TOKEN_FACTORY factory);
 
 
@@ -148,30 +148,44 @@
     }
 }
 
-static void
+static ANTLR3_BOOLEAN
 newPool(pANTLR3_TOKEN_FACTORY factory)
 {
     /* Increment factory count
      */
-    factory->thisPool++;
+    ++(factory->thisPool);
 
     // If we were reusing this token factory then we may already have a pool
-    // allocated. If we exceeded the max avaible then we must allocate a new
+    // allocated. If we exceeded the max available then we must allocate a new
     // one.
     if  (factory->thisPool > factory->maxPool)
     {
         /* Ensure we have enough pointers allocated
          */
-        factory->pools = (pANTLR3_COMMON_TOKEN *)
-		         ANTLR3_REALLOC(	(void *)factory->pools,	    /* Current pools pointer (starts at NULL)	*/
-					    (ANTLR3_UINT32)((factory->thisPool + 1) * sizeof(pANTLR3_COMMON_TOKEN *))	/* Memory for new pool pointers */
-					    );
+		pANTLR3_COMMON_TOKEN *newPools = (pANTLR3_COMMON_TOKEN *)
+			ANTLR3_REALLOC((void *)factory->pools,	    /* Current pools pointer (starts at NULL)	*/
+		                   (ANTLR3_UINT32)((factory->thisPool + 1) * sizeof(pANTLR3_COMMON_TOKEN *))	/* Memory for new pool pointers */
+			);
+		if (newPools == NULL)
+		{
+			// We are out of memory, but the old allocation is still valid for now
+			--(factory->thisPool);
+			return ANTLR3_FALSE;
+		}
+
+        factory->pools = newPools;
 
         /* Allocate a new pool for the factory
          */
         factory->pools[factory->thisPool]	=
 			        (pANTLR3_COMMON_TOKEN) 
 				    ANTLR3_CALLOC(1, (size_t)(sizeof(ANTLR3_COMMON_TOKEN) * ANTLR3_FACTORY_POOL_SIZE));
+		if (factory->pools[factory->thisPool] == NULL)
+		{
+			// Allocation failed
+			--(factory->thisPool);
+			return ANTLR3_FALSE;
+		}
 
         // We now have a new pool and can track it as the maximum we have created so far
         //
@@ -184,7 +198,7 @@
   
     /* Done
      */
-    return;
+    return ANTLR3_TRUE;
 }
 
 static pANTLR3_COMMON_TOKEN
@@ -192,6 +206,8 @@
 {
     pANTLR3_COMMON_TOKEN token;
 
+	if (factory == NULL) { return NULL; }
+
     /* See if we need a new token pool before allocating a new
      * one
      */
@@ -199,9 +215,16 @@
     {
         /* We ran out of tokens in the current pool, so we need a new pool
          */
-        newPool(factory);
+        if (!newPool(factory))
+		{
+			return NULL;
+		}
     }
 
+	// make sure the factory is sane
+	if (factory->pools == NULL) { return NULL; }
+	if (factory->pools[factory->thisPool] == NULL) { return NULL; }
+
     /* Assuming everything went well (we are trying for performance here so doing minimal
      * error checking. Then we can work out what the pointer is to the next token.
      */
diff --git a/runtime/C/src/antlr3commontree.c b/runtime/C/src/antlr3commontree.c
index 65de38f..e275263 100644
--- a/runtime/C/src/antlr3commontree.c
+++ b/runtime/C/src/antlr3commontree.c
@@ -55,7 +55,7 @@
 
 // Factory functions for the Arboretum
 //
-static void					newPool				(pANTLR3_ARBORETUM factory);
+static ANTLR3_BOOLEAN		newPool				(pANTLR3_ARBORETUM factory);
 static pANTLR3_BASE_TREE    newPoolTree			(pANTLR3_ARBORETUM factory);
 static pANTLR3_BASE_TREE    newFromTree			(pANTLR3_ARBORETUM factory, pANTLR3_COMMON_TREE tree);
 static pANTLR3_BASE_TREE    newFromToken		(pANTLR3_ARBORETUM factory, pANTLR3_COMMON_TOKEN token);
@@ -120,25 +120,40 @@
 
 }
 
-static void
+static ANTLR3_BOOLEAN
 newPool(pANTLR3_ARBORETUM factory)
 {
+	pANTLR3_COMMON_TREE *newPools;
+
     // Increment factory count
     //
-    factory->thisPool++;
+    ++factory->thisPool;
 
     // Ensure we have enough pointers allocated
     //
-    factory->pools = (pANTLR3_COMMON_TREE *)
+    newPools = (pANTLR3_COMMON_TREE *)
 					ANTLR3_REALLOC(	(void *)factory->pools,										// Current pools pointer (starts at NULL)
 					(ANTLR3_UINT32)((factory->thisPool + 1) * sizeof(pANTLR3_COMMON_TREE *))	// Memory for new pool pointers
 					);
+	if (newPools == NULL)
+	{
+		// realloc failed, but we still have the old allocation
+		--factory->thisPool;
+		return ANTLR3_FALSE;
+	}
+	factory->pools = newPools;
 
     // Allocate a new pool for the factory
     //
     factory->pools[factory->thisPool]	=
 			    (pANTLR3_COMMON_TREE) 
 				ANTLR3_MALLOC((size_t)(sizeof(ANTLR3_COMMON_TREE) * ANTLR3_FACTORY_POOL_SIZE));
+	if (factory->pools[factory->thisPool] == NULL)
+	{
+		// malloc failed
+		--factory->thisPool;
+		return ANTLR3_FALSE;
+	}
 
 
     // Reset the counters
@@ -147,7 +162,7 @@
   
     // Done
     //
-    return;
+    return ANTLR3_TRUE;
 }
 
 static	pANTLR3_BASE_TREE    
@@ -157,7 +172,7 @@
 
     // If we have anything on the re claim stack, reuse that sucker first
     //
-    tree = factory->nilStack->peek(factory->nilStack);
+    tree = (pANTLR3_COMMON_TREE)factory->nilStack->peek(factory->nilStack);
 
     if  (tree != NULL)
     {
@@ -176,7 +191,11 @@
 	{
 		// We ran out of tokens in the current pool, so we need a new pool
 		//
-		newPool(factory);
+		if (!newPool(factory))
+		{
+			// new pool creation failed
+			return NULL;
+		}
 	}
 
 	// Assuming everything went well - we are trying for performance here so doing minimal
@@ -337,7 +356,7 @@
 antlr3CommonTreeNew()
 {
 	pANTLR3_COMMON_TREE	tree;
-	tree    = ANTLR3_CALLOC(1, sizeof(ANTLR3_COMMON_TREE));
+	tree = (pANTLR3_COMMON_TREE)ANTLR3_CALLOC(1, sizeof(ANTLR3_COMMON_TREE));
 
 	if	(tree == NULL)
 	{
@@ -503,13 +522,15 @@
 static pANTLR3_BASE_TREE	
 getParent				(pANTLR3_BASE_TREE tree)
 {
+	if (((pANTLR3_COMMON_TREE)(tree->super))->parent == NULL)
+		return NULL;
 	return & (((pANTLR3_COMMON_TREE)(tree->super))->parent->baseTree);
 }
 
 static void					
 setParent				(pANTLR3_BASE_TREE tree, pANTLR3_BASE_TREE parent)
 {
-	((pANTLR3_COMMON_TREE)(tree->super))->parent = parent == NULL ? NULL : ((pANTLR3_COMMON_TREE)(parent->super))->parent;
+	((pANTLR3_COMMON_TREE)(tree->super))->parent = parent == NULL ? NULL : ((pANTLR3_COMMON_TREE)(parent->super));
 }
 
 static void    				
diff --git a/runtime/C/src/antlr3commontreeadaptor.c b/runtime/C/src/antlr3commontreeadaptor.c
index abce6f0..38697f1 100644
--- a/runtime/C/src/antlr3commontreeadaptor.c
+++ b/runtime/C/src/antlr3commontreeadaptor.c
@@ -243,7 +243,7 @@
 	// need to track and free the memory allocated to it, so for now, we just
 	// want something in the tree that isn't a NULL pointer.
 	//
-	return adaptor->createTypeText(adaptor, ANTLR3_TOKEN_INVALID, (pANTLR3_UINT8)"Tree Error Node");
+	return (pANTLR3_BASE_TREE)adaptor->createTypeText(adaptor, ANTLR3_TOKEN_INVALID, (pANTLR3_UINT8)"Tree Error Node");
 
 }
 
@@ -252,7 +252,7 @@
 static	pANTLR3_BASE_TREE
 dupNode		(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE treeNode)
 {
-	return  treeNode == NULL ? NULL : treeNode->dupNode(treeNode);
+	return  treeNode == NULL ? NULL : (pANTLR3_BASE_TREE)treeNode->dupNode(treeNode);
 }
 
 static	pANTLR3_BASE_TREE
@@ -453,7 +453,7 @@
 static	pANTLR3_BASE_TREE
 getChild				(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, ANTLR3_UINT32 i)
 {
-	return t->getChild(t, i);
+	return (pANTLR3_BASE_TREE)t->getChild(t, i);
 }
 static  void
 setChild				(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, ANTLR3_UINT32 i, pANTLR3_BASE_TREE child)
diff --git a/runtime/C/src/antlr3commontreenodestream.c b/runtime/C/src/antlr3commontreenodestream.c
index a759d34..54d5184 100644
--- a/runtime/C/src/antlr3commontreenodestream.c
+++ b/runtime/C/src/antlr3commontreenodestream.c
@@ -503,7 +503,7 @@
 	//
 	for	(c = 0; c < nCount; c++)
 	{
-		fillBuffer(ctns, ctns->adaptor->getChild(ctns->adaptor, t, c));
+		fillBuffer(ctns, (pANTLR3_BASE_TREE)ctns->adaptor->getChild(ctns->adaptor, t, c));
 	}
 
 	// If the tree had children and was not a nil (list) node, then we
@@ -560,7 +560,7 @@
 		return	&(tns->ctns->INVALID_NODE.baseTree);
 	}
 
-	return tns->ctns->nodes->get(tns->ctns->nodes, tns->ctns->p - k);
+	return (pANTLR3_BASE_TREE)tns->ctns->nodes->get(tns->ctns->nodes, tns->ctns->p - k);
 }
 
 /// Get tree node at current input pointer + i ahead where i=1 is next node.
@@ -597,7 +597,7 @@
 		return &(tns->ctns->EOF_NODE.baseTree);
 	}
 
-	return	tns->ctns->nodes->get(tns->ctns->nodes, tns->ctns->p + k - 1);
+	return	(pANTLR3_BASE_TREE)tns->ctns->nodes->get(tns->ctns->nodes, tns->ctns->p + k - 1);
 }
 
 /// Where is this stream pulling nodes from?  This is not the name, but
@@ -867,7 +867,7 @@
 	{
 		pANTLR3_BASE_TREE   child;
 
-		child = p->getChild(p, c);
+		child = (pANTLR3_BASE_TREE)p->getChild(p, c);
 		tns->toStringWork(tns, child, stop, buf);
 	}
 
@@ -947,7 +947,7 @@
 		fillBufferRoot(tns->ctns);
 	}
 
-	return tns->ctns->nodes->get(tns->ctns->nodes, k);
+	return (pANTLR3_BASE_TREE)tns->ctns->nodes->get(tns->ctns->nodes, k);
 }
 
 static	void
diff --git a/runtime/C/src/antlr3convertutf.c b/runtime/C/src/antlr3convertutf.c
index 7c2f060..9d2bcf1 100644
--- a/runtime/C/src/antlr3convertutf.c
+++ b/runtime/C/src/antlr3convertutf.c
@@ -288,25 +288,25 @@
     UTF8 a;
     const UTF8 *srcptr = source+length;
     switch (length) {
-    default: return false;
+    default: return ANTLR3_FALSE;
 	/* Everything else falls through when "true"... */
-    case 4: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return false;
-    case 3: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return false;
-    case 2: if ((a = (*--srcptr)) > 0xBF) return false;
+    case 4: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return ANTLR3_FALSE;
+    case 3: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return ANTLR3_FALSE;
+    case 2: if ((a = (*--srcptr)) > 0xBF) return ANTLR3_FALSE;
 
 	switch (*source) {
 	    /* no fall-through in this inner switch */
-	    case 0xE0: if (a < 0xA0) return false; break;
-	    case 0xED: if (a > 0x9F) return false; break;
-	    case 0xF0: if (a < 0x90) return false; break;
-	    case 0xF4: if (a > 0x8F) return false; break;
-	    default:   if (a < 0x80) return false;
+	    case 0xE0: if (a < 0xA0) return ANTLR3_FALSE; break;
+	    case 0xED: if (a > 0x9F) return ANTLR3_FALSE; break;
+	    case 0xF0: if (a < 0x90) return ANTLR3_FALSE; break;
+	    case 0xF4: if (a > 0x8F) return ANTLR3_FALSE; break;
+	    default:   if (a < 0x80) return ANTLR3_FALSE;
 	}
 
-    case 1: if (*source >= 0x80 && *source < 0xC2) return false;
+    case 1: if (*source >= 0x80 && *source < 0xC2) return ANTLR3_FALSE;
     }
-    if (*source > 0xF4) return false;
-    return true;
+    if (*source > 0xF4) return ANTLR3_FALSE;
+    return ANTLR3_TRUE;
 }
 
 /* --------------------------------------------------------------------- */
@@ -319,7 +319,7 @@
 isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd) {
     int length = trailingBytesForUTF8[*source]+1;
     if (source+length > sourceEnd) {
-	return false;
+	return ANTLR3_FALSE;
     }
     return isLegalUTF8(source, length);
 }
diff --git a/runtime/C/src/antlr3debughandlers.c b/runtime/C/src/antlr3debughandlers.c
index d5f177a..5202e8e 100644
--- a/runtime/C/src/antlr3debughandlers.c
+++ b/runtime/C/src/antlr3debughandlers.c
@@ -94,7 +94,7 @@
 {
 	pANTLR3_DEBUG_EVENT_LISTENER	delboy;
 
-	delboy = ANTLR3_CALLOC(1, sizeof(ANTLR3_DEBUG_EVENT_LISTENER));
+	delboy = (pANTLR3_DEBUG_EVENT_LISTENER)ANTLR3_CALLOC(1, sizeof(ANTLR3_DEBUG_EVENT_LISTENER));
 
 	if	(delboy == NULL)
 	{
@@ -136,7 +136,7 @@
 	delboy->terminate				= terminate;
 	delboy->errorNode				= errorNode;
 
-	delboy->PROTOCOL_VERSION		= 2;	// ANTLR 3.1 is at protocol version 2
+	delboy->protocol_version		= 2;	// ANTLR 3.1 is at protocol version 2
 
 	delboy->port					= DEFAULT_DEBUGGER_PORT;
 
@@ -299,7 +299,7 @@
 		// Disable Nagle as this is essentially a chat exchange
 		//
 		optVal	= 1;
-		setsockopt(delboy->socket, SOL_SOCKET, TCP_NODELAY, (const void *)&optVal, sizeof(optVal));
+		setsockopt(delboy->socket, SOL_SOCKET, TCP_NODELAY, (const char *)&optVal, sizeof(optVal));
 		
 	}
 
@@ -307,7 +307,7 @@
 	// send it the protocol version we are using and what the name of the grammar
 	// is that we represent.
 	//
-	sprintf		(message, "ANTLR %d\n", delboy->PROTOCOL_VERSION);
+	sprintf		(message, "ANTLR %d\n", delboy->protocol_version);
 	sockSend	(delboy->socket, message, (int)strlen(message));
 	sprintf		(message, "grammar \"%s\n", delboy->grammarFileName->chars);
 	sockSend	(delboy->socket, message, (int)strlen(message));
diff --git a/runtime/C/src/antlr3inputstream.c b/runtime/C/src/antlr3inputstream.c
index e3f1c26..dd9f56e 100644
--- a/runtime/C/src/antlr3inputstream.c
+++ b/runtime/C/src/antlr3inputstream.c
@@ -263,7 +263,7 @@
 
     input->nextChar		= input->data;	/* Input at first character */
     input->line			= 1;		/* starts at line 1	    */
-    input->charPositionInLine	= -1;
+    input->charPositionInLine	= 0;
     input->currentLine		= input->data;
     input->markDepth		= 0;		/* Reset markers	    */
     
@@ -451,26 +451,32 @@
 
     /* New mark point 
      */
-    input->markDepth++;
+    ++input->markDepth;
 
     /* See if we are revisiting a mark as we can just reuse the vector
      * entry if we are, otherwise, we need a new one
      */
     if	(input->markDepth > input->markers->count)
     {	
-	state	= ANTLR3_MALLOC(sizeof(ANTLR3_LEX_STATE));
+		state = (pANTLR3_LEX_STATE)ANTLR3_MALLOC(sizeof(ANTLR3_LEX_STATE));
+		if (state == NULL)
+		{
+			// malloc failed
+			--input->markDepth;
+			return 0;
+		}
 
-	/* Add it to the table
-	 */
-	input->markers->add(input->markers, state, ANTLR3_FREE_FUNC);	/* No special structure, just free() on delete */
+		/* Add it to the table
+		 */
+		input->markers->add(input->markers, state, ANTLR3_FREE_FUNC);	/* No special structure, just free() on delete */
     }
     else
     {
-	state	= (pANTLR3_LEX_STATE)input->markers->get(input->markers, input->markDepth - 1);
+		state	= (pANTLR3_LEX_STATE)input->markers->get(input->markers, input->markDepth - 1);
 
-	/* Assume no errors for speed, it will just blow up if the table failed
-	 * for some reasons, hence lots of unit tests on the tables ;-)
-	 */
+		/* Assume no errors for speed, it will just blow up if the table failed
+		 * for some reasons, hence lots of unit tests on the tables ;-)
+		 */
     }
 
     /* We have created or retrieved the state, so update it with the current
@@ -522,6 +528,7 @@
     /* Find the supplied mark state 
      */
     state   = (pANTLR3_LEX_STATE)input->markers->get(input->markers, (ANTLR3_UINT32)(mark - 1));
+	if (state == NULL) { return; }
 
     /* Seek input pointer to the requested point (note we supply the void *pointer
      * to whatever is implementing the int stream to seek).
@@ -572,7 +579,7 @@
 	ANTLR3_INT32   count;
 	pANTLR3_INPUT_STREAM input;
 
-	input   = ANTLR3_FUNC_PTR(((pANTLR3_INPUT_STREAM) is->super));
+	input   = (pANTLR3_INPUT_STREAM)ANTLR3_FUNC_PTR(((pANTLR3_INPUT_STREAM) is->super));
 
 	/* If the requested seek point is less than the current
 	* input point, then we assume that we are resetting from a mark
@@ -865,7 +872,7 @@
         // in the input stream
         //
 	input       = ((pANTLR3_INPUT_STREAM) (is->super));
-        nextChar    = input->nextChar;
+        nextChar    = (UTF16*)input->nextChar;
 
         // If a positive offset then advance forward, else retreat
         //
@@ -1145,7 +1152,7 @@
         // in the input stream
         //
 	input       = ((pANTLR3_INPUT_STREAM) (is->super));
-        nextChar    = input->nextChar;
+        nextChar    = (pANTLR3_UCHAR)input->nextChar;
 
         // If a positive offset then advance forward, else retreat
         //
@@ -1366,7 +1373,7 @@
         // in the input stream
         //
 	input       = ((pANTLR3_INPUT_STREAM) (is->super));
-        nextChar    = input->nextChar;
+        nextChar    = (pANTLR3_UCHAR)input->nextChar;
 
         // If a positive offset then advance forward, else retreat
         //
@@ -1810,7 +1817,7 @@
 
     input   = ((pANTLR3_INPUT_STREAM) (is->super));
 
-    nextChar = input->nextChar;
+    nextChar = (pANTLR3_UINT8)input->nextChar;
 
     if	(nextChar < (((pANTLR3_UINT8)input->data) + input->sizeBuf))
     {	
@@ -1876,7 +1883,7 @@
 
     input   = ((pANTLR3_INPUT_STREAM) (is->super));
 
-    nextChar = input->nextChar;
+    nextChar = (pANTLR3_UINT8)input->nextChar;
 
     // Do we need to traverse forwards or backwards?
     // - LA(0) is treated as LA(1) and we assume that the nextChar is
diff --git a/runtime/C/src/antlr3lexer.c b/runtime/C/src/antlr3lexer.c
index d981ab7..962163d 100644
--- a/runtime/C/src/antlr3lexer.c
+++ b/runtime/C/src/antlr3lexer.c
@@ -176,7 +176,7 @@
 {
     pANTLR3_LEXER   lexer;
 
-    lexer   = rec->super;
+    lexer   = (pANTLR3_LEXER)rec->super;
 
     lexer->rec->state->token			    = NULL;
     lexer->rec->state->type			    = ANTLR3_TOKEN_INVALID;
@@ -343,12 +343,12 @@
 	// stream we just consumed, otherwise we will return EOF
 	// on the reinstalled input stream, when in actual fact
 	// there might be more input streams to POP before the
-	// real EOF of the whole logical inptu stream. Hence we
-	// use a while loop here until we find somethign in the stream
+	// real EOF of the whole logical input stream. Hence we
+	// use a while loop here until we find something in the stream
 	// that isn't EOF or we reach the actual end of the last input
 	// stream on the stack.
 	//
-	while	(tok->type == ANTLR3_TOKEN_EOF)
+	while	((tok != NULL) && (tok->type == ANTLR3_TOKEN_EOF))
 	{
 		pANTLR3_LEXER   lexer;
 
@@ -649,6 +649,7 @@
     * trying to emit a new token.
     */
     token   = lexer->rec->state->tokFactory->newToken(lexer->rec->state->tokFactory);
+	if (token == NULL) { return NULL; }
 
     /* Install the supplied information, and some other bits we already know
     * get added automatically, such as the input stream it is associated with
diff --git a/runtime/C/src/antlr3rewritestreams.c b/runtime/C/src/antlr3rewritestreams.c
index 9afb6e1..8da3011 100644
--- a/runtime/C/src/antlr3rewritestreams.c
+++ b/runtime/C/src/antlr3rewritestreams.c
@@ -197,7 +197,7 @@
 		// Remove the entry from the vector. We do not
 		// cause it to be freed by using remove.
 		//
-		stream = rec->state->rStreams->remove(rec->state->rStreams, rec->state->rStreams->count - 1);
+		stream = (pANTLR3_REWRITE_RULE_ELEMENT_STREAM)rec->state->rStreams->remove(rec->state->rStreams, rec->state->rStreams->count - 1);
 
 		// We found a stream we can reuse.
 		// If the stream had a vector, then it will have been cleared
@@ -577,13 +577,13 @@
 		// if out of elements and size is 1, dup
 		//
 		el = stream->_next(stream);
-		return stream->dup(stream, el);
+		return (pANTLR3_BASE_TREE)stream->dup(stream, el);
 	}
 
 	// test size above then fetch
 	//
 	el = stream->_next(stream);
-	return el;
+	return (pANTLR3_BASE_TREE)el;
 }
 
 /// Return the next element for a caller that wants just the token
@@ -607,7 +607,7 @@
 	{
 		pANTLR3_BASE_TREE el;
 
-		el = stream->_next(stream);
+		el = (pANTLR3_BASE_TREE)stream->_next(stream);
 
 		return	stream->dup(stream, el);
 	}
@@ -737,7 +737,7 @@
 static pANTLR3_BASE_TREE	
 toTreeNode   (pANTLR3_REWRITE_RULE_ELEMENT_STREAM stream, void * element)
 {
-	return stream->adaptor->dupNode(stream->adaptor, (pANTLR3_BASE_TREE)element);
+	return (pANTLR3_BASE_TREE)stream->adaptor->dupNode(stream->adaptor, (pANTLR3_BASE_TREE)element);
 }
 
 #ifdef ANTLR3_WINDOWS
@@ -766,13 +766,13 @@
 static pANTLR3_BASE_TREE
 nextNodeToken(pANTLR3_REWRITE_RULE_ELEMENT_STREAM stream)
 {
-	return stream->adaptor->create(stream->adaptor, stream->_next(stream));
+	return (pANTLR3_BASE_TREE)stream->adaptor->create(stream->adaptor, (pANTLR3_COMMON_TOKEN)stream->_next(stream));
 }
 
 static pANTLR3_BASE_TREE
 nextNodeNode(pANTLR3_REWRITE_RULE_ELEMENT_STREAM stream)
 {
-	return stream->_next(stream);
+	return (pANTLR3_BASE_TREE)stream->_next(stream);
 }
 
 /// Treat next element as a single node even if it's a subtree.
@@ -789,7 +789,7 @@
 {
 
 	ANTLR3_UINT32	n;
-	pANTLR3_BASE_TREE	el = stream->_next(stream);
+	pANTLR3_BASE_TREE	el = (pANTLR3_BASE_TREE)stream->_next(stream);
 
 	n = stream->size(stream);
 	if (stream->dirty == ANTLR3_TRUE || (stream->cursor > n && n == 1))
@@ -797,7 +797,7 @@
 		// We are out of elements and the size is 1, which means we just 
 		// dup the node that we have
 		//
-		return	stream->adaptor->dupNode(stream->adaptor, el);
+		return	(pANTLR3_BASE_TREE)stream->adaptor->dupNode(stream->adaptor, el);
 	}
 
 	// We were not out of nodes, so the one we received is the one to return
@@ -837,7 +837,7 @@
 {
 	if (stream->elementDescription == NULL)
 	{
-		stream->elementDescription = "<unknown source>";
+		stream->elementDescription = (void*)"<unknown source>";
 	}
 
 	return  stream->elementDescription;
diff --git a/runtime/C/src/antlr3string.c b/runtime/C/src/antlr3string.c
index b29c020..36d0de0 100644
--- a/runtime/C/src/antlr3string.c
+++ b/runtime/C/src/antlr3string.c
@@ -432,9 +432,11 @@
     /* Always add one more byte for a terminator ;-)
     */
     string->chars	= (pANTLR3_UINT8) ANTLR3_MALLOC((size_t)(sizeof(ANTLR3_UINT8) * (size+1)));
-    *(string->chars)	= '\0';
-    string->size	= size + 1;
-
+	if (string->chars != NULL)
+    {
+		*(string->chars)	= '\0';
+		string->size	= size + 1;
+	}
 
     return string;
 }
@@ -460,8 +462,11 @@
     /* Always add one more byte for a terminator ;-)
     */	
     string->chars	= (pANTLR3_UINT8) ANTLR3_MALLOC((size_t)(sizeof(ANTLR3_UINT16) * (size+1)));
-    *(string->chars)	= '\0';
-    string->size	= size+1;	/* Size is always in characters, as is len */
+    if (string->chars != NULL)
+	{
+		*(string->chars)	= '\0';
+		string->size	= size+1;	/* Size is always in characters, as is len */
+	}
 
     return string;
 }
@@ -800,7 +805,12 @@
 
     if	(string->size < (string->len + len + 1))
     {
-		string->chars	= (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(string->len + len + 1));
+		pANTLR3_UINT8 newAlloc = (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(string->len + len + 1));
+		if (newAlloc == NULL)
+		{
+			return NULL;
+		}
+		string->chars	= newAlloc;
 		string->size	= string->len + len + 1;
     }
 
@@ -823,7 +833,12 @@
 
     if	(string->size < (string->len + len + 1))
     {
-		string->chars	= (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)((sizeof(ANTLR3_UINT16)*(string->len + len + 1))));
+		pANTLR3_UINT8 newAlloc = (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)((sizeof(ANTLR3_UINT16)*(string->len + len + 1))));
+		if (newAlloc == NULL)
+		{
+			return NULL;
+		}
+		string->chars	= newAlloc;
 		string->size	= string->len + len + 1;
     }
 
@@ -857,7 +872,12 @@
 
     if	(string->size < (string->len + len + 1))
     {
-		string->chars	= (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)( sizeof(ANTLR3_UINT16) *(string->len + len + 1) ));
+		pANTLR3_UINT8 newAlloc = (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)( sizeof(ANTLR3_UINT16) *(string->len + len + 1) ));
+		if (newAlloc == NULL)
+		{
+			return NULL;
+		}
+		string->chars	= newAlloc;
 		string->size	= string->len + len + 1;
     }
 
@@ -877,7 +897,12 @@
     len = (ANTLR3_UINT32)strlen(chars);
     if	(string->size < len + 1)
     {
-		string->chars	= (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(len + 1));
+		pANTLR3_UINT8 newAlloc = (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(len + 1));
+		if (newAlloc == NULL)
+		{
+			return NULL;
+		}
+		string->chars	= newAlloc;
 		string->size	= len + 1;
     }
 
@@ -900,7 +925,12 @@
     len = (ANTLR3_UINT32)strlen(chars);
     if	(string->size < len + 1)
 	{
-		string->chars	= (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(sizeof(ANTLR3_UINT16)*(len + 1)));
+		pANTLR3_UINT8 newAlloc = (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(sizeof(ANTLR3_UINT16)*(len + 1)));
+		if (newAlloc == NULL)
+		{
+			return NULL;
+		}
+		string->chars	= newAlloc;
 		string->size	= len + 1;
     }
     apPoint = ((pANTLR3_UINT16)string->chars);
@@ -933,7 +963,12 @@
 
     if	(string->size < len + 1)
     {
-		string->chars	= (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(sizeof(ANTLR3_UINT16)*(len + 1)));
+		pANTLR3_UINT8 newAlloc = (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(sizeof(ANTLR3_UINT16)*(len + 1)));
+		if (newAlloc == NULL)
+		{
+			return NULL;
+		}
+		string->chars	= newAlloc;
 		string->size	= len + 1;
     }
 
@@ -951,7 +986,12 @@
 {
     if	(string->size < string->len + 2)
     {
-		string->chars	= (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(string->len + 2));
+		pANTLR3_UINT8 newAlloc = (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(string->len + 2));
+		if (newAlloc == NULL)
+		{
+			return NULL;
+		}
+		string->chars	= newAlloc;
 		string->size	= string->len + 2;
     }
     *(string->chars + string->len)	= (ANTLR3_UINT8)c;
@@ -968,7 +1008,12 @@
 
     if	(string->size < string->len + 2)
     {
-		string->chars	= (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(sizeof(ANTLR3_UINT16) * (string->len + 2)));
+		pANTLR3_UINT8 newAlloc = (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(sizeof(ANTLR3_UINT16) * (string->len + 2)));
+		if (newAlloc == NULL)
+		{
+			return NULL;
+		}
+		string->chars	= newAlloc;
 		string->size	= string->len + 2;
     }
     ptr	= (pANTLR3_UINT16)(string->chars);
@@ -1035,7 +1080,12 @@
 
     if	(string->size < (string->len + len + 1))
     {
-		string->chars	= (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(string->len + len + 1));
+		pANTLR3_UINT8 newAlloc = (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(string->len + len + 1));
+		if (newAlloc == NULL)
+		{
+			return NULL;
+		}
+		string->chars	= newAlloc;
 		string->size	= string->len + len + 1;
     }
 
@@ -1073,8 +1123,13 @@
 
     if	(string->size < (string->len + len + 1))
     {
-	string->chars	= (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(sizeof(ANTLR3_UINT16)*(string->len + len + 1)));
-	string->size	= string->len + len + 1;
+		pANTLR3_UINT8 newAlloc = (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(sizeof(ANTLR3_UINT16)*(string->len + len + 1)));
+		if (newAlloc == NULL)
+		{
+			return NULL;
+		}
+		string->chars	= newAlloc;
+		string->size	= string->len + len + 1;
     }
 
     /* Move the characters we are inserting before, including the delimiter
@@ -1120,7 +1175,12 @@
 
     if	(string->size < (string->len + len + 1))
     {
-		string->chars	= (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(sizeof(ANTLR3_UINT16)*(string->len + len + 1)));
+		pANTLR3_UINT8 newAlloc = (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(sizeof(ANTLR3_UINT16)*(string->len + len + 1)));
+		if (newAlloc == NULL)
+		{
+			return NULL;
+		}
+		string->chars	= newAlloc;
 		string->size	= string->len + len + 1;
     }
 
@@ -1379,24 +1439,27 @@
 	/* Always add one more byte for a terminator
 	*/
 	newStr->chars   = (pANTLR3_UINT8) ANTLR3_MALLOC((size_t)(string->len + 1));
-	newStr->size    = string->len + 1;
-	newStr->len	    = string->len;
-
-	/* Now copy each UTF16 charActer , making it an 8 bit character of 
-	* some sort.
-	*/
-	for	(i=0; i<string->len; i++)
+	if (newStr->chars != NULL)
 	{
-		ANTLR3_UCHAR	c;
+		newStr->size    = string->len + 1;
+		newStr->len	    = string->len;
 
-		c = *(((pANTLR3_UINT16)(string->chars)) + i);
+		/* Now copy each UTF16 charActer , making it an 8 bit character of 
+		* some sort.
+		*/
+		for	(i=0; i<string->len; i++)
+		{
+			ANTLR3_UCHAR	c;
 
-		*(newStr->chars + i) = (ANTLR3_UINT8)(c > 255 ? '_' : c);
+			c = *(((pANTLR3_UINT16)(string->chars)) + i);
+
+			*(newStr->chars + i) = (ANTLR3_UINT8)(c > 255 ? '_' : c);
+		}
+
+		/* Terminate
+		*/
+		*(newStr->chars + newStr->len) = '\0';
 	}
 
-	/* Terminate
-	*/
-	*(newStr->chars + newStr->len) = '\0';
-
 	return newStr;
 }
diff --git a/runtime/C/src/antlr3treeparser.c b/runtime/C/src/antlr3treeparser.c
index b7e035a..c40a1ef 100644
--- a/runtime/C/src/antlr3treeparser.c
+++ b/runtime/C/src/antlr3treeparser.c
@@ -232,7 +232,7 @@
 		current = tns->_LT(tns, i--);
     }
 
-	node	= current->dupNode(current);
+	node	= (pANTLR3_BASE_TREE)current->dupNode(current);
 
 	// Find the newly dupicated token
 	//
diff --git a/runtime/CSharp3/Sources/Antlr3.Runtime.Debug/Antlr3.Runtime.Debug.csproj b/runtime/CSharp3/Sources/Antlr3.Runtime.Debug/Antlr3.Runtime.Debug.csproj
index 5ca19d8..9c52017 100644
--- a/runtime/CSharp3/Sources/Antlr3.Runtime.Debug/Antlr3.Runtime.Debug.csproj
+++ b/runtime/CSharp3/Sources/Antlr3.Runtime.Debug/Antlr3.Runtime.Debug.csproj
@@ -12,15 +12,8 @@
     <AssemblyName>Antlr3.Runtime.Debug</AssemblyName>
     <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
     <FileAlignment>512</FileAlignment>
-    <SccProjectName>Perforce Project</SccProjectName>
-    <SccLocalPath>..\..\..\..\..\..</SccLocalPath>
-    <SccAuxPath>
-    </SccAuxPath>
-    <SccProvider>MSSCCI:Perforce SCM</SccProvider>
     <SignAssembly>true</SignAssembly>
-    <AssemblyOriginatorKeyFile>..\..\..\..\..\..\..\keys\antlr\Key.snk</AssemblyOriginatorKeyFile>
-    <TargetFrameworkProfile>
-    </TargetFrameworkProfile>
+    <AssemblyOriginatorKeyFile>..\..\..\..\..\..\..\..\..\keys\antlr\Key.snk</AssemblyOriginatorKeyFile>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <DebugSymbols>true</DebugSymbols>
@@ -30,6 +23,7 @@
     <DefineConstants>DEBUG;TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
+    <DocumentationFile>bin\Debug\Antlr3.Runtime.Debug.xml</DocumentationFile>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <DebugType>pdbonly</DebugType>
@@ -38,6 +32,7 @@
     <DefineConstants>TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
+    <DocumentationFile>bin\Release\Antlr3.Runtime.Debug.xml</DocumentationFile>
   </PropertyGroup>
   <ItemGroup>
     <Reference Include="System" />
@@ -56,7 +51,7 @@
     <Compile Include="JavaExtensions\ExceptionExtensions.cs" />
     <Compile Include="Misc\DoubleKeyMap`3.cs" />
     <Compile Include="Misc\Stats.cs" />
-    <None Include="..\..\..\..\..\..\..\keys\antlr\Key.snk">
+    <None Include="..\..\..\..\..\..\..\..\..\keys\antlr\Key.snk">
       <Link>Key.snk</Link>
     </None>
     <None Include="ParserDebugger.cs" />
diff --git a/runtime/CSharp3/Sources/Antlr3.Runtime.Debug/ParseTreeBuilder.cs b/runtime/CSharp3/Sources/Antlr3.Runtime.Debug/ParseTreeBuilder.cs
index deeaf3b..cb5f678 100644
--- a/runtime/CSharp3/Sources/Antlr3.Runtime.Debug/ParseTreeBuilder.cs
+++ b/runtime/CSharp3/Sources/Antlr3.Runtime.Debug/ParseTreeBuilder.cs
@@ -58,7 +58,8 @@
         {
             get
             {
-                return callStack.Peek();
+                ParseTree[] stack = callStack.ToArray();
+                return stack[stack.Length - 1];
             }
         }
 
diff --git a/runtime/CSharp3/Sources/Antlr3.Runtime.Debug/Properties/AssemblyInfo.cs b/runtime/CSharp3/Sources/Antlr3.Runtime.Debug/Properties/AssemblyInfo.cs
index b8c988f..038cddb 100644
--- a/runtime/CSharp3/Sources/Antlr3.Runtime.Debug/Properties/AssemblyInfo.cs
+++ b/runtime/CSharp3/Sources/Antlr3.Runtime.Debug/Properties/AssemblyInfo.cs
@@ -40,9 +40,9 @@
 [assembly: AssemblyTitle( "Antlr3.Runtime.Debug" )]
 [assembly: AssemblyDescription( "" )]
 [assembly: AssemblyConfiguration( "" )]
-[assembly: AssemblyCompany( "Pixel Mine, Inc." )]
+[assembly: AssemblyCompany( "Tunnel Vision Laboratories, LLC" )]
 [assembly: AssemblyProduct( "Antlr3.Runtime.Debug" )]
-[assembly: AssemblyCopyright( "Copyright © Pixel Mine 2010" )]
+[assembly: AssemblyCopyright( "Copyright © Sam Harwell 2013" )]
 [assembly: AssemblyTrademark( "" )]
 [assembly: AssemblyCulture( "" )]
 [assembly: CLSCompliant( true )]
@@ -66,5 +66,5 @@
  *      the Major or Minor version is incremented.
  *   3. Revision is the Perforce changelist number associated with the release.
  */
-[assembly: AssemblyVersion("3.3.4.8517")]
-[assembly: AssemblyFileVersion("3.3.4.8517")]
+[assembly: AssemblyVersion("3.5.0.2")]
+[assembly: AssemblyFileVersion("3.5.0.2")]
diff --git a/runtime/CSharp3/Sources/Antlr3.Runtime.JavaExtensions/Antlr3.Runtime.JavaExtensions.csproj b/runtime/CSharp3/Sources/Antlr3.Runtime.JavaExtensions/Antlr3.Runtime.JavaExtensions.csproj
index 959a9f9..2c90504 100644
--- a/runtime/CSharp3/Sources/Antlr3.Runtime.JavaExtensions/Antlr3.Runtime.JavaExtensions.csproj
+++ b/runtime/CSharp3/Sources/Antlr3.Runtime.JavaExtensions/Antlr3.Runtime.JavaExtensions.csproj
@@ -12,10 +12,6 @@
     <AssemblyName>Antlr3.Runtime.JavaExtensions</AssemblyName>
     <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
     <FileAlignment>512</FileAlignment>
-    <SccProjectName>SAK</SccProjectName>
-    <SccLocalPath>SAK</SccLocalPath>
-    <SccAuxPath>SAK</SccAuxPath>
-    <SccProvider>SAK</SccProvider>
     <TargetFrameworkProfile>Client</TargetFrameworkProfile>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
@@ -39,7 +35,7 @@
     <SignAssembly>true</SignAssembly>
   </PropertyGroup>
   <PropertyGroup>
-    <AssemblyOriginatorKeyFile>..\..\..\..\..\..\..\keys\antlr\Key.snk</AssemblyOriginatorKeyFile>
+    <AssemblyOriginatorKeyFile>..\..\..\..\..\..\..\..\..\keys\antlr\Key.snk</AssemblyOriginatorKeyFile>
   </PropertyGroup>
   <ItemGroup>
     <Reference Include="System" />
@@ -80,7 +76,7 @@
     </ProjectReference>
   </ItemGroup>
   <ItemGroup>
-    <None Include="..\..\..\..\..\..\..\keys\antlr\Key.snk">
+    <None Include="..\..\..\..\..\..\..\..\..\keys\antlr\Key.snk">
       <Link>Key.snk</Link>
     </None>
   </ItemGroup>
diff --git a/runtime/CSharp3/Sources/Antlr3.Runtime.JavaExtensions/Properties/AssemblyInfo.cs b/runtime/CSharp3/Sources/Antlr3.Runtime.JavaExtensions/Properties/AssemblyInfo.cs
index 8aa2671..00e66a9 100644
--- a/runtime/CSharp3/Sources/Antlr3.Runtime.JavaExtensions/Properties/AssemblyInfo.cs
+++ b/runtime/CSharp3/Sources/Antlr3.Runtime.JavaExtensions/Properties/AssemblyInfo.cs
@@ -40,9 +40,9 @@
 [assembly: AssemblyTitle( "Antlr3.Runtime.JavaExtensions" )]
 [assembly: AssemblyDescription( "" )]
 [assembly: AssemblyConfiguration( "" )]
-[assembly: AssemblyCompany( "Pixel Mine, Inc." )]
+[assembly: AssemblyCompany( "Tunnel Vision Laboratories, LLC" )]
 [assembly: AssemblyProduct( "Antlr3.Runtime.JavaExtensions" )]
-[assembly: AssemblyCopyright( "Copyright © Pixel Mine 2010" )]
+[assembly: AssemblyCopyright( "Copyright © Sam Harwell 2013" )]
 [assembly: AssemblyTrademark( "" )]
 [assembly: AssemblyCulture( "" )]
 [assembly: CLSCompliant( true )]
@@ -64,7 +64,6 @@
  *   2. Build is incremented each time the C# port is packaged for release (regardless
  *      of whether it's an incremental or nightly). The value resets to zero whenever
  *      the Major or Minor version is incremented.
- *   3. Revision is the Perforce changelist number associated with the release.
  */
-[assembly: AssemblyVersion("3.3.4.8517")]
-[assembly: AssemblyFileVersion("3.3.4.8517")]
+[assembly: AssemblyVersion("3.5.0.2")]
+[assembly: AssemblyFileVersion("3.5.0.2")]
diff --git a/runtime/CSharp3/Sources/Antlr3.Runtime.JavaExtensions/StringExtensions.cs b/runtime/CSharp3/Sources/Antlr3.Runtime.JavaExtensions/StringExtensions.cs
index 8432512..837908a 100644
--- a/runtime/CSharp3/Sources/Antlr3.Runtime.JavaExtensions/StringExtensions.cs
+++ b/runtime/CSharp3/Sources/Antlr3.Runtime.JavaExtensions/StringExtensions.cs
@@ -30,6 +30,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+#if DEBUG
 namespace Antlr.Runtime.JavaExtensions
 {
     using ObsoleteAttribute = System.ObsoleteAttribute;
@@ -38,7 +39,6 @@
 
     public static class StringExtensions
     {
-#if DEBUG
         [Obsolete]
         public static char charAt( this string str, int index )
         {
@@ -98,19 +98,19 @@
         {
             return str.Replace(oldValue, newValue);
         }
-#endif
 
+        [Obsolete]
         public static string replaceAll( this string str, string regex, string newValue )
         {
             return Regex.Replace( str, regex, newValue );
         }
 
+        [Obsolete]
         public static string replaceFirst( this string str, string regex, string replacement )
         {
             return Regex.Replace( str, regex, replacement );
         }
 
-#if DEBUG
         [Obsolete]
         public static bool startsWith( this string str, string value )
         {
@@ -146,6 +146,6 @@
         {
             return str.Trim();
         }
-#endif
     }
 }
+#endif
diff --git a/runtime/CSharp3/Sources/Antlr3.Runtime.Test/Antlr3.Runtime.Test.csproj b/runtime/CSharp3/Sources/Antlr3.Runtime.Test/Antlr3.Runtime.Test.csproj
index 11206dc..75c4cac 100644
--- a/runtime/CSharp3/Sources/Antlr3.Runtime.Test/Antlr3.Runtime.Test.csproj
+++ b/runtime/CSharp3/Sources/Antlr3.Runtime.Test/Antlr3.Runtime.Test.csproj
@@ -13,10 +13,6 @@
     <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
     <FileAlignment>512</FileAlignment>
     <ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
-    <SccProjectName>SAK</SccProjectName>
-    <SccLocalPath>SAK</SccLocalPath>
-    <SccAuxPath>SAK</SccAuxPath>
-    <SccProvider>SAK</SccProvider>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <DebugSymbols>true</DebugSymbols>
@@ -41,14 +37,10 @@
     <Reference Include="System.Core">
       <RequiredTargetFramework>3.5</RequiredTargetFramework>
     </Reference>
-    <Reference Include="vjslib" />
+    <Reference Include="System.Numerics" />
   </ItemGroup>
   <ItemGroup>
-    <Compile Include="Composition\Program.cs" />
-    <Compile Include="Properties\AssemblyInfo.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\..\..\..\..\antlrcs\main\Antlr3.StringTemplate\Antlr3.StringTemplate.csproj">
+    <ProjectReference Include="..\..\..\..\..\..\Antlr3.StringTemplate\Antlr3.StringTemplate.csproj">
       <Project>{B5910BE2-DE21-4AA9-95C1-486F42B9E794}</Project>
       <Name>Antlr3.StringTemplate</Name>
     </ProjectReference>
@@ -66,11 +58,37 @@
     </ProjectReference>
   </ItemGroup>
   <ItemGroup>
-    <Antlr3 Include="SimpleExpression.g3">
-      <Generator>MSBuild:Compile</Generator>
+    <Antlr3 Include="SimpleExpression.g3" />
+    <Antlr3 Include="FastSimpleExpression.g3" />
+    <None Include="JavaCompat\Expr.g3" />
+    <Antlr3 Include="BuildOptions\DebugGrammar.g3">
+      <!--<GrammarOptions>-debug</GrammarOptions>-->
     </Antlr3>
+    <Antlr3 Include="BuildOptions\DebugTreeGrammar.g3">
+      <!--<GrammarOptions>-debug</GrammarOptions>-->
+    </Antlr3>
+    <Antlr3 Include="StringTemplateOutput.g3" />
+    <Antlr3 Include="TestActionFeatures.g3" />
+    <Antlr3 Include="SemanticPredicateReduction.g3" />
+    <Antlr3 Include="Composition\Reduce.g3" />
+    <Antlr3 Include="Composition\Simplify.g3" />
+    <Antlr3 Include="Composition\VecMath.g3" />
+    <AntlrAbstractGrammar Include="Composition\VecMath_Lexer.g3">
+      <Generator>MSBuild:Compile</Generator>
+    </AntlrAbstractGrammar>
+    <AntlrAbstractGrammar Include="Composition\VecMath_Parser.g3">
+      <Generator>MSBuild:Compile</Generator>
+    </AntlrAbstractGrammar>
+    <Antlr3 Include="PreprocessorLexer.g3" />
+    <Antlr3 Include="SynpredTreeParser.g3" />
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="Composition\Program.cs" />
+    <Compile Include="PreprocessorLexer.g3.cs">
+      <DependentUpon>PreprocessorLexer.g3</DependentUpon>
+    </Compile>
+    <Compile Include="PreprocessorTests.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="SemanticPredicateReduction.g3.lexer.cs">
       <DependentUpon>SemanticPredicateReduction.g3</DependentUpon>
     </Compile>
@@ -83,40 +101,18 @@
     <Compile Include="SimpleExpressionParserHelper.cs">
       <DependentUpon>SimpleExpression.g3</DependentUpon>
     </Compile>
-  </ItemGroup>
-  <ItemGroup>
-    <Antlr3 Include="FastSimpleExpression.g3">
-      <Generator>MSBuild:Compile</Generator>
-    </Antlr3>
     <Compile Include="FastSimpleExpressionLexerHelper.cs">
       <DependentUpon>FastSimpleExpression.g3</DependentUpon>
     </Compile>
     <Compile Include="FastSimpleExpressionParserHelper.cs">
       <DependentUpon>FastSimpleExpression.g3</DependentUpon>
     </Compile>
-  </ItemGroup>
-  <ItemGroup>
-    <Antlr3 Include="JavaCompat\Expr.g3">
-      <Generator>MSBuild:Compile</Generator>
-    </Antlr3>
-  </ItemGroup>
-  <ItemGroup>
-    <Antlr3 Include="BuildOptions\DebugGrammar.g3">
-      <!--<GrammarOptions>-debug</GrammarOptions>-->
-      <Generator>MSBuild:Compile</Generator>
-    </Antlr3>
     <Compile Include="BuildOptions\DebugGrammarLexerHelper.cs">
       <DependentUpon>DebugGrammar.g3</DependentUpon>
     </Compile>
     <Compile Include="BuildOptions\DebugGrammarParserHelper.cs">
       <DependentUpon>DebugGrammar.g3</DependentUpon>
     </Compile>
-  </ItemGroup>
-  <ItemGroup>
-    <Antlr3 Include="BuildOptions\DebugTreeGrammar.g3">
-      <!--<GrammarOptions>-debug</GrammarOptions>-->
-      <Generator>MSBuild:Compile</Generator>
-    </Antlr3>
     <Compile Include="BuildOptions\DebugTreeGrammarHelper.cs">
       <DependentUpon>DebugTreeGrammar.g3</DependentUpon>
     </Compile>
@@ -135,6 +131,9 @@
     <Compile Include="StringTemplateOutput.g3.parser.cs">
       <DependentUpon>StringTemplateOutput.g3</DependentUpon>
     </Compile>
+    <Compile Include="SynpredTreeParser.g3.cs">
+      <DependentUpon>SynpredTreeParser.g3</DependentUpon>
+    </Compile>
     <Compile Include="TestActionFeatures.g3.lexer.cs">
       <DependentUpon>TestActionFeatures.g3</DependentUpon>
     </Compile>
@@ -153,7 +152,6 @@
   <ItemGroup>
     <None Include="BuildOptions\ProfileGrammar.g3">
       <!--<GrammarOptions>-profile</GrammarOptions>-->
-      <Generator>MSBuild:Compile</Generator>
     </None>
     <None Include="BuildOptions\ProfileGrammarLexerHelper.cs">
       <DependentUpon>ProfileGrammar.g3</DependentUpon>
@@ -161,41 +159,24 @@
     <None Include="BuildOptions\ProfileGrammarParserHelper.cs">
       <DependentUpon>ProfileGrammar.g3</DependentUpon>
     </None>
-    <Antlr3 Include="StringTemplateOutput.g3">
-      <Generator>MSBuild:Compile</Generator>
-    </Antlr3>
-    <Antlr3 Include="TestActionFeatures.g3">
-      <Generator>MSBuild:Compile</Generator>
-    </Antlr3>
-    <Antlr3 Include="SemanticPredicateReduction.g3">
-      <Generator>MSBuild:Compile</Generator>
-    </Antlr3>
-    <Antlr3 Include="Composition\Reduce.g3" />
-    <Antlr3 Include="Composition\Simplify.g3" />
-    <Antlr3 Include="Composition\VecMath.g3" />
-    <None Include="Composition\VecMath_Lexer.g3" />
-    <None Include="Composition\VecMath_Parser.g3" />
-    <None Include="TestExpressionFeatures.g3">
-      <Generator>MSBuild:Compile</Generator>
-    </None>
+    <None Include="TestExpressionFeatures.g3" />
   </ItemGroup>
   <ItemGroup>
     <None Include="BuildOptions\ProfileTreeGrammar.g3">
       <!--<GrammarOptions>-profile</GrammarOptions>-->
-      <Generator>MSBuild:Compile</Generator>
     </None>
     <None Include="BuildOptions\ProfileTreeGrammarHelper.cs">
       <DependentUpon>ProfileTreeGrammar.g3</DependentUpon>
     </None>
   </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <PropertyGroup>
     <!-- Folder containing AntlrBuildTask.dll -->
-    <AntlrBuildTaskPath>$(SolutionDir)bin\Bootstrap</AntlrBuildTaskPath>
+    <AntlrBuildTaskPath>$(ProjectDir)..\..\..\..\..\..\bin\Bootstrap</AntlrBuildTaskPath>
     <!-- Path to the ANTLR Tool itself. -->
-    <AntlrToolPath>$(SolutionDir)bin\Bootstrap\Antlr3.exe</AntlrToolPath>
+    <AntlrToolPath>$(ProjectDir)..\..\..\..\..\..\bin\Bootstrap\Antlr3.exe</AntlrToolPath>
   </PropertyGroup>
-  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
-  <Import Project="$(ProjectDir)..\..\..\..\..\..\antlrcs\main\bin\Bootstrap\Antlr3.targets" />
+  <Import Project="$(ProjectDir)..\..\..\..\..\..\bin\Bootstrap\Antlr3.targets" />
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
        Other similar extension points exist, see Microsoft.Common.targets.
   <Target Name="BeforeBuild">
diff --git a/runtime/CSharp3/Sources/Antlr3.Runtime.Test/BuildOptions/DebugGrammar.g3 b/runtime/CSharp3/Sources/Antlr3.Runtime.Test/BuildOptions/DebugGrammar.g3
index 36b1884..6edb6d3 100644
--- a/runtime/CSharp3/Sources/Antlr3.Runtime.Test/BuildOptions/DebugGrammar.g3
+++ b/runtime/CSharp3/Sources/Antlr3.Runtime.Test/BuildOptions/DebugGrammar.g3
@@ -1,10 +1,10 @@
 /*
- * [The "BSD licence"]
- * Copyright (c) 2005-2008 Terence Parr
+ * [The "BSD license"]
+ * Copyright (c) 2011 Terence Parr
  * All rights reserved.
  *
  * Conversion to C#:
- * Copyright (c) 2008-2009 Sam Harwell, Pixel Mine, Inc.
+ * Copyright (c) 2011 Sam Harwell, Pixel Mine, Inc.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -46,6 +46,9 @@
 	CALL;
 }
 
+@lexer::namespace{Antlr3.Runtime.Test.BuildOptions}
+@parser::namespace{Antlr3.Runtime.Test.BuildOptions}
+
 // START:stat
 prog: ( stat )*
     ;
diff --git a/runtime/CSharp3/Sources/Antlr3.Runtime.Test/BuildOptions/DebugGrammarParserHelper.cs b/runtime/CSharp3/Sources/Antlr3.Runtime.Test/BuildOptions/DebugGrammarParserHelper.cs
index 95beb20..638100e 100644
--- a/runtime/CSharp3/Sources/Antlr3.Runtime.Test/BuildOptions/DebugGrammarParserHelper.cs
+++ b/runtime/CSharp3/Sources/Antlr3.Runtime.Test/BuildOptions/DebugGrammarParserHelper.cs
@@ -1,10 +1,10 @@
 /*
- * [The "BSD licence"]
- * Copyright (c) 2005-2008 Terence Parr
+ * [The "BSD license"]
+ * Copyright (c) 2011 Terence Parr
  * All rights reserved.
  *
  * Conversion to C#:
- * Copyright (c) 2008-2009 Sam Harwell, Pixel Mine, Inc.
+ * Copyright (c) 2011 Sam Harwell, Pixel Mine, Inc.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -30,11 +30,14 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-using System.Collections.Generic;
-using Antlr.Runtime.Tree;
-
-partial class DebugGrammarParser
+namespace Antlr3.Runtime.Test.BuildOptions
 {
-    /** List of function definitions. Must point at the FUNC nodes. */
-    List<CommonTree> functionDefinitions = new List<CommonTree>();
+    using System.Collections.Generic;
+    using Antlr.Runtime.Tree;
+
+    partial class DebugGrammarParser
+    {
+        /** List of function definitions. Must point at the FUNC nodes. */
+        List<CommonTree> functionDefinitions = new List<CommonTree>();
+    }
 }
diff --git a/runtime/CSharp3/Sources/Antlr3.Runtime.Test/BuildOptions/DebugTreeGrammar.g3 b/runtime/CSharp3/Sources/Antlr3.Runtime.Test/BuildOptions/DebugTreeGrammar.g3
index b16a73e..40ee359 100644
--- a/runtime/CSharp3/Sources/Antlr3.Runtime.Test/BuildOptions/DebugTreeGrammar.g3
+++ b/runtime/CSharp3/Sources/Antlr3.Runtime.Test/BuildOptions/DebugTreeGrammar.g3
@@ -1,10 +1,10 @@
 /*
- * [The "BSD licence"]
- * Copyright (c) 2005-2008 Terence Parr
+ * [The "BSD license"]
+ * Copyright (c) 2011 Terence Parr
  * All rights reserved.
  *
  * Conversion to C#:
- * Copyright (c) 2008-2009 Sam Harwell, Pixel Mine, Inc.
+ * Copyright (c) 2011 Sam Harwell, Pixel Mine, Inc.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -44,11 +44,13 @@
 {
 //import java.util.Map;
 //import java.util.HashMap;
-using BigInteger = java.math.BigInteger;
+using BigInteger = System.Numerics.BigInteger;
 using Console = System.Console;
 }
 // END:members
 
+@namespace{Antlr3.Runtime.Test.BuildOptions}
+
 // START:rules
 prog:   stat*
     ;
@@ -61,13 +63,13 @@
     ;
 
 expr returns [BigInteger value]
-    :   ^('+' a=expr b=expr)       { $value = $a.value.add($b.value); }
-    |   ^('-' a=expr b=expr)       { $value = $a.value.subtract($b.value); }
-    |   ^('*' a=expr b=expr)       { $value = $a.value.multiply($b.value); }
-    |   ^('/' a=expr b=expr)       { $value = $a.value.divide($b.value); }
-    |   ^('%' a=expr b=expr)       { $value = $a.value.remainder($b.value); }
+    :   ^('+' a=expr b=expr)       { $value = $a.value + $b.value; }
+    |   ^('-' a=expr b=expr)       { $value = $a.value - $b.value; }
+    |   ^('*' a=expr b=expr)       { $value = $a.value * $b.value; }
+    |   ^('/' a=expr b=expr)       { $value = $a.value / $b.value; }
+    |   ^('%' a=expr b=expr)       { $value = $a.value \% $b.value; }
     |   ID                         { $value = getValue($ID.text); }
-    |   INT                        { $value = new BigInteger($INT.text); }
+    |   INT                        { $value = BigInteger.Parse($INT.text); }
     |   call                       { $value = $call.value; }
     ;
 
diff --git a/runtime/CSharp3/Sources/Antlr3.Runtime.Test/BuildOptions/DebugTreeGrammarHelper.cs b/runtime/CSharp3/Sources/Antlr3.Runtime.Test/BuildOptions/DebugTreeGrammarHelper.cs
index af83214..c139aff 100644
--- a/runtime/CSharp3/Sources/Antlr3.Runtime.Test/BuildOptions/DebugTreeGrammarHelper.cs
+++ b/runtime/CSharp3/Sources/Antlr3.Runtime.Test/BuildOptions/DebugTreeGrammarHelper.cs
@@ -1,10 +1,10 @@
 /*
- * [The "BSD licence"]
- * Copyright (c) 2005-2008 Terence Parr
+ * [The "BSD license"]
+ * Copyright (c) 2011 Terence Parr
  * All rights reserved.
  *
  * Conversion to C#:
- * Copyright (c) 2008-2009 Sam Harwell, Pixel Mine, Inc.
+ * Copyright (c) 2011 Sam Harwell, Pixel Mine, Inc.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -30,87 +30,90 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-using System.Collections.Generic;
-using Antlr.Runtime.Tree;
-
-using BigInteger = java.math.BigInteger;
-using Console = System.Console;
-
-partial class DebugTreeGrammar
+namespace Antlr3.Runtime.Test.BuildOptions
 {
-    /** Points to functions tracked by tree builder. */
-    private List<CommonTree> functionDefinitions;
+    using System.Collections.Generic;
+    using Antlr.Runtime.Tree;
 
-    /** Remember local variables. Currently, this is only the function parameter.
-     */
-    private readonly IDictionary<string, BigInteger> localMemory = new Dictionary<string, BigInteger>();
+    using BigInteger = System.Numerics.BigInteger;
+    using Console = System.Console;
 
-    /** Remember global variables set by =. */
-    private IDictionary<string, BigInteger> globalMemory = new Dictionary<string, BigInteger>();
-
-    /** Set up an evaluator with a node stream; and a set of function definition ASTs. */
-    public DebugTreeGrammar( CommonTreeNodeStream nodes, List<CommonTree> functionDefinitions )
-        : this( nodes )
+    partial class DebugTreeGrammar
     {
-        this.functionDefinitions = functionDefinitions;
-    }
+        /** Points to functions tracked by tree builder. */
+        private List<CommonTree> functionDefinitions;
 
-    /** Set up a local evaluator for a nested function call. The evaluator gets the definition
-     *  tree of the function; the set of all defined functions (to find locally called ones); a
-     *  pointer to the global variable memory; and the value of the function parameter to be
-     *  added to the local memory.
-     */
-    private DebugTreeGrammar( CommonTree function,
-                 List<CommonTree> functionDefinitions,
-                 IDictionary<string, BigInteger> globalMemory,
-                 BigInteger paramValue )
-        // Expected tree for function: ^(FUNC ID ( INT | ID ) expr)
-        : this( new CommonTreeNodeStream( function.GetChild( 2 ) ), functionDefinitions )
-    {
-        this.globalMemory = globalMemory;
-        localMemory[function.GetChild( 1 ).Text] = paramValue;
-    }
+        /** Remember local variables. Currently, this is only the function parameter.
+         */
+        private readonly IDictionary<string, BigInteger> localMemory = new Dictionary<string, BigInteger>();
 
-    /** Find matching function definition for a function name and parameter
-     *  value. The first definition is returned where (a) the name matches
-     *  and (b) the formal parameter agrees if it is defined as constant.
-     */
-    private CommonTree findFunction( string name, BigInteger paramValue )
-    {
-        foreach ( CommonTree f in functionDefinitions )
+        /** Remember global variables set by =. */
+        private IDictionary<string, BigInteger> globalMemory = new Dictionary<string, BigInteger>();
+
+        /** Set up an evaluator with a node stream; and a set of function definition ASTs. */
+        public DebugTreeGrammar(CommonTreeNodeStream nodes, List<CommonTree> functionDefinitions)
+            : this(nodes)
         {
-            // Expected tree for f: ^(FUNC ID (ID | INT) expr)
-            if ( f.GetChild( 0 ).Text.Equals( name ) )
+            this.functionDefinitions = functionDefinitions;
+        }
+
+        /** Set up a local evaluator for a nested function call. The evaluator gets the definition
+         *  tree of the function; the set of all defined functions (to find locally called ones); a
+         *  pointer to the global variable memory; and the value of the function parameter to be
+         *  added to the local memory.
+         */
+        private DebugTreeGrammar(CommonTree function,
+                     List<CommonTree> functionDefinitions,
+                     IDictionary<string, BigInteger> globalMemory,
+                     BigInteger paramValue)
+            // Expected tree for function: ^(FUNC ID ( INT | ID ) expr)
+            : this(new CommonTreeNodeStream(function.GetChild(2)), functionDefinitions)
+        {
+            this.globalMemory = globalMemory;
+            localMemory[function.GetChild(1).Text] = paramValue;
+        }
+
+        /** Find matching function definition for a function name and parameter
+         *  value. The first definition is returned where (a) the name matches
+         *  and (b) the formal parameter agrees if it is defined as constant.
+         */
+        private CommonTree findFunction(string name, BigInteger paramValue)
+        {
+            foreach (CommonTree f in functionDefinitions)
             {
-                // Check whether parameter matches
-                CommonTree formalPar = (CommonTree)f.GetChild( 1 );
-                if ( formalPar.Token.Type == INT
-                    && !new BigInteger( formalPar.Token.Text ).Equals( paramValue ) )
+                // Expected tree for f: ^(FUNC ID (ID | INT) expr)
+                if (f.GetChild(0).Text.Equals(name))
                 {
-                    // Constant in formalPar list does not match actual value -> no match.
-                    continue;
+                    // Check whether parameter matches
+                    CommonTree formalPar = (CommonTree)f.GetChild(1);
+                    if (formalPar.Token.Type == INT
+                        && !BigInteger.Parse(formalPar.Token.Text).Equals(paramValue))
+                    {
+                        // Constant in formalPar list does not match actual value -> no match.
+                        continue;
+                    }
+                    // Parameter (value for INT formal arg) as well as fct name agrees!
+                    return f;
                 }
-                // Parameter (value for INT formal arg) as well as fct name agrees!
-                return f;
             }
+            return null;
         }
-        return null;
-    }
 
-    /** Get value of name up call stack. */
-    internal BigInteger getValue( string name )
-    {
-        BigInteger value;
-        if ( localMemory.TryGetValue( name, out value ) && value != null )
+        /** Get value of name up call stack. */
+        internal BigInteger getValue(string name)
         {
-            return value;
+            BigInteger value;
+            if (localMemory.TryGetValue(name, out value) && value != null)
+            {
+                return value;
+            }
+            if (globalMemory.TryGetValue(name, out value) && value != null)
+            {
+                return value;
+            }
+            // not found in local memory or global memory
+            Console.Error.WriteLine("undefined variable " + name);
+            return BigInteger.Zero;
         }
-        if ( globalMemory.TryGetValue( name, out value ) && value != null )
-        {
-            return value;
-        }
-        // not found in local memory or global memory
-        Console.Error.WriteLine( "undefined variable " + name );
-        return new BigInteger( "0" );
     }
 }
diff --git a/runtime/CSharp3/Sources/Antlr3.Runtime.Test/BuildOptions/ProfileGrammar.g3 b/runtime/CSharp3/Sources/Antlr3.Runtime.Test/BuildOptions/ProfileGrammar.g3
index 5f8de16..9230134 100644
--- a/runtime/CSharp3/Sources/Antlr3.Runtime.Test/BuildOptions/ProfileGrammar.g3
+++ b/runtime/CSharp3/Sources/Antlr3.Runtime.Test/BuildOptions/ProfileGrammar.g3
@@ -1,10 +1,10 @@
 /*
- * [The "BSD licence"]
- * Copyright (c) 2005-2008 Terence Parr
+ * [The "BSD license"]
+ * Copyright (c) 2011 Terence Parr
  * All rights reserved.
  *
  * Conversion to C#:
- * Copyright (c) 2008-2009 Sam Harwell, Pixel Mine, Inc.
+ * Copyright (c) 2011 Sam Harwell, Pixel Mine, Inc.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -46,6 +46,9 @@
 	CALL;
 }
 
+@lexer::namespace{Antlr3.Runtime.Test.BuildOptions}
+@parser::namespace{Antlr3.Runtime.Test.BuildOptions}
+
 // START:stat
 prog: ( stat )*
     ;
diff --git a/runtime/CSharp3/Sources/Antlr3.Runtime.Test/BuildOptions/ProfileGrammarParserHelper.cs b/runtime/CSharp3/Sources/Antlr3.Runtime.Test/BuildOptions/ProfileGrammarParserHelper.cs
index ddd7533..205a088 100644
--- a/runtime/CSharp3/Sources/Antlr3.Runtime.Test/BuildOptions/ProfileGrammarParserHelper.cs
+++ b/runtime/CSharp3/Sources/Antlr3.Runtime.Test/BuildOptions/ProfileGrammarParserHelper.cs
@@ -1,10 +1,10 @@
 /*
- * [The "BSD licence"]
- * Copyright (c) 2005-2008 Terence Parr
+ * [The "BSD license"]
+ * Copyright (c) 2011 Terence Parr
  * All rights reserved.
  *
  * Conversion to C#:
- * Copyright (c) 2008-2009 Sam Harwell, Pixel Mine, Inc.
+ * Copyright (c) 2011 Sam Harwell, Pixel Mine, Inc.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -30,11 +30,14 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-using System.Collections.Generic;
-using Antlr.Runtime.Tree;
-
-partial class ProfileGrammarParser
+namespace Antlr3.Runtime.Test.BuildOptions
 {
-    /** List of function definitions. Must point at the FUNC nodes. */
-    List<CommonTree> functionDefinitions = new List<CommonTree>();
+    using System.Collections.Generic;
+    using Antlr.Runtime.Tree;
+
+    partial class ProfileGrammarParser
+    {
+        /** List of function definitions. Must point at the FUNC nodes. */
+        List<CommonTree> functionDefinitions = new List<CommonTree>();
+    }
 }
diff --git a/runtime/CSharp3/Sources/Antlr3.Runtime.Test/BuildOptions/ProfileTreeGrammar.g3 b/runtime/CSharp3/Sources/Antlr3.Runtime.Test/BuildOptions/ProfileTreeGrammar.g3
index f6786db..5bf107b 100644
--- a/runtime/CSharp3/Sources/Antlr3.Runtime.Test/BuildOptions/ProfileTreeGrammar.g3
+++ b/runtime/CSharp3/Sources/Antlr3.Runtime.Test/BuildOptions/ProfileTreeGrammar.g3
@@ -1,10 +1,10 @@
 /*
- * [The "BSD licence"]
- * Copyright (c) 2005-2008 Terence Parr
+ * [The "BSD license"]
+ * Copyright (c) 2011 Terence Parr
  * All rights reserved.
  *
  * Conversion to C#:
- * Copyright (c) 2008-2009 Sam Harwell, Pixel Mine, Inc.
+ * Copyright (c) 2011 Sam Harwell, Pixel Mine, Inc.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -49,6 +49,8 @@
 }
 // END:members
 
+@namespace{Antlr3.Runtime.Test.BuildOptions}
+
 // START:rules
 prog:   stat*
     ;
diff --git a/runtime/CSharp3/Sources/Antlr3.Runtime.Test/BuildOptions/ProfileTreeGrammarHelper.cs b/runtime/CSharp3/Sources/Antlr3.Runtime.Test/BuildOptions/ProfileTreeGrammarHelper.cs
index 47cc8a8..06d678a 100644
--- a/runtime/CSharp3/Sources/Antlr3.Runtime.Test/BuildOptions/ProfileTreeGrammarHelper.cs
+++ b/runtime/CSharp3/Sources/Antlr3.Runtime.Test/BuildOptions/ProfileTreeGrammarHelper.cs
@@ -1,10 +1,10 @@
 /*
- * [The "BSD licence"]
- * Copyright (c) 2005-2008 Terence Parr
+ * [The "BSD license"]
+ * Copyright (c) 2011 Terence Parr
  * All rights reserved.
  *
  * Conversion to C#:
- * Copyright (c) 2008-2009 Sam Harwell, Pixel Mine, Inc.
+ * Copyright (c) 2011 Sam Harwell, Pixel Mine, Inc.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -30,87 +30,90 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-using System.Collections.Generic;
-using Antlr.Runtime.Tree;
-
-using BigInteger = java.math.BigInteger;
-using Console = System.Console;
-
-partial class ProfileTreeGrammar
+namespace Antlr3.Runtime.Test.BuildOptions
 {
-    /** Points to functions tracked by tree builder. */
-    private List<CommonTree> functionDefinitions;
+    using System.Collections.Generic;
+    using Antlr.Runtime.Tree;
 
-    /** Remember local variables. Currently, this is only the function parameter.
-     */
-    private readonly IDictionary<string, BigInteger> localMemory = new Dictionary<string, BigInteger>();
+    using BigInteger = java.math.BigInteger;
+    using Console = System.Console;
 
-    /** Remember global variables set by =. */
-    private IDictionary<string, BigInteger> globalMemory = new Dictionary<string, BigInteger>();
-
-    /** Set up an evaluator with a node stream; and a set of function definition ASTs. */
-    public ProfileTreeGrammar( CommonTreeNodeStream nodes, List<CommonTree> functionDefinitions )
-        : this( nodes )
+    partial class ProfileTreeGrammar
     {
-        this.functionDefinitions = functionDefinitions;
-    }
+        /** Points to functions tracked by tree builder. */
+        private List<CommonTree> functionDefinitions;
 
-    /** Set up a local evaluator for a nested function call. The evaluator gets the definition
-     *  tree of the function; the set of all defined functions (to find locally called ones); a
-     *  pointer to the global variable memory; and the value of the function parameter to be
-     *  added to the local memory.
-     */
-    private ProfileTreeGrammar( CommonTree function,
-                 List<CommonTree> functionDefinitions,
-                 IDictionary<string, BigInteger> globalMemory,
-                 BigInteger paramValue )
-        // Expected tree for function: ^(FUNC ID ( INT | ID ) expr)
-        : this( new CommonTreeNodeStream( function.GetChild( 2 ) ), functionDefinitions )
-    {
-        this.globalMemory = globalMemory;
-        localMemory[function.GetChild( 1 ).Text] = paramValue;
-    }
+        /** Remember local variables. Currently, this is only the function parameter.
+         */
+        private readonly IDictionary<string, BigInteger> localMemory = new Dictionary<string, BigInteger>();
 
-    /** Find matching function definition for a function name and parameter
-     *  value. The first definition is returned where (a) the name matches
-     *  and (b) the formal parameter agrees if it is defined as constant.
-     */
-    private CommonTree findFunction( string name, BigInteger paramValue )
-    {
-        foreach ( CommonTree f in functionDefinitions )
+        /** Remember global variables set by =. */
+        private IDictionary<string, BigInteger> globalMemory = new Dictionary<string, BigInteger>();
+
+        /** Set up an evaluator with a node stream; and a set of function definition ASTs. */
+        public ProfileTreeGrammar(CommonTreeNodeStream nodes, List<CommonTree> functionDefinitions)
+            : this(nodes)
         {
-            // Expected tree for f: ^(FUNC ID (ID | INT) expr)
-            if ( f.GetChild( 0 ).Text.Equals( name ) )
+            this.functionDefinitions = functionDefinitions;
+        }
+
+        /** Set up a local evaluator for a nested function call. The evaluator gets the definition
+         *  tree of the function; the set of all defined functions (to find locally called ones); a
+         *  pointer to the global variable memory; and the value of the function parameter to be
+         *  added to the local memory.
+         */
+        private ProfileTreeGrammar(CommonTree function,
+                     List<CommonTree> functionDefinitions,
+                     IDictionary<string, BigInteger> globalMemory,
+                     BigInteger paramValue)
+            // Expected tree for function: ^(FUNC ID ( INT | ID ) expr)
+            : this(new CommonTreeNodeStream(function.GetChild(2)), functionDefinitions)
+        {
+            this.globalMemory = globalMemory;
+            localMemory[function.GetChild(1).Text] = paramValue;
+        }
+
+        /** Find matching function definition for a function name and parameter
+         *  value. The first definition is returned where (a) the name matches
+         *  and (b) the formal parameter agrees if it is defined as constant.
+         */
+        private CommonTree findFunction(string name, BigInteger paramValue)
+        {
+            foreach (CommonTree f in functionDefinitions)
             {
-                // Check whether parameter matches
-                CommonTree formalPar = (CommonTree)f.GetChild( 1 );
-                if ( formalPar.Token.Type == INT
-                    && !new BigInteger( formalPar.Token.Text ).Equals( paramValue ) )
+                // Expected tree for f: ^(FUNC ID (ID | INT) expr)
+                if (f.GetChild(0).Text.Equals(name))
                 {
-                    // Constant in formalPar list does not match actual value -> no match.
-                    continue;
+                    // Check whether parameter matches
+                    CommonTree formalPar = (CommonTree)f.GetChild(1);
+                    if (formalPar.Token.Type == INT
+                        && !new BigInteger(formalPar.Token.Text).Equals(paramValue))
+                    {
+                        // Constant in formalPar list does not match actual value -> no match.
+                        continue;
+                    }
+                    // Parameter (value for INT formal arg) as well as fct name agrees!
+                    return f;
                 }
-                // Parameter (value for INT formal arg) as well as fct name agrees!
-                return f;
             }
+            return null;
         }
-        return null;
-    }
 
-    /** Get value of name up call stack. */
-    public BigInteger getValue( string name )
-    {
-        BigInteger value;
-        if ( localMemory.TryGetValue( name, out value ) && value != null )
+        /** Get value of name up call stack. */
+        public BigInteger getValue(string name)
         {
-            return value;
+            BigInteger value;
+            if (localMemory.TryGetValue(name, out value) && value != null)
+            {
+                return value;
+            }
+            if (globalMemory.TryGetValue(name, out value) && value != null)
+            {
+                return value;
+            }
+            // not found in local memory or global memory
+            Console.Error.WriteLine("undefined variable " + name);
+            return new BigInteger("0");
         }
-        if ( globalMemory.TryGetValue( name, out value ) && value != null )
-        {
-            return value;
-        }
-        // not found in local memory or global memory
-        Console.Error.WriteLine( "undefined variable " + name );
-        return new BigInteger( "0" );
     }
 }
diff --git a/runtime/CSharp3/Sources/Antlr3.Runtime.Test/Composition/Reduce.g3 b/runtime/CSharp3/Sources/Antlr3.Runtime.Test/Composition/Reduce.g3
index 0ed570b..db61e42 100644
--- a/runtime/CSharp3/Sources/Antlr3.Runtime.Test/Composition/Reduce.g3
+++ b/runtime/CSharp3/Sources/Antlr3.Runtime.Test/Composition/Reduce.g3
@@ -2,20 +2,14 @@
 
 options
 {
-    tokenVocab=VecMath;      
-    ASTLabelType=CommonTree; 
-    output=AST;              
-    filter=true;             
-    language=CSharp3;
+	tokenVocab=VecMath;
+	ASTLabelType=CommonTree;
+	output=AST;
+	filter=true;
+	language=CSharp3;
 }
 
-
-@members 
-{ 
-   //public override IAstRuleReturnScope Topdown() { return topdown(); }
-   public override IAstRuleReturnScope Bottomup() { return bottomup(); } 
-} 
-
+@namespace{Antlr3.Runtime.Test.Composition}
 
 /** Rewrite: x+x to be 2*x, 2*x to be x<<1, x<<n<<m to be x<<(n+m) */
 bottomup
diff --git a/runtime/CSharp3/Sources/Antlr3.Runtime.Test/Composition/Simplify.g3 b/runtime/CSharp3/Sources/Antlr3.Runtime.Test/Composition/Simplify.g3
index fd1fded..f1c2550 100644
--- a/runtime/CSharp3/Sources/Antlr3.Runtime.Test/Composition/Simplify.g3
+++ b/runtime/CSharp3/Sources/Antlr3.Runtime.Test/Composition/Simplify.g3
@@ -9,12 +9,7 @@
     //rewrite=true;
 }
 
-@members 
-{ 
-   public override IAstRuleReturnScope Topdown() { return topdown(); }
-   public override IAstRuleReturnScope Bottomup() { return bottomup(); } 
-} 
-
+@namespace{Antlr3.Runtime.Test.Composition}
 
 topdown
     :   ^( MULT INT ^(VEC (e+=.)+) ) -> ^(VEC ^(MULT INT $e)+)
diff --git a/runtime/CSharp3/Sources/Antlr3.Runtime.Test/FastSimpleExpression.g3 b/runtime/CSharp3/Sources/Antlr3.Runtime.Test/FastSimpleExpression.g3
index 1c51490..b0d5dfd 100644
--- a/runtime/CSharp3/Sources/Antlr3.Runtime.Test/FastSimpleExpression.g3
+++ b/runtime/CSharp3/Sources/Antlr3.Runtime.Test/FastSimpleExpression.g3
@@ -41,6 +41,8 @@
 }
 
 @lexer::superClass{Antlr.Runtime.SlimLexer}
+@lexer::namespace{Antlr3.Runtime.Test}
+@parser::namespace{Antlr3.Runtime.Test}
 
 public
 expression
diff --git a/runtime/CSharp3/Sources/Antlr3.Runtime.Test/JavaCompat/Expr.g3 b/runtime/CSharp3/Sources/Antlr3.Runtime.Test/JavaCompat/Expr.g3
index 65e7c5d..78c79cc 100644
--- a/runtime/CSharp3/Sources/Antlr3.Runtime.Test/JavaCompat/Expr.g3
+++ b/runtime/CSharp3/Sources/Antlr3.Runtime.Test/JavaCompat/Expr.g3
@@ -1,10 +1,10 @@
 /*
- * [The "BSD licence"]
- * Copyright (c) 2005-2008 Terence Parr
+ * [The "BSD license"]
+ * Copyright (c) 2011 Terence Parr
  * All rights reserved.
  *
  * Conversion to C#:
- * Copyright (c) 2008-2009 Sam Harwell, Pixel Mine, Inc.
+ * Copyright (c) 2011 Sam Harwell, Pixel Mine, Inc.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -74,6 +74,9 @@
 HashMap memory = new HashMap();
 }
 
+@lexer::namespace{Antlr3.Runtime.Test.JavaCompat}
+@parser::namespace{Antlr3.Runtime.Test.JavaCompat}
+
 prog:   stat+ ;
 
 stat:   expr NEWLINE {JSystem.@out.println($expr.value);}
diff --git a/runtime/CSharp3/Sources/Antlr3.Runtime.Test/PreprocessorLexer.g3 b/runtime/CSharp3/Sources/Antlr3.Runtime.Test/PreprocessorLexer.g3
new file mode 100644
index 0000000..29655ef
--- /dev/null
+++ b/runtime/CSharp3/Sources/Antlr3.Runtime.Test/PreprocessorLexer.g3
@@ -0,0 +1,69 @@
+﻿/*
+ * [The "BSD license"]
+ * Copyright (c) 2011 Terence Parr
+ * All rights reserved.
+ *
+ * Conversion to C#:
+ * Copyright (c) 2011 Sam Harwell, Pixel Mine, Inc.
+ * 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.
+ */
+
+lexer grammar PreprocessorLexer;
+
+options
+{
+	language=CSharp3;
+}
+
+@namespace{Antlr3.Runtime.Test}
+
+PP_SKIPPED_CHARACTERS
+	:	{false}? => ~(F_NEW_LINE_CHARACTER | F_PP_POUND_SIGN) F_INPUT_CHARACTER*
+	;
+  
+DELIMITED_COMMENT
+	:	{true}? => '/*' .* '*/'
+	;
+  
+WHITESPACE
+	:	F_WHITESPACE {Skip();}
+	;
+  
+fragment F_WHITESPACE
+	:	(' ' | '\t' | '\v' | '\f')+ 
+	;
+
+fragment F_NEW_LINE_CHARACTER
+	:	'\r'
+	|	'\n'
+	;
+  
+fragment F_PP_POUND_SIGN
+	:	'#'
+	;
+  
+fragment F_INPUT_CHARACTER
+	:	~F_NEW_LINE_CHARACTER
+	;
diff --git a/runtime/CSharp3/Sources/Antlr3.Runtime.Test/PreprocessorLexer.g3.cs b/runtime/CSharp3/Sources/Antlr3.Runtime.Test/PreprocessorLexer.g3.cs
new file mode 100644
index 0000000..e095fbf
--- /dev/null
+++ b/runtime/CSharp3/Sources/Antlr3.Runtime.Test/PreprocessorLexer.g3.cs
@@ -0,0 +1,38 @@
+﻿/*
+ * [The "BSD license"]
+ * Copyright (c) 2011 Terence Parr
+ * All rights reserved.
+ *
+ * Conversion to C#:
+ * Copyright (c) 2011 Sam Harwell, Pixel Mine, Inc.
+ * 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.
+ */
+
+namespace Antlr3.Runtime.Test
+{
+    partial class PreprocessorLexer
+    {
+    }
+}
diff --git a/runtime/CSharp3/Sources/Antlr3.Runtime.Test/PreprocessorTests.cs b/runtime/CSharp3/Sources/Antlr3.Runtime.Test/PreprocessorTests.cs
new file mode 100644
index 0000000..967f668
--- /dev/null
+++ b/runtime/CSharp3/Sources/Antlr3.Runtime.Test/PreprocessorTests.cs
@@ -0,0 +1,58 @@
+﻿/*
+ * [The "BSD license"]
+ * Copyright (c) 2011 Terence Parr
+ * All rights reserved.
+ *
+ * Conversion to C#:
+ * Copyright (c) 2011 Sam Harwell, Pixel Mine, Inc.
+ * 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.
+ */
+
+namespace Antlr3.Runtime.Test
+{
+    using System.Collections.Generic;
+    using Antlr.Runtime;
+    using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+    [TestClass]
+    public class PreprocessorTests
+    {
+        [TestMethod]
+        public void TestEmptyComment()
+        {
+            string inputText = "/**/ ";
+            var input = new ANTLRStringStream(inputText);
+            var lexer = new PreprocessorLexer(input);
+            var tokenStream = new CommonTokenStream(lexer);
+            tokenStream.Fill();
+
+            List<IToken> tokens = tokenStream.GetTokens();
+            Assert.AreEqual(2, tokens.Count);
+            Assert.AreEqual(PreprocessorLexer.DELIMITED_COMMENT, tokens[0].Type);
+            Assert.AreEqual("/**/", tokens[0].Text);
+            Assert.AreEqual(PreprocessorLexer.EOF, tokens[1].Type);
+        }
+    }
+}
diff --git a/runtime/CSharp3/Sources/Antlr3.Runtime.Test/Properties/AssemblyInfo.cs b/runtime/CSharp3/Sources/Antlr3.Runtime.Test/Properties/AssemblyInfo.cs
index fd2190d..1e0fc38 100644
--- a/runtime/CSharp3/Sources/Antlr3.Runtime.Test/Properties/AssemblyInfo.cs
+++ b/runtime/CSharp3/Sources/Antlr3.Runtime.Test/Properties/AssemblyInfo.cs
@@ -42,7 +42,7 @@
 [assembly: AssemblyConfiguration( "" )]
 [assembly: AssemblyCompany( "Pixel Mine, Inc." )]
 [assembly: AssemblyProduct( "Antlr3.Runtime.Test" )]
-[assembly: AssemblyCopyright("Copyright © Sam Harwell 2011")]
+[assembly: AssemblyCopyright("Copyright © Sam Harwell 2013")]
 [assembly: AssemblyTrademark( "" )]
 [assembly: AssemblyCulture( "" )]
 [assembly: CLSCompliant( true )]
@@ -66,5 +66,5 @@
  *      the Major or Minor version is incremented.
  *   3. Revision is the Perforce changelist number associated with the release.
  */
-[assembly: AssemblyVersion("3.3.2.8098")]
-[assembly: AssemblyFileVersion("3.3.2.8098")]
+[assembly: AssemblyVersion("3.5.0.2")]
+[assembly: AssemblyFileVersion("3.5.0.2")]
diff --git a/runtime/CSharp3/Sources/Antlr3.Runtime.Test/SynpredTreeParser.g3 b/runtime/CSharp3/Sources/Antlr3.Runtime.Test/SynpredTreeParser.g3
new file mode 100644
index 0000000..6bb7df4
--- /dev/null
+++ b/runtime/CSharp3/Sources/Antlr3.Runtime.Test/SynpredTreeParser.g3
@@ -0,0 +1,47 @@
+﻿/*
+ * [The "BSD license"]
+ * Copyright (c) 2011 Terence Parr
+ * All rights reserved.
+ *
+ * Conversion to C#:
+ * Copyright (c) 2011 Sam Harwell, Pixel Mine, Inc.
+ * 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.
+ */
+
+tree grammar SynpredTreeParser;
+
+options
+{
+	language=CSharp3;
+	ASTLabelType=ITree;
+	output=AST;
+}
+
+@namespace{Antlr3.Runtime.Test}
+
+enterInsertOrDeleteData 
+	:	^( INSERT ( (DATA)=>DATA { _value = true; } | { _value = true; } ) .* )   
+	|	^( DELETE ( (DATA)=>DATA { _value = false; } | { _value = false; } ) .* )      
+	;
diff --git a/runtime/CSharp3/Sources/Antlr3.Runtime.Test/SynpredTreeParser.g3.cs b/runtime/CSharp3/Sources/Antlr3.Runtime.Test/SynpredTreeParser.g3.cs
new file mode 100644
index 0000000..f127aad
--- /dev/null
+++ b/runtime/CSharp3/Sources/Antlr3.Runtime.Test/SynpredTreeParser.g3.cs
@@ -0,0 +1,41 @@
+﻿/*
+ * [The "BSD license"]
+ * Copyright (c) 2011 Terence Parr
+ * All rights reserved.
+ *
+ * Conversion to C#:
+ * Copyright (c) 2011 Sam Harwell, Pixel Mine, Inc.
+ * 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.
+ */
+
+#pragma warning disable 414 // The field 'fieldname' is assigned but its value is never used
+
+namespace Antlr3.Runtime.Test
+{
+    partial class SynpredTreeParser
+    {
+        private bool _value;
+    }
+}
diff --git a/runtime/CSharp3/Sources/Antlr3.Runtime/ANTLRStringStream.cs b/runtime/CSharp3/Sources/Antlr3.Runtime/ANTLRStringStream.cs
index 9904680..b3f11b4 100644
--- a/runtime/CSharp3/Sources/Antlr3.Runtime/ANTLRStringStream.cs
+++ b/runtime/CSharp3/Sources/Antlr3.Runtime/ANTLRStringStream.cs
@@ -241,9 +241,9 @@
             {
                 state = markers[markDepth];
             }
-            state.p = p;
-            state.line = line;
-            state.charPositionInLine = charPositionInLine;
+            state.p = Index;
+            state.line = Line;
+            state.charPositionInLine = CharPositionInLine;
             lastMarker = markDepth;
             return markDepth;
         }
diff --git a/runtime/CSharp3/Sources/Antlr3.Runtime/Antlr3.Runtime.csproj b/runtime/CSharp3/Sources/Antlr3.Runtime/Antlr3.Runtime.csproj
index 6de4bf7..5da739f 100644
--- a/runtime/CSharp3/Sources/Antlr3.Runtime/Antlr3.Runtime.csproj
+++ b/runtime/CSharp3/Sources/Antlr3.Runtime/Antlr3.Runtime.csproj
@@ -12,14 +12,8 @@
     <AssemblyName>Antlr3.Runtime</AssemblyName>
     <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
     <FileAlignment>512</FileAlignment>
-    <SccProjectName>SAK</SccProjectName>
-    <SccLocalPath>SAK</SccLocalPath>
-    <SccAuxPath>SAK</SccAuxPath>
-    <SccProvider>SAK</SccProvider>
     <SignAssembly>true</SignAssembly>
-    <AssemblyOriginatorKeyFile>..\..\..\..\..\..\..\keys\antlr\Key.snk</AssemblyOriginatorKeyFile>
-    <TargetFrameworkProfile>
-    </TargetFrameworkProfile>
+    <AssemblyOriginatorKeyFile>..\..\..\..\..\..\..\..\..\keys\antlr\Key.snk</AssemblyOriginatorKeyFile>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <DebugSymbols>true</DebugSymbols>
@@ -29,6 +23,7 @@
     <DefineConstants>DEBUG;TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
+    <DocumentationFile>bin\Debug\Antlr3.Runtime.xml</DocumentationFile>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <DebugType>pdbonly</DebugType>
@@ -37,6 +32,7 @@
     <DefineConstants>TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
+    <DocumentationFile>bin\Release\Antlr3.Runtime.xml</DocumentationFile>
   </PropertyGroup>
   <ItemGroup>
     <Reference Include="System" />
@@ -105,6 +101,7 @@
     <Compile Include="Tree\CommonTreeAdaptor.cs" />
     <Compile Include="Tree\CommonTreeNodeStream.cs" />
     <Compile Include="Tree\DotTreeGenerator.cs" />
+    <Compile Include="Tree\IPositionTrackingStream.cs" />
     <Compile Include="Tree\ITree.cs" />
     <Compile Include="Tree\ITreeAdaptor.cs" />
     <Compile Include="Tree\ITreeNodeStream.cs" />
@@ -131,7 +128,7 @@
     <Compile Include="UnwantedTokenException.cs" />
   </ItemGroup>
   <ItemGroup>
-    <None Include="..\..\..\..\..\..\..\keys\antlr\Key.snk">
+    <None Include="..\..\..\..\..\..\..\..\..\keys\antlr\Key.snk">
       <Link>Key.snk</Link>
     </None>
   </ItemGroup>
diff --git a/runtime/CSharp3/Sources/Antlr3.Runtime/BaseRecognizer.cs b/runtime/CSharp3/Sources/Antlr3.Runtime/BaseRecognizer.cs
index 5ba18f5..c62a5bf 100644
--- a/runtime/CSharp3/Sources/Antlr3.Runtime/BaseRecognizer.cs
+++ b/runtime/CSharp3/Sources/Antlr3.Runtime/BaseRecognizer.cs
@@ -1,10 +1,10 @@
 /*
- * [The "BSD licence"]
- * Copyright (c) 2005-2008 Terence Parr
+ * [The "BSD license"]
+ * Copyright (c) 2011 Terence Parr
  * All rights reserved.
  *
  * Conversion to C#:
- * Copyright (c) 2008-2009 Sam Harwell, Pixel Mine, Inc.
+ * Copyright (c) 2011 Sam Harwell, Pixel Mine, Inc.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -37,15 +37,12 @@
     using ArgumentNullException = System.ArgumentNullException;
     using Array = System.Array;
     using Conditional = System.Diagnostics.ConditionalAttribute;
-    using Exception = System.Exception;
     using IDebugEventListener = Antlr.Runtime.Debug.IDebugEventListener;
     using MethodBase = System.Reflection.MethodBase;
-    using NotSupportedException = System.NotSupportedException;
     using Regex = System.Text.RegularExpressions.Regex;
     using StackFrame = System.Diagnostics.StackFrame;
     using StackTrace = System.Diagnostics.StackTrace;
     using TextWriter = System.IO.TextWriter;
-    using Type = System.Type;
 
     /** <summary>
      *  A generic recognizer that can handle recognizers generated from
@@ -97,6 +94,11 @@
             set;
         }
 
+        public virtual void SetState(RecognizerSharedState value)
+        {
+            this.state = value;
+        }
+
         protected virtual void InitDFAs()
         {
         }
diff --git a/runtime/CSharp3/Sources/Antlr3.Runtime/CommonTokenStream.cs b/runtime/CSharp3/Sources/Antlr3.Runtime/CommonTokenStream.cs
index a1e4a29..28813cb 100644
--- a/runtime/CSharp3/Sources/Antlr3.Runtime/CommonTokenStream.cs
+++ b/runtime/CSharp3/Sources/Antlr3.Runtime/CommonTokenStream.cs
@@ -166,6 +166,12 @@
             return i;
         }
 
+        public override void Reset()
+        {
+            base.Reset();
+            _p = SkipOffTokenChannels(0);
+        }
+
         protected override void Setup()
         {
             _p = 0;
diff --git a/runtime/CSharp3/Sources/Antlr3.Runtime/DFA.cs b/runtime/CSharp3/Sources/Antlr3.Runtime/DFA.cs
index 37e2d06..76c4083 100644
--- a/runtime/CSharp3/Sources/Antlr3.Runtime/DFA.cs
+++ b/runtime/CSharp3/Sources/Antlr3.Runtime/DFA.cs
@@ -32,6 +32,7 @@
 
 namespace Antlr.Runtime
 {
+    using ArgumentNullException = System.ArgumentNullException;
     using ConditionalAttribute = System.Diagnostics.ConditionalAttribute;
     using Console = System.Console;
     using IDebugEventListener = Antlr.Runtime.Debug.IDebugEventListener;
@@ -66,16 +67,16 @@
         /** <summary>Which recognizer encloses this DFA?  Needed to check backtracking</summary> */
         protected BaseRecognizer recognizer;
 
-        public readonly bool debug = false;
+        public bool debug = false;
 
         public DFA()
-            : this( new SpecialStateTransitionHandler( SpecialStateTransitionDefault ) )
+            : this(SpecialStateTransitionDefault)
         {
         }
 
         public DFA( SpecialStateTransitionHandler specialStateTransition )
         {
-            this.SpecialStateTransition = specialStateTransition ?? new SpecialStateTransitionHandler( SpecialStateTransitionDefault );
+            this.SpecialStateTransition = specialStateTransition ?? SpecialStateTransitionDefault;
         }
 
         public virtual string Description
@@ -95,47 +96,44 @@
          */
         public virtual int Predict( IIntStream input )
         {
-            if ( debug )
-            {
-                Console.Error.WriteLine( "Enter DFA.predict for decision " + decisionNumber );
-            }
+            if (input == null)
+                throw new ArgumentNullException("input");
+
+            DfaDebugMessage("Enter DFA.Predict for decision {0}", decisionNumber);
+
             int mark = input.Mark(); // remember where decision started in input
             int s = 0; // we always start at s0
             try
             {
-                for ( ; ; )
+                while (true)
                 {
-                    if ( debug )
-                        Console.Error.WriteLine( "DFA " + decisionNumber + " state " + s + " LA(1)=" + (char)input.LA( 1 ) + "(" + input.LA( 1 ) +
-                                           "), index=" + input.Index );
+                    DfaDebugMessage("DFA {0} state {1} LA(1)={2}({3}), index={4}", decisionNumber, s, (char)input.LA(1), input.LA(1), input.Index);
+
                     int specialState = special[s];
                     if ( specialState >= 0 )
                     {
-                        if ( debug )
-                        {
-                            Console.Error.WriteLine( "DFA " + decisionNumber +
-                                " state " + s + " is special state " + specialState );
-                        }
+                        DfaDebugMessage("DFA {0} state {1} is special state {2}", decisionNumber, s, specialState);
+
                         s = SpecialStateTransition( this, specialState, input );
-                        if ( debug )
-                        {
-                            Console.Error.WriteLine( "DFA " + decisionNumber +
-                                " returns from special state " + specialState + " to " + s );
-                        }
+
+                        DfaDebugMessage("DFA {0} returns from special state {1} to {2}", decisionNumber, specialState, s);
+
                         if ( s == -1 )
                         {
                             NoViableAlt( s, input );
                             return 0;
                         }
+
                         input.Consume();
                         continue;
                     }
+
                     if ( accept[s] >= 1 )
                     {
-                        if ( debug )
-                            Console.Error.WriteLine( "accept; predict " + accept[s] + " from state " + s );
+                        DfaDebugMessage("accept; predict {0} from state {1}", accept[s], s);
                         return accept[s];
                     }
+
                     // look for a normal char transition
                     char c = (char)input.LA( 1 ); // -1 == \uFFFF, all tokens fit in 65000 space
                     if ( c >= min[s] && c <= max[s] )
@@ -148,9 +146,9 @@
                             // eot[s]>=0 indicates that an EOT edge goes to another
                             // state.
                             if ( eot[s] >= 0 )
-                            {  // EOT Transition to accept state?
-                                if ( debug )
-                                    Console.Error.WriteLine( "EOT transition" );
+                            {
+                                // EOT Transition to accept state?
+                                DfaDebugMessage("EOT transition");
                                 s = eot[s];
                                 input.Consume();
                                 // TODO: I had this as return accept[eot[s]]
@@ -160,40 +158,35 @@
                                 // target?
                                 continue;
                             }
+
                             NoViableAlt( s, input );
                             return 0;
                         }
+
                         s = snext;
                         input.Consume();
                         continue;
                     }
+
                     if ( eot[s] >= 0 )
-                    {  // EOT Transition?
-                        if ( debug )
-                            Console.Error.WriteLine( "EOT transition" );
+                    {
+                        // EOT Transition?
+                        DfaDebugMessage("EOT transition");
                         s = eot[s];
                         input.Consume();
                         continue;
                     }
+
                     if ( c == unchecked( (char)TokenTypes.EndOfFile ) && eof[s] >= 0 )
-                    {  // EOF Transition to accept state?
-                        if ( debug )
-                            Console.Error.WriteLine( "accept via EOF; predict " + accept[eof[s]] + " from " + eof[s] );
+                    {
+                        // EOF Transition to accept state?
+                        DfaDebugMessage("accept via EOF; predict {0} from {1}", accept[eof[s]], eof[s]);
                         return accept[eof[s]];
                     }
+
                     // not in range and not EOF/EOT, must be invalid symbol
-                    if ( debug )
-                    {
-                        Console.Error.WriteLine( "min[" + s + "]=" + min[s] );
-                        Console.Error.WriteLine( "max[" + s + "]=" + max[s] );
-                        Console.Error.WriteLine( "eot[" + s + "]=" + eot[s] );
-                        Console.Error.WriteLine( "eof[" + s + "]=" + eof[s] );
-                        for ( int p = 0; p < transition[s].Length; p++ )
-                        {
-                            Console.Error.Write( transition[s][p] + " " );
-                        }
-                        Console.Error.WriteLine();
-                    }
+                    DfaDebugInvalidSymbol(s);
+
                     NoViableAlt( s, input );
                     return 0;
                 }
@@ -204,6 +197,26 @@
             }
         }
 
+        [Conditional("DEBUG_DFA")]
+        private void DfaDebugMessage(string format, params object[] args)
+        {
+            Console.Error.WriteLine(format, args);
+        }
+
+        [Conditional("DEBUG_DFA")]
+        private void DfaDebugInvalidSymbol(int s)
+        {
+            Console.Error.WriteLine("min[{0}]={1}", s, min[s]);
+            Console.Error.WriteLine("max[{0}]={1}", s, max[s]);
+            Console.Error.WriteLine("eot[{0}]={1}", s, eot[s]);
+            Console.Error.WriteLine("eof[{0}]={1}", s, eof[s]);
+
+            for (int p = 0; p < transition[s].Length; p++)
+                Console.Error.Write(transition[s][p] + " ");
+
+            Console.Error.WriteLine();
+        }
+
         protected virtual void NoViableAlt( int s, IIntStream input )
         {
             if ( recognizer.state.backtracking > 0 )
diff --git a/runtime/CSharp3/Sources/Antlr3.Runtime/Lexer.cs b/runtime/CSharp3/Sources/Antlr3.Runtime/Lexer.cs
index cf478c6..daf530d 100644
--- a/runtime/CSharp3/Sources/Antlr3.Runtime/Lexer.cs
+++ b/runtime/CSharp3/Sources/Antlr3.Runtime/Lexer.cs
@@ -137,10 +137,7 @@
                 state.text = null;
                 if ( input.LA( 1 ) == CharStreamConstants.EndOfFile )
                 {
-                    IToken eof = new CommonToken((ICharStream)input, CharStreamConstants.EndOfFile, TokenChannels.Default, input.Index, input.Index);
-                    eof.Line = Line;
-                    eof.CharPositionInLine = CharPositionInLine;
-                    return eof;
+                    return GetEndOfFileToken();
                 }
                 try
                 {
@@ -173,6 +170,17 @@
             }
         }
 
+        /** Returns the EOF token (default), if you need
+         *  to return a custom token instead override this method.
+         */
+        public virtual IToken GetEndOfFileToken()
+        {
+            IToken eof = new CommonToken((ICharStream)input, CharStreamConstants.EndOfFile, TokenChannels.Default, input.Index, input.Index);
+            eof.Line = Line;
+            eof.CharPositionInLine = CharPositionInLine;
+            return eof;
+        }
+
         /** <summary>
          *  Instruct the lexer to skip creating a token for current lexer rule
          *  and look for another token.  nextToken() knows to keep looking when
diff --git a/runtime/CSharp3/Sources/Antlr3.Runtime/Misc/FastQueue.cs b/runtime/CSharp3/Sources/Antlr3.Runtime/Misc/FastQueue.cs
index 2dc5bfc..af975d7 100644
--- a/runtime/CSharp3/Sources/Antlr3.Runtime/Misc/FastQueue.cs
+++ b/runtime/CSharp3/Sources/Antlr3.Runtime/Misc/FastQueue.cs
@@ -71,9 +71,9 @@
         }
 
         /** <summary>
-         *  Return element i elements ahead of current element.  i==0 gets
-         *  current element.  This is not an absolute index into the data list
-         *  since p defines the start of the real list.
+         * Return element {@code i} elements ahead of current element. {@code i==0}
+         * gets current element. This is not an absolute index into {@link #data}
+         * since {@code p} defines the start of the real list.
          *  </summary>
          */
         public virtual T this[int i]
diff --git a/runtime/CSharp3/Sources/Antlr3.Runtime/Misc/LookaheadStream.cs b/runtime/CSharp3/Sources/Antlr3.Runtime/Misc/LookaheadStream.cs
index 24dc0cb..14454a8 100644
--- a/runtime/CSharp3/Sources/Antlr3.Runtime/Misc/LookaheadStream.cs
+++ b/runtime/CSharp3/Sources/Antlr3.Runtime/Misc/LookaheadStream.cs
@@ -33,13 +33,16 @@
 namespace Antlr.Runtime.Misc
 {
     using ArgumentException = System.ArgumentException;
+    using Debug = System.Diagnostics.Debug;
     using InvalidOperationException = System.InvalidOperationException;
+    using NotSupportedException = System.NotSupportedException;
+    using ArgumentOutOfRangeException = System.ArgumentOutOfRangeException;
 
     /** <summary>
-     *  A lookahead queue that knows how to mark/release locations
-     *  in the buffer for backtracking purposes. Any markers force the FastQueue
-     *  superclass to keep all tokens until no more markers; then can reset
-     *  to avoid growing a huge buffer.
+     * A lookahead queue that knows how to mark/release locations in the buffer for
+     * backtracking purposes. Any markers force the {@link FastQueue} superclass to
+     * keep all elements until no more markers; then can reset to avoid growing a
+     * huge buffer.
      *  </summary>
      */
     public abstract class LookaheadStream<T>
@@ -47,10 +50,13 @@
         where T : class
     {
         /** Absolute token index. It's the index of the symbol about to be
-         *  read via LT(1). Goes from 0 to numtokens.
+         *  read via {@code LT(1)}. Goes from 0 to numtokens.
          */
         private int _currentElementIndex = 0;
 
+        /**
+         * This is the {@code LT(-1)} element for the first element in {@link #data}.
+         */
         private T _previousElement;
 
         /** Track object returned by nextElement upon end of stream;
@@ -84,9 +90,9 @@
             }
         }
 
-        public override void Clear()
+        public virtual void Reset()
         {
-            base.Clear();
+            Clear();
             _currentElementIndex = 0;
             _p = 0;
             _previousElement = null;
@@ -94,14 +100,17 @@
 
         /** <summary>
          *  Implement nextElement to supply a stream of elements to this
-         *  lookahead buffer.  Return eof upon end of the stream we're pulling from.
+         *  lookahead buffer.  Return EOF upon end of the stream we're pulling from.
          *  </summary>
          */
         public abstract T NextElement();
 
         public abstract bool IsEndOfFile(T o);
 
-        /** <summary>Get and remove first element in queue; override FastQueue.remove()</summary> */
+        /** <summary>
+         * Get and remove first element in queue; override
+         * {@link FastQueue#remove()}; it's the same, just checks for backtracking.
+         * </summary> */
         public override T Dequeue()
         {
             T o = this[0];
@@ -109,6 +118,7 @@
             // have we hit end of buffer and not backtracking?
             if ( _p == _data.Count && _markDepth == 0 )
             {
+                _previousElement = o;
                 // if so, it's an opportunity to start filling at index 0 again
                 Clear(); // size goes to 0, but retains memory
             }
@@ -119,7 +129,7 @@
         public virtual void Consume()
         {
             SyncAhead(1);
-            _previousElement = Dequeue();
+            Dequeue();
             _currentElementIndex++;
         }
 
@@ -201,34 +211,61 @@
 
         public virtual void Rewind( int marker )
         {
-            Seek( marker );
-            Release( marker );
+            _markDepth--;
+            int delta = _p - marker;
+            _currentElementIndex -= delta;
+            _p = marker;
         }
 
         public virtual void Rewind()
         {
-            Rewind( _lastMarker );
+            // rewind but do not release marker
+            int delta = _p - _lastMarker;
+            _currentElementIndex -= delta;
+            _p = _lastMarker;
         }
 
         /** <summary>
-         *  Seek to a 0-indexed position within data buffer.  Can't handle
-         *  case where you seek beyond end of existing buffer.  Normally used
-         *  to seek backwards in the buffer. Does not force loading of nodes.
-         *  Doesn't see to absolute position in input stream since this stream
-         *  is unbuffered. Seeks only into our moving window of elements.
+         * Seek to a 0-indexed absolute token index. Normally used to seek backwards
+         * in the buffer. Does not force loading of nodes.
          *  </summary>
+         *  <remarks>
+         * To preserve backward compatibility, this method allows seeking past the
+         * end of the currently buffered data. In this case, the input pointer will
+         * be moved but the data will only actually be loaded upon the next call to
+         * {@link #consume} or {@link #LT} for {@code k>0}.
+         *  </remarks>
          */
         public virtual void Seek( int index )
         {
-            _p = index;
+            if (index < 0)
+                throw new ArgumentOutOfRangeException("index");
+
+            int delta = _currentElementIndex - index;
+            if (_p - delta < 0)
+                throw new NotSupportedException("can't seek before the beginning of this stream's buffer");
+
+            _p -= delta;
+            _currentElementIndex = index;
         }
 
         protected virtual T LB(int k)
         {
-            if (k == 1)
+            Debug.Assert(k > 0);
+
+            int index = _p - k;
+            if (index == -1)
                 return _previousElement;
 
-            throw new ArgumentException("can't look backwards more than one token in this stream");
+            // if k>0 then we know index < data.size(). avoid the double-check for
+            // performance.
+            if (index >= 0 /*&& index < data.size()*/)
+                return _data[index];
+
+            if (index < -1)
+                throw new NotSupportedException("can't look more than one token before the beginning of this stream's buffer");
+
+            throw new NotSupportedException("can't look past the end of this stream's buffer using LB(int)");
         }
     }
 }
diff --git a/runtime/CSharp3/Sources/Antlr3.Runtime/NoViableAltException.cs b/runtime/CSharp3/Sources/Antlr3.Runtime/NoViableAltException.cs
index 6478c6f..4f37001 100644
--- a/runtime/CSharp3/Sources/Antlr3.Runtime/NoViableAltException.cs
+++ b/runtime/CSharp3/Sources/Antlr3.Runtime/NoViableAltException.cs
@@ -1,10 +1,10 @@
 /*
- * [The "BSD licence"]
- * Copyright (c) 2005-2008 Terence Parr
+ * [The "BSD license"]
+ * Copyright (c) 2011 Terence Parr
  * All rights reserved.
  *
  * Conversion to C#:
- * Copyright (c) 2008 Sam Harwell, Pixel Mine, Inc.
+ * Copyright (c) 2011 Sam Harwell, Tunnel Vision Laboratories, LLC
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -66,7 +66,12 @@
         }
 
         public NoViableAltException(string grammarDecisionDescription, int decisionNumber, int stateNumber, IIntStream input)
-            : base(input)
+            : this(grammarDecisionDescription, decisionNumber, stateNumber, input, 1)
+        {
+        }
+
+        public NoViableAltException(string grammarDecisionDescription, int decisionNumber, int stateNumber, IIntStream input, int k)
+            : base(input, k)
         {
             this._grammarDecisionDescription = grammarDecisionDescription;
             this._decisionNumber = decisionNumber;
@@ -74,7 +79,12 @@
         }
 
         public NoViableAltException(string message, string grammarDecisionDescription, int decisionNumber, int stateNumber, IIntStream input)
-            : base(message, input)
+            : this(message, grammarDecisionDescription, decisionNumber, stateNumber, input, 1)
+        {
+        }
+
+        public NoViableAltException(string message, string grammarDecisionDescription, int decisionNumber, int stateNumber, IIntStream input, int k)
+            : base(message, input, k)
         {
             this._grammarDecisionDescription = grammarDecisionDescription;
             this._decisionNumber = decisionNumber;
@@ -82,7 +92,12 @@
         }
 
         public NoViableAltException(string message, string grammarDecisionDescription, int decisionNumber, int stateNumber, IIntStream input, Exception innerException)
-            : base(message, input, innerException)
+            : this(message, grammarDecisionDescription, decisionNumber, stateNumber, input, 1, innerException)
+        {
+        }
+
+        public NoViableAltException(string message, string grammarDecisionDescription, int decisionNumber, int stateNumber, IIntStream input, int k, Exception innerException)
+            : base(message, input, k, innerException)
         {
             this._grammarDecisionDescription = grammarDecisionDescription;
             this._decisionNumber = decisionNumber;
diff --git a/runtime/CSharp3/Sources/Antlr3.Runtime/Properties/AssemblyInfo.cs b/runtime/CSharp3/Sources/Antlr3.Runtime/Properties/AssemblyInfo.cs
index 1489fde..cc3425f 100644
--- a/runtime/CSharp3/Sources/Antlr3.Runtime/Properties/AssemblyInfo.cs
+++ b/runtime/CSharp3/Sources/Antlr3.Runtime/Properties/AssemblyInfo.cs
@@ -41,9 +41,9 @@
 [assembly: AssemblyTitle( "Antlr3.Runtime" )]
 [assembly: AssemblyDescription( "" )]
 [assembly: AssemblyConfiguration( "" )]
-[assembly: AssemblyCompany( "Pixel Mine, Inc." )]
+[assembly: AssemblyCompany( "Tunnel Vision Laboratories, LLC" )]
 [assembly: AssemblyProduct( "Antlr3.Runtime" )]
-[assembly: AssemblyCopyright("Copyright © Sam Harwell 2011")]
+[assembly: AssemblyCopyright("Copyright © Sam Harwell 2013")]
 [assembly: AssemblyTrademark( "" )]
 [assembly: AssemblyCulture( "" )]
 [assembly: CLSCompliant( true )]
@@ -68,5 +68,5 @@
  *      the Major or Minor version is incremented.
  *   3. Revision is the Perforce changelist number associated with the release.
  */
-[assembly: AssemblyVersion("3.3.4.8517")]
-[assembly: AssemblyFileVersion("3.3.4.8517")]
+[assembly: AssemblyVersion("3.5.0.2")]
+[assembly: AssemblyFileVersion("3.5.0.2")]
diff --git a/runtime/CSharp3/Sources/Antlr3.Runtime/RecognitionException.cs b/runtime/CSharp3/Sources/Antlr3.Runtime/RecognitionException.cs
index f0c5662..007560d 100644
--- a/runtime/CSharp3/Sources/Antlr3.Runtime/RecognitionException.cs
+++ b/runtime/CSharp3/Sources/Antlr3.Runtime/RecognitionException.cs
@@ -1,10 +1,10 @@
 /*
- * [The "BSD licence"]
- * Copyright (c) 2005-2008 Terence Parr
+ * [The "BSD license"]
+ * Copyright (c) 2011 Terence Parr
  * All rights reserved.
  *
  * Conversion to C#:
- * Copyright (c) 2008-2009 Sam Harwell, Pixel Mine, Inc.
+ * Copyright (c) 2011 Sam Harwell, Tunnel Vision Laboratories, LLC
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -34,9 +34,9 @@
 {
     using Antlr.Runtime.Tree;
 
-    using ArgumentException = System.ArgumentException;
     using ArgumentNullException = System.ArgumentNullException;
     using Exception = System.Exception;
+    using NotSupportedException = System.NotSupportedException;
     using SerializationInfo = System.Runtime.Serialization.SerializationInfo;
     using StreamingContext = System.Runtime.Serialization.StreamingContext;
 
@@ -78,6 +78,11 @@
         /** <summary>What input stream did the error occur in?</summary> */
         private IIntStream _input;
 
+        /// <summary>
+        /// What was the lookahead index when this exception was thrown?
+        /// </summary>
+        private int _k;
+
         /** <summary>What is index of token/char were we looking at when the error occurred?</summary> */
         private int _index;
 
@@ -127,8 +132,13 @@
         {
         }
 
-        public RecognitionException( IIntStream input )
-            : this("A recognition error occurred.", input, null)
+        public RecognitionException(IIntStream input)
+            : this("A recognition error occurred.", input, 1, null)
+        {
+        }
+
+        public RecognitionException(IIntStream input, int k)
+            : this("A recognition error occurred.", input, k, null)
         {
         }
 
@@ -138,7 +148,12 @@
         }
 
         public RecognitionException(string message, IIntStream input)
-            : this(message, input, null)
+            : this(message, input, 1, null)
+        {
+        }
+
+        public RecognitionException(string message, IIntStream input, int k)
+            : this(message, input, k, null)
         {
         }
 
@@ -148,15 +163,21 @@
         }
 
         public RecognitionException(string message, IIntStream input, Exception innerException)
+            : this(message, input, 1, innerException)
+        {
+        }
+
+        public RecognitionException(string message, IIntStream input, int k, Exception innerException)
             : base(message, innerException)
         {
             this._input = input;
+            this._k = k;
             if (input != null)
             {
-                this._index = input.Index;
+                this._index = input.Index + k - 1;
                 if (input is ITokenStream)
                 {
-                    this._token = ((ITokenStream)input).LT(1);
+                    this._token = ((ITokenStream)input).LT(k);
                     this._line = _token.Line;
                     this._charPositionInLine = _token.CharPositionInLine;
                 }
@@ -164,20 +185,31 @@
                 ITreeNodeStream tns = input as ITreeNodeStream;
                 if (tns != null)
                 {
-                    ExtractInformationFromTreeNodeStream(tns);
+                    ExtractInformationFromTreeNodeStream(tns, k);
                 }
                 else
                 {
                     ICharStream charStream = input as ICharStream;
                     if (charStream != null)
                     {
-                        this._c = input.LA(1);
-                        this._line = ((ICharStream)input).Line;
-                        this._charPositionInLine = ((ICharStream)input).CharPositionInLine;
+                        int mark = input.Mark();
+                        try
+                        {
+                            for (int i = 0; i < k - 1; i++)
+                                input.Consume();
+
+                            this._c = input.LA(1);
+                            this._line = ((ICharStream)input).Line;
+                            this._charPositionInLine = ((ICharStream)input).CharPositionInLine;
+                        }
+                        finally
+                        {
+                            input.Rewind(mark);
+                        }
                     }
                     else
                     {
-                        this._c = input.LA(1);
+                        this._c = input.LA(k);
                     }
                 }
             }
@@ -241,6 +273,14 @@
             }
         }
 
+        public int Lookahead
+        {
+            get
+            {
+                return _k;
+            }
+        }
+
         public IToken Token
         {
             get
@@ -329,6 +369,19 @@
         protected virtual void ExtractInformationFromTreeNodeStream(ITreeNodeStream input)
         {
             this._node = input.LT(1);
+
+            object positionNode = null;
+            IPositionTrackingStream positionTrackingStream = input as IPositionTrackingStream;
+            if (positionTrackingStream != null)
+            {
+                positionNode = positionTrackingStream.GetKnownPositionElement(false);
+                if (positionNode == null)
+                {
+                    positionNode = positionTrackingStream.GetKnownPositionElement(true);
+                    this._approximateLineInfo = positionNode != null;
+                }
+            }
+
             ITokenStreamInformation streamInformation = input as ITokenStreamInformation;
             if (streamInformation != null)
             {
@@ -345,7 +398,7 @@
             else
             {
                 ITreeAdaptor adaptor = input.TreeAdaptor;
-                IToken payload = adaptor.GetToken(_node);
+                IToken payload = adaptor.GetToken(positionNode ?? _node);
                 if (payload != null)
                 {
                     this._token = payload;
@@ -365,12 +418,13 @@
                                 this._approximateLineInfo = true;
                                 break;
                             }
+
                             --i;
                             try
                             {
                                 priorNode = input.LT(i);
                             }
-                            catch (ArgumentException)
+                            catch (NotSupportedException)
                             {
                                 priorNode = null;
                             }
@@ -400,5 +454,21 @@
                 }
             }
         }
+
+        protected virtual void ExtractInformationFromTreeNodeStream(ITreeNodeStream input, int k)
+        {
+            int mark = input.Mark();
+            try
+            {
+                for (int i = 0; i < k - 1; i++)
+                    input.Consume();
+
+                ExtractInformationFromTreeNodeStream(input);
+            }
+            finally
+            {
+                input.Rewind(mark);
+            }
+        }
     }
 }
diff --git a/runtime/CSharp3/Sources/Antlr3.Runtime/Tree/BaseTree.cs b/runtime/CSharp3/Sources/Antlr3.Runtime/Tree/BaseTree.cs
index 79f3d97..9327860 100644
--- a/runtime/CSharp3/Sources/Antlr3.Runtime/Tree/BaseTree.cs
+++ b/runtime/CSharp3/Sources/Antlr3.Runtime/Tree/BaseTree.cs
@@ -1,10 +1,10 @@
 /*
- * [The "BSD licence"]
+ * [The "BSD license"]
  * Copyright (c) 2011 Terence Parr
  * All rights reserved.
  *
  * Conversion to C#:
- * Copyright (c) 2011 Sam Harwell, Pixel Mine, Inc.
+ * Copyright (c) 2011 Sam Harwell, Tunnel Vision Laboratories, LLC
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -286,6 +286,30 @@
             t.ChildIndex = i;
         }
 
+        /** Insert child t at child position i (0..n-1) by shifting children
+         *  i+1..n-1 to the right one position. Set parent / indexes properly
+         *  but does NOT collapse nil-rooted t's that come in here like addChild.
+         */
+        public virtual void InsertChild(int i, ITree t)
+        {
+            if (i < 0)
+                throw new ArgumentOutOfRangeException("i");
+            if (i > ChildCount)
+                throw new ArgumentException();
+
+            if (i == ChildCount)
+            {
+                AddChild(t);
+                return;
+            }
+
+            Children.Insert(i, t);
+
+            // walk others to increment their child indexes
+            // set index, parent of this one too
+            this.FreshenParentAndChildIndexes(i);
+        }
+
         public virtual object DeleteChild( int i )
         {
             if (i < 0)
@@ -428,6 +452,25 @@
             }
         }
 
+        public virtual void FreshenParentAndChildIndexesDeeply()
+        {
+            FreshenParentAndChildIndexesDeeply(0);
+        }
+
+        public virtual void FreshenParentAndChildIndexesDeeply(int offset)
+        {
+            int n = ChildCount;
+            for (int c = offset; c < n; c++)
+            {
+                ITree child = GetChild(c);
+                child.ChildIndex = c;
+                child.Parent = this;
+                BaseTree baseTree = child as BaseTree;
+                if (baseTree != null)
+                    baseTree.FreshenParentAndChildIndexesDeeply();
+            }
+        }
+
         public virtual void SanityCheckParentAndChildIndexes()
         {
             SanityCheckParentAndChildIndexes( null, -1 );
diff --git a/runtime/CSharp3/Sources/Antlr3.Runtime/Tree/CommonTreeNodeStream.cs b/runtime/CSharp3/Sources/Antlr3.Runtime/Tree/CommonTreeNodeStream.cs
index 45c46be..f9cb0a7 100644
--- a/runtime/CSharp3/Sources/Antlr3.Runtime/Tree/CommonTreeNodeStream.cs
+++ b/runtime/CSharp3/Sources/Antlr3.Runtime/Tree/CommonTreeNodeStream.cs
@@ -1,10 +1,10 @@
 /*
- * [The "BSD licence"]
- * Copyright (c) 2005-2008 Terence Parr
+ * [The "BSD license"]
+ * Copyright (c) 2011 Terence Parr
  * All rights reserved.
  *
  * Conversion to C#:
- * Copyright (c) 2008-2009 Sam Harwell, Pixel Mine, Inc.
+ * Copyright (c) 2011 Sam Harwell, Pixel Mine, Inc.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -36,35 +36,45 @@
     using Antlr.Runtime.Misc;
 
     using StringBuilder = System.Text.StringBuilder;
-    using NotSupportedException = System.NotSupportedException;
 
     [System.Serializable]
-    public class CommonTreeNodeStream : LookaheadStream<object>, ITreeNodeStream
+    public class CommonTreeNodeStream : LookaheadStream<object>, ITreeNodeStream, IPositionTrackingStream
     {
         public const int DEFAULT_INITIAL_BUFFER_SIZE = 100;
         public const int INITIAL_CALL_STACK_SIZE = 10;
 
         /** <summary>Pull nodes from which tree?</summary> */
-        object _root;
+        private readonly object _root;
 
         /** <summary>If this tree (root) was created from a token stream, track it.</summary> */
         protected ITokenStream tokens;
 
         /** <summary>What tree adaptor was used to build these trees</summary> */
         [System.NonSerialized]
-        ITreeAdaptor _adaptor;
+        private ITreeAdaptor _adaptor;
 
         /** The tree iterator we are using */
-        TreeIterator _it;
+        private readonly TreeIterator _it;
 
         /** <summary>Stack of indexes used for push/pop calls</summary> */
-        Stack<int> _calls;
+        private Stack<int> _calls;
 
         /** <summary>Tree (nil A B C) trees like flat A B C streams</summary> */
-        bool _hasNilRoot = false;
+        private bool _hasNilRoot = false;
 
         /** <summary>Tracks tree depth.  Level=0 means we're at root node level.</summary> */
-        int _level = 0;
+        private int _level = 0;
+
+        /**
+         * Tracks the last node before the start of {@link #data} which contains
+         * position information to provide information for error reporting. This is
+         * tracked in addition to {@link #prevElement} which may or may not contain
+         * position information.
+         *
+         * @see #hasPositionInformation
+         * @see RecognitionException#extractInformationFromTreeNodeStream
+         */
+        private object _previousLocationElement;
 
         public CommonTreeNodeStream( object tree )
             : this( new CommonTreeAdaptor(), tree )
@@ -97,6 +107,7 @@
             {
                 return tokens;
             }
+
             set
             {
                 tokens = value;
@@ -138,12 +149,13 @@
 
         #endregion
 
-        public virtual void Reset()
+        public override void Reset()
         {
-            base.Clear();
+            base.Reset();
             _it.Reset();
             _hasNilRoot = false;
             _level = 0;
+            _previousLocationElement = null;
             if ( _calls != null )
                 _calls.Clear();
         }
@@ -181,6 +193,15 @@
             return t;
         }
 
+        public override object Dequeue()
+        {
+            object result = base.Dequeue();
+            if (_p == 0 && HasPositionInformation(PreviousElement))
+                _previousLocationElement = PreviousElement;
+
+            return result;
+        }
+
         public override bool IsEndOfFile(object o)
         {
             return TreeAdaptor.GetType(o) == CharStreamConstants.EndOfFile;
@@ -197,9 +218,8 @@
         public virtual void Push( int index )
         {
             if ( _calls == null )
-            {
                 _calls = new Stack<int>();
-            }
+
             _calls.Push( _p ); // save current index
             Seek( index );
         }
@@ -214,6 +234,44 @@
             return ret;
         }
 
+        /**
+         * Returns an element containing position information. If {@code allowApproximateLocation} is {@code false}, then
+         * this method will return the {@code LT(1)} element if it contains position information, and otherwise return {@code null}.
+         * If {@code allowApproximateLocation} is {@code true}, then this method will return the last known element containing position information.
+         *
+         * @see #hasPositionInformation
+         */
+        public object GetKnownPositionElement(bool allowApproximateLocation)
+        {
+            object node = _data[_p];
+            if (HasPositionInformation(node))
+                return node;
+
+            if (!allowApproximateLocation)
+                return null;
+
+            for (int index = _p - 1; index >= 0; index--)
+            {
+                node = _data[index];
+                if (HasPositionInformation(node))
+                    return node;
+            }
+
+            return _previousLocationElement;
+        }
+
+        public bool HasPositionInformation(object node)
+        {
+            IToken token = TreeAdaptor.GetToken(node);
+            if (token == null)
+                return false;
+
+            if (token.Line <= 0)
+                return false;
+
+            return true;
+        }
+
         #region Tree rewrite interface
 
         public virtual void ReplaceChildren( object parent, int startChildIndex, int stopChildIndex, object t )
diff --git a/runtime/CSharp3/Sources/Antlr3.Runtime/Tree/IPositionTrackingStream.cs b/runtime/CSharp3/Sources/Antlr3.Runtime/Tree/IPositionTrackingStream.cs
new file mode 100644
index 0000000..8bc8945
--- /dev/null
+++ b/runtime/CSharp3/Sources/Antlr3.Runtime/Tree/IPositionTrackingStream.cs
@@ -0,0 +1,59 @@
+﻿/*
+ [The "BSD license"]
+ Copyright (c) 2012 Terence Parr
+ Copyright (c) 2012 Sam Harwell
+ 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.
+ */
+
+namespace Antlr.Runtime.Tree
+{
+    /**
+     *
+     * @author Sam Harwell
+     */
+    public interface IPositionTrackingStream
+    {
+        /**
+         * Returns an element containing concrete information about the current
+         * position in the stream.
+         *
+         * @param allowApproximateLocation if {@code false}, this method returns
+         * {@code null} if an element containing exact information about the current
+         * position is not available
+         */
+        object GetKnownPositionElement(bool allowApproximateLocation);
+
+        /**
+         * Determines if the specified {@code element} contains concrete position
+         * information.
+         *
+         * @param element the element to check
+         * @return {@code true} if {@code element} contains concrete position
+         * information, otherwise {@code false}
+         */
+        bool HasPositionInformation(object element);
+
+    }
+}
diff --git a/runtime/CSharp3/Sources/Antlr3.Runtime/Tree/ITreeNodeStream.cs b/runtime/CSharp3/Sources/Antlr3.Runtime/Tree/ITreeNodeStream.cs
index b133f39..8f3f30a 100644
--- a/runtime/CSharp3/Sources/Antlr3.Runtime/Tree/ITreeNodeStream.cs
+++ b/runtime/CSharp3/Sources/Antlr3.Runtime/Tree/ITreeNodeStream.cs
@@ -47,18 +47,18 @@
         }
 
         /** <summary>
-         *  Get tree node at current input pointer + i ahead where i=1 is next node.
-         *  i&lt;0 indicates nodes in the past.  So LT(-1) is previous node, but
-         *  implementations are not required to provide results for k &lt; -1.
-         *  LT(0) is undefined.  For i&gt;=n, return null.
-         *  Return null for LT(0) and any index that results in an absolute address
-         *  that is negative.
+         * Get tree node at current input pointer + {@code k} ahead where
+         * {@code k==1} is next node. {@code k<0} indicates nodes in the past. So
+         * {@code LT(-1)} is previous node, but implementations are not required to
+         * provide results for {@code k < -1}. {@code LT(0)} is undefined. For
+         * {@code k<=n}, return {@code null}. Return {@code null} for {@code LT(0)}
+         * and any index that results in an absolute address that is negative.
          *  </summary>
          *
          *  <remarks>
-         *  This is analogus to the LT() method of the TokenStream, but this
-         *  returns a tree node instead of a token.  Makes code gen identical
-         *  for both parser and tree grammars. :)
+         * This is analogous to {@link TokenStream#LT}, but this returns a tree node
+         * instead of a {@link Token}. Makes code generation identical for both
+         * parser and tree grammars.
          *  </remarks>
          */
         object LT( int k );
@@ -74,10 +74,11 @@
         }
 
         /** <summary>
-         *  If the tree associated with this stream was created from a TokenStream,
-         *  you can specify it here.  Used to do rule $text attribute in tree
-         *  parser.  Optional unless you use tree parser rule text attribute
-         *  or output=template and rewrite=true options.
+         * If the tree associated with this stream was created from a
+         * {@link TokenStream}, you can specify it here. Used to do rule
+         * {@code $text} attribute in tree parser. Optional unless you use tree
+         * parser rule {@code $text} attribute or {@code output=template} and
+         * {@code rewrite=true} options.
          *  </summary>
          */
         ITokenStream TokenStream
@@ -96,11 +97,11 @@
         }
 
         /** <summary>
-         *  As we flatten the tree, we use UP, DOWN nodes to represent
-         *  the tree structure.  When debugging we need unique nodes
-         *  so we have to instantiate new ones.  When doing normal tree
-         *  parsing, it's slow and a waste of memory to create unique
-         *  navigation nodes.  Default should be false;
+         * As we flatten the tree, we use {@link Token#UP}, {@link Token#DOWN} nodes
+         * to represent the tree structure. When debugging we need unique nodes so
+         * we have to instantiate new ones. When doing normal tree parsing, it's
+         * slow and a waste of memory to create unique navigation nodes. Default
+         * should be {@code false}.
          *  </summary>
          */
         bool UniqueNavigationNodes
@@ -110,11 +111,11 @@
         }
 
         /** <summary>
-         *  Return the text of all nodes from start to stop, inclusive.
-         *  If the stream does not buffer all the nodes then it can still
-         *  walk recursively from start until stop.  You can always return
-         *  null or "" too, but users should not access $ruleLabel.text in
-         *  an action of course in that case.
+         * Return the text of all nodes from {@code start} to {@code stop},
+         * inclusive. If the stream does not buffer all the nodes then it can still
+         * walk recursively from start until stop. You can always return
+         * {@code null} or {@code ""} too, but users should not access
+         * {@code $ruleLabel.text} in an action of course in that case.
          *  </summary>
          */
         string ToString( object start, object stop );
@@ -123,17 +124,18 @@
         #region REWRITING TREES (used by tree parser)
 
         /** <summary>
-         *  Replace from start to stop child index of parent with t, which might
-         *  be a list.  Number of children may be different
-         *  after this call.  The stream is notified because it is walking the
-         *  tree and might need to know you are monkeying with the underlying
-         *  tree.  Also, it might be able to modify the node stream to avoid
-         *  restreaming for future phases.
+         * Replace children of {@code parent} from index {@code startChildIndex} to
+         * {@code stopChildIndex} with {@code t}, which might be a list. Number of
+         * children may be different after this call. The stream is notified because
+         * it is walking the tree and might need to know you are monkeying with the
+         * underlying tree. Also, it might be able to modify the node stream to
+         * avoid restreaming for future phases.
          *  </summary>
          *
          *  <remarks>
-         *  If parent is null, don't do anything; must be at root of overall tree.
-         *  Can't replace whatever points to the parent externally.  Do nothing.
+         * If {@code parent} is {@code null}, don't do anything; must be at root of
+         * overall tree. Can't replace whatever points to the parent externally. Do
+         * nothing.
          *  </remarks>
          */
         void ReplaceChildren( object parent, int startChildIndex, int stopChildIndex, object t );
diff --git a/runtime/CSharp3/Sources/Antlr3.Runtime/Tree/RewriteRuleElementStream.cs b/runtime/CSharp3/Sources/Antlr3.Runtime/Tree/RewriteRuleElementStream.cs
index 8e3d5b0..cb76ace 100644
--- a/runtime/CSharp3/Sources/Antlr3.Runtime/Tree/RewriteRuleElementStream.cs
+++ b/runtime/CSharp3/Sources/Antlr3.Runtime/Tree/RewriteRuleElementStream.cs
@@ -71,10 +71,7 @@
         /** <summary>Once a node / subtree has been used in a stream, it must be dup'd
          *  from then on.  Streams are reset after subrules so that the streams
          *  can be reused in future subrules.  So, reset must set a dirty bit.
-         *  If dirty, then next() always returns a dup.
-         *
-         *  I wanted to use "naughty bit" here, but couldn't think of a way
-         *  to use "naughty".
+         *  If dirty, then next() always returns a dup.</summary>
          */
         protected bool dirty = false;
 
diff --git a/runtime/CSharp3/Sources/Antlr3.Runtime/Tree/TreeFilter.cs b/runtime/CSharp3/Sources/Antlr3.Runtime/Tree/TreeFilter.cs
index ef7b412..ba44e2d 100644
--- a/runtime/CSharp3/Sources/Antlr3.Runtime/Tree/TreeFilter.cs
+++ b/runtime/CSharp3/Sources/Antlr3.Runtime/Tree/TreeFilter.cs
@@ -58,8 +58,8 @@
             try
             {
                 // share TreeParser object but not parsing-related state
-                state = new RecognizerSharedState();
-                input = new CommonTreeNodeStream( originalAdaptor, t );
+                SetState(new RecognizerSharedState());
+                SetTreeNodeStream(new CommonTreeNodeStream(originalAdaptor, t));
                 ( (CommonTreeNodeStream)input ).TokenStream = originalTokenStream;
                 BacktrackingLevel = 1;
                 whichRule();
diff --git a/runtime/CSharp3/Sources/Antlr3.Runtime/Tree/TreeParser.cs b/runtime/CSharp3/Sources/Antlr3.Runtime/Tree/TreeParser.cs
index 927ee23..f5a1508 100644
--- a/runtime/CSharp3/Sources/Antlr3.Runtime/Tree/TreeParser.cs
+++ b/runtime/CSharp3/Sources/Antlr3.Runtime/Tree/TreeParser.cs
@@ -58,13 +58,13 @@
         public TreeParser( ITreeNodeStream input )
             : base() // highlight that we go to super to set state object
         {
-            SetTreeNodeStream( input );
+            this.input = input;
         }
 
         public TreeParser( ITreeNodeStream input, RecognizerSharedState state )
             : base( state ) // share the state object with another parser
         {
-            SetTreeNodeStream( input );
+            this.input = input;
         }
 
         public override void Reset()
diff --git a/runtime/CSharp3/Sources/Antlr3.Runtime/Tree/TreeRewriter.cs b/runtime/CSharp3/Sources/Antlr3.Runtime/Tree/TreeRewriter.cs
index b610c2c..16a38a2 100644
--- a/runtime/CSharp3/Sources/Antlr3.Runtime/Tree/TreeRewriter.cs
+++ b/runtime/CSharp3/Sources/Antlr3.Runtime/Tree/TreeRewriter.cs
@@ -67,8 +67,8 @@
             try
             {
                 // share TreeParser object but not parsing-related state
-                state = new RecognizerSharedState();
-                input = new CommonTreeNodeStream( originalAdaptor, t );
+                SetState(new RecognizerSharedState());
+                SetTreeNodeStream(new CommonTreeNodeStream(originalAdaptor, t));
                 ( (CommonTreeNodeStream)input ).TokenStream = originalTokenStream;
                 BacktrackingLevel = 1;
                 IAstRuleReturnScope r = whichRule();
@@ -119,12 +119,12 @@
         // methods the downup strategy uses to do the up and down rules.
         // to override, just define tree grammar rule topdown and turn on
         // filter=true.
-        public virtual IAstRuleReturnScope Topdown()
+        protected virtual IAstRuleReturnScope Topdown()
         {
             return null;
         }
 
-        public virtual IAstRuleReturnScope Bottomup()
+        protected virtual IAstRuleReturnScope Bottomup()
         {
             return null;
         }
diff --git a/runtime/Cpp/include/antlr3.hpp b/runtime/Cpp/include/antlr3.hpp
new file mode 100755
index 0000000..4e40ba4
--- /dev/null
+++ b/runtime/Cpp/include/antlr3.hpp
@@ -0,0 +1,60 @@
+#ifndef	_ANTLR3_HPP
+#define	_ANTLR3_HPP
+
+// [The "BSD licence"]
+// Copyright (c) 2005-2009 Gokulakannan Somasundaram, ElectronDB
+//
+// 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.
+
+#include <string>
+#include <sstream>
+
+#include    "antlr3defs.hpp"
+
+#include    "antlr3errors.hpp"
+#include    "antlr3memory.hpp"
+
+#include	"antlr3recognizersharedstate.hpp"
+#include    "antlr3baserecognizer.hpp"
+#include    "antlr3bitset.hpp"
+#include    "antlr3collections.hpp"
+#include    "antlr3commontoken.hpp"
+#include	"antlr3commontree.hpp"
+#include    "antlr3commontreeadaptor.hpp"
+#include    "antlr3cyclicdfa.hpp"
+#include	"antlr3debugeventlistener.hpp"
+#include    "antlr3exception.hpp"
+#include    "antlr3filestream.hpp"
+#include    "antlr3intstream.hpp"
+#include    "antlr3input.hpp"
+#include    "antlr3tokenstream.hpp"
+#include	"antlr3commontreenodestream.hpp"
+#include    "antlr3lexer.hpp"
+#include    "antlr3parser.hpp"
+#include    "antlr3rewritestreams.hpp"
+#include	"antlr3traits.hpp"
+#include    "antlr3treeparser.hpp"
+
+#endif
diff --git a/runtime/Cpp/include/antlr3.inl b/runtime/Cpp/include/antlr3.inl
new file mode 100755
index 0000000..79974af
--- /dev/null
+++ b/runtime/Cpp/include/antlr3.inl
@@ -0,0 +1,9 @@
+ANTLR_BEGIN_NAMESPACE()
+
+//static 
+ANTLR_INLINE void GenericStream::displayRecognitionError( const StringType& str )
+{
+	fprintf(stderr, str.c_str() );
+}
+
+ANTLR_END_NAMESPACE()
\ No newline at end of file
diff --git a/runtime/Cpp/include/antlr3baserecognizer.hpp b/runtime/Cpp/include/antlr3baserecognizer.hpp
new file mode 100755
index 0000000..f125400
--- /dev/null
+++ b/runtime/Cpp/include/antlr3baserecognizer.hpp
@@ -0,0 +1,512 @@
+/** \file
+ * Defines the basic structure to support recognizing by either a lexer,
+ * parser, or tree parser.
+ * \addtogroup BaseRecognizer
+ * @{
+ */
+#ifndef	_ANTLR3_BASERECOGNIZER_HPP
+#define	_ANTLR3_BASERECOGNIZER_HPP
+
+// [The "BSD licence"]
+// Copyright (c) 2005-2009 Gokulakannan Somasundaram, ElectronDB
+
+//
+// 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.
+
+#include    "antlr3defs.hpp"
+#include    "antlr3collections.hpp"
+
+ANTLR_BEGIN_NAMESPACE()
+
+/** \brief Base tracking context structure for all types of
+ * recognizers.
+ */
+template< class ImplTraits, class StreamType >
+class BaseRecognizer : public ImplTraits::AllocPolicyType
+{
+public:
+	typedef typename ImplTraits::AllocPolicyType	AllocPolicyType;
+	typedef typename StreamType::IntStreamType	IntStreamType;
+	typedef typename ComponentTypeFinder<ImplTraits, StreamType>::ComponentType  SuperType;
+	typedef typename StreamType::UnitType		UnitType;
+	typedef typename ImplTraits::template ExceptionBaseType<StreamType> ExceptionBaseType;
+	typedef typename ImplTraits::BitsetType BitsetType;
+	typedef typename ImplTraits::BitsetListType		BitsetListType;
+	typedef typename ImplTraits::StringType	StringType;
+	typedef typename ImplTraits::template RecognizerSharedStateType<StreamType>  RecognizerSharedStateType;
+	typedef typename ImplTraits::DebugEventListenerType DebugEventListenerType;
+	typedef typename ImplTraits::LexerType LexerType;
+	typedef typename ImplTraits::ParserType ParserType;
+	typedef typename ImplTraits::TreeParserType TreeParserType;
+
+	typedef typename AllocPolicyType::template StackType<StringType>  StringStackType;
+	typedef typename AllocPolicyType::template ListType<StringType>  StringListType;
+
+private:
+	/// A pointer to the shared recognizer state, such that multiple
+	/// recognizers can use the same inputs streams and so on (in
+	/// the case of grammar inheritance for instance.
+	///
+	RecognizerSharedStateType*		m_state;
+
+	/// If set to something other than NULL, then this structure is
+	/// points to an instance of the debugger interface. In general, the
+	/// debugger is only referenced internally in recovery/error operations
+	/// so that it does not cause overhead by having to check this pointer
+	/// in every function/method
+	///
+	DebugEventListenerType*		m_debugger;
+
+
+public:
+	BaseRecognizer(ANTLR_UINT32 sizeHint, RecognizerSharedStateType* state);
+
+	SuperType* get_super();
+	RecognizerSharedStateType* get_state() const;
+	DebugEventListenerType* get_debugger() const;
+	void  set_state( RecognizerSharedStateType* state );
+	void  set_debugger( DebugEventListenerType* debugger );
+
+    /// Match current input symbol against ttype.  Upon error, do one token
+	/// insertion or deletion if possible.
+	/// To turn off single token insertion or deletion error
+	/// recovery, override mismatchRecover() and have it call
+	/// plain mismatch(), which does not recover.  Then any error
+	/// in a rule will cause an exception and immediate exit from
+	/// rule.  Rule would recover by resynchronizing to the set of
+	/// symbols that can follow rule ref.
+	///
+    const UnitType*	match(ANTLR_UINT32 ttype, BitsetListType* follow);
+
+	/// Consumes the next token, whatever it is, and resets the recognizer state
+	/// so that it is not in error.
+	///
+	/// \param recognizer
+	/// Recognizer context pointer
+	///
+    void	matchAny();
+
+	/// function that decides if the token ahead of the current one is the
+	/// one we were loking for, in which case the curernt one is very likely extraneous
+	/// and can be reported that way.
+	///
+	bool mismatchIsUnwantedToken(IntStreamType* input, ANTLR_UINT32 ttype);
+
+	/// function that decides if the current token is one that can logically
+	/// follow the one we were looking for, in which case the one we were looking for is
+	/// probably missing from the input.
+	///
+	bool mismatchIsMissingToken(IntStreamType* input, BitsetListType* follow);
+
+    /// Factor out what to do upon token mismatch so tree parsers can behave
+	/// differently.  Override and call mismatchRecover(input, ttype, follow)
+	/// to get single token insertion and deletion.  Use this to turn off
+	/// single token insertion and deletion. Override mismatchRecover
+	/// to call this instead.
+	///
+	/// \remark mismatch only works for parsers and must be overridden for anything else.
+	///
+    void mismatch(ANTLR_UINT32 ttype, BitsetListType* follow);
+
+    /// Report a recognition problem.
+	///
+	/// This method sets errorRecovery to indicate the parser is recovering
+	/// not parsing.  Once in recovery mode, no errors are generated.
+	/// To get out of recovery mode, the parser must successfully match
+	/// a token (after a resync).  So it will go:
+	///
+	///		1. error occurs
+	///		2. enter recovery mode, report error
+	///		3. consume until token found in resynch set
+	///		4. try to resume parsing
+	///		5. next match() will reset errorRecovery mode
+	///
+	/// If you override, make sure to update errorCount if you care about that.
+	///
+    void	reportError();
+	void	reportError( ClassForwarder<LexerType> );
+	template<typename CompType>
+	void	reportError( ClassForwarder<CompType> );
+
+    /** Function that is called to display a recognition error message. You may
+     *  override this function independently of (*reportError)() above as that function calls
+     *  this one to do the actual exception printing.
+     */
+    void	displayRecognitionError(ANTLR_UINT8** tokenNames);
+
+	/// Get number of recognition errors (lexer, parser, tree parser).  Each
+	/// recognizer tracks its own number.  So parser and lexer each have
+	/// separate count.  Does not count the spurious errors found between
+	/// an error and next valid token match
+	///
+	/// \see reportError()
+	///
+	ANTLR_UINT32 getNumberOfSyntaxErrors();
+
+    /** Function that recovers from an error found in the input stream.
+     *  Generally, this will be a #ANTLR3_EXCEPTION_NOVIABLE_ALT but it could also
+     *  be from a mismatched token that the (*match)() could not recover from.
+     */
+    void	recover();
+
+    /** function that is a hook to listen to token consumption during error recovery.
+     *  This is mainly used by the debug parser to send events to the listener.
+     */
+    void	beginResync();
+
+    /** function that is a hook to listen to token consumption during error recovery.
+     *  This is mainly used by the debug parser to send events to the listener.
+     */
+    void	endResync();
+
+	/** function that is a hook to listen to token consumption during error recovery.
+     *  This is mainly used by the debug parser to send events to the listener.
+     */
+    void	beginBacktrack(ANTLR_UINT32 level);
+
+    /** function that is a hook to listen to token consumption during error recovery.
+     *  This is mainly used by the debug parser to send events to the listener.
+     */
+    void	endBacktrack(ANTLR_UINT32 level, bool successful);
+
+    /// Compute the error recovery set for the current rule.
+	/// Documentation below is from the Java implementation.
+	///
+	/// During rule invocation, the parser pushes the set of tokens that can
+	/// follow that rule reference on the stack; this amounts to
+	/// computing FIRST of what follows the rule reference in the
+	/// enclosing rule. This local follow set only includes tokens
+	/// from within the rule; i.e., the FIRST computation done by
+	/// ANTLR stops at the end of a rule.
+	//
+	/// EXAMPLE
+	//
+	/// When you find a "no viable alt exception", the input is not
+	/// consistent with any of the alternatives for rule r.  The best
+	/// thing to do is to consume tokens until you see something that
+	/// can legally follow a call to r *or* any rule that called r.
+	/// You don't want the exact set of viable next tokens because the
+	/// input might just be missing a token--you might consume the
+	/// rest of the input looking for one of the missing tokens.
+	///
+	/// Consider grammar:
+	///
+	/// a : '[' b ']'
+	///   | '(' b ')'
+	///   ;
+	/// b : c '^' INT ;
+	/// c : ID
+	///   | INT
+	///   ;
+	///
+	/// At each rule invocation, the set of tokens that could follow
+	/// that rule is pushed on a stack.  Here are the various "local"
+	/// follow sets:
+	///
+	/// FOLLOW(b1_in_a) = FIRST(']') = ']'
+	/// FOLLOW(b2_in_a) = FIRST(')') = ')'
+	/// FOLLOW(c_in_b) = FIRST('^') = '^'
+	///
+	/// Upon erroneous input "[]", the call chain is
+	///
+	/// a -> b -> c
+	///
+	/// and, hence, the follow context stack is:
+	///
+	/// depth  local follow set     after call to rule
+	///   0         <EOF>                    a (from main())
+	///   1          ']'                     b
+	///   3          '^'                     c
+	///
+	/// Notice that ')' is not included, because b would have to have
+	/// been called from a different context in rule a for ')' to be
+	/// included.
+	///
+	/// For error recovery, we cannot consider FOLLOW(c)
+	/// (context-sensitive or otherwise).  We need the combined set of
+	/// all context-sensitive FOLLOW sets--the set of all tokens that
+	/// could follow any reference in the call chain.  We need to
+	/// resync to one of those tokens.  Note that FOLLOW(c)='^' and if
+	/// we resync'd to that token, we'd consume until EOF.  We need to
+	/// sync to context-sensitive FOLLOWs for a, b, and c: {']','^'}.
+	/// In this case, for input "[]", LA(1) is in this set so we would
+	/// not consume anything and after printing an error rule c would
+	/// return normally.  It would not find the required '^' though.
+	/// At this point, it gets a mismatched token error and throws an
+	/// exception (since LA(1) is not in the viable following token
+	/// set).  The rule exception handler tries to recover, but finds
+	/// the same recovery set and doesn't consume anything.  Rule b
+	/// exits normally returning to rule a.  Now it finds the ']' (and
+	/// with the successful match exits errorRecovery mode).
+	///
+	/// So, you can see that the parser walks up call chain looking
+	/// for the token that was a member of the recovery set.
+	///
+	/// Errors are not generated in errorRecovery mode.
+	///
+	/// ANTLR's error recovery mechanism is based upon original ideas:
+	///
+	/// "Algorithms + Data Structures = Programs" by Niklaus Wirth
+	///
+	/// and
+	///
+	/// "A note on error recovery in recursive descent parsers":
+	/// http://portal.acm.org/citation.cfm?id=947902.947905
+	///
+	/// Later, Josef Grosch had some good ideas:
+	///
+	/// "Efficient and Comfortable Error Recovery in Recursive Descent
+	/// Parsers":
+	/// ftp://www.cocolab.com/products/cocktail/doca4.ps/ell.ps.zip
+	///
+	/// Like Grosch I implemented local FOLLOW sets that are combined
+	/// at run-time upon error to avoid overhead during parsing.
+	///
+    BitsetType*	computeErrorRecoverySet();
+
+    /// Compute the context-sensitive FOLLOW set for current rule.
+	/// Documentation below is from the Java runtime.
+	///
+	/// This is the set of token types that can follow a specific rule
+	/// reference given a specific call chain.  You get the set of
+	/// viable tokens that can possibly come next (look ahead depth 1)
+	/// given the current call chain.  Contrast this with the
+	/// definition of plain FOLLOW for rule r:
+	///
+	///  FOLLOW(r)={x | S=>*alpha r beta in G and x in FIRST(beta)}
+	///
+	/// where x in T* and alpha, beta in V*; T is set of terminals and
+	/// V is the set of terminals and non terminals.  In other words,
+	/// FOLLOW(r) is the set of all tokens that can possibly follow
+	/// references to r in///any* sentential form (context).  At
+	/// runtime, however, we know precisely which context applies as
+	/// we have the call chain.  We may compute the exact (rather
+	/// than covering superset) set of following tokens.
+	///
+	/// For example, consider grammar:
+	///
+	/// stat : ID '=' expr ';'      // FOLLOW(stat)=={EOF}
+	///      | "return" expr '.'
+	///      ;
+	/// expr : atom ('+' atom)* ;   // FOLLOW(expr)=={';','.',')'}
+	/// atom : INT                  // FOLLOW(atom)=={'+',')',';','.'}
+	///      | '(' expr ')'
+	///      ;
+	///
+	/// The FOLLOW sets are all inclusive whereas context-sensitive
+	/// FOLLOW sets are precisely what could follow a rule reference.
+	/// For input input "i=(3);", here is the derivation:
+	///
+	/// stat => ID '=' expr ';'
+	///      => ID '=' atom ('+' atom)* ';'
+	///      => ID '=' '(' expr ')' ('+' atom)* ';'
+	///      => ID '=' '(' atom ')' ('+' atom)* ';'
+	///      => ID '=' '(' INT ')' ('+' atom)* ';'
+	///      => ID '=' '(' INT ')' ';'
+	///
+	/// At the "3" token, you'd have a call chain of
+	///
+	///   stat -> expr -> atom -> expr -> atom
+	///
+	/// What can follow that specific nested ref to atom?  Exactly ')'
+	/// as you can see by looking at the derivation of this specific
+	/// input.  Contrast this with the FOLLOW(atom)={'+',')',';','.'}.
+	///
+	/// You want the exact viable token set when recovering from a
+	/// token mismatch.  Upon token mismatch, if LA(1) is member of
+	/// the viable next token set, then you know there is most likely
+	/// a missing token in the input stream.  "Insert" one by just not
+	/// throwing an exception.
+	///
+    BitsetType*	computeCSRuleFollow();
+
+    /// Compute the current followset for the input stream.
+	///
+    BitsetType*	combineFollows(bool exact);
+
+    /// Attempt to recover from a single missing or extra token.
+	///
+	/// EXTRA TOKEN
+	///
+	/// LA(1) is not what we are looking for.  If LA(2) has the right token,
+	/// however, then assume LA(1) is some extra spurious token.  Delete it
+	/// and LA(2) as if we were doing a normal match(), which advances the
+	/// input.
+	///
+	/// MISSING TOKEN
+	///
+	/// If current token is consistent with what could come after
+	/// ttype then it is ok to "insert" the missing token, else throw
+	/// exception For example, Input "i=(3;" is clearly missing the
+	/// ')'.  When the parser returns from the nested call to expr, it
+	/// will have call chain:
+	///
+	///    stat -> expr -> atom
+	///
+	/// and it will be trying to match the ')' at this point in the
+	/// derivation:
+	///
+	///       => ID '=' '(' INT ')' ('+' atom)* ';'
+	///                          ^
+	/// match() will see that ';' doesn't match ')' and report a
+	/// mismatched token error.  To recover, it sees that LA(1)==';'
+	/// is in the set of tokens that can follow the ')' token
+	/// reference in rule atom.  It can assume that you forgot the ')'.
+	///
+	/// The exception that was passed in, in the java implementation is
+	/// sorted in the recognizer exception stack in the C version. To 'throw' it we set the
+	/// error flag and rules cascade back when this is set.
+	///
+    const UnitType* recoverFromMismatchedToken( ANTLR_UINT32	ttype, BitsetListType*	follow);
+
+    /** Function that recovers from a mismatched set in the token stream, in a similar manner
+     *  to (*recoverFromMismatchedToken)
+     */
+    const UnitType* recoverFromMismatchedSet(BitsetListType*	follow);
+
+    /** common routine to handle single token insertion for recovery functions.
+     */
+	/// This code is factored out from mismatched token and mismatched set
+	///  recovery.  It handles "single token insertion" error recovery for
+	/// both.  No tokens are consumed to recover from insertions.  Return
+	/// true if recovery was possible else return false.
+	///
+    bool	recoverFromMismatchedElement(BitsetListType*	follow);
+
+    /** function that consumes input until the next token matches
+     *  the given token.
+     */
+    void	consumeUntil(ANTLR_UINT32   tokenType);
+
+    /** function that consumes input until the next token matches
+     *  one in the given set.
+     */
+    void	consumeUntilSet(BitsetType*	set);
+
+    /** function that returns an ANTLR3_LIST of the strings that identify
+     *  the rules in the parser that got you to this point. Can be overridden by installing your
+     *	own function set.
+     *
+     * \todo Document how to override invocation stack functions.
+     */
+	StringStackType	getRuleInvocationStack();
+	StringStackType	getRuleInvocationStackNamed(ANTLR_UINT8*    name);
+
+    /** function that converts an ANLR3_LIST of tokens to an ANTLR3_LIST of
+     *  string token names. As this is mostly used in string template processing it may not be useful
+     *  in the C runtime.
+     */
+    StringListType	toStrings( const StringListType& );
+
+    /** function to return whether the rule has parsed input starting at the supplied
+     *  start index before. If the rule has not parsed input starting from the supplied start index,
+     *  then it will return ANTLR3_MEMO_RULE_UNKNOWN. If it has parsed from the suppled start point
+     *  then it will return the point where it last stopped parsing after that start point.
+     */
+    ANTLR_MARKER	getRuleMemoization( ANTLR_INTKEY	ruleIndex,
+												ANTLR_MARKER	ruleParseStart);
+
+    /** function that determines whether the rule has parsed input at the current index
+     *  in the input stream
+     */
+    bool	alreadyParsedRule(ANTLR_MARKER	ruleIndex);
+
+    /** Function that records whether the rule has parsed the input at a
+     *  current position successfully or not.
+     */
+    void	memoize(ANTLR_MARKER	ruleIndex,
+								ANTLR_MARKER	ruleParseStart);
+
+	/// Function that returns the current input symbol.
+    /// The is placed into any label for the associated token ref; e.g., x=ID.  Token
+	/// and tree parsers need to return different objects. Rather than test
+	/// for input stream type or change the IntStream interface, I use
+	/// a simple method to ask the recognizer to tell me what the current
+	/// input symbol is.
+	///
+	/// This is ignored for lexers and the lexer implementation of this
+	/// function should return NULL.
+	///
+	const UnitType*	getCurrentInputSymbol(IntStreamType* istream);
+	const UnitType*	getCurrentInputSymbol(IntStreamType* istream, ClassForwarder<LexerType>);
+	const UnitType*	getCurrentInputSymbol(IntStreamType* istream, ClassForwarder<ParserType>);
+	const UnitType*	getCurrentInputSymbol(IntStreamType* istream, ClassForwarder<TreeParserType>);
+
+	/// Conjure up a missing token during error recovery.
+	///
+	/// The recognizer attempts to recover from single missing
+	/// symbols. But, actions might refer to that missing symbol.
+	/// For example, x=ID {f($x);}. The action clearly assumes
+	/// that there has been an identifier matched previously and that
+	/// $x points at that token. If that token is missing, but
+	/// the next token in the stream is what we want we assume that
+	/// this token is missing and we keep going. Because we
+	/// have to return some token to replace the missing token,
+	/// we have to conjure one up. This method gives the user control
+	/// over the tokens returned for missing tokens. Mostly,
+	/// you will want to create something special for identifier
+	/// tokens. For literals such as '{' and ',', the default
+	/// action in the parser or tree parser works. It simply creates
+	/// a CommonToken of the appropriate type. The text will be the token.
+	/// If you change what tokens must be created by the lexer,
+	/// override this method to create the appropriate tokens.
+	///
+	UnitType*	getMissingSymbol( IntStreamType*		istream, ExceptionBaseType*		e,
+												ANTLR_UINT32			expectedTokenType,
+												BitsetListType*		follow);
+
+    /** Function that returns whether the supplied grammar function
+     *  will parse the current input stream or not. This is the way that syntactic
+     *  predicates are evaluated. Unlike java, C is perfectly happy to invoke code
+     *  via a pointer to a function (hence that's what all the ANTLR3 C interfaces
+     *  do.
+     */
+	template<typename Predicate>
+    bool  synpred( ClassForwarder<Predicate> );
+
+	//In place of exConstruct, just directly instantiate the Exception Object
+
+    /** Reset the recognizer
+     */
+    void  reset();
+	void  reset( ClassForwarder<LexerType> );
+	template<typename CompType>
+	void  reset( ClassForwarder<CompType> );
+
+	void exConstruct();
+
+    ~BaseRecognizer();
+
+};
+
+ANTLR_END_NAMESPACE()
+
+#include "antlr3baserecognizer.inl"
+
+/// @}
+///
+
+#endif	    /* _ANTLR3_BASERECOGNIZER_H	*/
+
diff --git a/runtime/Cpp/include/antlr3baserecognizer.inl b/runtime/Cpp/include/antlr3baserecognizer.inl
new file mode 100755
index 0000000..5d5acbf
--- /dev/null
+++ b/runtime/Cpp/include/antlr3baserecognizer.inl
@@ -0,0 +1,919 @@
+ANTLR_BEGIN_NAMESPACE()
+
+template< class ImplTraits, class StreamType >
+BaseRecognizer<ImplTraits, StreamType>::BaseRecognizer(ANTLR_UINT32 sizeHint,
+											RecognizerSharedStateType* state)
+{
+	m_debugger = NULL;
+
+	// If we have been supplied with a pre-existing recognizer state
+	// then we just install it, otherwise we must create one from scratch
+	//
+	if	(state == NULL)
+	{
+		m_state = new RecognizerSharedStateType();
+		m_state->set_sizeHint( sizeHint );
+	}
+	else
+	{
+		// Install the one we were given, and do not reset it here
+		// as it will either already have been initialized or will
+		// be in a state that needs to be preserved.
+		//
+		m_state = state;
+	}
+}
+
+template< class ImplTraits, class StreamType >
+ANTLR_INLINE typename BaseRecognizer<ImplTraits, StreamType>::SuperType* BaseRecognizer<ImplTraits, StreamType>::get_super()
+{
+	return static_cast<SuperType*>(this);
+}
+
+template< class ImplTraits, class StreamType >
+ANTLR_INLINE typename BaseRecognizer<ImplTraits, StreamType>::RecognizerSharedStateType* BaseRecognizer<ImplTraits, StreamType>::get_state() const
+{
+	return m_state;
+}
+template< class ImplTraits, class StreamType >
+ANTLR_INLINE typename BaseRecognizer<ImplTraits, StreamType>::DebugEventListenerType* BaseRecognizer<ImplTraits, StreamType>::get_debugger() const
+{
+	return m_debugger;
+}
+template< class ImplTraits, class StreamType >
+ANTLR_INLINE void BaseRecognizer<ImplTraits, StreamType>::set_state( RecognizerSharedStateType* state )
+{
+	m_state = state;
+}
+template< class ImplTraits, class StreamType >
+ANTLR_INLINE void BaseRecognizer<ImplTraits, StreamType>::set_debugger( DebugEventListenerType* debugger )
+{
+	m_debugger = debugger;
+}
+
+template< class ImplTraits, class StreamType >
+const typename BaseRecognizer<ImplTraits, StreamType>::UnitType* 
+BaseRecognizer<ImplTraits, StreamType>::match(ANTLR_UINT32 ttype, BitsetListType* follow)
+{
+	SuperType*  super = static_cast<SuperType*>(this);
+	IntStreamType* is = super->get_istream();
+
+	// Pick up the current input token/node for assignment to labels
+	//
+	const UnitType* matchedSymbol = this->getCurrentInputSymbol(is);
+
+    if	(is->_LA(1) == ttype)
+    {
+		// The token was the one we were told to expect
+		//
+		is->consume();					   // Consume that token from the stream
+		m_state->set_errorRecovery(false); // Not in error recovery now (if we were)
+		m_state->set_failed(false);	// The match was a success
+		return matchedSymbol;								// We are done
+    }
+
+    // We did not find the expected token type, if we are backtracking then
+    // we just set the failed flag and return.
+    //
+    if	( m_state->get_backtracking() > 0)
+    {
+		// Backtracking is going on
+		//
+		m_state->set_failed(true);
+		return matchedSymbol;
+	}
+
+    // We did not find the expected token and there is no backtracking
+    // going on, so we mismatch, which creates an exception in the recognizer exception
+    // stack.
+    //
+	matchedSymbol = this->recoverFromMismatchedToken(ttype, follow);
+    return matchedSymbol;
+
+}
+
+template< class ImplTraits, class StreamType >
+void BaseRecognizer<ImplTraits, StreamType>::matchAny()
+{
+	SuperType*  super = static_cast<SuperType*>(this);
+	IntStreamType* is = super->get_istream();
+
+	is->consume();
+	m_state->set_errorRecovery(false);
+	m_state->set_failed(false);
+    return;
+}
+
+template< class ImplTraits, class StreamType >
+bool BaseRecognizer<ImplTraits, StreamType>::mismatchIsUnwantedToken(IntStreamType* is, ANTLR_UINT32 ttype)
+{
+	ANTLR_UINT32 nextt = is->_LA(2);
+
+	if	(nextt == ttype)
+	{
+		if(m_state->get_exception() != NULL)
+			m_state->get_exception()->set_expecting(nextt);
+		return true;		// This token is unknown, but the next one is the one we wanted
+	}
+	else
+		return false;	// Neither this token, nor the one following is the one we wanted
+}
+
+template< class ImplTraits, class StreamType >
+bool BaseRecognizer<ImplTraits, StreamType>::mismatchIsMissingToken(IntStreamType* is, BitsetListType* follow)
+{
+	bool	retcode;
+	BitsetType*	followClone;
+	BitsetType*	viableTokensFollowingThisRule;
+
+	if	(follow == NULL)
+	{
+		// There is no information about the tokens that can follow the last one
+		// hence we must say that the current one we found is not a member of the
+		// follow set and does not indicate a missing token. We will just consume this
+		// single token and see if the parser works it out from there.
+		//
+		return	false;
+	}
+
+	followClone						= NULL;
+	viableTokensFollowingThisRule	= NULL;
+
+	// The C bitset maps are laid down at compile time by the
+	// C code generation. Hence we cannot remove things from them
+	// and so on. So, in order to remove EOR (if we need to) then
+	// we clone the static bitset.
+	//
+	followClone = follow->bitsetLoad();
+	if	(followClone == NULL)
+		return false;
+
+	// Compute what can follow this grammar reference
+	//
+	if	(followClone->isMember( ImplTraits::CommonTokenType::EOR_TOKEN_TYPE))
+	{
+		// EOR can follow, but if we are not the start symbol, we
+		// need to remove it.
+		//
+		followClone->remove(ImplTraits::CommonTokenType::EOR_TOKEN_TYPE);
+
+		// Now compute the visiable tokens that can follow this rule, according to context
+		// and make them part of the follow set.
+		//
+		viableTokensFollowingThisRule = this->computeCSRuleFollow();
+		followClone->borInPlace(viableTokensFollowingThisRule);
+	}
+
+	/// if current token is consistent with what could come after set
+	/// then we know we're missing a token; error recovery is free to
+	/// "insert" the missing token
+	///
+	/// BitSet cannot handle negative numbers like -1 (EOF) so I leave EOR
+	/// in follow set to indicate that the fall of the start symbol is
+	/// in the set (EOF can follow).
+	///
+	if	(		followClone->isMember(is->_LA(1))
+			||	followClone->isMember(ImplTraits::CommonTokenType::EOR_TOKEN_TYPE)
+		)
+	{
+		retcode = true;
+	}
+	else
+	{
+		retcode	= false;
+	}
+
+	if	(viableTokensFollowingThisRule != NULL)
+	{
+		delete viableTokensFollowingThisRule;
+	}
+	if	(followClone != NULL)
+	{
+		delete followClone;
+	}
+
+	return retcode;
+}
+
+template< class ImplTraits, class StreamType >
+void BaseRecognizer<ImplTraits, StreamType>::mismatch(ANTLR_UINT32 ttype, BitsetListType* follow)
+{
+	this->get_super()->mismatch( ttype, follow );
+}
+
+template< class ImplTraits, class StreamType >
+void	BaseRecognizer<ImplTraits, StreamType>::reportError()
+{
+	this->reportError( ClassForwarder<SuperType>() );
+}
+
+template< class ImplTraits, class StreamType >
+void	BaseRecognizer<ImplTraits, StreamType>::reportError( ClassForwarder<LexerType> )
+{
+	// Indicate this recognizer had an error while processing.
+	//
+	m_state->inc_errorCount();
+
+    this->displayRecognitionError(m_state->get_tokenNames());
+}
+
+template< class ImplTraits, class StreamType >
+template<typename CompType>
+void	BaseRecognizer<ImplTraits, StreamType>::reportError(ClassForwarder<CompType> )
+{
+	    // Invoke the debugger event if there is a debugger listening to us
+	//
+	if	( m_debugger != NULL)
+	{
+		m_debugger->recognitionException( m_state->get_exception() );
+	}
+
+    if	( m_state->get_errorRecovery() == true)
+    {
+		// Already in error recovery so don't display another error while doing so
+		//
+		return;
+    }
+
+    // Signal we are in error recovery now
+    //
+    m_state->set_errorRecovery(true);
+
+	// Indicate this recognizer had an error while processing.
+	//
+	m_state->inc_errorCount();
+
+	// Call the error display routine
+	//
+    this->displayRecognitionError( m_state->get_tokenNames() );
+}
+
+template< class ImplTraits, class StreamType >
+void	BaseRecognizer<ImplTraits, StreamType>::displayRecognitionError(ANTLR_UINT8** tokenNames)
+{
+	// Retrieve some info for easy reading.
+	//
+	ExceptionBaseType* ex	    =		m_state->get_exception();
+	StringType ttext;
+
+	// See if there is a 'filename' we can use
+	//
+	SuperType* super = static_cast<SuperType*>(this);
+	super->displayRecognitionError(tokenNames, ex);
+}
+
+template< class ImplTraits, class StreamType >
+ANTLR_UINT32 BaseRecognizer<ImplTraits, StreamType>::getNumberOfSyntaxErrors()
+{
+	return	m_state->get_errorCount();
+}
+
+template< class ImplTraits, class StreamType >
+void	BaseRecognizer<ImplTraits, StreamType>::recover()
+{
+	SuperType* super = static_cast<SuperType*>(this);
+	IntStreamType* is = super->get_parser_istream();
+	// Are we about to repeat the same error?
+	//
+    if	( m_state->get_lastErrorIndex() == is->index())
+    {
+		// The last error was at the same token index point. This must be a case
+		// where LT(1) is in the recovery token set so nothing is
+		// consumed. Consume a single token so at least to prevent
+		// an infinite loop; this is a failsafe.
+		//
+		is->consume();
+    }
+
+    // Record error index position
+    //
+    m_state->set_lastErrorIndex( is->index() );
+
+    // Work out the follows set for error recovery
+    //
+    BitsetType* followSet	= this->computeErrorRecoverySet();
+
+    // Call resync hook (for debuggers and so on)
+    //
+    this->beginResync();
+
+    // Consume tokens until we have resynced to something in the follows set
+    //
+    this->consumeUntilSet(followSet);
+
+    // End resync hook
+    //
+    this->endResync();
+
+    // Destroy the temporary bitset we produced.
+    //
+    delete followSet;
+
+    // Reset the inError flag so we don't re-report the exception
+    //
+    m_state->set_error(false);
+    m_state->set_failed(false);
+}
+
+template< class ImplTraits, class StreamType >
+void	BaseRecognizer<ImplTraits, StreamType>::beginResync()
+{
+	if	(m_debugger != NULL)
+	{
+		m_debugger->beginResync();
+	}
+}
+
+template< class ImplTraits, class StreamType >
+void	BaseRecognizer<ImplTraits, StreamType>::endResync()
+{
+	if	(m_debugger != NULL)
+	{
+		m_debugger->endResync();
+	}
+}
+
+template< class ImplTraits, class StreamType >
+void	BaseRecognizer<ImplTraits, StreamType>::beginBacktrack(ANTLR_UINT32 level)
+{
+	if	(m_debugger != NULL)
+	{
+		m_debugger->beginBacktrack(level);
+	}
+}
+
+template< class ImplTraits, class StreamType >
+void	BaseRecognizer<ImplTraits, StreamType>::endBacktrack(ANTLR_UINT32 level, bool successful)
+{
+	if	(m_debugger != NULL)
+	{
+		m_debugger->endBacktrack(level);
+	}
+}
+
+template< class ImplTraits, class StreamType >
+typename BaseRecognizer<ImplTraits, StreamType>::BitsetType*	BaseRecognizer<ImplTraits, StreamType>::computeErrorRecoverySet()
+{
+	return   this->combineFollows(false);
+}
+
+template< class ImplTraits, class StreamType >
+typename BaseRecognizer<ImplTraits, StreamType>::BitsetType*	BaseRecognizer<ImplTraits, StreamType>::computeCSRuleFollow()
+{
+	return   this->combineFollows(false);
+}
+
+template< class ImplTraits, class StreamType >
+typename BaseRecognizer<ImplTraits, StreamType>::BitsetType*	BaseRecognizer<ImplTraits, StreamType>::combineFollows(bool exact)
+{
+	BitsetType*	followSet;
+    BitsetType*	localFollowSet;
+    ANTLR_UINT32	top;
+    ANTLR_UINT32	i;
+
+    top	= static_cast<ANTLR_UINT32>( m_state->get_following().size() );
+
+    followSet	    = new BitsetType(0);
+	localFollowSet	= NULL;
+
+    for (i = top; i>0; i--)
+    {
+		localFollowSet =  m_state->get_following().at(i-1).bitsetLoad();
+
+		if  (localFollowSet != NULL)
+		{
+			followSet->borInPlace(localFollowSet);
+
+			if	(exact == true)
+			{
+				if	(localFollowSet->isMember( ImplTraits::CommonTokenType::EOR_TOKEN_TYPE) == false)
+				{
+					// Only leave EOR in the set if at top (start rule); this lets us know
+					// if we have to include the follow(start rule); I.E., EOF
+					//
+					if	(i>1)
+					{
+						followSet->remove(ImplTraits::CommonTokenType::EOR_TOKEN_TYPE);
+					}
+				}
+				else
+				{
+					break;	// Cannot see End Of Rule from here, just drop out
+				}
+			}
+			delete localFollowSet;
+			localFollowSet = NULL;
+		}
+    }
+
+	if	(localFollowSet != NULL)
+	{
+		delete localFollowSet;
+	}
+    return  followSet;
+}
+
+template< class ImplTraits, class StreamType >
+const typename BaseRecognizer<ImplTraits, StreamType>::UnitType* 
+BaseRecognizer<ImplTraits, StreamType>::recoverFromMismatchedToken( ANTLR_UINT32	ttype, BitsetListType*	follow)
+{
+	SuperType* super = static_cast<SuperType*>(this);
+	IntStreamType* is = super->get_parser_istream();
+	const UnitType* matchedSymbol;
+
+	// If the next token after the one we are looking at in the input stream
+	// is what we are looking for then we remove the one we have discovered
+	// from the stream by consuming it, then consume this next one along too as
+	// if nothing had happened.
+	//
+	if	( this->mismatchIsUnwantedToken( is, ttype) == true)
+	{
+		// Create an exception if we need one
+		//
+		new ANTLR_Exception<ImplTraits, UNWANTED_TOKEN_EXCEPTION, StreamType>(this, "");
+
+		// Call resync hook (for debuggers and so on)
+		//
+		if	(m_debugger != NULL)
+		{
+			m_debugger->beginResync();
+		}
+
+		// "delete" the extra token
+		//
+		this->beginResync();
+		is->consume();
+		this->endResync();
+		// End resync hook
+		//
+		if	(m_debugger != NULL)
+		{
+			m_debugger->endResync();
+		}
+
+		// Print out the error after we consume so that ANTLRWorks sees the
+		// token in the exception.
+		//
+		this->reportError();
+
+		// Return the token we are actually matching
+		//
+		matchedSymbol = this->getCurrentInputSymbol(is);
+
+		// Consume the token that the rule actually expected to get as if everything
+		// was hunky dory.
+		//
+		is->consume();
+
+		m_state->set_error(false); // Exception is not outstanding any more
+
+		return	matchedSymbol;
+	}
+
+	// Single token deletion (Unwanted above) did not work
+	// so we see if we can insert a token instead by calculating which
+	// token would be missing
+	//
+	if	( this->mismatchIsMissingToken(is, follow))
+	{
+		// We can fake the missing token and proceed
+		//
+		new ANTLR_Exception<ImplTraits, MISSING_TOKEN_EXCEPTION, StreamType>(this, "");
+		matchedSymbol = this->getMissingSymbol( is, m_state->get_exception(), ttype, follow);
+		m_state->get_exception()->set_token( matchedSymbol );
+		m_state->get_exception()->set_expecting(ttype);
+
+		// Print out the error after we insert so that ANTLRWorks sees the
+		// token in the exception.
+		//
+		this->reportError();
+
+		m_state->set_error(false);	// Exception is not outstanding any more
+
+		return	matchedSymbol;
+	}
+
+	// Create an exception if we need one
+	//
+	new ANTLR_Exception<ImplTraits, RECOGNITION_EXCEPTION, StreamType>(this, "");
+
+	// Neither deleting nor inserting tokens allows recovery
+	// must just report the exception.
+	//
+	m_state->set_error(true);
+	return NULL;
+}
+
+template< class ImplTraits, class StreamType >
+const typename BaseRecognizer<ImplTraits, StreamType>::UnitType* 
+BaseRecognizer<ImplTraits, StreamType>::recoverFromMismatchedSet(BitsetListType*	follow)
+{
+	SuperType* super = static_cast<SuperType*>(this);
+	IntStreamType* is = super->get_parser_istream();
+	const UnitType* matchedSymbol;
+
+	if	(this->mismatchIsMissingToken(is, follow) == true)
+	{
+		// We can fake the missing token and proceed
+		//
+		new ANTLR_Exception<ImplTraits, MISSING_TOKEN_EXCEPTION, StreamType>(this);
+		matchedSymbol = this->getMissingSymbol(is, m_state->get_exception(), follow);
+		m_state->get_exception()->set_token(matchedSymbol);
+
+		// Print out the error after we insert so that ANTLRWorks sees the
+		// token in the exception.
+		//
+		this->reportError();
+
+		m_state->set_error(false);	// Exception is not outstanding any more
+
+		return	matchedSymbol;
+	}
+
+    // TODO - Single token deletion like in recoverFromMismatchedToken()
+    //
+    m_state->set_error(true);
+	m_state->set_failed(true);
+	return NULL;
+}
+
+template< class ImplTraits, class StreamType >
+bool  BaseRecognizer<ImplTraits, StreamType>::recoverFromMismatchedElement(BitsetListType*	followBits)
+{
+	SuperType* super = static_cast<SuperType*>(this);
+	IntStreamType* is = super->get_parser_istream();
+
+	BitsetType* follow	= followBits->load();
+	BitsetType*   viableToksFollowingRule;
+
+    if	(follow == NULL)
+    {
+		/* The follow set is NULL, which means we don't know what can come
+		 * next, so we "hit and hope" by just signifying that we cannot
+		 * recover, which will just cause the next token to be consumed,
+		 * which might dig us out.
+		 */
+		return	false;
+    }
+
+    /* We have a bitmap for the follow set, hence we can compute
+     * what can follow this grammar element reference.
+     */
+    if	(follow->isMember( ImplTraits::CommonTokenType::EOR_TOKEN_TYPE) == true)
+    {
+		/* First we need to know which of the available tokens are viable
+		 * to follow this reference.
+		 */
+		viableToksFollowingRule	= this->computeCSRuleFollow();
+
+		/* Remove the EOR token, which we do not wish to compute with
+		 */
+		follow->remove( ImplTraits::CommonTokenType::EOR_TOKEN_TYPE);
+		delete viableToksFollowingRule;
+		/* We now have the computed set of what can follow the current token
+		 */
+    }
+
+    /* We can now see if the current token works with the set of tokens
+     * that could follow the current grammar reference. If it looks like it
+     * is consistent, then we can "insert" that token by not throwing
+     * an exception and assuming that we saw it.
+     */
+    if	( follow->isMember(is->_LA(1)) == true)
+    {
+		/* report the error, but don't cause any rules to abort and stuff
+		 */
+		this->reportError();
+		if	(follow != NULL)
+		{
+			delete follow;
+		}
+		m_state->set_error(false);
+		m_state->set_failed(false);
+		return true;	/* Success in recovery	*/
+    }
+
+    if	(follow != NULL)
+    {
+		delete follow;
+    }
+
+    /* We could not find anything viable to do, so this is going to
+     * cause an exception.
+     */
+    return  false;
+}
+
+template< class ImplTraits, class StreamType >
+void	BaseRecognizer<ImplTraits, StreamType>::consumeUntil(ANTLR_UINT32   tokenType)
+{
+	SuperType* super = static_cast<SuperType*>(this);
+	IntStreamType* is = super->get_parser_istream();
+
+	// What do have at the moment?
+    //
+    ANTLR_UINT32 ttype	= is->_LA(1);
+
+    // Start eating tokens until we get to the one we want.
+    //
+    while   (ttype != ImplTraits::CommonTokenType::TOKEN_EOF && ttype != tokenType)
+    {
+		is->consume();
+		ttype	= is->_LA(1);
+    }
+}
+
+template< class ImplTraits, class StreamType >
+void	BaseRecognizer<ImplTraits, StreamType>::consumeUntilSet(BitsetType*	set)
+{
+    ANTLR_UINT32	    ttype;
+	SuperType* super = static_cast<SuperType*>(this);
+	IntStreamType* is = super->get_parser_istream();
+
+    // What do have at the moment?
+    //
+    ttype	= is->_LA(1);
+
+    // Start eating tokens until we get to one we want.
+    //
+    while   (ttype != ImplTraits::CommonTokenType::TOKEN_EOF && set->isMember(ttype) == false)
+    {
+		is->consume();
+		ttype	= is->_LA(1);
+    }
+
+}
+
+template< class ImplTraits, class StreamType >
+ANTLR_MARKER	BaseRecognizer<ImplTraits, StreamType>::getRuleMemoization( ANTLR_INTKEY	ruleIndex, ANTLR_MARKER	ruleParseStart)
+{
+	/* The rule memos are an ANTLR3_LIST of ANTLR3_LIST.
+     */
+	typedef IntTrie<ImplTraits, ANTLR_MARKER> RuleListType;
+	typedef TrieEntry<ImplTraits, RuleListType*> EntryType;
+	typedef TrieEntry<ImplTraits, ANTLR_MARKER> SubEntryType;
+    ANTLR_MARKER	stopIndex;
+    EntryType*	entry;
+
+    /* See if we have a list in the ruleMemos for this rule, and if not, then create one
+     * as we will need it eventually if we are being asked for the memo here.
+     */
+    entry	= m_state->get_ruleMemo()->get(ruleIndex);
+
+    if	(entry == NULL)
+    {
+		/* Did not find it, so create a new one for it, with a bit depth based on the
+		 * size of the input stream. We need the bit depth to incorporate the number if
+		 * bits required to represent the largest possible stop index in the input, which is the
+		 * last character. An int stream is free to return the largest 64 bit offset if it has
+		 * no idea of the size, but you should remember that this will cause the leftmost
+		 * bit match algorithm to run to 63 bits, which will be the whole time spent in the trie ;-)
+		 */
+		m_state->get_ruleMemo()->add( ruleIndex, new RuleListType(63) );
+
+		/* We cannot have a stopIndex in a trie we have just created of course
+		 */
+		return	MEMO_RULE_UNKNOWN;
+    }
+
+    RuleListType* ruleList	= entry->get_data();
+
+    /* See if there is a stop index associated with the supplied start index.
+     */
+    stopIndex	= 0;
+
+    SubEntryType* sub_entry = ruleList->get(ruleParseStart);
+    if (sub_entry != NULL)
+    {
+		stopIndex = sub_entry->get_data();
+    }
+
+    if	(stopIndex == 0)
+    {
+		return MEMO_RULE_UNKNOWN;
+    }
+
+    return  stopIndex;
+}
+
+template< class ImplTraits, class StreamType >
+bool	BaseRecognizer<ImplTraits, StreamType>::alreadyParsedRule(ANTLR_MARKER	ruleIndex)
+{
+	SuperType* super = static_cast<SuperType*>(this);
+	IntStreamType* is = super->get_istream();
+
+    /* See if we have a memo marker for this.
+     */
+    ANTLR_MARKER stopIndex	    = this->getRuleMemoization( ruleIndex, is->index() );
+
+    if	(stopIndex  == MEMO_RULE_UNKNOWN)
+    {
+		return false;
+    }
+
+    if	(stopIndex == MEMO_RULE_FAILED)
+    {
+		m_state->set_failed(true);
+    }
+    else
+    {
+		is->seek(stopIndex+1);
+    }
+
+    /* If here then the rule was executed for this input already
+     */
+    return  true;
+}
+
+template< class ImplTraits, class StreamType >
+void	BaseRecognizer<ImplTraits, StreamType>::memoize(ANTLR_MARKER ruleIndex, ANTLR_MARKER ruleParseStart)
+{
+   /* The rule memos are an ANTLR3_LIST of ANTLR3_LIST.
+    */
+	typedef IntTrie<ImplTraits, ANTLR_MARKER> RuleListType;
+	typedef TrieEntry<ImplTraits, RuleListType*> EntryType;
+    EntryType*	    entry;
+    ANTLR_MARKER	    stopIndex;
+	SuperType* super = static_cast<SuperType*>(this);
+	IntStreamType* is = super->get_istream();
+
+    stopIndex	= (m_state->get_failed() == true) ? MEMO_RULE_FAILED : is->index() - 1;
+
+    entry	= m_state->get_ruleMemo()->get(ruleIndex);
+
+    if	(entry != NULL)
+    {
+		RuleListType*	ruleList = entry->get_data();
+
+		/* If we don't already have this entry, append it. The memoize trie does not
+		 * accept duplicates so it won't add it if already there and we just ignore the
+		 * return code as we don't care if it is there already.
+		 */
+		ruleList->add(ruleParseStart, stopIndex);
+    }
+}
+
+template< class ImplTraits, class StreamType >
+const typename BaseRecognizer<ImplTraits, StreamType>::UnitType*
+BaseRecognizer<ImplTraits, StreamType>::getCurrentInputSymbol( IntStreamType* istream )
+{
+	return this->getCurrentInputSymbol( istream, ClassForwarder<SuperType>() );
+}
+
+template< class ImplTraits, class StreamType >
+const typename BaseRecognizer<ImplTraits, StreamType>::UnitType*
+BaseRecognizer<ImplTraits, StreamType>::getCurrentInputSymbol(IntStreamType* istream, ClassForwarder<LexerType>)
+{
+	return NULL;
+}
+
+template< class ImplTraits, class StreamType >
+const typename BaseRecognizer<ImplTraits, StreamType>::UnitType*
+BaseRecognizer<ImplTraits, StreamType>::getCurrentInputSymbol(IntStreamType* istream, ClassForwarder<ParserType>)
+{
+	typedef typename ImplTraits::TokenStreamType TokenStreamType;
+	TokenStreamType* token_stream = static_cast<TokenStreamType*>(istream);
+	return token_stream->_LT(1);
+}
+
+template< class ImplTraits, class StreamType >
+const typename BaseRecognizer<ImplTraits, StreamType>::UnitType*
+BaseRecognizer<ImplTraits, StreamType>::getCurrentInputSymbol(IntStreamType* istream, ClassForwarder<TreeParserType>)
+{
+	typedef typename ImplTraits::TreeNodeStreamType TreeNodeStreamType;
+	TreeNodeStreamType*	ctns = static_cast<TreeNodeStreamType*>(istream);
+	return ctns->_LT(1);
+}
+
+
+template< class ImplTraits, class StreamType >
+typename BaseRecognizer<ImplTraits, StreamType>::UnitType*	BaseRecognizer<ImplTraits, StreamType>::getMissingSymbol( IntStreamType* istream,
+										  ExceptionBaseType*		e,
+										  ANTLR_UINT32			expectedTokenType,
+										  BitsetListType*	follow)
+{
+	return this->get_super()->getMissingSymbol( istream, e, expectedTokenType, follow );
+}
+
+
+template< class ImplTraits, class StreamType >
+	template<typename Predicate>
+bool  BaseRecognizer<ImplTraits, StreamType>::synpred(ClassForwarder<Predicate> pred)
+{
+	ANTLR_MARKER   start;
+    SuperType* super = static_cast<SuperType*>(this);
+	IntStreamType* is = super->get_istream();
+
+    /* Begin backtracking so we can get back to where we started after trying out
+     * the syntactic predicate.
+     */
+    start   = is->mark();
+    m_state->inc_backtracking();
+
+    /* Try the syntactical predicate
+     */
+    this->get_super()->synpred( pred );
+
+    /* Reset
+     */
+    is->rewind(start);
+    m_state->dec_backtracking();
+
+    if	( m_state->get_failed() == true)
+    {
+		/* Predicate failed
+		 */
+		m_state->set_failed(false);
+		return	false;
+    }
+    else
+    {
+		/* Predicate was successful
+		 */
+		m_state->set_failed(false);
+		return	true;
+    }
+}
+
+template< class ImplTraits, class StreamType >
+void BaseRecognizer<ImplTraits, StreamType>::exConstruct()
+{
+	this->get_super()->exConstruct();
+}
+
+template< class ImplTraits, class StreamType >
+void  BaseRecognizer<ImplTraits, StreamType>::reset()
+{
+	this->reset( ClassForwarder<SuperType>() );
+}
+
+template< class ImplTraits, class StreamType >
+template< typename CompType >
+void  BaseRecognizer<ImplTraits, StreamType>::reset( ClassForwarder<CompType> )
+{
+	typedef typename RecognizerSharedStateType::RuleMemoType RuleMemoType;
+	 m_state->get_following().clear();
+
+	// Reset the state flags
+	//
+	m_state->set_errorRecovery(false);
+	m_state->set_lastErrorIndex(-1);
+	m_state->set_failed(false);
+	m_state->set_errorCount(0);
+	m_state->set_backtracking(0);
+
+	if	(m_state->get_ruleMemo() != NULL)
+	{
+		delete m_state->get_ruleMemo();
+		m_state->set_ruleMemo( new RuleMemoType(15) );	/* 16 bit depth is enough for 32768 rules! */
+	}
+}
+
+template< class ImplTraits, class StreamType >
+void  BaseRecognizer<ImplTraits, StreamType>::reset( ClassForwarder<LexerType> )
+{
+	m_state->set_token_present( false );
+    m_state->set_type( ImplTraits::CommonTokenType::TOKEN_INVALID );
+    m_state->set_channel( TOKEN_DEFAULT_CHANNEL );
+    m_state->set_tokenStartCharIndex( -1 );
+    m_state->set_tokenStartCharPositionInLine(-1);
+    m_state->set_tokenStartLine( -1 );
+    m_state->set_text("");
+}
+
+template< class ImplTraits, class StreamType >
+BaseRecognizer<ImplTraits, StreamType>::~BaseRecognizer()
+{
+	// Did we have a state allocated?
+	//
+	if	(m_state != NULL)
+	{
+		// Free any rule memoization we set up
+		//
+		if	(m_state->get_ruleMemo() != NULL)
+		{
+			delete m_state->get_ruleMemo();
+			m_state->set_ruleMemo(NULL);
+		}
+
+
+		// Free any exception space we have left around
+		//
+		ExceptionBaseType* thisE = m_state->get_exception();
+		if	(thisE != NULL)
+		{
+			delete thisE;
+		}
+
+		// Free the shared state memory
+		//
+		delete m_state;
+	}
+
+	// Free the actual recognizer space
+	//
+}
+
+
+
+ANTLR_END_NAMESPACE()
diff --git a/runtime/Cpp/include/antlr3bitset.hpp b/runtime/Cpp/include/antlr3bitset.hpp
new file mode 100755
index 0000000..a711b8a
--- /dev/null
+++ b/runtime/Cpp/include/antlr3bitset.hpp
@@ -0,0 +1,224 @@
+/**
+ * \file
+ * Defines the basic structures of an ANTLR3 bitset. this is a C version of the 
+ * cut down Bitset class provided with the java version of antlr 3.
+ * 
+ * 
+ */
+#ifndef	_ANTLR3_BITSET_HPP
+#define	_ANTLR3_BITSET_HPP
+
+// [The "BSD licence"]
+// Copyright (c) 2005-2009 Gokulakannan Somasundaram, ElectronDB
+
+//
+// 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.
+
+#include    "antlr3defs.hpp"
+
+ANTLR_BEGIN_NAMESPACE()
+
+/** How many bits in the elements
+ */
+static const ANTLR_UINT32	ANTLR_BITSET_BITS =	64;
+
+/** How many bits in a nible of bits
+ */
+static const ANTLR_UINT32	ANTLR_BITSET_NIBBLE	= 4;
+
+/** log2 of ANTLR3_BITSET_BITS 2^ANTLR3_BITSET_LOG_BITS = ANTLR3_BITSET_BITS
+ */
+static const ANTLR_UINT32	ANTLR_BITSET_LOG_BITS =	6;
+
+/** We will often need to do a mod operator (i mod nbits).
+ *  For powers of two, this mod operation is the
+ *  same as:
+ *   - (i & (nbits-1)).  
+ *
+ * Since mod is relatively slow, we use an easily
+ * precomputed mod mask to do the mod instead.
+ */
+static const ANTLR_UINT32	ANTLR_BITSET_MOD_MASK = ANTLR_BITSET_BITS - 1;
+
+template <class ImplTraits>
+class BitsetList : public ImplTraits::AllocPolicyType
+{
+public:
+	typedef typename ImplTraits::AllocPolicyType AllocPolicyType;
+	typedef typename ImplTraits::BitsetType BitsetType;
+
+private:
+	/// Pointer to the allocated array of bits for this bit set, which
+    /// is an array of 64 bit elements (of the architecture). If we find a 
+    /// machine/C compiler that does not know anything about 64 bit values
+    ///	then it should be easy enough to produce a 32 bit (or less) version
+    /// of the bitset code. Note that the pointer here may be static if laid down
+	/// by the code generation, and it must be copied if it is to be manipulated
+	/// to perform followset calculations.
+    ///
+    ANTLR_BITWORD*  m_bits;
+
+    /// Length of the current bit set in ANTLR3_UINT64 units.
+    ///
+    ANTLR_UINT32    m_length;
+
+public:
+	BitsetList();
+	BitsetList( ANTLR_BITWORD* bits, ANTLR_UINT32 length );
+
+	ANTLR_BITWORD* get_bits() const;
+	ANTLR_UINT32 get_length() const;
+	void set_bits( ANTLR_BITWORD* bits );
+	void set_length( ANTLR_UINT32 length );
+
+	///
+	/// \brief
+	/// Creates a new bitset with at least one 64 bit bset of bits, but as
+	/// many 64 bit sets as are required.
+	///
+	/// \param[in] bset
+	/// A variable number of bits to add to the set, ending in -1 (impossible bit).
+	/// 
+	/// \returns
+	/// A new bit set with all of the specified bitmaps in it and the API
+	/// initialized.
+	/// 
+	/// Call as:
+	///  - pANTLR3_BITSET = antlrBitsetLoad(bset, bset11, ..., -1);
+	///  - pANTLR3_BITSET = antlrBitsetOf(-1);  Create empty bitset 
+	///
+	/// \remarks
+	/// Stdargs function - must supply -1 as last paremeter, which is NOT
+	/// added to the set.
+	/// 
+	///
+	BitsetType* bitsetLoad();
+
+	BitsetType* bitsetCopy();
+
+};
+
+template <class ImplTraits>
+class Bitset : public ImplTraits::AllocPolicyType
+{
+public:
+	typedef typename ImplTraits::AllocPolicyType AllocPolicyType;
+	typedef typename AllocPolicyType::template ListType<ANTLR_UINT32> IntListType;
+	typedef typename ImplTraits::BitsetListType BitsetListType;
+
+private:
+	/// The actual bits themselves
+	///
+	BitsetListType		m_blist;
+
+public:
+	Bitset( ANTLR_UINT32 nbits=0 );
+	Bitset( const Bitset& bitset );
+    Bitset*  clone() const;
+	Bitset*  bor(Bitset* bitset2);
+
+	BitsetListType& get_blist();
+	void	 borInPlace(Bitset* bitset2);
+	ANTLR_UINT32 size() const;
+	void	add(ANTLR_INT32 bit);
+	void	grow(ANTLR_INT32 newSize);
+	bool	equals(Bitset* bitset2) const;
+	bool	isMember(ANTLR_UINT32 bit) const;
+	ANTLR_UINT32 numBits() const;
+	void remove(ANTLR_UINT32 bit);
+	bool isNilNode() const;
+
+	/** Produce an integer list of all the bits that are turned on
+	 *  in this bitset. Used for error processing in the main as the bitset
+	 *  reresents a number of integer tokens which we use for follow sets
+	 *  and so on.
+	 *
+	 *  The first entry is the number of elements following in the list.
+	 */
+	ANTLR_INT32* toIntList() const;
+
+	///
+	/// \brief
+	/// Creates a new bitset with at least one element, but as
+	/// many elements are required.
+	/// 
+	/// \param[in] bit
+	/// A variable number of bits to add to the set, ending in -1 (impossible bit).
+	/// 
+	/// \returns
+	/// A new bit set with all of the specified elements added into it.
+	/// 
+	/// Call as:
+	///  - pANTLR3_BITSET = antlrBitsetOf(n, n1, n2, -1);
+	///  - pANTLR3_BITSET = antlrBitsetOf(-1);  Create empty bitset 
+	///
+	/// \remarks
+	/// Stdargs function - must supply -1 as last paremeter, which is NOT
+	/// added to the set.
+	/// 
+	///
+	//C++ doesn't like variable length arguments. so use function overloading
+	static Bitset* BitsetOf(ANTLR_INT32 bit);
+	static Bitset* BitsetOf(ANTLR_INT32 bit1, ANTLR_INT32 bit2);
+	
+	///
+	/// \brief
+	/// Creates a new bitset with at least one 64 bit bset of bits, but as
+	/// many 64 bit sets as are required.
+	///
+	/// \param[in] bset
+	/// A variable number of bits to add to the set, ending in -1 (impossible bit).
+	/// 
+	/// \returns
+	/// A new bit set with all of the specified bitmaps in it and the API
+	/// initialized.
+	/// 
+	/// Call as:
+	///  - pANTLR3_BITSET = antlrBitsetLoad(bset, bset11, ..., -1);
+	///  - pANTLR3_BITSET = antlrBitsetOf(-1);  Create empty bitset 
+	///
+	/// \remarks
+	/// Stdargs function - must supply -1 as last paremeter, which is NOT
+	/// added to the set.
+	/// 
+	///antlr3BitsetList
+	static Bitset*  BitsetFromList(const IntListType& list);
+	~Bitset();
+
+private:
+	void	growToInclude(ANTLR_INT32 bit);
+	static ANTLR_UINT64	BitMask(ANTLR_UINT32 bitNumber);
+	static ANTLR_UINT32	NumWordsToHold(ANTLR_UINT32 bit);
+	static ANTLR_UINT32	WordNumber(ANTLR_UINT32 bit);
+	void bitsetORInPlace(Bitset* bitset2);
+	
+};
+
+ANTLR_END_NAMESPACE()
+
+#include "antlr3bitset.inl"
+
+#endif
+
diff --git a/runtime/Cpp/include/antlr3bitset.inl b/runtime/Cpp/include/antlr3bitset.inl
new file mode 100755
index 0000000..ad2f620
--- /dev/null
+++ b/runtime/Cpp/include/antlr3bitset.inl
@@ -0,0 +1,492 @@
+ANTLR_BEGIN_NAMESPACE()
+
+template <class ImplTraits>
+ANTLR_INLINE BitsetList<ImplTraits>::BitsetList()
+{
+	m_bits = NULL;
+	m_length  = 0;
+}
+
+template <class ImplTraits>
+ANTLR_INLINE BitsetList<ImplTraits>::BitsetList( ANTLR_BITWORD* bits, ANTLR_UINT32 length )
+{
+	m_bits = bits;
+	m_length  = length;
+}
+
+template <class ImplTraits>
+ANTLR_INLINE ANTLR_BITWORD* BitsetList<ImplTraits>::get_bits() const
+{
+	return m_bits;
+}
+
+template <class ImplTraits>
+ANTLR_INLINE ANTLR_UINT32 BitsetList<ImplTraits>::get_length() const
+{
+	return m_length;
+}
+
+template <class ImplTraits>
+ANTLR_INLINE void BitsetList<ImplTraits>::set_bits( ANTLR_BITWORD* bits )
+{
+	m_bits = bits;
+}
+
+template <class ImplTraits>
+ANTLR_INLINE void BitsetList<ImplTraits>::set_length( ANTLR_UINT32 length )
+{
+	m_length = length;
+}
+
+template <class ImplTraits>
+typename BitsetList<ImplTraits>::BitsetType* BitsetList<ImplTraits>::bitsetLoad()
+{
+	// Allocate memory for the bitset structure itself
+	// the input parameter is the bit number (0 based)
+	// to include in the bitset, so we need at at least
+	// bit + 1 bits. If any arguments indicate a 
+	// a bit higher than the default number of bits (0 means default size)
+	// then Add() will take care
+	// of it.
+	//
+	BitsetType* bitset  = new BitsetType();
+
+	if	(this != NULL)
+	{
+		// Now we can add the element bits into the set
+		//
+		ANTLR_UINT32 count=0;
+		while (count < m_length)
+		{
+			if( bitset->get_blist().get_length() <= count)
+				bitset->grow(count+1);
+
+			typename ImplTraits::BitsetListType& blist = bitset->get_blist();
+			blist.m_bits[count] = *(m_bits+count);
+			count++;
+		}
+	}
+
+	// return the new bitset
+	//
+	return  bitset;
+}
+
+template <class ImplTraits>
+typename BitsetList<ImplTraits>::BitsetType* BitsetList<ImplTraits>::bitsetCopy()
+{
+	BitsetType*  bitset;
+	ANTLR_UINT32 numElements = m_length;
+
+    // Avoid memory thrashing at the expense of a few more bytes
+    //
+    if	(numElements < 8)
+		numElements = 8;
+
+    // Allocate memory for the bitset structure itself
+    //
+    bitset  = new Bitset<ImplTraits>(numElements);
+	memcpy(bitset->get_blist().get_bits(), m_bits, numElements * sizeof(ANTLR_BITWORD));
+
+    // All seems good
+    //
+    return  bitset;
+}
+
+template <class ImplTraits>
+Bitset<ImplTraits>::Bitset( ANTLR_UINT32 numBits )
+{
+	// Avoid memory thrashing at the up front expense of a few bytes
+	if	(numBits < (8 * ANTLR_BITSET_BITS))
+		numBits = 8 * ANTLR_BITSET_BITS;
+
+	// No we need to allocate the memory for the number of bits asked for
+	// in multiples of ANTLR3_UINT64. 
+	//
+	ANTLR_UINT32 numelements	= ((numBits -1) >> ANTLR_BITSET_LOG_BITS) + 1;
+
+	m_blist.set_bits( (ANTLR_BITWORD*) AllocPolicyType::alloc0(numelements * sizeof(ANTLR_BITWORD)));
+
+	m_blist.set_length( numelements );
+}
+
+template <class ImplTraits>
+Bitset<ImplTraits>::Bitset( const Bitset& bitset )
+	:m_blist(bitset.m_blist)
+{
+}
+
+template <class ImplTraits>
+ANTLR_INLINE Bitset<ImplTraits>*  Bitset<ImplTraits>::clone() const
+{
+	Bitset*  bitset;
+
+    // Allocate memory for the bitset structure itself
+    //
+    bitset  = new Bitset( ANTLR_BITSET_BITS * m_blist.get_length() );
+
+    // Install the actual bits in the source set
+    //
+    memcpy(bitset->m_blist.get_bits(), m_blist.get_bits(), 
+				m_blist.get_length() * sizeof(ANTLR_BITWORD) );
+
+    // All seems good
+    //
+    return  bitset;
+}
+
+template <class ImplTraits>
+Bitset<ImplTraits>*  Bitset<ImplTraits>::bor(Bitset* bitset2)
+{
+	Bitset*  bitset;
+
+    if	(this == NULL)
+		return bitset2->clone();
+
+    if	(bitset2 == NULL)
+		return	this->clone();
+
+    // Allocate memory for the newly ordered bitset structure itself.
+    //
+    bitset  = this->clone();
+    bitset->bitsetORInPlace(bitset2);
+    return  bitset;
+}
+
+template <class ImplTraits>
+void	 Bitset<ImplTraits>::borInPlace(Bitset* bitset2)
+{
+	ANTLR_UINT32   minimum;
+
+    if	(bitset2 == NULL)
+		return;
+
+	// First make sure that the target bitset is big enough
+    // for the new bits to be ored in.
+    //
+    if	( m_blist.get_length() < bitset2->m_blist.get_length() )
+		this->growToInclude( bitset2->m_blist.get_length() * sizeof(ANTLR_BITWORD) );
+    
+    // Or the miniimum number of bits after any resizing went on
+    //
+    if	( m_blist.get_length() < bitset2->m_blist.get_length() )
+		minimum = m_blist.get_length();
+	else
+		minimum = bitset2->m_blist.get_length();
+
+	ANTLR_BITWORD* bits1 = m_blist.get_bits();
+	ANTLR_BITWORD* bits2 = bitset2->m_blist.get_bits();
+	for	(ANTLR_UINT32 i = minimum; i > 0; i--)
+		bits1[i-1] |= bits2[i-1];
+}
+
+template <class ImplTraits>
+ANTLR_UINT32 Bitset<ImplTraits>::size() const
+{
+    ANTLR_UINT32   degree;
+    ANTLR_INT32   i;
+    ANTLR_INT8    bit;
+    
+    // TODO: Come back to this, it may be faster to & with 0x01
+    // then shift right a copy of the 4 bits, than shift left a constant of 1.
+    // But then again, the optimizer might just work this out
+    // anyway.
+    //
+    degree  = 0;
+	ANTLR_BITWORD* bits = m_blist.get_bits();
+    for	(i = m_blist.get_length() - 1; i>= 0; i--)
+    {
+		if  (bits[i] != 0)
+		{
+			for(bit = ANTLR_BITSET_BITS - 1; bit >= 0; bit--)
+			{
+				if((bits[i] & (((ANTLR_BITWORD)1) << bit)) != 0)
+				{
+					degree++;
+				}
+			}
+		}
+    }
+    return degree;
+}
+
+template <class ImplTraits>
+ANTLR_INLINE void	Bitset<ImplTraits>::add(ANTLR_INT32 bit)
+{
+	ANTLR_UINT32   word = Bitset::WordNumber(bit);
+
+    if	(word	>= m_blist.get_length() )
+		this->growToInclude(bit);
+ 
+	ANTLR_BITWORD* bits = m_blist.get_bits();
+	bits[word] |= Bitset::BitMask(bit);
+}
+
+template <class ImplTraits>
+void	Bitset<ImplTraits>::grow(ANTLR_INT32 newSize)
+{
+	ANTLR_BITWORD*   newBits;
+
+    // Space for newly sized bitset - TODO: come back to this and use realloc?, it may
+    // be more efficient...
+    //
+    newBits =  (ANTLR_BITWORD*) AllocPolicyType::alloc0(newSize * sizeof(ANTLR_BITWORD) );
+    if	( m_blist.get_bits() != NULL)
+    {
+		// Copy existing bits
+		//
+		memcpy( newBits, m_blist.get_bits(), m_blist.get_length() * sizeof(ANTLR_BITWORD) );
+
+		// Out with the old bits... de de de derrr
+		//
+		AllocPolicyType::free( m_blist.get_bits() );
+    }
+
+    // In with the new bits... keerrrang.
+    //
+    m_blist.set_bits(newBits);
+    m_blist.set_length(newSize);
+}
+
+template <class ImplTraits>
+bool	Bitset<ImplTraits>::equals(Bitset* bitset2) const
+{
+    ANTLR_UINT32   minimum;
+    ANTLR_UINT32   i;
+
+    if	(this == NULL || bitset2 == NULL)
+		return	false;
+
+    // Work out the minimum comparison set
+    //
+    if	( m_blist.get_length() < bitset2->m_blist.get_length() )
+		minimum = m_blist.get_length();
+    else
+		minimum = bitset2->m_blist.get_length();
+
+    // Make sure explict in common bits are equal
+    //
+    for	(i = minimum - 1; i < minimum ; i--)
+    {
+		ANTLR_BITWORD* bits1 = m_blist.get_bits();
+		ANTLR_BITWORD* bits2 = bitset2->m_blist.get_bits();
+		if  ( bits1[i] != bits2[i])
+			return false;
+    }
+
+    // Now make sure the bits of the larger set are all turned
+    // off.
+    //
+    if	( m_blist.get_length() > minimum)
+    {
+		for (i = minimum ; i < m_blist.get_length(); i++)
+		{
+			ANTLR_BITWORD* bits = m_blist.get_bits();
+			if(bits[i] != 0)
+				return false;
+		}
+    }
+    else if (bitset2->m_blist.get_length() > minimum)
+    {
+		ANTLR_BITWORD* bits = m_blist.get_bits();
+		for (i = minimum; i < bitset2->m_blist.get_length(); i++)
+		{
+			if	( bits[i] != 0 )
+				return	false;
+		}
+    }
+
+    return  true;
+}
+
+template <class ImplTraits>
+bool	Bitset<ImplTraits>::isMember(ANTLR_UINT32 bit) const
+{
+    ANTLR_UINT32    wordNo = Bitset::WordNumber(bit);
+
+    if	(wordNo >= m_blist.get_length())
+		return false;
+    
+	ANTLR_BITWORD* bits = m_blist.get_bits();
+    if	( (bits[wordNo] & Bitset::BitMask(bit)) == 0)
+		return false;
+    else
+		return true;
+}
+
+template <class ImplTraits>
+ANTLR_INLINE ANTLR_UINT32 Bitset<ImplTraits>::numBits() const
+{
+	return  m_blist.get_length() << ANTLR_BITSET_LOG_BITS;
+}
+
+template <class ImplTraits>
+ANTLR_INLINE typename ImplTraits::BitsetListType& Bitset<ImplTraits>::get_blist()
+{
+	return m_blist;
+}
+
+template <class ImplTraits>
+ANTLR_INLINE void Bitset<ImplTraits>::remove(ANTLR_UINT32 bit)
+{
+    ANTLR_UINT32    wordNo = Bitset::WordNumber(bit);
+
+    if	(wordNo < m_blist.get_length())
+	{
+		ANTLR_BITWORD* bits = m_blist.get_bits();
+		bits[wordNo] &= ~(Bitset::BitMask(bit));
+	}
+}
+
+template <class ImplTraits>
+ANTLR_INLINE bool Bitset<ImplTraits>::isNilNode() const
+{
+	ANTLR_UINT32    i;
+	ANTLR_BITWORD* bits = m_blist.get_bits();
+	for	(i = m_blist.get_length() -1 ; i < m_blist.get_length(); i--)
+	{
+		if(bits[i] != 0)
+			return false;
+	}
+	return  true;
+}
+
+template <class ImplTraits>
+ANTLR_INT32* Bitset<ImplTraits>::toIntList() const
+{
+	ANTLR_UINT32   numInts;	    // How many integers we will need
+    ANTLR_UINT32   numBits;	    // How many bits are in the set
+    ANTLR_UINT32   i;
+    ANTLR_UINT32   index;
+
+    ANTLR_INT32*  intList;
+
+    numInts = this->size() + 1;
+    numBits = this->numBits();
+ 
+    intList = (ANTLR_INT32*) AllocPolicyType::alloc(numInts * sizeof(ANTLR_INT32));
+    
+    intList[0] = numInts;
+
+    // Enumerate the bits that are turned on
+    //
+    for	(i = 0, index = 1; i<numBits; i++)
+    {
+		if  (this->isMember(i) == true)
+			intList[index++]    = i;
+    }
+
+    // Result set
+    //
+    return  intList;
+}
+
+template <class ImplTraits>
+ANTLR_INLINE Bitset<ImplTraits>::~Bitset()
+{
+	if	(m_blist.get_bits() != NULL)
+		AllocPolicyType::free(m_blist.get_bits());
+    return;
+}
+
+template <class ImplTraits>
+void	Bitset<ImplTraits>::growToInclude(ANTLR_INT32 bit)
+{
+	ANTLR_UINT32	bl;
+	ANTLR_UINT32	nw;
+
+	bl = (m_blist.get_length() << 1);
+	nw = Bitset::NumWordsToHold(bit);
+
+	if	(bl > nw)
+		this->grow(bl);
+	else
+		this->grow(nw);
+}
+
+template <class ImplTraits>
+ANTLR_INLINE ANTLR_UINT64	Bitset<ImplTraits>::BitMask(ANTLR_UINT32 bitNumber)
+{
+	return  ((ANTLR_UINT64)1) << (bitNumber & (ANTLR_BITSET_MOD_MASK));
+}
+
+template <class ImplTraits>
+ANTLR_INLINE ANTLR_UINT32	Bitset<ImplTraits>::NumWordsToHold(ANTLR_UINT32 bit)
+{
+	return  (bit >> ANTLR_BITSET_LOG_BITS) + 1;
+}
+
+template <class ImplTraits>
+ANTLR_INLINE ANTLR_UINT32	Bitset<ImplTraits>::WordNumber(ANTLR_UINT32 bit)
+{
+	return  bit >> ANTLR_BITSET_LOG_BITS;
+}
+
+template <class ImplTraits>
+void Bitset<ImplTraits>::bitsetORInPlace(Bitset* bitset2)
+{
+	ANTLR_UINT32   minimum;
+    ANTLR_UINT32   i;
+
+    if	(bitset2 == NULL)
+		return;
+
+    // First make sure that the target bitset is big enough
+    // for the new bits to be ored in.
+    //
+    if	( m_blist.get_length() < bitset2->m_blist.get_length() )
+		this->growToInclude( bitset2->m_blist.get_length() * sizeof(ANTLR_BITWORD) );
+    
+    // Or the miniimum number of bits after any resizing went on
+    //
+    if	( m_blist.get_length() < bitset2->m_blist.get_length() )
+		minimum = m_blist.get_length();
+	else
+		minimum = bitset2->m_blist.get_length();
+
+	ANTLR_BITWORD* bits1 = m_blist.get_bits();
+	ANTLR_BITWORD* bits2 = bitset2->m_blist.get_bits();
+    for	(i = minimum; i > 0; i--)
+		bits1[i-1] |= bits2[i-1];
+}
+
+template <class ImplTraits>
+Bitset<ImplTraits>* Bitset<ImplTraits>::BitsetOf(ANTLR_INT32 bit)
+{
+	// Allocate memory for the bitset structure itself
+    // the input parameter is the bit number (0 based)
+    // to include in the bitset, so we need at at least
+    // bit + 1 bits. If any arguments indicate a 
+    // a bit higher than the default number of bits (0 menas default size)
+    // then Add() will take care
+    // of it.
+    //
+	Bitset<ImplTraits>* bitset = new Bitset<ImplTraits>(0);
+	bitset->add(bit);
+	return bitset;
+}
+
+template <class ImplTraits>
+Bitset<ImplTraits>* Bitset<ImplTraits>::BitsetOf(ANTLR_INT32 bit1, ANTLR_INT32 bit2)
+{
+	Bitset<ImplTraits>* bitset = Bitset<ImplTraits>::BitsetOf(bit1);
+	bitset->add(bit2);
+	return bitset;
+}
+
+//static 
+template <class ImplTraits>
+Bitset<ImplTraits>* Bitset<ImplTraits>::BitsetFromList(const IntListType& list)
+{
+	// We have no idea what exactly is in the list
+    // so create a default bitset and then just add stuff
+    // as we enumerate.
+    //
+    Bitset<ImplTraits>* bitset  = new Bitset<ImplTraits>(0);
+	for( int i = 0; i < list.size(); ++i )
+		bitset->add( list[i] );
+
+	return bitset;
+}
+
+ANTLR_END_NAMESPACE()
diff --git a/runtime/Cpp/include/antlr3collections.hpp b/runtime/Cpp/include/antlr3collections.hpp
new file mode 100755
index 0000000..2111403
--- /dev/null
+++ b/runtime/Cpp/include/antlr3collections.hpp
@@ -0,0 +1,285 @@
+#ifndef	ANTLR3COLLECTIONS_HPP
+#define	ANTLR3COLLECTIONS_HPP
+
+// [The "BSD licence"]
+// Copyright (c) 2005-2009 Gokulakannan Somasundaram, ElectronDB
+
+//
+// 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.
+
+#include    "antlr3defs.hpp"
+
+ANTLR_BEGIN_NAMESPACE()
+
+/* -------------- TRIE Interfaces ---------------- */
+
+/** Structure that holds the payload entry in an ANTLR3_INT_TRIE or ANTLR3_STRING_TRIE
+ */
+template< class ImplTraits, class DataType >
+class TrieEntry : public ImplTraits::AllocPolicyType
+{
+public:
+	typedef typename ImplTraits::AllocPolicyType AllocPolicy;
+
+private:
+	DataType			m_data;
+	TrieEntry*			m_next;	    /* Allows duplicate entries for same key in insertion order	*/
+
+public:
+	TrieEntry(const DataType& data, TrieEntry* next);
+	DataType& get_data();
+	const DataType& get_data() const;
+	TrieEntry* get_next() const;
+	void set_next( TrieEntry* next );
+};
+
+/** Structure that defines an element/node in an ANTLR_INT_TRIE
+ */
+template< class ImplTraits, class DataType >
+class IntTrieNode : public ImplTraits::AllocPolicyType
+{
+public:
+	typedef TrieEntry<ImplTraits, DataType> TrieEntryType;
+	typedef TrieEntryType BucketsType;
+	
+private:
+    ANTLR_UINT32	m_bitNum;	/**< This is the left/right bit index for traversal along the nodes				*/
+    ANTLR_INTKEY	m_key;		/**< This is the actual key that the entry represents if it is a terminal node  */
+    BucketsType*	m_buckets;	/**< This is the data bucket(s) that the key indexes, which may be NULL			*/
+    IntTrieNode*	m_leftN;	/**< Pointer to the left node from here when sKey & bitNum = 0					*/
+    IntTrieNode*	m_rightN;	/**< Pointer to the right node from here when sKey & bitNum, = 1				*/
+
+public:
+	IntTrieNode();
+	~IntTrieNode();
+
+	ANTLR_UINT32 get_bitNum() const;
+	ANTLR_INTKEY get_key() const;
+	BucketsType* get_buckets() const;
+	IntTrieNode* get_leftN() const;
+	IntTrieNode* get_rightN() const;
+	void  set_bitNum( ANTLR_UINT32 bitNum );
+	void  set_key( ANTLR_INTKEY key );
+	void  set_buckets( BucketsType* buckets );
+	void  set_leftN( IntTrieNode* leftN );
+	void  set_rightN( IntTrieNode* rightN );
+};
+  
+/** Structure that defines an ANTLR3_INT_TRIE. For this particular implementation,
+ *  as you might expect, the key is turned into a "string" by looking at bit(key, depth)
+ *  of the integer key. Using 64 bit keys gives us a depth limit of 64 (or bit 0..63)
+ *  and potentially a huge trie. This is the algorithm for a Patricia Trie.
+ *  Note also that this trie [can] accept multiple entries for the same key and is
+ *  therefore a kind of elastic bucket patricia trie.
+ *
+ *  If you find this code useful, please feel free to 'steal' it for any purpose
+ *  as covered by the BSD license under which ANTLR is issued. You can cut the code
+ *  but as the ANTLR library is only about 50K (Windows Vista), you might find it 
+ *  easier to just link the library. Please keep all comments and licenses and so on
+ *  in any version of this you create of course.
+ *
+ *  Jim Idle.
+ *  
+ */
+class IntTrieBase
+{
+public:
+	static const ANTLR_UINT8* get_bitIndex();
+	static const ANTLR_UINT64* get_bitMask();
+};
+ 
+template< class ImplTraits, class DataType >
+class IntTrie : public ImplTraits::AllocPolicyType, public IntTrieBase
+{
+public:
+	typedef TrieEntry<ImplTraits, DataType> TrieEntryType;
+	typedef IntTrieNode<ImplTraits, DataType> IntTrieNodeType;
+	
+private:
+    IntTrieNodeType*	m_root;			/* Root node of this integer trie					*/
+    IntTrieNodeType*	m_current;		/* Used to traverse the TRIE with the next() method	*/
+    ANTLR_UINT32	m_count;			/* Current entry count								*/
+    bool			m_allowDups;		/* Whether this trie accepts duplicate keys			*/
+
+public:
+	/* INT TRIE Implementation of depth 64 bits, being the number of bits
+	 * in a 64 bit integer. 
+	 */
+    IntTrie( ANTLR_UINT32 depth );
+
+	/** Search the int Trie and return a pointer to the first bucket indexed
+	 *  by the key if it is contained in the trie, otherwise NULL.
+	 */
+    TrieEntryType*	get( ANTLR_INTKEY key);
+    bool		del( ANTLR_INTKEY key);
+
+	/** Add an entry into the INT trie.
+	 *  Basically we descend the trie as we do when searching it, which will
+	 *  locate the only node in the trie that can be reached by the bit pattern of the
+	 *  key. If the key is actually at that node, then if the trie accepts duplicates
+	 *  we add the supplied data in a new chained bucket to that data node. If it does
+	 *  not accept duplicates then we merely return FALSE in case the caller wants to know
+	 *  whether the key was already in the trie.
+	 *  If the node we locate is not the key we are looking to add, then we insert a new node
+	 *  into the trie with a bit index of the leftmost differing bit and the left or right 
+	 *  node pointing to itself or the data node we are inserting 'before'. 
+	 */
+    bool		add( ANTLR_INTKEY key, const DataType& data );
+    ~IntTrie();
+};
+
+/**
+ * A topological sort system that given a set of dependencies of a node m on node n,
+ * can sort them in dependency order. This is a generally useful utility object
+ * that does not care what the things are it is sorting. Generally the set
+ * to be sorted will be numeric indexes into some other structure such as an ANTLR3_VECTOR.
+ * I have provided a sort method that given ANTLR3_VECTOR as an input will sort
+ * the vector entries in place, as well as a sort method that just returns an
+ * array of the sorted noded indexes, in case you are not sorting ANTLR3_VECTORS but
+ * some set of your own device.
+ *
+ * Of the two main algorithms that could be used, I chose to use the depth first
+ * search for unvisited nodes as a) This runs in linear time, and b) it is what
+ * we used in the ANTLR Tool to perform a topological sort of the input grammar files
+ * based on their dependencies.
+ */
+template<class ImplTraits>
+class Topo : public ImplTraits::AllocPolicyType
+{
+public:
+	typedef typename ImplTraits::BitsetType BitsetType;
+	typedef typename ImplTraits::AllocPolicyType AllocPolicyType;
+
+private:
+    /**
+     * A vector of vectors of edges, built by calling the addEdge method()
+     * to indicate that node number n depends on node number m. Each entry in the vector
+     * contains a bitset, which has a bit index set for each node upon which the
+     * entry node depends.
+     */
+    BitsetType**	m_edges;
+
+    /**
+     * A vector used to build up the sorted output order. Note that
+     * as the vector contains UINT32 then the maximum node index is
+     * 'limited' to 2^32, as nodes should be zero based.
+     */
+    ANTLR_UINT32*				m_sorted;
+
+    /**
+     * A vector used to detect cycles in the edge dependecies. It is used
+     * as a stack and each time we descend a node to one of its edges we
+     * add the node into this stack. If we find a node that we have already
+     * visited in the stack, then it means there wasa cycle such as 9->8->1->9
+     * as the only way a node can be on the stack is if we are currently
+     * descnding from it as we remove it from the stack as we exit from
+     * descending its dependencies
+     */
+    ANTLR_UINT32*		m_cycle;
+
+    /**
+     * A flag that indicates the algorithm found a cycle in the edges
+     * such as 9->8->1->9
+     * If this flag is set after you have called one of the sort routines
+     * then the detected cycle will be contained in the cycle array and
+     * cycleLimit will point to the one after the last entry in the cycle.
+     */
+    bool				m_hasCycle;
+
+    /**
+     * A watermark used to accumulate potential cycles in the cycle array.
+     * This should be zero when we are done. Check hasCycle after calling one
+     * of the sort methods and if it is true then you can find the cycle
+     * in cycle[0]...cycle[cycleMark-1]
+     */
+    ANTLR_UINT32		m_cycleMark;
+    
+    /**
+     * One more than the largest node index that is contained in edges/sorted.
+     */
+    ANTLR_UINT32		m_limit;
+
+    /**
+     * The set of visited nodes as determined by a set entry in
+     * the bitmap.
+     */
+    BitsetType*			m_visited;
+
+public:
+	Topo();
+    /**
+     * A method that adds an edge from one node to another. An edge
+     * of n -> m indicates that node n is dependent on node m. Note that
+     * while building these edges, it is perfectly OK to add nodes out of
+     * sequence. So, if you have edges:
+     *
+     * 3 -> 0
+     * 2 -> 1
+     * 1 -> 3
+     *
+     * The you can add them in that order and so add node 3 before nodes 2 and 1
+     *
+     */
+    void  addEdge(ANTLR_UINT32 edge, ANTLR_UINT32 dependency);
+
+
+    /**
+     * A method that returns a pointer to an array of sorted node indexes.
+     * The array is sorted in topological sorted order. Note that the array
+     * is only as large as the largest node index you created an edge for. This means
+     * that if you had an input of 32 nodes, but that largest node with an edge
+     * was 16, then the returned array will be the sorted order of the first 16
+     * nodes and the last 16 nodes of your array are basically fine as they are
+     * as they had no dependencies and do not need any particular sort order.
+     *
+     * NB: If the structure that contains the array is freed, then the sorted
+     * array will be freed too so you should use the value of limit to
+     * make a long term copy of this array if you do not want to keep the topo
+     * structure around as well.
+     */
+    ANTLR_UINT32*  sortToArray();
+
+    /** 
+     * A method that sorts the supplied ANTLR3_VECTOR in place based
+     * on the previously supplied edge data.
+     */
+	template<typename DataType>
+    void   sortVector( typename ImplTraits::template VectorType<DataType>& v);
+
+	void   DFS(ANTLR_UINT32 node);
+
+    /**
+     *  A method to free this structure and any associated memory.
+     */
+	~Topo();
+};
+
+ANTLR_END_NAMESPACE()
+
+#include "antlr3collections.inl"
+    
+#endif
+
+
diff --git a/runtime/Cpp/include/antlr3collections.inl b/runtime/Cpp/include/antlr3collections.inl
new file mode 100755
index 0000000..fb713c2
--- /dev/null
+++ b/runtime/Cpp/include/antlr3collections.inl
@@ -0,0 +1,995 @@
+ANTLR_BEGIN_NAMESPACE()
+
+template< class ImplTraits, class DataType >
+ANTLR_INLINE TrieEntry<ImplTraits, DataType>::TrieEntry(const DataType& data, TrieEntry* next)
+	:m_data(data)
+{
+	m_next = next;
+}
+template< class ImplTraits, class DataType >
+ANTLR_INLINE DataType& TrieEntry<ImplTraits, DataType>::get_data()
+{
+	return m_data;
+}
+template< class ImplTraits, class DataType >
+ANTLR_INLINE const DataType& TrieEntry<ImplTraits, DataType>::get_data() const
+{
+	return m_data;
+}
+template< class ImplTraits, class DataType >
+ANTLR_INLINE TrieEntry<ImplTraits, DataType>* TrieEntry<ImplTraits, DataType>::get_next() const
+{
+	return m_next;
+}
+
+template< class ImplTraits, class DataType >
+ANTLR_INLINE void TrieEntry<ImplTraits, DataType>::set_next( TrieEntry* next )
+{
+	m_next = next;
+}
+
+template< class ImplTraits, class DataType >
+ANTLR_INLINE ANTLR_UINT32 IntTrieNode<ImplTraits, DataType>::get_bitNum() const
+{
+	return m_bitNum;
+}
+template< class ImplTraits, class DataType >
+ANTLR_INLINE ANTLR_INTKEY IntTrieNode<ImplTraits, DataType>::get_key() const
+{
+	return m_key;
+}
+template< class ImplTraits, class DataType >
+ANTLR_INLINE typename IntTrieNode<ImplTraits, DataType>::BucketsType* IntTrieNode<ImplTraits, DataType>::get_buckets() const
+{
+	return m_buckets;
+}
+template< class ImplTraits, class DataType >
+ANTLR_INLINE IntTrieNode<ImplTraits, DataType>* IntTrieNode<ImplTraits, DataType>::get_leftN() const
+{
+	return m_leftN;
+}
+template< class ImplTraits, class DataType >
+ANTLR_INLINE IntTrieNode<ImplTraits, DataType>* IntTrieNode<ImplTraits, DataType>::get_rightN() const
+{
+	return m_rightN;
+}
+template< class ImplTraits, class DataType >
+ANTLR_INLINE void IntTrieNode<ImplTraits, DataType>::set_bitNum( ANTLR_UINT32 bitNum )
+{
+	m_bitNum = bitNum;
+}
+template< class ImplTraits, class DataType >
+ANTLR_INLINE void IntTrieNode<ImplTraits, DataType>::set_key( ANTLR_INTKEY key )
+{
+	m_key = key;
+}
+template< class ImplTraits, class DataType >
+ANTLR_INLINE void IntTrieNode<ImplTraits, DataType>::set_buckets( BucketsType* buckets )
+{
+	m_buckets = buckets;
+}
+template< class ImplTraits, class DataType >
+ANTLR_INLINE void IntTrieNode<ImplTraits, DataType>::set_leftN( IntTrieNode* leftN )
+{
+	m_leftN = leftN;
+}
+template< class ImplTraits, class DataType >
+ANTLR_INLINE void IntTrieNode<ImplTraits, DataType>::set_rightN( IntTrieNode* rightN )
+{
+	m_rightN = rightN;
+}
+
+ANTLR_INLINE const ANTLR_UINT8* IntTrieBase::get_bitIndex()
+{
+	static ANTLR_UINT8 bitIndex[256] = 
+	{ 
+		0,													// 0 - Just for padding
+		0,													// 1
+		1, 1,												// 2..3
+		2, 2, 2, 2,											// 4..7
+		3, 3, 3, 3, 3, 3, 3, 3,								// 8+
+		4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,	    // 16+
+		5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,	    // 32+
+		5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,	    
+		6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,	    // 64+
+		6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+		6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+		6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 
+		7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,	    // 128+
+		7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+		7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+		7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+		7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+		7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+		7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+		7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
+	};
+	return bitIndex;
+}
+
+ANTLR_INLINE const ANTLR_UINT64* IntTrieBase::get_bitMask()
+{
+	static ANTLR_UINT64 bitMask[64] = 
+	{
+		0x0000000000000001ULL, 0x0000000000000002ULL, 0x0000000000000004ULL, 0x0000000000000008ULL,
+		0x0000000000000010ULL, 0x0000000000000020ULL, 0x0000000000000040ULL, 0x0000000000000080ULL,
+		0x0000000000000100ULL, 0x0000000000000200ULL, 0x0000000000000400ULL, 0x0000000000000800ULL,
+		0x0000000000001000ULL, 0x0000000000002000ULL, 0x0000000000004000ULL, 0x0000000000008000ULL,
+		0x0000000000010000ULL, 0x0000000000020000ULL, 0x0000000000040000ULL, 0x0000000000080000ULL,
+		0x0000000000100000ULL, 0x0000000000200000ULL, 0x0000000000400000ULL, 0x0000000000800000ULL,
+		0x0000000001000000ULL, 0x0000000002000000ULL, 0x0000000004000000ULL, 0x0000000008000000ULL,
+		0x0000000010000000ULL, 0x0000000020000000ULL, 0x0000000040000000ULL, 0x0000000080000000ULL,
+		0x0000000100000000ULL, 0x0000000200000000ULL, 0x0000000400000000ULL, 0x0000000800000000ULL,
+		0x0000001000000000ULL, 0x0000002000000000ULL, 0x0000004000000000ULL, 0x0000008000000000ULL,
+		0x0000010000000000ULL, 0x0000020000000000ULL, 0x0000040000000000ULL, 0x0000080000000000ULL,
+		0x0000100000000000ULL, 0x0000200000000000ULL, 0x0000400000000000ULL, 0x0000800000000000ULL,
+		0x0001000000000000ULL, 0x0002000000000000ULL, 0x0004000000000000ULL, 0x0008000000000000ULL,
+		0x0010000000000000ULL, 0x0020000000000000ULL, 0x0040000000000000ULL, 0x0080000000000000ULL,
+		0x0100000000000000ULL, 0x0200000000000000ULL, 0x0400000000000000ULL, 0x0800000000000000ULL,
+		0x1000000000000000ULL, 0x2000000000000000ULL, 0x4000000000000000ULL, 0x8000000000000000ULL
+	};
+
+	return bitMask;
+}
+
+template< class ImplTraits, class DataType >
+IntTrie<ImplTraits, DataType>::IntTrie( ANTLR_UINT32 depth )
+{
+	/* Now we need to allocate the root node. This makes it easier
+	 * to use the tree as we don't have to do anything special 
+	 * for the root node.
+	 */
+	m_root	= new IntTrieNodeType;
+
+	/* Now we seed the root node with the index being the
+	 * highest left most bit we want to test, which limits the
+	 * keys in the trie. This is the trie 'depth'. The limit for
+	 * this implementation is 63 (bits 0..63).
+	 */
+	m_root->set_bitNum( depth );
+
+	/* And as we have nothing in here yet, we set both child pointers
+	 * of the root node to point back to itself.
+	 */
+	m_root->set_leftN( m_root );
+	m_root->set_rightN( m_root );
+	m_count			= 0;
+
+	/* Finally, note that the key for this root node is 0 because
+	 * we use calloc() to initialise it.
+	 */
+	m_allowDups = false;
+	m_current   = NULL;
+}
+
+template< class ImplTraits, class DataType >
+IntTrie<ImplTraits, DataType>::~IntTrie()
+{
+    /* Descend from the root and free all the nodes
+     */
+    delete m_root;
+
+    /* the nodes are all gone now, so we need only free the memory
+     * for the structure itself
+     */
+}
+
+template< class ImplTraits, class DataType >
+typename IntTrie<ImplTraits, DataType>::TrieEntryType*	IntTrie<ImplTraits, DataType>::get( ANTLR_INTKEY key)
+{
+	IntTrieNodeType*    thisNode; 
+	IntTrieNodeType*    nextNode; 
+
+	if (m_count == 0)
+		return NULL;	    /* Nothing in this trie yet	*/
+
+	/* Starting at the root node in the trie, compare the bit index
+	 * of the current node with its next child node (starts left from root).
+	 * When the bit index of the child node is greater than the bit index of the current node
+	 * then by definition (as the bit index decreases as we descent the trie)
+	 * we have reached a 'backward' pointer. A backward pointer means we
+	 * have reached the only node that can be reached by the bits given us so far
+	 * and it must either be the key we are looking for, or if not then it
+	 * means the entry was not in the trie, and we return NULL. A backward pointer
+	 * points back in to the tree structure rather than down (deeper) within the
+	 * tree branches.
+	 */
+	thisNode	= m_root;		/* Start at the root node		*/
+	nextNode	= thisNode->get_leftN();	/* Examine the left node from the root	*/
+
+	/* While we are descending the tree nodes...
+	 */
+	const ANTLR_UINT64* bitMask = this->get_bitMask();
+	while( thisNode->get_bitNum() > nextNode->get_bitNum() )
+	{
+		/* Next node now becomes the new 'current' node
+		 */
+		thisNode    = nextNode;
+
+		/* We now test the bit indicated by the bitmap in the next node
+		 * in the key we are searching for. The new next node is the
+		 * right node if that bit is set and the left node it is not.
+		 */
+		if (key & bitMask[nextNode->get_bitNum()])
+		{
+			nextNode = nextNode->get_rightN();	/* 1 is right	*/
+		}
+		else
+		{
+			nextNode = nextNode->get_leftN();		/* 0 is left	*/
+		}
+	}
+
+	/* Here we have reached a node where the bitMap index is lower than
+	 * its parent. This means it is pointing backward in the tree and
+	 * must therefore be a terminal node, being the only point than can
+	 * be reached with the bits seen so far. It is either the actual key
+	 * we wanted, or if that key is not in the trie it is another key
+	 * that is currently the only one that can be reached by those bits.
+	 * That situation would obviously change if the key was to be added
+	 * to the trie.
+	 *
+	 * Hence it only remains to test whether this is actually the key or not.
+	 */
+	if (nextNode->get_key() == key)
+	{
+		/* This was the key, so return the entry pointer
+		 */
+		return	nextNode->get_buckets();
+	}
+	else
+	{
+		return	NULL;	/* That key is not in the trie (note that we set the pointer to -1 if no payload) */
+	}
+}
+
+template< class ImplTraits, class DataType >
+bool	IntTrie<ImplTraits, DataType>::del( ANTLR_INTKEY key)
+{
+    IntTrieNodeType*   p;
+
+    p = m_root;
+    
+    return false;
+
+}
+
+template< class ImplTraits, class DataType >
+bool	IntTrie<ImplTraits, DataType>::add( ANTLR_INTKEY key, const DataType& data  )
+{
+	IntTrieNodeType*   thisNode;
+	IntTrieNodeType*   nextNode;
+	IntTrieNodeType*   entNode;
+	ANTLR_UINT32	depth;
+	TrieEntryType*	    newEnt;
+	TrieEntryType*	    nextEnt;
+	ANTLR_INTKEY		    xorKey;
+
+	/* Cache the bit depth of this trie, which is always the highest index, 
+	 * which is in the root node
+	 */
+	depth   = m_root->get_bitNum();
+
+	thisNode	= m_root;		/* Start with the root node	    */
+	nextNode	= m_root->get_leftN();	/* And assume we start to the left  */
+
+	/* Now find the only node that can be currently reached by the bits in the
+	 * key we are being asked to insert.
+	 */
+	const ANTLR_UINT64* bitMask = this->get_bitMask();
+	while (thisNode->get_bitNum()  > nextNode->get_bitNum() )
+	{
+		/* Still descending the structure, next node becomes current.
+		 */
+		thisNode = nextNode;
+
+		if (key & bitMask[nextNode->get_bitNum()])
+		{
+			/* Bit at the required index was 1, so travers the right node from here
+			 */
+			nextNode = nextNode->get_rightN();
+		}
+		else
+		{
+			/* Bit at the required index was 0, so we traverse to the left
+			 */
+			nextNode = nextNode->get_leftN();
+		}
+	}
+	/* Here we have located the only node that can be reached by the
+	 * bits in the requested key. It could in fact be that key or the node
+	 * we need to use to insert the new key.
+	 */
+	if (nextNode->get_key() == key)
+	{
+		/* We have located an exact match, but we will only append to the bucket chain
+		 * if this trie accepts duplicate keys.
+		 */
+		if (m_allowDups ==true)
+		{
+			/* Yes, we are accepting duplicates
+			 */
+			newEnt = new TrieEntryType(data, NULL);
+
+			/* We want to be able to traverse the stored elements in the order that they were
+			 * added as duplicate keys. We might need to revise this opinion if we end up having many duplicate keys
+			 * as perhaps reverse order is just as good, so long as it is ordered.
+			 */
+			nextEnt = nextNode->get_buckets();
+			while (nextEnt->get_next() != NULL)
+			{
+				nextEnt = nextEnt->get_next();    
+			}
+			nextEnt->set_next(newEnt);
+
+			m_count++;
+			return  true;
+		}
+		else
+		{
+			/* We found the key is already there and we are not allowed duplicates in this
+			 * trie.
+			 */
+			return  false;
+		}
+	}
+
+	/* Here we have discovered the only node that can be reached by the bits in the key
+	 * but we have found that this node is not the key we need to insert. We must find the
+	 * the leftmost bit by which the current key for that node and the new key we are going 
+	 * to insert, differ. While this nested series of ifs may look a bit strange, experimentation
+	 * showed that it allows a machine code path that works well with predicated execution
+	 */
+	xorKey = (key ^ nextNode->get_key() );   /* Gives 1 bits only where they differ then we find the left most 1 bit*/
+
+	/* Most common case is a 32 bit key really
+	 */
+	const ANTLR_UINT8* bitIndex = this->get_bitIndex();
+#ifdef	ANTLR_USE_64BIT
+	if	(xorKey & 0xFFFFFFFF00000000)
+	{
+		if  (xorKey & 0xFFFF000000000000)
+		{
+			if	(xorKey & 0xFF00000000000000)
+			{
+				depth = 56 + bitIndex[((xorKey & 0xFF00000000000000)>>56)];
+			}
+			else
+			{
+				depth = 48 + bitIndex[((xorKey & 0x00FF000000000000)>>48)];
+			}
+		}
+		else
+		{
+			if	(xorKey & 0x0000FF0000000000)
+			{
+				depth = 40 + bitIndex[((xorKey & 0x0000FF0000000000)>>40)];
+			}
+			else
+			{
+				depth = 32 + bitIndex[((xorKey & 0x000000FF00000000)>>32)];
+			}
+		}
+	}
+	else
+#endif
+	{
+		if  (xorKey & 0x00000000FFFF0000)
+		{
+			if	(xorKey & 0x00000000FF000000)
+			{
+				depth = 24 + bitIndex[((xorKey & 0x00000000FF000000)>>24)];
+			}
+			else
+			{
+				depth = 16 + bitIndex[((xorKey & 0x0000000000FF0000)>>16)];
+			}
+		}
+		else
+		{
+			if	(xorKey & 0x000000000000FF00)
+			{
+				depth = 8 + bitIndex[((xorKey & 0x0000000000000FF00)>>8)];
+			}
+			else
+			{
+				depth = bitIndex[xorKey & 0x00000000000000FF];
+			}
+		}
+	}
+
+    /* We have located the leftmost differing bit, indicated by the depth variable. So, we know what
+     * bit index we are to insert the new entry at. There are two cases, being where the two keys
+     * differ at a bit position that is not currently part of the bit testing, where they differ on a bit
+     * that is currently being skipped in the indexed comparisons, and where they differ on a bit
+     * that is merely lower down in the current bit search. If the bit index went bit 4, bit 2 and they differ
+     * at bit 3, then we have the "skipped" bit case. But if that chain was Bit 4, Bit 2 and they differ at bit 1
+     * then we have the easy bit <pun>.
+     *
+     * So, set up to descend the tree again, but this time looking for the insert point
+     * according to whether we skip the bit that differs or not.
+     */
+    thisNode	= m_root;
+    entNode	= m_root->get_leftN();
+
+    /* Note the slight difference in the checks here to cover both cases
+     */
+    while (thisNode->get_bitNum() > entNode->get_bitNum() && entNode->get_bitNum() > depth)
+    {
+		/* Still descending the structure, next node becomes current.
+		 */
+		thisNode = entNode;
+
+		if (key & bitMask[entNode->get_bitNum()])
+		{
+			/* Bit at the required index was 1, so traverse the right node from here
+			 */
+			entNode = entNode->get_rightN();
+		}
+		else
+		{
+			/* Bit at the required index was 0, so we traverse to the left
+			 */
+			entNode = entNode->get_leftN();
+		}
+    }
+
+    /* We have located the correct insert point for this new key, so we need
+     * to allocate our entry and insert it etc.
+     */
+    nextNode	= new IntTrieNodeType();
+
+    /* Build a new entry block for the new node
+     */
+    newEnt = new TrieEntryType(data, NULL);
+
+	/* Install it
+     */
+    nextNode->set_buckets(newEnt);
+    nextNode->set_key(key);
+    nextNode->set_bitNum( depth );
+
+    /* Work out the right and left pointers for this new node, which involve
+     * terminating with the current found node either right or left according
+     * to whether the current index bit is 1 or 0
+     */
+    if (key & bitMask[depth])
+    {
+		nextNode->set_leftN(entNode);	    /* Terminates at previous position	*/
+		nextNode->set_rightN(nextNode);	    /* Terminates with itself		*/
+    }
+    else
+    {
+		nextNode->set_rightN(entNode);	    /* Terminates at previous position	*/
+		nextNode->set_leftN(nextNode);	    /* Terminates with itself		*/		
+    }
+
+    /* Finally, we need to change the pointers at the node we located
+     * for inserting. If the key bit at its index is set then the right
+     * pointer for that node becomes the newly created node, otherwise the left 
+     * pointer does.
+     */
+    if (key & bitMask[thisNode->get_bitNum()] )
+    {
+		thisNode->set_rightN( nextNode );
+    }
+    else
+    {
+		thisNode->set_leftN(nextNode);
+    }
+
+    /* Et voila
+     */
+    m_count++;
+    return  true;
+}
+
+template< class ImplTraits, class DataType >
+IntTrieNode<ImplTraits, DataType>::IntTrieNode()
+{
+	m_bitNum = 0;
+	m_key = 0;
+	m_buckets = NULL;
+	m_leftN = NULL;
+	m_rightN = NULL;
+}
+
+template< class ImplTraits, class DataType >
+IntTrieNode<ImplTraits, DataType>::~IntTrieNode()
+{
+	TrieEntryType*	thisEntry;
+    TrieEntryType*	nextEntry;
+
+    /* If this node has a left pointer that is not a back pointer
+     * then recursively call to free this
+     */
+    if ( m_bitNum > m_leftN->get_bitNum())
+    {
+		/* We have a left node that needs descending, so do it.
+		 */
+		delete m_leftN;
+    }
+
+    /* The left nodes from here should now be dealt with, so 
+     * we need to descend any right nodes that are not back pointers
+     */
+    if ( m_bitNum > m_rightN->get_bitNum() )
+    {
+		/* There are some right nodes to descend and deal with.
+		 */
+		delete m_rightN;
+    }
+
+    /* Now all the children are dealt with, we can destroy
+     * this node too
+     */
+    thisEntry	= m_buckets;
+
+    while (thisEntry != NULL)
+    {
+		nextEntry   = thisEntry->get_next();
+
+		/* Now free the data for this bucket entry
+		 */
+		delete thisEntry;
+		thisEntry = nextEntry;	    /* See if there are any more to free    */
+    }
+
+    /* The bucket entry is now gone, so we can free the memory for
+     * the entry itself.
+     */
+
+    /* And that should be it for everything under this node and itself
+     */
+}
+
+/**
+ * Allocate and initialize a new ANTLR3 topological sorter, which can be
+ * used to define edges that identify numerical node indexes that depend on other
+ * numerical node indexes, which can then be sorted topologically such that
+ * any node is sorted after all its dependent nodes.
+ *
+ * Use:
+ *
+ * /verbatim
+
+  pANTLR3_TOPO topo;
+  topo = antlr3NewTopo();
+
+  if (topo == NULL) { out of memory }
+
+  topo->addEdge(topo, 3, 0); // Node 3 depends on node 0
+  topo->addEdge(topo, 0, 1); // Node - depends on node 1
+  topo->sortVector(topo, myVector); // Sort the vector in place (node numbers are the vector entry numbers)
+
+ * /verbatim
+ */
+template<class ImplTraits>
+Topo<ImplTraits>::Topo()
+{
+    // Initialize variables
+    //
+    m_visited   = NULL;                 // Don't know how big it is yet
+    m_limit     = 1;                    // No edges added yet
+    m_edges     = NULL;                 // No edges added yet
+    m_sorted    = NULL;                 // Nothing sorted at the start
+    m_cycle     = NULL;                 // No cycles at the start
+    m_cycleMark = 0;                    // No cycles at the start
+    m_hasCycle  = false;         // No cycle at the start
+}
+
+// Topological sorter
+//
+template<class ImplTraits>
+void Topo<ImplTraits>::addEdge(ANTLR_UINT32 edge, ANTLR_UINT32 dependency)
+{
+	ANTLR_UINT32   i;
+    ANTLR_UINT32   maxEdge;
+    BitsetType*  edgeDeps;
+
+    if (edge>dependency)
+    {
+        maxEdge = edge;
+    }
+    else
+    {
+        maxEdge = dependency;
+    }
+    // We need to add an edge to says that the node indexed by 'edge' is
+    // dependent on the node indexed by 'dependency'
+    //
+
+    // First see if we have enough room in the edges array to add the edge?
+    //
+    if ( m_edges == NULL)
+    {
+        // We don't have any edges yet, so create an array to hold them
+        //
+        m_edges = AllocPolicyType::alloc0(sizeof(BitsetType*) * (maxEdge + 1));
+
+        // Set the limit to what we have now
+        //
+        m_limit = maxEdge + 1;
+    }
+    else if (m_limit <= maxEdge)
+    {
+        // WE have some edges but not enough
+        //
+        m_edges = AllocPolicyType::realloc(m_edges, sizeof(BitsetType*) * (maxEdge + 1));
+
+        // Initialize the new bitmaps to ;indicate we have no edges defined yet
+        //
+        for (i = m_limit; i <= maxEdge; i++)
+        {
+            *((m_edges) + i) = NULL;
+        }
+
+        // Set the limit to what we have now
+        //
+        m_limit = maxEdge + 1;
+    }
+
+    // If the edge was flagged as depending on itself, then we just
+    // do nothing as it means this routine was just called to add it
+    // in to the list of nodes.
+    //
+    if  (edge == dependency)
+    {
+        return;
+    }
+
+    // Pick up the bit map for the requested edge
+    //
+    edgeDeps = *((m_edges) + edge);
+
+    if  (edgeDeps == NULL)
+    {
+        // No edges are defined yet for this node
+        //
+        edgeDeps                = new BitsetType(0);
+        *((m_edges) + edge) = edgeDeps;
+    }
+
+    // Set the bit in the bitmap that corresponds to the requested
+    // dependency.
+    //
+    edgeDeps->add(dependency);
+
+    // And we are all set
+    //
+    return;
+
+}
+
+/**
+ * Given a starting node, descend its dependent nodes (ones that it has edges
+ * to) until we find one without edges. Having found a node without edges, we have
+ * discovered the bottom of a depth first search, which we can then ascend, adding
+ * the nodes in order from the bottom, which gives us the dependency order.
+ */
+template<class ImplTraits>
+void Topo<ImplTraits>::DFS(ANTLR_UINT32 node)
+{
+	BitsetType* edges;
+
+    // Guard against a revisit and check for cycles
+    //
+    if  (m_hasCycle == true)
+    {
+        return; // We don't do anything else if we found a cycle
+    }
+
+    if  ( m_visited->isMember(node))
+    {
+        // Check to see if we found a cycle. To do this we search the
+        // current cycle stack and see if we find this node already in the stack.
+        //
+        ANTLR_UINT32   i;
+
+        for (i=0; i< m_cycleMark; i++)
+        {
+            if  ( m_cycle[i] == node)
+            {
+                // Stop! We found a cycle in the input, so rejig the cycle
+                // stack so that it only contains the cycle and set the cycle flag
+                // which will tell the caller what happened
+                //
+                ANTLR_UINT32 l;
+
+                for (l = i; l < m_cycleMark; l++)
+                {
+                    m_cycle[l - i] = m_cycle[l];    // Move to zero base in the cycle list
+                }
+
+                // Recalculate the limit
+                //
+                m_cycleMark -= i;
+
+                // Signal disaster
+                //
+                m_hasCycle = true;
+            }
+        }
+        return;
+    }
+
+    // So far, no cycles have been found and we have not visited this node yet,
+    // so this node needs to go into the cycle stack before we continue
+    // then we will take it out of the stack once we have descended all its
+    // dependencies.
+    //
+    m_cycle[m_cycleMark++] = node;
+
+    // First flag that we have visited this node
+    //
+    m_visited->add(node);
+
+    // Now, if this node has edges, then we want to ensure we visit
+    // them all before we drop through and add this node into the sorted
+    // list.
+    //
+    edges = *((m_edges) + node);
+    if  (edges != NULL)
+    {
+        // We have some edges, so visit each of the edge nodes
+        // that have not already been visited.
+        //
+        ANTLR_UINT32   numBits;	    // How many bits are in the set
+        ANTLR_UINT32   i;
+        ANTLR_UINT32   range;
+
+        numBits = edges->numBits();
+        range   = edges->size();   // Number of set bits
+
+        // Stop if we exahust the bit list or have checked the
+        // number of edges that this node refers to (so we don't
+        // check bits at the end that cannot possibly be set).
+        //
+        for (i=0; i<= numBits && range > 0; i++)
+        {
+            if  (edges->isMember(i))
+            {
+                range--;        // About to check another one
+
+                // Found an edge, make sure we visit and descend it
+                //
+                this->DFS(i);
+            }
+        }
+    }
+
+    // At this point we will have visited all the dependencies
+    // of this node and they will be ordered (even if there are cycles)
+    // So we just add the node into the sorted list at the
+    // current index position.
+    //
+    m_sorted[m_limit++] = node;
+
+    // Remove this node from the cycle list if we have not detected a cycle
+    //
+    if  (m_hasCycle == false)
+    {
+        m_cycleMark--;
+    }
+
+    return;
+}
+
+template<class ImplTraits>
+ANTLR_UINT32*  Topo<ImplTraits>::sortToArray()
+{
+	ANTLR_UINT32 v;
+    ANTLR_UINT32 oldLimit;
+
+    // Guard against being called with no edges defined
+    //
+    if  (m_edges == NULL)
+    {
+        return 0;
+    }
+    // First we need a vector to populate with enough
+    // entries to accomodate the sorted list and another to accomodate
+    // the maximum cycle we could detect which is all nodes such as 0->1->2->3->0
+    //
+    m_sorted    = AllocPolicyType::alloc( m_limit * sizeof(ANTLR_UINT32) );
+    m_cycle     = AllocPolicyType::alloc( m_limit * sizeof(ANTLR_UINT32));
+
+    // Next we need an empty bitset to show whether we have visited a node
+    // or not. This is the bit that gives us linear time of course as we are essentially
+    // dropping through the nodes in depth first order and when we get to a node that
+    // has no edges, we pop back up the stack adding the nodes we traversed in reverse
+    // order.
+    //
+    m_visited   = new BitsetType(0);
+
+    // Now traverse the nodes as if we were just going left to right, but
+    // then descend each node unless it has already been visited.
+    //
+    oldLimit    = m_limit;     // Number of nodes to traverse linearly
+    m_limit = 0;               // Next entry in the sorted table
+
+    for (v = 0; v < oldLimit; v++)
+    {
+        // If we did not already visit this node, then descend it until we
+        // get a node without edges or arrive at a node we have already visited.
+        //
+        if  (m_visited->isMember(v) == false)
+        {
+            // We have not visited this one so descend it
+            //
+            this->DFS(v);
+        }
+
+        // Break the loop if we detect a cycle as we have no need to go any
+        // further
+        //
+        if  (m_hasCycle == true)
+        {
+            break;
+        }
+    }
+
+    // Reset the limit to the number we recorded as if we hit a
+    // cycle, then limit will have stopped at the node where we
+    // discovered the cycle, but in order to free the edge bitmaps
+    // we need to know how many we may have allocated and traverse them all.
+    //
+    m_limit = oldLimit;
+
+    // Having traversed all the nodes we were given, we
+    // are guaranteed to have ordered all the nodes or detected a
+    // cycle.
+    //
+    return m_sorted;
+}
+
+template<class ImplTraits>
+	template<typename DataType>
+void   Topo<ImplTraits>::sortVector(  typename ImplTraits::template VectorType<DataType>& v )
+{
+    // To sort a vector, we first perform the
+    // sort to an array, then use the results to reorder the vector
+    // we are given. This is just a convenience routine that allows you to
+    // sort the children of a tree node into topological order before or
+    // during an AST walk. This can be useful for optimizations that require
+    // dag reorders and also when the input stream defines thigns that are
+    // interdependent and you want to walk the list of the generated trees
+    // for those things in topological order so you can ignore the interdependencies
+    // at that point.
+    //
+    ANTLR_UINT32 i;
+
+    // Used as a lookup index to find the current location in the vector of
+    // the vector entry that was originally at position [0], [1], [2] etc
+    //
+    ANTLR_UINT32*  vIndex;
+
+    // Sort into an array, then we can use the array that is
+    // stored in the topo
+    //
+    if  (this->sortToArray() == 0)
+    {
+        return;     // There were no edges
+    }
+
+    if  (m_hasCycle == true)
+    {
+        return;  // Do nothing if we detected a cycle
+    }
+
+    // Ensure that the vector we are sorting is at least as big as the
+    // the input sequence we were adsked to sort. It does not matter if it is
+    // bigger as thaat probably just means that nodes numbered higher than the
+    // limit had no dependencies and so can be left alone.
+    //
+    if  (m_limit > v.size() )
+    {
+        // We can only sort the entries that we have dude! The caller is
+        // responsible for ensuring the vector is the correct one and is the
+        // correct size etc.
+        //
+        m_limit = v.size();
+    }
+    // We need to know the locations of each of the entries
+    // in the vector as we don't want to duplicate them in a new vector. We
+    // just use an indirection table to get the vector entry for a particular sequence
+    // acording to where we moved it last. Then we can just swap vector entries until
+    // we are done :-)
+    //
+    vIndex = AllocPolicyType::alloc(m_limit * sizeof(ANTLR_UINT32));
+
+    // Start index, each vector entry is located where you think it is
+    //
+    for (i = 0; i < m_limit; i++)
+    {
+        vIndex[i] = i;
+    }
+
+    // Now we traverse the sorted array and moved the entries of
+    // the vector around according to the sort order and the indirection
+    // table we just created. The index telsl us where in the vector the
+    // original element entry n is now located via vIndex[n].
+    //
+    for (i=0; i < m_limit; i++)
+    {
+        ANTLR_UINT32   ind;
+
+        // If the vector entry at i is already the one that it
+        // should be, then we skip moving it of course.
+        //
+        if  (vIndex[m_sorted[i]] == i)
+        {
+            continue;
+        }
+
+        // The vector entry at i, should be replaced with the
+        // vector entry indicated by topo->sorted[i]. The vector entry
+        // at topo->sorted[i] may have already been swapped out though, so we
+        // find where it is now and move it from there to i.
+        //
+        ind     = vIndex[m_sorted[i]];
+		std::swap( v[i], v[ind] );
+
+        // Update our index. The element at i is now the one we wanted
+        // to be sorted here and the element we swapped out is now the
+        // element that was at i just before we swapped it. If you are lost now
+        // don't worry about it, we are just reindexing on the fly is all.
+        //
+        vIndex[m_sorted[i]] = i;
+        vIndex[i] = ind;
+    }
+
+    // Having traversed all the entries, we have sorted the vector in place.
+    //
+    AllocPolicyType::free(vIndex);
+    return;
+}
+
+template<class ImplTraits>
+Topo<ImplTraits>::~Topo()
+{
+    ANTLR_UINT32   i;
+
+    // Free the result vector
+    //
+    if  (m_sorted != NULL)
+    {
+        AllocPolicyType::free(m_sorted);
+    }
+
+    // Free the visited map
+    //
+    if  (m_visited != NULL)
+    {
+		delete m_visited;
+    }
+
+    // Free any edgemaps
+    //
+    if  (m_edges != NULL)
+    {
+        Bitset<AllocPolicyType>* edgeList;
+
+        for (i=0; i<m_limit; i++)
+        {
+            edgeList = *((m_edges) + i);
+            if  (edgeList != NULL)
+            {
+				delete edgeList;
+            }
+        }
+
+        AllocPolicyType::free( m_edges );
+    }
+    m_edges = NULL;
+    
+    // Free any cycle map
+    //
+    if  (m_cycle != NULL)
+    {
+        AllocPolicyType::free(m_cycle);
+    }
+}
+
+
+ANTLR_END_NAMESPACE()
diff --git a/runtime/Cpp/include/antlr3commontoken.hpp b/runtime/Cpp/include/antlr3commontoken.hpp
new file mode 100755
index 0000000..fd306e7
--- /dev/null
+++ b/runtime/Cpp/include/antlr3commontoken.hpp
@@ -0,0 +1,250 @@
+/** \file
+ * \brief Defines the interface for a common token.
+ *
+ * All token streams should provide their tokens using an instance
+ * of this common token. A custom pointer is provided, wher you may attach
+ * a further structure to enhance the common token if you feel the need
+ * to do so. The C runtime will assume that a token provides implementations
+ * of the interface functions, but all of them may be rplaced by your own
+ * implementation if you require it.
+ */
+#ifndef	_ANTLR3_COMMON_TOKEN_HPP
+#define	_ANTLR3_COMMON_TOKEN_HPP
+
+// [The "BSD licence"]
+// Copyright (c) 2005-2009 Gokulakannan Somasundaram, ElectronDB
+
+//
+// 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.
+
+#include    <stdlib.h>
+
+#include    "antlr3defs.hpp"
+
+ANTLR_BEGIN_NAMESPACE()
+
+/** The definition of an ANTLR3 common token structure, which all implementations
+ * of a token stream should provide, installing any further structures in the
+ * custom pointer element of this structure.
+ *
+ * \remark
+ * Token streams are in essence provided by lexers or other programs that serve
+ * as lexers.
+ */
+
+template<class ImplTraits>
+class CommonToken : public ImplTraits::AllocPolicyType
+{
+public:
+	/* Base token types, which all lexer/parser tokens come after in sequence.
+	*/
+	enum TOKEN_TYPE
+	{
+		/** Indicator of an invalid token
+		 */
+		TOKEN_INVALID =	0
+		, EOR_TOKEN_TYPE	
+		/** Imaginary token type to cause a traversal of child nodes in a tree parser
+		 */
+		, TOKEN_DOWN		
+		/** Imaginary token type to signal the end of a stream of child nodes.
+		 */
+		, TOKEN_UP	
+		/** First token that can be used by users/generated code
+		 */
+		, MIN_TOKEN_TYPE =	TOKEN_UP + 1
+
+		/** End of file token
+		 */
+		, TOKEN_EOF =	(ANTLR_CHARSTREAM_EOF & 0xFFFFFFFF)
+	};
+
+	typedef typename ImplTraits::TokenIntStreamType TokenIntStreamType;
+	typedef typename ImplTraits::StringType StringType;
+	typedef typename ImplTraits::InputStreamType InputStreamType;
+	typedef typename ImplTraits::StreamDataType StreamDataType;
+
+private:
+    /** The actual type of this token
+     */
+    ANTLR_UINT32   m_type;
+
+	/** The virtual channel that this token exists in.
+     */
+    ANTLR_UINT32	m_channel;
+	
+	mutable StringType		m_tokText;
+
+    /** The offset into the input stream that the line in which this
+     *  token resides starts.
+     */
+	const StreamDataType*	m_lineStart;
+
+	/** The line number in the input stream where this token was derived from
+     */
+    ANTLR_UINT32	m_line;
+
+    /** The character position in the line that this token was derived from
+     */
+    ANTLR_INT32		m_charPositionInLine;
+
+    /** Pointer to the input stream that this token originated in.
+     */
+    InputStreamType*    m_input;
+
+    /** What the index of this token is, 0, 1, .., n-2, n-1 tokens
+     */
+    ANTLR_MARKER		m_index;
+
+    /** The character offset in the input stream where the text for this token
+     *  starts.
+     */
+    ANTLR_MARKER		m_startIndex;
+
+    /** The character offset in the input stream where the text for this token
+     *  stops.
+     */
+    ANTLR_MARKER		m_stopIndex;
+
+public:
+	CommonToken();
+	CommonToken(ANTLR_UINT32 type);
+	CommonToken(TOKEN_TYPE type);
+	CommonToken( const CommonToken& ctoken );
+
+	CommonToken& operator=( const CommonToken& ctoken );
+	bool operator==( const CommonToken& ctoken ) const;
+	bool operator<( const CommonToken& ctoken ) const;
+
+	InputStreamType* get_input() const;
+	ANTLR_MARKER get_index() const;
+	void set_index( ANTLR_MARKER index );
+	void set_input( InputStreamType* input );
+
+    /* ==============================
+     * API 
+     */
+
+    /** Function that returns the text pointer of a token, use
+     *  toString() if you want a pANTLR3_STRING version of the token.
+     */
+    StringType  getText() const;
+	
+    /** Pointer to a function that 'might' be able to set the text associated
+     *  with a token. Imaginary tokens such as an ANTLR3_CLASSIC_TOKEN may actually
+     *  do this, however many tokens such as ANTLR3_COMMON_TOKEN do not actaully have
+     *  strings associated with them but just point into the current input stream. These
+     *  tokens will implement this function with a function that errors out (probably
+     *  drastically.
+     */
+    void set_tokText( const StringType& text );
+
+    /** Pointer to a function that 'might' be able to set the text associated
+     *  with a token. Imaginary tokens such as an ANTLR3_CLASSIC_TOKEN may actually
+     *  do this, however many tokens such as ANTLR3_COMMON_TOKEN do not actully have
+     *  strings associated with them but just point into the current input stream. These
+     *  tokens will implement this function with a function that errors out (probably
+     *  drastically.
+     */
+    void	setText(ANTLR_UINT8* text);
+	void	setText(const char* text);
+
+    /** Pointer to a function that returns the token type of this token
+     */
+    ANTLR_UINT32  get_type() const;
+	ANTLR_UINT32  getType() const;
+
+    /** Pointer to a function that sets the type of this token
+     */
+    void	set_type(ANTLR_UINT32 ttype);
+
+    /** Pointer to a function that gets the 'line' number where this token resides
+     */
+    ANTLR_UINT32   get_line() const;
+
+    /** Pointer to a function that sets the 'line' number where this token reside
+     */
+    void set_line(ANTLR_UINT32 line);
+
+    /** Pointer to a function that gets the offset in the line where this token exists
+     */ 
+    ANTLR_INT32  get_charPositionInLine() const;
+	ANTLR_INT32  getCharPositionInLine() const;
+
+    /** Pointer to a function that sets the offset in the line where this token exists
+     */
+    void	set_charPositionInLine(ANTLR_INT32 pos);
+
+    /** Pointer to a function that gets the channel that this token was placed in (parsers
+     *  can 'tune' to these channels.
+     */
+    ANTLR_UINT32   get_channel() const;
+
+    /** Pointer to a function that sets the channel that this token should belong to
+     */
+    void set_channel(ANTLR_UINT32 channel);
+
+    /** Pointer to a function that returns an index 0...n-1 of the token in the token
+     *  input stream.
+     */
+    ANTLR_MARKER  get_tokenIndex() const;
+
+    /** Pointer to a function that can set the token index of this token in the token
+     *  input stream.
+     */
+    void	set_tokenIndex(ANTLR_MARKER tokenIndex);
+
+    /** Pointer to a function that gets the start index in the input stream for this token.
+     */
+    ANTLR_MARKER   get_startIndex() const;
+
+    /** Pointer to a function that sets the start index in the input stream for this token.
+     */
+    void	set_startIndex(ANTLR_MARKER index);
+    
+    /** Pointer to a function that gets the stop index in the input stream for this token.
+     */
+    ANTLR_MARKER  get_stopIndex() const;
+
+    /** Pointer to a function that sets the stop index in the input stream for this token.
+     */
+    void	set_stopIndex(ANTLR_MARKER index);
+	const StreamDataType* get_lineStart() const;
+	void	set_lineStart( const StreamDataType* lineStart );
+
+    /** Pointer to a function that returns this token as a text representation that can be 
+     *  printed with embedded control codes such as \n replaced with the printable sequence "\\n"
+     *  This also yields a string structure that can be used more easily than the pointer to 
+     *  the input stream in certain situations.
+     */
+    StringType  toString() const;
+
+};
+
+ANTLR_END_NAMESPACE()
+
+#include "antlr3commontoken.inl"
+
+#endif
diff --git a/runtime/Cpp/include/antlr3commontoken.inl b/runtime/Cpp/include/antlr3commontoken.inl
new file mode 100755
index 0000000..87194dc
--- /dev/null
+++ b/runtime/Cpp/include/antlr3commontoken.inl
@@ -0,0 +1,322 @@
+ANTLR_BEGIN_NAMESPACE()
+
+template<class ImplTraits>
+CommonToken<ImplTraits>::CommonToken()
+{
+	m_type = 0;
+    m_channel = 0;
+	m_lineStart = NULL;
+	m_line = 0;
+	m_charPositionInLine = 0;
+	m_input = NULL;
+	m_index = 0;
+	m_startIndex = 0;
+	m_stopIndex = 0;
+}
+
+template<class ImplTraits>
+CommonToken<ImplTraits>::CommonToken(ANTLR_UINT32 type)
+{
+	m_type = type;
+	m_channel = 0;
+	m_lineStart = NULL;
+	m_line = 0;
+	m_charPositionInLine = 0;
+	m_input = NULL;
+	m_index = 0;
+	m_startIndex = 0;
+	m_stopIndex = 0;
+}
+
+template<class ImplTraits>
+CommonToken<ImplTraits>::CommonToken(TOKEN_TYPE type)
+{
+	m_type = type;
+	m_channel = 0;
+	m_lineStart = NULL;
+	m_line = 0;
+	m_charPositionInLine = 0;
+	m_input = NULL;
+	m_index = 0;
+	m_startIndex = 0;
+	m_stopIndex = 0;
+}
+
+template<class ImplTraits>
+CommonToken<ImplTraits>::CommonToken( const CommonToken& ctoken )
+	:m_tokText( ctoken.m_tokText )
+{
+	m_type = ctoken.m_type;
+	m_channel = ctoken.m_channel;
+	m_lineStart = ctoken.m_lineStart;
+	m_line = ctoken.m_line;
+	m_charPositionInLine = ctoken.m_charPositionInLine;
+	m_input = ctoken.m_input;
+	m_index = ctoken.m_index;
+	m_startIndex = ctoken.m_startIndex;
+	m_stopIndex = ctoken.m_stopIndex;
+}
+
+template<class ImplTraits>
+CommonToken<ImplTraits>& CommonToken<ImplTraits>::operator=( const CommonToken& ctoken )
+{
+	m_type = ctoken.m_type;
+	m_channel = ctoken.m_channel;
+	m_lineStart = ctoken.m_lineStart;
+	m_line = ctoken.m_line;
+	m_charPositionInLine = ctoken.m_charPositionInLine;
+	m_input = ctoken.m_input;
+	m_index = ctoken.m_index;
+	m_startIndex = ctoken.m_startIndex;
+	m_stopIndex = ctoken.m_stopIndex;
+
+	m_tokText = ctoken.m_tokText;
+	return *this;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE bool CommonToken<ImplTraits>::operator<( const CommonToken& ctoken ) const
+{
+	return (m_index < ctoken.m_index);
+}
+
+template<class ImplTraits>
+bool CommonToken<ImplTraits>::operator==( const CommonToken& ctoken ) const
+{
+	return ( (m_type == ctoken.m_type) &&
+		     (m_channel == ctoken.m_channel) &&
+			 (m_lineStart == ctoken.m_lineStart) &&
+			 (m_line == ctoken.m_line) &&
+			 (m_charPositionInLine == ctoken.m_charPositionInLine) &&
+			 (m_input == ctoken.m_input) &&
+			 (m_index == ctoken.m_index) &&
+			 (m_startIndex == ctoken.m_startIndex) &&
+			 (m_stopIndex == ctoken.m_stopIndex) );
+}
+
+template<class ImplTraits>
+ANTLR_INLINE typename CommonToken<ImplTraits>::InputStreamType* CommonToken<ImplTraits>::get_input() const
+{
+	return m_input;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE ANTLR_MARKER CommonToken<ImplTraits>::get_index() const
+{
+	return m_index;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE void CommonToken<ImplTraits>::set_index( ANTLR_MARKER index )
+{
+	m_index = index;
+}
+
+template<class ImplTraits>
+void CommonToken<ImplTraits>::set_input( InputStreamType* input )
+{
+	m_input = input;
+}
+
+template<class ImplTraits>
+typename CommonToken<ImplTraits>::StringType  CommonToken<ImplTraits>::getText() const
+{
+	if ( !m_tokText.empty() )
+		return m_tokText;
+
+	// EOF is a special case
+	//
+	if ( m_type == TOKEN_EOF)
+	{
+		m_tokText	= "<EOF>";
+		return m_tokText;
+	}
+
+	// We had nothing installed in the token, create a new string
+	// from the input stream
+	//
+	if	(m_input != NULL)
+		return	m_input->substr(	this->get_startIndex(), this->get_stopIndex() );
+
+	// Nothing to return, there is no input stream
+	//
+	return "";
+}
+
+template<class ImplTraits>
+ANTLR_INLINE void CommonToken<ImplTraits>::set_tokText( const StringType& text )
+{
+	m_tokText = text;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE void CommonToken<ImplTraits>::setText(ANTLR_UINT8* text)
+{
+	if( text == NULL )
+		m_tokText.clear();
+	else
+		m_tokText = (const char*) text;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE void	CommonToken<ImplTraits>::setText(const char* text)
+{
+	if( text == NULL )
+		m_tokText.clear();
+	else
+		m_tokText = (const char*) text;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE ANTLR_UINT32  CommonToken<ImplTraits>::get_type() const
+{
+	return m_type;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE ANTLR_UINT32  CommonToken<ImplTraits>::getType() const
+{
+	return m_type;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE void	CommonToken<ImplTraits>::set_type(ANTLR_UINT32 ttype)
+{
+	m_type = ttype;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE ANTLR_UINT32   CommonToken<ImplTraits>::get_line() const
+{
+	return m_line;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE void CommonToken<ImplTraits>::set_line(ANTLR_UINT32 line)
+{
+	m_line = line;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE ANTLR_INT32  CommonToken<ImplTraits>::get_charPositionInLine() const
+{
+	return m_charPositionInLine;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE ANTLR_INT32  CommonToken<ImplTraits>::getCharPositionInLine() const
+{
+	return this->get_charPositionInLine();
+}
+
+template<class ImplTraits>
+ANTLR_INLINE void	CommonToken<ImplTraits>::set_charPositionInLine(ANTLR_INT32 pos)
+{
+	m_charPositionInLine = pos;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE ANTLR_UINT32   CommonToken<ImplTraits>::get_channel() const
+{
+	return m_channel;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE void CommonToken<ImplTraits>::set_channel(ANTLR_UINT32 channel)
+{
+	m_channel = channel;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE ANTLR_MARKER  CommonToken<ImplTraits>::get_tokenIndex() const
+{
+	return m_index;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE void	CommonToken<ImplTraits>::set_tokenIndex(ANTLR_MARKER tokenIndex)
+{
+	m_index = tokenIndex;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE ANTLR_MARKER   CommonToken<ImplTraits>::get_startIndex() const
+{
+	return (m_startIndex == -1) ? (ANTLR_MARKER)(m_input->get_data()) : m_startIndex;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE void	CommonToken<ImplTraits>::set_startIndex(ANTLR_MARKER index)
+{
+	m_startIndex = index;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE ANTLR_MARKER  CommonToken<ImplTraits>::get_stopIndex() const
+{
+	return m_stopIndex;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE void	CommonToken<ImplTraits>::set_stopIndex(ANTLR_MARKER index)
+{
+	m_stopIndex = index;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE const typename CommonToken<ImplTraits>::StreamDataType* CommonToken<ImplTraits>::get_lineStart() const
+{
+	return m_lineStart;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE void	CommonToken<ImplTraits>::set_lineStart( const StreamDataType* lineStart )
+{
+	m_lineStart = lineStart;
+}
+
+template<class ImplTraits>
+typename CommonToken<ImplTraits>::StringType  CommonToken<ImplTraits>::toString() const
+{
+    StringType  text;
+    typedef typename ImplTraits::StringStreamType StringStreamType;
+    StringStreamType  outtext; 
+
+    text    =	this->getText();
+
+    if	(text.empty())
+		return "";
+
+    /* Now we use our handy dandy string utility to assemble the
+     * the reporting string
+     * return "[@"+getTokenIndex()+","+start+":"+stop+"='"+txt+"',<"+type+">"+channelStr+","+line+":"+getCharPositionInLine()+"]";
+     */
+    outtext << "[Index: ";
+    outtext << (int)this->get_tokenIndex();
+    outtext << " (Start: ";
+    outtext << (int)this->get_startIndex();
+    outtext << "-Stop: ";
+    outtext << (int)this->get_stopIndex();
+    outtext << ") ='";
+    outtext << text;
+    outtext << "', type<";
+    outtext << (int)m_type;
+    outtext << "> ";
+
+    if	(this->get_channel() > TOKEN_DEFAULT_CHANNEL)
+    {
+		outtext << "(channel = ";
+		outtext << (int)this->get_channel();
+		outtext << ") ";
+    }
+
+    outtext << "Line: ";
+    outtext << (int)this->get_line();
+    outtext << " LinePos:";
+    outtext << (int)this->get_charPositionInLine();
+    outtext << "]";
+
+    return  outtext.str();
+}
+
+ANTLR_END_NAMESPACE()
diff --git a/runtime/Cpp/include/antlr3commontree.hpp b/runtime/Cpp/include/antlr3commontree.hpp
new file mode 100755
index 0000000..39096f8
--- /dev/null
+++ b/runtime/Cpp/include/antlr3commontree.hpp
@@ -0,0 +1,139 @@
+/** Interface for an ANTLR3 common tree which is what gets
+ *  passed around by the AST producing parser.
+ */
+
+#ifndef	_ANTLR3_COMMON_TREE_HPP
+#define	_ANTLR3_COMMON_TREE_HPP
+
+// [The "BSD licence"]
+// Copyright (c) 2005-2009 Gokulakannan Somasundaram, ElectronDB
+
+//
+// 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.
+
+#include    "antlr3defs.hpp"
+
+ANTLR_BEGIN_NAMESPACE()
+
+template<class ImplTraits>
+class CommonTree : public ImplTraits::AllocPolicyType				   
+{
+public:
+	typedef typename ImplTraits::AllocPolicyType AllocPolicyType;
+	typedef typename ImplTraits::StringType	StringType;
+	typedef typename ImplTraits::CommonTokenType CommonTokenType;
+	typedef typename ImplTraits::TreeType TreeType;
+	typedef CommonTree TokenType;
+	typedef typename AllocPolicyType::template VectorType<TreeType*> ChildrenType;
+	typedef typename AllocPolicyType::template ListType<TreeType*>	ChildListType;
+
+private:
+	/// The list of all the children that belong to this node. They are not part of the node
+    /// as they belong to the common tree node that implements this.
+    ///
+    ChildrenType		m_children;
+
+    /// This is used to store the current child index position while descending
+    /// and ascending trees as the tree walk progresses.
+    ///
+    ANTLR_MARKER		m_savedIndex;
+
+    /// Start token index that encases this tree
+    ///
+    ANTLR_MARKER		m_startIndex;
+
+    /// End token that encases this tree
+    ///
+    ANTLR_MARKER		m_stopIndex;
+
+    /// A single token, this is the payload for the tree
+    ///
+    CommonTokenType*    m_token;
+
+	/// Points to the node that has this node as a child.
+	/// If this is NULL, then this is the root node.
+	///
+	CommonTree*			m_parent;
+
+	/// What index is this particular node in the child list it
+	/// belongs to?
+	///
+	ANTLR_INT32			m_childIndex;
+
+public:
+	CommonTree();
+	CommonTree( CommonTokenType* token );
+	CommonTree( CommonTree* token );
+	CommonTree( const CommonTree& ctree );
+
+	TokenType*   get_token() const;
+	ChildrenType& get_children();
+	const ChildrenType& get_children() const;
+	ChildrenType* get_children_p();
+	ANTLR_INT32	get_childIndex() const;
+	TreeType* get_parent() const;
+
+	void    set_parent( TreeType* parent);
+	void    set_childIndex( ANTLR_INT32 );
+
+	void	addChild(TreeType* child);
+	/// Add all elements of the supplied list as children of this node
+	///
+	void	addChildren(const ChildListType& kids);
+	void    createChildrenList();
+	TreeType*	deleteChild(ANTLR_UINT32 i);
+	/// Delete children from start to stop and replace with t even if t is
+	/// a list (nil-root tree). Num of children can increase or decrease.
+	/// For huge child lists, inserting children can force walking rest of
+	/// children to set their child index; could be slow.
+	///
+	void	replaceChildren(ANTLR_INT32 startChildIndex, ANTLR_INT32 stopChildIndex, TreeType* t);
+	CommonTree*	dupNode() const;
+	TreeType*	dupTree();
+	ANTLR_UINT32	getCharPositionInLine();
+	TreeType*	getChild(ANTLR_UINT32 i);
+	
+	ANTLR_UINT32	getChildCount() const;
+	ANTLR_UINT32	getType();
+	TreeType*	getFirstChildWithType(ANTLR_UINT32 type);
+	ANTLR_UINT32	getLine();
+	StringType	getText();
+	bool	isNilNode();
+	void	setChild(ANTLR_UINT32 i, TreeType* child);
+	StringType	toStringTree();
+	StringType	toString();
+	void	freshenPACIndexesAll();
+	void	freshenPACIndexes(ANTLR_UINT32 offset);
+	void    reuse();
+	~CommonTree();
+};
+
+ANTLR_END_NAMESPACE()
+
+#include "antlr3commontree.inl"
+
+#endif
+
+
diff --git a/runtime/Cpp/include/antlr3commontree.inl b/runtime/Cpp/include/antlr3commontree.inl
new file mode 100755
index 0000000..8a3111b
--- /dev/null
+++ b/runtime/Cpp/include/antlr3commontree.inl
@@ -0,0 +1,565 @@
+ANTLR_BEGIN_NAMESPACE()
+
+template<class ImplTraits>
+CommonTree<ImplTraits>::CommonTree()
+{
+	m_savedIndex = 0;
+	m_startIndex = 0;
+	m_stopIndex  = 0;
+	m_token		 = NULL;
+	m_parent     = NULL;
+	m_childIndex = 0;
+}
+
+template<class ImplTraits>
+CommonTree<ImplTraits>::CommonTree( const CommonTree& ctree )
+	:m_children( ctree.m_children)
+{
+	m_savedIndex = ctree.m_savedIndex;
+	m_startIndex = ctree.m_startIndex;
+	m_stopIndex  = ctree.m_stopIndex;
+	m_token		 = ctree.m_token;
+	m_parent     = ctree.m_parent;
+	m_childIndex = ctree.m_childIndex;
+}
+
+template<class ImplTraits>
+CommonTree<ImplTraits>::CommonTree( CommonTokenType* token )
+{
+	m_savedIndex = 0;
+	m_startIndex = 0;
+	m_stopIndex  = 0;
+	m_token		 = token;
+	m_parent     = NULL;
+	m_childIndex = 0;
+}
+
+template<class ImplTraits>
+CommonTree<ImplTraits>::CommonTree( CommonTree* tree )
+{
+	m_savedIndex = 0;
+	m_startIndex = 0;
+	m_stopIndex  = 0;
+	m_token		 = tree->get_token();
+	m_parent     = NULL;
+	m_childIndex = 0;
+}
+
+template<class ImplTraits>
+typename CommonTree<ImplTraits>::TokenType*   CommonTree<ImplTraits>::get_token() const
+{
+	return m_token;
+}
+
+template<class ImplTraits>
+typename CommonTree<ImplTraits>::ChildrenType& CommonTree<ImplTraits>::get_children()
+{
+	return m_children;
+}
+
+template<class ImplTraits>
+const typename CommonTree<ImplTraits>::ChildrenType& CommonTree<ImplTraits>::get_children() const
+{
+	return m_children;
+}
+
+template<class ImplTraits>
+typename CommonTree<ImplTraits>::ChildrenType* CommonTree<ImplTraits>::get_children_p()
+{
+	return &m_children;
+}
+
+template<class ImplTraits>
+void	CommonTree<ImplTraits>::addChild(TreeType* child)
+{
+	ANTLR_UINT32   n;
+	ANTLR_UINT32   i;
+
+	if	(child == NULL)
+		return;
+
+	ChildrenType& child_children = child->get_children();
+	ChildrenType& tree_children  = this->get_children();
+
+	if	(child->isNilNode() == true)
+	{
+		if ( !child_children.empty() && child_children == tree_children )
+		{
+			// TODO: Change to exception rather than ANTLR3_FPRINTF?
+			//
+			fprintf(stderr, "ANTLR3: An attempt was made to add a child list to itself!\n");
+			return;
+		}
+
+        // Add all of the children's children to this list
+        //
+        if ( !child_children.empty() )
+        {
+            if (tree_children.empty())
+            {
+                // We are build ing the tree structure here, so we need not
+                // worry about duplication of pointers as the tree node
+                // factory will only clean up each node once. So we just
+                // copy in the child's children pointer as the child is
+                // a nil node (has not root itself).
+                //
+                tree_children.swap( child_children );
+                this->freshenPACIndexesAll();               
+            }
+            else
+            {
+                // Need to copy the children
+                //
+                n = child_children.size();
+
+                for (i = 0; i < n; i++)
+                {
+                    TreeType* entry;
+                    entry = child_children[i];
+
+                    // ANTLR3 lists can be sparse, unlike Array Lists
+                    //
+                    if (entry != NULL)
+                    {
+                        tree_children.push_back(entry);
+                    }
+                }
+            }
+		}
+	}
+	else
+	{
+		// Tree we are adding is not a Nil and might have children to copy
+		//
+		if  (tree_children.empty())
+		{
+			// No children in the tree we are adding to, so create a new list on
+			// the fly to hold them.
+			//
+			this->createChildrenList();
+		}
+		tree_children.push_back( child );
+	}
+}
+
+template<class ImplTraits>
+void	CommonTree<ImplTraits>::addChildren(const ChildListType& kids)
+{
+	for( typename ChildListType::const_iterator iter = kids.begin();
+		 iter != kids.end(); ++iter )
+	{
+		this->addChild( *iter );
+	}
+}
+
+//dummy one, as vector is always there
+template<class ImplTraits>
+void    CommonTree<ImplTraits>::createChildrenList()
+{
+}
+
+template<class ImplTraits>
+typename CommonTree<ImplTraits>::TreeType*	CommonTree<ImplTraits>::deleteChild(ANTLR_UINT32 i)
+{
+	if( m_children.empty() )
+		return	NULL;
+
+	return  m_children.erase( m_children.begin() + i);
+}
+
+template<class ImplTraits>
+void	CommonTree<ImplTraits>::replaceChildren(ANTLR_INT32 startChildIndex, ANTLR_INT32 stopChildIndex, TreeType* newTree)
+{
+	ANTLR_INT32	replacingHowMany;		// How many nodes will go away
+	ANTLR_INT32	replacingWithHowMany;	// How many nodes will replace them
+	ANTLR_INT32	numNewChildren;			// Tracking variable
+	ANTLR_INT32	delta;					// Difference in new vs existing count
+
+	ANTLR_INT32	i;
+	ANTLR_INT32	j;
+
+	if	( m_children.empty() )
+	{
+		fprintf(stderr, "replaceChildren call: Indexes are invalid; no children in list for %s", this->getText().c_str() );
+		return;
+	}
+
+	// Either use the existing list of children in the supplied nil node, or build a vector of the
+	// tree we were given if it is not a nil node, then we treat both situations exactly the same
+	//
+	ChildrenType newChildren_temp;
+	ChildrenType*	newChildren;			// Iterator for whatever we are going to add in
+
+	if	(newTree->isNilNode())
+	{
+		newChildren = newTree->get_children_p();
+	}
+	else
+	{
+		newChildren = &newChildren_temp;
+		newChildren->push_back(newTree);
+	}
+
+	// Initialize
+	//
+	replacingHowMany		= stopChildIndex - startChildIndex + 1;
+	replacingWithHowMany	= newChildren->size();
+	delta					= replacingHowMany - replacingWithHowMany;
+	numNewChildren			= newChildren->size();
+
+	// If it is the same number of nodes, then do a direct replacement
+	//
+	if	(delta == 0)
+	{
+		TreeType*	child;
+
+		// Same number of nodes
+		//
+		j	= 0;
+		for	(i = startChildIndex; i <= stopChildIndex; i++)
+		{
+			child = newChildren->at(j);
+			ChildrenType& parent_children = this->get_children();
+			parent_children[i] = child;
+			child->setParent(this);
+			child->setChildIndex(i);
+		}
+	}
+	else if (delta > 0)
+	{
+		ANTLR_UINT32	indexToDelete;
+
+		// Less nodes than there were before
+		// reuse what we have then delete the rest
+		//
+		ChildrenType& parent_children = this->get_children();
+		for	(j = 0; j < numNewChildren; j++)
+		{
+			parent_children[ startChildIndex + j ] = newChildren->at(j);
+		}
+
+		// We just delete the same index position until done
+		//
+		indexToDelete = startChildIndex + numNewChildren;
+
+		for	(j = indexToDelete; j <= stopChildIndex; j++)
+		{
+			parent_children.erase( parent_children.begin() + indexToDelete);
+		}
+
+		this->freshenPACIndexes(startChildIndex);
+	}
+	else
+	{
+		ChildrenType& parent_children = this->get_children();
+		ANTLR_UINT32 numToInsert;
+
+		// More nodes than there were before
+		// Use what we can, then start adding
+		//
+		for	(j = 0; j < replacingHowMany; j++)
+		{
+			parent_children[ startChildIndex + j ] = newChildren->at(j);
+		}
+
+		numToInsert = replacingWithHowMany - replacingHowMany;
+
+		for	(j = replacingHowMany; j < replacingWithHowMany; j++)
+		{
+			parent_children.push_back( newChildren->at(j) );
+		}
+
+		this->freshenPACIndexes(startChildIndex);
+	}
+}
+
+template<class ImplTraits>
+CommonTree<ImplTraits>*	CommonTree<ImplTraits>::dupNode() const
+{
+	// The node we are duplicating is in fact the common tree (that's why we are here)
+    // so we use the super pointer to duplicate.
+    //
+    TreeType*   clone = new TreeType();
+
+	// The pointer we return is the base implementation of course
+    //
+	clone->set_token( m_token );
+	return  clone;
+}
+
+template<class ImplTraits>
+typename CommonTree<ImplTraits>::TreeType*	CommonTree<ImplTraits>::dupTree()
+{
+	TreeType*	newTree;
+	ANTLR_UINT32	i;
+	ANTLR_UINT32	s;
+
+	newTree = this->dupNode();
+
+	if	( !m_children.empty() )
+	{
+		s	    = m_children.size();
+
+		for	(i = 0; i < s; i++)
+		{
+			TreeType*    t;
+			TreeType*    newNode;
+
+			t   = m_children[i];
+
+			if  (t!= NULL)
+			{
+				newNode	    = t->dupTree();
+				newTree->addChild(newNode);
+			}
+		}
+	}
+
+	return newTree;
+}
+
+template<class ImplTraits>
+ANTLR_UINT32	CommonTree<ImplTraits>::getCharPositionInLine()
+{
+	CommonTokenType*    token;
+	token   = m_token;
+
+	if	(token == NULL || (token->getCharPositionInLine() == -1) )
+	{
+		if  (this->getChildCount() > 0)
+		{
+			TreeType*	child;
+
+			child   = this->getChild(0);
+
+			return child->getCharPositionInLine();
+		}
+		return 0;
+	}
+	return  token->getCharPositionInLine();
+}
+
+template<class ImplTraits>
+typename CommonTree<ImplTraits>::TreeType*	CommonTree<ImplTraits>::getChild(ANTLR_UINT32 i)
+{
+	if	(  m_children.empty()
+		|| i >= m_children.size() )
+	{
+		return NULL;
+	}
+	return  m_children[i];
+
+}
+
+template<class ImplTraits>
+void    CommonTree<ImplTraits>::set_childIndex( ANTLR_INT32 i)
+{
+	m_childIndex = i;
+}
+
+template<class ImplTraits>
+ANTLR_INT32	CommonTree<ImplTraits>::get_childIndex() const
+{
+	return m_childIndex;
+}
+
+template<class ImplTraits>
+ANTLR_UINT32	CommonTree<ImplTraits>::getChildCount() const
+{
+	return static_cast<ANTLR_UINT32>( m_children.size() );
+}
+
+template<class ImplTraits>
+typename CommonTree<ImplTraits>::TreeType* CommonTree<ImplTraits>::get_parent() const
+{
+	return m_parent;
+}
+
+template<class ImplTraits>
+void     CommonTree<ImplTraits>::set_parent( TreeType* parent)
+{
+	m_parent = parent;
+}
+
+template<class ImplTraits>
+ANTLR_UINT32	CommonTree<ImplTraits>::getType()
+{
+	if	(this == NULL)
+	{
+		return	0;
+	}
+	else
+	{
+		return	m_token->getType();
+	}
+}
+
+template<class ImplTraits>
+typename CommonTree<ImplTraits>::TreeType*	CommonTree<ImplTraits>::getFirstChildWithType(ANTLR_UINT32 type)
+{
+	ANTLR_UINT32   i;
+	std::size_t   cs;
+
+	TreeType*	t;
+	if	( !m_children.empty() )
+	{
+		cs	= m_children.size();
+		for	(i = 0; i < cs; i++)
+		{
+			t = m_children[i];
+			if  (t->getType() == type)
+			{
+				return  t;
+			}
+		}
+	}
+	return  NULL;
+}
+
+template<class ImplTraits>
+ANTLR_UINT32	CommonTree<ImplTraits>::getLine()
+{
+	TreeType*	    cTree = this;
+	CommonTokenType* token;
+	token   = cTree->get_token();
+
+	if	(token == NULL || token->getLine() == 0)
+	{
+		if  ( this->getChildCount() > 0)
+		{
+			TreeType*	child;
+			child   = this->getChild(0);
+			return child->getLine();
+		}
+		return 0;
+	}
+	return  token->getLine();
+}
+
+template<class ImplTraits>
+typename CommonTree<ImplTraits>::StringType	CommonTree<ImplTraits>::getText()
+{
+	return this->toString();
+}
+
+template<class ImplTraits>
+bool	CommonTree<ImplTraits>::isNilNode()
+{
+	// This is a Nil tree if it has no payload (Token in our case)
+	//
+	if(m_token == NULL)
+	{
+		return true;
+	}
+	else
+	{
+		return false;
+	}
+}
+
+template<class ImplTraits>
+void	CommonTree<ImplTraits>::setChild(ANTLR_UINT32 i, TreeType* child)
+{
+	if( m_children.size() >= i )
+		m_children.resize(i+1);
+	m_children[i] = child;
+}
+
+template<class ImplTraits>
+typename CommonTree<ImplTraits>::StringType	CommonTree<ImplTraits>::toStringTree()
+{
+	StringType  string;
+	ANTLR_UINT32   i;
+	ANTLR_UINT32   n;
+	TreeType*   t;
+
+	if( m_children.empty() )
+	{
+		return	this->toString();
+	}
+
+	/* Need a new string with nothing at all in it.
+	*/
+	if	(this->isNilNode() == false)
+	{
+		string.append("(");
+		string.append(this->toString());
+		string.append(" ");
+	}
+	if	( m_children != NULL)
+	{
+		n = m_children.size();
+
+		for	(i = 0; i < n; i++)
+		{   
+			t   = m_children[i];
+
+			if  (i > 0)
+			{
+				string.append(" ");
+			}
+			string.append(t->toStringTree());
+		}
+	}
+	if	(this->isNilNode() == false)
+	{
+		string.append(")");
+	}
+
+	return  string;
+}
+
+template<class ImplTraits>
+typename CommonTree<ImplTraits>::StringType	CommonTree<ImplTraits>::toString()
+{
+	if  (this->isNilNode() )
+	{
+		StringType  nilNode;
+
+		nilNode	= "nil";
+
+		return nilNode;
+	}
+
+	return	m_token->getText();
+}
+
+template<class ImplTraits>
+void	CommonTree<ImplTraits>::freshenPACIndexesAll()
+{
+	this->freshenPACIndexes(0);
+}
+
+template<class ImplTraits>
+void	CommonTree<ImplTraits>::freshenPACIndexes(ANTLR_UINT32 offset)
+{
+	ANTLR_UINT32	count;
+	ANTLR_UINT32	c;
+
+	count	= this->getChildCount();		// How many children do we have 
+
+	// Loop from the supplied index and set the indexes and parent
+	//
+	for	(c = offset; c < count; c++)
+	{
+		TreeType*	child;
+
+		child = this->getChild(c);
+
+		child->setChildIndex(c);
+		child->setParent(this);
+	}
+}
+
+template<class ImplTraits>
+void    CommonTree<ImplTraits>::reuse()
+{
+	delete this; //memory re-use should be taken by the library user
+}
+
+template<class ImplTraits>
+CommonTree<ImplTraits>::~CommonTree()
+{
+}
+
+ANTLR_END_NAMESPACE()
diff --git a/runtime/Cpp/include/antlr3commontreeadaptor.hpp b/runtime/Cpp/include/antlr3commontreeadaptor.hpp
new file mode 100755
index 0000000..8b40f1c
--- /dev/null
+++ b/runtime/Cpp/include/antlr3commontreeadaptor.hpp
@@ -0,0 +1,163 @@
+/** \file
+ * Definition of the ANTLR3 common tree adaptor.
+ */
+
+#ifndef	_ANTLR3_COMMON_TREE_ADAPTOR_HPP
+#define	_ANTLR3_COMMON_TREE_ADAPTOR_HPP
+
+// [The "BSD licence"]
+// Copyright (c) 2005-2009 Gokulakannan Somasundaram, ElectronDB
+
+//
+// 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.
+
+#include    "antlr3defs.hpp"
+
+ANTLR_BEGIN_NAMESPACE()
+
+template<class ImplTraits>
+class CommonTreeAdaptor : public ImplTraits::AllocPolicyType
+{
+public:
+	typedef typename ImplTraits::StringType StringType;
+	typedef typename ImplTraits::TreeType TreeType;
+	typedef	TreeType TokenType;
+	typedef typename ImplTraits::CommonTokenType CommonTokenType;
+	typedef typename ImplTraits::DebugEventListenerType DebuggerType;
+
+public:
+	//The parameter is there only to provide uniform constructor interface
+	CommonTreeAdaptor(DebuggerType* dbg = NULL);
+    TreeType*	  nilNode();
+	TreeType*	  dupTree( TreeType* tree);
+    TreeType*	  dupTreeTT( TreeType* t, TreeType* tree);
+
+    void	addChild( TreeType* t, TreeType* child);
+    void	addChildToken( TreeType* t, CommonTokenType* child);
+    void	setParent( TreeType* child, TreeType* parent);
+    TreeType*		getParent( TreeType* child);
+
+	TreeType*		errorNode( CommonTokenType* tnstream, CommonTokenType* startToken, CommonTokenType* stopToken);
+	bool	isNilNode( TreeType* t);
+
+    TreeType*	    becomeRoot( TreeType* newRoot, TreeType* oldRoot);
+    TreeType*	   	rulePostProcessing( TreeType* root);
+
+    TreeType*	becomeRootToken(CommonTokenType* newRoot, TreeType* oldRoot);
+
+    TreeType*	 	create( CommonTokenType* payload);
+    TreeType* 		createTypeToken( ANTLR_UINT32 tokenType, CommonTokenType* fromToken);
+    TreeType*	   	createTypeTokenText	( ANTLR_UINT32 tokenType, CommonTokenType* fromToken, const ANTLR_UINT8* text);
+    TreeType*	    createTypeText		( ANTLR_UINT32 tokenType, const ANTLR_UINT8* text);
+
+    TreeType*	    dupNode( TreeType* treeNode);
+    ANTLR_UINT32			getType( TreeType* t);
+    StringType			getText( TreeType* t);
+        
+    TreeType*	    getChild( TreeType* t, ANTLR_UINT32 i);
+    void	setChild( TreeType* t, ANTLR_UINT32 i, TreeType* child);
+    void	deleteChild( TreeType* t, ANTLR_UINT32 i);
+    void	setChildIndex( TreeType* t, ANTLR_INT32 i);
+    ANTLR_INT32	getChildIndex( TreeType* t);
+
+    ANTLR_UINT32	getChildCount( TreeType*);
+	ANTLR_UINT64	getUniqueID( TreeType*);
+
+    CommonTokenType*    createToken( ANTLR_UINT32 tokenType, const ANTLR_UINT8* text);
+    CommonTokenType*    createTokenFromToken( CommonTokenType* fromToken);
+    CommonTokenType*    getToken( TreeType* t);
+
+    void setTokenBoundaries( TreeType* t, CommonTokenType* startToken, CommonTokenType* stopToken);
+    ANTLR_MARKER	getTokenStartIndex( TreeType* t);
+    ANTLR_MARKER	getTokenStopIndex( TreeType* t);
+
+	/// Produce a DOT (see graphviz freeware suite) from a base tree
+	///
+	StringType			makeDot( TreeType* theTree);
+
+	/// Replace from start to stop child index of parent with t, which might
+	/// be a list.  Number of children may be different
+	/// after this call.
+	///
+	/// If parent is null, don't do anything; must be at root of overall tree.
+	/// Can't replace whatever points to the parent externally.  Do nothing.
+	///
+	void replaceChildren( TreeType* parent, ANTLR_INT32 startChildIndex,
+								  ANTLR_INT32 stopChildIndex, TreeType* t);
+
+    ~CommonTreeAdaptor();
+
+protected:
+	void defineDotNodes(TreeType* t, const StringType& dotSpec);
+	void defineDotEdges(TreeType* t, const StringType& dotSpec);
+};
+
+//If someone can override the CommonTreeAdaptor at the compile time, that will be 
+//inherited here. Still you can choose to override the DebugTreeAdaptor, if you wish to
+//change the DebugTreeAdaptor
+template<class ImplTraits>
+class DebugTreeAdaptor : public ImplTraits::CommonTreeAdaptorType
+{
+public:
+	//DebugEventListener implements functionality through virtual functions
+	//the template parameter is required for pointing back at the adaptor
+	typedef typename ImplTraits::DebugEventListener DebuggerType;
+	typedef typename ImplTraits::TreeType TreeType;
+	typedef typename ImplTraits::CommonTokenType CommonTokenType;
+
+private:
+	/// If set to something other than NULL, then this structure is
+	/// points to an instance of the debugger interface. In general, the
+	/// debugger is only referenced internally in recovery/error operations
+	/// so that it does not cause overhead by having to check this pointer
+	/// in every function/method
+	///
+	DebuggerType*		m_debugger;
+
+public:
+	DebugTreeAdaptor( DebuggerType* debugger );
+	void setDebugEventListener( DebuggerType* debugger);
+	TreeType*	  nilNode();
+	void	addChild(TreeType* t, TreeType* child);
+	void	addChildToken(TreeType* t, CommonTokenType* child);
+	TreeType* becomeRoot( TreeType* newRootTree, TreeType* oldRootTree );
+	TreeType* becomeRootToken(TreeType* newRoot, TreeType* oldRoot);
+	TreeType* createTypeToken(ANTLR_UINT32 tokenType, CommonTokenType* fromToken);
+	TreeType* createTypeTokenText(ANTLR_UINT32 tokenType, CommonTokenType* fromToken, ANTLR_UINT8* text);	
+	TreeType* createTypeText( ANTLR_UINT32 tokenType, ANTLR_UINT8* text);
+	TreeType* dupTree( TreeType* tree);
+
+	/// Sends the required debugging events for duplicating a tree
+	/// to the debugger.
+	///
+	void simulateTreeConstruction(TreeType* tree);
+};
+
+
+ANTLR_END_NAMESPACE()
+
+#include "antlr3commontreeadaptor.inl"
+
+#endif
diff --git a/runtime/Cpp/include/antlr3commontreeadaptor.inl b/runtime/Cpp/include/antlr3commontreeadaptor.inl
new file mode 100755
index 0000000..698c7d7
--- /dev/null
+++ b/runtime/Cpp/include/antlr3commontreeadaptor.inl
@@ -0,0 +1,801 @@
+ANTLR_BEGIN_NAMESPACE()
+
+template<class ImplTraits>
+ANTLR_INLINE CommonTreeAdaptor<ImplTraits>::CommonTreeAdaptor(DebuggerType*)
+{
+}
+
+template<class ImplTraits>
+typename CommonTreeAdaptor<ImplTraits>::TreeType*	  CommonTreeAdaptor<ImplTraits>::nilNode()
+{
+	return this->create(NULL);
+}
+
+template<class ImplTraits>
+typename CommonTreeAdaptor<ImplTraits>::TreeType*	  CommonTreeAdaptor<ImplTraits>::dupTree( TreeType* tree)
+{
+	return this->dupTreeTT(tree, NULL);
+}
+
+template<class ImplTraits>
+typename CommonTreeAdaptor<ImplTraits>::TreeType*	  CommonTreeAdaptor<ImplTraits>::dupTreeTT( TreeType* t, TreeType* parent)
+{
+	TreeType*	newTree;
+	TreeType*	child;
+	TreeType*	newSubTree;
+	ANTLR_UINT32		n;
+	ANTLR_UINT32		i;
+
+	if	(t == NULL)
+		return NULL;
+
+	newTree = t->dupNode();
+
+	// Ensure new subtree root has parent/child index set
+	//
+	this->setChildIndex( newTree, t->getChildIndex() );
+	this->setParent(newTree, parent);
+	n = this->getChildCount(t);
+
+	for	(i=0; i < n; i++)
+	{
+		child = this->getChild(t, i);
+		newSubTree = this->dupTreeTT(child, t);
+		this->addChild(newTree, newSubTree);
+	}
+	return	newTree;
+}
+
+template<class ImplTraits>
+void	CommonTreeAdaptor<ImplTraits>::addChild( TreeType* t, TreeType* child)
+{
+	if	(t != NULL && child != NULL)
+	{
+		t->addChild(child);
+	}
+}
+
+template<class ImplTraits>
+void	CommonTreeAdaptor<ImplTraits>::addChildToken( TreeType* t, CommonTokenType* child)
+{
+	if	(t != NULL && child != NULL)
+	{
+		this->addChild(t, this->create(child));
+	}
+}
+
+template<class ImplTraits>
+void	CommonTreeAdaptor<ImplTraits>::setParent( TreeType* child, TreeType* parent)
+{
+	child->setParent(parent);
+}
+
+template<class ImplTraits>
+typename CommonTreeAdaptor<ImplTraits>::TreeType*		CommonTreeAdaptor<ImplTraits>::getParent( TreeType* child)
+{
+	return child->getParent();
+}
+
+template<class ImplTraits>
+typename CommonTreeAdaptor<ImplTraits>::TreeType*		CommonTreeAdaptor<ImplTraits>::errorNode( CommonTokenType* tnstream, CommonTokenType* startToken, CommonTokenType* stopToken)
+{
+	// Use the supplied common tree node stream to get another tree from the factory
+	// TODO: Look at creating the erronode as in Java, but this is complicated by the
+	// need to track and free the memory allocated to it, so for now, we just
+	// want something in the tree that isn't a NULL pointer.
+	//
+	return this->createTypeText( CommonTokenType::TOKEN_INVALID, "Tree Error Node");
+
+}
+
+template<class ImplTraits>
+bool	CommonTreeAdaptor<ImplTraits>::isNilNode( TreeType* t)
+{
+	return t->isNilNode();
+}
+
+template<class ImplTraits>
+typename CommonTreeAdaptor<ImplTraits>::TreeType*	    CommonTreeAdaptor<ImplTraits>::becomeRoot( TreeType* newRootTree, TreeType* oldRootTree)
+{
+	TreeType* saveRoot;
+
+	/* Protect against tree rewrites if we are in some sort of error
+	 * state, but have tried to recover. In C we can end up with a null pointer
+	 * for a tree that was not produced.
+	 */
+	if	(newRootTree == NULL)
+	{
+		return	oldRootTree;
+	}
+
+	/* root is just the new tree as is if there is no
+	 * current root tree.
+	 */
+	if	(oldRootTree == NULL)
+	{
+		return	newRootTree;
+	}
+
+	/* Produce ^(nil real-node)
+	 */
+	if	(newRootTree->isNilNode())
+	{
+		if	(newRootTree->getChildCount() > 1)
+		{
+			/* TODO: Handle tree exceptions 
+			 */
+			fprintf(stderr, "More than one node as root! TODO: Create tree exception handling\n");
+			return newRootTree;
+		}
+
+		/* The new root is the first child, keep track of the original newRoot
+         * because if it was a Nil Node, then we can reuse it now.
+		 */
+        saveRoot    = newRootTree;
+		newRootTree = newRootTree->getChild(0);
+
+        // Reclaim the old nilNode()
+        //
+        saveRoot->reuse();
+	}
+
+	/* Add old root into new root. addChild takes care of the case where oldRoot
+	 * is a flat list (nill rooted tree). All children of oldroot are added to
+	 * new root.
+	 */
+	newRootTree->addChild(oldRootTree);
+
+    // If the oldroot tree was a nil node, then we know at this point
+    // it has become orphaned by the rewrite logic, so we tell it to do
+    // whatever it needs to do to be reused.
+    //
+    if  (oldRootTree->isNilNode())
+    {
+        // We have taken an old Root Tree and appended all its children to the new
+        // root. In addition though it was a nil node, which means the generated code
+        // will not reuse it again, so we will reclaim it here. First we want to zero out
+        // any pointers it was carrying around. We are just the baseTree handler so we
+        // don't know necessarilly know how to do this for the real node, we just ask the tree itself
+        // to do it.
+        //
+        oldRootTree->reuse();
+    }
+	/* Always returns new root structure
+	 */
+	return	newRootTree;
+}
+
+template<class ImplTraits>
+typename CommonTreeAdaptor<ImplTraits>::TreeType*	CommonTreeAdaptor<ImplTraits>::becomeRootToken(CommonTokenType* newRoot, TreeType* oldRoot)
+{
+	return	this->becomeRoot(this->create(newRoot), oldRoot);
+}
+
+template<class ImplTraits>
+typename CommonTreeAdaptor<ImplTraits>::TreeType*	 	CommonTreeAdaptor<ImplTraits>::create( CommonTokenType* payload)
+{
+	return new TreeType(payload);
+}
+
+template<class ImplTraits>
+typename CommonTreeAdaptor<ImplTraits>::TreeType*  CommonTreeAdaptor<ImplTraits>::createTypeToken( ANTLR_UINT32 tokenType, 
+																						  CommonTokenType* fromToken)
+{
+	/* Create the new token
+	 */
+	fromToken = this->createTokenFromToken(fromToken);
+
+	/* Set the type of the new token to that supplied
+	 */
+	fromToken->setType(tokenType);
+
+	/* Return a new node based upon this token
+	 */
+	return	this->create(fromToken);
+
+}
+
+template<class ImplTraits>
+typename CommonTreeAdaptor<ImplTraits>::TreeType*	CommonTreeAdaptor<ImplTraits>::createTypeTokenText( ANTLR_UINT32 tokenType, CommonTokenType* fromToken, const ANTLR_UINT8* text)
+{
+	/* Create the new token
+	 */
+	fromToken = this->createTokenFromToken(fromToken);
+
+	/* Set the type of the new token to that supplied
+	 */
+	fromToken->setType(tokenType);
+
+	/* Set the text of the token accordingly
+	 */
+	fromToken->setText(text);
+
+	/* Return a new node based upon this token
+	 */
+	return	this->create(fromToken);
+}
+
+template<class ImplTraits>
+typename CommonTreeAdaptor<ImplTraits>::TreeType*	    CommonTreeAdaptor<ImplTraits>::createTypeText( ANTLR_UINT32 tokenType, const ANTLR_UINT8* text)
+{
+	CommonTokenType*	fromToken;
+
+	/* Create the new token
+	 */
+	fromToken = this->createToken(tokenType, text);
+
+	/* Return a new node based upon this token
+	 */
+	return	this->create(fromToken);
+}
+
+template<class ImplTraits>
+typename CommonTreeAdaptor<ImplTraits>::TreeType*	CommonTreeAdaptor<ImplTraits>::dupNode( TreeType* treeNode)
+{
+	return  (treeNode == NULL) ? NULL : treeNode->dupNode();
+}
+
+template<class ImplTraits>
+ANTLR_UINT32	CommonTreeAdaptor<ImplTraits>::getType( TreeType* t)
+{
+	return t->getType();
+}
+
+template<class ImplTraits>
+typename CommonTreeAdaptor<ImplTraits>::StringType	CommonTreeAdaptor<ImplTraits>::getText( TreeType* t)
+{
+	return t->getText();
+}
+
+template<class ImplTraits>
+typename CommonTreeAdaptor<ImplTraits>::TreeType*	    CommonTreeAdaptor<ImplTraits>::getChild( TreeType* t, ANTLR_UINT32 i)
+{
+	return t->getChild(i);
+}
+
+template<class ImplTraits>
+void	CommonTreeAdaptor<ImplTraits>::setChild( TreeType* t, ANTLR_UINT32 i, TreeType* child)
+{
+	t->setChild(i, child);
+}
+
+template<class ImplTraits>
+void	CommonTreeAdaptor<ImplTraits>::deleteChild( TreeType* t, ANTLR_UINT32 i)
+{
+	t->deleteChild(i);
+}
+
+template<class ImplTraits>
+void	CommonTreeAdaptor<ImplTraits>::setChildIndex( TreeType* t, ANTLR_INT32 i)
+{
+	t->setChildIndex(i);
+}
+
+template<class ImplTraits>
+ANTLR_INT32	CommonTreeAdaptor<ImplTraits>::getChildIndex( TreeType * t)
+{
+	return t->getChildIndex();
+}
+
+template<class ImplTraits>
+ANTLR_UINT32	CommonTreeAdaptor<ImplTraits>::getChildCount( TreeType* t)
+{
+	return t->getChildCount();
+}
+
+template<class ImplTraits>
+ANTLR_UINT64	CommonTreeAdaptor<ImplTraits>::getUniqueID( TreeType* node )
+{
+	return	reinterpret_cast<ANTLR_UINT64>(node);
+}
+
+template<class ImplTraits>
+typename CommonTreeAdaptor<ImplTraits>::CommonTokenType*    
+	     CommonTreeAdaptor<ImplTraits>::createToken( ANTLR_UINT32 tokenType, const ANTLR_UINT8* text)
+{
+	CommonTokenType*    newToken = new CommonTokenType;
+
+    if	(newToken != NULL)
+    {	
+		newToken->set_tokText( (const char*) text );
+		newToken->setType(tokenType);
+    }
+    return  newToken;
+
+}
+
+template<class ImplTraits>
+typename CommonTreeAdaptor<ImplTraits>::CommonTokenType*    
+	CommonTreeAdaptor<ImplTraits>::createTokenFromToken( CommonTokenType* fromToken)
+{
+	CommonTokenType*    newToken;
+
+    newToken	= new CommonTokenType;
+    
+    if	(newToken != NULL)
+    {
+		// Create the text using our own string factory to avoid complicating
+		// commontoken.
+		//
+		StringType	text = fromToken->getText();
+		newToken->set_tokText( text );
+		newToken->setLine( fromToken->getLine() );
+		newToken->setTokenIndex( fromToken->getTokenIndex() );
+		newToken->setCharPositionInLine( fromToken->getCharPositionInLine() );
+		newToken->setChannel( fromToken->getChannel() );
+		newToken->setType( fromToken->getType() );
+    }
+
+    return  newToken;
+}
+
+template<class ImplTraits>
+typename CommonTreeAdaptor<ImplTraits>::CommonTokenType*  
+		 CommonTreeAdaptor<ImplTraits>::getToken( TreeType* t)
+{
+	return t->getToken();
+}
+
+template<class ImplTraits>
+void CommonTreeAdaptor<ImplTraits>::setTokenBoundaries( TreeType* t, CommonTokenType* startToken, CommonTokenType* stopToken)
+{
+	ANTLR_MARKER   start;
+	ANTLR_MARKER   stop;
+
+	TreeType*	    ct;
+
+	if	(t == NULL)
+	{
+		return;
+	}
+
+	if	( startToken != NULL)
+	{
+		start = startToken->getTokenIndex();
+	}
+	else
+	{
+		start = 0;
+	}
+
+	if	( stopToken != NULL)
+	{
+		stop = stopToken->getTokenIndex();
+	}
+	else
+	{
+		stop = 0;
+	}
+
+	ct	= t;
+
+	ct->set_startIndex(start);
+	ct->set_stopIndex(stop);
+}
+
+template<class ImplTraits>
+ANTLR_MARKER	CommonTreeAdaptor<ImplTraits>::getTokenStartIndex( TreeType* t)
+{
+	return t->get_tokenStartIndex();
+}
+
+template<class ImplTraits>
+ANTLR_MARKER	CommonTreeAdaptor<ImplTraits>::getTokenStopIndex( TreeType* t)
+{
+	return t->get_tokenStopIndex();
+}
+
+template<class ImplTraits>
+typename CommonTreeAdaptor<ImplTraits>::StringType	 CommonTreeAdaptor<ImplTraits>::makeDot( TreeType* theTree)
+{
+	// The string we are building up
+	//
+	StringType		dotSpec;
+	char            buff[64];
+	StringType      text;
+	
+	dotSpec = "digraph {\n\n"
+			"\tordering=out;\n"
+			"\tranksep=.4;\n"
+			"\tbgcolor=\"lightgrey\";  node [shape=box, fixedsize=false, fontsize=12, fontname=\"Helvetica-bold\", fontcolor=\"blue\"\n"
+			"\twidth=.25, height=.25, color=\"black\", fillcolor=\"white\", style=\"filled, solid, bold\"];\n\n"
+			"\tedge [arrowsize=.5, color=\"black\", style=\"bold\"]\n\n";
+
+    if	(theTree == NULL)
+	{
+		// No tree, so create a blank spec
+		//
+		dotSpec->append("n0[label=\"EMPTY TREE\"]\n");
+		return dotSpec;
+	}
+
+    sprintf(buff, "\tn%p[label=\"", theTree);
+	dotSpec.append(buff);
+    text = this->getText(theTree);
+    for (std::size_t j = 0; j < text.size(); j++)
+    {
+            switch(text[j])
+            {
+                case '"':
+                    dotSpec.append("\\\"");
+                    break;
+
+                case '\n':
+                    dotSpec.append("\\n");
+                    break;
+
+                case '\r':
+                    dotSpec.append("\\r");
+                    break;
+
+                default:
+                    dotSpec += text[j];
+                    break;
+            }
+    }
+	dotSpec->append("\"]\n");
+
+	// First produce the node defintions
+	//
+	this->defineDotNodes(theTree, dotSpec);
+	dotSpec.append("\n");
+	this->defineDotEdges(theTree, dotSpec);
+	
+	// Terminate the spec
+	//
+	dotSpec.append("\n}");
+
+	// Result
+	//
+	return dotSpec;
+}
+
+template<class ImplTraits>
+void CommonTreeAdaptor<ImplTraits>::replaceChildren( TreeType* parent, ANTLR_INT32 startChildIndex, ANTLR_INT32 stopChildIndex, TreeType* t)
+{
+	if	(parent != NULL)
+		parent->replaceChildren(startChildIndex, stopChildIndex, t);
+}
+
+template<class ImplTraits>
+CommonTreeAdaptor<ImplTraits>::~CommonTreeAdaptor()
+{
+}
+
+template<class ImplTraits>
+void CommonTreeAdaptor<ImplTraits>::defineDotNodes(TreeType* t, const StringType& dotSpec)
+{
+	// How many nodes are we talking about?
+	//
+	int	nCount;
+	int i;
+    TreeType* child;
+	char	buff[64];
+	StringType	text;
+	int		j;
+
+	// Count the nodes
+	//
+	nCount = this->getChildCount(t);
+
+	if	(nCount == 0)
+	{
+		// This will already have been included as a child of another node
+		// so there is nothing to add.
+		//
+		return;
+	}
+
+	// For each child of the current tree, define a node using the
+	// memory address of the node to name it
+	//
+	for	(i = 0; i<nCount; i++)
+	{
+
+		// Pick up a pointer for the child
+		//
+		child = this->getChild(t, i);
+
+		// Name the node
+		//
+		sprintf(buff, "\tn%p[label=\"", child);
+		dotSpec->append(buff);
+		text = this->getText(child);
+		for (j = 0; j < text.size(); j++)
+		{
+            switch(text[j])
+            {
+                case '"':
+                    dotSpec.append("\\\"");
+                    break;
+
+                case '\n':
+                    dotSpec.append("\\n");
+                    break;
+
+                case '\r':
+                    dotSpec.append("\\r");
+                    break;
+
+                default:
+                    dotSpec += text[j];
+                    break;
+            }
+		}
+		dotSpec.append("\"]\n");
+
+		// And now define the children of this child (if any)
+		//
+		this->defineDotNodes(child, dotSpec);
+	}
+	
+	// Done
+	//
+	return;
+}
+
+template<class ImplTraits>
+void CommonTreeAdaptor<ImplTraits>::defineDotEdges(TreeType* t, const StringType& dotSpec)
+{
+	// How many nodes are we talking about?
+	//
+	int	nCount;
+	if	(t == NULL)
+	{
+		// No tree, so do nothing
+		//
+		return;
+	}
+
+	// Count the nodes
+	//
+	nCount = this->getChildCount(t);
+
+	if	(nCount == 0)
+	{
+		// This will already have been included as a child of another node
+		// so there is nothing to add.
+		//
+		return;
+	}
+
+	// For each child, define an edge from this parent, then process
+	// and children of this child in the same way
+	//
+	for	(int i=0; i<nCount; i++)
+	{
+		TreeType* child;
+		char	buff[128];
+        StringType text;
+
+		// Next child
+		//
+		child	= this->getChild(t, i);
+
+		// Create the edge relation
+		//
+		sprintf(buff, "\t\tn%p -> n%p\t\t// ",  t, child);
+        
+		dotSpec.append(buff);
+
+		// Document the relationship
+		//
+        text = this->getText(t);
+		for (std::size_t j = 0; j < text.size(); j++)
+        {
+                switch(text[j])
+                {
+                    case '"':
+                        dotSpec.append("\\\"");
+                        break;
+
+                    case '\n':
+                        dotSpec.append("\\n");
+                        break;
+
+                    case '\r':
+                        dotSpec.append("\\r");
+                        break;
+
+                    default:
+                        dotSpec += text[j];
+                        break;
+                }
+        }
+
+        dotSpec.append(" -> ");
+
+        text = this->getText(child);
+        for (std::size_t j = 0; j < text.size(); j++)
+        {
+                switch(text[j])
+                {
+                    case '"':
+                        dotSpec.append("\\\"");
+                        break;
+
+                    case '\n':
+                        dotSpec.append("\\n");
+                        break;
+
+                    case '\r':
+                        dotSpec.append("\\r");
+                        break;
+
+                    default:
+                        dotSpec += text[j];
+                        break;
+                }
+        }
+		dotSpec.append("\n");
+        
+		// Define edges for this child
+		//
+		this->defineDotEdges(child, dotSpec);
+	}
+
+	// Done
+	//
+	return;
+}
+
+template<class ImplTraits>
+typename CommonTreeAdaptor<ImplTraits>::TreeType* CommonTreeAdaptor<ImplTraits>::rulePostProcessing( TreeType* root)
+{
+	TreeType* saveRoot;
+
+    // Keep track of the root we are given. If it is a nilNode, then we
+    // can reuse it rather than orphaning it!
+    //
+    saveRoot = root;
+
+	if (root != NULL && root->isNilNode())
+	{
+		if	(root->getChildCount() == 0)
+		{
+			root = NULL;
+		}
+		else if	(root->getChildCount() == 1)
+		{
+			root = root->getChild(0);
+			root->setParent(NULL);
+			root->setChildIndex(-1);
+
+            // The root we were given was a nil node, wiht one child, which means it has
+            // been abandoned and would be lost in the node factory. However
+            // nodes can be flagged as resuable to prevent this terrible waste
+            //
+            saveRoot->reuse();
+		}
+	}
+	return root;
+}
+
+template<class ImplTraits>
+DebugTreeAdaptor<ImplTraits>::DebugTreeAdaptor( DebuggerType* debugger )
+{
+	m_debugger = debugger;
+}
+
+template<class ImplTraits>
+void DebugTreeAdaptor<ImplTraits>::setDebugEventListener( DebuggerType* debugger)
+{
+	m_debugger = debugger;
+}
+
+template<class ImplTraits>
+typename DebugTreeAdaptor<ImplTraits>::TreeType*	  DebugTreeAdaptor<ImplTraits>::nilNode()
+{
+	TreeType*	t = this->create(NULL);
+	m_debugger->createNode(t);
+	return	t;
+}
+
+template<class ImplTraits>
+void	DebugTreeAdaptor<ImplTraits>::addChild(TreeType* t, TreeType* child)
+{
+	if	(t != NULL && child != NULL)
+	{
+		t->addChild(child);
+		m_debugger->addChild(t, child);
+	}
+}
+
+template<class ImplTraits>
+void	DebugTreeAdaptor<ImplTraits>::addChildToken(TreeType* t, CommonTokenType* child)
+{
+	TreeType*	tc;
+	if	(t != NULL && child != NULL)
+	{
+		tc = this->create(child);
+		this->addChild(t, tc);
+		m_debugger->addChild(t, tc);
+	}
+}
+
+template<class ImplTraits>
+typename DebugTreeAdaptor<ImplTraits>::TreeType* DebugTreeAdaptor<ImplTraits>::becomeRoot( TreeType* newRootTree, TreeType* oldRootTree )
+{
+	TreeType* t;
+	t = this->becomeRoot(newRootTree, oldRootTree);
+	m_debugger->becomeRoot(newRootTree, oldRootTree);
+	return t;
+}
+
+template<class ImplTraits>
+typename DebugTreeAdaptor<ImplTraits>::TreeType* DebugTreeAdaptor<ImplTraits>::becomeRootToken(TreeType* newRoot, TreeType* oldRoot)
+{
+	TreeType*	t;
+	t =	this->becomeRoot(this->create(newRoot), oldRoot);
+	m_debugger->becomeRoot(t, oldRoot);
+	return t;
+}
+
+template<class ImplTraits>
+typename DebugTreeAdaptor<ImplTraits>::TreeType* DebugTreeAdaptor<ImplTraits>::createTypeToken(ANTLR_UINT32 tokenType, CommonTokenType* fromToken)
+{
+	TreeType* t;
+	t = this->createTypeToken(tokenType, fromToken);
+	m_debugger->createNode(t);
+	return t;
+}
+
+template<class ImplTraits>
+typename DebugTreeAdaptor<ImplTraits>::TreeType* DebugTreeAdaptor<ImplTraits>::createTypeTokenText(ANTLR_UINT32 tokenType, CommonTokenType* fromToken, ANTLR_UINT8* text)
+{
+	TreeType* t;
+	t = this->createTypeTokenText(tokenType, fromToken, text);
+	m_debugger->createNode(t);
+	return t;
+}
+	
+template<class ImplTraits>
+typename DebugTreeAdaptor<ImplTraits>::TreeType* DebugTreeAdaptor<ImplTraits>::createTypeText( ANTLR_UINT32 tokenType, ANTLR_UINT8* text)
+{
+	TreeType* t;
+	t = this->createTypeText(tokenType, text);
+	m_debugger->createNode(t);
+	return t;
+}
+
+template<class ImplTraits>
+typename DebugTreeAdaptor<ImplTraits>::TreeType* DebugTreeAdaptor<ImplTraits>::dupTree( TreeType* tree)
+{
+	TreeType* t;
+
+	// Call the normal dup tree mechanism first
+	//
+	t = this->dupTreeTT(tree, NULL);
+
+	// In order to tell the debugger what we have just done, we now
+	// simulate the tree building mechanism. THis will fire
+	// lots of debugging events to the client and look like we
+	// duped the tree..
+	//
+	this->simulateTreeConstruction( t);
+
+	return t;
+}
+
+template<class ImplTraits>
+void DebugTreeAdaptor<ImplTraits>::simulateTreeConstruction(TreeType* tree)
+{
+	ANTLR_UINT32		n;
+	ANTLR_UINT32		i;
+	TreeType*	child;
+
+	// Send the create node event
+	//
+	m_debugger->createNode(tree);
+
+	n = this->getChildCount(tree);
+	for	(i = 0; i < n; i++)
+	{
+		child = this->getChild(tree, i);
+		this->simulateTreeConstruction(child);
+		m_debugger->addChild(tree, child);
+	}
+}
+
+
+ANTLR_END_NAMESPACE()
diff --git a/runtime/Cpp/include/antlr3commontreenodestream.hpp b/runtime/Cpp/include/antlr3commontreenodestream.hpp
new file mode 100755
index 0000000..962758f
--- /dev/null
+++ b/runtime/Cpp/include/antlr3commontreenodestream.hpp
@@ -0,0 +1,317 @@
+/// \file
+/// Definition of the ANTLR3 common tree node stream.
+///
+
+#ifndef	_ANTLR_COMMON_TREE_NODE_STREAM__HPP
+#define	_ANTLR_COMMON_TREE_NODE_STREAM__HPP
+
+// [The "BSD licence"]
+// Copyright (c) 2005-2009 Gokulakannan Somasundaram, ElectronDB
+
+//
+// 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.
+
+#include    "antlr3defs.hpp"
+
+ANTLR_BEGIN_NAMESPACE()
+
+template<class ImplTraits>
+class CommonTreeNodeStream : public ImplTraits::TreeNodeIntStreamType
+{
+public:
+	enum Constants
+	{
+		/// Token buffer initial size settings ( will auto increase)
+		///
+		DEFAULT_INITIAL_BUFFER_SIZE	= 100
+		, INITIAL_CALL_STACK_SIZE	= 10
+	};
+
+	typedef typename ImplTraits::TreeType TreeType;
+	typedef TreeType UnitType;
+	typedef typename ImplTraits::StringType StringType;
+	typedef typename ImplTraits::StringStreamType StringStreamType;
+	typedef typename ImplTraits::TreeAdaptorType TreeAdaptorType;
+	typedef typename ImplTraits::TreeNodeIntStreamType IntStreamType;
+	typedef typename ImplTraits::AllocPolicyType AllocPolicyType;
+	typedef typename AllocPolicyType::template VectorType<TreeType*>	NodesType;
+	typedef typename AllocPolicyType::template VectorType< TreeWalkState<ImplTraits> > MarkersType;
+	typedef typename AllocPolicyType::template StackType< ANTLR_INT32 > NodeStackType;
+	typedef typename ImplTraits::TreeParserType ComponentType;
+	typedef typename ImplTraits::CommonTokenType CommonTokenType;
+	typedef typename ImplTraits::TreeNodeIntStreamType BaseType;
+
+public:
+    /// Dummy tree node that indicates a descent into a child
+    /// tree. Initialized by a call to create a new interface.
+    ///
+    TreeType			m_DOWN;
+
+    /// Dummy tree node that indicates a descent up to a parent
+    /// tree. Initialized by a call to create a new interface.
+    ///
+    TreeType			m_UP;
+
+    /// Dummy tree node that indicates the termination point of the
+    /// tree. Initialized by a call to create a new interface.
+    ///
+    TreeType			m_EOF_NODE;
+
+    /// Dummy node that is returned if we need to indicate an invalid node
+    /// for any reason.
+    ///
+    TreeType			m_INVALID_NODE;
+
+	/// The complete mapping from stream index to tree node.
+	/// This buffer includes pointers to DOWN, UP, and EOF nodes.
+	/// It is built upon ctor invocation.  The elements are type
+	/// Object as we don't what the trees look like.
+	///
+	/// Load upon first need of the buffer so we can set token types
+	/// of interest for reverseIndexing.  Slows us down a wee bit to
+	/// do all of the if p==-1 testing everywhere though, though in C
+	/// you won't really be able to measure this.
+	///
+	/// Must be freed when the tree node stream is torn down.
+	///
+	NodesType				m_nodes;
+
+	/// Which tree are we navigating ?
+    ///
+    TreeType*				m_root;
+
+    /// Pointer to tree adaptor interface that manipulates/builds
+    /// the tree.
+    ///
+    TreeAdaptorType*		m_adaptor;
+
+    /// As we walk down the nodes, we must track parent nodes so we know
+    /// where to go after walking the last child of a node.  When visiting
+    /// a child, push current node and current index (current index
+    /// is first stored in the tree node structure to avoid two stacks.
+    ///
+    NodeStackType			m_nodeStack;
+
+	/// The current index into the nodes vector of the current tree
+	/// we are parsing and possibly rewriting.
+	///
+	ANTLR_INT32			m_p;
+
+    /// Which node are we currently visiting?
+    ///
+    TreeType*		m_currentNode;
+
+    /// Which node did we last visit? Used for LT(-1)
+    ///
+    TreeType*		m_previousNode;
+
+    /// Which child are we currently visiting?  If -1 we have not visited
+    /// this node yet; next consume() request will set currentIndex to 0.
+    ///
+    ANTLR_INT32		m_currentChildIndex;
+
+    /// What node index did we just consume?  i=0..n-1 for n node trees.
+    /// IntStream.next is hence 1 + this value.  Size will be same.
+    ///
+    ANTLR_MARKER	m_absoluteNodeIndex;
+
+    /// Buffer tree node stream for use with LT(i).  This list grows
+    /// to fit new lookahead depths, but consume() wraps like a circular
+    /// buffer.
+    ///
+    TreeType**		m_lookAhead;
+
+    /// Number of elements available in the lookahead buffer at any point in
+    ///  time. This is the current size of the array.
+    ///
+    ANTLR_UINT32		m_lookAheadLength;
+
+    /// lookAhead[head] is the first symbol of lookahead, LT(1). 
+    ///
+    ANTLR_UINT32		m_head;
+
+    /// Add new lookahead at lookahead[tail].  tail wraps around at the
+    /// end of the lookahead buffer so tail could be less than head.
+    ///
+    ANTLR_UINT32		m_tail;
+
+    /// Calls to mark() may be nested so we have to track a stack of
+    /// them.  The marker is an index into this stack.  Index 0 is
+    /// the first marker.  This is a List<TreeWalkState>
+    ///
+    MarkersType			m_markers;
+
+	/// Indicates whether this node stream was derived from a prior
+	/// node stream to be used by a rewriting tree parser for instance.
+	/// If this flag is set to ANTLR_TRUE, then when this stream is
+	/// closed it will not free the root tree as this tree always
+	/// belongs to the origniating node stream.
+	///
+	bool				m_isRewriter;
+
+    /// If set to ANTLR_TRUE then the navigation nodes UP, DOWN are
+    /// duplicated rather than reused within the tree.
+    ///
+    bool				m_uniqueNavigationNodes;
+
+public:
+    // INTERFACE
+	//
+	CommonTreeNodeStream( ANTLR_UINT32 hint );
+	CommonTreeNodeStream( const CommonTreeNodeStream& ctn );
+	CommonTreeNodeStream( TreeType* tree, ANTLR_UINT32 hint );
+
+	void init( ANTLR_UINT32 hint );
+	~CommonTreeNodeStream();
+
+	/// Get tree node at current input pointer + i ahead where i=1 is next node.
+	/// i<0 indicates nodes in the past.  So LT(-1) is previous node, but
+	/// implementations are not required to provide results for k < -1.
+	/// LT(0) is undefined.  For i>=n, return null.
+	/// Return NULL for LT(0) and any index that results in an absolute address
+	/// that is negative (beyond the start of the list).
+	///
+	/// This is analogous to the LT() method of the TokenStream, but this
+	/// returns a tree node instead of a token.  Makes code gen identical
+	/// for both parser and tree grammars. :)
+	///
+    TreeType*	_LT(ANTLR_INT32 k);
+
+	/// Where is this stream pulling nodes from?  This is not the name, but
+	/// the object that provides node objects.
+	///
+    TreeType*	getTreeSource();
+
+	/// What adaptor can tell me how to interpret/navigate nodes and
+	/// trees.  E.g., get text of a node.
+	///
+    TreeAdaptorType*	getTreeAdaptor();
+
+	/// As we flatten the tree, we use UP, DOWN nodes to represent
+	/// the tree structure.  When debugging we need unique nodes
+	/// so we have to instantiate new ones.  When doing normal tree
+	/// parsing, it's slow and a waste of memory to create unique
+	/// navigation nodes.  Default should be false;
+	///
+    void  set_uniqueNavigationNodes(bool uniqueNavigationNodes);
+
+    StringType	toString();
+
+	/// Return the text of all nodes from start to stop, inclusive.
+	/// If the stream does not buffer all the nodes then it can still
+	/// walk recursively from start until stop.  You can always return
+	/// null or "" too, but users should not access $ruleLabel.text in
+	/// an action of course in that case.
+	///
+    StringType	toStringSS(TreeType* start, TreeType* stop);
+
+	/// Return the text of all nodes from start to stop, inclusive, into the
+	/// supplied buffer.
+	/// If the stream does not buffer all the nodes then it can still
+	/// walk recursively from start until stop.  You can always return
+	/// null or "" too, but users should not access $ruleLabel.text in
+	/// an action of course in that case.
+	///
+    void toStringWork(TreeType* start, TreeType* stop, StringType& buf);
+
+	/// Get a tree node at an absolute index i; 0..n-1.
+	/// If you don't want to buffer up nodes, then this method makes no
+	/// sense for you.
+	///
+	TreeType*	get(ANTLR_INT32 i);
+
+	// REWRITING TREES (used by tree parser)
+
+	/// Replace from start to stop child index of parent with t, which might
+	/// be a list.  Number of children may be different
+	/// after this call.  The stream is notified because it is walking the
+	/// tree and might need to know you are monkeying with the underlying
+	/// tree.  Also, it might be able to modify the node stream to avoid
+	/// restreaming for future phases.
+	///
+	/// If parent is null, don't do anything; must be at root of overall tree.
+	/// Can't replace whatever points to the parent externally.  Do nothing.
+	///
+	void replaceChildren(TreeType* parent, ANTLR_INT32 startChildIndex, 
+										ANTLR_INT32 stopChildIndex, TreeType* t);
+
+	TreeType* LB(ANTLR_INT32 k);
+
+	/// As we flatten the tree, we use UP, DOWN nodes to represent
+	/// the tree structure.  When debugging we need unique nodes
+	/// so instantiate new ones when uniqueNavigationNodes is true.
+	///
+    void	addNavigationNode(ANTLR_UINT32 ttype);
+
+    TreeType*	newDownNode();
+
+	TreeType*	newUpNode();
+
+    bool	hasUniqueNavigationNodes() const;
+
+    ANTLR_UINT32	getLookaheadSize();
+
+	void	push(ANTLR_INT32 index);
+
+	ANTLR_INT32	pop();
+
+    void	reset();
+
+	void fillBufferRoot();
+	void fillBuffer(TreeType* t);
+	
+};
+
+/** This structure is used to save the state information in the treenodestream
+ *  when walking ahead with cyclic DFA or for syntactic predicates,
+ *  we need to record the state of the tree node stream.  This
+ *  class wraps up the current state of the CommonTreeNodeStream.
+ *  Calling mark() will push another of these on the markers stack.
+ */
+template<class ImplTraits>
+class TreeWalkState : public ImplTraits::AllocPolicyType
+{
+public:
+	typedef typename ImplTraits::TreeType TreeType;
+
+private:
+    ANTLR_UINT32		m_currentChildIndex;
+    ANTLR_MARKER		m_absoluteNodeIndex;
+    TreeType*		m_currentNode;
+    TreeType*		m_previousNode;
+    ANTLR_UINT32		m_nodeStackSize;
+    TreeType*		m_lookAhead;
+    ANTLR_UINT32		m_lookAheadLength;
+    ANTLR_UINT32		m_tail;
+    ANTLR_UINT32		m_head;
+
+
+};
+
+ANTLR_END_NAMESPACE()
+
+#include "antlr3commontreenodestream.inl"
+
+#endif
diff --git a/runtime/Cpp/include/antlr3commontreenodestream.inl b/runtime/Cpp/include/antlr3commontreenodestream.inl
new file mode 100755
index 0000000..4dce47c
--- /dev/null
+++ b/runtime/Cpp/include/antlr3commontreenodestream.inl
@@ -0,0 +1,422 @@
+ANTLR_BEGIN_NAMESPACE()
+
+template<class ImplTraits>
+CommonTreeNodeStream<ImplTraits>::CommonTreeNodeStream(ANTLR_UINT32 hint)
+{
+	this->init(hint);
+}
+
+template<class ImplTraits>
+void CommonTreeNodeStream<ImplTraits>::init( ANTLR_UINT32 hint )
+{
+	m_root = NULL;
+	m_adaptor = new TreeAdaptorType;
+	// Create the node list map
+	//
+	if	(hint == 0)
+		hint = DEFAULT_INITIAL_BUFFER_SIZE;
+	m_nodes.reserve( DEFAULT_INITIAL_BUFFER_SIZE );
+
+	m_p = -1;
+	m_currentNode = NULL;
+	m_previousNode = NULL;
+	m_currentChildIndex = 0; 
+	m_absoluteNodeIndex = 0;
+	m_lookAhead = NULL;
+	m_lookAheadLength = 0;
+	m_head = 0;
+	m_tail = 0;
+	m_uniqueNavigationNodes = false;
+	m_isRewriter = false;
+
+	CommonTokenType* token		= new CommonTokenType(CommonTokenType::TOKEN_UP);
+	token->set_tokText( "UP" );
+	m_UP.set_token( token );
+
+	token		= new CommonTokenType(CommonTokenType::TOKEN_DOWN);
+	token->set_tokText( "DOWN" );
+	m_DOWN.set_token( token );
+
+	token		= new CommonTokenType(CommonTokenType::TOKEN_EOF);
+	token->set_tokText( "EOF" );
+	m_EOF_NODE.set_token( token );
+
+	token		= new CommonTokenType(CommonTokenType::TOKEN_INVALID);
+	token->set_tokText( "INVALID" );
+	m_EOF_NODE.set_token( token );
+}
+
+template<class ImplTraits>
+CommonTreeNodeStream<ImplTraits>::CommonTreeNodeStream( const CommonTreeNodeStream& ctn )
+{
+	m_root = ctn.m_root;
+	m_adaptor = ctn.m_adaptor;
+	m_nodes.reserve( DEFAULT_INITIAL_BUFFER_SIZE );
+	m_nodeStack = ctn.m_nodeStack;
+	m_p = -1;
+	m_currentNode = NULL;
+	m_previousNode = NULL;
+	m_currentChildIndex = 0; 
+	m_absoluteNodeIndex = 0;
+	m_lookAhead = NULL;
+	m_lookAheadLength = 0;
+	m_head = 0;
+	m_tail = 0;
+	m_uniqueNavigationNodes = false;
+	m_isRewriter = true;
+
+	m_UP.set_token( ctn.m_UP.get_token() );
+	m_DOWN.set_token( ctn.m_DOWN.get_token() );
+	m_EOF_NODE.set_token( ctn.m_EOF_NODE.get_token() );
+	m_INVALID_NODE.set_token( ctn.m_INVALID_NODE.get_token() );
+}
+
+template<class ImplTraits>
+CommonTreeNodeStream<ImplTraits>::CommonTreeNodeStream( TreeType* tree, ANTLR_UINT32 hint )
+{
+	this->init(hint);
+	m_root = tree;
+}
+
+template<class ImplTraits>
+CommonTreeNodeStream<ImplTraits>::~CommonTreeNodeStream()
+{
+	// If this is a rewrting stream, then certain resources
+	// belong to the originating node stream and we do not
+	// free them here.
+	//
+	if	( m_isRewriter != true)
+	{
+		delete m_adaptor;
+
+		m_nodeStack.clear();
+
+		delete m_INVALID_NODE.get_token();
+		delete m_EOF_NODE.get_token();
+		delete m_DOWN.get_token();
+		delete m_UP.get_token();
+	}
+	
+	m_nodes.clear();
+}
+
+template<class ImplTraits>
+typename CommonTreeNodeStream<ImplTraits>::TreeType*	CommonTreeNodeStream<ImplTraits>::_LT(ANTLR_INT32 k)
+{
+	if	( m_p == -1)
+	{
+		this->fillBufferRoot();
+	}
+
+	if	(k < 0)
+	{
+		return this->LB(-k);
+	}
+	else if	(k == 0)
+	{
+		return	&(m_INVALID_NODE);
+	}
+
+	// k was a legitimate request, 
+	//
+	if	(( m_p + k - 1) >= (ANTLR_INT32)(m_nodes.size()))
+	{
+		return &(m_EOF_NODE);
+	}
+
+	return	m_nodes[ m_p + k - 1 ];
+}
+
+template<class ImplTraits>
+typename CommonTreeNodeStream<ImplTraits>::TreeType*	CommonTreeNodeStream<ImplTraits>::getTreeSource()
+{
+	return m_root;
+}
+
+template<class ImplTraits>
+typename CommonTreeNodeStream<ImplTraits>::TreeAdaptorType*	CommonTreeNodeStream<ImplTraits>::getTreeAdaptor()
+{
+	return m_adaptor;
+}
+
+template<class ImplTraits>
+void  CommonTreeNodeStream<ImplTraits>::set_uniqueNavigationNodes(bool uniqueNavigationNodes)
+{
+	m_uniqueNavigationNodes = uniqueNavigationNodes;
+}
+
+template<class ImplTraits>
+typename CommonTreeNodeStream<ImplTraits>::StringType  CommonTreeNodeStream<ImplTraits>::toString()
+{
+    return  this->toStringSS(m_root, NULL);
+}
+
+template<class ImplTraits>
+typename CommonTreeNodeStream<ImplTraits>::StringType  CommonTreeNodeStream<ImplTraits>::toStringSS(TreeType* start, TreeType* stop)
+{
+	StringType  buf;
+    this->toStringWork(start, stop, buf);
+    return  buf;
+}
+
+template<class ImplTraits>
+void CommonTreeNodeStream<ImplTraits>::toStringWork(TreeType* start, TreeType* stop, StringType& str)
+{
+	ANTLR_UINT32   n;
+	ANTLR_UINT32   c;
+	StringStreamType buf;
+
+	if	(!start->isNilNode() )
+	{
+		StringType	text;
+
+		text	= start->toString();
+
+		if  (text.empty())
+		{
+			buf << ' ';
+			buf << start->getType();
+		}
+		else
+			buf << text;
+	}
+
+	if	(start == stop)
+	{
+		return;		/* Finished */
+	}
+
+	n = start->getChildCount();
+
+	if	(n > 0 && ! start->isNilNode() )
+	{
+		buf << ' ';
+		buf << CommonTokenType::TOKEN_DOWN;
+	}
+
+	for	(c = 0; c<n ; c++)
+	{
+		TreeType*   child;
+
+		child = start->getChild(c);
+		this->toStringWork(child, stop, buf);
+	}
+
+	if	(n > 0 && ! start->isNilNode() )
+	{
+		buf << ' ';
+		buf << CommonTokenType::TOKEN_UP;
+	}
+	str = buf.str();
+}
+
+template<class ImplTraits>
+typename  CommonTreeNodeStream<ImplTraits>::TreeType*	CommonTreeNodeStream<ImplTraits>::get(ANTLR_INT32 k)
+{
+	if( m_p == -1 )
+	{
+		this->fillBufferRoot();
+	}
+
+	return m_nodes[k];
+}
+
+template<class ImplTraits>
+void	CommonTreeNodeStream<ImplTraits>::replaceChildren(TreeType* parent, 
+															ANTLR_INT32 startChildIndex, 
+															ANTLR_INT32 stopChildIndex, 
+															TreeType* t)
+{
+	if	(parent != NULL)
+	{
+		TreeAdaptorType*	adaptor;
+		adaptor	= this->getTreeAdaptor();
+		adaptor->replaceChildren(parent, startChildIndex, stopChildIndex, t);
+	}
+}
+
+template<class ImplTraits>
+typename CommonTreeNodeStream<ImplTraits>::TreeType* CommonTreeNodeStream<ImplTraits>::LB(ANTLR_INT32 k)
+{
+	if	( k==0)
+	{
+		return	&(m_INVALID_NODE);
+	}
+
+	if	( (m_p - k) < 0)
+	{
+		return	&(m_INVALID_NODE);
+	}
+
+	return m_nodes[ m_p - k ];
+}
+
+template<class ImplTraits>
+void CommonTreeNodeStream<ImplTraits>::addNavigationNode(ANTLR_UINT32 ttype)
+{
+	TreeType*	    node;
+
+	node = NULL;
+
+	if	(ttype == CommonTokenType::TOKEN_DOWN)
+	{
+		if  (this->hasUniqueNavigationNodes() == true)
+		{
+			node    = this->newDownNode();
+		}
+		else
+		{
+			node    = &m_DOWN;
+		}
+	}
+	else
+	{
+		if  (this->hasUniqueNavigationNodes() == true)
+		{
+			node    = this->newUpNode();
+		}
+		else
+		{
+			node    = &m_UP;
+		}
+	}
+
+	// Now add the node we decided upon.
+	//
+	m_nodes.push_back(node);
+}
+
+template<class ImplTraits>
+typename CommonTreeNodeStream<ImplTraits>::TreeType*	CommonTreeNodeStream<ImplTraits>::newDownNode()
+{
+	TreeType*	    dNode;
+    CommonTokenType*    token;
+
+    token					= new CommonTokenType(CommonTokenType::TOKEN_DOWN);
+	token->set_tokText("DOWN");
+    dNode					= new TreeType(token);
+    return  &dNode;
+}
+
+template<class ImplTraits>
+typename CommonTreeNodeStream<ImplTraits>::TreeType*	CommonTreeNodeStream<ImplTraits>::newUpNode()
+{
+	TreeType*	    uNode;
+    CommonTokenType*    token;
+
+    token					= new CommonTokenType(CommonTokenType::TOKEN_UP);
+	token->set_tokText("UP");
+    uNode					= new TreeType(token);
+    return  &uNode;
+
+}
+
+template<class ImplTraits>
+bool  CommonTreeNodeStream<ImplTraits>::hasUniqueNavigationNodes() const
+{
+	 return  m_uniqueNavigationNodes;
+}
+
+template<class ImplTraits>
+ANTLR_UINT32	CommonTreeNodeStream<ImplTraits>::getLookaheadSize()
+{
+	return	m_tail < m_head 
+	    ?	(m_lookAheadLength - m_head + m_tail)
+	    :	(m_tail - m_head);
+}
+
+template<class ImplTraits>
+void	CommonTreeNodeStream<ImplTraits>::push(ANTLR_INT32 index)
+{
+	m_nodeStack.push(m_p);	// Save current index
+	this->seek(index);
+}
+
+template<class ImplTraits>
+ANTLR_INT32	CommonTreeNodeStream<ImplTraits>::pop()
+{
+	ANTLR_INT32	retVal;
+
+	retVal = m_nodeStack.top();
+	m_nodeStack.pop();
+	this->seek(retVal);
+	return retVal;
+}
+
+template<class ImplTraits>
+void	CommonTreeNodeStream<ImplTraits>::reset()
+{
+	if	( m_p != -1)
+	{
+		m_p	= 0;
+	}
+	BaseType::m_lastMarker		= 0;
+
+
+	// Free and reset the node stack only if this is not
+	// a rewriter, which is going to reuse the originating
+	// node streams node stack
+	//
+	if  (m_isRewriter != true)
+		m_nodeStack.clear();
+}
+
+template<class ImplTraits>
+void CommonTreeNodeStream<ImplTraits>::fillBufferRoot()
+{
+	// Call the generic buffer routine with the root as the
+	// argument
+	//
+	this->fillBuffer(m_root);
+	m_p = 0;					// Indicate we are at buffer start
+}
+
+template<class ImplTraits>
+void CommonTreeNodeStream<ImplTraits>::fillBuffer(TreeType* t)
+{
+	bool	nilNode;
+	ANTLR_UINT32	nCount;
+	ANTLR_UINT32	c;
+
+	nilNode = m_adaptor->isNilNode(t);
+
+	// If the supplied node is not a nil (list) node then we
+	// add in the node itself to the vector
+	//
+	if	(nilNode == false)
+	{
+		m_nodes.push_back(t);	
+	}
+
+	// Only add a DOWN node if the tree is not a nil tree and
+	// the tree does have children.
+	//
+	nCount = t->getChildCount();
+
+	if	(nilNode == false && nCount>0)
+	{
+		this->addNavigationNode( CommonTokenType::TOKEN_DOWN);
+	}
+
+	// We always add any children the tree contains, which is
+	// a recursive call to this function, which will cause similar
+	// recursion and implement a depth first addition
+	//
+	for	(c = 0; c < nCount; c++)
+	{
+		this->fillBuffer( m_adaptor->getChild(t, c));
+	}
+
+	// If the tree had children and was not a nil (list) node, then we
+	// we need to add an UP node here to match the DOWN node
+	//
+	if	(nilNode == false && nCount > 0)
+	{
+		this->addNavigationNode(CommonTokenType::TOKEN_UP);
+	}
+}
+
+
+
+ANTLR_END_NAMESPACE()
+
diff --git a/runtime/Cpp/include/antlr3convertutf.hpp b/runtime/Cpp/include/antlr3convertutf.hpp
new file mode 100755
index 0000000..8085c29
--- /dev/null
+++ b/runtime/Cpp/include/antlr3convertutf.hpp
@@ -0,0 +1,143 @@
+/*
+ * Copyright 2001-2004 Unicode, Inc.
+ * 
+ * Disclaimer
+ * 
+ * This source code is provided as is by Unicode, Inc. No claims are
+ * made as to fitness for any particular purpose. No warranties of any
+ * kind are expressed or implied. The recipient agrees to determine
+ * applicability of information provided. If this file has been
+ * purchased on magnetic or optical media from Unicode, Inc., the
+ * sole remedy for any claim will be exchange of defective media
+ * within 90 days of receipt.
+ * 
+ * Limitations on Rights to Redistribute This Code
+ * 
+ * Unicode, Inc. hereby grants the right to freely use the information
+ * supplied in this file in the creation of products supporting the
+ * Unicode Standard, and to make copies of this file in any form
+ * for internal or external distribution as long as this notice
+ * remains attached.
+ */
+
+/* ---------------------------------------------------------------------
+
+    Conversions between UTF32, UTF-16, and UTF-8.  Header file.
+
+    Several functions are included here, forming a complete set of
+    conversions between the three formats.  UTF-7 is not included
+    here, but is handled in a separate source file.
+
+    Each of these routines takes pointers to input buffers and output
+    buffers.  The input buffers are const.
+
+    Each routine converts the text between *sourceStart and sourceEnd,
+    putting the result into the buffer between *targetStart and
+    targetEnd. Note: the end pointers are *after* the last item: e.g. 
+    *(sourceEnd - 1) is the last item.
+
+    The return result indicates whether the conversion was successful,
+    and if not, whether the problem was in the source or target buffers.
+    (Only the first encountered problem is indicated.)
+
+    After the conversion, *sourceStart and *targetStart are both
+    updated to point to the end of last text successfully converted in
+    the respective buffers.
+
+    Input parameters:
+	sourceStart - pointer to a pointer to the source buffer.
+		The contents of this are modified on return so that
+		it points at the next thing to be converted.
+	targetStart - similarly, pointer to pointer to the target buffer.
+	sourceEnd, targetEnd - respectively pointers to the ends of the
+		two buffers, for overflow checking only.
+
+    These conversion functions take a ConversionFlags argument. When this
+    flag is set to strict, both irregular sequences and isolated surrogates
+    will cause an error.  When the flag is set to lenient, both irregular
+    sequences and isolated surrogates are converted.
+
+    Whether the flag is strict or lenient, all illegal sequences will cause
+    an error return. This includes sequences such as: <F4 90 80 80>, <C0 80>,
+    or <A0> in UTF-8, and values above 0x10FFFF in UTF-32. Conformant code
+    must check for illegal sequences.
+
+    When the flag is set to lenient, characters over 0x10FFFF are converted
+    to the replacement character; otherwise (when the flag is set to strict)
+    they constitute an error.
+
+    Output parameters:
+	The value "sourceIllegal" is returned from some routines if the input
+	sequence is malformed.  When "sourceIllegal" is returned, the source
+	value will point to the illegal value that caused the problem. E.g.,
+	in UTF-8 when a sequence is malformed, it points to the start of the
+	malformed sequence.  
+
+    Author: Mark E. Davis, 1994.
+    Rev History: Rick McGowan, fixes & updates May 2001.
+		 Fixes & updates, Sept 2001.
+
+------------------------------------------------------------------------ */
+
+/* ---------------------------------------------------------------------
+    The following 4 definitions are compiler-specific.
+    The C standard does not guarantee that wchar_t has at least
+    16 bits, so wchar_t is no less portable than unsigned short!
+    All should be unsigned values to avoid sign extension during
+    bit mask & shift operations.
+------------------------------------------------------------------------ */
+
+
+// Changes for ANTLR3 - Jim Idle, January 2008.
+// builtin types defined for Unicode types changed to
+// aliases for the types that are system determined by
+// ANTLR at compile time.
+//
+// typedef unsigned long	UTF32;	/* at least 32 bits */
+// typedef unsigned short	UTF16;	/* at least 16 bits */
+// typedef unsigned char	UTF8;	/* typically 8 bits */
+// typedef unsigned char	Boolean; /* 0 or 1 */
+
+#ifndef	_ANTLR3_CONVERTUTF_H
+#define	_ANTLR3_CONVERTUTF_H
+
+ANTLR_BEGIN_NAMESPACE()
+
+typedef ANTLR_UINT32	UTF32;	/* at least 32 bits */
+typedef ANTLR_UINT16	UTF16;	/* at least 16 bits */
+typedef ANTLR_UINT8		UTF8;	/* typically 8 bits */
+
+/* Some fundamental constants */
+#define UNI_REPLACEMENT_CHAR (UTF32)0x0000FFFD
+#define UNI_MAX_BMP (UTF32)0x0000FFFF
+#define UNI_MAX_UTF16 (UTF32)0x0010FFFF
+#define UNI_MAX_UTF32 (UTF32)0x7FFFFFFF
+#define UNI_MAX_LEGAL_UTF32 (UTF32)0x0010FFFF
+
+#define UNI_SUR_HIGH_START  (UTF32)0xD800
+#define UNI_SUR_HIGH_END    (UTF32)0xDBFF
+#define UNI_SUR_LOW_START   (UTF32)0xDC00
+#define UNI_SUR_LOW_END     (UTF32)0xDFFF
+#define halfShift           ((UTF32)10)
+#define halfBase            ((UTF32)0x0010000UL)
+#define halfMask            ((UTF32)0x3FFUL)
+
+enum ConversionResult {
+	conversionOK, 		/* conversion successful */
+	sourceExhausted,	/* partial character in source, but hit end */
+	targetExhausted,	/* insuff. room in target for conversion */
+	sourceIllegal		/* source sequence is illegal/malformed */
+};
+
+enum ConversionFlags {
+	strictConversion = 0,
+	lenientConversion
+} ;
+
+
+
+ANTLR_END_NAMESPACE()
+
+#endif
+
+/* --------------------------------------------------------------------- */
diff --git a/runtime/Cpp/include/antlr3cyclicdfa.hpp b/runtime/Cpp/include/antlr3cyclicdfa.hpp
new file mode 100755
index 0000000..a0d66b9
--- /dev/null
+++ b/runtime/Cpp/include/antlr3cyclicdfa.hpp
@@ -0,0 +1,108 @@
+/// Definition of a cyclic dfa structure such that it can be
+/// initialized at compile time and have only a single
+/// runtime function that can deal with all cyclic dfa
+/// structures and show Java how it is done ;-)
+///
+#ifndef	ANTLR3_CYCLICDFA_HPP
+#define	ANTLR3_CYCLICDFA_HPP
+
+// [The "BSD licence"]
+// Copyright (c) 2005-2009 Gokulakannan Somasundaram, ElectronDB
+
+//
+// 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.
+
+#include   "antlr3defs.hpp"
+
+#ifdef ANTLR3_WINDOWS
+#pragma warning	(push)
+#pragma warning (disable : 4510)
+#pragma warning (disable : 4512)
+#pragma warning (disable : 4610)
+#endif
+
+ANTLR_BEGIN_NAMESPACE()
+
+template<class ImplTraits, class CtxType>
+class CyclicDFA : public ImplTraits::AllocPolicyType
+{
+public:
+	typedef typename CtxType::StreamType StreamType;
+	typedef typename CtxType::ExceptionBaseType ExceptionBaseType;
+	typedef typename ImplTraits::template RecognizerType<StreamType> RecognizerType;
+	typedef typename StreamType::IntStreamType IntStreamType;
+	typedef typename StreamType::TokenType	TokenType;
+	typedef TokenType	CommonTokenType;
+	typedef CtxType ContextType;
+
+private:
+    /// Decision number that a particular static structure
+    ///  represents.
+    ///
+    const ANTLR_INT32		m_decisionNumber;
+
+    /// What this decision represents
+    ///
+    const ANTLR_UCHAR*			m_description;
+	const ANTLR_INT32* const	m_eot;
+    const ANTLR_INT32* const	m_eof;
+    const ANTLR_INT32* const	m_min;
+    const ANTLR_INT32* const	m_max;
+    const ANTLR_INT32* const	m_accept;
+    const ANTLR_INT32* const	m_special;
+    const ANTLR_INT32* const *const	m_transition;
+
+public:
+	CyclicDFA( ANTLR_INT32	decisionNumber
+				, const ANTLR_UCHAR*	description
+				, const ANTLR_INT32* const	eot
+				, const ANTLR_INT32* const	eof
+				, const ANTLR_INT32* const	min
+				, const ANTLR_INT32* const	max
+				, const ANTLR_INT32* const	accept
+				, const ANTLR_INT32* const	special
+				, const ANTLR_INT32* const *const	transition );
+	CyclicDFA( const CyclicDFA& cdfa );
+    CyclicDFA& operator=( const CyclicDFA& dfa);
+	
+	ANTLR_INT32	specialStateTransition(CtxType * ctx, RecognizerType* recognizer, IntStreamType* is, ANTLR_INT32 s);
+    ANTLR_INT32	specialTransition(CtxType * ctx, RecognizerType* recognizer, IntStreamType* is, ANTLR_INT32 s);
+
+	template<typename SuperType>
+    ANTLR_INT32	predict(CtxType* ctx, RecognizerType* recognizer, IntStreamType* is, SuperType& super);
+	
+private:
+	void noViableAlt(RecognizerType* rec, ANTLR_UINT32	s);
+};
+
+ANTLR_END_NAMESPACE()
+
+#ifdef ANTLR3_WINDOWS
+#pragma warning	(pop)
+#endif
+
+#include "antlr3cyclicdfa.inl"
+
+#endif
diff --git a/runtime/Cpp/include/antlr3cyclicdfa.inl b/runtime/Cpp/include/antlr3cyclicdfa.inl
new file mode 100755
index 0000000..b7b526f
--- /dev/null
+++ b/runtime/Cpp/include/antlr3cyclicdfa.inl
@@ -0,0 +1,204 @@
+ANTLR_BEGIN_NAMESPACE()
+
+template<class ImplTraits, class CtxType>
+CyclicDFA<ImplTraits, CtxType>::CyclicDFA( ANTLR_INT32	decisionNumber
+				, const ANTLR_UCHAR*	description
+				, const ANTLR_INT32* const	eot
+				, const ANTLR_INT32* const	eof
+				, const ANTLR_INT32* const	min
+				, const ANTLR_INT32* const	max
+				, const ANTLR_INT32* const	accept
+				, const ANTLR_INT32* const	special
+				, const ANTLR_INT32* const *const	transition )
+				:m_decisionNumber(decisionNumber)
+				, m_eot(eot)
+				, m_eof(eof)
+				, m_min(min)
+				, m_max(max)
+				, m_accept(accept)
+				, m_special(special)
+				, m_transition(transition)
+{
+	m_description = description;
+}
+
+template<class ImplTraits, class CtxType>
+CyclicDFA<ImplTraits, CtxType>::CyclicDFA( const CyclicDFA& dfa )
+{
+	m_decisionNumber = dfa.m_decisionNumber;
+	m_description = dfa.m_description;
+	m_eot = dfa.m_eot;
+	m_eof = dfa.m_eof;
+	m_min = dfa.m_min;
+	m_max = dfa.m_max;
+	m_accept = dfa.m_accept;
+	m_special = dfa.m_special;
+	m_transition = dfa.m_transition;
+}
+
+template<class ImplTraits, class CtxType>
+CyclicDFA<ImplTraits, CtxType>& CyclicDFA<ImplTraits, CtxType>::operator=( const CyclicDFA& dfa)
+{
+	m_decisionNumber = dfa.m_decisionNumber;
+	m_description = dfa.m_description;
+	m_eot = dfa.m_eot;
+	m_eof = dfa.m_eof;
+	m_min = dfa.m_min;
+	m_max = dfa.m_max;
+	m_accept = dfa.m_accept;
+	m_special = dfa.m_special;
+	m_transition = dfa.m_transition;
+	return *this;
+}
+
+template<class ImplTraits, class CtxType>
+ANTLR_INT32	CyclicDFA<ImplTraits, CtxType>::specialStateTransition(CtxType * ,
+																	RecognizerType* ,
+																	IntStreamType* , ANTLR_INT32 )
+{
+	return -1;
+}
+
+template<class ImplTraits, class CtxType>
+ANTLR_INT32	CyclicDFA<ImplTraits, CtxType>::specialTransition(CtxType * ctx,
+																	RecognizerType* recognizer,
+																	IntStreamType* is, ANTLR_INT32 s)
+{
+	return 0;
+}
+
+template<class ImplTraits, class CtxType>
+  template<typename SuperType>
+ANTLR_INT32	CyclicDFA<ImplTraits, CtxType>::predict(CtxType * ctx,
+															RecognizerType* recognizer,
+															IntStreamType* is, SuperType& super)
+{
+	ANTLR_MARKER	mark;
+    ANTLR_INT32	s;
+    ANTLR_INT32	specialState;
+    ANTLR_INT32	c;
+
+    mark	= is->mark();	    /* Store where we are right now	*/
+    s		= 0;		    /* Always start with state 0	*/
+
+	for (;;)
+	{
+		/* Pick out any special state entry for this state
+		 */
+		specialState	= m_special[s];
+
+		/* Transition the special state and consume an input token
+		 */
+		if  (specialState >= 0)
+		{
+			s = super.specialStateTransition(ctx, recognizer, is, specialState);
+
+			// Error?
+			//
+			if	(s<0)
+			{
+				// If the predicate/rule raised an exception then we leave it
+				// in tact, else we have an NVA.
+				//
+				if	(recognizer->get_state()->get_error() != true)
+				{
+					this->noViableAlt(recognizer, s);
+				}
+				is->rewind(mark);
+				return	0;
+			}
+			is->consume();
+			continue;
+		}
+
+		/* Accept state?
+		 */
+		if  (m_accept[s] >= 1)
+		{
+			is->rewind(mark);
+			return  m_accept[s];
+		}
+
+		/* Look for a normal transition state based upon the input token element
+		 */
+		c = is->_LA(1);
+
+		/* Check against min and max for this state
+		 */
+		if  (c>= m_min[s] && c <= m_max[s])
+		{
+			ANTLR_INT32   snext;
+
+			/* What is the next state?
+			 */
+			snext = m_transition[s][c - m_min[s]];
+
+			if	(snext < 0)
+			{
+				/* Was in range but not a normal transition
+				 * must check EOT, which is like the else clause.
+				 * eot[s]>=0 indicates that an EOT edge goes to another
+				 * state.
+				 */
+				if  ( m_eot[s] >= 0)
+				{
+					s = m_eot[s];
+					is->consume();
+					continue;
+				}
+				this->noViableAlt(recognizer, s);
+				is->rewind(mark);
+				return	0;
+			}
+
+			/* New current state - move to it
+			 */
+			s	= snext;
+			is->consume();
+			continue;
+		}
+		/* EOT Transition?
+		 */
+		if  ( m_eot[s] >= 0)
+		{
+			s	= m_eot[s];
+			is->consume();
+			continue;
+		}
+		/* EOF transition to accept state?
+		 */
+		if  ( c == ImplTraits::CommonTokenType::TOKEN_EOF && m_eof[s] >= 0)
+		{
+			is->rewind(mark);
+			return  m_accept[m_eof[s]];
+		}
+
+		/* No alt, so bomb
+		 */
+		this->noViableAlt(recognizer, s);
+		is->rewind(mark);
+		return 0;
+	}
+}
+
+template<class ImplTraits, class CtxType>
+void CyclicDFA<ImplTraits, CtxType>::noViableAlt(RecognizerType* rec, ANTLR_UINT32 s)
+{
+	// In backtracking mode, we just set the failed flag so that the
+	// alt can just exit right now. If we are parsing though, then
+	// we want the exception to be raised.
+	//
+    if	(rec->get_state()->get_backtracking() > 0)
+    {
+		rec->get_state()->set_failed(true);
+    }
+	else
+	{
+		ANTLR_Exception<ImplTraits, NO_VIABLE_ALT_EXCEPTION, StreamType>* ex 
+			= new ANTLR_Exception<ImplTraits, NO_VIABLE_ALT_EXCEPTION, StreamType>( rec, (const char*)m_description );
+		ex->set_decisionNum( m_decisionNumber );
+		ex->set_state(s);
+	}
+}
+
+ANTLR_END_NAMESPACE()
diff --git a/runtime/Cpp/include/antlr3debugeventlistener.hpp b/runtime/Cpp/include/antlr3debugeventlistener.hpp
new file mode 100755
index 0000000..21fcf59
--- /dev/null
+++ b/runtime/Cpp/include/antlr3debugeventlistener.hpp
@@ -0,0 +1,400 @@
+/**
+ * \file
+ * The definition of all debugging events that a recognizer can trigger.
+ *
+ * \remark
+ *  From the java implementation by Terence Parr...
+ *  I did not create a separate AST debugging interface as it would create
+ *  lots of extra classes and DebugParser has a dbg var defined, which makes
+ *  it hard to change to ASTDebugEventListener.  I looked hard at this issue
+ *  and it is easier to understand as one monolithic event interface for all
+ *  possible events.  Hopefully, adding ST debugging stuff won't be bad.  Leave
+ *  for future. 4/26/2006.
+ */
+
+#ifndef	ANTLR3_DEBUG_EVENT_LISTENER_HPP
+#define	ANTLR3_DEBUG_EVENT_LISTENER_HPP
+
+// [The "BSD licence"]
+// Copyright (c) 2005-2009 Gokulakannan Somasundaram, ElectronDB
+
+//
+// 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.
+
+#include    "antlr3defs.hpp"
+
+ANTLR_BEGIN_NAMESPACE()
+
+/// Default debugging port
+///
+#define DEFAULT_DEBUGGER_PORT		0xBFCC;
+
+/** The ANTLR3 debugging interface for communicating with ANLTR Works. Function comments
+ *  mostly taken from the Java version.
+ */
+
+template<class ImplTraits>
+class DebugEventListener  : public ImplTraits::AllocPolicyType
+{
+public:
+	typedef typename ImplTraits::TreeType TreeType;
+	typedef typename ImplTraits::StringType StringType;
+	typedef typename ImplTraits::CommonTokenType CommonTokenType;
+	typedef typename ImplTraits::TreeAdaptorType TreeAdaptorType;
+
+private:
+	/// The port number which the debug listener should listen on for a connection
+	///
+	ANTLR_UINT32		m_port;
+
+	/// The socket structure we receive after a successful accept on the serverSocket
+	///
+	SOCKET				m_socket;
+
+	/** The version of the debugging protocol supported by the providing
+	 *  instance of the debug event listener.
+	 */
+	int					m_PROTOCOL_VERSION;
+
+	/// The name of the grammar file that we are debugging
+	///
+	StringType			m_grammarFileName;
+
+	/// Indicates whether we have already connected or not
+	///
+	bool			m_initialized;
+
+	/// Used to serialize the values of any particular token we need to
+	/// send back to the debugger.
+	///
+	StringType		m_tokenString;
+
+
+	/// Allows the debug event system to access the adapter in use
+	/// by the recognizer, if this is a tree parser of some sort.
+	///
+	TreeAdaptorType*	m_adaptor;
+
+
+public:
+	/// Wait for a connection from the debugger and initiate the
+	/// debugging session.
+	///
+	virtual bool	handshake();
+
+	/** The parser has just entered a rule.  No decision has been made about
+	 *  which alt is predicted.  This is fired AFTER init actions have been
+	 *  executed.  Attributes are defined and available etc...
+	 */
+	virtual void	enterRule( const char * grammarFileName, const char * ruleName);
+
+	/** Because rules can have lots of alternatives, it is very useful to
+	 *  know which alt you are entering.  This is 1..n for n alts.
+	 */
+	virtual void			enterAlt( int alt);
+
+	/** This is the last thing executed before leaving a rule.  It is
+	 *  executed even if an exception is thrown.  This is triggered after
+	 *  error reporting and recovery have occurred (unless the exception is
+	 *  not caught in this rule).  This implies an "exitAlt" event.
+	 */
+	virtual void			exitRule( const char * grammarFileName, const char * ruleName);
+
+	/** Track entry into any (...) subrule other EBNF construct
+	 */
+	virtual void			enterSubRule( int decisionNumber);
+
+	virtual void			exitSubRule( int decisionNumber);
+
+	/** Every decision, fixed k or arbitrary, has an enter/exit event
+	 *  so that a GUI can easily track what LT/consume events are
+	 *  associated with prediction.  You will see a single enter/exit
+	 *  subrule but multiple enter/exit decision events, one for each
+	 *  loop iteration.
+	 */
+	virtual void			enterDecision( int decisionNumber);
+
+	virtual void			exitDecision( int decisionNumber);
+
+	/** An input token was consumed; matched by any kind of element.
+	 *  Trigger after the token was matched by things like match(), matchAny().
+	 */
+	virtual void			consumeToken( CommonTokenType* t);
+
+	/** An off-channel input token was consumed.
+	 *  Trigger after the token was matched by things like match(), matchAny().
+	 *  (unless of course the hidden token is first stuff in the input stream).
+	 */
+	virtual void			consumeHiddenToken( CommonTokenType* t);
+
+	/** Somebody (anybody) looked ahead.  Note that this actually gets
+	 *  triggered by both LA and LT calls.  The debugger will want to know
+	 *  which Token object was examined.  Like consumeToken, this indicates
+	 *  what token was seen at that depth.  A remote debugger cannot look
+	 *  ahead into a file it doesn't have so LT events must pass the token
+	 *  even if the info is redundant.
+	 */
+	virtual void			LT( int i, CommonTokenType* t);
+
+	/** The parser is going to look arbitrarily ahead; mark this location,
+	 *  the token stream's marker is sent in case you need it.
+	 */
+	virtual void			mark( ANTLR_MARKER marker);
+
+	/** After an arbitrarily long lookahead as with a cyclic DFA (or with
+	 *  any backtrack), this informs the debugger that stream should be
+	 *  rewound to the position associated with marker.
+	 */
+	virtual void			rewind( ANTLR_MARKER marker);
+
+	/** Rewind to the input position of the last marker.
+	 *  Used currently only after a cyclic DFA and just
+	 *  before starting a sem/syn predicate to get the
+	 *  input position back to the start of the decision.
+	 *  Do not "pop" the marker off the state.  mark(i)
+	 *  and rewind(i) should balance still.
+	 */
+	virtual void			rewindLast();
+
+	virtual void			beginBacktrack( int level);
+
+	virtual void			endBacktrack( int level, bool successful);
+
+	/** To watch a parser move through the grammar, the parser needs to
+	 *  inform the debugger what line/charPos it is passing in the grammar.
+	 *  For now, this does not know how to switch from one grammar to the
+	 *  other and back for island grammars etc...
+	 *
+	 *  This should also allow breakpoints because the debugger can stop
+	 *  the parser whenever it hits this line/pos.
+	 */
+	virtual void			location( int line, int pos);
+
+	/** A recognition exception occurred such as NoViableAltException.  I made
+	 *  this a generic event so that I can alter the exception hierarchy later
+	 *  without having to alter all the debug objects.
+	 *
+	 *  Upon error, the stack of enter rule/subrule must be properly unwound.
+	 *  If no viable alt occurs it is within an enter/exit decision, which
+	 *  also must be rewound.  Even the rewind for each mark must be unwound.
+	 *  In the Java target this is pretty easy using try/finally, if a bit
+	 *  ugly in the generated code.  The rewind is generated in DFA.predict()
+	 *  actually so no code needs to be generated for that.  For languages
+	 *  w/o this "finally" feature (C++?), the target implementor will have
+	 *  to build an event stack or something.
+	 *
+	 *  Across a socket for remote debugging, only the RecognitionException
+	 *  data fields are transmitted.  The token object or whatever that
+	 *  caused the problem was the last object referenced by LT.  The
+	 *  immediately preceding LT event should hold the unexpected Token or
+	 *  char.
+	 *
+	 *  Here is a sample event trace for grammar:
+	 *
+	 *  b : C ({;}A|B) // {;} is there to prevent A|B becoming a set
+     *    | D
+     *    ;
+     *
+	 *  The sequence for this rule (with no viable alt in the subrule) for
+	 *  input 'c c' (there are 3 tokens) is:
+	 *
+	 *		commence
+	 *		LT(1)
+	 *		enterRule b
+	 *		location 7 1
+	 *		enter decision 3
+	 *		LT(1)
+	 *		exit decision 3
+	 *		enterAlt1
+	 *		location 7 5
+	 *		LT(1)
+	 *		consumeToken [c/<4>,1:0]
+	 *		location 7 7
+	 *		enterSubRule 2
+	 *		enter decision 2
+	 *		LT(1)
+	 *		LT(1)
+	 *		recognitionException NoViableAltException 2 1 2
+	 *		exit decision 2
+	 *		exitSubRule 2
+	 *		beginResync
+	 *		LT(1)
+	 *		consumeToken [c/<4>,1:1]
+	 *		LT(1)
+	 *		endResync
+	 *		LT(-1)
+	 *		exitRule b
+	 *		terminate
+	 */
+	template<typename ExceptionBaseType>
+	void recognitionException( ExceptionBaseType* ) {}
+
+	/** Indicates the recognizer is about to consume tokens to resynchronize
+	 *  the parser.  Any consume events from here until the recovered event
+	 *  are not part of the parse--they are dead tokens.
+	 */
+	virtual void			beginResync();
+
+	/** Indicates that the recognizer has finished consuming tokens in order
+	 *  to resynchronize.  There may be multiple beginResync/endResync pairs
+	 *  before the recognizer comes out of errorRecovery mode (in which
+	 *  multiple errors are suppressed).  This will be useful
+	 *  in a gui where you want to probably grey out tokens that are consumed
+	 *  but not matched to anything in grammar.  Anything between
+	 *  a beginResync/endResync pair was tossed out by the parser.
+	 */
+	virtual void			endResync();
+
+	/** A semantic predicate was evaluate with this result and action text
+	*/
+	virtual void			semanticPredicate( bool result, const char * predicate);
+
+	/** Announce that parsing has begun.  Not technically useful except for
+	 *  sending events over a socket.  A GUI for example will launch a thread
+	 *  to connect and communicate with a remote parser.  The thread will want
+	 *  to notify the GUI when a connection is made.  ANTLR parsers
+	 *  trigger this upon entry to the first rule (the ruleLevel is used to
+	 *  figure this out).
+	 */
+	virtual void			commence();
+
+	/** Parsing is over; successfully or not.  Mostly useful for telling
+	 *  remote debugging listeners that it's time to quit.  When the rule
+	 *  invocation level goes to zero at the end of a rule, we are done
+	 *  parsing.
+	 */
+	virtual void	terminate();
+
+	/// Retrieve acknowledge response from the debugger. in fact this
+	/// response is never used at the moment. So we just read whatever
+	/// is in the socket buffer and throw it away.
+	///
+	virtual void	ack();
+
+	// T r e e  P a r s i n g
+
+	/** Input for a tree parser is an AST, but we know nothing for sure
+	 *  about a node except its type and text (obtained from the adaptor).
+	 *  This is the analog of the consumeToken method.  The ID is usually
+	 *  the memory address of the node.
+	 *  If the type is UP or DOWN, then
+	 *  the ID is not really meaningful as it's fixed--there is
+	 *  just one UP node and one DOWN navigation node.
+	 *
+	 *  Note that unlike the Java version, the node type of the C parsers
+	 *  is always fixed as pANTLR3_BASE_TREE because all such structures
+	 *  contain a super pointer to their parent, which is generally COMMON_TREE and within
+	 *  that there is a super pointer that can point to a user type that encapsulates it.
+	 *  Almost akin to saying that it is an interface pointer except we don't need to
+	 *  know what the interface is in full, just those bits that are the base.
+	 * @param t
+	 */
+	virtual void	consumeNode( TreeType* t);
+
+	/** The tree parser looked ahead.  If the type is UP or DOWN,
+	 *  then the ID is not really meaningful as it's fixed--there is
+	 *  just one UP node and one DOWN navigation node.
+	 */
+	virtual void	LTT( int i, TreeType* t);
+
+
+	// A S T  E v e n t s
+
+	/** A nil was created (even nil nodes have a unique ID...
+	 *  they are not "null" per se).  As of 4/28/2006, this
+	 *  seems to be uniquely triggered when starting a new subtree
+	 *  such as when entering a subrule in automatic mode and when
+	 *  building a tree in rewrite mode.
+     *
+ 	 *  If you are receiving this event over a socket via
+	 *  RemoteDebugEventSocketListener then only t.ID is set.
+	 */
+	virtual void	nilNode( TreeType* t);
+
+	/** If a syntax error occurs, recognizers bracket the error
+	 *  with an error node if they are building ASTs. This event
+	 *  notifies the listener that this is the case
+	 */
+	virtual void	errorNode( TreeType* t);
+
+	/** Announce a new node built from token elements such as type etc...
+	 *
+	 *  If you are receiving this event over a socket via
+	 *  RemoteDebugEventSocketListener then only t.ID, type, text are
+	 *  set.
+	 */
+	virtual void	createNode( TreeType* t);
+
+	/** Announce a new node built from an existing token.
+	 *
+	 *  If you are receiving this event over a socket via
+	 *  RemoteDebugEventSocketListener then only node.ID and token.tokenIndex
+	 *  are set.
+	 */
+	virtual void	createNodeTok( TreeType* node, CommonTokenType* token);
+
+	/** Make a node the new root of an existing root.  See
+	 *
+	 *  Note: the newRootID parameter is possibly different
+	 *  than the TreeAdaptor.becomeRoot() newRoot parameter.
+	 *  In our case, it will always be the result of calling
+	 *  TreeAdaptor.becomeRoot() and not root_n or whatever.
+	 *
+	 *  The listener should assume that this event occurs
+	 *  only when the current subrule (or rule) subtree is
+	 *  being reset to newRootID.
+	 *
+	 *  If you are receiving this event over a socket via
+	 *  RemoteDebugEventSocketListener then only IDs are set.
+	 *
+	 *  @see org.antlr.runtime.tree.TreeAdaptor.becomeRoot()
+	 */
+	virtual void	becomeRoot( TreeType* newRoot, TreeType* oldRoot);
+
+	/** Make childID a child of rootID.
+	 *
+	 *  If you are receiving this event over a socket via
+	 *  RemoteDebugEventSocketListener then only IDs are set.
+	 *
+	 *  @see org.antlr.runtime.tree.TreeAdaptor.addChild()
+	 */
+	virtual void	addChild( TreeType* root, TreeType* child);
+
+	/** Set the token start/stop token index for a subtree root or node.
+	 *
+	 *  If you are receiving this event over a socket via
+	 *  RemoteDebugEventSocketListener then only t.ID is set.
+	 */
+	virtual void	setTokenBoundaries( TreeType* t, ANTLR_MARKER tokenStartIndex, ANTLR_MARKER tokenStopIndex);
+
+	/// Free up the resources allocated to this structure
+	///
+	virtual ~DebugEventListener();
+};
+
+ANTLR_END_NAMESPACE()
+
+#endif
+
diff --git a/runtime/Cpp/include/antlr3defs.hpp b/runtime/Cpp/include/antlr3defs.hpp
new file mode 100755
index 0000000..b27db5f
--- /dev/null
+++ b/runtime/Cpp/include/antlr3defs.hpp
@@ -0,0 +1,321 @@
+/** \file
+ * Basic type and constant definitions for ANTLR3 Runtime.
+ */
+#ifndef	_ANTLR3DEFS_HPP
+#define	_ANTLR3DEFS_HPP
+
+// [The "BSD licence"]
+// Copyright (c) 2005-2009 Gokulakannan Somasundaram, ElectronDB
+
+//
+// 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.
+
+/* Following are for generated code, they are not referenced internally!!!
+ */
+#if !defined(ANTLR_HUGE) && !defined(ANTLR_AVERAGE) && !defined(ANTLR_SMALL)
+#define	ANTLR_AVERAGE
+#endif
+
+#ifdef	ANTLR_HUGE
+#ifndef	ANTLR_SIZE_HINT
+#define	ANTLR_SIZE_HINT        2049
+#endif
+#ifndef	ANTLR_LIST_SIZE_HINT
+#define	ANTLR_LIST_SIZE_HINT   127
+#endif
+#endif
+
+#ifdef	ANTLR_AVERAGE
+#ifndef	ANTLR_SIZE_HINT
+#define	ANTLR_SIZE_HINT        1025
+#define	ANTLR_LIST_SIZE_HINT   63
+#endif
+#endif
+
+#ifdef	ANTLR_SMALL
+#ifndef	ANTLR_SIZE_HINT
+#define	ANTLR_SIZE_HINT        211
+#define	ANTLR_LIST_SIZE_HINT   31
+#endif
+#endif
+
+// Definitions that indicate the encoding scheme character streams and strings etc
+//
+/// Indicates Big Endian for encodings where this makes sense
+///
+#define ANTLR_BE           1
+
+/// Indicates Little Endian for encoidngs where this makes sense
+///
+#define ANTLR_LE           2
+
+/// General latin-1 or other 8 bit encoding scheme such as straight ASCII
+///
+#define ANTLR_ENC_8BIT     4
+
+/// UTF-8 encoding scheme
+///
+#define ANTLR_ENC_UTF8     8
+
+/// UTF-16 encoding scheme (which also covers UCS2 as that does not have surrogates)
+///
+#define ANTLR_ENC_UTF16        16
+#define ANTLR_ENC_UTF16BE      16 + ANTLR_BE
+#define ANTLR_ENC_UTF16LE      16 + ANTLR_LE
+
+/// UTF-32 encoding scheme (basically straight 32 bit)
+///
+#define ANTLR_ENC_UTF32        32
+#define ANTLR_ENC_UTF32BE      32 + ANTLR_BE
+#define ANTLR_ENC_UTF32LE      32 + ANTLR_LE
+
+/// Input is 8 bit EBCDIC (which we convert to 8 bit ASCII on the fly
+///
+#define ANTLR_ENC_EBCDIC       64
+
+#define ANTLR_BEGIN_NAMESPACE() namespace antlr3 {
+#define ANTLR_END_NAMESPACE() }
+
+#define ANTLR_USE_64BIT
+
+/* Common definitions come first
+ */
+#include    <antlr3errors.hpp>
+
+/* Work out what operating system/compiler this is. We just do this once
+ * here and use an internal symbol after this.
+ */
+#ifdef	_WIN64
+
+# ifndef	ANTLR_WINDOWS
+#   define	ANTLR_WINDOWS
+# endif
+# define	ANTLR_WIN64
+# define	ANTLR_USE_64BIT
+
+#else
+
+#ifdef	_WIN32
+# ifndef	ANTLR_WINDOWS
+#  define	ANTLR_WINDOWS
+# endif
+
+#define	ANTLR_WIN32
+#endif
+
+#endif
+
+#ifdef	ANTLR_WINDOWS 
+
+#ifndef WIN32_LEAN_AND_MEAN
+#define	WIN32_LEAN_AND_MEAN
+#endif
+
+/* Allow VC 8 (vs2005) and above to use 'secure' versions of various functions such as sprintf
+ */
+#ifndef	_CRT_SECURE_NO_DEPRECATE 
+#define	_CRT_SECURE_NO_DEPRECATE 
+#endif
+
+#include    <stdlib.h>
+#include    <winsock2.h>
+#include    <sys/types.h>
+#include    <sys/stat.h>
+#include    <stdarg.h>
+
+#define	ANTLR_API      __declspec(dllexport)
+#define	ANTLR_CDECL    __cdecl
+#define ANTLR_FASTCALL __fastcall
+
+
+#ifndef __MINGW32__
+// Standard Windows types
+//
+typedef	INT32	ANTLR_CHAR;
+typedef	UINT32	ANTLR_UCHAR;
+
+typedef	INT8	ANTLR_INT8;
+typedef	INT16	ANTLR_INT16;
+typedef	INT32	ANTLR_INT32;
+typedef	INT64	ANTLR_INT64;
+typedef	UINT8	ANTLR_UINT8;
+typedef	UINT16	ANTLR_UINT16;
+typedef	UINT32	ANTLR_UINT32;
+typedef	UINT64	ANTLR_UINT64;
+typedef UINT64  ANTLR_BITWORD;
+
+#else
+// Mingw uses stdint.h and fails to define standard Microsoft typedefs
+// such as UINT16, hence we must use stdint.h for Mingw.
+//
+#include <stdint.h>
+typedef int32_t     ANTLR_CHAR;
+typedef uint32_t    ANTLR_UCHAR;
+
+typedef int8_t	    ANTLR_INT8;
+typedef int16_t	    ANTLR_INT16;
+typedef int32_t	    ANTLR_INT32;
+typedef int64_t	    ANTLR_INT64;
+
+typedef uint8_t	    ANTLR_UINT8;
+typedef uint16_t    ANTLR_UINT16;
+typedef uint32_t    ANTLR_UINT32;
+typedef uint64_t    ANTLR_UINT64;
+typedef uint64_t    ANTLR_BITWORD;
+
+#endif
+
+
+
+#define	ANTLR_UINT64_LIT(lit)  lit##ULL
+
+#define	ANTLR_INLINE	        __inline
+
+typedef FILE *	    ANTLR_FDSC;
+typedef	struct stat ANTLR_FSTAT_STRUCT;
+
+
+
+#ifdef	ANTLR_USE_64BIT
+#define ANTLR_UINT64_CAST(ptr) ((ANTLR_UINT64)(ptr))
+#define	ANTLR_UINT32_CAST(ptr)	(ANTLR_UINT32)((ANTLR_UINT64)(ptr))
+typedef ANTLR_INT64		ANTLR_MARKER;			
+typedef ANTLR_UINT64		ANTLR_INTKEY;
+#else
+#define ANTLR_UINT64_CAST(ptr) (ANTLR_UINT64)((ANTLR_UINT32)(ptr))
+#define	ANTLR_UINT32_CAST(ptr)	(ANTLR_UINT32)(ptr)
+typedef	ANTLR_INT32		ANTLR_MARKER;
+typedef ANTLR_UINT32	ANTLR_INTKEY;
+#endif
+
+#ifdef	ANTLR_WIN32
+#endif
+
+#ifdef	ANTLR_WIN64
+#endif
+
+
+typedef	int			ANTLR_SALENT;								// Type used for size of accept structure
+typedef struct sockaddr_in	ANTLR_SOCKADDRT, * pANTLR_SOCKADDRT;	// Type used for socket address declaration
+typedef struct sockaddr		ANTLR_SOCKADDRC, * pANTLR_SOCKADDRC;	// Type used for cast on accept()
+
+#define	ANTLR_CLOSESOCKET	closesocket
+
+/* Warnings that are over-zealous such as complaining about strdup, we
+ * can turn off.
+ */
+
+/* Don't complain about "deprecated" functions such as strdup
+ */
+#pragma warning( disable : 4996 )
+
+#else
+
+#ifdef __LP64__
+#define ANTLR_USE_64BIT
+#endif
+
+#include <stdio.h>
+#include <stdint.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <inttypes.h>
+#include <unistd.h>
+
+#define _stat stat
+
+typedef int SOCKET;
+
+/* Inherit type definitions for autoconf
+ */
+typedef int32_t	    ANTLR_CHAR;
+typedef uint32_t    ANTLR_UCHAR;
+
+typedef int8_t	    ANTLR_INT8;
+typedef int16_t	    ANTLR_INT16;
+typedef int32_t	    ANTLR_INT32;
+typedef int64_t	    ANTLR_INT64;
+
+typedef uint8_t	    ANTLR_UINT8;
+typedef uint16_t    ANTLR_UINT16;
+typedef uint32_t    ANTLR_UINT32;
+typedef uint64_t    ANTLR_UINT64;
+typedef uint64_t    ANTLR_BITWORD;
+
+#define ANTLR_INLINE   inline
+#define	ANTLR_API
+
+typedef FILE *	    ANTLR_FDSC;
+typedef	struct stat ANTLR_FSTAT_STRUCT;
+
+#ifdef	ANTLR_USE_64BIT
+#define	ANTLR_FUNC_PTR(ptr)    (void *)((ANTLR_UINT64)(ptr))
+#define ANTLR_UINT64_CAST(ptr)	(ANTLR_UINT64)(ptr))
+#define	ANTLR_UINT32_CAST(ptr) (ANTLR_UINT32)((ANTLR_UINT64)(ptr))
+typedef ANTLR_INT64		ANTLR_MARKER;
+typedef ANTLR_UINT64		ANTLR_INTKEY;
+#else
+#define	ANTLR_FUNC_PTR(ptr)	(void *)((ANTLR_UINT32)(ptr))
+#define ANTLR_UINT64_CAST(ptr) (ANTLR_UINT64)((ANTLR_UINT32)(ptr))
+#define	ANTLR_UINT32_CAST(ptr)	(ANTLR_UINT32)(ptr)
+typedef	ANTLR_INT32		ANTLR_MARKER;
+typedef ANTLR_UINT32		ANTLR_INTKEY;
+#endif
+#define	ANTLR_UINT64_LIT(lit)	lit##ULL
+
+#endif
+
+#ifdef ANTLR_USE_64BIT
+#define ANTLR_TRIE_DEPTH 63
+#else
+#define ANTLR_TRIE_DEPTH 31
+#endif
+/* Pre declare the typedefs for all the interfaces, then 
+ * they can be inter-dependant and we will let the linker
+ * sort it out for us.
+ */
+#include    <antlr3interfaces.hpp>
+
+// Include the unicode.org conversion library header.
+//
+#include    <antlr3convertutf.hpp>
+
+enum ChannelType
+{
+	/** Default channel for a token
+	*/
+	TOKEN_DEFAULT_CHANNEL	 = 0
+	/** Reserved channel number for a HIDDEN token - a token that
+		*  is hidden from the parser.
+		*/
+	,	HIDDEN		=		99
+};
+
+#endif	/* _ANTLR3DEFS_H	*/
diff --git a/runtime/Cpp/include/antlr3errors.hpp b/runtime/Cpp/include/antlr3errors.hpp
new file mode 100755
index 0000000..876df4f
--- /dev/null
+++ b/runtime/Cpp/include/antlr3errors.hpp
@@ -0,0 +1,49 @@
+#ifndef	_ANTLR3ERRORS_HPP
+#define	_ANTLR3ERRORS_HPP
+
+// [The "BSD licence"]
+// Copyright (c) 2005-2009 Gokulakannan Somasundaram, ElectronDB
+
+//
+// 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.
+
+#define	ANTLR_SUCCESS	0
+#define	ANTLR_FAIL	1
+
+/** Indicates end of character stream and is an invalid Unicode code point. */
+#define ANTLR_CHARSTREAM_EOF	0xFFFFFFFF
+
+/** Indicates  memoizing on a rule failed.
+ */
+#define	MEMO_RULE_FAILED	0xFFFFFFFE
+#define	MEMO_RULE_UNKNOWN	0xFFFFFFFF
+
+
+#define	ANTLR_ERR_BASE	    0
+#define	ANTLR_ERR_NOMEM    (ANTLR_ERR_BASE + 1)
+#define	ANTLR_ERR_NOFILE   (ANTLR_ERR_BASE + 2)
+#define	ANTLR_ERR_HASHDUP  (ANTLR_ERR_BASE + 3)
+
+#endif	/* _ANTLR3ERRORS_H */
diff --git a/runtime/Cpp/include/antlr3exception.hpp b/runtime/Cpp/include/antlr3exception.hpp
new file mode 100755
index 0000000..beca1fc
--- /dev/null
+++ b/runtime/Cpp/include/antlr3exception.hpp
@@ -0,0 +1,209 @@
+/** \file
+ *  Contains the definition of a basic ANTLR3 exception structure created
+ *  by a recognizer when errors are found/predicted.
+
+ * Two things to be noted for C++ Target:
+   a) This is not the C++ Exception. Consider this just as yet another class. This
+   has to be like this because there is a inbuilt recovery and hence there is a try..catch
+   block for every new token. This is not how C++ Exceptions work.Still there is exception support, as we are handling things like OutofMemory by
+   throwing exceptions
+
+   b) There is no use in implementing templates here, as all the exceptions are grouped in
+   one container and hence needs virtual functions. But this would occur only when there is
+   a exception/ while deleting base recognizer. So shouldn't incur the overhead in normal operation
+ */
+#ifndef	_ANTLR3_EXCEPTION_HPP
+#define	_ANTLR3_EXCEPTION_HPP
+
+// [The "BSD licence"]
+// Copyright (c) 2005-2009 Gokulakannan Somasundaram, ElectronDB
+
+//
+// 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.
+
+#include    "antlr3defs.hpp"
+
+ANTLR_BEGIN_NAMESPACE()
+
+/** Base structure for an ANTLR3 exception tracker
+ */
+
+template<class ImplTraits, class StreamType>
+class ANTLR_ExceptionBase
+{
+public:
+	typedef typename StreamType::UnitType TokenType;
+	typedef typename StreamType::IntStreamType IntStreamType;
+	typedef typename ImplTraits::AllocPolicyType AllocPolicyType;
+	typedef typename ImplTraits::StringType StringType;
+	typedef typename ImplTraits::StringStreamType StringStreamType;
+	typedef typename ImplTraits::BitsetType BitsetType;
+	typedef typename ImplTraits::BitsetListType BitsetListType;
+	typedef typename ImplTraits::template ExceptionBaseType<StreamType> ExceptionBaseType;
+
+protected:
+    /** The printable message that goes with this exception, in your preferred
+     *  encoding format. ANTLR just uses ASCII by default but you can ignore these
+     *  messages or convert them to another format or whatever of course. They are
+     *  really internal messages that you then decide how to print out in a form that
+     *  the users of your product will understand, as they are unlikely to know what
+     *  to do with "Recognition exception at: [[TOK_GERUND..... " ;-)
+     */
+    StringType		m_message;
+
+    /** Name of the file/input source for reporting. Note that this may be empty!!
+     */
+    StringType		m_streamName;
+
+    /** Indicates the index of the 'token' we were looking at when the
+     *  exception occurred.
+     */
+    ANTLR_MARKER	m_index;
+
+    /** Indicates what the current token/tree was when the error occurred. Since not
+     *  all input streams will be able to retrieve the nth token, we track it here
+     *  instead. This is for parsers, and even tree parsers may set this.
+     */
+    const TokenType*		m_token;
+
+    /** Pointer to the next exception in the chain (if any)
+     */
+    ExceptionBaseType*  m_nextException;
+
+    /** Indicates the token we were expecting to see next when the error occurred
+     */
+    ANTLR_UINT32	m_expecting;
+
+    /** Indicates a set of tokens that we were expecting to see one of when the
+     *  error occurred. It is a following bitset list, so you can use load it and use ->toIntList() on it
+     *  to generate an array of integer tokens that it represents.
+     */
+    BitsetListType*	m_expectingSet;
+
+    /** If this is a tree parser exception then the node is set to point to the node
+     * that caused the issue.
+     */
+    TokenType*		m_node;
+
+    /** The current character when an error occurred - for lexers.
+     */
+    ANTLR_UCHAR		m_c;
+
+    /** Track the line at which the error occurred in case this is
+     *  generated from a lexer.  We need to track this since the
+     *  unexpected char doesn't carry the line info.
+     */
+    ANTLR_UINT32   	m_line;
+
+    /** Character position in the line where the error occurred.
+     */
+    ANTLR_INT32   	m_charPositionInLine;
+
+    /** decision number for NVE
+     */
+    ANTLR_UINT32   	m_decisionNum;
+
+    /** State for NVE
+     */
+    ANTLR_UINT32	m_state;
+
+    /** Rule name for failed predicate exception
+     */
+    StringType		m_ruleName;
+
+    /** Pointer to the input stream that this exception occurred in.
+     */
+    IntStreamType* 	m_input;
+
+public:
+	StringType& get_message();
+	StringType& get_streamName();
+	ANTLR_MARKER get_index() const;
+	const TokenType* get_token() const;
+	ExceptionBaseType* get_nextException() const;
+	ANTLR_UINT32 get_expecting() const;
+	BitsetListType* get_expectingSet() const;
+	TokenType* get_node() const;
+	ANTLR_UCHAR get_c() const;
+	ANTLR_UINT32 get_line() const;
+	ANTLR_INT32 get_charPositionInLine() const;
+	ANTLR_UINT32 get_decisionNum() const;
+	ANTLR_UINT32 get_state() const;
+	StringType& get_ruleName();
+	IntStreamType* get_input() const;
+	void  set_message( const StringType& message );
+	void  set_streamName( const StringType& streamName );
+	void  set_index( ANTLR_MARKER index );
+	void  set_token( const TokenType* token );
+	void  set_nextException( ExceptionBaseType* nextException );
+	void  set_expecting( ANTLR_UINT32 expecting );
+	void  set_expectingSet( BitsetListType* expectingSet );
+	void  set_node( TokenType* node );
+	void  set_c( ANTLR_UCHAR c );
+	void  set_line( ANTLR_UINT32 line );
+	void  set_charPositionInLine( ANTLR_INT32 charPositionInLine );
+	void  set_decisionNum( ANTLR_UINT32 decisionNum );
+	void  set_state( ANTLR_UINT32 state );
+	void  set_ruleName( const StringType& ruleName );
+	void  set_input( IntStreamType* input );
+	StringType getDescription() const;
+	
+	virtual StringType getName() const = 0;
+	virtual ANTLR_UINT32 getType() const = 0;
+	virtual void print() const = 0;
+	virtual void displayRecognitionError( ANTLR_UINT8** tokenNames, StringStreamType& str ) const = 0;
+
+    virtual ~ANTLR_ExceptionBase();
+
+protected:
+	ANTLR_ExceptionBase(const StringType& message);
+};
+
+
+template<class ImplTraits, ExceptionType Ex, class StreamType>
+class ANTLR_Exception  :  public ImplTraits::template ExceptionBaseType<StreamType>
+{
+public:
+	typedef typename ImplTraits::StringType StringType;
+	typedef typename ImplTraits::StringStreamType StringStreamType;
+	typedef typename ImplTraits::BitsetType BitsetType;
+	typedef typename ImplTraits::template ExceptionBaseType<StreamType> BaseType;
+
+public:
+	template<typename BaseRecognizerType>
+	ANTLR_Exception(BaseRecognizerType* recognizer, const StringType& message);
+
+	const StringType& get_name() const;
+	virtual StringType getName() const;
+	virtual ANTLR_UINT32 getType() const;
+	virtual void print() const;
+	virtual void displayRecognitionError( ANTLR_UINT8** tokenNames, StringStreamType& str_stream) const;
+};
+
+ANTLR_END_NAMESPACE()
+
+#include "antlr3exception.inl"
+
+#endif
diff --git a/runtime/Cpp/include/antlr3exception.inl b/runtime/Cpp/include/antlr3exception.inl
new file mode 100755
index 0000000..b73f1aa
--- /dev/null
+++ b/runtime/Cpp/include/antlr3exception.inl
@@ -0,0 +1,379 @@
+ANTLR_BEGIN_NAMESPACE()
+
+template<class ImplTraits, class StreamType>
+ANTLR_ExceptionBase<ImplTraits, StreamType>::ANTLR_ExceptionBase(const StringType& message)
+	:m_message(message)
+	,m_input(NULL)
+{
+	m_index = 0;
+	m_token	= NULL;
+	m_expecting = 0;
+	m_expectingSet = NULL;
+	m_node = NULL;
+	m_c = 0;
+	m_line = 0;
+	m_charPositionInLine = 0;
+	m_decisionNum = 0;
+	m_state = 0;
+	m_nextException = NULL;
+}
+
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE typename ANTLR_ExceptionBase<ImplTraits, StreamType>::StringType& ANTLR_ExceptionBase<ImplTraits, StreamType>::get_message()
+{
+	return m_message;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE typename ANTLR_ExceptionBase<ImplTraits, StreamType>::StringType& ANTLR_ExceptionBase<ImplTraits, StreamType>::get_streamName()
+{
+	return m_streamName;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE ANTLR_MARKER ANTLR_ExceptionBase<ImplTraits, StreamType>::get_index() const
+{
+	return m_index;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE const typename ANTLR_ExceptionBase<ImplTraits, StreamType>::TokenType* ANTLR_ExceptionBase<ImplTraits, StreamType>::get_token() const
+{
+	return m_token;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE typename ANTLR_ExceptionBase<ImplTraits, StreamType>::ExceptionBaseType* ANTLR_ExceptionBase<ImplTraits, StreamType>::get_nextException() const
+{
+	return m_nextException;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE ANTLR_UINT32 ANTLR_ExceptionBase<ImplTraits, StreamType>::get_expecting() const
+{
+	return m_expecting;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE typename ANTLR_ExceptionBase<ImplTraits, StreamType>::BitsetListType* ANTLR_ExceptionBase<ImplTraits, StreamType>::get_expectingSet() const
+{
+	return m_expectingSet;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE typename ANTLR_ExceptionBase<ImplTraits, StreamType>::TokenType* ANTLR_ExceptionBase<ImplTraits, StreamType>::get_node() const
+{
+	return m_node;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE ANTLR_UCHAR ANTLR_ExceptionBase<ImplTraits, StreamType>::get_c() const
+{
+	return m_c;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE ANTLR_UINT32 ANTLR_ExceptionBase<ImplTraits, StreamType>::get_line() const
+{
+	return m_line;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE ANTLR_INT32 ANTLR_ExceptionBase<ImplTraits, StreamType>::get_charPositionInLine() const
+{
+	return m_charPositionInLine;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE ANTLR_UINT32 ANTLR_ExceptionBase<ImplTraits, StreamType>::get_decisionNum() const
+{
+	return m_decisionNum;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE ANTLR_UINT32 ANTLR_ExceptionBase<ImplTraits, StreamType>::get_state() const
+{
+	return m_state;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE typename ANTLR_ExceptionBase<ImplTraits, StreamType>::StringType& ANTLR_ExceptionBase<ImplTraits, StreamType>::get_ruleName()
+{
+	return m_ruleName;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE typename ANTLR_ExceptionBase<ImplTraits, StreamType>::IntStreamType* ANTLR_ExceptionBase<ImplTraits, StreamType>::get_input() const
+{
+	return m_input;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE void ANTLR_ExceptionBase<ImplTraits, StreamType>::set_message( const StringType& message )
+{
+	m_message = message;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE void ANTLR_ExceptionBase<ImplTraits, StreamType>::set_streamName( const StringType& streamName )
+{
+	m_streamName = streamName;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE void ANTLR_ExceptionBase<ImplTraits, StreamType>::set_index( ANTLR_MARKER index )
+{
+	m_index = index;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE void ANTLR_ExceptionBase<ImplTraits, StreamType>::set_token( const TokenType* token )
+{
+	m_token = token;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE void ANTLR_ExceptionBase<ImplTraits, StreamType>::set_nextException( ExceptionBaseType* nextException )
+{
+	m_nextException = nextException;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE void ANTLR_ExceptionBase<ImplTraits, StreamType>::set_expecting( ANTLR_UINT32 expecting )
+{
+	m_expecting = expecting;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE void ANTLR_ExceptionBase<ImplTraits, StreamType>::set_expectingSet( BitsetListType* expectingSet )
+{
+	m_expectingSet = expectingSet;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE void ANTLR_ExceptionBase<ImplTraits, StreamType>::set_node( TokenType* node )
+{
+	m_node = node;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE void ANTLR_ExceptionBase<ImplTraits, StreamType>::set_c( ANTLR_UCHAR c )
+{
+	m_c = c;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE void ANTLR_ExceptionBase<ImplTraits, StreamType>::set_line( ANTLR_UINT32 line )
+{
+	m_line = line;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE void ANTLR_ExceptionBase<ImplTraits, StreamType>::set_charPositionInLine( ANTLR_INT32 charPositionInLine )
+{
+	m_charPositionInLine = charPositionInLine;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE void ANTLR_ExceptionBase<ImplTraits, StreamType>::set_decisionNum( ANTLR_UINT32 decisionNum )
+{
+	m_decisionNum = decisionNum;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE void ANTLR_ExceptionBase<ImplTraits, StreamType>::set_state( ANTLR_UINT32 state )
+{
+	m_state = state;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE void ANTLR_ExceptionBase<ImplTraits, StreamType>::set_ruleName( const StringType& ruleName )
+{
+	m_ruleName = ruleName;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE void ANTLR_ExceptionBase<ImplTraits, StreamType>::set_input( IntStreamType* input )
+{
+	m_input = input;
+}
+
+
+template<class ImplTraits, ExceptionType Ex, class StreamType>
+	template<typename BaseRecognizerType>
+ANTLR_Exception<ImplTraits, Ex, StreamType>::ANTLR_Exception(BaseRecognizerType* recognizer, const StringType& message)
+	:BaseType( message )
+{
+	recognizer->get_super()->fillExceptionData( this );
+	BaseType::m_input	= recognizer->get_super()->get_istream();
+	BaseType::m_nextException	= recognizer->get_state()->get_exception();	/* So we don't leak the memory */
+	recognizer->get_state()->set_exception(this);
+	recognizer->get_state()->set_error( true );	    /* Exception is outstanding	*/
+}
+
+template<class ImplTraits, ExceptionType Ex, class StreamType>
+ANTLR_UINT32 ANTLR_Exception<ImplTraits, Ex, StreamType>::getType() const
+{
+	return static_cast<ANTLR_UINT32>(Ex);
+}
+
+template<class ImplTraits, ExceptionType Ex, class StreamType>
+void ANTLR_Exception<ImplTraits, Ex, StreamType>::print() const
+{
+   /* Ensure valid pointer
+     */
+	/* Number if no message, else the message
+	*/
+	if  ( BaseType::m_message.empty() )
+	{
+		fprintf(stderr, "ANTLR3_EXCEPTION number %d (%08X).\n", Ex, Ex);
+	}
+	else
+	{
+		fprintf(stderr, "ANTLR3_EXCEPTION: %s\n", BaseType::m_message.c_str() );
+	}
+}
+
+template<class ImplTraits, ExceptionType Ex, class StreamType>
+typename ANTLR_Exception<ImplTraits, Ex, StreamType>::StringType 
+	ANTLR_Exception<ImplTraits, Ex, StreamType>::getName() const
+{
+	const char* exArray[] = {
+						"org.antlr.runtime.RecognitionException"
+						, "org.antlr.runtime.MismatchedTokenException"
+						, "org.antlr.runtime.NoViableAltException"
+						, "org.antlr.runtime.MismatchedSetException"
+						, "org.antlr.runtime.EarlyExitException"
+						, "org.antlr.runtime.FailedPredicateException"
+						, "org.antlr.runtime.MismatchedTreeNodeException"
+						, "org.antlr.runtime.tree.RewriteEarlyExitException"
+						, "org.antlr.runtime.UnwantedTokenException"
+						, "org.antlr.runtime.MissingTokenException"
+					  };
+	return StringType(exArray[Ex]);
+}
+
+template<class ImplTraits, ExceptionType Ex, class StreamType>
+void ANTLR_Exception<ImplTraits, Ex, StreamType>::displayRecognitionError( ANTLR_UINT8** tokenNames, 
+																			StringStreamType& str_stream ) const
+{
+	switch( Ex )
+	{
+	case RECOGNITION_EXCEPTION:
+		// Indicates that the recognizer received a token
+		// in the input that was not predicted. This is the basic exception type 
+		// from which all others are derived. So we assume it was a syntax error.
+		// You may get this if there are not more tokens and more are needed
+		// to complete a parse for instance.
+		//
+		str_stream << " : syntax error...\n"; 
+		break;
+	case UNWANTED_TOKEN_EXCEPTION:
+		// Indicates that the recognizer was fed a token which seesm to be
+		// spurious input. We can detect this when the token that follows
+		// this unwanted token would normally be part of the syntactically
+		// correct stream. Then we can see that the token we are looking at
+		// is just something that should not be there and throw this exception.
+		//
+		if	(tokenNames == NULL)
+		{
+			str_stream << " : Extraneous input...";
+		}
+		else
+		{
+			if	( BaseType::m_expecting == ImplTraits::CommonTokenType::TOKEN_EOF)
+			{
+				str_stream << " : Extraneous input - expected <EOF>\n";
+			}
+			else
+			{
+				str_stream << " : Extraneous input - expected "
+						   << tokenNames[ BaseType::m_expecting] << " ...\n";
+			}
+		}
+		break;
+	case MISSING_TOKEN_EXCEPTION:
+		// Indicates that the recognizer detected that the token we just
+		// hit would be valid syntactically if preceeded by a particular 
+		// token. Perhaps a missing ';' at line end or a missing ',' in an
+		// expression list, and such like.
+		//
+		if	(tokenNames == NULL)
+		{
+			str_stream << " : Missing token ("
+					   << BaseType::m_expecting << ")...\n";
+		}
+		else
+		{
+			if	( BaseType::m_expecting == ImplTraits::CommonTokenType::TOKEN_EOF )
+			{
+				str_stream <<" : Missing <EOF>\n";
+			}
+			else
+			{
+				str_stream << " : Missing " << tokenNames[BaseType::m_expecting] <<" \n";
+			}
+		}
+		break;
+	case NO_VIABLE_ALT_EXCEPTION:
+		// We could not pick any alt decision from the input given
+		// so god knows what happened - however when you examine your grammar,
+		// you should. It means that at the point where the current token occurred
+		// that the DFA indicates nowhere to go from here.
+		//
+		str_stream << " : cannot match to any predicted input...\n";
+		break;
+	case MISMATCHED_SET_EXCEPTION:
+		{
+			ANTLR_UINT32	  count;
+			ANTLR_UINT32	  bit;
+			ANTLR_UINT32	  size;
+			ANTLR_UINT32	  numbits;
+			BitsetType*	  errBits;
+
+			// This means we were able to deal with one of a set of
+			// possible tokens at this point, but we did not see any
+			// member of that set.
+			//
+			str_stream << " : unexpected input...\n  expected one of : ";
+
+			// What tokens could we have accepted at this point in the
+			// parse?
+			//
+			count   = 0;
+			errBits = BaseType::m_expectingSet->bitsetLoad();
+			numbits = errBits->numBits();
+			size    = errBits->size();
+
+			if  (size > 0)
+			{
+				// However many tokens we could have dealt with here, it is usually
+				// not useful to print ALL of the set here. I arbitrarily chose 8
+				// here, but you should do whatever makes sense for you of course.
+				// No token number 0, so look for bit 1 and on.
+				//
+				for	(bit = 1; bit < numbits && count < 8 && count < size; bit++)
+				{
+					// TODO: This doesn;t look right - should be asking if the bit is set!!
+					//
+					if  (tokenNames[bit])
+					{
+						str_stream <<  ( count > 0 ? ", " : "" )
+								   <<  tokenNames[bit]; 
+						count++;
+					}
+				}
+				str_stream << "\n";
+			}
+			else
+			{
+				str_stream << "Actually dude, we didn't seem to be expecting anything here, or at least\n";
+				str_stream << "I could not work out what I was expecting, like so many of us these days!\n";
+			}
+		}
+		break;
+	case EARLY_EXIT_EXCEPTION:
+		str_stream << " : missing elements...\n";
+		break;
+	default:
+		str_stream << " : syntax not recognized...\n"; 
+		break;
+	}
+}
+
+template<class ImplTraits, class StreamType>
+ANTLR_ExceptionBase<ImplTraits,StreamType>::~ANTLR_ExceptionBase()
+{
+	ANTLR_ExceptionBase<ImplTraits,StreamType>* next;
+	ANTLR_ExceptionBase<ImplTraits,StreamType>* ex = m_nextException;
+
+    /* Ensure valid pointer
+     */
+    while   (ex != NULL)
+    {
+		/* Pick up anythign following now, before we free the
+		 * current memory block.
+		 */
+		next	= ex->m_nextException;
+		ex->m_nextException = NULL;
+
+		/* Free the actual structure itself
+		 */
+		delete ex;
+
+		ex = next;
+    }
+}
+
+ANTLR_END_NAMESPACE()
diff --git a/runtime/Cpp/include/antlr3filestream.hpp b/runtime/Cpp/include/antlr3filestream.hpp
new file mode 100755
index 0000000..9a46d35
--- /dev/null
+++ b/runtime/Cpp/include/antlr3filestream.hpp
@@ -0,0 +1,75 @@
+#ifndef	_ANTLR3_FILESTREAM_HPP
+#define	_ANTLR3_FILESTREAM_HPP
+
+// [The "BSD licence"]
+// Copyright (c) 2005-2009 Gokulakannan Somasundaram, ElectronDB
+
+//
+// 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.
+
+#include	<exception>
+#include	<string>
+
+#include    "antlr3defs.hpp"
+
+ANTLR_BEGIN_NAMESPACE()
+
+template<class ImplTraits>
+class FileUtils
+{
+public:
+	/** \brief Open an operating system file and return the descriptor
+	 * We just use the common open() and related functions here. 
+	 * Later we might find better ways on systems
+	 * such as Windows and OpenVMS for instance. But the idea is to read the 
+	 * while file at once anyway, so it may be irrelevant.
+	 */
+	static ANTLR_FDSC	AntlrFopen(const ANTLR_UINT8* filename, const char * mode);
+
+	/** \brief Close an operating system file and free any handles
+	 *  etc.
+	 */
+	static void		AntlrFclose	(ANTLR_FDSC fd);
+
+	static ANTLR_UINT32	AntlrFsize(const ANTLR_UINT8* filename);
+	template<typename InputStreamType>
+	static ANTLR_UINT32	AntlrRead8Bit(InputStreamType* input, const ANTLR_UINT8* fileName);
+	static ANTLR_UINT32	AntlrFread(ANTLR_FDSC fdsc, ANTLR_UINT32 count,  void* data);
+
+};
+
+class ParseFileAbsentException : public std::exception
+{
+	virtual const char* what() const throw()
+	{
+		return " Parse File not Present";
+	}
+};
+
+ANTLR_END_NAMESPACE()
+
+#include "antlr3filestream.inl"
+
+#endif
diff --git a/runtime/Cpp/include/antlr3filestream.inl b/runtime/Cpp/include/antlr3filestream.inl
new file mode 100755
index 0000000..59b4f06
--- /dev/null
+++ b/runtime/Cpp/include/antlr3filestream.inl
@@ -0,0 +1,74 @@
+ANTLR_BEGIN_NAMESPACE()
+
+template<class ImplTraits>
+ANTLR_FDSC	FileUtils<ImplTraits>::AntlrFopen(const ANTLR_UINT8* filename, const char * mode)
+{
+	return  (ANTLR_FDSC)fopen((const char *)filename, mode);
+}
+
+template<class ImplTraits>
+void	FileUtils<ImplTraits>::AntlrFclose	(ANTLR_FDSC fd)
+{
+	fclose(fd);
+}
+
+template<class ImplTraits>
+ANTLR_UINT32	FileUtils<ImplTraits>::AntlrFsize(const ANTLR_UINT8* filename)
+{
+    struct _stat	statbuf;
+
+    _stat((const char *)filename, &statbuf);
+
+    return (ANTLR_UINT32)statbuf.st_size;
+}
+
+template<class ImplTraits>
+ANTLR_UINT32	FileUtils<ImplTraits>::AntlrFread(ANTLR_FDSC fdsc, ANTLR_UINT32 count,  void* data)
+{
+	return  (ANTLR_UINT32)fread(data, (size_t)count, 1, fdsc);
+}
+
+template<class ImplTraits>
+	template<typename InputStreamType>
+ANTLR_UINT32	FileUtils<ImplTraits>::AntlrRead8Bit(InputStreamType* input, const ANTLR_UINT8* fileName)
+{
+	ANTLR_FDSC	    infile;
+	ANTLR_UINT32	    fSize;
+
+	/* Open the OS file in read binary mode
+	*/
+	infile  = FileUtils<ImplTraits>::AntlrFopen(fileName, "rb");
+
+	/* Check that it was there
+	*/
+	if	(infile == NULL)
+	{
+		ParseFileAbsentException ex;
+		throw ex;
+	}
+
+	/* It was there, so we can read the bytes now
+	*/
+	fSize   = FileUtils<ImplTraits>::AntlrFsize(fileName);	/* Size of input file	*/
+
+	/* Allocate buffer for this input set   
+	*/
+	void* data = ImplTraits::AllocPolicyType::alloc(fSize);
+	/* Now we read the file. Characters are not converted to
+	* the internal ANTLR encoding until they are read from the buffer
+	*/
+	FileUtils<ImplTraits>::AntlrFread(infile, fSize, data );
+
+	input->set_data( (unsigned char*) data );
+	input->set_sizeBuf( fSize );
+
+	input->set_isAllocated(true);
+
+	/* And close the file handle
+	*/
+	FileUtils<ImplTraits>::AntlrFclose(infile);
+
+	return  ANTLR_SUCCESS;
+}
+
+ANTLR_END_NAMESPACE()
diff --git a/runtime/Cpp/include/antlr3input.hpp b/runtime/Cpp/include/antlr3input.hpp
new file mode 100755
index 0000000..175a5da
--- /dev/null
+++ b/runtime/Cpp/include/antlr3input.hpp
@@ -0,0 +1,327 @@
+/** \file
+ * Defines the basic structures used to manipulate character
+ * streams from any input source. Any character size and encoding
+ * can in theory be used, so long as a set of functinos is provided that
+ * can return a 32 bit Integer representation of their characters amd efficiently mark and revert
+ * to specific offsets into their input streams.
+ */
+#ifndef	_ANTLR_INPUT_HPP
+#define	_ANTLR_INPUT_HPP
+
+// [The "BSD licence"]
+// Copyright (c) 2005-2009 Gokulakannan Somasundaram, ElectronDB
+
+//
+// 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.
+
+#include    "antlr3defs.hpp"
+
+ANTLR_BEGIN_NAMESPACE()
+
+/// Master context structure for an ANTLR3 C runtime based input stream.
+/// \ingroup apistructures. Calling _LT on this doesn't seem right. You would
+/// call it only with parser / TreeParser, and their respective input streams 
+/// has that function. calling it from lexer will throw a compile time error
+///
+
+template<class ImplTraits>
+class	InputStream :   public ImplTraits::template IntStreamType< typename ImplTraits::InputStreamType >
+{
+public:
+	typedef typename ImplTraits::AllocPolicyType AllocPolicyType;
+	typedef typename ImplTraits::LexStateType LexStateType;
+	typedef typename ImplTraits::template IntStreamType< typename ImplTraits::InputStreamType > IntStreamType;
+	typedef IntStreamType BaseType;
+	typedef typename ImplTraits::StreamDataType UnitType;
+	typedef UnitType DataType;
+	typedef UnitType TokenType;
+	typedef typename AllocPolicyType::template VectorType<LexStateType> MarkersType;
+	typedef typename ImplTraits::StringType StringType;
+
+private:
+    /** Pointer the start of the input string, characters may be
+     *  taken as offsets from here and in original input format encoding.
+     */
+    const DataType*		m_data;
+
+    /** Pointer to the next character to be consumed from the input data
+     *  This is cast to point at the encoding of the original file that
+     *  was read by the functions installed as pointer in this input stream
+     *  context instance at file/string/whatever load time.
+     */
+    const DataType*		m_nextChar;
+
+    /** Number of characters that can be consumed at this point in time.
+     *  Mostly this is just what is left in the pre-read buffer, but if the
+     *  input source is a stream such as a socket or something then we may
+     *  call special read code to wait for more input.
+     */
+    ANTLR_UINT32	m_sizeBuf;
+
+    /** The line number we are traversing in the input file. This gets incremented
+     *  by a newline() call in the lexer grammar actions.
+     */
+    ANTLR_UINT32	m_line;
+
+    /** Pointer into the input buffer where the current line
+     *  started.
+     */
+    const DataType*		m_currentLine;
+
+    /** The offset within the current line of the current character
+     */
+    ANTLR_INT32		m_charPositionInLine;
+
+    /** Tracks how deep mark() calls are nested
+     */
+    ANTLR_UINT32	m_markDepth;
+
+    /** List of mark() points in the input stream
+     */
+    MarkersType		m_markers;
+
+    /** File name string, set to pointer to memory if
+     * you set it manually as it will be free()d
+     */
+    StringType		m_fileName;
+
+    /** File number, needs to be set manually to some file index of your devising.
+     */
+    ANTLR_UINT32	m_fileNo;
+
+	/// Character that automatically causes an internal line count
+    ///  increment.
+    ///
+    ANTLR_UCHAR		m_newlineChar;
+
+    /// Indicates the size, in 8 bit units, of a single character. Note that
+    /// the C runtime does not deal with surrogates as this would be
+    /// slow and complicated. If this is a UTF-8 stream then this field
+    /// will be set to 0. Generally you are best working internally with 32 bit characters
+    /// as this is the most efficient.
+    ///
+    ANTLR_UINT8		m_charByteSize;
+
+   /** Indicates if the data pointer was allocated by us, and so should be freed
+     *  when the stream dies.
+     */
+    bool			m_isAllocated;
+
+    /// Indicates the encoding scheme used in this input stream
+    ///
+    ANTLR_UINT32    m_encoding;
+
+    /* API */
+public:
+	InputStream(const ANTLR_UINT8* fileName, ANTLR_UINT32 encoding);
+	InputStream(const ANTLR_UINT8* data, ANTLR_UINT32 encoding, ANTLR_UINT32 size, ANTLR_UINT8* name);
+	~InputStream();
+	const DataType* get_data() const;
+	bool get_isAllocated() const;
+	const DataType* get_nextChar() const;
+	ANTLR_UINT32 get_sizeBuf() const;
+	ANTLR_UINT32 get_line() const;
+	const DataType* get_currentLine() const;
+	ANTLR_INT32 get_charPositionInLine() const;
+	ANTLR_UINT32 get_markDepth() const;
+	MarkersType& get_markers();
+	const StringType& get_fileName() const;
+	ANTLR_UINT32 get_fileNo() const;
+	ANTLR_UCHAR get_newlineChar() const;
+	ANTLR_UINT8 get_charByteSize() const;
+	ANTLR_UINT32 get_encoding() const;
+
+	void  set_data( DataType* data );
+	void  set_isAllocated( bool isAllocated );
+	void  set_nextChar( const DataType* nextChar );
+	void  set_sizeBuf( ANTLR_UINT32 sizeBuf );
+	void  set_line( ANTLR_UINT32 line );
+	void  set_currentLine( const DataType* currentLine );
+	void  set_charPositionInLine( ANTLR_INT32 charPositionInLine );
+	void  set_markDepth( ANTLR_UINT32 markDepth );
+	void  set_markers( const MarkersType& markers );
+	void  set_fileName( const StringType& fileName );
+	void  set_fileNo( ANTLR_UINT32 fileNo );
+	void  set_newlineChar( ANTLR_UCHAR newlineChar );
+	void  set_charByteSize( ANTLR_UINT8 charByteSize );
+	void  set_encoding( ANTLR_UINT32 encoding );
+
+	void inc_charPositionInLine();
+	void inc_line();	
+	void inc_markDepth();
+
+	IntStreamType*	get_istream();
+
+    /** Function that resets the input stream
+     */
+    void	reset();
+
+    /** Pointer to a function that reuses and resets an input stream by
+     *  supplying a new 'source'
+     */
+    void    reuse(ANTLR_UINT8* inString, ANTLR_UINT32 size, ANTLR_UINT8* name);
+
+	
+    /** Function to return the total size of the input buffer. For streams
+     *  this may be just the total we have available so far. This means of course that
+     *  the input stream must be careful to accumulate enough input so that any backtracking
+     *  can be satisfied.
+     */
+    ANTLR_UINT32	size();
+
+    /** Function to return a substring of the input stream. String is returned in allocated
+     *  memory and is in same encoding as the input stream itself, NOT internal ANTLR_UCHAR form.
+     */
+    StringType	substr(ANTLR_MARKER start, ANTLR_MARKER stop);
+
+    /** Function to return the current line number in the input stream
+     */
+    ANTLR_UINT32	get_line();
+
+    /** Function to return the current line buffer in the input stream
+     *  The pointer returned is directly into the input stream so you must copy
+     *  it if you wish to manipulate it without damaging the input stream. Encoding
+     *  is obviously in the same form as the input stream.
+     *  \remark
+     *    - Note taht this function wil lbe inaccurate if setLine is called as there
+     *      is no way at the moment to position the input stream at a particular line 
+     *	    number offset.
+     */
+    const DataType*	getLineBuf();
+
+    /** Function to return the current offset in the current input stream line
+     */
+    ANTLR_UINT32	get_charPositionInLine();
+
+    /** Function to set the current position in the current line.
+     */
+    void	set_charPositionInLine(ANTLR_UINT32 position);
+
+    /** Function to override the default newline character that the input stream
+     *  looks for to trigger the line/offset and line buffer recording information.
+     *  \remark
+     *   - By default the chracter '\n' will be installed as the newline trigger character. When this
+     *     character is seen by the consume() function then the current line number is incremented and the
+     *     current line offset is reset to 0. The Pointer for the line of input we are consuming
+     *     is updated to point to the next character after this one in the input stream (which means it
+     *     may become invalid if the last newline character in the file is seen (so watch out).
+     *   - If for some reason you do not want the counters and pointers to be restee, you can set the 
+     *     chracter to some impossible character such as '\0' or whatever.
+     *   - This is a single character only, so choose the last character in a sequence of two or more.
+     *   - This is only a simple aid to error reporting - if you have a complicated binary input structure
+     *     it may not be adequate, but you can always override every function in the input stream with your
+     *     own of course, and can even write your own complete input stream set if you like.
+     *   - It is your responsiblity to set a valid character for the input stream type. There is no point 
+     *     setting this to 0xFFFFFFFF if the input stream is 8 bit ASCII, as this will just be truncated and never
+     *	   trigger as the comparison will be (INT32)0xFF == (INT32)0xFFFFFFFF
+     */
+    void	set_newLineChar(ANTLR_UINT32 newlineChar);
+	
+	ANTLR_MARKER index_impl();
+
+private:
+	/** \brief Use the contents of an operating system file as the input
+	 *         for an input stream.
+	 *
+	 * \param fileName Name of operating system file to read.
+	 * \return
+	 *	- Pointer to new input stream context upon success
+	 *	- One of the ANTLR3_ERR_ defines on error.
+	 */
+	void createFileStream(const ANTLR_UINT8* fileName);
+
+	/** \brief Use the supplied 'string' as input to the stream
+	 *
+	 * \param data Pointer to the input data
+	 * \return
+	 *	- Pointer to new input stream context upon success
+	 *	- NULL defines on error.
+	 */
+	void createStringStream(const ANTLR_UINT8* data);
+	void genericSetupStream();
+
+	/// Determine endianess of the input stream and install the
+	/// API required for the encoding in that format.
+	///
+	void setupInputStream();
+
+};
+
+/** \brief Structure for track lex input states as part of mark()
+ *  and rewind() of lexer.
+ */
+template<class ImplTraits>
+class	LexState : public ImplTraits::AllocPolicyType
+{
+public:
+	typedef typename ImplTraits::StreamDataType DataType;
+
+private:
+        /** Pointer to the next character to be consumed from the input data
+     *  This is cast to point at the encoding of the original file that
+     *  was read by the functions installed as pointer in this input stream
+     *  context instance at file/string/whatever load time.
+     */
+    const DataType*			m_nextChar;
+
+    /** The line number we are traversing in the input file. This gets incremented
+     *  by a newline() call in the lexer grammer actions.
+     */
+    ANTLR_UINT32	m_line;
+
+    /** Pointer into the input buffer where the current line
+     *  started.
+     */
+    const DataType*			m_currentLine;
+
+    /** The offset within the current line of the current character
+     */
+    ANTLR_INT32		m_charPositionInLine;
+
+public:
+	LexState();
+	const DataType* get_nextChar() const;
+	ANTLR_UINT32 get_line() const;
+	const DataType* get_currentLine() const;
+	ANTLR_INT32 get_charPositionInLine() const;
+	void  set_nextChar( const DataType* nextChar );
+	void  set_line( ANTLR_UINT32 line );
+	void  set_currentLine( const DataType* currentLine );
+	void  set_charPositionInLine( ANTLR_INT32 charPositionInLine );
+};
+
+class ParseNullStringException : public std::exception
+{
+	virtual const char* what() const throw()
+	{
+		return "Null String";
+	}
+};
+
+ANTLR_END_NAMESPACE()
+
+#include "antlr3input.inl"
+
+#endif	/* _ANTLR_INPUT_H  */
diff --git a/runtime/Cpp/include/antlr3input.inl b/runtime/Cpp/include/antlr3input.inl
new file mode 100755
index 0000000..f3362cd
--- /dev/null
+++ b/runtime/Cpp/include/antlr3input.inl
@@ -0,0 +1,619 @@
+ANTLR_BEGIN_NAMESPACE()
+
+template<class ImplTraits>
+InputStream<ImplTraits>::InputStream(const ANTLR_UINT8* fileName, ANTLR_UINT32 encoding)
+{
+    // First order of business is to read the file into some buffer space
+    // as just straight 8 bit bytes. Then we will work out the encoding and
+    // byte order and adjust the API functions that are installed for the
+    // default 8Bit stream accordingly.
+    //
+    this->createFileStream(fileName);
+
+    // We have the data in memory now so we can deal with it according to 
+    // the encoding scheme we were given by the user.
+    //
+    m_encoding = encoding;
+
+    // Now we need to work out the endian type and install any 
+    // API functions that differ from 8Bit
+    //
+    this->setupInputStream();
+
+    // Now we can set up the file name
+    //	
+    BaseType::m_streamName	= (const char* )fileName;
+    m_fileName		= BaseType::m_streamName;
+}
+
+template<class ImplTraits>
+InputStream<ImplTraits>::InputStream(const ANTLR_UINT8* data, ANTLR_UINT32 encoding, ANTLR_UINT32 size, ANTLR_UINT8* name)
+{
+	// First order of business is to set up the stream and install the data pointer.
+    // Then we will work out the encoding and byte order and adjust the API functions that are installed for the
+    // default 8Bit stream accordingly.
+    //
+    this->createStringStream(data);
+    
+    // Size (in bytes) of the given 'string'
+    //
+    m_sizeBuf		= size;
+
+    // We have the data in memory now so we can deal with it according to 
+    // the encoding scheme we were given by the user.
+    //
+    m_encoding = encoding;
+
+    // Now we need to work out the endian type and install any 
+    // API functions that differ from 8Bit
+    //
+    this->setupInputStream();
+
+    // Now we can set up the file name
+    //	
+    BaseType::m_streamName	= (name == NULL ) ? "" : (const char*)name;
+    m_fileName		= BaseType::m_streamName;
+
+}
+
+template<class ImplTraits>
+void InputStream<ImplTraits>::createStringStream(const ANTLR_UINT8* data)
+{
+	if	(data == NULL)
+	{
+		ParseNullStringException ex;
+		throw ex;
+	}
+
+	// Structure was allocated correctly, now we can install the pointer
+	//
+    m_data             = data;
+    m_isAllocated	   = false;
+
+	// Call the common 8 bit input stream handler
+	// initialization.
+	//
+	this->genericSetupStream();
+}
+
+template<class ImplTraits>
+void InputStream<ImplTraits>::createFileStream(const ANTLR_UINT8* fileName)
+{
+	if	(fileName == NULL)
+	{
+		ParseFileAbsentException ex;
+		throw ex;
+	}
+
+	// Structure was allocated correctly, now we can read the file.
+	//
+	FileUtils<ImplTraits>::AntlrRead8Bit(this, fileName);
+
+	// Call the common 8 bit input stream handler
+	// initialization.
+	//
+	this->genericSetupStream();
+}
+
+template<class ImplTraits>
+void InputStream<ImplTraits>::genericSetupStream()
+{
+	this->set_charByteSize(1);
+	
+    /* Set up the input stream brand new
+     */
+    this->reset();
+    
+    /* Install default line separator character (it can be replaced
+     * by the grammar programmer later)
+     */
+    this->set_newLineChar((ANTLR_UCHAR)'\n');
+}
+
+template<class ImplTraits>
+InputStream<ImplTraits>::~InputStream()
+{
+	// Free the input stream buffer if we allocated it
+    //
+    if	(m_isAllocated && (m_data != NULL))
+		AllocPolicyType::free((void*)m_data); //const_cast is required
+}
+
+template<class ImplTraits>
+ANTLR_INLINE const typename InputStream<ImplTraits>::DataType* InputStream<ImplTraits>::get_data() const
+{
+	return m_data;
+}
+template<class ImplTraits>
+ANTLR_INLINE bool InputStream<ImplTraits>::get_isAllocated() const
+{
+	return m_isAllocated;
+}
+template<class ImplTraits>
+ANTLR_INLINE const typename InputStream<ImplTraits>::DataType* InputStream<ImplTraits>::get_nextChar() const
+{
+	return m_nextChar;
+}
+template<class ImplTraits>
+ANTLR_INLINE ANTLR_UINT32 InputStream<ImplTraits>::get_sizeBuf() const
+{
+	return m_sizeBuf;
+}
+template<class ImplTraits>
+ANTLR_INLINE ANTLR_UINT32 InputStream<ImplTraits>::get_line() const
+{
+	return m_line;
+}
+template<class ImplTraits>
+ANTLR_INLINE const typename InputStream<ImplTraits>::DataType* InputStream<ImplTraits>::get_currentLine() const
+{
+	return m_currentLine;
+}
+template<class ImplTraits>
+ANTLR_INLINE ANTLR_INT32 InputStream<ImplTraits>::get_charPositionInLine() const
+{
+	return m_charPositionInLine;
+}
+template<class ImplTraits>
+ANTLR_INLINE ANTLR_UINT32 InputStream<ImplTraits>::get_markDepth() const
+{
+	return m_markDepth;
+}
+template<class ImplTraits>
+ANTLR_INLINE typename InputStream<ImplTraits>::MarkersType& InputStream<ImplTraits>::get_markers()
+{
+	return m_markers;
+}
+template<class ImplTraits>
+ANTLR_INLINE const typename InputStream<ImplTraits>::StringType& InputStream<ImplTraits>::get_fileName() const
+{
+	return m_fileName;
+}
+template<class ImplTraits>
+ANTLR_INLINE ANTLR_UINT32 InputStream<ImplTraits>::get_fileNo() const
+{
+	return m_fileNo;
+}
+template<class ImplTraits>
+ANTLR_INLINE ANTLR_UCHAR InputStream<ImplTraits>::get_newlineChar() const
+{
+	return m_newlineChar;
+}
+template<class ImplTraits>
+ANTLR_INLINE ANTLR_UINT8 InputStream<ImplTraits>::get_charByteSize() const
+{
+	return m_charByteSize;
+}
+template<class ImplTraits>
+ANTLR_INLINE ANTLR_UINT32 InputStream<ImplTraits>::get_encoding() const
+{
+	return m_encoding;
+}
+template<class ImplTraits>
+ANTLR_INLINE void InputStream<ImplTraits>::set_data( DataType* data )
+{
+	m_data = data;
+}
+template<class ImplTraits>
+ANTLR_INLINE void InputStream<ImplTraits>::set_isAllocated( bool isAllocated )
+{
+	m_isAllocated = isAllocated;
+}
+template<class ImplTraits>
+ANTLR_INLINE void InputStream<ImplTraits>::set_nextChar( const DataType* nextChar )
+{
+	m_nextChar = nextChar;
+}
+template<class ImplTraits>
+ANTLR_INLINE void InputStream<ImplTraits>::set_sizeBuf( ANTLR_UINT32 sizeBuf )
+{
+	m_sizeBuf = sizeBuf;
+}
+template<class ImplTraits>
+ANTLR_INLINE void InputStream<ImplTraits>::set_line( ANTLR_UINT32 line )
+{
+	m_line = line;
+}
+template<class ImplTraits>
+ANTLR_INLINE void InputStream<ImplTraits>::set_currentLine( const DataType* currentLine )
+{
+	m_currentLine = currentLine;
+}
+template<class ImplTraits>
+ANTLR_INLINE void InputStream<ImplTraits>::set_charPositionInLine( ANTLR_INT32 charPositionInLine )
+{
+	m_charPositionInLine = charPositionInLine;
+}
+template<class ImplTraits>
+ANTLR_INLINE void InputStream<ImplTraits>::set_markDepth( ANTLR_UINT32 markDepth )
+{
+	m_markDepth = markDepth;
+}
+template<class ImplTraits>
+ANTLR_INLINE void InputStream<ImplTraits>::set_markers( const MarkersType& markers )
+{
+	m_markers = markers;
+}
+template<class ImplTraits>
+ANTLR_INLINE void InputStream<ImplTraits>::set_fileName( const StringType& fileName )
+{
+	m_fileName = fileName;
+}
+template<class ImplTraits>
+ANTLR_INLINE void InputStream<ImplTraits>::set_fileNo( ANTLR_UINT32 fileNo )
+{
+	m_fileNo = fileNo;
+}
+template<class ImplTraits>
+ANTLR_INLINE void InputStream<ImplTraits>::set_newlineChar( ANTLR_UCHAR newlineChar )
+{
+	m_newlineChar = newlineChar;
+}
+template<class ImplTraits>
+ANTLR_INLINE void InputStream<ImplTraits>::set_charByteSize( ANTLR_UINT8 charByteSize )
+{
+	m_charByteSize = charByteSize;
+}
+template<class ImplTraits>
+ANTLR_INLINE void InputStream<ImplTraits>::set_encoding( ANTLR_UINT32 encoding )
+{
+	m_encoding = encoding;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE void InputStream<ImplTraits>::inc_charPositionInLine()
+{
+	++m_charPositionInLine;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE void InputStream<ImplTraits>::inc_line()
+{
+	++m_line;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE void InputStream<ImplTraits>::inc_markDepth()
+{
+	++m_markDepth;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE void	InputStream<ImplTraits>::reset()
+{
+	m_nextChar		= m_data;	/* Input at first character */
+    m_line			= 1;		/* starts at line 1	    */
+    m_charPositionInLine	= 0;
+    m_currentLine		= m_data;
+    m_markDepth		= 0;		/* Reset markers	    */
+    
+    /* Clear out up the markers table if it is there
+     */
+	m_markers.clear();
+}
+
+template<class ImplTraits>
+void    InputStream<ImplTraits>::reuse(ANTLR_UINT8* inString, ANTLR_UINT32 size, ANTLR_UINT8* name)
+{
+	m_isAllocated	= false;
+    m_data		= inString;
+    m_sizeBuf	= size;
+    
+    // Now we can set up the file name. As we are reusing the stream, there may already
+    // be a string that we can reuse for holding the filename.
+    //
+	if	( BaseType::m_streamName.empty() ) 
+	{
+		BaseType::m_streamName	= ((name == NULL) ? "-memory-" : (const char *)name);
+		m_fileName		= BaseType::m_streamName;
+	}
+	else
+	{
+		BaseType::m_streamName = ((name == NULL) ? "-memory-" : (const char *)name);
+	}
+
+    this->reset();
+}
+
+/*
+template<class ImplTraits>
+typename InputStream<ImplTraits>::DataType*	InputStream<ImplTraits>::_LT(ANTLR_INT32 lt)
+{
+	return this->_LA(lt);
+}
+*/
+
+template<class ImplTraits>
+ANTLR_UINT32	InputStream<ImplTraits>::size()
+{
+	return m_sizeBuf;
+}
+
+template<class ImplTraits>
+ANTLR_MARKER	InputStream<ImplTraits>::index_impl()
+{
+	return (ANTLR_MARKER)m_nextChar;
+}
+
+
+template<class ImplTraits>
+typename InputStream<ImplTraits>::StringType	InputStream<ImplTraits>::substr(ANTLR_MARKER start, ANTLR_MARKER stop)
+{
+	std::size_t len = static_cast<std::size_t>( (stop-start)/sizeof(DataType) + 1 );
+	StringType str( (const char*)start, len );
+	return str;
+}
+
+template<class ImplTraits>
+ANTLR_UINT32	InputStream<ImplTraits>::get_line()
+{
+	return m_line;
+}
+
+template<class ImplTraits>
+const typename InputStream<ImplTraits>::DataType*	InputStream<ImplTraits>::getLineBuf()
+{
+	return m_currentLine;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE ANTLR_UINT32	InputStream<ImplTraits>::get_charPositionInLine()
+{
+	return m_charPositionInLine;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE void	InputStream<ImplTraits>::set_charPositionInLine(ANTLR_UINT32 position)
+{
+	m_charPositionInLine = position;
+}
+
+template<class ImplTraits>
+void	InputStream<ImplTraits>::set_newLineChar(ANTLR_UINT32 newlineChar)
+{
+	m_newlineChar = newlineChar;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE LexState<ImplTraits>::LexState()
+{
+	m_nextChar = NULL;
+	m_line = 0;
+	m_currentLine = NULL;
+	m_charPositionInLine = 0;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE const typename LexState<ImplTraits>::DataType* LexState<ImplTraits>::get_nextChar() const
+{
+	return m_nextChar;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE ANTLR_UINT32 LexState<ImplTraits>::get_line() const
+{
+	return m_line;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE const typename LexState<ImplTraits>::DataType* LexState<ImplTraits>::get_currentLine() const
+{
+	return m_currentLine;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE ANTLR_INT32 LexState<ImplTraits>::get_charPositionInLine() const
+{
+	return m_charPositionInLine;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE void LexState<ImplTraits>::set_nextChar( const DataType* nextChar )
+{
+	m_nextChar = nextChar;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE void LexState<ImplTraits>::set_line( ANTLR_UINT32 line )
+{
+	m_line = line;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE void LexState<ImplTraits>::set_currentLine( const DataType* currentLine )
+{
+	m_currentLine = currentLine;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE void LexState<ImplTraits>::set_charPositionInLine( ANTLR_INT32 charPositionInLine )
+{
+	m_charPositionInLine = charPositionInLine;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE typename InputStream<ImplTraits>::IntStreamType*	InputStream<ImplTraits>::get_istream()
+{
+	return this;
+}
+
+template<class ImplTraits>
+void InputStream<ImplTraits>::setupInputStream()
+{
+	bool  isBigEndian;
+
+    // Used to determine the endianness of the machine we are currently
+    // running on.
+    //
+    ANTLR_UINT16 bomTest = 0xFEFF;
+    
+    // What endianess is the machine we are running on? If the incoming
+    // encoding endianess is the same as this machine's natural byte order
+    // then we can use more efficient API calls.
+    //
+    if  (*((ANTLR_UINT8*)(&bomTest)) == 0xFE)
+    {
+        isBigEndian = true;
+    }
+    else
+    {
+        isBigEndian = false;
+    }
+
+    // What encoding did the user tell us {s}he thought it was? I am going
+    // to get sick of the questions on antlr-interest, I know I am.
+    //
+    switch  (m_encoding)
+    {
+        case    ANTLR_ENC_UTF8:
+
+            // See if there is a BOM at the start of this UTF-8 sequence
+            // and just eat it if there is. Windows .TXT files have this for instance
+            // as it identifies UTF-8 even though it is of no consequence for byte order
+            // as UTF-8 does not have a byte order.
+            //
+            if  (       (*(m_nextChar))      == 0xEF
+                    &&  (*(m_nextChar+1))    == 0xBB
+                    &&  (*(m_nextChar+2))    == 0xBF
+                )
+            {
+                // The UTF8 BOM is present so skip it
+                //
+                m_nextChar += 3;
+            }
+
+            // Install the UTF8 input routines
+            //
+			this->setupIntStream( isBigEndian, isBigEndian );
+			this->set_charByteSize(0);
+            break;
+
+        case    ANTLR_ENC_UTF16:
+
+            // See if there is a BOM at the start of the input. If not then
+            // we assume that the byte order is the natural order of this
+            // machine (or it is really UCS2). If there is a BOM we determine if the encoding
+            // is the same as the natural order of this machine.
+            //
+            if  (       (ANTLR_UINT8)(*((ANTLR_UINT8*)m_nextChar))      == 0xFE
+                    &&  (ANTLR_UINT8)(*((ANTLR_UINT8*)m_nextChar+1))    == 0xFF
+                )
+            {
+                // BOM Present, indicates Big Endian
+                //
+                m_nextChar += 1;
+
+				this->setupIntStream( isBigEndian, true );
+            }
+            else if  (      (ANTLR_UINT8)(*((ANTLR_UINT8*)m_nextChar))      == 0xFF
+                        &&  (ANTLR_UINT8)(*((ANTLR_UINT8*)m_nextChar+1))    == 0xFE
+                )
+            {
+                // BOM present, indicates Little Endian
+                //
+                m_nextChar += 1;
+
+                this->setupIntStream( isBigEndian, false );
+            }
+            else
+            {
+                // No BOM present, assume local computer byte order
+                //
+                this->setupIntStream(isBigEndian, isBigEndian);
+            }
+			this->set_charByteSize(2);
+            break;
+
+        case    ANTLR_ENC_UTF32:
+
+            // See if there is a BOM at the start of the input. If not then
+            // we assume that the byte order is the natural order of this
+            // machine. If there is we determine if the encoding
+            // is the same as the natural order of this machine.
+            //
+            if  (       (ANTLR_UINT8)(*((ANTLR_UINT8*)m_nextChar))      == 0x00
+                    &&  (ANTLR_UINT8)(*((ANTLR_UINT8*)m_nextChar+1))    == 0x00
+                    &&  (ANTLR_UINT8)(*((ANTLR_UINT8*)m_nextChar+2))    == 0xFE
+                    &&  (ANTLR_UINT8)(*((ANTLR_UINT8*)m_nextChar+3))    == 0xFF
+                )
+            {
+                // BOM Present, indicates Big Endian
+                //
+                m_nextChar += 1;
+
+                this->setupIntStream(isBigEndian, true);
+            }
+            else if  (      (ANTLR_UINT8)(*((ANTLR_UINT8*)m_nextChar))      == 0xFF
+                        &&  (ANTLR_UINT8)(*((ANTLR_UINT8*)m_nextChar+1))    == 0xFE
+                        &&  (ANTLR_UINT8)(*((ANTLR_UINT8*)m_nextChar+1))    == 0x00
+                        &&  (ANTLR_UINT8)(*((ANTLR_UINT8*)m_nextChar+1))    == 0x00
+                )
+            {
+                // BOM present, indicates Little Endian
+                //
+                m_nextChar += 1;
+
+				this->setupIntStream( isBigEndian, false );
+            }
+            else
+            {
+                // No BOM present, assume local computer byte order
+                //
+				this->setupIntStream( isBigEndian, isBigEndian );
+            }
+			this->set_charByteSize(4);
+            break;
+
+        case    ANTLR_ENC_UTF16BE:
+
+            // Encoding is definately Big Endian with no BOM
+            //
+			this->setupIntStream( isBigEndian, true );
+			this->set_charByteSize(2);
+            break;
+
+        case    ANTLR_ENC_UTF16LE:
+
+            // Encoding is definately Little Endian with no BOM
+            //
+            this->setupIntStream( isBigEndian, false );
+			this->set_charByteSize(2);
+            break;
+
+        case    ANTLR_ENC_UTF32BE:
+
+            // Encoding is definately Big Endian with no BOM
+            //
+			this->setupIntStream( isBigEndian, true );
+			this->set_charByteSize(4);
+            break;
+
+        case    ANTLR_ENC_UTF32LE:
+
+            // Encoding is definately Little Endian with no BOM
+            //
+			this->setupIntStream( isBigEndian, false );
+			this->set_charByteSize(4);
+            break;
+
+        case    ANTLR_ENC_EBCDIC:
+
+            // EBCDIC is basically the same as ASCII but with an on the
+            // fly translation to ASCII
+            //
+            this->setupIntStream( isBigEndian, isBigEndian );
+			this->set_charByteSize(1);
+            break;
+
+        case    ANTLR_ENC_8BIT:
+        default:
+
+            // Standard 8bit/ASCII
+            //
+            this->setupIntStream( isBigEndian, isBigEndian );
+			this->set_charByteSize(1);
+            break;
+    }    
+}
+
+ANTLR_END_NAMESPACE()
diff --git a/runtime/Cpp/include/antlr3interfaces.hpp b/runtime/Cpp/include/antlr3interfaces.hpp
new file mode 100755
index 0000000..f629784
--- /dev/null
+++ b/runtime/Cpp/include/antlr3interfaces.hpp
@@ -0,0 +1,301 @@
+/** \file
+ * Declarations for all the antlr3 C runtime interfaces/classes. This
+ * allows the structures that define the interfaces to contain pointers to
+ * each other without trying to sort out the cyclic interdependencies that
+ * would otherwise result.
+ */
+#ifndef	_ANTLR3_INTERFACES_HPP
+#define	_ANTLR3_INTERFACES_HPP
+
+// [The "BSD licence"]
+// Copyright (c) 2005-2009 Gokulakannan Somasundaram, ElectronDB
+//
+// 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.
+
+ANTLR_BEGIN_NAMESPACE()
+
+template<class ImplTraits, class SuperType>
+class IntStream;
+
+/// Pointer to an instantiation of 'class' #ANTLR3_RECOGNIZER_SHARED_STATE
+/// \ingroup ANTLR3_RECOGNIZER_SHARED_STATE
+///
+template<class ImplTraits, class SuperType>
+class RecognizerSharedState;
+
+/// Pointer to an instantiation of 'class' #ANTLR3_BITSET_LIST
+/// \ingroup ANTLR3_BITSET_LIST
+///
+template<class AllocatorType>
+class BitsetList;
+
+/// Pointer to an instantiation of 'class' #ANTLR3_BITSET
+/// \ingroup ANTLR3_BITSET
+///
+template<class AllocatorType>
+class Bitset;
+
+/// Pointer to an instantiation of 'class' #ANTLR3_COMMON_TOKEN
+/// \ingroup ANTLR3_COMMON_TOKEN
+///
+template<class ImplTraits>
+class CommonToken;
+
+template<class ImplTraits>
+class CommonTokenFunctions;
+
+/// Pointer to an instantiation of 'class' #ANTLR3_EXCEPTION
+/// \ingroup ANTLR3_EXCEPTION
+///
+enum ExceptionType
+{
+	/** Indicates that the recognizer received a token
+	 *  in the input that was not predicted.
+	 */
+	RECOGNITION_EXCEPTION = 0
+	/** Indicates that the recognizer was expecting one token and found a
+	 *  a different one.
+	 */
+	, MISMATCHED_TOKEN_EXCEPTION
+
+	/** Recognizer could not find a valid alternative from the input
+	 */
+	, NO_VIABLE_ALT_EXCEPTION
+
+	/* Character in a set was not found
+	 */
+	, MISMATCHED_SET_EXCEPTION
+
+	/* A rule predicting at least n elements found less than that,
+	 * such as: WS: " "+;
+	 */
+	, EARLY_EXIT_EXCEPTION
+
+	, FAILED_PREDICATE_EXCEPTION
+
+	, MISMATCHED_TREE_NODE_EXCEPTION
+
+	, REWRITE_EARLY_EXCEPTION
+
+	, UNWANTED_TOKEN_EXCEPTION
+
+	, MISSING_TOKEN_EXCEPTION
+};
+
+template<class ImplTraits, ExceptionType Ex, class StreamType>
+class ANTLR_Exception;
+
+/// Pointer to an instantiation of 'class' #ANTLR3_TOPO
+/// \ingroup ANTLR3_TOPO
+///
+template<class AllocPolicyType>
+class Topo;
+
+/// Pointer to an instantiation of 'class' #ANTLR3_INPUT_STREAM
+/// \ingroup ANTLR3_INPUT_STREAM
+///
+template<class ImplTraits>
+class InputStream;
+
+/// Pointer to an instantiation of 'class' #ANTLR3_LEX_STATE
+/// \ingroup ANTLR3_LEX_STATE
+///
+template<class ImplTraits>
+class LexState;
+
+/// Pointer to an instantiation of 'class' #ANTLR3_TOKEN_SOURCE
+/// \ingroup ANTLR3_TOKEN_SOURCE
+///
+template<class ImplTraits>
+class TokenSource;
+template<class ImplTraits, class SuperType>
+class TokenSourceFunctions;
+
+/// Pointer to an instantiation of 'class' #ANTLR3_TOKEN_STREAM
+/// \ingroup ANTLR3_TOKEN_STREAM
+///
+template<class ImplTraits>
+class TokenStream;
+template<class ImplTraits>
+class TokenStreamFunctions;
+
+/// Pointer to an instantiation of 'class' #ANTLR3_COMMON_TOKEN_STREAM
+/// \ingroup ANTLR3_COMMON_TOKEN_STREAM
+///
+template<class ImplTraits>
+class CommonTokenStream;
+template<class ImplTraits>
+class CommonTokenStreamFunctions;
+
+
+/// Pointer to an instantiation of 'class' #ANTLR3_CYCLIC_DFA
+/// \ingroup ANTLR3_CYCLIC_DFA
+///
+template<class ImplTraits, class ComponentType>
+class CyclicDFA;
+
+/// Pointer to an instantiation of 'class' #ANTLR3_LEXER
+/// \ingroup ANTLR3_LEXER
+///
+template<class ImplTraits>
+class Lexer;
+
+/// Pointer to an instantiation of 'class' #ANTLR3_PARSER
+/// \ingroup ANTLR3_PARSER
+///
+template<class ImplTraits>
+class Parser;
+
+/// Pointer to an instantiation of 'class' #ANTLR3_BASE_TREE
+/// \ingroup ANTLR3_BASE_TREE
+///
+template<class ImplTraits>
+class BaseTree;
+template<class ImplTraits>
+class BaseTreeFunctions;
+
+
+/// Pointer to an instantiation of 'class' #ANTLR3_COMMON_TREE
+/// \ingroup ANTLR3_COMMON_TREE
+///
+template<class ImplTraits>
+class CommonTree;
+template<class ImplTraits>
+class CommonTreeFunctions;
+
+/// Pointer to an instantiation of 'class' #ANTLR3_PARSE_TREE
+/// \ingroup ANTLR3_PARSE_TREE
+///
+template<class ImplTraits>
+class ParseTree;
+
+/// Pointer to an instantiation of 'class' #ANTLR3_TREE_NODE_STREAM
+/// \ingroup ANTLR3_TREE_NODE_STREAM
+///
+template<class ImplTraits>
+class TreeNodeStream;
+
+/// Pointer to an instantiation of 'class' #ANTLR3_COMMON_TREE_NODE_STREAM
+/// \ingroup ANTLR3_COMMON_TREE_NODE_STREAM
+///
+template<class ImplTraits>
+class CommonTreeNodeStream;
+
+/// Pointer to an instantiation of 'class' #ANTLR3_TREE_WALK_STATE
+/// \ingroup ANTLR3_TREE_WALK_STATE
+///
+template<class ImplTraits>
+class TreeWalkState;
+
+/// Pointer to an instantiation of 'class' #ANTLR3_BASE_TREE_ADAPTOR
+/// \ingroup ANTLR3_BASE_TREE_ADAPTOR
+///
+template<class ImplTraits>
+class BaseTreeAdaptor;
+template<class ImplTraits>
+class BaseTreeAdaptorFunctions;
+
+
+/// Pointer to an instantiation of 'class' #ANTLR3_COMMON_TREE_ADAPTOR
+/// \ingroup ANTLR3_COMMON_TREE_ADAPTOR
+///
+template<class ImplTraits>
+class CommonTreeAdaptor;
+template<class ImplTraits>
+class CommonTreeAdaptorFunctions;
+
+
+/// Pointer to an instantiation of 'class' #ANTLR3_TREE_PARSER
+/// \ingroup ANTLR3_TREE_PARSER
+///
+template<class ImplTraits>
+class TreeParser;
+
+/// Pointer to an instantiation of 'class' #ANTLR3_INT_TRIE
+/// \ingroup ANTLR3_INT_TRIE
+///
+template< class DataType, class AllocPolicyType >
+class IntTrie;
+
+/// Pointer to an instantiation of 'class' #ANTLR3_REWRITE_RULE_ELEMENT_STREAM
+/// \ingroup ANTLR3_REWRITE_RULE_ELEMENT_STREAM
+///
+template<class ImplTraits, class SuperType>
+class RewriteRuleElementStream;
+
+template<class ImplTraits>
+class RewriteRuleTokenStream;
+
+template<class ImplTraits>
+class RewriteRuleSubtreeStream;
+
+template<class ImplTraits>
+class RewriteRuleNodeStream;
+
+/// Pointer to an instantiation of 'class' #ANTLR3_DEBUG_EVENT_LISTENER
+/// \ingroup ANTLR3_DEBUG_EVENT_LISTENER
+///
+template<class ImplTraits>
+class  DebugEventListener;
+
+//A Class just used for forwarding other classes for simplifying class forwarding
+//Logic: constructor is made simple
+template<class A>
+class ClassForwarder {};
+
+template<bool b>
+class BoolForwarder {};
+class Empty {};
+
+template<class ImplTraits, class StreamType>
+class ComponentTypeFinder
+{
+};
+
+template<class ImplTraits>
+class ComponentTypeFinder< ImplTraits, typename ImplTraits::InputStreamType>
+{
+public:
+	typedef typename ImplTraits::LexerType ComponentType;
+};
+
+template<class ImplTraits>
+class ComponentTypeFinder< ImplTraits, typename ImplTraits::TokenStreamType>
+{
+public:
+	typedef typename ImplTraits::ParserType ComponentType;
+};
+
+template<class ImplTraits>
+class ComponentTypeFinder< ImplTraits, typename ImplTraits::TreeNodeStreamType>
+{
+public:
+	typedef typename ImplTraits::TreeParserType ComponentType;
+};
+
+
+ANTLR_END_NAMESPACE()
+
+#endif
diff --git a/runtime/Cpp/include/antlr3intstream.hpp b/runtime/Cpp/include/antlr3intstream.hpp
new file mode 100755
index 0000000..82c116b
--- /dev/null
+++ b/runtime/Cpp/include/antlr3intstream.hpp
@@ -0,0 +1,404 @@
+/** \file
+ * Defines the the class interface for an antlr3 INTSTREAM.
+ * 
+ * Certain functionality (such as DFAs for instance) abstract the stream of tokens
+ * or characters in to a steam of integers. Hence this structure should be included
+ * in any stream that is able to provide the output as a stream of integers (which is anything
+ * basically.
+ *
+ * There are no specific implementations of the methods in this interface in general. Though
+ * for purposes of casting and so on, it may be necesssary to implement a function with
+ * the signature in this interface which abstracts the base immplementation. In essence though
+ * the base stream provides a pointer to this interface, within which it installs its
+ * normal match() functions and so on. Interaces such as DFA are then passed the pANTLR3_INT_STREAM
+ * and can treat any input as an int stream. 
+ *
+ * For instance, a lexer implements a pANTLR3_BASE_RECOGNIZER, within which there is a pANTLR3_INT_STREAM.
+ * However, a pANTLR3_INPUT_STREAM also provides a pANTLR3_INT_STREAM, which it has constructed from
+ * it's normal interface when it was created. This is then pointed at by the pANTLR_BASE_RECOGNIZER
+ * when it is intialized with a pANTLR3_INPUT_STREAM.
+ *
+ * Similarly if a pANTLR3_BASE_RECOGNIZER is initialized with a pANTLR3_TOKEN_STREAM, then the 
+ * pANTLR3_INT_STREAM is taken from the pANTLR3_TOKEN_STREAM. 
+ *
+ * If a pANTLR3_BASE_RECOGNIZER is initialized with a pANTLR3_TREENODE_STREAM, then guess where
+ * the pANTLR3_INT_STREAM comes from?
+ *
+ * Note that because the context pointer points to the actual interface structure that is providing
+ * the ANTLR3_INT_STREAM it is defined as a (void *) in this interface. There is no direct implementation
+ * of an ANTLR3_INT_STREAM (unless someone did not understand what I was doing here =;?P
+ */
+#ifndef	_ANTLR3_INTSTREAM_HPP
+#define	_ANTLR3_INTSTREAM_HPP
+
+// [The "BSD licence"]
+// Copyright (c) 2005-2009 Gokulakannan Somasundaram, ElectronDB
+
+//
+// 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.
+
+#include  <cassert>
+
+#include    "antlr3defs.hpp"
+
+ANTLR_BEGIN_NAMESPACE()
+
+enum STREAM_TYPE
+{
+	/** Type indicator for a character stream
+	 * \remark if a custom stream is created but it can be treated as
+	 * a char stream, then you may OR in this value to your type indicator
+	 */
+	CHARSTREAM	= 0x0001
+
+	/** Type indicator for a Token stream
+	 * \remark if a custom stream is created but it can be treated as
+	 * a token stream, then you may OR in this value to your type indicator
+	 */
+	, TOKENSTREAM = 0x0002
+
+	/** Type indicator for a common tree node stream
+	 * \remark if a custom stream is created but it can be treated as
+	 * a common tree node stream, then you may OR in this value to your type indicator
+	 */
+	, COMMONTREENODE = 0x0004
+
+	/** Type mask for input stream so we can switch in the above types
+	*  \remark DO NOT USE 0x0000 as a stream type!
+	*/
+	, INPUT_MASK =	0x0007
+};
+
+class RESOLVE_ENDIAN_AT_RUNTIME {};
+class BYTE_AGNOSTIC {};
+class ANTLR_LITTLE_ENDIAN {};
+class ANTLR_BIG_ENDIAN {};
+
+template<class ImplTraits, class SuperType>
+class IntStream : public ImplTraits::AllocPolicyType
+{
+public:
+	typedef typename ImplTraits::StringType StringType;
+	
+protected:
+    /** Potentially useful in error reporting and so on, this string is
+     *  an identification of the input source. It may be NULL, so anything
+     *  attempting to access it needs to check this and substitute a sensible
+     *  default.
+     */
+    StringType		m_streamName;
+
+    /** Last marker position allocated
+     */
+    ANTLR_MARKER	m_lastMarker;
+	
+    bool		m_upper_case; //if set, values should be returbed in upper case	
+
+    /// Indicates whether we should implement endian-specific logic
+    /// 0 - Undefined 1 - Default(machine and input are both same), 2 - Little Endian, 3 - Big Endian
+    ANTLR_UINT8		m_endian_spec;	
+
+public:
+	IntStream();
+	
+	// Return a string that identifies the input source
+	//
+	StringType		getSourceName();
+	StringType& 	get_streamName();
+	const StringType& 	get_streamName() const;
+	ANTLR_MARKER get_lastMarker() const;
+
+	SuperType* get_super();
+	/**
+     * Function that installs a version of LA that always
+     * returns upper case. Only valid for character streams and creates a case
+     * insensitive lexer if the lexer tokens are described in upper case. The
+     * tokens will preserve case in the token text.
+     */
+    void	setUcaseLA(bool flag);
+
+    /** Consume the next 'ANTR3_UINT32' in the stream
+     */
+    void		    consume();
+
+    /** Get ANTLR3_UINT32 at current input pointer + i ahead where i=1 is next ANTLR3_UINT32 
+     */
+    ANTLR_UINT32	_LA( ANTLR_INT32 i);
+
+    /** Tell the stream to start buffering if it hasn't already.  Return
+     *  current input position, index(), or some other marker so that
+     *  when passed to rewind() you get back to the same spot.
+     *  rewind(mark()) should not affect the input cursor.
+     */
+    ANTLR_MARKER	    mark();
+    
+    /** Return the current input symbol index 0..n where n indicates the
+     *  last symbol has been read.
+     */
+    ANTLR_MARKER	    index();
+
+    /** Reset the stream so that next call to index would return marker.
+     *  The marker will usually be index() but it doesn't have to be.  It's
+     *  just a marker to indicate what state the stream was in.  This is
+     *  essentially calling release() and seek().  If there are markers
+     *  created after this marker argument, this routine must unroll them
+     *  like a stack.  Assume the state the stream was in when this marker
+     *  was created.
+     */
+    void	rewind(ANTLR_MARKER marker);
+
+    /** Reset the stream to the last marker position, witouh destryoing the
+     *  last marker position.
+     */
+    void	rewindLast();
+
+    /** You may want to commit to a backtrack but don't want to force the
+     *  stream to keep bookkeeping objects around for a marker that is
+     *  no longer necessary.  This will have the same behavior as
+     *  rewind() except it releases resources without the backward seek.
+     */
+    void	release(ANTLR_MARKER mark);
+
+    /** Set the input cursor to the position indicated by index.  This is
+     *  normally used to seek ahead in the input stream.  No buffering is
+     *  required to do this unless you know your stream will use seek to
+     *  move backwards such as when backtracking.
+     *
+     *  This is different from rewind in its multi-directional
+     *  requirement and in that its argument is strictly an input cursor (index).
+     *
+     *  For char streams, seeking forward must update the stream state such
+     *  as line number.  For seeking backwards, you will be presumably
+     *  backtracking using the mark/rewind mechanism that restores state and
+     *  so this method does not need to update state when seeking backwards.
+     *
+     *  Currently, this method is only used for efficient backtracking, but
+     *  in the future it may be used for incremental parsing.
+     */
+    void	seek(ANTLR_MARKER index);
+
+	/// Debug only method to flag consumption of initial off-channel
+	/// tokens in the input stream
+	///
+	void consumeInitialHiddenTokens();
+
+	void  rewindMark(ANTLR_MARKER marker);
+	ANTLR_MARKER tindex();
+
+    /** Frees any resources that were allocated for the implementation of this
+     *  interface. Usually this is just releasing the memory allocated
+     *  for the structure itself, but it may of course do anything it need to
+     *  so long as it does not stamp on anything else.
+     */
+	~IntStream();
+
+protected:
+	void setupIntStream(bool machineBigEndian, bool inputBigEndian);
+	void findout_endian_spec(bool machineBigEndian, bool inputBigEndian);
+
+	//If the user chooses this option, then we will be resolving stuffs at run-time
+	ANTLR_UINT32	_LA( ANTLR_INT32 i, ClassForwarder<RESOLVE_ENDIAN_AT_RUNTIME> );
+
+	//resolve into one of the three categories below at runtime
+	void	consume( ClassForwarder<RESOLVE_ENDIAN_AT_RUNTIME> );
+};
+
+template<class ImplTraits, class SuperType>
+class EBCDIC_IntStream : public IntStream<ImplTraits, SuperType>
+{
+public:
+	ANTLR_UINT32	_LA( ANTLR_INT32 i);
+
+protected:
+	void setupIntStream();
+};
+
+template<class ImplTraits, class SuperType>
+class UTF8_IntStream : public IntStream<ImplTraits, SuperType>
+{
+public:
+	ANTLR_UINT32	_LA( ANTLR_INT32 i);
+	void consume();
+
+protected:
+	void setupIntStream(bool machineBigEndian, bool inputBigEndian);
+
+private:
+	static const ANTLR_UINT32* TrailingBytesForUTF8();
+	static const UTF32* OffsetsFromUTF8();
+};
+
+template<class ImplTraits, class SuperType>
+class UTF16_IntStream : public IntStream<ImplTraits, SuperType>
+{
+public:
+	ANTLR_UINT32	_LA( ANTLR_INT32 i);
+	void		    consume();
+	ANTLR_MARKER	index();
+	void seek(ANTLR_MARKER seekPoint);
+
+protected:
+	void setupIntStream(bool machineBigEndian, bool inputBigEndian);
+
+	/// \brief Return the input element assuming an 8 bit ascii input
+	///
+	/// \param[in] input Input stream context pointer
+	/// \param[in] la 1 based offset of next input stream element
+	///
+	/// \return Next input character in internal ANTLR3 encoding (UTF32)
+	///
+	ANTLR_UINT32	_LA( ANTLR_INT32 i, ClassForwarder<BYTE_AGNOSTIC> );
+
+	/// \brief Return the input element assuming a UTF16 input when the input is Little Endian and the machine is not
+	///
+	/// \param[in] input Input stream context pointer
+	/// \param[in] la 1 based offset of next input stream element
+	///
+	/// \return Next input character in internal ANTLR3 encoding (UTF32)
+	///
+	ANTLR_UINT32	_LA( ANTLR_INT32 i, ClassForwarder<ANTLR_LITTLE_ENDIAN> );
+	
+	/// \brief Return the input element assuming a UTF16 input when the input is Little Endian and the machine is not
+	///
+	/// \param[in] input Input stream context pointer
+	/// \param[in] la 1 based offset of next input stream element
+	///
+	/// \return Next input character in internal ANTLR3 encoding (UTF32)
+	///
+	ANTLR_UINT32	_LA( ANTLR_INT32 i, ClassForwarder<ANTLR_BIG_ENDIAN> );
+
+	/// \brief Consume the next character in a UTF16 input stream
+	///
+	/// \param input Input stream context pointer
+	///
+	void	consume( ClassForwarder<BYTE_AGNOSTIC> );
+
+	/// \brief Consume the next character in a UTF16 input stream when the input is Little Endian and the machine is not
+	/// Note that the UTF16 routines do not do any substantial verification of the input stream as for performance
+	/// sake, we assume it is validly encoded. So if a low surrogate is found at the curent input position then we
+	/// just consume it. Surrogate pairs should be seen as Hi, Lo. So if we have a Lo first, then the input stream
+	/// is fubar but we just ignore that.
+	///
+	/// \param input Input stream context pointer
+	///
+	void	consume( ClassForwarder<ANTLR_LITTLE_ENDIAN> );
+
+	/// \brief Consume the next character in a UTF16 input stream when the input is Big Endian and the machine is not
+	///
+	/// \param input Input stream context pointer
+	///
+	void	consume( ClassForwarder<ANTLR_BIG_ENDIAN> );
+};
+
+
+
+template<class ImplTraits, class SuperType>
+class UTF32_IntStream : public IntStream<ImplTraits, SuperType>
+{
+public:
+	ANTLR_UINT32	_LA( ANTLR_INT32 i);
+	void		    consume();
+	
+	/// \brief Calculate the current index in the output stream.
+	/// \param[in] input Input stream context pointer
+	///
+	ANTLR_MARKER	index();
+	void seek(ANTLR_MARKER seekPoint);
+
+protected:
+	void setupIntStream(bool machineBigEndian, bool inputBigEndian);
+	ANTLR_UINT32	_LA( ANTLR_INT32 i, ClassForwarder<RESOLVE_ENDIAN_AT_RUNTIME> );
+	ANTLR_UINT32	_LA( ANTLR_INT32 i, ClassForwarder<BYTE_AGNOSTIC> );
+	ANTLR_UINT32	_LA( ANTLR_INT32 i, ClassForwarder<ANTLR_LITTLE_ENDIAN> );
+	ANTLR_UINT32	_LA( ANTLR_INT32 i, ClassForwarder<ANTLR_BIG_ENDIAN> );
+
+	void	consume( ClassForwarder<RESOLVE_ENDIAN_AT_RUNTIME> );
+	void	consume( ClassForwarder<BYTE_AGNOSTIC> );
+	void	consume( ClassForwarder<ANTLR_LITTLE_ENDIAN> );
+	void	consume( ClassForwarder<ANTLR_BIG_ENDIAN> );
+};
+
+template<class ImplTraits>
+class TokenIntStream : public IntStream<ImplTraits, typename ImplTraits::TokenStreamType >
+{
+public:
+	typedef typename ImplTraits::CommonTokenType CommonTokenType;
+	typedef typename ImplTraits::StringType StringType;
+	typedef typename ImplTraits::TokenStreamType TokenStreamType;
+	typedef IntStream<ImplTraits, TokenStreamType > BaseType;
+
+private:
+	/** Because the indirect call, though small in individual cases can
+     *  mount up if there are thousands of tokens (very large input streams), callers
+     *  of size can optionally use this cached size field.
+     */
+    ANTLR_UINT32	    m_cachedSize;
+
+public:
+	TokenIntStream();
+	ANTLR_UINT32 get_cachedSize() const;
+	void set_cachedSize( ANTLR_UINT32 cachedSize );
+
+	void consume();
+	void  consumeInitialHiddenTokens();
+	ANTLR_UINT32  _LA( ANTLR_INT32 i );
+	ANTLR_MARKER  mark();
+	ANTLR_UINT32  size();
+	void release();
+	ANTLR_MARKER  tindex();
+	void rewindLast();
+	void rewind(ANTLR_MARKER marker);
+	void seek(ANTLR_MARKER index);
+	StringType getSourceName();
+
+};
+
+template<class ImplTraits>
+class TreeNodeIntStream : public IntStream<ImplTraits, typename ImplTraits::CommonTreeNodeStreamType>
+{
+public:
+	typedef typename ImplTraits::CommonTreeNodeStreamType CommonTreeNodeStreamType;
+	typedef IntStream<ImplTraits, CommonTreeNodeStreamType > BaseType;
+	typedef typename ImplTraits::TreeType TreeType;
+	typedef typename ImplTraits::CommonTokenType CommonTokenType;
+
+public:
+	void				consume();
+	ANTLR_MARKER		tindex();
+	ANTLR_UINT32		_LA(ANTLR_INT32 i);
+	ANTLR_MARKER		mark();
+	void				release(ANTLR_MARKER marker);
+	void				rewindMark(ANTLR_MARKER marker);
+	void				rewindLast();
+	void				seek(ANTLR_MARKER index);
+	ANTLR_UINT32		size();
+};
+
+ANTLR_END_NAMESPACE()
+
+#include "antlr3intstream.inl"
+
+#endif
+
diff --git a/runtime/Cpp/include/antlr3intstream.inl b/runtime/Cpp/include/antlr3intstream.inl
new file mode 100755
index 0000000..e4de290
--- /dev/null
+++ b/runtime/Cpp/include/antlr3intstream.inl
@@ -0,0 +1,1661 @@
+ANTLR_BEGIN_NAMESPACE()
+
+template<class ImplTraits, class SuperType>
+ANTLR_INLINE IntStream<ImplTraits, SuperType>::IntStream()
+{
+	m_lastMarker = 0;
+	m_upper_case = false;
+}
+
+template<class ImplTraits, class SuperType>
+ANTLR_INLINE typename IntStream<ImplTraits, SuperType>::StringType	IntStream<ImplTraits, SuperType>::getSourceName()
+{
+	return m_streamName;
+}
+
+template<class ImplTraits, class SuperType>
+ANTLR_INLINE typename IntStream<ImplTraits, SuperType>::StringType& 	IntStream<ImplTraits, SuperType>::get_streamName()
+{
+	return m_streamName;
+}
+
+template<class ImplTraits, class SuperType>
+ANTLR_INLINE const typename IntStream<ImplTraits, SuperType>::StringType& 	IntStream<ImplTraits, SuperType>::get_streamName() const
+{
+	return m_streamName;
+}
+
+template<class ImplTraits, class SuperType>
+ANTLR_INLINE ANTLR_MARKER IntStream<ImplTraits, SuperType>::get_lastMarker() const
+{
+	return m_lastMarker;
+}
+
+template<class ImplTraits, class SuperType>
+ANTLR_INLINE void	IntStream<ImplTraits, SuperType>::setUcaseLA(bool flag)
+{
+	m_upper_case = flag;
+}
+
+template<class ImplTraits, class SuperType>
+ANTLR_INLINE SuperType* IntStream<ImplTraits, SuperType>::get_super()
+{
+	return static_cast<SuperType*>(this);
+}
+
+template<class ImplTraits, class SuperType>
+void	IntStream<ImplTraits, SuperType>::consume()
+{
+	SuperType* input = this->get_super();
+
+	const ANTLR_UINT8* nextChar = input->get_nextChar();
+	const ANTLR_UINT8* data = input->get_data();
+	ANTLR_UINT32 sizeBuf = input->get_sizeBuf();
+
+    if	( nextChar < ( data + sizeBuf ) )
+    {	
+		/* Indicate one more character in this line
+		 */
+		input->inc_charPositionInLine();
+	
+		if  ((ANTLR_UCHAR)(*(nextChar)) == input->get_newlineChar() )
+		{
+			/* Reset for start of a new line of input
+			 */
+			input->inc_line();
+			input->set_charPositionInLine(0);
+			input->set_currentLine(nextChar + 1);
+		}
+
+		/* Increment to next character position
+		 */
+		input->set_nextChar( nextChar + 1 );
+    }
+}
+
+template<class ImplTraits, class SuperType>
+ANTLR_UINT32	IntStream<ImplTraits, SuperType>::_LA( ANTLR_INT32 la )
+{
+	SuperType* input = this->get_super();
+	const ANTLR_UINT8* nextChar = input->get_nextChar();
+	const ANTLR_UINT8* data = input->get_data();
+	ANTLR_UINT32 sizeBuf = input->get_sizeBuf();
+
+    if	(( nextChar + la - 1) >= (data + sizeBuf))
+    {
+		return	ANTLR_CHARSTREAM_EOF;
+    }
+    else
+    {
+		if( !m_upper_case )
+			return	(ANTLR_UCHAR)(*(nextChar + la - 1));
+		else
+			return	(ANTLR_UCHAR)toupper(*(nextChar + la - 1));
+    }
+}
+
+template<class ImplTraits, class SuperType>
+ANTLR_MARKER IntStream<ImplTraits, SuperType>::mark()
+{
+	LexState<ImplTraits>*	    state;
+    SuperType* input = this->get_super();
+
+    /* New mark point 
+     */
+    input->inc_markDepth();
+
+    /* See if we are revisiting a mark as we can just reuse the vector
+     * entry if we are, otherwise, we need a new one
+     */
+    if	(input->get_markDepth() > input->get_markers().size() )
+    {	
+		input->get_markers().push_back( LexState<ImplTraits>() );
+		LexState<ImplTraits>& state_r = input->get_markers().back();
+		state = &state_r;
+    }
+    else
+    {
+		LexState<ImplTraits>& state_r = input->get_markers().at( input->get_markDepth() - 1 );
+		state	= &state_r;
+
+		/* Assume no errors for speed, it will just blow up if the table failed
+		 * for some reasons, hence lots of unit tests on the tables ;-)
+		 */
+    }
+
+    /* We have created or retrieved the state, so update it with the current
+     * elements of the lexer state.
+     */
+    state->set_charPositionInLine( input->get_charPositionInLine() );
+    state->set_currentLine( input->get_currentLine() );
+    state->set_line( input->get_line() );
+    state->set_nextChar( input->get_nextChar() );
+
+    m_lastMarker = input->get_markDepth();
+
+    /* And that's it
+     */
+    return  input->get_markDepth();
+}
+
+template<class ImplTraits, class SuperType>
+ANTLR_MARKER	IntStream<ImplTraits, SuperType>::index()
+{
+	SuperType* input = this->get_super();
+	return input->index_impl();
+}
+
+template<class ImplTraits, class SuperType>
+void	IntStream<ImplTraits, SuperType>::rewind(ANTLR_MARKER mark)
+{
+    SuperType* input = this->get_super();
+
+    /* Perform any clean up of the marks
+     */
+    this->release(mark);
+
+    /* Find the supplied mark state 
+     */
+	ANTLR_UINT32 idx = static_cast<ANTLR_UINT32>( mark-1 );
+    typename ImplTraits::LexStateType&   state = input->get_markers().at( idx );
+
+    /* Seek input pointer to the requested point (note we supply the void *pointer
+     * to whatever is implementing the int stream to seek).
+     */
+	this->seek( (ANTLR_MARKER)state.get_nextChar() );
+    
+    /* Reset to the reset of the information in the mark
+     */
+    input->set_charPositionInLine( state.get_charPositionInLine() );
+    input->set_currentLine( state.get_currentLine() );
+    input->set_line( state.get_line() );
+    input->set_nextChar( state.get_nextChar() );
+
+    /* And we are done
+     */
+}
+
+template<class ImplTraits, class SuperType>
+void	IntStream<ImplTraits, SuperType>::rewindLast()
+{
+	this->rewind(m_lastMarker);
+}
+
+template<class ImplTraits, class SuperType>
+void	IntStream<ImplTraits, SuperType>::release(ANTLR_MARKER mark)
+{
+	SuperType* input = this->get_super();
+
+	/* We don't do much here in fact as we never free any higher marks in
+     * the hashtable as we just resuse any memory allocated for them.
+     */
+    input->set_markDepth( (ANTLR_UINT32)(mark - 1) );
+
+}
+
+template<class ImplTraits, class SuperType>
+void IntStream<ImplTraits, SuperType>::setupIntStream(bool, bool)
+{
+}
+
+template<class ImplTraits, class SuperType>
+void	IntStream<ImplTraits, SuperType>::seek(ANTLR_MARKER seekPoint)
+{
+	ANTLR_INT32   count;
+	SuperType* input = this->get_super();
+
+	ANTLR_MARKER nextChar = (ANTLR_MARKER) input->get_nextChar();
+	/* If the requested seek point is less than the current
+	* input point, then we assume that we are resetting from a mark
+	* and do not need to scan, but can just set to there.
+	*/
+	if	(seekPoint <= nextChar)
+	{
+		input->set_nextChar((ANTLR_UINT8*) seekPoint);
+	}
+	else
+	{
+		count	= (ANTLR_UINT32)(seekPoint - nextChar);
+
+		while (count--)
+		{
+			this->consume();
+		}
+	}
+}
+
+template<class ImplTraits, class SuperType>
+IntStream<ImplTraits, SuperType>::~IntStream()
+{
+}
+
+template<class ImplTraits, class SuperType>
+ANTLR_UINT32	EBCDIC_IntStream<ImplTraits, SuperType>::_LA( ANTLR_INT32 la)
+{
+	// EBCDIC to ASCII conversion table
+	//
+	// This for EBCDIC EDF04 translated to ISO-8859.1 which is the usually accepted POSIX
+	// translation and the character tables are published all over the interweb.
+	// 
+	const ANTLR_UCHAR e2a[256] =
+	{
+		0x00, 0x01, 0x02, 0x03, 0x85, 0x09, 0x86, 0x7f,
+		0x87, 0x8d, 0x8e, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
+		0x10, 0x11, 0x12, 0x13, 0x8f, 0x0a, 0x08, 0x97,
+		0x18, 0x19, 0x9c, 0x9d, 0x1c, 0x1d, 0x1e, 0x1f,
+		0x80, 0x81, 0x82, 0x83, 0x84, 0x92, 0x17, 0x1b,
+		0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x05, 0x06, 0x07, 
+		0x90, 0x91, 0x16, 0x93, 0x94, 0x95, 0x96, 0x04,
+		0x98, 0x99, 0x9a, 0x9b, 0x14, 0x15, 0x9e, 0x1a,
+		0x20, 0xa0, 0xe2, 0xe4, 0xe0, 0xe1, 0xe3, 0xe5,
+		0xe7, 0xf1, 0x60, 0x2e, 0x3c, 0x28, 0x2b, 0x7c,
+		0x26, 0xe9, 0xea, 0xeb, 0xe8, 0xed, 0xee, 0xef,
+		0xec, 0xdf, 0x21, 0x24, 0x2a, 0x29, 0x3b, 0x9f,
+		0x2d, 0x2f, 0xc2, 0xc4, 0xc0, 0xc1, 0xc3, 0xc5,
+		0xc7, 0xd1, 0x5e, 0x2c, 0x25, 0x5f, 0x3e, 0x3f,
+		0xf8, 0xc9, 0xca, 0xcb, 0xc8, 0xcd, 0xce, 0xcf,
+		0xcc, 0xa8, 0x3a, 0x23, 0x40, 0x27, 0x3d, 0x22,
+		0xd8, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+		0x68, 0x69, 0xab, 0xbb, 0xf0, 0xfd, 0xfe, 0xb1,
+		0xb0, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70,
+		0x71, 0x72, 0xaa, 0xba, 0xe6, 0xb8, 0xc6, 0xa4,
+		0xb5, 0xaf, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
+		0x79, 0x7a, 0xa1, 0xbf, 0xd0, 0xdd, 0xde, 0xae,
+		0xa2, 0xa3, 0xa5, 0xb7, 0xa9, 0xa7, 0xb6, 0xbc,
+		0xbd, 0xbe, 0xac, 0x5b, 0x5c, 0x5d, 0xb4, 0xd7,
+		0xf9, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+		0x48, 0x49, 0xad, 0xf4, 0xf6, 0xf2, 0xf3, 0xf5,
+		0xa6, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
+		0x51, 0x52, 0xb9, 0xfb, 0xfc, 0xdb, 0xfa, 0xff,
+		0xd9, 0xf7, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
+		0x59, 0x5a, 0xb2, 0xd4, 0xd6, 0xd2, 0xd3, 0xd5,
+		0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
+		0x38, 0x39, 0xb3, 0x7b, 0xdc, 0x7d, 0xda, 0x7e
+	};
+
+	SuperType* input = this->get_super();
+
+    if	(( input->get_nextChar() + la - 1) >= ( input->get_data() + input->get_sizeBuf() ))
+    {
+        return	ANTLR_CHARSTREAM_EOF;
+    }
+    else
+    {
+        // Translate the required character via the constant conversion table
+        //
+        return	e2a[(*(input->get_nextChar() + la - 1))];
+    }
+}
+
+template<class ImplTraits, class SuperType>
+void EBCDIC_IntStream<ImplTraits, SuperType>::setupIntStream()
+{
+	SuperType* super = this->get_super();
+	super->set_charByteSize(1);
+}
+
+template<class ImplTraits, class SuperType>
+ANTLR_UINT32	UTF16_IntStream<ImplTraits, SuperType>::_LA( ANTLR_INT32 i)
+{
+	return this->_LA(i, ClassForwarder< typename ImplTraits::Endianness >() );
+}
+
+template<class ImplTraits, class SuperType>
+void UTF16_IntStream<ImplTraits, SuperType>::consume()
+{
+	this->consume( ClassForwarder< typename ImplTraits::Endianness >() );
+}
+
+template<class ImplTraits, class SuperType>
+ANTLR_MARKER	UTF16_IntStream<ImplTraits, SuperType>::index()
+{
+	SuperType* input = this->get_super();
+    return  (ANTLR_MARKER)(input->get_nextChar());
+}
+
+template<class ImplTraits, class SuperType>
+void UTF16_IntStream<ImplTraits, SuperType>::seek(ANTLR_MARKER seekPoint)
+{
+	SuperType* input = this->get_super();
+
+	// If the requested seek point is less than the current
+	// input point, then we assume that we are resetting from a mark
+	// and do not need to scan, but can just set to there as rewind will
+    // reset line numbers and so on.
+	//
+	if	(seekPoint <= (ANTLR_MARKER)(input->get_nextChar()))
+	{
+		input->set_nextChar( seekPoint );
+	}
+	else
+	{
+        // Call consume until we reach the asked for seek point or EOF
+        //
+        while( (this->_LA(1) != ANTLR_CHARSTREAM_EOF) && (seekPoint < (ANTLR_MARKER)input->get_nextChar() ) )
+	    {
+			this->consume();
+	    }
+	}
+}
+
+template<class ImplTraits, class SuperType>
+void IntStream<ImplTraits, SuperType>::findout_endian_spec(bool machineBigEndian, bool inputBigEndian)
+{
+	// We must install different UTF16 routines according to whether the input
+	// is the same endianess as the machine we are executing upon or not. If it is not
+	// then we must install methods that can convert the endianess on the fly as they go
+	//
+
+	if(machineBigEndian == true)
+	{
+		// Machine is Big Endian, if the input is also then install the 
+		// methods that do not access input by bytes and reverse them.
+		// Otherwise install endian aware methods.
+		//
+		if  (inputBigEndian == true) 
+		{
+			// Input is machine compatible
+			//
+			m_endian_spec = 1;
+		}
+		else
+		{
+			// Need to use methods that know that the input is little endian
+			//
+			m_endian_spec = 2;
+		}
+	}
+	else
+	{
+		// Machine is Little Endian, if the input is also then install the 
+		// methods that do not access input by bytes and reverse them.
+		// Otherwise install endian aware methods.
+		//
+		if  (inputBigEndian == false) 
+		{
+			// Input is machine compatible
+			//
+			m_endian_spec =  1;
+		}
+		else
+		{
+			// Need to use methods that know that the input is Big Endian
+			//
+			m_endian_spec	= 3;
+		}
+	}
+}
+
+template<class ImplTraits, class SuperType>
+void UTF16_IntStream<ImplTraits, SuperType>::setupIntStream(bool machineBigEndian, bool inputBigEndian)
+{
+	SuperType* super = this->get_super();
+	super->set_charByteSize(2);
+
+	this->findout_endian_spec( machineBigEndian, inputBigEndian );
+}
+
+template<class ImplTraits, class SuperType>
+ANTLR_UINT32 IntStream<ImplTraits, SuperType>::_LA( ANTLR_INT32 i, ClassForwarder<RESOLVE_ENDIAN_AT_RUNTIME> )
+{
+	assert( (m_endian_spec >= 1) && (m_endian_spec <= 3));
+	switch(m_endian_spec)
+	{
+	case 1:
+		return this->_LA(i, ClassForwarder<BYTE_AGNOSTIC>() );
+		break;
+	case 2:
+		return this->_LA(i, ClassForwarder<ANTLR_LITTLE_ENDIAN>() );
+		break;
+	case 3:
+		return this->_LA(i, ClassForwarder<ANTLR_BIG_ENDIAN>() );
+		break;
+	default:
+		break;
+	}
+	return 0;
+}
+
+template<class ImplTraits, class SuperType>
+void	IntStream<ImplTraits, SuperType>::consume( ClassForwarder<RESOLVE_ENDIAN_AT_RUNTIME> )
+{
+	assert( (m_endian_spec >= 1) && (m_endian_spec <= 3));
+	switch(m_endian_spec)
+	{
+	case 1:
+		this->consume( ClassForwarder<BYTE_AGNOSTIC>() );
+		break;
+	case 2:
+		this->consume( ClassForwarder<ANTLR_LITTLE_ENDIAN>() );
+		break;
+	case 3:
+		this->consume( ClassForwarder<ANTLR_BIG_ENDIAN>() );
+		break;
+	default:
+		break;
+	}
+}
+
+template<class ImplTraits, class SuperType>
+ANTLR_UINT32	UTF16_IntStream<ImplTraits, SuperType>::_LA( ANTLR_INT32 la, ClassForwarder<BYTE_AGNOSTIC> )
+{
+	SuperType* input;
+    UTF32   ch;
+    UTF32   ch2;
+    UTF16*	nextChar;
+
+    // Find the input interface and where we are currently pointing to
+    // in the input stream
+    //
+	input   = this->get_super;
+	nextChar    = input->get_nextChar();
+
+    // If a positive offset then advance forward, else retreat
+    //
+    if  (la >= 0)
+    {
+        while   (--la > 0 && (ANTLR_UINT8*)nextChar < ((ANTLR_UINT8*)input->get_data()) + input->get_sizeBuf() )
+        {
+            // Advance our copy of the input pointer
+            //
+            // Next char in natural machine byte order
+            //
+            ch  = *nextChar++;
+
+            // If we have a surrogate pair then we need to consume
+            // a following valid LO surrogate.
+            //
+            if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_HIGH_END) 
+            {
+                // If the 16 bits following the high surrogate are in the source buffer...
+                //
+                if	((ANTLR_UINT8*)(nextChar) < (((ANTLR_UINT8*)input->get_data()) + input->get_sizeBuf() ))
+                {
+                    // Next character is in natural machine byte order
+                    //
+                    ch2 = *nextChar;
+
+                    // If it's a valid low surrogate, consume it
+                    //
+                    if (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) 
+                    {
+                        // We consumed one 16 bit character
+                        //
+						nextChar++;
+                    }
+                    // Note that we ignore a valid hi surrogate that has no lo surrogate to go with
+                    // it.
+                    //
+                } 
+                // Note that we ignore a valid hi surrogate that has no lo surrogate to go with
+                // it because the buffer ended
+                //
+            }
+            // Note that we did not check for an invalid low surrogate here, or that fact that the
+            // lo surrogate was missing. We just picked out one 16 bit character unless the character
+            // was a valid hi surrogate, in whcih case we consumed two 16 bit characters.
+            //
+        }
+    }
+    else
+    {
+        // We need to go backwards from our input point
+        //
+        while   (la++ < 0 && (ANTLR_UINT8*)nextChar > (ANTLR_UINT8*)input->get_data() )
+        {
+            // Get the previous 16 bit character
+            //
+            ch = *--nextChar;
+
+            // If we found a low surrogate then go back one more character if
+            // the hi surrogate is there
+            //
+            if (ch >= UNI_SUR_LOW_START && ch <= UNI_SUR_LOW_END) 
+            {
+                ch2 = *(nextChar-1);
+                if (ch2 >= UNI_SUR_HIGH_START && ch2 <= UNI_SUR_HIGH_END) 
+                {
+                    // Yes, there is a high surrogate to match it so decrement one more and point to that
+                    //
+                    nextChar--;
+                }
+            }
+        }
+    }
+
+    // Our local copy of nextChar is now pointing to either the correct character or end of file
+    //
+    // Input buffer size is always in bytes
+    //
+	if	( (ANTLR_UINT8*)nextChar >= (((ANTLR_UINT8*)input->get_data()) + input->get_sizeBuf() ))
+	{
+		return	ANTLR_CHARSTREAM_EOF;
+	}
+	else
+	{
+        // Pick up the next 16 character (native machine byte order)
+        //
+        ch = *nextChar++;
+
+        // If we have a surrogate pair then we need to consume
+        // a following valid LO surrogate.
+        //
+        if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_HIGH_END) 
+        {
+            // If the 16 bits following the high surrogate are in the source buffer...
+            //
+            if	((ANTLR_UINT8*)(nextChar) < (((ANTLR_UINT8*)input->get_data()) + input->get_sizeBuf()))
+            {
+                // Next character is in natural machine byte order
+                //
+                ch2 = *nextChar;
+
+                // If it's a valid low surrogate, consume it
+                //
+                if (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) 
+                {
+                    // Construct the UTF32 code point
+                    //
+                    ch = ((ch - UNI_SUR_HIGH_START) << halfShift)
+								+ (ch2 - UNI_SUR_LOW_START) + halfBase;
+                }
+                // Note that we ignore a valid hi surrogate that has no lo surrogate to go with
+                // it.
+                //
+            } 
+            // Note that we ignore a valid hi surrogate that has no lo surrogate to go with
+            // it because the buffer ended
+            //
+        }
+    }
+    return ch;
+}
+
+template<class ImplTraits, class SuperType>
+ANTLR_UINT32	UTF16_IntStream<ImplTraits, SuperType>::_LA( ANTLR_INT32 la, ClassForwarder<ANTLR_LITTLE_ENDIAN> )
+{
+	SuperType* input;
+    UTF32           ch;
+    UTF32           ch2;
+    ANTLR_UCHAR*   nextChar;
+
+    // Find the input interface and where we are currently pointing to
+    // in the input stream
+    //
+	input       = this->get_super();
+    nextChar    = input->get_nextChar();
+
+    // If a positive offset then advance forward, else retreat
+    //
+    if  (la >= 0)
+    {
+        while   (--la > 0 && (ANTLR_UINT8*)nextChar < ((ANTLR_UINT8*)input->get_data()) + input->get_sizeBuf() )
+        {
+            // Advance our copy of the input pointer
+            //
+            // Next char in Little Endian byte order
+            //
+            ch  = (*nextChar) + (*(nextChar+1) << 8);
+            nextChar += 2;
+
+            // If we have a surrogate pair then we need to consume
+            // a following valid LO surrogate.
+            //
+            if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_HIGH_END) 
+            {
+                // If the 16 bits following the high surrogate are in the source buffer...
+                //
+                if	((ANTLR_UINT8*)(nextChar) < (((ANTLR_UINT8*)input->get_data()) + input->get_sizeBuf() ))
+                {
+                    // Next character is in little endian byte order
+                    //
+                    ch2 = (*nextChar) + (*(nextChar+1) << 8);
+
+                    // If it's a valid low surrogate, consume it
+                    //
+                    if (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) 
+                    {
+                        // We consumed one 16 bit character
+                        //
+						nextChar += 2;
+                    }
+                    // Note that we ignore a valid hi surrogate that has no lo surrogate to go with
+                    // it.
+                    //
+                } 
+                // Note that we ignore a valid hi surrogate that has no lo surrogate to go with
+                // it because the buffer ended
+                //
+            }
+            // Note that we did not check for an invalid low surrogate here, or that fact that the
+            // lo surrogate was missing. We just picked out one 16 bit character unless the character
+            // was a valid hi surrogate, in whcih case we consumed two 16 bit characters.
+            //
+        }
+    }
+    else
+    {
+        // We need to go backwards from our input point
+        //
+        while   (la++ < 0 && (ANTLR_UINT8*)nextChar > (ANTLR_UINT8*)input->get_data() )
+        {
+            // Get the previous 16 bit character
+            //
+            ch = (*nextChar - 2) + ((*nextChar -1) << 8);
+            nextChar -= 2;
+
+            // If we found a low surrogate then go back one more character if
+            // the hi surrogate is there
+            //
+            if (ch >= UNI_SUR_LOW_START && ch <= UNI_SUR_LOW_END) 
+            {
+                ch2 = (*nextChar - 2) + ((*nextChar -1) << 8);
+                if (ch2 >= UNI_SUR_HIGH_START && ch2 <= UNI_SUR_HIGH_END) 
+                {
+                    // Yes, there is a high surrogate to match it so decrement one more and point to that
+                    //
+                    nextChar -=2;
+                }
+            }
+        }
+    }
+
+    // Our local copy of nextChar is now pointing to either the correct character or end of file
+    //
+    // Input buffer size is always in bytes
+    //
+	if	( (ANTLR_UINT8*)nextChar >= (((ANTLR_UINT8*)input->get_data()) + input->get_sizeBuf()))
+	{
+		return	ANTLR_CHARSTREAM_EOF;
+	}
+	else
+	{
+        // Pick up the next 16 character (little endian byte order)
+        //
+        ch = (*nextChar) + (*(nextChar+1) << 8);
+        nextChar += 2;
+
+        // If we have a surrogate pair then we need to consume
+        // a following valid LO surrogate.
+        //
+        if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_HIGH_END) 
+        {
+            // If the 16 bits following the high surrogate are in the source buffer...
+            //
+            if	((ANTLR_UINT8*)(nextChar) < (((ANTLR_UINT8*)input->get_data()) + input->get_sizeBuf()))
+            {
+                // Next character is in little endian byte order
+                //
+                ch2 = (*nextChar) + (*(nextChar+1) << 8);
+
+                // If it's a valid low surrogate, consume it
+                //
+                if (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) 
+                {
+                    // Construct the UTF32 code point
+                    //
+                    ch = ((ch - UNI_SUR_HIGH_START) << halfShift)
+								+ (ch2 - UNI_SUR_LOW_START) + halfBase;
+                }
+                // Note that we ignore a valid hi surrogate that has no lo surrogate to go with
+                // it.
+                //
+            } 
+            // Note that we ignore a valid hi surrogate that has no lo surrogate to go with
+            // it because the buffer ended
+            //
+        }
+    }
+    return ch;
+}
+
+template<class ImplTraits, class SuperType>
+ANTLR_UINT32	UTF16_IntStream<ImplTraits, SuperType>::_LA( ANTLR_INT32 la, ClassForwarder<ANTLR_BIG_ENDIAN> )
+{
+	SuperType* input;
+    UTF32           ch;
+    UTF32           ch2;
+    ANTLR_UCHAR*   nextChar;
+
+    // Find the input interface and where we are currently pointing to
+    // in the input stream
+    //
+	input       = this->get_super();
+    nextChar    = input->get_nextChar();
+
+    // If a positive offset then advance forward, else retreat
+    //
+    if  (la >= 0)
+    {
+        while   (--la > 0 && (ANTLR_UINT8*)nextChar < ((ANTLR_UINT8*)input->get_data()) + input->get_sizeBuf() )
+        {
+            // Advance our copy of the input pointer
+            //
+            // Next char in Big Endian byte order
+            //
+            ch  = ((*nextChar) << 8) + *(nextChar+1);
+            nextChar += 2;
+
+            // If we have a surrogate pair then we need to consume
+            // a following valid LO surrogate.
+            //
+            if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_HIGH_END) 
+            {
+                // If the 16 bits following the high surrogate are in the source buffer...
+                //
+                if	((ANTLR_UINT8*)(nextChar) < (((ANTLR_UINT8*)input->get_data()) + input->get_sizeBuf()))
+                {
+                    // Next character is in big endian byte order
+                    //
+                    ch2 = ((*nextChar) << 8) + *(nextChar+1);
+
+                    // If it's a valid low surrogate, consume it
+                    //
+                    if (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) 
+                    {
+                        // We consumed one 16 bit character
+                        //
+						nextChar += 2;
+                    }
+                    // Note that we ignore a valid hi surrogate that has no lo surrogate to go with
+                    // it.
+                    //
+                } 
+                // Note that we ignore a valid hi surrogate that has no lo surrogate to go with
+                // it because the buffer ended
+                //
+            }
+            // Note that we did not check for an invalid low surrogate here, or that fact that the
+            // lo surrogate was missing. We just picked out one 16 bit character unless the character
+            // was a valid hi surrogate, in whcih case we consumed two 16 bit characters.
+            //
+        }
+    }
+    else
+    {
+        // We need to go backwards from our input point
+        //
+        while   (la++ < 0 && (ANTLR_UINT8*)nextChar > (ANTLR_UINT8*)input->get_data() )
+        {
+            // Get the previous 16 bit character
+            //
+            ch = ((*nextChar - 2) << 8) + (*nextChar -1);
+            nextChar -= 2;
+
+            // If we found a low surrogate then go back one more character if
+            // the hi surrogate is there
+            //
+            if (ch >= UNI_SUR_LOW_START && ch <= UNI_SUR_LOW_END) 
+            {
+                ch2 = ((*nextChar - 2) << 8) + (*nextChar -1);
+                if (ch2 >= UNI_SUR_HIGH_START && ch2 <= UNI_SUR_HIGH_END) 
+                {
+                    // Yes, there is a high surrogate to match it so decrement one more and point to that
+                    //
+                    nextChar -=2;
+                }
+            }
+        }
+    }
+
+    // Our local copy of nextChar is now pointing to either the correct character or end of file
+    //
+    // Input buffer size is always in bytes
+    //
+	if	( (ANTLR_UINT8*)nextChar >= (((ANTLR_UINT8*)input->get_data()) + input->get_sizeBuf()))
+	{
+		return	ANTLR_CHARSTREAM_EOF;
+	}
+	else
+	{
+        // Pick up the next 16 character (big endian byte order)
+        //
+        ch = ((*nextChar) << 8) + *(nextChar+1);
+        nextChar += 2;
+
+        // If we have a surrogate pair then we need to consume
+        // a following valid LO surrogate.
+        //
+        if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_HIGH_END) 
+        {
+            // If the 16 bits following the high surrogate are in the source buffer...
+            //
+            if	((ANTLR_UINT8*)(nextChar) < (((ANTLR_UINT8*)input->get_data()) + input->get_sizeBuf()))
+            {
+                // Next character is in big endian byte order
+                //
+                ch2 = ((*nextChar) << 8) + *(nextChar+1);
+
+                // If it's a valid low surrogate, consume it
+                //
+                if (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) 
+                {
+                    // Construct the UTF32 code point
+                    //
+                    ch = ((ch - UNI_SUR_HIGH_START) << halfShift)
+								+ (ch2 - UNI_SUR_LOW_START) + halfBase;
+                }
+                // Note that we ignore a valid hi surrogate that has no lo surrogate to go with
+                // it.
+                //
+            } 
+            // Note that we ignore a valid hi surrogate that has no lo surrogate to go with
+            // it because the buffer ended
+            //
+        }
+    }
+    return ch;
+}
+
+template<class ImplTraits, class SuperType>
+void	UTF16_IntStream<ImplTraits, SuperType>::consume( ClassForwarder<BYTE_AGNOSTIC> )
+{
+	SuperType* input;
+    UTF32   ch;
+    UTF32   ch2;
+
+	input   = this->get_super();
+
+    // Buffer size is always in bytes
+    //
+	if(input->get_nextChar() < (input->get_data() + input->get_sizeBuf()/2) )
+	{	
+		// Indicate one more character in this line
+		//
+		input->inc_charPositionInLine();
+
+		if  ((ANTLR_UCHAR)(*(input->get_nextChar())) == input->get_newlineChar())
+		{
+			// Reset for start of a new line of input
+			//
+			input->inc_line();
+			input->set_charPositionInLine(0);
+			input->set_currentLine( input->get_nextChar() + 1 );
+		}
+
+		// Increment to next character position, accounting for any surrogates
+		//
+        // Next char in natural machine byte order
+        //
+        ch  = *(input->get_nextChar());
+
+        // We consumed one 16 bit character
+        //
+		input->set_nextChar( input->get_nextChar() + 1 );
+
+        // If we have a surrogate pair then we need to consume
+        // a following valid LO surrogate.
+        //
+        if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_HIGH_END) {
+
+            // If the 16 bits following the high surrogate are in the source buffer...
+            //
+            if(input->get_nextChar() < (input->get_data() + input->get_sizeBuf()/2) )
+            {
+                // Next character is in natural machine byte order
+                //
+                ch2 = *(input->get_nextChar());
+
+                // If it's a valid low surrogate, consume it
+                //
+                if (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) 
+                {
+                    // We consumed one 16 bit character
+                    //
+					input->set_nextChar( input->get_nextChar() + 1 );
+                }
+                // Note that we ignore a valid hi surrogate that has no lo surrogate to go with
+                // it.
+                //
+            } 
+            // Note that we ignore a valid hi surrogate that has no lo surrogate to go with
+            // it because the buffer ended
+            //
+        } 
+        // Note that we did not check for an invalid low surrogate here, or that fact that the
+        // lo surrogate was missing. We just picked out one 16 bit character unless the character
+        // was a valid hi surrogate, in whcih case we consumed two 16 bit characters.
+        //
+	}
+
+}
+
+template<class ImplTraits, class SuperType>
+void	UTF16_IntStream<ImplTraits, SuperType>::consume( ClassForwarder<ANTLR_LITTLE_ENDIAN> )
+{
+	SuperType* input;
+    UTF32   ch;
+    UTF32   ch2;
+
+	input   = this->get_super();
+
+    // Buffer size is always in bytes
+    //
+	if(input->get_nextChar() < (input->get_data() + input->get_sizeBuf()/2) )
+	{	
+		// Indicate one more character in this line
+		//
+		input->inc_charPositionInLine();
+
+		if  ((ANTLR_UCHAR)(*(input->get_nextChar())) == input->get_newlineChar())
+		{
+			// Reset for start of a new line of input
+			//
+			input->inc_line();
+			input->set_charPositionInLine(0);
+			input->set_currentLine(input->get_nextChar() + 1);
+		}
+
+		// Increment to next character position, accounting for any surrogates
+		//
+        // Next char in litle endian form
+        //
+        ch  = *((ANTLR_UINT8*)input->get_nextChar()) + (*((ANTLR_UINT8*)input->get_nextChar() + 1) <<8);
+
+        // We consumed one 16 bit character
+        //
+		input->set_nextChar( input->get_nextChar() + 1);
+
+        // If we have a surrogate pair then we need to consume
+        // a following valid LO surrogate.
+        //
+        if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_HIGH_END) 
+		{
+            // If the 16 bits following the high surrogate are in the source buffer...
+            //
+            if(input->get_nextChar() < (input->get_data() + input->get_sizeBuf()/2) )
+            {
+                ch2 = *((ANTLR_UINT8*)input->get_nextChar()) + (*((ANTLR_UINT8*)input->get_nextChar() + 1) <<8);
+
+                // If it's a valid low surrogate, consume it
+                //
+                if (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) 
+                {
+                    // We consumed one 16 bit character
+                    //
+					input->set_nextChar( input->get_nextChar() + 1);
+                }
+                // Note that we ignore a valid hi surrogate that has no lo surrogate to go with
+                // it.
+                //
+            } 
+            // Note that we ignore a valid hi surrogate that has no lo surrogate to go with
+            // it because the buffer ended
+            //
+        } 
+        // Note that we did not check for an invalid low surrogate here, or that fact that the
+        // lo surrogate was missing. We just picked out one 16 bit character unless the character
+        // was a valid hi surrogate, in whcih case we consumed two 16 bit characters.
+        //
+	}
+}
+
+template<class ImplTraits, class SuperType>
+void	UTF16_IntStream<ImplTraits, SuperType>::consume( ClassForwarder<ANTLR_BIG_ENDIAN> )
+{
+	SuperType* input;
+    UTF32   ch;
+    UTF32   ch2;
+
+	input   = this->get_super();
+
+    // Buffer size is always in bytes
+    //
+	if(input->get_nextChar() < (input->get_data() + input->get_sizeBuf()/2) )
+	{	
+		// Indicate one more character in this line
+		//
+		input->inc_charPositionInLine();
+
+		if  ((ANTLR_UCHAR)(*(input->get_nextChar())) == input->get_newlineChar())
+		{
+			// Reset for start of a new line of input
+			//
+			input->inc_line();
+			input->set_charPositionInLine(0);
+			input->set_currentLine(input->get_nextChar() + 1);
+		}
+
+		// Increment to next character position, accounting for any surrogates
+		//
+        // Next char in big endian form
+        //
+        ch  = *((ANTLR_UINT8*)input->get_nextChar() + 1) + (*((ANTLR_UINT8*)input->get_nextChar() ) <<8);
+
+        // We consumed one 16 bit character
+        //
+		input->set_nextChar( input->get_nextChar() + 1);
+
+        // If we have a surrogate pair then we need to consume
+        // a following valid LO surrogate.
+        //
+        if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_HIGH_END) 
+		{
+            // If the 16 bits following the high surrogate are in the source buffer...
+            //
+            if(input->get_nextChar() < (input->get_data() + input->get_sizeBuf()/2) )
+            {
+                // Big endian
+                //
+                ch2 = *((ANTLR_UINT8*)input->get_nextChar() + 1) + (*((ANTLR_UINT8*)input->get_nextChar() ) <<8);
+
+                // If it's a valid low surrogate, consume it
+                //
+                if (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) 
+                {
+                    // We consumed one 16 bit character
+                    //
+					input->set_nextChar( input->get_nextChar() + 1);
+                }
+                // Note that we ignore a valid hi surrogate that has no lo surrogate to go with
+                // it.
+                //
+            } 
+            // Note that we ignore a valid hi surrogate that has no lo surrogate to go with
+            // it because the buffer ended
+            //
+        } 
+        // Note that we did not check for an invalid low surrogate here, or that fact that the
+        // lo surrogate was missing. We just picked out one 16 bit character unless the character
+        // was a valid hi surrogate, in whcih case we consumed two 16 bit characters.
+        //
+	}
+}
+
+template<class ImplTraits, class SuperType>
+ANTLR_UINT32	UTF32_IntStream<ImplTraits, SuperType>::_LA( ANTLR_INT32 i)
+{
+	return this->_LA( i, ClassForwarder<typename ImplTraits::Endianness>() );
+}
+
+template<class ImplTraits, class SuperType>
+ANTLR_MARKER	UTF32_IntStream<ImplTraits, SuperType>::index()
+{
+	SuperType* input = this->get_super();
+    return  (ANTLR_MARKER)(input->get_nextChar());
+}
+
+template<class ImplTraits, class SuperType>
+void UTF32_IntStream<ImplTraits, SuperType>::seek(ANTLR_MARKER seekPoint)
+{
+	SuperType* input;
+
+	input   = this->get_super();
+
+	// If the requested seek point is less than the current
+	// input point, then we assume that we are resetting from a mark
+	// and do not need to scan, but can just set to there as rewind will
+        // reset line numbers and so on.
+	//
+	if	(seekPoint <= (ANTLR_MARKER)(input->get_nextChar()))
+	{
+		input->set_nextChar( static_cast<typename ImplTraits::DataType*>(seekPoint) );
+	}
+	else
+	{
+        // Call consume until we reach the asked for seek point or EOF
+        //
+        while( (this->_LA(1) != ANTLR_CHARSTREAM_EOF) && (seekPoint < (ANTLR_MARKER)input->get_nextChar()) )
+	    {
+			this->consume();
+	    }
+	}
+
+}
+
+template<class ImplTraits, class SuperType>
+void UTF32_IntStream<ImplTraits, SuperType>::setupIntStream(bool machineBigEndian, bool inputBigEndian)
+{
+	SuperType* super = this->get_super();
+	super->set_charByteSize(4);
+
+	this->findout_endian_spec(machineBigEndian, inputBigEndian);
+}
+
+template<class ImplTraits, class SuperType>
+ANTLR_UINT32	UTF32_IntStream<ImplTraits, SuperType>::_LA( ANTLR_INT32 la, ClassForwarder<BYTE_AGNOSTIC> )
+{
+    SuperType* input = this->get_super();
+
+    if	(( input->get_nextChar() + la - 1) >= (input->get_data() + input->get_sizeBuf()/4 ))
+    {
+		return	ANTLR_CHARSTREAM_EOF;
+    }
+    else
+    {
+		return	(ANTLR_UCHAR)(*(input->get_nextChar() + la - 1));
+    }
+}
+
+template<class ImplTraits, class SuperType>
+ANTLR_UINT32	UTF32_IntStream<ImplTraits, SuperType>::_LA( ANTLR_INT32 la, ClassForwarder<ANTLR_LITTLE_ENDIAN> )
+{
+	SuperType* input = this->get_super();
+
+    if	(( input->get_nextChar() + la - 1) >= (input->get_data() + input->get_sizeBuf()/4 ))
+    {
+		return	ANTLR_CHARSTREAM_EOF;
+    }
+    else
+    {
+        ANTLR_UCHAR   c;
+
+        c = (ANTLR_UCHAR)(*(input->get_nextChar() + la - 1));
+
+        // Swap Endianess to Big Endian
+        //
+        return (c>>24) | ((c<<8) & 0x00FF0000) | ((c>>8) & 0x0000FF00) | (c<<24);
+    }
+}
+
+template<class ImplTraits, class SuperType>
+ANTLR_UINT32	UTF32_IntStream<ImplTraits, SuperType>::_LA( ANTLR_INT32 la, ClassForwarder<ANTLR_BIG_ENDIAN> )
+{
+	SuperType* input = this->get_super();
+
+    if	(( input->get_nextChar() + la - 1) >= (input->get_data() + input->get_sizeBuf()/4 ))
+    {
+		return	ANTLR_CHARSTREAM_EOF;
+    }
+    else
+    {
+        ANTLR_UCHAR   c;
+
+        c = (ANTLR_UCHAR)(*(input->get_nextChar() + la - 1));
+
+        // Swap Endianess to Little Endian
+        //
+        return (c>>24) | ((c<<8) & 0x00FF0000) | ((c>>8) & 0x0000FF00) | (c<<24);
+    }
+}
+
+template<class ImplTraits, class SuperType>
+void	UTF32_IntStream<ImplTraits, SuperType>::consume()
+{
+	SuperType* input = this->get_super();
+
+    // SizeBuf is always in bytes
+    //
+	if	( input->get_nextChar()  < (input->get_data() + input->get_sizeBuf()/4 ))
+    {	
+		/* Indicate one more character in this line
+		 */
+		input->inc_charPositionInLine();
+	
+		if  ((ANTLR_UCHAR)(*(input->get_nextChar())) == input->get_newlineChar())
+		{
+			/* Reset for start of a new line of input
+			 */
+			input->inc_line();
+			input->set_charPositionInLine(0);
+			input->set_currentLine(	input->get_nextChar() + 1 );
+		}
+
+		/* Increment to next character position
+		 */
+		input->set_nextChar( input->get_nextChar() + 1 );
+    }
+}
+
+template<class ImplTraits, class SuperType>
+void UTF8_IntStream<ImplTraits, SuperType>::setupIntStream(bool, bool)
+{
+	SuperType* super = this->get_super();
+	super->set_charByteSize(0);
+}
+
+// ------------------------------------------------------
+// Following is from Unicode.org (see antlr3convertutf.c)
+//
+
+/// Index into the table below with the first byte of a UTF-8 sequence to
+/// get the number of trailing bytes that are supposed to follow it.
+/// Note that *legal* UTF-8 values can't have 4 or 5-bytes. The table is
+/// left as-is for anyone who may want to do such conversion, which was
+/// allowed in earlier algorithms.
+///
+template<class ImplTraits, class SuperType>
+const ANTLR_UINT32* UTF8_IntStream<ImplTraits, SuperType>::TrailingBytesForUTF8()
+{
+	static const ANTLR_UINT32 trailingBytesForUTF8[256] = {
+		0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+		0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+		0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+		0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+		0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+		0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+		1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+		2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5
+	};
+
+	return trailingBytesForUTF8;
+}
+
+/// Magic values subtracted from a buffer value during UTF8 conversion.
+/// This table contains as many values as there might be trailing bytes
+/// in a UTF-8 sequence.
+///
+template<class ImplTraits, class SuperType>
+const UTF32* UTF8_IntStream<ImplTraits, SuperType>::OffsetsFromUTF8()
+{
+	static const UTF32 offsetsFromUTF8[6] = 
+		{   0x00000000UL, 0x00003080UL, 0x000E2080UL, 
+			0x03C82080UL, 0xFA082080UL, 0x82082080UL 
+		};
+	return 	offsetsFromUTF8;
+}
+
+// End of Unicode.org tables
+// -------------------------
+
+
+/** \brief Consume the next character in a UTF8 input stream
+ *
+ * \param input Input stream context pointer
+ */
+template<class ImplTraits, class SuperType>
+void UTF8_IntStream<ImplTraits, SuperType>::consume()
+{
+    SuperType* input = this->get_super();
+	const ANTLR_UINT32* trailingBytesForUTF8 = UTF8_IntStream::TrailingBytesForUTF8();
+	const UTF32* offsetsFromUTF8 = UTF8_IntStream::OffsetsFromUTF8();
+
+    ANTLR_UINT32           extraBytesToRead;
+    ANTLR_UCHAR            ch;
+    ANTLR_UINT8*           nextChar;
+
+    nextChar = input->get_nextChar();
+
+    if	(nextChar < (input->get_data() + input->get_sizeBuf()))
+    {	
+		// Indicate one more character in this line
+		//
+		input->inc_charPositionInLine();
+	
+        // Are there more bytes needed to make up the whole thing?
+        //
+        extraBytesToRead = trailingBytesForUTF8[*nextChar];
+
+        if	((nextChar + extraBytesToRead) >= (input->get_data() + input->get_sizeBuf()))
+        {
+            input->set_nextChar( input->get_data() + input->get_sizeBuf() );
+            return;
+        }
+
+        // Cases deliberately fall through (see note A in antlrconvertutf.c)
+        // Legal UTF8 is only 4 bytes but 6 bytes could be used in old UTF8 so
+        // we allow it.
+        //
+        ch  = 0;
+       	switch (extraBytesToRead) 
+		{
+			case 5: ch += *nextChar++; ch <<= 6;
+			case 4: ch += *nextChar++; ch <<= 6;
+			case 3: ch += *nextChar++; ch <<= 6;
+			case 2: ch += *nextChar++; ch <<= 6;
+			case 1: ch += *nextChar++; ch <<= 6;
+			case 0: ch += *nextChar++;
+		}
+
+        // Magically correct the input value
+        //
+		ch -= offsetsFromUTF8[extraBytesToRead];
+		if  (ch == input->get_newlineChar())
+		{
+			/* Reset for start of a new line of input
+			 */
+			input->inc_line();
+			input->set_charPositionInLine(0);
+			input->set_currentLine(nextChar);
+		}
+
+        // Update input pointer
+        //
+        input->set_nextChar(nextChar);
+    }
+}
+
+/** \brief Return the input element assuming a UTF8 input
+ *
+ * \param[in] input Input stream context pointer
+ * \param[in] la 1 based offset of next input stream element
+ *
+ * \return Next input character in internal ANTLR3 encoding (UTF32)
+ */
+template<class ImplTraits, class SuperType>
+ANTLR_UCHAR UTF8_IntStream<ImplTraits, SuperType>::_LA(ANTLR_INT32 la)
+{
+    SuperType* input = this->get_super();
+	const ANTLR_UINT32* trailingBytesForUTF8 = UTF8_IntStream::TrailingBytesForUTF8();
+	const UTF32* offsetsFromUTF8 = UTF8_IntStream::OffsetsFromUTF8();
+    ANTLR_UINT32           extraBytesToRead;
+    ANTLR_UCHAR            ch;
+    ANTLR_UINT8*           nextChar;
+
+    nextChar = input->get_nextChar();
+
+    // Do we need to traverse forwards or backwards?
+    // - LA(0) is treated as LA(1) and we assume that the nextChar is
+    //   already positioned.
+    // - LA(n+) ; n>1 means we must traverse forward n-1 characters catering for UTF8 encoding
+    // - LA(-n) means we must traverse backwards n chracters
+    //
+    if (la > 1) {
+
+        // Make sure that we have at least one character left before trying to
+        // loop through the buffer.
+        //
+        if	(nextChar < (input->get_data() + input->get_sizeBuf()))
+        {	
+            // Now traverse n-1 characters forward
+            //
+            while (--la > 0)
+            {
+                // Does the next character require trailing bytes?
+                // If so advance the pointer by that many bytes as well as advancing
+                // one position for what will be at least a single byte character.
+                //
+                nextChar += trailingBytesForUTF8[*nextChar] + 1;
+
+                // Does that calculation take us past the byte length of the buffer?
+                //
+                if	(nextChar >= (input->get_data() + input->get_sizeBuf()))
+                {
+                    return ANTLR_CHARSTREAM_EOF;
+                }
+            }
+        }
+        else
+        {
+            return ANTLR_CHARSTREAM_EOF;
+        }
+    }
+    else
+    {
+        // LA is negative so we decrease the pointer by n character positions
+        //
+        while   (nextChar > input->get_data() && la++ < 0)
+        {
+            // Traversing backwards in UTF8 means decermenting by one
+            // then continuing to decrement while ever a character pattern
+            // is flagged as being a trailing byte of an encoded code point.
+            // Trailing UTF8 bytes always start with 10 in binary. We assumne that
+            // the UTF8 is well formed and do not check boundary conditions
+            //
+            nextChar--;
+            while ((*nextChar & 0xC0) == 0x80)
+            {
+                nextChar--;
+            }
+        }
+    }
+
+    // nextChar is now pointing at the UTF8 encoded character that we need to
+    // decode and return.
+    //
+    // Are there more bytes needed to make up the whole thing?
+    //
+    extraBytesToRead = trailingBytesForUTF8[*nextChar];
+    if	(nextChar + extraBytesToRead >= (input->get_data() + input->get_sizeBuf()))
+    {
+        return ANTLR_CHARSTREAM_EOF;
+    }
+
+    // Cases deliberately fall through (see note A in antlrconvertutf.c)
+    // 
+    ch  = 0;
+    switch (extraBytesToRead) 
+	{
+        case 5: ch += *nextChar++; ch <<= 6;
+        case 4: ch += *nextChar++; ch <<= 6;
+        case 3: ch += *nextChar++; ch <<= 6;
+        case 2: ch += *nextChar++; ch <<= 6;
+        case 1: ch += *nextChar++; ch <<= 6;
+        case 0: ch += *nextChar++;
+    }
+
+    // Magically correct the input value
+    //
+    ch -= offsetsFromUTF8[extraBytesToRead];
+
+    return ch;
+}
+
+template<class ImplTraits>
+TokenIntStream<ImplTraits>::TokenIntStream()
+{
+	m_cachedSize = 0;
+}
+
+template<class ImplTraits>
+ANTLR_UINT32 TokenIntStream<ImplTraits>::get_cachedSize() const
+{
+	return m_cachedSize;
+}
+
+template<class ImplTraits>
+void TokenIntStream<ImplTraits>::set_cachedSize( ANTLR_UINT32 cachedSize )
+{
+	m_cachedSize = cachedSize;
+}
+
+/** Move the input pointer to the next incoming token.  The stream
+ *  must become active with LT(1) available.  consume() simply
+ *  moves the input pointer so that LT(1) points at the next
+ *  input symbol. Consume at least one token.
+ *
+ *  Walk past any token not on the channel the parser is listening to.
+ */
+template<class ImplTraits>
+void TokenIntStream<ImplTraits>::consume()
+{
+	TokenStreamType* cts = static_cast<TokenStreamType*>(this);
+
+    if((ANTLR_UINT32)cts->get_p() < m_cachedSize )
+	{
+		cts->inc_p();
+		cts->set_p( cts->skipOffTokenChannels(cts->get_p()) );
+	}
+}
+template<class ImplTraits>
+void  TokenIntStream<ImplTraits>::consumeInitialHiddenTokens()
+{
+	ANTLR_MARKER	first;
+	ANTLR_INT32	i;
+	TokenStreamType*	ts;
+
+	ts	    = this->get_super();
+	first	= this->index();
+
+	for	(i=0; i<first; i++)
+	{
+		ts->get_debugger()->consumeHiddenToken(ts->get(i));
+	}
+
+	ts->set_initialStreamState(false);
+}
+
+
+template<class ImplTraits>
+ANTLR_UINT32	TokenIntStream<ImplTraits>::_LA( ANTLR_INT32 i )
+{
+	const CommonTokenType*    tok;
+	TokenStreamType*    ts	    = static_cast<TokenStreamType*>(this);
+
+	tok	    =  ts->_LT(i);
+
+	if	(tok != NULL)
+	{
+		return	tok->get_type();
+	}
+	else
+	{
+		return	CommonTokenType::TOKEN_INVALID;
+	}
+
+}
+
+template<class ImplTraits>
+ANTLR_MARKER	TokenIntStream<ImplTraits>::mark()
+{
+    BaseType::m_lastMarker = this->index();
+    return  BaseType::m_lastMarker;
+}
+
+template<class ImplTraits>
+ANTLR_UINT32 TokenIntStream<ImplTraits>::size()
+{
+    if (this->get_cachedSize() > 0)
+    {
+		return  this->get_cachedSize();
+    }
+    TokenStreamType* cts   = this->get_super();
+
+    this->set_cachedSize( static_cast<ANTLR_UINT32>(cts->get_tokens().size()) );
+    return  this->get_cachedSize();
+}
+
+template<class ImplTraits>
+void	TokenIntStream<ImplTraits>::release()
+{
+    return;
+}
+
+template<class ImplTraits>
+ANTLR_MARKER   TokenIntStream<ImplTraits>::tindex()
+{
+	return this->get_super()->get_p();
+}
+
+template<class ImplTraits>
+void	TokenIntStream<ImplTraits>::rewindLast()
+{
+    this->rewind( this->get_lastMarker() );
+}
+
+template<class ImplTraits>
+void	TokenIntStream<ImplTraits>::rewind(ANTLR_MARKER marker)
+{
+	return this->seek(marker);
+}
+
+template<class ImplTraits>
+void	TokenIntStream<ImplTraits>::seek(ANTLR_MARKER index)
+{
+    TokenStreamType* cts = static_cast<TokenStreamType*>(this);
+
+    cts->set_p( static_cast<ANTLR_INT32>(index) );
+}
+
+
+/// Return a string that represents the name assoicated with the input source
+///
+/// /param[in] is The ANTLR3_INT_STREAM interface that is representing this token stream.
+///
+/// /returns 
+/// /implements ANTLR3_INT_STREAM_struct::getSourceName()
+///
+template<class ImplTraits>
+typename TokenIntStream<ImplTraits>::StringType
+TokenIntStream<ImplTraits>::getSourceName()
+{
+	// Slightly convoluted as we must trace back to the lexer's input source
+	// via the token source. The streamName that is here is not initialized
+	// because this is a token stream, not a file or string stream, which are the
+	// only things that have a context for a source name.
+	//
+	return this->get_super()->get_tokenSource()->get_fileName();
+}
+
+template<class ImplTraits>
+void  TreeNodeIntStream<ImplTraits>::consume()
+{
+	CommonTreeNodeStreamType* ctns = this->get_super();
+	if( ctns->get_p() == -1 )
+		ctns->fillBufferRoot();
+	ctns->inc_p();
+}
+template<class ImplTraits>
+ANTLR_MARKER		TreeNodeIntStream<ImplTraits>::tindex()
+{
+	CommonTreeNodeStreamType* ctns = this->get_super();
+	return (ANTLR_MARKER)(ctns->get_p());
+}
+
+template<class ImplTraits>
+ANTLR_UINT32		TreeNodeIntStream<ImplTraits>::_LA(ANTLR_INT32 i)
+{
+	CommonTreeNodeStreamType* tns	    = this->get_super();
+
+	// Ask LT for the 'token' at that position
+	//
+	TreeType* t = tns->_LT(i);
+
+	if	(t == NULL)
+	{
+		return	CommonTokenType::TOKEN_INVALID;
+	}
+
+	// Token node was there so return the type of it
+	//
+	return  t->get_type();
+}
+
+template<class ImplTraits>
+ANTLR_MARKER	TreeNodeIntStream<ImplTraits>::mark()
+{
+	CommonTreeNodeStreamType* ctns	    = this->get_super();
+	
+	if	(ctns->get_p() == -1)
+	{
+		ctns->fillBufferRoot();
+	}
+
+	// Return the current mark point
+	//
+	this->set_lastMarker( this->index() );
+
+	return this->get_lastMarker();
+
+}
+
+template<class ImplTraits>
+void  TreeNodeIntStream<ImplTraits>::release(ANTLR_MARKER marker)
+{
+
+}
+
+template<class ImplTraits>
+void TreeNodeIntStream<ImplTraits>::rewindMark(ANTLR_MARKER marker)
+{
+	this->seek(marker);
+}
+
+template<class ImplTraits>
+void TreeNodeIntStream<ImplTraits>::rewindLast()
+{
+	this->seek( this->get_lastMarker() );
+}
+
+template<class ImplTraits>
+void	TreeNodeIntStream<ImplTraits>::seek(ANTLR_MARKER index)
+{
+	CommonTreeNodeStreamType* ctns	    = this->get_super();
+	ctns->set_p( ANTLR_UINT32_CAST(index) );
+}
+
+template<class ImplTraits>
+ANTLR_UINT32	TreeNodeIntStream<ImplTraits>::size()
+{
+	CommonTreeNodeStreamType* ctns	    = this->get_super();
+	
+	if	(ctns->get_p() == -1)
+	{
+		ctns->fillBufferRoot();
+	}
+
+	return ctns->get_nodes().size();
+}
+
+
+ANTLR_END_NAMESPACE()
diff --git a/runtime/Cpp/include/antlr3lexer.hpp b/runtime/Cpp/include/antlr3lexer.hpp
new file mode 100755
index 0000000..cfff29f
--- /dev/null
+++ b/runtime/Cpp/include/antlr3lexer.hpp
@@ -0,0 +1,248 @@
+/** \file
+ * Base interface for any ANTLR3 lexer.
+ *
+ * An ANLTR3 lexer builds from two sets of components:
+ *
+ *  - The runtime components that provide common functionality such as
+ *    traversing character streams, building tokens for output and so on.
+ *  - The generated rules and struutre of the actual lexer, which call upon the
+ *    runtime components.
+ *
+ * A lexer class contains  a character input stream, a base recognizer interface
+ * (which it will normally implement) and a token source interface (which it also
+ * implements. The Tokensource interface is called by a token consumer (such as
+ * a parser, but in theory it can be anything that wants a set of abstract
+ * tokens in place of a raw character stream.
+ *
+ * So then, we set up a lexer in a sequence akin to:
+ *
+ *  - Create a character stream (something which implements ANTLR3_INPUT_STREAM)
+ *    and initialize it.
+ *  - Create a lexer interface and tell it where it its input stream is.
+ *    This will cause the creation of a base recognizer class, which it will
+ *    override with its own implementations of some methods. The lexer creator
+ *    can also then in turn override anything it likes.
+ *  - The lexer token source interface is then passed to some interface that
+ *    knows how to use it, byte calling for a next token.
+ *  - When a next token is called, let ze lexing begin.
+ *
+ */
+#ifndef	_ANTLR3_LEXER_HPP
+#define	_ANTLR3_LEXER_HPP
+
+// [The "BSD licence"]
+// Copyright (c) 2005-2009 Gokulakannan Somasundaram, ElectronDB
+
+//
+// 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.
+
+/* Definitions
+ */
+#include    "antlr3defs.hpp"
+
+ANTLR_BEGIN_NAMESPACE()
+
+static const ANTLR_UINT32	ANTLR_STRING_TERMINATOR	= 0xFFFFFFFF;
+
+template<class ImplTraits>
+class  Lexer : public ImplTraits::template RecognizerType< typename ImplTraits::InputStreamType >,
+			   public ImplTraits::TokenSourceType
+{
+public:
+	typedef typename ImplTraits::AllocPolicyType AllocPolicyType;
+	typedef typename ImplTraits::InputStreamType InputStreamType;
+	typedef InputStreamType StreamType;
+	typedef typename InputStreamType::IntStreamType IntStreamType;
+	typedef typename ImplTraits::CommonTokenType CommonTokenType;
+	typedef typename ImplTraits::StreamDataType TokenType;
+	typedef typename ImplTraits::StringType StringType;
+	typedef typename ImplTraits::StringStreamType StringStreamType;
+	typedef typename ImplTraits::template RecognizerType< InputStreamType > RecognizerType;
+	typedef typename RecognizerType::RecognizerSharedStateType RecognizerSharedStateType;
+	typedef typename ImplTraits::template ExceptionBaseType<InputStreamType> ExceptionBaseType;
+	typedef typename ImplTraits::BitsetListType BitsetListType;
+	typedef typename ImplTraits::TokenSourceType TokenSourceType;
+
+	typedef typename RecognizerSharedStateType::RuleMemoType RuleMemoType;
+	typedef typename RecognizerType::DebugEventListenerType DebuggerType;
+
+private:
+    /** A pointer to the character stream whence this lexer is receiving
+     *  characters.
+     *  TODO: I may come back to this and implement charstream outside
+     *  the input stream as per the java implementation.
+     */
+    InputStreamType*		m_input;
+
+public:
+	Lexer(ANTLR_UINT32 sizeHint, RecognizerSharedStateType* state);
+	Lexer(ANTLR_UINT32 sizeHint, InputStreamType* input, RecognizerSharedStateType* state);
+
+	InputStreamType* get_input() const;
+	IntStreamType* get_istream() const;
+	RecognizerType* get_rec();
+	const RecognizerType* get_rec() const;
+	TokenSourceType* get_tokSource();
+	
+	//functions used in .stg file
+	const RecognizerType* get_recognizer() const;
+	RecognizerSharedStateType* get_lexstate() const;
+	void set_lexstate( RecognizerSharedStateType* lexstate );
+	const TokenSourceType* get_tokSource() const;
+	CommonTokenType* get_ltoken() const;
+	void set_ltoken( const CommonTokenType* ltoken );
+	bool hasFailed() const;
+	ANTLR_INT32 get_backtracking() const;
+	void inc_backtracking();
+	void dec_backtracking();
+	bool get_failedflag() const;
+	void set_failedflag( bool failed );
+	InputStreamType* get_strstream() const;
+	ANTLR_MARKER  index() const;
+	void	seek(ANTLR_MARKER index);
+	const CommonTokenType* EOF_Token() const;
+	bool hasException() const;
+	ExceptionBaseType* get_exception() const;
+	void constructEx();
+	void lrecover();
+	ANTLR_MARKER mark();
+	void rewind(ANTLR_MARKER marker);
+	void rewindLast();
+	void setText( const StringType& text );
+	void skip();
+	RuleMemoType* getRuleMemo() const;
+	DebuggerType* get_debugger() const;
+	void setRuleMemo(RuleMemoType* rulememo);
+	ANTLR_UINT32 LA(ANTLR_INT32 i);
+	void consume();
+	void memoize(ANTLR_MARKER	ruleIndex, ANTLR_MARKER	ruleParseStart);
+	bool haveParsedRule(ANTLR_MARKER	ruleIndex);
+
+    /** Pointer to a function that sets the charstream source for the lexer and
+     *  causes it to  be reset.
+     */
+    void	setCharStream(InputStreamType* input);
+
+    /*!
+	 * \brief
+	 * Change to a new input stream, remembering the old one.
+	 *
+	 * \param lexer
+	 * Pointer to the lexer instance to switch input streams for.
+	 *
+	 * \param input
+	 * New input stream to install as the current one.
+	 *
+	 * Switches the current character input stream to
+	 * a new one, saving the old one, which we will revert to at the end of this
+	 * new one.
+	 */
+    void	pushCharStream(InputStreamType* input);
+
+	/*!
+	 * \brief
+	 * Stops using the current input stream and reverts to any prior
+	 * input stream on the stack.
+	 *
+	 * \param lexer
+	 * Description of parameter lexer.
+	 *
+	 * Pointer to a function that abandons the current input stream, whether it
+	 * is empty or not and reverts to the previous stacked input stream.
+	 *
+	 * \remark
+	 * The function fails silently if there are no prior input streams.
+	 */
+    void	popCharStream();
+
+    /** Function that emits (a copy of ) the supplied token as the next token in
+     *  the stream.
+     */
+    void	emit(const CommonTokenType* token);
+
+    /** Pointer to a function that constructs a new token from the lexer stored information
+     */
+    CommonTokenType*	emit();
+
+    /** Pointer to a function that attempts to match and consume the specified string from the input
+     *  stream. Note that strings muse be passed as terminated arrays of ANTLR3_UCHAR. Strings are terminated
+     *  with 0xFFFFFFFF, which is an invalid UTF32 character
+     */
+    bool	matchs(ANTLR_UCHAR* string);
+
+    /** Pointer to a function that matches and consumes the specified character from the input stream.
+     *  The input stream is required to provide characters via LA() as UTF32 characters. The default lexer
+     *  implementation is source encoding agnostic and so input streams do not generally need to
+     *  override the default implmentation.
+     */
+    bool	matchc(ANTLR_UCHAR c);
+
+    /** Pointer to a function that matches any character in the supplied range (I suppose it could be a token range too
+     *  but this would only be useful if the tokens were in tsome guaranteed order which is
+     *  only going to happen with a hand crafted token set).
+     */
+    bool	matchRange(ANTLR_UCHAR low, ANTLR_UCHAR high);
+
+    /** Pointer to a function that matches the next token/char in the input stream
+     *  regardless of what it actaully is.
+     */
+    void		matchAny();
+
+    /** Pointer to a function that recovers from an error found in the input stream.
+     *  Generally, this will be a #ANTLR3_EXCEPTION_NOVIABLE_ALT but it could also
+     *  be from a mismatched token that the (*match)() could not recover from.
+     */
+    void		recover();
+
+    /** Function to return the current line number in the input stream
+     */
+    ANTLR_UINT32	getLine();
+    ANTLR_MARKER	getCharIndex();
+    ANTLR_UINT32	getCharPositionInLine();
+
+    /** Function to return the text so far for the current token being generated
+     */
+    StringType 	getText();
+
+	//Other utility functions
+	void fillExceptionData( ExceptionBaseType* ex );
+
+	/** Default lexer error handler (works for 8 bit streams only!!!)
+	 */
+	void displayRecognitionError( ANTLR_UINT8** tokenNames, ExceptionBaseType* ex);
+	void exConstruct();
+	TokenType*	getMissingSymbol( IntStreamType* istream, ExceptionBaseType* e,
+								  ANTLR_UINT32	expectedTokenType, BitsetListType*	follow);
+
+    /** Pointer to a function that knows how to free the resources of a lexer
+     */
+	~Lexer();
+};
+
+ANTLR_END_NAMESPACE()
+
+#include "antlr3lexer.inl"
+
+#endif
diff --git a/runtime/Cpp/include/antlr3lexer.inl b/runtime/Cpp/include/antlr3lexer.inl
new file mode 100755
index 0000000..c8ccbd8
--- /dev/null
+++ b/runtime/Cpp/include/antlr3lexer.inl
@@ -0,0 +1,592 @@
+ANTLR_BEGIN_NAMESPACE()
+
+template<class ImplTraits>
+Lexer<ImplTraits>::Lexer(ANTLR_UINT32 sizeHint, RecognizerSharedStateType* state)
+	:Lexer<ImplTraits>::RecognizerType(sizeHint, state)
+	,m_input(NULL)
+{
+}
+
+template<class ImplTraits>
+Lexer<ImplTraits>::Lexer(ANTLR_UINT32 sizeHint, InputStreamType* input, RecognizerSharedStateType* state)
+	:Lexer<ImplTraits>::RecognizerType(sizeHint, state)
+{
+	this->setCharStream(input);
+}
+
+template<class ImplTraits>
+typename Lexer<ImplTraits>::InputStreamType* Lexer<ImplTraits>::get_input() const
+{
+	return m_input;
+}
+
+template<class ImplTraits>
+typename Lexer<ImplTraits>::IntStreamType* Lexer<ImplTraits>::get_istream() const
+{
+	return m_input;
+}
+
+template<class ImplTraits>
+typename Lexer<ImplTraits>::RecognizerType* Lexer<ImplTraits>::get_rec()
+{
+	return this;
+}
+
+template<class ImplTraits>
+typename Lexer<ImplTraits>::TokenSourceType* Lexer<ImplTraits>::get_tokSource()
+{
+	return this;
+}
+
+template<class ImplTraits>
+void Lexer<ImplTraits>::displayRecognitionError( ANTLR_UINT8** , ExceptionBaseType* ex)
+{
+	StringStreamType	err_stream;
+
+	// See if there is a 'filename' we can use
+    //
+    if( ex->getName().empty() )
+    {
+		err_stream << "-unknown source-(";
+    }
+    else
+    {
+		err_stream << ex->get_streamName().c_str();
+		err_stream << "(";
+    }
+    err_stream << ex->get_line() << ")";
+
+	err_stream << ": lexer error " <<  ex->getName() << '(' << ex->getType() << ')' << " :\n\t"
+		   << ex->get_message() << " at position [" << ex->get_line() << ", "
+		   << ex->get_charPositionInLine()+1 << "], ";
+
+	{
+		ANTLR_UINT32	width;
+
+		width	= ANTLR_UINT32_CAST(( (ANTLR_UINT8*)(m_input->get_data()) +
+									  (m_input->size() )) - (ANTLR_UINT8*)( ex->get_index() ));
+
+		if	(width >= 1)
+		{
+			if	(isprint(ex->get_c() ))
+			{
+				err_stream << "near '" << (typename StringType::value_type) ex->get_c() << "' :\n";
+			}
+			else
+			{
+				err_stream << "near char(" << std::hex << ex->get_c() << std::dec << ") :\n";
+			}
+			err_stream << "\t";
+			err_stream.width( width > 20 ? 20 : width );
+			err_stream << (typename StringType::const_pointer)ex->get_index() << "\n";
+		}
+		else
+		{
+			err_stream << "(end of input).\n\t This indicates a poorly specified lexer RULE\n\t or unterminated input element such as: \"STRING[\"]\n";
+			err_stream << "\t The lexer was matching from line "
+					   << this->get_state()->get_tokenStartLine()
+					   << ", offset " << this->get_state()->get_tokenStartCharPositionInLine()
+					   << ", which\n\t ";
+			width = ANTLR_UINT32_CAST(((ANTLR_UINT8*)(m_input->get_data() )+
+										(m_input->size())) -
+										(ANTLR_UINT8*)(this->get_state()->get_tokenStartCharIndex() ));
+
+			if	(width >= 1)
+			{
+				err_stream << "looks like this:\n\t\t";
+				err_stream.width( width > 20 ? 20 : width );
+				err_stream << (typename StringType::const_pointer)this->get_state()->get_tokenStartCharIndex() << "\n";
+			}
+			else
+			{
+				err_stream << "is also the end of the line, so you must check your lexer rules\n";
+			}
+		}
+	}
+	ImplTraits::displayRecognitionError( err_stream.str() );
+}
+
+template<class ImplTraits>
+void Lexer<ImplTraits>::fillExceptionData( ExceptionBaseType* ex )
+{
+	ex->set_c( m_input->_LA(1) );					/* Current input character			*/
+	ex->set_line( m_input->get_line() );						/* Line number comes from stream		*/
+	ex->set_charPositionInLine( m_input->get_charPositionInLine() );	    /* Line offset also comes from the stream   */
+	ex->set_index( m_input->index() );
+	ex->set_streamName( m_input->get_fileName() );
+	ex->set_message( "Unexpected character" );
+}
+
+template<class ImplTraits>
+void	Lexer<ImplTraits>::setCharStream(InputStreamType* input)
+{
+    /* Install the input interface
+     */
+    m_input	= input;
+
+    /* Set the current token to nothing
+     */
+	RecognizerSharedStateType* state = this->get_rec()->get_state();
+    state->set_token_present( false );
+	state->set_text("");
+    state->set_tokenStartCharIndex(-1);
+
+    /* Copy the name of the char stream to the token source
+     */
+    this->get_tokSource()->set_fileName( input->get_fileName() );
+}
+
+template<class ImplTraits>
+void	Lexer<ImplTraits>::pushCharStream(InputStreamType* input)
+{
+	// We have a stack, so we can save the current input stream
+	// into it.
+	//
+	this->get_istream()->mark();
+	this->get_rec()->get_state()->get_streams().push(this->get_input());
+
+	// And now we can install this new one
+	//
+	this->setCharStream(input);
+}
+
+template<class ImplTraits>
+void	Lexer<ImplTraits>::popCharStream()
+{
+	InputStreamType* input;
+
+    // If we do not have a stream stack or we are already at the
+    // stack bottom, then do nothing.
+    //
+    typename RecognizerSharedStateType::StreamsType& streams = this->get_rec()->get_state()->get_streams();
+    if	( streams.size() > 0)
+    {
+		// We just leave the current stream to its fate, we do not close
+		// it or anything as we do not know what the programmer intended
+		// for it. This method can always be overridden of course.
+		// So just find out what was currently saved on the stack and use
+		// that now, then pop it from the stack.
+		//
+		input	= streams.top();
+		streams.pop();
+
+		// Now install the stream as the current one.
+		//
+		this->setCharStream(input);
+		this->get_istream()->rewindLast();
+    }
+    return;
+}
+
+template<class ImplTraits>
+void	Lexer<ImplTraits>::emit(const CommonTokenType* token)
+{
+	this->get_rec()->get_state()->set_token(token);
+}
+
+template<class ImplTraits>
+typename Lexer<ImplTraits>::CommonTokenType*	Lexer<ImplTraits>::emit()
+{
+	/* We could check pointers to token factories and so on, but
+    * we are in code that we want to run as fast as possible
+    * so we are not checking any errors. So make sure you have installed an input stream before
+    * trying to emit a new token.
+    */
+	RecognizerSharedStateType* state = this->get_rec()->get_state();
+	state->set_token_present(true);
+    CommonTokenType* token = state->get_token();
+	token->set_input( this->get_input() );
+
+    /* Install the supplied information, and some other bits we already know
+    * get added automatically, such as the input stream it is associated with
+    * (though it can all be overridden of course)
+    */
+    token->set_type( state->get_type() );
+    token->set_channel( state->get_channel() );
+    token->set_startIndex( state->get_tokenStartCharIndex() );
+    token->set_stopIndex( this->getCharIndex() - 1 );
+    token->set_line( state->get_tokenStartLine() );
+    token->set_charPositionInLine( state->get_tokenStartCharPositionInLine() );
+
+	token->set_tokText( state->get_text() );
+    token->set_lineStart( this->get_input()->get_currentLine() );
+
+    return  token;
+}
+
+template<class ImplTraits>
+Lexer<ImplTraits>::~Lexer()
+{
+	// This may have ben a delegate or delegator lexer, in which case the
+	// state may already have been freed (and set to NULL therefore)
+	// so we ignore the state if we don't have it.
+	//
+	RecognizerSharedStateType* state = this->get_rec()->get_state();
+
+	if	( state != NULL)
+	{
+		state->get_streams().clear();
+	}
+}
+
+template<class ImplTraits>
+bool	Lexer<ImplTraits>::matchs(ANTLR_UCHAR* str )
+{
+	RecognizerSharedStateType* state = this->get_rec()->get_state();
+	while   (*str != ANTLR_STRING_TERMINATOR)
+	{
+		if  ( this->get_istream()->_LA(1) != (*str))
+		{
+			if	( state->get_backtracking() > 0)
+			{
+				state->set_failed(true);
+				return false;
+			}
+
+			this->exConstruct();
+			state->set_failed( true );
+
+			/* TODO: Implement exception creation more fully perhaps
+			 */
+			this->recover();
+			return  false;
+		}
+
+		/* Matched correctly, do consume it
+		 */
+		this->get_istream()->consume();
+		str++;
+
+	}
+	/* Reset any failed indicator
+	 */
+	state->set_failed( false );
+	return  true;
+}
+
+template<class ImplTraits>
+bool	Lexer<ImplTraits>::matchc(ANTLR_UCHAR c)
+{
+	if	(this->get_istream()->_LA(1) == c)
+	{
+		/* Matched correctly, do consume it
+		 */
+		this->get_istream()->consume();
+
+		/* Reset any failed indicator
+		 */
+		this->get_rec()->get_state()->set_failed( false );
+
+		return	true;
+	}
+
+	/* Failed to match, exception and recovery time.
+	 */
+	if(this->get_rec()->get_state()->get_backtracking() > 0)
+	{
+		this->get_rec()->get_state()->set_failed( true );
+		return	false;
+	}
+
+	this->exConstruct();
+
+	/* TODO: Implement exception creation more fully perhaps
+	 */
+	this->recover();
+
+	return  false;
+}
+
+template<class ImplTraits>
+bool	Lexer<ImplTraits>::matchRange(ANTLR_UCHAR low, ANTLR_UCHAR high)
+{
+    ANTLR_UCHAR    c;
+
+    /* What is in the stream at the moment?
+     */
+    c	= this->get_istream()->_LA(1);
+    if	( c >= low && c <= high)
+    {
+		/* Matched correctly, consume it
+		 */
+		this->get_istream()->consume();
+
+		/* Reset any failed indicator
+		 */
+		this->get_rec()->get_state()->set_failed( false );
+
+		return	true;
+    }
+
+    /* Failed to match, execption and recovery time.
+     */
+
+    if	(this->get_rec()->get_state()->get_backtracking() > 0)
+    {
+		this->get_rec()->get_state()->set_failed( true );
+		return	false;
+    }
+
+    this->exConstruct();
+
+    /* TODO: Implement exception creation more fully
+     */
+    this->recover();
+
+    return  false;
+}
+
+template<class ImplTraits>
+void		Lexer<ImplTraits>::matchAny()
+{
+	this->get_istream()->consume();
+}
+
+template<class ImplTraits>
+void		Lexer<ImplTraits>::recover()
+{
+	this->get_istream()->consume();
+}
+
+template<class ImplTraits>
+ANTLR_UINT32	Lexer<ImplTraits>::getLine()
+{
+	return  this->get_input()->get_line();
+}
+
+template<class ImplTraits>
+ANTLR_MARKER	Lexer<ImplTraits>::getCharIndex()
+{
+	return this->get_istream()->index();
+}
+
+template<class ImplTraits>
+ANTLR_UINT32	Lexer<ImplTraits>::getCharPositionInLine()
+{
+	return  this->get_input()->get_charPositionInLine();
+}
+
+template<class ImplTraits>
+typename Lexer<ImplTraits>::StringType	Lexer<ImplTraits>::getText()
+{
+	RecognizerSharedStateType* state = this->get_rec()->get_state();
+	if ( !state->get_text().empty() )
+	{
+		return	state->get_text();
+
+	}
+	return  this->get_input()->substr( state->get_tokenStartCharIndex(),
+									this->getCharIndex() - this->get_input()->get_charByteSize()
+							);
+}
+
+template<class ImplTraits>
+void Lexer<ImplTraits>::exConstruct()
+{
+	new ANTLR_Exception<ImplTraits, RECOGNITION_EXCEPTION, InputStreamType>( this->get_rec(), "" );
+}
+
+template< class ImplTraits>
+typename Lexer<ImplTraits>::TokenType*	Lexer<ImplTraits>::getMissingSymbol( IntStreamType*,
+										  ExceptionBaseType*,
+										  ANTLR_UINT32	, BitsetListType*)
+{
+	return NULL;
+}
+
+template< class ImplTraits>
+ANTLR_INLINE const typename Lexer<ImplTraits>::RecognizerType* Lexer<ImplTraits>::get_rec() const
+{
+	return this;
+}
+
+template< class ImplTraits>
+ANTLR_INLINE const typename Lexer<ImplTraits>::RecognizerType* Lexer<ImplTraits>::get_recognizer() const
+{
+	return this->get_rec();
+}
+
+template< class ImplTraits>
+ANTLR_INLINE typename Lexer<ImplTraits>::RecognizerSharedStateType* Lexer<ImplTraits>::get_lexstate() const
+{
+	return this->get_rec()->get_state();
+}
+
+template< class ImplTraits>
+ANTLR_INLINE void Lexer<ImplTraits>::set_lexstate( RecognizerSharedStateType* lexstate )
+{
+	this->get_rec()->set_state(lexstate);
+}
+
+template< class ImplTraits>
+ANTLR_INLINE const typename Lexer<ImplTraits>::TokenSourceType* Lexer<ImplTraits>::get_tokSource() const
+{
+	return this;
+}
+
+template< class ImplTraits>
+ANTLR_INLINE typename Lexer<ImplTraits>::CommonTokenType* Lexer<ImplTraits>::get_ltoken() const
+{
+	return this->get_lexstate()->token();
+}
+
+template< class ImplTraits>
+ANTLR_INLINE void Lexer<ImplTraits>::set_ltoken( const CommonTokenType* ltoken )
+{
+	this->get_lexstate()->set_token( ltoken );
+}
+
+template< class ImplTraits>
+ANTLR_INLINE bool Lexer<ImplTraits>::hasFailed() const
+{
+	return this->get_lexstate()->get_failed();
+}
+
+template< class ImplTraits>
+ANTLR_INLINE ANTLR_INT32 Lexer<ImplTraits>::get_backtracking() const
+{
+	return this->get_lexstate()->get_backtracking();
+}
+
+template< class ImplTraits>
+ANTLR_INLINE void Lexer<ImplTraits>::inc_backtracking()
+{
+	this->get_lexstate()->inc_backtracking();
+}
+
+template< class ImplTraits>
+ANTLR_INLINE void Lexer<ImplTraits>::dec_backtracking()
+{
+	this->get_lexstate()->dec_backtracking();
+}
+
+template< class ImplTraits>
+ANTLR_INLINE bool Lexer<ImplTraits>::get_failedflag() const
+{
+	return this->get_lexstate()->get_failed();
+}
+
+template< class ImplTraits>
+ANTLR_INLINE void Lexer<ImplTraits>::set_failedflag( bool failed )
+{
+	this->get_lexstate()->set_failed(failed);
+}
+
+template< class ImplTraits>
+ANTLR_INLINE typename Lexer<ImplTraits>::InputStreamType* Lexer<ImplTraits>::get_strstream() const
+{
+	return this->get_input();
+}
+
+template< class ImplTraits>
+ANTLR_INLINE ANTLR_MARKER  Lexer<ImplTraits>::index() const
+{
+	return this->get_istream()->index();
+}
+
+template< class ImplTraits>
+ANTLR_INLINE void	Lexer<ImplTraits>::seek(ANTLR_MARKER index)
+{
+	this->get_istream()->seek(index);
+}
+
+template< class ImplTraits>
+ANTLR_INLINE const typename Lexer<ImplTraits>::CommonTokenType* Lexer<ImplTraits>::EOF_Token() const
+{
+	const CommonTokenType& eof_token = this->get_tokSource()->get_eofToken();
+	return &eof_token;
+}
+
+template< class ImplTraits>
+ANTLR_INLINE bool Lexer<ImplTraits>::hasException() const
+{
+	return this->get_lexstate()->get_error();
+}
+
+template< class ImplTraits>
+ANTLR_INLINE typename Lexer<ImplTraits>::ExceptionBaseType* Lexer<ImplTraits>::get_exception() const
+{
+	return this->get_lexstate()->get_exception();
+}
+
+template< class ImplTraits>
+ANTLR_INLINE void Lexer<ImplTraits>::constructEx()
+{
+	this->get_rec()->exConstruct();
+}
+
+template< class ImplTraits>
+ANTLR_INLINE ANTLR_MARKER Lexer<ImplTraits>::mark()
+{
+	return this->get_istream()->mark();
+}
+
+template< class ImplTraits>
+ANTLR_INLINE void Lexer<ImplTraits>::rewind(ANTLR_MARKER marker)
+{
+	this->get_istream()->rewind(marker);
+}
+
+template< class ImplTraits>
+ANTLR_INLINE void Lexer<ImplTraits>::rewindLast()
+{
+	this->get_istream()->rewindLast();
+}
+
+template< class ImplTraits>
+ANTLR_INLINE void Lexer<ImplTraits>::memoize(ANTLR_MARKER	ruleIndex, ANTLR_MARKER	ruleParseStart)
+{
+	this->get_rec()->memoize( ruleIndex, ruleParseStart );
+}
+
+template< class ImplTraits>
+ANTLR_INLINE bool Lexer<ImplTraits>::haveParsedRule(ANTLR_MARKER	ruleIndex)
+{
+	return this->get_rec()->alreadyParsedRule(ruleIndex);
+}
+
+template< class ImplTraits>
+ANTLR_INLINE void Lexer<ImplTraits>::setText( const StringType& text )
+{
+	this->get_lexstate()->set_text(text);
+}
+
+template< class ImplTraits>
+ANTLR_INLINE void Lexer<ImplTraits>::skip()
+{
+	CommonTokenType& skipToken = this->get_tokSource()->get_skipToken();
+	this->get_lexstate()->set_token( &skipToken );
+}
+
+template< class ImplTraits>
+ANTLR_INLINE typename Lexer<ImplTraits>::RuleMemoType* Lexer<ImplTraits>::getRuleMemo() const
+{
+	return this->get_lexstate()->get_rulememo();
+}
+
+template< class ImplTraits>
+ANTLR_INLINE void Lexer<ImplTraits>::setRuleMemo(RuleMemoType* rulememo)
+{
+	return this->get_lexstate()->set_rulememo(rulememo);
+}
+
+template< class ImplTraits>
+ANTLR_INLINE typename Lexer<ImplTraits>::DebuggerType* Lexer<ImplTraits>::get_debugger() const
+{
+	return this->get_rec()->get_debugger();
+}
+
+template< class ImplTraits>
+ANTLR_INLINE ANTLR_UINT32 Lexer<ImplTraits>::LA(ANTLR_INT32 i)
+{
+	return this->get_istream()->_LA(i);
+}
+
+template< class ImplTraits>
+ANTLR_INLINE void Lexer<ImplTraits>::consume()
+{
+	return this->get_istream()->consume();
+}
+
+ANTLR_END_NAMESPACE()
+
diff --git a/runtime/Cpp/include/antlr3memory.hpp b/runtime/Cpp/include/antlr3memory.hpp
new file mode 100755
index 0000000..7713613
--- /dev/null
+++ b/runtime/Cpp/include/antlr3memory.hpp
@@ -0,0 +1,164 @@
+#ifndef	_ANTLR3MEMORY_HPP
+#define	_ANTLR3MEMORY_HPP
+
+// [The "BSD licence"]
+// Copyright (c) 2005-2009 Gokulakannan Somasundaram, ElectronDB
+
+//
+// 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.
+
+#include <string.h>
+
+#include <deque>
+#include <map>
+#include <new>
+#include <set>
+#include <vector>
+
+#include   "antlr3defs.hpp"
+
+ANTLR_BEGIN_NAMESPACE()
+
+class DefaultAllocPolicy
+{
+public:
+	//limitation of c++. unable to write a typedef 
+	template <class TYPE>
+	class AllocatorType : public std::allocator<TYPE>
+	{
+	public:
+		typedef TYPE value_type;
+		typedef value_type* pointer;
+		typedef const value_type* const_pointer;
+		typedef value_type& reference;
+		typedef const value_type& const_reference;
+		typedef size_t size_type;
+		typedef ptrdiff_t difference_type;
+		template<class U> struct rebind {
+			typedef AllocatorType<U> other;
+		};
+
+		AllocatorType() throw() {}
+		AllocatorType( const AllocatorType& alloc ) throw() {}
+		template<typename U> AllocatorType(const AllocatorType<U>& alloc) throw(){}
+	};
+
+	template<class TYPE>
+	class VectorType : public std::vector< TYPE, AllocatorType<TYPE> >
+	{
+	};
+	
+	template<class TYPE>
+	class ListType : public std::deque< TYPE, AllocatorType<TYPE> >
+	{
+	};	
+
+	template<class TYPE>
+	class StackType : public std::deque< TYPE, AllocatorType<TYPE> >
+	{
+	public:
+		void push( const TYPE& elem ) {  this->push_back(elem); 	}
+		void pop()  { this->pop_back(); }
+		TYPE& peek() { return this->back(); }
+		TYPE& top() { return this->back(); }
+		const TYPE& peek() const { return this->back(); }
+		const TYPE& top() const { return this->back(); }
+	};	
+
+
+	template<class TYPE>
+	class OrderedSetType : public std::set< TYPE, std::less<TYPE>, AllocatorType<TYPE> >
+	{
+	};
+
+	template<class TYPE>
+	class UnOrderedSetType : public std::set< TYPE, std::less<TYPE>, AllocatorType<TYPE> >
+	{
+	};
+
+	template<class KeyType, class ValueType>
+	class UnOrderedMapType : public std::map< KeyType, ValueType, std::less<KeyType>, 
+										AllocatorType<std::pair<KeyType, ValueType> > >
+	{
+	};
+
+	template<class KeyType, class ValueType>
+	class OrderedMapType : public std::map< KeyType, ValueType, std::less<KeyType>, 
+										AllocatorType<std::pair<KeyType, ValueType> > >
+	{
+	};
+
+	ANTLR_INLINE static void* operator new (std::size_t bytes)
+	{ 
+		void* p = alloc(bytes);
+		return p;
+	}
+	ANTLR_INLINE static void* operator new (std::size_t , void* p) { return p; }
+	ANTLR_INLINE static void* operator new[]( std::size_t bytes)
+	{
+		void* p = alloc(bytes); 
+		return p;
+	}
+	ANTLR_INLINE static void operator delete(void* p)
+	{
+		DefaultAllocPolicy::free(p);
+	}
+	ANTLR_INLINE static void operator delete(void* , void* ) {} //placement delete
+
+	ANTLR_INLINE static void operator delete[](void* p)
+	{
+		DefaultAllocPolicy::free(p);
+	}
+
+	ANTLR_INLINE static void* alloc( std::size_t bytes )
+	{
+		void* p = malloc(bytes); 
+		if( p== NULL )
+			throw std::bad_alloc();
+		return p;
+	}
+
+	ANTLR_INLINE static void* alloc0( std::size_t bytes )
+	{
+		void* p = calloc(1, bytes);
+		if( p== NULL )
+			throw std::bad_alloc();
+		return p;
+	}
+
+	ANTLR_INLINE static void  free( void* p )
+	{
+		return ::free(p);
+	}
+	
+	ANTLR_INLINE static void* realloc(void *ptr, size_t size)
+	{
+		return ::realloc( ptr, size );
+	}
+};
+
+ANTLR_END_NAMESPACE()
+
+#endif	/* _ANTLR3MEMORY_H */
diff --git a/runtime/Cpp/include/antlr3parser.hpp b/runtime/Cpp/include/antlr3parser.hpp
new file mode 100755
index 0000000..cc9b473
--- /dev/null
+++ b/runtime/Cpp/include/antlr3parser.hpp
@@ -0,0 +1,200 @@
+/** \file
+ * Base implementation of an ANTLR3 parser.
+ *
+ *
+ */
+#ifndef	_ANTLR3_PARSER_HPP
+#define	_ANTLR3_PARSER_HPP
+
+// [The "BSD licence"]
+// Copyright (c) 2005-2009 Gokulakannan Somasundaram, ElectronDB
+
+//
+// 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.
+
+#include    "antlr3defs.hpp"
+
+ANTLR_BEGIN_NAMESPACE()
+
+/** This is the main interface for an ANTLR3 parser.
+ */
+template< class ImplTraits >
+class Parser  :  public ImplTraits::template RecognizerType< typename ImplTraits::TokenStreamType >
+{
+public:
+	typedef typename ImplTraits::StringType StringType;
+	typedef typename ImplTraits::TokenStreamType  TokenStreamType;
+	typedef typename TokenStreamType::IntStreamType  IntStreamType;
+	typedef TokenStreamType StreamType;
+
+	typedef typename ImplTraits::template RecognizerType< typename ImplTraits::TokenStreamType > RecognizerType;
+	typedef typename RecognizerType::RecognizerSharedStateType RecognizerSharedStateType;
+
+	typedef DebugEventListener<ImplTraits> DebugEventListenerType;
+	typedef typename ImplTraits::CommonTokenType CommonTokenType;
+	typedef CommonTokenType TokenType;
+	typedef typename ImplTraits::BitsetListType BitsetListType;
+	typedef ANTLR_ExceptionBase<ImplTraits, TokenStreamType> ExceptionBaseType;
+	typedef Empty TokenSourceType;
+
+	typedef typename RecognizerSharedStateType::FollowingType FollowingType;
+	typedef typename RecognizerSharedStateType::RuleMemoType RuleMemoType;
+	typedef typename ImplTraits::DebugEventListenerType DebuggerType;
+
+private:
+    /** A provider of a tokenstream interface, for the parser to consume
+     *  tokens from.
+     */
+    TokenStreamType*			m_tstream;
+
+public:
+	Parser( ANTLR_UINT32 sizeHint, RecognizerSharedStateType* state );
+	Parser( ANTLR_UINT32 sizeHint, TokenStreamType* tstream, RecognizerSharedStateType* state );
+	Parser( ANTLR_UINT32 sizeHint, TokenStreamType* tstream, DebugEventListenerType* dbg,
+											RecognizerSharedStateType* state );
+	TokenStreamType* get_tstream() const;
+	TokenStreamType* get_input() const;
+	IntStreamType* get_istream() const;
+	RecognizerType* get_rec();
+
+	//same as above. Just that get_istream exists for lexer, parser, treeparser
+	//get_parser_istream exists only for parser, treeparser. So use it accordingly
+	IntStreamType* get_parser_istream() const;
+
+	/** A pointer to a function that installs a debugger object (it also
+	 *  installs the debugging versions of the parser methods. This means that
+	 *  a non debug parser incurs no overhead because of the debugging stuff.
+	 */
+	void	setDebugListener(DebugEventListenerType* dbg);
+
+    /** A pointer to a function that installs a token stream
+     * for the parser.
+     */
+    void	setTokenStream(TokenStreamType*);
+
+    /** A pointer to a function that returns the token stream for this
+     *  parser.
+     */
+    TokenStreamType*	getTokenStream();
+
+	void exConstruct();
+	TokenType*	getMissingSymbol( IntStreamType* istream, ExceptionBaseType* e,
+								  ANTLR_UINT32	expectedTokenType, BitsetListType*	follow);
+
+	void mismatch(ANTLR_UINT32 ttype, BitsetListType* follow);
+
+    /** Pointer to a function that knows how to free resources of an ANTLR3 parser.
+     */
+	~Parser();
+
+	void fillExceptionData( ExceptionBaseType* ex );
+	void displayRecognitionError( ANTLR_UINT8** tokenNames, ExceptionBaseType* ex );
+
+	//convenience functions exposed in .stg
+	const RecognizerType* get_recognizer() const;
+	RecognizerSharedStateType* get_psrstate() const;
+	void set_psrstate(RecognizerSharedStateType* state);
+	bool haveParsedRule(ANTLR_MARKER	ruleIndex);
+	void memoize(ANTLR_MARKER	ruleIndex, ANTLR_MARKER	ruleParseStart);
+	ANTLR_MARKER  index() const;
+	bool hasException() const;
+	ExceptionBaseType* get_exception() const;
+	const CommonTokenType* matchToken( ANTLR_UINT32 ttype, BitsetListType* follow );
+	void matchAnyToken();
+	const FollowingType& get_follow_stack() const;
+	void followPush( const BitsetListType& follow );
+	void followPop();
+	void precover();
+	void preporterror();
+	ANTLR_UINT32 LA(ANTLR_INT32 i);
+	const CommonTokenType*  LT(ANTLR_INT32 k);
+	void constructEx();
+	void consume();
+	ANTLR_MARKER mark();
+	void rewind(ANTLR_MARKER marker);
+	void rewindLast();
+	void seek(ANTLR_MARKER index);
+	bool get_perror_recovery() const;
+	void set_perror_recovery( bool val );
+	bool hasFailed() const;
+	bool get_failedflag() const;
+	void set_failedflag( bool failed );
+	ANTLR_INT32 get_backtracking() const;
+	void inc_backtracking();
+	void dec_backtracking();
+	CommonTokenType* recoverFromMismatchedSet(BitsetListType*	follow);
+	bool	recoverFromMismatchedElement(BitsetListType*	follow);
+	RuleMemoType* getRuleMemo() const;
+	DebuggerType* get_debugger() const;
+	TokenStreamType* get_strstream() const;
+	void setRuleMemo(RuleMemoType* rulememo);
+
+};
+
+//Generic rule return value. Unlike the general ANTLR, this gets generated for
+//every rule in the target. Handle rule exit here
+template<class ImplTraits>
+class RuleReturnValue
+{
+public:
+	typedef typename ImplTraits::BaseParserType BaseParserType;
+	typedef typename ImplTraits::CommonTokenType CommonTokenType;
+	
+public:
+	const CommonTokenType*		start;
+	const CommonTokenType*		stop;
+	BaseParserType*			parser;
+
+	RuleReturnValue(BaseParserType* psr = NULL );
+	RuleReturnValue( const RuleReturnValue& val );
+	RuleReturnValue& operator=( const RuleReturnValue& val );
+	void call_start_placeholder(); 
+	void call_stop_placeholder(); 
+	RuleReturnValue& get_struct();
+	~RuleReturnValue();
+};
+
+//This kind makes sure that whenever tokens are condensed into a rule,
+//all the tokens except the start and stop tokens are deleted
+template<class ImplTraits>
+class RuleReturnValue_1 : public RuleReturnValue<ImplTraits>
+{
+public:
+	typedef RuleReturnValue<ImplTraits> BaseType;
+	typedef typename BaseType::BaseParserType BaseParserType;
+
+public:
+	RuleReturnValue_1();
+	RuleReturnValue_1( BaseParserType* psr);
+	RuleReturnValue_1( const RuleReturnValue_1& val );
+	void call_start_placeholder();  //its dummy here
+	~RuleReturnValue_1();
+};
+
+ANTLR_END_NAMESPACE()
+
+#include "antlr3parser.inl"
+
+#endif
diff --git a/runtime/Cpp/include/antlr3parser.inl b/runtime/Cpp/include/antlr3parser.inl
new file mode 100755
index 0000000..6f4d152
--- /dev/null
+++ b/runtime/Cpp/include/antlr3parser.inl
@@ -0,0 +1,585 @@
+ANTLR_BEGIN_NAMESPACE()
+
+template< class ImplTraits >
+Parser<ImplTraits>::Parser( ANTLR_UINT32 sizeHint, RecognizerSharedStateType* state )
+	:RecognizerType( sizeHint, state )
+{
+	m_tstream = NULL;
+}
+
+template< class ImplTraits >
+Parser<ImplTraits>::Parser( ANTLR_UINT32 sizeHint, TokenStreamType* tstream,
+												RecognizerSharedStateType* state )
+												:RecognizerType( sizeHint, state )
+{
+	this->setTokenStream( tstream );
+}
+
+template< class ImplTraits >
+Parser<ImplTraits>::Parser( ANTLR_UINT32 sizeHint, TokenStreamType* tstream,
+											DebugEventListenerType* dbg,
+											RecognizerSharedStateType* state )
+											:RecognizerType( sizeHint, state )
+{
+	this->setTokenStream( tstream );
+	this->setDebugListener( dbg );
+}
+
+template< class ImplTraits >
+ANTLR_INLINE typename Parser<ImplTraits>::TokenStreamType* Parser<ImplTraits>::get_tstream() const
+{
+	return m_tstream;
+}
+
+template< class ImplTraits >
+ANTLR_INLINE typename Parser<ImplTraits>::IntStreamType* Parser<ImplTraits>::get_istream() const
+{
+	return m_tstream;
+}
+
+template< class ImplTraits >
+ANTLR_INLINE typename Parser<ImplTraits>::IntStreamType* Parser<ImplTraits>::get_parser_istream() const
+{
+	return m_tstream;
+}
+
+template< class ImplTraits >
+ANTLR_INLINE typename Parser<ImplTraits>::TokenStreamType* Parser<ImplTraits>::get_input() const
+{
+	return m_tstream;
+}
+
+template< class ImplTraits >
+void Parser<ImplTraits>::fillExceptionData( ExceptionBaseType* ex )
+{
+	ex->set_token( m_tstream->_LT(1) );	    /* Current input token			    */
+	ex->set_line( ex->get_token()->get_line() );
+	ex->set_charPositionInLine( ex->get_token()->get_charPositionInLine() );
+	ex->set_index( this->get_istream()->index() );
+	if( ex->get_token()->get_type() == CommonTokenType::TOKEN_EOF)
+	{
+		ex->set_streamName("");
+	}
+	else
+	{
+		ex->set_streamName( ex->get_token()->get_input()->get_fileName() );
+	}
+	ex->set_message("Unexpected token");
+}
+
+template< class ImplTraits >
+void Parser<ImplTraits>::displayRecognitionError( ANTLR_UINT8** tokenNames, ExceptionBaseType* ex )
+{
+	typename ImplTraits::StringStreamType errtext;
+	// See if there is a 'filename' we can use
+	//
+	if( ex->get_streamName().empty() )
+	{
+		if(ex->get_token()->get_type() == CommonTokenType::TOKEN_EOF)
+		{
+			errtext << "-end of input-(";
+		}
+		else
+		{
+			errtext << "-unknown source-(";
+		}
+	}
+	else
+	{
+		errtext << ex->get_streamName() << "(";
+	}
+
+	// Next comes the line number
+	//
+	errtext << this->get_rec()->get_state()->get_exception()->get_line() << ") ";
+	errtext << " : error " << this->get_rec()->get_state()->get_exception()->getType()
+							<< " : "
+							<< this->get_rec()->get_state()->get_exception()->get_message();
+
+	// Prepare the knowledge we know we have
+	//
+	const CommonTokenType* theToken   = this->get_rec()->get_state()->get_exception()->get_token();
+	StringType ttext			= theToken->toString();
+
+	errtext << ", at offset , "
+			<< this->get_rec()->get_state()->get_exception()->get_charPositionInLine();
+	if  (theToken != NULL)
+	{
+		if (theToken->get_type() == CommonTokenType::TOKEN_EOF)
+		{
+			errtext << ", at <EOF>";
+		}
+		else
+		{
+			// Guard against null text in a token
+			//
+			errtext << "\n    near " << ( ttext.empty()
+											? "<no text for the token>" : ttext ) << "\n";
+		}
+	}
+
+	ex->displayRecognitionError( tokenNames, errtext );
+	ImplTraits::displayRecognitionError( errtext.str() );
+}
+
+template< class ImplTraits >
+Parser<ImplTraits>::~Parser()
+{
+    if	(this->get_rec() != NULL)
+    {
+		// This may have ben a delegate or delegator parser, in which case the
+		// state may already have been freed (and set to NULL therefore)
+		// so we ignore the state if we don't have it.
+		//
+		RecognizerSharedStateType* state = this->get_rec()->get_state();
+		if	(state != NULL)
+		{
+			state->get_following().clear();
+		}
+    }
+}
+
+template< class ImplTraits >
+void	Parser<ImplTraits>::setDebugListener(DebugEventListenerType* dbg)
+{
+		// Set the debug listener. There are no methods to override
+	// because currently the only ones that notify the debugger
+	// are error reporting and recovery. Hence we can afford to
+	// check and see if the debugger interface is null or not
+	// there. If there is ever an occasion for a performance
+	// sensitive function to use the debugger interface, then
+	// a replacement function for debug mode should be supplied
+	// and installed here.
+	//
+	this->get_rec()->set_debugger(dbg);
+
+	// If there was a tokenstream installed already
+	// then we need to tell it about the debug interface
+	//
+	if	(this->get_tstream() != NULL)
+	{
+		this->get_tstream()->setDebugListener(dbg);
+	}
+}
+
+template< class ImplTraits >
+ANTLR_INLINE void	Parser<ImplTraits>::setTokenStream(TokenStreamType* tstream)
+{
+	m_tstream = tstream;
+    this->get_rec()->reset();
+}
+
+template< class ImplTraits >
+ANTLR_INLINE typename Parser<ImplTraits>::TokenStreamType*	Parser<ImplTraits>::getTokenStream()
+{
+	return m_tstream;
+}
+
+template< class ImplTraits >
+ANTLR_INLINE typename Parser<ImplTraits>::RecognizerType* Parser<ImplTraits>::get_rec()
+{
+	return this;
+}
+
+template< class ImplTraits >
+ANTLR_INLINE void Parser<ImplTraits>::exConstruct()
+{
+	new ANTLR_Exception<ImplTraits, MISMATCHED_TOKEN_EXCEPTION, StreamType>( this->get_rec(), "" );
+}
+
+template< class ImplTraits >
+typename Parser<ImplTraits>::TokenType*	Parser<ImplTraits>::getMissingSymbol( IntStreamType* istream,
+										  ExceptionBaseType*,
+										  ANTLR_UINT32			expectedTokenType,
+										  BitsetListType*	)
+{
+	TokenStreamType*		cts;
+	CommonTokenType*		token;
+	const CommonTokenType*		current;
+	StringType				text;
+
+	// Dereference the standard pointers
+	//
+	cts		= static_cast<TokenStreamType*>(istream);
+
+	// Work out what to use as the current symbol to make a line and offset etc
+	// If we are at EOF, we use the token before EOF
+	//
+	current	= cts->_LT(1);
+	if	(current->get_type() == CommonTokenType::TOKEN_EOF)
+	{
+		current = cts->_LT(-1);
+	}
+
+	token	= new CommonTokenType;
+
+	// Set some of the token properties based on the current token
+	//
+	token->set_line(current->get_line());
+	token->set_charPositionInLine( current->get_charPositionInLine());
+	token->set_channel( TOKEN_DEFAULT_CHANNEL );
+	token->set_type(expectedTokenType);
+    token->set_lineStart( current->get_lineStart() );
+
+	// Create the token text that shows it has been inserted
+	//
+	token->setText("<missing ");
+	text = token->getText();
+
+	if	(!text.empty())
+	{
+		text.append((const char *) this->get_rec()->get_state()->get_tokenName(expectedTokenType) );
+		text.append(">");
+	}
+
+	// Finally return the pointer to our new token
+	//
+	return	token;
+}
+
+template< class ImplTraits >
+void Parser<ImplTraits>::mismatch(ANTLR_UINT32 ttype, BitsetListType* follow)
+{
+    // Install a mismatched token exception in the exception stack
+    //
+	new ANTLR_Exception<ImplTraits, MISMATCHED_TOKEN_EXCEPTION, StreamType>(this, "");
+
+	//With the statement below, only the parsers are allowed to compile fine
+	IntStreamType* is = this->get_istream();
+
+
+	if	(this->mismatchIsUnwantedToken(is, ttype))
+	{
+		// Now update it to indicate this is an unwanted token exception
+		//
+		new ANTLR_Exception<ImplTraits, UNWANTED_TOKEN_EXCEPTION, StreamType>(this, "");
+		return;
+	}
+
+	if	( this->mismatchIsMissingToken(is, follow))
+	{
+		// Now update it to indicate this is an unwanted token exception
+		//
+		new ANTLR_Exception<ImplTraits, MISSING_TOKEN_EXCEPTION, StreamType>(this, "");
+		return;
+	}
+
+	// Just a mismatched token is all we can dtermine
+	//
+	new ANTLR_Exception<ImplTraits, MISMATCHED_TOKEN_EXCEPTION, StreamType>(this, "");
+
+	return;
+}
+
+template< class ImplTraits>
+ANTLR_INLINE const typename Parser<ImplTraits>::RecognizerType* Parser<ImplTraits>::get_recognizer() const
+{
+	return this;
+}
+
+template< class ImplTraits>
+ANTLR_INLINE typename Parser<ImplTraits>::RecognizerSharedStateType* Parser<ImplTraits>::get_psrstate() const
+{
+	return this->get_recognizer()->get_state();
+}
+
+template< class ImplTraits>
+ANTLR_INLINE void Parser<ImplTraits>::set_psrstate(RecognizerSharedStateType* state)
+{
+	this->get_rec()->set_state( state );
+}
+
+template< class ImplTraits>
+ANTLR_INLINE bool Parser<ImplTraits>::haveParsedRule(ANTLR_MARKER	ruleIndex)
+{
+	return this->get_rec()->alreadyParsedRule(ruleIndex);
+}
+
+template< class ImplTraits>
+ANTLR_INLINE void Parser<ImplTraits>::memoize(ANTLR_MARKER	ruleIndex, ANTLR_MARKER	ruleParseStart)
+{
+	return this->get_rec()->memoize( ruleIndex, ruleParseStart );
+}
+
+template< class ImplTraits>
+ANTLR_INLINE ANTLR_MARKER  Parser<ImplTraits>::index() const
+{
+	return this->get_istream()->index();
+}
+
+template< class ImplTraits>
+ANTLR_INLINE bool Parser<ImplTraits>::hasException() const
+{
+	return this->get_psrstate()->get_error();
+}
+
+template< class ImplTraits>
+ANTLR_INLINE typename Parser<ImplTraits>::ExceptionBaseType* Parser<ImplTraits>::get_exception() const
+{
+	return this->get_psrstate()->get_exception();
+}
+
+template< class ImplTraits>
+ANTLR_INLINE const typename Parser<ImplTraits>::CommonTokenType* Parser<ImplTraits>::matchToken( ANTLR_UINT32 ttype, BitsetListType* follow )
+{
+	return this->get_rec()->match( ttype, follow );
+}
+
+template< class ImplTraits>
+ANTLR_INLINE void Parser<ImplTraits>::matchAnyToken()
+{
+	return this->get_rec()->matchAny();
+}
+
+template< class ImplTraits>
+ANTLR_INLINE const typename Parser<ImplTraits>::FollowingType& Parser<ImplTraits>::get_follow_stack() const
+{
+	return this->get_psrstate()->get_following();
+}
+
+template< class ImplTraits>
+ANTLR_INLINE void Parser<ImplTraits>::followPush(const BitsetListType& follow)
+{
+#ifndef  SKIP_FOLLOW_SETS
+	this->get_rec()->get_state()->get_following().push(follow);
+#endif
+}
+
+template< class ImplTraits>
+ANTLR_INLINE void Parser<ImplTraits>::followPop()
+{
+#ifndef  SKIP_FOLLOW_SETS
+	this->get_rec()->get_state()->get_following().pop();
+#endif
+}
+
+template< class ImplTraits>
+ANTLR_INLINE void Parser<ImplTraits>::precover()
+{
+	return this->get_rec()->recover();
+}
+
+template< class ImplTraits>
+ANTLR_INLINE void Parser<ImplTraits>::preporterror()
+{
+	return this->get_rec()->reportError();
+}
+
+template< class ImplTraits>
+ANTLR_INLINE ANTLR_UINT32 Parser<ImplTraits>::LA(ANTLR_INT32 i)
+{
+	return this->get_istream()->_LA(i);
+}
+
+template< class ImplTraits>
+ANTLR_INLINE const typename Parser<ImplTraits>::CommonTokenType*  Parser<ImplTraits>::LT(ANTLR_INT32 k)
+{
+	return this->get_input()->_LT(k);
+}
+
+template< class ImplTraits>
+ANTLR_INLINE void Parser<ImplTraits>::constructEx()
+{
+	this->get_rec()->constructEx();
+}
+
+template< class ImplTraits>
+ANTLR_INLINE void Parser<ImplTraits>::consume()
+{
+	this->get_istream()->consume();
+}
+
+template< class ImplTraits>
+ANTLR_INLINE ANTLR_MARKER Parser<ImplTraits>::mark()
+{
+	return this->get_istream()->mark();
+}
+
+template< class ImplTraits>
+ANTLR_INLINE void Parser<ImplTraits>::rewind(ANTLR_MARKER marker)
+{
+	this->get_istream()->rewind(marker);
+}
+
+template< class ImplTraits>
+ANTLR_INLINE void Parser<ImplTraits>::rewindLast()
+{
+	this->get_istream()->rewindLast();
+}
+
+template< class ImplTraits>
+ANTLR_INLINE void Parser<ImplTraits>::seek(ANTLR_MARKER index)
+{
+	this->get_istream()->seek(index);
+}
+
+template< class ImplTraits>
+ANTLR_INLINE bool Parser<ImplTraits>::get_perror_recovery() const
+{
+	return this->get_psrstate()->get_errorRecovery();
+}
+
+template< class ImplTraits>
+ANTLR_INLINE void Parser<ImplTraits>::set_perror_recovery( bool val )
+{
+	this->get_psrstate()->set_errorRecovery(val);
+}
+
+template< class ImplTraits>
+ANTLR_INLINE bool Parser<ImplTraits>::hasFailed() const
+{
+	return this->get_psrstate()->get_failed();
+}
+
+template< class ImplTraits>
+ANTLR_INLINE bool Parser<ImplTraits>::get_failedflag() const
+{
+	return this->get_psrstate()->get_failed();
+}
+
+template< class ImplTraits>
+ANTLR_INLINE void Parser<ImplTraits>::set_failedflag( bool failed )
+{
+	this->get_psrstate()->set_failed(failed);
+}
+
+template< class ImplTraits>
+ANTLR_INLINE ANTLR_INT32 Parser<ImplTraits>::get_backtracking() const
+{
+	return this->get_psrstate()->get_backtracking();
+}
+
+template< class ImplTraits>
+ANTLR_INLINE void Parser<ImplTraits>::inc_backtracking()
+{
+	this->get_psrstate()->inc_backtracking();
+}
+
+template< class ImplTraits>
+ANTLR_INLINE void Parser<ImplTraits>::dec_backtracking()
+{
+	this->get_psrstate()->dec_backtracking();
+}
+
+template< class ImplTraits>
+ANTLR_INLINE typename Parser<ImplTraits>::CommonTokenType* Parser<ImplTraits>::recoverFromMismatchedSet(BitsetListType*	follow)
+{
+	return this->get_rec()->recoverFromMismatchedSet(follow);
+}
+
+template< class ImplTraits>
+ANTLR_INLINE bool	Parser<ImplTraits>::recoverFromMismatchedElement(BitsetListType*	follow)
+{
+	return this->get_rec()->recoverFromMismatchedElement(follow);
+}
+
+template< class ImplTraits>
+ANTLR_INLINE typename Parser<ImplTraits>::RuleMemoType* Parser<ImplTraits>::getRuleMemo() const
+{
+	return this->get_psrstate()->get_ruleMemo();
+}
+
+template< class ImplTraits>
+ANTLR_INLINE void Parser<ImplTraits>::setRuleMemo(RuleMemoType* rulememo)
+{
+	this->get_psrstate()->set_ruleMemo(rulememo);
+}
+
+template< class ImplTraits>
+ANTLR_INLINE typename Parser<ImplTraits>::DebuggerType* Parser<ImplTraits>::get_debugger() const
+{
+	return this->get_rec()->get_debugger();
+}
+
+template< class ImplTraits>
+ANTLR_INLINE typename Parser<ImplTraits>::TokenStreamType* Parser<ImplTraits>::get_strstream() const
+{
+	return this->get_tstream();
+}
+
+template< class ImplTraits>
+ANTLR_INLINE RuleReturnValue<ImplTraits>::RuleReturnValue(BaseParserType* psr) 
+{ 
+	parser = psr; 
+	start = NULL;
+	stop = NULL;
+}
+
+template< class ImplTraits>
+ANTLR_INLINE RuleReturnValue<ImplTraits>::RuleReturnValue( const RuleReturnValue& val )
+{
+	parser	= val.parser; 
+	start	= val.start;
+	stop	= val.stop;
+}
+
+template< class ImplTraits>
+ANTLR_INLINE RuleReturnValue<ImplTraits>& RuleReturnValue<ImplTraits>::operator=( const RuleReturnValue& val )
+{
+	parser	= val.parser; 
+	start	= val.start;
+	stop	= val.stop;
+	return *this;
+}
+
+template< class ImplTraits>
+ANTLR_INLINE RuleReturnValue<ImplTraits>::~RuleReturnValue()
+{
+}
+
+template< class ImplTraits>
+ANTLR_INLINE void RuleReturnValue<ImplTraits>::call_start_placeholder()
+{
+	start = parser->LT(1); 
+	stop = start;
+}
+
+template< class ImplTraits>
+ANTLR_INLINE void RuleReturnValue<ImplTraits>::call_stop_placeholder()
+{
+	stop = parser->LT(-1);
+}
+
+template< class ImplTraits>
+ANTLR_INLINE RuleReturnValue_1<ImplTraits>::RuleReturnValue_1()
+{
+}
+
+template< class ImplTraits>
+RuleReturnValue_1<ImplTraits>::RuleReturnValue_1( BaseParserType* psr )
+	:RuleReturnValue_1<ImplTraits>::BaseType(psr)
+{
+	BaseType::start = psr->LT(1);
+	BaseType::stop = BaseType::start;
+}
+
+template< class ImplTraits>
+RuleReturnValue_1<ImplTraits>::RuleReturnValue_1( const RuleReturnValue_1& val )
+	:BaseType(val)
+{
+}
+
+template< class ImplTraits>
+void RuleReturnValue_1<ImplTraits>::call_start_placeholder()
+{
+}
+
+template< class ImplTraits>
+RuleReturnValue_1<ImplTraits>::~RuleReturnValue_1()
+{
+	if( BaseType::parser && ( BaseType::parser->get_backtracking() == 0 ) )
+	{
+		if( BaseType::stop == NULL )
+			BaseType::stop = BaseType::parser->LT(-1);
+		if( BaseType::stop != NULL )
+		{
+			ANTLR_MARKER start_token_idx	= BaseType::start->get_index() + 1;
+			ANTLR_MARKER stop_token_idx		= BaseType::stop->get_index() - 1;
+			if( start_token_idx > stop_token_idx )
+				return;
+			BaseType::parser->getTokenStream()->discardTokens( start_token_idx, stop_token_idx); 
+		}
+	}
+}
+
+ANTLR_END_NAMESPACE()
diff --git a/runtime/Cpp/include/antlr3recognizersharedstate.hpp b/runtime/Cpp/include/antlr3recognizersharedstate.hpp
new file mode 100755
index 0000000..0554396
--- /dev/null
+++ b/runtime/Cpp/include/antlr3recognizersharedstate.hpp
@@ -0,0 +1,265 @@
+/** \file
+ * While the C runtime does not need to model the state of
+ * multiple lexers and parsers in the same way as the Java runtime does
+ * it is no overhead to reflect that model. In fact the
+ * C runtime has always been able to share recognizer state.
+ *
+ * This 'class' therefore defines all the elements of a recognizer
+ * (either lexer, parser or tree parser) that are need to
+ * track the current recognition state. Multiple recognizers
+ * may then share this state, for instance when one grammar
+ * imports another.
+ */
+
+#ifndef	_ANTLR3_RECOGNIZER_SHARED_STATE_HPP
+#define	_ANTLR3_RECOGNIZER_SHARED_STATE_HPP
+
+// [The "BSD licence"]
+// Copyright (c) 2005-2009 Gokulakannan Somasundaram, ElectronDB
+
+//
+// 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.
+
+#include "antlr3defs.hpp"
+
+ANTLR_BEGIN_NAMESPACE()
+
+/** All the data elements required to track the current state
+ *  of any recognizer (lexer, parser, tree parser).
+ * May be share between multiple recognizers such that
+ * grammar inheritance is easily supported.
+ */
+template<class ImplTraits, class StreamType>
+class RecognizerSharedState  : public ImplTraits::AllocPolicyType
+{
+public:
+	typedef typename ImplTraits::AllocPolicyType AllocPolicyType;
+	typedef typename StreamType::UnitType TokenType;
+	typedef typename ImplTraits::CommonTokenType CommonTokenType;
+
+	typedef typename ComponentTypeFinder<ImplTraits, StreamType>::ComponentType  ComponentType;
+	typedef typename ImplTraits::template RewriteStreamType< ComponentType > RewriteStreamType;
+	typedef typename ImplTraits::StringType StringType;
+	typedef typename ImplTraits::TokenSourceType TokenSourceType;
+	typedef typename ImplTraits::template ExceptionBaseType<StreamType> ExceptionBaseType;
+	typedef typename ImplTraits::BitsetType BitsetType;
+	typedef typename ImplTraits::BitsetListType BitsetListType;
+
+	typedef typename AllocPolicyType::template StackType< BitsetListType > FollowingType;
+	typedef typename AllocPolicyType::template StackType< typename ImplTraits::InputStreamType* > InputStreamsType;
+	typedef InputStreamsType StreamsType;
+	typedef typename AllocPolicyType::template VectorType<RewriteStreamType> RewriteStreamsType;
+
+	typedef IntTrie<ImplTraits, ANTLR_MARKER> RuleListType;
+	typedef IntTrie<ImplTraits, RuleListType*> RuleMemoType;
+
+private:
+	/** Points to the first in a possible chain of exceptions that the
+     *  recognizer has discovered.
+     */
+    ExceptionBaseType*			m_exception;
+
+
+    /** Track the set of token types that can follow any rule invocation.
+     *  Stack structure, to support: List<BitSet>.
+     */
+    FollowingType		m_following;
+
+    /** Track around a hint from the creator of the recognizer as to how big this
+     *  thing is going to get, as the actress said to the bishop. This allows us
+     *  to tune hash tables accordingly. This might not be the best place for this
+     *  in the end but we will see.
+     */
+    ANTLR_UINT32		m_sizeHint;
+
+
+    /** If set to true then the recognizer has an exception
+     * condition (this is tested by the generated code for the rules of
+     * the grammar).
+     */
+    bool				m_error;
+
+
+    /** This is true when we see an error and before having successfully
+     *  matched a token.  Prevents generation of more than one error message
+     *  per error.
+     */
+    bool				m_errorRecovery;
+
+	/** In lieu of a return value, this indicates that a rule or token
+     *  has failed to match.  Reset to false upon valid token match.
+     */
+    bool				m_failed;
+
+	/*
+	Instead of allocating CommonTokenType, we do it in the stack. hence we need a null indicator
+	*/
+	bool				m_token_present;
+
+    /** The index into the input stream where the last error occurred.
+     * 	This is used to prevent infinite loops where an error is found
+     *  but no token is consumed during recovery...another error is found,
+     *  ad nauseam.  This is a failsafe mechanism to guarantee that at least
+     *  one token/tree node is consumed for two errors.
+     */
+    ANTLR_MARKER		m_lastErrorIndex;
+
+    /** When the recognizer terminates, the error handling functions
+     *  will have incremented this value if any error occurred (that was displayed). It can then be
+     *  used by the grammar programmer without having to use static globals.
+     */
+    ANTLR_UINT32		m_errorCount;
+
+    /** If 0, no backtracking is going on.  Safe to exec actions etc...
+     *  If >0 then it's the level of backtracking.
+     */
+    ANTLR_INT32			m_backtracking;
+
+    /** ANTLR3_VECTOR of ANTLR3_LIST for rule memoizing.
+     *  Tracks  the stop token index for each rule.  ruleMemo[ruleIndex] is
+     *  the memoization table for ruleIndex.  For key ruleStartIndex, you
+     *  get back the stop token for associated rule or MEMO_RULE_FAILED.
+     *
+     *  This is only used if rule memoization is on.
+     */
+    RuleMemoType*		m_ruleMemo;
+
+    /** Pointer to an array of token names
+     *  that are generally useful in error reporting. The generated parsers install
+     *  this pointer. The table it points to is statically allocated as 8 bit ascii
+     *  at parser compile time - grammar token names are thus restricted in character
+     *  sets, which does not seem to terrible.
+     */
+    ANTLR_UINT8**		m_tokenNames;
+
+    /** The goal of all lexer rules/methods is to create a token object.
+     *  This is an instance variable as multiple rules may collaborate to
+     *  create a single token.  For example, NUM : INT | FLOAT ;
+     *  In this case, you want the INT or FLOAT rule to set token and not
+     *  have it reset to a NUM token in rule NUM.
+     */
+    CommonTokenType		m_token;
+
+    /** A lexer is a source of tokens, produced by all the generated (or
+     *  hand crafted if you like) matching rules. As such it needs to provide
+     *  a token source interface implementation. For others, this will become a empty class
+     */
+    TokenSourceType*	m_tokSource;
+
+    /** The channel number for the current token
+     */
+    ANTLR_UINT32			m_channel;
+
+    /** The token type for the current token
+     */
+    ANTLR_UINT32			m_type;
+
+    /** The input line (where it makes sense) on which the first character of the current
+     *  token resides.
+     */
+    ANTLR_INT32			m_tokenStartLine;
+
+    /** The character position of the first character of the current token
+     *  within the line specified by tokenStartLine
+     */
+    ANTLR_INT32		m_tokenStartCharPositionInLine;
+
+    /** What character index in the stream did the current token start at?
+     *  Needed, for example, to get the text for current token.  Set at
+     *  the start of nextToken.
+     */
+    ANTLR_MARKER		m_tokenStartCharIndex;
+
+    /** Text for the current token. This can be overridden by setting this
+     *  variable directly or by using the SETTEXT() macro (preferred) in your
+     *  lexer rules.
+     */
+    StringType			m_text;
+
+    /** Input stream stack, which allows the C programmer to switch input streams
+     *  easily and allow the standard nextToken() implementation to deal with it
+     *  as this is a common requirement.
+     */
+    InputStreamsType	m_streams;
+
+public:
+	RecognizerSharedState();
+	ExceptionBaseType* get_exception() const;
+	FollowingType& get_following();
+	ANTLR_UINT32 get_sizeHint() const;
+	bool get_error() const;
+	bool get_errorRecovery() const;
+	bool get_failed() const;
+	bool get_token_present() const;
+	ANTLR_MARKER get_lastErrorIndex() const;
+	ANTLR_UINT32 get_errorCount() const;
+	ANTLR_INT32 get_backtracking() const;
+	RuleMemoType* get_ruleMemo() const;
+	ANTLR_UINT8** get_tokenNames() const;
+	ANTLR_UINT8* get_tokenName( ANTLR_UINT32 i ) const;
+	CommonTokenType* get_token();
+	TokenSourceType* get_tokSource() const;
+	ANTLR_UINT32& get_channel();
+	ANTLR_UINT32 get_type() const;
+	ANTLR_INT32 get_tokenStartLine() const;
+	ANTLR_INT32 get_tokenStartCharPositionInLine() const;
+	ANTLR_MARKER get_tokenStartCharIndex() const;
+	StringType& get_text();
+	InputStreamsType& get_streams();
+
+	void  set_following( const FollowingType& following );
+	void  set_sizeHint( ANTLR_UINT32 sizeHint );
+	void  set_error( bool error );
+	void  set_errorRecovery( bool errorRecovery );
+	void  set_failed( bool failed );
+	void  set_token_present(bool token_present);
+	void  set_lastErrorIndex( ANTLR_MARKER lastErrorIndex );
+	void  set_errorCount( ANTLR_UINT32 errorCount );
+	void  set_backtracking( ANTLR_INT32 backtracking );
+	void  set_ruleMemo( RuleMemoType* ruleMemo );
+	void  set_tokenNames( ANTLR_UINT8** tokenNames );
+	void  set_tokSource( TokenSourceType* tokSource );
+	void  set_channel( ANTLR_UINT32 channel );
+	void  set_exception( ExceptionBaseType* exception );
+	void  set_type( ANTLR_UINT32 type );
+	void  set_token( const CommonTokenType* tok);
+	void  set_tokenStartLine( ANTLR_INT32 tokenStartLine );
+	void  set_tokenStartCharPositionInLine( ANTLR_INT32 tokenStartCharPositionInLine );
+	void  set_tokenStartCharIndex( ANTLR_MARKER tokenStartCharIndex );
+	void  set_text( const StringType& text );
+	void  set_streams( const InputStreamsType& streams );
+
+	void inc_errorCount();
+	void inc_backtracking();
+	void dec_backtracking();
+};
+
+ANTLR_END_NAMESPACE()
+
+#include "antlr3recognizersharedstate.inl"
+
+#endif
+
+
diff --git a/runtime/Cpp/include/antlr3recognizersharedstate.inl b/runtime/Cpp/include/antlr3recognizersharedstate.inl
new file mode 100755
index 0000000..8d9cc7f
--- /dev/null
+++ b/runtime/Cpp/include/antlr3recognizersharedstate.inl
@@ -0,0 +1,267 @@
+ANTLR_BEGIN_NAMESPACE()
+
+template<class ImplTraits, class StreamType>
+RecognizerSharedState<ImplTraits, StreamType>::RecognizerSharedState()
+{
+	m_exception = NULL;
+	m_sizeHint = 0;
+	m_error = false;
+	m_errorRecovery = false;
+	m_failed = false;
+	m_lastErrorIndex = 0;
+	m_errorCount = 0;
+	m_backtracking = false;
+	m_ruleMemo = NULL;
+	m_tokenNames = NULL;
+	m_tokSource = NULL;
+	m_channel = 0;
+	m_type = 0;
+	m_tokenStartLine = 0;
+	m_tokenStartCharPositionInLine = 0;
+	m_tokenStartCharIndex = 0;
+}
+
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE typename RecognizerSharedState<ImplTraits, StreamType>::FollowingType& RecognizerSharedState<ImplTraits, StreamType>::get_following()
+{
+	return m_following;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE ANTLR_UINT32 RecognizerSharedState<ImplTraits, StreamType>::get_sizeHint() const
+{
+	return m_sizeHint;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE bool RecognizerSharedState<ImplTraits, StreamType>::get_error() const
+{
+	return m_error;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE typename RecognizerSharedState<ImplTraits, StreamType>::ExceptionBaseType* 
+RecognizerSharedState<ImplTraits, StreamType>::get_exception() const
+{
+	return m_exception;
+}
+
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE bool RecognizerSharedState<ImplTraits, StreamType>::get_errorRecovery() const
+{
+	return m_errorRecovery;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE bool RecognizerSharedState<ImplTraits, StreamType>::get_failed() const
+{
+	return m_failed;
+}
+
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE bool RecognizerSharedState<ImplTraits, StreamType>::get_token_present() const
+{
+	return m_token_present;
+}
+
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE ANTLR_MARKER RecognizerSharedState<ImplTraits, StreamType>::get_lastErrorIndex() const
+{
+	return m_lastErrorIndex;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE ANTLR_UINT32 RecognizerSharedState<ImplTraits, StreamType>::get_errorCount() const
+{
+	return m_errorCount;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE ANTLR_INT32 RecognizerSharedState<ImplTraits, StreamType>::get_backtracking() const
+{
+	return m_backtracking;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE typename RecognizerSharedState<ImplTraits, StreamType>::RuleMemoType* RecognizerSharedState<ImplTraits, StreamType>::get_ruleMemo() const
+{
+	return m_ruleMemo;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE ANTLR_UINT8** RecognizerSharedState<ImplTraits, StreamType>::get_tokenNames() const
+{
+	return m_tokenNames;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE ANTLR_UINT8* RecognizerSharedState<ImplTraits, StreamType>::get_tokenName( ANTLR_UINT32 i ) const
+{
+	return m_tokenNames[i];
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE typename RecognizerSharedState<ImplTraits, StreamType>::CommonTokenType* RecognizerSharedState<ImplTraits, StreamType>::get_token()
+{
+	return &m_token;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE typename RecognizerSharedState<ImplTraits, StreamType>::TokenSourceType* RecognizerSharedState<ImplTraits, StreamType>::get_tokSource() const
+{
+	return m_tokSource;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE ANTLR_UINT32& RecognizerSharedState<ImplTraits, StreamType>::get_channel()
+{
+	return m_channel;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE ANTLR_UINT32 RecognizerSharedState<ImplTraits, StreamType>::get_type() const
+{
+	return m_type;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE ANTLR_INT32 RecognizerSharedState<ImplTraits, StreamType>::get_tokenStartLine() const
+{
+	return m_tokenStartLine;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE ANTLR_INT32 RecognizerSharedState<ImplTraits, StreamType>::get_tokenStartCharPositionInLine() const
+{
+	return m_tokenStartCharPositionInLine;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE ANTLR_MARKER RecognizerSharedState<ImplTraits, StreamType>::get_tokenStartCharIndex() const
+{
+	return m_tokenStartCharIndex;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE typename RecognizerSharedState<ImplTraits, StreamType>::StringType& RecognizerSharedState<ImplTraits, StreamType>::get_text()
+{
+	return m_text;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE typename RecognizerSharedState<ImplTraits, StreamType>::StreamsType& RecognizerSharedState<ImplTraits, StreamType>::get_streams()
+{
+	return m_streams;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE void RecognizerSharedState<ImplTraits, StreamType>::set_exception( ExceptionBaseType* exception )
+{
+	m_exception = exception;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE void RecognizerSharedState<ImplTraits, StreamType>::set_following( const FollowingType& following )
+{
+	m_following = following;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE void RecognizerSharedState<ImplTraits, StreamType>::set_sizeHint( ANTLR_UINT32 sizeHint )
+{
+	m_sizeHint = sizeHint;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE void RecognizerSharedState<ImplTraits, StreamType>::set_error( bool error )
+{
+	m_error = error;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE void RecognizerSharedState<ImplTraits, StreamType>::set_errorRecovery( bool errorRecovery )
+{
+	m_errorRecovery = errorRecovery;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE void RecognizerSharedState<ImplTraits, StreamType>::set_failed( bool failed )
+{
+	m_failed = failed;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE void  RecognizerSharedState<ImplTraits, StreamType>::set_token_present(bool token_present)
+{
+	m_token_present = token_present;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE void RecognizerSharedState<ImplTraits, StreamType>::set_lastErrorIndex( ANTLR_MARKER lastErrorIndex )
+{
+	m_lastErrorIndex = lastErrorIndex;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE void RecognizerSharedState<ImplTraits, StreamType>::set_errorCount( ANTLR_UINT32 errorCount )
+{
+	m_errorCount = errorCount;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE void RecognizerSharedState<ImplTraits, StreamType>::set_backtracking( ANTLR_INT32 backtracking )
+{
+	m_backtracking = backtracking;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE void RecognizerSharedState<ImplTraits, StreamType>::set_ruleMemo( RuleMemoType* ruleMemo )
+{
+	m_ruleMemo = ruleMemo;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE void RecognizerSharedState<ImplTraits, StreamType>::set_tokenNames( ANTLR_UINT8** tokenNames )
+{
+	m_tokenNames = tokenNames;
+}
+
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE void RecognizerSharedState<ImplTraits, StreamType>::set_tokSource( TokenSourceType* tokSource )
+{
+	m_tokSource = tokSource;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE void RecognizerSharedState<ImplTraits, StreamType>::set_channel( ANTLR_UINT32 channel )
+{
+	m_channel = channel;
+}
+
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE void  RecognizerSharedState<ImplTraits, StreamType>::set_token(const CommonTokenType* tok)
+{
+	this->set_token_present( tok != NULL );
+	if( tok != NULL )
+		m_token = *tok;
+}
+
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE void RecognizerSharedState<ImplTraits, StreamType>::set_type( ANTLR_UINT32 type )
+{
+	m_type = type;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE void RecognizerSharedState<ImplTraits, StreamType>::set_tokenStartLine( ANTLR_INT32 tokenStartLine )
+{
+	m_tokenStartLine = tokenStartLine;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE void RecognizerSharedState<ImplTraits, StreamType>::set_tokenStartCharPositionInLine( ANTLR_INT32 tokenStartCharPositionInLine )
+{
+	m_tokenStartCharPositionInLine = tokenStartCharPositionInLine;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE void RecognizerSharedState<ImplTraits, StreamType>::set_tokenStartCharIndex( ANTLR_MARKER tokenStartCharIndex )
+{
+	m_tokenStartCharIndex = tokenStartCharIndex;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE void RecognizerSharedState<ImplTraits, StreamType>::set_text( const StringType& text )
+{
+	m_text = text;
+}
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE void RecognizerSharedState<ImplTraits, StreamType>::set_streams( const InputStreamsType& streams )
+{
+	m_streams = streams;
+}
+
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE void RecognizerSharedState<ImplTraits, StreamType>::inc_errorCount()
+{
+	++m_errorCount;
+}
+
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE void RecognizerSharedState<ImplTraits, StreamType>::inc_backtracking()
+{
+	++m_backtracking;
+}
+
+template<class ImplTraits, class StreamType>
+ANTLR_INLINE void RecognizerSharedState<ImplTraits, StreamType>::dec_backtracking()
+{
+	--m_backtracking;
+}
+
+ANTLR_END_NAMESPACE()
diff --git a/runtime/Cpp/include/antlr3rewritestreams.hpp b/runtime/Cpp/include/antlr3rewritestreams.hpp
new file mode 100755
index 0000000..e89d70a
--- /dev/null
+++ b/runtime/Cpp/include/antlr3rewritestreams.hpp
@@ -0,0 +1,254 @@
+#ifndef	ANTLR3REWRITESTREAM_HPP
+#define	ANTLR3REWRITESTREAM_HPP
+
+// [The "BSD licence"]
+// Copyright (c) 2005-2009 Gokulakannan Somasundaram, ElectronDB
+
+//
+// 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.
+
+#include    "antlr3defs.hpp"
+
+/// A generic list of elements tracked in an alternative to be used in
+/// a -> rewrite rule.  
+///
+/// In the C implementation, all tree oriented streams return a pointer to 
+/// the same type: pANTLR3_BASE_TREE. Anything that has subclassed from this
+/// still passes this type, within which there is a super pointer, which points
+/// to it's own data and methods. Hence we do not need to implement this as
+/// the equivalent of an abstract class, but just fill in the appropriate interface
+/// as usual with this model.
+///
+/// Once you start next()ing, do not try to add more elements.  It will
+/// break the cursor tracking I believe.
+///
+/// 
+/// \see #pANTLR3_REWRITE_RULE_NODE_STREAM
+/// \see #pANTLR3_REWRITE_RULE_ELEMENT_STREAM
+/// \see #pANTLR3_REWRITE_RULE_SUBTREE_STREAM
+///
+/// TODO: add mechanism to detect/puke on modification after reading from stream
+///
+ANTLR_BEGIN_NAMESPACE()
+
+template<class ImplTraits, class SuperType>
+class RewriteRuleElementStream  : public ImplTraits::AllocPolicyType
+{
+public:
+	typedef typename ImplTraits::TreeType TreeType;
+	typedef typename ImplTraits::AllocPolicyType AllocPolicyType;
+	typedef typename ImplTraits::TreeAdaptorType TreeAdaptorType;
+
+	typedef typename ImplTraits::template RecognizerType< typename SuperType::StreamType > RecognizerType;
+	typedef typename ImplTraits::StringType StringType;
+	typedef typename SuperType::TokenType TokenType; 
+	typedef typename AllocPolicyType::template VectorType< TokenType* > ElementsType;
+
+protected:
+	/// Track single elements w/o creating a list.  Upon 2nd add, alloc list 
+    ///
+    TokenType*			m_singleElement;
+
+    /// The list of tokens or subtrees we are tracking 
+    ///
+    ElementsType		m_elements;
+
+    /// The element or stream description; usually has name of the token or
+    /// rule reference that this list tracks.  Can include rulename too, but
+    /// the exception would track that info.
+    ///
+    StringType			m_elementDescription;
+
+	/// Pointer to the tree adaptor in use for this stream
+	///
+    TreeAdaptorType*	m_adaptor;
+
+	// Pointer to the recognizer shared state to which this stream belongs
+	//
+	RecognizerType*			m_rec;
+
+	/// Cursor 0..n-1.  If singleElement!=NULL, cursor is 0 until you next(),
+    /// which bumps it to 1 meaning no more elements.
+    ///
+    ANTLR_UINT32		m_cursor;
+
+	/// Once a node / subtree has been used in a stream, it must be dup'ed
+	/// from then on.  Streams are reset after sub rules so that the streams
+	/// can be reused in future sub rules.  So, reset must set a dirty bit.
+	/// If dirty, then next() always returns a dup.
+	///
+	bool				m_dirty;
+
+public:
+	RewriteRuleElementStream(TreeAdaptorType* adaptor, RecognizerType* rec, ANTLR_UINT8* description);
+	RewriteRuleElementStream(TreeAdaptorType* adaptor, RecognizerType* rec, ANTLR_UINT8* description, TokenType* oneElement);
+	RewriteRuleElementStream(TreeAdaptorType* adaptor, RecognizerType* rec, ANTLR_UINT8* description, const ElementsType& elements);
+
+	~RewriteRuleElementStream();
+    //   Methods 
+
+    /// Reset the condition of this stream so that it appears we have
+    ///  not consumed any of its elements.  Elements themselves are untouched.
+    ///
+    void	reset(); 
+
+    /// Add a new pANTLR3_BASE_TREE to this stream
+    ///
+    void	add(TokenType* el);
+
+    /// Return the next element in the stream.  If out of elements, throw
+    /// an exception unless size()==1.  If size is 1, then return elements[0].
+    ///
+	TokenType*	next();
+    TreeType*	nextTree();
+    TokenType*	nextToken();
+    TokenType*	_next();
+
+	/// When constructing trees, sometimes we need to dup a token or AST
+    ///	subtree.  Dup'ing a token means just creating another AST node
+    /// around it.  For trees, you must call the adaptor.dupTree().
+    ///
+	TokenType* dup( TokenType* el );
+
+    /// Ensure stream emits trees; tokens must be converted to AST nodes.
+    /// AST nodes can be passed through unmolested.
+    ///
+    TreeType*	toTree(TreeType* el);
+
+    /// Returns true if there is a next element available
+    ///
+    bool	hasNext();
+
+    /// Treat next element as a single node even if it's a subtree.
+    /// This is used instead of next() when the result has to be a
+    /// tree root node.  Also prevents us from duplicating recently-added
+    /// children; e.g., ^(type ID)+ adds ID to type and then 2nd iteration
+    /// must dup the type node, but ID has been added.
+    ///
+    /// Referencing to a rule result twice is ok; dup entire tree as
+    /// we can't be adding trees; e.g., expr expr. 
+    ///
+    TreeType*	nextNode();
+
+    /// Number of elements available in the stream
+    ///
+    ANTLR_UINT32	size();
+
+    /// Returns the description string if there is one available (check for NULL).
+    ///
+    StringType getDescription();
+
+protected:
+	void init(TreeAdaptorType* adaptor, RecognizerType* rec, ANTLR_UINT8* description);
+};
+
+/// This is an implementation of a token stream, which is basically an element
+///  stream that deals with tokens only.
+///
+template<class ImplTraits>
+class RewriteRuleTokenStream : public ImplTraits::template RewriteRuleElementStreamType< typename ImplTraits::ParserType> 
+{
+public:
+	typedef typename ImplTraits::AllocPolicyType AllocPolicyType;
+	typedef typename ImplTraits::TreeAdaptorType TreeAdaptorType;
+	typedef typename ImplTraits::ParserType ComponentType;
+	typedef typename ComponentType::StreamType StreamType;
+	typedef typename ImplTraits::CommonTokenType TokenType;
+	typedef typename ImplTraits::TreeType TreeType;
+	typedef typename AllocPolicyType::template VectorType< TokenType* > ElementsType;
+	typedef typename ImplTraits::template RecognizerType< StreamType > RecognizerType;
+	typedef typename ImplTraits::template RewriteRuleElementStreamType< typename ImplTraits::ParserType> BaseType;
+
+public:
+	RewriteRuleTokenStream(TreeAdaptorType* adaptor, RecognizerType* rec, ANTLR_UINT8* description);
+	RewriteRuleTokenStream(TreeAdaptorType* adaptor, RecognizerType* rec, ANTLR_UINT8* description, TokenType* oneElement);
+	RewriteRuleTokenStream(TreeAdaptorType* adaptor, RecognizerType* rec, ANTLR_UINT8* description, const ElementsType& elements);
+	TreeType*	nextNode();
+
+private:
+	TreeType*	nextNodeToken();
+};
+
+/// This is an implementation of a subtree stream which is a set of trees
+///  modelled as an element stream.
+///
+template<class ImplTraits>
+class RewriteRuleSubtreeStream : public ImplTraits::template RewriteRuleElementStreamType< typename ImplTraits::TreeParserType> 
+{
+public:
+	typedef typename ImplTraits::AllocPolicyType AllocPolicyType;
+	typedef typename ImplTraits::TreeAdaptorType TreeAdaptorType;
+	typedef typename ImplTraits::TreeParserType ComponentType;
+	typedef typename ComponentType::StreamType StreamType;
+	typedef typename ImplTraits::TreeType TreeType;
+	typedef TreeType TokenType;
+	typedef typename ImplTraits::template RecognizerType< StreamType > RecognizerType;
+	typedef typename AllocPolicyType::template VectorType< TokenType* > ElementsType;
+	typedef typename ImplTraits::template RewriteRuleElementStreamType< typename ImplTraits::TreeParserType>  BaseType;
+
+public:
+	RewriteRuleSubtreeStream(TreeAdaptorType* adaptor, RecognizerType* rec, ANTLR_UINT8* description);
+	RewriteRuleSubtreeStream(TreeAdaptorType* adaptor, RecognizerType* rec, ANTLR_UINT8* description, TokenType* oneElement);
+	RewriteRuleSubtreeStream(TreeAdaptorType* adaptor, RecognizerType* rec, ANTLR_UINT8* description, const ElementsType& elements);
+
+	TreeType* dup( TreeType* el );
+
+private:
+	TreeType* dupTree( TreeType* el );
+};
+
+/// This is an implementation of a node stream, which is basically an element
+///  stream that deals with tree nodes only.
+///
+template<class ImplTraits>
+class RewriteRuleNodeStream : public ImplTraits::template RewriteRuleElementStreamType< typename ImplTraits::TreeParserType> 
+{
+public:
+	typedef typename ImplTraits::AllocPolicyType AllocPolicyType;
+	typedef typename ImplTraits::TreeAdaptorType TreeAdaptorType;
+	typedef typename ImplTraits::TreeParserType ComponentType;
+	typedef typename ComponentType::StreamType StreamType;
+	typedef typename ImplTraits::TreeType TreeType;
+	typedef TreeType TokenType;	
+	typedef typename ImplTraits::template RecognizerType< StreamType > RecognizerType;
+	typedef typename AllocPolicyType::template VectorType< TokenType* > ElementsType;
+	typedef typename ImplTraits::template RewriteRuleElementStreamType< typename ImplTraits::TreeParserType>  BaseType;
+
+public:
+	RewriteRuleNodeStream(TreeAdaptorType* adaptor, RecognizerType* rec, ANTLR_UINT8* description);
+	RewriteRuleNodeStream(TreeAdaptorType* adaptor, RecognizerType* rec, ANTLR_UINT8* description, TokenType* oneElement);
+	RewriteRuleNodeStream(TreeAdaptorType* adaptor, RecognizerType* rec, ANTLR_UINT8* description, const ElementsType& elements);
+
+	TreeType*	toTree(TreeType* element);
+
+private:
+	TreeType*	toTreeNode(TreeType* element);
+};
+
+ANTLR_END_NAMESPACE()
+
+#include "antlr3rewritestreams.inl"
+
+#endif
diff --git a/runtime/Cpp/include/antlr3rewritestreams.inl b/runtime/Cpp/include/antlr3rewritestreams.inl
new file mode 100755
index 0000000..3303e8c
--- /dev/null
+++ b/runtime/Cpp/include/antlr3rewritestreams.inl
@@ -0,0 +1,374 @@
+ANTLR_BEGIN_NAMESPACE()
+
+template<class ImplTraits, class SuperType>
+RewriteRuleElementStream<ImplTraits, SuperType>::RewriteRuleElementStream(TreeAdaptorType* adaptor, 
+													RecognizerType* rec, ANTLR_UINT8* description)
+{
+	this->init(adaptor, rec, description);
+}
+
+template<class ImplTraits, class SuperType>
+RewriteRuleElementStream<ImplTraits, SuperType>::RewriteRuleElementStream(TreeAdaptorType* adaptor, 
+								RecognizerType* rec, ANTLR_UINT8* description, TokenType* oneElement)
+{
+	this->init(adaptor, rec, description);
+	if( oneElement != NULL )
+		this->add( oneElement );
+}
+
+template<class ImplTraits, class SuperType>
+RewriteRuleElementStream<ImplTraits, SuperType>::RewriteRuleElementStream(TreeAdaptorType* adaptor, 
+						RecognizerType* rec, ANTLR_UINT8* description, const ElementsType& elements)
+						:m_elements(elements)
+{
+	this->init(adaptor, rec, description);
+}
+
+template<class ImplTraits, class SuperType>
+void RewriteRuleElementStream<ImplTraits, SuperType>::init(TreeAdaptorType* adaptor, 
+								RecognizerType* rec, ANTLR_UINT8* description)
+{
+	m_rec = rec;
+	m_adaptor = adaptor;
+	m_cursor  = 0;
+	m_dirty	  = false;
+	m_singleElement = NULL;
+}
+
+template<class ImplTraits>
+RewriteRuleTokenStream<ImplTraits>::RewriteRuleTokenStream(TreeAdaptorType* adaptor, 
+							    RecognizerType* rec, ANTLR_UINT8* description)
+                                                              :BaseType(adaptor, rec, description)
+{
+}
+
+template<class ImplTraits>
+RewriteRuleTokenStream<ImplTraits>::RewriteRuleTokenStream(TreeAdaptorType* adaptor, RecognizerType* rec, 
+							    ANTLR_UINT8* description, TokenType* oneElement)
+							:BaseType(adaptor, rec, description, oneElement)
+{
+}
+
+template<class ImplTraits>
+RewriteRuleTokenStream<ImplTraits>::RewriteRuleTokenStream(TreeAdaptorType* adaptor, 
+						RecognizerType* rec, ANTLR_UINT8* description, const ElementsType& elements)
+						:BaseType(adaptor, rec, description, elements)
+{
+}
+
+template<class ImplTraits>
+RewriteRuleSubtreeStream<ImplTraits>::RewriteRuleSubtreeStream(TreeAdaptorType* adaptor, 
+								RecognizerType* rec, ANTLR_UINT8* description)
+						 :BaseType(adaptor, rec, description)
+{
+}
+
+template<class ImplTraits>
+RewriteRuleSubtreeStream<ImplTraits>::RewriteRuleSubtreeStream(TreeAdaptorType* adaptor, RecognizerType* rec, 
+								ANTLR_UINT8* description, TokenType* oneElement)
+							:BaseType(adaptor, rec, description, oneElement)
+{
+}
+
+template<class ImplTraits>
+RewriteRuleSubtreeStream<ImplTraits>::RewriteRuleSubtreeStream(TreeAdaptorType* adaptor, 
+						RecognizerType* rec, ANTLR_UINT8* description, const ElementsType& elements)
+						:BaseType(adaptor, rec, description, elements)
+{
+}
+
+template<class ImplTraits>
+RewriteRuleNodeStream<ImplTraits>::RewriteRuleNodeStream(TreeAdaptorType* adaptor, 
+							 RecognizerType* rec, ANTLR_UINT8* description)
+						:BaseType(adaptor, rec, description)
+{
+}
+
+template<class ImplTraits>
+RewriteRuleNodeStream<ImplTraits>::RewriteRuleNodeStream(TreeAdaptorType* adaptor, RecognizerType* rec, 
+							ANTLR_UINT8* description, TokenType* oneElement)
+						:BaseType(adaptor, rec, description, oneElement)
+{
+}
+
+template<class ImplTraits>
+RewriteRuleNodeStream<ImplTraits>::RewriteRuleNodeStream(TreeAdaptorType* adaptor, 
+						RecognizerType* rec, ANTLR_UINT8* description, const ElementsType& elements)
+						:BaseType(adaptor, rec, description, elements)
+{
+}
+
+template<class ImplTraits, class SuperType>
+void	RewriteRuleElementStream<ImplTraits, SuperType>::reset()
+{
+	m_dirty = true;
+	m_cursor = 0;
+}
+
+template<class ImplTraits, class SuperType>
+void	RewriteRuleElementStream<ImplTraits, SuperType>::add(TokenType* el)
+{
+	if ( el== NULL ) 
+		return;
+
+	if ( !m_elements.empty() ) 
+	{ 
+		// if in list, just add
+		m_elements.push_back(el);
+		return;
+	}
+		
+	if ( m_singleElement == NULL ) 
+	{ 
+		// no elements yet, track w/o list
+		m_singleElement = el;
+		return;
+	}
+
+	// adding 2nd element, move to list
+	m_elements.push_back(m_singleElement);
+	m_singleElement = NULL;
+	m_elements.push_back(el);
+}
+
+template<class ImplTraits, class SuperType>
+typename RewriteRuleElementStream<ImplTraits, SuperType>::TokenType*  
+RewriteRuleElementStream<ImplTraits, SuperType>::_next()
+{
+	ANTLR_UINT32		n;
+	TreeType*	t;
+
+	n = this->size();
+
+	if (n == 0)
+	{
+		// This means that the stream is empty
+		//
+		return NULL;	// Caller must cope with this
+	}
+
+	// Traversed all the available elements already?
+	//
+	if ( m_cursor >= n)
+	{
+		if (n == 1)
+		{
+			// Special case when size is single element, it will just dup a lot
+			//
+			return this->toTree(m_singleElement);
+		}
+
+		// Out of elements and the size is not 1, so we cannot assume
+		// that we just duplicate the entry n times (such as ID ent+ -> ^(ID ent)+)
+		// This means we ran out of elements earlier than was expected.
+		//
+		return NULL;	// Caller must cope with this
+	}
+
+	// Elements available either for duping or just available
+	//
+	if ( m_singleElement != NULL)
+	{
+		m_cursor++;   // Cursor advances even for single element as this tells us to dup()
+		return this->toTree(m_singleElement);
+	}
+
+	// More than just a single element so we extract it from the 
+	// vector.
+	//
+	t = this->toTree( m_elements.at(m_cursor));
+	m_cursor++;
+	return t;
+}
+
+template<class ImplTraits, class SuperType>
+typename RewriteRuleElementStream<ImplTraits, SuperType>::TreeType*  
+RewriteRuleElementStream<ImplTraits, SuperType>::nextTree()
+{
+	ANTLR_UINT32		n;
+	TreeType*  el;
+
+	n = this->size();
+
+	if ( m_dirty || ( (m_cursor >=n) && (n==1)) ) 
+	{
+		// if out of elements and size is 1, dup
+		//
+		el = this->_next();
+		return this->dup(el);
+	}
+
+	// test size above then fetch
+	//
+	el = this->_next();
+	return el;
+}
+
+template<class ImplTraits, class SuperType>
+typename RewriteRuleElementStream<ImplTraits, SuperType>::TokenType*	
+RewriteRuleElementStream<ImplTraits, SuperType>::nextToken()
+{
+	return this->_next();
+}
+
+template<class ImplTraits, class SuperType>
+typename RewriteRuleElementStream<ImplTraits, SuperType>::TokenType*		
+RewriteRuleElementStream<ImplTraits, SuperType>::next()
+{
+	ANTLR_UINT32   s;
+	s = this->size();
+	if ( (m_cursor >= s) && (s == 1) )
+	{
+		TreeType* el;
+		el = this->_next();
+		return	this->dup(el);
+	}
+	return this->_next();
+}
+
+template<class ImplTraits>
+typename RewriteRuleSubtreeStream<ImplTraits>::TreeType*	
+RewriteRuleSubtreeStream<ImplTraits>::dup(TreeType* element)
+{
+	return this->dupTree(element);
+}
+
+template<class ImplTraits>
+typename RewriteRuleSubtreeStream<ImplTraits>::TreeType*	
+RewriteRuleSubtreeStream<ImplTraits>::dupTree(TreeType* element)
+{
+	return BaseType::m_adaptor->dupNode(element);
+}
+
+template<class ImplTraits, class SuperType>
+typename RewriteRuleElementStream<ImplTraits, SuperType>::TreeType*	
+RewriteRuleElementStream<ImplTraits, SuperType>::toTree( TreeType* element)
+{
+	return element;
+}
+
+template<class ImplTraits>
+typename RewriteRuleNodeStream<ImplTraits>::TreeType*	
+RewriteRuleNodeStream<ImplTraits>::toTree(TreeType* element)
+{
+	return this->toTreeNode(element);
+}
+
+template<class ImplTraits>
+typename RewriteRuleNodeStream<ImplTraits>::TreeType*	
+RewriteRuleNodeStream<ImplTraits>::toTreeNode(TreeType* element)
+{
+	return BaseType::m_adaptor->dupNode(element);
+}
+
+template<class ImplTraits, class SuperType>
+bool RewriteRuleElementStream<ImplTraits, SuperType>::hasNext()
+{
+	if (	((m_singleElement != NULL) && (m_cursor < 1))
+		||	 ( !m_elements.empty() && m_cursor < m_elements.size()))
+	{
+		return true;
+	}
+	else
+	{
+		return false;
+	}
+}
+
+template<class ImplTraits >
+typename RewriteRuleTokenStream<ImplTraits>::TreeType*
+RewriteRuleTokenStream<ImplTraits>::nextNode()
+{
+	return this->nextNodeToken();
+}
+
+template<class ImplTraits>
+typename RewriteRuleTokenStream<ImplTraits>::TreeType*
+RewriteRuleTokenStream<ImplTraits>::nextNodeToken()
+{
+	return BaseType::m_adaptor->create(this->_next());
+}
+
+/// Number of elements available in the stream
+///
+template<class ImplTraits, class SuperType>
+ANTLR_UINT32	RewriteRuleElementStream<ImplTraits, SuperType>::size()
+{
+	ANTLR_UINT32   n = 0;
+
+	/// Should be a count of one if singleElement is set. I copied this
+	/// logic from the java implementation, which I suspect is just guarding
+	/// against someone setting singleElement and forgetting to NULL it out
+	///
+	if ( m_singleElement != NULL)
+	{
+		n = 1;
+	}
+	else
+	{
+		if ( !m_elements.empty() )
+		{
+			return (ANTLR_UINT32)(m_elements.size());
+		}
+	}
+	return n;
+
+}
+
+template<class ImplTraits, class SuperType>
+typename RewriteRuleElementStream<ImplTraits, SuperType>::StringType
+RewriteRuleElementStream<ImplTraits, SuperType>::getDescription()
+{
+	if ( m_elementDescription.empty() )
+	{
+		m_elementDescription = "<unknown source>";
+	}
+	return  m_elementDescription;
+}
+
+template<class ImplTraits, class SuperType>
+RewriteRuleElementStream<ImplTraits, SuperType>::~RewriteRuleElementStream()
+{
+	TreeType* tree;
+
+    // Before placing the stream back in the pool, we
+	// need to clear any vector it has. This is so any
+	// free pointers that are associated with the
+	// entires are called. However, if this particular function is called
+    // then we know that the entries in the stream are definately
+    // tree nodes. Hence we check to see if any of them were nilNodes as
+    // if they were, we can reuse them.
+	//
+	if	( !m_elements.empty() )
+	{
+        // We have some elements to traverse
+        //
+        ANTLR_UINT32 i;
+
+        for (i = 1; i<= m_elements.size(); i++)
+        {
+            tree = m_elements.at(i-1);
+            if  ( (tree != NULL) && tree->isNilNode() )
+            {
+                // Had to remove this for now, check is not comprehensive enough
+                // tree->reuse(tree);
+            }
+        }
+		m_elements.clear();
+	}
+	else
+	{
+        if  (m_singleElement != NULL)
+        {
+            tree = m_singleElement;
+            if  (tree->isNilNode())
+            {
+                // Had to remove this for now, check is not comprehensive enough
+              //   tree->reuse(tree);
+            }
+        }
+        m_singleElement = NULL;
+	}
+}
+
+ANTLR_END_NAMESPACE()
diff --git a/runtime/Cpp/include/antlr3tokenstream.hpp b/runtime/Cpp/include/antlr3tokenstream.hpp
new file mode 100755
index 0000000..421ba7f
--- /dev/null
+++ b/runtime/Cpp/include/antlr3tokenstream.hpp
@@ -0,0 +1,408 @@
+/** \file
+ * Defines the interface for an ANTLR3 common token stream. Custom token streams should create
+ * one of these and then override any functions by installing their own pointers
+ * to implement the various functions.
+ */
+#ifndef	_ANTLR3_TOKENSTREAM_HPP
+#define	_ANTLR3_TOKENSTREAM_HPP
+
+// [The "BSD licence"]
+// Copyright (c) 2005-2009 Gokulakannan Somasundaram, ElectronDB
+
+//
+// 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.
+
+#include    "antlr3defs.hpp"
+
+/** Definition of a token source, which has a pointer to a function that
+ *  returns the next token (using a token factory if it is going to be
+ *  efficient) and a pointer to an ANTLR3_INPUT_STREAM. This is slightly
+ *  different to the Java interface because we have no way to implement
+ *  multiple interfaces without defining them in the interface structure
+ *  or casting (void *), which is too convoluted.
+ */
+ANTLR_BEGIN_NAMESPACE()
+
+//We are not making it subclass AllocPolicy, as this will always be a base class
+template<class ImplTraits>
+class TokenSource
+{
+public:
+	typedef typename ImplTraits::CommonTokenType TokenType;
+	typedef TokenType CommonTokenType;
+	typedef typename ImplTraits::StringType StringType;
+	typedef typename ImplTraits::LexerType LexerType;
+
+private:
+    /** A special pre-allocated token, which signifies End Of Tokens. Because this must
+     *  be set up with the current input index and so on, we embed the structure and
+     *  return the address of it. It is marked as factoryMade, so that it is never
+     *  attempted to be freed.
+     */
+    TokenType				m_eofToken;
+
+	/// A special pre-allocated token, which is returned by mTokens() if the
+	/// lexer rule said to just skip the generated token altogether.
+	/// Having this single token stops us wasting memory by have the token factory
+	/// actually create something that we are going to SKIP(); anyway.
+	///
+	TokenType				m_skipToken;
+
+    /** When the token source is constructed, it is populated with the file
+     *  name from whence the tokens were produced by the lexer. This pointer is a
+     *  copy of the one supplied by the CharStream (and may be NULL) so should
+     *  not be manipulated other than to copy or print it.
+     */
+    StringType				m_fileName;
+
+public:
+	TokenType& get_eofToken();
+	const TokenType& get_eofToken() const;
+	TokenType& get_skipToken();
+	StringType& get_fileName();
+	LexerType* get_super();
+
+	void set_fileName( const StringType& fileName );
+
+	/**
+	 * \brief
+	 * Default implementation of the nextToken() call for a lexer.
+	 *
+	 * \param toksource
+	 * Points to the implementation of a token source. The lexer is
+	 * addressed by the super structure pointer.
+	 *
+	 * \returns
+	 * The next token in the current input stream or the EOF token
+	 * if there are no more tokens in any input stream in the stack.
+	 *
+	 * Write detailed description for nextToken here.
+	 *
+	 * \remarks
+	 * Write remarks for nextToken here.
+	 *
+	 * \see nextTokenStr
+	 */
+    TokenType*  nextToken();
+	CommonTokenType* nextToken( BoolForwarder<true> /*isFiltered*/ );
+	CommonTokenType* nextToken( BoolForwarder<false> /*isFiltered*/ );
+
+	///
+	/// \brief
+	/// Returns the next available token from the current input stream.
+	///
+	/// \param toksource
+	/// Points to the implementation of a token source. The lexer is
+	/// addressed by the super structure pointer.
+	///
+	/// \returns
+	/// The next token in the current input stream or the EOF token
+	/// if there are no more tokens.
+	///
+	/// \remarks
+	/// Write remarks for nextToken here.
+	///
+	/// \see nextToken
+	///
+	TokenType*	nextTokenStr();
+
+protected:
+	TokenSource();
+};
+
+/** Definition of the ANTLR3 common token stream interface.
+ * \remark
+ * Much of the documentation for this interface is stolen from Ter's Java implementation.
+ */
+template<class ImplTraits>
+class TokenStream  : public ImplTraits::TokenIntStreamType
+{
+public:
+	typedef typename ImplTraits::TokenSourceType TokenSourceType;
+	typedef typename ImplTraits::TokenIntStreamType IntStreamType;
+	typedef typename ImplTraits::CommonTokenType TokenType;
+	typedef TokenType UnitType;
+	typedef typename ImplTraits::StringType StringType;
+	typedef typename ImplTraits::DebugEventListenerType DebugEventListenerType;
+	typedef typename ImplTraits::TokenStreamType TokenStreamType;
+	typedef typename ImplTraits::ParserType ComponentType;
+
+protected:
+    /** Pointer to the token source for this stream
+     */
+    TokenSourceType*    m_tokenSource;
+
+	/// Debugger interface, is this is a debugging token stream
+	///
+	DebugEventListenerType*	m_debugger;
+
+	/// Indicates the initial stream state for dbgConsume()
+	///
+	bool				m_initialStreamState;
+
+public:
+	TokenStream(TokenSourceType* source, DebugEventListenerType* debugger);
+	IntStreamType* get_istream();
+	TokenSourceType* get_tokenSource() const;
+	void set_tokenSource( TokenSourceType* tokenSource );
+
+    /** Get Token at current input pointer + i ahead where i=1 is next Token.
+     *  i<0 indicates tokens in the past.  So -1 is previous token and -2 is
+     *  two tokens ago. LT(0) is undefined.  For i>=n, return Token.EOFToken.
+     *  Return null for LT(0) and any index that results in an absolute address
+     *  that is negative.
+     */
+    const TokenType*  _LT(ANTLR_INT32 k);
+
+    /** Where is this stream pulling tokens from?  This is not the name, but
+     *  a pointer into an interface that contains a ANTLR3_TOKEN_SOURCE interface.
+     *  The Token Source interface contains a pointer to the input stream and a pointer
+     *  to a function that returns the next token.
+     */
+    TokenSourceType*   getTokenSource();
+
+    /** Function that installs a token source for teh stream
+     */
+    void	setTokenSource(TokenSourceType*   tokenSource);
+
+    /** Return the text of all the tokens in the stream, as the old tramp in
+     *  Leeds market used to say; "Get the lot!"
+     */
+    StringType	toString();
+
+    /** Return the text of all tokens from start to stop, inclusive.
+     *  If the stream does not buffer all the tokens then it can just
+     *  return an empty ANTLR3_STRING or NULL;  Grammars should not access $ruleLabel.text in
+     *  an action in that case.
+     */
+    StringType	 toStringSS(ANTLR_MARKER start, ANTLR_MARKER stop);
+
+    /** Because the user is not required to use a token with an index stored
+     *  in it, we must provide a means for two token objects themselves to
+     *  indicate the start/end location.  Most often this will just delegate
+     *  to the other toString(int,int).  This is also parallel with
+     *  the pTREENODE_STREAM->toString(Object,Object).
+     */
+    StringType	 toStringTT(const TokenType* start, const TokenType* stop);
+
+
+    /** Function that sets the token stream into debugging mode
+     */
+    void	setDebugListener(DebugEventListenerType* debugger);
+
+	TokenStream();
+
+};
+
+/** Common token stream is an implementation of ANTLR_TOKEN_STREAM for the default
+ *  parsers and recognizers. You may of course build your own implementation if
+ *  you are so inclined.
+ */
+template<bool TOKENS_ACCESSED_FROM_OWNING_RULE, class ListType, class MapType>
+class TokenStoreSelector
+{
+public:
+	typedef ListType TokensType;
+};
+
+template<class ListType, class MapType>
+class TokenStoreSelector<true, ListType, MapType>
+{
+public:
+	typedef MapType TokensType;
+};
+
+template<class ImplTraits>
+class	CommonTokenStream : public TokenStream<ImplTraits>
+{
+public:
+	typedef typename ImplTraits::AllocPolicyType AllocPolicyType;
+	typedef typename ImplTraits::BitsetType BitsetType;
+	typedef typename ImplTraits::CommonTokenType TokenType;
+	typedef typename ImplTraits::TokenSourceType TokenSourceType;
+	typedef typename ImplTraits::DebugEventListenerType DebugEventListenerType;
+	typedef typename AllocPolicyType::template ListType<TokenType> TokensListType;
+	typedef typename AllocPolicyType::template OrderedMapType<ANTLR_MARKER, TokenType> TokensMapType;
+	typedef typename TokenStoreSelector< ImplTraits::TOKENS_ACCESSED_FROM_OWNING_RULE,
+	                                       TokensListType, TokensMapType >::TokensType TokensType;
+
+	typedef typename AllocPolicyType::template UnOrderedMapType<ANTLR_UINT32, ANTLR_UINT32> ChannelOverridesType;
+	typedef typename AllocPolicyType::template OrderedSetType<ANTLR_UINT32> DiscardSetType;
+	typedef typename AllocPolicyType::template ListType<ANTLR_UINT32> IntListType;
+	typedef TokenStream<ImplTraits> BaseType;
+
+private:
+    /** Records every single token pulled from the source indexed by the token index.
+     *  There might be more efficient ways to do this, such as referencing directly in to
+     *  the token factory pools, but for now this is convenient and the ANTLR3_LIST is not
+     *  a huge overhead as it only stores pointers anyway, but allows for iterations and
+     *  so on.
+     */
+    TokensType			m_tokens;
+
+    /** Override map of tokens. If a token type has an entry in here, then
+     *  the pointer in the table points to an int, being the override channel number
+     *  that should always be used for this token type.
+     */
+    ChannelOverridesType	m_channelOverrides;
+
+    /** Discared set. If a token has an entry in this table, then it is thrown
+     *  away (data pointer is always NULL).
+     */
+    DiscardSetType			m_discardSet;
+
+    /* The channel number that this token stream is tuned to. For instance, whitespace
+     * is usually tuned to channel 99, which no token stream would normally tune to and
+     * so it is thrown away.
+     */
+    ANTLR_UINT32			m_channel;
+
+	/** The index into the tokens list of the current token (the next one that will be
+     *  consumed. p = -1 indicates that the token list is empty.
+     */
+    ANTLR_INT32				m_p;
+
+	/* The total number of tokens issued till now. For streams that delete tokens,
+	   this helps in issuing the index
+	 */
+	ANTLR_UINT32			m_nissued;
+
+    /** If this flag is set to true, then tokens that the stream sees that are not
+     *  in the channel that this stream is tuned to, are not tracked in the
+     *  tokens table. When set to false, ALL tokens are added to the tracking.
+     */
+    bool					m_discardOffChannel;
+
+public:
+	CommonTokenStream(ANTLR_UINT32 hint, TokenSourceType* source = NULL,
+										DebugEventListenerType* debugger = NULL);
+	~CommonTokenStream();
+	TokensType& get_tokens();
+	const TokensType& get_tokens() const;
+	DiscardSetType& get_discardSet();
+	const DiscardSetType& get_discardSet() const;
+	ANTLR_INT32 get_p() const;
+	void set_p( ANTLR_INT32 p );
+	void inc_p();
+	void dec_p();
+
+    /** A simple filter mechanism whereby you can tell this token stream
+     *  to force all tokens of type ttype to be on channel.  For example,
+     *  when interpreting, we cannot exec actions so we need to tell
+     *  the stream to force all WS and NEWLINE to be a different, ignored
+     *  channel.
+     */
+    void setTokenTypeChannel(ANTLR_UINT32 ttype, ANTLR_UINT32 channel);
+
+    /** Add a particular token type to the discard set. If a token is found to belong
+     *  to this set, then it is skipped/thrown away
+     */
+    void discardTokenType(ANTLR_INT32 ttype);
+
+	//This will discard tokens of a particular rule after the rule execution completion
+	void discardTokens( ANTLR_MARKER start, ANTLR_MARKER stop );
+	void discardTokens( ANTLR_MARKER start, ANTLR_MARKER stop, 
+								BoolForwarder<true>  tokens_accessed_from_owning_rule  );
+	void discardTokens( ANTLR_MARKER start, ANTLR_MARKER stop, 
+								BoolForwarder<false>  tokens_accessed_from_owning_rule  );
+
+	void insertToken( const TokenType& tok );
+	void insertToken( const TokenType& tok, BoolForwarder<true>  tokens_accessed_from_owning_rule  );
+	void insertToken( const TokenType& tok, BoolForwarder<false>  tokens_accessed_from_owning_rule  );
+
+	/** Get a token at an absolute index i; 0..n-1.  This is really only
+     *  needed for profiling and debugging and token stream rewriting.
+     *  If you don't want to buffer up tokens, then this method makes no
+     *  sense for you.  Naturally you can't use the rewrite stream feature.
+     *  I believe DebugTokenStream can easily be altered to not use
+     *  this method, removing the dependency.
+     */
+    const TokenType*   get(ANTLR_MARKER i);
+	const TokenType*   getToken(ANTLR_MARKER i);
+	const TokenType* getToken( ANTLR_MARKER tok_idx, BoolForwarder<true>  tokens_accessed_from_owning_rule );
+	const TokenType* getToken( ANTLR_MARKER tok_idx, BoolForwarder<false>  tokens_accessed_from_owning_rule  );
+
+    /** Signal to discard off channel tokens from here on in.
+     */
+    void discardOffChannelToks(bool discard);
+
+    /** Function that returns a pointer to the ANTLR3_LIST of all tokens
+     *  in the stream (this causes the buffer to fill if we have not get any yet)
+     */
+    TokensType*	getTokens();
+
+    /** Function that returns all the tokens between a start and a stop index.
+     */
+    void getTokenRange(ANTLR_UINT32 start, ANTLR_UINT32 stop, TokensListType& tokenRange);
+
+    /** Function that returns all the tokens indicated by the specified bitset, within a range of tokens
+     */
+    void getTokensSet(ANTLR_UINT32 start, ANTLR_UINT32 stop, BitsetType* types, TokensListType& tokenSet);
+
+    /** Function that returns all the tokens indicated by being a member of the supplied List
+     */
+    void getTokensList(ANTLR_UINT32 start, ANTLR_UINT32 stop,
+									const IntListType& list, TokensListType& tokenList);
+
+    /** Function that returns all tokens of a certain type within a range.
+     */
+    void getTokensType(ANTLR_UINT32 start, ANTLR_UINT32 stop, ANTLR_UINT32 type, TokensListType& tokens);
+
+    /** Function that resets the token stream so that it can be reused, but
+     *  but that does not free up any resources, such as the token factory
+     *  the factory pool and so on. This prevents the need to keep freeing
+     *  and reallocating the token pools if the thing you are building is
+     *  a multi-shot dameon or somethign like that. It is much faster to
+     *  just reuse all the vectors.
+     */
+    void  reset();
+
+	const TokenType* LB(ANTLR_INT32 k);
+
+
+	void fillBufferExt();
+	void fillBuffer();
+
+	bool hasReachedFillbufferTarget( ANTLR_UINT32 cnt, BoolForwarder<true>  tokens_accessed_from_owning_rule  );
+	bool hasReachedFillbufferTarget( ANTLR_UINT32 cnt, BoolForwarder<false>  tokens_accessed_from_owning_rule  );
+
+	ANTLR_UINT32 skipOffTokenChannels(ANTLR_INT32 i);
+	ANTLR_UINT32 skipOffTokenChannelsReverse(ANTLR_INT32 x);
+	ANTLR_MARKER index_impl();
+};
+
+class TokenAccessException : public std::exception
+{
+	virtual const char* what() const throw()
+	{
+		return " Attempted access on Deleted Token";
+	}
+};
+
+ANTLR_END_NAMESPACE()
+
+#include "antlr3tokenstream.inl"
+
+#endif
diff --git a/runtime/Cpp/include/antlr3tokenstream.inl b/runtime/Cpp/include/antlr3tokenstream.inl
new file mode 100755
index 0000000..9c1c5a9
--- /dev/null
+++ b/runtime/Cpp/include/antlr3tokenstream.inl
@@ -0,0 +1,937 @@
+ANTLR_BEGIN_NAMESPACE()
+
+template<class ImplTraits>
+TokenSource<ImplTraits>::TokenSource()
+	:m_eofToken( ImplTraits::CommonTokenType::TOKEN_EOF), 
+	m_skipToken( ImplTraits::CommonTokenType::TOKEN_INVALID)
+{
+}
+
+template<class ImplTraits>
+ANTLR_INLINE typename TokenSource<ImplTraits>::CommonTokenType& TokenSource<ImplTraits>::get_eofToken()
+{
+	return m_eofToken;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE const typename TokenSource<ImplTraits>::TokenType& TokenSource<ImplTraits>::get_eofToken() const
+{
+	return m_eofToken;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE typename TokenSource<ImplTraits>::CommonTokenType& TokenSource<ImplTraits>::get_skipToken()
+{
+	return m_skipToken;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE typename TokenSource<ImplTraits>::StringType& TokenSource<ImplTraits>::get_fileName()
+{
+	return m_fileName;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE void TokenSource<ImplTraits>::set_fileName( const StringType& fileName )
+{
+	m_fileName = fileName;
+}
+
+template<class ImplTraits>
+typename TokenSource<ImplTraits>::LexerType* TokenSource<ImplTraits>::get_super()
+{
+	return static_cast<LexerType*>(this);
+}
+
+template<class ImplTraits>
+typename TokenSource<ImplTraits>::TokenType*	TokenSource<ImplTraits>::nextTokenStr()
+{
+	typedef typename LexerType::RecognizerSharedStateType RecognizerSharedStateType;
+	typedef typename LexerType::InputStreamType InputStreamType;
+	typedef typename LexerType::IntStreamType IntStreamType;
+	LexerType*                  lexer;
+    RecognizerSharedStateType*	state;
+    InputStreamType*            input;
+    IntStreamType*              istream;
+
+    lexer   = this->get_super();
+    state   = lexer->get_rec()->get_state();
+    input   = lexer->get_input();
+    istream = input->get_istream();
+
+    /// Loop until we get a non skipped token or EOF
+    ///
+    for	(;;)
+    {
+        // Get rid of any previous token (token factory takes care of
+        // any de-allocation when this token is finally used up.
+        //
+        state->set_token_present(false);
+        state->set_error(false);	    // Start out without an exception
+        state->set_failed(false);
+
+        // Now call the matching rules and see if we can generate a new token
+        //
+        for	(;;)
+        {
+            // Record the start of the token in our input stream.
+            //
+            state->set_channel( TOKEN_DEFAULT_CHANNEL );
+            state->set_tokenStartCharIndex( (ANTLR_MARKER)input->get_nextChar() );
+            state->set_tokenStartCharPositionInLine( input->get_charPositionInLine() );
+            state->set_tokenStartLine( input->get_line() );
+            state->set_text("");
+
+            if  (istream->_LA(1) == ANTLR_CHARSTREAM_EOF)
+            {
+                // Reached the end of the current stream, nothing more to do if this is
+                // the last in the stack.
+                //
+                TokenType&    teof = m_eofToken;
+
+                teof.set_startIndex(lexer->getCharIndex());
+                teof.set_stopIndex(lexer->getCharIndex());
+                teof.set_line(lexer->getLine());
+                return  &teof;
+            }
+
+            state->set_token_present( false );
+            state->set_error(false);	    // Start out without an exception
+            state->set_failed(false);
+
+            // Call the generated lexer, see if it can get a new token together.
+            //
+            lexer->mTokens();
+
+            if  (state->get_error()  == true)
+            {
+                // Recognition exception, report it and try to recover.
+                //
+                state->set_failed(true);
+                lexer->get_rec()->reportError();
+                lexer->recover(); 
+            }
+            else
+            {
+                if ( !state->get_token_present() )
+                {
+                    // Emit the real token, which adds it in to the token stream basically
+                    //
+                    lexer->emit();
+                }
+                else if	( *(state->get_token()) ==  m_skipToken )
+                {
+                    // A real token could have been generated, but "Computer say's naaaaah" and it
+                    // it is just something we need to skip altogether.
+                    //
+                    continue;
+                }
+
+                // Good token, not skipped, not EOF token
+                //
+                return  state->get_token();
+            }
+        }
+    }
+}
+
+template<class ImplTraits>
+typename TokenSource<ImplTraits>::TokenType*  TokenSource<ImplTraits>::nextToken()
+{
+	return this->nextToken( BoolForwarder<LexerType::IsFiltered>() );
+}
+
+template<class ImplTraits>
+typename TokenSource<ImplTraits>::CommonTokenType*	TokenSource<ImplTraits>::nextToken( BoolForwarder<true> /*isFiltered*/ )
+{
+	LexerType*   lexer;
+	typename LexerType::RecognizerSharedStateType* state;
+
+	lexer   = this->get_super();
+	state	= lexer->get_lexstate();
+
+	/* Get rid of any previous token (token factory takes care of
+		* any deallocation when this token is finally used up.
+		*/
+	state->set_token_present( false );
+	state->set_error( false );	    /* Start out without an exception	*/
+	state->set_failed(false);
+
+	/* Record the start of the token in our input stream.
+		*/
+	state->set_tokenStartCharIndex( lexer->index() );
+	state->set_tokenStartCharPositionInLine( lexer->getCharPositionInLine() );
+	state->set_tokenStartLine( lexer->getLine() );
+	state->set_text("");
+
+	/* Now call the matching rules and see if we can generate a new token
+		*/
+	for	(;;)
+	{
+		if (lexer->LA(1) == ANTLR_CHARSTREAM_EOF)
+		{
+			/* Reached the end of the stream, nothing more to do.
+				*/
+			CommonTokenType&    teof = m_eofToken;
+
+			teof.set_startIndex(lexer->getCharIndex());
+			teof.set_stopIndex(lexer->getCharIndex());
+			teof.set_line(lexer->getLine());
+			return  &teof;
+		}
+
+		state->set_token_present(false);
+		state->set_error(false);	    /* Start out without an exception	*/
+
+		{
+			ANTLR_MARKER   m;
+
+			m	= lexer->get_istream()->mark();
+			state->set_backtracking(1);				/* No exceptions */
+			state->set_failed(false);
+
+			/* Call the generated lexer, see if it can get a new token together.
+				*/
+			lexer->mTokens();
+    		state->set_backtracking(0);
+
+    		/* mTokens backtracks with synpred at BACKTRACKING==2
+				and we set the synpredgate to allow actions at level 1. */
+
+			if(state->get_failed())
+			{
+				lexer->rewind(m);
+				lexer->consume(); //<! advance one char and try again !>
+			}
+			else
+			{
+				lexer->emit();					/* Assemble the token and emit it to the stream */
+				TokenType* tok = state->get_token();
+				return tok;
+			}
+		}
+	}
+}
+
+template<class ImplTraits>
+typename TokenSource<ImplTraits>::CommonTokenType*	TokenSource<ImplTraits>::nextToken( BoolForwarder<false> /*isFiltered*/ )
+{
+	// Find the next token in the current stream
+	//
+	CommonTokenType* tok = this->nextTokenStr();
+
+	// If we got to the EOF token then switch to the previous
+	// input stream if there were any and just return the
+	// EOF if there are none. We must check the next token
+	// in any outstanding input stream we pop into the active
+	// role to see if it was sitting at EOF after PUSHing the
+	// stream we just consumed, otherwise we will return EOF
+	// on the reinstalled input stream, when in actual fact
+	// there might be more input streams to POP before the
+	// real EOF of the whole logical inptu stream. Hence we
+	// use a while loop here until we find somethign in the stream
+	// that isn't EOF or we reach the actual end of the last input
+	// stream on the stack.
+	//
+	while(tok->get_type() == CommonTokenType::TOKEN_EOF)
+	{
+		typename ImplTraits::LexerType*   lexer;
+		lexer   = static_cast<typename ImplTraits::LexerType*>( this->get_super() );
+
+		if  ( lexer->get_rec()->get_state()->get_streams().size() > 0)
+		{
+			// We have another input stream in the stack so we
+			// need to revert to it, then resume the loop to check
+			// it wasn't sitting at EOF itself.
+			//
+			lexer->popCharStream();
+			tok = this->nextTokenStr();
+		}
+		else
+		{
+			// There were no more streams on the input stack
+			// so this EOF is the 'real' logical EOF for
+			// the input stream. So we just exit the loop and 
+			// return the EOF we have found.
+			//
+			break;
+		}
+		
+	}
+
+	// return whatever token we have, which may be EOF
+	//
+	return  tok;
+}
+
+template<class ImplTraits>
+TokenStream<ImplTraits>::TokenStream()
+{
+	m_tokenSource = NULL;
+	m_debugger = NULL;
+	m_initialStreamState = false;
+}
+
+template<class ImplTraits>
+typename TokenStream<ImplTraits>::IntStreamType* TokenStream<ImplTraits>::get_istream()
+{
+	return this;
+}
+
+template<class ImplTraits>
+TokenStream<ImplTraits>::TokenStream(TokenSourceType* source, DebugEventListenerType* debugger)
+{
+	m_initialStreamState = false;
+	m_tokenSource = source;
+	m_debugger = debugger;
+}
+
+template<class ImplTraits>
+CommonTokenStream<ImplTraits>::CommonTokenStream(ANTLR_UINT32 , TokenSourceType* source, 
+													DebugEventListenerType* debugger)
+					: CommonTokenStream<ImplTraits>::BaseType( source, debugger )
+{
+	m_p = -1;
+	m_channel = TOKEN_DEFAULT_CHANNEL;
+	m_discardOffChannel = false;
+	m_nissued = 0;
+}
+
+template<class ImplTraits>
+typename CommonTokenStream<ImplTraits>::TokensType& CommonTokenStream<ImplTraits>::get_tokens()
+{
+	return m_tokens;
+}
+
+template<class ImplTraits>
+const typename CommonTokenStream<ImplTraits>::TokensType& CommonTokenStream<ImplTraits>::get_tokens() const
+{
+	return m_tokens;
+}
+
+template<class ImplTraits>
+typename CommonTokenStream<ImplTraits>::DiscardSetType& CommonTokenStream<ImplTraits>::get_discardSet()
+{
+	return m_discardSet;
+}
+
+template<class ImplTraits>
+const typename CommonTokenStream<ImplTraits>::DiscardSetType& CommonTokenStream<ImplTraits>::get_discardSet() const
+{
+	return m_discardSet;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE ANTLR_INT32 CommonTokenStream<ImplTraits>::get_p() const
+{
+	return m_p;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE void CommonTokenStream<ImplTraits>::set_p( ANTLR_INT32 p )
+{
+	m_p = p;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE void CommonTokenStream<ImplTraits>::inc_p()
+{
+	++m_p;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE void CommonTokenStream<ImplTraits>::dec_p()
+{
+	--m_p;
+}
+
+template<class ImplTraits>
+ANTLR_INLINE ANTLR_MARKER CommonTokenStream<ImplTraits>::index_impl()
+{
+	return m_p;
+}
+
+// Reset a token stream so it can be used again and can reuse it's
+// resources.
+//
+template<class ImplTraits>
+void  CommonTokenStream<ImplTraits>::reset()
+{
+	// Free any resources that ar most like specifc to the
+    // run we just did.
+    //
+	m_discardSet.clear();
+	m_channelOverrides.clear();
+
+    // Now, if there were any existing tokens in the stream,
+    // then we just reset the vector count so that it starts
+    // again. We must traverse the entries unfortunately as
+    // there may be free pointers for custom token types and
+    // so on. However that is just a quick NULL check on the
+    // vector entries.
+    //
+	m_tokens.clear();
+
+    // Reset to defaults
+    //
+    m_discardOffChannel  = false;
+    m_channel            = ImplTraits::CommonTokenType::TOKEN_DEFAULT_CHANNEL;
+    m_p	            = -1;
+}
+
+template<class ImplTraits>
+void	TokenStream<ImplTraits>::setDebugListener(DebugEventListenerType* debugger)
+{
+	m_debugger = debugger;
+	m_initialStreamState = false;
+}
+
+template<class ImplTraits>
+const typename TokenStream<ImplTraits>::TokenType*  TokenStream<ImplTraits>::_LT(ANTLR_INT32 k)
+{
+	ANTLR_INT32    i;
+	ANTLR_INT32    n;
+	TokenStreamType* cts;
+
+	cts	    = this->get_super();
+
+    if(k < 0)
+	{
+		return cts->LB(-k);
+	}
+
+	ANTLR_INT32 req_idx = cts->get_p() + k - 1;
+	ANTLR_INT32 cached_size = static_cast<ANTLR_INT32>(this->get_istream()->get_cachedSize());
+
+	if(	(cts->get_p() == -1) ||
+		( ( req_idx >= cached_size ) && ( (cached_size % ImplTraits::TOKEN_FILL_BUFFER_INCREMENT) == 0 ) )
+	  )
+	{
+		cts->fillBuffer();
+	}
+
+    // Here we used to check for k == 0 and return 0, but this seems
+    // a superfluous check to me. LT(k=0) is therefore just undefined
+    // and we won't waste the clock cycles on the check
+    //
+	cached_size = static_cast<ANTLR_INT32>(this->get_istream()->get_cachedSize());
+	if	( req_idx >= cached_size )
+	{
+		TokenType&    teof = cts->get_tokenSource()->get_eofToken();
+
+		teof.set_startIndex( this->get_istream()->index());
+		teof.set_stopIndex( this->get_istream()->index());
+		return  &teof;
+	}
+
+	i	= cts->get_p();
+	n	= 1;
+
+	/* Need to find k good tokens, skipping ones that are off channel
+	*/
+	while( n < k)
+	{
+		/* Skip off-channel tokens */
+		i = cts->skipOffTokenChannels(i+1); /* leave p on valid token    */
+		n++;
+	}
+	
+	if( ( i >= cached_size ) && ( (cached_size % ImplTraits::TOKEN_FILL_BUFFER_INCREMENT) == 0 ) )
+	{
+		cts->fillBuffer();
+	}
+	if	( (ANTLR_UINT32) i >= this->get_istream()->get_cachedSize() )
+	{
+		TokenType&    teof = cts->get_tokenSource()->get_eofToken();
+
+		teof.set_startIndex(this->get_istream()->index());
+		teof.set_stopIndex(this->get_istream()->index());
+		return  &teof;
+	}
+
+	// Here the token must be in the input vector. Rather then incur
+	// function call penalty, we just return the pointer directly
+	// from the vector
+	//
+	return cts->getToken(i);
+}
+
+template<class ImplTraits>
+const typename CommonTokenStream<ImplTraits>::TokenType* CommonTokenStream<ImplTraits>::LB(ANTLR_INT32 k)
+{
+    ANTLR_INT32 i;
+    ANTLR_INT32 n;
+
+    if (m_p == -1)
+    {
+        this->fillBuffer();
+    }
+    if (k == 0)
+    {
+        return NULL;
+    }
+    if ((m_p - k) < 0)
+    {
+        return NULL;
+    }
+
+    i = m_p;
+    n = 1;
+
+    /* Need to find k good tokens, going backwards, skipping ones that are off channel
+     */
+    while (n <= k)
+    {
+        /* Skip off-channel tokens
+         */
+
+        i = this->skipOffTokenChannelsReverse(i - 1); /* leave p on valid token    */
+        n++;
+    }
+    if (i < 0)
+    {
+        return NULL;
+    }
+	
+	// Here the token must be in the input vector. Rather then incut
+	// function call penalty, we jsut return the pointer directly
+	// from the vector
+	//
+	return this->getToken(i);
+}
+
+template<class ImplTraits>
+const typename CommonTokenStream<ImplTraits>::TokenType*   CommonTokenStream<ImplTraits>::getToken(ANTLR_MARKER i)
+{
+	return this->get(i);
+}
+
+
+template<class ImplTraits>
+const typename CommonTokenStream<ImplTraits>::TokenType* CommonTokenStream<ImplTraits>::get(ANTLR_MARKER i)
+{
+	return this->getToken( static_cast<ANTLR_MARKER>(i), 
+							BoolForwarder<ImplTraits::TOKENS_ACCESSED_FROM_OWNING_RULE>() );
+}
+
+template<class ImplTraits>
+const typename CommonTokenStream<ImplTraits>::TokenType* CommonTokenStream<ImplTraits>::getToken( ANTLR_MARKER tok_idx,
+															BoolForwarder<true>  /*tokens_accessed_from_owning_rule*/  )
+{
+	typename TokensType::iterator iter = m_tokens.find(tok_idx);
+	if( iter == m_tokens.end() )
+	{
+		TokenAccessException ex;
+		throw ex;
+	}
+	const TokenType& tok = iter->second;
+    return  &tok; 
+}
+
+template<class ImplTraits>
+const typename CommonTokenStream<ImplTraits>::TokenType* CommonTokenStream<ImplTraits>::getToken( ANTLR_MARKER tok_idx, BoolForwarder<false>  /*tokens_accessed_from_owning_rule*/   )
+{
+	TokenType& tok = m_tokens.at( static_cast<ANTLR_UINT32>(tok_idx) );
+    return  &tok; 
+}
+
+template<class ImplTraits>
+typename TokenStream<ImplTraits>::TokenSourceType* TokenStream<ImplTraits>::get_tokenSource() const
+{
+	return m_tokenSource;
+}
+
+template<class ImplTraits>
+void TokenStream<ImplTraits>::set_tokenSource( TokenSourceType* tokenSource )
+{
+	m_tokenSource = tokenSource;
+}
+
+template<class ImplTraits>
+typename TokenStream<ImplTraits>::StringType	TokenStream<ImplTraits>::toString()
+{
+	TokenStreamType* cts = static_cast<TokenStreamType>(this);
+
+	if	(cts->get_p() == -1)
+    {
+		cts->fillBuffer();
+    }
+
+    return  this->toStringSS(0, this->get_istream()->size());
+}
+
+template<class ImplTraits>
+typename TokenStream<ImplTraits>::StringType
+TokenStream<ImplTraits>::toStringSS(ANTLR_MARKER start, ANTLR_MARKER stop)
+{
+    StringType string;
+    TokenSourceType* tsource;
+    const TokenType* tok;
+    TokenStreamType* cts;
+
+    cts = this->get_super();
+
+    if (cts->get_p() == -1)
+    {
+        cts->fillBuffer();
+    }
+    if (stop >= this->get_istream()->size())
+    {
+        stop = this->get_istream()->size() - 1;
+    }
+
+    /* Who is giving us these tokens?
+     */
+    tsource = cts->get_tokenSource();
+
+    if (tsource != NULL && !cts->get_tokens().empty() )
+    {
+        /* Finally, let's get a string
+         */
+        for (ANTLR_MARKER i = start; i <= stop; i++)
+        {
+            tok = cts->get(i);
+            if (tok != NULL)
+            {
+                string.append( tok->getText() );
+            }
+        }
+
+        return string;
+    }
+    return "";
+}
+
+template<class ImplTraits>
+typename TokenStream<ImplTraits>::StringType
+TokenStream<ImplTraits>::toStringTT(const TokenType* start, const TokenType* stop)
+{
+	if	(start != NULL && stop != NULL)
+	{
+		return	this->toStringSS( start->get_tokenIndex(), 
+								  stop->get_tokenIndex());
+	}
+	else
+	{
+		return	"";
+	}
+}
+
+/** A simple filter mechanism whereby you can tell this token stream
+ *  to force all tokens of type ttype to be on channel.  For example,
+ *  when interpreting, we cannot execute actions so we need to tell
+ *  the stream to force all WS and NEWLINE to be a different, ignored,
+ *  channel.
+ */
+template<class ImplTraits>
+void	CommonTokenStream<ImplTraits>::setTokenTypeChannel ( ANTLR_UINT32 ttype, ANTLR_UINT32 channel)
+{
+    /* We add one to the channel so we can distinguish NULL as being no entry in the
+     * table for a particular token type.
+     */
+    m_channelOverrides[ttype] = (ANTLR_UINT32)channel + 1;
+
+}
+
+template<class ImplTraits>
+void  CommonTokenStream<ImplTraits>::discardTokenType(ANTLR_INT32 ttype)
+{
+	 /* We add one to the channel so we can distinguish NULL as being no entry in the
+     * table for a particular token type. We could use bitsets for this I suppose too.
+     */
+	m_discardSet.insert(ttype);
+}
+
+template<class ImplTraits>
+void CommonTokenStream<ImplTraits>::discardOffChannelToks(bool discard)
+{
+	m_discardOffChannel = discard;
+}
+
+template<class ImplTraits>
+typename CommonTokenStream<ImplTraits>::TokensType*  CommonTokenStream<ImplTraits>::getTokens()
+{
+	if	(m_p == -1)
+    {
+		this->fillBuffer();
+    }
+
+    return  &m_tokens;
+}
+
+template<class ImplTraits>
+void CommonTokenStream<ImplTraits>::getTokenRange(ANTLR_UINT32 start, ANTLR_UINT32 stop, 
+																	TokensListType& tokenRange)
+{
+	return this->getTokensSet(start, stop, NULL, tokenRange);
+}
+
+/** Given a start and stop index, return a List of all tokens in
+ *  the token type BitSet.  Return null if no tokens were found.  This
+ *  method looks at both on and off channel tokens.
+ */
+template<class ImplTraits>
+void
+CommonTokenStream<ImplTraits>::getTokensSet(ANTLR_UINT32 start, ANTLR_UINT32 stop, BitsetType* types,
+                                                    TokensListType& filteredList )
+{
+    ANTLR_UINT32	    i;
+    ANTLR_UINT32	    n;
+    TokenType*	tok;
+
+    if	( m_p == -1)
+    {
+		this->fillBuffer();
+    }
+    if	(stop > this->get_istream()->size())
+    {
+		stop = this->get_istream()->size();
+    }
+    if	(start > stop)
+    {
+		return;
+    }
+
+    /* We have the range set, now we need to iterate through the
+     * installed tokens and create a new list with just the ones we want
+     * in it. We are just moving pointers about really.
+     */
+    for(i = start, n = 0; i<= stop; i++)
+    {
+		tok = this->get(i);
+
+		if  (	   types == NULL
+			|| (types->isMember( tok->get_type() ) == true )
+			)
+		{
+			filteredList.push_back(tok);
+		}
+	}
+    
+    return ;
+}
+
+template<class ImplTraits>
+void
+CommonTokenStream<ImplTraits>::getTokensList(ANTLR_UINT32 start, ANTLR_UINT32 stop, 
+													const IntListType& list, TokensListType& newlist)
+{
+    BitsetType*		bitSet;
+
+    bitSet  = Bitset<ImplTraits>::BitsetFromList(list);
+    this->getTokensSet(start, stop, bitSet, newlist);
+    delete bitSet;
+}
+
+template<class ImplTraits>
+void 
+CommonTokenStream<ImplTraits>::getTokensType(ANTLR_UINT32 start, ANTLR_UINT32 stop, ANTLR_UINT32 type,
+                                                  TokensListType& newlist   )
+{
+    BitsetType*  bitSet;
+
+    bitSet  = BitsetType::BitsetOf(type, -1);
+    this->getTokensSet(start, stop, bitSet, newlist);
+
+    delete bitSet;
+}
+
+template<class ImplTraits>
+void CommonTokenStream<ImplTraits>::fillBufferExt()
+{
+    this->fillBuffer();
+}
+
+template<class ImplTraits>
+bool CommonTokenStream<ImplTraits>::hasReachedFillbufferTarget( ANTLR_UINT32 cnt, 
+																BoolForwarder<true> )
+{
+	return ( cnt >= ImplTraits::TOKEN_FILL_BUFFER_INCREMENT );
+}
+
+template<class ImplTraits>
+bool CommonTokenStream<ImplTraits>::hasReachedFillbufferTarget( ANTLR_UINT32, 
+																BoolForwarder<false>  )
+{
+	return false;
+}
+
+
+template<class ImplTraits>
+void CommonTokenStream<ImplTraits>::fillBuffer() 
+{
+    ANTLR_UINT32 index;
+    TokenType* tok;
+    bool discard;
+    
+    /* Start at index 0 of course
+     */
+	ANTLR_UINT32 cached_p = (m_p < 0) ? 0 : m_p;
+    index = m_nissued;
+	ANTLR_UINT32 cnt = 0;
+
+    /* Pick out the next token from the token source
+     * Remember we just get a pointer (reference if you like) here
+     * and so if we store it anywhere, we don't set any pointers to auto free it.
+     */
+    tok = this->get_tokenSource()->nextToken();
+
+    while ( tok->get_type() != TokenType::TOKEN_EOF )
+    {
+        discard = false; /* Assume we are not discarding	*/
+
+        /* I employ a bit of a trick, or perhaps hack here. Rather than
+         * store a pointer to a structure in the override map and discard set
+         * we store the value + 1 cast to a void *. Hence on systems where NULL = (void *)0
+         * we can distinguish "not being there" from "being channel or type 0"
+         */
+
+        if ( m_discardSet.find(tok->get_type()) != m_discardSet.end() )
+        {
+            discard = true;
+        }
+        else if (   m_discardOffChannel == true
+                 && tok->get_channel() != m_channel
+                 )
+        {
+            discard = true;
+        }
+        else if (!m_channelOverrides.empty())
+        {
+            /* See if this type is in the override map
+             */
+			typename ChannelOverridesType::iterator iter = m_channelOverrides.find( tok->get_type() + 1 );
+
+            if (iter != m_channelOverrides.end())
+            {
+                /* Override found
+                 */
+                tok->set_channel( ANTLR_UINT32_CAST(iter->second) - 1);
+            }
+        }
+
+        /* If not discarding it, add it to the list at the current index
+         */
+        if (discard == false)
+        {
+            /* Add it, indicating that we will delete it and the table should not
+             */
+            tok->set_tokenIndex(index);
+            ++m_p;
+            this->insertToken(*tok);
+            index++;
+			m_nissued++;
+			cnt++;
+        }
+
+		if( !this->hasReachedFillbufferTarget( cnt, 
+						BoolForwarder<ImplTraits::TOKENS_ACCESSED_FROM_OWNING_RULE>()  ) )
+			tok = this->get_tokenSource()->nextToken();
+		else
+			break;
+    }
+
+    /* Cache the size so we don't keep doing indirect method calls. We do this as
+     * early as possible so that anything after this may utilize the cached value.
+     */
+    this->get_istream()->set_cachedSize( m_nissued );
+
+    /* Set the consume pointer to the first token that is on our channel, we just read
+     */
+    m_p = cached_p;
+    m_p = this->skipOffTokenChannels( m_p );
+
+}
+/// Given a starting index, return the index of the first on-channel
+///  token.
+///
+template<class ImplTraits>
+ANTLR_UINT32 CommonTokenStream<ImplTraits>::skipOffTokenChannels(ANTLR_INT32 i)
+{
+    ANTLR_INT32 n;
+    n = this->get_istream()->get_cachedSize();
+
+    while (i < n)
+    {
+        const TokenType* tok =  this->getToken(i);
+
+        if (tok->get_channel() != m_channel )
+        {
+            i++;
+        }
+        else
+        {
+            return i;
+        }
+    }
+    return i;
+}
+
+template<class ImplTraits>
+ANTLR_UINT32  CommonTokenStream<ImplTraits>::skipOffTokenChannelsReverse(ANTLR_INT32 x)
+{
+    while (x >= 0)
+    {
+        const TokenType* tok =  this->getToken(x);
+        
+        if( tok->get_channel() != m_channel )
+        {
+            x--;
+        }
+        else
+        {
+            return x;
+        }
+    }
+    return x;
+}
+
+template<class ImplTraits>
+void CommonTokenStream<ImplTraits>::discardTokens( ANTLR_MARKER start, ANTLR_MARKER stop )
+{
+	this->discardTokens( start, stop, BoolForwarder< ImplTraits::TOKENS_ACCESSED_FROM_OWNING_RULE >() );
+}
+
+template<class ImplTraits>
+void CommonTokenStream<ImplTraits>::discardTokens( ANTLR_MARKER start, ANTLR_MARKER stop, 
+											BoolForwarder<true>  /*tokens_accessed_from_owning_rule */ )
+{
+	typename TokensType::iterator iter1 = m_tokens.lower_bound(start);
+	typename TokensType::iterator iter2 = m_tokens.upper_bound(stop);
+	m_tokens.erase( iter1, iter2 );
+}
+
+template<class ImplTraits>
+void CommonTokenStream<ImplTraits>::discardTokens( ANTLR_MARKER start, ANTLR_MARKER stop, 
+											BoolForwarder<false>  /*tokens_accessed_from_owning_rule*/ )
+{
+	m_tokens.erase( m_tokens.begin() + start, m_tokens.begin() + stop );
+}
+
+template<class ImplTraits>
+void CommonTokenStream<ImplTraits>::insertToken( const TokenType& tok )
+{
+	this->insertToken( tok, BoolForwarder< ImplTraits::TOKENS_ACCESSED_FROM_OWNING_RULE >() );
+}
+
+template<class ImplTraits>
+void CommonTokenStream<ImplTraits>::insertToken( const TokenType& tok, BoolForwarder<true>  /*tokens_accessed_from_owning_rule*/  )
+{
+	assert( m_tokens.find( tok.get_index() ) == m_tokens.end() );
+	assert( tok.get_index() == m_nissued );
+	m_tokens[ tok.get_index() ] = tok;
+}
+
+template<class ImplTraits>
+void CommonTokenStream<ImplTraits>::insertToken( const TokenType& tok, BoolForwarder<false>  /*tokens_accessed_from_owning_rule*/  )
+{
+	m_tokens.push_back( tok );
+}
+
+template<class ImplTraits>
+CommonTokenStream<ImplTraits>::~CommonTokenStream()
+{
+	m_tokens.clear();
+}
+
+ANTLR_END_NAMESPACE()
diff --git a/runtime/Cpp/include/antlr3traits.hpp b/runtime/Cpp/include/antlr3traits.hpp
new file mode 100755
index 0000000..c876044
--- /dev/null
+++ b/runtime/Cpp/include/antlr3traits.hpp
@@ -0,0 +1,320 @@
+#ifndef _ANTLR3_TRAITS_HPP
+#define _ANTLR3_TRAITS_HPP
+
+#include	"antlr3defs.hpp"
+
+
+ANTLR_BEGIN_NAMESPACE()
+	
+//Users implementing overrides should inherit from this
+template<class ImplTraits>
+class CustomTraitsBase
+{
+public:
+	typedef Empty AllocPolicyType;
+	typedef Empty StringType;
+	typedef Empty StringStreamType;
+	typedef Empty StreamDataType;
+	typedef Empty Endianness;
+
+	//collections
+	typedef Empty BitsetType;
+	typedef Empty BitsetListType;
+
+	typedef Empty InputStreamType;
+
+	template<class StreamType>
+	class IntStreamType : public Empty
+	{
+	public:
+		typedef Empty BaseType;
+	};
+
+	typedef Empty LexStateType;
+
+	typedef Empty CommonTokenType;
+	typedef Empty TokenIntStreamType;
+
+	typedef Empty TokenStreamType;
+	typedef Empty TreeNodeStreamType;
+
+
+	typedef Empty DebugEventListenerType;
+	template<class StreamType>
+	class RecognizerSharedStateType : public Empty
+	{
+	public:
+		typedef Empty BaseType;
+	};
+
+	template<class StreamType>
+	class RecognizerType : public Empty
+	{
+	public:
+		typedef Empty BaseType;
+	};
+	
+	typedef Empty TreeType;
+	typedef Empty TreeAdaptorType;
+	
+	template<class StreamType>
+	class ExceptionBaseType : public Empty
+	{
+	public:
+		typedef Empty BaseType;
+	};
+
+	//this should be overridden with generated lexer
+	typedef Empty BaseLexerType;
+	
+	typedef Empty TokenSourceType;
+	typedef Empty BaseParserType;//this should be overridden with generated lexer
+	typedef Empty BaseTreeParserType;
+	
+	template<class StreamType>
+	class RewriteStreamType : public Empty
+	{
+	public:
+		typedef Empty BaseType;
+	};
+
+	typedef Empty  RuleReturnValueType;
+	
+	//If we want to change the way tokens are stored
+	static const bool TOKENS_ACCESSED_FROM_OWNING_RULE = false;
+	static const int  TOKEN_FILL_BUFFER_INCREMENT = 100; //used only if the above val is true
+
+	static void displayRecognitionError( const std::string& str ) {  printf("%s", str.c_str() ); }
+};
+
+template<class A, class B>
+class TraitsSelector
+{
+public:
+	typedef A selected;
+};
+
+template<class B>
+class TraitsSelector<Empty, B>
+{
+public:
+	typedef B selected;
+};
+
+template<class A, class B, class C>
+class TraitsOneArgSelector
+{
+public:
+	typedef A selected;
+};
+
+template<class A, class B>
+class TraitsOneArgSelector<A,B,Empty>
+{
+public:
+	typedef B selected;
+};
+
+template<bool v, class A, class B>
+class BoolSelector
+{
+public:
+	typedef A selected;
+};
+
+template<class A, class B>
+class BoolSelector<false, A, B>
+{
+public:
+	typedef B selected;
+};
+
+template< template<class ImplTraits> class UserTraits >
+class TraitsBase
+{
+public:
+	typedef TraitsBase  TraitsType;
+	
+	typedef typename TraitsSelector< typename UserTraits<TraitsType>::AllocPolicyType, DefaultAllocPolicy >::selected  AllocPolicyType;
+
+	typedef typename TraitsSelector< typename UserTraits<TraitsType>::StringType, 
+									std::string >::selected StringType;
+	
+	typedef typename TraitsSelector< typename UserTraits<TraitsType>::StringStreamType, 
+		                             std::stringstream >::selected StringStreamType;
+
+	typedef typename TraitsSelector< typename UserTraits<TraitsType>::StreamDataType, 
+		                             ANTLR_UINT8 >::selected StreamDataType;
+	
+	typedef typename TraitsSelector< typename UserTraits<TraitsType>::Endianness, 
+									 RESOLVE_ENDIAN_AT_RUNTIME >::selected Endianness;
+
+	typedef typename TraitsSelector< typename UserTraits<TraitsType>::BitsetType, 
+		                             Bitset<TraitsType> >::selected BitsetType;
+	typedef typename TraitsSelector< typename UserTraits<TraitsType>::BitsetListType, 
+		                             BitsetList<TraitsType> >::selected BitsetListType;
+
+	typedef typename TraitsSelector< typename UserTraits<TraitsType>::InputStreamType, 
+		                              InputStream<TraitsType> >::selected InputStreamType;
+
+	template<class SuperType>
+	class IntStreamType 
+		: public TraitsOneArgSelector< 
+					typename UserTraits<TraitsType>::template IntStreamType<SuperType>, 
+		            IntStream<TraitsType, SuperType>,
+					typename UserTraits<TraitsType>::template IntStreamType<SuperType>::BaseType
+								>::selected  
+	{ };
+	
+	typedef typename TraitsSelector< typename UserTraits<TraitsType>::LexStateType, 
+		                             LexState<TraitsType> >::selected LexStateType;
+
+	static const bool TOKENS_ACCESSED_FROM_OWNING_RULE = UserTraits<TraitsType>::TOKENS_ACCESSED_FROM_OWNING_RULE;
+	static const int  TOKEN_FILL_BUFFER_INCREMENT = UserTraits<TraitsType>::TOKEN_FILL_BUFFER_INCREMENT; //used only if the above val is true
+
+	static void displayRecognitionError( const StringType& str ) { UserTraits<TraitsType>::displayRecognitionError(str);  }
+};
+
+template<
+	     class LxrType, 
+         class PsrType, 
+		 template<class ImplTraits> class UserTraits = CustomTraitsBase, 
+		 class TreePsrType = antlr3::Empty
+         >
+class Traits  : public TraitsBase<UserTraits>
+{
+public:
+	typedef Traits TraitsType;
+	typedef TraitsBase<UserTraits> BaseTraitsType;	
+
+	typedef typename TraitsSelector< typename UserTraits<TraitsType>::CommonTokenType, 
+									 CommonToken<TraitsType> >::selected CommonTokenType;
+	typedef typename TraitsSelector< typename UserTraits<TraitsType>::TokenIntStreamType, 
+		                             TokenIntStream<TraitsType> >::selected TokenIntStreamType;
+	
+	typedef typename TraitsSelector< typename UserTraits<TraitsType>::TokenStreamType, 
+									CommonTokenStream<TraitsType> >::selected TokenStreamType;
+	typedef typename TraitsSelector< typename UserTraits<TraitsType>::TreeNodeStreamType, 
+		                            CommonTreeNodeStream<TraitsType> >::selected TreeNodeStreamType;
+	
+	typedef typename TraitsSelector< typename UserTraits<TraitsType>::DebugEventListenerType, 
+		                            DebugEventListener<TraitsType> >::selected DebugEventListenerType;
+		
+	template<class StreamType>
+	class  RecognizerSharedStateType 
+		          : public TraitsOneArgSelector< 
+							typename UserTraits<TraitsType>::template RecognizerSharedStateType<StreamType>, 
+							RecognizerSharedState<TraitsType, StreamType>,
+							typename UserTraits<TraitsType>::template RecognizerSharedStateType<StreamType>::BaseType
+										>::selected 
+	{};
+
+	template<class StreamType>
+	class  RecognizerType 
+				   : public TraitsOneArgSelector< 
+				             typename UserTraits<TraitsType>::template RecognizerType<StreamType>, 
+							 BaseRecognizer<TraitsType, StreamType>,
+							 typename UserTraits<TraitsType>::template RecognizerType<StreamType>::BaseType
+									>::selected 
+	{
+	public:
+		typedef typename TraitsOneArgSelector< 
+							typename UserTraits<TraitsType>::template RecognizerType<StreamType>, 
+							BaseRecognizer<TraitsType, StreamType>,
+							typename UserTraits<TraitsType>::template RecognizerType<StreamType>::BaseType
+										>::selected  BaseType;
+		typedef typename BaseType::RecognizerSharedStateType RecognizerSharedStateType;
+
+	public:
+		RecognizerType(ANTLR_UINT32 sizeHint, RecognizerSharedStateType* state)
+			: BaseType( sizeHint, state )
+		{
+		}
+	};
+
+	typedef typename TraitsSelector< typename UserTraits<TraitsType>::TreeType, 
+										CommonTree<TraitsType> >::selected TreeType;
+	typedef typename TraitsSelector< typename UserTraits<TraitsType>::TreeAdaptorType, 
+										CommonTreeAdaptor<TraitsType> >::selected TreeAdaptorType;
+		
+	template<class StreamType>
+	class ExceptionBaseType : public TraitsOneArgSelector< 
+								typename UserTraits<TraitsType>::template ExceptionBaseType<StreamType>, 
+								ANTLR_ExceptionBase<TraitsType, StreamType>, 
+								typename UserTraits<TraitsType>::template ExceptionBaseType<StreamType>::BaseType
+													>::selected 
+	{
+	public:
+		typedef typename TraitsOneArgSelector< 
+			                    typename UserTraits<TraitsType>::template ExceptionBaseType<StreamType>, 
+								ANTLR_ExceptionBase<TraitsType, StreamType>,
+								typename UserTraits<TraitsType>::template ExceptionBaseType<StreamType>::BaseType
+							>::selected BaseType;
+	
+	protected:
+		ExceptionBaseType( const typename BaseTraitsType::StringType& message )
+			:BaseType(message)
+		{
+		}
+	};
+
+	//this should be overridden with generated lexer
+	typedef typename TraitsSelector< typename UserTraits<TraitsType>::BaseLexerType, 
+											Lexer<TraitsType> >::selected BaseLexerType;
+	typedef LxrType LexerType;
+
+	typedef typename TraitsSelector< typename UserTraits<TraitsType>::TokenSourceType, 
+											TokenSource<TraitsType> >::selected TokenSourceType;
+	typedef typename TraitsSelector< typename UserTraits<TraitsType>::BaseParserType, 
+											Parser<TraitsType> >::selected BaseParserType;
+	
+	typedef PsrType ParserType;
+
+	typedef typename TraitsSelector< typename UserTraits<TraitsType>::BaseTreeParserType, 
+											 TreeParser<TraitsType> >::selected BaseTreeParserType;
+	typedef TreePsrType TreeParserType;
+
+	template<class SuperType>
+	class RewriteStreamType : public TraitsOneArgSelector< 
+								typename UserTraits<TraitsType>::template RewriteStreamType<SuperType>, 
+								RewriteRuleElementStream<TraitsType, SuperType>,
+								typename UserTraits<TraitsType>::template RewriteStreamType<SuperType>::BaseType
+													>::selected 
+	{
+	public:
+		typedef typename TraitsOneArgSelector< 
+				typename UserTraits<TraitsType>::template RewriteStreamType<SuperType>, 
+				RewriteRuleElementStream<TraitsType, SuperType>, 
+				typename UserTraits<TraitsType>::template RewriteStreamType<SuperType>::BaseType
+						>::selected BaseType;
+
+		typedef typename SuperType::StreamType StreamType;
+		typedef typename BaseType::RecognizerType Recognizer_Type;
+		typedef typename BaseType::TokenType TokenType;
+		typedef typename BaseType::ElementsType ElementsType;			
+
+	public:
+		RewriteStreamType(TreeAdaptorType* adaptor = NULL, Recognizer_Type* rec=NULL, ANTLR_UINT8* description = NULL)
+			:BaseType(adaptor, rec, description)
+		{
+		}
+		RewriteStreamType(TreeAdaptorType* adaptor, Recognizer_Type* rec, ANTLR_UINT8* description, TokenType* oneElement)
+			:BaseType(adaptor, rec, description, oneElement)
+		{
+		}
+		RewriteStreamType(TreeAdaptorType* adaptor, Recognizer_Type* rec, ANTLR_UINT8* description, const ElementsType& elements)
+			:BaseType(adaptor, rec, description, elements)
+		{
+		}
+	};
+
+	typedef typename TraitsSelector< typename UserTraits<TraitsType>::RuleReturnValueType, 
+										typename BoolSelector< TraitsType::TOKENS_ACCESSED_FROM_OWNING_RULE, 
+														RuleReturnValue_1<TraitsType>, RuleReturnValue<TraitsType> >::selected
+								   >::selected RuleReturnValueType;
+};
+
+
+ANTLR_END_NAMESPACE()
+
+#endif //_ANTLR3_TRAITS_HPP
diff --git a/runtime/Cpp/include/antlr3treeparser.hpp b/runtime/Cpp/include/antlr3treeparser.hpp
new file mode 100755
index 0000000..8f83ff8
--- /dev/null
+++ b/runtime/Cpp/include/antlr3treeparser.hpp
@@ -0,0 +1,101 @@
+#ifndef	ANTLR3TREEPARSER_HPP
+#define	ANTLR3TREEPARSER_HPP
+
+// [The "BSD licence"]
+// Copyright (c) 2005-2009 Gokulakannan Somasundaram, ElectronDB
+
+//
+// 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.
+
+#include    "antlr3defs.hpp"
+
+/** Internal structure representing an element in a hash bucket.
+ *  Stores the original key so that duplicate keys can be rejected
+ *  if necessary, and contains function can be supported If the hash key
+ *  could be unique I would have invented the perfect compression algorithm ;-)
+ */
+ANTLR_BEGIN_NAMESPACE()
+
+template<class ImplTraits>
+class	TreeParser : public ImplTraits::template RecognizerType< TreeParser<ImplTraits> >
+{
+public:
+	typedef typename ImplTraits::TreeNodeStreamType TreeNodeStreamType;
+	typedef TreeNodeStreamType StreamType;
+	typedef typename TreeNodeStreamType::IntStreamType IntStreamType;
+	typedef typename ImplTraits::TreeType TreeType;
+	typedef TreeType TokenType;
+	typedef typename ImplTraits::template ExceptionBase<TreeNodeStreamType> ExceptionBaseType;
+	typedef typename ImplTraits::template RecognizerType< TreeParser<ImplTraits> > RecognizerType;
+	typedef typename RecognizerType::RecognizerSharedStateType RecognizerSharedStateType;
+	typedef Empty TokenSourceType;
+	typedef typename ImplTraits::BitsetListType BitsetListType;
+	typedef typename ImplTraits::StringType StringType;
+	typedef typename ImplTraits::CommonTokenType CommonTokenType;
+
+private:
+    /** Pointer to the common tree node stream for the parser
+     */
+    TreeNodeStreamType*		m_ctnstream;
+
+public:
+	TreeParser( ANTLR_UINT32 sizeHint, TreeNodeStreamType* ctnstream,
+											RecognizerSharedStateType* state);
+	TreeNodeStreamType* get_ctnstream() const;
+	IntStreamType* get_istream() const;
+	RecognizerType* get_rec();
+
+	//same as above. Just that get_istream exists for lexer, parser, treeparser
+	//get_parser_istream exists only for parser, treeparser. So use it accordingly
+	IntStreamType* get_parser_istream() const;
+
+    /** Set the input stream and reset the parser
+     */
+    void	setTreeNodeStream(TreeNodeStreamType* input);
+
+    /** Return a pointer to the input stream
+     */
+    TreeNodeStreamType* getTreeNodeStream();
+
+	TokenType*	getMissingSymbol( IntStreamType* istream,
+										  ExceptionBaseType*		e,
+										  ANTLR_UINT32			expectedTokenType,
+										  BitsetListType*	follow);
+
+    /** Pointer to a function that knows how to free resources of an ANTLR3 tree parser.
+     */
+	~TreeParser();
+
+	void fillExceptionData( ExceptionBaseType* ex );
+	void displayRecognitionError( ANTLR_UINT8** tokenNames, ExceptionBaseType* ex );
+	void exConstruct();
+	void mismatch(ANTLR_UINT32 ttype, BitsetListType* follow);
+};
+
+ANTLR_END_NAMESPACE()
+
+#include "antlr3treeparser.inl"
+
+#endif
diff --git a/runtime/Cpp/include/antlr3treeparser.inl b/runtime/Cpp/include/antlr3treeparser.inl
new file mode 100755
index 0000000..f08e3ef
--- /dev/null
+++ b/runtime/Cpp/include/antlr3treeparser.inl
@@ -0,0 +1,198 @@
+ANTLR_BEGIN_NAMESPACE()
+
+template< class ImplTraits >
+TreeParser<ImplTraits>::TreeParser( ANTLR_UINT32 sizeHint, TreeNodeStreamType* ctnstream,
+											RecognizerSharedStateType* state)
+											:RecognizerType( sizeHint, state )
+{
+	/* Install the tree node stream
+	*/
+	this->setTreeNodeStream(ctnstream);
+
+}
+
+template< class ImplTraits >
+TreeParser<ImplTraits>::~TreeParser()
+{
+	this->get_rec()->get_state()->get_following().clear();
+}
+
+template< class ImplTraits >
+typename TreeParser<ImplTraits>::TreeNodeStreamType* TreeParser<ImplTraits>::get_ctnstream() const
+{
+	return m_ctnstream;
+}
+
+template< class ImplTraits >
+typename TreeParser<ImplTraits>::IntStreamType* TreeParser<ImplTraits>::get_istream() const
+{
+	return m_ctnstream;
+}
+
+template< class ImplTraits >
+typename TreeParser<ImplTraits>::IntStreamType* TreeParser<ImplTraits>::get_parser_istream() const
+{
+	return m_ctnstream;
+}
+
+template< class ImplTraits >
+typename TreeParser<ImplTraits>::RecognizerType* TreeParser<ImplTraits>::get_rec()
+{
+	return this;
+}
+
+template< class ImplTraits >
+void TreeParser<ImplTraits>::fillExceptionData( ExceptionBaseType* ex )
+{
+	ex->set_token( m_ctnstream->_LT(1) );	    /* Current input tree node */
+	ex->set_line( ex->get_token()->getLine() );
+	ex->set_charPositionInLine( ex->get_token()->getCharPositionInLine() );
+	ex->set_index( m_ctnstream->index() );
+
+	// Are you ready for this? Deep breath now...
+	//
+	{
+		TreeType* tnode;
+
+		tnode		= ex->get_token();
+
+		if	(tnode->get_token()    == NULL)
+		{
+			ex->set_streamName("-unknown source-" );
+		}
+		else
+		{
+			if	( tnode->get_token()->get_input() == NULL)
+			{
+				ex->set_streamName("");
+			}
+			else
+			{
+				ex->set_streamName(	tnode->get_token()->get_input()->get_fileName() );
+			}
+		}
+		ex->set_message("Unexpected node");
+	}
+}
+
+template< class ImplTraits >
+void TreeParser<ImplTraits>::displayRecognitionError( ANTLR_UINT8** tokenNames, ExceptionBaseType* ex )
+{
+	typename ImplTraits::StringStreamType errtext;
+	// See if there is a 'filename' we can use
+	//
+	if( ex->get_streamName().empty() )
+	{
+		if(ex->get_token()->get_type() == ImplTraits::CommonTokenType::TOKEN_EOF)
+		{
+			errtext << "-end of input-(";
+		}
+		else
+		{
+			errtext << "-unknown source-(";
+		}
+	}
+	else
+	{
+		errtext << ex->get_streamName() << "(";
+	}
+
+	// Next comes the line number
+	//
+	errtext << this->get_rec()->get_state()->get_exception()->get_line() << ") ";
+	errtext << " : error " << this->get_rec()->get_state()->get_exception()->getType()
+							<< " : "
+							<< this->get_rec()->get_state()->get_exception()->get_message();
+
+	IntStreamType* is			= this->get_istream();
+	TreeType* theBaseTree	= this->get_rec()->get_state()->get_exception()->get_token();
+	StringType ttext		= theBaseTree->toStringTree();
+
+	if  (theBaseTree != NULL)
+	{
+		TreeType*  theCommonTree	=  static_cast<TreeType*>(theBaseTree);
+		if	(theCommonTree != NULL)
+		{
+			CommonTokenType* theToken	= theBaseTree->getToken();
+		}
+		errtext << ", at offset "
+			    << theBaseTree->getCharPositionInLine();
+		errtext << ", near " << ttext;
+	}
+	ex->displayRecognitionError( errtext );
+	ImplTraits::displayRecognitionError( errtext.str() );
+}
+
+template< class ImplTraits >
+void	TreeParser<ImplTraits>::setTreeNodeStream(TreeNodeStreamType* input)
+{
+	m_ctnstream = input;
+    this->get_rec()->reset();
+    m_ctnstream->reset();
+}
+
+template< class ImplTraits >
+typename TreeParser<ImplTraits>::TreeNodeStreamType* TreeParser<ImplTraits>::getTreeNodeStream()
+{
+	return m_ctnstream;
+}
+
+template< class ImplTraits >
+void TreeParser<ImplTraits>::exConstruct()
+{
+	new ANTLR_Exception<ImplTraits, MISMATCHED_TREE_NODE_EXCEPTION, TreeNodeStreamType>( this->get_rec(), "" );
+}
+
+template< class ImplTraits >
+void TreeParser<ImplTraits>::mismatch(ANTLR_UINT32 ttype, BitsetListType* follow)
+{
+	this->exConstruct();
+    this->recoverFromMismatchedToken(ttype, follow);
+}
+
+template< class ImplTraits >
+typename TreeParser<ImplTraits>::TokenType*
+TreeParser<ImplTraits>::getMissingSymbol( IntStreamType* istream, ExceptionBaseType*		e,
+					  ANTLR_UINT32	 expectedTokenType, BitsetListType*	follow)
+{
+	TreeNodeStreamType*		tns;
+	TreeType*				node;
+	TreeType*				current;
+	CommonTokenType*		token;
+	StringType				text;
+        ANTLR_INT32             i;
+
+	// Dereference the standard pointers
+	//
+    tns	    = static_cast<TreeNodeStreamType*>(istream);
+
+	// Create a new empty node, by stealing the current one, or the previous one if the current one is EOF
+	//
+	current	= tns->_LT(1);
+    i       = -1;
+
+	if	(current == tns->get_EOF_NODE_p())
+	{
+		current = tns->_LT(-1);
+        i--;
+	}
+	node	= current->dupNode();
+
+	// Find the newly dupicated token
+	//
+	token	= node->getToken();
+
+	// Create the token text that shows it has been inserted
+	//
+	token->setText("<missing ");
+	text = token->getText();
+	text.append((const char *)this->get_rec()->get_state()->get_tokenName(expectedTokenType));
+	text.append((const char *)">");
+
+	// Finally return the pointer to our new node
+	//
+	return	node;
+}
+
+
+ANTLR_END_NAMESPACE()
diff --git a/runtime/Cpp/tests/.gitignore b/runtime/Cpp/tests/.gitignore
new file mode 100644
index 0000000..dadd82c
--- /dev/null
+++ b/runtime/Cpp/tests/.gitignore
@@ -0,0 +1,22 @@
+# Windows test files
+[st][0-9][0-9][0-9].exe
+
+# Unix test files
+[st[0-9][0-9][0-9]
+
+# ANTLR generated files
+[st][0-9][0-9][0-9]?*.cpp
+[st][0-9][0-9][0-9]?*.hpp
+[st][0-9][0-9][0-9]*.tokens
+
+# MSVC files
+*.vcxproj
+*.vcxproj.user
+Debug/
+Release/
+
+# Eclipse CDT files
+.cproject
+
+# tests output files
+t012.lxr.output
diff --git a/runtime/Cpp/tests/Makefile b/runtime/Cpp/tests/Makefile
new file mode 100644
index 0000000..1efad37
--- /dev/null
+++ b/runtime/Cpp/tests/Makefile
@@ -0,0 +1,97 @@
+.PRECIOUS=.o
+
+ANTLRGRAMMARS ?= $(wildcard t0[01]*.g)
+HEADERS = $(wildcard *.hpp) $(wildcard *.inl)
+RUNTIME_HEADERS = $(wildcard ../include/*.hpp) $(wildcard ../include/*.inl)
+SOURCES = $(wildcard *.cpp)
+POBJS = $(PSOURCES:.cpp=.o)
+TOKENS = $(ANTLRGRAMMARS:.g=.tokens)
+
+GRAMMAROPTIONS= #-report -Xconversiontimeout 1500000 -Xmultithreaded -Xwatchconversion
+ANTLR = ../../../antlr-complete/target/antlr-complete-3.5.2-SNAPSHOT.jar
+STGS  = $(wildcard ../../../tool/src/main/resources/org/antlr/codegen/templates/Cpp/*.stg)
+
+.SUFFIXES:
+
+INCLUDES= -I. -I../include/
+
+CFLAGS=-ggdb3 -O0 -fno-inline -Wall -Wno-unused-variable
+#CFLAGS=-ggdb3 -O3
+
+TOBJS= utils.o
+
+all: $(ANTLR) $(TOKENS) t001 t002 t003 t004 t005 t006 t006 t007 t008 t009 t010 t011 t012
+
+# For devel only. This will replace .stg files in the tool in a fast way
+#
+$(ANTLR): $(STGS)
+	jar uvf $(ANTLR) -C ../../../tool/src/main/resources \
+	org/antlr/codegen/templates/Cpp/Cpp.stg
+
+t001:	t001.cpp t001lexer.tokens UserTestTraits.hpp Makefile $(ANTLR) $(RUNTIME_HEADERS)
+	g++ $(CFLAGS) -DUSESTL $(INCLUDES) $< $@?*.cpp -o $@
+
+t002:	t002.cpp t002lexer.tokens UserTestTraits.hpp Makefile $(ANTLR) $(RUNTIME_HEADERS)
+	g++ $(CFLAGS) -DUSESTL $(INCLUDES) $< $@?*.cpp -o $@
+
+t003:	t003.cpp t003lexer.tokens UserTestTraits.hpp Makefile $(ANTLR) $(RUNTIME_HEADERS)
+	g++ $(CFLAGS) -DUSESTL $(INCLUDES) $< $@?*.cpp -o $@
+
+t004:	t004.cpp t004lexer.tokens UserTestTraits.hpp Makefile $(ANTLR) $(RUNTIME_HEADERS)
+	g++ $(CFLAGS) -DUSESTL $(INCLUDES) $< $@?*.cpp -o $@
+
+t005:	t005.cpp t005lexer.tokens UserTestTraits.hpp Makefile $(ANTLR) $(RUNTIME_HEADERS)
+	g++ $(CFLAGS) -DUSESTL $(INCLUDES) $< $@?*.cpp -o $@
+
+t006:	t006.cpp t006lexer.tokens UserTestTraits.hpp Makefile $(ANTLR) $(RUNTIME_HEADERS)
+	g++ $(CFLAGS) -DUSESTL $(INCLUDES) $< $@?*.cpp -o $@
+
+t007:	t007.cpp t007lexer.tokens UserTestTraits.hpp Makefile $(ANTLR) $(RUNTIME_HEADERS)
+	g++ $(CFLAGS) -DUSESTL $(INCLUDES) $< $@?*.cpp -o $@
+
+t008:	t008.cpp t008lexer.tokens UserTestTraits.hpp Makefile $(ANTLR) $(RUNTIME_HEADERS)
+	g++ $(CFLAGS) -DUSESTL $(INCLUDES) $< $@?*.cpp -o $@
+
+t009:	t009.cpp t009lexer.tokens UserTestTraits.hpp Makefile $(ANTLR) $(RUNTIME_HEADERS)
+	g++ $(CFLAGS) -DUSESTL $(INCLUDES) $< $@?*.cpp -o $@
+
+t010:	t010.cpp t010lexer.tokens UserTestTraits.hpp Makefile $(ANTLR) $(RUNTIME_HEADERS)
+	g++ $(CFLAGS) -DUSESTL $(INCLUDES) $< $@?*.cpp -o $@
+
+t011:	t011.cpp t011lexer.tokens UserTestTraits.hpp Makefile $(ANTLR) $(RUNTIME_HEADERS)
+	g++ $(CFLAGS) -DUSESTL $(INCLUDES) $< $@?*.cpp -o $@
+
+t012:	t012.cpp t012lexerXMLLexer.tokens UserTestTraits.hpp Makefile $(ANTLR) $(RUNTIME_HEADERS)
+	g++ $(CFLAGS) -DUSESTL $(INCLUDES) $< $@?*.cpp -o $@
+
+t051:	t051.cpp t051lexer.tokens UserTestTraits.hpp Makefile $(ANTLR) $(RUNTIME_HEADERS)
+	g++ $(CFLAGS) -DUSESTL $(INCLUDES) $< $@?*.cpp -o $@
+
+# AST commented out
+# t039:	t039.cpp t039labels.tokens UserTestTraits.hpp Makefile $(ANTLR) $(RUNTIME_HEADERS)
+# 	g++ $(CFLAGS) -DUSESTL $(INCLUDES) $< $@?*.cpp -o $@
+#
+# t042:	t042.cpp t005lexer.tokens UserTestTraits.hpp Makefile $(ANTLR) $(RUNTIME_HEADERS)
+# 	g++ $(CFLAGS) -DUSESTL $(INCLUDES) $< $@?*.cpp -o $@
+
+clean:
+	rm -f *.o t0[0-9][0-9]??*.[ch]pp *.tokens t[0-9][0-9][0-9] t0[0-9][0-9].exe
+
+# %.u: %.g
+# 	@echo "Bulding dependencies for "$<
+# 	java -jar $(ANTLR) -depend $< > $@
+# 	@grep ":" $@ |awk 'BEGIN {printf "ANTLRGENLIST := " }{printf " " $$1}END {print ""}'  >> $@.tmp
+# 	@cat $@.tmp >> $@
+# 	$(RM) $@.tmp
+
+%.tokens %.cpp %Lexer.c %Parser.c %Lexer.h %Parser.h %.hpp: %.g $(ANTLR)
+	java -jar $(ANTLR) $(GRAMMAROPTIONS) $<
+
+ifneq ($(MAKECMDGOALS),clean)
+ifneq ($(strip $(ANTLRGRAMMARS)),)
+#-include $(ANTLRGRAMMARS:.g=.u)
+endif
+endif
+
+%.o: %.cpp $(HEADERS) utils.hpp
+	g++ $(CFLAGS) -DUSESTL $(INCLUDES) -c $< -o $@
diff --git a/runtime/Cpp/tests/UserTestTraits.hpp b/runtime/Cpp/tests/UserTestTraits.hpp
new file mode 100644
index 0000000..85a496c
--- /dev/null
+++ b/runtime/Cpp/tests/UserTestTraits.hpp
@@ -0,0 +1,68 @@
+#ifndef	_T_TEST_TRAITS_H
+#define	_T_TEST_TRAITS_H
+
+// First thing we always do is include the ANTLR3 generated files, which
+// will automatically include the antlr3 runtime header files.
+// The compiler must use -I (or set the project settings in VS2005)
+// to locate the antlr3 runtime files and -I. to find this file
+#include <antlr3.hpp>
+
+// Forward declaration for Lexer&Parser class(es)
+namespace Antlr3Test {
+	class S1Lexer;
+	class S1Parser;
+
+	class t001lexer;
+	class t002lexer;
+	class t003lexer;
+	class t004lexer;
+	class t005lexer;
+	class t006lexer;
+	class t007lexer;
+	class t008lexer;
+	class t009lexer;
+	class t010lexer;
+	class t011lexer;
+	class t012lexerXMLLexer;
+	class t051lexer;
+
+	class t039labelsLexer;
+	class t039labelsParser;
+};
+
+namespace Antlr3Test {
+
+	//code for overriding
+	template<class ImplTraits>
+	class UserTraits : public antlr3::CustomTraitsBase<ImplTraits>
+	{
+	public:
+	};
+
+	// Even Lexer only samples need some Parser class as a template parameter
+	class NoParser {
+	};
+		
+	// Instantiate the Traits class(will be used for Lexer/Parser template instantiations)
+	typedef antlr3::Traits<S1Lexer, S1Parser, UserTraits> S1LexerTraits;
+	typedef antlr3::Traits<S1Lexer, S1Parser, UserTraits> S1ParserTraits;
+
+	typedef antlr3::Traits<t001lexer, NoParser, UserTraits> t001lexerTraits;
+	typedef antlr3::Traits<t002lexer, NoParser, UserTraits> t002lexerTraits;
+	typedef antlr3::Traits<t003lexer, NoParser, UserTraits> t003lexerTraits;
+	typedef antlr3::Traits<t004lexer, NoParser, UserTraits> t004lexerTraits;
+	typedef antlr3::Traits<t005lexer, NoParser, UserTraits> t005lexerTraits;
+	typedef antlr3::Traits<t006lexer, NoParser, UserTraits> t006lexerTraits;
+	typedef antlr3::Traits<t007lexer, NoParser, UserTraits> t007lexerTraits;
+	typedef antlr3::Traits<t008lexer, NoParser, UserTraits> t008lexerTraits;
+	typedef antlr3::Traits<t009lexer, NoParser, UserTraits> t009lexerTraits;
+	typedef antlr3::Traits<t010lexer, NoParser, UserTraits> t010lexerTraits;
+	typedef antlr3::Traits<t011lexer, NoParser, UserTraits> t011lexerTraits;
+	typedef antlr3::Traits<t012lexerXMLLexer, NoParser, UserTraits> t012lexerXMLLexerTraits;
+	typedef antlr3::Traits<t051lexer, NoParser, UserTraits> t051lexerTraits;
+
+	typedef antlr3::Traits<t039labelsLexer, t039labelsParser, UserTraits> t039labelsLexerTraits;
+	typedef t039labelsLexerTraits t039labelsParserTraits;
+};
+
+#endif
diff --git a/runtime/Cpp/tests/t001.cpp b/runtime/Cpp/tests/t001.cpp
new file mode 100644
index 0000000..453a9b0
--- /dev/null
+++ b/runtime/Cpp/tests/t001.cpp
@@ -0,0 +1,96 @@
+#include "UserTestTraits.hpp"
+#include "t001lexer.hpp"
+
+#include <sys/types.h>
+
+#include <iostream>
+#include <sstream>
+#include <fstream>
+
+using namespace Antlr3Test;
+using namespace std;
+
+int testValid(string const& data);
+int testIteratorInterface(string const& data);
+int testMalformedInput(string const& data);
+
+static    t001lexer*		    lxr;
+
+int main (int argc, char *argv[])
+{
+	testValid("0");
+	testIteratorInterface("0");
+	testMalformedInput("1");
+	return 0;
+}
+
+int testValid(string const& data)
+{
+	t001lexerTraits::InputStreamType* input	= new t001lexerTraits::InputStreamType((const ANTLR_UINT8 *)data.c_str(),
+										       ANTLR_ENC_8BIT,
+										       data.length(), //strlen(data.c_str()),
+										       (ANTLR_UINT8*)"t001");
+	if (lxr == NULL)
+		lxr = new t001lexer(input);
+	else
+		lxr->setCharStream(input);
+
+	std::cout << "testValid: \"" << data << '"' <<std::endl;
+
+	t001lexerTraits::CommonTokenType *token0 = lxr->nextToken();
+	t001lexerTraits::CommonTokenType *token1 = lxr->nextToken();
+
+	std::cout << token0->getText() << std::endl;
+	std::cout << token1->getText() << std::endl;
+	
+	delete lxr; lxr = NULL;
+	delete input;
+	return 0;
+}
+
+int testIteratorInterface(string const& data)
+{
+	t001lexerTraits::InputStreamType* input	= new t001lexerTraits::InputStreamType((const ANTLR_UINT8 *)data.c_str(),
+										       ANTLR_ENC_8BIT,
+										       data.length(), //strlen(data.c_str()),
+										       (ANTLR_UINT8*)"t001");
+	if (lxr == NULL)
+		lxr = new t001lexer(input);
+	else
+		lxr->setCharStream(input);
+
+	std::cout << "testIteratorInterface: \"" << data << '"' <<std::endl;
+
+	t001lexerTraits::TokenStreamType *tstream = new t001lexerTraits::TokenStreamType(ANTLR_SIZE_HINT, lxr->get_tokSource());
+	t001lexerTraits::CommonTokenType const *token0 = tstream->_LT(1);
+	t001lexerTraits::CommonTokenType const *token1 = tstream->_LT(2);
+
+	std::cout << token0->getText() << std::endl;
+	std::cout << token1->getText() << std::endl;
+
+	delete tstream;
+	delete lxr; lxr = NULL;
+	delete input;
+	return 0;
+}
+
+int testMalformedInput(string const& data)
+{
+	t001lexerTraits::InputStreamType* input	= new t001lexerTraits::InputStreamType((const ANTLR_UINT8 *)data.c_str(),
+										       ANTLR_ENC_8BIT,
+										       data.length(), //strlen(data.c_str()),
+										       (ANTLR_UINT8*)"t001");
+	if (lxr == NULL)
+		lxr = new t001lexer(input);
+	else
+		lxr->setCharStream(input);
+
+	std::cout << "testMalformedInput: \"" << data << '"' <<std::endl;
+
+	t001lexerTraits::CommonTokenType *token0 = lxr->nextToken();
+	std::cout << token0->getText() << std::endl;
+	
+	delete lxr; lxr = NULL;
+	delete input; 
+	return 0;
+}
diff --git a/runtime/Cpp/tests/t001lexer.g b/runtime/Cpp/tests/t001lexer.g
new file mode 100644
index 0000000..a9594d4
--- /dev/null
+++ b/runtime/Cpp/tests/t001lexer.g
@@ -0,0 +1,13 @@
+lexer grammar t001lexer;
+options {
+  language =Cpp;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+ZERO: '0';
diff --git a/runtime/Cpp/tests/t002.cpp b/runtime/Cpp/tests/t002.cpp
new file mode 100644
index 0000000..776a4dc
--- /dev/null
+++ b/runtime/Cpp/tests/t002.cpp
@@ -0,0 +1,107 @@
+#include "UserTestTraits.hpp"
+#include "t002lexer.hpp"
+
+#include <sys/types.h>
+
+#include <iostream>
+#include <sstream>
+#include <fstream>
+
+using namespace Antlr3Test;
+using namespace std;
+
+int testValid(string const& data);
+int testIteratorInterface(string const& data);
+int testMalformedInput(string const& data);
+
+static t002lexer *lxr;
+static t002lexerTokens::Tokens ExpectedTokens[] =
+  {
+    t002lexerTokens::ZERO,
+    t002lexerTokens::ONE,
+    t002lexerTokens::EOF_TOKEN
+  };
+
+int main (int argc, char *argv[])
+{
+	testValid("01");
+	testIteratorInterface("01");
+	testMalformedInput("2");
+	return 0;
+}
+
+int testValid(string const& data)
+{
+	t002lexerTraits::InputStreamType* input	= new t002lexerTraits::InputStreamType((const ANTLR_UINT8 *)data.c_str(),
+										       ANTLR_ENC_8BIT,
+										       data.length(), //strlen(data.c_str()),
+										       (ANTLR_UINT8*)"t002");
+	if (lxr == NULL)
+		lxr = new t002lexer(input);
+	else
+		lxr->setCharStream(input);
+
+	std::cout << "testValid: \"" << data << '"' <<std::endl;
+
+	for(unsigned i = 0; i <= 2 ; i++)
+	{
+		// nextToken does not allocate any new Token instance(the same instance is returned again and again)
+		t002lexerTraits::CommonTokenType *token = lxr->nextToken();
+		std::cout << token->getText() << '\t'
+			  << (token->getType() == ExpectedTokens[i] ? "OK" : "Fail")
+			  << std::endl;
+		
+	}
+	delete lxr; lxr = NULL;
+	delete input; 
+	return 0;
+}
+
+int testIteratorInterface(string const& data)
+{
+	t002lexerTraits::InputStreamType* input	= new t002lexerTraits::InputStreamType((const ANTLR_UINT8 *)data.c_str(),
+										       ANTLR_ENC_8BIT,
+										       data.length(), //strlen(data.c_str()),
+										       (ANTLR_UINT8*)"t002");
+	if (lxr == NULL)
+		lxr = new t002lexer(input);
+	else
+		lxr->setCharStream(input);
+
+	std::cout << "testIteratorInterface: \"" << data << '"' <<std::endl;
+	
+	t002lexerTraits::TokenStreamType *tstream = new t002lexerTraits::TokenStreamType(ANTLR_SIZE_HINT, lxr->get_tokSource());
+	t002lexerTraits::CommonTokenType const *token0 = tstream->_LT(1);
+	t002lexerTraits::CommonTokenType const *token1 = tstream->_LT(2);
+	t002lexerTraits::CommonTokenType const *token2 = tstream->_LT(3);
+
+	std::cout << token0->getText() << std::endl;
+	std::cout << token1->getText() << std::endl;
+	std::cout << token2->getText() << std::endl;
+
+	delete tstream;
+	delete lxr; lxr = NULL;
+	delete input;
+	return 0;
+}
+
+int testMalformedInput(string const& data)
+{
+	t002lexerTraits::InputStreamType* input	= new t002lexerTraits::InputStreamType((const ANTLR_UINT8 *)data.c_str(),
+										       ANTLR_ENC_8BIT,
+										       data.length(), //strlen(data.c_str()),
+										       (ANTLR_UINT8*)"t002");
+	if (lxr == NULL)
+		lxr = new t002lexer(input);
+	else
+		lxr->setCharStream(input);
+
+	std::cout << "testMalformedInput: \"" << data << '"' <<std::endl;
+	
+	t002lexerTraits::CommonTokenType *token0 = lxr->nextToken();
+	std::cout << token0->getText() << std::endl;
+	
+	delete lxr; lxr = NULL;
+	delete input;
+	return 0;
+}
diff --git a/runtime/Cpp/tests/t002lexer.g b/runtime/Cpp/tests/t002lexer.g
new file mode 100644
index 0000000..c367547
--- /dev/null
+++ b/runtime/Cpp/tests/t002lexer.g
@@ -0,0 +1,14 @@
+lexer grammar t002lexer;
+options {
+  language =Cpp;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+ZERO: '0';
+ONE: '1';
diff --git a/runtime/Cpp/tests/t003.cpp b/runtime/Cpp/tests/t003.cpp
new file mode 100644
index 0000000..e7a163a
--- /dev/null
+++ b/runtime/Cpp/tests/t003.cpp
@@ -0,0 +1,119 @@
+#include "UserTestTraits.hpp"
+#include "t003lexer.hpp"
+
+#include <sys/types.h>
+
+#include <iostream>
+#include <sstream>
+#include <fstream>
+
+using namespace Antlr3Test;
+using namespace std;
+
+int testValid(string const& data);
+int testIteratorInterface(string const& data);
+int testMalformedInput(string const& data);
+
+static t003lexer *lxr;
+
+struct TokenData
+{
+	t003lexerTokens::Tokens type;
+	//unsigned start;
+	//unsigned stop;
+	//const char* text;
+};
+
+static TokenData ExpectedTokens[] =
+{
+	{ t003lexerTokens::ZERO      },
+	{ t003lexerTokens::FOOZE     },
+	{ t003lexerTokens::ONE       },
+	{ t003lexerTokens::EOF_TOKEN }
+};
+
+int main (int argc, char *argv[])
+{
+	testValid("0fooze1");
+	testIteratorInterface("0fooze1");
+	testMalformedInput("2");
+	return 0;
+}
+
+int testValid(string const& data)
+{
+	t003lexerTraits::InputStreamType* input	= new t003lexerTraits::InputStreamType((const ANTLR_UINT8 *)data.c_str(),
+										       ANTLR_ENC_8BIT,
+										       data.length(), //strlen(data.c_str()),
+										       (ANTLR_UINT8*)"t003");
+	if (lxr == NULL)
+		lxr = new t003lexer(input);
+	else
+		lxr->setCharStream(input);
+
+	std::cout << "testValid: \"" << data << '"' <<std::endl;
+
+	for(unsigned i = 0; i < sizeof(ExpectedTokens)/sizeof(TokenData) ; i++)
+	{
+		// nextToken does not allocate any new Token instance(the same instance is returned again and again)
+		t003lexerTraits::CommonTokenType *token = lxr->nextToken();
+		std::cout << token->getText() << '\t'
+			  << (token->getType() == ExpectedTokens[i].type ? "OK" : "Fail")
+			  << std::endl;
+		
+	}
+	delete lxr; lxr = NULL;
+	delete input; 
+	return 0;
+}
+
+int testIteratorInterface(string const& data)
+{
+	t003lexerTraits::InputStreamType* input	= new t003lexerTraits::InputStreamType((const ANTLR_UINT8 *)data.c_str(),
+										       ANTLR_ENC_8BIT,
+										       data.length(), //strlen(data.c_str()),
+										       (ANTLR_UINT8*)"t003");
+	if (lxr == NULL)
+		lxr = new t003lexer(input);
+	else
+		lxr->setCharStream(input);
+
+	std::cout << "testIteratorInterface: \"" << data << '"' <<std::endl;
+		
+	t003lexerTraits::TokenStreamType *tstream = new t003lexerTraits::TokenStreamType(ANTLR_SIZE_HINT, lxr->get_tokSource());
+	t003lexerTraits::CommonTokenType const *token0 = tstream->_LT(1);
+	t003lexerTraits::CommonTokenType const *token1 = tstream->_LT(2);
+	t003lexerTraits::CommonTokenType const *token2 = tstream->_LT(3);
+	t003lexerTraits::CommonTokenType const *token3 = tstream->_LT(4);
+
+	std::cout << token0->getText() << std::endl;
+	std::cout << token1->getText() << std::endl;
+	std::cout << token2->getText() << std::endl;
+	std::cout << token3->getText() << std::endl;
+
+	delete tstream;
+	delete lxr; lxr = NULL;
+	delete input;
+	return 0;
+}
+
+int testMalformedInput(string const& data)
+{
+	t003lexerTraits::InputStreamType* input	= new t003lexerTraits::InputStreamType((const ANTLR_UINT8 *)data.c_str(),
+										       ANTLR_ENC_8BIT,
+										       data.length(), //strlen(data.c_str()),
+										       (ANTLR_UINT8*)"t003");
+	if (lxr == NULL)
+		lxr = new t003lexer(input);
+	else
+		lxr->setCharStream(input);
+
+	std::cout << "testMalformedInput: \"" << data << '"' <<std::endl;
+	
+	t003lexerTraits::CommonTokenType *token0 = lxr->nextToken();
+	std::cout << token0->getText() << std::endl;
+	
+	delete lxr; lxr = NULL;
+	delete input;
+	return 0;
+}
diff --git a/runtime/Cpp/tests/t003lexer.g b/runtime/Cpp/tests/t003lexer.g
new file mode 100644
index 0000000..72e671b
--- /dev/null
+++ b/runtime/Cpp/tests/t003lexer.g
@@ -0,0 +1,15 @@
+lexer grammar t003lexer;
+options {
+  language =Cpp;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+ZERO: '0';
+ONE: '1';
+FOOZE: 'fooze';
diff --git a/runtime/Cpp/tests/t004.cpp b/runtime/Cpp/tests/t004.cpp
new file mode 100644
index 0000000..fc0ecd3
--- /dev/null
+++ b/runtime/Cpp/tests/t004.cpp
@@ -0,0 +1,100 @@
+#include "UserTestTraits.hpp"
+#include "t004lexer.hpp"
+
+#include <sys/types.h>
+
+#include <iostream>
+#include <sstream>
+#include <fstream>
+
+using namespace Antlr3Test;
+using namespace std;
+
+int testValid(string const& data);
+int testMalformedInput(string const& data);
+
+static t004lexer *lxr;
+
+struct TokenData
+{
+	t004lexerTokens::Tokens type;
+	unsigned start;
+	unsigned stop;
+	const char* text;
+};
+
+static TokenData ExpectedTokens[] =
+{
+	{ t004lexerTokens::FOO, 0, 0, "f"},
+	{ t004lexerTokens::FOO, 1, 2, "fo"},
+	{ t004lexerTokens::FOO, 3, 5, "foo"},
+	{ t004lexerTokens::FOO, 6, 9, "fooo"}
+};
+
+int main (int argc, char *argv[])
+{
+	testValid("ffofoofooo");
+	testMalformedInput("2");
+	return 0;
+}
+
+int testValid(string const& data)
+{
+	t004lexerTraits::InputStreamType* input	= new t004lexerTraits::InputStreamType((const ANTLR_UINT8 *)data.c_str(),
+										       ANTLR_ENC_8BIT,
+										       data.length(), //strlen(data.c_str()),
+										       (ANTLR_UINT8*)"t004");
+	if (lxr == NULL)
+		lxr = new t004lexer(input);
+	else
+		lxr->setCharStream(input);
+
+	std::cout << "testValid: \"" << data << '"' <<std::endl;
+
+	std::cout << "Text:"  << '\t'
+		  << "Type:"  << '\t'
+		  << "Start:" << '\t'
+		  << "Stop:"  << '\t'
+		  << "Text:"  << '\t' << std::endl;
+	
+	for(unsigned i = 0; i < sizeof(ExpectedTokens)/sizeof(TokenData) ; i++)
+	{
+		// nextToken does not allocate any new Token instance(the same instance is returned again and again)
+		t004lexerTraits::CommonTokenType *token = lxr->nextToken();
+
+		size_t startIndex = ((const char*)token->get_startIndex()) - data.c_str();
+		size_t stopIndex = ((const char*)token->get_stopIndex()) - data.c_str();
+
+		std::cout << token->getText()
+			  << '\t' << (token->getType()       == ExpectedTokens[i].type ?  "OK" : "Fail")
+			  << '\t' << (startIndex == ExpectedTokens[i].start ? "OK" : "Fail")
+			  << '\t' << (stopIndex  == ExpectedTokens[i].stop ?  "OK" : "Fail")
+			  << '\t' << (token->getText()       == ExpectedTokens[i].text ?  "OK" : "Fail")
+			  << std::endl;
+		
+	}
+	delete lxr; lxr = NULL;
+	delete input;
+	return 0;
+}
+
+int testMalformedInput(string const& data)
+{
+	t004lexerTraits::InputStreamType* input	= new t004lexerTraits::InputStreamType((const ANTLR_UINT8 *)data.c_str(),
+										       ANTLR_ENC_8BIT,
+										       data.length(), //strlen(data.c_str()),
+										       (ANTLR_UINT8*)"t004");
+	if (lxr == NULL)
+		lxr = new t004lexer(input);
+	else
+		lxr->setCharStream(input);
+
+	std::cout << "testMalformedInput: \"" << data << '"' <<std::endl;
+	
+	t004lexerTraits::CommonTokenType *token0 = lxr->nextToken();
+	std::cout << token0->getText() << std::endl;
+	
+	delete lxr; lxr = NULL;
+	delete input;
+	return 0;
+}
diff --git a/runtime/Cpp/tests/t004lexer.g b/runtime/Cpp/tests/t004lexer.g
new file mode 100644
index 0000000..a16e407
--- /dev/null
+++ b/runtime/Cpp/tests/t004lexer.g
@@ -0,0 +1,16 @@
+lexer grammar t004lexer;
+options {
+  language =Cpp;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+FOO: 'f' f=OO;
+
+fragment
+OO: 'o'*;
diff --git a/runtime/Cpp/tests/t005.cpp b/runtime/Cpp/tests/t005.cpp
new file mode 100644
index 0000000..7484630
--- /dev/null
+++ b/runtime/Cpp/tests/t005.cpp
@@ -0,0 +1,131 @@
+#include "UserTestTraits.hpp"
+#include "t005lexer.hpp"
+
+#include <sys/types.h>
+
+#include <iostream>
+#include <sstream>
+#include <fstream>
+
+using namespace Antlr3Test;
+using namespace std;
+
+int testValid(string const& data);
+int testMalformedInput1(string const& data);
+int testMalformedInput2(string const& data);
+
+static t005lexer *lxr;
+
+struct TokenData
+{
+	t005lexerTokens::Tokens type;
+	unsigned start;
+	unsigned stop;
+	const char* text;
+};
+
+static TokenData ExpectedTokens[] =
+{
+	// "fofoofooo"
+	{ t005lexerTokens::FOO, 0, 1, "fo"},
+	{ t005lexerTokens::FOO, 2, 4, "foo"},
+	{ t005lexerTokens::FOO, 5, 8, "fooo"},
+	{ t005lexerTokens::EOF_TOKEN, 9, 9, "<EOF>"}
+};
+
+int main (int argc, char *argv[])
+{
+	testValid("fofoofooo");
+	testMalformedInput1("2");
+	testMalformedInput2("f");
+	return 0;
+}
+
+int testValid(string const& data)
+{
+	t005lexerTraits::InputStreamType* input	= new t005lexerTraits::InputStreamType((const ANTLR_UINT8 *)data.c_str(),
+										       ANTLR_ENC_8BIT,
+										       data.length(), //strlen(data.c_str()),
+										       (ANTLR_UINT8*)"t005");
+	if (lxr == NULL)
+		lxr = new t005lexer(input);
+	else
+		lxr->setCharStream(input);
+
+	std::cout << "testValid: \"" << data << '"' <<std::endl;
+
+	std::cout << "Text:"  << '\t'
+		  << "Type:"  << '\t'
+		  << "Start:" << '\t'
+		  << "Stop:"  << '\t'
+		  << "Text:"  << '\t' << std::endl;
+	
+	for(unsigned i = 0; i < sizeof(ExpectedTokens)/sizeof(TokenData) ; i++)
+	{
+		// nextToken does not allocate any new Token instance(the same instance is returned again and again)
+		t005lexerTraits::CommonTokenType *token = lxr->nextToken();
+
+		size_t startIndex = ((const char*)token->get_startIndex()) - data.c_str();
+		size_t stopIndex = ((const char*)token->get_stopIndex()) - data.c_str();
+
+		std::cout << token->getText()
+			  << '\t' << (token->getType()       == ExpectedTokens[i].type ?  "OK" : "Fail")
+			  << '\t' << (startIndex == ExpectedTokens[i].start ? "OK" : "Fail")
+			  << '\t' << (stopIndex  == ExpectedTokens[i].stop ?  "OK" : "Fail")
+			  << '\t' << (token->getText()       == ExpectedTokens[i].text ?  "OK" : "Fail")
+			  << std::endl;
+		
+	}
+	delete lxr; lxr = NULL;
+	delete input; 
+	return 0;
+}
+
+int testMalformedInput1(string const& data)
+{
+	t005lexerTraits::InputStreamType* input	= new t005lexerTraits::InputStreamType((const ANTLR_UINT8 *)data.c_str(),
+										       ANTLR_ENC_8BIT,
+										       data.length(), //strlen(data.c_str()),
+										       (ANTLR_UINT8*)"t005");
+	if (lxr == NULL)
+		lxr = new t005lexer(input);
+	else
+		lxr->setCharStream(input);
+
+	std::cout << "testMalformedInput1: \"" << data << '"' <<std::endl;
+	
+	t005lexerTraits::CommonTokenType *token0 = lxr->nextToken();
+	std::cout << token0->getText() << std::endl;
+
+	//except antlr3.MismatchedTokenException as exc:
+	//self.assertEqual(exc.expecting, 'f')
+	//self.assertEqual(exc.unexpectedType, '2')
+
+	delete lxr; lxr = NULL;
+	delete input; 
+	return 0;
+}
+
+int testMalformedInput2(string const& data)
+{
+	t005lexerTraits::InputStreamType* input	= new t005lexerTraits::InputStreamType((const ANTLR_UINT8 *)data.c_str(),
+										       ANTLR_ENC_8BIT,
+										       data.length(), //strlen(data.c_str()),
+										       (ANTLR_UINT8*)"t005");
+	if (lxr == NULL)
+		lxr = new t005lexer(input);
+	else
+		lxr->setCharStream(input);
+
+	std::cout << "testMalformedInput2: \"" << data << '"' <<std::endl;
+	
+	t005lexerTraits::CommonTokenType *token0 = lxr->nextToken();
+	std::cout << token0->getText() << std::endl;
+
+	//except antlr3.EarlyExitException as exc:
+	//self.assertEqual(exc.unexpectedType, antlr3.EOF)
+
+	delete lxr; lxr = NULL;
+	delete input; 
+	return 0;
+}
diff --git a/runtime/Cpp/tests/t005lexer.g b/runtime/Cpp/tests/t005lexer.g
new file mode 100644
index 0000000..64e856e
--- /dev/null
+++ b/runtime/Cpp/tests/t005lexer.g
@@ -0,0 +1,13 @@
+lexer grammar t005lexer;
+options {
+  language =Cpp;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+FOO: 'f' 'o'+;
diff --git a/runtime/Cpp/tests/t006.cpp b/runtime/Cpp/tests/t006.cpp
new file mode 100644
index 0000000..38c6d2f
--- /dev/null
+++ b/runtime/Cpp/tests/t006.cpp
@@ -0,0 +1,111 @@
+#include "UserTestTraits.hpp"
+#include "t006lexer.hpp"
+
+#include <sys/types.h>
+
+#include <iostream>
+#include <sstream>
+#include <fstream>
+
+using namespace Antlr3Test;
+using namespace std;
+
+int testValid(string const& data);
+int testMalformedInput(string const& data);
+
+static t006lexer *lxr;
+
+struct TokenData
+{
+	t006lexerTokens::Tokens type;
+	unsigned start;
+	unsigned stop;
+	const char* text;
+};
+
+static TokenData ExpectedTokens[] =
+{
+	// "fofaaooa"
+	{ t006lexerTokens::FOO, 0, 1, "fo"},
+	{ t006lexerTokens::FOO, 2, 7, "faaooa"},
+	{ t006lexerTokens::EOF_TOKEN, 8, 8, "<EOF>"}
+};
+
+int main (int argc, char *argv[])
+{
+	testValid("fofaaooa");
+	testMalformedInput("fofoaooaoa2");
+	return 0;
+}
+
+int testValid(string const& data)
+{
+	t006lexerTraits::InputStreamType* input	= new t006lexerTraits::InputStreamType((const ANTLR_UINT8 *)data.c_str(),
+										       ANTLR_ENC_8BIT,
+										       data.length(), //strlen(data.c_str()),
+										       (ANTLR_UINT8*)"t006");
+	if (lxr == NULL)
+		lxr = new t006lexer(input);
+	else
+		lxr->setCharStream(input);
+
+	std::cout << "testValid: \"" << data << '"' <<std::endl;
+
+	std::cout << "Text:"  << '\t'
+		  << "Type:"  << '\t'
+		  << "Start:" << '\t'
+		  << "Stop:"  << '\t'
+		  << "Text:"  << '\t' << std::endl;
+	
+	for(unsigned i = 0; i < sizeof(ExpectedTokens)/sizeof(TokenData) ; i++)
+	{
+		// nextToken does not allocate any new Token instance(the same instance is returned again and again)
+		t006lexerTraits::CommonTokenType *token = lxr->nextToken();
+
+		size_t startIndex = ((const char*)token->get_startIndex()) - data.c_str();
+		size_t stopIndex = ((const char*)token->get_stopIndex()) - data.c_str();
+
+		std::cout << token->getText()
+			  << '\t' << (token->getType()       == ExpectedTokens[i].type ?  "OK" : "Fail")
+			  << '\t' << (startIndex == ExpectedTokens[i].start ? "OK" : "Fail")
+			  << '\t' << (stopIndex  == ExpectedTokens[i].stop ?  "OK" : "Fail")
+			  << '\t' << (token->getText()       == ExpectedTokens[i].text ?  "OK" : "Fail")
+			  << std::endl;
+		
+	}
+	delete lxr; lxr = NULL;
+	delete input; 
+	return 0;
+}
+
+int testMalformedInput(string const& data)
+{
+	t006lexerTraits::InputStreamType* input	= new t006lexerTraits::InputStreamType((const ANTLR_UINT8 *)data.c_str(),
+										       ANTLR_ENC_8BIT,
+										       data.length(), //strlen(data.c_str()),
+										       (ANTLR_UINT8*)"t006");
+	if (lxr == NULL)
+		lxr = new t006lexer(input);
+	else
+		lxr->setCharStream(input);
+
+	std::cout << "testMalformedInput: \"" << data << '"' <<std::endl;
+	
+	t006lexerTraits::CommonTokenType *token;
+	token = lxr->nextToken();
+	std::cout << token->getText() << std::endl;
+	token = lxr->nextToken();
+	std::cout << token->getText() << std::endl;
+	token = lxr->nextToken();
+	std::cout << token->getText() << std::endl;
+
+    //except antlr3.MismatchedTokenException as exc:
+    //self.assertEqual(exc.expecting, 'f')
+    //self.assertEqual(exc.unexpectedType, '2')
+    //self.assertEqual(exc.charPositionInLine, 10)
+    //self.assertEqual(exc.line, 1)
+
+	delete lxr; lxr = NULL;
+	delete input; 
+	return 0;
+}
diff --git a/runtime/Cpp/tests/t006lexer.g b/runtime/Cpp/tests/t006lexer.g
new file mode 100644
index 0000000..ce7a9a2
--- /dev/null
+++ b/runtime/Cpp/tests/t006lexer.g
@@ -0,0 +1,13 @@
+lexer grammar t006lexer;
+options {
+  language =Cpp;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+FOO: 'f' ('o' | 'a')*;
diff --git a/runtime/Cpp/tests/t007.cpp b/runtime/Cpp/tests/t007.cpp
new file mode 100644
index 0000000..dc9b5a3
--- /dev/null
+++ b/runtime/Cpp/tests/t007.cpp
@@ -0,0 +1,105 @@
+#include "UserTestTraits.hpp"
+#include "t007lexer.hpp"
+
+#include <sys/types.h>
+
+#include <iostream>
+#include <sstream>
+#include <fstream>
+
+using namespace Antlr3Test;
+using namespace std;
+
+int testValid(string const& data);
+int testMalformedInput(string const& data);
+
+static t007lexer *lxr;
+
+struct TokenData
+{
+	t007lexerTokens::Tokens type;
+	unsigned start;
+	unsigned stop;
+	const char* text;
+};
+
+static TokenData ExpectedTokens[] =
+{
+	// "fofababbooabb"
+	{ t007lexerTokens::FOO, 0, 1, "fo"},
+	{ t007lexerTokens::FOO, 2, 12, "fababbooabb"},
+	{ t007lexerTokens::EOF_TOKEN, 13, 13, "<EOF>"}
+};
+
+int main (int argc, char *argv[])
+{
+	testValid("fofababbooabb");
+	testMalformedInput("foaboao");
+	return 0;
+}
+
+int testValid(string const& data)
+{
+	t007lexerTraits::InputStreamType* input	= new t007lexerTraits::InputStreamType((const ANTLR_UINT8 *)data.c_str(),
+										       ANTLR_ENC_8BIT,
+										       data.length(), //strlen(data.c_str()),
+										       (ANTLR_UINT8*)"t007");
+	if (lxr == NULL)
+		lxr = new t007lexer(input);
+	else
+		lxr->setCharStream(input);
+
+	std::cout << "testValid: \"" << data << '"' <<std::endl;
+
+	std::cout << "Text:"  << '\t'
+		  << "Type:"  << '\t'
+		  << "Start:" << '\t'
+		  << "Stop:"  << '\t'
+		  << "Text:"  << '\t' << std::endl;
+	
+	for(unsigned i = 0; i < sizeof(ExpectedTokens)/sizeof(TokenData) ; i++)
+	{
+		// nextToken does not allocate any new Token instance(the same instance is returned again and again)
+		t007lexerTraits::CommonTokenType *token = lxr->nextToken();
+
+		size_t startIndex = ((const char*)token->get_startIndex()) - data.c_str();
+		size_t stopIndex = ((const char*)token->get_stopIndex()) - data.c_str();
+
+		std::cout << token->getText()
+			  << '\t' << (token->getType()       == ExpectedTokens[i].type ?  "OK" : "Fail")
+			  << '\t' << (startIndex == ExpectedTokens[i].start ? "OK" : "Fail")
+			  << '\t' << (stopIndex  == ExpectedTokens[i].stop ?  "OK" : "Fail")
+			  << '\t' << (token->getText()       == ExpectedTokens[i].text ?  "OK" : "Fail")
+			  << std::endl;
+		
+	}
+	delete lxr; lxr = NULL;
+	delete input; 
+	return 0;
+}
+
+int testMalformedInput(string const& data)
+{
+	t007lexerTraits::InputStreamType* input	= new t007lexerTraits::InputStreamType((const ANTLR_UINT8 *)data.c_str(),
+										       ANTLR_ENC_8BIT,
+										       data.length(), //strlen(data.c_str()),
+										       (ANTLR_UINT8*)"t007");
+	if (lxr == NULL)
+		lxr = new t007lexer(input);
+	else
+		lxr->setCharStream(input);
+
+	std::cout << "testMalformedInput: \"" << data << '"' <<std::endl;
+	
+	t007lexerTraits::CommonTokenType *token0 = lxr->nextToken();
+	std::cout << token0->getText() << std::endl;
+
+    //except antlr3.EarlyExitException as exc:
+    //   self.assertEqual(exc.unexpectedType, 'o')
+    //   self.assertEqual(exc.charPositionInLine, 6)
+    //   self.assertEqual(exc.line, 1)
+
+	delete lxr; lxr = NULL;
+	delete input; 
+	return 0;
+}
diff --git a/runtime/Cpp/tests/t007lexer.g b/runtime/Cpp/tests/t007lexer.g
new file mode 100644
index 0000000..1eac531
--- /dev/null
+++ b/runtime/Cpp/tests/t007lexer.g
@@ -0,0 +1,13 @@
+lexer grammar t007lexer;
+options {
+  language =Cpp;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+FOO: 'f' ('o' | 'a' 'b'+)*;
diff --git a/runtime/Cpp/tests/t008.cpp b/runtime/Cpp/tests/t008.cpp
new file mode 100644
index 0000000..fbb541b
--- /dev/null
+++ b/runtime/Cpp/tests/t008.cpp
@@ -0,0 +1,111 @@
+#include "UserTestTraits.hpp"
+#include "t008lexer.hpp"
+
+#include <sys/types.h>
+
+#include <iostream>
+#include <sstream>
+#include <fstream>
+
+using namespace Antlr3Test;
+using namespace std;
+
+int testValid(string const& data);
+int testMalformedInput(string const& data);
+
+static t008lexer *lxr;
+
+struct TokenData
+{
+	t008lexerTokens::Tokens type;
+	unsigned start;
+	unsigned stop;
+	const char* text;
+};
+
+static TokenData ExpectedTokens[] =
+{
+	// "ffaf"
+	{ t008lexerTokens::FOO, 0, 0, "f"},
+	{ t008lexerTokens::FOO, 1, 2, "fa"},
+	{ t008lexerTokens::FOO, 3, 3, "f"},
+	{ t008lexerTokens::EOF_TOKEN, 4, 4, "<EOF>"}
+};
+
+int main (int argc, char *argv[])
+{
+	testValid("ffaf");
+	testMalformedInput("fafb");
+	return 0;
+}
+
+int testValid(string const& data)
+{
+	t008lexerTraits::InputStreamType* input	= new t008lexerTraits::InputStreamType((const ANTLR_UINT8 *)data.c_str(),
+										       ANTLR_ENC_8BIT,
+										       data.length(), //strlen(data.c_str()),
+										       (ANTLR_UINT8*)"t008");
+	if (lxr == NULL)
+		lxr = new t008lexer(input);
+	else
+		lxr->setCharStream(input);
+
+	std::cout << "testValid: \"" << data << '"' <<std::endl;
+
+	std::cout << "Text:"  << '\t'
+		  << "Type:"  << '\t'
+		  << "Start:" << '\t'
+		  << "Stop:"  << '\t'
+		  << "Text:"  << '\t' << std::endl;
+	
+	for(unsigned i = 0; i < sizeof(ExpectedTokens)/sizeof(TokenData) ; i++)
+	{
+		// nextToken does not allocate any new Token instance(the same instance is returned again and again)
+		t008lexerTraits::CommonTokenType *token = lxr->nextToken();
+
+		size_t startIndex = ((const char*)token->get_startIndex()) - data.c_str();
+		size_t stopIndex = ((const char*)token->get_stopIndex()) - data.c_str();
+
+		std::cout << token->getText()
+			  << '\t' << (token->getType()       == ExpectedTokens[i].type ?  "OK" : "Fail")
+			  << '\t' << (startIndex == ExpectedTokens[i].start ? "OK" : "Fail")
+			  << '\t' << (stopIndex  == ExpectedTokens[i].stop ?  "OK" : "Fail")
+			  << '\t' << (token->getText()       == ExpectedTokens[i].text ?  "OK" : "Fail")
+			  << std::endl;
+		
+	}
+	delete lxr; lxr = NULL;
+	delete input; 
+	return 0;
+}
+
+int testMalformedInput(string const& data)
+{
+	t008lexerTraits::InputStreamType* input	= new t008lexerTraits::InputStreamType((const ANTLR_UINT8 *)data.c_str(),
+										       ANTLR_ENC_8BIT,
+										       data.length(), //strlen(data.c_str()),
+										       (ANTLR_UINT8*)"t008");
+	if (lxr == NULL)
+		lxr = new t008lexer(input);
+	else
+		lxr->setCharStream(input);
+
+	std::cout << "testMalformedInput: \"" << data << '"' <<std::endl;
+	
+	t008lexerTraits::CommonTokenType *token;
+	token = lxr->nextToken();
+	std::cout << token->getText() << std::endl;
+	token = lxr->nextToken();
+	std::cout << token->getText() << std::endl;
+	token = lxr->nextToken();
+	std::cout << token->getText() << std::endl;
+
+	//except antlr3.MismatchedTokenException as exc:
+    //   self.assertEqual(exc.unexpectedType, 'b')
+    //   self.assertEqual(exc.charPositionInLine, 3)
+    //   self.assertEqual(exc.line, 1)
+
+	delete lxr; lxr = NULL;
+	delete input; 
+	return 0;
+}
diff --git a/runtime/Cpp/tests/t008lexer.g b/runtime/Cpp/tests/t008lexer.g
new file mode 100644
index 0000000..0294155
--- /dev/null
+++ b/runtime/Cpp/tests/t008lexer.g
@@ -0,0 +1,13 @@
+lexer grammar t008lexer;
+options {
+  language =Cpp;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+FOO: 'f' 'a'?;
diff --git a/runtime/Cpp/tests/t009.cpp b/runtime/Cpp/tests/t009.cpp
new file mode 100644
index 0000000..75b2fca
--- /dev/null
+++ b/runtime/Cpp/tests/t009.cpp
@@ -0,0 +1,111 @@
+#include "UserTestTraits.hpp"
+#include "t009lexer.hpp"
+
+#include <sys/types.h>
+
+#include <iostream>
+#include <sstream>
+#include <fstream>
+
+using namespace Antlr3Test;
+using namespace std;
+
+int testValid(string const& data);
+int testMalformedInput(string const& data);
+
+static t009lexer *lxr;
+
+struct TokenData
+{
+	t009lexerTokens::Tokens type;
+	unsigned start;
+	unsigned stop;
+	const char* text;
+};
+
+static TokenData ExpectedTokens[] =
+{
+	// "085"
+	{ t009lexerTokens::DIGIT, 0, 0, "0"},
+	{ t009lexerTokens::DIGIT, 1, 1, "8"},
+	{ t009lexerTokens::DIGIT, 2, 2, "5"},
+	{ t009lexerTokens::EOF_TOKEN, 3, 3, "<EOF>"}
+};
+
+int main (int argc, char *argv[])
+{
+	testValid("085"); 
+	testMalformedInput("2a");
+	return 0;
+}
+
+int testValid(string const& data)
+{
+	t009lexerTraits::InputStreamType* input	= new t009lexerTraits::InputStreamType((const ANTLR_UINT8 *)data.c_str(),
+										       ANTLR_ENC_8BIT,
+										       data.length(), //strlen(data.c_str()),
+										       (ANTLR_UINT8*)"t009");
+	if (lxr == NULL)
+		lxr = new t009lexer(input);
+	else
+		lxr->setCharStream(input);
+
+	std::cout << "testValid: \"" << data << '"' <<std::endl;
+
+	std::cout << "Text:"  << '\t'
+		  << "Type:"  << '\t'
+		  << "Start:" << '\t'
+		  << "Stop:"  << '\t'
+		  << "Text:"  << '\t' << std::endl;
+	
+	for(unsigned i = 0; i < sizeof(ExpectedTokens)/sizeof(TokenData) ; i++)
+	{
+		// nextToken does not allocate any new Token instance(the same instance is returned again and again)
+		t009lexerTraits::CommonTokenType *token = lxr->nextToken();
+
+		size_t startIndex = ((const char*)token->get_startIndex()) - data.c_str();
+		size_t stopIndex = ((const char*)token->get_stopIndex()) - data.c_str();
+
+		std::cout << token->getText()
+			  << '\t' << (token->getType()       == ExpectedTokens[i].type ?  "OK" : "Fail")
+			  << '\t' << (startIndex == ExpectedTokens[i].start ? "OK" : "Fail")
+			  << '\t' << (stopIndex  == ExpectedTokens[i].stop ?  "OK" : "Fail")
+			  << '\t' << (token->getText()       == ExpectedTokens[i].text ?  "OK" : "Fail")
+			  << std::endl;
+		
+	}
+	delete lxr; lxr = NULL;
+	delete input; 
+	return 0;
+}
+
+int testMalformedInput(string const& data)
+{
+	t009lexerTraits::InputStreamType* input	= new t009lexerTraits::InputStreamType((const ANTLR_UINT8 *)data.c_str(),
+										       ANTLR_ENC_8BIT,
+										       data.length(), //strlen(data.c_str()),
+										       (ANTLR_UINT8*)"t009");
+	if (lxr == NULL)
+		lxr = new t009lexer(input);
+	else
+		lxr->setCharStream(input);
+
+	std::cout << "testMalformedInput: \"" << data << '"' <<std::endl;
+	
+	t009lexerTraits::CommonTokenType *token;
+	token = lxr->nextToken();
+	std::cout << token->getText() << std::endl;
+	token = lxr->nextToken();
+	std::cout << token->getText() << std::endl;
+
+	//except antlr3.MismatchedSetException as exc:
+	//   # TODO: This should provide more useful information
+	//   self.assertIsNone(exc.expecting)
+	//   self.assertEqual(exc.unexpectedType, 'a')
+	//   self.assertEqual(exc.charPositionInLine, 1)
+	//   self.assertEqual(exc.line, 1)
+
+	delete lxr; lxr = NULL;
+	delete input; 
+	return 0;
+}
diff --git a/runtime/Cpp/tests/t009lexer.g b/runtime/Cpp/tests/t009lexer.g
new file mode 100644
index 0000000..928f97b
--- /dev/null
+++ b/runtime/Cpp/tests/t009lexer.g
@@ -0,0 +1,13 @@
+lexer grammar t009lexer;
+options {
+  language =Cpp;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+DIGIT: '0' .. '9';
diff --git a/runtime/Cpp/tests/t010.cpp b/runtime/Cpp/tests/t010.cpp
new file mode 100644
index 0000000..0b9fca7
--- /dev/null
+++ b/runtime/Cpp/tests/t010.cpp
@@ -0,0 +1,111 @@
+#include "UserTestTraits.hpp"
+#include "t010lexer.hpp"
+
+#include <sys/types.h>
+
+#include <iostream>
+#include <sstream>
+#include <fstream>
+
+using namespace Antlr3Test;
+using namespace std;
+
+int testValid(string const& data);
+int testMalformedInput(string const& data);
+
+static t010lexer *lxr;
+
+struct TokenData
+{
+	t010lexerTokens::Tokens type;
+	unsigned start;
+	unsigned stop;
+	const char* text;
+};
+
+static TokenData ExpectedTokens[] =
+{
+	// "foobar _Ab98 \n A12sdf"
+	{ t010lexerTokens::IDENTIFIER,  0,   5, "foobar"},
+	{ t010lexerTokens::WS,          6,   6, " "},
+	{ t010lexerTokens::IDENTIFIER,  7,  11, "_Ab98"},
+	{ t010lexerTokens::WS,         12, 14, " \n "},
+	{ t010lexerTokens::IDENTIFIER, 15, 20, "A12sdf"},
+	{ t010lexerTokens::EOF_TOKEN,  21, 21, "<EOF>"}
+};
+
+int main (int argc, char *argv[])
+{
+	testValid("foobar _Ab98 \n A12sdf");
+	testMalformedInput("a-b");
+	return 0;
+}
+
+int testValid(string const& data)
+{
+	t010lexerTraits::InputStreamType* input	= new t010lexerTraits::InputStreamType((const ANTLR_UINT8 *)data.c_str(),
+										       ANTLR_ENC_8BIT,
+										       data.length(), //strlen(data.c_str()),
+										       (ANTLR_UINT8*)"t010");
+	if (lxr == NULL)
+		lxr = new t010lexer(input);
+	else
+		lxr->setCharStream(input);
+
+	std::cout << "testValid: \"" << data << '"' <<std::endl;
+
+	std::cout << "Text:"  << '\t'
+		  << "Type:"  << '\t'
+		  << "Start:" << '\t'
+		  << "Stop:"  << '\t'
+		  << "Text:"  << '\t' << std::endl;
+	
+	for(unsigned i = 0; i < sizeof(ExpectedTokens)/sizeof(TokenData) ; i++)
+	{
+		// nextToken does not allocate any new Token instance(the same instance is returned again and again)
+		t010lexerTraits::CommonTokenType *token = lxr->nextToken();
+
+		size_t startIndex = ((const char*)token->get_startIndex()) - data.c_str();
+		size_t stopIndex = ((const char*)token->get_stopIndex()) - data.c_str();
+
+		std::cout << token->getText()
+			  << '\t' << (token->getType()       == ExpectedTokens[i].type ?  "OK" : "Fail")
+			  << '\t' << (startIndex == ExpectedTokens[i].start ? "OK" : "Fail")
+			  << '\t' << (stopIndex  == ExpectedTokens[i].stop ?  "OK" : "Fail")
+			  << '\t' << (token->getText()       == ExpectedTokens[i].text ?  "OK" : "Fail")
+			  << std::endl;
+		
+	}
+	delete lxr; lxr = NULL;
+	delete input; 
+	return 0;
+}
+
+int testMalformedInput(string const& data)
+{
+	t010lexerTraits::InputStreamType* input	= new t010lexerTraits::InputStreamType((const ANTLR_UINT8 *)data.c_str(),
+										       ANTLR_ENC_8BIT,
+										       data.length(), //strlen(data.c_str()),
+										       (ANTLR_UINT8*)"t010");
+	if (lxr == NULL)
+		lxr = new t010lexer(input);
+	else
+		lxr->setCharStream(input);
+
+	std::cout << "testMalformedInput: \"" << data << '"' <<std::endl;
+	
+	t010lexerTraits::CommonTokenType *token;
+	token = lxr->nextToken();
+	std::cout << token->getText() << std::endl;
+	token = lxr->nextToken();
+	std::cout << token->getText() << std::endl;
+
+	//except antlr3.NoViableAltException as exc:
+	//    self.assertEqual(exc.unexpectedType, '-')
+	//    self.assertEqual(exc.charPositionInLine, 1)
+	//    self.assertEqual(exc.line, 1)
+
+	delete lxr; lxr = NULL;
+	delete input; 
+	return 0;
+}
diff --git a/runtime/Cpp/tests/t010lexer.g b/runtime/Cpp/tests/t010lexer.g
new file mode 100644
index 0000000..bb5a53e
--- /dev/null
+++ b/runtime/Cpp/tests/t010lexer.g
@@ -0,0 +1,14 @@
+lexer grammar t010lexer;
+options {
+  language =Cpp;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+IDENTIFIER: ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*;
+WS: (' ' | '\n')+;
diff --git a/runtime/Cpp/tests/t011.cpp b/runtime/Cpp/tests/t011.cpp
new file mode 100644
index 0000000..d8e40c7
--- /dev/null
+++ b/runtime/Cpp/tests/t011.cpp
@@ -0,0 +1,113 @@
+#include "UserTestTraits.hpp"
+#include "t011lexer.hpp"
+
+#include <sys/types.h>
+
+#include <iostream>
+#include <sstream>
+#include <fstream>
+
+using namespace Antlr3Test;
+using namespace std;
+
+int testValid(string const& data);
+int testMalformedInput(string const& data);
+
+static t011lexer *lxr;
+
+struct TokenData
+{
+	t011lexerTokens::Tokens type;
+	unsigned start;
+	unsigned stop;
+	const char* text;
+};
+
+static TokenData ExpectedTokens[] =
+{
+	// "foobar _Ab98 \n A12sdf"
+	{ t011lexerTokens::IDENTIFIER,  0,   5, "foobar"},
+	{ t011lexerTokens::WS,          6,   6, " "},
+	{ t011lexerTokens::IDENTIFIER,  7,  11, "_Ab98"},
+	{ t011lexerTokens::WS,         12, 14, " \n "},
+	{ t011lexerTokens::IDENTIFIER, 15, 20, "A12sdf"},
+	{ t011lexerTokens::EOF_TOKEN,  21, 21, "<EOF>"}
+};
+
+int main (int argc, char *argv[])
+{
+	testValid("foobar _Ab98 \n A12sdf");
+	testMalformedInput("a-b");
+	return 0;
+}
+
+int testValid(string const& data)
+{
+	t011lexerTraits::InputStreamType* input	= new t011lexerTraits::InputStreamType((const ANTLR_UINT8 *)data.c_str(),
+										       ANTLR_ENC_8BIT,
+										       data.length(), //strlen(data.c_str()),
+										       (ANTLR_UINT8*)"t011");
+	if (lxr == NULL)
+		lxr = new t011lexer(input);
+	else
+		lxr->setCharStream(input);
+
+	std::cout << "testValid: \"" << data << '"' <<std::endl;
+
+	std::cout << "Text:"  << '\t'
+		  << "Type:"  << '\t'
+		  << "Start:" << '\t'
+		  << "Stop:"  << '\t'
+		  << "Text:"  << '\t' << std::endl;
+	
+	for(unsigned i = 0; i < sizeof(ExpectedTokens)/sizeof(TokenData) ; i++)
+	{
+		// nextToken does not allocate any new Token instance(the same instance is returned again and again)
+		t011lexerTraits::CommonTokenType *token = lxr->nextToken();
+
+		size_t startIndex = ((const char*)token->get_startIndex()) - data.c_str();
+		size_t stopIndex = ((const char*)token->get_stopIndex()) - data.c_str();
+
+		std::cout << token->getText()
+			  << '\t' << (token->getType()       == ExpectedTokens[i].type ?  "OK" : "Fail")
+			  << '\t' << (startIndex == ExpectedTokens[i].start ? "OK" : "Fail")
+			  << '\t' << (stopIndex  == ExpectedTokens[i].stop ?  "OK" : "Fail")
+			  << '\t' << (token->getText()       == ExpectedTokens[i].text ?  "OK" : "Fail")
+			  << std::endl;
+		
+	}
+	delete lxr; lxr = NULL;
+	delete input; 
+	return 0;
+}
+
+int testMalformedInput(string const& data)
+{
+	t011lexerTraits::InputStreamType* input	= new t011lexerTraits::InputStreamType((const ANTLR_UINT8 *)data.c_str(),
+										       ANTLR_ENC_8BIT,
+										       data.length(), //strlen(data.c_str()),
+										       (ANTLR_UINT8*)"t011");
+	if (lxr == NULL)
+		lxr = new t011lexer(input);
+	else
+		lxr->setCharStream(input);
+
+	std::cout << "testMalformedInput: \"" << data << '"' <<std::endl;
+	
+	t011lexerTraits::CommonTokenType *token;
+	token = lxr->nextToken();
+	std::cout << token->getText() << std::endl;
+	token = lxr->nextToken();
+	std::cout << token->getText() << std::endl;
+	token = lxr->nextToken();
+	std::cout << token->getText() << std::endl;
+
+	//except antlr3.NoViableAltException as exc:
+	//    self.assertEqual(exc.unexpectedType, '-')
+	//    self.assertEqual(exc.charPositionInLine, 1)
+	//    self.assertEqual(exc.line, 1)
+
+	delete lxr; lxr = NULL;
+	delete input; 
+	return 0;
+}
diff --git a/runtime/Cpp/tests/t011lexer.g b/runtime/Cpp/tests/t011lexer.g
new file mode 100644
index 0000000..06a8704
--- /dev/null
+++ b/runtime/Cpp/tests/t011lexer.g
@@ -0,0 +1,27 @@
+lexer grammar t011lexer;
+options {
+  language =Cpp;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+#include <iostream>
+}
+@lexer::namespace
+{ Antlr3Test }
+
+IDENTIFIER: 
+        ('a'..'z'|'A'..'Z'|'_') 
+        ('a'..'z'
+        |'A'..'Z'
+        |'0'..'9'
+        |'_'
+            { 
+              std::cout << "Underscore";
+              std::cout << "foo";
+            }
+        )*
+    ;
+
+WS: (' ' | '\n')+;
diff --git a/runtime/Cpp/tests/t012.cpp b/runtime/Cpp/tests/t012.cpp
new file mode 100644
index 0000000..fe9d0c9
--- /dev/null
+++ b/runtime/Cpp/tests/t012.cpp
@@ -0,0 +1,187 @@
+#include "UserTestTraits.hpp"
+#include "t012lexerXMLLexer.hpp"
+
+#include <sys/types.h>
+
+#include <iostream>
+#include <sstream>
+#include <fstream>
+
+using namespace Antlr3Test;
+using namespace std;
+
+int testValid(string const& in, string const& out);
+int testMalformedInput1(string const& data);
+int testMalformedInput2(string const& data);
+int testMalformedInput3(string const& data);
+string slurp(string const& fileName);
+
+static t012lexerXMLLexer *lxr;
+
+int main (int argc, char *argv[])
+{
+	testValid("t012lexerXML.input", "t012lexerXML.output");
+	testMalformedInput1("<?xml version='1.0'?>\n<document d>\n</document>\n");
+	testMalformedInput2("<?tml version='1.0'?>\n<document>\n</document>\n");
+	testMalformedInput3("<?xml version='1.0'?>\n<docu ment attr=\"foo\">\n</document>\n");
+
+	return 0;
+}
+
+int testValid(string const& inFilename, string const& outFilename)
+{
+	string data = slurp(inFilename);
+	t012lexerXMLLexerTraits::InputStreamType* input	= new t012lexerXMLLexerTraits::InputStreamType((const ANTLR_UINT8 *)data.c_str(),
+										       ANTLR_ENC_8BIT,
+										       data.length(), //strlen(data.c_str()),
+											   (ANTLR_UINT8*)inFilename.c_str());
+	if (lxr == NULL)
+		lxr = new t012lexerXMLLexer(input);
+	else
+		lxr->setCharStream(input);
+
+	std::cout << "testValid: \"" << inFilename << '"' <<std::endl;
+	for(;;)
+	{
+		t012lexerXMLLexerTraits::CommonTokenType *token = lxr->nextToken();
+		if( token->getType() == t012lexerXMLLexerTokens::EOF_TOKEN)
+			break;
+	}
+	
+	string expOutput = slurp(outFilename);
+	string lxrOutput = lxr->outbuf.str();
+
+	ofstream out("t012.lxr.output");
+	out << lxrOutput;
+
+	std::cout << inFilename << '\t' << (expOutput == lxrOutput ?  "OK" : "Fail") << std::endl;
+
+	delete lxr; lxr = NULL;
+	delete input; 
+	return 0;
+}
+
+int testMalformedInput1(string const& data)
+{
+	t012lexerXMLLexerTraits::InputStreamType* input	= new t012lexerXMLLexerTraits::InputStreamType((const ANTLR_UINT8 *)data.c_str(),
+										       ANTLR_ENC_8BIT,
+										       data.length(), //strlen(data.c_str()),
+										       (ANTLR_UINT8*)"t012");
+	if (lxr == NULL)
+		lxr = new t012lexerXMLLexer(input);
+	else
+		lxr->setCharStream(input);
+
+	std::cout << "testMalformedInput1: \"" << data << '"' <<std::endl;
+	
+	t012lexerXMLLexerTraits::CommonTokenType *token;
+	token = lxr->nextToken();
+	std::cout << token->getText() << std::endl;
+	token = lxr->nextToken();
+	std::cout << token->getText() << std::endl;
+	token = lxr->nextToken();
+	std::cout << token->getText() << std::endl;
+
+        // try:
+        //     while True:
+        //         token = lexer.nextToken()
+        //         # Should raise NoViableAltException before hitting EOF
+        //         if token.type == antlr3.EOF:
+        //             self.fail()
+	//
+        // except antlr3.NoViableAltException as exc:
+        //     self.assertEqual(exc.unexpectedType, '>')
+        //     self.assertEqual(exc.charPositionInLine, 11)
+        //     self.assertEqual(exc.line, 2)
+
+	delete lxr; lxr = NULL;
+	delete input; 
+	return 0;
+}
+
+int testMalformedInput2(string const& data)
+{
+	t012lexerXMLLexerTraits::InputStreamType* input	= new t012lexerXMLLexerTraits::InputStreamType((const ANTLR_UINT8 *)data.c_str(),
+										       ANTLR_ENC_8BIT,
+										       data.length(), //strlen(data.c_str()),
+										       (ANTLR_UINT8*)"t012");
+	if (lxr == NULL)
+		lxr = new t012lexerXMLLexer(input);
+	else
+		lxr->setCharStream(input);
+
+	std::cout << "testMalformedInput2: \"" << data << '"' <<std::endl;
+	
+	t012lexerXMLLexerTraits::CommonTokenType *token;
+	token = lxr->nextToken();
+	std::cout << token->getText() << std::endl;
+	token = lxr->nextToken();
+	std::cout << token->getText() << std::endl;
+	token = lxr->nextToken();
+	std::cout << token->getText() << std::endl;
+
+        // try:
+        //     while True:
+        //         token = lexer.nextToken()
+        //         # Should raise NoViableAltException before hitting EOF
+        //         if token.type == antlr3.EOF:
+        //             self.fail()
+	//
+        // except antlr3.MismatchedSetException as exc:
+        //     self.assertEqual(exc.unexpectedType, 't')
+        //     self.assertEqual(exc.charPositionInLine, 2)
+        //     self.assertEqual(exc.line, 1)
+
+	delete lxr; lxr = NULL;
+	delete input; 
+	return 0;
+}
+
+int testMalformedInput3(string const& data)
+{
+	t012lexerXMLLexerTraits::InputStreamType* input	= new t012lexerXMLLexerTraits::InputStreamType((const ANTLR_UINT8 *)data.c_str(),
+										       ANTLR_ENC_8BIT,
+										       data.length(), //strlen(data.c_str()),
+										       (ANTLR_UINT8*)"t012");
+	if (lxr == NULL)
+		lxr = new t012lexerXMLLexer(input);
+	else
+		lxr->setCharStream(input);
+
+	std::cout << "testMalformedInput3: \"" << data << '"' <<std::endl;
+	
+	t012lexerXMLLexerTraits::CommonTokenType *token;
+	token = lxr->nextToken();
+	std::cout << token->getText() << std::endl;
+	token = lxr->nextToken();
+	std::cout << token->getText() << std::endl;
+	token = lxr->nextToken();
+	std::cout << token->getText() << std::endl;
+
+        // try:
+        //     while True:
+        //         token = lexer.nextToken()
+        //         # Should raise NoViableAltException before hitting EOF
+        //         if token.type == antlr3.EOF:
+        //             self.fail()
+	//
+        // except antlr3.NoViableAltException as exc:
+        //     self.assertEqual(exc.unexpectedType, 'a')
+        //     self.assertEqual(exc.charPositionInLine, 11)
+        //     self.assertEqual(exc.line, 2)
+
+	delete lxr; lxr = NULL;
+	delete input; 
+	return 0;
+}
+ 
+string slurp(string const& fileName)
+{
+	ifstream ifs(fileName.c_str(), ios::in | ios::binary | ios::ate);
+	ifstream::pos_type fileSize = ifs.tellg();
+	ifs.seekg(0, ios::beg);
+
+	stringstream sstr;
+	sstr << ifs.rdbuf();
+	return sstr.str();
+}
diff --git a/runtime/Cpp/tests/t012lexerXML.input b/runtime/Cpp/tests/t012lexerXML.input
new file mode 100644
index 0000000..1815a9f
--- /dev/null
+++ b/runtime/Cpp/tests/t012lexerXML.input
@@ -0,0 +1,21 @@
+<?xml version='1.0'?>
+<!DOCTYPE component [
+<!ELEMENT component (PCDATA|sub)*>
+<!ATTLIST component
+          attr CDATA #IMPLIED
+          attr2 CDATA #IMPLIED
+>
+<!ELMENT sub EMPTY>
+
+]>
+<component attr="val'ue" attr2='val"ue'>
+<!-- This is a comment -->
+Text
+<![CDATA[huhu]]>
+öäüß
+&amp;
+&lt;
+<?xtal cursor='11'?>
+<sub/>
+<sub></sub>
+</component>
\ No newline at end of file
diff --git a/runtime/Cpp/tests/t012lexerXML.output b/runtime/Cpp/tests/t012lexerXML.output
new file mode 100644
index 0000000..825c37f
--- /dev/null
+++ b/runtime/Cpp/tests/t012lexerXML.output
@@ -0,0 +1,39 @@
+XML declaration
+Attr: version='1.0'
+ROOTELEMENT: component
+INTERNAL DTD: [
+<!ELEMENT component (PCDATA|sub)*>
+<!ATTLIST component
+          attr CDATA #IMPLIED
+          attr2 CDATA #IMPLIED
+>
+<!ELMENT sub EMPTY>
+
+]
+Start Tag: component
+Attr: attr="val'ue"
+Attr: attr2='val"ue'
+PCDATA: "
+"
+Comment: "<!-- This is a comment -->"
+PCDATA: "
+Text
+"
+CDATA: "<![CDATA[huhu]]>"
+PCDATA: "
+öäüß
+&amp;
+&lt;
+"
+PI: xtal
+Attr: cursor='11'
+PCDATA: "
+"
+Empty Element: sub
+PCDATA: "
+"
+Start Tag: sub
+End Tag: sub
+PCDATA: "
+"
+End Tag: component
diff --git a/runtime/Cpp/tests/t012lexerXMLLexer.g b/runtime/Cpp/tests/t012lexerXMLLexer.g
new file mode 100644
index 0000000..5edd2a0
--- /dev/null
+++ b/runtime/Cpp/tests/t012lexerXMLLexer.g
@@ -0,0 +1,156 @@
+lexer grammar t012lexerXMLLexer;
+options {
+  language =Cpp;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+#include <iostream>
+}
+@lexer::namespace
+{ Antlr3Test }
+
+@lexer::context {
+ImplTraits::StringStreamType outbuf;
+
+void output(const char* line)
+{
+    outbuf << line << "\r\n";
+}
+
+void output(const char* line1, const char *line2)
+{
+    outbuf << line1 << line2 << "\r\n";
+}
+
+void output(const char* line1, ImplTraits::StringType const& line2)
+{
+    outbuf << line1 << line2 << "\r\n";
+}
+
+void appendArribute(const char* prefix, ImplTraits::StringType const& name, ImplTraits::StringType const& value)
+{
+    outbuf << prefix << name << '=' << value << "\r\n";
+}
+
+void appendString(const char* name, ImplTraits::StringType const& value)
+{
+    outbuf << name << '"' << value << '"' << "\r\n";
+}
+
+}
+DOCUMENT
+    :  XMLDECL? WS? DOCTYPE? WS? ELEMENT WS? 
+    ;
+
+fragment DOCTYPE
+    :
+        '<!DOCTYPE' WS rootElementName=GENERIC_ID 
+        { output("ROOTELEMENT: ", $rootElementName.text);}
+        WS
+        ( 
+            ( 'SYSTEM' WS sys1=VALUE
+                {output("SYSTEM: ", $sys1.text);}
+                
+            | 'PUBLIC' WS pub=VALUE WS sys2=VALUE
+                {output("PUBLIC: ", $pub.text);}
+                {output("SYSTEM: ", $sys2.text);}   
+            )
+            ( WS )?
+        )?
+        ( dtd=INTERNAL_DTD
+            {output("INTERNAL DTD: ", $dtd.text);}
+        )?
+		'>'
+	;
+
+fragment INTERNAL_DTD : '[' (options {greedy=false;} : .)* ']' ;
+
+fragment PI :
+        '<?' target=GENERIC_ID WS? 
+          {output("PI: ", $target.text);}
+        ( ATTRIBUTE WS? )*  '?>'
+	;
+
+fragment XMLDECL :
+        '<?' ('x'|'X') ('m'|'M') ('l'|'L') WS? 
+          {output("XML declaration");}
+        ( ATTRIBUTE WS? )*  '?>'
+	;
+
+
+fragment ELEMENT
+    : ( START_TAG
+            (ELEMENT
+            | t=PCDATA
+                {appendString("PCDATA: ", $t.text);}
+            | t=CDATA
+                {appendString("CDATA: ", $t.text);}
+            | t=COMMENT
+                {appendString("Comment: ", $t.text);}
+            | pi=PI
+            )*
+            END_TAG
+        | EMPTY_ELEMENT
+        )
+    ;
+
+fragment START_TAG 
+    : '<' WS? name=GENERIC_ID WS?
+          {output("Start Tag: ", $name.text);}
+        ( ATTRIBUTE WS? )* '>'
+    ;
+
+fragment EMPTY_ELEMENT 
+    : '<' WS? name=GENERIC_ID WS?
+          {output("Empty Element: ", $name.text);}
+        ( ATTRIBUTE WS? )* '/>'
+    ;
+
+fragment ATTRIBUTE 
+    : name=GENERIC_ID WS? '=' WS? value=VALUE
+        {appendArribute("Attr: ", $name.text, $value.text);}
+    ;
+
+fragment END_TAG 
+    : '</' WS? name=GENERIC_ID WS? '>'
+        {output("End Tag: ", $name.text);}
+    ;
+
+fragment COMMENT
+	:	'<!--' (options {greedy=false;} : .)* '-->'
+	;
+
+fragment CDATA
+	:	'<![CDATA[' (options {greedy=false;} : .)* ']]>'
+	;
+
+fragment PCDATA : (~'<')+ ; 
+
+fragment VALUE : 
+        ( '\"' (~'\"')* '\"'
+        | '\'' (~'\'')* '\''
+        )
+	;
+
+fragment GENERIC_ID 
+    : ( LETTER | '_' | ':') 
+        ( options {greedy=true;} : LETTER | '0'..'9' | '.' | '-' | '_' | ':' )*
+	;
+
+fragment LETTER
+	: 'a'..'z' 
+	| 'A'..'Z'
+	;
+
+fragment WS  :
+        (   ' '
+        |   '\t'
+        |  ( '\n'
+            |	'\r\n'
+            |	'\r'
+            )
+        )+
+    ;    
+
diff --git a/runtime/Cpp/tests/t013parser.g b/runtime/Cpp/tests/t013parser.g
new file mode 100644
index 0000000..c962132
--- /dev/null
+++ b/runtime/Cpp/tests/t013parser.g
@@ -0,0 +1,36 @@
+grammar t013parser;
+options {
+  language =Cpp;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+@parser::includes {
+#include "UserTestTraits.hpp"
+}
+@parser::namespace
+{ Antlr3Test }
+
+@parser::init {
+self.identifiers = []
+self.reportedErrors = []
+}
+
+@parser::members {
+def foundIdentifier(self, name):
+    self.identifiers.append(name)
+
+def emitErrorMessage(self, msg):
+    self.reportedErrors.append(msg)
+}
+
+document:
+        t=IDENTIFIER {self.foundIdentifier($t.text)}
+        ;
+
+IDENTIFIER: ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*;
diff --git a/runtime/Cpp/tests/t014parser.g b/runtime/Cpp/tests/t014parser.g
new file mode 100644
index 0000000..4fa5d1d
--- /dev/null
+++ b/runtime/Cpp/tests/t014parser.g
@@ -0,0 +1,48 @@
+grammar t014parser;
+options {
+  language =Cpp;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+@parser::includes {
+#include "UserTestTraits.hpp"
+}
+@parser::namespace
+{ Antlr3Test }
+
+@parser::init {
+self.events = []
+self.reportedErrors = []
+}
+
+@parser::members {
+def emitErrorMessage(self, msg):
+    self.reportedErrors.append(msg)
+}
+        
+
+document:
+        ( declaration
+        | call
+        )*
+        EOF
+    ;
+
+declaration:
+        'var' t=IDENTIFIER ';'
+        {self.events.append(('decl', $t.text))}
+    ;
+
+call:
+        t=IDENTIFIER '(' ')' ';'
+        {self.events.append(('call', $t.text))}
+    ;
+
+IDENTIFIER: ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*;
+WS:  (' '|'\r'|'\t'|'\n') {$channel=HIDDEN;};
diff --git a/runtime/Cpp/tests/t015calc.g b/runtime/Cpp/tests/t015calc.g
new file mode 100644
index 0000000..5af908a
--- /dev/null
+++ b/runtime/Cpp/tests/t015calc.g
@@ -0,0 +1,67 @@
+grammar t015calc;
+options {
+  language =Cpp;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+@parser::includes {
+#include "UserTestTraits.hpp"
+}
+@parser::namespace
+{ Antlr3Test }
+
+@header {
+import math
+}
+
+@parser::init {
+self.reportedErrors = []
+}
+
+@parser::members {
+def emitErrorMessage(self, msg):
+    self.reportedErrors.append(msg)
+}
+
+evaluate returns [result]: r=expression {result = r};
+
+expression returns [result]: r=mult (
+    '+' r2=mult {r += r2}
+  | '-' r2=mult {r -= r2}
+  )* {result = r};
+
+mult returns [result]: r=log (
+    '*' r2=log {r *= r2}
+  | '/' r2=log {r /= r2}
+//  | '%' r2=log {r %= r2}
+  )* {result = r};
+
+log returns [result]: 'ln' r=exp {result = math.log(r)}
+    | r=exp {result = r}
+    ;
+
+exp returns [result]: r=atom ('^' r2=atom {r = math.pow(r,r2)} )? {result = r}
+    ;
+
+atom returns [result]:
+    n=INTEGER {result = int($n.text)}
+  | n=DECIMAL {result = float($n.text)} 
+  | '(' r=expression {result = r} ')'
+  | 'PI' {result = math.pi}
+  | 'E' {result = math.e}
+  ;
+
+INTEGER: DIGIT+;
+
+DECIMAL: DIGIT+ '.' DIGIT+;
+
+fragment
+DIGIT: '0'..'9';
+
+WS: (' ' | '\n' | '\t')+ {$channel = HIDDEN};
diff --git a/runtime/Cpp/tests/t016actions.g b/runtime/Cpp/tests/t016actions.g
new file mode 100644
index 0000000..ca2189a
--- /dev/null
+++ b/runtime/Cpp/tests/t016actions.g
@@ -0,0 +1,44 @@
+grammar t016actions;
+options {
+  language =Cpp;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+@parser::includes {
+#include "UserTestTraits.hpp"
+}
+@parser::namespace
+{ Antlr3Test }
+
+declaration returns [name]
+    :   functionHeader ';'
+        {$name = $functionHeader.name}
+    ;
+
+functionHeader returns [name]
+    :   type ID
+	{$name = $ID.text}
+    ;
+
+type
+    :   'int'   
+    |   'char'  
+    |   'void'
+    ;
+
+ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
+    ;
+
+WS  :   (   ' '
+        |   '\t'
+        |   '\r'
+        |   '\n'
+        )+
+        {$channel=HIDDEN}
+    ;    
diff --git a/runtime/Cpp/tests/t017parser.g b/runtime/Cpp/tests/t017parser.g
new file mode 100644
index 0000000..cd251b9
--- /dev/null
+++ b/runtime/Cpp/tests/t017parser.g
@@ -0,0 +1,104 @@
+grammar t017parser;
+
+options {
+    language =Cpp;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+@parser::includes {
+#include "UserTestTraits.hpp"
+}
+@parser::namespace
+{ Antlr3Test }
+
+program
+    :   declaration+
+    ;
+
+declaration
+    :   variable
+    |   functionHeader ';'
+    |   functionHeader block
+    ;
+
+variable
+    :   type declarator ';'
+    ;
+
+declarator
+    :   ID 
+    ;
+
+functionHeader
+    :   type ID '(' ( formalParameter ( ',' formalParameter )* )? ')'
+    ;
+
+formalParameter
+    :   type declarator        
+    ;
+
+type
+    :   'int'   
+    |   'char'  
+    |   'void'
+    |   ID        
+    ;
+
+block
+    :   '{'
+            variable*
+            stat*
+        '}'
+    ;
+
+stat: forStat
+    | expr ';'      
+    | block
+    | assignStat ';'
+    | ';'
+    ;
+
+forStat
+    :   'for' '(' assignStat ';' expr ';' assignStat ')' block        
+    ;
+
+assignStat
+    :   ID '=' expr        
+    ;
+
+expr:   condExpr
+    ;
+
+condExpr
+    :   aexpr ( ('==' | '<') aexpr )?
+    ;
+
+aexpr
+    :   atom ( '+' atom )*
+    ;
+
+atom
+    : ID      
+    | INT      
+    | '(' expr ')'
+    ; 
+
+ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
+    ;
+
+INT :	('0'..'9')+
+    ;
+
+WS  :   (   ' '
+        |   '\t'
+        |   '\r'
+        |   '\n'
+        )+
+        {$channel=HIDDEN}
+    ;    
diff --git a/runtime/Cpp/tests/t018llstar.g b/runtime/Cpp/tests/t018llstar.g
new file mode 100644
index 0000000..e682d2c
--- /dev/null
+++ b/runtime/Cpp/tests/t018llstar.g
@@ -0,0 +1,124 @@
+grammar t018llstar;
+
+options {
+    language =Cpp;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+@parser::includes {
+#include "UserTestTraits.hpp"
+}
+@parser::namespace
+{ Antlr3Test }
+
+@header {
+from io import StringIO
+}
+
+@init {
+self.output = StringIO()
+}
+
+program
+    :   declaration+
+    ;
+
+/** In this rule, the functionHeader left prefix on the last two
+ *  alternatives is not LL(k) for a fixed k.  However, it is
+ *  LL(*).  The LL(*) algorithm simply scans ahead until it sees
+ *  either the ';' or the '{' of the block and then it picks
+ *  the appropriate alternative.  Lookhead can be arbitrarily
+ *  long in theory, but is <=10 in most cases.  Works great.
+ *  Use ANTLRWorks to see the lookahead use (step by Location)
+ *  and look for blue tokens in the input window pane. :)
+ */
+declaration
+    :   variable
+    |   functionHeader ';'
+	{self.output.write($functionHeader.name+" is a declaration\n")}
+    |   functionHeader block
+	{self.output.write($functionHeader.name+" is a definition\n")}
+    ;
+
+variable
+    :   type declarator ';'
+    ;
+
+declarator
+    :   ID 
+    ;
+
+functionHeader returns [name]
+    :   type ID '(' ( formalParameter ( ',' formalParameter )* )? ')'
+	{$name = $ID.text}
+    ;
+
+formalParameter
+    :   type declarator        
+    ;
+
+type
+    :   'int'   
+    |   'char'  
+    |   'void'
+    |   ID        
+    ;
+
+block
+    :   '{'
+            variable*
+            stat*
+        '}'
+    ;
+
+stat: forStat
+    | expr ';'      
+    | block
+    | assignStat ';'
+    | ';'
+    ;
+
+forStat
+    :   'for' '(' assignStat ';' expr ';' assignStat ')' block        
+    ;
+
+assignStat
+    :   ID '=' expr        
+    ;
+
+expr:   condExpr
+    ;
+
+condExpr
+    :   aexpr ( ('==' | '<') aexpr )?
+    ;
+
+aexpr
+    :   atom ( '+' atom )*
+    ;
+
+atom
+    : ID      
+    | INT      
+    | '(' expr ')'
+    ; 
+
+ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
+    ;
+
+INT :	('0'..'9')+
+    ;
+
+WS  :   (   ' '
+        |   '\t'
+        |   '\r'
+        |   '\n'
+        )+
+        {$channel=HIDDEN}
+    ;    
diff --git a/runtime/Cpp/tests/t019lexer.g b/runtime/Cpp/tests/t019lexer.g
new file mode 100644
index 0000000..192f993
--- /dev/null
+++ b/runtime/Cpp/tests/t019lexer.g
@@ -0,0 +1,71 @@
+lexer grammar t019lexer;
+options {
+    language=Cpp;
+    filter=true;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+IMPORT
+	:	'import' WS name=QIDStar WS? ';'
+	;
+	
+/** Avoids having "return foo;" match as a field */
+RETURN
+	:	'return' (options {greedy=false;}:.)* ';'
+	;
+
+CLASS
+	:	'class' WS name=ID WS? ('extends' WS QID WS?)?
+		('implements' WS QID WS? (',' WS? QID WS?)*)? '{'
+	;
+	
+COMMENT
+    :   '/*' (options {greedy=false;} : . )* '*/'
+    ;
+
+STRING
+    :	'"' (options {greedy=false;}: ESC | .)* '"'
+	;
+
+CHAR
+	:	'\'' (options {greedy=false;}: ESC | .)* '\''
+	;
+
+WS  :   (' '|'\t'|'\n')+
+    ;
+
+fragment
+QID :	ID ('.' ID)*
+	;
+	
+/** QID cannot see beyond end of token so using QID '.*'? somewhere won't
+ *  ever match since k=1 lookahead in the QID loop of '.' will make it loop.
+ *  I made this rule to compensate.
+ */
+fragment
+QIDStar
+	:	ID ('.' ID)* '.*'?
+	;
+
+fragment
+TYPE:   QID '[]'?
+    ;
+    
+fragment
+ARG :   TYPE WS ID
+    ;
+
+fragment
+ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*
+    ;
+
+fragment
+ESC	:	'\\' ('"'|'\''|'\\')
+	;
+
diff --git a/runtime/Cpp/tests/t020fuzzyLexer.g b/runtime/Cpp/tests/t020fuzzyLexer.g
new file mode 100644
index 0000000..0fc913f
--- /dev/null
+++ b/runtime/Cpp/tests/t020fuzzyLexer.g
@@ -0,0 +1,103 @@
+lexer grammar t020fuzzyLexer;
+options {
+    language=Cpp;
+    filter=true;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+@header {
+from io import StringIO
+}
+
+@init {
+self.output = StringIO()
+}
+
+IMPORT
+	:	'import' WS name=QIDStar WS? ';'
+	;
+	
+/** Avoids having "return foo;" match as a field */
+RETURN
+	:	'return' (options {greedy=false;}:.)* ';'
+	;
+
+CLASS
+	:	'class' WS name=ID WS? ('extends' WS QID WS?)?
+		('implements' WS QID WS? (',' WS? QID WS?)*)? '{'
+        {self.output.write("found class "+$name.text+"\n")}
+	;
+	
+METHOD
+    :   TYPE WS name=ID WS? '(' ( ARG WS? (',' WS? ARG WS?)* )? ')' WS? 
+       ('throws' WS QID WS? (',' WS? QID WS?)*)? '{'
+        {self.output.write("found method "+$name.text+"\n");}
+    ;
+
+FIELD
+    :   TYPE WS name=ID '[]'? WS? (';'|'=')
+        {self.output.write("found var "+$name.text+"\n");}
+    ;
+
+STAT:	('if'|'while'|'switch'|'for') WS? '(' ;
+	
+CALL
+    :   name=QID WS? '('
+        {self.output.write("found call "+$name.text+"\n");}
+    ;
+
+COMMENT
+    :   '/*' (options {greedy=false;} : . )* '*/'
+        {self.output.write("found comment "+self.getText()+"\n");}
+    ;
+
+SL_COMMENT
+    :   '//' (options {greedy=false;} : . )* '\n'
+        {self.output.write("found // comment "+self.getText()+"\n");}
+    ;
+	
+STRING
+	:	'"' (options {greedy=false;}: ESC | .)* '"'
+	;
+
+CHAR
+	:	'\'' (options {greedy=false;}: ESC | .)* '\''
+	;
+
+WS  :   (' '|'\t'|'\n')+
+    ;
+
+fragment
+QID :	ID ('.' ID)*
+	;
+	
+/** QID cannot see beyond end of token so using QID '.*'? somewhere won't
+ *  ever match since k=1 lookahead in the QID loop of '.' will make it loop.
+ *  I made this rule to compensate.
+ */
+fragment
+QIDStar
+	:	ID ('.' ID)* '.*'?
+	;
+
+fragment
+TYPE:   QID '[]'?
+    ;
+    
+fragment
+ARG :   TYPE WS ID
+    ;
+
+fragment
+ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*
+    ;
+
+fragment
+ESC	:	'\\' ('"'|'\''|'\\')
+	;
diff --git a/runtime/Cpp/tests/t021hoist.g b/runtime/Cpp/tests/t021hoist.g
new file mode 100644
index 0000000..51201c1
--- /dev/null
+++ b/runtime/Cpp/tests/t021hoist.g
@@ -0,0 +1,50 @@
+grammar t021hoist;
+options {
+    language=Cpp;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+@parser::includes {
+#include "UserTestTraits.hpp"
+}
+@parser::namespace
+{ Antlr3Test }
+
+/* With this true, enum is seen as a keyword.  False, it's an identifier */
+@parser::init {
+self.enableEnum = False
+}
+
+stat returns [enumIs]
+    : identifier    {enumIs = "ID"}
+    | enumAsKeyword {enumIs = "keyword"}
+    ;
+
+identifier
+    : ID
+    | enumAsID
+    ;
+
+enumAsKeyword : {self.enableEnum}? 'enum' ;
+
+enumAsID : {not self.enableEnum}? 'enum' ;
+
+ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
+    ;
+
+INT :	('0'..'9')+
+    ;
+
+WS  :   (   ' '
+        |   '\t'
+        |   '\r'
+        |   '\n'
+        )+
+        {$channel=HIDDEN}
+    ;    
diff --git a/runtime/Cpp/tests/t022scopes.g b/runtime/Cpp/tests/t022scopes.g
new file mode 100644
index 0000000..b7870c0
--- /dev/null
+++ b/runtime/Cpp/tests/t022scopes.g
@@ -0,0 +1,138 @@
+grammar t022scopes;
+
+options {
+    language=Cpp;
+}
+
+/* global scopes */
+scope aScope {
+names
+}
+
+@lexer::includes{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+@parser::includes {
+#include "UserTestTraits.hpp"
+}
+@parser::namespace
+{ Antlr3Test }
+
+a
+scope aScope;
+    :   {$aScope::names = [];} ID*
+    ;
+
+
+/* rule scopes, from the book, final beta, p.147 */
+
+b[v]
+scope {x}
+    : {$b::x = v;} b2
+    ;
+
+b2
+    : b3
+    ;
+
+b3 
+    : {$b::x}?=> ID // only visible, if b was called with True
+    | NUM
+    ;
+
+
+/* rule scopes, from the book, final beta, p.148 */
+
+c returns [res]
+scope {
+    symbols
+}
+@init {
+    $c::symbols = set();
+}
+    : '{' c1* c2+ '}'
+        { $res = $c::symbols; }
+    ;
+
+c1
+    : 'int' ID {$c::symbols.add($ID.text)} ';'
+    ;
+
+c2
+    : ID '=' NUM ';'
+        {
+            if $ID.text not in $c::symbols:
+                raise RuntimeError($ID.text)
+        }
+    ;
+
+/* recursive rule scopes, from the book, final beta, p.150 */
+
+d returns [res]
+scope {
+    symbols
+}
+@init {
+    $d::symbols = set();
+}
+    : '{' d1* d2* '}'
+        { $res = $d::symbols; }
+    ;
+
+d1
+    : 'int' ID {$d::symbols.add($ID.text)} ';'
+    ;
+
+d2
+    : ID '=' NUM ';'
+        {
+            for s in reversed(range(len($d))):
+                if $ID.text in $d[s]::symbols:
+                    break
+            else:
+                raise RuntimeError($ID.text)
+        }
+    | d
+    ;
+
+/* recursive rule scopes, access bottom-most scope */
+
+e returns [res]
+scope {
+    a
+}
+@after {
+    $res = $e::a;
+}
+    : NUM { $e[0]::a = int($NUM.text); }
+    | '{' e '}'
+    ;
+
+
+/* recursive rule scopes, access with negative index */
+
+f returns [res]
+scope {
+    a
+}
+@after {
+    $res = $f::a;
+}
+    : NUM { $f[-2]::a = int($NUM.text); }
+    | '{' f '}'
+    ;
+
+
+/* tokens */
+
+ID  :   ('a'..'z')+
+    ;
+
+NUM :   ('0'..'9')+
+    ;
+
+WS  :   (' '|'\n'|'\r')+ {$channel=HIDDEN}
+    ;
diff --git a/runtime/Cpp/tests/t023scopes.g b/runtime/Cpp/tests/t023scopes.g
new file mode 100644
index 0000000..f5b89fb
--- /dev/null
+++ b/runtime/Cpp/tests/t023scopes.g
@@ -0,0 +1,31 @@
+grammar t023scopes;
+
+options {
+    language=Cpp;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+@parser::includes {
+#include "UserTestTraits.hpp"
+}
+@parser::namespace
+{ Antlr3Test }
+
+prog
+scope {
+name
+}
+    :   ID {$prog::name=$ID.text;}
+    ;
+
+ID  :   ('a'..'z')+
+    ;
+
+WS  :   (' '|'\n'|'\r')+ {$channel=HIDDEN}
+    ;
diff --git a/runtime/Cpp/tests/t024finally.g b/runtime/Cpp/tests/t024finally.g
new file mode 100644
index 0000000..2cbda0a
--- /dev/null
+++ b/runtime/Cpp/tests/t024finally.g
@@ -0,0 +1,32 @@
+grammar t024finally;
+
+options {
+    language=Cpp;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+@parser::includes {
+#include "UserTestTraits.hpp"
+}
+@parser::namespace
+{ Antlr3Test }
+
+prog returns [events]
+@init {events = []}
+@after {events.append('after')}
+    :   ID {raise RuntimeError}
+    ;
+    catch [RuntimeError] {events.append('catch')}
+    finally {events.append('finally')}
+
+ID  :   ('a'..'z')+
+    ;
+
+WS  :   (' '|'\n'|'\r')+ {$channel=HIDDEN}
+    ;
diff --git a/runtime/Cpp/tests/t025lexerRulePropertyRef.g b/runtime/Cpp/tests/t025lexerRulePropertyRef.g
new file mode 100644
index 0000000..3271dd4
--- /dev/null
+++ b/runtime/Cpp/tests/t025lexerRulePropertyRef.g
@@ -0,0 +1,25 @@
+lexer grammar t025lexerRulePropertyRef;
+options {
+  language =Cpp;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+@lexer::init {
+self.properties = []
+}
+
+IDENTIFIER: 
+        ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
+        {
+self.properties.append(
+    ($text, $type, $line, $pos, $index, $channel, $start, $stop)
+)
+        }
+    ;
+WS: (' ' | '\n')+;
diff --git a/runtime/Cpp/tests/t026actions.g b/runtime/Cpp/tests/t026actions.g
new file mode 100644
index 0000000..d699c06
--- /dev/null
+++ b/runtime/Cpp/tests/t026actions.g
@@ -0,0 +1,52 @@
+grammar t026actions;
+options {
+  language =Cpp;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+@parser::includes {
+#include "UserTestTraits.hpp"
+}
+@parser::namespace
+{ Antlr3Test }
+
+@lexer::init {
+    self.foobar = 'attribute;'
+}
+
+prog
+@init {
+    self.capture('init;')
+}
+@after {
+    self.capture('after;')
+}
+    :   IDENTIFIER EOF
+    ;
+    catch [ RecognitionException as exc ] {
+        self.capture('catch;')
+        raise
+    }
+    finally {
+        self.capture('finally;')
+    }
+
+
+IDENTIFIER
+    : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
+        {
+            # a comment
+          self.capture('action;')
+            self.capture('{!r} {!r} {!r} {!r} {!r} {!r} {!r} {!r};'.format($text, $type, $line, $pos, $index, $channel, $start, $stop))
+            if True:
+                self.capture(self.foobar)
+        }
+    ;
+
+WS: (' ' | '\n')+;
diff --git a/runtime/Cpp/tests/t027eof.g b/runtime/Cpp/tests/t027eof.g
new file mode 100644
index 0000000..6cf6d6a
--- /dev/null
+++ b/runtime/Cpp/tests/t027eof.g
@@ -0,0 +1,15 @@
+lexer grammar t027eof;
+
+options {
+    language=Cpp;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+END: EOF;
+SPACE: ' ';
diff --git a/runtime/Cpp/tests/t029synpredgate.g b/runtime/Cpp/tests/t029synpredgate.g
new file mode 100644
index 0000000..5a1a4ab
--- /dev/null
+++ b/runtime/Cpp/tests/t029synpredgate.g
@@ -0,0 +1,23 @@
+lexer grammar t029synpredgate;
+options {
+  language =Cpp;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+FOO
+    : ('ab')=> A
+    | ('ac')=> B
+    ;
+
+fragment
+A: 'a';
+
+fragment
+B: 'a';
+
diff --git a/runtime/Cpp/tests/t030specialStates.g b/runtime/Cpp/tests/t030specialStates.g
new file mode 100644
index 0000000..62d2dbf
--- /dev/null
+++ b/runtime/Cpp/tests/t030specialStates.g
@@ -0,0 +1,39 @@
+grammar t030specialStates;
+options {
+  language =Cpp;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+@parser::includes {
+#include "UserTestTraits.hpp"
+}
+@parser::namespace
+{ Antlr3Test }
+
+@init {
+self.cond = True
+}
+
+@members {
+def recover(self, input, re):
+    # no error recovery yet, just crash!
+    raise re
+}
+
+r
+    : ( {self.cond}? NAME
+        | {not self.cond}? NAME WS+ NAME
+        )
+        ( WS+ NAME )?
+        EOF
+    ;
+
+NAME: ('a'..'z') ('a'..'z' | '0'..'9')+;
+NUMBER: ('0'..'9')+;
+WS: ' '+;
diff --git a/runtime/Cpp/tests/t031emptyAlt.g b/runtime/Cpp/tests/t031emptyAlt.g
new file mode 100644
index 0000000..23b32f3
--- /dev/null
+++ b/runtime/Cpp/tests/t031emptyAlt.g
@@ -0,0 +1,29 @@
+grammar t031emptyAlt;
+options {
+  language =Cpp;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+@parser::includes {
+#include "UserTestTraits.hpp"
+}
+@parser::namespace
+{ Antlr3Test }
+
+r
+    : NAME 
+        ( {self.cond}?=> WS+ NAME
+        | 
+        )
+        EOF
+    ;
+
+NAME: ('a'..'z') ('a'..'z' | '0'..'9')+;
+NUMBER: ('0'..'9')+;
+WS: ' '+;
diff --git a/runtime/Cpp/tests/t032subrulePredict.g b/runtime/Cpp/tests/t032subrulePredict.g
new file mode 100644
index 0000000..4b760e1
--- /dev/null
+++ b/runtime/Cpp/tests/t032subrulePredict.g
@@ -0,0 +1,21 @@
+grammar t032subrulePredict;
+options {
+  language =Cpp;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+@parser::includes {
+#include "UserTestTraits.hpp"
+}
+@parser::namespace
+{ Antlr3Test }
+
+a: 'BEGIN' b WS+ 'END';
+b: ( WS+ 'A' )+;
+WS: ' ';
diff --git a/runtime/Cpp/tests/t033backtracking.g b/runtime/Cpp/tests/t033backtracking.g
new file mode 100644
index 0000000..a5b233b
--- /dev/null
+++ b/runtime/Cpp/tests/t033backtracking.g
@@ -0,0 +1,528 @@
+grammar t033backtracking;
+options {
+    language=Cpp;
+    backtrack=true;
+    memoize=true;
+    k=2;
+}
+
+scope Symbols {
+	types;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+@parser::includes {
+#include "UserTestTraits.hpp"
+}
+@parser::namespace
+{ Antlr3Test }
+
+@members {
+    def isTypeName(self, name):
+        for scope in reversed(self.Symbols_stack):
+            if name in scope.types:
+                return True
+
+        return False
+
+}
+
+translation_unit
+scope Symbols; // entire file is a scope
+@init {
+  $Symbols::types = set()
+}
+	: external_declaration+
+	;
+
+/** Either a function definition or any other kind of C decl/def.
+ *  The LL(*) analysis algorithm fails to deal with this due to
+ *  recursion in the declarator rules.  I'm putting in a
+ *  manual predicate here so that we don't backtrack over
+ *  the entire function.  Further, you get a better error
+ *  as errors within the function itself don't make it fail
+ *  to predict that it's a function.  Weird errors previously.
+ *  Remember: the goal is to avoid backtrack like the plague
+ *  because it makes debugging, actions, and errors harder.
+ *
+ *  Note that k=1 results in a much smaller predictor for the 
+ *  fixed lookahead; k=2 made a few extra thousand lines. ;)
+ *  I'll have to optimize that in the future.
+ */
+external_declaration
+options {k=1;}
+	: ( declaration_specifiers? declarator declaration* '{' )=> function_definition
+	| declaration
+	;
+
+function_definition
+scope Symbols; // put parameters and locals into same scope for now
+@init {
+  $Symbols::types = set()
+}
+	:	declaration_specifiers? declarator
+// 		(	declaration+ compound_statement	// K&R style
+// 		|	compound_statement				// ANSI style
+// 		)
+	;
+
+declaration
+scope {
+  isTypedef;
+}
+@init {
+  $declaration::isTypedef = False
+}
+	: 'typedef' declaration_specifiers? {$declaration::isTypedef = True}
+	  init_declarator_list ';' // special case, looking for typedef	
+	| declaration_specifiers init_declarator_list? ';'
+	;
+
+declaration_specifiers
+	:   (   storage_class_specifier
+		|   type_specifier
+        |   type_qualifier
+        )+
+	;
+
+init_declarator_list
+	: init_declarator (',' init_declarator)*
+	;
+
+init_declarator
+	: declarator //('=' initializer)?
+	;
+
+storage_class_specifier
+	: 'extern'
+	| 'static'
+	| 'auto'
+	| 'register'
+	;
+
+type_specifier
+	: 'void'
+	| 'char'
+	| 'short'
+	| 'int'
+	| 'long'
+	| 'float'
+	| 'double'
+	| 'signed'
+	| 'unsigned'
+// 	| struct_or_union_specifier
+// 	| enum_specifier
+	| type_id
+	;
+
+type_id
+    :   {self.isTypeName(self.input.LT(1).getText())}? IDENTIFIER
+//    	{System.out.println($IDENTIFIER.text+" is a type");}
+    ;
+
+// struct_or_union_specifier
+// options {k=3;}
+// scope Symbols; // structs are scopes
+// @init {
+//   $Symbols::types = set()
+// }
+// 	: struct_or_union IDENTIFIER? '{' struct_declaration_list '}'
+// 	| struct_or_union IDENTIFIER
+// 	;
+
+// struct_or_union
+// 	: 'struct'
+// 	| 'union'
+// 	;
+
+// struct_declaration_list
+// 	: struct_declaration+
+// 	;
+
+// struct_declaration
+// 	: specifier_qualifier_list struct_declarator_list ';'
+// 	;
+
+// specifier_qualifier_list
+// 	: ( type_qualifier | type_specifier )+
+// 	;
+
+// struct_declarator_list
+// 	: struct_declarator (',' struct_declarator)*
+// 	;
+
+// struct_declarator
+// 	: declarator (':' constant_expression)?
+// 	| ':' constant_expression
+// 	;
+
+// enum_specifier
+// options {k=3;}
+// 	: 'enum' '{' enumerator_list '}'
+// 	| 'enum' IDENTIFIER '{' enumerator_list '}'
+// 	| 'enum' IDENTIFIER
+// 	;
+
+// enumerator_list
+// 	: enumerator (',' enumerator)*
+// 	;
+
+// enumerator
+// 	: IDENTIFIER ('=' constant_expression)?
+// 	;
+
+type_qualifier
+	: 'const'
+	| 'volatile'
+	;
+
+declarator
+	: pointer? direct_declarator
+	| pointer
+	;
+
+direct_declarator
+	:   (	IDENTIFIER
+			{
+			if $declaration and $declaration::isTypedef:
+				$Symbols::types.add($IDENTIFIER.text)
+				print("define type "+$IDENTIFIER.text)
+			}
+		|	'(' declarator ')'
+		)
+        declarator_suffix*
+	;
+
+declarator_suffix
+	:   /*'[' constant_expression ']'
+    |*/   '[' ']'
+//     |   '(' parameter_type_list ')'
+//     |   '(' identifier_list ')'
+    |   '(' ')'
+	;
+
+pointer
+	: '*' type_qualifier+ pointer?
+	| '*' pointer
+	| '*'
+	;
+
+// parameter_type_list
+// 	: parameter_list (',' '...')?
+// 	;
+
+// parameter_list
+// 	: parameter_declaration (',' parameter_declaration)*
+// 	;
+
+// parameter_declaration
+// 	: declaration_specifiers (declarator|abstract_declarator)*
+// 	;
+
+// identifier_list
+// 	: IDENTIFIER (',' IDENTIFIER)*
+// 	;
+
+// type_name
+// 	: specifier_qualifier_list abstract_declarator?
+// 	;
+
+// abstract_declarator
+// 	: pointer direct_abstract_declarator?
+// 	| direct_abstract_declarator
+// 	;
+
+// direct_abstract_declarator
+// 	:	( '(' abstract_declarator ')' | abstract_declarator_suffix ) abstract_declarator_suffix*
+// 	;
+
+// abstract_declarator_suffix
+// 	:	'[' ']'
+// 	|	'[' constant_expression ']'
+// 	|	'(' ')'
+// 	|	'(' parameter_type_list ')'
+// 	;
+	
+// initializer
+// 	: assignment_expression
+// 	| '{' initializer_list ','? '}'
+// 	;
+
+// initializer_list
+// 	: initializer (',' initializer)*
+// 	;
+
+// // E x p r e s s i o n s
+
+// argument_expression_list
+// 	:   assignment_expression (',' assignment_expression)*
+// 	;
+
+// additive_expression
+// 	: (multiplicative_expression) ('+' multiplicative_expression | '-' multiplicative_expression)*
+// 	;
+
+// multiplicative_expression
+// 	: (cast_expression) ('*' cast_expression | '/' cast_expression | '%' cast_expression)*
+// 	;
+
+// cast_expression
+// 	: '(' type_name ')' cast_expression
+// 	| unary_expression
+// 	;
+
+// unary_expression
+// 	: postfix_expression
+// 	| '++' unary_expression
+// 	| '--' unary_expression
+// 	| unary_operator cast_expression
+// 	| 'sizeof' unary_expression
+// 	| 'sizeof' '(' type_name ')'
+// 	;
+
+// postfix_expression
+// 	:   primary_expression
+//         (   '[' expression ']'
+//         |   '(' ')'
+//         |   '(' argument_expression_list ')'
+//         |   '.' IDENTIFIER
+//         |   '*' IDENTIFIER
+//         |   '->' IDENTIFIER
+//         |   '++'
+//         |   '--'
+//         )*
+// 	;
+
+// unary_operator
+// 	: '&'
+// 	| '*'
+// 	| '+'
+// 	| '-'
+// 	| '~'
+// 	| '!'
+// 	;
+
+// primary_expression
+// 	: IDENTIFIER
+// 	| constant
+// 	| '(' expression ')'
+// 	;
+
+// constant
+//     :   HEX_LITERAL
+//     |   OCTAL_LITERAL
+//     |   DECIMAL_LITERAL
+//     |	CHARACTER_LITERAL
+// 	|	STRING_LITERAL
+//     |   FLOATING_POINT_LITERAL
+//     ;
+
+// /////
+
+// expression
+// 	: assignment_expression (',' assignment_expression)*
+// 	;
+
+// constant_expression
+// 	: conditional_expression
+// 	;
+
+// assignment_expression
+// 	: lvalue assignment_operator assignment_expression
+// 	| conditional_expression
+// 	;
+	
+// lvalue
+// 	:	unary_expression
+// 	;
+
+// assignment_operator
+// 	: '='
+// 	| '*='
+// 	| '/='
+// 	| '%='
+// 	| '+='
+// 	| '-='
+// 	| '<<='
+// 	| '>>='
+// 	| '&='
+// 	| '^='
+// 	| '|='
+// 	;
+
+// conditional_expression
+// 	: logical_or_expression ('?' expression ':' conditional_expression)?
+// 	;
+
+// logical_or_expression
+// 	: logical_and_expression ('||' logical_and_expression)*
+// 	;
+
+// logical_and_expression
+// 	: inclusive_or_expression ('&&' inclusive_or_expression)*
+// 	;
+
+// inclusive_or_expression
+// 	: exclusive_or_expression ('|' exclusive_or_expression)*
+// 	;
+
+// exclusive_or_expression
+// 	: and_expression ('^' and_expression)*
+// 	;
+
+// and_expression
+// 	: equality_expression ('&' equality_expression)*
+// 	;
+// equality_expression
+// 	: relational_expression (('=='|'!=') relational_expression)*
+// 	;
+
+// relational_expression
+// 	: shift_expression (('<'|'>'|'<='|'>=') shift_expression)*
+// 	;
+
+// shift_expression
+// 	: additive_expression (('<<'|'>>') additive_expression)*
+// 	;
+
+// // S t a t e m e n t s
+
+// statement
+// 	: labeled_statement
+// 	| compound_statement
+// 	| expression_statement
+// 	| selection_statement
+// 	| iteration_statement
+// 	| jump_statement
+// 	;
+
+// labeled_statement
+// 	: IDENTIFIER ':' statement
+// 	| 'case' constant_expression ':' statement
+// 	| 'default' ':' statement
+// 	;
+
+// compound_statement
+// scope Symbols; // blocks have a scope of symbols
+// @init {
+//   $Symbols::types = {}
+// }
+// 	: '{' declaration* statement_list? '}'
+// 	;
+
+// statement_list
+// 	: statement+
+// 	;
+
+// expression_statement
+// 	: ';'
+// 	| expression ';'
+// 	;
+
+// selection_statement
+// 	: 'if' '(' expression ')' statement (options {k=1; backtrack=false;}:'else' statement)?
+// 	| 'switch' '(' expression ')' statement
+// 	;
+
+// iteration_statement
+// 	: 'while' '(' expression ')' statement
+// 	| 'do' statement 'while' '(' expression ')' ';'
+// 	| 'for' '(' expression_statement expression_statement expression? ')' statement
+// 	;
+
+// jump_statement
+// 	: 'goto' IDENTIFIER ';'
+// 	| 'continue' ';'
+// 	| 'break' ';'
+// 	| 'return' ';'
+// 	| 'return' expression ';'
+// 	;
+
+IDENTIFIER
+	:	LETTER (LETTER|'0'..'9')*
+	;
+	
+fragment
+LETTER
+	:	'$'
+	|	'A'..'Z'
+	|	'a'..'z'
+	|	'_'
+	;
+
+CHARACTER_LITERAL
+    :   '\'' ( EscapeSequence | ~('\''|'\\') ) '\''
+    ;
+
+STRING_LITERAL
+    :  '"' ( EscapeSequence | ~('\\'|'"') )* '"'
+    ;
+
+HEX_LITERAL : '0' ('x'|'X') HexDigit+ IntegerTypeSuffix? ;
+
+DECIMAL_LITERAL : ('0' | '1'..'9' '0'..'9'*) IntegerTypeSuffix? ;
+
+OCTAL_LITERAL : '0' ('0'..'7')+ IntegerTypeSuffix? ;
+
+fragment
+HexDigit : ('0'..'9'|'a'..'f'|'A'..'F') ;
+
+fragment
+IntegerTypeSuffix
+	:	('u'|'U')? ('l'|'L')
+	|	('u'|'U')  ('l'|'L')?
+	;
+
+FLOATING_POINT_LITERAL
+    :   ('0'..'9')+ '.' ('0'..'9')* Exponent? FloatTypeSuffix?
+    |   '.' ('0'..'9')+ Exponent? FloatTypeSuffix?
+    |   ('0'..'9')+ Exponent FloatTypeSuffix?
+    |   ('0'..'9')+ Exponent? FloatTypeSuffix
+	;
+
+fragment
+Exponent : ('e'|'E') ('+'|'-')? ('0'..'9')+ ;
+
+fragment
+FloatTypeSuffix : ('f'|'F'|'d'|'D') ;
+
+fragment
+EscapeSequence
+    :   '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
+    |   OctalEscape
+    ;
+
+fragment
+OctalEscape
+    :   '\\' ('0'..'3') ('0'..'7') ('0'..'7')
+    |   '\\' ('0'..'7') ('0'..'7')
+    |   '\\' ('0'..'7')
+    ;
+
+fragment
+UnicodeEscape
+    :   '\\' 'u' HexDigit HexDigit HexDigit HexDigit
+    ;
+
+WS  :  (' '|'\r'|'\t'|'\u000C'|'\n') {$channel=HIDDEN;}
+    ;
+
+COMMENT
+    :   '/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;}
+    ;
+
+LINE_COMMENT
+    : '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}
+    ;
+
+// ignore #line info for now
+LINE_COMMAND 
+    : '#' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}
+    ;
+
diff --git a/runtime/Cpp/tests/t034tokenLabelPropertyRef.g b/runtime/Cpp/tests/t034tokenLabelPropertyRef.g
new file mode 100644
index 0000000..6a03bf2
--- /dev/null
+++ b/runtime/Cpp/tests/t034tokenLabelPropertyRef.g
@@ -0,0 +1,43 @@
+grammar t034tokenLabelPropertyRef;
+options {
+  language =Cpp;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+@parser::includes {
+#include "UserTestTraits.hpp"
+}
+@parser::namespace
+{ Antlr3Test }
+
+a: t=A
+        {
+            print($t.text)
+            print($t.type)
+            print($t.line)
+            print($t.pos)
+            print($t.channel)
+            print($t.index)
+            #print($t.tree)
+        }
+    ;
+
+A: 'a'..'z';
+
+WS  :
+        (   ' '
+        |   '\t'
+        |  ( '\n'
+            |	'\r\n'
+            |	'\r'
+            )
+        )+
+        { $channel = HIDDEN }
+    ;    
+
diff --git a/runtime/Cpp/tests/t035ruleLabelPropertyRef.g b/runtime/Cpp/tests/t035ruleLabelPropertyRef.g
new file mode 100644
index 0000000..c3b9eb9
--- /dev/null
+++ b/runtime/Cpp/tests/t035ruleLabelPropertyRef.g
@@ -0,0 +1,29 @@
+grammar t035ruleLabelPropertyRef;
+options {
+  language =Cpp;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+@parser::includes {
+#include "UserTestTraits.hpp"
+}
+@parser::namespace
+{ Antlr3Test }
+
+a returns [bla]: t=b
+        {
+            $bla = $t.start, $t.stop, $t.text
+        }
+    ;
+
+b: A+;
+
+A: 'a'..'z';
+
+WS: ' '+  { $channel = HIDDEN };
diff --git a/runtime/Cpp/tests/t036multipleReturnValues.g b/runtime/Cpp/tests/t036multipleReturnValues.g
new file mode 100644
index 0000000..8c4748c
--- /dev/null
+++ b/runtime/Cpp/tests/t036multipleReturnValues.g
@@ -0,0 +1,38 @@
+grammar t036multipleReturnValues;
+options {
+  language =Cpp;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+@parser::includes {
+#include "UserTestTraits.hpp"
+}
+@parser::namespace
+{ Antlr3Test }
+
+a returns [foo, bar]: A
+        {
+            $foo = "foo";
+            $bar = "bar";
+        }
+    ;
+
+A: 'a'..'z';
+
+WS  :
+        (   ' '
+        |   '\t'
+        |  ( '\n'
+            |	'\r\n'
+            |	'\r'
+            )
+        )+
+        { $channel = HIDDEN }
+    ;    
+
diff --git a/runtime/Cpp/tests/t037rulePropertyRef.g b/runtime/Cpp/tests/t037rulePropertyRef.g
new file mode 100644
index 0000000..b510092
--- /dev/null
+++ b/runtime/Cpp/tests/t037rulePropertyRef.g
@@ -0,0 +1,28 @@
+grammar t037rulePropertyRef;
+options {
+  language =Cpp;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+@parser::includes {
+#include "UserTestTraits.hpp"
+}
+@parser::namespace
+{ Antlr3Test }
+
+a returns [bla]
+@after {
+    $bla = $start, $stop, $text
+}
+    : A+
+    ;
+
+A: 'a'..'z';
+
+WS: ' '+  { $channel = HIDDEN };
diff --git a/runtime/Cpp/tests/t038lexerRuleLabel.g b/runtime/Cpp/tests/t038lexerRuleLabel.g
new file mode 100644
index 0000000..28dbedc
--- /dev/null
+++ b/runtime/Cpp/tests/t038lexerRuleLabel.g
@@ -0,0 +1,35 @@
+lexer grammar t038lexerRuleLabel;
+options {
+  language =Cpp;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+A: 'a'..'z' WS '0'..'9'
+        {
+            print($WS)
+            print($WS.type)
+            print($WS.line)
+            print($WS.pos)
+            print($WS.channel)
+            print($WS.index)
+            print($WS.text)
+        }
+    ;
+
+fragment WS  :
+        (   ' '
+        |   '\t'
+        |  ( '\n'
+            |	'\r\n'
+            |	'\r'
+            )
+        )+
+        { $channel = HIDDEN }
+    ;    
+
diff --git a/runtime/Cpp/tests/t039.cpp b/runtime/Cpp/tests/t039.cpp
new file mode 100644
index 0000000..f87ea87
--- /dev/null
+++ b/runtime/Cpp/tests/t039.cpp
@@ -0,0 +1,122 @@
+#include "UserTestTraits.hpp"
+#include "t039labelsLexer.hpp"
+#include "t039labelsParser.hpp"
+
+#include <sys/types.h>
+
+#include <iostream>
+#include <sstream>
+#include <fstream>
+
+using namespace Antlr3Test;
+using namespace std;
+
+int testValid(string const& data);
+int testMalformedInput(string const& data);
+
+static t039labelsLexer *lxr;
+
+
+struct TokenData
+{
+	//t039labelsLexerTokens::Tokens type;
+	//unsigned start;
+	//unsigned stop;
+	const char* text;
+};
+
+static TokenData ExpectedTokens[] =
+{
+  /*
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+        ids, w = parser.a()
+
+        self.assertEqual(len(ids), 6, ids)
+        self.assertEqual(ids[0].text, 'a', ids[0])
+        self.assertEqual(ids[1].text, 'b', ids[1])
+        self.assertEqual(ids[2].text, 'c', ids[2])
+        self.assertEqual(ids[3].text, '1', ids[3])
+        self.assertEqual(ids[4].text, '2', ids[4])
+        self.assertEqual(ids[5].text, 'A', ids[5])
+
+        self.assertEqual(w.text, 'GNU1', w)
+  */
+	// "a, b, c, 1, 2 A FOOBAR GNU1 A BLARZ"
+	{ "a"},
+	{ "b"},
+	{ "c"},
+	{ "1"},
+	{ "2"},
+	{ "A"},
+};
+
+
+int main (int argc, char *argv[])
+{
+	testValid("a, b, c, 1, 2 A FOOBAR GNU1 A BLARZ");
+	return 0;
+}
+
+int testValid(string const& data)
+{
+	t039labelsLexerTraits::InputStreamType* input	= new t039labelsLexerTraits::InputStreamType((const ANTLR_UINT8 *)data.c_str(),
+										       ANTLR_ENC_8BIT,
+										       data.length(), //strlen(data.c_str()),
+										       (ANTLR_UINT8*)"t039");
+	if (lxr == NULL)
+		lxr = new t039labelsLexer(input);
+	else
+		lxr->setCharStream(input);
+
+	std::cout << "testValid: \"" << data << '"' <<std::endl;
+
+	t039labelsLexerTraits::TokenStreamType *tstream = new t039labelsLexerTraits::TokenStreamType(ANTLR_SIZE_HINT, lxr->get_tokSource());
+	t039labelsParser *psr = new t039labelsParser(tstream);
+	t039labelsParser::TokenList r = psr->a();	
+	
+	for(unsigned i = 0; i < r.tokens.size() ; i++)
+	{
+		t039labelsLexerTraits::CommonTokenType *token = r.tokens.at(i);
+
+		size_t startIndex = ((const char*)token->get_startIndex()) - data.c_str();
+		size_t stopIndex = ((const char*)token->get_stopIndex()) - data.c_str();
+
+		std::cout << token->getText()
+			  << '\t' << (token->getText()       == ExpectedTokens[i].text ?  "OK" : "Fail")
+			  << std::endl;
+		
+	}
+	delete lxr; lxr = NULL;
+	delete input; 
+	return 0;
+}
+
+/*
+    def testValid1(self):
+        cStream = antlr3.StringStream(
+            'a, b, c, 1, 2 A FOOBAR GNU1 A BLARZ'
+            )
+
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+        ids, w = parser.a()
+
+        self.assertEqual(len(ids), 6, ids)
+        self.assertEqual(ids[0].text, 'a', ids[0])
+        self.assertEqual(ids[1].text, 'b', ids[1])
+        self.assertEqual(ids[2].text, 'c', ids[2])
+        self.assertEqual(ids[3].text, '1', ids[3])
+        self.assertEqual(ids[4].text, '2', ids[4])
+        self.assertEqual(ids[5].text, 'A', ids[5])
+
+        self.assertEqual(w.text, 'GNU1', w)
+
+
+if __name__ == '__main__':
+    unittest.main()
+
+
+*/
diff --git a/runtime/Cpp/tests/t039labels.g b/runtime/Cpp/tests/t039labels.g
new file mode 100644
index 0000000..dc24366
--- /dev/null
+++ b/runtime/Cpp/tests/t039labels.g
@@ -0,0 +1,43 @@
+grammar t039labels;
+options {
+  language =Cpp;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+#include <iostream>
+}
+@lexer::namespace
+{ Antlr3Test }
+
+@parser::includes {
+#include "UserTestTraits.hpp"
+#include "t039labelsLexer.hpp"
+}
+@parser::namespace
+{ Antlr3Test }
+@parser::members {
+	class TokenList {
+	public:
+        TokenList() : token() {}
+        TokenList(TokenList const& other) : tokens(other.tokens), token(other.token) {}
+        TokenList(ImplTraits::TokenPtrsListType const& lst, ImplTraits::CommonTokenType *t) : tokens(lst), token(t) {}
+	//private:
+        ImplTraits::TokenPtrsListType tokens;
+        ImplTraits::CommonTokenType* token;
+    };
+}
+a returns [t039labelsParser::TokenList retval]
+    : ids+=A ( ',' ids+=(A|B) )* C D w=. ids+=. F EOF
+        { retval = t039labelsParser::TokenList($ids, $w); }
+    ;
+
+A: 'a'..'z';
+B: '0'..'9';
+C: a='A'         { std::cout << $a << std::endl; };
+D: a='FOOBAR'    { std::cout << $a << std::endl; };
+E: 'GNU' a=.     { std::cout << $a << std::endl; };
+F: 'BLARZ' a=EOF { std::cout << $a << std::endl; };
+
+WS: ' '+  { $channel = HIDDEN; };
diff --git a/runtime/Cpp/tests/t040bug80.g b/runtime/Cpp/tests/t040bug80.g
new file mode 100644
index 0000000..3aa55d0
--- /dev/null
+++ b/runtime/Cpp/tests/t040bug80.g
@@ -0,0 +1,20 @@
+lexer grammar t040bug80; 
+options {
+  language =Cpp;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+ID_LIKE
+    : 'defined' 
+    | {False}? Identifier 
+    | Identifier 
+    ; 
+ 
+fragment 
+Identifier: 'a'..'z'+ ; // with just 'a', output compiles 
diff --git a/runtime/Cpp/tests/t041parameters.g b/runtime/Cpp/tests/t041parameters.g
new file mode 100644
index 0000000..47b64b7
--- /dev/null
+++ b/runtime/Cpp/tests/t041parameters.g
@@ -0,0 +1,29 @@
+grammar t041parameters;
+options {
+  language =Cpp;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+@parser::includes {
+#include "UserTestTraits.hpp"
+}
+@parser::namespace
+{ Antlr3Test }
+
+a[arg1, arg2] returns [l]
+    : A+ EOF
+        { 
+            l = ($arg1, $arg2) 
+            $arg1 = "gnarz"
+        }
+    ;
+
+A: 'a'..'z';
+
+WS: ' '+  { $channel = HIDDEN };
diff --git a/runtime/Cpp/tests/t042ast.g b/runtime/Cpp/tests/t042ast.g
new file mode 100644
index 0000000..e2d4fc1
--- /dev/null
+++ b/runtime/Cpp/tests/t042ast.g
@@ -0,0 +1,366 @@
+grammar t042ast;
+options {
+    language =Cpp;
+    output = AST;
+}
+
+tokens {
+    VARDEF;
+    FLOAT;
+    EXPR;
+    BLOCK;
+    VARIABLE;
+    FIELD;
+    CALL;
+    INDEX;
+    FIELDACCESS;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+@parser::includes {
+#include "UserTestTraits.hpp"
+}
+@parser::namespace
+{ Antlr3Test }
+
+@init {
+self.flag = False
+}
+
+r1
+    : INT ('+'^ INT)*
+    ;
+
+r2
+    : 'assert'^ x=expression (':'! y=expression)? ';'!
+    ;
+
+r3
+    : 'if'^ expression s1=statement ('else'! s2=statement)?
+    ;
+
+r4
+    : 'while'^ expression statement
+    ;
+
+r5
+    : 'return'^ expression? ';'!
+    ;
+
+r6
+    : (INT|ID)+
+    ;
+
+r7
+    : INT -> 
+    ;
+
+r8
+    : 'var' ID ':' type -> ^('var' type ID) 
+    ;
+
+r9
+    : type ID ';' -> ^(VARDEF type ID) 
+    ;
+
+r10
+    : INT -> {CommonTree(CommonToken(type=FLOAT, text=$INT.text + ".0"))}
+    ;
+
+r11
+    : expression -> ^(EXPR expression)
+    | -> EXPR
+    ;
+
+r12
+    : ID (',' ID)* -> ID+
+    ;
+
+r13
+    : type ID (',' ID)* ';' -> ^(type ID+)
+    ;
+
+r14
+    :   expression? statement* type+
+        -> ^(EXPR expression? statement* type+)
+    ;
+
+r15
+    : INT -> INT INT
+    ;
+
+r16
+    : 'int' ID (',' ID)* -> ^('int' ID)+
+    ;
+
+r17
+    : 'for' '(' start=statement ';' expression ';' next=statement ')' statement
+        -> ^('for' $start expression $next statement)
+    ;
+
+r18
+    : t='for' -> ^(BLOCK)
+    ;
+
+r19
+    : t='for' -> ^(BLOCK[$t])
+    ;
+
+r20
+    : t='for' -> ^(BLOCK[$t,"FOR"])
+    ;
+
+r21
+    : t='for' -> BLOCK
+    ;
+
+r22
+    : t='for' -> BLOCK[$t]
+    ;
+
+r23
+    : t='for' -> BLOCK[$t,"FOR"]
+    ;
+
+r24
+    : r=statement expression -> ^($r expression)
+    ;
+
+r25
+    : r+=statement (',' r+=statement)+ expression -> ^($r expression)
+    ;
+
+r26
+    : r+=statement (',' r+=statement)+ -> ^(BLOCK $r+)
+    ;
+
+r27
+    : r=statement expression -> ^($r ^($r expression))
+    ;
+
+r28
+    : ('foo28a'|'foo28b') ->
+    ;
+
+r29
+    : (r+=statement)* -> ^(BLOCK $r+)
+    ;
+
+r30
+    : statement* -> ^(BLOCK statement?)
+    ;
+
+r31
+    : modifier type ID ('=' expression)? ';'
+        -> {self.flag == 0}? ^(VARDEF ID modifier* type expression?)
+        -> {self.flag == 1}? ^(VARIABLE ID modifier* type expression?)
+        ->                   ^(FIELD ID modifier* type expression?)
+    ;
+
+r32[which]
+  : ID INT -> {which==1}? ID
+           -> {which==2}? INT
+           -> // yield nothing as else-clause
+  ;
+
+r33
+    :   modifiers! statement
+    ;
+
+r34
+    :   modifiers! r34a[$modifiers.tree]
+    //|   modifiers! r33b[$modifiers.tree]
+    ;
+
+r34a[mod]
+    :   'class' ID ('extends' sup=type)?
+        ( 'implements' i+=type (',' i+=type)*)?
+        '{' statement* '}'
+        -> ^('class' ID {$mod} ^('extends' $sup)? ^('implements' $i+)? statement* )
+    ;
+
+r35
+    : '{' 'extends' (sup=type)? '}'
+        ->  ^('extends' $sup)?
+    ;
+
+r36
+    : 'if' '(' expression ')' s1=statement
+        ( 'else' s2=statement -> ^('if' ^(EXPR expression) $s1 $s2)
+        |                     -> ^('if' ^(EXPR expression) $s1)
+        )
+    ;
+
+r37
+    : (INT -> INT) ('+' i=INT -> ^('+' $r37 $i) )* 
+    ;
+
+r38
+    : INT ('+'^ INT)*
+    ;
+
+r39
+    : (primary->primary) // set return tree to just primary
+        ( '(' arg=expression ')'
+            -> ^(CALL $r39 $arg)
+        | '[' ie=expression ']'
+            -> ^(INDEX $r39 $ie)
+        | '.' p=primary
+            -> ^(FIELDACCESS $r39 $p)
+        )*
+    ;
+
+r40
+    : (INT -> INT) ( ('+' i+=INT)* -> ^('+' $r40 $i*) ) ';'
+    ;
+
+r41
+    : (INT -> INT) ( ('+' i=INT) -> ^($i $r41) )* ';'
+    ;
+
+r42
+    : ids+=ID (','! ids+=ID)*
+    ;
+
+r43 returns [res]
+    : ids+=ID! (','! ids+=ID!)* {$res = [id.text for id in $ids]}
+    ;
+
+r44
+    : ids+=ID^ (','! ids+=ID^)*
+    ;
+
+r45
+    : primary^
+    ;
+
+r46 returns [res]
+    : ids+=primary! (','! ids+=primary!)* {$res = [id.text for id in $ids]}
+    ;
+
+r47
+    : ids+=primary (','! ids+=primary)*
+    ;
+
+r48
+    : ids+=. (','! ids+=.)*
+    ;
+
+r49
+    : .^ ID
+    ;
+
+r50
+    : ID 
+        -> ^({CommonTree(CommonToken(type=FLOAT, text="1.0"))} ID)
+    ;
+
+/** templates tested:
+    tokenLabelPropertyRef_tree
+*/
+r51 returns [res]
+    : ID t=ID ID
+        { $res = $t.tree }
+    ;
+
+/** templates tested:
+    rulePropertyRef_tree
+*/
+r52 returns [res]
+@after {
+    $res = $tree
+}
+    : ID
+    ;
+
+/** templates tested:
+    ruleLabelPropertyRef_tree
+*/
+r53 returns [res]
+    : t=primary
+        { $res = $t.tree }
+    ;
+
+/** templates tested:
+    ruleSetPropertyRef_tree
+*/
+r54 returns [res]
+@after {
+    $tree = $t.tree;
+}
+    : ID t=expression ID
+    ;
+
+/** backtracking */
+r55
+options { backtrack=true; k=1; }
+    : (modifier+ INT)=> modifier+ expression
+    | modifier+ statement
+    ;
+
+
+/** templates tested:
+    rewriteTokenRef with len(args)>0
+*/
+r56
+    : t=ID* -> ID[$t,'foo']
+    ;
+
+/** templates tested:
+    rewriteTokenRefRoot with len(args)>0
+*/
+r57
+    : t=ID* -> ^(ID[$t,'foo'])
+    ;
+
+/** templates tested:
+    ???
+*/
+r58
+    : ({CommonTree(CommonToken(type=FLOAT, text="2.0"))})^
+    ;
+
+/** templates tested:
+    rewriteTokenListLabelRefRoot
+*/
+r59
+    : (t+=ID)+ statement -> ^($t statement)+
+    ;
+
+primary
+    : ID
+    ;
+
+expression
+    : r1
+    ;
+
+statement
+    : 'fooze'
+    | 'fooze2'
+    ;
+
+modifiers
+    : modifier+
+    ;
+
+modifier
+    : 'public'
+    | 'private'
+    ;
+
+type
+    : 'int'
+    | 'bool'
+    ;
+
+ID : 'a'..'z' + ;
+INT : '0'..'9' +;
+WS: (' ' | '\n' | '\t')+ {$channel = HIDDEN;};
+
diff --git a/runtime/Cpp/tests/t043synpred.g b/runtime/Cpp/tests/t043synpred.g
new file mode 100644
index 0000000..b54cef8
--- /dev/null
+++ b/runtime/Cpp/tests/t043synpred.g
@@ -0,0 +1,27 @@
+grammar t043synpred;
+options {
+  language =Cpp;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+@parser::includes {
+#include "UserTestTraits.hpp"
+}
+@parser::namespace
+{ Antlr3Test }
+
+a: ((s+ P)=> s+ b)? E;
+b: P 'foo';
+
+s: S;
+
+
+S: ' ';
+P: '+';
+E: '>';
diff --git a/runtime/Cpp/tests/t044trace.g b/runtime/Cpp/tests/t044trace.g
new file mode 100644
index 0000000..002aa2f
--- /dev/null
+++ b/runtime/Cpp/tests/t044trace.g
@@ -0,0 +1,33 @@
+grammar t044trace;
+options {
+  language =Cpp;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+@parser::includes {
+#include "UserTestTraits.hpp"
+}
+@parser::namespace
+{ Antlr3Test }
+
+@init {
+    self._stack = None
+}
+
+a: '<' ((INT '+')=>b|c) '>';
+b: c ('+' c)*;
+c: INT 
+    {
+        if self._stack is None:
+            self._stack = self.getRuleInvocationStack()
+    }
+    ;
+
+INT: ('0'..'9')+;
+WS: (' ' | '\n' | '\t')+ {$channel = HIDDEN;};
diff --git a/runtime/Cpp/tests/t045dfabug.g b/runtime/Cpp/tests/t045dfabug.g
new file mode 100644
index 0000000..101c582
--- /dev/null
+++ b/runtime/Cpp/tests/t045dfabug.g
@@ -0,0 +1,44 @@
+grammar t045dfabug;
+options {
+    language =Cpp;
+    output = AST;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+@parser::includes {
+#include "UserTestTraits.hpp"
+}
+@parser::namespace
+{ Antlr3Test }
+
+// this rule used to generate an infinite loop in DFA.predict
+r
+options { backtrack=true; }
+    : (modifier+ INT)=> modifier+ expression
+    | modifier+ statement
+    ;
+
+expression
+    : INT '+' INT
+    ;
+
+statement
+    : 'fooze'
+    | 'fooze2'
+    ;
+
+modifier
+    : 'public'
+    | 'private'
+    ;
+
+ID : 'a'..'z' + ;
+INT : '0'..'9' +;
+WS: (' ' | '\n' | '\t')+ {$channel = HIDDEN;};
+
diff --git a/runtime/Cpp/tests/t046rewrite.g b/runtime/Cpp/tests/t046rewrite.g
new file mode 100644
index 0000000..60d8a41
--- /dev/null
+++ b/runtime/Cpp/tests/t046rewrite.g
@@ -0,0 +1,67 @@
+grammar t046rewrite;
+options {
+    language=Cpp;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+@parser::includes {
+#include "UserTestTraits.hpp"
+}
+@parser::namespace
+{ Antlr3Test }
+
+program
+@init {
+    start = self.input.LT(1)
+}
+    :   method+
+        {
+        self.input.insertBefore(start,"public class Wrapper {\n")
+        self.input.insertAfter($method.stop, "\n}\n")
+        }
+    ;
+
+method
+    :   m='method' ID '(' ')' body
+        {self.input.replace($m, "public void");}
+    ; 
+
+body
+scope {
+    decls
+}
+@init {
+    $body::decls = set()
+}
+    :   lcurly='{' stat* '}'
+        {
+        for it in $body::decls:
+            self.input.insertAfter($lcurly, "\nint "+it+";")
+        }
+    ;
+
+stat:   ID '=' expr ';' {$body::decls.add($ID.text);}
+    ;
+
+expr:   mul ('+' mul)* 
+    ;
+
+mul :   atom ('*' atom)*
+    ;
+
+atom:   ID
+    |   INT
+    ;
+
+ID  :   ('a'..'z'|'A'..'Z')+ ;
+
+INT :   ('0'..'9')+ ;
+
+WS  :   (' '|'\t'|'\n')+ {$channel=HIDDEN;}
+    ;
diff --git a/runtime/Cpp/tests/t047treeparser.g b/runtime/Cpp/tests/t047treeparser.g
new file mode 100644
index 0000000..375d84f
--- /dev/null
+++ b/runtime/Cpp/tests/t047treeparser.g
@@ -0,0 +1,126 @@
+grammar t047treeparser;
+options {
+    language=Cpp;
+    output=AST;
+}
+
+tokens {
+    VAR_DEF;
+    ARG_DEF;
+    FUNC_HDR;
+    FUNC_DECL;
+    FUNC_DEF;
+    BLOCK;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+@parser::includes {
+#include "UserTestTraits.hpp"
+}
+@parser::namespace
+{ Antlr3Test }
+
+program
+    :   declaration+
+    ;
+
+declaration
+    :   variable
+    |   functionHeader ';' -> ^(FUNC_DECL functionHeader)
+    |   functionHeader block -> ^(FUNC_DEF functionHeader block)
+    ;
+
+variable
+    :   type declarator ';' -> ^(VAR_DEF type declarator)
+    ;
+
+declarator
+    :   ID 
+    ;
+
+functionHeader
+    :   type ID '(' ( formalParameter ( ',' formalParameter )* )? ')'
+        -> ^(FUNC_HDR type ID formalParameter+)
+    ;
+
+formalParameter
+    :   type declarator -> ^(ARG_DEF type declarator)
+    ;
+
+type
+    :   'int'   
+    |   'char'  
+    |   'void'
+    |   ID        
+    ;
+
+block
+    :   lc='{'
+            variable*
+            stat*
+        '}'
+        -> ^(BLOCK[$lc,"BLOCK"] variable* stat*)
+    ;
+
+stat: forStat
+    | expr ';'!
+    | block
+    | assignStat ';'!
+    | ';'!
+    ;
+
+forStat
+    :   'for' '(' start=assignStat ';' expr ';' next=assignStat ')' block
+        -> ^('for' $start expr $next block)
+    ;
+
+assignStat
+    :   ID EQ expr -> ^(EQ ID expr)
+    ;
+
+expr:   condExpr
+    ;
+
+condExpr
+    :   aexpr ( ('=='^ | '<'^) aexpr )?
+    ;
+
+aexpr
+    :   atom ( '+'^ atom )*
+    ;
+
+atom
+    : ID      
+    | INT      
+    | '(' expr ')' -> expr
+    ; 
+
+FOR : 'for' ;
+INT_TYPE : 'int' ;
+CHAR: 'char';
+VOID: 'void';
+
+ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
+    ;
+
+INT :	('0'..'9')+
+    ;
+
+EQ   : '=' ;
+EQEQ : '==' ;
+LT   : '<' ;
+PLUS : '+' ;
+
+WS  :   (   ' '
+        |   '\t'
+        |   '\r'
+        |   '\n'
+        )+
+        { $channel=HIDDEN }
+    ;    
diff --git a/runtime/Cpp/tests/t047treeparserWalker.g b/runtime/Cpp/tests/t047treeparserWalker.g
new file mode 100644
index 0000000..1d4d622
--- /dev/null
+++ b/runtime/Cpp/tests/t047treeparserWalker.g
@@ -0,0 +1,73 @@
+tree grammar t047treeparserWalker;
+options {
+    language=Cpp;
+    tokenVocab=t047treeparser;
+    ASTLabelType=CommonTree;
+}
+
+@includes {
+#include "UserTestTraits.hpp"
+}
+@namespace
+{ Antlr3Test }
+
+program
+    :   declaration+
+    ;
+
+declaration
+    :   variable
+    |   ^(FUNC_DECL functionHeader)
+    |   ^(FUNC_DEF functionHeader block)
+    ;
+
+variable returns [res]
+    :   ^(VAR_DEF type declarator)
+        { 
+            $res = $declarator.text; 
+        }
+    ;
+
+declarator
+    :   ID 
+    ;
+
+functionHeader
+    :   ^(FUNC_HDR type ID formalParameter+)
+    ;
+
+formalParameter
+    :   ^(ARG_DEF type declarator)
+    ;
+
+type
+    :   'int'
+    |   'char'
+    |   'void'
+    |   ID        
+    ;
+
+block
+    :   ^(BLOCK variable* stat*)
+    ;
+
+stat: forStat
+    | expr
+    | block
+    ;
+
+forStat
+    :   ^('for' expr expr expr block)
+    ;
+
+expr:   ^(EQEQ expr expr)
+    |   ^(LT expr expr)
+    |   ^(PLUS expr expr)
+    |   ^(EQ ID expr)
+    |   atom
+    ;
+
+atom
+    : ID      
+    | INT      
+    ; 
diff --git a/runtime/Cpp/tests/t048rewrite.g b/runtime/Cpp/tests/t048rewrite.g
new file mode 100644
index 0000000..2cd40fe
--- /dev/null
+++ b/runtime/Cpp/tests/t048rewrite.g
@@ -0,0 +1,16 @@
+lexer grammar t048rewrite;
+options {
+    language=Cpp;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+A: 'a';
+B: 'b';
+C: 'c';
+
diff --git a/runtime/Cpp/tests/t048rewrite2.g b/runtime/Cpp/tests/t048rewrite2.g
new file mode 100644
index 0000000..c7bb2dd
--- /dev/null
+++ b/runtime/Cpp/tests/t048rewrite2.g
@@ -0,0 +1,19 @@
+lexer grammar t048rewrite2;
+options {
+    language=Cpp;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+ID : 'a'..'z'+;
+INT : '0'..'9'+;
+SEMI : ';';
+PLUS : '+';
+MUL : '*';
+ASSIGN : '=';
+WS : ' '+;
diff --git a/runtime/Cpp/tests/t050decorate.g b/runtime/Cpp/tests/t050decorate.g
new file mode 100644
index 0000000..2f6ea71
--- /dev/null
+++ b/runtime/Cpp/tests/t050decorate.g
@@ -0,0 +1,42 @@
+grammar t050decorate;
+options {
+  language =Cpp;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+@parser::includes {
+#include "UserTestTraits.hpp"
+}
+@parser::namespace
+{ Antlr3Test }
+        
+@header {
+    def logme(func):
+        def decorated(self, *args, **kwargs):
+            self.events.append('before')
+            try:
+                return func(self, *args, **kwargs)
+            finally:
+                self.events.append('after')
+
+        return decorated
+}
+
+@parser::init {
+self.events = []
+}
+
+document
+@decorate {
+    @logme
+}
+    : IDENTIFIER
+    ;
+
+IDENTIFIER: ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*;
diff --git a/runtime/Cpp/tests/t051.cpp b/runtime/Cpp/tests/t051.cpp
new file mode 100644
index 0000000..c89e3a5
--- /dev/null
+++ b/runtime/Cpp/tests/t051.cpp
@@ -0,0 +1,98 @@
+#include "UserTestTraits.hpp"
+#include "t051lexer.hpp"
+
+#include <sys/types.h>
+
+#include <iostream>
+#include <sstream>
+#include <fstream>
+
+using namespace Antlr3Test;
+using namespace std;
+
+static t051lexer* lxr;
+
+static string slurp(string const& fileName);
+static void parseFile(const char* fName);
+
+int main (int argc, char *argv[])
+{
+	if (argc < 2 || argv[1] == NULL)
+	{
+		parseFile("./t051.input"); // Note in VS2005 debug, working directory must be configured
+	}
+	else
+	{
+		for (int i = 1; i < argc; i++)
+		{
+			parseFile(argv[i]);
+		}
+	}
+
+	printf("finished parsing OK\n");	// Finnish parking is pretty good - I think it is all the snow
+
+	return 0;
+}
+
+void parseFile(const char* fName)
+{
+	t051lexerTraits::InputStreamType* input;
+	t051lexerTraits::TokenStreamType* tstream;
+	
+	string data = slurp(fName);
+
+	input	= new t051lexerTraits::InputStreamType((const ANTLR_UINT8 *)data.c_str(),
+						       ANTLR_ENC_8BIT,
+						       data.length(), //strlen(data.c_str()),
+						       (ANTLR_UINT8*)fName);
+
+	input->setUcaseLA(true);
+
+	// Our input stream is now open and all set to go, so we can create a new instance of our
+	// lexer and set the lexer input to our input stream:
+	//  (file | memory | ?) --> inputstream -> lexer --> tokenstream --> parser ( --> treeparser )?
+	//
+	if (lxr == NULL)
+	{
+		lxr = new t051lexer(input);	    // javaLexerNew is generated by ANTLR
+	}
+	else
+	{
+		lxr->setCharStream(input);
+	}
+
+	tstream = new t051lexerTraits::TokenStreamType(ANTLR_SIZE_HINT, lxr->get_tokSource());
+
+	putc('L', stdout); fflush(stdout);
+	{
+		ANTLR_INT32 T = 0;
+		while	(T != t051lexer::EOF_TOKEN)
+		{
+			T = tstream->_LA(1);
+			t051lexerTraits::CommonTokenType const* token = tstream->_LT(1);
+			  
+			printf("%d\t\"%s\"\n",
+			       T,
+			       tstream->_LT(1)->getText().c_str()
+				);
+			tstream->consume();
+		}
+	}
+
+	tstream->_LT(1);	// Don't do this mormally, just causes lexer to run for timings here
+
+	delete tstream; 
+	delete lxr; lxr = NULL;
+	delete input; 
+}
+
+string slurp(string const& fileName)
+{
+	ifstream ifs(fileName.c_str(), ios::in | ios::binary | ios::ate);
+	ifstream::pos_type fileSize = ifs.tellg();
+	ifs.seekg(0, ios::beg);
+
+	stringstream sstr;
+	sstr << ifs.rdbuf();
+	return sstr.str();
+}
diff --git a/runtime/Cpp/tests/t051.input b/runtime/Cpp/tests/t051.input
new file mode 100644
index 0000000..7f1dfb7
--- /dev/null
+++ b/runtime/Cpp/tests/t051.input
@@ -0,0 +1 @@
+9.99
diff --git a/runtime/Cpp/tests/t051lexer.g b/runtime/Cpp/tests/t051lexer.g
new file mode 100644
index 0000000..f5790b7
--- /dev/null
+++ b/runtime/Cpp/tests/t051lexer.g
@@ -0,0 +1,28 @@
+// Lexer grammar using synpreds
+lexer grammar t051lexer;
+
+options {
+	language=Cpp;
+}
+
+@lexer::includes
+{
+#include "UserTestTraits.hpp"
+}
+@lexer::namespace
+{ Antlr3Test }
+
+fragment
+POINT
+	:	'.'
+	;
+NUMBER
+	: (	( NUM POINT NUM ) => NUM POINT NUM
+		|	POINT NUM
+		|	NUM
+		)
+    ;
+fragment
+NUM
+	: '0' .. '9' ( '0' .. '9' )*
+	;
diff --git a/runtime/Java/doxyfile b/runtime/Java/doxyfile
index 8eba9a0..250fec1 100644
--- a/runtime/Java/doxyfile
+++ b/runtime/Java/doxyfile
@@ -5,7 +5,7 @@
 #---------------------------------------------------------------------------
 DOXYFILE_ENCODING      = UTF-8
 PROJECT_NAME           = "ANTLR API"
-PROJECT_NUMBER         = 3.4
+PROJECT_NUMBER         = 3.3
 OUTPUT_DIRECTORY       = api
 CREATE_SUBDIRS         = NO
 OUTPUT_LANGUAGE        = English
diff --git a/runtime/Java/pom.xml b/runtime/Java/pom.xml
index 6c8b13b..7d655c0 100644
--- a/runtime/Java/pom.xml
+++ b/runtime/Java/pom.xml
@@ -6,18 +6,20 @@
   <packaging>jar</packaging>
   
   <!--
+
     Inherit from the ANTLR master pom, which tells us what
     version we are and allows us to inherit dependencies
     and so on.
+
     -->
   <parent>
       <groupId>org.antlr</groupId>
       <artifactId>antlr-master</artifactId>
-      <version>3.4</version>
+      <version>3.5.2</version>
+      <relativePath>../..</relativePath>
   </parent>
   
-
-  <name>Antlr 3.4 Runtime</name>
+  <name>ANTLR 3 Runtime</name>
 
   <description>A framework for constructing recognizers, compilers, and translators from grammatical descriptions containing Java, C#, C++, or Python actions.</description>
   <url>http://www.antlr.org</url>
@@ -45,52 +47,21 @@
             <timezone>PST</timezone>
         </developer>
     </developers>
-    
-  <scm>
-    <url>http://fisheye2.cenqua.com/browse/antlr</url>
-    <connection>http://fisheye2.cenqua.com/browse/antlr</connection>
-  </scm>
-  
+
   <dependencies>
     
     <dependency>
       <groupId>org.antlr</groupId>
       <artifactId>stringtemplate</artifactId>
-      <version>3.2.1</version>
       <scope>compile</scope>
+      <optional>true</optional>
     </dependency>
-    
-    
+
     <dependency>
-        <groupId>antlr</groupId>
-        <artifactId>antlr</artifactId>
-        <version>2.7.7</version>
-        <scope>compile</scope>
-    </dependency>    
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+    </dependency>
 
   </dependencies>
-  
-<build>
-    <defaultGoal>install</defaultGoal>
-    <plugins>
-        <plugin>
-            <artifactId>maven-compiler-plugin</artifactId>
-            <version>2.0.2</version>
-            <configuration>
-                <source>1.6</source>
-                <target>jsr14</target>
-            </configuration>
-        </plugin>
-        <plugin>
-            <groupId>org.codehaus.mojo</groupId>
-            <artifactId>findbugs-maven-plugin</artifactId>
-            <version>2.3.2</version>
-            <configuration>
-                <findbugsXmlOutput>true</findbugsXmlOutput>
-                <findbugsXmlWithMessages>true</findbugsXmlWithMessages>
-                <xmlOutput>true</xmlOutput>
-            </configuration>
-        </plugin>
-    </plugins>
-</build>
+
 </project>
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/ANTLRFileStream.java b/runtime/Java/src/main/java/org/antlr/runtime/ANTLRFileStream.java
index 27ef58b..1e2e698 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/ANTLRFileStream.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/ANTLRFileStream.java
@@ -72,6 +72,7 @@
 		}
 	}
 
+	@Override
 	public String getSourceName() {
 		return fileName;
 	}
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/ANTLRReaderStream.java b/runtime/Java/src/main/java/org/antlr/runtime/ANTLRReaderStream.java
index 24d51ad..21881a4 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/ANTLRReaderStream.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/ANTLRReaderStream.java
@@ -70,7 +70,7 @@
 			// alloc initial buffer size.
 			data = new char[size];
 			// read all the data in chunks of readChunkSize
-			int numRead=0;
+			int numRead;
 			int p = 0;
 			do {
 				if ( p+readChunkSize > data.length ) { // overflow?
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/ANTLRStringStream.java b/runtime/Java/src/main/java/org/antlr/runtime/ANTLRStringStream.java
index 17af23c..194a2fc 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/ANTLRStringStream.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/ANTLRStringStream.java
@@ -58,7 +58,7 @@
 	 *  move through the input stream.  Indexed from 1..markDepth.
      *  A null is kept @ index 0.  Create upon first call to mark().
 	 */
-	protected List markers;
+	protected List<CharStreamState> markers;
 
 	/** Track the last mark() call result value for use in rewind(). */
 	protected int lastMarker;
@@ -94,6 +94,7 @@
 		markDepth = 0;
 	}
 
+	@Override
     public void consume() {
 		//System.out.println("prev p="+p+", c="+(char)data[p]);
         if ( p < n ) {
@@ -111,6 +112,7 @@
         }
     }
 
+	@Override
     public int LA(int i) {
 		if ( i==0 ) {
 			return 0; // undefined
@@ -131,6 +133,7 @@
 		return data[p+i-1];
     }
 
+	@Override
 	public int LT(int i) {
 		return LA(i);
 	}
@@ -139,27 +142,30 @@
      *  last symbol has been read.  The index is the index of char to
 	 *  be returned from LA(1).
      */
+	@Override
     public int index() {
         return p;
     }
 
+	@Override
 	public int size() {
 		return n;
 	}
 
+	@Override
 	public int mark() {
         if ( markers==null ) {
-            markers = new ArrayList();
+            markers = new ArrayList<CharStreamState>();
             markers.add(null); // depth 0 means no backtracking, leave blank
         }
         markDepth++;
-		CharStreamState state = null;
+		CharStreamState state;
 		if ( markDepth>=markers.size() ) {
 			state = new CharStreamState();
 			markers.add(state);
 		}
 		else {
-			state = (CharStreamState)markers.get(markDepth);
+			state = markers.get(markDepth);
 		}
 		state.p = p;
 		state.line = line;
@@ -168,8 +174,9 @@
 		return markDepth;
     }
 
+	@Override
     public void rewind(int m) {
-		CharStreamState state = (CharStreamState)markers.get(m);
+		CharStreamState state = markers.get(m);
 		// restore stream state
 		seek(state.p);
 		line = state.line;
@@ -177,10 +184,12 @@
 		release(m);
 	}
 
+	@Override
 	public void rewind() {
 		rewind(lastMarker);
 	}
 
+	@Override
 	public void release(int marker) {
 		// unwind any other markers made after m and release m
 		markDepth = marker;
@@ -191,6 +200,7 @@
 	/** consume() ahead until p==index; can't just set p=index as we must
 	 *  update line and charPositionInLine.
 	 */
+	@Override
 	public void seek(int index) {
 		if ( index<=p ) {
 			p = index; // just jump; don't update stream state (line, ...)
@@ -202,29 +212,36 @@
 		}
 	}
 
+	@Override
 	public String substring(int start, int stop) {
 		return new String(data,start,stop-start+1);
 	}
 
+	@Override
 	public int getLine() {
 		return line;
 	}
 
+	@Override
 	public int getCharPositionInLine() {
 		return charPositionInLine;
 	}
 
+	@Override
 	public void setLine(int line) {
 		this.line = line;
 	}
 
+	@Override
 	public void setCharPositionInLine(int pos) {
 		this.charPositionInLine = pos;
 	}
 
+	@Override
 	public String getSourceName() {
 		return name;
 	}
 
+	@Override
     public String toString() { return new String(data); }
 }
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/BaseRecognizer.java b/runtime/Java/src/main/java/org/antlr/runtime/BaseRecognizer.java
index 667664d..bdba790 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/BaseRecognizer.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/BaseRecognizer.java
@@ -220,7 +220,7 @@
 		String msg = e.getMessage();
 		if ( e instanceof UnwantedTokenException ) {
 			UnwantedTokenException ute = (UnwantedTokenException)e;
-			String tokenName="<unknown>";
+			String tokenName;
 			if ( ute.expecting== Token.EOF ) {
 				tokenName = "EOF";
 			}
@@ -232,7 +232,7 @@
 		}
 		else if ( e instanceof MissingTokenException ) {
 			MissingTokenException mte = (MissingTokenException)e;
-			String tokenName="<unknown>";
+			String tokenName;
 			if ( mte.expecting== Token.EOF ) {
 				tokenName = "EOF";
 			}
@@ -243,7 +243,7 @@
 		}
 		else if ( e instanceof MismatchedTokenException ) {
 			MismatchedTokenException mte = (MismatchedTokenException)e;
-			String tokenName="<unknown>";
+			String tokenName;
 			if ( mte.expecting== Token.EOF ) {
 				tokenName = "EOF";
 			}
@@ -255,7 +255,7 @@
 		}
 		else if ( e instanceof MismatchedTreeNodeException ) {
 			MismatchedTreeNodeException mtne = (MismatchedTreeNodeException)e;
-			String tokenName="<unknown>";
+			String tokenName;
 			if ( mtne.expecting==Token.EOF ) {
 				tokenName = "EOF";
 			}
@@ -476,7 +476,7 @@
 	 *  given the current call chain.  Contrast this with the
 	 *  definition of plain FOLLOW for rule r:
 	 *
-	 *   FOLLOW(r)={x | S=>*alpha r beta in G and x in FIRST(beta)}
+	 *   FOLLOW(r)={x | S=&gt;*alpha r beta in G and x in FIRST(beta)}
 	 *
 	 *  where x in T* and alpha, beta in V*; T is set of terminals and
 	 *  V is the set of terminals and nonterminals.  In other words,
@@ -500,16 +500,16 @@
 	 *  FOLLOW sets are precisely what could follow a rule reference.
 	 *  For input input "i=(3);", here is the derivation:
 	 *
-	 *  stat => ID '=' expr ';'
-	 *       => ID '=' atom ('+' atom)* ';'
-	 *       => ID '=' '(' expr ')' ('+' atom)* ';'
-	 *       => ID '=' '(' atom ')' ('+' atom)* ';'
-	 *       => ID '=' '(' INT ')' ('+' atom)* ';'
-	 *       => ID '=' '(' INT ')' ';'
+	 *  stat =&gt; ID '=' expr ';'
+	 *       =&gt; ID '=' atom ('+' atom)* ';'
+	 *       =&gt; ID '=' '(' expr ')' ('+' atom)* ';'
+	 *       =&gt; ID '=' '(' atom ')' ('+' atom)* ';'
+	 *       =&gt; ID '=' '(' INT ')' ('+' atom)* ';'
+	 *       =&gt; ID '=' '(' INT ')' ';'
 	 *
 	 *  At the "3" token, you'd have a call chain of
 	 *
-	 *    stat -> expr -> atom -> expr -> atom
+	 *    stat &rarr; expr &rarr; atom &rarr; expr &rarr; atom
 	 *
 	 *  What can follow that specific nested ref to atom?  Exactly ')'
 	 *  as you can see by looking at the derivation of this specific
@@ -533,7 +533,7 @@
 		int top = state._fsp;
 		BitSet followSet = new BitSet();
 		for (int i=top; i>=0; i--) {
-			BitSet localFollowSet = (BitSet)state.following[i];
+			BitSet localFollowSet = state.following[i];
 			/*
 			System.out.println("local follow depth "+i+"="+
 							   localFollowSet.toString(getTokenNames())+")");
@@ -573,12 +573,12 @@
 	 *  ')'.  When the parser returns from the nested call to expr, it
 	 *  will have call chain:
 	 *
-	 *    stat -> expr -> atom
+	 *    stat &rarr; expr &rarr; atom
 	 *
 	 *  and it will be trying to match the ')' at this point in the
 	 *  derivation:
 	 *
-	 *       => ID '=' '(' INT ')' ('+' atom)* ';'
+	 *       =&gt; ID '=' '(' INT ')' ('+' atom)* ';'
 	 *                          ^
 	 *  match() will see that ';' doesn't match ')' and report a
 	 *  mismatched token error.  To recover, it sees that LA(1)==';'
@@ -702,7 +702,7 @@
 		state.following[++state._fsp] = fset;
 	}
 
-	/** Return List<String> of the rules in your parser instance
+	/** Return List&lt;String&gt; of the rules in your parser instance
 	 *  leading up to a call to this method.  You could override if
 	 *  you want more details such as the file/line info of where
 	 *  in the parser java code a rule is invoked.
@@ -710,7 +710,7 @@
 	 *  This is very useful for error messages and for context-sensitive
 	 *  error recovery.
 	 */
-	public List getRuleInvocationStack() {
+	public List<String> getRuleInvocationStack() {
 		String parserClassName = getClass().getName();
 		return getRuleInvocationStack(new Throwable(), parserClassName);
 	}
@@ -722,12 +722,12 @@
 	 *
 	 *  TODO: move to a utility class or something; weird having lexer call this
 	 */
-	public static List getRuleInvocationStack(Throwable e,
+	public static List<String> getRuleInvocationStack(Throwable e,
 											  String recognizerClassName)
 	{
-		List rules = new ArrayList();
+		List<String> rules = new ArrayList<String>();
 		StackTraceElement[] stack = e.getStackTrace();
-		int i = 0;
+		int i;
 		for (i=stack.length-1; i>=0; i--) {
 			StackTraceElement t = stack[i];
 			if ( t.getClassName().startsWith("org.antlr.runtime.") ) {
@@ -769,13 +769,13 @@
 	public abstract String getSourceName();
 
 	/** A convenience method for use most often with template rewrites.
-	 *  Convert a List<Token> to List<String>
+	 *  Convert a List&lt;Token&gt; to List&lt;String&gt;
 	 */
-	public List toStrings(List tokens) {
+	public List<String> toStrings(List<? extends Token> tokens) {
 		if ( tokens==null ) return null;
-		List strings = new ArrayList(tokens.size());
+		List<String> strings = new ArrayList<String>(tokens.size());
 		for (int i=0; i<tokens.size(); i++) {
-			strings.add(((Token)tokens.get(i)).getText());
+			strings.add(tokens.get(i).getText());
 		}
 		return strings;
 	}
@@ -792,14 +792,14 @@
 	 */
 	public int getRuleMemoization(int ruleIndex, int ruleStartIndex) {
 		if ( state.ruleMemo[ruleIndex]==null ) {
-			state.ruleMemo[ruleIndex] = new HashMap();
+			state.ruleMemo[ruleIndex] = new HashMap<Integer, Integer>();
 		}
 		Integer stopIndexI =
-			(Integer)state.ruleMemo[ruleIndex].get(new Integer(ruleStartIndex));
+			state.ruleMemo[ruleIndex].get(ruleStartIndex);
 		if ( stopIndexI==null ) {
 			return MEMO_RULE_UNKNOWN;
 		}
-		return stopIndexI.intValue();
+		return stopIndexI;
 	}
 
 	/** Has this rule already parsed input at the current index in the
@@ -842,9 +842,7 @@
 			System.err.println("!!!!!!!!! memo size is "+state.ruleMemo.length+", but rule index is "+ruleIndex);
 		}
 		if ( state.ruleMemo[ruleIndex]!=null ) {
-			state.ruleMemo[ruleIndex].put(
-				new Integer(ruleStartIndex), new Integer(stopTokenIndex)
-			);
+			state.ruleMemo[ruleIndex].put(ruleStartIndex, stopTokenIndex);
 		}
 	}
 
@@ -854,7 +852,7 @@
 	public int getRuleMemoizationCacheSize() {
 		int n = 0;
 		for (int i = 0; state.ruleMemo!=null && i < state.ruleMemo.length; i++) {
-			Map ruleMap = state.ruleMemo[i];
+			Map<Integer, Integer> ruleMap = state.ruleMemo[i];
 			if ( ruleMap!=null ) {
 				n += ruleMap.size(); // how many input indexes are recorded?
 			}
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/BitSet.java b/runtime/Java/src/main/java/org/antlr/runtime/BitSet.java
index f013a26..5216518 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/BitSet.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/BitSet.java
@@ -58,11 +58,11 @@
     }
 
 	/** Construction from a list of integers */
-	public BitSet(List items) {
+	public BitSet(List<Integer> items) {
 		this();
 		for (int i = 0; i < items.size(); i++) {
-			Integer v = (Integer) items.get(i);
-			add(v.intValue());
+			Integer v = items.get(i);
+			add(v);
 		}
 	}
 
@@ -163,6 +163,7 @@
         return 1L << bitPosition;
     }
 
+	@Override
     public Object clone() {
         BitSet s;
         try {
@@ -191,6 +192,7 @@
         return deg;
     }
 
+	@Override
     public boolean equals(Object other) {
         if ( other == null || !(other instanceof BitSet) ) {
             return false;
@@ -293,12 +295,13 @@
 		return bit >> LOG_BITS; // bit / BITS
 	}
 
+	@Override
 	public String toString() {
 		return toString(null);
 	}
 
 	public String toString(String[] tokenNames) {
-		StringBuffer buf = new StringBuffer();
+		StringBuilder buf = new StringBuilder();
 		String separator = ",";
 		boolean havePrintedAnElement = false;
 		buf.append('{');
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/BufferedTokenStream.java b/runtime/Java/src/main/java/org/antlr/runtime/BufferedTokenStream.java
index 7742d4f..90d218b 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/BufferedTokenStream.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/BufferedTokenStream.java
@@ -36,8 +36,8 @@
  *  lexer. Useful when the parser or lexer has to set context/mode info before
  *  proper lexing of future tokens. The ST template parser needs this,
  *  for example, because it has to constantly flip back and forth between
- *  inside/output templates. E.g., <names:{hi, <it>}> has to parse names
- *  as part of an expression but "hi, <it>" as a nested template.
+ *  inside/output templates. E.g., {@code <names:{hi, <it>}>} has to parse names
+ *  as part of an expression but {@code "hi, <it>"} as a nested template.
  *
  *  You can't use this stream if you pass whitespace or other off-channel
  *  tokens to the parser. The stream can't ignore off-channel tokens.
@@ -68,32 +68,39 @@
 
 	protected int range = -1; // how deep have we gone?
 
-    public BufferedTokenStream() {;}
+    public BufferedTokenStream() {}
 
     public BufferedTokenStream(TokenSource tokenSource) {
         this.tokenSource = tokenSource;
     }
 
+	@Override
     public TokenSource getTokenSource() { return tokenSource; }
 
+	@Override
 	public int index() { return p; }
 
+	@Override
 	public int range() { return range; }
 
+	@Override
     public int mark() {
         if ( p == -1 ) setup();
 		lastMarker = index();
 		return lastMarker;
 	}
 
+	@Override
 	public void release(int marker) {
 		// no resources to release
 	}
 
+	@Override
     public void rewind(int marker) {
         seek(marker);
     }
 
+	@Override
     public void rewind() {
         seek(lastMarker);
     }
@@ -103,8 +110,10 @@
         lastMarker = 0;
     }
 
+	@Override
     public void seek(int index) { p = index; }
 
+	@Override
     public int size() { return tokens.size(); }
 
     /** Move the input pointer to the next incoming token.  The stream
@@ -114,6 +123,7 @@
      *
      *  Walk past any token not on the channel the parser is listening to.
      */
+	@Override
     public void consume() {
         if ( p == -1 ) setup();
         p++;
@@ -138,6 +148,7 @@
         }
     }
 
+	@Override
     public Token get(int i) {
         if ( i < 0 || i >= tokens.size() ) {
             throw new NoSuchElementException("token index "+i+" out of range 0.."+(tokens.size()-1));
@@ -146,10 +157,10 @@
     }
 
 	/** Get all tokens from start..stop inclusively */
-	public List get(int start, int stop) {
+	public List<? extends Token> get(int start, int stop) {
 		if ( start<0 || stop<0 ) return null;
 		if ( p == -1 ) setup();
-		List subset = new ArrayList();
+		List<Token> subset = new ArrayList<Token>();
 		if ( stop>=tokens.size() ) stop = tokens.size()-1;
 		for (int i = start; i <= stop; i++) {
 			Token t = tokens.get(i);
@@ -159,6 +170,7 @@
 		return subset;
 	}
 
+	@Override
 	public int LA(int i) { return LT(i).getType(); }
 
     protected Token LB(int k) {
@@ -166,6 +178,7 @@
         return tokens.get(p-k);
     }
 
+	@Override
     public Token LT(int k) {
         if ( p == -1 ) setup();
         if ( k==0 ) return null;
@@ -190,9 +203,9 @@
         p = -1;
     }
     
-    public List getTokens() { return tokens; }
+    public List<? extends Token> getTokens() { return tokens; }
 
-    public List getTokens(int start, int stop) {
+    public List<? extends Token> getTokens(int start, int stop) {
         return getTokens(start, stop, (BitSet)null);
     }
 
@@ -200,7 +213,7 @@
      *  the token type BitSet.  Return null if no tokens were found.  This
      *  method looks at both on and off channel tokens.
      */
-    public List getTokens(int start, int stop, BitSet types) {
+    public List<? extends Token> getTokens(int start, int stop, BitSet types) {
         if ( p == -1 ) setup();
         if ( stop>=tokens.size() ) stop=tokens.size()-1;
         if ( start<0 ) start=0;
@@ -214,34 +227,37 @@
                 filteredTokens.add(t);
             }
         }
-        if ( filteredTokens.size()==0 ) {
+        if ( filteredTokens.isEmpty() ) {
             filteredTokens = null;
         }
         return filteredTokens;
     }
 
-    public List getTokens(int start, int stop, List types) {
+    public List<? extends Token> getTokens(int start, int stop, List<Integer> types) {
         return getTokens(start,stop,new BitSet(types));
     }
 
-    public List getTokens(int start, int stop, int ttype) {
+    public List<? extends Token> getTokens(int start, int stop, int ttype) {
         return getTokens(start,stop,BitSet.of(ttype));
     }
 
+	@Override
     public String getSourceName() {	return tokenSource.getSourceName();	}
 
     /** Grab *all* tokens from stream and return string */
+	@Override
     public String toString() {
         if ( p == -1 ) setup();
         fill();
         return toString(0, tokens.size()-1);
     }
 
+	@Override
     public String toString(int start, int stop) {
         if ( start<0 || stop<0 ) return null;
         if ( p == -1 ) setup();
         if ( stop>=tokens.size() ) stop = tokens.size()-1;
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         for (int i = start; i <= stop; i++) {
             Token t = tokens.get(i);
             if ( t.getType()==Token.EOF ) break;
@@ -250,6 +266,7 @@
         return buf.toString();
     }
 
+	@Override
     public String toString(Token start, Token stop) {
         if ( start!=null && stop!=null ) {
             return toString(start.getTokenIndex(), stop.getTokenIndex());
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/ClassicToken.java b/runtime/Java/src/main/java/org/antlr/runtime/ClassicToken.java
index 72c2bd9..b73734c 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/ClassicToken.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/ClassicToken.java
@@ -67,61 +67,76 @@
 		this.channel = channel;
 	}
 
+	@Override
 	public int getType() {
 		return type;
 	}
 
+	@Override
 	public void setLine(int line) {
 		this.line = line;
 	}
 
+	@Override
 	public String getText() {
 		return text;
 	}
 
+	@Override
 	public void setText(String text) {
 		this.text = text;
 	}
 
+	@Override
 	public int getLine() {
 		return line;
 	}
 
+	@Override
 	public int getCharPositionInLine() {
 		return charPositionInLine;
 	}
 
+	@Override
 	public void setCharPositionInLine(int charPositionInLine) {
 		this.charPositionInLine = charPositionInLine;
 	}
 
+	@Override
 	public int getChannel() {
 		return channel;
 	}
 
+	@Override
 	public void setChannel(int channel) {
 		this.channel = channel;
 	}
 
+	@Override
 	public void setType(int type) {
 		this.type = type;
 	}
 
+	@Override
 	public int getTokenIndex() {
 		return index;
 	}
 
+	@Override
 	public void setTokenIndex(int index) {
 		this.index = index;
 	}
 
+	@Override
 	public CharStream getInputStream() {
 		return null;
 	}
 
+	@Override
 	public void setInputStream(CharStream input) {
 	}
 	
+	@Override
 	public String toString() {
 		String channelStr = "";
 		if ( channel>0 ) {
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/CommonToken.java b/runtime/Java/src/main/java/org/antlr/runtime/CommonToken.java
index 6bd9b89..2647fe8 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/CommonToken.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/CommonToken.java
@@ -42,7 +42,7 @@
 	  */
 	protected String text;
 
-	/** What token number is this from 0..n-1 tokens; < 0 implies invalid index */
+	/** What token number is this from 0..n-1 tokens; &lt; 0 implies invalid index */
 	protected int index = -1;
 
 	/** The char position into the input buffer where this token starts */
@@ -83,14 +83,17 @@
 		}
 	}
 
+	@Override
 	public int getType() {
 		return type;
 	}
 
+	@Override
 	public void setLine(int line) {
 		this.line = line;
 	}
 
+	@Override
 	public String getText() {
 		if ( text!=null ) {
 			return text;
@@ -112,30 +115,37 @@
 	 *  that start/stop indexes are not valid.  It means that that input
 	 *  was converted to a new string in the token object.
 	 */
+	@Override
 	public void setText(String text) {
 		this.text = text;
 	}
 
+	@Override
 	public int getLine() {
 		return line;
 	}
 
+	@Override
 	public int getCharPositionInLine() {
 		return charPositionInLine;
 	}
 
+	@Override
 	public void setCharPositionInLine(int charPositionInLine) {
 		this.charPositionInLine = charPositionInLine;
 	}
 
+	@Override
 	public int getChannel() {
 		return channel;
 	}
 
+	@Override
 	public void setChannel(int channel) {
 		this.channel = channel;
 	}
 
+	@Override
 	public void setType(int type) {
 		this.type = type;
 	}
@@ -156,22 +166,27 @@
 		this.stop = stop;
 	}
 
+	@Override
 	public int getTokenIndex() {
 		return index;
 	}
 
+	@Override
 	public void setTokenIndex(int index) {
 		this.index = index;
 	}
 
+	@Override
 	public CharStream getInputStream() {
 		return input;
 	}
 
+	@Override
 	public void setInputStream(CharStream input) {
 		this.input = input;
 	}
 
+	@Override
 	public String toString() {
 		String channelStr = "";
 		if ( channel>0 ) {
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/CommonTokenStream.java b/runtime/Java/src/main/java/org/antlr/runtime/CommonTokenStream.java
index 2bea7ec..99cfece 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/CommonTokenStream.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/CommonTokenStream.java
@@ -49,7 +49,7 @@
     /** Skip tokens on any channel but this one; this is how we skip whitespace... */
     protected int channel = Token.DEFAULT_CHANNEL;
 
-    public CommonTokenStream() { ; }
+    public CommonTokenStream() { }
 
     public CommonTokenStream(TokenSource tokenSource) {
         super(tokenSource);
@@ -61,6 +61,7 @@
     }
 
     /** Always leave p on an on-channel token. */
+	@Override
     public void consume() {
         if ( p == -1 ) setup();
         p++;
@@ -71,6 +72,7 @@
         }
     }
 
+	@Override
     protected Token LB(int k) {
         if ( k==0 || (p-k)<0 ) return null;
 
@@ -86,6 +88,7 @@
         return tokens.get(i);
     }
 
+	@Override
     public Token LT(int k) {
         //System.out.println("enter LT("+k+")");
         if ( p == -1 ) setup();
@@ -116,17 +119,19 @@
     }
 
     protected int skipOffTokenChannelsReverse(int i) {
-        while ( i>=0 && ((Token)tokens.get(i)).getChannel()!=channel ) {
+        while ( i>=0 && tokens.get(i).getChannel()!=channel ) {
             i--;
         }
         return i;
     }
 
+	@Override
 	public void reset() {
 		super.reset();
 		p = skipOffTokenChannels(0);
 	}
 
+	@Override
 	protected void setup() {
         p = 0;
         sync(0);
@@ -151,6 +156,7 @@
 	}
 
     /** Reset this token stream by setting its token source. */
+	@Override
     public void setTokenSource(TokenSource tokenSource) {
         super.setTokenSource(tokenSource);
         channel = Token.DEFAULT_CHANNEL;
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/FailedPredicateException.java b/runtime/Java/src/main/java/org/antlr/runtime/FailedPredicateException.java
index 5bef1bd..c072479 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/FailedPredicateException.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/FailedPredicateException.java
@@ -48,6 +48,7 @@
 		this.predicateText = predicateText;
 	}
 
+	@Override
 	public String toString() {
 		return "FailedPredicateException("+ruleName+",{"+predicateText+"}?)";
 	}
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/LegacyCommonTokenStream.java b/runtime/Java/src/main/java/org/antlr/runtime/LegacyCommonTokenStream.java
index f9c5e39..2c84969 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/LegacyCommonTokenStream.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/LegacyCommonTokenStream.java
@@ -42,13 +42,13 @@
 	/** Record every single token pulled from the source so we can reproduce
 	 *  chunks of it later.
 	 */
-	protected List tokens;
+	protected List<Token> tokens;
 
-	/** Map<tokentype, channel> to override some Tokens' channel numbers */
-	protected Map channelOverrideMap;
+	/** Map&lt;tokentype, channel&gt; to override some Tokens' channel numbers */
+	protected Map<Integer, Integer> channelOverrideMap;
 
-	/** Set<tokentype>; discard any tokens with this type */
-	protected Set discardSet;
+	/** Set&lt;tokentype&gt;; discard any tokens with this type */
+	protected Set<Integer> discardSet;
 
 	/** Skip tokens on any channel but this one; this is how we skip whitespace... */
 	protected int channel = Token.DEFAULT_CHANNEL;
@@ -67,7 +67,7 @@
     protected int p = -1;
 
 	public LegacyCommonTokenStream() {
-		tokens = new ArrayList(500);
+		tokens = new ArrayList<Token>(500);
 	}
 
 	public LegacyCommonTokenStream(TokenSource tokenSource) {
@@ -99,10 +99,9 @@
 			boolean discard = false;
 			// is there a channel override for token type?
 			if ( channelOverrideMap!=null ) {
-				Integer channelI = (Integer)
-					channelOverrideMap.get(new Integer(t.getType()));
+				Integer channelI = channelOverrideMap.get(t.getType());
 				if ( channelI!=null ) {
-					t.setChannel(channelI.intValue());
+					t.setChannel(channelI);
 				}
 			}
 			if ( discardSet!=null &&
@@ -132,6 +131,7 @@
 	 *
 	 *  Walk past any token not on the channel the parser is listening to.
 	 */
+	@Override
 	public void consume() {
 		if ( p<tokens.size() ) {
             p++;
@@ -144,14 +144,14 @@
 	 */
 	protected int skipOffTokenChannels(int i) {
 		int n = tokens.size();
-		while ( i<n && ((Token)tokens.get(i)).getChannel()!=channel ) {
+		while ( i<n && tokens.get(i).getChannel()!=channel ) {
 			i++;
 		}
 		return i;
 	}
 
 	protected int skipOffTokenChannelsReverse(int i) {
-		while ( i>=0 && ((Token)tokens.get(i)).getChannel()!=channel ) {
+		while ( i>=0 && tokens.get(i).getChannel()!=channel ) {
 			i--;
 		}
 		return i;
@@ -165,30 +165,30 @@
 	 */
 	public void setTokenTypeChannel(int ttype, int channel) {
 		if ( channelOverrideMap==null ) {
-			channelOverrideMap = new HashMap();
+			channelOverrideMap = new HashMap<Integer, Integer>();
 		}
-        channelOverrideMap.put(new Integer(ttype), new Integer(channel));
+        channelOverrideMap.put(ttype, channel);
 	}
 
 	public void discardTokenType(int ttype) {
 		if ( discardSet==null ) {
-			discardSet = new HashSet();
+			discardSet = new HashSet<Integer>();
 		}
-        discardSet.add(new Integer(ttype));
+        discardSet.add(ttype);
 	}
 
 	public void discardOffChannelTokens(boolean discardOffChannelTokens) {
 		this.discardOffChannelTokens = discardOffChannelTokens;
 	}
 
-	public List getTokens() {
+	public List<? extends Token> getTokens() {
 		if ( p == -1 ) {
 			fillBuffer();
 		}
 		return tokens;
 	}
 
-	public List getTokens(int start, int stop) {
+	public List<? extends Token> getTokens(int start, int stop) {
 		return getTokens(start, stop, (BitSet)null);
 	}
 
@@ -196,7 +196,7 @@
 	 *  the token type BitSet.  Return null if no tokens were found.  This
 	 *  method looks at both on and off channel tokens.
 	 */
-	public List getTokens(int start, int stop, BitSet types) {
+	public List<? extends Token> getTokens(int start, int stop, BitSet types) {
 		if ( p == -1 ) {
 			fillBuffer();
 		}
@@ -211,30 +211,31 @@
 		}
 
 		// list = tokens[start:stop]:{Token t, t.getType() in types}
-		List filteredTokens = new ArrayList();
+		List<Token> filteredTokens = new ArrayList<Token>();
 		for (int i=start; i<=stop; i++) {
-			Token t = (Token)tokens.get(i);
+			Token t = tokens.get(i);
 			if ( types==null || types.member(t.getType()) ) {
 				filteredTokens.add(t);
 			}
 		}
-		if ( filteredTokens.size()==0 ) {
+		if ( filteredTokens.isEmpty() ) {
 			filteredTokens = null;
 		}
 		return filteredTokens;
 	}
 
-	public List getTokens(int start, int stop, List types) {
+	public List<? extends Token> getTokens(int start, int stop, List<Integer> types) {
 		return getTokens(start,stop,new BitSet(types));
 	}
 
-	public List getTokens(int start, int stop, int ttype) {
+	public List<? extends Token> getTokens(int start, int stop, int ttype) {
 		return getTokens(start,stop,BitSet.of(ttype));
 	}
 
 	/** Get the ith token from the current position 1..n where k=1 is the
 	 *  first symbol of lookahead.
 	 */
+	@Override
 	public Token LT(int k) {
 		if ( p == -1 ) {
 			fillBuffer();
@@ -247,7 +248,7 @@
 		}
 		//System.out.print("LT(p="+p+","+k+")=");
 		if ( (p+k-1) >= tokens.size() ) {
-            return (Token)tokens.get(tokens.size()-1);
+            return tokens.get(tokens.size()-1);
 		}
 		//System.out.println(tokens.get(p+k-1));
 		int i = p;
@@ -259,11 +260,11 @@
 			n++;
 		}
 		if ( i>=tokens.size() ) {
-            return (Token)tokens.get(tokens.size()-1); // must be EOF
+            return tokens.get(tokens.size()-1); // must be EOF
 		}
 
 		if ( i>range ) range = i;
-        return (Token)tokens.get(i);
+        return tokens.get(i);
     }
 
 	/** Look backwards k tokens on-channel tokens */
@@ -290,27 +291,30 @@
 		if ( i<0 ) {
 			return null;
 		}
-		return (Token)tokens.get(i);
+		return tokens.get(i);
 	}
 
 	/** Return absolute token i; ignore which channel the tokens are on;
 	 *  that is, count all tokens not just on-channel tokens.
 	 */
+	@Override
 	public Token get(int i) {
-		return (Token)tokens.get(i);
+		return tokens.get(i);
 	}
 
 	/** Get all tokens from start..stop inclusively */
-	public List get(int start, int stop) {
+	public List<? extends Token> get(int start, int stop) {
 		if ( p == -1 ) fillBuffer();
 		if ( start<0 || stop<0 ) return null;
 		return tokens.subList(start, stop);
 	}
 
+	@Override
 	public int LA(int i) {
         return LT(i).getType();
     }
 
+	@Override
     public int mark() {
 		if ( p == -1 ) {
 			fillBuffer();
@@ -319,26 +323,32 @@
 		return lastMarker;
 	}
 
+	@Override
 	public void release(int marker) {
 		// no resources to release
 	}
 
+	@Override
 	public int size() {
 		return tokens.size();
 	}
 
+	@Override
     public int index() {
         return p;
     }
 
+	@Override
 	public int range() {
 		return range;
 	}
 
+	@Override
 	public void rewind(int marker) {
 		seek(marker);
 	}
 
+	@Override
 	public void rewind() {
 		seek(lastMarker);
 	}
@@ -348,18 +358,22 @@
 		lastMarker = 0;
 	}
 	
+	@Override
 	public void seek(int index) {
 		p = index;
 	}
 
+	@Override
 	public TokenSource getTokenSource() {
 		return tokenSource;
 	}
 
+	@Override
 	public String getSourceName() {
 		return getTokenSource().getSourceName();
 	}
 
+	@Override
 	public String toString() {
 		if ( p == -1 ) {
 			fillBuffer();
@@ -367,6 +381,7 @@
 		return toString(0, tokens.size()-1);
 	}
 
+	@Override
 	public String toString(int start, int stop) {
 		if ( start<0 || stop<0 ) {
 			return null;
@@ -377,14 +392,15 @@
 		if ( stop>=tokens.size() ) {
 			stop = tokens.size()-1;
 		}
- 		StringBuffer buf = new StringBuffer();
+ 		StringBuilder buf = new StringBuilder();
 		for (int i = start; i <= stop; i++) {
-			Token t = (Token)tokens.get(i);
+			Token t = tokens.get(i);
 			buf.append(t.getText());
 		}
 		return buf.toString();
 	}
 
+	@Override
 	public String toString(Token start, Token stop) {
 		if ( start!=null && stop!=null ) {
 			return toString(start.getTokenIndex(), stop.getTokenIndex());
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/Lexer.java b/runtime/Java/src/main/java/org/antlr/runtime/Lexer.java
index a1a24e1..66c005f 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/Lexer.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/Lexer.java
@@ -48,6 +48,7 @@
 		this.input = input;
 	}
 
+	@Override
 	public void reset() {
 		super.reset(); // reset all recognizer state variables
 		// wack Lexer state variables
@@ -78,12 +79,7 @@
 			state.tokenStartLine = input.getLine();
 			state.text = null;
 			if ( input.LA(1)==CharStream.EOF ) {
-                Token eof = new CommonToken((CharStream)input,Token.EOF,
-                                            Token.DEFAULT_CHANNEL,
-                                            input.index(),input.index());
-                eof.setLine(getLine());
-                eof.setCharPositionInLine(getCharPositionInLine());
-                return eof;
+				return getEOFToken();
 			}
 			try {
 				mTokens();
@@ -110,6 +106,18 @@
 		}
 	}
 
+	/** Returns the EOF token (default), if you need
+	 *  to return a custom token instead override this method.
+	 */
+	public Token getEOFToken() {
+		Token eof = new CommonToken(input,Token.EOF,
+									Token.DEFAULT_CHANNEL,
+									input.index(),input.index());
+		eof.setLine(getLine());
+		eof.setCharPositionInLine(getCharPositionInLine());
+		return eof;
+	}
+
 	/** Instruct the lexer to skip creating a token for current lexer rule
 	 *  and look for another token.  nextToken() knows to keep looking when
 	 *  a lexer rule finishes with token set to SKIP_TOKEN.  Recall that
@@ -134,6 +142,7 @@
 		return this.input;
 	}
 
+	@Override
 	public String getSourceName() {
 		return input.getSourceName();
 	}
@@ -250,6 +259,7 @@
 		state.text = text;
 	}
 
+	@Override
 	public void reportError(RecognitionException e) {
 		/** TODO: not thought about recovery in lexer yet.
 		 *
@@ -265,8 +275,9 @@
 		displayRecognitionError(this.getTokenNames(), e);
 	}
 
+	@Override
 	public String getErrorMessage(RecognitionException e, String[] tokenNames) {
-		String msg = null;
+		String msg;
 		if ( e instanceof MismatchedTokenException ) {
 			MismatchedTokenException mte = (MismatchedTokenException)e;
 			msg = "mismatched character "+getCharErrorDisplay(e.c)+" expecting "+getCharErrorDisplay(mte.expecting);
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/MismatchedNotSetException.java b/runtime/Java/src/main/java/org/antlr/runtime/MismatchedNotSetException.java
index 49ceb27..62f14ba 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/MismatchedNotSetException.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/MismatchedNotSetException.java
@@ -35,6 +35,7 @@
 		super(expecting, input);
 	}
 
+	@Override
 	public String toString() {
 		return "MismatchedNotSetException("+getUnexpectedType()+"!="+expecting+")";
 	}
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/MismatchedRangeException.java b/runtime/Java/src/main/java/org/antlr/runtime/MismatchedRangeException.java
index 23b3d87..f6c02c6 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/MismatchedRangeException.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/MismatchedRangeException.java
@@ -39,6 +39,7 @@
 		this.b = b;
 	}
 
+	@Override
 	public String toString() {
 		return "MismatchedNotSetException("+getUnexpectedType()+" not in ["+a+","+b+"])";
 	}
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/MismatchedSetException.java b/runtime/Java/src/main/java/org/antlr/runtime/MismatchedSetException.java
index 9bfa530..36bd47b 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/MismatchedSetException.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/MismatchedSetException.java
@@ -38,6 +38,7 @@
 		this.expecting = expecting;
 	}
 
+	@Override
 	public String toString() {
 		return "MismatchedSetException("+getUnexpectedType()+"!="+expecting+")";
 	}
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/MismatchedTokenException.java b/runtime/Java/src/main/java/org/antlr/runtime/MismatchedTokenException.java
index 07ae814..4af2269 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/MismatchedTokenException.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/MismatchedTokenException.java
@@ -39,6 +39,7 @@
 		this.expecting = expecting;
 	}
 
+	@Override
 	public String toString() {
 		return "MismatchedTokenException("+getUnexpectedType()+"!="+expecting+")";
 	}
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/MismatchedTreeNodeException.java b/runtime/Java/src/main/java/org/antlr/runtime/MismatchedTreeNodeException.java
index 99c834d..66403d0 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/MismatchedTreeNodeException.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/MismatchedTreeNodeException.java
@@ -28,7 +28,6 @@
 package org.antlr.runtime;
 
 import org.antlr.runtime.tree.TreeNodeStream;
-import org.antlr.runtime.tree.Tree;
 
 /**
  */
@@ -43,6 +42,7 @@
 		this.expecting = expecting;
 	}
 
+	@Override
 	public String toString() {
 		return "MismatchedTreeNodeException("+getUnexpectedType()+"!="+expecting+")";
 	}
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/MissingTokenException.java b/runtime/Java/src/main/java/org/antlr/runtime/MissingTokenException.java
index 9eda1f2..5b44e06 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/MissingTokenException.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/MissingTokenException.java
@@ -44,6 +44,7 @@
 		return expecting;
 	}
 
+	@Override
 	public String toString() {
 		if ( inserted!=null && token!=null ) {
 			return "MissingTokenException(inserted "+inserted+" at "+token.getText()+")";
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/NoViableAltException.java b/runtime/Java/src/main/java/org/antlr/runtime/NoViableAltException.java
index 889045f..29513a3 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/NoViableAltException.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/NoViableAltException.java
@@ -46,6 +46,7 @@
 		this.stateNumber = stateNumber;
 	}
 
+	@Override
 	public String toString() {
 		if ( input instanceof CharStream ) {
 			return "NoViableAltException('"+(char)getUnexpectedType()+"'@["+grammarDecisionDescription+"])";
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/Parser.java b/runtime/Java/src/main/java/org/antlr/runtime/Parser.java
index 030cf72..779828f 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/Parser.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/Parser.java
@@ -27,8 +27,6 @@
  */
 package org.antlr.runtime;
 
-import org.antlr.runtime.debug.DebugTokenStream;
-
 /** A parser for TokenStreams.  "parser grammars" result in a subclass
  *  of this.
  */
@@ -45,6 +43,7 @@
 		this.input = input;
     }
 
+	@Override
 	public void reset() {
 		super.reset(); // reset all recognizer state variables
 		if ( input!=null ) {
@@ -52,16 +51,18 @@
 		}
 	}
 
+	@Override
 	protected Object getCurrentInputSymbol(IntStream input) {
 		return ((TokenStream)input).LT(1);
 	}
 
+	@Override
 	protected Object getMissingSymbol(IntStream input,
 									  RecognitionException e,
 									  int expectedTokenType,
 									  BitSet follow)
 	{
-		String tokenText = null;
+		String tokenText;
 		if ( expectedTokenType==Token.EOF ) tokenText = "<missing EOF>";
 		else tokenText = "<missing "+getTokenNames()[expectedTokenType]+">";
 		CommonToken t = new CommonToken(expectedTokenType, tokenText);
@@ -87,6 +88,7 @@
 		return input;
 	}
 
+	@Override
 	public String getSourceName() {
 		return input.getSourceName();
 	}
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/ParserRuleReturnScope.java b/runtime/Java/src/main/java/org/antlr/runtime/ParserRuleReturnScope.java
index e3e38ce..1ecb78a 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/ParserRuleReturnScope.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/ParserRuleReturnScope.java
@@ -27,8 +27,6 @@
  */
 package org.antlr.runtime;
 
-import org.antlr.runtime.tree.CommonTree;
-
 /** Rules that return more than a single value must return an object
  *  containing all the values.  Besides the properties defined in
  *  RuleLabelScope.predefinedRulePropertiesScope there may be user-defined
@@ -49,9 +47,11 @@
  */
 public class ParserRuleReturnScope extends RuleReturnScope {
 	public Token start, stop;
+	@Override
 	public Object getStart() { return start; }
+	@Override
 	public Object getStop() { return stop; }
 
-	public Object tree; // only used when output=AST
-	public Object getTree() { return tree; }
+	@Override
+	public Object getTree() { return null; }
 }
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/RecognitionException.java b/runtime/Java/src/main/java/org/antlr/runtime/RecognitionException.java
index 3e79f99..c3f811d 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/RecognitionException.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/RecognitionException.java
@@ -122,9 +122,20 @@
 
 	protected void extractInformationFromTreeNodeStream(IntStream input) {
 		TreeNodeStream nodes = (TreeNodeStream)input;
+
 		this.node = nodes.LT(1);
+
+		Object positionNode = null;
+		if (nodes instanceof PositionTrackingStream) {
+			positionNode = ((PositionTrackingStream<?>)nodes).getKnownPositionElement(false);
+			if (positionNode == null) {
+				positionNode = ((PositionTrackingStream<?>)nodes).getKnownPositionElement(true);
+				this.approximateLineInfo = positionNode != null;
+			}
+		}
+
 		TreeAdaptor adaptor = nodes.getTreeAdaptor();
-		Token payload = adaptor.getToken(node);
+		Token payload = adaptor.getToken(positionNode != null ? positionNode : this.node);
 		if ( payload!=null ) {
 			this.token = payload;
 			if ( payload.getLine()<= 0 ) {
@@ -140,8 +151,13 @@
 						this.approximateLineInfo = true;
 						break;
 					}
+
 					--i;
-					priorNode = nodes.LT(i);
+					try {
+						priorNode = nodes.LT(i);
+					} catch (UnsupportedOperationException ex) {
+						priorNode = null;
+					}
 				}
 			}
 			else { // node created from real token
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/RecognizerSharedState.java b/runtime/Java/src/main/java/org/antlr/runtime/RecognizerSharedState.java
index 068ac3b..c6cd1a4 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/RecognizerSharedState.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/RecognizerSharedState.java
@@ -24,7 +24,8 @@
  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.
- */package org.antlr.runtime;
+ */
+package org.antlr.runtime;
 
 import java.util.Map;
 
@@ -66,18 +67,18 @@
 	public int syntaxErrors = 0;
 
 	/** If 0, no backtracking is going on.  Safe to exec actions etc...
-	 *  If >0 then it's the level of backtracking.
+	 *  If &gt;0 then it's the level of backtracking.
 	 */
 	public int backtracking = 0;
 
-	/** An array[size num rules] of Map<Integer,Integer> that tracks
+	/** An array[size num rules] of Map&lt;Integer,Integer&gt; that tracks
 	 *  the stop token index for each rule.  ruleMemo[ruleIndex] is
 	 *  the memoization table for ruleIndex.  For key ruleStartIndex, you
 	 *  get back the stop token for associated rule or MEMO_RULE_FAILED.
 	 *
 	 *  This is only used if rule memoization is on (which it is by default).
 	 */
-	public Map[] ruleMemo;
+	public Map<Integer, Integer>[] ruleMemo;
 
 
 	// LEXER FIELDS (must be in same state object to avoid casting
@@ -117,8 +118,9 @@
  	 */
 	public String text;
 
-    public RecognizerSharedState() {;}
+    public RecognizerSharedState() {}
     
+	@SuppressWarnings("unchecked")
     public RecognizerSharedState(RecognizerSharedState state) {
         if ( this.following.length < state.following.length ) {
             this.following = new BitSet[state.following.length];
@@ -131,7 +133,7 @@
         this.syntaxErrors = state.syntaxErrors;
         this.backtracking = state.backtracking;
         if ( state.ruleMemo!=null ) {
-            this.ruleMemo = new Map[state.ruleMemo.length];
+            this.ruleMemo = (Map<Integer, Integer>[])new Map<?, ?>[state.ruleMemo.length];
             System.arraycopy(state.ruleMemo, 0, this.ruleMemo, 0, state.ruleMemo.length);
         }
         this.token = state.token;
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/SerializedGrammar.java b/runtime/Java/src/main/java/org/antlr/runtime/SerializedGrammar.java
index a609053..7ccfad3 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/SerializedGrammar.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/SerializedGrammar.java
@@ -42,30 +42,37 @@
 
     public String name;
     public char type; // in {l, p, t, c}
-    public List rules;
+    public List<? extends Rule> rules;
 
-    class Rule {
+    protected class Rule {
         String name;
         Block block;
         public Rule(String name, Block block) {
             this.name = name;
             this.block = block;
         }
+		@Override
         public String toString() {
             return name+":"+block;
         }
     }
 
-    class Block {
+	protected abstract class Node {
+		@Override
+		public abstract String toString();
+	}
+
+    protected class Block extends Node {
         List[] alts;
         public Block(List[] alts) {
             this.alts = alts;
         }
+		@Override
         public String toString() {
-            StringBuffer buf = new StringBuffer();
+            StringBuilder buf = new StringBuilder();
             buf.append("(");
             for (int i = 0; i < alts.length; i++) {
-                List alt = alts[i];
+                List<?> alt = alts[i];
                 if ( i>0 ) buf.append("|");
                 buf.append(alt.toString());
             }
@@ -74,15 +81,17 @@
         }
     }
 
-    class TokenRef {
+    protected class TokenRef extends Node {
         int ttype;
         public TokenRef(int ttype) { this.ttype = ttype; }
+		@Override
         public String toString() { return String.valueOf(ttype); }
     }
 
-    class RuleRef {
+    protected class RuleRef extends Node {
         int ruleIndex;
         public RuleRef(int ruleIndex) { this.ruleIndex = ruleIndex; }
+		@Override
         public String toString() { return String.valueOf(ruleIndex); }
     }
 
@@ -109,8 +118,8 @@
         rules = readRules(in, numRules);
     }
 
-    protected List readRules(DataInputStream in, int numRules) throws IOException {
-        List rules = new ArrayList();
+    protected List<? extends Rule> readRules(DataInputStream in, int numRules) throws IOException {
+        List<Rule> rules = new ArrayList<Rule>();
         for (int i=0; i<numRules; i++) {
             Rule r = readRule(in);
             rules.add(r);
@@ -132,18 +141,19 @@
 
     protected Block readBlock(DataInputStream in) throws IOException {
         int nalts = in.readShort();
-        List[] alts = new List[nalts];
+		@SuppressWarnings("unchecked")
+        List<Node>[] alts = (List<Node>[])new List<?>[nalts];
         //System.out.println("enter block n="+nalts);
         for (int i=0; i<nalts; i++) {
-            List alt = readAlt(in);
+            List<Node> alt = readAlt(in);
             alts[i] = alt;
         }
         //System.out.println("exit block");
         return new Block(alts);
     }
 
-    protected List readAlt(DataInputStream in) throws IOException {
-        List alt = new ArrayList();
+    protected List<Node> readAlt(DataInputStream in) throws IOException {
+        List<Node> alt = new ArrayList<Node>();
         byte A = in.readByte();
         if ( A!='A' ) throw new IOException("missing A on start of alt");
         byte cmd = in.readByte();
@@ -181,7 +191,7 @@
 
     protected String readString(DataInputStream in) throws IOException {
         byte c = in.readByte();
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         while ( c!=';' ) {
             buf.append((char)c);
             c = in.readByte();
@@ -189,9 +199,10 @@
         return buf.toString();
     }
 
+	@Override
     public String toString() {
-        StringBuffer buf = new StringBuffer();
-        buf.append(type+" grammar "+name);
+        StringBuilder buf = new StringBuilder();
+        buf.append(type).append(" grammar ").append(name);
         buf.append(rules);
         return buf.toString();
     }
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/Token.java b/runtime/Java/src/main/java/org/antlr/runtime/Token.java
index b8eb95e..1073276 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/Token.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/Token.java
@@ -38,8 +38,6 @@
 	public static final int MIN_TOKEN_TYPE = UP+1;
 
     public static final int EOF = CharStream.EOF;
-    // TODO: remove once we go ANTLR v3.3
-    public static final Token EOF_TOKEN = new CommonToken(EOF);
 
 	public static final int INVALID_TOKEN_TYPE = 0;
 	public static final Token INVALID_TOKEN = new CommonToken(INVALID_TOKEN_TYPE);
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/TokenRewriteStream.java b/runtime/Java/src/main/java/org/antlr/runtime/TokenRewriteStream.java
index 8437441..f444210 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/TokenRewriteStream.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/TokenRewriteStream.java
@@ -87,7 +87,7 @@
 
 	// Define the rewrite operation hierarchy
 
-	class RewriteOperation {
+	public class RewriteOperation {
         /** What index into rewrites List are we? */
         protected int instructionIndex;
         /** Token buffer index. */
@@ -108,6 +108,7 @@
 		public int execute(StringBuffer buf) {
 			return index;
 		}
+		@Override
 		public String toString() {
 			String opName = getClass().getName();
 			int $index = opName.indexOf('$');
@@ -121,6 +122,7 @@
 		public InsertBeforeOp(int index, Object text) {
 			super(index,text);
 		}
+		@Override
 		public int execute(StringBuffer buf) {
 			buf.append(text);
 			if ( tokens.get(index).getType()!=Token.EOF ) {
@@ -139,12 +141,14 @@
 			super(from,text);
 			lastIndex = to;
 		}
+		@Override
 		public int execute(StringBuffer buf) {
 			if ( text!=null ) {
 				buf.append(text);
 			}
 			return lastIndex+1;
 		}
+		@Override
 		public String toString() {
 			if ( text==null ) {
 				return "<DeleteOp@"+tokens.get(index)+
@@ -157,21 +161,21 @@
 
 	/** You may have multiple, named streams of rewrite operations.
 	 *  I'm calling these things "programs."
-	 *  Maps String (name) -> rewrite (List)
+	 *  Maps String (name) &rarr; rewrite (List)
 	 */
-	protected Map programs = null;
+	protected Map<String, List<RewriteOperation>> programs = null;
 
-	/** Map String (program name) -> Integer index */
-	protected Map lastRewriteTokenIndexes = null;
+	/** Map String (program name) &rarr; Integer index */
+	protected Map<String, Integer> lastRewriteTokenIndexes = null;
 
 	public TokenRewriteStream() {
 		init();
 	}
 
 	protected void init() {
-		programs = new HashMap();
-		programs.put(DEFAULT_PROGRAM_NAME, new ArrayList(PROGRAM_INIT_SIZE));
-		lastRewriteTokenIndexes = new HashMap();
+		programs = new HashMap<String, List<RewriteOperation>>();
+		programs.put(DEFAULT_PROGRAM_NAME, new ArrayList<RewriteOperation>(PROGRAM_INIT_SIZE));
+		lastRewriteTokenIndexes = new HashMap<String, Integer>();
 	}
 
 	public TokenRewriteStream(TokenSource tokenSource) {
@@ -193,7 +197,7 @@
 	 *  longer in the stream.  UNTESTED!
 	 */
 	public void rollback(String programName, int instructionIndex) {
-		List is = (List)programs.get(programName);
+		List<RewriteOperation> is = programs.get(programName);
 		if ( is!=null ) {
 			programs.put(programName, is.subList(MIN_TOKEN_INDEX,instructionIndex));
 		}
@@ -239,7 +243,7 @@
 
 	public void insertBefore(String programName, int index, Object text) {
 		RewriteOperation op = new InsertBeforeOp(index,text);
-		List rewrites = getProgram(programName);
+		List<? super RewriteOperation> rewrites = getProgram(programName);
         op.instructionIndex = rewrites.size();
         rewrites.add(op);		
 	}
@@ -265,7 +269,7 @@
 			throw new IllegalArgumentException("replace: range invalid: "+from+".."+to+"(size="+tokens.size()+")");
 		}
 		RewriteOperation op = new ReplaceOp(from, to, text);
-		List rewrites = getProgram(programName);
+		List<? super RewriteOperation> rewrites = getProgram(programName);
         op.instructionIndex = rewrites.size();
         rewrites.add(op);
 	}
@@ -306,27 +310,27 @@
 	}
 
 	protected int getLastRewriteTokenIndex(String programName) {
-		Integer I = (Integer)lastRewriteTokenIndexes.get(programName);
+		Integer I = lastRewriteTokenIndexes.get(programName);
 		if ( I==null ) {
 			return -1;
 		}
-		return I.intValue();
+		return I;
 	}
 
 	protected void setLastRewriteTokenIndex(String programName, int i) {
-		lastRewriteTokenIndexes.put(programName, new Integer(i));
+		lastRewriteTokenIndexes.put(programName, i);
 	}
 
-	protected List getProgram(String name) {
-		List is = (List)programs.get(name);
+	protected List<RewriteOperation> getProgram(String name) {
+		List<RewriteOperation> is = programs.get(name);
 		if ( is==null ) {
 			is = initializeProgram(name);
 		}
 		return is;
 	}
 
-	private List initializeProgram(String name) {
-		List is = new ArrayList(PROGRAM_INIT_SIZE);
+	private List<RewriteOperation> initializeProgram(String name) {
+		List<RewriteOperation> is = new ArrayList<RewriteOperation>(PROGRAM_INIT_SIZE);
 		programs.put(name, is);
 		return is;
 	}
@@ -337,13 +341,14 @@
 	}
 
 	public String toOriginalString(int start, int end) {
-		StringBuffer buf = new StringBuffer();
+		StringBuilder buf = new StringBuilder();
 		for (int i=start; i>=MIN_TOKEN_INDEX && i<=end && i<tokens.size(); i++) {
 			if ( get(i).getType()!=Token.EOF ) buf.append(get(i).getText());
 		}
 		return buf.toString();
 	}
 
+	@Override
 	public String toString() {
         fill();
 		return toString(MIN_TOKEN_INDEX, size()-1);
@@ -354,31 +359,32 @@
 		return toString(programName, MIN_TOKEN_INDEX, size()-1);
 	}
 
+	@Override
 	public String toString(int start, int end) {
 		return toString(DEFAULT_PROGRAM_NAME, start, end);
 	}
 
 	public String toString(String programName, int start, int end) {
-		List rewrites = (List)programs.get(programName);
+		List<RewriteOperation> rewrites = programs.get(programName);
 
         // ensure start/end are in range
         if ( end>tokens.size()-1 ) end = tokens.size()-1;
         if ( start<0 ) start = 0;
 
-        if ( rewrites==null || rewrites.size()==0 ) {
+        if ( rewrites==null || rewrites.isEmpty() ) {
 			return toOriginalString(start,end); // no instructions to execute
 		}
 		StringBuffer buf = new StringBuffer();
 
 		// First, optimize instruction stream
-		Map indexToOp = reduceToSingleOperationPerIndex(rewrites);
+		Map<Integer, ? extends RewriteOperation> indexToOp = reduceToSingleOperationPerIndex(rewrites);
 
         // Walk buffer, executing instructions and emitting tokens
         int i = start;
         while ( i <= end && i < tokens.size() ) {
-			RewriteOperation op = (RewriteOperation)indexToOp.get(new Integer(i));
-			indexToOp.remove(new Integer(i)); // remove so any left have index size-1
-			Token t = (Token) tokens.get(i);
+			RewriteOperation op = indexToOp.get(i);
+			indexToOp.remove(i); // remove so any left have index size-1
+			Token t = tokens.get(i);
 			if ( op==null ) {
 				// no operation at that index, just dump token
 				if ( t.getType()!=Token.EOF ) buf.append(t.getText());
@@ -395,9 +401,7 @@
         if ( end==tokens.size()-1 ) {
             // Scan any remaining operations after last token
             // should be included (they will be inserts).
-            Iterator it = indexToOp.values().iterator();
-            while (it.hasNext()) {
-                RewriteOperation op = (RewriteOperation)it.next();
+            for (RewriteOperation op : indexToOp.values()) {
                 if ( op.index >= tokens.size()-1 ) buf.append(op.text);
             }
         }
@@ -444,7 +448,7 @@
 	 * 		3. throw exception if index in same range as previous replace
 	 *
 	 *  Don't actually delete; make op null in list. Easier to walk list.
-	 *  Later we can throw as we add to index -> op map.
+	 *  Later we can throw as we add to index &rarr; op map.
 	 *
 	 *  Note that I.2 R.2-2 will wipe out I.2 even though, technically, the
 	 *  inserted stuff would be before the replace range.  But, if you
@@ -453,19 +457,19 @@
 	 *
 	 *  Return a map from token index to operation.
 	 */
-	protected Map reduceToSingleOperationPerIndex(List rewrites) {
+	protected Map<Integer, ? extends RewriteOperation> reduceToSingleOperationPerIndex(List<? extends RewriteOperation> rewrites) {
 //		System.out.println("rewrites="+rewrites);
 
 		// WALK REPLACES
 		for (int i = 0; i < rewrites.size(); i++) {
-			RewriteOperation op = (RewriteOperation)rewrites.get(i);
+			RewriteOperation op = rewrites.get(i);
 			if ( op==null ) continue;
 			if ( !(op instanceof ReplaceOp) ) continue;
 			ReplaceOp rop = (ReplaceOp)rewrites.get(i);
 			// Wipe prior inserts within range
-			List inserts = getKindOfOps(rewrites, InsertBeforeOp.class, i);
+			List<? extends InsertBeforeOp> inserts = getKindOfOps(rewrites, InsertBeforeOp.class, i);
 			for (int j = 0; j < inserts.size(); j++) {
-				InsertBeforeOp iop = (InsertBeforeOp) inserts.get(j);
+				InsertBeforeOp iop = inserts.get(j);
 				if ( iop.index == rop.index ) {
 					// E.g., insert before 2, delete 2..2; update replace
 					// text to include insert before, kill insert
@@ -478,9 +482,9 @@
 				}
 			}
 			// Drop any prior replaces contained within
-			List prevReplaces = getKindOfOps(rewrites, ReplaceOp.class, i);
+			List<? extends ReplaceOp> prevReplaces = getKindOfOps(rewrites, ReplaceOp.class, i);
 			for (int j = 0; j < prevReplaces.size(); j++) {
-				ReplaceOp prevRop = (ReplaceOp) prevReplaces.get(j);
+				ReplaceOp prevRop = prevReplaces.get(j);
 				if ( prevRop.index>=rop.index && prevRop.lastIndex <= rop.lastIndex ) {
                     // delete replace as it's a no-op.
                     rewrites.set(prevRop.instructionIndex, null);
@@ -509,14 +513,14 @@
 
 		// WALK INSERTS
 		for (int i = 0; i < rewrites.size(); i++) {
-			RewriteOperation op = (RewriteOperation)rewrites.get(i);
+			RewriteOperation op = rewrites.get(i);
 			if ( op==null ) continue;
 			if ( !(op instanceof InsertBeforeOp) ) continue;
 			InsertBeforeOp iop = (InsertBeforeOp)rewrites.get(i);
 			// combine current insert with prior if any at same index
-			List prevInserts = getKindOfOps(rewrites, InsertBeforeOp.class, i);
+			List<? extends InsertBeforeOp> prevInserts = getKindOfOps(rewrites, InsertBeforeOp.class, i);
 			for (int j = 0; j < prevInserts.size(); j++) {
-				InsertBeforeOp prevIop = (InsertBeforeOp) prevInserts.get(j);
+				InsertBeforeOp prevIop = prevInserts.get(j);
 				if ( prevIop.index == iop.index ) { // combine objects
 					// convert to strings...we're in process of toString'ing
 					// whole token buffer so no lazy eval issue with any templates
@@ -526,9 +530,9 @@
 				}
 			}
 			// look for replaces where iop.index is in range; error
-			List prevReplaces = getKindOfOps(rewrites, ReplaceOp.class, i);
+			List<? extends ReplaceOp> prevReplaces = getKindOfOps(rewrites, ReplaceOp.class, i);
 			for (int j = 0; j < prevReplaces.size(); j++) {
-				ReplaceOp rop = (ReplaceOp) prevReplaces.get(j);
+				ReplaceOp rop = prevReplaces.get(j);
 				if ( iop.index == rop.index ) {
 					rop.text = catOpText(iop.text,rop.text);
 					rewrites.set(i, null);  // delete current insert
@@ -541,14 +545,14 @@
 			}
 		}
 		// System.out.println("rewrites after="+rewrites);
-		Map m = new HashMap();
+		Map<Integer, RewriteOperation> m = new HashMap<Integer, RewriteOperation>();
 		for (int i = 0; i < rewrites.size(); i++) {
-			RewriteOperation op = (RewriteOperation)rewrites.get(i);
+			RewriteOperation op = rewrites.get(i);
 			if ( op==null ) continue; // ignore deleted ops
-			if ( m.get(new Integer(op.index))!=null ) {
+			if ( m.get(op.index)!=null ) {
 				throw new Error("should only be one op per index");
 			}
-			m.put(new Integer(op.index), op);
+			m.put(op.index, op);
 		}
 		//System.out.println("index to op: "+m);
 		return m;
@@ -561,17 +565,17 @@
 		if ( b!=null ) y = b.toString();
 		return x+y;
 	}
-	protected List getKindOfOps(List rewrites, Class kind) {
+	protected <T extends RewriteOperation> List<? extends T> getKindOfOps(List<? extends RewriteOperation> rewrites, Class<T> kind) {
 		return getKindOfOps(rewrites, kind, rewrites.size());
 	}
 
     /** Get all operations before an index of a particular kind */
-    protected List getKindOfOps(List rewrites, Class kind, int before) {
-		List ops = new ArrayList();
+    protected <T extends RewriteOperation> List<? extends T> getKindOfOps(List<? extends RewriteOperation> rewrites, Class<T> kind, int before) {
+		List<T> ops = new ArrayList<T>();
 		for (int i=0; i<before && i<rewrites.size(); i++) {
-			RewriteOperation op = (RewriteOperation)rewrites.get(i);
+			RewriteOperation op = rewrites.get(i);
 			if ( op==null ) continue; // ignore deleted
-			if ( op.getClass() == kind ) ops.add(op);
+			if ( kind.isInstance(op) ) ops.add(kind.cast(op));
 		}		
 		return ops;
 	}
@@ -581,7 +585,7 @@
 	}
 
 	public String toDebugString(int start, int end) {
-		StringBuffer buf = new StringBuffer();
+		StringBuilder buf = new StringBuilder();
 		for (int i=start; i>=MIN_TOKEN_INDEX && i<=end && i<tokens.size(); i++) {
 			buf.append(get(i));
 		}
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/TokenStream.java b/runtime/Java/src/main/java/org/antlr/runtime/TokenStream.java
index 1b43c14..94b25d4 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/TokenStream.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/TokenStream.java
@@ -27,13 +27,11 @@
  */
 package org.antlr.runtime;
 
-import java.util.List;
-
 /** A stream of tokens accessing tokens from a TokenSource */
 public interface TokenStream extends IntStream {
     /** Get Token at current input pointer + i ahead where i=1 is next Token.
-	 *  i<0 indicates tokens in the past.  So -1 is previous token and -2 is
-	 *  two tokens ago. LT(0) is undefined.  For i>=n, return Token.EOFToken.
+	 *  i&lt;0 indicates tokens in the past.  So -1 is previous token and -2 is
+	 *  two tokens ago. LT(0) is undefined.  For i&gt;=n, return Token.EOFToken.
 	 *  Return null for LT(0) and any index that results in an absolute address
 	 *  that is negative.
 	 */
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/UnbufferedTokenStream.java b/runtime/Java/src/main/java/org/antlr/runtime/UnbufferedTokenStream.java
index 0b0e979..d9ae3d5 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/UnbufferedTokenStream.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/UnbufferedTokenStream.java
@@ -29,9 +29,6 @@
 
 import org.antlr.runtime.misc.LookaheadStream;
 
-import java.util.List;
-import java.util.NoSuchElementException;
-
 /** A token stream that pulls tokens from the code source on-demand and
  *  without tracking a complete buffer of the tokens. This stream buffers
  *  the minimum number of tokens possible.  It's the same as
@@ -58,25 +55,33 @@
 		this.tokenSource = tokenSource;
 	}
 
+	@Override
 	public Token nextElement() {
 		Token t = tokenSource.nextToken();
         t.setTokenIndex(tokenIndex++);
 		return t;
 	}
 
+	@Override
     public boolean isEOF(Token o) { return o.getType() == Token.EOF; }    
 
+	@Override
 	public TokenSource getTokenSource() { return tokenSource; }
 
+	@Override
 	public String toString(int start, int stop) { return "n/a"; }
 
+	@Override
 	public String toString(Token start, Token stop) { return "n/a"; }
 
+	@Override
     public int LA(int i) { return LT(i).getType(); }
 
+	@Override
     public Token get(int i) {
         throw new UnsupportedOperationException("Absolute token indexes are meaningless in an unbuffered stream");
     }
 
+	@Override
 	public String getSourceName() {	return tokenSource.getSourceName();	}
 }
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/UnwantedTokenException.java b/runtime/Java/src/main/java/org/antlr/runtime/UnwantedTokenException.java
index feb7445..62ccabc 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/UnwantedTokenException.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/UnwantedTokenException.java
@@ -40,6 +40,7 @@
 		return token;
 	}
 
+	@Override
 	public String toString() {
 		String exp = ", expected "+expecting;
 		if ( expecting==Token.INVALID_TOKEN_TYPE ) {
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/debug/BlankDebugEventListener.java b/runtime/Java/src/main/java/org/antlr/runtime/debug/BlankDebugEventListener.java
index d70aa26..053f1d0 100755
--- a/runtime/Java/src/main/java/org/antlr/runtime/debug/BlankDebugEventListener.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/debug/BlankDebugEventListener.java
@@ -35,43 +35,43 @@
  *  sensitive to updates to debug interface.
  */
 public class BlankDebugEventListener implements DebugEventListener {
-	public void enterRule(String grammarFileName, String ruleName) {}
-	public void exitRule(String grammarFileName, String ruleName) {}
-	public void enterAlt(int alt) {}
-	public void enterSubRule(int decisionNumber) {}
-	public void exitSubRule(int decisionNumber) {}
-	public void enterDecision(int decisionNumber, boolean couldBacktrack) {}
-	public void exitDecision(int decisionNumber) {}
-	public void location(int line, int pos) {}
-	public void consumeToken(Token token) {}
-	public void consumeHiddenToken(Token token) {}
-	public void LT(int i, Token t) {}
-	public void mark(int i) {}
-	public void rewind(int i) {}
-	public void rewind() {}
-	public void beginBacktrack(int level) {}
-	public void endBacktrack(int level, boolean successful) {}
-	public void recognitionException(RecognitionException e) {}
-	public void beginResync() {}
-	public void endResync() {}
-	public void semanticPredicate(boolean result, String predicate) {}
-	public void commence() {}
-	public void terminate() {}
+	@Override public void enterRule(String grammarFileName, String ruleName) {}
+	@Override public void exitRule(String grammarFileName, String ruleName) {}
+	@Override public void enterAlt(int alt) {}
+	@Override public void enterSubRule(int decisionNumber) {}
+	@Override public void exitSubRule(int decisionNumber) {}
+	@Override public void enterDecision(int decisionNumber, boolean couldBacktrack) {}
+	@Override public void exitDecision(int decisionNumber) {}
+	@Override public void location(int line, int pos) {}
+	@Override public void consumeToken(Token token) {}
+	@Override public void consumeHiddenToken(Token token) {}
+	@Override public void LT(int i, Token t) {}
+	@Override public void mark(int i) {}
+	@Override public void rewind(int i) {}
+	@Override public void rewind() {}
+	@Override public void beginBacktrack(int level) {}
+	@Override public void endBacktrack(int level, boolean successful) {}
+	@Override public void recognitionException(RecognitionException e) {}
+	@Override public void beginResync() {}
+	@Override public void endResync() {}
+	@Override public void semanticPredicate(boolean result, String predicate) {}
+	@Override public void commence() {}
+	@Override public void terminate() {}
 
 	// Tree parsing stuff
 
-	public void consumeNode(Object t) {}
-	public void LT(int i, Object t) {}
+	@Override public void consumeNode(Object t) {}
+	@Override public void LT(int i, Object t) {}
 
 	// AST Stuff
 
-	public void nilNode(Object t) {}
-	public void errorNode(Object t) {}
-	public void createNode(Object t) {}
-	public void createNode(Object node, Token token) {}
-	public void becomeRoot(Object newRoot, Object oldRoot) {}
-	public void addChild(Object root, Object child) {}
-	public void setTokenBoundaries(Object t, int tokenStartIndex, int tokenStopIndex) {}
+	@Override public void nilNode(Object t) {}
+	@Override public void errorNode(Object t) {}
+	@Override public void createNode(Object t) {}
+	@Override public void createNode(Object node, Token token) {}
+	@Override public void becomeRoot(Object newRoot, Object oldRoot) {}
+	@Override public void addChild(Object root, Object child) {}
+	@Override public void setTokenBoundaries(Object t, int tokenStartIndex, int tokenStopIndex) {}
 }
 
 
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/debug/DebugEventHub.java b/runtime/Java/src/main/java/org/antlr/runtime/debug/DebugEventHub.java
index 7bfe6a8..593e092 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/debug/DebugEventHub.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/debug/DebugEventHub.java
@@ -37,10 +37,10 @@
  *  use the event mechanism to build parse trees etc...  Not thread-safe.
  *  Don't add events in one thread while parser fires events in another.
  * 
- *  @see also DebugEventRepeater
+ *  @see DebugEventRepeater
  */
 public class DebugEventHub implements DebugEventListener {
-	protected List listeners = new ArrayList();
+	protected List<DebugEventListener> listeners = new ArrayList<DebugEventListener>();
 
 	public DebugEventHub(DebugEventListener listener) {
 		listeners.add(listener);
@@ -67,156 +67,178 @@
 		I am dup'ing the for-loop in each.  Where are Java closures!? blech!
 	 */
 
+	@Override
 	public void enterRule(String grammarFileName, String ruleName) {
 		for (int i = 0; i < listeners.size(); i++) {
-			DebugEventListener listener = (DebugEventListener)listeners.get(i);
+			DebugEventListener listener = listeners.get(i);
 			listener.enterRule(grammarFileName,ruleName);
 		}
 	}
 
+	@Override
 	public void exitRule(String grammarFileName, String ruleName) {
 		for (int i = 0; i < listeners.size(); i++) {
-			DebugEventListener listener = (DebugEventListener)listeners.get(i);
+			DebugEventListener listener = listeners.get(i);
 			listener.exitRule(grammarFileName, ruleName);
 		}
 	}
 
+	@Override
 	public void enterAlt(int alt) {
 		for (int i = 0; i < listeners.size(); i++) {
-			DebugEventListener listener = (DebugEventListener)listeners.get(i);
+			DebugEventListener listener = listeners.get(i);
 			listener.enterAlt(alt);
 		}
 	}
 
+	@Override
 	public void enterSubRule(int decisionNumber) {
 		for (int i = 0; i < listeners.size(); i++) {
-			DebugEventListener listener = (DebugEventListener)listeners.get(i);
+			DebugEventListener listener = listeners.get(i);
 			listener.enterSubRule(decisionNumber);
 		}
 	}
 
+	@Override
 	public void exitSubRule(int decisionNumber) {
 		for (int i = 0; i < listeners.size(); i++) {
-			DebugEventListener listener = (DebugEventListener)listeners.get(i);
+			DebugEventListener listener = listeners.get(i);
 			listener.exitSubRule(decisionNumber);
 		}
 	}
 
+	@Override
 	public void enterDecision(int decisionNumber, boolean couldBacktrack) {
 		for (int i = 0; i < listeners.size(); i++) {
-			DebugEventListener listener = (DebugEventListener)listeners.get(i);
+			DebugEventListener listener = listeners.get(i);
 			listener.enterDecision(decisionNumber, couldBacktrack);
 		}
 	}
 
+	@Override
 	public void exitDecision(int decisionNumber) {
 		for (int i = 0; i < listeners.size(); i++) {
-			DebugEventListener listener = (DebugEventListener)listeners.get(i);
+			DebugEventListener listener = listeners.get(i);
 			listener.exitDecision(decisionNumber);
 		}
 	}
 
+	@Override
 	public void location(int line, int pos) {
 		for (int i = 0; i < listeners.size(); i++) {
-			DebugEventListener listener = (DebugEventListener)listeners.get(i);
+			DebugEventListener listener = listeners.get(i);
 			listener.location(line, pos);
 		}
 	}
 
+	@Override
 	public void consumeToken(Token token) {
 		for (int i = 0; i < listeners.size(); i++) {
-			DebugEventListener listener = (DebugEventListener)listeners.get(i);
+			DebugEventListener listener = listeners.get(i);
 			listener.consumeToken(token);
 		}
 	}
 
+	@Override
 	public void consumeHiddenToken(Token token) {
 		for (int i = 0; i < listeners.size(); i++) {
-			DebugEventListener listener = (DebugEventListener)listeners.get(i);
+			DebugEventListener listener = listeners.get(i);
 			listener.consumeHiddenToken(token);
 		}
 	}
 
+	@Override
 	public void LT(int index, Token t) {
 		for (int i = 0; i < listeners.size(); i++) {
-			DebugEventListener listener = (DebugEventListener)listeners.get(i);
+			DebugEventListener listener = listeners.get(i);
 			listener.LT(index, t);
 		}
 	}
 
+	@Override
 	public void mark(int index) {
 		for (int i = 0; i < listeners.size(); i++) {
-			DebugEventListener listener = (DebugEventListener)listeners.get(i);
+			DebugEventListener listener = listeners.get(i);
 			listener.mark(index);
 		}
 	}
 
+	@Override
 	public void rewind(int index) {
 		for (int i = 0; i < listeners.size(); i++) {
-			DebugEventListener listener = (DebugEventListener)listeners.get(i);
+			DebugEventListener listener = listeners.get(i);
 			listener.rewind(index);
 		}
 	}
 
+	@Override
 	public void rewind() {
 		for (int i = 0; i < listeners.size(); i++) {
-			DebugEventListener listener = (DebugEventListener)listeners.get(i);
+			DebugEventListener listener = listeners.get(i);
 			listener.rewind();
 		}
 	}
 
+	@Override
 	public void beginBacktrack(int level) {
 		for (int i = 0; i < listeners.size(); i++) {
-			DebugEventListener listener = (DebugEventListener)listeners.get(i);
+			DebugEventListener listener = listeners.get(i);
 			listener.beginBacktrack(level);
 		}
 	}
 
+	@Override
 	public void endBacktrack(int level, boolean successful) {
 		for (int i = 0; i < listeners.size(); i++) {
-			DebugEventListener listener = (DebugEventListener)listeners.get(i);
+			DebugEventListener listener = listeners.get(i);
 			listener.endBacktrack(level, successful);
 		}
 	}
 
+	@Override
 	public void recognitionException(RecognitionException e) {
 		for (int i = 0; i < listeners.size(); i++) {
-			DebugEventListener listener = (DebugEventListener)listeners.get(i);
+			DebugEventListener listener = listeners.get(i);
 			listener.recognitionException(e);
 		}
 	}
 
+	@Override
 	public void beginResync() {
 		for (int i = 0; i < listeners.size(); i++) {
-			DebugEventListener listener = (DebugEventListener)listeners.get(i);
+			DebugEventListener listener = listeners.get(i);
 			listener.beginResync();
 		}
 	}
 
+	@Override
 	public void endResync() {
 		for (int i = 0; i < listeners.size(); i++) {
-			DebugEventListener listener = (DebugEventListener)listeners.get(i);
+			DebugEventListener listener = listeners.get(i);
 			listener.endResync();
 		}
 	}
 
+	@Override
 	public void semanticPredicate(boolean result, String predicate) {
 		for (int i = 0; i < listeners.size(); i++) {
-			DebugEventListener listener = (DebugEventListener)listeners.get(i);
+			DebugEventListener listener = listeners.get(i);
 			listener.semanticPredicate(result, predicate);
 		}
 	}
 
+	@Override
 	public void commence() {
 		for (int i = 0; i < listeners.size(); i++) {
-			DebugEventListener listener = (DebugEventListener)listeners.get(i);
+			DebugEventListener listener = listeners.get(i);
 			listener.commence();
 		}
 	}
 
+	@Override
 	public void terminate() {
 		for (int i = 0; i < listeners.size(); i++) {
-			DebugEventListener listener = (DebugEventListener)listeners.get(i);
+			DebugEventListener listener = listeners.get(i);
 			listener.terminate();
 		}
 	}
@@ -224,16 +246,18 @@
 
 	// Tree parsing stuff
 
+	@Override
 	public void consumeNode(Object t) {
 		for (int i = 0; i < listeners.size(); i++) {
-			DebugEventListener listener = (DebugEventListener)listeners.get(i);
+			DebugEventListener listener = listeners.get(i);
 			listener.consumeNode(t);
 		}
 	}
 
+	@Override
 	public void LT(int index, Object t) {
 		for (int i = 0; i < listeners.size(); i++) {
-			DebugEventListener listener = (DebugEventListener)listeners.get(i);
+			DebugEventListener listener = listeners.get(i);
 			listener.LT(index, t);
 		}
 	}
@@ -241,51 +265,58 @@
 
 	// AST Stuff
 
+	@Override
 	public void nilNode(Object t) {
 		for (int i = 0; i < listeners.size(); i++) {
-			DebugEventListener listener = (DebugEventListener)listeners.get(i);
+			DebugEventListener listener = listeners.get(i);
 			listener.nilNode(t);
 		}
 	}
 
+	@Override
 	public void errorNode(Object t) {
 		for (int i = 0; i < listeners.size(); i++) {
-			DebugEventListener listener = (DebugEventListener)listeners.get(i);
+			DebugEventListener listener = listeners.get(i);
 			listener.errorNode(t);
 		}
 	}
 
+	@Override
 	public void createNode(Object t) {
 		for (int i = 0; i < listeners.size(); i++) {
-			DebugEventListener listener = (DebugEventListener)listeners.get(i);
+			DebugEventListener listener = listeners.get(i);
 			listener.createNode(t);
 		}
 	}
 
+	@Override
 	public void createNode(Object node, Token token) {
 		for (int i = 0; i < listeners.size(); i++) {
-			DebugEventListener listener = (DebugEventListener)listeners.get(i);
+			DebugEventListener listener = listeners.get(i);
 			listener.createNode(node, token);
 		}
 	}
 
+	@Override
 	public void becomeRoot(Object newRoot, Object oldRoot) {
 		for (int i = 0; i < listeners.size(); i++) {
-			DebugEventListener listener = (DebugEventListener)listeners.get(i);
+			DebugEventListener listener = listeners.get(i);
 			listener.becomeRoot(newRoot, oldRoot);
 		}
 	}
 
+	@Override
 	public void addChild(Object root, Object child) {
 		for (int i = 0; i < listeners.size(); i++) {
-			DebugEventListener listener = (DebugEventListener)listeners.get(i);
+			DebugEventListener listener = listeners.get(i);
 			listener.addChild(root, child);
 		}
 	}
 
+	@Override
 	public void setTokenBoundaries(Object t, int tokenStartIndex, int tokenStopIndex) {
 		for (int i = 0; i < listeners.size(); i++) {
-			DebugEventListener listener = (DebugEventListener)listeners.get(i);
+			DebugEventListener listener = listeners.get(i);
 			listener.setTokenBoundaries(t, tokenStartIndex, tokenStopIndex);
 		}
 	}
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/debug/DebugEventListener.java b/runtime/Java/src/main/java/org/antlr/runtime/debug/DebugEventListener.java
index 163b5cd..4b4a1c5 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/debug/DebugEventListener.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/debug/DebugEventListener.java
@@ -176,7 +176,7 @@
 	 *		enterAlt1
 	 *		location 7 5
 	 *		LT(1)
-	 *		consumeToken [c/<4>,1:0]
+	 *		consumeToken [c/&lt;4&gt;,1:0]
 	 *		location 7 7
 	 *		enterSubRule 2
 	 *		enter decision 2
@@ -187,7 +187,7 @@
 	 *		exitSubRule 2
 	 *		beginResync
 	 *		LT(1)
-	 *		consumeToken [c/<4>,1:1]
+	 *		consumeToken [c/&lt;4&gt;,1:1]
 	 *		LT(1)
 	 *		endResync
 	 *		LT(-1)
@@ -301,7 +301,7 @@
 	 *  If you are receiving this event over a socket via
 	 *  RemoteDebugEventSocketListener then only IDs are set.
 	 *
-	 *  @see org.antlr.runtime.tree.TreeAdaptor.becomeRoot()
+	 *  @see org.antlr.runtime.tree.TreeAdaptor#becomeRoot
 	 */
 	public void becomeRoot(Object newRoot, Object oldRoot);
 
@@ -310,7 +310,7 @@
 	 *  If you are receiving this event over a socket via
 	 *  RemoteDebugEventSocketListener then only IDs are set.
 	 * 
-	 *  @see org.antlr.runtime.tree.TreeAdaptor.addChild()
+	 *  @see org.antlr.runtime.tree.TreeAdaptor#addChild
 	 */
 	public void addChild(Object root, Object child);
 
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/debug/DebugEventRepeater.java b/runtime/Java/src/main/java/org/antlr/runtime/debug/DebugEventRepeater.java
index 8fb6b66..92af59b 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/debug/DebugEventRepeater.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/debug/DebugEventRepeater.java
@@ -46,43 +46,43 @@
 		this.listener = listener;
 	}
 	
-	public void enterRule(String grammarFileName, String ruleName) { listener.enterRule(grammarFileName, ruleName); }
-	public void exitRule(String grammarFileName, String ruleName) { listener.exitRule(grammarFileName, ruleName); }
-	public void enterAlt(int alt) { listener.enterAlt(alt); }
-	public void enterSubRule(int decisionNumber) { listener.enterSubRule(decisionNumber); }
-	public void exitSubRule(int decisionNumber) { listener.exitSubRule(decisionNumber); }
-	public void enterDecision(int decisionNumber, boolean couldBacktrack) { listener.enterDecision(decisionNumber, couldBacktrack); }
-	public void exitDecision(int decisionNumber) { listener.exitDecision(decisionNumber); }
-	public void location(int line, int pos) { listener.location(line, pos); }
-	public void consumeToken(Token token) { listener.consumeToken(token); }
-	public void consumeHiddenToken(Token token) { listener.consumeHiddenToken(token); }
-	public void LT(int i, Token t) { listener.LT(i, t); }
-	public void mark(int i) { listener.mark(i); }
-	public void rewind(int i) { listener.rewind(i); }
-	public void rewind() { listener.rewind(); }
-	public void beginBacktrack(int level) { listener.beginBacktrack(level); }
-	public void endBacktrack(int level, boolean successful) { listener.endBacktrack(level, successful); }
-	public void recognitionException(RecognitionException e) { listener.recognitionException(e); }
-	public void beginResync() { listener.beginResync(); }
-	public void endResync() { listener.endResync(); }
-	public void semanticPredicate(boolean result, String predicate) { listener.semanticPredicate(result, predicate); }
-	public void commence() { listener.commence(); }
-	public void terminate() { listener.terminate(); }
+	@Override public void enterRule(String grammarFileName, String ruleName) { listener.enterRule(grammarFileName, ruleName); }
+	@Override public void exitRule(String grammarFileName, String ruleName) { listener.exitRule(grammarFileName, ruleName); }
+	@Override public void enterAlt(int alt) { listener.enterAlt(alt); }
+	@Override public void enterSubRule(int decisionNumber) { listener.enterSubRule(decisionNumber); }
+	@Override public void exitSubRule(int decisionNumber) { listener.exitSubRule(decisionNumber); }
+	@Override public void enterDecision(int decisionNumber, boolean couldBacktrack) { listener.enterDecision(decisionNumber, couldBacktrack); }
+	@Override public void exitDecision(int decisionNumber) { listener.exitDecision(decisionNumber); }
+	@Override public void location(int line, int pos) { listener.location(line, pos); }
+	@Override public void consumeToken(Token token) { listener.consumeToken(token); }
+	@Override public void consumeHiddenToken(Token token) { listener.consumeHiddenToken(token); }
+	@Override public void LT(int i, Token t) { listener.LT(i, t); }
+	@Override public void mark(int i) { listener.mark(i); }
+	@Override public void rewind(int i) { listener.rewind(i); }
+	@Override public void rewind() { listener.rewind(); }
+	@Override public void beginBacktrack(int level) { listener.beginBacktrack(level); }
+	@Override public void endBacktrack(int level, boolean successful) { listener.endBacktrack(level, successful); }
+	@Override public void recognitionException(RecognitionException e) { listener.recognitionException(e); }
+	@Override public void beginResync() { listener.beginResync(); }
+	@Override public void endResync() { listener.endResync(); }
+	@Override public void semanticPredicate(boolean result, String predicate) { listener.semanticPredicate(result, predicate); }
+	@Override public void commence() { listener.commence(); }
+	@Override public void terminate() { listener.terminate(); }
 
 	// Tree parsing stuff
 
-	public void consumeNode(Object t) { listener.consumeNode(t); }
-	public void LT(int i, Object t) { listener.LT(i, t); }
+	@Override public void consumeNode(Object t) { listener.consumeNode(t); }
+	@Override public void LT(int i, Object t) { listener.LT(i, t); }
 
 	// AST Stuff
 
-	public void nilNode(Object t) { listener.nilNode(t); }
-	public void errorNode(Object t) { listener.errorNode(t); }
-	public void createNode(Object t) { listener.createNode(t); }
-	public void createNode(Object node, Token token) { listener.createNode(node, token); }
-	public void becomeRoot(Object newRoot, Object oldRoot) { listener.becomeRoot(newRoot, oldRoot); }
-	public void addChild(Object root, Object child) { listener.addChild(root, child); }
-	public void setTokenBoundaries(Object t, int tokenStartIndex, int tokenStopIndex) {
+	@Override public void nilNode(Object t) { listener.nilNode(t); }
+	@Override public void errorNode(Object t) { listener.errorNode(t); }
+	@Override public void createNode(Object t) { listener.createNode(t); }
+	@Override public void createNode(Object node, Token token) { listener.createNode(node, token); }
+	@Override public void becomeRoot(Object newRoot, Object oldRoot) { listener.becomeRoot(newRoot, oldRoot); }
+	@Override public void addChild(Object root, Object child) { listener.addChild(root, child); }
+	@Override public void setTokenBoundaries(Object t, int tokenStartIndex, int tokenStopIndex) {
 		listener.setTokenBoundaries(t, tokenStartIndex, tokenStopIndex);
 	}
 }
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/debug/DebugEventSocketProxy.java b/runtime/Java/src/main/java/org/antlr/runtime/debug/DebugEventSocketProxy.java
index 3b480ad..8590368 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/debug/DebugEventSocketProxy.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/debug/DebugEventSocketProxy.java
@@ -88,10 +88,12 @@
 		}
 	}
 
+	@Override
 	public void commence() {
 		// don't bother sending event; listener will trigger upon connection
 	}
 
+	@Override
 	public void terminate() {
 		transmit("terminate");
 		out.close();
@@ -118,75 +120,92 @@
 		ack();
 	}
 
+	@Override
 	public void enterRule(String grammarFileName, String ruleName) {
 		transmit("enterRule\t"+grammarFileName+"\t"+ruleName);
 	}
 
+	@Override
 	public void enterAlt(int alt) {
 		transmit("enterAlt\t"+alt);
 	}
 
+	@Override
 	public void exitRule(String grammarFileName, String ruleName) {
 		transmit("exitRule\t"+grammarFileName+"\t"+ruleName);
 	}
 
+	@Override
 	public void enterSubRule(int decisionNumber) {
 		transmit("enterSubRule\t"+decisionNumber);
 	}
 
+	@Override
 	public void exitSubRule(int decisionNumber) {
 		transmit("exitSubRule\t"+decisionNumber);
 	}
 
+	@Override
 	public void enterDecision(int decisionNumber, boolean couldBacktrack) {
 		transmit("enterDecision\t"+decisionNumber+"\t"+couldBacktrack);
 	}
 
+	@Override
 	public void exitDecision(int decisionNumber) {
 		transmit("exitDecision\t"+decisionNumber);
 	}
 
+	@Override
 	public void consumeToken(Token t) {
 		String buf = serializeToken(t);
 		transmit("consumeToken\t"+buf);
 	}
 
+	@Override
 	public void consumeHiddenToken(Token t) {
 		String buf = serializeToken(t);
 		transmit("consumeHiddenToken\t"+buf);
 	}
 
+	@Override
 	public void LT(int i, Token t) {
         if(t != null)
             transmit("LT\t"+i+"\t"+serializeToken(t));
 	}
 
+	@Override
 	public void mark(int i) {
 		transmit("mark\t"+i);
 	}
 
+	@Override
 	public void rewind(int i) {
 		transmit("rewind\t"+i);
 	}
 
+	@Override
 	public void rewind() {
 		transmit("rewind");
 	}
 
+	@Override
 	public void beginBacktrack(int level) {
 		transmit("beginBacktrack\t"+level);
 	}
 
+	@Override
 	public void endBacktrack(int level, boolean successful) {
 		transmit("endBacktrack\t"+level+"\t"+(successful?TRUE:FALSE));
 	}
 
+	@Override
 	public void location(int line, int pos) {
 		transmit("location\t"+line+"\t"+pos);
 	}
 
+	@Override
 	public void recognitionException(RecognitionException e) {
-		StringBuffer buf = new StringBuffer(50);
+		StringBuilder buf = new StringBuilder(50);
 		buf.append("exception\t");
 		buf.append(e.getClass().getName());
 		// dump only the data common to all exceptions for now
@@ -199,14 +218,17 @@
 		transmit(buf.toString());
 	}
 
+	@Override
 	public void beginResync() {
 		transmit("beginResync");
 	}
 
+	@Override
 	public void endResync() {
 		transmit("endResync");
 	}
 
+	@Override
 	public void semanticPredicate(boolean result, String predicate) {
 		StringBuffer buf = new StringBuffer(50);
 		buf.append("semanticPredicate\t");
@@ -217,6 +239,7 @@
 
 	// A S T  P a r s i n g  E v e n t s
 
+	@Override
 	public void consumeNode(Object t) {
 		StringBuffer buf = new StringBuffer(50);
 		buf.append("consumeNode");
@@ -224,6 +247,7 @@
 		transmit(buf.toString());
 	}
 
+	@Override
 	public void LT(int i, Object t) {
 		int ID = adaptor.getUniqueID(t);
 		String text = adaptor.getText(t);
@@ -263,11 +287,13 @@
 
 	// A S T  E v e n t s
 
+	@Override
 	public void nilNode(Object t) {
 		int ID = adaptor.getUniqueID(t);
 		transmit("nilNode\t"+ID);
 	}
 
+	@Override
 	public void errorNode(Object t) {
 		int ID = adaptor.getUniqueID(t);
 		String text = t.toString();
@@ -280,6 +306,7 @@
 		transmit(buf.toString());
 	}
 
+	@Override
 	public void createNode(Object t) {
 		int ID = adaptor.getUniqueID(t);
 		String text = adaptor.getText(t);
@@ -293,24 +320,28 @@
 		transmit(buf.toString());
 	}
 
+	@Override
 	public void createNode(Object node, Token token) {
 		int ID = adaptor.getUniqueID(node);
 		int tokenIndex = token.getTokenIndex();
 		transmit("createNode\t"+ID+"\t"+tokenIndex);
 	}
 
+	@Override
 	public void becomeRoot(Object newRoot, Object oldRoot) {
 		int newRootID = adaptor.getUniqueID(newRoot);
 		int oldRootID = adaptor.getUniqueID(oldRoot);
 		transmit("becomeRoot\t"+newRootID+"\t"+oldRootID);
 	}
 
+	@Override
 	public void addChild(Object root, Object child) {
 		int rootID = adaptor.getUniqueID(root);
 		int childID = adaptor.getUniqueID(child);
 		transmit("addChild\t"+rootID+"\t"+childID);
 	}
 
+	@Override
 	public void setTokenBoundaries(Object t, int tokenStartIndex, int tokenStopIndex) {
 		int ID = adaptor.getUniqueID(t);
 		transmit("setTokenBoundaries\t"+ID+"\t"+tokenStartIndex+"\t"+tokenStopIndex);
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/debug/DebugParser.java b/runtime/Java/src/main/java/org/antlr/runtime/debug/DebugParser.java
index 49d78e7..042609f 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/debug/DebugParser.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/debug/DebugParser.java
@@ -75,10 +75,12 @@
 		e.printStackTrace(System.err);
 	}
 
+	@Override
 	public void beginResync() {
 		dbg.beginResync();
 	}
 
+	@Override
 	public void endResync() {
 		dbg.endResync();
 	}
@@ -91,6 +93,7 @@
 		dbg.endBacktrack(level,successful);		
 	}
 
+	@Override
 	public void reportError(RecognitionException e) {
 		super.reportError(e);
 		dbg.recognitionException(e);
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/debug/DebugTokenStream.java b/runtime/Java/src/main/java/org/antlr/runtime/debug/DebugTokenStream.java
index 9a7a75f..8fec032 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/debug/DebugTokenStream.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/debug/DebugTokenStream.java
@@ -29,8 +29,6 @@
 
 import org.antlr.runtime.*;
 
-import java.util.List;
-
 public class DebugTokenStream implements TokenStream {
 	protected DebugEventListener dbg;
 	public TokenStream input;
@@ -51,6 +49,7 @@
 		this.dbg = dbg;
 	}
 
+	@Override
 	public void consume() {
 		if ( initialStreamState ) {
 			consumeInitialHiddenTokens();
@@ -77,6 +76,7 @@
 		initialStreamState = false;
 	}
 
+	@Override
 	public Token LT(int i) {
 		if ( initialStreamState ) {
 			consumeInitialHiddenTokens();
@@ -85,6 +85,7 @@
 		return input.LT(i);
 	}
 
+	@Override
 	public int LA(int i) {
 		if ( initialStreamState ) {
 			consumeInitialHiddenTokens();
@@ -93,63 +94,77 @@
 		return input.LA(i);
 	}
 
+	@Override
 	public Token get(int i) {
 		return input.get(i);
 	}
 
+	@Override
 	public int mark() {
 		lastMarker = input.mark();
 		dbg.mark(lastMarker);
 		return lastMarker;
 	}
 
+	@Override
 	public int index() {
 		return input.index();
 	}
 
+	@Override
 	public int range() {
 		return input.range();
 	}
 
+	@Override
 	public void rewind(int marker) {
 		dbg.rewind(marker);
 		input.rewind(marker);
 	}
 
+	@Override
 	public void rewind() {
 		dbg.rewind();
 		input.rewind(lastMarker);
 	}
 
+	@Override
 	public void release(int marker) {
 	}
 
+	@Override
 	public void seek(int index) {
 		// TODO: implement seek in dbg interface
 		// db.seek(index);
 		input.seek(index);
 	}
 
+	@Override
 	public int size() {
 		return input.size();
 	}
 
+	@Override
 	public TokenSource getTokenSource() {
 		return input.getTokenSource();
 	}
 
+	@Override
 	public String getSourceName() {
 		return getTokenSource().getSourceName();
 	}
 
+	@Override
 	public String toString() {
 		return input.toString();
 	}
 
+	@Override
 	public String toString(int start, int stop) {
 		return input.toString(start,stop);
 	}
 
+	@Override
 	public String toString(Token start, Token stop) {
 		return input.toString(start,stop);
 	}
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/debug/DebugTreeAdaptor.java b/runtime/Java/src/main/java/org/antlr/runtime/debug/DebugTreeAdaptor.java
index 1884bd6..bc1be66 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/debug/DebugTreeAdaptor.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/debug/DebugTreeAdaptor.java
@@ -38,10 +38,10 @@
  *  in generated rules.  Debugging events are triggered *after* invoking
  *  tree adaptor routines.
  *
- *  Trees created with actions in rewrite actions like "-> ^(ADD {foo} {bar})"
+ *  Trees created with actions in rewrite actions like "-&gt; ^(ADD {foo} {bar})"
  *  cannot be tracked as they might not use the adaptor to create foo, bar.
  *  The debug listener has to deal with tree node IDs for which it did
- *  not see a createNode event.  A single <unknown> node is sufficient even
+ *  not see a createNode event.  A single &lt;unknown&gt; node is sufficient even
  *  if it represents a whole tree.
  */
 public class DebugTreeAdaptor implements TreeAdaptor {
@@ -53,6 +53,7 @@
 		this.adaptor = adaptor;
 	}
 
+	@Override
 	public Object create(Token payload) {
 		if ( payload.getTokenIndex() < 0 ) {
 			// could be token conjured up during error recovery
@@ -63,6 +64,7 @@
 		return node;
 	}
 
+	@Override
 	public Object errorNode(TokenStream input, Token start, Token stop,
 							RecognitionException e)
 	{
@@ -73,6 +75,7 @@
 		return node;
 	}
 
+	@Override
 	public Object dupTree(Object tree) {
 		Object t = adaptor.dupTree(tree);
 		// walk the tree and emit create and add child events
@@ -93,22 +96,26 @@
 		}
 	}
 
+	@Override
 	public Object dupNode(Object treeNode) {
 		Object d = adaptor.dupNode(treeNode);
 		dbg.createNode(d);
 		return d;
 	}
 
+	@Override
 	public Object nil() {
 		Object node = adaptor.nil();
 		dbg.nilNode(node);
 		return node;
 	}
 
+	@Override
 	public boolean isNil(Object tree) {
 		return adaptor.isNil(tree);
 	}
 
+	@Override
 	public void addChild(Object t, Object child) {
 		if ( t==null || child==null ) {
 			return;
@@ -117,12 +124,14 @@
 		dbg.addChild(t, child);
 	}
 
+	@Override
 	public Object becomeRoot(Object newRoot, Object oldRoot) {
 		Object n = adaptor.becomeRoot(newRoot, oldRoot);
 		dbg.becomeRoot(newRoot, oldRoot);
 		return n;
 	}
 
+	@Override
 	public Object rulePostProcessing(Object root) {
 		return adaptor.rulePostProcessing(root);
 	}
@@ -132,6 +141,7 @@
 		this.addChild(t, n);
 	}
 
+	@Override
 	public Object becomeRoot(Token newRoot, Object oldRoot) {
 		Object n = this.create(newRoot);
 		adaptor.becomeRoot(n, oldRoot);
@@ -139,44 +149,53 @@
 		return n;
 	}
 
+	@Override
 	public Object create(int tokenType, Token fromToken) {
 		Object node = adaptor.create(tokenType, fromToken);
 		dbg.createNode(node);
 		return node;
 	}
 
+	@Override
 	public Object create(int tokenType, Token fromToken, String text) {
 		Object node = adaptor.create(tokenType, fromToken, text);
 		dbg.createNode(node);
 		return node;
 	}
 
+	@Override
 	public Object create(int tokenType, String text) {
 		Object node = adaptor.create(tokenType, text);
 		dbg.createNode(node);
 		return node;
 	}
 
+	@Override
 	public int getType(Object t) {
 		return adaptor.getType(t);
 	}
 
+	@Override
 	public void setType(Object t, int type) {
 		adaptor.setType(t, type);
 	}
 
+	@Override
 	public String getText(Object t) {
 		return adaptor.getText(t);
 	}
 
+	@Override
 	public void setText(Object t, String text) {
 		adaptor.setText(t, text);
 	}
 
+	@Override
 	public Token getToken(Object t) {
 		return adaptor.getToken(t);
 	}
 
+	@Override
 	public void setTokenBoundaries(Object t, Token startToken, Token stopToken) {
 		adaptor.setTokenBoundaries(t, startToken, stopToken);
 		if ( t!=null && startToken!=null && stopToken!=null ) {
@@ -186,50 +205,62 @@
 		}
 	}
 
+	@Override
 	public int getTokenStartIndex(Object t) {
 		return adaptor.getTokenStartIndex(t);
 	}
 
+	@Override
 	public int getTokenStopIndex(Object t) {
 		return adaptor.getTokenStopIndex(t);
 	}
 
+	@Override
 	public Object getChild(Object t, int i) {
 		return adaptor.getChild(t, i);
 	}
 
+	@Override
 	public void setChild(Object t, int i, Object child) {
 		adaptor.setChild(t, i, child);
 	}
 
+	@Override
 	public Object deleteChild(Object t, int i) {
 		return adaptor.deleteChild(t, i);
 	}
 
+	@Override
 	public int getChildCount(Object t) {
 		return adaptor.getChildCount(t);
 	}
 
+	@Override
 	public int getUniqueID(Object node) {
 		return adaptor.getUniqueID(node);
 	}
 
+	@Override
 	public Object getParent(Object t) {
 		return adaptor.getParent(t);
 	}
 
+	@Override
 	public int getChildIndex(Object t) {
 		return adaptor.getChildIndex(t);
 	}
 
+	@Override
 	public void setParent(Object t, Object parent) {
 		adaptor.setParent(t, parent);
 	}
 
+	@Override
 	public void setChildIndex(Object t, int index) {
 		adaptor.setChildIndex(t, index);
 	}
 
+	@Override
 	public void replaceChildren(Object parent, int startChildIndex, int stopChildIndex, Object t) {
 		adaptor.replaceChildren(parent, startChildIndex, stopChildIndex, t);
 	}
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/debug/DebugTreeNodeStream.java b/runtime/Java/src/main/java/org/antlr/runtime/debug/DebugTreeNodeStream.java
index 92ff009..6b5f976 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/debug/DebugTreeNodeStream.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/debug/DebugTreeNodeStream.java
@@ -57,20 +57,24 @@
 		this.dbg = dbg;
 	}
 
+	@Override
 	public TreeAdaptor getTreeAdaptor() {
 		return adaptor;
 	}
 
+	@Override
 	public void consume() {
 		Object node = input.LT(1);
 		input.consume();
 		dbg.consumeNode(node);
 	}
 
+	@Override
 	public Object get(int i) {
 		return input.get(i);
 	}
 
+	@Override
 	public Object LT(int i) {
 		Object node = input.LT(i);
 		int ID = adaptor.getUniqueID(node);
@@ -80,6 +84,7 @@
 		return node;
 	}
 
+	@Override
 	public int LA(int i) {
 		Object node = input.LT(i);
 		int ID = adaptor.getUniqueID(node);
@@ -89,49 +94,60 @@
 		return type;
 	}
 
+	@Override
 	public int mark() {
 		lastMarker = input.mark();
 		dbg.mark(lastMarker);
 		return lastMarker;
 	}
 
+	@Override
 	public int index() {
 		return input.index();
 	}
 
+	@Override
 	public void rewind(int marker) {
 		dbg.rewind(marker);
 		input.rewind(marker);
 	}
 
+	@Override
 	public void rewind() {
 		dbg.rewind();
 		input.rewind(lastMarker);
 	}
 
+	@Override
 	public void release(int marker) {
 	}
 
+	@Override
 	public void seek(int index) {
 		// TODO: implement seek in dbg interface
 		// db.seek(index);
 		input.seek(index);
 	}
 
+	@Override
 	public int size() {
 		return input.size();
 	}
 
+	@Override
     public void reset() { ; }
 
+	@Override
     public Object getTreeSource() {
 		return input;
 	}
 
+	@Override
 	public String getSourceName() {
 		return getTokenStream().getSourceName();
 	}
 
+	@Override
 	public TokenStream getTokenStream() {
 		return input.getTokenStream();
 	}
@@ -141,14 +157,17 @@
 	 *  define it.  It might be better to ignore the parameter but
 	 *  there might be a use for it later, so I'll leave.
 	 */
+	@Override
 	public void setUniqueNavigationNodes(boolean uniqueNavigationNodes) {
 		input.setUniqueNavigationNodes(uniqueNavigationNodes);
 	}
 
+	@Override
 	public void replaceChildren(Object parent, int startChildIndex, int stopChildIndex, Object t) {
 		input.replaceChildren(parent, startChildIndex, stopChildIndex, t);
 	}
 
+	@Override
 	public String toString(Object start, Object stop) {
 		return input.toString(start,stop);
 	}
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/debug/DebugTreeParser.java b/runtime/Java/src/main/java/org/antlr/runtime/debug/DebugTreeParser.java
index 6e1ece8..f4445ac 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/debug/DebugTreeParser.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/debug/DebugTreeParser.java
@@ -77,10 +77,12 @@
 		e.printStackTrace(System.err);
 	}
 
+	@Override
 	public void reportError(RecognitionException e) {
 		dbg.recognitionException(e);
 	}
 
+	@Override
 	protected Object getMissingSymbol(IntStream input,
 									  RecognitionException e,
 									  int expectedTokenType,
@@ -91,10 +93,12 @@
 		return o;
 	}
 
+	@Override
 	public void beginResync() {
 		dbg.beginResync();
 	}
 
+	@Override
 	public void endResync() {
 		dbg.endResync();
 	}
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/debug/ParseTreeBuilder.java b/runtime/Java/src/main/java/org/antlr/runtime/debug/ParseTreeBuilder.java
index 13c6ed0..ac62cad 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/debug/ParseTreeBuilder.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/debug/ParseTreeBuilder.java
@@ -41,8 +41,8 @@
 public class ParseTreeBuilder extends BlankDebugEventListener {
 	public static final String EPSILON_PAYLOAD = "<epsilon>";
 	
-	Stack callStack = new Stack();
-	List hiddenTokens = new ArrayList();
+	Stack<ParseTree> callStack = new Stack<ParseTree>();
+	List<Token> hiddenTokens = new ArrayList<Token>();
 	int backtracking = 0;
 
 	public ParseTreeBuilder(String grammarName) {
@@ -51,7 +51,7 @@
 	}
 
 	public ParseTree getTree() {
-		return (ParseTree)callStack.elementAt(0);
+		return callStack.elementAt(0);
 	}
 
 	/**  What kind of node to create.  You might want to override
@@ -66,43 +66,50 @@
 	}
 
 	/** Backtracking or cyclic DFA, don't want to add nodes to tree */
+	@Override
 	public void enterDecision(int d, boolean couldBacktrack) { backtracking++; }
+	@Override
 	public void exitDecision(int i) { backtracking--; }
 
+	@Override
 	public void enterRule(String filename, String ruleName) {
 		if ( backtracking>0 ) return;
-		ParseTree parentRuleNode = (ParseTree)callStack.peek();
+		ParseTree parentRuleNode = callStack.peek();
 		ParseTree ruleNode = create(ruleName);
 		parentRuleNode.addChild(ruleNode);
 		callStack.push(ruleNode);
 	}
 
+	@Override
 	public void exitRule(String filename, String ruleName) {
 		if ( backtracking>0 ) return;
-		ParseTree ruleNode = (ParseTree)callStack.peek();
+		ParseTree ruleNode = callStack.peek();
 		if ( ruleNode.getChildCount()==0 ) {
 			ruleNode.addChild(epsilonNode());
 		}
 		callStack.pop();		
 	}
 
+	@Override
 	public void consumeToken(Token token) {
 		if ( backtracking>0 ) return;
-		ParseTree ruleNode = (ParseTree)callStack.peek();
+		ParseTree ruleNode = callStack.peek();
 		ParseTree elementNode = create(token);
 		elementNode.hiddenTokens = this.hiddenTokens;
-		this.hiddenTokens = new ArrayList();
+		this.hiddenTokens = new ArrayList<Token>();
 		ruleNode.addChild(elementNode);
 	}
 
+	@Override
 	public void consumeHiddenToken(Token token) {
 		if ( backtracking>0 ) return;
 		hiddenTokens.add(token);
 	}
 
+	@Override
 	public void recognitionException(RecognitionException e) {
 		if ( backtracking>0 ) return;
-		ParseTree ruleNode = (ParseTree)callStack.peek();
+		ParseTree ruleNode = callStack.peek();
 		ParseTree errorNode = create(e);
 		ruleNode.addChild(errorNode);
 	}
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/debug/Profiler.java b/runtime/Java/src/main/java/org/antlr/runtime/debug/Profiler.java
index aea9a17..d76e28f 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/debug/Profiler.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/debug/Profiler.java
@@ -127,10 +127,10 @@
 	//protected int decisionLevel = 0;
 	protected Token lastRealTokenTouchedInDecision;
 	protected Set<String> uniqueRules = new HashSet<String>();
-	protected Stack<String> currentGrammarFileName = new Stack();
-	protected Stack<String> currentRuleName = new Stack();
-	protected Stack<Integer> currentLine = new Stack();
-	protected Stack<Integer> currentPos = new Stack();
+	protected Stack<String> currentGrammarFileName = new Stack<String>();
+	protected Stack<String> currentRuleName = new Stack<String>();
+	protected Stack<Integer> currentLine = new Stack<Integer>();
+	protected Stack<Integer> currentPos = new Stack<Integer>();
 
 	// Vector<DecisionStats>
 	//protected Vector decisions = new Vector(200); // need setSize
@@ -152,6 +152,7 @@
 		this.parser = parser;
 	}
 
+	@Override
 	public void enterRule(String grammarFileName, String ruleName) {
 //		System.out.println("enterRule "+grammarFileName+":"+ruleName);
 		ruleLevel++;
@@ -162,6 +163,7 @@
 		currentRuleName.push( ruleName );
 	}
 
+	@Override
 	public void exitRule(String grammarFileName, String ruleName) {
 		ruleLevel--;
 		currentGrammarFileName.pop();
@@ -210,6 +212,7 @@
 		currentPos.push(pos);
 	}
 
+	@Override
 	public void enterDecision(int decisionNumber, boolean couldBacktrack) {
 		lastRealTokenTouchedInDecision = null;
 		stats.numDecisionEvents++;
@@ -219,16 +222,16 @@
 						   " backtrack depth " + backtrackDepth +
 						   " @ " + input.get(input.index()) +
 						   " rule " +locationDescription());
-		String g = (String) currentGrammarFileName.peek();
+		String g = currentGrammarFileName.peek();
 		DecisionDescriptor descriptor = decisions.get(g, decisionNumber);
 		if ( descriptor == null ) {
 			descriptor = new DecisionDescriptor();
 			decisions.put(g, decisionNumber, descriptor);
 			descriptor.decision = decisionNumber;
-			descriptor.fileName = (String)currentGrammarFileName.peek();
-			descriptor.ruleName = (String)currentRuleName.peek();
-			descriptor.line = (Integer)currentLine.peek();
-			descriptor.pos = (Integer)currentPos.peek();
+			descriptor.fileName = currentGrammarFileName.peek();
+			descriptor.ruleName = currentRuleName.peek();
+			descriptor.line = currentLine.peek();
+			descriptor.pos = currentPos.peek();
 			descriptor.couldBacktrack = couldBacktrack;
 		}
 		descriptor.n++;
@@ -240,6 +243,7 @@
 		d.startIndex = startingLookaheadIndex;
 	}
 
+	@Override
 	public void exitDecision(int decisionNumber) {
 		DecisionEvent d = decisionStack.pop();
 		d.stopTime = System.currentTimeMillis();
@@ -255,6 +259,7 @@
 		decisionEvents.add(d); // done with decision; track all
 	}
 
+	@Override
 	public void consumeToken(Token token) {
 		if (dump) System.out.println("consume token "+token);
 		if ( !inDecision() ) {
@@ -276,13 +281,14 @@
 						   d.decision.ruleName+"-"+d.decision.decision+" start index "+d.startIndex);		
 	}
 
-	/** The parser is in a decision if the decision depth > 0.  This
+	/** The parser is in a decision if the decision depth &gt; 0.  This
 	 *  works for backtracking also, which can have nested decisions.
 	 */
 	public boolean inDecision() {
 		return decisionStack.size()>0;
 	}
 
+	@Override
 	public void consumeHiddenToken(Token token) {
 		//System.out.println("consume hidden token "+token);
 		if ( !inDecision() ) stats.numHiddenTokens++;
@@ -290,6 +296,7 @@
 
 	/** Track refs to lookahead if in a fixed/nonfixed decision.
 	 */
+	@Override
 	public void LT(int i, Token t) {
 		if ( inDecision() && i>0 ) {
 			DecisionEvent d = currentDecision();
@@ -335,6 +342,7 @@
 	 * 		...
 	 * 		exit rule
 	 */
+	@Override
 	public void beginBacktrack(int level) {
 		if (dump) System.out.println("enter backtrack "+level);
 		backtrackDepth++;
@@ -347,6 +355,7 @@
 	}
 
 	/** Successful or not, track how much lookahead synpreds use */
+	@Override
 	public void endBacktrack(int level, boolean successful) {
 		if (dump) System.out.println("exit backtrack "+level+": "+successful);
 		backtrackDepth--;		
@@ -373,10 +382,12 @@
 		return decisionStack.peek();
 	}
 
+	@Override
 	public void recognitionException(RecognitionException e) {
 		stats.numReportedErrors++;
 	}
 
+	@Override
 	public void semanticPredicate(boolean result, String predicate) {
 		stats.numSemanticPredicates++;
 		if ( inDecision() ) {
@@ -388,6 +399,7 @@
 		}
 	}
 
+	@Override
 	public void terminate() {
 		for (DecisionEvent e : decisionEvents) {
 			//System.out.println("decision "+e.decision.decision+": k="+e.k);
@@ -437,7 +449,7 @@
 	// R E P O R T I N G
 
 	public String toNotifyString() {
-		StringBuffer buf = new StringBuffer();
+		StringBuilder buf = new StringBuilder();
 		buf.append(Version);
 		buf.append('\t');
 		buf.append(parser.getClass().getName());
@@ -498,6 +510,7 @@
 		return buf.toString();
 	}
 
+	@Override
 	public String toString() {
 		return toString(getReport());
 	}
@@ -518,16 +531,16 @@
 		return stats;
 	}
 
-	public DoubleKeyMap getDecisionStats() {
+	public DoubleKeyMap<String, Integer, DecisionDescriptor> getDecisionStats() {
 		return decisions;
 	}
 
-	public List getDecisionEvents() {
+	public List<DecisionEvent> getDecisionEvents() {
 		return decisionEvents;
 	}
 
 	public static String toString(ProfileStats stats) {
-		StringBuffer buf = new StringBuffer();
+		StringBuilder buf = new StringBuilder();
 		buf.append("ANTLR Runtime Report; Profile Version ");
 		buf.append(stats.Version);
 		buf.append(newline);
@@ -650,7 +663,7 @@
 	}
 
 	public String getDecisionStatsDump() {
-		StringBuffer buf = new StringBuffer();
+		StringBuilder buf = new StringBuilder();
 		buf.append("location");
 		buf.append(DATA_SEP);
 		buf.append("n");
@@ -698,11 +711,11 @@
 		return X;
 	}
 
-	protected int[] toArray(List a) {
+	protected int[] toArray(List<Integer> a) {
 		int[] x = new int[a.size()];
 		for (int i = 0; i < a.size(); i++) {
-			Integer I = (Integer) a.get(i);
-			x[i] = I.intValue();
+			Integer I = a.get(i);
+			x[i] = I;
 		}
 		return x;
 	}
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/debug/RemoteDebugEventSocketListener.java b/runtime/Java/src/main/java/org/antlr/runtime/debug/RemoteDebugEventSocketListener.java
index 933fdae..a04fd04 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/debug/RemoteDebugEventSocketListener.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/debug/RemoteDebugEventSocketListener.java
@@ -74,47 +74,77 @@
 			this.charPos = charPos;
 			this.text = text;
 		}
+
+		@Override
 		public String getText() {
 			return text;
 		}
+
+		@Override
 		public void setText(String text) {
 			this.text = text;
 		}
+
+		@Override
 		public int getType() {
 			return type;
 		}
+
+		@Override
 		public void setType(int ttype) {
 			this.type = ttype;
 		}
+
+		@Override
 		public int getLine() {
 			return line;
 		}
+
+		@Override
 		public void setLine(int line) {
 			this.line = line;
 		}
+
+		@Override
 		public int getCharPositionInLine() {
 			return charPos;
 		}
+
+		@Override
 		public void setCharPositionInLine(int pos) {
 			this.charPos = pos;
 		}
+
+		@Override
 		public int getChannel() {
 			return channel;
 		}
+
+		@Override
 		public void setChannel(int channel) {
 			this.channel = channel;
 		}
+
+		@Override
 		public int getTokenIndex() {
 			return index;
 		}
+
+		@Override
 		public void setTokenIndex(int index) {
 			this.index = index;
 		}
+
+		@Override
 		public CharStream getInputStream() {
 			return null;
 		}
+
+		@Override
 		public void setInputStream(CharStream input) {
 		}
+
+		@Override
 		public String toString() {
 			String channelStr = "";
 			if ( channel!=Token.DEFAULT_CHANNEL ) {
@@ -143,14 +173,14 @@
 
 		public ProxyTree(int ID) { this.ID = ID; }
 
-		public int getTokenStartIndex() { return tokenIndex; }
-		public void setTokenStartIndex(int index) {	}
-		public int getTokenStopIndex() { return 0; }
-		public void setTokenStopIndex(int index) { }
-		public Tree dupNode() {	return null; }
-		public int getType() { return type; }
-		public String getText() { return text; }
-		public String toString() {
+		@Override public int getTokenStartIndex() { return tokenIndex; }
+		@Override public void setTokenStartIndex(int index) {	}
+		@Override public int getTokenStopIndex() { return 0; }
+		@Override public void setTokenStopIndex(int index) { }
+		@Override public Tree dupNode() {	return null; }
+		@Override public int getType() { return type; }
+		@Override public String getText() { return text; }
+		@Override public String toString() {
 			return "fix this";
 		}
 	}
@@ -325,11 +355,10 @@
 			String indexS = elements[2];
 			String lineS = elements[3];
 			String posS = elements[4];
-			Class excClass = null;
+			Class<? extends RecognitionException> excClass;
 			try {
-				excClass = Class.forName(excName);
-				RecognitionException e =
-					(RecognitionException)excClass.newInstance();
+				excClass = Class.forName(excName).asSubclass(RecognitionException.class);
+				RecognitionException e = excClass.newInstance();
 				e.index = Integer.parseInt(indexS);
 				e.line = Integer.parseInt(lineS);
 				e.charPositionInLine = Integer.parseInt(posS);
@@ -361,7 +390,7 @@
 			Boolean result = Boolean.valueOf(elements[1]);
 			String predicateText = elements[2];
 			predicateText = unEscapeNewlines(predicateText);
-			listener.semanticPredicate(result.booleanValue(),
+			listener.semanticPredicate(result,
 									   predicateText);
 		}
 		else if ( elements[0].equals("consumeNode") ) {
@@ -468,6 +497,7 @@
 		t.start();
 	}
 
+	@Override
 	public void run() {
 		eventHandler();
 	}
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/debug/TraceDebugEventListener.java b/runtime/Java/src/main/java/org/antlr/runtime/debug/TraceDebugEventListener.java
index de9366d..a405d35 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/debug/TraceDebugEventListener.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/debug/TraceDebugEventListener.java
@@ -40,12 +40,16 @@
 
 	public void enterRule(String ruleName) { System.out.println("enterRule "+ruleName); }
 	public void exitRule(String ruleName) { System.out.println("exitRule "+ruleName); }
+	@Override
 	public void enterSubRule(int decisionNumber) { System.out.println("enterSubRule"); }
+	@Override
 	public void exitSubRule(int decisionNumber) { System.out.println("exitSubRule"); }
+	@Override
 	public void location(int line, int pos) {System.out.println("location "+line+":"+pos);}
 
 	// Tree parsing stuff
 
+	@Override
 	public void consumeNode(Object t) {
 		int ID = adaptor.getUniqueID(t);
 		String text = adaptor.getText(t);
@@ -53,6 +57,7 @@
 		System.out.println("consumeNode "+ID+" "+text+" "+type);
 	}
 
+	@Override
 	public void LT(int i, Object t) {
 		int ID = adaptor.getUniqueID(t);
 		String text = adaptor.getText(t);
@@ -62,8 +67,10 @@
 
 
 	// AST stuff
+	@Override
 	public void nilNode(Object t) {System.out.println("nilNode "+adaptor.getUniqueID(t));}
 
+	@Override
 	public void createNode(Object t) {
 		int ID = adaptor.getUniqueID(t);
 		String text = adaptor.getText(t);
@@ -71,6 +78,7 @@
 		System.out.println("create "+ID+": "+text+", "+type);
 	}
 
+	@Override
 	public void createNode(Object node, Token token) {
 		int ID = adaptor.getUniqueID(node);
 		String text = adaptor.getText(node);
@@ -78,16 +86,19 @@
 		System.out.println("create "+ID+": "+tokenIndex);
 	}
 
+	@Override
 	public void becomeRoot(Object newRoot, Object oldRoot) {
 		System.out.println("becomeRoot "+adaptor.getUniqueID(newRoot)+", "+
 						   adaptor.getUniqueID(oldRoot));
 	}
 
+	@Override
 	public void addChild(Object root, Object child) {
 		System.out.println("addChild "+adaptor.getUniqueID(root)+", "+
 						   adaptor.getUniqueID(child));
 	}
 
+	@Override
 	public void setTokenBoundaries(Object t, int tokenStartIndex, int tokenStopIndex) {
 		System.out.println("setTokenBoundaries "+adaptor.getUniqueID(t)+", "+
 						   tokenStartIndex+", "+tokenStopIndex);
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/debug/Tracer.java b/runtime/Java/src/main/java/org/antlr/runtime/debug/Tracer.java
index c2c73da..f9da2a1 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/debug/Tracer.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/debug/Tracer.java
@@ -58,7 +58,7 @@
 		if ( input instanceof TokenStream ) {
 			return ((TokenStream)input).LT(k);
 		}
-		return new Character((char)input.LA(k));
+		return (char) input.LA(k);
 	}
 }
 
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/misc/FastQueue.java b/runtime/Java/src/main/java/org/antlr/runtime/misc/FastQueue.java
index 08843dd..aec154d 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/misc/FastQueue.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/misc/FastQueue.java
@@ -71,9 +71,10 @@
 
     public T head() { return elementAt(0); }
 
-    /** Return element i elements ahead of current element.  i==0 gets
-     *  current element.  This is not an absolute index into the data list
-     *  since p defines the start of the real list.
+    /**
+     * Return element {@code i} elements ahead of current element. {@code i==0}
+     * gets current element. This is not an absolute index into {@link #data}
+     * since {@code p} defines the start of the real list.
      */
     public T elementAt(int i) {
 		int absIndex = p + i;
@@ -88,8 +89,9 @@
     }
 
     /** Return string of current buffer contents; non-destructive */
+	@Override
     public String toString() {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         int n = size();
         for (int i=0; i<n; i++) {
             buf.append(elementAt(i));
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/misc/LookaheadStream.java b/runtime/Java/src/main/java/org/antlr/runtime/misc/LookaheadStream.java
index 6f19c44..02c92e6 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/misc/LookaheadStream.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/misc/LookaheadStream.java
@@ -27,23 +27,23 @@
  */
 package org.antlr.runtime.misc;
 
-import org.antlr.runtime.Token;
-
-import java.util.NoSuchElementException;
-
-/** A lookahead queue that knows how to mark/release locations
- *  in the buffer for backtracking purposes. Any markers force the FastQueue
- *  superclass to keep all tokens until no more markers; then can reset
- *  to avoid growing a huge buffer.
+/**
+ * A lookahead queue that knows how to mark/release locations in the buffer for
+ * backtracking purposes. Any markers force the {@link FastQueue} superclass to
+ * keep all elements until no more markers; then can reset to avoid growing a
+ * huge buffer.
  */
 public abstract class LookaheadStream<T> extends FastQueue<T> {
     public static final int UNINITIALIZED_EOF_ELEMENT_INDEX = Integer.MAX_VALUE;
 
     /** Absolute token index. It's the index of the symbol about to be
-	 *  read via LT(1). Goes from 0 to numtokens.
+	 *  read via {@code LT(1)}. Goes from 0 to numtokens.
      */
     protected int currentElementIndex = 0;
 
+    /**
+     * This is the {@code LT(-1)} element for the first element in {@link #data}.
+     */
     protected T prevElement;
 
     /** Track object returned by nextElement upon end of stream;
@@ -57,28 +57,34 @@
     /** tracks how deep mark() calls are nested */
     protected int markDepth = 0;
 
+	@Override
     public void reset() {
         super.reset();
         currentElementIndex = 0;
         p = 0;
-        prevElement=null;        
+        prevElement = null;
     }
     
     /** Implement nextElement to supply a stream of elements to this
-     *  lookahead buffer.  Return eof upon end of the stream we're pulling from.
+     *  lookahead buffer.  Return EOF upon end of the stream we're pulling from.
+     *
+     * @see #isEOF
      */
     public abstract T nextElement();
 
     public abstract boolean isEOF(T o);
 
-    /** Get and remove first element in queue; override FastQueue.remove();
-     *  it's the same, just checks for backtracking.
+    /**
+     * Get and remove first element in queue; override
+     * {@link FastQueue#remove()}; it's the same, just checks for backtracking.
      */
+	@Override
     public T remove() {
         T o = elementAt(0);
         p++;
         // have we hit end of buffer and not backtracking?
         if ( p == data.size() && markDepth==0 ) {
+            prevElement = o;
             // if so, it's an opportunity to start filling at index 0 again
             clear(); // size goes to 0, but retains memory
         }
@@ -88,13 +94,13 @@
     /** Make sure we have at least one element to remove, even if EOF */
     public void consume() {
         syncAhead(1);
-        prevElement = remove();
+        remove();
         currentElementIndex++;
     }
 
     /** Make sure we have 'need' elements from current position p. Last valid
      *  p index is data.size()-1.  p+need-1 is the data index 'need' elements
-     *  ahead.  If we need 1 element, (p+1-1)==p must be < data.size().
+     *  ahead.  If we need 1 element, (p+1-1)==p must be &lt; data.size().
      */
     protected void syncAhead(int need) {
         int n = (p+need-1) - data.size() + 1; // how many more elements we need?
@@ -110,7 +116,8 @@
         }
     }
 
-    /** Size of entire stream is unknown; we only know buffer size from FastQueue */
+    /** Size of entire stream is unknown; we only know buffer size from FastQueue. */
+	@Override
     public int size() { throw new UnsupportedOperationException("streams are of unknown size"); }
 
     public T LT(int k) {
@@ -137,25 +144,65 @@
 	}
 
 	public void rewind(int marker) {
-        markDepth--;
-        seek(marker); // assume marker is top
-        // release(marker); // waste of call; it does nothing in this class
-    }
+    markDepth--;
+    int delta = p - marker;
+    currentElementIndex -= delta;
+    p = marker;
+  }
 
-	public void rewind() {
-        seek(lastMarker); // rewind but do not release marker
-    }
+  public void rewind() {
+    // rewind but do not release marker
+    int delta = p - lastMarker;
+    currentElementIndex -= delta;
+    p = lastMarker;
+  }
 
-    /** Seek to a 0-indexed position within data buffer.  Can't handle
-     *  case where you seek beyond end of existing buffer.  Normally used
-     *  to seek backwards in the buffer. Does not force loading of nodes.
-     *  Doesn't see to absolute position in input stream since this stream
-     *  is unbuffered. Seeks only into our moving window of elements.
-     */
-    public void seek(int index) { p = index; }
+	/**
+	 * Seek to a 0-indexed absolute token index. Normally used to seek backwards
+	 * in the buffer. Does not force loading of nodes.
+	 * <p>
+	 * To preserve backward compatibility, this method allows seeking past the
+	 * end of the currently buffered data. In this case, the input pointer will
+	 * be moved but the data will only actually be loaded upon the next call to
+	 * {@link #consume} or {@link #LT} for {@code k>0}.</p>
+	 *
+	 * @throws IllegalArgumentException if {@code index} is less than 0
+	 * @throws UnsupportedOperationException if {@code index} lies before the
+	 * beginning of the moving window buffer
+	 * ({@code index < }{@link #currentElementIndex currentElementIndex}<code> - </code>{@link #p p}).
+	 */
+    public void seek(int index) {
+        if (index < 0) {
+            throw new IllegalArgumentException("can't seek before the beginning of the input");
+        }
+
+        int delta = currentElementIndex - index;
+        if (p - delta < 0) {
+            throw new UnsupportedOperationException("can't seek before the beginning of this stream's buffer");
+        }
+
+        p -= delta;
+        currentElementIndex = index;
+    }
 
     protected T LB(int k) {
-        if ( k==1 ) return prevElement;
-        throw new NoSuchElementException("can't look backwards more than one token in this stream");
+        assert k > 0;
+
+        int index = p - k;
+        if (index == -1) {
+            return prevElement;
+        }
+
+        // if k>0 then we know index < data.size(). avoid the double-check for
+        // performance.
+        if (index >= 0 /*&& index < data.size()*/) {
+            return data.get(index);
+        }
+
+        if (index < -1) {
+            throw new UnsupportedOperationException("can't look more than one token before the beginning of this stream's buffer");
+        }
+
+        throw new UnsupportedOperationException("can't look past the end of this stream's buffer using LB(int)");
     }
-}
\ No newline at end of file
+}
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/tree/BaseTree.java b/runtime/Java/src/main/java/org/antlr/runtime/tree/BaseTree.java
index 34dd050..81620a0 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/tree/BaseTree.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/tree/BaseTree.java
@@ -37,7 +37,7 @@
  *  non-null node is called "nil".
  */
 public abstract class BaseTree implements Tree {
-	protected List children;
+	protected List<Object> children;
 
 	public BaseTree() {
 	}
@@ -49,6 +49,7 @@
 	public BaseTree(Tree node) {
 	}
 
+	@Override
 	public Tree getChild(int i) {
 		if ( children==null || i>=children.size() ) {
 			return null;
@@ -59,7 +60,7 @@
 	/** Get the children internal List; note that if you directly mess with
 	 *  the list, do so at your own risk.
 	 */
-	public List getChildren() {
+	public List<? extends Object> getChildren() {
 		return children;
 	}
 
@@ -73,6 +74,7 @@
 		return null;
 	}
 
+	@Override
 	public int getChildCount() {
 		if ( children==null ) {
 			return 0;
@@ -86,6 +88,7 @@
 	 *  and child isNil then this routine moves children to t via
 	 *  t.children = child.children; i.e., without copying the array.
 	 */
+	@Override
 	public void addChild(Tree t) {
 		//System.out.println("add child "+t.toStringTree()+" "+this.toStringTree());
 		//System.out.println("existing children: "+children);
@@ -129,13 +132,14 @@
 	}
 
 	/** Add all elements of kids list as children of this node */
-	public void addChildren(List kids) {
+	public void addChildren(List<? extends Tree> kids) {
 		for (int i = 0; i < kids.size(); i++) {
-			Tree t = (Tree) kids.get(i);
+			Tree t = kids.get(i);
 			addChild(t);
 		}
 	}
 
+	@Override
 	public void setChild(int i, Tree t) {
 		if ( t==null ) {
 			return;
@@ -156,13 +160,21 @@
 	 	but does NOT collapse nil-rooted t's that come in here like addChild.
 	 */
 	public void insertChild(int i, Object t) {
-		if ( children==null ) return;
+		if (i < 0 || i > getChildCount()) {
+			throw new IndexOutOfBoundsException(i+" out or range");
+		}
+
+		if (children == null) {
+			children = createChildrenList();
+		}
+
 		children.add(i, t);
 		// walk others to increment their child indexes
 		// set index, parent of this one too
 		this.freshenParentAndChildIndexes(i);
 	}
 
+	@Override
 	public Object deleteChild(int i) {
 		if ( children==null ) {
 			return null;
@@ -178,6 +190,7 @@
 	 *  For huge child lists, inserting children can force walking rest of
 	 *  children to set their childindex; could be slow.
 	 */
+	@Override
 	public void replaceChildren(int startChildIndex, int stopChildIndex, Object t) {
 		/*
 		System.out.println("replaceChildren "+startChildIndex+", "+stopChildIndex+
@@ -190,13 +203,13 @@
 		int replacingHowMany = stopChildIndex - startChildIndex + 1;
 		int replacingWithHowMany;
 		BaseTree newTree = (BaseTree)t;
-		List newChildren = null;
+		List<Object> newChildren;
 		// normalize to a list of children to add: newChildren
 		if ( newTree.isNil() ) {
 			newChildren = newTree.children;
 		}
 		else {
-			newChildren = new ArrayList(1);
+			newChildren = new ArrayList<Object>(1);
 			newChildren.add(newTree);
 		}
 		replacingWithHowMany = newChildren.size();
@@ -240,15 +253,17 @@
 	}
 
 	/** Override in a subclass to change the impl of children list */
-	protected List createChildrenList() {
-		return new ArrayList();
+	protected List<Object> createChildrenList() {
+		return new ArrayList<Object>();
 	}
 
+	@Override
 	public boolean isNil() {
 		return false;
 	}
 
 	/** Set the parent and child index values for all child of t */
+	@Override
 	public void freshenParentAndChildIndexes() {
 		freshenParentAndChildIndexes(0);
 	}
@@ -256,7 +271,7 @@
 	public void freshenParentAndChildIndexes(int offset) {
 		int n = getChildCount();
 		for (int c = offset; c < n; c++) {
-			Tree child = (Tree)getChild(c);
+			Tree child = getChild(c);
 			child.setChildIndex(c);
 			child.setParent(this);
 		}
@@ -295,24 +310,30 @@
 	}
 
 	/** BaseTree doesn't track child indexes. */
+	@Override
 	public int getChildIndex() {
 		return 0;
 	}
+	@Override
 	public void setChildIndex(int index) {
 	}
 
 	/** BaseTree doesn't track parent pointers. */
+	@Override
 	public Tree getParent() {
 		return null;
 	}
 
+	@Override
     public void setParent(Tree t) {
 	}
 
     /** Walk upwards looking for ancestor with this token type. */
+	@Override
     public boolean hasAncestor(int ttype) { return getAncestor(ttype)!=null; }
 
     /** Walk upwards and get first ancestor with this token type. */
+	@Override
     public Tree getAncestor(int ttype) {
         Tree t = this;
         t = t.getParent();
@@ -326,9 +347,10 @@
     /** Return a list of all ancestors of this node.  The first node of
      *  list is the root and the last is the parent of this node.
      */
-    public List getAncestors() {
+	@Override
+    public List<? extends Tree> getAncestors() {
         if ( getParent()==null ) return null;
-        List ancestors = new ArrayList();
+        List<Tree> ancestors = new ArrayList<Tree>();
         Tree t = this;
         t = t.getParent();
         while ( t!=null ) {
@@ -339,11 +361,12 @@
     }
 
     /** Print out a whole tree not just a node */
+	@Override
     public String toStringTree() {
-		if ( children==null || children.size()==0 ) {
+		if ( children==null || children.isEmpty() ) {
 			return this.toString();
 		}
-		StringBuffer buf = new StringBuffer();
+		StringBuilder buf = new StringBuilder();
 		if ( !isNil() ) {
 			buf.append("(");
 			buf.append(this.toString());
@@ -362,14 +385,17 @@
 		return buf.toString();
 	}
 
+	@Override
     public int getLine() {
 		return 0;
 	}
 
+	@Override
 	public int getCharPositionInLine() {
 		return 0;
 	}
 
 	/** Override to say how a node (not a tree) should look as text */
+	@Override
 	public abstract String toString();
 }
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/tree/BaseTreeAdaptor.java b/runtime/Java/src/main/java/org/antlr/runtime/tree/BaseTreeAdaptor.java
index 33140b1..486682e 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/tree/BaseTreeAdaptor.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/tree/BaseTreeAdaptor.java
@@ -40,9 +40,10 @@
 	 *  track ourselves.  That's ok, it's only for debugging, though it's
 	 *  expensive: we have to create a hashtable with all tree nodes in it.
 	 */
-	protected Map treeToUniqueIDMap;
+	protected Map<Object, Integer> treeToUniqueIDMap;
 	protected int uniqueNodeID = 1;
 
+	@Override
 	public Object nil() {
 		return create(null);
 	}
@@ -58,6 +59,7 @@
      *  You don't have to subclass CommonErrorNode; you will likely need to
      *  subclass your own tree node class to avoid class cast exception.
 	 */
+	@Override
 	public Object errorNode(TokenStream input, Token start, Token stop,
 							RecognitionException e)
 	{
@@ -66,10 +68,12 @@
 		return t;
 	}
 
+	@Override
 	public boolean isNil(Object tree) {
 		return ((Tree)tree).isNil();
 	}
 
+	@Override
 	public Object dupTree(Object tree) {
 		return dupTree(tree, null);
 	}
@@ -102,6 +106,7 @@
 	 *  make sure that this is consistent with have the user will build
 	 *  ASTs.
 	 */
+	@Override
 	public void addChild(Object t, Object child) {
 		if ( t!=null && child!=null ) {
 			((Tree)t).addChild((Tree)child);
@@ -134,6 +139,7 @@
 	 *  constructing these nodes so we should have this control for
 	 *  efficiency.
 	 */
+	@Override
 	public Object becomeRoot(Object newRoot, Object oldRoot) {
         //System.out.println("becomeroot new "+newRoot.toString()+" old "+oldRoot);
         Tree newRootTree = (Tree)newRoot;
@@ -144,7 +150,7 @@
 		// handle ^(nil real-node)
 		if ( newRootTree.isNil() ) {
             int nc = newRootTree.getChildCount();
-            if ( nc==1 ) newRootTree = (Tree)newRootTree.getChild(0);
+            if ( nc==1 ) newRootTree = newRootTree.getChild(0);
             else if ( nc >1 ) {
 				// TODO: make tree run time exceptions hierarchy
 				throw new RuntimeException("more than one node as root (TODO: make exception hierarchy)");
@@ -158,6 +164,7 @@
 	}
 
 	/** Transform ^(nil x) to x and nil to null */
+	@Override
 	public Object rulePostProcessing(Object root) {
 		//System.out.println("rulePostProcessing: "+((Tree)root).toStringTree());
 		Tree r = (Tree)root;
@@ -166,7 +173,7 @@
 				r = null;
 			}
 			else if ( r.getChildCount()==1 ) {
-				r = (Tree)r.getChild(0);
+				r = r.getChild(0);
 				// whoever invokes rule will set parent and child index
 				r.setParent(null);
 				r.setChildIndex(-1);
@@ -175,10 +182,12 @@
 		return r;
 	}
 
+	@Override
 	public Object becomeRoot(Token newRoot, Object oldRoot) {
 		return becomeRoot(create(newRoot), oldRoot);
 	}
 
+	@Override
 	public Object create(int tokenType, Token fromToken) {
 		fromToken = createToken(fromToken);
 		//((ClassicToken)fromToken).setType(tokenType);
@@ -187,6 +196,7 @@
 		return t;
 	}
 
+	@Override
 	public Object create(int tokenType, Token fromToken, String text) {
         if (fromToken == null) return create(tokenType, text);
 		fromToken = createToken(fromToken);
@@ -196,54 +206,64 @@
 		return t;
 	}
 
+	@Override
 	public Object create(int tokenType, String text) {
 		Token fromToken = createToken(tokenType, text);
 		Tree t = (Tree)create(fromToken);
 		return t;
 	}
 
+	@Override
 	public int getType(Object t) {
 		return ((Tree)t).getType();
 	}
 
+	@Override
 	public void setType(Object t, int type) {
 		throw new NoSuchMethodError("don't know enough about Tree node");
 	}
 
+	@Override
 	public String getText(Object t) {
 		return ((Tree)t).getText();
 	}
 
+	@Override
 	public void setText(Object t, String text) {
 		throw new NoSuchMethodError("don't know enough about Tree node");
 	}
 
+	@Override
 	public Object getChild(Object t, int i) {
 		return ((Tree)t).getChild(i);
 	}
 
+	@Override
 	public void setChild(Object t, int i, Object child) {
 		((Tree)t).setChild(i, (Tree)child);
 	}
 
+	@Override
 	public Object deleteChild(Object t, int i) {
 		return ((Tree)t).deleteChild(i);
 	}
 
+	@Override
 	public int getChildCount(Object t) {
 		return ((Tree)t).getChildCount();
 	}
 
+	@Override
 	public int getUniqueID(Object node) {
 		if ( treeToUniqueIDMap==null ) {
-			 treeToUniqueIDMap = new HashMap();
+			 treeToUniqueIDMap = new HashMap<Object, Integer>();
 		}
-		Integer prevID = (Integer)treeToUniqueIDMap.get(node);
+		Integer prevID = treeToUniqueIDMap.get(node);
 		if ( prevID!=null ) {
-			return prevID.intValue();
+			return prevID;
 		}
 		int ID = uniqueNodeID;
-		treeToUniqueIDMap.put(node, new Integer(ID));
+		treeToUniqueIDMap.put(node, ID);
 		uniqueNodeID++;
 		return ID;
 		// GC makes these nonunique:
@@ -269,7 +289,7 @@
 	 *  an actual real input token.  Typically this is for converting '{'
 	 *  tokens to BLOCK etc...  You'll see
 	 *
-	 *    r : lc='{' ID+ '}' -> ^(BLOCK[$lc] ID+) ;
+	 *    r : lc='{' ID+ '}' -&gt; ^(BLOCK[$lc] ID+) ;
 	 *
 	 *  If you care what the token payload objects' type is, you should
 	 *  override this method and any other createToken variant.
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/tree/BufferedTreeNodeStream.java b/runtime/Java/src/main/java/org/antlr/runtime/tree/BufferedTreeNodeStream.java
index d9a2a7e..879f2fe 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/tree/BufferedTreeNodeStream.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/tree/BufferedTreeNodeStream.java
@@ -58,12 +58,14 @@
 	public static final int DEFAULT_INITIAL_BUFFER_SIZE = 100;
 	public static final int INITIAL_CALL_STACK_SIZE = 10;
 
-    protected class StreamIterator implements Iterator {
+    protected class StreamIterator implements Iterator<Object> {
 		int i = 0;
+		@Override
 		public boolean hasNext() {
 			return i<nodes.size();
 		}
 
+		@Override
 		public Object next() {
 			int current = i;
 			i++;
@@ -73,6 +75,7 @@
 			return eof;
 		}
 
+		@Override
 		public void remove() {
 			throw new RuntimeException("cannot remove nodes from stream");
 		}
@@ -94,7 +97,7 @@
 	 *  of interest for reverseIndexing.  Slows us down a wee bit to
 	 *  do all of the if p==-1 testing everywhere though.
 	 */
-	protected List nodes;
+	protected List<Object> nodes;
 
 	/** Pull nodes from which tree? */
 	protected Object root;
@@ -130,7 +133,7 @@
 	public BufferedTreeNodeStream(TreeAdaptor adaptor, Object tree, int initialBufferSize) {
 		this.root = tree;
 		this.adaptor = adaptor;
-		nodes = new ArrayList(initialBufferSize);
+		nodes = new ArrayList<Object>(initialBufferSize);
 		down = adaptor.create(Token.DOWN, "DOWN");
 		up = adaptor.create(Token.UP, "UP");
 		eof = adaptor.create(Token.EOF, "EOF");
@@ -174,7 +177,7 @@
 			fillBuffer();
 		}
 		for (int i = 0; i < nodes.size(); i++) {
-			Object t = (Object) nodes.get(i);
+			Object t = nodes.get(i);
 			if ( t==node ) {
 				return i;
 			}
@@ -187,7 +190,7 @@
 	 *  so instantiate new ones when uniqueNavigationNodes is true.
 	 */
 	protected void addNavigationNode(final int ttype) {
-		Object navNode = null;
+		Object navNode;
 		if ( ttype==Token.DOWN ) {
 			if ( hasUniqueNavigationNodes() ) {
 				navNode = adaptor.create(Token.DOWN, "DOWN");
@@ -207,6 +210,7 @@
 		nodes.add(navNode);
 	}
 
+	@Override
 	public Object get(int i) {
 		if ( p==-1 ) {
 			fillBuffer();
@@ -214,6 +218,7 @@
 		return nodes.get(i);
 	}
 
+	@Override
 	public Object LT(int k) {
 		if ( p==-1 ) {
 			fillBuffer();
@@ -263,14 +268,17 @@
 		return nodes.get(p-k);
 	}
 
+	@Override
 	public Object getTreeSource() {
 		return root;
 	}
 
+	@Override
 	public String getSourceName() {
 		return getTokenStream().getSourceName();
 	}
 
+	@Override
 	public TokenStream getTokenStream() {
 		return tokens;
 	}
@@ -279,6 +287,7 @@
 		this.tokens = tokens;
 	}
 
+	@Override
 	public TreeAdaptor getTreeAdaptor() {
 		return adaptor;
 	}
@@ -291,10 +300,12 @@
 		return uniqueNavigationNodes;
 	}
 
+	@Override
 	public void setUniqueNavigationNodes(boolean uniqueNavigationNodes) {
 		this.uniqueNavigationNodes = uniqueNavigationNodes;
 	}
 
+	@Override
 	public void consume() {
 		if ( p==-1 ) {
 			fillBuffer();
@@ -302,10 +313,12 @@
 		p++;
 	}
 
+	@Override
 	public int LA(int i) {
 		return adaptor.getType(LT(i));
 	}
 
+	@Override
 	public int mark() {
 		if ( p==-1 ) {
 			fillBuffer();
@@ -314,22 +327,27 @@
 		return lastMarker;
 	}
 
+	@Override
 	public void release(int marker) {
 		// no resources to release
 	}
 
+	@Override
 	public int index() {
 		return p;
 	}
 
+	@Override
 	public void rewind(int marker) {
 		seek(marker);
 	}
 
+	@Override
 	public void rewind() {
 		seek(lastMarker);
 	}
 
+	@Override
 	public void seek(int index) {
 		if ( p==-1 ) {
 			fillBuffer();
@@ -357,6 +375,7 @@
 		return ret;
 	}
 
+	@Override
 	public void reset() {
 		p = 0;
 		lastMarker = 0;
@@ -365,6 +384,7 @@
         }
     }
 
+	@Override
 	public int size() {
 		if ( p==-1 ) {
 			fillBuffer();
@@ -372,7 +392,7 @@
 		return nodes.size();
 	}
 
-	public Iterator iterator() {
+	public Iterator<Object> iterator() {
 		if ( p==-1 ) {
 			fillBuffer();
 		}
@@ -381,6 +401,7 @@
 
 	// TREE REWRITE INTERFACE
 
+	@Override
 	public void replaceChildren(Object parent, int startChildIndex, int stopChildIndex, Object t) {
 		if ( parent!=null ) {
 			adaptor.replaceChildren(parent, startChildIndex, stopChildIndex, t);
@@ -392,9 +413,9 @@
 		if ( p==-1 ) {
 			fillBuffer();
 		}
-		StringBuffer buf = new StringBuffer();
+		StringBuilder buf = new StringBuilder();
 		for (int i = 0; i < nodes.size(); i++) {
-			Object t = (Object) nodes.get(i);
+			Object t = nodes.get(i);
 			buf.append(" ");
 			buf.append(adaptor.getType(t));
 		}
@@ -406,15 +427,16 @@
 		if ( p==-1 ) {
 			fillBuffer();
 		}
-		StringBuffer buf = new StringBuffer();
+		StringBuilder buf = new StringBuilder();
 		for (int i = start; i < nodes.size() && i <= stop; i++) {
-			Object t = (Object) nodes.get(i);
+			Object t = nodes.get(i);
 			buf.append(" ");
 			buf.append(adaptor.getToken(t));
 		}
 		return buf.toString();
 	}
 
+	@Override
 	public String toString(Object start, Object stop) {
 		System.out.println("toString");
 		if ( start==null || stop==null ) {
@@ -447,7 +469,7 @@
 			return tokens.toString(beginTokenIndex, endTokenIndex);
 		}
 		// walk nodes looking for start
-		Object t = null;
+		Object t;
 		int i = 0;
 		for (; i < nodes.size(); i++) {
 			t = nodes.get(i);
@@ -456,7 +478,7 @@
 			}
 		}
 		// now walk until we see stop, filling string buffer with text
-		 StringBuffer buf = new StringBuffer();
+		StringBuilder buf = new StringBuilder();
 		t = nodes.get(i);
 		while ( t!=stop ) {
 			String text = adaptor.getText(t);
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/tree/CommonErrorNode.java b/runtime/Java/src/main/java/org/antlr/runtime/tree/CommonErrorNode.java
index 26b9933..b3fb375 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/tree/CommonErrorNode.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/tree/CommonErrorNode.java
@@ -56,20 +56,23 @@
 		this.trappedException = e;
 	}
 
+	@Override
 	public boolean isNil() {
 		return false;
 	}
 
+	@Override
 	public int getType() {
 		return Token.INVALID_TOKEN_TYPE;
 	}
 
+	@Override
 	public String getText() {
-		String badText = null;
+		String badText;
 		if ( start instanceof Token ) {
-			int i = ((Token)start).getTokenIndex();
-			int j = ((Token)stop).getTokenIndex();
-			if ( ((Token)stop).getType() == Token.EOF ) {
+			int i = start.getTokenIndex();
+			int j = stop.getTokenIndex();
+			if ( stop.getType() == Token.EOF ) {
 				j = ((TokenStream)input).size();
 			}
 			badText = ((TokenStream)input).toString(i, j);
@@ -85,6 +88,7 @@
 		return badText;
 	}
 
+	@Override
 	public String toString() {
 		if ( trappedException instanceof MissingTokenException ) {
 			return "<missing type: "+
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/tree/CommonTree.java b/runtime/Java/src/main/java/org/antlr/runtime/tree/CommonTree.java
index 91c59de..82353c8 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/tree/CommonTree.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/tree/CommonTree.java
@@ -67,14 +67,17 @@
 		return token;
 	}
 
+	@Override
 	public Tree dupNode() {
 		return new CommonTree(this);
 	}
 
+	@Override
 	public boolean isNil() {
 		return token==null;
 	}
 
+	@Override
 	public int getType() {
 		if ( token==null ) {
 			return Token.INVALID_TOKEN_TYPE;
@@ -82,6 +85,7 @@
 		return token.getType();
 	}
 
+	@Override
 	public String getText() {
 		if ( token==null ) {
 			return null;
@@ -89,6 +93,7 @@
 		return token.getText();
 	}
 
+	@Override
 	public int getLine() {
 		if ( token==null || token.getLine()==0 ) {
 			if ( getChildCount()>0 ) {
@@ -99,6 +104,7 @@
 		return token.getLine();
 	}
 
+	@Override
 	public int getCharPositionInLine() {
 		if ( token==null || token.getCharPositionInLine()==-1 ) {
 			if ( getChildCount()>0 ) {
@@ -109,6 +115,7 @@
 		return token.getCharPositionInLine();
 	}
 
+	@Override
 	public int getTokenStartIndex() {
 		if ( startIndex==-1 && token!=null ) {
 			return token.getTokenIndex();
@@ -116,10 +123,12 @@
 		return startIndex;
 	}
 
+	@Override
 	public void setTokenStartIndex(int index) {
 		startIndex = index;
 	}
 
+	@Override
 	public int getTokenStopIndex() {
 		if ( stopIndex==-1 && token!=null ) {
 			return token.getTokenIndex();
@@ -127,13 +136,14 @@
 		return stopIndex;
 	}
 
+	@Override
 	public void setTokenStopIndex(int index) {
 		stopIndex = index;
 	}
 
     /** For every node in this subtree, make sure it's start/stop token's
      *  are set.  Walk depth first, visit bottom up.  Only updates nodes
-     *  with at least one token index < 0.
+     *  with at least one token index &lt; 0.
      */
     public void setUnknownTokenBoundaries() {
         if ( children==null ) {
@@ -154,22 +164,27 @@
         }
     }
 
+	@Override
 	public int getChildIndex() {
 		return childIndex;
 	}
 
+	@Override
 	public Tree getParent() {
 		return parent;
 	}
 
+	@Override
 	public void setParent(Tree t) {
 		this.parent = (CommonTree)t;
 	}
 
+	@Override
 	public void setChildIndex(int index) {
 		this.childIndex = index;
 	}
 
+	@Override
 	public String toString() {
 		if ( isNil() ) {
 			return "nil";
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/tree/CommonTreeAdaptor.java b/runtime/Java/src/main/java/org/antlr/runtime/tree/CommonTreeAdaptor.java
index ebf560b..c4f1661 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/tree/CommonTreeAdaptor.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/tree/CommonTreeAdaptor.java
@@ -47,11 +47,13 @@
 	 *  I could use reflection to prevent having to override this
 	 *  but reflection is slow.
 	 */
+	@Override
 	public Object dupNode(Object t) {
 		if ( t==null ) return null;
 		return ((Tree)t).dupNode();
 	}
 
+	@Override
 	public Object create(Token payload) {
 		return new CommonTree(payload);
 	}
@@ -64,6 +66,7 @@
 	 *  If you care what the token payload objects' type is, you should
 	 *  override this method and any other createToken variant.
 	 */
+	@Override
 	public Token createToken(int tokenType, String text) {
 		return new CommonToken(tokenType, text);
 	}
@@ -77,11 +80,12 @@
 	 *  an actual real input token.  Typically this is for converting '{'
 	 *  tokens to BLOCK etc...  You'll see
 	 *
-	 *    r : lc='{' ID+ '}' -> ^(BLOCK[$lc] ID+) ;
+	 *    r : lc='{' ID+ '}' -&gt; ^(BLOCK[$lc] ID+) ;
 	 *
 	 *  If you care what the token payload objects' type is, you should
 	 *  override this method and any other createToken variant.
 	 */
+	@Override
 	public Token createToken(Token fromToken) {
 		return new CommonToken(fromToken);
 	}
@@ -91,6 +95,7 @@
 	 *  seems like this will yield start=i and stop=i-1 in a nil node.
 	 *  Might be useful info so I'll not force to be i..i.
 	 */
+	@Override
 	public void setTokenBoundaries(Object t, Token startToken, Token stopToken) {
 		if ( t==null ) return;
 		int start = 0;
@@ -101,21 +106,25 @@
 		((Tree)t).setTokenStopIndex(stop);
 	}
 
+	@Override
 	public int getTokenStartIndex(Object t) {
 		if ( t==null ) return -1;
 		return ((Tree)t).getTokenStartIndex();
 	}
 
+	@Override
 	public int getTokenStopIndex(Object t) {
 		if ( t==null ) return -1;
 		return ((Tree)t).getTokenStopIndex();
 	}
 
+	@Override
 	public String getText(Object t) {
 		if ( t==null ) return null;
 		return ((Tree)t).getText();
 	}
 
+	@Override
     public int getType(Object t) {
 		if ( t==null ) return Token.INVALID_TOKEN_TYPE;
 		return ((Tree)t).getType();
@@ -125,6 +134,7 @@
 	 *  you are not using CommonTree, then you must
 	 *  override this in your own adaptor.
 	 */
+	@Override
 	public Token getToken(Object t) {
 		if ( t instanceof CommonTree ) {
 			return ((CommonTree)t).getToken();
@@ -132,34 +142,41 @@
 		return null; // no idea what to do
 	}
 
+	@Override
 	public Object getChild(Object t, int i) {
 		if ( t==null ) return null;
         return ((Tree)t).getChild(i);
     }
 
+	@Override
     public int getChildCount(Object t) {
 		if ( t==null ) return 0;
         return ((Tree)t).getChildCount();
     }
 
+	@Override
 	public Object getParent(Object t) {
 		if ( t==null ) return null;
         return ((Tree)t).getParent();
 	}
 
+	@Override
 	public void setParent(Object t, Object parent) {
         if ( t!=null ) ((Tree)t).setParent((Tree)parent);
 	}
 
+	@Override
 	public int getChildIndex(Object t) {
         if ( t==null ) return 0;
 		return ((Tree)t).getChildIndex();
 	}
 
+	@Override
 	public void setChildIndex(Object t, int index) {
         if ( t!=null ) ((Tree)t).setChildIndex(index);
 	}
 
+	@Override
 	public void replaceChildren(Object parent, int startChildIndex, int stopChildIndex, Object t) {
 		if ( parent!=null ) {
 			((Tree)parent).replaceChildren(startChildIndex, stopChildIndex, t);
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/tree/CommonTreeNodeStream.java b/runtime/Java/src/main/java/org/antlr/runtime/tree/CommonTreeNodeStream.java
index dcdbdd5..29b9546 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/tree/CommonTreeNodeStream.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/tree/CommonTreeNodeStream.java
@@ -27,38 +27,48 @@
  */
 package org.antlr.runtime.tree;
 
+import org.antlr.runtime.RecognitionException;
 import org.antlr.runtime.Token;
 import org.antlr.runtime.TokenStream;
 import org.antlr.runtime.misc.LookaheadStream;
 import org.antlr.runtime.misc.IntArray;
 
-import java.util.*;
-
-public class CommonTreeNodeStream extends LookaheadStream<Object> implements TreeNodeStream {
+public class CommonTreeNodeStream extends LookaheadStream<Object> implements TreeNodeStream, PositionTrackingStream<Object> {
 	public static final int DEFAULT_INITIAL_BUFFER_SIZE = 100;
 	public static final int INITIAL_CALL_STACK_SIZE = 10;
 
 	/** Pull nodes from which tree? */
 	protected Object root;
 
-	/** If this tree (root) was created from a token stream, track it. */
+	/** If this tree (root) was created from a {@link TokenStream}, track it. */
 	protected TokenStream tokens;
 
-	/** What tree adaptor was used to build these trees */
+	/** What {@link TreeAdaptor} was used to build these trees */
 	TreeAdaptor adaptor;
 
-    /** The tree iterator we using */
+    /** The {@link TreeIterator} we using. */
     protected TreeIterator it;
 
-    /** Stack of indexes used for push/pop calls */
+    /** Stack of indexes used for push/pop calls. */
     protected IntArray calls;
 
-    /** Tree (nil A B C) trees like flat A B C streams */
+    /** Tree {@code (nil A B C)} trees like flat {@code A B C} streams */
     protected boolean hasNilRoot = false;
 
     /** Tracks tree depth.  Level=0 means we're at root node level. */
     protected int level = 0;
 
+	/**
+	 * Tracks the last node before the start of {@link #data} which contains
+	 * position information to provide information for error reporting. This is
+	 * tracked in addition to {@link #prevElement} which may or may not contain
+	 * position information.
+	 *
+	 * @see #hasPositionInformation
+	 * @see RecognitionException#extractInformationFromTreeNodeStream
+	 */
+	protected Object previousLocationElement;
+
 	public CommonTreeNodeStream(Object tree) {
 		this(new CommonTreeAdaptor(), tree);
 	}
@@ -69,17 +79,20 @@
         it = new TreeIterator(adaptor,root);
 	}
 
+	@Override
     public void reset() {
         super.reset();
         it.reset();
         hasNilRoot = false;
         level = 0;
+		previousLocationElement = null;
         if ( calls != null ) calls.clear();
     }
 
     /** Pull elements from tree iterator.  Track tree level 0..max_level.
      *  If nil rooted tree, don't give initial nil and DOWN nor final UP.
      */
+	@Override
     public Object nextElement() {
         Object t = it.next();
         //System.out.println("pulled "+adaptor.getType(t));
@@ -97,26 +110,44 @@
         return t;
     }
 
+	@Override
+	public Object remove() {
+		Object result = super.remove();
+		if (p == 0 && hasPositionInformation(prevElement)) {
+			previousLocationElement = prevElement;
+		}
+
+		return result;
+	}
+
+	@Override
     public boolean isEOF(Object o) { return adaptor.getType(o) == Token.EOF; }
 
+	@Override
     public void setUniqueNavigationNodes(boolean uniqueNavigationNodes) { }
 
+	@Override
 	public Object getTreeSource() {	return root; }
 
+	@Override
 	public String getSourceName() { return getTokenStream().getSourceName(); }
 
+	@Override
 	public TokenStream getTokenStream() { return tokens; }
 
 	public void setTokenStream(TokenStream tokens) { this.tokens = tokens; }
 
+	@Override
 	public TreeAdaptor getTreeAdaptor() { return adaptor; }
 
 	public void setTreeAdaptor(TreeAdaptor adaptor) { this.adaptor = adaptor; }
 
+	@Override
     public Object get(int i) {
         throw new UnsupportedOperationException("Absolute node indexes are meaningless in an unbuffered stream");
     }
 
+	@Override
     public int LA(int i) { return adaptor.getType(LT(i)); }
 
     /** Make stream jump to a new location, saving old location.
@@ -130,7 +161,7 @@
         seek(index);
     }
 
-    /** Seek back to previous index saved during last push() call.
+    /** Seek back to previous index saved during last {@link #push} call.
      *  Return top of stack (return index).
      */
     public int pop() {
@@ -139,14 +170,58 @@
         return ret;
     }
 
+	/**
+	 * Returns an element containing position information. If {@code allowApproximateLocation} is {@code false}, then
+	 * this method will return the {@code LT(1)} element if it contains position information, and otherwise return {@code null}.
+	 * If {@code allowApproximateLocation} is {@code true}, then this method will return the last known element containing position information.
+	 *
+	 * @see #hasPositionInformation
+	 */
+	@Override
+	public Object getKnownPositionElement(boolean allowApproximateLocation) {
+		Object node = data.get(p);
+		if (hasPositionInformation(node)) {
+			return node;
+		}
+
+		if (!allowApproximateLocation) {
+			return null;
+		}
+
+		for (int index = p - 1; index >= 0; index--) {
+			node = data.get(index);
+			if (hasPositionInformation(node)) {
+				return node;
+			}
+		}
+
+		return previousLocationElement;
+	}
+
+	@Override
+	public boolean hasPositionInformation(Object node) {
+		Token token = adaptor.getToken(node);
+		if (token == null) {
+			return false;
+		}
+
+		if (token.getLine() <= 0) {
+			return false;
+		}
+
+		return true;
+	}
+
 	// TREE REWRITE INTERFACE
 
+	@Override
 	public void replaceChildren(Object parent, int startChildIndex, int stopChildIndex, Object t) {
 		if ( parent!=null ) {
 			adaptor.replaceChildren(parent, startChildIndex, stopChildIndex, t);
 		}
 	}
 
+	@Override
 	public String toString(Object start, Object stop) {
         // we'll have to walk from start to stop in tree; we're not keeping
         // a complete node stream buffer
@@ -156,7 +231,7 @@
     /** For debugging; destructive: moves tree iterator to end. */
     public String toTokenTypeString() {
         reset();
-		StringBuffer buf = new StringBuffer();
+		StringBuilder buf = new StringBuilder();
         Object o = LT(1);
         int type = adaptor.getType(o);
         while ( type!=Token.EOF ) {
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/tree/DOTTreeGenerator.java b/runtime/Java/src/main/java/org/antlr/runtime/tree/DOTTreeGenerator.java
index 6c519d1..9d2e6f7 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/tree/DOTTreeGenerator.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/tree/DOTTreeGenerator.java
@@ -71,7 +71,7 @@
 			new StringTemplate("$parent$ -> $child$ // \"$parentText$\" -> \"$childText$\"\n");
 
 	/** Track node to number mapping so we can get proper node name back */
-	HashMap nodeToNumberMap = new HashMap();
+	HashMap<Object, Integer> nodeToNumberMap = new HashMap<Object, Integer>();
 
 	/** Track node number so we can get unique node names */
 	int nodeNumber = 0;
@@ -108,10 +108,10 @@
 	 *   node [shape=plaintext, fixedsize=true, fontsize=11, fontname="Courier",
 	 *         width=.4, height=.2];
 	 *   edge [arrowsize=.7]
-	 *   "+"->3
-	 *   "+"->"*"
-	 *   "*"->4
-	 *   "*"->5
+	 *   "+"-&gt;3
+	 *   "+"-&gt;"*"
+	 *   "*"-&gt;4
+	 *   "*"-&gt;5
 	 * }
 	 *
 	 * Return the ST not a string in case people want to alter.
@@ -192,12 +192,12 @@
 	}
 
 	protected int getNodeNumber(Object t) {
-		Integer nI = (Integer)nodeToNumberMap.get(t);
+		Integer nI = nodeToNumberMap.get(t);
 		if ( nI!=null ) {
-			return nI.intValue();
+			return nI;
 		}
 		else {
-			nodeToNumberMap.put(t, new Integer(nodeNumber));
+			nodeToNumberMap.put(t, nodeNumber);
 			nodeNumber++;
 			return nodeNumber-1;
 		}
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/tree/ParseTree.java b/runtime/Java/src/main/java/org/antlr/runtime/tree/ParseTree.java
index 5811c55..fd30891 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/tree/ParseTree.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/tree/ParseTree.java
@@ -38,38 +38,46 @@
  */
 public class ParseTree extends BaseTree {
 	public Object payload;
-	public List hiddenTokens;
+	public List<Token> hiddenTokens;
 
 	public ParseTree(Object label) {
 		this.payload = label;
 	}
 
+	@Override
 	public Tree dupNode() {
 		return null;
 	}
 
+	@Override
 	public int getType() {
 		return 0;
 	}
 
+	@Override
 	public String getText() {
 		return toString();
 	}
 
+	@Override
 	public int getTokenStartIndex() {
 		return 0;
 	}
 
+	@Override
 	public void setTokenStartIndex(int index) {
 	}
 
+	@Override
 	public int getTokenStopIndex() {
 		return 0;
 	}
 
+	@Override
 	public void setTokenStopIndex(int index) {
 	}
 
+	@Override
 	public String toString() {
 		if ( payload instanceof Token ) {
 			Token t = (Token)payload;
@@ -85,10 +93,10 @@
 	 *  hidden tokens after last real token.
 	 */
 	public String toStringWithHiddenTokens() {
-		StringBuffer buf = new StringBuffer();
+		StringBuilder buf = new StringBuilder();
 		if ( hiddenTokens!=null ) {
 			for (int i = 0; i < hiddenTokens.size(); i++) {
-				Token hidden = (Token) hiddenTokens.get(i);
+				Token hidden = hiddenTokens.get(i);
 				buf.append(hidden.getText());
 			}
 		}
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/tree/PositionTrackingStream.java b/runtime/Java/src/main/java/org/antlr/runtime/tree/PositionTrackingStream.java
new file mode 100644
index 0000000..233548a
--- /dev/null
+++ b/runtime/Java/src/main/java/org/antlr/runtime/tree/PositionTrackingStream.java
@@ -0,0 +1,57 @@
+/*
+ [The "BSD license"]
+ Copyright (c) 2012 Terence Parr
+ Copyright (c) 2012 Sam Harwell
+ 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.
+ */
+package org.antlr.runtime.tree;
+
+/**
+ *
+ * @author Sam Harwell
+ */
+public interface PositionTrackingStream<T> {
+
+	/**
+	 * Returns an element containing concrete information about the current
+	 * position in the stream.
+	 *
+	 * @param allowApproximateLocation if {@code false}, this method returns
+	 * {@code null} if an element containing exact information about the current
+	 * position is not available
+	 */
+	T getKnownPositionElement(boolean allowApproximateLocation);
+
+	/**
+	 * Determines if the specified {@code element} contains concrete position
+	 * information.
+	 *
+	 * @param element the element to check
+	 * @return {@code true} if {@code element} contains concrete position
+	 * information, otherwise {@code false}
+	 */
+	boolean hasPositionInformation(T element);
+
+}
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/tree/RewriteCardinalityException.java b/runtime/Java/src/main/java/org/antlr/runtime/tree/RewriteCardinalityException.java
index 7f909cd..3cd6c8e 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/tree/RewriteCardinalityException.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/tree/RewriteCardinalityException.java
@@ -38,6 +38,7 @@
 		this.elementDescription = elementDescription;
 	}
 
+	@Override
 	public String getMessage() {
 		if ( elementDescription!=null ) {
 			return elementDescription;
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/tree/RewriteRuleElementStream.java b/runtime/Java/src/main/java/org/antlr/runtime/tree/RewriteRuleElementStream.java
index 61f1860..bcbaeae 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/tree/RewriteRuleElementStream.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/tree/RewriteRuleElementStream.java
@@ -31,7 +31,7 @@
 import java.util.List;
 
 /** A generic list of elements tracked in an alternative to be used in
- *  a -> rewrite rule.  We need to subclass to fill in the next() method,
+ *  a -&gt; rewrite rule.  We need to subclass to fill in the next() method,
  *  which returns either an AST node wrapped around a token payload or
  *  an existing subtree.
  *
@@ -53,7 +53,7 @@
 	protected Object singleElement;
 
 	/** The list of tokens or subtrees we are tracking */
-	protected List elements;
+	protected List<Object> elements;
 
 	/** Once a node / subtree has been used in a stream, it must be dup'd
 	 *  from then on.  Streams are reset after subrules so that the streams
@@ -80,6 +80,7 @@
 	}
 
 	/** Create a stream with one element */
+	@SuppressWarnings("OverridableMethodCallInConstructor")
 	public RewriteRuleElementStream(TreeAdaptor adaptor,
 									String elementDescription,
 									Object oneElement)
@@ -91,7 +92,7 @@
 	/** Create a stream, but feed off an existing list */
 	public RewriteRuleElementStream(TreeAdaptor adaptor,
 									String elementDescription,
-									List elements)
+									List<Object> elements)
 	{
 		this(adaptor, elementDescription);
 		this.singleElement = null;
@@ -122,7 +123,7 @@
 			return;
 		}
 		// adding 2nd element, move to list
-		elements = new ArrayList(5);
+		elements = new ArrayList<Object>(5);
 		elements.add(singleElement);
 		singleElement = null;
 		elements.add(el);
@@ -147,8 +148,8 @@
 
 	/** do the work of getting the next element, making sure that it's
 	 *  a tree node or subtree.  Deal with the optimization of single-
-	 *  element list versus list of size > 1.  Throw an exception
-	 *  if the stream is empty or we're out of elements and size>1.
+	 *  element list versus list of size &gt; 1.  Throw an exception
+	 *  if the stream is empty or we're out of elements and size&gt;1.
 	 *  protected so you can override in a subclass if necessary.
 	 */
 	protected Object _next() {
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/tree/RewriteRuleNodeStream.java b/runtime/Java/src/main/java/org/antlr/runtime/tree/RewriteRuleNodeStream.java
index 713e9ff..e41b745 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/tree/RewriteRuleNodeStream.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/tree/RewriteRuleNodeStream.java
@@ -29,7 +29,7 @@
 
 import java.util.List;
 
-/** Queues up nodes matched on left side of -> in a tree parser. This is
+/** Queues up nodes matched on left side of -&gt; in a tree parser. This is
  *  the analog of RewriteRuleTokenStream for normal parsers. 
  */
 public class RewriteRuleNodeStream extends RewriteRuleElementStream {
@@ -49,7 +49,7 @@
 	/** Create a stream, but feed off an existing list */
 	public RewriteRuleNodeStream(TreeAdaptor adaptor,
 								 String elementDescription,
-								 List elements)
+								 List<Object> elements)
 	{
 		super(adaptor, elementDescription, elements);
 	}
@@ -58,10 +58,12 @@
 		return _next();
 	}
 
+	@Override
 	protected Object toTree(Object el) {
 		return adaptor.dupNode(el);
 	}
 
+	@Override
 	protected Object dup(Object el) {
 		// we dup every node, so don't have to worry about calling dup; short-
 		// circuited next() so it doesn't call.
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/tree/RewriteRuleSubtreeStream.java b/runtime/Java/src/main/java/org/antlr/runtime/tree/RewriteRuleSubtreeStream.java
index 5189f21..2c8ac80 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/tree/RewriteRuleSubtreeStream.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/tree/RewriteRuleSubtreeStream.java
@@ -46,7 +46,7 @@
 	/** Create a stream, but feed off an existing list */
 	public RewriteRuleSubtreeStream(TreeAdaptor adaptor,
 									String elementDescription,
-									List elements)
+									List<Object> elements)
 	{
 		super(adaptor, elementDescription, elements);
 	}
@@ -82,6 +82,7 @@
 		return el;
 	}
 
+	@Override
 	protected Object dup(Object el) {
 		return adaptor.dupTree(el);
 	}
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/tree/RewriteRuleTokenStream.java b/runtime/Java/src/main/java/org/antlr/runtime/tree/RewriteRuleTokenStream.java
index 4cd7b08..41ce04b 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/tree/RewriteRuleTokenStream.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/tree/RewriteRuleTokenStream.java
@@ -48,7 +48,7 @@
 	/** Create a stream, but feed off an existing list */
 	public RewriteRuleTokenStream(TreeAdaptor adaptor,
 								  String elementDescription,
-								  List elements)
+								  List<Object> elements)
 	{
 		super(adaptor, elementDescription, elements);
 	}
@@ -66,10 +66,12 @@
 	/** Don't convert to a tree unless they explicitly call nextTree.
 	 *  This way we can do hetero tree nodes in rewrite.
 	 */
+	@Override
 	protected Object toTree(Object el) {
 		return el;
 	}
 
+	@Override
 	protected Object dup(Object el) {
 		throw new UnsupportedOperationException("dup can't be called for a token stream.");
 	}
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/tree/Tree.java b/runtime/Java/src/main/java/org/antlr/runtime/tree/Tree.java
index 7875be3..a79283d 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/tree/Tree.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/tree/Tree.java
@@ -63,7 +63,7 @@
     /** Return a list of all ancestors of this node.  The first node of
      *  list is the root and the last is the parent of this node.
      */
-    public List getAncestors();
+    public List<?> getAncestors();
 
     /** This node is what child index? 0..n-1 */
 	public int getChildIndex();
@@ -123,5 +123,6 @@
 
 	String toStringTree();
 
+	@Override
 	String toString();
 }
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/tree/TreeFilter.java b/runtime/Java/src/main/java/org/antlr/runtime/tree/TreeFilter.java
index b6a7e05..4699610 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/tree/TreeFilter.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/tree/TreeFilter.java
@@ -109,19 +109,23 @@
     public void downup(Object t) {
         TreeVisitor v = new TreeVisitor(new CommonTreeAdaptor());
         TreeVisitorAction actions = new TreeVisitorAction() {
+			@Override
             public Object pre(Object t)  { applyOnce(t, topdown_fptr); return t; }
+			@Override
             public Object post(Object t) { applyOnce(t, bottomup_fptr); return t; }
         };
         v.visit(t, actions);
     }
         
     fptr topdown_fptr = new fptr() {
+		@Override
         public void rule() throws RecognitionException {
             topdown();
         }
     };
 
     fptr bottomup_fptr = new fptr() {
+		@Override
         public void rule() throws RecognitionException {
             bottomup();
         }
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/tree/TreeIterator.java b/runtime/Java/src/main/java/org/antlr/runtime/tree/TreeIterator.java
index 43ead6d..b1d891e 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/tree/TreeIterator.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/tree/TreeIterator.java
@@ -28,7 +28,6 @@
 package org.antlr.runtime.tree;
 
 import org.antlr.runtime.Token;
-import org.antlr.runtime.CommonToken;
 import org.antlr.runtime.misc.FastQueue;
 
 import java.util.Iterator;
@@ -38,7 +37,7 @@
  *
  *  Emit navigation nodes (DOWN, UP, and EOF) to let show tree structure.
  */
-public class TreeIterator implements Iterator {
+public class TreeIterator implements Iterator<Object> {
     protected TreeAdaptor adaptor;
     protected Object root;
     protected Object tree;
@@ -52,7 +51,7 @@
     /** If we emit UP/DOWN nodes, we need to spit out multiple nodes per
      *  next() call.
      */
-    protected FastQueue nodes;
+    protected FastQueue<Object> nodes;
 
     public TreeIterator(Object tree) {
         this(new CommonTreeAdaptor(),tree);
@@ -62,7 +61,7 @@
         this.adaptor = adaptor;
         this.tree = tree;
         this.root = tree;
-        nodes = new FastQueue();
+        nodes = new FastQueue<Object>();
         down = adaptor.create(Token.DOWN, "DOWN");
         up = adaptor.create(Token.UP, "UP");
         eof = adaptor.create(Token.EOF, "EOF");
@@ -74,6 +73,7 @@
         nodes.clear();
     }
 
+	@Override
     public boolean hasNext() {
         if ( firstTime ) return root!=null;
         if ( nodes!=null && nodes.size()>0 ) return true;
@@ -82,6 +82,7 @@
         return adaptor.getParent(tree)!=null; // back at root?
     }
 
+	@Override
     public Object next() {
         if ( firstTime ) { // initial condition
             firstTime = false;
@@ -128,5 +129,6 @@
         return nodes.remove();
     }
 
+	@Override
     public void remove() { throw new UnsupportedOperationException(); }
 }
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/tree/TreeNodeStream.java b/runtime/Java/src/main/java/org/antlr/runtime/tree/TreeNodeStream.java
index df0ad34..4e8cb55 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/tree/TreeNodeStream.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/tree/TreeNodeStream.java
@@ -28,26 +28,28 @@
 package org.antlr.runtime.tree;
 
 import org.antlr.runtime.IntStream;
+import org.antlr.runtime.Token;
 import org.antlr.runtime.TokenStream;
 
 /** A stream of tree nodes, accessing nodes from a tree of some kind */
 public interface TreeNodeStream extends IntStream {
-	/** Get a tree node at an absolute index i; 0..n-1.
+	/** Get a tree node at an absolute index {@code i}; 0..n-1.
 	 *  If you don't want to buffer up nodes, then this method makes no
 	 *  sense for you.
 	 */
 	public Object get(int i);
 
-	/** Get tree node at current input pointer + i ahead where i=1 is next node.
-	 *  i<0 indicates nodes in the past.  So LT(-1) is previous node, but
-	 *  implementations are not required to provide results for k < -1.
-	 *  LT(0) is undefined.  For i>=n, return null.
-	 *  Return null for LT(0) and any index that results in an absolute address
-	 *  that is negative.
-	 *
-	 *  This is analogus to the LT() method of the TokenStream, but this
-	 *  returns a tree node instead of a token.  Makes code gen identical
-	 *  for both parser and tree grammars. :)
+	/**
+	 * Get tree node at current input pointer + {@code k} ahead where
+	 * {@code k==1} is next node. {@code k<0} indicates nodes in the past. So
+	 * {@code LT(-1)} is previous node, but implementations are not required to
+	 * provide results for {@code k < -1}. {@code LT(0)} is undefined. For
+	 * {@code k<=n}, return {@code null}. Return {@code null} for {@code LT(0)}
+	 * and any index that results in an absolute address that is negative.
+	 * <p>
+	 * This is analogous to {@link TokenStream#LT}, but this returns a tree node
+	 * instead of a {@link Token}. Makes code generation identical for both
+	 * parser and tree grammars.</p>
 	 */
 	public Object LT(int k);
 
@@ -56,10 +58,12 @@
 	 */
 	public Object getTreeSource();
 
-	/** If the tree associated with this stream was created from a TokenStream,
-	 *  you can specify it here.  Used to do rule $text attribute in tree
-	 *  parser.  Optional unless you use tree parser rule text attribute
-	 *  or output=template and rewrite=true options.
+	/**
+	 * If the tree associated with this stream was created from a
+	 * {@link TokenStream}, you can specify it here. Used to do rule
+	 * {@code $text} attribute in tree parser. Optional unless you use tree
+	 * parser rule {@code $text} attribute or {@code output=template} and
+	 * {@code rewrite=true} options.
 	 */
 	public TokenStream getTokenStream();
 
@@ -68,11 +72,12 @@
 	 */
 	public TreeAdaptor getTreeAdaptor();
 
-	/** As we flatten the tree, we use UP, DOWN nodes to represent
-	 *  the tree structure.  When debugging we need unique nodes
-	 *  so we have to instantiate new ones.  When doing normal tree
-	 *  parsing, it's slow and a waste of memory to create unique
-	 *  navigation nodes.  Default should be false;
+	/**
+	 * As we flatten the tree, we use {@link Token#UP}, {@link Token#DOWN} nodes
+	 * to represent the tree structure. When debugging we need unique nodes so
+	 * we have to instantiate new ones. When doing normal tree parsing, it's
+	 * slow and a waste of memory to create unique navigation nodes. Default
+	 * should be {@code false}.
 	 */
 	public void setUniqueNavigationNodes(boolean uniqueNavigationNodes);
 
@@ -81,26 +86,28 @@
      */
     public void reset();
 
-	/** Return the text of all nodes from start to stop, inclusive.
-	 *  If the stream does not buffer all the nodes then it can still
-	 *  walk recursively from start until stop.  You can always return
-	 *  null or "" too, but users should not access $ruleLabel.text in
-	 *  an action of course in that case.
+	/**
+	 * Return the text of all nodes from {@code start} to {@code stop},
+	 * inclusive. If the stream does not buffer all the nodes then it can still
+	 * walk recursively from start until stop. You can always return
+	 * {@code null} or {@code ""} too, but users should not access
+	 * {@code $ruleLabel.text} in an action of course in that case.
 	 */
 	public String toString(Object start, Object stop);
 
-
 	// REWRITING TREES (used by tree parser)
 
-	/** Replace from start to stop child index of parent with t, which might
-	 *  be a list.  Number of children may be different
-	 *  after this call.  The stream is notified because it is walking the
-	 *  tree and might need to know you are monkeying with the underlying
-	 *  tree.  Also, it might be able to modify the node stream to avoid
-	 *  restreaming for future phases.
-	 *
-	 *  If parent is null, don't do anything; must be at root of overall tree.
-	 *  Can't replace whatever points to the parent externally.  Do nothing.
+	/**
+	 * Replace children of {@code parent} from index {@code startChildIndex} to
+	 * {@code stopChildIndex} with {@code t}, which might be a list. Number of
+	 * children may be different after this call. The stream is notified because
+	 * it is walking the tree and might need to know you are monkeying with the
+	 * underlying tree. Also, it might be able to modify the node stream to
+	 * avoid restreaming for future phases.
+	 * <p>
+	 * If {@code parent} is {@code null}, don't do anything; must be at root of
+	 * overall tree. Can't replace whatever points to the parent externally. Do
+	 * nothing.</p>
 	 */
 	public void replaceChildren(Object parent, int startChildIndex, int stopChildIndex, Object t);
 }
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/tree/TreeParser.java b/runtime/Java/src/main/java/org/antlr/runtime/tree/TreeParser.java
index c40f81f..0eaf954 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/tree/TreeParser.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/tree/TreeParser.java
@@ -58,6 +58,7 @@
 		setTreeNodeStream(input);
     }
 
+	@Override
 	public void reset() {
 		super.reset(); // reset all recognizer state variables
 		if ( input!=null ) {
@@ -74,14 +75,17 @@
 		return input;
 	}
 
+	@Override
 	public String getSourceName() {
 		return input.getSourceName();
 	}
 
+	@Override
 	protected Object getCurrentInputSymbol(IntStream input) {
 		return ((TreeNodeStream)input).LT(1);
 	}
 
+	@Override
 	protected Object getMissingSymbol(IntStream input,
 									  RecognitionException e,
 									  int expectedTokenType,
@@ -97,6 +101,7 @@
 	 *  entire tree if node has children.  If children, scan until
 	 *  corresponding UP node.
 	 */
+	@Override
 	public void matchAny(IntStream ignore) { // ignore stream, copy of input
 		state.errorRecovery = false;
 		state.failed = false;
@@ -127,6 +132,7 @@
 	 *  plus we want to alter the exception type.  Don't try to recover
 	 *  from tree parser errors inline...
      */
+	@Override
     protected Object recoverFromMismatchedToken(IntStream input,
                                                 int ttype,
                                                 BitSet follow)
@@ -139,6 +145,7 @@
 	 *  always intended for the programmer because the parser built
 	 *  the input tree not the user.
 	 */
+	@Override
 	public String getErrorHeader(RecognitionException e) {
 		return getGrammarFileName()+": node from "+
 			   (e.approximateLineInfo?"after ":"")+"line "+e.line+":"+e.charPositionInLine;
@@ -147,6 +154,7 @@
 	/** Tree parsers parse nodes they usually have a token object as
 	 *  payload. Set the exception token and do the default behavior.
 	 */
+	@Override
 	public String getErrorMessage(RecognitionException e, String[] tokenNames) {
 		if ( this instanceof TreeParser ) {
 			TreeAdaptor adaptor = ((TreeNodeStream)e.input).getTreeAdaptor();
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/tree/TreeRewriter.java b/runtime/Java/src/main/java/org/antlr/runtime/tree/TreeRewriter.java
index 91aee93..f77bf23 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/tree/TreeRewriter.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/tree/TreeRewriter.java
@@ -89,7 +89,9 @@
         this.showTransformations = showTransformations;
         TreeVisitor v = new TreeVisitor(new CommonTreeAdaptor());
         TreeVisitorAction actions = new TreeVisitorAction() {
+			@Override
             public Object pre(Object t)  { return applyOnce(t, topdown_fptr); }
+			@Override
             public Object post(Object t) { return applyRepeatedly(t, bottomup_ftpr); }
         };
         t = v.visit(t, actions);
@@ -105,10 +107,12 @@
     }
 
     fptr topdown_fptr = new fptr() {
+		@Override
         public Object rule() throws RecognitionException { return topdown(); }
     };
     
     fptr bottomup_ftpr = new fptr() {
+		@Override
         public Object rule() throws RecognitionException { return bottomup(); }
     };
 
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/tree/TreeRuleReturnScope.java b/runtime/Java/src/main/java/org/antlr/runtime/tree/TreeRuleReturnScope.java
index 4ea65c0..ae8b3c2 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/tree/TreeRuleReturnScope.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/tree/TreeRuleReturnScope.java
@@ -27,15 +27,18 @@
  */
 package org.antlr.runtime.tree;
 
+import org.antlr.runtime.ParserRuleReturnScope;
 import org.antlr.runtime.RuleReturnScope;
+import org.antlr.runtime.Token;
 
-/** This is identical to the ParserRuleReturnScope except that
- *  the start property is a tree nodes not Token object
+/** This is identical to the {@link ParserRuleReturnScope} except that
+ *  the start property is a tree nodes not {@link Token} object
  *  when you are parsing trees.  To be generic the tree node types
- *  have to be Object.
+ *  have to be {@link Object}.
  */
 public class TreeRuleReturnScope extends RuleReturnScope {
 	/** First node or root node of tree matched for this rule. */
 	public Object start;
+	@Override
 	public Object getStart() { return start; }	
 }
diff --git a/runtime/Java/src/main/java/org/antlr/runtime/tree/TreeWizard.java b/runtime/Java/src/main/java/org/antlr/runtime/tree/TreeWizard.java
index 666cfd6..a89112d 100644
--- a/runtime/Java/src/main/java/org/antlr/runtime/tree/TreeWizard.java
+++ b/runtime/Java/src/main/java/org/antlr/runtime/tree/TreeWizard.java
@@ -41,7 +41,7 @@
  *
  *  In order to create nodes and navigate, this class needs a TreeAdaptor.
  *
- *  This class can build a token type -> node index for repeated use or for
+ *  This class can build a token type &rarr; node index for repeated use or for
  *  iterating over the various nodes with a particular type.
  *
  *  This class works in conjunction with the TreeAdaptor rather than moving
@@ -52,15 +52,16 @@
  */
 public class TreeWizard {
 	protected TreeAdaptor adaptor;
-	protected Map tokenNameToTypeMap;
+	protected Map<String, Integer> tokenNameToTypeMap;
 
 	public interface ContextVisitor {
 		// TODO: should this be called visit or something else?
-		public void visit(Object t, Object parent, int childIndex, Map labels);
+		public void visit(Object t, Object parent, int childIndex, Map<String, Object> labels);
 	}
 
 	public static abstract class Visitor implements ContextVisitor {
-		public void visit(Object t, Object parent, int childIndex, Map labels) {
+		@Override
+		public void visit(Object t, Object parent, int childIndex, Map<String, Object> labels) {
 			visit(t);
 		}
 		public abstract void visit(Object t);
@@ -75,6 +76,7 @@
 		public TreePattern(Token payload) {
 			super(payload);
 		}
+		@Override
 		public String toString() {
 			if ( label!=null ) {
 				return "%"+label+":"+super.toString();
@@ -93,6 +95,7 @@
 
 	/** This adaptor creates TreePattern objects for use during scan() */
 	public static class TreePatternTreeAdaptor extends CommonTreeAdaptor {
+		@Override
 		public Object create(Token payload) {
 			return new TreePattern(payload);
 		}
@@ -123,7 +126,7 @@
 		this.adaptor = adaptor;
 	}
 
-	public TreeWizard(TreeAdaptor adaptor, Map tokenNameToTypeMap) {
+	public TreeWizard(TreeAdaptor adaptor, Map<String, Integer> tokenNameToTypeMap) {
 		this.adaptor = adaptor;
 		this.tokenNameToTypeMap = tokenNameToTypeMap;
 	}
@@ -137,17 +140,17 @@
 		this(new CommonTreeAdaptor(), tokenNames);
 	}
 
-	/** Compute a Map<String, Integer> that is an inverted index of
+	/** Compute a Map&lt;String, Integer&gt; that is an inverted index of
 	 *  tokenNames (which maps int token types to names).
 	 */
-	public Map computeTokenTypes(String[] tokenNames) {
-		Map m = new HashMap();
+	public Map<String, Integer> computeTokenTypes(String[] tokenNames) {
+		Map<String, Integer> m = new HashMap<String, Integer>();
 		if ( tokenNames==null ) {
 			return m;
 		}
 		for (int ttype = Token.MIN_TOKEN_TYPE; ttype < tokenNames.length; ttype++) {
 			String name = tokenNames[ttype];
-			m.put(name, new Integer(ttype));
+			m.put(name, ttype);
 		}
 		return m;
 	}
@@ -157,36 +160,36 @@
 	 	if ( tokenNameToTypeMap==null ) {
 			 return Token.INVALID_TOKEN_TYPE;
 		 }
-		Integer ttypeI = (Integer)tokenNameToTypeMap.get(tokenName);
+		Integer ttypeI = tokenNameToTypeMap.get(tokenName);
 		if ( ttypeI!=null ) {
-			return ttypeI.intValue();
+			return ttypeI;
 		}
 		return Token.INVALID_TOKEN_TYPE;
 	}
 
 	/** Walk the entire tree and make a node name to nodes mapping.
 	 *  For now, use recursion but later nonrecursive version may be
-	 *  more efficient.  Returns Map<Integer, List> where the List is
+	 *  more efficient.  Returns Map&lt;Integer, List&gt; where the List is
 	 *  of your AST node type.  The Integer is the token type of the node.
 	 *
 	 *  TODO: save this index so that find and visit are faster
 	 */
-	public Map index(Object t) {
-		Map m = new HashMap();
+	public Map<Integer, List<Object>> index(Object t) {
+		Map<Integer, List<Object>> m = new HashMap<Integer, List<Object>>();
 		_index(t, m);
 		return m;
 	}
 
 	/** Do the work for index */
-	protected void _index(Object t, Map m) {
+	protected void _index(Object t, Map<Integer, List<Object>> m) {
 		if ( t==null ) {
 			return;
 		}
 		int ttype = adaptor.getType(t);
-		List elements = (List)m.get(new Integer(ttype));
+		List<Object> elements = m.get(ttype);
 		if ( elements==null ) {
-			elements = new ArrayList();
-			m.put(new Integer(ttype), elements);
+			elements = new ArrayList<Object>();
+			m.put(ttype, elements);
 		}
 		elements.add(t);
 		int n = adaptor.getChildCount(t);
@@ -197,9 +200,10 @@
 	}
 
 	/** Return a List of tree nodes with token type ttype */
-	public List find(Object t, int ttype) {
-		final List nodes = new ArrayList();
+	public List<? extends Object> find(Object t, int ttype) {
+		final List<Object> nodes = new ArrayList<Object>();
 		visit(t, ttype, new TreeWizard.Visitor() {
+			@Override
 			public void visit(Object t) {
 				nodes.add(t);
 			}
@@ -208,8 +212,8 @@
 	}
 
 	/** Return a List of subtrees matching pattern. */
-	public List find(Object t, String pattern) {
-		final List subtrees = new ArrayList();
+	public List<? extends Object> find(Object t, String pattern) {
+		final List<Object> subtrees = new ArrayList<Object>();
 		// Create a TreePattern from the pattern
 		TreePatternLexer tokenizer = new TreePatternLexer(pattern);
 		TreePatternParser parser =
@@ -224,6 +228,7 @@
 		}
 		int rootTokenType = tpattern.getType();
 		visit(t, rootTokenType, new TreeWizard.ContextVisitor() {
+			@Override
 			public void visit(Object t, Object parent, int childIndex, Map labels) {
 				if ( _parse(t, tpattern, null) ) {
 					subtrees.add(t);
@@ -283,10 +288,11 @@
 		{
 			return;
 		}
-		final Map labels = new HashMap(); // reused for each _parse
+		final Map<String, Object> labels = new HashMap<String, Object>(); // reused for each _parse
 		int rootTokenType = tpattern.getType();
 		visit(t, rootTokenType, new TreeWizard.ContextVisitor() {
-			public void visit(Object t, Object parent, int childIndex, Map unusedlabels) {
+			@Override
+			public void visit(Object t, Object parent, int childIndex, Map<String, Object> unusedlabels) {
 				// the unusedlabels arg is null as visit on token type doesn't set.
 				labels.clear();
 				if ( _parse(t, tpattern, labels) ) {
@@ -307,7 +313,7 @@
 	 *
 	 *  TODO: what's a better way to indicate bad pattern? Exceptions are a hassle 
 	 */
-	public boolean parse(Object t, String pattern, Map labels) {
+	public boolean parse(Object t, String pattern, Map<String, Object> labels) {
 		TreePatternLexer tokenizer = new TreePatternLexer(pattern);
 		TreePatternParser parser =
 			new TreePatternParser(tokenizer, this, new TreePatternTreeAdaptor());
@@ -329,7 +335,7 @@
 	 *  text arguments on nodes.  Fill labels map with pointers to nodes
 	 *  in tree matched against nodes in pattern with labels.
 	 */
-	protected boolean _parse(Object t1, TreePattern tpattern, Map labels) {
+	protected boolean _parse(Object t1, TreePattern tpattern, Map<String, Object> labels) {
 		// make sure both are non-null
 		if ( t1==null || tpattern==null ) {
 			return false;
diff --git a/runtime/Java/src/test/java/org/antlr/runtime/TestLookaheadStream.java b/runtime/Java/src/test/java/org/antlr/runtime/TestLookaheadStream.java
new file mode 100644
index 0000000..13c8add
--- /dev/null
+++ b/runtime/Java/src/test/java/org/antlr/runtime/TestLookaheadStream.java
@@ -0,0 +1,46 @@
+package org.antlr.runtime;
+
+import junit.framework.TestCase;
+
+public class TestLookaheadStream extends TestCase {
+
+  public void testSeek() {
+    UnbufferedTokenStream stream = new UnbufferedTokenStream(createTokenSource());
+
+    stream.consume();
+    assertEquals(0, stream.LA(-1));
+    assertEquals(1, stream.LA(1));
+
+    stream.mark();
+
+    stream.consume();
+    assertEquals(1, stream.LA(-1));
+    assertEquals(2, stream.LA(1));
+
+    int index = stream.index();
+    stream.rewind();
+    assertEquals(0, stream.LA(-1));
+    assertEquals(1, stream.LA(1));
+
+    stream.seek(index);
+    assertEquals(1, stream.LA(-1));
+    assertEquals(2, stream.LA(1));
+  }
+
+  private TokenSource createTokenSource() {
+    return new TokenSource() {
+      int count = 0;
+
+      @Override
+      public Token nextToken() {
+        return new CommonToken(count++);
+      }
+
+      @Override
+      public String getSourceName() {
+        return "test";
+      }
+    };
+
+  }
+}
diff --git a/runtime/ObjC/ANTLR.framework.zip b/runtime/ObjC/ANTLR.framework.zip
index 8340758..fae9dbf 100644
--- a/runtime/ObjC/ANTLR.framework.zip
+++ b/runtime/ObjC/ANTLR.framework.zip
Binary files differ
diff --git a/runtime/ObjC/ANTLR.framework/ANTLR b/runtime/ObjC/ANTLR.framework/ANTLR
index 67c1d3a..9d93d63 100755
--- a/runtime/ObjC/ANTLR.framework/ANTLR
+++ b/runtime/ObjC/ANTLR.framework/ANTLR
Binary files differ
diff --git a/runtime/ObjC/ANTLR.framework/Headers b/runtime/ObjC/ANTLR.framework/Headers
new file mode 100755
index 0000000..a177d2a
--- /dev/null
+++ b/runtime/ObjC/ANTLR.framework/Headers
@@ -0,0 +1 @@
+Versions/Current/Headers
\ No newline at end of file
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLR.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLR.h
deleted file mode 100755
index 671e783..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLR.h
+++ /dev/null
@@ -1,60 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-
-#import <ANTLR/ANTLRBitSet.h>
-#import <ANTLR/ANTLRBaseRecognizer.h>
-#import <ANTLR/ANTLRLexer.h>
-#import <ANTLR/ANTLRParser.h>
-#import <ANTLR/ANTLRTreeParser.h>
-#import <ANTLR/ANTLRDFA.h>
-#import <ANTLR/ANTLRStringStream.h>
-#import <ANTLR/ANTLRTokenSource.h>
-#import <ANTLR/ANTLRCommonTokenStream.h>
-
-#import <ANTLR/ANTLRRecognitionException.h>
-#import <ANTLR/ANTLREarlyExitException.h>
-#import <ANTLR/ANTLRMismatchedSetException.h>
-#import <ANTLR/ANTLRMismatchedTokenException.h>
-#import <ANTLR/ANTLRMismatchedRangeException.h>
-#import <ANTLR/ANTLRMismatchedTreeNodeException.h>
-#import <ANTLR/ANTLRNoViableAltException.h>
-#import <ANTLR/ANTLRFailedPredicateException.h>
-#import <ANTLR/ANTLRTreeException.h>
-
-#import <ANTLR/ANTLRParserRuleReturnScope.h>
-#import <ANTLR/ANTLRTreeRuleReturnScope.h>
-
-#import <ANTLR/ANTLRTree.h>
-#import <ANTLR/ANTLRCommonTree.h>
-#import <ANTLR/ANTLRTreeAdaptor.h>
-#import <ANTLR/ANTLRCommonTreeAdaptor.h>
-#import <ANTLR/ANTLRTreeNodeStream.h>
-#import <ANTLR/ANTLRUnbufferedCommonTreeNodeStream.h>
-#import <ANTLR/ANTLRUnbufferedCommonTreeNodeStreamState.h>
-
-#import <ANTLR/ANTLRRewriteRuleSubtreeStream.h>
-#import <ANTLR/ANTLRRewriteRuleTokenStream.h>
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRBaseMapElement.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRBaseMapElement.h
deleted file mode 100644
index b9100ac..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRBaseMapElement.h
+++ /dev/null
@@ -1,54 +0,0 @@
-//
-//  ANTLRBaseMapElement.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/16/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRLinkBase.h"
-
-@interface ANTLRBaseMapElement : ANTLRLinkBase {
-    NSNumber *index;
-}
-
-@property (retain, getter=getIndex, setter=setIndex:) NSNumber *index;
-
-+ (id) newANTLRBaseMapElement;
-+ (id) newANTLRBaseMapElementWithIndex:(NSNumber *)anIdx;
-- (id) init;
-- (id) initWithAnIndex:(NSNumber *)anIdx;
-
-- (id) copyWithZone:(NSZone *)aZone;
-
-- (NSNumber *)getIndex;
-- (void)setIndex:(NSNumber *)anIdx;
-
-- (NSInteger)count;
-- (NSInteger)size;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRBaseRecognizer.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRBaseRecognizer.h
deleted file mode 100755
index 1a922bd..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRBaseRecognizer.h
+++ /dev/null
@@ -1,183 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-#import <Foundation/Foundation.h>
-
-#import "ANTLRIntStream.h"
-
-// This is an abstract superclass for lexers and parsers.
-
-#define ANTLR_MEMO_RULE_FAILED -2
-#define ANTLR_MEMO_RULE_UNKNOWN -1
-#define ANTLR_INITIAL_FOLLOW_STACK_SIZE 100
-
-#import "ANTLRMapElement.h"
-#import "ANTLRBitSet.h"
-#import "ANTLRToken.h"
-#import "ANTLRRecognizerSharedState.h"
-#import "ANTLRRecognitionException.h"
-#import "ANTLRMissingTokenException.h"
-#import "ANTLRMismatchedTokenException.h"
-#import "ANTLRMismatchedTreeNodeException.h"
-#import "ANTLRUnwantedTokenException.h"
-#import "ANTLRNoViableAltException.h"
-#import "ANTLREarlyExitException.h"
-#import "ANTLRMismatchedSetException.h"
-#import "ANTLRMismatchedNotSetException.h"
-#import "ANTLRFailedPredicateException.h"
-
-@interface ANTLRBaseRecognizer : NSObject {
-	ANTLRRecognizerSharedState *state;	// the state of this recognizer. Might be shared with other recognizers, e.g. in grammar import scenarios.
-	NSString *grammarFileName;			// where did the grammar come from. filled in by codegeneration
-//    BOOL failed;
-    NSString *sourceName;
-//    NSInteger numberOfSyntaxErrors;
-    NSArray *tokenNames;
-}
-
-@property (retain, getter=getState, setter=setState) ANTLRRecognizerSharedState *state;
-@property (retain, getter=getGrammarFileName, setter=setGrammarFileName) NSString *grammarFileName;
-//@property (assign, getter=getFailed, setter=setFailed) BOOL failed;
-@property (retain, getter=getTokenNames, setter=setTokenNames) NSArray *tokenNames;
-@property (retain, getter=getSourceName, setter=setSourceName) NSString *sourceName;
-//@property (assign, getter=getNumberOfSyntaxErrors, setter=setNumberOfSyntaxErrors) NSInteger numberOfSyntaxErrors;
-
-+ (void) initialize;
-
-+ (ANTLRBaseRecognizer *) newANTLRBaseRecognizer;
-+ (ANTLRBaseRecognizer *) newANTLRBaseRecognizerWithRuleLen:(NSInteger)aLen;
-+ (ANTLRBaseRecognizer *) newANTLRBaseRecognizer:(ANTLRRecognizerSharedState *)aState;
-
-+ (NSArray *)getTokenNames;
-+ (void)setTokenNames:(NSArray *)aTokNamArray;
-+ (void)setGrammarFileName:(NSString *)aFileName;
-
-- (id) init;
-- (id) initWithLen:(NSInteger)aLen;
-- (id) initWithState:(ANTLRRecognizerSharedState *)aState;
-
-- (void) dealloc;
-
-// simple accessors
-- (NSInteger) getBacktrackingLevel;
-- (void) setBacktrackingLevel:(NSInteger) level;
-
-- (BOOL) getFailed;
-- (void) setFailed: (BOOL) flag;
-
-- (ANTLRRecognizerSharedState *) getState;
-- (void) setState:(ANTLRRecognizerSharedState *) theState;
-
-// reset this recognizer - might be extended by codegeneration/grammar
-- (void) reset;
-
-/** Match needs to return the current input symbol, which gets put
- *  into the label for the associated token ref; e.g., x=ID.  Token
- *  and tree parsers need to return different objects. Rather than test
- *  for input stream type or change the IntStream interface, I use
- *  a simple method to ask the recognizer to tell me what the current
- *  input symbol is.
- * 
- *  This is ignored for lexers.
- */
-- (id) getInput;
-
-- (void)skip;
-
-// do actual matching of tokens/characters
-- (id) match:(id<ANTLRIntStream>)anInput TokenType:(NSInteger)ttype Follow:(ANTLRBitSet *)follow;
-- (void) matchAny:(id<ANTLRIntStream>)anInput;
-- (BOOL) mismatchIsUnwantedToken:(id<ANTLRIntStream>)anInput TokenType:(NSInteger) ttype;
-- (BOOL) mismatchIsMissingToken:(id<ANTLRIntStream>)anInput Follow:(ANTLRBitSet *)follow;
-
-// error reporting and recovery
-- (void) reportError:(ANTLRRecognitionException *)e;
-- (void) displayRecognitionError:(NSArray *)theTokNams Exception:(ANTLRRecognitionException *)e;
-- (NSString *)getErrorMessage:(ANTLRRecognitionException *)e TokenNames:(NSArray *)theTokNams;
-- (NSInteger) getNumberOfSyntaxErrors;
-- (NSString *)getErrorHeader:(ANTLRRecognitionException *)e;
-- (NSString *)getTokenErrorDisplay:(id<ANTLRToken>)t;
-- (void) emitErrorMessage:(NSString *)msg;
-- (void) recover:(id<ANTLRIntStream>)anInput Exception:(ANTLRRecognitionException *)e;
-
-// begin hooks for debugger
-- (void) beginResync;
-- (void) endResync;
-// end hooks for debugger
-
-// compute the bitsets necessary to do matching and recovery
-- (ANTLRBitSet *)computeErrorRecoverySet;
-- (ANTLRBitSet *)computeContextSensitiveRuleFOLLOW;
-- (ANTLRBitSet *)combineFollows:(BOOL) exact;
-
-- (id<ANTLRToken>) recoverFromMismatchedToken:(id<ANTLRIntStream>)anInput 
-                                    TokenType:(NSInteger)ttype 
-                                       Follow:(ANTLRBitSet *)follow;
-                                    
-- (id<ANTLRToken>)recoverFromMismatchedSet:(id<ANTLRIntStream>)anInput
-                                    Exception:(ANTLRRecognitionException *)e
-                                    Follow:(ANTLRBitSet *)follow;
-
-- (id) getCurrentInputSymbol:(id<ANTLRIntStream>)anInput;
-- (id) getMissingSymbol:(id<ANTLRIntStream>)anInput
-              Exception:(ANTLRRecognitionException *)e
-              TokenType:(NSInteger) expectedTokenType
-                Follow:(ANTLRBitSet *)follow;
-
-// helper methods for recovery. try to resync somewhere
-- (void) consumeUntilTType:(id<ANTLRIntStream>)anInput TokenType:(NSInteger)ttype;
-- (void) consumeUntilFollow:(id<ANTLRIntStream>)anInput Follow:(ANTLRBitSet *)bitSet;
-- (void) pushFollow:(ANTLRBitSet *)fset;
-- (ANTLRBitSet *)popFollow;
-
-// to be used by the debugger to do reporting. maybe hook in incremental stuff here, too.
-- (NSMutableArray *) getRuleInvocationStack;
-- (NSMutableArray *) getRuleInvocationStack:(ANTLRRecognitionException *)exception
-					             Recognizer:(NSString *)recognizerClassName;
-
-- (NSArray *) getTokenNames;
-- (NSString *)getGrammarFileName;
-- (NSString *)getSourceName;
-- (NSMutableArray *) toStrings:(NSArray *)tokens;
-// support for memoization
-- (NSInteger) getRuleMemoization:(NSInteger)ruleIndex StartIndex:(NSInteger)ruleStartIndex;
-- (BOOL) alreadyParsedRule:(id<ANTLRIntStream>)anInput RuleIndex:(NSInteger)ruleIndex;
-- (void) memoize:(id<ANTLRIntStream>)anInput
-	     RuleIndex:(NSInteger)ruleIndex
-	    StartIndex:(NSInteger)ruleStartIndex;
-- (NSInteger) getRuleMemoizationCacheSize;
-- (void)traceIn:(NSString *)ruleName Index:(NSInteger)ruleIndex Object:(id)inputSymbol;
-- (void)traceOut:(NSString *)ruleName Index:(NSInteger)ruleIndex Object:(id)inputSymbol;
-
-
-// support for syntactic predicates. these are called indirectly to support funky stuff in grammars,
-// like supplying selectors instead of writing code directly into the actions of the grammar.
-- (BOOL) evaluateSyntacticPredicate:(SEL)synpredFragment;
-// stream:(id<ANTLRIntStream>)anInput;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRBaseStack.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRBaseStack.h
deleted file mode 100644
index 5069031..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRBaseStack.h
+++ /dev/null
@@ -1,66 +0,0 @@
-//
-//  ANTLRBaseRecognizer.m
-//  ANTLR
-//
-//  Created by Alan Condit on 6/16/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRPtrBuffer.h"
-
-//#define GLOBAL_SCOPE       0
-//#define LOCAL_SCOPE        1
-#define HASHSIZE         101
-#define HBUFSIZE      0x2000
-
-@interface ANTLRBaseStack : ANTLRPtrBuffer {
-	//ANTLRRuleStack *fNext;
-    // TStringPool *fPool;
-    NSInteger LastHash;
-}
-
-//@property (copy) ANTLRRuleStack *fNext;
-@property (getter=getLastHash, setter=setLastHash) NSInteger LastHash;
-
-// Contruction/Destruction
-+ (ANTLRBaseStack *)newANTLRBaseStack;
-+ (ANTLRBaseStack *)newANTLRBaseStackWithLen:(NSInteger)cnt;
-- (id)init;
-- (id)initWithLen:(NSInteger)cnt;
-- (void)dealloc;
-
-// Instance Methods
-- (id) copyWithZone:(NSZone *)aZone;
-
-- (NSInteger)count;
-- (NSInteger)size;
-/* clear -- reinitialize the maplist array */
-
-- (NSInteger)getLastHash;
-- (void)setLastHash:(NSInteger)aVal;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRBaseTree.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRBaseTree.h
deleted file mode 100755
index 96513f8..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRBaseTree.h
+++ /dev/null
@@ -1,199 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import "ANTLRTree.h"
-
-@protocol ANTLRBaseTree <ANTLRTree>
-
-@property (retain, getter=getChildren, setter=setChildren) NSMutableArray *children;
-
-+ (id<ANTLRBaseTree>) newANTLRBaseTree;
-+ (id<ANTLRBaseTree>) newANTLRBaseTree:(id<ANTLRBaseTree>)node;
-
-- (id<ANTLRBaseTree>) init;
-- (id<ANTLRBaseTree>) initWith:(id<ANTLRTree>)node;
-
-- (id<ANTLRBaseTree>) getChild:(NSUInteger)i;
-- (NSMutableArray *)getChildren;
-- (void) setChildren:(NSMutableArray *)anArray;
-- (id<ANTLRBaseTree>)getFirstChildWithType:(NSInteger)type;
-- (NSUInteger) getChildCount;
-
-// Add t as a child to this node.  If t is null, do nothing.  If t
-//  is nil, add all children of t to this' children.
-
-- (void) addChild:(id<ANTLRTree>) tree;
-- (void) addChildren:(NSArray *) theChildren;
-//- (void) removeAllChildren;
-
-- (void) setChild:(NSInteger) i With:(id<ANTLRTree>)t;
-- (id) deleteChild:(NSInteger) i;
-- (NSMutableArray *) createChildrenList;
-- (void) replaceChildrenFrom:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id) t;
-// Indicates the node is a nil node but may still have children, meaning
-// the tree is a flat list.
-
-- (BOOL) isNil;
-- (NSInteger) getTokenStartIndex;
-- (void) setTokenStartIndex:(NSInteger) index;
-- (NSInteger) getTokenStopIndex;
-- (void) setTokenStopIndex:(NSInteger) index;
-
-- (void) freshenParentAndChildIndexes;
-- (void) freshenParentAndChildIndexes:(NSInteger) offset;
-- (void) sanityCheckParentAndChildIndexes;
-- (void) sanityCheckParentAndChildIndexes:(id<ANTLRTree>) parent At:(NSInteger) i;
-
-- (NSInteger) getChildIndex;
-- (void) setChildIndex:(NSInteger)i;
-
-- (id<ANTLRTree>)getAncestor:(NSInteger)ttype;
-- (NSMutableArray *)getAncestors;
-
-#pragma mark Copying
-- (id) copyWithZone:(NSZone *)aZone;	// the children themselves are not copied here!
-- (id) deepCopy;					// performs a deepCopyWithZone: with the default zone
-- (id) deepCopyWithZone:(NSZone *)aZone;
-
-#pragma mark Tree Parser support
-- (NSInteger) getType;
-- (NSString *) getText;
-// In case we don't have a token payload, what is the line for errors?
-- (NSInteger) getLine;
-- (NSInteger) getCharPositionInLine;
-
-
-#pragma mark Informational
-- (NSString *) treeDescription;
-- (NSString *) description;
-
-- (NSString *) toString;
-- (NSString *) toStringTree;
-
-@end
-
-@interface ANTLRBaseTree : NSObject <ANTLRTree>
-{
-	NSMutableArray *children;
-    NSException *anException;
-}
-
-@property (retain, getter=getChildren, setter=setChildren) NSMutableArray *children;
-
-+ (id<ANTLRBaseTree>) newANTLRBaseTree;
-+ (id<ANTLRBaseTree>) newANTLRBaseTree:(id<ANTLRBaseTree>)node;
-         
-- (id<ANTLRTree>) init;
-- (id<ANTLRBaseTree>) initWith:(id<ANTLRTree>)node;
-
-- (id<ANTLRBaseTree>) getChild:(NSUInteger)i;
-- (NSMutableArray *)getChildren;
-- (void) setChildren:(NSMutableArray *)anArray;
-- (id<ANTLRBaseTree>)getFirstChildWithType:(NSInteger)type;
-- (NSUInteger) getChildCount;
-
-//- (void) removeAllChildren;
-
-// Add t as a child to this node.  If t is null, do nothing.  If t
-//  is nil, add all children of t to this' children.
-
-- (void) addChild:(id<ANTLRTree>) tree;
-- (void) addChildren:(NSArray *) theChildren;
-
-- (void) setChild:(NSInteger) i With:(id<ANTLRTree>)t;
-- (id) deleteChild:(NSInteger) i;
-- (NSMutableArray *) createChildrenList;
-- (void) replaceChildrenFrom:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id) t;
-// Indicates the node is a nil node but may still have children, meaning
-	// the tree is a flat list.
-
-- (BOOL) isNil;
-- (NSInteger) getTokenStartIndex;
-- (void) setTokenStartIndex:(NSInteger) index;
-- (NSInteger) getTokenStopIndex;
-- (void) setTokenStopIndex:(NSInteger) index;
-
-- (void) freshenParentAndChildIndexes;
-- (void) freshenParentAndChildIndexes:(NSInteger) offset;
-- (void) sanityCheckParentAndChildIndexes;
-- (void) sanityCheckParentAndChildIndexes:(id<ANTLRTree>) parent At:(NSInteger) i;
-
-- (NSInteger) getChildIndex;
-- (void) setChildIndex:(NSInteger)i;
-
-- (BOOL) hasAncestor:(NSInteger) ttype;
-- (id<ANTLRTree>)getAncestor:(NSInteger)ttype;
-- (NSMutableArray *)getAncestors;
-
-- (id) copyWithZone:(NSZone *)aZone;
-- (id) deepCopy;					// performs a deepCopyWithZone: with the default zone
-- (id) deepCopyWithZone:(NSZone *)aZone;
-
-	// Return a token type; needed for tree parsing
-- (NSInteger) getType;
-- (NSString *) getText;
-
-	// In case we don't have a token payload, what is the line for errors?
-- (NSInteger) getLine;
-- (NSInteger) getCharPositionInLine;
-- (void) setCharPositionInLine:(NSInteger)pos;
-
-- (NSString *) treeDescription;
-- (NSString *) description;
-- (NSString *) toString;
-- (NSString *) toStringTree;
-
-@end
-
-@interface ANTLRTreeNavigationNode : ANTLRBaseTree {
-}
-- (id) copyWithZone:(NSZone *)aZone;
-@end
-
-@interface ANTLRTreeNavigationNodeDown : ANTLRTreeNavigationNode {
-}
-+ (ANTLRTreeNavigationNodeDown *) getNavigationNodeDown;
-- (NSInteger) tokenType;
-- (NSString *) description;
-@end
-
-@interface ANTLRTreeNavigationNodeUp : ANTLRTreeNavigationNode {
-}
-+ (ANTLRTreeNavigationNodeUp *) getNavigationNodeUp;
-- (NSInteger) tokenType;
-- (NSString *) description;
-@end
-
-@interface ANTLRTreeNavigationNodeEOF : ANTLRTreeNavigationNode {
-}
-+ (ANTLRTreeNavigationNodeEOF *) getNavigationNodeEOF;
-- (NSInteger) tokenType;
-- (NSString *) description;
-@end
-
-extern ANTLRTreeNavigationNodeDown *navigationNodeDown;
-extern ANTLRTreeNavigationNodeUp *navigationNodeUp;
-extern ANTLRTreeNavigationNodeEOF *navigationNodeEOF;
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRBaseTreeAdaptor.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRBaseTreeAdaptor.h
deleted file mode 100644
index b4f8dad..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRBaseTreeAdaptor.h
+++ /dev/null
@@ -1,163 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTreeAdaptor.h"
-#import "ANTLRCommonErrorNode.h"
-#import "ANTLRUniqueIDMap.h"
-
-@interface ANTLRBaseTreeAdaptor : NSObject <ANTLRTreeAdaptor, NSCopying> {
-    ANTLRUniqueIDMap *treeToUniqueIDMap;
-	NSInteger uniqueNodeID;
-}
-
-@property (retain, getter=getTreeToUniqueIDMap, setter=setTreeToUniqueIDMap:) ANTLRUniqueIDMap *treeToUniqueIDMap;
-@property (getter=getUniqueNodeID, setter=setUniqueNodeID:) NSInteger uniqueNodeID;
-
-+ (id<ANTLRTreeAdaptor>) newEmptyTree;
-
-- (id) init;
-
-- (id) copyWithZone:(NSZone *)aZone;
-
-- (id) emptyNode;
-
-- (ANTLRUniqueIDMap *)getTreeToUniqueIDMap;
-- (void) setTreeToUniqueIDMap:(ANTLRUniqueIDMap *)aMapNode;
-
-- (NSInteger)getUniqueID;
-- (void) setUniqueNodeID:(NSInteger)aUniqueNodeID;
-
-/** create tree node that holds the start and stop tokens associated
- *  with an error.
- *
- *  If you specify your own kind of tree nodes, you will likely have to
- *  override this method. CommonTree returns Token.INVALID_TOKEN_TYPE
- *  if no token payload but you might have to set token type for diff
- *  node type.
- *
- *  You don't have to subclass CommonErrorNode; you will likely need to
- *  subclass your own tree node class to avoid class cast exception.
- */
-- (id) errorNode:(id<ANTLRTokenStream>)anInput
-            From:(id<ANTLRToken>)startToken
-              To:(id<ANTLRToken>)stopToken
-       Exception:(NSException *) e;
-
-- (BOOL) isNil:(id<ANTLRTree>) aTree;
-
-- (id<ANTLRTree>)dupTree:(id<ANTLRTree>)aTree;
-/** This is generic in the sense that it will work with any kind of
- *  tree (not just Tree interface).  It invokes the adaptor routines
- *  not the tree node routines to do the construction.  
- */
-- (id<ANTLRTree>)dupTree:(id<ANTLRTree>)aTree Parent:(id<ANTLRTree>)parent;
-- (id<ANTLRTree>)dupNode:(id<ANTLRTree>)aNode;
-/** Add a child to the tree t.  If child is a flat tree (a list), make all
- *  in list children of t.  Warning: if t has no children, but child does
- *  and child isNil then you can decide it is ok to move children to t via
- *  t.children = child.children; i.e., without copying the array.  Just
- *  make sure that this is consistent with have the user will build
- *  ASTs.
- */
-- (void) addChild:(id<ANTLRTree>)aChild toTree:(id<ANTLRTree>)aTree;
-
-/** If oldRoot is a nil root, just copy or move the children to newRoot.
- *  If not a nil root, make oldRoot a child of newRoot.
- *
- *    old=^(nil a b c), new=r yields ^(r a b c)
- *    old=^(a b c), new=r yields ^(r ^(a b c))
- *
- *  If newRoot is a nil-rooted single child tree, use the single
- *  child as the new root node.
- *
- *    old=^(nil a b c), new=^(nil r) yields ^(r a b c)
- *    old=^(a b c), new=^(nil r) yields ^(r ^(a b c))
- *
- *  If oldRoot was null, it's ok, just return newRoot (even if isNil).
- *
- *    old=null, new=r yields r
- *    old=null, new=^(nil r) yields ^(nil r)
- *
- *  Return newRoot.  Throw an exception if newRoot is not a
- *  simple node or nil root with a single child node--it must be a root
- *  node.  If newRoot is ^(nil x) return x as newRoot.
- *
- *  Be advised that it's ok for newRoot to point at oldRoot's
- *  children; i.e., you don't have to copy the list.  We are
- *  constructing these nodes so we should have this control for
- *  efficiency.
- */
-- (id<ANTLRTree>)becomeRoot:(id<ANTLRTree>)aNewRoot old:(id<ANTLRTree>)oldRoot;
-
-/** Transform ^(nil x) to x and nil to null */
-- (id<ANTLRTree>)rulePostProcessing:(id<ANTLRTree>)aRoot;
-
-- (id<ANTLRTree>)becomeRootfromToken:(id<ANTLRToken>)aNewRoot old:(id<ANTLRTree>)oldRoot;
-
-- (id<ANTLRTree>)createTree:(NSInteger)aTType With:(id<ANTLRToken>)aFromToken;
-
-- (id<ANTLRTree>)createTree:(NSInteger)aTType FromToken:(id<ANTLRToken>)aFromToken Text:(NSString *)theText;
-
-- (id<ANTLRTree>)createTree:(NSInteger)aTType Text:(NSString *)theText;
-
-- (NSInteger) getType:(id<ANTLRTree>)aTree;
-
-- (void) setType:(id<ANTLRTree>)aTree Type:(NSInteger)type;
-
-- (NSString *)getText:(id<ANTLRTree>)aTree;
-
-- (void) setText:(id<ANTLRTree>)aTree Text:(NSString *)theText;
-
-- (id<ANTLRTree>) getChild:(id<ANTLRTree>)aTree At:(NSInteger)i;
-
-- (void) setChild:(id<ANTLRTree>)aTree At:(NSInteger)index Child:(id<ANTLRTree>)aChild;
-
-- (id<ANTLRTree>) deleteChild:(id<ANTLRTree>)aTree Index:(NSInteger)index;
-
-- (NSInteger) getChildCount:(id<ANTLRTree>)aTree;
-
-- (NSInteger) getUniqueID:(id<ANTLRTree>)node;
-
-/** Tell me how to create a token for use with imaginary token nodes.
- *  For example, there is probably no input symbol associated with imaginary
- *  token DECL, but you need to create it as a payload or whatever for
- *  the DECL node as in ^(DECL type ID).
- *
- *  This is a variant of createToken where the new token is derived from
- *  an actual real input token.  Typically this is for converting '{'
- *  tokens to BLOCK etc...  You'll see
- *
- *    r : lc='{' ID+ '}' -> ^(BLOCK[$lc] ID+) ;
- *
- *  If you care what the token payload objects' type is, you should
- *  override this method and any other createToken variant.
- */
-- (id<ANTLRToken>)createToken:(NSInteger)aTType Text:(NSString *)theText;
-
-- (id<ANTLRToken>)createToken:(id<ANTLRToken>)aFromToken;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRBitSet.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRBitSet.h
deleted file mode 100755
index a1be117..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRBitSet.h
+++ /dev/null
@@ -1,93 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-#import <CoreFoundation/CoreFoundation.h>
-#import "ANTLRToken.h"
-
-#define BITS (sizeof(NSUInteger) * 8)
-#define LOG_BITS ((sizeof(NSUInteger)==8)?6:5)
-
-// A simple wrapper around CoreFoundation bit vectors to shield the rest of the implementation
-// from the specifics of the BitVector initialization and query functions.
-// This is fast, so there is no need to reinvent the wheel just yet.
-
-@interface ANTLRBitSet : NSObject < NSMutableCopying > {
-	CFMutableBitVectorRef bitVector;
-}
-
-#pragma mark Class Methods
-
-+ (ANTLRBitSet *) newANTLRBitSet;
-+ (ANTLRBitSet *) newANTLRBitSetWithType:(ANTLRTokenType)type;
-/** Construct a ANTLRBitSet given the size
- * @param nbits The size of the ANTLRBitSet in bits
- */
-+ (ANTLRBitSet *) newANTLRBitSetWithNBits:(NSUInteger)nbits;
-+ (ANTLRBitSet *) newANTLRBitSetWithArray:(NSMutableArray *)types;
-+ (ANTLRBitSet *) newANTLRBitSetWithBits:(const unsigned long long *)theBits Count:(NSUInteger)longCount;
-
-+ (ANTLRBitSet *) of:(NSUInteger)el;
-+ (ANTLRBitSet *) of:(NSUInteger)a And2:(NSUInteger)b;
-+ (ANTLRBitSet *) of:(NSUInteger)a And2:(NSUInteger)b And3:(NSUInteger)c;
-+ (ANTLRBitSet *) of:(NSUInteger)a And2:(NSUInteger)b And3:(NSUInteger)c And4:(NSUInteger)d;
-
-#pragma mark Initializer
-
-- (ANTLRBitSet *) init;
-- (ANTLRBitSet *) initWithType:(ANTLRTokenType)type;
-- (ANTLRBitSet *) initWithNBits:(NSUInteger)nbits;
-- (ANTLRBitSet *) initWithBitVector:(CFMutableBitVectorRef)theBitVector;
-- (ANTLRBitSet *) initWithBits:(const unsigned long long const*)theBits Count:(NSUInteger)theCount;
-- (ANTLRBitSet *) initWithArrayOfBits:(NSArray *)theArray;
-
-#pragma mark Operations
-- (ANTLRBitSet *) or:(ANTLRBitSet *) aBitSet;
-- (void) orInPlace:(ANTLRBitSet *) aBitSet;
-- (void) add:(NSUInteger) bit;
-- (void) remove:(NSUInteger) bit;
-- (void) setAllBits:(BOOL) aState;
-
-- (NSInteger) numBits;
-- (NSUInteger) size;
-- (void) setSize:(NSUInteger) noOfWords;
-
-#pragma mark Informational
-- (unsigned long long) bitMask:(NSUInteger) bitNumber;
-- (BOOL) member:(NSUInteger)bitNumber;
-- (BOOL) isNil;
-- (NSString *) toString;
-- (NSString *) description;
-
-#pragma mark NSCopying support
-
-- (id) mutableCopyWithZone:(NSZone *) theZone;
-
-
-//private
-- (CFMutableBitVectorRef) _bitVector;
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRBufferedTokenStream.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRBufferedTokenStream.h
deleted file mode 100644
index 198a6f7..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRBufferedTokenStream.h
+++ /dev/null
@@ -1,98 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTokenStream.h"
-#import "ANTLRTokenSource.h"
-#import "ANTLRBitSet.h"
-
-@interface ANTLRBufferedTokenStream : NSObject <ANTLRTokenStream> 
-{
-id<ANTLRTokenSource> tokenSource;
-    
-    /** Record every single token pulled from the source so we can reproduce
-     *  chunks of it later.  The buffer in LookaheadStream overlaps sometimes
-     *  as its moving window moves through the input.  This list captures
-     *  everything so we can access complete input text.
-     */
-NSMutableArray *tokens;
-    
-    /** Track the last mark() call result value for use in rewind(). */
-NSInteger lastMarker;
-    
-    /** The index into the tokens list of the current token (next token
-     *  to consume).  tokens[p] should be LT(1).  p=-1 indicates need
-     *  to initialize with first token.  The ctor doesn't get a token.
-     *  First call to LT(1) or whatever gets the first token and sets p=0;
-     */
-NSInteger p;
-    
-NSInteger range; // how deep have we gone?
-    
-}
-@property (retain, getter=getTokenSource,setter=setTokenSource) id<ANTLRTokenSource> tokenSource;
-@property (retain, getter=getTokens,setter=setTokens) NSMutableArray *tokens;
-@property (assign, getter=getLastMarker,setter=setLastMarker) NSInteger lastMarker;
-@property (assign, getter=getIndex,setter=setIndex) NSInteger p;
-@property (assign, getter=getRange,setter=setRange) NSInteger range;
-
-+ (ANTLRBufferedTokenStream *) newANTLRBufferedTokenStream;
-+ (ANTLRBufferedTokenStream *) newANTLRBufferedTokenStreamWith:(id<ANTLRTokenSource>)aSource;
-- (id) initWithSource:(id<ANTLRTokenSource>)aSource;
-- (id) copyWithZone:(NSZone *)aZone;
-- (NSInteger) getIndex;
-- (void) setIndex:(NSInteger)index;
-- (NSInteger) getRange;
-- (void) setRange:(NSInteger)anInt;
-- (NSInteger) mark;
-- (void) release:(NSInteger) marker;
-- (void) rewind:(NSInteger) marker;
-- (void) rewind;
-- (void) reset;
-- (void) seek:(NSInteger) index;
-- (NSInteger) size;
-- (void) consume;
-- (void) sync:(NSInteger) i;
-- (void) fetch:(NSInteger) n;
-- (id<ANTLRToken>) getToken:(NSInteger) i;
-- (NSMutableArray *)getFrom:(NSInteger)startIndex To:(NSInteger) stopIndex;
-- (NSInteger) LA:(NSInteger)k;
-- (id<ANTLRToken>) LT:(NSInteger) k;
-- (id<ANTLRToken>) LB:(NSInteger) k;
-- (void) setup;
-- (id<ANTLRTokenSource>) getTokenSource;
-- (void) setTokenSource:(id<ANTLRTokenSource>) aTokenSource;
-- (NSMutableArray *)getTokens;
-- (NSString *) getSourceName;
-- (NSMutableArray *)getTokensFrom:(NSInteger)startIndex To:(NSInteger)stopIndex;
-- (NSMutableArray *)getTokensFrom:(NSInteger)startIndex To:(NSInteger)stopIndex With:(ANTLRBitSet *)types;
-- (NSMutableArray *)getTokensFrom:(NSInteger)startIndex To:(NSInteger)stopIndex WithList:(NSMutableArray *)types;
-- (NSMutableArray *)getTokensFrom:(NSInteger)startIndex To:(NSInteger)stopIndex WithType:(NSInteger)ttype;
-- (NSString *) toStringFromStart:(NSInteger)startIndex ToEnd:(NSInteger)stopIndex;
-- (NSString *) toStringFromToken:(id<ANTLRToken>)startIndex ToToken:(id<ANTLRToken>)stopIndex;
-- (void) fill;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRBufferedTreeNodeStream.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRBufferedTreeNodeStream.h
deleted file mode 100644
index 8618ea2..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRBufferedTreeNodeStream.h
+++ /dev/null
@@ -1,156 +0,0 @@
-//
-//  ANTLRBufferedTreeNodeStream.h
-//  ANTLR
-//
-// [The "BSD licence"]
-// Copyright (c) 2010 Ian Michell 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTree.h"
-#import "ANTLRCommonTreeAdaptor.h"
-#import "ANTLRTokenStream.h"
-#import "ANTLRCommonTreeNodeStream.h"
-#import "ANTLRLookaheadStream.h"
-#import "ANTLRTreeIterator.h"
-#import "ANTLRIntArray.h"
-
-#define DEFAULT_INITIAL_BUFFER_SIZE 100
-#define INITIAL_CALL_STACK_SIZE 10
-
-#ifdef DONTUSENOMO
-@interface ANTLRStreamIterator : ANTLRTreeIterator
-{
-    NSInteger idx;
-    ANTLRBufferedTreeNodeStream input;
-    NSMutableArray *nodes;
-}
-
-+ (id) newANTLRStreamIterator:(ANTLRBufferedTreeNodeStream *) theStream;
-
-- (id) initWithStream:(ANTLRBufferedTreeNodeStream *) theStream;
-
-- (BOOL) hasNext;
-- (id) next;
-- (void) remove;
-@end
-#endif
-
-@interface ANTLRBufferedTreeNodeStream : NSObject <ANTLRTreeNodeStream> 
-{
-	id<ANTLRTree> up;
-	id<ANTLRTree> down;
-	id<ANTLRTree> eof;
-	
-	NSMutableArray *nodes;
-	
-	id<ANTLRTree> root; // root
-	
-	id<ANTLRTokenStream> tokens;
-	ANTLRCommonTreeAdaptor *adaptor;
-	
-	BOOL uniqueNavigationNodes;
-	NSInteger p;
-	NSInteger lastMarker;
-	ANTLRIntArray *calls;
-	
-	NSEnumerator *e;
-    id currentSymbol;
-	
-}
-
-@property (retain, getter=getUp, setter=setUp:) id<ANTLRTree> up;
-@property (retain, getter=getDown, setter=setDown:) id<ANTLRTree> down;
-@property (retain, getter=getEof, setter=setEof:) id<ANTLRTree> eof;
-@property (retain, getter=getNodes, setter=setNodes:) NSMutableArray *nodes;
-@property (retain, getter=getTreeSource, setter=setTreeSource:) id<ANTLRTree> root;
-@property (retain, getter=getTokenStream, setter=setTokenStream:) id<ANTLRTokenStream> tokens;
-@property (retain, getter=getAdaptor, setter=setAdaptor:) ANTLRCommonTreeAdaptor *adaptor;
-@property (assign, getter=getUniqueNavigationNodes, setter=setUniqueNavigationNodes:) BOOL uniqueNavigationNodes;
-@property (assign, getter=getIndex, setter=setIndex:) NSInteger p;
-@property (assign, getter=getLastMarker, setter=setLastMarker:) NSInteger lastMarker;
-@property (retain, getter=getCalls, setter=setCalls:) ANTLRIntArray *calls;
-@property (retain, getter=getEnum, setter=setEnum:) NSEnumerator *e;
-@property (retain, getter=getCurrentSymbol, setter=setCurrentSymbol:) id currentSymbol;
-
-+ (ANTLRBufferedTreeNodeStream *) newANTLRBufferedTreeNodeStream:(id<ANTLRTree>)tree;
-+ (ANTLRBufferedTreeNodeStream *) newANTLRBufferedTreeNodeStream:(id<ANTLRTreeAdaptor>)adaptor Tree:(id<ANTLRTree>)tree;
-+ (ANTLRBufferedTreeNodeStream *) newANTLRBufferedTreeNodeStream:(id<ANTLRTreeAdaptor>)adaptor Tree:(id<ANTLRTree>)tree withBufferSize:(NSInteger)initialBufferSize;
-
-#pragma mark Constructor
-- (id) initWithTree:(id<ANTLRTree>)tree;
-- (id) initWithTreeAdaptor:(ANTLRCommonTreeAdaptor *)anAdaptor Tree:(id<ANTLRTree>)tree;
-- (id) initWithTreeAdaptor:(ANTLRCommonTreeAdaptor *)anAdaptor Tree:(id<ANTLRTree>)tree WithBufferSize:(NSInteger)bufferSize;
-
-- (id) copyWithZone:(NSZone *)aZone;
-
-// protected methods. DO NOT USE
-#pragma mark Protected Methods
-- (void) fillBuffer;
-- (void) fillBufferWithTree:(id<ANTLRTree>) tree;
-- (NSInteger) getNodeIndex:(id<ANTLRTree>) node;
-- (void) addNavigationNode:(NSInteger) type;
-- (id) getNode:(NSInteger) i;
-- (id) LT:(NSInteger) k;
-- (id) getCurrentSymbol;
-- (id) LB:(NSInteger) i;
-#pragma mark General Methods
-- (NSString *) getSourceName;
-
-- (id<ANTLRTokenStream>) getTokenStream;
-- (void) setTokenStream:(id<ANTLRTokenStream>) tokens;
-- (id<ANTLRTreeAdaptor>) getTreeAdaptor;
-- (void) setTreeAdaptor:(id<ANTLRTreeAdaptor>) anAdaptor;
-
-- (BOOL)getUniqueNavigationNodes;
-- (void) setUniqueNavigationNodes:(BOOL)aVal;
-
-- (void) consume;
-- (NSInteger) LA:(NSInteger) i;
-- (NSInteger) mark;
-- (void) release:(NSInteger) marker;
-- (NSInteger) getIndex;
-- (void) setIndex:(NSInteger) idx;
-- (void) rewind:(NSInteger) marker;
-- (void) rewind;
-- (void) seek:(NSInteger) idx;
-
-- (void) push:(NSInteger) i;
-- (NSInteger) pop;
-
-- (void) reset;
-- (NSUInteger) count;
-- (NSEnumerator *) objectEnumerator;
-- (void) replaceChildren:(id)parent From:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id) t;
-
-- (NSString *) toTokenTypeString;
-- (NSString *) toTokenString:(NSInteger)aStart ToEnd:(NSInteger)aStop;
-- (NSString *) toStringFromNode:(id)aStart ToNode:(id)aStop;
-
-// getters and setters
-- (NSMutableArray *) getNodes;
-- (id<ANTLRTree>) getEof;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRCharStream.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRCharStream.h
deleted file mode 100755
index 379734b..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRCharStream.h
+++ /dev/null
@@ -1,55 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import "ANTLRIntStream.h"
-
-#define	ANTLRCharStreamEOF -1
-
-
-@protocol ANTLRCharStream < ANTLRIntStream >
-
-- (NSString *) substringWithRange:(NSRange) theRange;
-
-/** Get the ith character of lookahead.  This is the same usually as
- *  LA(i).  This will be used for labels in the generated
- *  lexer code.  I'd prefer to return a char here type-wise, but it's
- *  probably better to be 32-bit clean and be consistent with LA.
- */
-- (NSInteger)LT:(NSInteger) i;
-
-// ANTLR tracks the line information automatically
-- (NSInteger) getLine;
-
-// Because this stream can rewind, we need to be able to reset the line
-- (void) setLine:(NSInteger) theLine;
-
-// The index of the character relative to the beginning of the line 0..n-1
-- (NSInteger) getCharPositionInLine;
-
-- (void) setCharPositionInLine:(NSInteger) thePos;
-
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRCharStreamState.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRCharStreamState.h
deleted file mode 100644
index 2787c76..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRCharStreamState.h
+++ /dev/null
@@ -1,58 +0,0 @@
-//
-//  ANTLRCharStreamState.h
-//  ANTLR
-//
-// [The "BSD licence"]
-// Copyright (c)  2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-
-
-@interface ANTLRCharStreamState : NSObject
-{
-NSInteger p;
-NSInteger line;
-NSInteger charPositionInLine;
-}
-
-@property (getter=getP,setter=setP:) NSInteger p;
-@property (getter=getLine,setter=setLine:) NSInteger line;
-@property (getter=getCharPositionInLine,setter=setCharPositionInLine:) NSInteger charPositionInLine;
-
-+ newANTLRCharStreamState;
-
-- (id) init;
-
-- (NSInteger) getP;
-- (void) setP: (NSInteger) anIndex;
-
-- (NSInteger) getLine;
-- (void) setLine: (NSInteger) aLine;
-
-- (NSInteger) getCharPositionInLine;
-- (void) setCharPositionInLine:(NSInteger)aCharPositionInLine;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRCommonErrorNode.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRCommonErrorNode.h
deleted file mode 100644
index 79badc1..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRCommonErrorNode.h
+++ /dev/null
@@ -1,63 +0,0 @@
-//
-//  ANTLRCommonErrorNode.h
-//  ANTLR
-//
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRCommonTree.h"
-#import "ANTLRTokenStream.h"
-//#import "ANTLRIntStream.h"
-//#import "ANTLRToken.h"
-#import "ANTLRUnWantedTokenException.h"
-
-@interface ANTLRCommonErrorNode : ANTLRCommonTree
-{
-id<ANTLRIntStream> input;
-id<ANTLRToken> startToken;
-id<ANTLRToken> stopToken;
-ANTLRRecognitionException *trappedException;
-}
-
-+ (id) newANTLRCommonErrorNode:(id<ANTLRTokenStream>)anInput
-                  From:(id<ANTLRToken>)startToken
-                    To:(id<ANTLRToken>)stopToken
-                     Exception:(ANTLRRecognitionException *) e;
-
-- (id) initWithInput:(id<ANTLRTokenStream>)anInput
-                From:(id<ANTLRToken>)startToken
-                  To:(id<ANTLRToken>)stopToken
-           Exception:(ANTLRRecognitionException *) e;
-- (BOOL) isNil;
-
-- (NSInteger) getType;
-
-- (NSString *) getText;
-
-- (NSString *) toString;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRCommonToken.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRCommonToken.h
deleted file mode 100755
index 8662378..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRCommonToken.h
+++ /dev/null
@@ -1,105 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRToken.h"
-#import "ANTLRCharStream.h"
-
-@interface ANTLRCommonToken : NSObject < ANTLRToken > {
-	NSString *text;
-	NSInteger type;
-	// information about the Token's position in the input stream
-	NSUInteger line;
-	NSUInteger charPositionInLine;
-	NSUInteger channel;
-	// this token's position in the TokenStream
-	NSUInteger index;
-	
-	// indices into the CharStream to avoid copying the text
-	// can manually override the text by using -setText:
-	NSUInteger startIndex;
-	NSUInteger stopIndex;
-	// the actual input stream this token was found in
-	id<ANTLRCharStream> input;
-}
-
-@property (retain, getter=getText, setter=setText:) NSString *text;
-@property (assign, getter=getType, setter=setType:) NSInteger type;
-@property (assign, getter=getLine, setter=setLine:) NSUInteger line;
-@property (assign, getter=getCharPositionInLine, setter=setCharPositionInLine:) NSUInteger charPositionInLine;
-@property (assign, getter=getChannel, setter=setChannel:) NSUInteger channel;
-@property (assign, getter=getTokenIndex, setter=setTokenIndex:) NSUInteger index;
-@property (assign, getter=getStart, setter=setStart:) NSUInteger startIndex;
-@property (assign, getter=getStop, setter=setStop:) NSUInteger stopIndex;
-@property (retain, getter=getInput, setter=setInput:) id<ANTLRCharStream> input;
-
-+ (void) initialize;
-+ (ANTLRCommonToken *) newANTLRCommonToken;
-+ (ANTLRCommonToken *) newANTLRCommonToken:(id<ANTLRCharStream>)anInput
-                                      Type:(NSInteger)aTType
-                                   Channel:(NSInteger)aChannel
-                                     Start:(NSInteger)aStart
-                                      Stop:(NSInteger)aStop;
-+ (ANTLRCommonToken *) newANTLRCommonToken:(ANTLRTokenType)aType;
-+ (id<ANTLRToken>) newANTLRCommonToken:(NSInteger)tokenType Text:(NSString *)tokenText;
-+ (id<ANTLRToken>) newANTLRCommonTokenWithToken:(id<ANTLRToken>)fromToken;
-+ (id<ANTLRToken>) eofToken;
-+ (id<ANTLRToken>) skipToken;
-+ (id<ANTLRToken>) invalidToken;
-+ (ANTLRTokenChannel) defaultChannel;
-
-// designated initializer. This is used as the default way to initialize a Token in the generated code.
-- (ANTLRCommonToken *) init;
-- (ANTLRCommonToken *) initWithInput:(id<ANTLRCharStream>)anInput
-                                Type:(NSInteger)aTType
-                             Channel:(NSInteger)aChannel
-                               Start:(NSInteger)theStart
-                                Stop:(NSInteger)theStop;
-- (ANTLRCommonToken *) initWithToken:(ANTLRCommonToken *)aToken;
-- (ANTLRCommonToken *) initWithType:(ANTLRTokenType)aType;
-- (ANTLRCommonToken *) initWithType:(ANTLRTokenType)aTType Text:(NSString *)tokenText;
-
-- (id<ANTLRCharStream>) getInput;
-- (void) setInput: (id<ANTLRCharStream>) anInput;
-
-- (NSUInteger) getStart;
-- (void) setStart: (NSUInteger) aStart;
-
-- (NSUInteger) getStop;
-- (void) setStop: (NSUInteger) aStop;
-
-// the index of this Token into the TokenStream
-- (NSUInteger) getTokenIndex;
-- (void) setTokenIndex: (NSUInteger) aTokenIndex;
-
-// conform to NSCopying
-- (id) copyWithZone:(NSZone *)theZone;
-
-- (NSString *) description;
-- (NSString *) toString;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRCommonTokenStream.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRCommonTokenStream.h
deleted file mode 100755
index 59f9d5e..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRCommonTokenStream.h
+++ /dev/null
@@ -1,90 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTokenStream.h"
-#import "ANTLRToken.h"
-#import "ANTLRCommonToken.h"
-#import "ANTLRTokenSource.h"
-#import "ANTLRBitSet.h"
-#import "ANTLRBufferedTokenStream.h"
-
-@interface ANTLRCommonTokenStream : ANTLRBufferedTokenStream < ANTLRTokenStream >
-{
-	NSMutableDictionary *channelOverride;
-	NSInteger channel;
-}
-
-@property (retain, getter=getChannelOverride,setter=setChannelOverride) NSMutableDictionary *channelOverride;
-@property (assign, getter=getChannel,setter=setChannel) NSInteger channel;
-
-+ (ANTLRCommonTokenStream *)newANTLRCommonTokenStream;
-+ (ANTLRCommonTokenStream *)newANTLRCommonTokenStreamWithTokenSource:(id<ANTLRTokenSource>)theTokenSource;
-+ (ANTLRCommonTokenStream *)newANTLRCommonTokenStreamWithTokenSource:(id<ANTLRTokenSource>)theTokenSource
-                                                               Channel:(NSInteger)aChannel;
-
-- (id) init;
-- (id) initWithTokenSource:(id<ANTLRTokenSource>)theTokenSource;
-- (id) initWithTokenSource:(id<ANTLRTokenSource>)theTokenSource Channel:(NSInteger)aChannel;
-
-- (id<ANTLRTokenSource>) getTokenSource;
-- (void) setTokenSource: (id<ANTLRTokenSource>) aTokenSource;
-
-- (void) consume;
-- (id<ANTLRToken>) LT:(NSInteger)k;
-- (id<ANTLRToken>) LB:(NSInteger)k;
-
-- (NSInteger) skipOffChannelTokens:(NSInteger) i;
-- (NSInteger) skipOffChannelTokensReverse:(NSInteger) i;
-
-- (void)setup;
-
-- (NSArray *) tokensInRange:(NSRange)aRange;
-- (NSArray *) tokensInRange:(NSRange)aRange inBitSet:(ANTLRBitSet *)aBitSet;
-- (NSArray *) tokensInRange:(NSRange)aRange withTypes:(NSArray *)tokenTypes;
-- (NSArray *) tokensInRange:(NSRange)aRange withType:(NSInteger)tokenType;
-
-- (id<ANTLRToken>) getToken:(NSInteger)i;
-
-- (NSInteger) size;
-- (NSInteger) getIndex;
-- (void) rewind;
-- (void) rewind:(NSInteger)marker;
-- (void) seek:(NSInteger)index;
-
-- (NSString *) toString;
-- (NSString *) toStringFromStart:(NSInteger)startIndex ToEnd:(NSInteger)stopIndex;
-- (NSString *) toStringFromToken:(id<ANTLRToken>)startToken ToToken:(id<ANTLRToken>)stopToken;
-
-- (id) copyWithZone:(NSZone *)aZone;
-
-- (NSInteger)getChannel;
-- (void)setChannel:(NSInteger)aChannel;
-
-- (NSMutableDictionary *)getChannelOverride;
-- (void)setChannelOverride:(NSMutableDictionary *)anOverride;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRCommonTree.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRCommonTree.h
deleted file mode 100755
index 0966051..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRCommonTree.h
+++ /dev/null
@@ -1,88 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRCommonToken.h"
-#import "ANTLRBaseTree.h"
-
-@interface ANTLRCommonTree : ANTLRBaseTree <ANTLRTree> {
-	ANTLRCommonToken *token;
-	NSInteger startIndex;
-	NSInteger stopIndex;
-    ANTLRCommonTree *parent;
-    NSInteger childIndex;
-}
-
-@property (retain, getter=getANTLRCommonToken, setter=setANTLRCommonToken) ANTLRCommonToken *token;
-@property (assign, getter=getTokenStartIndex, setter=setTokenStartIndex) NSInteger startIndex;
-@property (assign, getter=getTokenStopIndex, setter=setTokenStopIndex) NSInteger stopIndex;
-@property (retain, getter=getParent, setter=setParent:) ANTLRCommonTree *parent;
-@property (assign, getter=getChildIndex, setter=setChildIndex) NSInteger childIndex;
-
-+ (ANTLRCommonTree *) invalidNode;
-+ (ANTLRCommonTree *) newANTLRCommonTree;
-+ (ANTLRCommonTree *) newANTLRCommonTreeWithTree:(ANTLRCommonTree *)aTree;
-+ (ANTLRCommonTree *) newANTLRCommonTreeWithToken:(ANTLRCommonToken *)aToken;
-+ (ANTLRCommonTree *) newANTLRCommonTreeWithTokenType:(NSInteger)tokenType;
-+ (ANTLRCommonTree *) newANTLRCommonTreeWithTokenType:(NSInteger)aTType Text:(NSString *)theText;
-#ifdef DONTUSEYET
-+ (id<ANTLRTree>) newANTLRCommonTreeWithTokenType:(NSInteger)tokenType;
-+ (id<ANTLRTree>) newANTLRCommonTreeWithToken:(id<ANTLRToken>)fromToken TokenType:(NSInteger)tokenType;
-+ (id<ANTLRTree>) newANTLRCommonTreeWithToken:(id<ANTLRToken>)fromToken TokenType:(NSInteger)tokenType Text:(NSString *)tokenText;
-+ (id<ANTLRTree>) newANTLRCommonTreeWithToken:(id<ANTLRToken>)fromToken Text:(NSString *)tokenText;
-#endif
-
-- (id) init;
-- (id) initWithTreeNode:(ANTLRCommonTree *)aNode;
-- (id) initWithToken:(ANTLRCommonToken *)aToken;
-- (id) initWithTokenType:(NSInteger)aTokenType;
-- (id) initWithTokenType:(NSInteger)aTokenType Text:(NSString *)theText;
-
-- (id<ANTLRTree>) copyWithZone:(NSZone *)aZone;
-
-- (BOOL) isNil;
-
-- (ANTLRCommonToken *) getToken;
-- (void) setToken:(ANTLRCommonToken *)aToken;
-- (id<ANTLRTree>) dupNode;
-- (NSInteger) getType;
-- (NSString *) getText;
-- (NSUInteger) getLine;
-- (NSUInteger) getCharPositionInLine;
-- (ANTLRCommonTree *) getParent;
-- (void) setParent:(ANTLRCommonTree *) t;
-
-#ifdef DONTUSENOMO
-- (NSString *) treeDescription;
-#endif
-- (NSString *) description;
-- (void) setUnknownTokenBoundaries;
-- (NSInteger) getTokenStartIndex;
-- (void) setTokenStartIndex: (NSInteger) aStartIndex;
-- (NSInteger) getTokenStopIndex;
-- (void) setTokenStopIndex: (NSInteger) aStopIndex;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRCommonTreeAdaptor.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRCommonTreeAdaptor.h
deleted file mode 100755
index 53287e6..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRCommonTreeAdaptor.h
+++ /dev/null
@@ -1,62 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTree.h"
-#import "ANTLRCommonToken.h"
-#import "ANTLRCommonTree.h"
-#import "ANTLRBaseTreeAdaptor.h"
-
-@interface ANTLRCommonTreeAdaptor : ANTLRBaseTreeAdaptor {
-}
-
-+ (id<ANTLRTree>) newEmptyTree;
-+ (ANTLRCommonTreeAdaptor *)newANTLRCommonTreeAdaptor;
-- (id) init;
-- (id<ANTLRTree>)dupNode:(id<ANTLRTree>)t;    
-- (ANTLRCommonTree *)createTree:(ANTLRCommonToken *)aToken;
-- (ANTLRCommonTree *)createTree:(NSInteger)tokenType Text:(NSString *)text;
-- (id<ANTLRToken>)createToken:(NSInteger)tokenType Text:(NSString *)text;
-- (void) setTokenBoundaries:(id<ANTLRTree>)t From:(id<ANTLRToken>)startToken To:(id<ANTLRToken>)stopToken;
-- (NSInteger)getTokenStartIndex:(id<ANTLRTree>)t;
-- (NSInteger)getTokenStopIndex:(id<ANTLRTree>)t;
-- (NSString *)getText:(id<ANTLRTree>)t;
-- (void)setText:(id<ANTLRTree>)t Text:(NSString *)text;
-- (NSInteger)getType:(id<ANTLRTree>)t;
-- (void) setType:(id<ANTLRTree>)t Type:(NSInteger)tokenType;
-- (id<ANTLRToken>)getToken:(id<ANTLRTree>)t;
-- (id<ANTLRTree>)getChild:(id<ANTLRTree>)t At:(NSInteger)i;
-- (void) setChild:(id<ANTLRTree>)t At:(NSInteger)i Child:(id<ANTLRTree>)child;
-- (NSInteger)getChildCount:(id<ANTLRTree>)t;
-- (id<ANTLRTree>)getParent:(id<ANTLRTree>)t;
-- (void)setParent:(id<ANTLRTree>)t With:(id<ANTLRTree>)parent;
-- (NSInteger)getChildIndex:(id<ANTLRTree>)t;
-- (void)setChildIndex:(id<ANTLRTree>)t With:(NSInteger)index;
-- (void)replaceChildren:(id<ANTLRTree>)parent From:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id<ANTLRTree>)t;
-- (id)copyWithZone:(NSZone *)zone;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRCommonTreeNodeStream.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRCommonTreeNodeStream.h
deleted file mode 100755
index 4c68f2e..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRCommonTreeNodeStream.h
+++ /dev/null
@@ -1,116 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRCommonTree.h"
-#import "ANTLRCommonTreeNodeStream.h"
-#import "ANTLRLookaheadStream.h"
-#import "ANTLRTreeNodeStream.h"
-#import "ANTLRTreeIterator.h"
-#import "ANTLRIntArray.h"
-
-@interface ANTLRCommonTreeNodeStream : ANTLRLookaheadStream <ANTLRTreeNodeStream> {
-#define DEFAULT_INITIAL_BUFFER_SIZE 100
-#define INITIAL_CALL_STACK_SIZE 10
-    
-/** Pull nodes from which tree? */
-id root;
-    
-/** If this tree (root) was created from a token stream, track it. */
-id <ANTLRTokenStream> tokens;
-    
-	/** What tree adaptor was used to build these trees */
-ANTLRCommonTreeAdaptor *adaptor;
-    
-/** The tree iterator we using */
-ANTLRTreeIterator *it;
-    
-/** Stack of indexes used for push/pop calls */
-ANTLRIntArray *calls;    
-    
-/** Tree (nil A B C) trees like flat A B C streams */
-BOOL hasNilRoot;
-    
-/** Tracks tree depth.  Level=0 means we're at root node level. */
-NSInteger level;
-}
-@property (retain, getter=getRoot, setter=setRoot:) ANTLRCommonTree *root;
-@property (retain, getter=getTokens,setter=setTokens:) id<ANTLRTokenStream> tokens;
-@property (retain, getter=getTreeAdaptor, setter=setTreeAdaptor:) ANTLRCommonTreeAdaptor *adaptor;
-
-+ (ANTLRCommonTreeNodeStream *) newANTLRCommonTreeNodeStream:(ANTLRCommonTree *)theTree;
-+ (ANTLRCommonTreeNodeStream *) newANTLRCommonTreeNodeStream:(id<ANTLRTreeAdaptor>)anAdaptor Tree:(ANTLRCommonTree *)theTree;
-
-- (id) initWithTree:(ANTLRCommonTree *)theTree;
-
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)adaptor Tree:(ANTLRCommonTree *)theTree;
-    
-- (void) reset;
-    
-    /** Pull elements from tree iterator.  Track tree level 0..max_level.
-     *  If nil rooted tree, don't give initial nil and DOWN nor final UP.
-     */
-- (id) nextElement;
-    
-- (BOOL) isEOF:(id<ANTLRTree>) o;
-- (void) setUniqueNavigationNodes:(BOOL) uniqueNavigationNodes;
-    
-- (id) getTreeSource;
-    
-- (NSString *) getSourceName;
-    
-- (id<ANTLRTokenStream>) getTokenStream;
-    
-- (void) setTokenStream:(id<ANTLRTokenStream>) tokens;
-    
-- (ANTLRCommonTreeAdaptor *) getTreeAdaptor;
-    
-- (void) setTreeAdaptor:(ANTLRCommonTreeAdaptor *) adaptor;
-    
-- (NSInteger) LA:(NSInteger) i;
-    
-    /** Make stream jump to a new location, saving old location.
-     *  Switch back with pop().
-     */
-- (ANTLRCommonTree *)getNode:(NSInteger) i;
-
-- (void) push:(NSInteger) index;
-    
-    /** Seek back to previous index saved during last push() call.
-     *  Return top of stack (return index).
-     */
-- (NSInteger) pop;
-    
-// TREE REWRITE INTERFACE
-    
-- (void) replaceChildren:(id)parent From:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id) t;
-    
-- (NSString *) toStringFromNode:(id<ANTLRTree>)startNode ToNode:(id<ANTLRTree>)stopNode;
-
-/** For debugging; destructive: moves tree iterator to end. */
-- (NSString *) toTokenTypeString;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRDFA.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRDFA.h
deleted file mode 100755
index 9094a3d..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRDFA.h
+++ /dev/null
@@ -1,75 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRBaseRecognizer.h"
-#import "ANTLRCharStream.h"
-#import "ANTLRNoViableAltException.h"
-
-@interface ANTLRDFA : NSObject {
-	// the tables are set by subclasses to their own static versions.
-	const int *eot;
-	const int *eof;
-	const unichar *min;
-	const unichar *max;
-	const int *accept;
-	const int *special;
-	const int **transition;
-	
-	ANTLRBaseRecognizer *recognizer;
-	NSInteger decisionNumber;
-    NSInteger len;
-}
-
-@property (retain, getter=getRecognizer,setter=setRecognizer:) ANTLRBaseRecognizer *recognizer;
-@property (assign, getter=getDecision,setter=setDecision:) NSInteger decisionNumber;
-@property (assign, getter=getLen,setter=setLen:) NSInteger len;
-
-- (id) initWithRecognizer:(id) theRecognizer;
-// simulate the DFA using the static tables and predict an alternative
-- (NSInteger) predict:(id<ANTLRCharStream>)anInput;
-- (void) noViableAlt:(NSInteger)state Stream:(id<ANTLRIntStream>)anInput;
-
-- (NSInteger) specialStateTransition:(NSInteger)state Stream:(id<ANTLRIntStream>)anInput;
-// - (NSInteger) specialStateTransition:(NSInteger) state;
-//- (unichar) specialTransition:(unichar) state symbol:(NSInteger) symbol;
-
-// hook for debugger support
-- (void) error:(ANTLRNoViableAltException *)nvae;
-
-- (NSString *) description;
-- (BOOL) evaluateSyntacticPredicate:(SEL)synpredFragment;
-
-+ (void) setIsEmittingDebugInfo:(BOOL) shouldEmitDebugInfo;
-
-- (NSInteger)getDecision;
-- (void)setDecision:(NSInteger)aDecison;
-
-- (ANTLRBaseRecognizer *)getRecognizer;
-- (void)setRecognizer:(ANTLRBaseRecognizer *)aRecognizer;
-- (NSInteger)length;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRDebug.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRDebug.h
deleted file mode 100755
index 87383c9..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRDebug.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import "ANTLRDebugEventListener.h"
-#import "ANTLRDebugEventProxy.h"
-#import "ANTLRDebugParser.h"
-#import "ANTLRDebugTokenStream.h"
-#import "ANTLRDebugTreeParser.h"
-#import "ANTLRDebugTreeNodeStream.h"
-#import "ANTLRDebugTreeAdaptor.h"
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRDebugEventListener.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRDebugEventListener.h
deleted file mode 100755
index c2bee6c..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRDebugEventListener.h
+++ /dev/null
@@ -1,275 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRToken.h"
-#import "ANTLRRecognitionException.h"
-
-@protocol ANTLRDebugEventListener 
-
-#define ANTLRDebugProtocolVersion 1
-
-/** The parser has just entered a rule.  No decision has been made about
-*  which alt is predicted.  This is fired AFTER init actions have been
-*  executed.  Attributes are defined and available etc...
-*/
-- (void) enterRule:(NSString *)ruleName;
-
-/** Because rules can have lots of alternatives, it is very useful to
-*  know which alt you are entering.  This is 1..n for n alts.
-*/
-- (void) enterAlt:(NSInteger)alt;
-
-/** This is the last thing executed before leaving a rule.  It is
-*  executed even if an exception is thrown.  This is triggered after
-*  error reporting and recovery have occurred (unless the exception is
-											   *  not caught in this rule).  This implies an "exitAlt" event.
-*/
-- (void) exitRule:(NSString *)ruleName;
-
-/** Track entry into any (...) subrule other EBNF construct */
-- (void) enterSubRule:(NSInteger)decisionNumber;
-
-- (void) exitSubRule:(NSInteger)decisionNumber;
-
-/** Every decision, fixed k or arbitrary, has an enter/exit event
-*  so that a GUI can easily track what LT/consume events are
-*  associated with prediction.  You will see a single enter/exit
-*  subrule but multiple enter/exit decision events, one for each
-*  loop iteration.
-*/
-- (void) enterDecision:(NSInteger)decisionNumber;
-
-- (void) exitDecision:(NSInteger)decisionNumber;
-
-/** An input token was consumed; matched by any kind of element.
-*  Trigger after the token was matched by things like match(), matchAny().
-*/
-- (void) consumeToken:(id<ANTLRToken>)t;
-
-/** An off-channel input token was consumed.
-*  Trigger after the token was matched by things like match(), matchAny().
-*  (unless of course the hidden token is first stuff in the input stream).
-*/
-- (void) consumeHiddenToken:(id<ANTLRToken>)t;
-
-/** Somebody (anybody) looked ahead.  Note that this actually gets
-*  triggered by both LA and LT calls.  The debugger will want to know
-*  which Token object was examined.  Like consumeToken, this indicates
-*  what token was seen at that depth.  A remote debugger cannot look
-*  ahead into a file it doesn't have so LT events must pass the token
-*  even if the info is redundant.
-*/
-- (void) LT:(NSInteger)i foundToken:(id<ANTLRToken>)t;
-
-/** The parser is going to look arbitrarily ahead; mark this location,
-*  the token stream's marker is sent in case you need it.
-*/
-- (void) mark:(NSInteger)marker;
-
-/** After an arbitrairly long lookahead as with a cyclic DFA (or with
-*  any backtrack), this informs the debugger that stream should be
-*  rewound to the position associated with marker.
-*/
-- (void) rewind:(NSInteger)marker;
-
-/** Rewind to the input position of the last marker.
-*  Used currently only after a cyclic DFA and just
-*  before starting a sem/syn predicate to get the
-*  input position back to the start of the decision.
-*  Do not "pop" the marker off the state.  mark(i)
-*  and rewind(i) should balance still.
-*/
-- (void) rewind;
-
-- (void) beginBacktrack:(NSInteger)level;
-
-- (void) endBacktrack:(NSInteger)level wasSuccessful:(BOOL)successful;
-
-/** To watch a parser move through the grammar, the parser needs to
-*  inform the debugger what line/charPos it is passing in the grammar.
-*  For now, this does not know how to switch from one grammar to the
-*  other and back for island grammars etc...
-*
-*  This should also allow breakpoints because the debugger can stop
-*  the parser whenever it hits this line/pos.
-*/
-- (void) locationLine:(NSInteger)line column:(NSInteger)pos;
-
-/** A recognition exception occurred such as NoViableAltException.  I made
-*  this a generic event so that I can alter the exception hierachy later
-*  without having to alter all the debug objects.
-*
-*  Upon error, the stack of enter rule/subrule must be properly unwound.
-*  If no viable alt occurs it is within an enter/exit decision, which
-*  also must be rewound.  Even the rewind for each mark must be unwount.
-*  In the Java target this is pretty easy using try/finally, if a bit
-*  ugly in the generated code.  The rewind is generated in DFA.predict()
-*  actually so no code needs to be generated for that.  For languages
-*  w/o this "finally" feature (C++?), the target implementor will have
-*  to build an event stack or something.
-*
-*  Across a socket for remote debugging, only the RecognitionException
-*  data fields are transmitted.  The token object or whatever that
-*  caused the problem was the last object referenced by LT.  The
-*  immediately preceding LT event should hold the unexpected Token or
-*  char.
-*
-*  Here is a sample event trace for grammar:
-*
-*  b : C ({;}A|B) // {;} is there to prevent A|B becoming a set
-*    | D
-*    ;
-*
-*  The sequence for this rule (with no viable alt in the subrule) for
-*  input 'c c' (there are 3 tokens) is:
-*
-*		commence
-*		LT(1)
-*		enterRule b
-*		location 7 1
-*		enter decision 3
-*		LT(1)
-*		exit decision 3
-*		enterAlt1
-*		location 7 5
-*		LT(1)
-*		consumeToken [c/<4>,1:0]
-*		location 7 7
-*		enterSubRule 2
-*		enter decision 2
-*		LT(1)
-*		LT(1)
-*		recognitionException NoViableAltException 2 1 2
-*		exit decision 2
-*		exitSubRule 2
-*		beginResync
-*		LT(1)
-*		consumeToken [c/<4>,1:1]
-*		LT(1)
-*		endResync
-*		LT(-1)
-*		exitRule b
-*		terminate
-*/
-- (void) recognitionException:(ANTLRRecognitionException *)e;
-
-/** Indicates the recognizer is about to consume tokens to resynchronize
-*  the parser.  Any consume events from here until the recovered event
-*  are not part of the parse--they are dead tokens.
-*/
-- (void) beginResync;
-
-/** Indicates that the recognizer has finished consuming tokens in order
-*  to resychronize.  There may be multiple beginResync/endResync pairs
-*  before the recognizer comes out of errorRecovery mode (in which
-*  multiple errors are suppressed).  This will be useful
-*  in a gui where you want to probably grey out tokens that are consumed
-*  but not matched to anything in grammar.  Anything between
-*  a beginResync/endResync pair was tossed out by the parser.
-*/
-- (void) endResync;
-
-/** A semantic predicate was evaluate with this result and action text */
-- (void) semanticPredicate:(NSString *)predicate matched:(BOOL)result;
-
-/** Announce that parsing has begun.  Not technically useful except for
-*  sending events over a socket.  A GUI for example will launch a thread
-*  to connect and communicate with a remote parser.  The thread will want
-*  to notify the GUI when a connection is made.  ANTLR parsers
-*  trigger this upon entry to the first rule (the ruleLevel is used to
-*  figure this out).
-*/
-- (void) commence;
-
-/** Parsing is over; successfully or not.  Mostly useful for telling
-*  remote debugging listeners that it's time to quit.  When the rule
-*  invocation level goes to zero at the end of a rule, we are done
-*  parsing.
-*/
-- (void) terminate;
-
-
-// T r e e  P a r s i n g
-
-/** Input for a tree parser is an AST, but we know nothing for sure
-*  about a node except its type and text (obtained from the adaptor).
-*  This is the analog of the consumeToken method.  Again, the ID is
-*  the hashCode usually of the node so it only works if hashCode is
-*  not implemented.  If the type is UP or DOWN, then
-*  the ID is not really meaningful as it's fixed--there is
-*  just one UP node and one DOWN navigation node.
-*/
-- (void) consumeNode:(NSInteger)nodeHash ofType:(NSInteger)type text:(NSString *)text;
-
-/** The tree parser lookedahead.  If the type is UP or DOWN,
-*  then the ID is not really meaningful as it's fixed--there is
-*  just one UP node and one DOWN navigation node.
-*/
-- (void) LT:(NSInteger)i foundNode:(unsigned)nodeHash ofType:(NSInteger)type text:(NSString *)text;
-
-
-// A S T  E v e n t s
-
-/** A nil was created (even nil nodes have a unique ID...
-*  they are not "null" per se).  As of 4/28/2006, this
-*  seems to be uniquely triggered when starting a new subtree
-*  such as when entering a subrule in automatic mode and when
-*  building a tree in rewrite mode.
-*/
-- (void) createNilNode:(unsigned)hash;
-
-/** Announce a new node built from text */
-- (void) createNode:(unsigned)hash text:(NSString *)text type:(NSInteger)type;
-
-/** Announce a new node built from an existing token */
-- (void) createNode:(unsigned)hash fromTokenAtIndex:(NSInteger)tokenIndex;
-
-/** Make a node the new root of an existing root.  See
-*
-*  Note: the newRootID parameter is possibly different
-*  than the TreeAdaptor.becomeRoot() newRoot parameter.
-*  In our case, it will always be the result of calling
-*  TreeAdaptor.becomeRoot() and not root_n or whatever.
-*
-*  The listener should assume that this event occurs
-*  only when the current subrule (or rule) subtree is
-*  being reset to newRootID.
-*
-*/
-- (void) makeNode:(unsigned)newRootHash parentOf:(unsigned)oldRootHash;
-
-/** Make childID a child of rootID.
-*  @see org.antlr.runtime.tree.TreeAdaptor.addChild()
-*/
-- (void) addChild:(unsigned)childHash toTree:(unsigned)treeHash;
-
-/** Set the token start/stop token index for a subtree root or node */
-- (void) setTokenBoundariesForTree:(unsigned)nodeHash From:(NSUInteger)tokenStartIndex To:(NSUInteger)tokenStopIndex;
-
-- (void) waitForDebuggerConnection;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRDebugEventProxy.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRDebugEventProxy.h
deleted file mode 100755
index 59bf67b..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRDebugEventProxy.h
+++ /dev/null
@@ -1,112 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRParser.h"
-#import "ANTLRDebugEventListener.h"
-#import <sys/socket.h>
-#import <netinet/in.h>
-#import <netinet/tcp.h>
-#include <arpa/inet.h>
-
-// default port for ANTLRWorks
-#define DEFAULT_DEBUGGER_PORT 0xC001
-
-@interface ANTLRDebugEventProxy : NSObject <ANTLRDebugEventListener> {
-	int serverSocket;
-	
-	struct sockaddr debugger_sockaddr;
-	socklen_t debugger_socklen;
-	int debuggerSocket;
-	NSFileHandle *debuggerFH;
-	
-	NSString *grammarName;
-	int debuggerPort;
-}
-
-- (id) init;
-- (id) initWithGrammarName:(NSString *)aGrammarName debuggerPort:(NSInteger)aPort;
-- (void) waitForDebuggerConnection;
-- (void) waitForAck;
-- (void) sendToDebugger:(NSString *)message;
-- (void) sendToDebugger:(NSString *)message waitForResponse:(BOOL)wait;
-
-- (NSInteger) serverSocket;
-- (void) setServerSocket: (NSInteger) aServerSocket;
-
-- (NSInteger) debuggerSocket;
-- (void) setDebuggerSocket: (NSInteger) aDebuggerSocket;
-
-- (NSString *) grammarName;
-- (void) setGrammarName: (NSString *) aGrammarName;
-
-- (NSInteger) debuggerPort;
-- (void) setDebuggerPort: (NSInteger) aDebuggerPort;
-
-- (NSString *) escapeNewlines:(NSString *)aString;
-
-#pragma mark -
-
-#pragma mark DebugEventListener Protocol
-- (void) enterRule:(NSString *)ruleName;
-- (void) enterAlt:(NSInteger)alt;
-- (void) exitRule:(NSString *)ruleName;
-- (void) enterSubRule:(NSInteger)decisionNumber;
-- (void) exitSubRule:(NSInteger)decisionNumber;
-- (void) enterDecision:(NSInteger)decisionNumber;
-- (void) exitDecision:(NSInteger)decisionNumber;
-- (void) consumeToken:(id<ANTLRToken>)t;
-- (void) consumeHiddenToken:(id<ANTLRToken>)t;
-- (void) LT:(NSInteger)i foundToken:(id<ANTLRToken>)t;
-- (void) mark:(NSInteger)marker;
-- (void) rewind:(NSInteger)marker;
-- (void) rewind;
-- (void) beginBacktrack:(NSInteger)level;
-- (void) endBacktrack:(NSInteger)level wasSuccessful:(BOOL)successful;
-- (void) locationLine:(NSInteger)line column:(NSInteger)pos;
-- (void) recognitionException:(ANTLRRecognitionException *)e;
-- (void) beginResync;
-- (void) endResync;
-- (void) semanticPredicate:(NSString *)predicate matched:(BOOL)result;
-- (void) commence;
-- (void) terminate;
-
-
-#pragma mark Tree Parsing
-- (void) consumeNode:(unsigned)nodeHash ofType:(NSInteger)type text:(NSString *)text;
-- (void) LT:(NSInteger)i foundNode:(unsigned)nodeHash ofType:(NSInteger)type text:(NSString *)text;
-
-
-#pragma mark AST Events
-
-- (void) createNilNode:(unsigned)hash;
-- (void) createNode:(unsigned)hash text:(NSString *)text type:(NSInteger)type;
-- (void) createNode:(unsigned)hash fromTokenAtIndex:(NSInteger)tokenIndex;
-- (void) makeNode:(unsigned)newRootHash parentOf:(unsigned)oldRootHash;
-- (void) addChild:(unsigned)childHash toTree:(unsigned)treeHash;
-- (void) setTokenBoundariesForTree:(unsigned)nodeHash From:(NSInteger)tokenStartIndex To:(NSInteger)tokenStopIndex;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRDebugParser.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRDebugParser.h
deleted file mode 100755
index b23ff50..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRDebugParser.h
+++ /dev/null
@@ -1,47 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRParser.h"
-#import "ANTLRDebugEventProxy.h"
-#import "ANTLRDebugTokenStream.h"
-
-@interface ANTLRDebugParser : ANTLRParser {
-	id<ANTLRDebugEventListener> debugListener;
-}
-
-- (id) initWithTokenStream:(id<ANTLRTokenStream>)theStream;
-- (id) initWithTokenStream:(id<ANTLRTokenStream>)theStream
-			  debuggerPort:(NSInteger)portNumber;
-// designated initializer
-- (id) initWithTokenStream:(id<ANTLRTokenStream>)theStream
-			 debugListener:(id<ANTLRDebugEventListener>)theDebugListener
-			  debuggerPort:(NSInteger)portNumber;
-
-- (id<ANTLRDebugEventListener>) debugListener;
-- (void) setDebugListener: (id<ANTLRDebugEventListener>) aDebugListener;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRDebugTokenStream.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRDebugTokenStream.h
deleted file mode 100755
index 335b002..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRDebugTokenStream.h
+++ /dev/null
@@ -1,62 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRParser.h"
-#import "ANTLRTokenStream.h"
-#import "ANTLRTokenSource.h"
-#import "ANTLRDebugTokenStream.h"
-#import "ANTLRDebugEventListener.h"
-
-@interface ANTLRDebugTokenStream : NSObject <ANTLRTokenStream>
-{
-	id<ANTLRDebugEventListener> debugListener;
-	id<ANTLRTokenStream> input;
-	BOOL initialStreamState;
-    NSInteger lastMarker;
-}
-
-- (id) initWithTokenStream:(id<ANTLRTokenStream>)theStream debugListener:(id<ANTLRDebugEventListener>)debugger;
-
-- (id<ANTLRDebugEventListener>) debugListener;
-- (void) setDebugListener: (id<ANTLRDebugEventListener>) aDebugListener;
-
-- (id<ANTLRTokenStream>) getInput;
-- (void) setInput:(id<ANTLRTokenStream>)aTokenStream;
-
-- (void) consume;
-- (id<ANTLRToken>) getToken:(NSInteger)index;
-- (NSInteger) getIndex;
-- (void) release:(NSInteger)marker;
-- (void) seek:(NSInteger)index;
-- (NSInteger) size;
-- (id<ANTLRTokenSource>) getTokenSource;
-- (NSString *) getSourceName;
-- (NSString *) toString;
-- (NSString *) toStringFromStart:(NSInteger)aStart ToEnd:(NSInteger)aStop;
-- (NSString *) toStringFromToken:(id<ANTLRToken>)startToken ToToken:(id<ANTLRToken>)stopToken;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRDebugTreeAdaptor.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRDebugTreeAdaptor.h
deleted file mode 100755
index 41965fa..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRDebugTreeAdaptor.h
+++ /dev/null
@@ -1,45 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRParser.h"
-#import "ANTLRBaseTreeAdaptor.h"
-#import "ANTLRDebugEventListener.h"
-
-@interface ANTLRDebugTreeAdaptor : ANTLRBaseTreeAdaptor {
-	id<ANTLRDebugEventListener> debugListener;
-	id<ANTLRTreeAdaptor> treeAdaptor;
-}
-
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor debugListener:(id<ANTLRDebugEventListener>)aDebugListener;
-
-- (id<ANTLRDebugEventListener>) debugListener;
-- (void) setDebugListener: (id<ANTLRDebugEventListener>) aDebugListener;
-
-- (id<ANTLRTreeAdaptor>) getTreeAdaptor;
-- (void) setTreeAdaptor: (id<ANTLRTreeAdaptor>) aTreeAdaptor;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRDebugTreeNodeStream.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRDebugTreeNodeStream.h
deleted file mode 100755
index 70f9939..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRDebugTreeNodeStream.h
+++ /dev/null
@@ -1,67 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRDebugEventListener.h"
-#import "ANTLRTreeAdaptor.h"
-#import "ANTLRTreeNodeStream.h"
-
-@interface ANTLRDebugTreeNodeStream : NSObject <ANTLRTreeNodeStream> {
-	id<ANTLRDebugEventListener> debugListener;
-	id<ANTLRTreeAdaptor> treeAdaptor;
-	id<ANTLRTreeNodeStream> input;
-	BOOL initialStreamState;
-}
-
-- (id) initWithTreeNodeStream:(id<ANTLRTreeNodeStream>)theStream debugListener:(id<ANTLRDebugEventListener>)debugger;
-
-- (id<ANTLRDebugEventListener>) debugListener;
-- (void) setDebugListener: (id<ANTLRDebugEventListener>) aDebugListener;
-
-- (id<ANTLRTreeNodeStream>) getInput;
-- (void) setInput: (id<ANTLRTreeNodeStream>) aTreeNodeStream;
-
-- (id<ANTLRTreeAdaptor>) getTreeAdaptor;
-- (void) setTreeAdaptor: (id<ANTLRTreeAdaptor>) aTreeAdaptor;
-
-#pragma mark ANTLRTreeNodeStream conformance
-
-- (id) LT:(NSInteger)k;
-- (id<ANTLRTreeAdaptor>) getTreeAdaptor;
-- (void) setUniqueNavigationNodes:(BOOL)flag;
-
-#pragma mark ANTLRIntStream conformance
-- (void) consume;
-- (NSInteger) LA:(NSUInteger) i;
-- (NSUInteger) mark;
-- (NSUInteger) getIndex;
-- (void) rewind:(NSUInteger) marker;
-- (void) rewind;
-- (void) release:(NSUInteger) marker;
-- (void) seek:(NSUInteger) index;
-- (NSUInteger) size;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRDebugTreeParser.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRDebugTreeParser.h
deleted file mode 100755
index cbeac76..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRDebugTreeParser.h
+++ /dev/null
@@ -1,48 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTreeParser.h"
-#import "ANTLRDebugEventProxy.h"
-#import "ANTLRDebugTreeNodeStream.h"
-
-@interface ANTLRDebugTreeParser : ANTLRTreeParser {
-	id<ANTLRDebugEventListener> debugListener;
-}
-
-- (id) initWithTreeNodeStream:(id<ANTLRTreeNodeStream>)theStream;
-- (id) initWithTreeNodeStream:(id<ANTLRTreeNodeStream>)theStream
-				 debuggerPort:(NSInteger)portNumber;
-	// designated initializer
-- (id) initWithTreeNodeStream:(id<ANTLRTreeNodeStream>)theStream
-				debugListener:(id<ANTLRDebugEventListener>)theDebugListener
-				 debuggerPort:(NSInteger)portNumber;
-
-- (id<ANTLRDebugEventListener>) debugListener;
-- (void) setDebugListener: (id<ANTLRDebugEventListener>) aDebugListener;
-
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLREarlyExitException.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLREarlyExitException.h
deleted file mode 100755
index 1a89bbb..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLREarlyExitException.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRecognitionException.h"
-
-@interface ANTLREarlyExitException : ANTLRRecognitionException {
-	int decisionNumber;
-}
-
-+ (ANTLREarlyExitException *) exceptionWithStream:(id<ANTLRIntStream>) anInputStream decisionNumber:(NSInteger) aDecisionNumber;
-- (id) initWithStream:(id<ANTLRIntStream>)anInputStream decisionNumber:(NSInteger) aDecisionNumber;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRError.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRError.h
deleted file mode 100644
index f2657af..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRError.h
+++ /dev/null
@@ -1,55 +0,0 @@
-//
-//  ANTLRError.h
-//  ANTLR
-//
-//  Created by Ian Michell on 30/03/2010.
-//  Copyright 2010 Ian Michell. All rights reserved.
-//
-
-// [The "BSD licence"]
-//
-// 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.
-
-#import <Cocoa/Cocoa.h>
-
-#define ANTLRErrorDomain @"ANTLRError"
-
-#define ANTLRIllegalArgumentException @"ANTLRIllegalArgumentException"
-#define ANTLRIllegalStateException @"IllegalStateException"
-//#define ANTLRRuntimeException @"RuntimeException"
-//#define ANTLRNoSuchMethodException @"NoSuchMethodException"
-//#define ANTLRNoSuchElementException @"NoSuchElementException"
-//#define ANTLRUnsupportedOperationException @"UnsupportedOperationException"
-
-
-/*typedef enum
-{
-	ANTLRIllegalState = 1,
-	ANTLRIllegalArgument = 2,
-	ANTLRRecognitionError = 3,
-	ANTLRMissingTokenError = 4,
-	ANTLRUnwantedTokenError = 5,
-	ANTLRMismatechedTokenError = 6,
-	ANTLRNoViableAltError = 7
-	
-} ANTLRErrorCode;*/
\ No newline at end of file
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRFailedPredicateException.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRFailedPredicateException.h
deleted file mode 100755
index 9788cba..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRFailedPredicateException.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRecognitionException.h"
-
-
-@interface ANTLRFailedPredicateException : ANTLRRecognitionException
-{
-	NSString *predicate;
-	NSString *ruleName;
-}
-
-@property (retain, getter=getPredicate, setter=setPredicate:) NSString *predicate;
-@property (retain, getter=getRuleName, setter=setRuleName:) NSString *ruleName;
-
-+ (ANTLRFailedPredicateException *) exceptionWithRuleName:(NSString *)theRuleName predicate:(NSString *)thePredicate stream:(id<ANTLRIntStream>)theStream;
-- (ANTLRFailedPredicateException *) initWithRuleName:(NSString *)theRuleName predicate:(NSString *)thePredicate stream:(id<ANTLRIntStream>)theStream;
-
-#ifdef DONTUSEYET
-- (NSString *) getPredicate;
-- (void) setPredicate:(NSString *)thePredicate;
-- (NSString *) getRuleName;
-- (void) setRuleName:(NSString *)theRuleName;
-#endif
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRFastQueue.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRFastQueue.h
deleted file mode 100644
index cf81817..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRFastQueue.h
+++ /dev/null
@@ -1,68 +0,0 @@
-//
-//  ANTLRFastQueue.h
-//  ANTLR
-//
-//  Created by Ian Michell on 26/04/2010.
-// [The "BSD licence"]
-// Copyright (c) 2010 Ian Michell 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-
-
-@interface ANTLRFastQueue : NSObject <NSCopying>
-{
-	NSAutoreleasePool *pool;
-	NSMutableArray *data;
-	NSInteger p;
-}
-
-@property (retain, getter=getPool, setter=setPool) NSAutoreleasePool *pool;
-@property (retain, getter=getData, setter=setData) NSMutableArray *data;
-@property (assign, getter=getP, setter=setP) NSInteger p;
-
-+ (id) newANTLRFastQueue;
-
-- (id) init;
-
-- (id) copyWithZone:(NSZone *)aZone;
-
-- (void) reset;
-- (id) remove;
-- (void) addObject:(id) o;
-- (NSInteger) count;
-- (NSInteger) size;
-- (id) head;
-- (id) objectAtIndex:(NSInteger) i;
-- (void) clear;
-- (NSString *) toString;
-- (NSAutoreleasePool *)getPool;
-- (void)setPool:(NSAutoreleasePool *)aPool;
-- (NSMutableArray *)getData;
-- (void)setData:(NSMutableArray *)myData;
-- (NSInteger) getP;
-- (void) setP:(NSInteger)anInt;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRHashMap.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRHashMap.h
deleted file mode 100644
index 04aca7b..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRHashMap.h
+++ /dev/null
@@ -1,102 +0,0 @@
-//
-//  ANTLRHashMap.h
-//  ANTLR
-//
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRLinkBase.h"
-#import "ANTLRMapElement.h"
-
-#define GLOBAL_SCOPE       0
-#define LOCAL_SCOPE        1
-#define HASHSIZE         101
-#define HBUFSIZE      0x2000
-
-@interface ANTLRHashMap : ANTLRLinkBase {
-	//	ANTLRHashMap *fNext;
-    //    TStringPool *fPool;
-    NSInteger Scope;
-    NSInteger LastHash;
-    NSInteger BuffSize;
-    ANTLRMapElement *ptrBuffer[HASHSIZE];
-    NSInteger mode;
-}
-
-//@property (copy) ANTLRHashMap *fNext;
-//@property (copy) TStringPool *fPool;
-@property (getter=getScope, setter=setScope:) NSInteger Scope;
-@property (getter=getLastHash, setter=setLastHash:) NSInteger LastHash;
-
-// Contruction/Destruction
-+ (id)newANTLRHashMap;
-+ (id)newANTLRHashMapWithLen:(NSInteger)aBuffSize;
-- (id)init;
-- (id)initWithLen:(NSInteger)aBuffSize;
-- (void)dealloc;
-- (ANTLRHashMap *)PushScope:( ANTLRHashMap **)map;
-- (ANTLRHashMap *)PopScope:( ANTLRHashMap **)map;
-
-- (NSInteger)count;
-- (NSInteger)size;
-
-// Instance Methods
-/*    form hash value for string s */
-- (NSInteger)hash:(NSString *)s;
-/*   look for s in ptrBuffer  */
-- (ANTLRHashMap *)findscope:(int)level;
-/*   look for s in ptrBuffer  */
-- (id)lookup:(NSString *)s Scope:(int)scope;
-/*   look for s in ptrBuffer  */
-- (id)install:(ANTLRMapElement *)sym Scope:(int)scope;
-/*   look for s in ptrBuffer  */
-- (void)deleteANTLRHashMap:(ANTLRMapElement *)np;
-- (int)RemoveSym:(NSString *)s;
-- (void)delete_chain:(ANTLRMapElement *)np;
-#ifdef DONTUSEYET
-- (int)bld_symtab:(KW_TABLE *)toknams;
-#endif
-- (ANTLRMapElement **)getptrBuffer;
-- (ANTLRMapElement *)getptrBufferEntry:(int)idx;
-- (void)setptrBuffer:(ANTLRMapElement *)np Index:(int)idx;
-- (NSInteger)getScope;
-- (void)setScope:(NSInteger)i;
-- (ANTLRMapElement *)getTType:(NSString *)name;
-- (ANTLRMapElement *)getNameInList:(NSInteger)ttype;
-- (void)putNode:(NSString *)name TokenType:(NSInteger)ttype;
-- (NSInteger)getMode;
-- (void)setMode:(NSInteger)aMode;
-- (void) insertObject:(id)aRule atIndex:(NSInteger)idx;
-- (id) objectAtIndex:(NSInteger)idx;
-- (void) setObject:(id)aRule atIndex:(NSInteger)idx;
-- (void)addObject:(id)anObject;
-- (ANTLRMapElement *) getName:(NSString *)aName;
-- (void) putName:(NSString *)name Node:(id)aNode;
-
-- (NSEnumerator *)objectEnumerator;
-- (BOOL) hasNext;
-- (ANTLRMapElement *)nextObject;
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRHashMap.m b/runtime/ObjC/ANTLR.framework/Headers/ANTLRHashMap.m
deleted file mode 100644
index a23426b..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRHashMap.m
+++ /dev/null
@@ -1,521 +0,0 @@
-//
-//  ANTLRHashMap.m
-//  ANTLR
-//
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#define SUCCESS (0)
-#define FAILURE (-1)
-
-#import "ANTLRHashMap.h"
-
-static NSInteger itIndex;
-
-/*
- * Start of ANTLRHashMap
- */
-@implementation ANTLRHashMap
-
-@synthesize Scope;
-@synthesize LastHash;
-
-+(id)newANTLRHashMap
-{
-    ANTLRHashMap *aNewANTLRHashMap;
-    
-    aNewANTLRHashMap = [[ANTLRHashMap alloc] init];
-	return( aNewANTLRHashMap );
-}
-
-+(id)newANTLRHashMapWithLen:(NSInteger)aBuffSize
-{
-    ANTLRHashMap *aNewANTLRHashMap;
-    
-    aNewANTLRHashMap = [[ANTLRHashMap alloc] initWithLen:aBuffSize];
-	return( aNewANTLRHashMap );
-}
-
--(id)init
-{
-    NSInteger idx;
-    
-	if ((self = [super init]) != nil) {
-		fNext = nil;
-        BuffSize = HASHSIZE;
-		Scope = 0;
-		if ( fNext != nil ) {
-			Scope = ((ANTLRHashMap *)fNext)->Scope+1;
-			for( idx = 0; idx < BuffSize; idx++ ) {
-				ptrBuffer[idx] = ((ANTLRHashMap *)fNext)->ptrBuffer[idx];
-			}
-		}
-        mode = 0;
-	}
-    return( self );
-}
-
--(id)initWithLen:(NSInteger)aBuffSize
-{
-    NSInteger idx;
-    
-	if ((self = [super init]) != nil) {
-		fNext = nil;
-        BuffSize = aBuffSize;
-		Scope = 0;
-		if ( fNext != nil ) {
-			Scope = ((ANTLRHashMap *)fNext)->Scope+1;
-			for( idx = 0; idx < BuffSize; idx++ ) {
-				ptrBuffer[idx] = ((ANTLRHashMap *)fNext)->ptrBuffer[idx];
-			}
-		}
-        mode = 0;
-	}
-    return( self );
-}
-
--(void)dealloc
-{
-    ANTLRMapElement *tmp, *rtmp;
-    NSInteger idx;
-	
-    if ( self.fNext != nil ) {
-        for( idx = 0; idx < BuffSize; idx++ ) {
-            tmp = ptrBuffer[idx];
-            while ( tmp && tmp != [((ANTLRHashMap *)fNext) getptrBufferEntry:idx] ) {
-                rtmp = tmp;
-                // tmp = [tmp getfNext];
-                tmp = (ANTLRMapElement *)tmp.fNext;
-                [rtmp dealloc];
-            }
-        }
-    }
-	[super dealloc];
-}
-
-- (NSInteger)count
-{
-    id anElement;
-    NSInteger aCnt = 0;
-    
-    for (NSInteger i = 0; i < BuffSize; i++) {
-        if ((anElement = ptrBuffer[i]) != nil) {
-            aCnt++;
-        }
-    }
-    return aCnt;
-}
-                          
-- (NSInteger) size
-{
-    id anElement;
-    NSInteger aSize = 0;
-    
-    for (NSInteger i = 0; i < BuffSize; i++) {
-        if ((anElement = ptrBuffer[i]) != nil) {
-            aSize += sizeof(id);
-        }
-    }
-    return aSize;
-}
-                                  
-                                  
--(void)deleteANTLRHashMap:(ANTLRMapElement *)np
-{
-    ANTLRMapElement *tmp, *rtmp;
-    NSInteger idx;
-    
-    if ( self.fNext != nil ) {
-        for( idx = 0; idx < BuffSize; idx++ ) {
-            tmp = ptrBuffer[idx];
-            while ( tmp && tmp != (ANTLRLinkBase *)[((ANTLRHashMap *)fNext) getptrBufferEntry:idx] ) {
-                rtmp = tmp;
-                tmp = [tmp getfNext];
-                [rtmp dealloc];
-            }
-        }
-    }
-}
-
--(ANTLRHashMap *)PushScope:(ANTLRHashMap **)map
-{
-    NSInteger idx;
-    ANTLRHashMap *htmp;
-    
-    htmp = [ANTLRHashMap newANTLRHashMap];
-    if ( *map != nil ) {
-        ((ANTLRHashMap *)htmp)->fNext = *map;
-        [htmp setScope:[((ANTLRHashMap *)htmp->fNext) getScope]+1];
-        for( idx = 0; idx < BuffSize; idx++ ) {
-            htmp->ptrBuffer[idx] = ((ANTLRHashMap *)htmp->fNext)->ptrBuffer[idx];
-        }
-    }
-    //    gScopeLevel++;
-    *map = htmp;
-    return( htmp );
-}
-
--(ANTLRHashMap *)PopScope:(ANTLRHashMap **)map
-{
-    NSInteger idx;
-    ANTLRMapElement *tmp;
-	ANTLRHashMap *htmp;
-    
-    htmp = *map;
-    if ( (*map)->fNext != nil ) {
-        *map = (ANTLRHashMap *)htmp->fNext;
-        for( idx = 0; idx < BuffSize; idx++ ) {
-            if ( htmp->ptrBuffer[idx] == nil ||
-                htmp->ptrBuffer[idx] == (*map)->ptrBuffer[idx] ) {
-                break;
-            }
-            tmp = htmp->ptrBuffer[idx];
-            /*
-             * must deal with parms, locals and labels at some point
-             * can not forget the debuggers
-             */
-            htmp->ptrBuffer[idx] = [tmp getfNext];
-            [ tmp dealloc];
-        }
-        *map = (ANTLRHashMap *)htmp->fNext;
-        //        gScopeLevel--;
-    }
-    return( htmp );
-}
-
-#ifdef USERDOC
-/*
- *  HASH        hash entry to get index to table
- *  NSInteger hash( ANTLRHashMap *self, char *s );
- *
- *     Inputs:  char *s             string to find
- *
- *     Returns: NSInteger                 hashed value
- *
- *  Last Revision 9/03/90
- */
-#endif
--(NSInteger)hash:(NSString *)s       /*    form hash value for string s */
-{
-	NSInteger hashval;
-	const char *tmp;
-    
-	tmp = [s cStringUsingEncoding:NSASCIIStringEncoding];
-	for( hashval = 0; *tmp != '\0'; )
-        hashval += *tmp++;
-	self->LastHash = hashval % BuffSize;
-	return( self->LastHash );
-}
-
-#ifdef USERDOC
-/*
- *  FINDSCOPE  search hashed list for entry
- *  ANTLRHashMap *findscope( ANTLRHashMap *self, NSInteger scope );
- *
- *     Inputs:  NSInteger       scope -- scope level to find
- *
- *     Returns: ANTLRHashMap   pointer to ptrBuffer of proper scope level
- *
- *  Last Revision 9/03/90
- */
-#endif
--(ANTLRHashMap *)findscope:(NSInteger)scope
-{
-    if ( self->Scope == scope ) {
-        return( self );
-    }
-    else if ( fNext ) {
-        return( [((ANTLRHashMap *)fNext) findscope:scope] );
-    }
-    return( nil );              /*   not found      */
-}
-
-#ifdef USERDOC
-/*
- *  LOOKUP  search hashed list for entry
- *  ANTLRMapElement *lookup( ANTLRHashMap *self, char *s, NSInteger scope );
- *
- *     Inputs:  char     *s          string to find
- *
- *     Returns: ANTLRMapElement  *           pointer to entry
- *
- *  Last Revision 9/03/90
- */
-#endif
--(id)lookup:(NSString *)s Scope:(NSInteger)scope
-{
-    ANTLRMapElement *np;
-    
-    for( np = self->ptrBuffer[[self hash:s]]; np != nil; np = [np getfNext] ) {
-        if ( [s isEqualToString:[np getName]] ) {
-            return( np );        /*   found it       */
-        }
-    }
-    return( nil );              /*   not found      */
-}
-
-#ifdef USERDOC
-/*
- *  INSTALL search hashed list for entry
- *  NSInteger install( ANTLRHashMap *self, ANTLRMapElement *sym, NSInteger scope );
- *
- *     Inputs:  ANTLRMapElement    *sym   -- symbol ptr to install
- *              NSInteger         scope -- level to find
- *
- *     Returns: Boolean     TRUE   if installed
- *                          FALSE  if already in table
- *
- *  Last Revision 9/03/90
- */
-#endif
--(ANTLRMapElement *)install:(ANTLRMapElement *)sym Scope:(NSInteger)scope
-{
-    ANTLRMapElement *np;
-    
-    np = [self lookup:[sym getName] Scope:scope ];
-    if ( np == nil ) {
-        [sym retain];
-        [sym setFNext:self->ptrBuffer[ self->LastHash ]];
-        self->ptrBuffer[ self->LastHash ] = sym;
-        return( self->ptrBuffer[ self->LastHash ] );
-    }
-    return( nil );            /*   not found      */
-}
-
-#ifdef USERDOC
-/*
- *  RemoveSym  search hashed list for entry
- *  NSInteger RemoveSym( ANTLRHashMap *self, char *s );
- *
- *     Inputs:  char     *s          string to find
- *
- *     Returns: NSInteger      indicator of SUCCESS OR FAILURE
- *
- *  Last Revision 9/03/90
- */
-#endif
--(NSInteger)RemoveSym:(NSString *)s
-{
-    ANTLRMapElement *np, *tmp;
-    NSInteger idx;
-    
-    idx = [self hash:s];
-    for ( tmp = self->ptrBuffer[idx], np = self->ptrBuffer[idx]; np != nil; np = [np getfNext] ) {
-        if ( [s isEqualToString:[np getName]] ) {
-            tmp = [np getfNext];             /* get the next link  */
-            [np dealloc];
-            return( SUCCESS );            /* report SUCCESS     */
-        }
-        tmp = [np getfNext];              //  BAD!!!!!!
-    }
-    return( FAILURE );                    /*   not found      */
-}
-
--(void)delete_chain:(ANTLRMapElement *)np
-{
-    if ( [np getfNext] != nil )
-		[self delete_chain:[np getfNext]];
-	[np dealloc];
-}
-
-#ifdef DONTUSEYET
--(NSInteger)bld_symtab:(KW_TABLE *)toknams
-{
-    NSInteger i;
-    ANTLRMapElement *np;
-    
-    for( i = 0; *(toknams[i].name) != '\0'; i++ ) {
-        // install symbol in ptrBuffer
-        np = [ANTLRMapElement newANTLRMapElement:[NSString stringWithFormat:@"%s", toknams[i].name]];
-        //        np->fType = toknams[i].toknum;
-        [self install:np Scope:0];
-    }
-    return( SUCCESS );
-}
-#endif
-
--(ANTLRMapElement *)getptrBufferEntry:(NSInteger)idx
-{
-	return( ptrBuffer[idx] );
-}
-
--(ANTLRMapElement **)getptrBuffer
-{
-	return( ptrBuffer );
-}
-
--(void)setptrBuffer:(ANTLRMapElement *)np Index:(NSInteger)idx
-{
-	if ( idx < BuffSize ) {
-        [np retain];
-		ptrBuffer[idx] = np;
-    }
-}
-
--(NSInteger)getScope
-{
-	return( Scope );
-}
-
--(void)setScopeScope:(NSInteger)i
-{
-	Scope = i;
-}
-
-- (ANTLRMapElement *)getTType:(NSString *)name
-{
-    return [self lookup:name Scope:0];
-}
-
-/*
- * works only for maplist indexed not by name but by TokenNumber
- */
-- (ANTLRMapElement *)getNameInList:(NSInteger)ttype
-{
-    ANTLRMapElement *np;
-    NSInteger aTType;
-
-    aTType = ttype % BuffSize;
-    for( np = self->ptrBuffer[ttype]; np != nil; np = [np getfNext] ) {
-        if ( [np.index integerValue] == ttype ) {
-            return( np );        /*   found it       */
-        }
-    }
-    return( nil );              /*   not found      */
-}
-
-- (ANTLRLinkBase *)getName:(NSString *)name
-{
-    return [self lookup:name Scope:0]; /*  nil if not found      */    
-}
-
-- (void)putNode:(NSString *)name TokenType:(NSInteger)ttype
-{
-    ANTLRMapElement *np;
-    
-    // install symbol in ptrBuffer
-    np = [ANTLRMapElement newANTLRMapElementWithName:[NSString stringWithString:name] Type:ttype];
-    //        np->fType = toknams[i].toknum;
-    [self install:np Scope:0];
-}
-
-- (NSInteger)getMode
-{
-    return mode;
-}
-
-- (void)setMode:(NSInteger)aMode
-{
-    mode = aMode;
-}
-
-- (void) addObject:(id)aRule
-{
-    NSInteger idx;
-
-    idx = [self count];
-    if ( idx >= BuffSize ) {
-        idx %= BuffSize;
-    }
-    ptrBuffer[idx] = aRule;
-}
-
-/* this may have to handle linking into the chain
- */
-- (void) insertObject:(id)aRule atIndex:(NSInteger)idx
-{
-    if ( idx >= BuffSize ) {
-        idx %= BuffSize;
-    }
-    if (aRule != ptrBuffer[idx]) {
-        if (ptrBuffer[idx] != nil) [ptrBuffer[idx] release];
-        [aRule retain];
-    }
-    ptrBuffer[idx] = aRule;
-}
-
-- (id)objectAtIndex:(NSInteger)idx
-{
-    if ( idx >= BuffSize ) {
-        idx %= BuffSize;
-    }
-    return ptrBuffer[idx];
-}
-
-/* this will never link into the chain
- */
-- (void) setObject:(id)aRule atIndex:(NSInteger)idx
-{
-    if ( idx >= BuffSize ) {
-        idx %= BuffSize;
-    }
-    if (aRule != ptrBuffer[idx]) {
-        if (ptrBuffer[idx] != nil) [ptrBuffer[idx] release];
-        [aRule retain];
-    }
-    ptrBuffer[idx] = aRule;
-}
-
-- (void)putName:(NSString *)name Node:(id)aNode
-{
-    ANTLRMapElement *np;
-    
-    np = [self lookup:name Scope:0 ];
-    if ( np == nil ) {
-        np = [ANTLRMapElement newANTLRMapElementWithName:name Node:aNode];
-        if (ptrBuffer[LastHash] != nil)
-            [ptrBuffer[LastHash] release];
-        [np retain];
-        np.fNext = ptrBuffer[ LastHash ];
-        ptrBuffer[ LastHash ] = np;
-    }
-    return;    
-}
-
-- (NSEnumerator *)objectEnumerator
-{
-    NSEnumerator *anEnumerator;
-
-    itIndex = 0;
-    return anEnumerator;
-}
-
-- (BOOL)hasNext
-{
-    if (self && [self count] < BuffSize-1) {
-        return YES;
-    }
-    return NO;
-}
-
-- (ANTLRMapElement *)nextObject
-{
-    if (self && itIndex < BuffSize-1) {
-        return ptrBuffer[itIndex];
-    }
-    return nil;
-}
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRHashRule.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRHashRule.h
deleted file mode 100644
index f1558e8..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRHashRule.h
+++ /dev/null
@@ -1,72 +0,0 @@
-//
-//  ANTLRHashRule.h
-//  ANTLR
-//
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRuleMemo.h"
-#import "ANTLRPtrBuffer.h"
-
-#define GLOBAL_SCOPE       0
-#define LOCAL_SCOPE        1
-#define HASHSIZE         101
-#define HBUFSIZE      0x2000
-
-@interface ANTLRHashRule : ANTLRPtrBuffer {
-	//	ANTLRHashRule *fNext;
-    //    TStringPool *fPool;
-    NSInteger LastHash;
-    NSInteger mode;
-}
-
-//@property (copy) ANTLRHashRule *fNext;
-@property (getter=getLastHash, setter=setLastHash:) NSInteger LastHash;
-
-// Contruction/Destruction
-+ (id)newANTLRHashRule;
-+ (id)newANTLRHashRuleWithLen:(NSInteger)aBuffSize;
-- (id)init;
-- (id)initWithLen:(NSInteger)aBuffSize;
-- (void)dealloc;
-
-- (NSInteger)count;
-- (NSInteger)length;
-- (NSInteger)size;
-
-// Instance Methods
-- (void)deleteANTLRHashRule:(ANTLRRuleMemo *)np;
-- (void)delete_chain:(ANTLRRuleMemo *)np;
-- (ANTLRRuleMemo **)getPtrBuffer;
-- (void)setPtrBuffer:(ANTLRRuleMemo **)np;
-- (NSNumber *)getRuleMemoStopIndex:(NSInteger)aStartIndex;
-- (void)putRuleMemoAtStartIndex:(NSInteger)aStartIndex StopIndex:(NSInteger)aStopIndex;
-- (NSInteger)getMode;
-- (void)setMode:(NSInteger)aMode;
-- (void) insertObject:(ANTLRRuleMemo *)aRule atIndex:(NSInteger)Index;
-- (ANTLRRuleMemo *) objectAtIndex:(NSInteger)Index;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRHashRule.m b/runtime/ObjC/ANTLR.framework/Headers/ANTLRHashRule.m
deleted file mode 100644
index 93ce3a1..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRHashRule.m
+++ /dev/null
@@ -1,281 +0,0 @@
-//
-//  ANTLRHashRule.m
-//  ANTLR
-//
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#define SUCCESS (0)
-#define FAILURE (-1)
-#define ANTLR_MEMO_RULE_UNKNOWN -1
-
-#import "ANTLRHashRule.h"
-
-/*
- * Start of ANTLRHashRule
- */
-@implementation ANTLRHashRule
-
-@synthesize LastHash;
-
-+(id)newANTLRHashRule
-{
-    ANTLRHashRule *aNewANTLRHashRule;
-    
-    aNewANTLRHashRule = [[ANTLRHashRule alloc] init];
-	return( aNewANTLRHashRule );
-}
-
-+(id)newANTLRHashRuleWithLen:(NSInteger)aBuffSize
-{
-    ANTLRHashRule *aNewANTLRHashRule;
-    
-    aNewANTLRHashRule = [[ANTLRHashRule alloc] initWithLen:aBuffSize];
-	return( aNewANTLRHashRule );
-}
-
--(id)init
-{
-	if ((self = [super initWithLen:HASHSIZE]) != nil) {
-		fNext = nil;
-	}
-    return( self );
-}
-
--(id)initWithLen:(NSInteger)aBuffSize
-{
-	if ((self = [super initWithLen:aBuffSize]) != nil) {
-		fNext = nil;
-        mode = 0;
-	}
-    return( self );
-}
-
--(void)dealloc
-{
-    ANTLRRuleMemo *tmp, *rtmp;
-    int Index;
-	
-    if ( self.fNext != nil ) {
-        for( Index = 0; Index < BuffSize; Index++ ) {
-            tmp = ptrBuffer[Index];
-            while ( tmp && tmp != ptrBuffer[Index] ) {
-                rtmp = tmp;
-                // tmp = [tmp getfNext];
-                tmp = (ANTLRRuleMemo *)tmp.fNext;
-                [rtmp dealloc];
-            }
-        }
-    }
-	[super dealloc];
-}
-
-- (NSInteger)count
-{
-    id anElement;
-    NSInteger aCnt = 0;
-    
-    for (int i = 0; i < BuffSize; i++) {
-        anElement = ptrBuffer[i];
-        if ( anElement != nil ) {
-            aCnt++;
-        }
-    }
-    return aCnt;
-}
-                          
-- (NSInteger) length
-{
-    return BuffSize;
-}
-
-- (NSInteger) size
-{
-    id anElement;
-    NSInteger aSize = 0;
-    
-    for (int i = 0; i < BuffSize; i++) {
-        if ((anElement = ptrBuffer[i]) != nil) {
-            aSize += sizeof(id);
-        }
-    }
-    return aSize;
-}
-                                  
-                                  
--(void)deleteANTLRHashRule:(ANTLRRuleMemo *)np
-{
-    ANTLRRuleMemo *tmp, *rtmp;
-    int Index;
-    
-    if ( self.fNext != nil ) {
-        for( Index = 0; Index < BuffSize; Index++ ) {
-            tmp = ptrBuffer[Index];
-            while ( tmp && tmp != ptrBuffer[Index ] ) {
-                rtmp = tmp;
-                tmp = tmp.fNext;
-                [rtmp dealloc];
-            }
-        }
-    }
-}
-
--(void)delete_chain:(ANTLRRuleMemo *)np
-{
-    if ( np.fNext != nil )
-		[self delete_chain:np.fNext];
-	[np dealloc];
-}
-
--(ANTLRRuleMemo **)getPtrBuffer
-{
-	return( ptrBuffer );
-}
-
--(void)setPtrBuffer:(ANTLRRuleMemo **)np
-{
-	ptrBuffer = np;
-}
-
-- (NSNumber *)getRuleMemoStopIndex:(NSInteger)aStartIndex
-{
-    ANTLRRuleMemo *aRule;
-    NSNumber *stopIndex;
-    NSInteger anIndex;
-    
-    anIndex = ( aStartIndex >= BuffSize ) ? aStartIndex %= BuffSize : aStartIndex;
-    if ((aRule = ptrBuffer[anIndex]) == nil) {
-        return nil;
-    }
-    stopIndex = [aRule getStopIndex:aStartIndex];
-    return stopIndex;
-}
-
-- (void)putRuleMemo:(ANTLRRuleMemo *)aRule AtStartIndex:(NSInteger)aStartIndex
-{
-    NSInteger anIndex;
-    
-    anIndex = (aStartIndex >= BuffSize) ? aStartIndex %= BuffSize : aStartIndex;
-    if ( ptrBuffer[anIndex] == nil ) {
-        ptrBuffer[anIndex] = aRule;
-        [aRule retain];
-    }
-    else {
-        do {
-            if ( [aRule.startIndex integerValue] == aStartIndex ) {
-                [aRule setStartIndex:aRule.stopIndex];
-                return;
-            }
-            aRule = aRule.fNext;
-        } while ( aRule != nil );
-    }
-}
-
-- (void)putRuleMemoAtStartIndex:(NSInteger)aStartIndex StopIndex:(NSInteger)aStopIndex
-{
-    ANTLRRuleMemo *aRule, *newRule;
-    NSInteger anIndex;
-    NSInteger aMatchIndex;
-
-    anIndex = (aStartIndex >= BuffSize) ? aStartIndex %= BuffSize : aStartIndex;
-    if ((aRule = ptrBuffer[anIndex]) == nil ) {
-        aRule = [ANTLRRuleMemo newANTLRRuleMemoWithStartIndex:[NSNumber numberWithInteger:aStartIndex]
-                                                    StopIndex:[NSNumber numberWithInteger:aStopIndex]];
-        [aRule retain];
-        ptrBuffer[anIndex] = aRule;
-    }
-    else {
-        aMatchIndex = [aRule.startIndex integerValue];
-        if ( aStartIndex > aMatchIndex ) {
-            if ( aRule != ptrBuffer[anIndex] ) {
-                [aRule retain];
-            }
-            aRule.fNext = ptrBuffer[anIndex];
-            ptrBuffer[anIndex] = aRule;
-            return;
-        }
-        while (aRule.fNext != nil) {
-            aMatchIndex = [((ANTLRRuleMemo *)aRule.fNext).startIndex integerValue];
-            if ( aStartIndex > aMatchIndex ) {
-                newRule = [ANTLRRuleMemo newANTLRRuleMemoWithStartIndex:[NSNumber numberWithInteger:aStartIndex]
-                                                              StopIndex:[NSNumber numberWithInteger:aStopIndex]];
-                [newRule retain];
-                newRule.fNext = aRule.fNext;
-                aRule.fNext = newRule;
-                return;
-            }
-            if ( aMatchIndex == aStartIndex ) {
-                [aRule setStartIndex:aRule.stopIndex];
-                return;
-            }
-            aRule = aRule.fNext;
-        }
-    }
-}
-
-- (NSInteger)getLastHash
-{
-    return LastHash;
-}
-
-- (void)setLastHash:(NSInteger)aHash
-{
-    LastHash = aHash;
-}
-
-- (NSInteger)getMode
-{
-    return mode;
-}
-
-- (void)setMode:(NSInteger)aMode
-{
-    mode = aMode;
-}
-
-- (void) insertObject:(ANTLRRuleMemo *)aRule atIndex:(NSInteger)anIndex
-{
-    NSInteger Index;
-    
-    Index = ( anIndex >= BuffSize ) ? anIndex %= BuffSize : anIndex;
-    if (aRule != ptrBuffer[Index]) {
-        if (ptrBuffer[Index] != nil) {
-            [ptrBuffer[Index] release];
-        }
-        [aRule retain];
-    }
-    ptrBuffer[Index] = aRule;
-}
-
-- (ANTLRRuleMemo *)objectAtIndex:(NSInteger)anIndex
-{
-    NSInteger anIdx;
-
-    anIdx = ( anIndex >= BuffSize ) ? anIndex %= BuffSize : anIndex;
-    return ptrBuffer[anIdx];
-}
-
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRIntArray.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRIntArray.h
deleted file mode 100644
index 5269b23..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRIntArray.h
+++ /dev/null
@@ -1,60 +0,0 @@
-//
-//  ANTLRIntArray.h
-//  ANTLR
-//
-// Copyright (c) 2010 Ian Michell 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRPtrBuffer.h"
-
-#define ANTLR_INT_ARRAY_INITIAL_SIZE 10
-
-@interface ANTLRIntArray : ANTLRPtrBuffer 
-{
-}
-
-+ (ANTLRIntArray *)newANTLRIntArray;
-+ (ANTLRIntArray *)newANTLRIntArrayWithLen:(NSInteger)aLen;
-
-- (id) init;
-- (id) initWithLen:(NSInteger)aLen;
-
-- (void) dealloc;
-
-- (id) copyWithZone:(NSZone *)aZone;
-
-- (void) addInteger:(NSInteger) v;
-- (void) push:(NSInteger) v;
-- (NSInteger) pop;
-- (NSInteger) integerAtIndex:(NSInteger) i;
-- (void) insertInteger:(NSInteger)anInteger AtIndex:(NSInteger) idx;
-- (NSInteger) size;
-- (void) reset;
-
-- (NSInteger) count;
-- (NSInteger) size;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRIntStream.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRIntStream.h
deleted file mode 100755
index 3790cd9..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRIntStream.h
+++ /dev/null
@@ -1,93 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-@protocol ANTLRIntStream < NSObject, NSCopying >
-
-- (void) consume;
-
-// Get unichar at current input pointer + i ahead where i=1 is next character as int for including ANTLRCharStreamEOF (-1) in the data range
-- (NSInteger) LA:(NSInteger) i;
-
-// Tell the stream to start buffering if it hasn't already.  Return
-// current input position, index(), or some other marker so that
-// when passed to rewind() you get back to the same spot.
-// rewind(mark()) should not affect the input cursor.
-// TODO: problem in that lexer stream returns not index but some marker 
-
-- (NSInteger) mark;
-
-// Return the current input symbol index 0..n where n indicates the
-// last symbol has been read.
-
-- (NSInteger) getIndex;
-
-// Reset the stream so that next call to index would return marker.
-// The marker will usually be -index but it doesn't have to be.  It's
-// just a marker to indicate what state the stream was in.  This is
-// essentially calling -release: and -seek:.  If there are markers
-// created after this marker argument, this routine must unroll them
-// like a stack.  Assume the state the stream was in when this marker
-// was created.
-
-- (void) rewind;
-- (void) rewind:(NSInteger) marker;
-
-// You may want to commit to a backtrack but don't want to force the
-// stream to keep bookkeeping objects around for a marker that is
-// no longer necessary.  This will have the same behavior as
-// rewind() except it releases resources without the backward seek.
-
-- (void) release:(NSInteger) marker;
-
-// Set the input cursor to the position indicated by index.  This is
-// normally used to seek ahead in the input stream.  No buffering is
-// required to do this unless you know your stream will use seek to
-// move backwards such as when backtracking.
-// This is different from rewind in its multi-directional
-// requirement and in that its argument is strictly an input cursor (index).
-//
-// For char streams, seeking forward must update the stream state such
-// as line number.  For seeking backwards, you will be presumably
-// backtracking using the mark/rewind mechanism that restores state and
-// so this method does not need to update state when seeking backwards.
-//
-// Currently, this method is only used for efficient backtracking, but
-// in the future it may be used for incremental parsing.
-
-- (void) seek:(NSInteger) index;
-
-/** Only makes sense for streams that buffer everything up probably, but
- *  might be useful to display the entire stream or for testing.  This
- *  value includes a single EOF.
- */
-- (NSUInteger) size;
-/** Where are you getting symbols from?  Normally, implementations will
- *  pass the buck all the way to the lexer who can ask its input stream
- *  for the file name or whatever.
- */
-- (NSString *)getSourceName;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRLexer.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRLexer.h
deleted file mode 100755
index 5cfb36f..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRLexer.h
+++ /dev/null
@@ -1,90 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTokenSource.h"
-#import "ANTLRBaseRecognizer.h"
-#import "ANTLRRecognizerSharedState.h"
-#import "ANTLRCharStream.h"
-#import "ANTLRToken.h"
-#import "ANTLRCommonToken.h"
-#import "ANTLRRecognitionException.h"
-#import "ANTLRMismatchedTokenException.h"
-#import "ANTLRMismatchedRangeException.h"
-
-@interface ANTLRLexer : ANTLRBaseRecognizer <ANTLRTokenSource> {
-	id<ANTLRCharStream> input;      ///< The character stream we pull tokens out of.
-	NSUInteger ruleNestingLevel;
-}
-
-@property (retain, getter=getInput, setter=setInput:) id<ANTLRCharStream> input;
-@property (getter=getRuleNestingLevel, setter=setRuleNestingLevel) NSUInteger ruleNestingLevel;
-
-#pragma mark Initializer
-- (id) initWithCharStream:(id<ANTLRCharStream>) anInput;
-- (id) initWithCharStream:(id<ANTLRCharStream>)anInput State:(ANTLRRecognizerSharedState *)state;
-
-- (id) copyWithZone:(NSZone *)zone;
-
-- (void) reset;
-
-// - (ANTLRRecognizerSharedState *) state;
-
-#pragma mark Tokens
-- (id<ANTLRToken>)getToken;
-- (void) setToken: (id<ANTLRToken>) aToken;
-- (id<ANTLRToken>) nextToken;
-- (void) mTokens;		// abstract, defined in generated sources
-- (void) skip;
-- (id<ANTLRCharStream>) getInput;
-- (void) setInput:(id<ANTLRCharStream>)aCharStream;
-
-- (void) emit;
-- (void) emit:(id<ANTLRToken>)aToken;
-
-#pragma mark Matching
-- (void) matchString:(NSString *)aString;
-- (void) matchAny;
-- (void) matchChar:(unichar) aChar;
-- (void) matchRangeFromChar:(unichar)fromChar to:(unichar)toChar;
-
-#pragma mark Informational
-- (NSUInteger) getLine;
-- (NSUInteger) getCharPositionInLine;
-- (NSInteger) getIndex;
-- (NSString *) getText;
-- (void) setText:(NSString *) theText;
-
-// error handling
-- (void) reportError:(ANTLRRecognitionException *)e;
-- (NSString *)getErrorMessage:(ANTLRRecognitionException *)e TokenNames:(NSMutableArray *)tokenNames;
-- (NSString *)getCharErrorDisplay:(NSInteger)c;
-- (void) recover:(ANTLRRecognitionException *)e;
-- (void)traceIn:(NSString *)ruleName Index:(NSInteger)ruleIndex;
-- (void)traceOut:(NSString *)ruleName Index:(NSInteger)ruleIndex;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRLexerRuleReturnScope.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRLexerRuleReturnScope.h
deleted file mode 100755
index 18ae374..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRLexerRuleReturnScope.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-
-@interface ANTLRLexerRuleReturnScope : NSObject {
-	int startToken;
-	int stopToken;
-}
-
-- (NSInteger) getStart;
-- (void) setStart: (NSInteger) aStart;
-
-- (NSInteger) getStop;
-- (void) setStop: (NSInteger) aStop;
-
-
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRLinkBase.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRLinkBase.h
deleted file mode 100644
index 21019e6..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRLinkBase.h
+++ /dev/null
@@ -1,74 +0,0 @@
-//
-//  ANTLRLinkBase.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/14/10.
-//  [The "BSD licence"]
-//  Copyright (c) 2010 Alan Condit
-//  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.
-
-#import <Cocoa/Cocoa.h>
-
-@protocol ANTLRLinkList <NSObject>
-
-+ (id<ANTLRLinkList>)newANTLRLinkBase;
-+ (id<ANTLRLinkList>)newANTLRLinkBase:(id<ANTLRLinkList>)np Prev:(id<ANTLRLinkList>)pp;
-
-- (void) dealloc;
-
-- (id<ANTLRLinkList>) append:(id<ANTLRLinkList>)node;
-- (id<ANTLRLinkList>) insert:(id<ANTLRLinkList>)node;
-
-- (id<ANTLRLinkList>) getfNext;
-- (void) setFNext:(id<ANTLRLinkList>)np;
-- (id<ANTLRLinkList>)getfPrev;
-- (void) setFPrev:(id<ANTLRLinkList>)pp;
-
-@end
-
-@interface ANTLRLinkBase : NSObject <ANTLRLinkList> {
-	id<ANTLRLinkList> fPrev;
-	id<ANTLRLinkList> fNext;
-}
-
-@property (retain, getter=getfPrev, setter=setFPrev:) id<ANTLRLinkList> fPrev;
-@property (retain, getter=getfNext, setter=setFNext:) id<ANTLRLinkList> fNext;
-
-+ (id<ANTLRLinkList>)newANTLRLinkBase;
-+ (id<ANTLRLinkList>)newANTLRLinkBase:(id<ANTLRLinkList>)np Prev:(id<ANTLRLinkList>)pp;
-- (id<ANTLRLinkList>)init;
-- (id<ANTLRLinkList>)initWithPtr:(id)np Prev:(id)pp;
-- (void)dealloc;
-
-- (id) copyWithZone:(NSZone *)aZone;
-
-- (id<ANTLRLinkList>)append:(id<ANTLRLinkList>)node;
-- (id<ANTLRLinkList>)insert:(id<ANTLRLinkList>)node;
-
-- (id<ANTLRLinkList>)getfNext;
-- (void)setFNext:(id<ANTLRLinkList>) np;
-- (id<ANTLRLinkList>)getfPrev;
-- (void)setFPrev:(id<ANTLRLinkList>) pp;
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRLookaheadStream.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRLookaheadStream.h
deleted file mode 100644
index ad48ff5..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRLookaheadStream.h
+++ /dev/null
@@ -1,73 +0,0 @@
-//
-//  ANTLRLookaheadStream.h
-//  ANTLR
-//
-//  Created by Ian Michell on 26/04/2010.
-//  [The "BSD licence"]
-//  Copyright (c) 2010 Ian Michell 2010 Alan Condit
-//  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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRFastQueue.h"
-
-#define UNITIALIZED_EOF_ELEMENT_INDEX NSIntegerMax
-
-@interface ANTLRLookaheadStream : ANTLRFastQueue
-{
-	id eof;
-	NSInteger eofElementIndex;
-	NSInteger lastMarker;
-	NSInteger markDepth;
-}
-
-@property (readwrite, retain, getter=getEof, setter=setEof) id eof;
-@property (assign, getter=getEofElementIndex, setter=setEofElementIndex) NSInteger eofElementIndex;
-@property (assign, getter=getLastMarker, setter=setLastMarker) NSInteger lastMarker;
-@property (assign, getter=getMarkDepth, setter=setMarkDepth) NSInteger markDepth;
-
-- (id) initWithEOF:(id) o;
-- (id) nextElement;
-- (void) consume;
-- (void) sync:(NSInteger) need;
-- (void) fill:(NSInteger) n;
-- (id) LT:(NSInteger) i;
-- (id) LB:(NSInteger) i;
-- (id) currentSymbol;
-- (NSInteger) getIndex;
-- (NSInteger) mark;
-- (void) release:(NSInteger) marker;
-- (void) rewind:(NSInteger) marker;
-- (void) rewind;
-- (void) seek:(NSInteger) i;
-- (id) getEof;
-- (void) setEof:(id) anID;
-- (NSInteger) getEofElementIndex;
-- (void) setEofElementIndex:(NSInteger) anInt;
-- (NSInteger) getLastMarker;
-- (void) setLastMarker:(NSInteger) anInt;
-- (NSInteger) getMarkDepth;
-- (void) setMarkDepth:(NSInteger) anInt;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRMap.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRMap.h
deleted file mode 100644
index 80ad486..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRMap.h
+++ /dev/null
@@ -1,82 +0,0 @@
-//
-//  ANTLRMap.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/9/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRPtrBuffer.h"
-#import "ANTLRMapElement.h"
-
-//#define GLOBAL_SCOPE      0
-//#define LOCAL_SCOPE       1
-#define HASHSIZE            101
-#define HBUFSIZE            0x2000
-
-@interface ANTLRMap : ANTLRPtrBuffer {
-	//ANTLRMap *fNext; // found in superclass
-    // TStringPool *fPool;
-    NSInteger lastHash;
-}
-
-//@property (copy) ANTLRMap *fNext;
-@property (getter=getLastHash, setter=setLastHash:) NSInteger lastHash;
-
-// Contruction/Destruction
-+ (id)newANTLRMap;
-+ (id)newANTLRMapWithLen:(NSInteger)aHashSize;
-
-- (id)init;
-- (id)initWithLen:(NSInteger)cnt;
-- (void)dealloc;
-// Instance Methods
-- (NSInteger)count;
-- (NSInteger)length;
-- (NSInteger)size;
-/* clear -- reinitialize the maplist array */
-- (void) clear;
-/* form hash value for string s */
--(NSInteger)hash:(NSString *)s;
-/*   look for s in ptrBuffer  */
--(id)lookup:(NSString *)s;
-/* look for s in ptrBuffer  */
--(id)install:(ANTLRMapElement *)sym;
-/*
- * delete entry from list
- */
-- (void)deleteANTLRMap:(ANTLRMapElement *)np;
-- (NSInteger)RemoveSym:(NSString *)s;
-- (void)delete_chain:(ANTLRMapElement *)np;
-- (ANTLRMapElement *)getTType:(NSString *)name;
-- (ANTLRMapElement *)getName:(NSInteger)ttype;
-- (NSInteger)getNode:(ANTLRMapElement *)aNode;
-- (void)putNode:(NSInteger)aTType Node:(id)aNode;
-- (void)putName:(NSString *)name TType:(NSInteger)ttype;
-- (void)putName:(NSString *)name Node:(id)aNode;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRMapElement.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRMapElement.h
deleted file mode 100644
index e20d01c..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRMapElement.h
+++ /dev/null
@@ -1,65 +0,0 @@
-//
-//  ANTLRMapElement.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/8/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRBaseMapElement.h"
-
-@interface ANTLRMapElement : ANTLRBaseMapElement {
-    NSString *name;
-    id        node;
-}
-@property (retain, getter=getName, setter=setName:) NSString *name;
-@property (retain, getter=getNode, setter=setNode:) id node;
-
-+ (id) newANTLRMapElement;
-+ (id) newANTLRMapElementWithName:(NSString *)aName Type:(NSInteger)aTType;
-+ (id) newANTLRMapElementWithNode:(NSInteger)aTType Node:(id)aNode;
-+ (id) newANTLRMapElementWithName:(NSString *)aName Node:(id)aNode;
-+ (id) newANTLRMapElementWithObj1:(id)anObj1 Obj2:(id)anObj2;
-- (id) init;
-- (id) initWithName:(NSString *)aName Type:(NSInteger)aTType;
-- (id) initWithNode:(NSInteger)aTType Node:(id)aNode;
-- (id) initWithName:(NSString *)aName Node:(id)aNode;
-- (id) initWithObj1:(id)anObj1 Obj2:(id)anObj2;
-
-- (id) copyWithZone:(NSZone *)aZone;
-
-- (NSInteger) count;
-- (NSInteger) size;
-- (NSString *)getName;
-- (void)setName:(NSString *)aName;
-- (id)getNode;
-- (void)setNode:(id)aNode;
-- (void)putNode:(id)aNode;
-- (void)putNode:(id)aNode With:(NSInteger)uniqueID;
-//- (void)setObject:(id)aNode atIndex:anIndex;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRMismatchedNotSetException.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRMismatchedNotSetException.h
deleted file mode 100644
index 57391d5..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRMismatchedNotSetException.h
+++ /dev/null
@@ -1,51 +0,0 @@
-//
-//  ANTLRMismatchedNotSetException.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/13/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRecognitionException.h"
-#import "ANTLRBitSet.h"
-
-@interface ANTLRMismatchedNotSetException : ANTLRRecognitionException
-{
-    ANTLRBitSet *expecting;
-}
-@property (retain, getter=getExpecting, setter=setExpecting) ANTLRBitSet *expecting;
-
-- (ANTLRMismatchedNotSetException *)newANTLRMismatchedNotSetException;
-- (ANTLRMismatchedNotSetException *)newANTLRMismatchedNotSetException:(id<ANTLRIntStream>)anInput
-                                                               Follow:(ANTLRBitSet *)expecting;
-
-- (id) init;
-- (id) initWithStream:(id<ANTLRIntStream>)anInput Follow:(ANTLRBitSet *)expecting;
-
-- (NSString *)toString;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRMismatchedRangeException.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRMismatchedRangeException.h
deleted file mode 100755
index abda3bb..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRMismatchedRangeException.h
+++ /dev/null
@@ -1,40 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRecognitionException.h"
-
-@protocol ANTLRIntStream;
-
-
-@interface ANTLRMismatchedRangeException : ANTLRRecognitionException {
-	NSRange range;
-}
-
-+ (id) exceptionWithRange:(NSRange) aRange stream:(id<ANTLRIntStream>) theInput;
-- (id) initWithRange:(NSRange) aRange stream:(id<ANTLRIntStream>) theInput;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRMismatchedSetException.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRMismatchedSetException.h
deleted file mode 100755
index 3bd45fc..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRMismatchedSetException.h
+++ /dev/null
@@ -1,44 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRecognitionException.h"
-
-@interface ANTLRMismatchedSetException : ANTLRRecognitionException {
-	NSSet *expecting;
-}
-
-@property (retain, getter=getExpecting, setter=setExpecting:) NSSet *expecting;
-
-+ (id) exceptionWithSet:(NSSet *) theExpectedSet stream:(id<ANTLRIntStream>) theStream;
-- (id) initWithSet:(NSSet *) theExpectedSet stream:(id<ANTLRIntStream>) theStream;
-
-- (NSSet *) getExpecting;
-- (void) setExpecting: (NSSet *) anExpectedSet;
-
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRMismatchedTokenException.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRMismatchedTokenException.h
deleted file mode 100755
index 5e1d77d..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRMismatchedTokenException.h
+++ /dev/null
@@ -1,58 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRecognitionException.h"
-#import "ANTLRBitSet.h"
-
-@protocol ANTLRIntStream;
-
-@interface ANTLRMismatchedTokenException : ANTLRRecognitionException {
-	NSInteger expecting;
-	unichar expectingChar;
-	BOOL isTokenType;
-}
-
-@property (assign, getter=getExpecting, setter=setExpecting:) NSInteger expecting;
-@property (assign, getter=getExpectingChar, setter=setExpectingChar:) unichar expectingChar;
-@property (assign, getter=getIsTokenType, setter=setIsTokenType:) BOOL isTokenType;
-
-+ (id) newANTLRMismatchedTokenException:(NSInteger)expectedTokenType Stream:(id<ANTLRIntStream>)anInput;
-+ (id) newANTLRMismatchedTokenExceptionMissing:(NSInteger)expectedTokenType
-                                        Stream:(id<ANTLRIntStream>)anInput
-                                         Token:(id<ANTLRToken>)inserted;
-+ (id) newANTLRMismatchedTokenExceptionChar:(unichar)expectedCharacter Stream:(id<ANTLRIntStream>)anInput;
-+ (id) newANTLRMismatchedTokenExceptionStream:(id<ANTLRIntStream>)anInput
-                                    Exception:(NSException *)e
-                                       Follow:(ANTLRBitSet *)follow;
-- (id) initWithTokenType:(NSInteger)expectedTokenType Stream:(id<ANTLRIntStream>)anInput;
--(id) initWithTokenType:(NSInteger)expectedTokenType
-                 Stream:(id<ANTLRIntStream>)anInput
-                  Token:(id<ANTLRToken>)inserted;
-- (id) initWithCharacter:(unichar)expectedCharacter Stream:(id<ANTLRIntStream>)anInput;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRMismatchedTreeNodeException.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRMismatchedTreeNodeException.h
deleted file mode 100755
index b61ab51..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRMismatchedTreeNodeException.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRecognitionException.h"
-
-@protocol ANTLRIntStream;
-
-@interface ANTLRMismatchedTreeNodeException : ANTLRRecognitionException {
-	NSInteger expecting;
-}
-
-@property (getter=getExpecting, setter=setExpecting) NSInteger expecting;
-
-+ (id) newANTLRMismatchedTreeNodeException:(NSInteger)expectedTokenType Stream:(id<ANTLRIntStream>)anInput;
-- (id) initWithTokenType:(NSInteger) expectedTokenType Stream:(id<ANTLRIntStream>)anInput;
-
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRMissingTokenException.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRMissingTokenException.h
deleted file mode 100644
index 1398e25..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRMissingTokenException.h
+++ /dev/null
@@ -1,51 +0,0 @@
-//
-//  ANTLRMissingTokenException.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/8/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRMismatchedTokenException.h"
-#import "ANTLRToken.h"
-
-@interface ANTLRMissingTokenException : ANTLRMismatchedTokenException {
-    id<ANTLRToken> inserted;
-}
-/** Used for remote debugger deserialization */
-+ (id) newANTLRMissingTokenException;
-+ (id) newANTLRMissingTokenException:(NSInteger)expected
-                              Stream:(id<ANTLRIntStream>)anInput
-                                With:(id<ANTLRToken>)insertedToken;
-- (id) init;
-- (id) init:(NSInteger)expected Stream:(id<ANTLRIntStream>)anInput With:(id<ANTLRToken>)insertedToken;
-
-- (NSInteger) getMissingType;
-
-- (NSString *)toString;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRNoViableAltException.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRNoViableAltException.h
deleted file mode 100755
index b71baff..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRNoViableAltException.h
+++ /dev/null
@@ -1,43 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRecognitionException.h"
-#import "ANTLRIntStream.h"
-
-@interface ANTLRNoViableAltException : ANTLRRecognitionException {
-	int decisionNumber;
-	int stateNumber;
-}
-
-+ (ANTLRNoViableAltException *) newANTLRNoViableAltException:(NSInteger)theDecisionNumber state:(NSInteger)theStateNumber stream:(id<ANTLRIntStream>)theStream;
-- (ANTLRNoViableAltException *) initWithDecision:(NSInteger)theDecisionNumber state:(NSInteger)theStateNumber stream:(id<ANTLRIntStream>)theStream;
-
-- (void)setDecisionNumber:(NSInteger)decisionNumber;
-- (void)setStateNumber:(NSInteger)stateNumber;
-
-
-@end
\ No newline at end of file
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRNodeMapElement.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRNodeMapElement.h
deleted file mode 100644
index 1c0c916..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRNodeMapElement.h
+++ /dev/null
@@ -1,56 +0,0 @@
-//
-//  ANTLRRuleMapElement.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/16/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRBaseMapElement.h"
-#import "ANTLRTree.h"
-
-@interface ANTLRNodeMapElement : ANTLRBaseMapElement {
-    id<ANTLRTree> node;
-}
-
-@property (retain, getter=getNode, setter=setNode:) id node;
-
-+ (void)initialize;
-
-+ (id) newANTLRNodeMapElement;
-+ (id) newANTLRNodeMapElementWithIndex:(id)anIndex Node:(id<ANTLRTree>)aNode;
-- (id) init;
-- (id) initWithAnIndex:(id)anIndex Node:(id)aNode;
-
-- (id) copyWithZone:(NSZone *)aZone;
-
-- (id<ANTLRTree>)getNode;
-- (void)setNode:(id<ANTLRTree>)aNode;
-
-- (NSInteger)size;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRParseTree.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRParseTree.h
deleted file mode 100644
index 92554e3..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRParseTree.h
+++ /dev/null
@@ -1,60 +0,0 @@
-//
-//  ANTLRParseTree.h
-//  ANTLR
-//
-//  Created by Alan Condit on 7/12/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRBaseTree.h"
-#import "ANTLRCommonToken.h"
-
-@interface ANTLRParseTree : ANTLRBaseTree {
-	id<ANTLRToken> payload;
-	NSMutableArray *hiddenTokens;
-}
-/** A record of the rules used to match a token sequence.  The tokens
- *  end up as the leaves of this tree and rule nodes are the interior nodes.
- *  This really adds no functionality, it is just an alias for CommonTree
- *  that is more meaningful (specific) and holds a String to display for a node.
- */
-+ (ANTLRParseTree *)newANTLRParseTree:(id<ANTLRToken>)label;
-- (id)initWithLabel:(id<ANTLRToken>)label;
-
-- (id<ANTLRTree>)dupNode;
-- (NSInteger)getType;
-- (NSString *)getText;
-- (NSInteger)getTokenStartIndex;
-- (void)setTokenStartIndex:(NSInteger)index;
-- (NSInteger)getTokenStopIndex;
-- (void)setTokenStopIndex:(NSInteger)index;
-- (NSString *)toString;
-- (NSString *)toStringWithHiddenTokens;
-- (NSString *)toInputString;
-- (void)_toStringLeaves:(NSMutableString *)buf;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRParser.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRParser.h
deleted file mode 100755
index 5ddaf50..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRParser.h
+++ /dev/null
@@ -1,59 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRBaseRecognizer.h"
-#import "ANTLRCommonToken.h"
-#import "ANTLRTokenStream.h"
-
-@interface ANTLRParser : ANTLRBaseRecognizer {
-	id<ANTLRTokenStream> input;
-}
-+ (ANTLRParser *)newANTLRParser:(id<ANTLRTokenStream>)anInput;
-+ (ANTLRParser *)newANTLRParser:(id<ANTLRTokenStream>)anInput State:(ANTLRRecognizerSharedState *)aState;
-
-- (id) initWithTokenStream:(id<ANTLRTokenStream>)theStream;
-- (id) initWithTokenStream:(id<ANTLRTokenStream>)theStream State:(ANTLRRecognizerSharedState *)aState;
-
-- (id<ANTLRTokenStream>) getInput;
-- (void) setInput: (id<ANTLRTokenStream>) anInput;
-
-- (void) reset;
-
-- (id) getCurrentInputSymbol:(id<ANTLRTokenStream>)anInput;
-- (ANTLRCommonToken *)getMissingSymbol:(id<ANTLRTokenStream>)input
-                             Exception:(ANTLRRecognitionException *)e
-                                 TType:(NSInteger)expectedTokenType
-                                BitSet:(ANTLRBitSet *)follow;
-- (void) setTokenStream:(id<ANTLRTokenStream>)anInput;
-- (id<ANTLRTokenStream>)getTokenStream;
-- (NSString *)getSourceName;
-
-- (void) traceIn:(NSString *)ruleName Index:(int)ruleIndex;
-- (void) traceOut:(NSString *)ruleName Index:(NSInteger) ruleIndex;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRParserRuleReturnScope.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRParserRuleReturnScope.h
deleted file mode 100755
index aef3dd0..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRParserRuleReturnScope.h
+++ /dev/null
@@ -1,46 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRToken.h"
-#import "ANTLRRuleReturnScope.h"
-
-@interface ANTLRParserRuleReturnScope : ANTLRRuleReturnScope {
-	id<ANTLRToken> startToken;
-	id<ANTLRToken> stopToken;
-}
-@property (retain, getter=getStart, setter=setStart:) id<ANTLRToken> startToken;
-@property (retain, getter=getStop, setter=setStop:)   id<ANTLRToken> stopToken;
-
-- (id<ANTLRToken>) getStart;
-- (void) setStart: (id<ANTLRToken>) aStart;
-
-- (id<ANTLRToken>) getStop;
-- (void) setStop: (id<ANTLRToken>) aStop;
-
-- (id) copyWithZone:(NSZone *)theZone;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRPtrBuffer.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRPtrBuffer.h
deleted file mode 100644
index 188f597..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRPtrBuffer.h
+++ /dev/null
@@ -1,91 +0,0 @@
-//
-//  ANTLRPtrBuffer.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/9/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRLinkBase.h"
-
-//#define GLOBAL_SCOPE       0
-//#define LOCAL_SCOPE        1
-#define BUFFSIZE         101
-
-@interface ANTLRPtrBuffer : ANTLRLinkBase {
-	//ANTLRPtrBuffer *fNext;
-    NSInteger BuffSize;
-    NSMutableData *buffer;
-    id *ptrBuffer;
-    NSInteger count;
-    NSInteger ptr;
-}
-
-@property (getter=getBuffSize, setter=setBuffSize:) NSInteger BuffSize;
-@property (retain, getter=getBuffer, setter=setBuffer:) NSMutableData *buffer;
-@property (retain, getter=getPtrBuffer, setter=setPtrBuffer:) id *ptrBuffer;
-@property (getter=getCount, setter=setCount:) NSInteger count;
-@property (getter=getPtr, setter=setPtr:) NSInteger ptr;
-
-// Contruction/Destruction
-+(ANTLRPtrBuffer *)newANTLRPtrBuffer;
-+(ANTLRPtrBuffer *)newANTLRPtrBufferWithLen:(NSInteger)cnt;
--(id)init;
--(id)initWithLen:(NSInteger)cnt;
--(void)dealloc;
-
-// Instance Methods
-- (id) copyWithZone:(NSZone *)aZone;
-/* clear -- reinitialize the maplist array */
-- (void) clear;
-
-- (NSInteger)count;
-- (NSInteger)length;
-- (NSInteger)size;
-
-- (NSMutableData *)getBuffer;
-- (void)setBuffer:(NSMutableData *)np;
-- (NSInteger)getCount;
-- (void)setCount:(NSInteger)aCount;
-- (id *)getPtrBuffer;
-- (void)setPtrBuffer:(id *)np;
-- (NSInteger)getPtr;
-- (void)setPtr:(NSInteger)np;
-
-- (void) push:(id) v;
-- (id) pop;
-- (id) peek;
-
-- (void) addObject:(id) v;
-- (void) addObjectsFromArray:(ANTLRPtrBuffer *)anArray;
-- (void) insertObject:(id)aRule atIndex:(NSInteger)idx;
-- (id)   objectAtIndex:(NSInteger)idx;
-- (void) removeAllObjects;
-
-- (void) ensureCapacity:(NSInteger) index;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRRecognitionException.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRRecognitionException.h
deleted file mode 100755
index 853dc0e..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRRecognitionException.h
+++ /dev/null
@@ -1,72 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRuntimeException.h"
-#import "ANTLRToken.h"
-#import "ANTLRIntStream.h"
-#import "ANTLRTree.h"
-
-@interface ANTLRRecognitionException : ANTLRRuntimeException {
-	id<ANTLRIntStream> input;
-	NSInteger index;
-	id<ANTLRToken> token;
-	id<ANTLRTree> node;
-	unichar c;
-	NSInteger line;
-	NSInteger charPositionInLine;
-}
-
-@property (retain, getter=getStream, setter=setStream:) id<ANTLRIntStream> input;
-@property (retain, getter=getToken, setter=setToken:) id<ANTLRToken>token;
-@property (retain, getter=getNode, setter=setNode:) id<ANTLRTree>node;
-@property (getter=getLine, setter=setLine:) NSInteger line;
-@property (getter=getCharPositionInLine, setter=setCharPositionInLine:) NSInteger charPositionInLine;
-
-+ (ANTLRRecognitionException *) newANTLRRecognitionException;
-+ (ANTLRRecognitionException *) exceptionWithStream:(id<ANTLRIntStream>) anInputStream; 
-- (id) init;
-- (id) initWithStream:(id<ANTLRIntStream>)anInputStream;
-- (id) initWithStream:(id<ANTLRIntStream>)anInputStream reason:(NSString *)aReason;
-- (NSInteger) unexpectedType;
-- (id<ANTLRToken>)getUnexpectedToken;
-
-- (id<ANTLRIntStream>) getStream;
-- (void) setStream: (id<ANTLRIntStream>) aStream;
-
-- (id<ANTLRToken>) getToken;
-- (void) setToken: (id<ANTLRToken>) aToken;
-
-- (id<ANTLRTree>) getNode;
-- (void) setNode: (id<ANTLRTree>) aNode;
-
-- (NSString *)getMessage;
-
-- (NSInteger)getCharPositionInLine;
-- (void)setCharPositionInLine:(NSInteger)aPos;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRRecognizerSharedState.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRRecognizerSharedState.h
deleted file mode 100755
index 0430b79..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRRecognizerSharedState.h
+++ /dev/null
@@ -1,116 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRToken.h"
-#import "ANTLRBitSet.h"
-#import "ANTLRRuleStack.h"
-
-@interface ANTLRRecognizerSharedState : NSObject {
-	NSMutableArray *following;          // a stack of FOLLOW bitsets used for context sensitive prediction and recovery
-    NSInteger _fsp;                     // Follow stack pointer
-	BOOL errorRecovery;                 // are we recovering?
-	NSInteger lastErrorIndex;
-	BOOL failed;                        // indicate that some match failed
-    NSInteger syntaxErrors;
-	NSInteger backtracking;             // the level of backtracking
-	ANTLRRuleStack *ruleMemo;			// store previous results of matching rules so we don't have to do it again. Hook in incremental stuff here, too.
-
-	id<ANTLRToken> token;
-	NSInteger  tokenStartCharIndex;
-	NSUInteger tokenStartLine;
-	NSUInteger tokenStartCharPositionInLine;
-	NSUInteger channel;
-	NSUInteger type;
-	NSString   *text;
-}
-
-@property (retain, getter=getFollowing, setter=setFollowing:) NSMutableArray *following;
-@property (assign) NSInteger _fsp;
-@property (assign) BOOL errorRecovery;
-@property (assign) NSInteger lastErrorIndex;
-@property (assign, getter=getFailed, setter=setFailed:) BOOL failed;
-@property (assign) NSInteger syntaxErrors;
-@property (assign, getter=getBacktracking, setter=setBacktracking) NSInteger backtracking;
-@property (retain, getter=getRuleMemo, setter=setRuleMemo:) ANTLRRuleStack *ruleMemo;
-@property (copy, getter=getToken, setter=setToken) id<ANTLRToken> token;
-@property (getter=getType,setter=setType:) NSUInteger type;
-@property (getter=getChannel,setter=setChannel:) NSUInteger channel;
-@property (getter=getTokenStartLine,setter=setTokenStartLine:) NSUInteger tokenStartLine;
-@property (getter=getCharPositionInLine,setter=setCharPositionInLine:) NSUInteger tokenStartCharPositionInLine;
-@property (getter=getTokenStartCharIndex,setter=setTokenStartCharIndex:) NSInteger tokenStartCharIndex;
-@property (retain, getter=getText, setter=setText) NSString *text;
-
-+ (ANTLRRecognizerSharedState *) newANTLRRecognizerSharedState;
-+ (ANTLRRecognizerSharedState *) newANTLRRecognizerSharedStateWithRuleLen:(NSInteger)aLen;
-+ (ANTLRRecognizerSharedState *) newANTLRRecognizerSharedState:(ANTLRRecognizerSharedState *)aState;
-
-- (id) init;
-- (id) initWithRuleLen:(NSInteger)aLen;
-- (id) initWithState:(ANTLRRecognizerSharedState *)state;
-
-- (id<ANTLRToken>) getToken;
-- (void) setToken:(id<ANTLRToken>) theToken;
-
-- (NSUInteger) getType;
-- (void) setType:(NSUInteger) theTokenType;
-
-- (NSUInteger) getChannel;
-- (void) setChannel:(NSUInteger) theChannel;
-
-- (NSUInteger) getTokenStartLine;
-- (void) setTokenStartLine:(NSUInteger) theTokenStartLine;
-
-- (NSUInteger) getCharPositionInLine;
-- (void) setCharPositionInLine:(NSUInteger) theCharPosition;
-
-- (NSInteger) getTokenStartCharIndex;
-- (void) setTokenStartCharIndex:(NSInteger) theTokenStartCharIndex;
-
-- (NSString *) getText;
-- (void) setText:(NSString *) theText;
-
-
-- (NSMutableArray *) getFollowing;
-- (void)setFollowing:(NSMutableArray *)aFollow;
-- (ANTLRRuleStack *) getRuleMemo;
-- (void)setRuleMemo:(ANTLRRuleStack *)aRuleMemo;
-- (BOOL) isErrorRecovery;
-- (void) setIsErrorRecovery: (BOOL) flag;
-
-- (BOOL) getFailed;
-- (void) setFailed: (BOOL) flag;
-
-- (NSInteger)  getBacktracking;
-- (void) setBacktracking:(NSInteger) value;
-- (void) increaseBacktracking;
-- (void) decreaseBacktracking;
-- (BOOL) isBacktracking;
-
-- (NSInteger) lastErrorIndex;
-- (void) setLastErrorIndex:(NSInteger) value;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRRewriteRuleElementStream.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRRewriteRuleElementStream.h
deleted file mode 100755
index 132a0cc..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRRewriteRuleElementStream.h
+++ /dev/null
@@ -1,85 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTreeAdaptor.h"
-
-typedef union {
-    id single;
-    NSMutableArray *multiple;
-} Elements;
-
-// TODO: this should be separated into stream and enumerator classes
-@interface ANTLRRewriteRuleElementStream : NSObject {
-    NSInteger cursor;
-    BOOL dirty;        ///< indicates whether the stream should return copies of its elements, set to true after a call to -reset
-    BOOL isSingleElement;
-    Elements elements;
-    
-    NSString *elementDescription;
-    id<ANTLRTreeAdaptor> treeAdaptor;
-}
-
-@property (assign, getter=GetCursor, setter=SetCursor:) NSInteger cursor;
-@property (assign, getter=Getdirty, setter=Setdirty:) BOOL dirty;
-@property (assign, getter=GetIsSingleElement, setter=SetIsSingleElement:) BOOL isSingleElement;
-@property (assign, getter=GetElement, setter=SetElement:) Elements elements;
-@property (assign, getter=GetElementDescription, setter=SetElementDescription:) NSString *elementDescription;
-@property (retain, getter=GetTreeAdaptor, setter=SetTreeAdaptor:) id<ANTLRTreeAdaptor> treeAdaptor;
-
-+ (ANTLRRewriteRuleElementStream*) newANTLRRewriteRuleElementStream:(id<ANTLRTreeAdaptor>)aTreeAdaptor
-                                                        description:(NSString *)anElementDescription;
-+ (ANTLRRewriteRuleElementStream*) newANTLRRewriteRuleElementStream:(id<ANTLRTreeAdaptor>)aTreeAdaptor
-                                                        description:(NSString *)anElementDescription
-                                                            element:(id)anElement;
-+ (ANTLRRewriteRuleElementStream*) newANTLRRewriteRuleElementStream:(id<ANTLRTreeAdaptor>)aTreeAdaptor
-                                                        description:(NSString *)anElementDescription
-                                                           elements:(NSArray *)theElements;
-
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription;
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription element:(id)anElement;
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription elements:(NSArray *)theElements;
-
-- (void)reset;
-
-- (id<ANTLRTreeAdaptor>) getTreeAdaptor;
-- (void) setTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor;
-
-- (void) addElement:(id)anElement;
-- (NSInteger) size;
- 
-- (BOOL) hasNext;
-- (id<ANTLRTree>) nextTree;
-- (id<ANTLRTree>) _next;       // internal: TODO: redesign if necessary. maybe delegate
-
-- (id) copyElement:(id)element;
-- (id) toTree:(id)element;
-
-- (NSString *) getDescription;
-- (void) setDescription:(NSString *)description;
-
-@end
-
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRRewriteRuleSubtreeStream.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRRewriteRuleSubtreeStream.h
deleted file mode 100755
index 1d18b24..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRRewriteRuleSubtreeStream.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRewriteRuleElementStream.h"
-
-@interface ANTLRRewriteRuleSubtreeStream : ANTLRRewriteRuleElementStream {
-
-}
-
-+ (ANTLRRewriteRuleSubtreeStream *) newANTLRRewriteRuleSubtreeStream:(id<ANTLRTreeAdaptor>)aTreeAdaptor
-                                                         description:(NSString *)anElementDescription;
-+ (ANTLRRewriteRuleSubtreeStream *) newANTLRRewriteRuleSubtreeStream:(id<ANTLRTreeAdaptor>)aTreeAdaptor
-                                                         description:(NSString *)anElementDescription
-                                                             element:(id)anElement;
-+ (ANTLRRewriteRuleSubtreeStream *) newANTLRRewriteRuleSubtreeStream:(id<ANTLRTreeAdaptor>)aTreeAdaptor
-                                                         description:(NSString *)anElementDescription
-                                                            elements:(NSArray *)theElements;
-
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription;
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription element:(id)anElement;
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription elements:(NSArray *)theElements;
-
-- (id) nextNode;
-- (id) dup:(id)element;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRRewriteRuleTokenStream.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRRewriteRuleTokenStream.h
deleted file mode 100755
index 3a516de..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRRewriteRuleTokenStream.h
+++ /dev/null
@@ -1,66 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRewriteRuleElementStream.h"
-
-
-@interface ANTLRRewriteRuleTokenStream : ANTLRRewriteRuleElementStream {
-
-}
-
-+ (id) newANTLRRewriteRuleTokenStream:(id<ANTLRTreeAdaptor>)anAdaptor
-                          description:(NSString *)elementDescription;
-/** Create a stream with one element */
-+ (id) newANTLRRewriteRuleTokenStream:(id<ANTLRTreeAdaptor>)adaptor
-                          description:(NSString *)elementDescription
-                              element:(id) oneElement;
-/** Create a stream, but feed off an existing list */
-+ (id) newANTLRRewriteRuleTokenStream:(id<ANTLRTreeAdaptor>)adaptor
-                          description:(NSString *)elementDescription
-                             elements:(NSMutableArray *)elements;
-
-- (id) init;
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)anAdaptor
-               description:(NSString *)aDescription;
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)anAdaptor 
-               description:(NSString *)aDescription
-                   element:(id)element;
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)anAdaptor
-               description:(NSString *)aDescription
-                  elements:(NSMutableArray *)elements;
-                               
-/** Get next token from stream and make a node for it */
-- (id) nextNode;
-
-- (id) nextToken;
-
-/** Don't convert to a tree unless they explicitly call nextTree.
- *  This way we can do hetero tree nodes in rewrite.
- */
-- (id<ANTLRTree>) toTree:(id<ANTLRToken>)element;
-
-@end
\ No newline at end of file
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRRuleMapElement.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRRuleMapElement.h
deleted file mode 100644
index e040b18..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRRuleMapElement.h
+++ /dev/null
@@ -1,55 +0,0 @@
-//
-//  ANTLRRuleMapElement.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/16/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRBaseMapElement.h"
-
-@interface ANTLRRuleMapElement : ANTLRBaseMapElement {
-    NSNumber *ruleNum;
-}
-
-@property (retain, getter=getRuleNum, setter=setRuleNum:) NSNumber *ruleNum;
-
-+ (ANTLRRuleMapElement *) newANTLRRuleMapElement;
-+ (ANTLRRuleMapElement *) newANTLRRuleMapElementWithIndex:(NSNumber *)anIdx;
-+ (ANTLRRuleMapElement *) newANTLRRuleMapElementWithIndex:(NSNumber *)anIdx RuleNum:(NSNumber *)aRuleNum;
-- (id) init;
-- (id) initWithAnIndex:(NSNumber *)anIdx;
-- (id) initWithAnIndex:(NSNumber *)anIdx RuleNum:(NSNumber *)aRuleNum;
-
-- (id) copyWithZone:(NSZone *)aZone;
-
-- (NSNumber *)getRuleNum;
-- (void)setRuleNum:(NSNumber *)aRuleNum;
-
-- (NSInteger)size;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRRuleMemo.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRRuleMemo.h
deleted file mode 100644
index 63a5ae2..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRRuleMemo.h
+++ /dev/null
@@ -1,60 +0,0 @@
-//
-//  ANTLRRuleMemo.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/16/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRLinkBase.h"
-
-@interface ANTLRRuleMemo : ANTLRLinkBase {
-    NSNumber *startIndex;
-    NSNumber *stopIndex;
-}
-
-@property (retain, getter=getStartIndex, setter=setStartIndex) NSNumber *startIndex;
-@property (retain, getter=getStopIndex, setter=setStopIndex) NSNumber *stopIndex;
-
-+ (ANTLRRuleMemo *)newANTLRRuleMemo;
-+ (ANTLRRuleMemo *)newANTLRRuleMemoWithStartIndex:(NSNumber *)aStartIndex StopIndex:(NSNumber *)aStopIndex;
-
-- (id) init;
-- (id) initWithStartIndex:(NSNumber *)aStartIndex StopIndex:(NSNumber *)aStopIndex;
-
-- (NSInteger)count;
-- (NSInteger)size;
-
-- (ANTLRRuleMemo *)getRuleWithStartIndex:(NSInteger)aStartIndex;
-- (NSNumber *)getStartIndex:(NSInteger)aStartIndex;
-- (NSNumber *)getStopIndex:(NSInteger)aStartIndex;
-- (NSNumber *)getStartIndex;
-- (void)setStartIndex:(NSNumber *)aStartIndex;
-- (NSNumber *)getStopIndex;
-- (void)setStopIndex:(NSNumber *)aStopIndex;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRRuleReturnScope.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRRuleReturnScope.h
deleted file mode 100644
index 4750c16..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRRuleReturnScope.h
+++ /dev/null
@@ -1,55 +0,0 @@
-//
-//  ANTLRRuleReturnScope.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/17/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRToken.h"
-
-@interface ANTLRRuleReturnScope : NSObject <NSCopying> {
-
-}
-
-/** Return the start token or tree */
-- (id<ANTLRToken>) getStart;
-
-/** Return the stop token or tree */
-- (id<ANTLRToken>) getStop;
-
-/** Has a value potentially if output=AST; */
-- (id) getNode;
-
-/** Has a value potentially if output=template; Don't use StringTemplate
- *  type as it then causes a dependency with ST lib.
- */
-- (id) getTemplate;
-
-- (id) copyWithZone:(NSZone *)theZone;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRRuleStack.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRRuleStack.h
deleted file mode 100644
index 12d450b..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRRuleStack.h
+++ /dev/null
@@ -1,63 +0,0 @@
-//
-//  ANTLRRuleStack.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/9/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRBaseStack.h"
-#import "ANTLRHashRule.h"
-
-//#define GLOBAL_SCOPE       0
-//#define LOCAL_SCOPE        1
-#define HASHSIZE         101
-#define HBUFSIZE      0x2000
-
-@interface ANTLRRuleStack : ANTLRBaseStack {
-}
-
-// Contruction/Destruction
-+(ANTLRRuleStack *)newANTLRRuleStack;
-+(ANTLRRuleStack *)newANTLRRuleStack:(NSInteger)cnt;
--(id)init;
--(id)initWithLen:(NSInteger)cnt;
--(void)dealloc;
-
-// Instance Methods
-- (id) copyWithZone:(NSZone *)aZone;
-/* clear -- reinitialize the maplist array */
-
-- (NSInteger)count;
-- (NSInteger)size;
-
-- (ANTLRHashRule *) pop;
-
-- (void) insertObject:(ANTLRHashRule *)aHashRule atIndex:(NSInteger)idx;
-- (ANTLRHashRule *)objectAtIndex:(NSInteger)idx;
-- (void)putHashRuleAtRuleIndex:(NSInteger)aRuleIndex StartIndex:(NSInteger)aStartIndex StopIndex:(NSInteger)aStopIndex;
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRRuleStack.m b/runtime/ObjC/ANTLR.framework/Headers/ANTLRRuleStack.m
deleted file mode 100644
index 909192f..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRRuleStack.m
+++ /dev/null
@@ -1,147 +0,0 @@
-//
-//  ANTLRRuleStack.m
-//  ANTLR
-//
-//  Created by Alan Condit on 6/9/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#define SUCCESS (0)
-#define FAILURE (-1)
-
-#import "ANTLRRuleStack.h"
-#import "ANTLRTree.h"
-
-/*
- * Start of ANTLRRuleStack
- */
-@implementation ANTLRRuleStack
-
-+ (ANTLRRuleStack *)newANTLRRuleStack
-{
-    return [[ANTLRRuleStack alloc] init];
-}
-
-+ (ANTLRRuleStack *)newANTLRRuleStack:(NSInteger)cnt
-{
-    return [[ANTLRRuleStack alloc] initWithLen:cnt];
-}
-
-- (id)init
-{
-	if ((self = [super init]) != nil) {
-	}
-    return( self );
-}
-
-- (id)initWithLen:(NSInteger)cnt
-{
-	if ((self = [super initWithLen:cnt]) != nil) {
-	}
-    return( self );
-}
-
-- (void)dealloc
-{
-	[super dealloc];
-}
-
-- (id) copyWithZone:(NSZone *)aZone
-{
-    return [super copyWithZone:aZone];
-}
-
-- (NSInteger)count
-{
-    ANTLRRuleMemo *anElement;
-    NSInteger aCnt = 0;
-    for( int i = 0; i < BuffSize; i++ ) {
-        if ((anElement = ptrBuffer[i]) != nil)
-            aCnt++;
-    }
-    return aCnt;
-}
-
-- (NSInteger)size
-{
-    ANTLRRuleMemo *anElement;
-    NSInteger aSize = 0;
-    for( int i = 0; i < BuffSize; i++ ) {
-        if ((anElement = ptrBuffer[i]) != nil) {
-            aSize++;
-        }
-    }
-    return aSize;
-}
-
-- (ANTLRHashRule *)pop
-{
-    return (ANTLRHashRule *)[super pop];
-}
-
-- (void) insertObject:(ANTLRHashRule *)aRule atIndex:(NSInteger)idx
-{
-    if ( idx >= BuffSize ) {
-        NSLog( @"In ANTLRRuleStack attempting to insert aRule at Index %d, but Buffer is only %d long\n", idx, BuffSize );
-        [self ensureCapacity:idx];
-    }
-    if ( aRule != ptrBuffer[idx] ) {
-        if (ptrBuffer[idx] != nil) [ptrBuffer[idx] release];
-        [aRule retain];
-    }
-    ptrBuffer[idx] = aRule;
-}
-
-- (ANTLRHashRule *)objectAtIndex:(NSInteger)idx
-{
-    if (idx < BuffSize) {
-        return ptrBuffer[idx];
-    }
-    return nil;
-}
-
-- (void)putHashRuleAtRuleIndex:(NSInteger)aRuleIndex StartIndex:(NSInteger)aStartIndex StopIndex:(NSInteger)aStopIndex
-{
-    ANTLRHashRule *aHashRule;
-    ANTLRRuleMemo *aRuleMemo;
-
-    if (aRuleIndex >= BuffSize) {
-        NSLog( @"putHashRuleAtRuleIndex attempting to insert aRule at Index %d, but Buffer is only %d long\n", aRuleIndex, BuffSize );
-        [self ensureCapacity:aRuleIndex];
-    }
-    if ((aHashRule = ptrBuffer[aRuleIndex]) == nil) {
-        aHashRule = [[ANTLRHashRule newANTLRHashRuleWithLen:17] retain];
-        ptrBuffer[aRuleIndex] = aHashRule;
-    }
-    if (( aRuleMemo = [aHashRule objectAtIndex:aStartIndex] ) == nil ) {
-        aRuleMemo = [[ANTLRRuleMemo newANTLRRuleMemo] retain];
-        [aHashRule insertObject:aRuleMemo atIndex:aStartIndex];
-    }
-    [aRuleMemo setStartIndex:[NSNumber numberWithInteger:aStartIndex]];
-    [aRuleMemo setStopIndex:[NSNumber numberWithInteger:aStopIndex]];
-}
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRRuntimeException.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRRuntimeException.h
deleted file mode 100644
index 6cf0918..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRRuntimeException.h
+++ /dev/null
@@ -1,54 +0,0 @@
-//
-//  ANTLRRuntimeException.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/5/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-
-@interface ANTLRRuntimeException : NSException
-{
-}
-
-+ (ANTLRRuntimeException *) newANTLRNoSuchElementException:(NSString *)aReason;
-+ (ANTLRRuntimeException *) newANTLRIllegalArgumentException:(NSString *)aReason;
-+ (ANTLRRuntimeException *) newANTLRRuntimeException:(NSString *)aReason;
-+ (ANTLRRuntimeException *) newANTLRRuntimeException:(NSString *)aName reason:(NSString *)aReason;
-+ (ANTLRRuntimeException *) newANTLRRuntimeException:(NSString *)aName reason:(NSString *)aReason userInfo:aUserInfo;
-
-- (id) init;
-- (id)initWithRuntime:(NSString *)aReason;
-- (id)initWithReason:(NSString *)aReason;
-- (id)initWithName:(NSString *)aName reason:(NSString *)aReason;
-- (id)initWithName:(NSString *)aName reason:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo;
-
-- (NSString *) Description;
-
-//    - (void)setDecisionNumber:(NSInteger)decisionNumber;
-//    - (void)setStateNumber:(NSInteger)stateNumber;
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRStreamEnumerator.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRStreamEnumerator.h
deleted file mode 100644
index a0e0f69..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRStreamEnumerator.h
+++ /dev/null
@@ -1,45 +0,0 @@
-//
-//  ANTLRStreamEnumertor.h
-//  ANTLR
-//
-//  Created by Ian Michell on 29/04/2010.
-// [The "BSD licence"]
-// Copyright (c) 2010 Ian Michell 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-
-
-@interface ANTLRStreamEnumerator : NSEnumerator 
-{
-	NSInteger i;
-	id eof;
-	NSMutableArray *nodes;
-}
-
--(id) initWithNodes:(NSMutableArray *) n andEOF:(id) o;
--(BOOL) hasNext;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRStringStream.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRStringStream.h
deleted file mode 100755
index 2b13c7d..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRStringStream.h
+++ /dev/null
@@ -1,126 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRCharStream.h"
-#import "ANTLRCharStreamState.h"
-#import "ANTLRPtrBuffer.h"
-
-@interface ANTLRStringStream : NSObject < ANTLRCharStream > {
-	NSString *data;
-	NSInteger n;
-	NSInteger p;
-	NSInteger line;
-	NSInteger charPositionInLine;
-	NSInteger markDepth;
-	ANTLRPtrBuffer *markers;
-	NSInteger lastMarker;
-	NSString *name;
-    ANTLRCharStreamState *charState;
-}
-
-@property (retain, getter=getData,setter=setData:) NSString *data;
-@property (getter=getP,setter=setP:) NSInteger p;
-@property (getter=getN,setter=setN:) NSInteger n;
-@property (getter=getLine,setter=setLine:) NSInteger line;
-@property (getter=getCharPositionInLine,setter=setCharPositionInLine:) NSInteger charPositionInLine;
-@property (getter=getMarkDepth,setter=setMarkDepth:) NSInteger markDepth;
-@property (retain, getter=getMarkers, setter=setMarkers:) ANTLRPtrBuffer *markers;
-@property (getter=getLastMarker,setter=setLastMarker:) NSInteger lastMarker;
-@property (retain, getter=getSourceName, setter=setSourceName:) NSString *name;
-@property (retain, getter=getCharState, setter=setCharState:) ANTLRCharStreamState *charState;
-
-+ newANTLRStringStream;
-
-+ newANTLRStringStream:(NSString *)aString;
-
-+ newANTLRStringStream:(char *)myData Count:(NSInteger)numBytes;
-
-- (id) init;
-
-// this initializer copies the string
-- (id) initWithString:(NSString *) theString;
-
-// This is the preferred constructor as no data is copied
-- (id) initWithStringNoCopy:(NSString *) theString;
-
-- (id) initWithData:(char *)myData Count:(NSInteger)numBytes;
-
-- (void) dealloc;
-
-- (id) copyWithZone:(NSZone *)aZone;
-
-// reset the stream's state, but keep the data to feed off
-- (void) reset;
-// consume one character from the stream
-- (void) consume;
-
-// look ahead i characters
-- (NSInteger) LA:(NSInteger) i;
-- (NSInteger) LT:(NSInteger) i;
-
-// returns the position of the current input symbol
-- (NSInteger) getIndex;
-// total length of the input data
-- (NSInteger) size;
-
-// seek and rewind in the stream
-- (NSInteger) mark;
-- (void) rewind:(NSInteger) marker;
-- (void) rewind;
-- (void) release:(NSInteger) marker;
-- (void) seek:(NSInteger) index;
-
-// provide the streams data (e.g. for tokens using indices)
-- (NSString *) substring:(NSInteger)startIndex To:(NSInteger)stopIndex;
-- (NSString *) substringWithRange:(NSRange) theRange;
-
-// used for tracking the current position in the input stream
-- (NSInteger) getLine;
-- (void) setLine:(NSInteger) theLine;
-- (NSInteger) getCharPositionInLine;
-- (void) setCharPositionInLine:(NSInteger) thePos;
-
-- (NSInteger) getN;
-- (void) setN:(NSInteger)num;
-
-- (NSInteger) getP;
-- (void) setP:(NSInteger)num;
-
-- (ANTLRPtrBuffer *)getMarkers;
-- (void) setMarkers:(ANTLRPtrBuffer *)aMarkerList;
-
-- (NSString *)getSourceName;
-
-- (NSString *)toString;
-
-// accessors to the raw data of this stream
-- (NSString *) getData;
-- (void) setData: (NSString *) aData;
-
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRSymbolStack.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRSymbolStack.h
deleted file mode 100644
index 169df9f..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRSymbolStack.h
+++ /dev/null
@@ -1,75 +0,0 @@
-//
-//  ANTLRSymbolStack.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/9/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRBaseStack.h"
-// #import "ANTLRSymbolScope.h"
-
-//#define GLOBAL_SCOPE       0
-//#define LOCAL_SCOPE        1
-#define HASHSIZE         101
-#define HBUFSIZE      0x2000
-
-@interface ANTLRSymbolsScope : NSObject
-{
-    
-}
-
-+ (ANTLRSymbolsScope *)newANTLRSymbolsScope;
-
-- (id)init;
-@end
-
-
-@interface ANTLRSymbolStack : ANTLRBaseStack {
-}
-
-// Contruction/Destruction
-+(ANTLRSymbolStack *)newANTLRSymbolStack;
-+(ANTLRSymbolStack *)newANTLRSymbolStackWithLen:(NSInteger)cnt;
--(id)init;
--(id)initWithLen:(NSInteger)cnt;
--(void)dealloc;
-
-// Instance Methods
-- (id) copyWithZone:(NSZone *)aZone;
-/* clear -- reinitialize the maplist array */
-
--(ANTLRSymbolsScope *)getHashMapEntry:(NSInteger)idx;
-
--(ANTLRSymbolsScope **)getHashMap;
-
--(ANTLRSymbolsScope *) pop;
-
-- (void) insertObject:(ANTLRSymbolsScope *)aScope atIndex:(NSInteger)idx;
-- (ANTLRSymbolsScope *)objectAtIndex:(NSInteger)idx;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRSymbolStack.m b/runtime/ObjC/ANTLR.framework/Headers/ANTLRSymbolStack.m
deleted file mode 100644
index 1dd6775..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRSymbolStack.m
+++ /dev/null
@@ -1,123 +0,0 @@
-//
-//  ANTLRSymbolStack.m
-//  ANTLR
-//
-//  Created by Alan Condit on 6/9/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#define SUCCESS (0)
-#define FAILURE (-1)
-
-#import "ANTLRSymbolStack.h"
-#import "ANTLRTree.h"
-
-
-@implementation ANTLRSymbolsScope
-
-+ (ANTLRSymbolsScope *)newANTLRSymbolsScope
-{
-    return( [[ANTLRSymbolsScope alloc] init] );
-}
-
-- (id)init
-{
-    if ((self = [super init]) != nil) {
-    }
-    return (self);
-}
-
-@end
-
-/*
- * Start of ANTLRSymbolStack
- */
-@implementation ANTLRSymbolStack
-
-+(ANTLRSymbolStack *)newANTLRSymbolStack
-{
-    return [[ANTLRSymbolStack alloc] init];
-}
-
-+(ANTLRSymbolStack *)newANTLRSymbolStackWithLen:(NSInteger)cnt
-{
-    return [[ANTLRSymbolStack alloc] initWithLen:cnt];
-}
-
--(id)init
-{
-	if ((self = [super init]) != nil) {
-	}
-    return( self );
-}
-
--(id)initWithLen:(NSInteger)cnt
-{
-	if ((self = [super initWithLen:cnt]) != nil) {
-	}
-    return( self );
-}
-
--(void)dealloc
-{
-	[super dealloc];
-}
-
-- (id) copyWithZone:(NSZone *)aZone
-{
-    return [super copyWithZone:aZone];
-}
-
--(ANTLRSymbolsScope *)getHashMapEntry:(NSInteger)idx
-{
-	return( (ANTLRSymbolsScope *)[super objectAtIndex:idx] );
-}
-
--(ANTLRSymbolsScope **)getHashMap
-{
-	return( (ANTLRSymbolsScope **)ptrBuffer );
-}
-
--(ANTLRSymbolsScope *) pop
-{
-    return (ANTLRSymbolsScope *)[super pop];
-}
-
-- (void) insertObject:(ANTLRSymbolsScope *)aRule atIndex:(NSInteger)idx
-{
-    if (aRule != ptrBuffer[idx]) {
-        if (ptrBuffer[idx] != nil) [ptrBuffer[idx] release];
-        [aRule retain];
-    }
-    ptrBuffer[idx] = aRule;
-}
-
-- (ANTLRSymbolsScope *)objectAtIndex:(NSInteger)idx
-{
-    return (ANTLRSymbolsScope *)[super objectAtIndex:idx];
-}
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRToken+DebuggerSupport.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRToken+DebuggerSupport.h
deleted file mode 100755
index 659e763..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRToken+DebuggerSupport.h
+++ /dev/null
@@ -1,41 +0,0 @@
-//
-//  ANTLRToken+DebuggerSupport.h
-//  ANTLR
-//
-//  Created by Kay Röpke on 03.12.2006.
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-//
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRToken.h"
-#import "ANTLRCommonToken.h"
-
-@interface ANTLRCommonToken(DebuggerSupport)
-
-- (NSString *)debuggerDescription;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRToken.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRToken.h
deleted file mode 100755
index 64524f0..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRToken.h
+++ /dev/null
@@ -1,79 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-
-typedef enum {
-	ANTLRTokenTypeEOF = -1,
-	ANTLRTokenTypeInvalid,
-	ANTLRTokenTypeEOR,
-	ANTLRTokenTypeDOWN,
-	ANTLRTokenTypeUP,
-	ANTLRTokenTypeMIN
-} ANTLRTokenType;
-
-typedef enum {
-	ANTLRTokenChannelDefault = 0,
-    ANTLRTokenChannelHidden = 99
-} ANTLRTokenChannel;
-
-#define HIDDEN 99
-
-@protocol ANTLRToken < NSObject, NSCopying >
-
-// The singleton eofToken instance.
-+ (id<ANTLRToken>) eofToken;
-// The default channel for this class of Tokens
-+ (ANTLRTokenChannel) defaultChannel;
-
-// provide hooks to explicitely set the text as opposed to use the indices into the CharStream
-- (NSString *) getText;
-- (void) setText:(NSString *) theText;
-
-- (NSInteger) getType;
-- (void) setType: (NSInteger) aType;
-
-// ANTLR v3 provides automatic line and position tracking. Subclasses do not need to
-// override these, if they do not want to store line/pos tracking information
-- (NSUInteger) getLine;
-- (void) setLine: (NSUInteger) aLine;
-
-- (NSUInteger) getCharPositionInLine;
-- (void) setCharPositionInLine: (NSUInteger) aCharPositionInLine;
-
-// explicitely change the channel this Token is on. The default parser implementation
-// just sees the defaultChannel
-// Common idiom is to put whitespace tokens on channel 99.
-- (NSUInteger) getChannel;
-- (void) setChannel: (NSUInteger) aChannel;
-
-// the index of this Token into the TokenStream
-- (NSUInteger) getTokenIndex;
-- (void) setTokenIndex: (NSUInteger) aTokenIndex;
-- (NSString *)toString;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRTokenRewriteStream.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRTokenRewriteStream.h
deleted file mode 100644
index 0d8681f..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRTokenRewriteStream.h
+++ /dev/null
@@ -1,170 +0,0 @@
-//
-//  ANTLRTokenRewriteStream.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/19/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRCommonTokenStream.h"
-#import "ANTLRLinkBase.h"
-#import "ANTLRHashMap.h"
-#import "ANTLRMapElement.h"
-#import "ANTLRTokenSource.h"
-
-// Define the rewrite operation hierarchy
-
-@interface ANTLRRewriteOperation : ANTLRCommonTokenStream
-{
-/** What index into rewrites List are we? */
-NSInteger instructionIndex;
-/** Token buffer index. */
-NSInteger index;
-NSString *text;
-}
-
-@property (getter=getInstructionIndex, setter=setInstructionIndex:) NSInteger instructionIndex;
-@property (getter=getIndex, setter=setIndex:) NSInteger index;
-@property (retain, getter=getText, setter=setText:) NSString *text;
-
-+ (ANTLRRewriteOperation *) newANTLRRewriteOperation:(NSInteger)index Text:(NSString *)text;
-
-- (id) initWithIndex:(NSInteger)anIndex Text:(NSString *)theText;
-
-/** Execute the rewrite operation by possibly adding to the buffer.
- *  Return the index of the next token to operate on.
- */
-- (NSInteger) execute:(NSString *)buf;
-
-- (NSString *)toString;
-- (NSInteger) indexOf:(char)aChar inString:(NSString *)aString;
-@end
-
-@interface ANTLRInsertBeforeOp : ANTLRRewriteOperation {
-}
-
-+ (ANTLRInsertBeforeOp *) newANTLRInsertBeforeOp:(NSInteger)anIndex Text:(NSString *)theText;
-- (id) initWithIndex:(NSInteger)anIndex Text:(NSString *)theText;
-
-@end
-
-/** I'm going to try replacing range from x..y with (y-x)+1 ReplaceOp
- *  instructions.
- */
-@interface ANTLRReplaceOp : ANTLRRewriteOperation {
-    NSInteger lastIndex;
-}
-
-@property (getter=getLastIndex, setter=setLastIndex:) NSInteger lastIndex;
-
-+ (ANTLRReplaceOp *) newANTLRReplaceOp:(NSInteger)from ToIndex:(NSInteger)to Text:(NSString*)theText;
-- (id) initWithIndex:(NSInteger)from ToIndex:(NSInteger)to Text:(NSString *)theText;
-
-- (NSInteger) execute:(NSString *)buf;
-- (NSString *)toString;
-
-@end
-
-@interface ANTLRDeleteOp : ANTLRReplaceOp {
-}
-+ (ANTLRDeleteOp *) newANTLRDeleteOp:(NSInteger)from ToIndex:(NSInteger)to;
-
-- (id) initWithIndex:(NSInteger)from ToIndex:(NSInteger)to;
-
-- (NSString *)toString;
-
-@end
-
-
-@interface ANTLRTokenRewriteStream : ANTLRCommonTokenStream {
-/** You may have multiple, named streams of rewrite operations.
- *  I'm calling these things "programs."
- *  Maps String (name) -> rewrite (List)
- */
-ANTLRHashMap *programs;
-
-/** Map String (program name) -> Integer index */
-ANTLRHashMap *lastRewriteTokenIndexes;
-}
-
-@property (retain, getter=getPrograms, setter=setPrograms:) ANTLRHashMap *programs;
-@property (retain, getter=getLastRewriteTokenIndexes, setter=setLastRewriteTokenIndexes:) ANTLRHashMap *lastRewriteTokenIndexes;
-
-+ (ANTLRTokenRewriteStream *)newANTLRTokenRewriteStream;
-+ (ANTLRTokenRewriteStream *)newANTLRTokenRewriteStream:(id<ANTLRTokenSource>) aTokenSource;
-+ (ANTLRTokenRewriteStream *)newANTLRTokenRewriteStream:(id<ANTLRTokenSource>) aTokenSource Channel:(NSInteger)aChannel;
-
-- (id) init;
-- (id)initWithTokenSource:(id<ANTLRTokenSource>)aTokenSource;
-- (id)initWithTokenSource:(id<ANTLRTokenSource>)aTokenSource Channel:(NSInteger)aChannel;
-
-- (ANTLRHashMap *)getPrograms;
-- (void)setPrograms:(ANTLRHashMap *)aProgList;
-
-- (void) rollback:(NSInteger)instructionIndex;
-- (void) rollback:(NSString *)programName Index:(NSInteger)anInstructionIndex;
-- (void) deleteProgram;
-- (void) deleteProgram:(NSString *)programName;
-- (void) insertAfterToken:(id<ANTLRToken>)t Text:(NSString *)theText;
-- (void) insertAfterIndex:(NSInteger)anIndex Text:(NSString *)theText;
-- (void) insertAfterProgNam:(NSString *)programName Index:(NSInteger)anIndex Text:(NSString *)theText;
-
-
-- (void) insertBeforeToken:(id<ANTLRToken>)t Text:(NSString *)theText;
-- (void) insertBeforeIndex:(NSInteger)anIndex Text:(NSString *)theText;
-- (void) insertBeforeProgName:(NSString *)programName Index:(NSInteger)index Text:(NSString *)theText;
-- (void) replaceFromIndex:(NSInteger)anIndex Text:(NSString *)theText;
-- (void) replaceFromIndex:(NSInteger)from ToIndex:(NSInteger)to Text:(NSString *)theText;
-- (void) replaceFromToken:(id<ANTLRToken>)indexT Text:(NSString *)theText;
-- (void) replaceFromToken:(id<ANTLRToken>)from ToToken:(id<ANTLRToken>)to Text:(NSString *)theText;
-- (void) replaceProgNam:(NSString *)programName Token:(id<ANTLRToken>)from Token:(id<ANTLRToken>)to Text:(NSString *)theText;
-- (void) replaceProgNam:(NSString *)programName FromIndex:(NSInteger)from ToIndex:(NSInteger)to Text:(NSString *)theText;
-- (void) delete:(NSInteger)anIndex;
-- (void) delete:(NSInteger)from ToIndex:(NSInteger)to;
-- (void) deleteToken:(id<ANTLRToken>)indexT;
-- (void) deleteFromToken:(id<ANTLRToken>)from ToToken:(id<ANTLRToken>)to;
-- (void) delete:(NSString *)programName FromToken:(id<ANTLRToken>)from ToToken:(id<ANTLRToken>)to;
-- (void) delete:(NSString *)programName FromIndex:(NSInteger)from ToIndex:(NSInteger)to;
-- (NSInteger)getLastRewriteTokenIndex;
-- (NSInteger)getLastRewriteTokenIndex:(NSString *)programName;
-- (void)setLastRewriteTokenIndex:(NSString *)programName Index:(NSInteger)anInt;
-- (ANTLRHashMap *) getProgram:(NSString *)name;
-- (ANTLRHashMap *) initializeProgram:(NSString *)name;
-- (NSString *)toOriginalString;
-- (NSString *)toOriginalString:(NSInteger)start End:(NSInteger)end;
-- (NSString *)toString;
-- (NSString *)toString:(NSString *)programName;
-- (NSString *)toStringFromStart:(NSInteger)start ToEnd:(NSInteger)end;
-- (NSString *)toString:(NSString *)programName FromStart:(NSInteger)start ToEnd:(NSInteger)end;
-- (ANTLRHashMap *)reduceToSingleOperationPerIndex:(ANTLRHashMap *)rewrites;
-- (ANTLRHashMap *)getKindOfOps:(ANTLRHashMap *)rewrites KindOfClass:(Class)kind;
-- (ANTLRHashMap *)getKindOfOps:(ANTLRHashMap *)rewrites KindOfClass:(Class)kind Index:(NSInteger)before;
-- (NSString *)catOpText:(id)a PrevText:(id)b;
-- (NSMutableString *)toDebugString;
-- (NSMutableString *)toDebugStringFromStart:(NSInteger)start ToEnd:(NSInteger)end;
-                    
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRTokenSource.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRTokenSource.h
deleted file mode 100755
index 4d6b6ee..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRTokenSource.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import "ANTLRToken.h"
-
-// Anything that responds to -nextToken can be treated as a lexer.
-// For instance this can be a flex lexer or a handwritten one or even
-// a proxy for a remotely running token source (database, lexer, whatever).
-@protocol ANTLRTokenSource <NSObject, NSCopying>
-
-- (id<ANTLRToken>) nextToken;
-- (NSString *)getSourceName;
-
-@end
\ No newline at end of file
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRTokenStream.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRTokenStream.h
deleted file mode 100755
index c104578..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRTokenStream.h
+++ /dev/null
@@ -1,62 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import "ANTLRIntStream.h"
-#import "ANTLRToken.h"
-
-@protocol ANTLRTokenStream < ANTLRIntStream >
-
-// Get Token at current input pointer + i ahead where i=1 is next Token.
-// i<0 indicates tokens in the past.  So -1 is previous token and -2 is
-// two tokens ago. LT:0 is undefined.  For i>=n, return Token.EOFToken.
-// Return null for LT:0 and any index that results in an absolute address
-// that is negative.
-
-- (id<ANTLRToken>) LT:(NSInteger) i;
-
-- (id<ANTLRToken>) getToken:(NSUInteger) i;
-
-- (id) getTokenSource;
-
-- (NSString *) toString;
-/** Return the text of all tokens from start to stop, inclusive.
- *  If the stream does not buffer all the tokens then it can just
- *  return "" or null;  Users should not access $ruleLabel.text in
- *  an action of course in that case.
- */
-- (NSString *)toStringFromStart:(NSInteger)startIdx ToEnd:(NSInteger)stopIdx;
-
-/** Because the user is not required to use a token with an index stored
- *  in it, we must provide a means for two token objects themselves to
- *  indicate the start/end location.  Most often this will just delegate
- *  to the other toString(int,int).  This is also parallel with
- *  the TreeNodeStream.toString(Object,Object).
- */
-- (NSString *) toStringFromToken:(id<ANTLRToken>)startToken ToToken:(id<ANTLRToken>)stopToken;
-
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRTree.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRTree.h
deleted file mode 100755
index f269b2d..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRTree.h
+++ /dev/null
@@ -1,123 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-@protocol ANTLRTree < NSObject, NSCopying >
-
-//+ (id<ANTLRTree>) invalidNode;
-
-- (id<ANTLRTree>) getChild:(NSUInteger)index;
-- (NSUInteger) getChildCount;
-
-// Tree tracks parent and child index now > 3.0
-
-- (id<ANTLRTree>)getParent;
-
-- (void) setParent:(id<ANTLRTree>)t;
-
-/** Is there is a node above with token type ttype? */
-- (BOOL) hasAncestor:(NSInteger)ttype;
-
-/** Walk upwards and get first ancestor with this token type. */
-- (id<ANTLRTree>) getAncestor:(NSInteger) ttype;
-
-/** Return a list of all ancestors of this node.  The first node of
- *  list is the root and the last is the parent of this node.
- */
-- (NSMutableArray *) getAncestors;
-
-/** This node is what child index? 0..n-1 */
-- (NSInteger) getChildIndex;
-
-- (void) setChildIndex:(NSInteger) index;
-
-/** Set the parent and child index values for all children */
-- (void) freshenParentAndChildIndexes;
-
-/** Add t as a child to this node.  If t is null, do nothing.  If t
- *  is nil, add all children of t to this' children.
- */
-- (void) addChild:(id<ANTLRTree>) t;
-
-/** Set ith child (0..n-1) to t; t must be non-null and non-nil node */
-- (void) setChild:(NSInteger)i With:(id<ANTLRTree>) t;
-
-- (id) deleteChild:(NSInteger) i;
-
-/** Delete children from start to stop and replace with t even if t is
- *  a list (nil-root tree).  num of children can increase or decrease.
- *  For huge child lists, inserting children can force walking rest of
- *  children to set their childindex; could be slow.
- */
-- (void) replaceChildrenFrom:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id)t;	
-
-- (NSArray *) getChildren;
-// Add t as a child to this node.  If t is null, do nothing.  If t
-//  is nil, add all children of t to this' children.
-
-- (void) addChildren:(NSArray *) theChildren;
-//- (void) removeAllChildren;
-
-// Indicates the node is a nil node but may still have children, meaning
-// the tree is a flat list.
-
-- (BOOL) isNil;
-
-/**  What is the smallest token index (indexing from 0) for this node
- *   and its children?
- */
-- (NSInteger) getTokenStartIndex;
-
-- (void) setTokenStartIndex:(NSInteger) index;
-
-/**  What is the largest token index (indexing from 0) for this node
- *   and its children?
- */
-- (NSInteger) getTokenStopIndex;
-- (void) setTokenStopIndex:(NSInteger) index;
-
-- (id<ANTLRTree>) dupNode;
-
-- (NSString *) toString;
-
-#pragma mark Copying
-- (id) copyWithZone:(NSZone *)aZone;	// the children themselves are not copied here!
-- (id) deepCopy;					// performs a deepCopyWithZone: with the default zone
-- (id) deepCopyWithZone:(NSZone *)aZone;
-
-#pragma mark Tree Parser support
-- (NSInteger) getType;
-- (NSString *) getText;
-// In case we don't have a token payload, what is the line for errors?
-- (NSInteger) getLine;
-- (NSInteger) getCharPositionInLine;
-- (void) setCharPositionInLine:(NSInteger)pos;
-
-#pragma mark Informational
-- (NSString *) treeDescription;
-- (NSString *) description;
-
-@end
-
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRTreeAdaptor.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRTreeAdaptor.h
deleted file mode 100755
index e6579cf..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRTreeAdaptor.h
+++ /dev/null
@@ -1,159 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import "ANTLRToken.h"
-#import "ANTLRBaseTree.h"
-#import "ANTLRTokenStream.h"
-
-#pragma warning tree/node diction is broken.
-
-@protocol ANTLRTreeAdaptor <NSObject, NSCopying>
-
-#pragma mark Construction
-
-+ (id<ANTLRTree>) newEmptyTree;
-
-- (id<ANTLRTree>) createTree:(id<ANTLRToken>)payload;
-
-#pragma mark ANTLRTreeAdaptor implementation
-- (id<ANTLRTree>)dupNode:(id<ANTLRTree>)aNode;	// copies just the node
-- (id<ANTLRTree>)dupTree:(id<ANTLRTree>)aTree;	// copies the entire subtree, recursively
-
-/** Return a nil node (an empty but non-null node) that can hold
- *  a list of element as the children.  If you want a flat tree (a list)
- *  use "t=adaptor.nil(); t.addChild(x); t.addChild(y);"
- */
-- (id) emptyNode;
-
-/** Return a tree node representing an error.  This node records the
- *  tokens consumed during error recovery.  The start token indicates the
- *  input symbol at which the error was detected.  The stop token indicates
- *  the last symbol consumed during recovery.
- *
- *  You must specify the input stream so that the erroneous text can
- *  be packaged up in the error node.  The exception could be useful
- *  to some applications; default implementation stores ptr to it in
- *  the CommonErrorNode.
- *
- *  This only makes sense during token parsing, not tree parsing.
- *  Tree parsing should happen only when parsing and tree construction
- *  succeed.
- */
-- (id) errorNode:(id<ANTLRTokenStream>)anInput
-            From:(id<ANTLRToken>)aStartToken
-              To:(id<ANTLRToken>)aStopToken
-       Exception:(NSException *) e;
-
-/** Is tree considered a nil node used to make lists of child nodes? */
-- (BOOL) isNil:(id<ANTLRTree>)aTree;
-
-
-- (void) addChild:(id<ANTLRTree>)child toTree:(id<ANTLRTree>)aTree;
-
-/** If oldRoot is a nil root, just copy or move the children to newRoot.
- *  If not a nil root, make oldRoot a child of newRoot.
- *
- *    old=^(nil a b c), new=r yields ^(r a b c)
- *    old=^(a b c), new=r yields ^(r ^(a b c))
- *
- *  If newRoot is a nil-rooted single child tree, use the single
- *  child as the new root node.
- *
- *    old=^(nil a b c), new=^(nil r) yields ^(r a b c)
- *    old=^(a b c), new=^(nil r) yields ^(r ^(a b c))
- *
- *  If oldRoot was null, it's ok, just return newRoot (even if isNil).
- *
- *    old=null, new=r yields r
- *    old=null, new=^(nil r) yields ^(nil r)
- *
- *  Return newRoot.  Throw an exception if newRoot is not a
- *  simple node or nil root with a single child node--it must be a root
- *  node.  If newRoot is ^(nil x) return x as newRoot.
- *
- *  Be advised that it's ok for newRoot to point at oldRoot's
- *  children; i.e., you don't have to copy the list.  We are
- *  constructing these nodes so we should have this control for
- *  efficiency.
- */
-- (id) becomeRoot:(id<ANTLRTree>)newRoot old:(id<ANTLRTree>)oldRoot;
-
-- (id) rulePostProcessing:(id<ANTLRTree>)root;
-
-#pragma mark Rewrite Rules
-                           
-- (NSUInteger) getUniqueID:(id<ANTLRTree>)aNode;
-
-- (id<ANTLRTree>) createTree:(NSInteger)tokenType FromToken:(id<ANTLRToken>)fromToken;
-- (id<ANTLRTree>) createTree:(NSInteger)tokenType FromToken:(id<ANTLRToken>)fromToken Text:(NSString *)text;
-- (id<ANTLRTree>) createTree:(NSInteger)tokenType Text:(NSString *)text;
-
-#pragma mark Content
-
-- (id<ANTLRTree>)dupNode:(id<ANTLRTree>)aNode;
-- (id<ANTLRTree>)dupTree:(id<ANTLRTree>)aTree;
-
-- (NSInteger) getType:(id<ANTLRTree>)aNode;
-- (void) setType:(id<ANTLRTree>)aNode Type:(NSInteger)tokenType;
-
-- (NSString *) getText:(id<ANTLRTree>)aNode;
-- (void) setText:(id<ANTLRTree>)aNode Text:(NSString *)tokenText;
-
-- (id<ANTLRToken>) getToken:(id<ANTLRTree>)t;
-
-- (void) setTokenBoundaries:(id<ANTLRTree>)aTree From:(id<ANTLRToken>)startToken To:(id<ANTLRToken>)stopToken;
-- (NSInteger) getTokenStartIndex:(id<ANTLRTree>)aTree;
-- (NSInteger) getTokenStopIndex:(id<ANTLRTree>)aTree;
-
-#pragma mark Navigation / Tree Parsing
-
-/** Get a child 0..n-1 node */
-- (id<ANTLRTree>) getChild:(id<ANTLRTree>)aNode At:(NSInteger) i;
-/** Set ith child (0..n-1) to t; t must be non-null and non-nil node */
-- (void) setChild:(id<ANTLRTree>)aTree At:(NSInteger)index Child:(id<ANTLRTree>)child;
-/** Remove ith child and shift children down from right. */
-- (id<ANTLRTree>) deleteChild:(id<ANTLRTree>)t Index:(NSInteger)index;
-
-/** How many children?  If 0, then this is a leaf node */
-- (NSInteger) getChildCount:(id<ANTLRTree>) aTree;
-
-/** Who is the parent node of this node; if null, implies node is root.
- *  If your node type doesn't handle this, it's ok but the tree rewrites
- *  in tree parsers need this functionality.
- */
-- (id<ANTLRTree>)getParent:(id<ANTLRTree>)t;
-- (void) setParent:(id<ANTLRTree>)t With:(id<ANTLRTree>)parent;
-
-/** What index is this node in the child list? Range: 0..n-1
- *  If your node type doesn't handle this, it's ok but the tree rewrites
- *  in tree parsers need this functionality.
- */
-- (NSInteger) getChildIndex:(id<ANTLRTree>)t;
-- (void) setChildIndex:(id<ANTLRTree>)t With:(NSInteger)index;
-
-- (void) replaceChildren:(id<ANTLRTree>)parent From:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id<ANTLRTree>)t;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRTreeException.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRTreeException.h
deleted file mode 100755
index 8ec5c45..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRTreeException.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTree.h"
-#import "ANTLRRecognitionException.h"
-
-@interface ANTLRTreeException : ANTLRRecognitionException {
-	id<ANTLRTree> oldRoot;
-	id<ANTLRTree> newRoot;
-}
-
-+ (id) exceptionWithOldRoot:(id<ANTLRTree>)theOldRoot newRoot:(id<ANTLRTree>)theNewRoot stream:(id<ANTLRIntStream>)aStream;
-- (id) initWithOldRoot:(id<ANTLRTree>)theOldRoot newRoot:(id<ANTLRTree>)theNewRoot stream:(id<ANTLRIntStream>)aStream;
-
-- (void) setOldRoot:(id<ANTLRTree>)aTree;
-- (void) setNewRoot:(id<ANTLRTree>)aTree;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRTreeIterator.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRTreeIterator.h
deleted file mode 100644
index e6d5e71..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRTreeIterator.h
+++ /dev/null
@@ -1,67 +0,0 @@
-//
-//  ANTLRTreeIterator.h
-//  ANTLR
-//
-//  Created by Ian Michell on 26/04/2010.
-// [The "BSD licence"]
-// Copyright (c) 2010 Ian Michell 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRCommonTreeAdaptor.h"
-#import "ANTLRFastQueue.h"
-#import "ANTLRTreeAdaptor.h"
-#import "ANTLRTree.h"
-
-@interface ANTLRTreeIterator : NSObject 
-{
-	id<ANTLRTreeAdaptor> adaptor;
-	id<ANTLRTree> root;
-	id<ANTLRTree> tree;
-	BOOL firstTime;
-	id<ANTLRTree> up;
-	id<ANTLRTree> down;
-	id<ANTLRTree> eof;
-	
-	ANTLRFastQueue *nodes;
-}
-
-@property(retain, readwrite) id<ANTLRTree> up;
-@property(retain, readwrite) id<ANTLRTree> down;
-@property(retain, readwrite) id<ANTLRTree> eof;
-
-+ newANTRLTreeIterator;
-+ (ANTLRTreeIterator *) newANTRLTreeIteratorWithAdaptor:(ANTLRCommonTreeAdaptor *)adaptor
-                                                andTree:(id<ANTLRTree>)tree;
-- (id) init;
-- (id) initWithTree:(id<ANTLRTree>) t;
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>) a andTree:(id<ANTLRTree>) t;
-
-- (void) reset;
-- (BOOL) hasNext;
-- (id) nextObject;
-- (NSArray *) allObjects;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRTreeNodeStream.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRTreeNodeStream.h
deleted file mode 100755
index bf6342c..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRTreeNodeStream.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRIntStream.h"
-#import "ANTLRCharStream.h"
-#import "ANTLRTokenStream.h"
-#import "ANTLRCommonTree.h"
-#import "ANTLRCommonTreeAdaptor.h"
-
-@protocol ANTLRTreeNodeStream < ANTLRIntStream > 
-
-- (id) initWithTree:(ANTLRCommonTree *)theTree;
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)theAdaptor Tree:(ANTLRCommonTree *)theTree;
-
-- (id) LT:(NSInteger)k;
-- (id) getTreeSource;
-- (id<ANTLRTreeAdaptor>) getTreeAdaptor;
-- (id<ANTLRTokenStream>) getTokenStream; 
-- (void) setUniqueNavigationNodes:(BOOL)flag;
-
-- (id) getNode:(NSInteger) idx;
-
-- (NSString *) toStringFromNode:(id)startNode ToNode:(id)stopNode;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRTreeParser.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRTreeParser.h
deleted file mode 100755
index e2f01ee..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRTreeParser.h
+++ /dev/null
@@ -1,89 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRBaseRecognizer.h"
-#import "ANTLRTreeNodeStream.h"
-#import "ANTLRCommonTreeAdaptor.h"
-#import "ANTLRMismatchedTreeNodeException.h"
-
-@interface ANTLRTreeParser : ANTLRBaseRecognizer {
-	id<ANTLRTreeNodeStream> input;
-}
-
-@property (retain, getter=getInput, setter=setInput:) id<ANTLRTreeNodeStream> input;
-
-+ (id) newANTLRTreeParser:(id<ANTLRTreeNodeStream>)anInput;
-+ (id) newANTLRTreeParser:(id<ANTLRTreeNodeStream>)anInput State:(ANTLRRecognizerSharedState *)state;
-
-- (id) initWithStream:(id<ANTLRTreeNodeStream>)theInput;
-- (id) initWithStream:(id<ANTLRTreeNodeStream>)theInput
-                State:(ANTLRRecognizerSharedState *)state;
-
-
-- (id<ANTLRTreeNodeStream>)getInput;
-- (void) setInput:(id<ANTLRTreeNodeStream>)anInput;
-
-- (void) setTreeNodeStream:(id<ANTLRTreeNodeStream>) anInput;
-- (id<ANTLRTreeNodeStream>) getTreeNodeStream;
-
-- (NSString *)getSourceName;
-
-- (id) getCurrentInputSymbol:(id<ANTLRIntStream>) anInput;
-
-- (id) getMissingSymbol:(id<ANTLRIntStream>)input
-              Exception:(ANTLRRecognitionException *) e
-          ExpectedToken:(NSInteger) expectedTokenType
-                 BitSet:(ANTLRBitSet *)follow;
-
-/** Match '.' in tree parser has special meaning.  Skip node or
- *  entire tree if node has children.  If children, scan until
- *  corresponding UP node.
- */
-- (void) matchAny:(id<ANTLRIntStream>)ignore;
-
-/** We have DOWN/UP nodes in the stream that have no line info; override.
- *  plus we want to alter the exception type.  Don't try to recover
- *  from tree parser errors inline...
- */
-- (id) recoverFromMismatchedToken:(id<ANTLRIntStream>)anInput
-                             Type:(NSInteger)ttype
-                           Follow:(ANTLRBitSet *)follow;
-
-/** Prefix error message with the grammar name because message is
- *  always intended for the programmer because the parser built
- *  the input tree not the user.
- */
-- (NSString *)getErrorHeader:(ANTLRRecognitionException *)e;
-
-- (NSString *)getErrorMessage:(ANTLRRecognitionException *)e TokenNames:(NSArray *) tokenNames;
-
-- (void) traceIn:(NSString *)ruleName Index:(NSInteger)ruleIndex;
-- (void) traceOut:(NSString *)ruleName Index:(NSInteger)ruleIndex;
-
-
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRTreePatternLexer.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRTreePatternLexer.h
deleted file mode 100644
index f6059d3..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRTreePatternLexer.h
+++ /dev/null
@@ -1,87 +0,0 @@
-//
-//  ANTLRTreePatternLexer.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/18/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-
-typedef enum {
-	ANTLRLexerTokenTypeEOF = -1,
-	ANTLRLexerTokenTypeInvalid,
-	ANTLRLexerTokenTypeBEGIN,
-	ANTLRLexerTokenTypeEND,
-	ANTLRLexerTokenTypeID,
-	ANTLRLexerTokenTypeARG,
-	ANTLRLexerTokenTypePERCENT,
-	ANTLRLexerTokenTypeCOLON,
-	ANTLRLexerTokenTypeDOT,
-} ANTLRLexerTokenType;
-
-
-@interface ANTLRTreePatternLexer : NSObject {
-
-/** The tree pattern to lex like "(A B C)" */
-NSString *pattern;
-    
-/** Index into input string */
-NSInteger p;
-    
-/** Current char */
-NSInteger c;
-    
-/** How long is the pattern in char? */
-NSInteger n;
-    
-/** Set when token type is ID or ARG (name mimics Java's StreamTokenizer) */
-NSMutableData *sval;
-char *data;
-    
-BOOL error;
-
-}
-
-@property (retain, getter=getPattern, setter=setPattern:) NSString *pattern;
-@property (getter=getP, setter=setP:) NSInteger p;
-@property (getter=getC, setter=setC:) NSInteger c;
-@property (getter=getN, setter=setN:) NSInteger n;
-@property (retain, getter=getSval, setter=setSval:) NSMutableData *sval;
-@property (assign, getter=getData, setter=setData:) char *data;
-@property (getter=getError, setter=setError) BOOL error;
-
-+ (ANTLRTreePatternLexer *)newANTLRTreePatternLexer:(NSString *)aPattern;
-- (id) init;
-- (id) initWithPattern:(NSString *)aPattern;
-- (NSInteger) nextToken;
-- (void) consume;
-- (NSString *)toString;
-
-- (NSMutableData *)getSval;
-- (void) setSval:(NSMutableData *)aSval;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRTreePatternParser.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRTreePatternParser.h
deleted file mode 100644
index f6d6dc6..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRTreePatternParser.h
+++ /dev/null
@@ -1,57 +0,0 @@
-//
-//  ANTLRTreePatternParser.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/18/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTreePatternLexer.h"
-#import "ANTLRTreeWizard.h"
-#import "ANTLRTreeAdaptor.h"
-
-@interface ANTLRTreePatternParser : NSObject {
-
-ANTLRTreePatternLexer *tokenizer;
-NSInteger ttype;
-ANTLRTreeWizard *wizard;
-id<ANTLRTreeAdaptor> adaptor;
-    
-}
-
-+ (ANTLRTreePatternParser *)newANTLRTreePatternParser:(ANTLRTreePatternLexer *)aTokenizer
-                                               Wizard:(ANTLRTreeWizard *)aWizard
-                                              Adaptor:(id<ANTLRTreeAdaptor>)anAdaptor;
-- (id) init;
-- (id) initWithTokenizer:(ANTLRTreePatternLexer *)tokenizer
-                  Wizard:(ANTLRTreeWizard *)aWizard
-                 Adaptor:(id<ANTLRTreeAdaptor>)anAdaptor;
-- (id<ANTLRTree>) pattern;
-- (id<ANTLRTree>) parseTree;
-- (id<ANTLRTree>) parseNode;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRTreeRewriter.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRTreeRewriter.h
deleted file mode 100644
index aee873e..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRTreeRewriter.h
+++ /dev/null
@@ -1,72 +0,0 @@
-//
-//  ANTLRTreeRewriter.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/17/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTreeParser.h"
-
-@interface ANTLRfptr : NSObject {
-    id  actor;
-    SEL ruleSEL;
-}
-
-+ (ANTLRfptr *)newANTLRfptrWithRule:(SEL)aRuleAction withObject:(id)anObject;
--initWithRule:(SEL)ruleAction withObject:(id)anObject;
-
-- (id)rule;
-
-@end
-
-@interface ANTLRTreeRewriter : ANTLRTreeParser {
-    BOOL showTransformations;
-    id<ANTLRTokenStream> originalTokenStream;
-    id<ANTLRTreeAdaptor> originalAdaptor;
-    ANTLRfptr *rule;
-    ANTLRfptr *topdown_fptr;
-    ANTLRfptr *bottomup_ftpr;
-}
-
-+ (ANTLRTreeRewriter *) newANTLRTreeRewriter:(id<ANTLRTreeNodeStream>)anInput;
-+ (ANTLRTreeRewriter *) newANTLRTreeRewriter:(id<ANTLRTreeNodeStream>)anInput State:(ANTLRRecognizerSharedState *)aState;
-- (id)initWithStream:(id<ANTLRTreeNodeStream>)anInput;
-- (id)initWithStream:(id<ANTLRTreeNodeStream>)anInput State:(ANTLRRecognizerSharedState *)aState;
-- (ANTLRTreeRewriter *) applyOnce:(id<ANTLRTree>)t Rule:(ANTLRfptr *)whichRule;
-- (ANTLRTreeRewriter *) applyRepeatedly:(id<ANTLRTree>)t Rule:(ANTLRfptr *)whichRule;
-- (ANTLRTreeRewriter *) downup:(id<ANTLRTree>)t;
-- (ANTLRTreeRewriter *) pre:(id<ANTLRTree>)t;
-- (ANTLRTreeRewriter *) post:(id<ANTLRTree>)t;
-- (ANTLRTreeRewriter *) downup:(id<ANTLRTree>)t XForm:(BOOL)aShowTransformations;
-- (void)reportTransformation:(id<ANTLRTree>)oldTree Tree:(id<ANTLRTree>)newTree;
-- (ANTLRTreeRewriter *) topdown_fptr;
-- (ANTLRTreeRewriter *) bottomup_ftpr;
-- (ANTLRTreeRewriter *) topdown;
-- (ANTLRTreeRewriter *) bottomup;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRTreeRuleReturnScope.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRTreeRuleReturnScope.h
deleted file mode 100644
index ea8a487..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRTreeRuleReturnScope.h
+++ /dev/null
@@ -1,49 +0,0 @@
-//
-//  ANTLRTreeRuleReturnScope.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/17/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRuleReturnScope.h"
-#import "ANTLRCommonTree.h"
-
-@interface ANTLRTreeRuleReturnScope : ANTLRRuleReturnScope {
-    ANTLRCommonTree *startNode;
-}
-
-@property (retain, getter=getStart, setter=setStart:) ANTLRCommonTree *startNode;
-
-/** First node or root node of tree matched for this rule. */
-
-- (ANTLRCommonTree *)getStart;
-- (void)setStart:(ANTLRCommonTree *)aStartNode;
-
-- (id) copyWithZone:(NSZone *)theZone;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRTreeVisitor.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRTreeVisitor.h
deleted file mode 100644
index 1f167bb..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRTreeVisitor.h
+++ /dev/null
@@ -1,45 +0,0 @@
-//
-//  ANTLRTreeVisitor.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/18/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTreeAdaptor.h"
-#import "ANTLRTreeVisitorAction.h"
-
-@interface ANTLRTreeVisitor : NSObject {
-   id<ANTLRTreeAdaptor> adaptor;
-}
-+ (ANTLRTreeVisitor *)newANTLRTreeVisitor:(id<ANTLRTreeAdaptor>) anAdaptor;
-+ (ANTLRTreeVisitor *)newANTLRTreeVisitor;
-- (id)init;
-- (id)initWithAdaptor:(id<ANTLRTreeAdaptor>)anAdaptor;
-- (ANTLRTreeVisitor *)visit:(id<ANTLRTree>)t Action:(ANTLRTreeVisitorAction *)action;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRTreeVisitorAction.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRTreeVisitorAction.h
deleted file mode 100644
index c9c0856..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRTreeVisitorAction.h
+++ /dev/null
@@ -1,56 +0,0 @@
-//
-//  ANTLRTreeVisitorAction.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/18/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-
-
-@interface ANTLRTreeVisitorAction : NSObject
-{
-
-}
-
-+ (ANTLRTreeVisitorAction *)newANTLRTreeVisitorAction;
-- (id) init;
-
-/** Execute an action before visiting children of t.  Return t or
- *  a rewritten t.  It is up to the visitor to decide what to do
- *  with the return value.  Children of returned value will be
- *  visited if using TreeVisitor.visit().
- */
-- (ANTLRTreeVisitorAction *)pre:(ANTLRTreeVisitorAction *) t;
-
-/** Execute an action after visiting children of t.  Return t or
- *  a rewritten t.  It is up to the visitor to decide what to do
- *  with the return value.
- */
-- (ANTLRTreeVisitorAction *)post:(ANTLRTreeVisitorAction *) t;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRTreeWizard.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRTreeWizard.h
deleted file mode 100644
index d952572..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRTreeWizard.h
+++ /dev/null
@@ -1,134 +0,0 @@
-//
-//  ANTLRTreeWizard.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/18/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRCommonTreeAdaptor.h"
-#import "ANTLRCommonTree.h"
-#import "ANTLRMapElement.h"
-#import "ANTLRMap.h"
-
-@class ANTLRVisitor;
-
-@protocol ANTLRContextVisitor <NSObject>
-// TODO: should this be called visit or something else?
-- (void) visit:(id<ANTLRTree>)t Parent:(id<ANTLRTree>)parent ChildIndex:(NSInteger)childIndex Map:(ANTLRMap *)labels;
-
-@end
-
-@interface ANTLRVisitor : NSObject <ANTLRContextVisitor> {
-    NSInteger action;
-    id actor;
-    id object1;
-    id object2;
-}
-+ (ANTLRVisitor *)newANTLRVisitor:(NSInteger)anAction Actor:(id)anActor Object:(id)anObject1 Object:(id)anObject2;
-- (id) initWithAction:(NSInteger)anAction Actor:(id)anActor Object:(id)anObject1 Object:(id)anObject2;
-
-- (void) visit:(id<ANTLRTree>)t;
-- (void) visit:(id<ANTLRTree>)t Parent:(id<ANTLRTree>)parent ChildIndex:(NSInteger)childIndex Map:(ANTLRMap *)labels;
-
-@end
-
-/** When using %label:TOKENNAME in a tree for parse(), we must
- *  track the label.
- */
-@interface ANTLRTreePattern : ANTLRCommonTree {
-    NSString *label;
-    BOOL      hasTextArg;
-}
-@property (retain, getter=getLabel, setter=setLabel:) NSString *label;
-@property (assign, getter=getHasTextArg, setter=setHasTextArg:) BOOL hasTextArg;
-
-+ (ANTLRTreePattern *)newANTLRTreePattern:(id<ANTLRToken>)payload;
-
-- (id) initWithToken:(id<ANTLRToken>)payload;
-- (NSString *)toString;
-@end
-
-@interface ANTLRWildcardTreePattern : ANTLRTreePattern {
-}
-
-+ (ANTLRWildcardTreePattern *)newANTLRWildcardTreePattern:(id<ANTLRToken>)payload;
-- (id) initWithToken:(id<ANTLRToken>)payload;
-@end
-
-/** This adaptor creates TreePattern objects for use during scan() */
-@interface ANTLRTreePatternTreeAdaptor : ANTLRCommonTreeAdaptor {
-}
-+ (ANTLRTreePatternTreeAdaptor *)newTreeAdaptor;
-#ifdef DONTUSENOMO
-+ (ANTLRTreePatternTreeAdaptor *)newTreeAdaptor:(id<ANTLRToken>)payload;
-#endif
-- (id) init;
-#ifdef DONTUSENOMO
-- initWithToken:(id<ANTLRToken>)payload;
-#endif
-- (id<ANTLRTree>)createTreePattern:(id<ANTLRToken>)payload;
-
-@end
-
-@interface ANTLRTreeWizard : NSObject {
-	id<ANTLRTreeAdaptor> adaptor;
-	ANTLRMap *tokenNameToTypeMap;
-}
-+ (ANTLRTreeWizard *) newANTLRTreeWizard:(id<ANTLRTreeAdaptor>)anAdaptor;
-+ (ANTLRTreeWizard *)newANTLRTreeWizard:(id<ANTLRTreeAdaptor>)adaptor Map:(ANTLRMap *)aTokenNameToTypeMap;
-+ (ANTLRTreeWizard *)newANTLRTreeWizard:(id<ANTLRTreeAdaptor>)adaptor TokenNames:(NSArray *)theTokNams;
-+ (ANTLRTreeWizard *)newANTLRTreeWizardWithTokenNames:(NSArray *)theTokNams;
-- (id) init;
-- (id) initWithAdaptor:(id<ANTLRTreeAdaptor>)adaptor;
-- (id) initWithAdaptor:(id<ANTLRTreeAdaptor>)adaptor Map:(ANTLRMap *)tokenNameToTypeMap;
-- (id) initWithTokenNames:(NSArray *)theTokNams;
-- (id) initWithTokenNames:(id<ANTLRTreeAdaptor>)anAdaptor TokenNames:(NSArray *)theTokNams;
-- (ANTLRMap *)computeTokenTypes:(NSArray *)theTokNams;
-- (NSInteger)getTokenType:(NSString *)tokenName;
-- (ANTLRMap *)index:(id<ANTLRTree>)t;
-- (void) _index:(id<ANTLRTree>)t Map:(ANTLRMap *)m;
-- (NSMutableArray *)find:(id<ANTLRTree>) t Pattern:(NSString *)pattern;
-- (ANTLRTreeWizard *)findFirst:(id<ANTLRTree>) t Type:(NSInteger)ttype;
-- (ANTLRTreeWizard *)findFirst:(id<ANTLRTree>) t Pattern:(NSString *)pattern;
-- (void) visit:(id<ANTLRTree>)t Type:(NSInteger)ttype Visitor:(ANTLRVisitor *)visitor;
-- (void) _visit:(id<ANTLRTree>)t
-         Parent:(id<ANTLRTree>)parent
-     ChildIndex:(NSInteger)childIndex
-           Type:(NSInteger)ttype
-        Visitor:(ANTLRVisitor *)visitor;
-- (void)visit:(id<ANTLRTree>)t Pattern:(NSString *)pattern Visitor:(ANTLRVisitor *)visitor;
-- (BOOL)parse:(id<ANTLRTree>)t Pattern:(NSString *)pattern Map:(ANTLRMap *)labels;
-- (BOOL) parse:(id<ANTLRTree>) t Pattern:(NSString *)pattern;
-- (BOOL) _parse:(id<ANTLRTree>)t1 Pattern:(ANTLRTreePattern *)tpattern Map:(ANTLRMap *)labels;
-- (id<ANTLRTree>) createTree:(NSString *)pattern;
-- (BOOL)equals:(id)t1 O2:(id)t2 Adaptor:(id<ANTLRTreeAdaptor>)anAdaptor;
-- (BOOL)equals:(id)t1 O2:(id)t2;
-- (BOOL) _equals:(id)t1 O2:(id)t2 Adaptor:(id<ANTLRTreeAdaptor>)anAdaptor;
-
-@end
-
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRUnbufferedCommonTreeNodeStreamState.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRUnbufferedCommonTreeNodeStreamState.h
deleted file mode 100755
index 9e79d86..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRUnbufferedCommonTreeNodeStreamState.h
+++ /dev/null
@@ -1,66 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRCommonTree.h"
-
-@interface ANTLRUnbufferedCommonTreeNodeStreamState : NSObject {
-	ANTLRCommonTree *currentNode;
-	ANTLRCommonTree *previousNode;
-
-	int currentChildIndex;
-	int absoluteNodeIndex;
-	unsigned int nodeStackSize;
-	unsigned int indexStackSize;
-	
-	NSMutableArray *lookahead;
-}
-
-- (ANTLRCommonTree *) currentNode;
-- (void) setCurrentNode: (ANTLRCommonTree *) aCurrentNode;
-
-- (ANTLRCommonTree *) previousNode;
-- (void) setPreviousNode: (ANTLRCommonTree *) aPreviousNode;
-
-- (NSInteger) currentChildIndex;
-- (void) setCurrentChildIndex: (NSInteger) aCurrentChildIndex;
-
-- (NSInteger) absoluteNodeIndex;
-- (void) setAbsoluteNodeIndex: (NSInteger) anAbsoluteNodeIndex;
-
-- (NSUInteger) nodeStackSize;
-- (void) setNodeStackSize: (NSUInteger) aNodeStackSize;
-
-- (NSUInteger) indexStackSize;
-- (void) setIndexStackSize: (NSUInteger) anIndexStackSize;
-
-- (NSMutableArray *) lookahead;
-- (void) setLookahead: (NSMutableArray *) aLookahead;
-
-- (void) addToLookahead: (id)lookaheadObject;
-- (void) removeFromLookahead: (id)lookaheadObject;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRUnbufferedTokenStream.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRUnbufferedTokenStream.h
deleted file mode 100644
index e4f8630..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRUnbufferedTokenStream.h
+++ /dev/null
@@ -1,62 +0,0 @@
-//
-//  ANTLRUnbufferedTokenStream.h
-//  ANTLR
-//
-//  Created by Alan Condit on 7/12/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRuntimeException.h"
-#import "ANTLRTokenSource.h"
-#import "ANTLRLookaheadStream.h"
-#import "ANTLRToken.h"
-
-@interface ANTLRUnbufferedTokenStream : ANTLRLookaheadStream {
-	id<ANTLRTokenSource> tokenSource;
-    NSInteger tokenIndex; // simple counter to set token index in tokens
-    NSInteger channel;
-}
-
-@property (retain, getter=getTokenSource, setter=setTokenSource:) id<ANTLRTokenSource> tokenSource;
-@property (getter=getTokenIndex, setter=setTokenIndex) NSInteger tokenIndex;
-@property (getter=getChannel, setter=setChannel:) NSInteger channel;
-
-+ (ANTLRUnbufferedTokenStream *)newANTLRUnbufferedTokenStream:(id<ANTLRTokenSource>)aTokenSource;
-- (id) init;
-- (id) initWithTokenSource:(id<ANTLRTokenSource>)aTokenSource;
-
-- (id<ANTLRToken>)nextElement;
-- (BOOL)isEOF:(id<ANTLRToken>) aToken;
-- (id<ANTLRTokenSource>)getTokenSource;
-- (NSString *)toStringFromStart:(NSInteger)aStart ToEnd:(NSInteger)aStop;
-- (NSString *)toStringFromToken:(id<ANTLRToken>)aStart ToEnd:(id<ANTLRToken>)aStop;
-- (NSInteger)LA:(NSInteger)anIdx;
-- (id<ANTLRToken>)objectAtIndex:(NSInteger)anIdx;
-- (NSString *)getSourceName;
-
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRUniqueIDMap.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRUniqueIDMap.h
deleted file mode 100644
index a805bd5..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRUniqueIDMap.h
+++ /dev/null
@@ -1,64 +0,0 @@
-//
-//  ANTLRUniqueIDMap.h
-//  ANTLR
-//
-//  Created by Alan Condit on 7/7/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRPtrBuffer.h"
-#import "ANTLRNodeMapElement.h"
-
-#define SUCCESS             0
-#define FAILURE             -1
-#define HASHSIZE            101
-#define HBUFSIZE            0x2000
-
-@interface ANTLRUniqueIDMap : ANTLRPtrBuffer {
-    NSInteger lastHash;
-}
-
-@property (getter=getLastHash, setter=setLastHash) NSInteger lastHash;
-
-+ (id)newANTLRUniqueIDMap;
-+ (id)newANTLRUniqueIDMapWithLen:(NSInteger)aHashSize;
-
-- (id)init;
-- (id)initWithLen:(NSInteger)cnt;
-- (void)dealloc;
-// Instance Methods
-- (NSInteger)count;
-- (NSInteger)size;
-/* clear -- reinitialize the maplist array */
-- (void) clear;
-
-- (void)deleteANTLRUniqueIDMap:(ANTLRNodeMapElement *)np;
-- (void)delete_chain:(ANTLRNodeMapElement *)np;
-- (id)getNode:(id<ANTLRTree>)aNode;
-- (void)putID:(id)anID Node:(id<ANTLRTree>)aNode;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Headers/ANTLRUnwantedTokenException.h b/runtime/ObjC/ANTLR.framework/Headers/ANTLRUnwantedTokenException.h
deleted file mode 100644
index 2945bfe..0000000
--- a/runtime/ObjC/ANTLR.framework/Headers/ANTLRUnwantedTokenException.h
+++ /dev/null
@@ -1,47 +0,0 @@
-//
-//  ANTLRUnwantedTokenException.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/8/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRMismatchedTokenException.h"
-
-@interface ANTLRUnwantedTokenException : ANTLRMismatchedTokenException {
-
-}
-+ (ANTLRUnwantedTokenException *)newANTLRUnwantedTokenException;
-+ (ANTLRUnwantedTokenException *)newANTLRUnwantedTokenException:(NSInteger)expected Stream:(id<ANTLRIntStream>)anInput;
-
-- (id) init;
-- (id) initWithStream:(id<ANTLRIntStream>)anInput And:(NSInteger)expected;
-- (id<ANTLRToken>)getUnexpectedToken;
-- (NSString *)toString;
-                     
-    
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Resources b/runtime/ObjC/ANTLR.framework/Resources
new file mode 100755
index 0000000..953ee36
--- /dev/null
+++ b/runtime/ObjC/ANTLR.framework/Resources
@@ -0,0 +1 @@
+Versions/Current/Resources
\ No newline at end of file
diff --git a/runtime/ObjC/ANTLR.framework/Resources/English.lproj/InfoPlist.strings b/runtime/ObjC/ANTLR.framework/Resources/English.lproj/InfoPlist.strings
deleted file mode 100644
index fa1b75f..0000000
--- a/runtime/ObjC/ANTLR.framework/Resources/English.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/ANTLR.framework/Resources/Info.plist b/runtime/ObjC/ANTLR.framework/Resources/Info.plist
deleted file mode 100644
index 24436a3..0000000
--- a/runtime/ObjC/ANTLR.framework/Resources/Info.plist
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>CFBundleDevelopmentRegion</key>
-	<string>English</string>
-	<key>CFBundleExecutable</key>
-	<string>ANTLR</string>
-	<key>CFBundleIdentifier</key>
-	<string>org.antlr.antlrframework</string>
-	<key>CFBundleInfoDictionaryVersion</key>
-	<string>6.0</string>
-	<key>CFBundleName</key>
-	<string>ANTLR</string>
-	<key>CFBundlePackageType</key>
-	<string>FMWK</string>
-	<key>CFBundleSignature</key>
-	<string>????</string>
-	<key>CFBundleVersion</key>
-	<string>1.0</string>
-</dict>
-</plist>
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/ANTLR b/runtime/ObjC/ANTLR.framework/Versions/A/ANTLR
deleted file mode 100755
index 67c1d3a..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/ANTLR
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLR.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLR.h
deleted file mode 100755
index 671e783..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLR.h
+++ /dev/null
@@ -1,60 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-
-#import <ANTLR/ANTLRBitSet.h>
-#import <ANTLR/ANTLRBaseRecognizer.h>
-#import <ANTLR/ANTLRLexer.h>
-#import <ANTLR/ANTLRParser.h>
-#import <ANTLR/ANTLRTreeParser.h>
-#import <ANTLR/ANTLRDFA.h>
-#import <ANTLR/ANTLRStringStream.h>
-#import <ANTLR/ANTLRTokenSource.h>
-#import <ANTLR/ANTLRCommonTokenStream.h>
-
-#import <ANTLR/ANTLRRecognitionException.h>
-#import <ANTLR/ANTLREarlyExitException.h>
-#import <ANTLR/ANTLRMismatchedSetException.h>
-#import <ANTLR/ANTLRMismatchedTokenException.h>
-#import <ANTLR/ANTLRMismatchedRangeException.h>
-#import <ANTLR/ANTLRMismatchedTreeNodeException.h>
-#import <ANTLR/ANTLRNoViableAltException.h>
-#import <ANTLR/ANTLRFailedPredicateException.h>
-#import <ANTLR/ANTLRTreeException.h>
-
-#import <ANTLR/ANTLRParserRuleReturnScope.h>
-#import <ANTLR/ANTLRTreeRuleReturnScope.h>
-
-#import <ANTLR/ANTLRTree.h>
-#import <ANTLR/ANTLRCommonTree.h>
-#import <ANTLR/ANTLRTreeAdaptor.h>
-#import <ANTLR/ANTLRCommonTreeAdaptor.h>
-#import <ANTLR/ANTLRTreeNodeStream.h>
-#import <ANTLR/ANTLRUnbufferedCommonTreeNodeStream.h>
-#import <ANTLR/ANTLRUnbufferedCommonTreeNodeStreamState.h>
-
-#import <ANTLR/ANTLRRewriteRuleSubtreeStream.h>
-#import <ANTLR/ANTLRRewriteRuleTokenStream.h>
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRBaseMapElement.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRBaseMapElement.h
deleted file mode 100644
index b9100ac..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRBaseMapElement.h
+++ /dev/null
@@ -1,54 +0,0 @@
-//
-//  ANTLRBaseMapElement.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/16/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRLinkBase.h"
-
-@interface ANTLRBaseMapElement : ANTLRLinkBase {
-    NSNumber *index;
-}
-
-@property (retain, getter=getIndex, setter=setIndex:) NSNumber *index;
-
-+ (id) newANTLRBaseMapElement;
-+ (id) newANTLRBaseMapElementWithIndex:(NSNumber *)anIdx;
-- (id) init;
-- (id) initWithAnIndex:(NSNumber *)anIdx;
-
-- (id) copyWithZone:(NSZone *)aZone;
-
-- (NSNumber *)getIndex;
-- (void)setIndex:(NSNumber *)anIdx;
-
-- (NSInteger)count;
-- (NSInteger)size;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRBaseRecognizer.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRBaseRecognizer.h
deleted file mode 100755
index 1a922bd..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRBaseRecognizer.h
+++ /dev/null
@@ -1,183 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-#import <Foundation/Foundation.h>
-
-#import "ANTLRIntStream.h"
-
-// This is an abstract superclass for lexers and parsers.
-
-#define ANTLR_MEMO_RULE_FAILED -2
-#define ANTLR_MEMO_RULE_UNKNOWN -1
-#define ANTLR_INITIAL_FOLLOW_STACK_SIZE 100
-
-#import "ANTLRMapElement.h"
-#import "ANTLRBitSet.h"
-#import "ANTLRToken.h"
-#import "ANTLRRecognizerSharedState.h"
-#import "ANTLRRecognitionException.h"
-#import "ANTLRMissingTokenException.h"
-#import "ANTLRMismatchedTokenException.h"
-#import "ANTLRMismatchedTreeNodeException.h"
-#import "ANTLRUnwantedTokenException.h"
-#import "ANTLRNoViableAltException.h"
-#import "ANTLREarlyExitException.h"
-#import "ANTLRMismatchedSetException.h"
-#import "ANTLRMismatchedNotSetException.h"
-#import "ANTLRFailedPredicateException.h"
-
-@interface ANTLRBaseRecognizer : NSObject {
-	ANTLRRecognizerSharedState *state;	// the state of this recognizer. Might be shared with other recognizers, e.g. in grammar import scenarios.
-	NSString *grammarFileName;			// where did the grammar come from. filled in by codegeneration
-//    BOOL failed;
-    NSString *sourceName;
-//    NSInteger numberOfSyntaxErrors;
-    NSArray *tokenNames;
-}
-
-@property (retain, getter=getState, setter=setState) ANTLRRecognizerSharedState *state;
-@property (retain, getter=getGrammarFileName, setter=setGrammarFileName) NSString *grammarFileName;
-//@property (assign, getter=getFailed, setter=setFailed) BOOL failed;
-@property (retain, getter=getTokenNames, setter=setTokenNames) NSArray *tokenNames;
-@property (retain, getter=getSourceName, setter=setSourceName) NSString *sourceName;
-//@property (assign, getter=getNumberOfSyntaxErrors, setter=setNumberOfSyntaxErrors) NSInteger numberOfSyntaxErrors;
-
-+ (void) initialize;
-
-+ (ANTLRBaseRecognizer *) newANTLRBaseRecognizer;
-+ (ANTLRBaseRecognizer *) newANTLRBaseRecognizerWithRuleLen:(NSInteger)aLen;
-+ (ANTLRBaseRecognizer *) newANTLRBaseRecognizer:(ANTLRRecognizerSharedState *)aState;
-
-+ (NSArray *)getTokenNames;
-+ (void)setTokenNames:(NSArray *)aTokNamArray;
-+ (void)setGrammarFileName:(NSString *)aFileName;
-
-- (id) init;
-- (id) initWithLen:(NSInteger)aLen;
-- (id) initWithState:(ANTLRRecognizerSharedState *)aState;
-
-- (void) dealloc;
-
-// simple accessors
-- (NSInteger) getBacktrackingLevel;
-- (void) setBacktrackingLevel:(NSInteger) level;
-
-- (BOOL) getFailed;
-- (void) setFailed: (BOOL) flag;
-
-- (ANTLRRecognizerSharedState *) getState;
-- (void) setState:(ANTLRRecognizerSharedState *) theState;
-
-// reset this recognizer - might be extended by codegeneration/grammar
-- (void) reset;
-
-/** Match needs to return the current input symbol, which gets put
- *  into the label for the associated token ref; e.g., x=ID.  Token
- *  and tree parsers need to return different objects. Rather than test
- *  for input stream type or change the IntStream interface, I use
- *  a simple method to ask the recognizer to tell me what the current
- *  input symbol is.
- * 
- *  This is ignored for lexers.
- */
-- (id) getInput;
-
-- (void)skip;
-
-// do actual matching of tokens/characters
-- (id) match:(id<ANTLRIntStream>)anInput TokenType:(NSInteger)ttype Follow:(ANTLRBitSet *)follow;
-- (void) matchAny:(id<ANTLRIntStream>)anInput;
-- (BOOL) mismatchIsUnwantedToken:(id<ANTLRIntStream>)anInput TokenType:(NSInteger) ttype;
-- (BOOL) mismatchIsMissingToken:(id<ANTLRIntStream>)anInput Follow:(ANTLRBitSet *)follow;
-
-// error reporting and recovery
-- (void) reportError:(ANTLRRecognitionException *)e;
-- (void) displayRecognitionError:(NSArray *)theTokNams Exception:(ANTLRRecognitionException *)e;
-- (NSString *)getErrorMessage:(ANTLRRecognitionException *)e TokenNames:(NSArray *)theTokNams;
-- (NSInteger) getNumberOfSyntaxErrors;
-- (NSString *)getErrorHeader:(ANTLRRecognitionException *)e;
-- (NSString *)getTokenErrorDisplay:(id<ANTLRToken>)t;
-- (void) emitErrorMessage:(NSString *)msg;
-- (void) recover:(id<ANTLRIntStream>)anInput Exception:(ANTLRRecognitionException *)e;
-
-// begin hooks for debugger
-- (void) beginResync;
-- (void) endResync;
-// end hooks for debugger
-
-// compute the bitsets necessary to do matching and recovery
-- (ANTLRBitSet *)computeErrorRecoverySet;
-- (ANTLRBitSet *)computeContextSensitiveRuleFOLLOW;
-- (ANTLRBitSet *)combineFollows:(BOOL) exact;
-
-- (id<ANTLRToken>) recoverFromMismatchedToken:(id<ANTLRIntStream>)anInput 
-                                    TokenType:(NSInteger)ttype 
-                                       Follow:(ANTLRBitSet *)follow;
-                                    
-- (id<ANTLRToken>)recoverFromMismatchedSet:(id<ANTLRIntStream>)anInput
-                                    Exception:(ANTLRRecognitionException *)e
-                                    Follow:(ANTLRBitSet *)follow;
-
-- (id) getCurrentInputSymbol:(id<ANTLRIntStream>)anInput;
-- (id) getMissingSymbol:(id<ANTLRIntStream>)anInput
-              Exception:(ANTLRRecognitionException *)e
-              TokenType:(NSInteger) expectedTokenType
-                Follow:(ANTLRBitSet *)follow;
-
-// helper methods for recovery. try to resync somewhere
-- (void) consumeUntilTType:(id<ANTLRIntStream>)anInput TokenType:(NSInteger)ttype;
-- (void) consumeUntilFollow:(id<ANTLRIntStream>)anInput Follow:(ANTLRBitSet *)bitSet;
-- (void) pushFollow:(ANTLRBitSet *)fset;
-- (ANTLRBitSet *)popFollow;
-
-// to be used by the debugger to do reporting. maybe hook in incremental stuff here, too.
-- (NSMutableArray *) getRuleInvocationStack;
-- (NSMutableArray *) getRuleInvocationStack:(ANTLRRecognitionException *)exception
-					             Recognizer:(NSString *)recognizerClassName;
-
-- (NSArray *) getTokenNames;
-- (NSString *)getGrammarFileName;
-- (NSString *)getSourceName;
-- (NSMutableArray *) toStrings:(NSArray *)tokens;
-// support for memoization
-- (NSInteger) getRuleMemoization:(NSInteger)ruleIndex StartIndex:(NSInteger)ruleStartIndex;
-- (BOOL) alreadyParsedRule:(id<ANTLRIntStream>)anInput RuleIndex:(NSInteger)ruleIndex;
-- (void) memoize:(id<ANTLRIntStream>)anInput
-	     RuleIndex:(NSInteger)ruleIndex
-	    StartIndex:(NSInteger)ruleStartIndex;
-- (NSInteger) getRuleMemoizationCacheSize;
-- (void)traceIn:(NSString *)ruleName Index:(NSInteger)ruleIndex Object:(id)inputSymbol;
-- (void)traceOut:(NSString *)ruleName Index:(NSInteger)ruleIndex Object:(id)inputSymbol;
-
-
-// support for syntactic predicates. these are called indirectly to support funky stuff in grammars,
-// like supplying selectors instead of writing code directly into the actions of the grammar.
-- (BOOL) evaluateSyntacticPredicate:(SEL)synpredFragment;
-// stream:(id<ANTLRIntStream>)anInput;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRBaseStack.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRBaseStack.h
deleted file mode 100644
index 5069031..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRBaseStack.h
+++ /dev/null
@@ -1,66 +0,0 @@
-//
-//  ANTLRBaseRecognizer.m
-//  ANTLR
-//
-//  Created by Alan Condit on 6/16/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRPtrBuffer.h"
-
-//#define GLOBAL_SCOPE       0
-//#define LOCAL_SCOPE        1
-#define HASHSIZE         101
-#define HBUFSIZE      0x2000
-
-@interface ANTLRBaseStack : ANTLRPtrBuffer {
-	//ANTLRRuleStack *fNext;
-    // TStringPool *fPool;
-    NSInteger LastHash;
-}
-
-//@property (copy) ANTLRRuleStack *fNext;
-@property (getter=getLastHash, setter=setLastHash) NSInteger LastHash;
-
-// Contruction/Destruction
-+ (ANTLRBaseStack *)newANTLRBaseStack;
-+ (ANTLRBaseStack *)newANTLRBaseStackWithLen:(NSInteger)cnt;
-- (id)init;
-- (id)initWithLen:(NSInteger)cnt;
-- (void)dealloc;
-
-// Instance Methods
-- (id) copyWithZone:(NSZone *)aZone;
-
-- (NSInteger)count;
-- (NSInteger)size;
-/* clear -- reinitialize the maplist array */
-
-- (NSInteger)getLastHash;
-- (void)setLastHash:(NSInteger)aVal;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRBaseTree.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRBaseTree.h
deleted file mode 100755
index 96513f8..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRBaseTree.h
+++ /dev/null
@@ -1,199 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import "ANTLRTree.h"
-
-@protocol ANTLRBaseTree <ANTLRTree>
-
-@property (retain, getter=getChildren, setter=setChildren) NSMutableArray *children;
-
-+ (id<ANTLRBaseTree>) newANTLRBaseTree;
-+ (id<ANTLRBaseTree>) newANTLRBaseTree:(id<ANTLRBaseTree>)node;
-
-- (id<ANTLRBaseTree>) init;
-- (id<ANTLRBaseTree>) initWith:(id<ANTLRTree>)node;
-
-- (id<ANTLRBaseTree>) getChild:(NSUInteger)i;
-- (NSMutableArray *)getChildren;
-- (void) setChildren:(NSMutableArray *)anArray;
-- (id<ANTLRBaseTree>)getFirstChildWithType:(NSInteger)type;
-- (NSUInteger) getChildCount;
-
-// Add t as a child to this node.  If t is null, do nothing.  If t
-//  is nil, add all children of t to this' children.
-
-- (void) addChild:(id<ANTLRTree>) tree;
-- (void) addChildren:(NSArray *) theChildren;
-//- (void) removeAllChildren;
-
-- (void) setChild:(NSInteger) i With:(id<ANTLRTree>)t;
-- (id) deleteChild:(NSInteger) i;
-- (NSMutableArray *) createChildrenList;
-- (void) replaceChildrenFrom:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id) t;
-// Indicates the node is a nil node but may still have children, meaning
-// the tree is a flat list.
-
-- (BOOL) isNil;
-- (NSInteger) getTokenStartIndex;
-- (void) setTokenStartIndex:(NSInteger) index;
-- (NSInteger) getTokenStopIndex;
-- (void) setTokenStopIndex:(NSInteger) index;
-
-- (void) freshenParentAndChildIndexes;
-- (void) freshenParentAndChildIndexes:(NSInteger) offset;
-- (void) sanityCheckParentAndChildIndexes;
-- (void) sanityCheckParentAndChildIndexes:(id<ANTLRTree>) parent At:(NSInteger) i;
-
-- (NSInteger) getChildIndex;
-- (void) setChildIndex:(NSInteger)i;
-
-- (id<ANTLRTree>)getAncestor:(NSInteger)ttype;
-- (NSMutableArray *)getAncestors;
-
-#pragma mark Copying
-- (id) copyWithZone:(NSZone *)aZone;	// the children themselves are not copied here!
-- (id) deepCopy;					// performs a deepCopyWithZone: with the default zone
-- (id) deepCopyWithZone:(NSZone *)aZone;
-
-#pragma mark Tree Parser support
-- (NSInteger) getType;
-- (NSString *) getText;
-// In case we don't have a token payload, what is the line for errors?
-- (NSInteger) getLine;
-- (NSInteger) getCharPositionInLine;
-
-
-#pragma mark Informational
-- (NSString *) treeDescription;
-- (NSString *) description;
-
-- (NSString *) toString;
-- (NSString *) toStringTree;
-
-@end
-
-@interface ANTLRBaseTree : NSObject <ANTLRTree>
-{
-	NSMutableArray *children;
-    NSException *anException;
-}
-
-@property (retain, getter=getChildren, setter=setChildren) NSMutableArray *children;
-
-+ (id<ANTLRBaseTree>) newANTLRBaseTree;
-+ (id<ANTLRBaseTree>) newANTLRBaseTree:(id<ANTLRBaseTree>)node;
-         
-- (id<ANTLRTree>) init;
-- (id<ANTLRBaseTree>) initWith:(id<ANTLRTree>)node;
-
-- (id<ANTLRBaseTree>) getChild:(NSUInteger)i;
-- (NSMutableArray *)getChildren;
-- (void) setChildren:(NSMutableArray *)anArray;
-- (id<ANTLRBaseTree>)getFirstChildWithType:(NSInteger)type;
-- (NSUInteger) getChildCount;
-
-//- (void) removeAllChildren;
-
-// Add t as a child to this node.  If t is null, do nothing.  If t
-//  is nil, add all children of t to this' children.
-
-- (void) addChild:(id<ANTLRTree>) tree;
-- (void) addChildren:(NSArray *) theChildren;
-
-- (void) setChild:(NSInteger) i With:(id<ANTLRTree>)t;
-- (id) deleteChild:(NSInteger) i;
-- (NSMutableArray *) createChildrenList;
-- (void) replaceChildrenFrom:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id) t;
-// Indicates the node is a nil node but may still have children, meaning
-	// the tree is a flat list.
-
-- (BOOL) isNil;
-- (NSInteger) getTokenStartIndex;
-- (void) setTokenStartIndex:(NSInteger) index;
-- (NSInteger) getTokenStopIndex;
-- (void) setTokenStopIndex:(NSInteger) index;
-
-- (void) freshenParentAndChildIndexes;
-- (void) freshenParentAndChildIndexes:(NSInteger) offset;
-- (void) sanityCheckParentAndChildIndexes;
-- (void) sanityCheckParentAndChildIndexes:(id<ANTLRTree>) parent At:(NSInteger) i;
-
-- (NSInteger) getChildIndex;
-- (void) setChildIndex:(NSInteger)i;
-
-- (BOOL) hasAncestor:(NSInteger) ttype;
-- (id<ANTLRTree>)getAncestor:(NSInteger)ttype;
-- (NSMutableArray *)getAncestors;
-
-- (id) copyWithZone:(NSZone *)aZone;
-- (id) deepCopy;					// performs a deepCopyWithZone: with the default zone
-- (id) deepCopyWithZone:(NSZone *)aZone;
-
-	// Return a token type; needed for tree parsing
-- (NSInteger) getType;
-- (NSString *) getText;
-
-	// In case we don't have a token payload, what is the line for errors?
-- (NSInteger) getLine;
-- (NSInteger) getCharPositionInLine;
-- (void) setCharPositionInLine:(NSInteger)pos;
-
-- (NSString *) treeDescription;
-- (NSString *) description;
-- (NSString *) toString;
-- (NSString *) toStringTree;
-
-@end
-
-@interface ANTLRTreeNavigationNode : ANTLRBaseTree {
-}
-- (id) copyWithZone:(NSZone *)aZone;
-@end
-
-@interface ANTLRTreeNavigationNodeDown : ANTLRTreeNavigationNode {
-}
-+ (ANTLRTreeNavigationNodeDown *) getNavigationNodeDown;
-- (NSInteger) tokenType;
-- (NSString *) description;
-@end
-
-@interface ANTLRTreeNavigationNodeUp : ANTLRTreeNavigationNode {
-}
-+ (ANTLRTreeNavigationNodeUp *) getNavigationNodeUp;
-- (NSInteger) tokenType;
-- (NSString *) description;
-@end
-
-@interface ANTLRTreeNavigationNodeEOF : ANTLRTreeNavigationNode {
-}
-+ (ANTLRTreeNavigationNodeEOF *) getNavigationNodeEOF;
-- (NSInteger) tokenType;
-- (NSString *) description;
-@end
-
-extern ANTLRTreeNavigationNodeDown *navigationNodeDown;
-extern ANTLRTreeNavigationNodeUp *navigationNodeUp;
-extern ANTLRTreeNavigationNodeEOF *navigationNodeEOF;
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRBaseTreeAdaptor.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRBaseTreeAdaptor.h
deleted file mode 100644
index b4f8dad..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRBaseTreeAdaptor.h
+++ /dev/null
@@ -1,163 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTreeAdaptor.h"
-#import "ANTLRCommonErrorNode.h"
-#import "ANTLRUniqueIDMap.h"
-
-@interface ANTLRBaseTreeAdaptor : NSObject <ANTLRTreeAdaptor, NSCopying> {
-    ANTLRUniqueIDMap *treeToUniqueIDMap;
-	NSInteger uniqueNodeID;
-}
-
-@property (retain, getter=getTreeToUniqueIDMap, setter=setTreeToUniqueIDMap:) ANTLRUniqueIDMap *treeToUniqueIDMap;
-@property (getter=getUniqueNodeID, setter=setUniqueNodeID:) NSInteger uniqueNodeID;
-
-+ (id<ANTLRTreeAdaptor>) newEmptyTree;
-
-- (id) init;
-
-- (id) copyWithZone:(NSZone *)aZone;
-
-- (id) emptyNode;
-
-- (ANTLRUniqueIDMap *)getTreeToUniqueIDMap;
-- (void) setTreeToUniqueIDMap:(ANTLRUniqueIDMap *)aMapNode;
-
-- (NSInteger)getUniqueID;
-- (void) setUniqueNodeID:(NSInteger)aUniqueNodeID;
-
-/** create tree node that holds the start and stop tokens associated
- *  with an error.
- *
- *  If you specify your own kind of tree nodes, you will likely have to
- *  override this method. CommonTree returns Token.INVALID_TOKEN_TYPE
- *  if no token payload but you might have to set token type for diff
- *  node type.
- *
- *  You don't have to subclass CommonErrorNode; you will likely need to
- *  subclass your own tree node class to avoid class cast exception.
- */
-- (id) errorNode:(id<ANTLRTokenStream>)anInput
-            From:(id<ANTLRToken>)startToken
-              To:(id<ANTLRToken>)stopToken
-       Exception:(NSException *) e;
-
-- (BOOL) isNil:(id<ANTLRTree>) aTree;
-
-- (id<ANTLRTree>)dupTree:(id<ANTLRTree>)aTree;
-/** This is generic in the sense that it will work with any kind of
- *  tree (not just Tree interface).  It invokes the adaptor routines
- *  not the tree node routines to do the construction.  
- */
-- (id<ANTLRTree>)dupTree:(id<ANTLRTree>)aTree Parent:(id<ANTLRTree>)parent;
-- (id<ANTLRTree>)dupNode:(id<ANTLRTree>)aNode;
-/** Add a child to the tree t.  If child is a flat tree (a list), make all
- *  in list children of t.  Warning: if t has no children, but child does
- *  and child isNil then you can decide it is ok to move children to t via
- *  t.children = child.children; i.e., without copying the array.  Just
- *  make sure that this is consistent with have the user will build
- *  ASTs.
- */
-- (void) addChild:(id<ANTLRTree>)aChild toTree:(id<ANTLRTree>)aTree;
-
-/** If oldRoot is a nil root, just copy or move the children to newRoot.
- *  If not a nil root, make oldRoot a child of newRoot.
- *
- *    old=^(nil a b c), new=r yields ^(r a b c)
- *    old=^(a b c), new=r yields ^(r ^(a b c))
- *
- *  If newRoot is a nil-rooted single child tree, use the single
- *  child as the new root node.
- *
- *    old=^(nil a b c), new=^(nil r) yields ^(r a b c)
- *    old=^(a b c), new=^(nil r) yields ^(r ^(a b c))
- *
- *  If oldRoot was null, it's ok, just return newRoot (even if isNil).
- *
- *    old=null, new=r yields r
- *    old=null, new=^(nil r) yields ^(nil r)
- *
- *  Return newRoot.  Throw an exception if newRoot is not a
- *  simple node or nil root with a single child node--it must be a root
- *  node.  If newRoot is ^(nil x) return x as newRoot.
- *
- *  Be advised that it's ok for newRoot to point at oldRoot's
- *  children; i.e., you don't have to copy the list.  We are
- *  constructing these nodes so we should have this control for
- *  efficiency.
- */
-- (id<ANTLRTree>)becomeRoot:(id<ANTLRTree>)aNewRoot old:(id<ANTLRTree>)oldRoot;
-
-/** Transform ^(nil x) to x and nil to null */
-- (id<ANTLRTree>)rulePostProcessing:(id<ANTLRTree>)aRoot;
-
-- (id<ANTLRTree>)becomeRootfromToken:(id<ANTLRToken>)aNewRoot old:(id<ANTLRTree>)oldRoot;
-
-- (id<ANTLRTree>)createTree:(NSInteger)aTType With:(id<ANTLRToken>)aFromToken;
-
-- (id<ANTLRTree>)createTree:(NSInteger)aTType FromToken:(id<ANTLRToken>)aFromToken Text:(NSString *)theText;
-
-- (id<ANTLRTree>)createTree:(NSInteger)aTType Text:(NSString *)theText;
-
-- (NSInteger) getType:(id<ANTLRTree>)aTree;
-
-- (void) setType:(id<ANTLRTree>)aTree Type:(NSInteger)type;
-
-- (NSString *)getText:(id<ANTLRTree>)aTree;
-
-- (void) setText:(id<ANTLRTree>)aTree Text:(NSString *)theText;
-
-- (id<ANTLRTree>) getChild:(id<ANTLRTree>)aTree At:(NSInteger)i;
-
-- (void) setChild:(id<ANTLRTree>)aTree At:(NSInteger)index Child:(id<ANTLRTree>)aChild;
-
-- (id<ANTLRTree>) deleteChild:(id<ANTLRTree>)aTree Index:(NSInteger)index;
-
-- (NSInteger) getChildCount:(id<ANTLRTree>)aTree;
-
-- (NSInteger) getUniqueID:(id<ANTLRTree>)node;
-
-/** Tell me how to create a token for use with imaginary token nodes.
- *  For example, there is probably no input symbol associated with imaginary
- *  token DECL, but you need to create it as a payload or whatever for
- *  the DECL node as in ^(DECL type ID).
- *
- *  This is a variant of createToken where the new token is derived from
- *  an actual real input token.  Typically this is for converting '{'
- *  tokens to BLOCK etc...  You'll see
- *
- *    r : lc='{' ID+ '}' -> ^(BLOCK[$lc] ID+) ;
- *
- *  If you care what the token payload objects' type is, you should
- *  override this method and any other createToken variant.
- */
-- (id<ANTLRToken>)createToken:(NSInteger)aTType Text:(NSString *)theText;
-
-- (id<ANTLRToken>)createToken:(id<ANTLRToken>)aFromToken;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRBitSet.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRBitSet.h
deleted file mode 100755
index a1be117..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRBitSet.h
+++ /dev/null
@@ -1,93 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-#import <CoreFoundation/CoreFoundation.h>
-#import "ANTLRToken.h"
-
-#define BITS (sizeof(NSUInteger) * 8)
-#define LOG_BITS ((sizeof(NSUInteger)==8)?6:5)
-
-// A simple wrapper around CoreFoundation bit vectors to shield the rest of the implementation
-// from the specifics of the BitVector initialization and query functions.
-// This is fast, so there is no need to reinvent the wheel just yet.
-
-@interface ANTLRBitSet : NSObject < NSMutableCopying > {
-	CFMutableBitVectorRef bitVector;
-}
-
-#pragma mark Class Methods
-
-+ (ANTLRBitSet *) newANTLRBitSet;
-+ (ANTLRBitSet *) newANTLRBitSetWithType:(ANTLRTokenType)type;
-/** Construct a ANTLRBitSet given the size
- * @param nbits The size of the ANTLRBitSet in bits
- */
-+ (ANTLRBitSet *) newANTLRBitSetWithNBits:(NSUInteger)nbits;
-+ (ANTLRBitSet *) newANTLRBitSetWithArray:(NSMutableArray *)types;
-+ (ANTLRBitSet *) newANTLRBitSetWithBits:(const unsigned long long *)theBits Count:(NSUInteger)longCount;
-
-+ (ANTLRBitSet *) of:(NSUInteger)el;
-+ (ANTLRBitSet *) of:(NSUInteger)a And2:(NSUInteger)b;
-+ (ANTLRBitSet *) of:(NSUInteger)a And2:(NSUInteger)b And3:(NSUInteger)c;
-+ (ANTLRBitSet *) of:(NSUInteger)a And2:(NSUInteger)b And3:(NSUInteger)c And4:(NSUInteger)d;
-
-#pragma mark Initializer
-
-- (ANTLRBitSet *) init;
-- (ANTLRBitSet *) initWithType:(ANTLRTokenType)type;
-- (ANTLRBitSet *) initWithNBits:(NSUInteger)nbits;
-- (ANTLRBitSet *) initWithBitVector:(CFMutableBitVectorRef)theBitVector;
-- (ANTLRBitSet *) initWithBits:(const unsigned long long const*)theBits Count:(NSUInteger)theCount;
-- (ANTLRBitSet *) initWithArrayOfBits:(NSArray *)theArray;
-
-#pragma mark Operations
-- (ANTLRBitSet *) or:(ANTLRBitSet *) aBitSet;
-- (void) orInPlace:(ANTLRBitSet *) aBitSet;
-- (void) add:(NSUInteger) bit;
-- (void) remove:(NSUInteger) bit;
-- (void) setAllBits:(BOOL) aState;
-
-- (NSInteger) numBits;
-- (NSUInteger) size;
-- (void) setSize:(NSUInteger) noOfWords;
-
-#pragma mark Informational
-- (unsigned long long) bitMask:(NSUInteger) bitNumber;
-- (BOOL) member:(NSUInteger)bitNumber;
-- (BOOL) isNil;
-- (NSString *) toString;
-- (NSString *) description;
-
-#pragma mark NSCopying support
-
-- (id) mutableCopyWithZone:(NSZone *) theZone;
-
-
-//private
-- (CFMutableBitVectorRef) _bitVector;
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRBufferedTokenStream.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRBufferedTokenStream.h
deleted file mode 100644
index 198a6f7..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRBufferedTokenStream.h
+++ /dev/null
@@ -1,98 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTokenStream.h"
-#import "ANTLRTokenSource.h"
-#import "ANTLRBitSet.h"
-
-@interface ANTLRBufferedTokenStream : NSObject <ANTLRTokenStream> 
-{
-id<ANTLRTokenSource> tokenSource;
-    
-    /** Record every single token pulled from the source so we can reproduce
-     *  chunks of it later.  The buffer in LookaheadStream overlaps sometimes
-     *  as its moving window moves through the input.  This list captures
-     *  everything so we can access complete input text.
-     */
-NSMutableArray *tokens;
-    
-    /** Track the last mark() call result value for use in rewind(). */
-NSInteger lastMarker;
-    
-    /** The index into the tokens list of the current token (next token
-     *  to consume).  tokens[p] should be LT(1).  p=-1 indicates need
-     *  to initialize with first token.  The ctor doesn't get a token.
-     *  First call to LT(1) or whatever gets the first token and sets p=0;
-     */
-NSInteger p;
-    
-NSInteger range; // how deep have we gone?
-    
-}
-@property (retain, getter=getTokenSource,setter=setTokenSource) id<ANTLRTokenSource> tokenSource;
-@property (retain, getter=getTokens,setter=setTokens) NSMutableArray *tokens;
-@property (assign, getter=getLastMarker,setter=setLastMarker) NSInteger lastMarker;
-@property (assign, getter=getIndex,setter=setIndex) NSInteger p;
-@property (assign, getter=getRange,setter=setRange) NSInteger range;
-
-+ (ANTLRBufferedTokenStream *) newANTLRBufferedTokenStream;
-+ (ANTLRBufferedTokenStream *) newANTLRBufferedTokenStreamWith:(id<ANTLRTokenSource>)aSource;
-- (id) initWithSource:(id<ANTLRTokenSource>)aSource;
-- (id) copyWithZone:(NSZone *)aZone;
-- (NSInteger) getIndex;
-- (void) setIndex:(NSInteger)index;
-- (NSInteger) getRange;
-- (void) setRange:(NSInteger)anInt;
-- (NSInteger) mark;
-- (void) release:(NSInteger) marker;
-- (void) rewind:(NSInteger) marker;
-- (void) rewind;
-- (void) reset;
-- (void) seek:(NSInteger) index;
-- (NSInteger) size;
-- (void) consume;
-- (void) sync:(NSInteger) i;
-- (void) fetch:(NSInteger) n;
-- (id<ANTLRToken>) getToken:(NSInteger) i;
-- (NSMutableArray *)getFrom:(NSInteger)startIndex To:(NSInteger) stopIndex;
-- (NSInteger) LA:(NSInteger)k;
-- (id<ANTLRToken>) LT:(NSInteger) k;
-- (id<ANTLRToken>) LB:(NSInteger) k;
-- (void) setup;
-- (id<ANTLRTokenSource>) getTokenSource;
-- (void) setTokenSource:(id<ANTLRTokenSource>) aTokenSource;
-- (NSMutableArray *)getTokens;
-- (NSString *) getSourceName;
-- (NSMutableArray *)getTokensFrom:(NSInteger)startIndex To:(NSInteger)stopIndex;
-- (NSMutableArray *)getTokensFrom:(NSInteger)startIndex To:(NSInteger)stopIndex With:(ANTLRBitSet *)types;
-- (NSMutableArray *)getTokensFrom:(NSInteger)startIndex To:(NSInteger)stopIndex WithList:(NSMutableArray *)types;
-- (NSMutableArray *)getTokensFrom:(NSInteger)startIndex To:(NSInteger)stopIndex WithType:(NSInteger)ttype;
-- (NSString *) toStringFromStart:(NSInteger)startIndex ToEnd:(NSInteger)stopIndex;
-- (NSString *) toStringFromToken:(id<ANTLRToken>)startIndex ToToken:(id<ANTLRToken>)stopIndex;
-- (void) fill;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRBufferedTreeNodeStream.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRBufferedTreeNodeStream.h
deleted file mode 100644
index 8618ea2..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRBufferedTreeNodeStream.h
+++ /dev/null
@@ -1,156 +0,0 @@
-//
-//  ANTLRBufferedTreeNodeStream.h
-//  ANTLR
-//
-// [The "BSD licence"]
-// Copyright (c) 2010 Ian Michell 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTree.h"
-#import "ANTLRCommonTreeAdaptor.h"
-#import "ANTLRTokenStream.h"
-#import "ANTLRCommonTreeNodeStream.h"
-#import "ANTLRLookaheadStream.h"
-#import "ANTLRTreeIterator.h"
-#import "ANTLRIntArray.h"
-
-#define DEFAULT_INITIAL_BUFFER_SIZE 100
-#define INITIAL_CALL_STACK_SIZE 10
-
-#ifdef DONTUSENOMO
-@interface ANTLRStreamIterator : ANTLRTreeIterator
-{
-    NSInteger idx;
-    ANTLRBufferedTreeNodeStream input;
-    NSMutableArray *nodes;
-}
-
-+ (id) newANTLRStreamIterator:(ANTLRBufferedTreeNodeStream *) theStream;
-
-- (id) initWithStream:(ANTLRBufferedTreeNodeStream *) theStream;
-
-- (BOOL) hasNext;
-- (id) next;
-- (void) remove;
-@end
-#endif
-
-@interface ANTLRBufferedTreeNodeStream : NSObject <ANTLRTreeNodeStream> 
-{
-	id<ANTLRTree> up;
-	id<ANTLRTree> down;
-	id<ANTLRTree> eof;
-	
-	NSMutableArray *nodes;
-	
-	id<ANTLRTree> root; // root
-	
-	id<ANTLRTokenStream> tokens;
-	ANTLRCommonTreeAdaptor *adaptor;
-	
-	BOOL uniqueNavigationNodes;
-	NSInteger p;
-	NSInteger lastMarker;
-	ANTLRIntArray *calls;
-	
-	NSEnumerator *e;
-    id currentSymbol;
-	
-}
-
-@property (retain, getter=getUp, setter=setUp:) id<ANTLRTree> up;
-@property (retain, getter=getDown, setter=setDown:) id<ANTLRTree> down;
-@property (retain, getter=getEof, setter=setEof:) id<ANTLRTree> eof;
-@property (retain, getter=getNodes, setter=setNodes:) NSMutableArray *nodes;
-@property (retain, getter=getTreeSource, setter=setTreeSource:) id<ANTLRTree> root;
-@property (retain, getter=getTokenStream, setter=setTokenStream:) id<ANTLRTokenStream> tokens;
-@property (retain, getter=getAdaptor, setter=setAdaptor:) ANTLRCommonTreeAdaptor *adaptor;
-@property (assign, getter=getUniqueNavigationNodes, setter=setUniqueNavigationNodes:) BOOL uniqueNavigationNodes;
-@property (assign, getter=getIndex, setter=setIndex:) NSInteger p;
-@property (assign, getter=getLastMarker, setter=setLastMarker:) NSInteger lastMarker;
-@property (retain, getter=getCalls, setter=setCalls:) ANTLRIntArray *calls;
-@property (retain, getter=getEnum, setter=setEnum:) NSEnumerator *e;
-@property (retain, getter=getCurrentSymbol, setter=setCurrentSymbol:) id currentSymbol;
-
-+ (ANTLRBufferedTreeNodeStream *) newANTLRBufferedTreeNodeStream:(id<ANTLRTree>)tree;
-+ (ANTLRBufferedTreeNodeStream *) newANTLRBufferedTreeNodeStream:(id<ANTLRTreeAdaptor>)adaptor Tree:(id<ANTLRTree>)tree;
-+ (ANTLRBufferedTreeNodeStream *) newANTLRBufferedTreeNodeStream:(id<ANTLRTreeAdaptor>)adaptor Tree:(id<ANTLRTree>)tree withBufferSize:(NSInteger)initialBufferSize;
-
-#pragma mark Constructor
-- (id) initWithTree:(id<ANTLRTree>)tree;
-- (id) initWithTreeAdaptor:(ANTLRCommonTreeAdaptor *)anAdaptor Tree:(id<ANTLRTree>)tree;
-- (id) initWithTreeAdaptor:(ANTLRCommonTreeAdaptor *)anAdaptor Tree:(id<ANTLRTree>)tree WithBufferSize:(NSInteger)bufferSize;
-
-- (id) copyWithZone:(NSZone *)aZone;
-
-// protected methods. DO NOT USE
-#pragma mark Protected Methods
-- (void) fillBuffer;
-- (void) fillBufferWithTree:(id<ANTLRTree>) tree;
-- (NSInteger) getNodeIndex:(id<ANTLRTree>) node;
-- (void) addNavigationNode:(NSInteger) type;
-- (id) getNode:(NSInteger) i;
-- (id) LT:(NSInteger) k;
-- (id) getCurrentSymbol;
-- (id) LB:(NSInteger) i;
-#pragma mark General Methods
-- (NSString *) getSourceName;
-
-- (id<ANTLRTokenStream>) getTokenStream;
-- (void) setTokenStream:(id<ANTLRTokenStream>) tokens;
-- (id<ANTLRTreeAdaptor>) getTreeAdaptor;
-- (void) setTreeAdaptor:(id<ANTLRTreeAdaptor>) anAdaptor;
-
-- (BOOL)getUniqueNavigationNodes;
-- (void) setUniqueNavigationNodes:(BOOL)aVal;
-
-- (void) consume;
-- (NSInteger) LA:(NSInteger) i;
-- (NSInteger) mark;
-- (void) release:(NSInteger) marker;
-- (NSInteger) getIndex;
-- (void) setIndex:(NSInteger) idx;
-- (void) rewind:(NSInteger) marker;
-- (void) rewind;
-- (void) seek:(NSInteger) idx;
-
-- (void) push:(NSInteger) i;
-- (NSInteger) pop;
-
-- (void) reset;
-- (NSUInteger) count;
-- (NSEnumerator *) objectEnumerator;
-- (void) replaceChildren:(id)parent From:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id) t;
-
-- (NSString *) toTokenTypeString;
-- (NSString *) toTokenString:(NSInteger)aStart ToEnd:(NSInteger)aStop;
-- (NSString *) toStringFromNode:(id)aStart ToNode:(id)aStop;
-
-// getters and setters
-- (NSMutableArray *) getNodes;
-- (id<ANTLRTree>) getEof;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRCharStream.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRCharStream.h
deleted file mode 100755
index 379734b..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRCharStream.h
+++ /dev/null
@@ -1,55 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import "ANTLRIntStream.h"
-
-#define	ANTLRCharStreamEOF -1
-
-
-@protocol ANTLRCharStream < ANTLRIntStream >
-
-- (NSString *) substringWithRange:(NSRange) theRange;
-
-/** Get the ith character of lookahead.  This is the same usually as
- *  LA(i).  This will be used for labels in the generated
- *  lexer code.  I'd prefer to return a char here type-wise, but it's
- *  probably better to be 32-bit clean and be consistent with LA.
- */
-- (NSInteger)LT:(NSInteger) i;
-
-// ANTLR tracks the line information automatically
-- (NSInteger) getLine;
-
-// Because this stream can rewind, we need to be able to reset the line
-- (void) setLine:(NSInteger) theLine;
-
-// The index of the character relative to the beginning of the line 0..n-1
-- (NSInteger) getCharPositionInLine;
-
-- (void) setCharPositionInLine:(NSInteger) thePos;
-
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRCharStreamState.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRCharStreamState.h
deleted file mode 100644
index 2787c76..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRCharStreamState.h
+++ /dev/null
@@ -1,58 +0,0 @@
-//
-//  ANTLRCharStreamState.h
-//  ANTLR
-//
-// [The "BSD licence"]
-// Copyright (c)  2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-
-
-@interface ANTLRCharStreamState : NSObject
-{
-NSInteger p;
-NSInteger line;
-NSInteger charPositionInLine;
-}
-
-@property (getter=getP,setter=setP:) NSInteger p;
-@property (getter=getLine,setter=setLine:) NSInteger line;
-@property (getter=getCharPositionInLine,setter=setCharPositionInLine:) NSInteger charPositionInLine;
-
-+ newANTLRCharStreamState;
-
-- (id) init;
-
-- (NSInteger) getP;
-- (void) setP: (NSInteger) anIndex;
-
-- (NSInteger) getLine;
-- (void) setLine: (NSInteger) aLine;
-
-- (NSInteger) getCharPositionInLine;
-- (void) setCharPositionInLine:(NSInteger)aCharPositionInLine;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRCommonErrorNode.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRCommonErrorNode.h
deleted file mode 100644
index 79badc1..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRCommonErrorNode.h
+++ /dev/null
@@ -1,63 +0,0 @@
-//
-//  ANTLRCommonErrorNode.h
-//  ANTLR
-//
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRCommonTree.h"
-#import "ANTLRTokenStream.h"
-//#import "ANTLRIntStream.h"
-//#import "ANTLRToken.h"
-#import "ANTLRUnWantedTokenException.h"
-
-@interface ANTLRCommonErrorNode : ANTLRCommonTree
-{
-id<ANTLRIntStream> input;
-id<ANTLRToken> startToken;
-id<ANTLRToken> stopToken;
-ANTLRRecognitionException *trappedException;
-}
-
-+ (id) newANTLRCommonErrorNode:(id<ANTLRTokenStream>)anInput
-                  From:(id<ANTLRToken>)startToken
-                    To:(id<ANTLRToken>)stopToken
-                     Exception:(ANTLRRecognitionException *) e;
-
-- (id) initWithInput:(id<ANTLRTokenStream>)anInput
-                From:(id<ANTLRToken>)startToken
-                  To:(id<ANTLRToken>)stopToken
-           Exception:(ANTLRRecognitionException *) e;
-- (BOOL) isNil;
-
-- (NSInteger) getType;
-
-- (NSString *) getText;
-
-- (NSString *) toString;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRCommonToken.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRCommonToken.h
deleted file mode 100755
index 8662378..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRCommonToken.h
+++ /dev/null
@@ -1,105 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRToken.h"
-#import "ANTLRCharStream.h"
-
-@interface ANTLRCommonToken : NSObject < ANTLRToken > {
-	NSString *text;
-	NSInteger type;
-	// information about the Token's position in the input stream
-	NSUInteger line;
-	NSUInteger charPositionInLine;
-	NSUInteger channel;
-	// this token's position in the TokenStream
-	NSUInteger index;
-	
-	// indices into the CharStream to avoid copying the text
-	// can manually override the text by using -setText:
-	NSUInteger startIndex;
-	NSUInteger stopIndex;
-	// the actual input stream this token was found in
-	id<ANTLRCharStream> input;
-}
-
-@property (retain, getter=getText, setter=setText:) NSString *text;
-@property (assign, getter=getType, setter=setType:) NSInteger type;
-@property (assign, getter=getLine, setter=setLine:) NSUInteger line;
-@property (assign, getter=getCharPositionInLine, setter=setCharPositionInLine:) NSUInteger charPositionInLine;
-@property (assign, getter=getChannel, setter=setChannel:) NSUInteger channel;
-@property (assign, getter=getTokenIndex, setter=setTokenIndex:) NSUInteger index;
-@property (assign, getter=getStart, setter=setStart:) NSUInteger startIndex;
-@property (assign, getter=getStop, setter=setStop:) NSUInteger stopIndex;
-@property (retain, getter=getInput, setter=setInput:) id<ANTLRCharStream> input;
-
-+ (void) initialize;
-+ (ANTLRCommonToken *) newANTLRCommonToken;
-+ (ANTLRCommonToken *) newANTLRCommonToken:(id<ANTLRCharStream>)anInput
-                                      Type:(NSInteger)aTType
-                                   Channel:(NSInteger)aChannel
-                                     Start:(NSInteger)aStart
-                                      Stop:(NSInteger)aStop;
-+ (ANTLRCommonToken *) newANTLRCommonToken:(ANTLRTokenType)aType;
-+ (id<ANTLRToken>) newANTLRCommonToken:(NSInteger)tokenType Text:(NSString *)tokenText;
-+ (id<ANTLRToken>) newANTLRCommonTokenWithToken:(id<ANTLRToken>)fromToken;
-+ (id<ANTLRToken>) eofToken;
-+ (id<ANTLRToken>) skipToken;
-+ (id<ANTLRToken>) invalidToken;
-+ (ANTLRTokenChannel) defaultChannel;
-
-// designated initializer. This is used as the default way to initialize a Token in the generated code.
-- (ANTLRCommonToken *) init;
-- (ANTLRCommonToken *) initWithInput:(id<ANTLRCharStream>)anInput
-                                Type:(NSInteger)aTType
-                             Channel:(NSInteger)aChannel
-                               Start:(NSInteger)theStart
-                                Stop:(NSInteger)theStop;
-- (ANTLRCommonToken *) initWithToken:(ANTLRCommonToken *)aToken;
-- (ANTLRCommonToken *) initWithType:(ANTLRTokenType)aType;
-- (ANTLRCommonToken *) initWithType:(ANTLRTokenType)aTType Text:(NSString *)tokenText;
-
-- (id<ANTLRCharStream>) getInput;
-- (void) setInput: (id<ANTLRCharStream>) anInput;
-
-- (NSUInteger) getStart;
-- (void) setStart: (NSUInteger) aStart;
-
-- (NSUInteger) getStop;
-- (void) setStop: (NSUInteger) aStop;
-
-// the index of this Token into the TokenStream
-- (NSUInteger) getTokenIndex;
-- (void) setTokenIndex: (NSUInteger) aTokenIndex;
-
-// conform to NSCopying
-- (id) copyWithZone:(NSZone *)theZone;
-
-- (NSString *) description;
-- (NSString *) toString;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRCommonTokenStream.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRCommonTokenStream.h
deleted file mode 100755
index 59f9d5e..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRCommonTokenStream.h
+++ /dev/null
@@ -1,90 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTokenStream.h"
-#import "ANTLRToken.h"
-#import "ANTLRCommonToken.h"
-#import "ANTLRTokenSource.h"
-#import "ANTLRBitSet.h"
-#import "ANTLRBufferedTokenStream.h"
-
-@interface ANTLRCommonTokenStream : ANTLRBufferedTokenStream < ANTLRTokenStream >
-{
-	NSMutableDictionary *channelOverride;
-	NSInteger channel;
-}
-
-@property (retain, getter=getChannelOverride,setter=setChannelOverride) NSMutableDictionary *channelOverride;
-@property (assign, getter=getChannel,setter=setChannel) NSInteger channel;
-
-+ (ANTLRCommonTokenStream *)newANTLRCommonTokenStream;
-+ (ANTLRCommonTokenStream *)newANTLRCommonTokenStreamWithTokenSource:(id<ANTLRTokenSource>)theTokenSource;
-+ (ANTLRCommonTokenStream *)newANTLRCommonTokenStreamWithTokenSource:(id<ANTLRTokenSource>)theTokenSource
-                                                               Channel:(NSInteger)aChannel;
-
-- (id) init;
-- (id) initWithTokenSource:(id<ANTLRTokenSource>)theTokenSource;
-- (id) initWithTokenSource:(id<ANTLRTokenSource>)theTokenSource Channel:(NSInteger)aChannel;
-
-- (id<ANTLRTokenSource>) getTokenSource;
-- (void) setTokenSource: (id<ANTLRTokenSource>) aTokenSource;
-
-- (void) consume;
-- (id<ANTLRToken>) LT:(NSInteger)k;
-- (id<ANTLRToken>) LB:(NSInteger)k;
-
-- (NSInteger) skipOffChannelTokens:(NSInteger) i;
-- (NSInteger) skipOffChannelTokensReverse:(NSInteger) i;
-
-- (void)setup;
-
-- (NSArray *) tokensInRange:(NSRange)aRange;
-- (NSArray *) tokensInRange:(NSRange)aRange inBitSet:(ANTLRBitSet *)aBitSet;
-- (NSArray *) tokensInRange:(NSRange)aRange withTypes:(NSArray *)tokenTypes;
-- (NSArray *) tokensInRange:(NSRange)aRange withType:(NSInteger)tokenType;
-
-- (id<ANTLRToken>) getToken:(NSInteger)i;
-
-- (NSInteger) size;
-- (NSInteger) getIndex;
-- (void) rewind;
-- (void) rewind:(NSInteger)marker;
-- (void) seek:(NSInteger)index;
-
-- (NSString *) toString;
-- (NSString *) toStringFromStart:(NSInteger)startIndex ToEnd:(NSInteger)stopIndex;
-- (NSString *) toStringFromToken:(id<ANTLRToken>)startToken ToToken:(id<ANTLRToken>)stopToken;
-
-- (id) copyWithZone:(NSZone *)aZone;
-
-- (NSInteger)getChannel;
-- (void)setChannel:(NSInteger)aChannel;
-
-- (NSMutableDictionary *)getChannelOverride;
-- (void)setChannelOverride:(NSMutableDictionary *)anOverride;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRCommonTree.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRCommonTree.h
deleted file mode 100755
index 0966051..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRCommonTree.h
+++ /dev/null
@@ -1,88 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRCommonToken.h"
-#import "ANTLRBaseTree.h"
-
-@interface ANTLRCommonTree : ANTLRBaseTree <ANTLRTree> {
-	ANTLRCommonToken *token;
-	NSInteger startIndex;
-	NSInteger stopIndex;
-    ANTLRCommonTree *parent;
-    NSInteger childIndex;
-}
-
-@property (retain, getter=getANTLRCommonToken, setter=setANTLRCommonToken) ANTLRCommonToken *token;
-@property (assign, getter=getTokenStartIndex, setter=setTokenStartIndex) NSInteger startIndex;
-@property (assign, getter=getTokenStopIndex, setter=setTokenStopIndex) NSInteger stopIndex;
-@property (retain, getter=getParent, setter=setParent:) ANTLRCommonTree *parent;
-@property (assign, getter=getChildIndex, setter=setChildIndex) NSInteger childIndex;
-
-+ (ANTLRCommonTree *) invalidNode;
-+ (ANTLRCommonTree *) newANTLRCommonTree;
-+ (ANTLRCommonTree *) newANTLRCommonTreeWithTree:(ANTLRCommonTree *)aTree;
-+ (ANTLRCommonTree *) newANTLRCommonTreeWithToken:(ANTLRCommonToken *)aToken;
-+ (ANTLRCommonTree *) newANTLRCommonTreeWithTokenType:(NSInteger)tokenType;
-+ (ANTLRCommonTree *) newANTLRCommonTreeWithTokenType:(NSInteger)aTType Text:(NSString *)theText;
-#ifdef DONTUSEYET
-+ (id<ANTLRTree>) newANTLRCommonTreeWithTokenType:(NSInteger)tokenType;
-+ (id<ANTLRTree>) newANTLRCommonTreeWithToken:(id<ANTLRToken>)fromToken TokenType:(NSInteger)tokenType;
-+ (id<ANTLRTree>) newANTLRCommonTreeWithToken:(id<ANTLRToken>)fromToken TokenType:(NSInteger)tokenType Text:(NSString *)tokenText;
-+ (id<ANTLRTree>) newANTLRCommonTreeWithToken:(id<ANTLRToken>)fromToken Text:(NSString *)tokenText;
-#endif
-
-- (id) init;
-- (id) initWithTreeNode:(ANTLRCommonTree *)aNode;
-- (id) initWithToken:(ANTLRCommonToken *)aToken;
-- (id) initWithTokenType:(NSInteger)aTokenType;
-- (id) initWithTokenType:(NSInteger)aTokenType Text:(NSString *)theText;
-
-- (id<ANTLRTree>) copyWithZone:(NSZone *)aZone;
-
-- (BOOL) isNil;
-
-- (ANTLRCommonToken *) getToken;
-- (void) setToken:(ANTLRCommonToken *)aToken;
-- (id<ANTLRTree>) dupNode;
-- (NSInteger) getType;
-- (NSString *) getText;
-- (NSUInteger) getLine;
-- (NSUInteger) getCharPositionInLine;
-- (ANTLRCommonTree *) getParent;
-- (void) setParent:(ANTLRCommonTree *) t;
-
-#ifdef DONTUSENOMO
-- (NSString *) treeDescription;
-#endif
-- (NSString *) description;
-- (void) setUnknownTokenBoundaries;
-- (NSInteger) getTokenStartIndex;
-- (void) setTokenStartIndex: (NSInteger) aStartIndex;
-- (NSInteger) getTokenStopIndex;
-- (void) setTokenStopIndex: (NSInteger) aStopIndex;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRCommonTreeAdaptor.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRCommonTreeAdaptor.h
deleted file mode 100755
index 53287e6..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRCommonTreeAdaptor.h
+++ /dev/null
@@ -1,62 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTree.h"
-#import "ANTLRCommonToken.h"
-#import "ANTLRCommonTree.h"
-#import "ANTLRBaseTreeAdaptor.h"
-
-@interface ANTLRCommonTreeAdaptor : ANTLRBaseTreeAdaptor {
-}
-
-+ (id<ANTLRTree>) newEmptyTree;
-+ (ANTLRCommonTreeAdaptor *)newANTLRCommonTreeAdaptor;
-- (id) init;
-- (id<ANTLRTree>)dupNode:(id<ANTLRTree>)t;    
-- (ANTLRCommonTree *)createTree:(ANTLRCommonToken *)aToken;
-- (ANTLRCommonTree *)createTree:(NSInteger)tokenType Text:(NSString *)text;
-- (id<ANTLRToken>)createToken:(NSInteger)tokenType Text:(NSString *)text;
-- (void) setTokenBoundaries:(id<ANTLRTree>)t From:(id<ANTLRToken>)startToken To:(id<ANTLRToken>)stopToken;
-- (NSInteger)getTokenStartIndex:(id<ANTLRTree>)t;
-- (NSInteger)getTokenStopIndex:(id<ANTLRTree>)t;
-- (NSString *)getText:(id<ANTLRTree>)t;
-- (void)setText:(id<ANTLRTree>)t Text:(NSString *)text;
-- (NSInteger)getType:(id<ANTLRTree>)t;
-- (void) setType:(id<ANTLRTree>)t Type:(NSInteger)tokenType;
-- (id<ANTLRToken>)getToken:(id<ANTLRTree>)t;
-- (id<ANTLRTree>)getChild:(id<ANTLRTree>)t At:(NSInteger)i;
-- (void) setChild:(id<ANTLRTree>)t At:(NSInteger)i Child:(id<ANTLRTree>)child;
-- (NSInteger)getChildCount:(id<ANTLRTree>)t;
-- (id<ANTLRTree>)getParent:(id<ANTLRTree>)t;
-- (void)setParent:(id<ANTLRTree>)t With:(id<ANTLRTree>)parent;
-- (NSInteger)getChildIndex:(id<ANTLRTree>)t;
-- (void)setChildIndex:(id<ANTLRTree>)t With:(NSInteger)index;
-- (void)replaceChildren:(id<ANTLRTree>)parent From:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id<ANTLRTree>)t;
-- (id)copyWithZone:(NSZone *)zone;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRCommonTreeNodeStream.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRCommonTreeNodeStream.h
deleted file mode 100755
index 4c68f2e..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRCommonTreeNodeStream.h
+++ /dev/null
@@ -1,116 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRCommonTree.h"
-#import "ANTLRCommonTreeNodeStream.h"
-#import "ANTLRLookaheadStream.h"
-#import "ANTLRTreeNodeStream.h"
-#import "ANTLRTreeIterator.h"
-#import "ANTLRIntArray.h"
-
-@interface ANTLRCommonTreeNodeStream : ANTLRLookaheadStream <ANTLRTreeNodeStream> {
-#define DEFAULT_INITIAL_BUFFER_SIZE 100
-#define INITIAL_CALL_STACK_SIZE 10
-    
-/** Pull nodes from which tree? */
-id root;
-    
-/** If this tree (root) was created from a token stream, track it. */
-id <ANTLRTokenStream> tokens;
-    
-	/** What tree adaptor was used to build these trees */
-ANTLRCommonTreeAdaptor *adaptor;
-    
-/** The tree iterator we using */
-ANTLRTreeIterator *it;
-    
-/** Stack of indexes used for push/pop calls */
-ANTLRIntArray *calls;    
-    
-/** Tree (nil A B C) trees like flat A B C streams */
-BOOL hasNilRoot;
-    
-/** Tracks tree depth.  Level=0 means we're at root node level. */
-NSInteger level;
-}
-@property (retain, getter=getRoot, setter=setRoot:) ANTLRCommonTree *root;
-@property (retain, getter=getTokens,setter=setTokens:) id<ANTLRTokenStream> tokens;
-@property (retain, getter=getTreeAdaptor, setter=setTreeAdaptor:) ANTLRCommonTreeAdaptor *adaptor;
-
-+ (ANTLRCommonTreeNodeStream *) newANTLRCommonTreeNodeStream:(ANTLRCommonTree *)theTree;
-+ (ANTLRCommonTreeNodeStream *) newANTLRCommonTreeNodeStream:(id<ANTLRTreeAdaptor>)anAdaptor Tree:(ANTLRCommonTree *)theTree;
-
-- (id) initWithTree:(ANTLRCommonTree *)theTree;
-
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)adaptor Tree:(ANTLRCommonTree *)theTree;
-    
-- (void) reset;
-    
-    /** Pull elements from tree iterator.  Track tree level 0..max_level.
-     *  If nil rooted tree, don't give initial nil and DOWN nor final UP.
-     */
-- (id) nextElement;
-    
-- (BOOL) isEOF:(id<ANTLRTree>) o;
-- (void) setUniqueNavigationNodes:(BOOL) uniqueNavigationNodes;
-    
-- (id) getTreeSource;
-    
-- (NSString *) getSourceName;
-    
-- (id<ANTLRTokenStream>) getTokenStream;
-    
-- (void) setTokenStream:(id<ANTLRTokenStream>) tokens;
-    
-- (ANTLRCommonTreeAdaptor *) getTreeAdaptor;
-    
-- (void) setTreeAdaptor:(ANTLRCommonTreeAdaptor *) adaptor;
-    
-- (NSInteger) LA:(NSInteger) i;
-    
-    /** Make stream jump to a new location, saving old location.
-     *  Switch back with pop().
-     */
-- (ANTLRCommonTree *)getNode:(NSInteger) i;
-
-- (void) push:(NSInteger) index;
-    
-    /** Seek back to previous index saved during last push() call.
-     *  Return top of stack (return index).
-     */
-- (NSInteger) pop;
-    
-// TREE REWRITE INTERFACE
-    
-- (void) replaceChildren:(id)parent From:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id) t;
-    
-- (NSString *) toStringFromNode:(id<ANTLRTree>)startNode ToNode:(id<ANTLRTree>)stopNode;
-
-/** For debugging; destructive: moves tree iterator to end. */
-- (NSString *) toTokenTypeString;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRDFA.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRDFA.h
deleted file mode 100755
index 9094a3d..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRDFA.h
+++ /dev/null
@@ -1,75 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRBaseRecognizer.h"
-#import "ANTLRCharStream.h"
-#import "ANTLRNoViableAltException.h"
-
-@interface ANTLRDFA : NSObject {
-	// the tables are set by subclasses to their own static versions.
-	const int *eot;
-	const int *eof;
-	const unichar *min;
-	const unichar *max;
-	const int *accept;
-	const int *special;
-	const int **transition;
-	
-	ANTLRBaseRecognizer *recognizer;
-	NSInteger decisionNumber;
-    NSInteger len;
-}
-
-@property (retain, getter=getRecognizer,setter=setRecognizer:) ANTLRBaseRecognizer *recognizer;
-@property (assign, getter=getDecision,setter=setDecision:) NSInteger decisionNumber;
-@property (assign, getter=getLen,setter=setLen:) NSInteger len;
-
-- (id) initWithRecognizer:(id) theRecognizer;
-// simulate the DFA using the static tables and predict an alternative
-- (NSInteger) predict:(id<ANTLRCharStream>)anInput;
-- (void) noViableAlt:(NSInteger)state Stream:(id<ANTLRIntStream>)anInput;
-
-- (NSInteger) specialStateTransition:(NSInteger)state Stream:(id<ANTLRIntStream>)anInput;
-// - (NSInteger) specialStateTransition:(NSInteger) state;
-//- (unichar) specialTransition:(unichar) state symbol:(NSInteger) symbol;
-
-// hook for debugger support
-- (void) error:(ANTLRNoViableAltException *)nvae;
-
-- (NSString *) description;
-- (BOOL) evaluateSyntacticPredicate:(SEL)synpredFragment;
-
-+ (void) setIsEmittingDebugInfo:(BOOL) shouldEmitDebugInfo;
-
-- (NSInteger)getDecision;
-- (void)setDecision:(NSInteger)aDecison;
-
-- (ANTLRBaseRecognizer *)getRecognizer;
-- (void)setRecognizer:(ANTLRBaseRecognizer *)aRecognizer;
-- (NSInteger)length;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRDebug.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRDebug.h
deleted file mode 100755
index 87383c9..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRDebug.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import "ANTLRDebugEventListener.h"
-#import "ANTLRDebugEventProxy.h"
-#import "ANTLRDebugParser.h"
-#import "ANTLRDebugTokenStream.h"
-#import "ANTLRDebugTreeParser.h"
-#import "ANTLRDebugTreeNodeStream.h"
-#import "ANTLRDebugTreeAdaptor.h"
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRDebugEventListener.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRDebugEventListener.h
deleted file mode 100755
index c2bee6c..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRDebugEventListener.h
+++ /dev/null
@@ -1,275 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRToken.h"
-#import "ANTLRRecognitionException.h"
-
-@protocol ANTLRDebugEventListener 
-
-#define ANTLRDebugProtocolVersion 1
-
-/** The parser has just entered a rule.  No decision has been made about
-*  which alt is predicted.  This is fired AFTER init actions have been
-*  executed.  Attributes are defined and available etc...
-*/
-- (void) enterRule:(NSString *)ruleName;
-
-/** Because rules can have lots of alternatives, it is very useful to
-*  know which alt you are entering.  This is 1..n for n alts.
-*/
-- (void) enterAlt:(NSInteger)alt;
-
-/** This is the last thing executed before leaving a rule.  It is
-*  executed even if an exception is thrown.  This is triggered after
-*  error reporting and recovery have occurred (unless the exception is
-											   *  not caught in this rule).  This implies an "exitAlt" event.
-*/
-- (void) exitRule:(NSString *)ruleName;
-
-/** Track entry into any (...) subrule other EBNF construct */
-- (void) enterSubRule:(NSInteger)decisionNumber;
-
-- (void) exitSubRule:(NSInteger)decisionNumber;
-
-/** Every decision, fixed k or arbitrary, has an enter/exit event
-*  so that a GUI can easily track what LT/consume events are
-*  associated with prediction.  You will see a single enter/exit
-*  subrule but multiple enter/exit decision events, one for each
-*  loop iteration.
-*/
-- (void) enterDecision:(NSInteger)decisionNumber;
-
-- (void) exitDecision:(NSInteger)decisionNumber;
-
-/** An input token was consumed; matched by any kind of element.
-*  Trigger after the token was matched by things like match(), matchAny().
-*/
-- (void) consumeToken:(id<ANTLRToken>)t;
-
-/** An off-channel input token was consumed.
-*  Trigger after the token was matched by things like match(), matchAny().
-*  (unless of course the hidden token is first stuff in the input stream).
-*/
-- (void) consumeHiddenToken:(id<ANTLRToken>)t;
-
-/** Somebody (anybody) looked ahead.  Note that this actually gets
-*  triggered by both LA and LT calls.  The debugger will want to know
-*  which Token object was examined.  Like consumeToken, this indicates
-*  what token was seen at that depth.  A remote debugger cannot look
-*  ahead into a file it doesn't have so LT events must pass the token
-*  even if the info is redundant.
-*/
-- (void) LT:(NSInteger)i foundToken:(id<ANTLRToken>)t;
-
-/** The parser is going to look arbitrarily ahead; mark this location,
-*  the token stream's marker is sent in case you need it.
-*/
-- (void) mark:(NSInteger)marker;
-
-/** After an arbitrairly long lookahead as with a cyclic DFA (or with
-*  any backtrack), this informs the debugger that stream should be
-*  rewound to the position associated with marker.
-*/
-- (void) rewind:(NSInteger)marker;
-
-/** Rewind to the input position of the last marker.
-*  Used currently only after a cyclic DFA and just
-*  before starting a sem/syn predicate to get the
-*  input position back to the start of the decision.
-*  Do not "pop" the marker off the state.  mark(i)
-*  and rewind(i) should balance still.
-*/
-- (void) rewind;
-
-- (void) beginBacktrack:(NSInteger)level;
-
-- (void) endBacktrack:(NSInteger)level wasSuccessful:(BOOL)successful;
-
-/** To watch a parser move through the grammar, the parser needs to
-*  inform the debugger what line/charPos it is passing in the grammar.
-*  For now, this does not know how to switch from one grammar to the
-*  other and back for island grammars etc...
-*
-*  This should also allow breakpoints because the debugger can stop
-*  the parser whenever it hits this line/pos.
-*/
-- (void) locationLine:(NSInteger)line column:(NSInteger)pos;
-
-/** A recognition exception occurred such as NoViableAltException.  I made
-*  this a generic event so that I can alter the exception hierachy later
-*  without having to alter all the debug objects.
-*
-*  Upon error, the stack of enter rule/subrule must be properly unwound.
-*  If no viable alt occurs it is within an enter/exit decision, which
-*  also must be rewound.  Even the rewind for each mark must be unwount.
-*  In the Java target this is pretty easy using try/finally, if a bit
-*  ugly in the generated code.  The rewind is generated in DFA.predict()
-*  actually so no code needs to be generated for that.  For languages
-*  w/o this "finally" feature (C++?), the target implementor will have
-*  to build an event stack or something.
-*
-*  Across a socket for remote debugging, only the RecognitionException
-*  data fields are transmitted.  The token object or whatever that
-*  caused the problem was the last object referenced by LT.  The
-*  immediately preceding LT event should hold the unexpected Token or
-*  char.
-*
-*  Here is a sample event trace for grammar:
-*
-*  b : C ({;}A|B) // {;} is there to prevent A|B becoming a set
-*    | D
-*    ;
-*
-*  The sequence for this rule (with no viable alt in the subrule) for
-*  input 'c c' (there are 3 tokens) is:
-*
-*		commence
-*		LT(1)
-*		enterRule b
-*		location 7 1
-*		enter decision 3
-*		LT(1)
-*		exit decision 3
-*		enterAlt1
-*		location 7 5
-*		LT(1)
-*		consumeToken [c/<4>,1:0]
-*		location 7 7
-*		enterSubRule 2
-*		enter decision 2
-*		LT(1)
-*		LT(1)
-*		recognitionException NoViableAltException 2 1 2
-*		exit decision 2
-*		exitSubRule 2
-*		beginResync
-*		LT(1)
-*		consumeToken [c/<4>,1:1]
-*		LT(1)
-*		endResync
-*		LT(-1)
-*		exitRule b
-*		terminate
-*/
-- (void) recognitionException:(ANTLRRecognitionException *)e;
-
-/** Indicates the recognizer is about to consume tokens to resynchronize
-*  the parser.  Any consume events from here until the recovered event
-*  are not part of the parse--they are dead tokens.
-*/
-- (void) beginResync;
-
-/** Indicates that the recognizer has finished consuming tokens in order
-*  to resychronize.  There may be multiple beginResync/endResync pairs
-*  before the recognizer comes out of errorRecovery mode (in which
-*  multiple errors are suppressed).  This will be useful
-*  in a gui where you want to probably grey out tokens that are consumed
-*  but not matched to anything in grammar.  Anything between
-*  a beginResync/endResync pair was tossed out by the parser.
-*/
-- (void) endResync;
-
-/** A semantic predicate was evaluate with this result and action text */
-- (void) semanticPredicate:(NSString *)predicate matched:(BOOL)result;
-
-/** Announce that parsing has begun.  Not technically useful except for
-*  sending events over a socket.  A GUI for example will launch a thread
-*  to connect and communicate with a remote parser.  The thread will want
-*  to notify the GUI when a connection is made.  ANTLR parsers
-*  trigger this upon entry to the first rule (the ruleLevel is used to
-*  figure this out).
-*/
-- (void) commence;
-
-/** Parsing is over; successfully or not.  Mostly useful for telling
-*  remote debugging listeners that it's time to quit.  When the rule
-*  invocation level goes to zero at the end of a rule, we are done
-*  parsing.
-*/
-- (void) terminate;
-
-
-// T r e e  P a r s i n g
-
-/** Input for a tree parser is an AST, but we know nothing for sure
-*  about a node except its type and text (obtained from the adaptor).
-*  This is the analog of the consumeToken method.  Again, the ID is
-*  the hashCode usually of the node so it only works if hashCode is
-*  not implemented.  If the type is UP or DOWN, then
-*  the ID is not really meaningful as it's fixed--there is
-*  just one UP node and one DOWN navigation node.
-*/
-- (void) consumeNode:(NSInteger)nodeHash ofType:(NSInteger)type text:(NSString *)text;
-
-/** The tree parser lookedahead.  If the type is UP or DOWN,
-*  then the ID is not really meaningful as it's fixed--there is
-*  just one UP node and one DOWN navigation node.
-*/
-- (void) LT:(NSInteger)i foundNode:(unsigned)nodeHash ofType:(NSInteger)type text:(NSString *)text;
-
-
-// A S T  E v e n t s
-
-/** A nil was created (even nil nodes have a unique ID...
-*  they are not "null" per se).  As of 4/28/2006, this
-*  seems to be uniquely triggered when starting a new subtree
-*  such as when entering a subrule in automatic mode and when
-*  building a tree in rewrite mode.
-*/
-- (void) createNilNode:(unsigned)hash;
-
-/** Announce a new node built from text */
-- (void) createNode:(unsigned)hash text:(NSString *)text type:(NSInteger)type;
-
-/** Announce a new node built from an existing token */
-- (void) createNode:(unsigned)hash fromTokenAtIndex:(NSInteger)tokenIndex;
-
-/** Make a node the new root of an existing root.  See
-*
-*  Note: the newRootID parameter is possibly different
-*  than the TreeAdaptor.becomeRoot() newRoot parameter.
-*  In our case, it will always be the result of calling
-*  TreeAdaptor.becomeRoot() and not root_n or whatever.
-*
-*  The listener should assume that this event occurs
-*  only when the current subrule (or rule) subtree is
-*  being reset to newRootID.
-*
-*/
-- (void) makeNode:(unsigned)newRootHash parentOf:(unsigned)oldRootHash;
-
-/** Make childID a child of rootID.
-*  @see org.antlr.runtime.tree.TreeAdaptor.addChild()
-*/
-- (void) addChild:(unsigned)childHash toTree:(unsigned)treeHash;
-
-/** Set the token start/stop token index for a subtree root or node */
-- (void) setTokenBoundariesForTree:(unsigned)nodeHash From:(NSUInteger)tokenStartIndex To:(NSUInteger)tokenStopIndex;
-
-- (void) waitForDebuggerConnection;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRDebugEventProxy.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRDebugEventProxy.h
deleted file mode 100755
index 59bf67b..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRDebugEventProxy.h
+++ /dev/null
@@ -1,112 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRParser.h"
-#import "ANTLRDebugEventListener.h"
-#import <sys/socket.h>
-#import <netinet/in.h>
-#import <netinet/tcp.h>
-#include <arpa/inet.h>
-
-// default port for ANTLRWorks
-#define DEFAULT_DEBUGGER_PORT 0xC001
-
-@interface ANTLRDebugEventProxy : NSObject <ANTLRDebugEventListener> {
-	int serverSocket;
-	
-	struct sockaddr debugger_sockaddr;
-	socklen_t debugger_socklen;
-	int debuggerSocket;
-	NSFileHandle *debuggerFH;
-	
-	NSString *grammarName;
-	int debuggerPort;
-}
-
-- (id) init;
-- (id) initWithGrammarName:(NSString *)aGrammarName debuggerPort:(NSInteger)aPort;
-- (void) waitForDebuggerConnection;
-- (void) waitForAck;
-- (void) sendToDebugger:(NSString *)message;
-- (void) sendToDebugger:(NSString *)message waitForResponse:(BOOL)wait;
-
-- (NSInteger) serverSocket;
-- (void) setServerSocket: (NSInteger) aServerSocket;
-
-- (NSInteger) debuggerSocket;
-- (void) setDebuggerSocket: (NSInteger) aDebuggerSocket;
-
-- (NSString *) grammarName;
-- (void) setGrammarName: (NSString *) aGrammarName;
-
-- (NSInteger) debuggerPort;
-- (void) setDebuggerPort: (NSInteger) aDebuggerPort;
-
-- (NSString *) escapeNewlines:(NSString *)aString;
-
-#pragma mark -
-
-#pragma mark DebugEventListener Protocol
-- (void) enterRule:(NSString *)ruleName;
-- (void) enterAlt:(NSInteger)alt;
-- (void) exitRule:(NSString *)ruleName;
-- (void) enterSubRule:(NSInteger)decisionNumber;
-- (void) exitSubRule:(NSInteger)decisionNumber;
-- (void) enterDecision:(NSInteger)decisionNumber;
-- (void) exitDecision:(NSInteger)decisionNumber;
-- (void) consumeToken:(id<ANTLRToken>)t;
-- (void) consumeHiddenToken:(id<ANTLRToken>)t;
-- (void) LT:(NSInteger)i foundToken:(id<ANTLRToken>)t;
-- (void) mark:(NSInteger)marker;
-- (void) rewind:(NSInteger)marker;
-- (void) rewind;
-- (void) beginBacktrack:(NSInteger)level;
-- (void) endBacktrack:(NSInteger)level wasSuccessful:(BOOL)successful;
-- (void) locationLine:(NSInteger)line column:(NSInteger)pos;
-- (void) recognitionException:(ANTLRRecognitionException *)e;
-- (void) beginResync;
-- (void) endResync;
-- (void) semanticPredicate:(NSString *)predicate matched:(BOOL)result;
-- (void) commence;
-- (void) terminate;
-
-
-#pragma mark Tree Parsing
-- (void) consumeNode:(unsigned)nodeHash ofType:(NSInteger)type text:(NSString *)text;
-- (void) LT:(NSInteger)i foundNode:(unsigned)nodeHash ofType:(NSInteger)type text:(NSString *)text;
-
-
-#pragma mark AST Events
-
-- (void) createNilNode:(unsigned)hash;
-- (void) createNode:(unsigned)hash text:(NSString *)text type:(NSInteger)type;
-- (void) createNode:(unsigned)hash fromTokenAtIndex:(NSInteger)tokenIndex;
-- (void) makeNode:(unsigned)newRootHash parentOf:(unsigned)oldRootHash;
-- (void) addChild:(unsigned)childHash toTree:(unsigned)treeHash;
-- (void) setTokenBoundariesForTree:(unsigned)nodeHash From:(NSInteger)tokenStartIndex To:(NSInteger)tokenStopIndex;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRDebugParser.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRDebugParser.h
deleted file mode 100755
index b23ff50..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRDebugParser.h
+++ /dev/null
@@ -1,47 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRParser.h"
-#import "ANTLRDebugEventProxy.h"
-#import "ANTLRDebugTokenStream.h"
-
-@interface ANTLRDebugParser : ANTLRParser {
-	id<ANTLRDebugEventListener> debugListener;
-}
-
-- (id) initWithTokenStream:(id<ANTLRTokenStream>)theStream;
-- (id) initWithTokenStream:(id<ANTLRTokenStream>)theStream
-			  debuggerPort:(NSInteger)portNumber;
-// designated initializer
-- (id) initWithTokenStream:(id<ANTLRTokenStream>)theStream
-			 debugListener:(id<ANTLRDebugEventListener>)theDebugListener
-			  debuggerPort:(NSInteger)portNumber;
-
-- (id<ANTLRDebugEventListener>) debugListener;
-- (void) setDebugListener: (id<ANTLRDebugEventListener>) aDebugListener;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRDebugTokenStream.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRDebugTokenStream.h
deleted file mode 100755
index 335b002..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRDebugTokenStream.h
+++ /dev/null
@@ -1,62 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRParser.h"
-#import "ANTLRTokenStream.h"
-#import "ANTLRTokenSource.h"
-#import "ANTLRDebugTokenStream.h"
-#import "ANTLRDebugEventListener.h"
-
-@interface ANTLRDebugTokenStream : NSObject <ANTLRTokenStream>
-{
-	id<ANTLRDebugEventListener> debugListener;
-	id<ANTLRTokenStream> input;
-	BOOL initialStreamState;
-    NSInteger lastMarker;
-}
-
-- (id) initWithTokenStream:(id<ANTLRTokenStream>)theStream debugListener:(id<ANTLRDebugEventListener>)debugger;
-
-- (id<ANTLRDebugEventListener>) debugListener;
-- (void) setDebugListener: (id<ANTLRDebugEventListener>) aDebugListener;
-
-- (id<ANTLRTokenStream>) getInput;
-- (void) setInput:(id<ANTLRTokenStream>)aTokenStream;
-
-- (void) consume;
-- (id<ANTLRToken>) getToken:(NSInteger)index;
-- (NSInteger) getIndex;
-- (void) release:(NSInteger)marker;
-- (void) seek:(NSInteger)index;
-- (NSInteger) size;
-- (id<ANTLRTokenSource>) getTokenSource;
-- (NSString *) getSourceName;
-- (NSString *) toString;
-- (NSString *) toStringFromStart:(NSInteger)aStart ToEnd:(NSInteger)aStop;
-- (NSString *) toStringFromToken:(id<ANTLRToken>)startToken ToToken:(id<ANTLRToken>)stopToken;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRDebugTreeAdaptor.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRDebugTreeAdaptor.h
deleted file mode 100755
index 41965fa..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRDebugTreeAdaptor.h
+++ /dev/null
@@ -1,45 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRParser.h"
-#import "ANTLRBaseTreeAdaptor.h"
-#import "ANTLRDebugEventListener.h"
-
-@interface ANTLRDebugTreeAdaptor : ANTLRBaseTreeAdaptor {
-	id<ANTLRDebugEventListener> debugListener;
-	id<ANTLRTreeAdaptor> treeAdaptor;
-}
-
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor debugListener:(id<ANTLRDebugEventListener>)aDebugListener;
-
-- (id<ANTLRDebugEventListener>) debugListener;
-- (void) setDebugListener: (id<ANTLRDebugEventListener>) aDebugListener;
-
-- (id<ANTLRTreeAdaptor>) getTreeAdaptor;
-- (void) setTreeAdaptor: (id<ANTLRTreeAdaptor>) aTreeAdaptor;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRDebugTreeNodeStream.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRDebugTreeNodeStream.h
deleted file mode 100755
index 70f9939..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRDebugTreeNodeStream.h
+++ /dev/null
@@ -1,67 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRDebugEventListener.h"
-#import "ANTLRTreeAdaptor.h"
-#import "ANTLRTreeNodeStream.h"
-
-@interface ANTLRDebugTreeNodeStream : NSObject <ANTLRTreeNodeStream> {
-	id<ANTLRDebugEventListener> debugListener;
-	id<ANTLRTreeAdaptor> treeAdaptor;
-	id<ANTLRTreeNodeStream> input;
-	BOOL initialStreamState;
-}
-
-- (id) initWithTreeNodeStream:(id<ANTLRTreeNodeStream>)theStream debugListener:(id<ANTLRDebugEventListener>)debugger;
-
-- (id<ANTLRDebugEventListener>) debugListener;
-- (void) setDebugListener: (id<ANTLRDebugEventListener>) aDebugListener;
-
-- (id<ANTLRTreeNodeStream>) getInput;
-- (void) setInput: (id<ANTLRTreeNodeStream>) aTreeNodeStream;
-
-- (id<ANTLRTreeAdaptor>) getTreeAdaptor;
-- (void) setTreeAdaptor: (id<ANTLRTreeAdaptor>) aTreeAdaptor;
-
-#pragma mark ANTLRTreeNodeStream conformance
-
-- (id) LT:(NSInteger)k;
-- (id<ANTLRTreeAdaptor>) getTreeAdaptor;
-- (void) setUniqueNavigationNodes:(BOOL)flag;
-
-#pragma mark ANTLRIntStream conformance
-- (void) consume;
-- (NSInteger) LA:(NSUInteger) i;
-- (NSUInteger) mark;
-- (NSUInteger) getIndex;
-- (void) rewind:(NSUInteger) marker;
-- (void) rewind;
-- (void) release:(NSUInteger) marker;
-- (void) seek:(NSUInteger) index;
-- (NSUInteger) size;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRDebugTreeParser.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRDebugTreeParser.h
deleted file mode 100755
index cbeac76..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRDebugTreeParser.h
+++ /dev/null
@@ -1,48 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTreeParser.h"
-#import "ANTLRDebugEventProxy.h"
-#import "ANTLRDebugTreeNodeStream.h"
-
-@interface ANTLRDebugTreeParser : ANTLRTreeParser {
-	id<ANTLRDebugEventListener> debugListener;
-}
-
-- (id) initWithTreeNodeStream:(id<ANTLRTreeNodeStream>)theStream;
-- (id) initWithTreeNodeStream:(id<ANTLRTreeNodeStream>)theStream
-				 debuggerPort:(NSInteger)portNumber;
-	// designated initializer
-- (id) initWithTreeNodeStream:(id<ANTLRTreeNodeStream>)theStream
-				debugListener:(id<ANTLRDebugEventListener>)theDebugListener
-				 debuggerPort:(NSInteger)portNumber;
-
-- (id<ANTLRDebugEventListener>) debugListener;
-- (void) setDebugListener: (id<ANTLRDebugEventListener>) aDebugListener;
-
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLREarlyExitException.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLREarlyExitException.h
deleted file mode 100755
index 1a89bbb..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLREarlyExitException.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRecognitionException.h"
-
-@interface ANTLREarlyExitException : ANTLRRecognitionException {
-	int decisionNumber;
-}
-
-+ (ANTLREarlyExitException *) exceptionWithStream:(id<ANTLRIntStream>) anInputStream decisionNumber:(NSInteger) aDecisionNumber;
-- (id) initWithStream:(id<ANTLRIntStream>)anInputStream decisionNumber:(NSInteger) aDecisionNumber;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRError.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRError.h
deleted file mode 100644
index f2657af..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRError.h
+++ /dev/null
@@ -1,55 +0,0 @@
-//
-//  ANTLRError.h
-//  ANTLR
-//
-//  Created by Ian Michell on 30/03/2010.
-//  Copyright 2010 Ian Michell. All rights reserved.
-//
-
-// [The "BSD licence"]
-//
-// 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.
-
-#import <Cocoa/Cocoa.h>
-
-#define ANTLRErrorDomain @"ANTLRError"
-
-#define ANTLRIllegalArgumentException @"ANTLRIllegalArgumentException"
-#define ANTLRIllegalStateException @"IllegalStateException"
-//#define ANTLRRuntimeException @"RuntimeException"
-//#define ANTLRNoSuchMethodException @"NoSuchMethodException"
-//#define ANTLRNoSuchElementException @"NoSuchElementException"
-//#define ANTLRUnsupportedOperationException @"UnsupportedOperationException"
-
-
-/*typedef enum
-{
-	ANTLRIllegalState = 1,
-	ANTLRIllegalArgument = 2,
-	ANTLRRecognitionError = 3,
-	ANTLRMissingTokenError = 4,
-	ANTLRUnwantedTokenError = 5,
-	ANTLRMismatechedTokenError = 6,
-	ANTLRNoViableAltError = 7
-	
-} ANTLRErrorCode;*/
\ No newline at end of file
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRFailedPredicateException.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRFailedPredicateException.h
deleted file mode 100755
index 9788cba..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRFailedPredicateException.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRecognitionException.h"
-
-
-@interface ANTLRFailedPredicateException : ANTLRRecognitionException
-{
-	NSString *predicate;
-	NSString *ruleName;
-}
-
-@property (retain, getter=getPredicate, setter=setPredicate:) NSString *predicate;
-@property (retain, getter=getRuleName, setter=setRuleName:) NSString *ruleName;
-
-+ (ANTLRFailedPredicateException *) exceptionWithRuleName:(NSString *)theRuleName predicate:(NSString *)thePredicate stream:(id<ANTLRIntStream>)theStream;
-- (ANTLRFailedPredicateException *) initWithRuleName:(NSString *)theRuleName predicate:(NSString *)thePredicate stream:(id<ANTLRIntStream>)theStream;
-
-#ifdef DONTUSEYET
-- (NSString *) getPredicate;
-- (void) setPredicate:(NSString *)thePredicate;
-- (NSString *) getRuleName;
-- (void) setRuleName:(NSString *)theRuleName;
-#endif
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRFastQueue.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRFastQueue.h
deleted file mode 100644
index cf81817..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRFastQueue.h
+++ /dev/null
@@ -1,68 +0,0 @@
-//
-//  ANTLRFastQueue.h
-//  ANTLR
-//
-//  Created by Ian Michell on 26/04/2010.
-// [The "BSD licence"]
-// Copyright (c) 2010 Ian Michell 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-
-
-@interface ANTLRFastQueue : NSObject <NSCopying>
-{
-	NSAutoreleasePool *pool;
-	NSMutableArray *data;
-	NSInteger p;
-}
-
-@property (retain, getter=getPool, setter=setPool) NSAutoreleasePool *pool;
-@property (retain, getter=getData, setter=setData) NSMutableArray *data;
-@property (assign, getter=getP, setter=setP) NSInteger p;
-
-+ (id) newANTLRFastQueue;
-
-- (id) init;
-
-- (id) copyWithZone:(NSZone *)aZone;
-
-- (void) reset;
-- (id) remove;
-- (void) addObject:(id) o;
-- (NSInteger) count;
-- (NSInteger) size;
-- (id) head;
-- (id) objectAtIndex:(NSInteger) i;
-- (void) clear;
-- (NSString *) toString;
-- (NSAutoreleasePool *)getPool;
-- (void)setPool:(NSAutoreleasePool *)aPool;
-- (NSMutableArray *)getData;
-- (void)setData:(NSMutableArray *)myData;
-- (NSInteger) getP;
-- (void) setP:(NSInteger)anInt;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRHashMap.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRHashMap.h
deleted file mode 100644
index 04aca7b..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRHashMap.h
+++ /dev/null
@@ -1,102 +0,0 @@
-//
-//  ANTLRHashMap.h
-//  ANTLR
-//
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRLinkBase.h"
-#import "ANTLRMapElement.h"
-
-#define GLOBAL_SCOPE       0
-#define LOCAL_SCOPE        1
-#define HASHSIZE         101
-#define HBUFSIZE      0x2000
-
-@interface ANTLRHashMap : ANTLRLinkBase {
-	//	ANTLRHashMap *fNext;
-    //    TStringPool *fPool;
-    NSInteger Scope;
-    NSInteger LastHash;
-    NSInteger BuffSize;
-    ANTLRMapElement *ptrBuffer[HASHSIZE];
-    NSInteger mode;
-}
-
-//@property (copy) ANTLRHashMap *fNext;
-//@property (copy) TStringPool *fPool;
-@property (getter=getScope, setter=setScope:) NSInteger Scope;
-@property (getter=getLastHash, setter=setLastHash:) NSInteger LastHash;
-
-// Contruction/Destruction
-+ (id)newANTLRHashMap;
-+ (id)newANTLRHashMapWithLen:(NSInteger)aBuffSize;
-- (id)init;
-- (id)initWithLen:(NSInteger)aBuffSize;
-- (void)dealloc;
-- (ANTLRHashMap *)PushScope:( ANTLRHashMap **)map;
-- (ANTLRHashMap *)PopScope:( ANTLRHashMap **)map;
-
-- (NSInteger)count;
-- (NSInteger)size;
-
-// Instance Methods
-/*    form hash value for string s */
-- (NSInteger)hash:(NSString *)s;
-/*   look for s in ptrBuffer  */
-- (ANTLRHashMap *)findscope:(int)level;
-/*   look for s in ptrBuffer  */
-- (id)lookup:(NSString *)s Scope:(int)scope;
-/*   look for s in ptrBuffer  */
-- (id)install:(ANTLRMapElement *)sym Scope:(int)scope;
-/*   look for s in ptrBuffer  */
-- (void)deleteANTLRHashMap:(ANTLRMapElement *)np;
-- (int)RemoveSym:(NSString *)s;
-- (void)delete_chain:(ANTLRMapElement *)np;
-#ifdef DONTUSEYET
-- (int)bld_symtab:(KW_TABLE *)toknams;
-#endif
-- (ANTLRMapElement **)getptrBuffer;
-- (ANTLRMapElement *)getptrBufferEntry:(int)idx;
-- (void)setptrBuffer:(ANTLRMapElement *)np Index:(int)idx;
-- (NSInteger)getScope;
-- (void)setScope:(NSInteger)i;
-- (ANTLRMapElement *)getTType:(NSString *)name;
-- (ANTLRMapElement *)getNameInList:(NSInteger)ttype;
-- (void)putNode:(NSString *)name TokenType:(NSInteger)ttype;
-- (NSInteger)getMode;
-- (void)setMode:(NSInteger)aMode;
-- (void) insertObject:(id)aRule atIndex:(NSInteger)idx;
-- (id) objectAtIndex:(NSInteger)idx;
-- (void) setObject:(id)aRule atIndex:(NSInteger)idx;
-- (void)addObject:(id)anObject;
-- (ANTLRMapElement *) getName:(NSString *)aName;
-- (void) putName:(NSString *)name Node:(id)aNode;
-
-- (NSEnumerator *)objectEnumerator;
-- (BOOL) hasNext;
-- (ANTLRMapElement *)nextObject;
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRHashMap.m b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRHashMap.m
deleted file mode 100644
index a23426b..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRHashMap.m
+++ /dev/null
@@ -1,521 +0,0 @@
-//
-//  ANTLRHashMap.m
-//  ANTLR
-//
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#define SUCCESS (0)
-#define FAILURE (-1)
-
-#import "ANTLRHashMap.h"
-
-static NSInteger itIndex;
-
-/*
- * Start of ANTLRHashMap
- */
-@implementation ANTLRHashMap
-
-@synthesize Scope;
-@synthesize LastHash;
-
-+(id)newANTLRHashMap
-{
-    ANTLRHashMap *aNewANTLRHashMap;
-    
-    aNewANTLRHashMap = [[ANTLRHashMap alloc] init];
-	return( aNewANTLRHashMap );
-}
-
-+(id)newANTLRHashMapWithLen:(NSInteger)aBuffSize
-{
-    ANTLRHashMap *aNewANTLRHashMap;
-    
-    aNewANTLRHashMap = [[ANTLRHashMap alloc] initWithLen:aBuffSize];
-	return( aNewANTLRHashMap );
-}
-
--(id)init
-{
-    NSInteger idx;
-    
-	if ((self = [super init]) != nil) {
-		fNext = nil;
-        BuffSize = HASHSIZE;
-		Scope = 0;
-		if ( fNext != nil ) {
-			Scope = ((ANTLRHashMap *)fNext)->Scope+1;
-			for( idx = 0; idx < BuffSize; idx++ ) {
-				ptrBuffer[idx] = ((ANTLRHashMap *)fNext)->ptrBuffer[idx];
-			}
-		}
-        mode = 0;
-	}
-    return( self );
-}
-
--(id)initWithLen:(NSInteger)aBuffSize
-{
-    NSInteger idx;
-    
-	if ((self = [super init]) != nil) {
-		fNext = nil;
-        BuffSize = aBuffSize;
-		Scope = 0;
-		if ( fNext != nil ) {
-			Scope = ((ANTLRHashMap *)fNext)->Scope+1;
-			for( idx = 0; idx < BuffSize; idx++ ) {
-				ptrBuffer[idx] = ((ANTLRHashMap *)fNext)->ptrBuffer[idx];
-			}
-		}
-        mode = 0;
-	}
-    return( self );
-}
-
--(void)dealloc
-{
-    ANTLRMapElement *tmp, *rtmp;
-    NSInteger idx;
-	
-    if ( self.fNext != nil ) {
-        for( idx = 0; idx < BuffSize; idx++ ) {
-            tmp = ptrBuffer[idx];
-            while ( tmp && tmp != [((ANTLRHashMap *)fNext) getptrBufferEntry:idx] ) {
-                rtmp = tmp;
-                // tmp = [tmp getfNext];
-                tmp = (ANTLRMapElement *)tmp.fNext;
-                [rtmp dealloc];
-            }
-        }
-    }
-	[super dealloc];
-}
-
-- (NSInteger)count
-{
-    id anElement;
-    NSInteger aCnt = 0;
-    
-    for (NSInteger i = 0; i < BuffSize; i++) {
-        if ((anElement = ptrBuffer[i]) != nil) {
-            aCnt++;
-        }
-    }
-    return aCnt;
-}
-                          
-- (NSInteger) size
-{
-    id anElement;
-    NSInteger aSize = 0;
-    
-    for (NSInteger i = 0; i < BuffSize; i++) {
-        if ((anElement = ptrBuffer[i]) != nil) {
-            aSize += sizeof(id);
-        }
-    }
-    return aSize;
-}
-                                  
-                                  
--(void)deleteANTLRHashMap:(ANTLRMapElement *)np
-{
-    ANTLRMapElement *tmp, *rtmp;
-    NSInteger idx;
-    
-    if ( self.fNext != nil ) {
-        for( idx = 0; idx < BuffSize; idx++ ) {
-            tmp = ptrBuffer[idx];
-            while ( tmp && tmp != (ANTLRLinkBase *)[((ANTLRHashMap *)fNext) getptrBufferEntry:idx] ) {
-                rtmp = tmp;
-                tmp = [tmp getfNext];
-                [rtmp dealloc];
-            }
-        }
-    }
-}
-
--(ANTLRHashMap *)PushScope:(ANTLRHashMap **)map
-{
-    NSInteger idx;
-    ANTLRHashMap *htmp;
-    
-    htmp = [ANTLRHashMap newANTLRHashMap];
-    if ( *map != nil ) {
-        ((ANTLRHashMap *)htmp)->fNext = *map;
-        [htmp setScope:[((ANTLRHashMap *)htmp->fNext) getScope]+1];
-        for( idx = 0; idx < BuffSize; idx++ ) {
-            htmp->ptrBuffer[idx] = ((ANTLRHashMap *)htmp->fNext)->ptrBuffer[idx];
-        }
-    }
-    //    gScopeLevel++;
-    *map = htmp;
-    return( htmp );
-}
-
--(ANTLRHashMap *)PopScope:(ANTLRHashMap **)map
-{
-    NSInteger idx;
-    ANTLRMapElement *tmp;
-	ANTLRHashMap *htmp;
-    
-    htmp = *map;
-    if ( (*map)->fNext != nil ) {
-        *map = (ANTLRHashMap *)htmp->fNext;
-        for( idx = 0; idx < BuffSize; idx++ ) {
-            if ( htmp->ptrBuffer[idx] == nil ||
-                htmp->ptrBuffer[idx] == (*map)->ptrBuffer[idx] ) {
-                break;
-            }
-            tmp = htmp->ptrBuffer[idx];
-            /*
-             * must deal with parms, locals and labels at some point
-             * can not forget the debuggers
-             */
-            htmp->ptrBuffer[idx] = [tmp getfNext];
-            [ tmp dealloc];
-        }
-        *map = (ANTLRHashMap *)htmp->fNext;
-        //        gScopeLevel--;
-    }
-    return( htmp );
-}
-
-#ifdef USERDOC
-/*
- *  HASH        hash entry to get index to table
- *  NSInteger hash( ANTLRHashMap *self, char *s );
- *
- *     Inputs:  char *s             string to find
- *
- *     Returns: NSInteger                 hashed value
- *
- *  Last Revision 9/03/90
- */
-#endif
--(NSInteger)hash:(NSString *)s       /*    form hash value for string s */
-{
-	NSInteger hashval;
-	const char *tmp;
-    
-	tmp = [s cStringUsingEncoding:NSASCIIStringEncoding];
-	for( hashval = 0; *tmp != '\0'; )
-        hashval += *tmp++;
-	self->LastHash = hashval % BuffSize;
-	return( self->LastHash );
-}
-
-#ifdef USERDOC
-/*
- *  FINDSCOPE  search hashed list for entry
- *  ANTLRHashMap *findscope( ANTLRHashMap *self, NSInteger scope );
- *
- *     Inputs:  NSInteger       scope -- scope level to find
- *
- *     Returns: ANTLRHashMap   pointer to ptrBuffer of proper scope level
- *
- *  Last Revision 9/03/90
- */
-#endif
--(ANTLRHashMap *)findscope:(NSInteger)scope
-{
-    if ( self->Scope == scope ) {
-        return( self );
-    }
-    else if ( fNext ) {
-        return( [((ANTLRHashMap *)fNext) findscope:scope] );
-    }
-    return( nil );              /*   not found      */
-}
-
-#ifdef USERDOC
-/*
- *  LOOKUP  search hashed list for entry
- *  ANTLRMapElement *lookup( ANTLRHashMap *self, char *s, NSInteger scope );
- *
- *     Inputs:  char     *s          string to find
- *
- *     Returns: ANTLRMapElement  *           pointer to entry
- *
- *  Last Revision 9/03/90
- */
-#endif
--(id)lookup:(NSString *)s Scope:(NSInteger)scope
-{
-    ANTLRMapElement *np;
-    
-    for( np = self->ptrBuffer[[self hash:s]]; np != nil; np = [np getfNext] ) {
-        if ( [s isEqualToString:[np getName]] ) {
-            return( np );        /*   found it       */
-        }
-    }
-    return( nil );              /*   not found      */
-}
-
-#ifdef USERDOC
-/*
- *  INSTALL search hashed list for entry
- *  NSInteger install( ANTLRHashMap *self, ANTLRMapElement *sym, NSInteger scope );
- *
- *     Inputs:  ANTLRMapElement    *sym   -- symbol ptr to install
- *              NSInteger         scope -- level to find
- *
- *     Returns: Boolean     TRUE   if installed
- *                          FALSE  if already in table
- *
- *  Last Revision 9/03/90
- */
-#endif
--(ANTLRMapElement *)install:(ANTLRMapElement *)sym Scope:(NSInteger)scope
-{
-    ANTLRMapElement *np;
-    
-    np = [self lookup:[sym getName] Scope:scope ];
-    if ( np == nil ) {
-        [sym retain];
-        [sym setFNext:self->ptrBuffer[ self->LastHash ]];
-        self->ptrBuffer[ self->LastHash ] = sym;
-        return( self->ptrBuffer[ self->LastHash ] );
-    }
-    return( nil );            /*   not found      */
-}
-
-#ifdef USERDOC
-/*
- *  RemoveSym  search hashed list for entry
- *  NSInteger RemoveSym( ANTLRHashMap *self, char *s );
- *
- *     Inputs:  char     *s          string to find
- *
- *     Returns: NSInteger      indicator of SUCCESS OR FAILURE
- *
- *  Last Revision 9/03/90
- */
-#endif
--(NSInteger)RemoveSym:(NSString *)s
-{
-    ANTLRMapElement *np, *tmp;
-    NSInteger idx;
-    
-    idx = [self hash:s];
-    for ( tmp = self->ptrBuffer[idx], np = self->ptrBuffer[idx]; np != nil; np = [np getfNext] ) {
-        if ( [s isEqualToString:[np getName]] ) {
-            tmp = [np getfNext];             /* get the next link  */
-            [np dealloc];
-            return( SUCCESS );            /* report SUCCESS     */
-        }
-        tmp = [np getfNext];              //  BAD!!!!!!
-    }
-    return( FAILURE );                    /*   not found      */
-}
-
--(void)delete_chain:(ANTLRMapElement *)np
-{
-    if ( [np getfNext] != nil )
-		[self delete_chain:[np getfNext]];
-	[np dealloc];
-}
-
-#ifdef DONTUSEYET
--(NSInteger)bld_symtab:(KW_TABLE *)toknams
-{
-    NSInteger i;
-    ANTLRMapElement *np;
-    
-    for( i = 0; *(toknams[i].name) != '\0'; i++ ) {
-        // install symbol in ptrBuffer
-        np = [ANTLRMapElement newANTLRMapElement:[NSString stringWithFormat:@"%s", toknams[i].name]];
-        //        np->fType = toknams[i].toknum;
-        [self install:np Scope:0];
-    }
-    return( SUCCESS );
-}
-#endif
-
--(ANTLRMapElement *)getptrBufferEntry:(NSInteger)idx
-{
-	return( ptrBuffer[idx] );
-}
-
--(ANTLRMapElement **)getptrBuffer
-{
-	return( ptrBuffer );
-}
-
--(void)setptrBuffer:(ANTLRMapElement *)np Index:(NSInteger)idx
-{
-	if ( idx < BuffSize ) {
-        [np retain];
-		ptrBuffer[idx] = np;
-    }
-}
-
--(NSInteger)getScope
-{
-	return( Scope );
-}
-
--(void)setScopeScope:(NSInteger)i
-{
-	Scope = i;
-}
-
-- (ANTLRMapElement *)getTType:(NSString *)name
-{
-    return [self lookup:name Scope:0];
-}
-
-/*
- * works only for maplist indexed not by name but by TokenNumber
- */
-- (ANTLRMapElement *)getNameInList:(NSInteger)ttype
-{
-    ANTLRMapElement *np;
-    NSInteger aTType;
-
-    aTType = ttype % BuffSize;
-    for( np = self->ptrBuffer[ttype]; np != nil; np = [np getfNext] ) {
-        if ( [np.index integerValue] == ttype ) {
-            return( np );        /*   found it       */
-        }
-    }
-    return( nil );              /*   not found      */
-}
-
-- (ANTLRLinkBase *)getName:(NSString *)name
-{
-    return [self lookup:name Scope:0]; /*  nil if not found      */    
-}
-
-- (void)putNode:(NSString *)name TokenType:(NSInteger)ttype
-{
-    ANTLRMapElement *np;
-    
-    // install symbol in ptrBuffer
-    np = [ANTLRMapElement newANTLRMapElementWithName:[NSString stringWithString:name] Type:ttype];
-    //        np->fType = toknams[i].toknum;
-    [self install:np Scope:0];
-}
-
-- (NSInteger)getMode
-{
-    return mode;
-}
-
-- (void)setMode:(NSInteger)aMode
-{
-    mode = aMode;
-}
-
-- (void) addObject:(id)aRule
-{
-    NSInteger idx;
-
-    idx = [self count];
-    if ( idx >= BuffSize ) {
-        idx %= BuffSize;
-    }
-    ptrBuffer[idx] = aRule;
-}
-
-/* this may have to handle linking into the chain
- */
-- (void) insertObject:(id)aRule atIndex:(NSInteger)idx
-{
-    if ( idx >= BuffSize ) {
-        idx %= BuffSize;
-    }
-    if (aRule != ptrBuffer[idx]) {
-        if (ptrBuffer[idx] != nil) [ptrBuffer[idx] release];
-        [aRule retain];
-    }
-    ptrBuffer[idx] = aRule;
-}
-
-- (id)objectAtIndex:(NSInteger)idx
-{
-    if ( idx >= BuffSize ) {
-        idx %= BuffSize;
-    }
-    return ptrBuffer[idx];
-}
-
-/* this will never link into the chain
- */
-- (void) setObject:(id)aRule atIndex:(NSInteger)idx
-{
-    if ( idx >= BuffSize ) {
-        idx %= BuffSize;
-    }
-    if (aRule != ptrBuffer[idx]) {
-        if (ptrBuffer[idx] != nil) [ptrBuffer[idx] release];
-        [aRule retain];
-    }
-    ptrBuffer[idx] = aRule;
-}
-
-- (void)putName:(NSString *)name Node:(id)aNode
-{
-    ANTLRMapElement *np;
-    
-    np = [self lookup:name Scope:0 ];
-    if ( np == nil ) {
-        np = [ANTLRMapElement newANTLRMapElementWithName:name Node:aNode];
-        if (ptrBuffer[LastHash] != nil)
-            [ptrBuffer[LastHash] release];
-        [np retain];
-        np.fNext = ptrBuffer[ LastHash ];
-        ptrBuffer[ LastHash ] = np;
-    }
-    return;    
-}
-
-- (NSEnumerator *)objectEnumerator
-{
-    NSEnumerator *anEnumerator;
-
-    itIndex = 0;
-    return anEnumerator;
-}
-
-- (BOOL)hasNext
-{
-    if (self && [self count] < BuffSize-1) {
-        return YES;
-    }
-    return NO;
-}
-
-- (ANTLRMapElement *)nextObject
-{
-    if (self && itIndex < BuffSize-1) {
-        return ptrBuffer[itIndex];
-    }
-    return nil;
-}
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRHashRule.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRHashRule.h
deleted file mode 100644
index f1558e8..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRHashRule.h
+++ /dev/null
@@ -1,72 +0,0 @@
-//
-//  ANTLRHashRule.h
-//  ANTLR
-//
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRuleMemo.h"
-#import "ANTLRPtrBuffer.h"
-
-#define GLOBAL_SCOPE       0
-#define LOCAL_SCOPE        1
-#define HASHSIZE         101
-#define HBUFSIZE      0x2000
-
-@interface ANTLRHashRule : ANTLRPtrBuffer {
-	//	ANTLRHashRule *fNext;
-    //    TStringPool *fPool;
-    NSInteger LastHash;
-    NSInteger mode;
-}
-
-//@property (copy) ANTLRHashRule *fNext;
-@property (getter=getLastHash, setter=setLastHash:) NSInteger LastHash;
-
-// Contruction/Destruction
-+ (id)newANTLRHashRule;
-+ (id)newANTLRHashRuleWithLen:(NSInteger)aBuffSize;
-- (id)init;
-- (id)initWithLen:(NSInteger)aBuffSize;
-- (void)dealloc;
-
-- (NSInteger)count;
-- (NSInteger)length;
-- (NSInteger)size;
-
-// Instance Methods
-- (void)deleteANTLRHashRule:(ANTLRRuleMemo *)np;
-- (void)delete_chain:(ANTLRRuleMemo *)np;
-- (ANTLRRuleMemo **)getPtrBuffer;
-- (void)setPtrBuffer:(ANTLRRuleMemo **)np;
-- (NSNumber *)getRuleMemoStopIndex:(NSInteger)aStartIndex;
-- (void)putRuleMemoAtStartIndex:(NSInteger)aStartIndex StopIndex:(NSInteger)aStopIndex;
-- (NSInteger)getMode;
-- (void)setMode:(NSInteger)aMode;
-- (void) insertObject:(ANTLRRuleMemo *)aRule atIndex:(NSInteger)Index;
-- (ANTLRRuleMemo *) objectAtIndex:(NSInteger)Index;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRHashRule.m b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRHashRule.m
deleted file mode 100644
index 93ce3a1..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRHashRule.m
+++ /dev/null
@@ -1,281 +0,0 @@
-//
-//  ANTLRHashRule.m
-//  ANTLR
-//
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#define SUCCESS (0)
-#define FAILURE (-1)
-#define ANTLR_MEMO_RULE_UNKNOWN -1
-
-#import "ANTLRHashRule.h"
-
-/*
- * Start of ANTLRHashRule
- */
-@implementation ANTLRHashRule
-
-@synthesize LastHash;
-
-+(id)newANTLRHashRule
-{
-    ANTLRHashRule *aNewANTLRHashRule;
-    
-    aNewANTLRHashRule = [[ANTLRHashRule alloc] init];
-	return( aNewANTLRHashRule );
-}
-
-+(id)newANTLRHashRuleWithLen:(NSInteger)aBuffSize
-{
-    ANTLRHashRule *aNewANTLRHashRule;
-    
-    aNewANTLRHashRule = [[ANTLRHashRule alloc] initWithLen:aBuffSize];
-	return( aNewANTLRHashRule );
-}
-
--(id)init
-{
-	if ((self = [super initWithLen:HASHSIZE]) != nil) {
-		fNext = nil;
-	}
-    return( self );
-}
-
--(id)initWithLen:(NSInteger)aBuffSize
-{
-	if ((self = [super initWithLen:aBuffSize]) != nil) {
-		fNext = nil;
-        mode = 0;
-	}
-    return( self );
-}
-
--(void)dealloc
-{
-    ANTLRRuleMemo *tmp, *rtmp;
-    int Index;
-	
-    if ( self.fNext != nil ) {
-        for( Index = 0; Index < BuffSize; Index++ ) {
-            tmp = ptrBuffer[Index];
-            while ( tmp && tmp != ptrBuffer[Index] ) {
-                rtmp = tmp;
-                // tmp = [tmp getfNext];
-                tmp = (ANTLRRuleMemo *)tmp.fNext;
-                [rtmp dealloc];
-            }
-        }
-    }
-	[super dealloc];
-}
-
-- (NSInteger)count
-{
-    id anElement;
-    NSInteger aCnt = 0;
-    
-    for (int i = 0; i < BuffSize; i++) {
-        anElement = ptrBuffer[i];
-        if ( anElement != nil ) {
-            aCnt++;
-        }
-    }
-    return aCnt;
-}
-                          
-- (NSInteger) length
-{
-    return BuffSize;
-}
-
-- (NSInteger) size
-{
-    id anElement;
-    NSInteger aSize = 0;
-    
-    for (int i = 0; i < BuffSize; i++) {
-        if ((anElement = ptrBuffer[i]) != nil) {
-            aSize += sizeof(id);
-        }
-    }
-    return aSize;
-}
-                                  
-                                  
--(void)deleteANTLRHashRule:(ANTLRRuleMemo *)np
-{
-    ANTLRRuleMemo *tmp, *rtmp;
-    int Index;
-    
-    if ( self.fNext != nil ) {
-        for( Index = 0; Index < BuffSize; Index++ ) {
-            tmp = ptrBuffer[Index];
-            while ( tmp && tmp != ptrBuffer[Index ] ) {
-                rtmp = tmp;
-                tmp = tmp.fNext;
-                [rtmp dealloc];
-            }
-        }
-    }
-}
-
--(void)delete_chain:(ANTLRRuleMemo *)np
-{
-    if ( np.fNext != nil )
-		[self delete_chain:np.fNext];
-	[np dealloc];
-}
-
--(ANTLRRuleMemo **)getPtrBuffer
-{
-	return( ptrBuffer );
-}
-
--(void)setPtrBuffer:(ANTLRRuleMemo **)np
-{
-	ptrBuffer = np;
-}
-
-- (NSNumber *)getRuleMemoStopIndex:(NSInteger)aStartIndex
-{
-    ANTLRRuleMemo *aRule;
-    NSNumber *stopIndex;
-    NSInteger anIndex;
-    
-    anIndex = ( aStartIndex >= BuffSize ) ? aStartIndex %= BuffSize : aStartIndex;
-    if ((aRule = ptrBuffer[anIndex]) == nil) {
-        return nil;
-    }
-    stopIndex = [aRule getStopIndex:aStartIndex];
-    return stopIndex;
-}
-
-- (void)putRuleMemo:(ANTLRRuleMemo *)aRule AtStartIndex:(NSInteger)aStartIndex
-{
-    NSInteger anIndex;
-    
-    anIndex = (aStartIndex >= BuffSize) ? aStartIndex %= BuffSize : aStartIndex;
-    if ( ptrBuffer[anIndex] == nil ) {
-        ptrBuffer[anIndex] = aRule;
-        [aRule retain];
-    }
-    else {
-        do {
-            if ( [aRule.startIndex integerValue] == aStartIndex ) {
-                [aRule setStartIndex:aRule.stopIndex];
-                return;
-            }
-            aRule = aRule.fNext;
-        } while ( aRule != nil );
-    }
-}
-
-- (void)putRuleMemoAtStartIndex:(NSInteger)aStartIndex StopIndex:(NSInteger)aStopIndex
-{
-    ANTLRRuleMemo *aRule, *newRule;
-    NSInteger anIndex;
-    NSInteger aMatchIndex;
-
-    anIndex = (aStartIndex >= BuffSize) ? aStartIndex %= BuffSize : aStartIndex;
-    if ((aRule = ptrBuffer[anIndex]) == nil ) {
-        aRule = [ANTLRRuleMemo newANTLRRuleMemoWithStartIndex:[NSNumber numberWithInteger:aStartIndex]
-                                                    StopIndex:[NSNumber numberWithInteger:aStopIndex]];
-        [aRule retain];
-        ptrBuffer[anIndex] = aRule;
-    }
-    else {
-        aMatchIndex = [aRule.startIndex integerValue];
-        if ( aStartIndex > aMatchIndex ) {
-            if ( aRule != ptrBuffer[anIndex] ) {
-                [aRule retain];
-            }
-            aRule.fNext = ptrBuffer[anIndex];
-            ptrBuffer[anIndex] = aRule;
-            return;
-        }
-        while (aRule.fNext != nil) {
-            aMatchIndex = [((ANTLRRuleMemo *)aRule.fNext).startIndex integerValue];
-            if ( aStartIndex > aMatchIndex ) {
-                newRule = [ANTLRRuleMemo newANTLRRuleMemoWithStartIndex:[NSNumber numberWithInteger:aStartIndex]
-                                                              StopIndex:[NSNumber numberWithInteger:aStopIndex]];
-                [newRule retain];
-                newRule.fNext = aRule.fNext;
-                aRule.fNext = newRule;
-                return;
-            }
-            if ( aMatchIndex == aStartIndex ) {
-                [aRule setStartIndex:aRule.stopIndex];
-                return;
-            }
-            aRule = aRule.fNext;
-        }
-    }
-}
-
-- (NSInteger)getLastHash
-{
-    return LastHash;
-}
-
-- (void)setLastHash:(NSInteger)aHash
-{
-    LastHash = aHash;
-}
-
-- (NSInteger)getMode
-{
-    return mode;
-}
-
-- (void)setMode:(NSInteger)aMode
-{
-    mode = aMode;
-}
-
-- (void) insertObject:(ANTLRRuleMemo *)aRule atIndex:(NSInteger)anIndex
-{
-    NSInteger Index;
-    
-    Index = ( anIndex >= BuffSize ) ? anIndex %= BuffSize : anIndex;
-    if (aRule != ptrBuffer[Index]) {
-        if (ptrBuffer[Index] != nil) {
-            [ptrBuffer[Index] release];
-        }
-        [aRule retain];
-    }
-    ptrBuffer[Index] = aRule;
-}
-
-- (ANTLRRuleMemo *)objectAtIndex:(NSInteger)anIndex
-{
-    NSInteger anIdx;
-
-    anIdx = ( anIndex >= BuffSize ) ? anIndex %= BuffSize : anIndex;
-    return ptrBuffer[anIdx];
-}
-
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRIntArray.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRIntArray.h
deleted file mode 100644
index 5269b23..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRIntArray.h
+++ /dev/null
@@ -1,60 +0,0 @@
-//
-//  ANTLRIntArray.h
-//  ANTLR
-//
-// Copyright (c) 2010 Ian Michell 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRPtrBuffer.h"
-
-#define ANTLR_INT_ARRAY_INITIAL_SIZE 10
-
-@interface ANTLRIntArray : ANTLRPtrBuffer 
-{
-}
-
-+ (ANTLRIntArray *)newANTLRIntArray;
-+ (ANTLRIntArray *)newANTLRIntArrayWithLen:(NSInteger)aLen;
-
-- (id) init;
-- (id) initWithLen:(NSInteger)aLen;
-
-- (void) dealloc;
-
-- (id) copyWithZone:(NSZone *)aZone;
-
-- (void) addInteger:(NSInteger) v;
-- (void) push:(NSInteger) v;
-- (NSInteger) pop;
-- (NSInteger) integerAtIndex:(NSInteger) i;
-- (void) insertInteger:(NSInteger)anInteger AtIndex:(NSInteger) idx;
-- (NSInteger) size;
-- (void) reset;
-
-- (NSInteger) count;
-- (NSInteger) size;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRIntStream.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRIntStream.h
deleted file mode 100755
index 3790cd9..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRIntStream.h
+++ /dev/null
@@ -1,93 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-@protocol ANTLRIntStream < NSObject, NSCopying >
-
-- (void) consume;
-
-// Get unichar at current input pointer + i ahead where i=1 is next character as int for including ANTLRCharStreamEOF (-1) in the data range
-- (NSInteger) LA:(NSInteger) i;
-
-// Tell the stream to start buffering if it hasn't already.  Return
-// current input position, index(), or some other marker so that
-// when passed to rewind() you get back to the same spot.
-// rewind(mark()) should not affect the input cursor.
-// TODO: problem in that lexer stream returns not index but some marker 
-
-- (NSInteger) mark;
-
-// Return the current input symbol index 0..n where n indicates the
-// last symbol has been read.
-
-- (NSInteger) getIndex;
-
-// Reset the stream so that next call to index would return marker.
-// The marker will usually be -index but it doesn't have to be.  It's
-// just a marker to indicate what state the stream was in.  This is
-// essentially calling -release: and -seek:.  If there are markers
-// created after this marker argument, this routine must unroll them
-// like a stack.  Assume the state the stream was in when this marker
-// was created.
-
-- (void) rewind;
-- (void) rewind:(NSInteger) marker;
-
-// You may want to commit to a backtrack but don't want to force the
-// stream to keep bookkeeping objects around for a marker that is
-// no longer necessary.  This will have the same behavior as
-// rewind() except it releases resources without the backward seek.
-
-- (void) release:(NSInteger) marker;
-
-// Set the input cursor to the position indicated by index.  This is
-// normally used to seek ahead in the input stream.  No buffering is
-// required to do this unless you know your stream will use seek to
-// move backwards such as when backtracking.
-// This is different from rewind in its multi-directional
-// requirement and in that its argument is strictly an input cursor (index).
-//
-// For char streams, seeking forward must update the stream state such
-// as line number.  For seeking backwards, you will be presumably
-// backtracking using the mark/rewind mechanism that restores state and
-// so this method does not need to update state when seeking backwards.
-//
-// Currently, this method is only used for efficient backtracking, but
-// in the future it may be used for incremental parsing.
-
-- (void) seek:(NSInteger) index;
-
-/** Only makes sense for streams that buffer everything up probably, but
- *  might be useful to display the entire stream or for testing.  This
- *  value includes a single EOF.
- */
-- (NSUInteger) size;
-/** Where are you getting symbols from?  Normally, implementations will
- *  pass the buck all the way to the lexer who can ask its input stream
- *  for the file name or whatever.
- */
-- (NSString *)getSourceName;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRLexer.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRLexer.h
deleted file mode 100755
index 5cfb36f..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRLexer.h
+++ /dev/null
@@ -1,90 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTokenSource.h"
-#import "ANTLRBaseRecognizer.h"
-#import "ANTLRRecognizerSharedState.h"
-#import "ANTLRCharStream.h"
-#import "ANTLRToken.h"
-#import "ANTLRCommonToken.h"
-#import "ANTLRRecognitionException.h"
-#import "ANTLRMismatchedTokenException.h"
-#import "ANTLRMismatchedRangeException.h"
-
-@interface ANTLRLexer : ANTLRBaseRecognizer <ANTLRTokenSource> {
-	id<ANTLRCharStream> input;      ///< The character stream we pull tokens out of.
-	NSUInteger ruleNestingLevel;
-}
-
-@property (retain, getter=getInput, setter=setInput:) id<ANTLRCharStream> input;
-@property (getter=getRuleNestingLevel, setter=setRuleNestingLevel) NSUInteger ruleNestingLevel;
-
-#pragma mark Initializer
-- (id) initWithCharStream:(id<ANTLRCharStream>) anInput;
-- (id) initWithCharStream:(id<ANTLRCharStream>)anInput State:(ANTLRRecognizerSharedState *)state;
-
-- (id) copyWithZone:(NSZone *)zone;
-
-- (void) reset;
-
-// - (ANTLRRecognizerSharedState *) state;
-
-#pragma mark Tokens
-- (id<ANTLRToken>)getToken;
-- (void) setToken: (id<ANTLRToken>) aToken;
-- (id<ANTLRToken>) nextToken;
-- (void) mTokens;		// abstract, defined in generated sources
-- (void) skip;
-- (id<ANTLRCharStream>) getInput;
-- (void) setInput:(id<ANTLRCharStream>)aCharStream;
-
-- (void) emit;
-- (void) emit:(id<ANTLRToken>)aToken;
-
-#pragma mark Matching
-- (void) matchString:(NSString *)aString;
-- (void) matchAny;
-- (void) matchChar:(unichar) aChar;
-- (void) matchRangeFromChar:(unichar)fromChar to:(unichar)toChar;
-
-#pragma mark Informational
-- (NSUInteger) getLine;
-- (NSUInteger) getCharPositionInLine;
-- (NSInteger) getIndex;
-- (NSString *) getText;
-- (void) setText:(NSString *) theText;
-
-// error handling
-- (void) reportError:(ANTLRRecognitionException *)e;
-- (NSString *)getErrorMessage:(ANTLRRecognitionException *)e TokenNames:(NSMutableArray *)tokenNames;
-- (NSString *)getCharErrorDisplay:(NSInteger)c;
-- (void) recover:(ANTLRRecognitionException *)e;
-- (void)traceIn:(NSString *)ruleName Index:(NSInteger)ruleIndex;
-- (void)traceOut:(NSString *)ruleName Index:(NSInteger)ruleIndex;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRLexerRuleReturnScope.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRLexerRuleReturnScope.h
deleted file mode 100755
index 18ae374..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRLexerRuleReturnScope.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-
-@interface ANTLRLexerRuleReturnScope : NSObject {
-	int startToken;
-	int stopToken;
-}
-
-- (NSInteger) getStart;
-- (void) setStart: (NSInteger) aStart;
-
-- (NSInteger) getStop;
-- (void) setStop: (NSInteger) aStop;
-
-
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRLinkBase.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRLinkBase.h
deleted file mode 100644
index 21019e6..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRLinkBase.h
+++ /dev/null
@@ -1,74 +0,0 @@
-//
-//  ANTLRLinkBase.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/14/10.
-//  [The "BSD licence"]
-//  Copyright (c) 2010 Alan Condit
-//  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.
-
-#import <Cocoa/Cocoa.h>
-
-@protocol ANTLRLinkList <NSObject>
-
-+ (id<ANTLRLinkList>)newANTLRLinkBase;
-+ (id<ANTLRLinkList>)newANTLRLinkBase:(id<ANTLRLinkList>)np Prev:(id<ANTLRLinkList>)pp;
-
-- (void) dealloc;
-
-- (id<ANTLRLinkList>) append:(id<ANTLRLinkList>)node;
-- (id<ANTLRLinkList>) insert:(id<ANTLRLinkList>)node;
-
-- (id<ANTLRLinkList>) getfNext;
-- (void) setFNext:(id<ANTLRLinkList>)np;
-- (id<ANTLRLinkList>)getfPrev;
-- (void) setFPrev:(id<ANTLRLinkList>)pp;
-
-@end
-
-@interface ANTLRLinkBase : NSObject <ANTLRLinkList> {
-	id<ANTLRLinkList> fPrev;
-	id<ANTLRLinkList> fNext;
-}
-
-@property (retain, getter=getfPrev, setter=setFPrev:) id<ANTLRLinkList> fPrev;
-@property (retain, getter=getfNext, setter=setFNext:) id<ANTLRLinkList> fNext;
-
-+ (id<ANTLRLinkList>)newANTLRLinkBase;
-+ (id<ANTLRLinkList>)newANTLRLinkBase:(id<ANTLRLinkList>)np Prev:(id<ANTLRLinkList>)pp;
-- (id<ANTLRLinkList>)init;
-- (id<ANTLRLinkList>)initWithPtr:(id)np Prev:(id)pp;
-- (void)dealloc;
-
-- (id) copyWithZone:(NSZone *)aZone;
-
-- (id<ANTLRLinkList>)append:(id<ANTLRLinkList>)node;
-- (id<ANTLRLinkList>)insert:(id<ANTLRLinkList>)node;
-
-- (id<ANTLRLinkList>)getfNext;
-- (void)setFNext:(id<ANTLRLinkList>) np;
-- (id<ANTLRLinkList>)getfPrev;
-- (void)setFPrev:(id<ANTLRLinkList>) pp;
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRLookaheadStream.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRLookaheadStream.h
deleted file mode 100644
index ad48ff5..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRLookaheadStream.h
+++ /dev/null
@@ -1,73 +0,0 @@
-//
-//  ANTLRLookaheadStream.h
-//  ANTLR
-//
-//  Created by Ian Michell on 26/04/2010.
-//  [The "BSD licence"]
-//  Copyright (c) 2010 Ian Michell 2010 Alan Condit
-//  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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRFastQueue.h"
-
-#define UNITIALIZED_EOF_ELEMENT_INDEX NSIntegerMax
-
-@interface ANTLRLookaheadStream : ANTLRFastQueue
-{
-	id eof;
-	NSInteger eofElementIndex;
-	NSInteger lastMarker;
-	NSInteger markDepth;
-}
-
-@property (readwrite, retain, getter=getEof, setter=setEof) id eof;
-@property (assign, getter=getEofElementIndex, setter=setEofElementIndex) NSInteger eofElementIndex;
-@property (assign, getter=getLastMarker, setter=setLastMarker) NSInteger lastMarker;
-@property (assign, getter=getMarkDepth, setter=setMarkDepth) NSInteger markDepth;
-
-- (id) initWithEOF:(id) o;
-- (id) nextElement;
-- (void) consume;
-- (void) sync:(NSInteger) need;
-- (void) fill:(NSInteger) n;
-- (id) LT:(NSInteger) i;
-- (id) LB:(NSInteger) i;
-- (id) currentSymbol;
-- (NSInteger) getIndex;
-- (NSInteger) mark;
-- (void) release:(NSInteger) marker;
-- (void) rewind:(NSInteger) marker;
-- (void) rewind;
-- (void) seek:(NSInteger) i;
-- (id) getEof;
-- (void) setEof:(id) anID;
-- (NSInteger) getEofElementIndex;
-- (void) setEofElementIndex:(NSInteger) anInt;
-- (NSInteger) getLastMarker;
-- (void) setLastMarker:(NSInteger) anInt;
-- (NSInteger) getMarkDepth;
-- (void) setMarkDepth:(NSInteger) anInt;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRMap.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRMap.h
deleted file mode 100644
index 80ad486..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRMap.h
+++ /dev/null
@@ -1,82 +0,0 @@
-//
-//  ANTLRMap.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/9/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRPtrBuffer.h"
-#import "ANTLRMapElement.h"
-
-//#define GLOBAL_SCOPE      0
-//#define LOCAL_SCOPE       1
-#define HASHSIZE            101
-#define HBUFSIZE            0x2000
-
-@interface ANTLRMap : ANTLRPtrBuffer {
-	//ANTLRMap *fNext; // found in superclass
-    // TStringPool *fPool;
-    NSInteger lastHash;
-}
-
-//@property (copy) ANTLRMap *fNext;
-@property (getter=getLastHash, setter=setLastHash:) NSInteger lastHash;
-
-// Contruction/Destruction
-+ (id)newANTLRMap;
-+ (id)newANTLRMapWithLen:(NSInteger)aHashSize;
-
-- (id)init;
-- (id)initWithLen:(NSInteger)cnt;
-- (void)dealloc;
-// Instance Methods
-- (NSInteger)count;
-- (NSInteger)length;
-- (NSInteger)size;
-/* clear -- reinitialize the maplist array */
-- (void) clear;
-/* form hash value for string s */
--(NSInteger)hash:(NSString *)s;
-/*   look for s in ptrBuffer  */
--(id)lookup:(NSString *)s;
-/* look for s in ptrBuffer  */
--(id)install:(ANTLRMapElement *)sym;
-/*
- * delete entry from list
- */
-- (void)deleteANTLRMap:(ANTLRMapElement *)np;
-- (NSInteger)RemoveSym:(NSString *)s;
-- (void)delete_chain:(ANTLRMapElement *)np;
-- (ANTLRMapElement *)getTType:(NSString *)name;
-- (ANTLRMapElement *)getName:(NSInteger)ttype;
-- (NSInteger)getNode:(ANTLRMapElement *)aNode;
-- (void)putNode:(NSInteger)aTType Node:(id)aNode;
-- (void)putName:(NSString *)name TType:(NSInteger)ttype;
-- (void)putName:(NSString *)name Node:(id)aNode;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRMapElement.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRMapElement.h
deleted file mode 100644
index e20d01c..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRMapElement.h
+++ /dev/null
@@ -1,65 +0,0 @@
-//
-//  ANTLRMapElement.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/8/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRBaseMapElement.h"
-
-@interface ANTLRMapElement : ANTLRBaseMapElement {
-    NSString *name;
-    id        node;
-}
-@property (retain, getter=getName, setter=setName:) NSString *name;
-@property (retain, getter=getNode, setter=setNode:) id node;
-
-+ (id) newANTLRMapElement;
-+ (id) newANTLRMapElementWithName:(NSString *)aName Type:(NSInteger)aTType;
-+ (id) newANTLRMapElementWithNode:(NSInteger)aTType Node:(id)aNode;
-+ (id) newANTLRMapElementWithName:(NSString *)aName Node:(id)aNode;
-+ (id) newANTLRMapElementWithObj1:(id)anObj1 Obj2:(id)anObj2;
-- (id) init;
-- (id) initWithName:(NSString *)aName Type:(NSInteger)aTType;
-- (id) initWithNode:(NSInteger)aTType Node:(id)aNode;
-- (id) initWithName:(NSString *)aName Node:(id)aNode;
-- (id) initWithObj1:(id)anObj1 Obj2:(id)anObj2;
-
-- (id) copyWithZone:(NSZone *)aZone;
-
-- (NSInteger) count;
-- (NSInteger) size;
-- (NSString *)getName;
-- (void)setName:(NSString *)aName;
-- (id)getNode;
-- (void)setNode:(id)aNode;
-- (void)putNode:(id)aNode;
-- (void)putNode:(id)aNode With:(NSInteger)uniqueID;
-//- (void)setObject:(id)aNode atIndex:anIndex;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRMismatchedNotSetException.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRMismatchedNotSetException.h
deleted file mode 100644
index 57391d5..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRMismatchedNotSetException.h
+++ /dev/null
@@ -1,51 +0,0 @@
-//
-//  ANTLRMismatchedNotSetException.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/13/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRecognitionException.h"
-#import "ANTLRBitSet.h"
-
-@interface ANTLRMismatchedNotSetException : ANTLRRecognitionException
-{
-    ANTLRBitSet *expecting;
-}
-@property (retain, getter=getExpecting, setter=setExpecting) ANTLRBitSet *expecting;
-
-- (ANTLRMismatchedNotSetException *)newANTLRMismatchedNotSetException;
-- (ANTLRMismatchedNotSetException *)newANTLRMismatchedNotSetException:(id<ANTLRIntStream>)anInput
-                                                               Follow:(ANTLRBitSet *)expecting;
-
-- (id) init;
-- (id) initWithStream:(id<ANTLRIntStream>)anInput Follow:(ANTLRBitSet *)expecting;
-
-- (NSString *)toString;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRMismatchedRangeException.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRMismatchedRangeException.h
deleted file mode 100755
index abda3bb..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRMismatchedRangeException.h
+++ /dev/null
@@ -1,40 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRecognitionException.h"
-
-@protocol ANTLRIntStream;
-
-
-@interface ANTLRMismatchedRangeException : ANTLRRecognitionException {
-	NSRange range;
-}
-
-+ (id) exceptionWithRange:(NSRange) aRange stream:(id<ANTLRIntStream>) theInput;
-- (id) initWithRange:(NSRange) aRange stream:(id<ANTLRIntStream>) theInput;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRMismatchedSetException.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRMismatchedSetException.h
deleted file mode 100755
index 3bd45fc..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRMismatchedSetException.h
+++ /dev/null
@@ -1,44 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRecognitionException.h"
-
-@interface ANTLRMismatchedSetException : ANTLRRecognitionException {
-	NSSet *expecting;
-}
-
-@property (retain, getter=getExpecting, setter=setExpecting:) NSSet *expecting;
-
-+ (id) exceptionWithSet:(NSSet *) theExpectedSet stream:(id<ANTLRIntStream>) theStream;
-- (id) initWithSet:(NSSet *) theExpectedSet stream:(id<ANTLRIntStream>) theStream;
-
-- (NSSet *) getExpecting;
-- (void) setExpecting: (NSSet *) anExpectedSet;
-
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRMismatchedTokenException.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRMismatchedTokenException.h
deleted file mode 100755
index 5e1d77d..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRMismatchedTokenException.h
+++ /dev/null
@@ -1,58 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRecognitionException.h"
-#import "ANTLRBitSet.h"
-
-@protocol ANTLRIntStream;
-
-@interface ANTLRMismatchedTokenException : ANTLRRecognitionException {
-	NSInteger expecting;
-	unichar expectingChar;
-	BOOL isTokenType;
-}
-
-@property (assign, getter=getExpecting, setter=setExpecting:) NSInteger expecting;
-@property (assign, getter=getExpectingChar, setter=setExpectingChar:) unichar expectingChar;
-@property (assign, getter=getIsTokenType, setter=setIsTokenType:) BOOL isTokenType;
-
-+ (id) newANTLRMismatchedTokenException:(NSInteger)expectedTokenType Stream:(id<ANTLRIntStream>)anInput;
-+ (id) newANTLRMismatchedTokenExceptionMissing:(NSInteger)expectedTokenType
-                                        Stream:(id<ANTLRIntStream>)anInput
-                                         Token:(id<ANTLRToken>)inserted;
-+ (id) newANTLRMismatchedTokenExceptionChar:(unichar)expectedCharacter Stream:(id<ANTLRIntStream>)anInput;
-+ (id) newANTLRMismatchedTokenExceptionStream:(id<ANTLRIntStream>)anInput
-                                    Exception:(NSException *)e
-                                       Follow:(ANTLRBitSet *)follow;
-- (id) initWithTokenType:(NSInteger)expectedTokenType Stream:(id<ANTLRIntStream>)anInput;
--(id) initWithTokenType:(NSInteger)expectedTokenType
-                 Stream:(id<ANTLRIntStream>)anInput
-                  Token:(id<ANTLRToken>)inserted;
-- (id) initWithCharacter:(unichar)expectedCharacter Stream:(id<ANTLRIntStream>)anInput;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRMismatchedTreeNodeException.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRMismatchedTreeNodeException.h
deleted file mode 100755
index b61ab51..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRMismatchedTreeNodeException.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRecognitionException.h"
-
-@protocol ANTLRIntStream;
-
-@interface ANTLRMismatchedTreeNodeException : ANTLRRecognitionException {
-	NSInteger expecting;
-}
-
-@property (getter=getExpecting, setter=setExpecting) NSInteger expecting;
-
-+ (id) newANTLRMismatchedTreeNodeException:(NSInteger)expectedTokenType Stream:(id<ANTLRIntStream>)anInput;
-- (id) initWithTokenType:(NSInteger) expectedTokenType Stream:(id<ANTLRIntStream>)anInput;
-
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRMissingTokenException.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRMissingTokenException.h
deleted file mode 100644
index 1398e25..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRMissingTokenException.h
+++ /dev/null
@@ -1,51 +0,0 @@
-//
-//  ANTLRMissingTokenException.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/8/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRMismatchedTokenException.h"
-#import "ANTLRToken.h"
-
-@interface ANTLRMissingTokenException : ANTLRMismatchedTokenException {
-    id<ANTLRToken> inserted;
-}
-/** Used for remote debugger deserialization */
-+ (id) newANTLRMissingTokenException;
-+ (id) newANTLRMissingTokenException:(NSInteger)expected
-                              Stream:(id<ANTLRIntStream>)anInput
-                                With:(id<ANTLRToken>)insertedToken;
-- (id) init;
-- (id) init:(NSInteger)expected Stream:(id<ANTLRIntStream>)anInput With:(id<ANTLRToken>)insertedToken;
-
-- (NSInteger) getMissingType;
-
-- (NSString *)toString;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRNoViableAltException.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRNoViableAltException.h
deleted file mode 100755
index b71baff..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRNoViableAltException.h
+++ /dev/null
@@ -1,43 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRecognitionException.h"
-#import "ANTLRIntStream.h"
-
-@interface ANTLRNoViableAltException : ANTLRRecognitionException {
-	int decisionNumber;
-	int stateNumber;
-}
-
-+ (ANTLRNoViableAltException *) newANTLRNoViableAltException:(NSInteger)theDecisionNumber state:(NSInteger)theStateNumber stream:(id<ANTLRIntStream>)theStream;
-- (ANTLRNoViableAltException *) initWithDecision:(NSInteger)theDecisionNumber state:(NSInteger)theStateNumber stream:(id<ANTLRIntStream>)theStream;
-
-- (void)setDecisionNumber:(NSInteger)decisionNumber;
-- (void)setStateNumber:(NSInteger)stateNumber;
-
-
-@end
\ No newline at end of file
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRNodeMapElement.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRNodeMapElement.h
deleted file mode 100644
index 1c0c916..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRNodeMapElement.h
+++ /dev/null
@@ -1,56 +0,0 @@
-//
-//  ANTLRRuleMapElement.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/16/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRBaseMapElement.h"
-#import "ANTLRTree.h"
-
-@interface ANTLRNodeMapElement : ANTLRBaseMapElement {
-    id<ANTLRTree> node;
-}
-
-@property (retain, getter=getNode, setter=setNode:) id node;
-
-+ (void)initialize;
-
-+ (id) newANTLRNodeMapElement;
-+ (id) newANTLRNodeMapElementWithIndex:(id)anIndex Node:(id<ANTLRTree>)aNode;
-- (id) init;
-- (id) initWithAnIndex:(id)anIndex Node:(id)aNode;
-
-- (id) copyWithZone:(NSZone *)aZone;
-
-- (id<ANTLRTree>)getNode;
-- (void)setNode:(id<ANTLRTree>)aNode;
-
-- (NSInteger)size;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRParseTree.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRParseTree.h
deleted file mode 100644
index 92554e3..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRParseTree.h
+++ /dev/null
@@ -1,60 +0,0 @@
-//
-//  ANTLRParseTree.h
-//  ANTLR
-//
-//  Created by Alan Condit on 7/12/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRBaseTree.h"
-#import "ANTLRCommonToken.h"
-
-@interface ANTLRParseTree : ANTLRBaseTree {
-	id<ANTLRToken> payload;
-	NSMutableArray *hiddenTokens;
-}
-/** A record of the rules used to match a token sequence.  The tokens
- *  end up as the leaves of this tree and rule nodes are the interior nodes.
- *  This really adds no functionality, it is just an alias for CommonTree
- *  that is more meaningful (specific) and holds a String to display for a node.
- */
-+ (ANTLRParseTree *)newANTLRParseTree:(id<ANTLRToken>)label;
-- (id)initWithLabel:(id<ANTLRToken>)label;
-
-- (id<ANTLRTree>)dupNode;
-- (NSInteger)getType;
-- (NSString *)getText;
-- (NSInteger)getTokenStartIndex;
-- (void)setTokenStartIndex:(NSInteger)index;
-- (NSInteger)getTokenStopIndex;
-- (void)setTokenStopIndex:(NSInteger)index;
-- (NSString *)toString;
-- (NSString *)toStringWithHiddenTokens;
-- (NSString *)toInputString;
-- (void)_toStringLeaves:(NSMutableString *)buf;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRParser.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRParser.h
deleted file mode 100755
index 5ddaf50..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRParser.h
+++ /dev/null
@@ -1,59 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRBaseRecognizer.h"
-#import "ANTLRCommonToken.h"
-#import "ANTLRTokenStream.h"
-
-@interface ANTLRParser : ANTLRBaseRecognizer {
-	id<ANTLRTokenStream> input;
-}
-+ (ANTLRParser *)newANTLRParser:(id<ANTLRTokenStream>)anInput;
-+ (ANTLRParser *)newANTLRParser:(id<ANTLRTokenStream>)anInput State:(ANTLRRecognizerSharedState *)aState;
-
-- (id) initWithTokenStream:(id<ANTLRTokenStream>)theStream;
-- (id) initWithTokenStream:(id<ANTLRTokenStream>)theStream State:(ANTLRRecognizerSharedState *)aState;
-
-- (id<ANTLRTokenStream>) getInput;
-- (void) setInput: (id<ANTLRTokenStream>) anInput;
-
-- (void) reset;
-
-- (id) getCurrentInputSymbol:(id<ANTLRTokenStream>)anInput;
-- (ANTLRCommonToken *)getMissingSymbol:(id<ANTLRTokenStream>)input
-                             Exception:(ANTLRRecognitionException *)e
-                                 TType:(NSInteger)expectedTokenType
-                                BitSet:(ANTLRBitSet *)follow;
-- (void) setTokenStream:(id<ANTLRTokenStream>)anInput;
-- (id<ANTLRTokenStream>)getTokenStream;
-- (NSString *)getSourceName;
-
-- (void) traceIn:(NSString *)ruleName Index:(int)ruleIndex;
-- (void) traceOut:(NSString *)ruleName Index:(NSInteger) ruleIndex;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRParserRuleReturnScope.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRParserRuleReturnScope.h
deleted file mode 100755
index aef3dd0..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRParserRuleReturnScope.h
+++ /dev/null
@@ -1,46 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRToken.h"
-#import "ANTLRRuleReturnScope.h"
-
-@interface ANTLRParserRuleReturnScope : ANTLRRuleReturnScope {
-	id<ANTLRToken> startToken;
-	id<ANTLRToken> stopToken;
-}
-@property (retain, getter=getStart, setter=setStart:) id<ANTLRToken> startToken;
-@property (retain, getter=getStop, setter=setStop:)   id<ANTLRToken> stopToken;
-
-- (id<ANTLRToken>) getStart;
-- (void) setStart: (id<ANTLRToken>) aStart;
-
-- (id<ANTLRToken>) getStop;
-- (void) setStop: (id<ANTLRToken>) aStop;
-
-- (id) copyWithZone:(NSZone *)theZone;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRPtrBuffer.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRPtrBuffer.h
deleted file mode 100644
index 188f597..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRPtrBuffer.h
+++ /dev/null
@@ -1,91 +0,0 @@
-//
-//  ANTLRPtrBuffer.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/9/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRLinkBase.h"
-
-//#define GLOBAL_SCOPE       0
-//#define LOCAL_SCOPE        1
-#define BUFFSIZE         101
-
-@interface ANTLRPtrBuffer : ANTLRLinkBase {
-	//ANTLRPtrBuffer *fNext;
-    NSInteger BuffSize;
-    NSMutableData *buffer;
-    id *ptrBuffer;
-    NSInteger count;
-    NSInteger ptr;
-}
-
-@property (getter=getBuffSize, setter=setBuffSize:) NSInteger BuffSize;
-@property (retain, getter=getBuffer, setter=setBuffer:) NSMutableData *buffer;
-@property (retain, getter=getPtrBuffer, setter=setPtrBuffer:) id *ptrBuffer;
-@property (getter=getCount, setter=setCount:) NSInteger count;
-@property (getter=getPtr, setter=setPtr:) NSInteger ptr;
-
-// Contruction/Destruction
-+(ANTLRPtrBuffer *)newANTLRPtrBuffer;
-+(ANTLRPtrBuffer *)newANTLRPtrBufferWithLen:(NSInteger)cnt;
--(id)init;
--(id)initWithLen:(NSInteger)cnt;
--(void)dealloc;
-
-// Instance Methods
-- (id) copyWithZone:(NSZone *)aZone;
-/* clear -- reinitialize the maplist array */
-- (void) clear;
-
-- (NSInteger)count;
-- (NSInteger)length;
-- (NSInteger)size;
-
-- (NSMutableData *)getBuffer;
-- (void)setBuffer:(NSMutableData *)np;
-- (NSInteger)getCount;
-- (void)setCount:(NSInteger)aCount;
-- (id *)getPtrBuffer;
-- (void)setPtrBuffer:(id *)np;
-- (NSInteger)getPtr;
-- (void)setPtr:(NSInteger)np;
-
-- (void) push:(id) v;
-- (id) pop;
-- (id) peek;
-
-- (void) addObject:(id) v;
-- (void) addObjectsFromArray:(ANTLRPtrBuffer *)anArray;
-- (void) insertObject:(id)aRule atIndex:(NSInteger)idx;
-- (id)   objectAtIndex:(NSInteger)idx;
-- (void) removeAllObjects;
-
-- (void) ensureCapacity:(NSInteger) index;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRRecognitionException.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRRecognitionException.h
deleted file mode 100755
index 853dc0e..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRRecognitionException.h
+++ /dev/null
@@ -1,72 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRuntimeException.h"
-#import "ANTLRToken.h"
-#import "ANTLRIntStream.h"
-#import "ANTLRTree.h"
-
-@interface ANTLRRecognitionException : ANTLRRuntimeException {
-	id<ANTLRIntStream> input;
-	NSInteger index;
-	id<ANTLRToken> token;
-	id<ANTLRTree> node;
-	unichar c;
-	NSInteger line;
-	NSInteger charPositionInLine;
-}
-
-@property (retain, getter=getStream, setter=setStream:) id<ANTLRIntStream> input;
-@property (retain, getter=getToken, setter=setToken:) id<ANTLRToken>token;
-@property (retain, getter=getNode, setter=setNode:) id<ANTLRTree>node;
-@property (getter=getLine, setter=setLine:) NSInteger line;
-@property (getter=getCharPositionInLine, setter=setCharPositionInLine:) NSInteger charPositionInLine;
-
-+ (ANTLRRecognitionException *) newANTLRRecognitionException;
-+ (ANTLRRecognitionException *) exceptionWithStream:(id<ANTLRIntStream>) anInputStream; 
-- (id) init;
-- (id) initWithStream:(id<ANTLRIntStream>)anInputStream;
-- (id) initWithStream:(id<ANTLRIntStream>)anInputStream reason:(NSString *)aReason;
-- (NSInteger) unexpectedType;
-- (id<ANTLRToken>)getUnexpectedToken;
-
-- (id<ANTLRIntStream>) getStream;
-- (void) setStream: (id<ANTLRIntStream>) aStream;
-
-- (id<ANTLRToken>) getToken;
-- (void) setToken: (id<ANTLRToken>) aToken;
-
-- (id<ANTLRTree>) getNode;
-- (void) setNode: (id<ANTLRTree>) aNode;
-
-- (NSString *)getMessage;
-
-- (NSInteger)getCharPositionInLine;
-- (void)setCharPositionInLine:(NSInteger)aPos;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRRecognizerSharedState.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRRecognizerSharedState.h
deleted file mode 100755
index 0430b79..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRRecognizerSharedState.h
+++ /dev/null
@@ -1,116 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRToken.h"
-#import "ANTLRBitSet.h"
-#import "ANTLRRuleStack.h"
-
-@interface ANTLRRecognizerSharedState : NSObject {
-	NSMutableArray *following;          // a stack of FOLLOW bitsets used for context sensitive prediction and recovery
-    NSInteger _fsp;                     // Follow stack pointer
-	BOOL errorRecovery;                 // are we recovering?
-	NSInteger lastErrorIndex;
-	BOOL failed;                        // indicate that some match failed
-    NSInteger syntaxErrors;
-	NSInteger backtracking;             // the level of backtracking
-	ANTLRRuleStack *ruleMemo;			// store previous results of matching rules so we don't have to do it again. Hook in incremental stuff here, too.
-
-	id<ANTLRToken> token;
-	NSInteger  tokenStartCharIndex;
-	NSUInteger tokenStartLine;
-	NSUInteger tokenStartCharPositionInLine;
-	NSUInteger channel;
-	NSUInteger type;
-	NSString   *text;
-}
-
-@property (retain, getter=getFollowing, setter=setFollowing:) NSMutableArray *following;
-@property (assign) NSInteger _fsp;
-@property (assign) BOOL errorRecovery;
-@property (assign) NSInteger lastErrorIndex;
-@property (assign, getter=getFailed, setter=setFailed:) BOOL failed;
-@property (assign) NSInteger syntaxErrors;
-@property (assign, getter=getBacktracking, setter=setBacktracking) NSInteger backtracking;
-@property (retain, getter=getRuleMemo, setter=setRuleMemo:) ANTLRRuleStack *ruleMemo;
-@property (copy, getter=getToken, setter=setToken) id<ANTLRToken> token;
-@property (getter=getType,setter=setType:) NSUInteger type;
-@property (getter=getChannel,setter=setChannel:) NSUInteger channel;
-@property (getter=getTokenStartLine,setter=setTokenStartLine:) NSUInteger tokenStartLine;
-@property (getter=getCharPositionInLine,setter=setCharPositionInLine:) NSUInteger tokenStartCharPositionInLine;
-@property (getter=getTokenStartCharIndex,setter=setTokenStartCharIndex:) NSInteger tokenStartCharIndex;
-@property (retain, getter=getText, setter=setText) NSString *text;
-
-+ (ANTLRRecognizerSharedState *) newANTLRRecognizerSharedState;
-+ (ANTLRRecognizerSharedState *) newANTLRRecognizerSharedStateWithRuleLen:(NSInteger)aLen;
-+ (ANTLRRecognizerSharedState *) newANTLRRecognizerSharedState:(ANTLRRecognizerSharedState *)aState;
-
-- (id) init;
-- (id) initWithRuleLen:(NSInteger)aLen;
-- (id) initWithState:(ANTLRRecognizerSharedState *)state;
-
-- (id<ANTLRToken>) getToken;
-- (void) setToken:(id<ANTLRToken>) theToken;
-
-- (NSUInteger) getType;
-- (void) setType:(NSUInteger) theTokenType;
-
-- (NSUInteger) getChannel;
-- (void) setChannel:(NSUInteger) theChannel;
-
-- (NSUInteger) getTokenStartLine;
-- (void) setTokenStartLine:(NSUInteger) theTokenStartLine;
-
-- (NSUInteger) getCharPositionInLine;
-- (void) setCharPositionInLine:(NSUInteger) theCharPosition;
-
-- (NSInteger) getTokenStartCharIndex;
-- (void) setTokenStartCharIndex:(NSInteger) theTokenStartCharIndex;
-
-- (NSString *) getText;
-- (void) setText:(NSString *) theText;
-
-
-- (NSMutableArray *) getFollowing;
-- (void)setFollowing:(NSMutableArray *)aFollow;
-- (ANTLRRuleStack *) getRuleMemo;
-- (void)setRuleMemo:(ANTLRRuleStack *)aRuleMemo;
-- (BOOL) isErrorRecovery;
-- (void) setIsErrorRecovery: (BOOL) flag;
-
-- (BOOL) getFailed;
-- (void) setFailed: (BOOL) flag;
-
-- (NSInteger)  getBacktracking;
-- (void) setBacktracking:(NSInteger) value;
-- (void) increaseBacktracking;
-- (void) decreaseBacktracking;
-- (BOOL) isBacktracking;
-
-- (NSInteger) lastErrorIndex;
-- (void) setLastErrorIndex:(NSInteger) value;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRRewriteRuleElementStream.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRRewriteRuleElementStream.h
deleted file mode 100755
index 132a0cc..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRRewriteRuleElementStream.h
+++ /dev/null
@@ -1,85 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTreeAdaptor.h"
-
-typedef union {
-    id single;
-    NSMutableArray *multiple;
-} Elements;
-
-// TODO: this should be separated into stream and enumerator classes
-@interface ANTLRRewriteRuleElementStream : NSObject {
-    NSInteger cursor;
-    BOOL dirty;        ///< indicates whether the stream should return copies of its elements, set to true after a call to -reset
-    BOOL isSingleElement;
-    Elements elements;
-    
-    NSString *elementDescription;
-    id<ANTLRTreeAdaptor> treeAdaptor;
-}
-
-@property (assign, getter=GetCursor, setter=SetCursor:) NSInteger cursor;
-@property (assign, getter=Getdirty, setter=Setdirty:) BOOL dirty;
-@property (assign, getter=GetIsSingleElement, setter=SetIsSingleElement:) BOOL isSingleElement;
-@property (assign, getter=GetElement, setter=SetElement:) Elements elements;
-@property (assign, getter=GetElementDescription, setter=SetElementDescription:) NSString *elementDescription;
-@property (retain, getter=GetTreeAdaptor, setter=SetTreeAdaptor:) id<ANTLRTreeAdaptor> treeAdaptor;
-
-+ (ANTLRRewriteRuleElementStream*) newANTLRRewriteRuleElementStream:(id<ANTLRTreeAdaptor>)aTreeAdaptor
-                                                        description:(NSString *)anElementDescription;
-+ (ANTLRRewriteRuleElementStream*) newANTLRRewriteRuleElementStream:(id<ANTLRTreeAdaptor>)aTreeAdaptor
-                                                        description:(NSString *)anElementDescription
-                                                            element:(id)anElement;
-+ (ANTLRRewriteRuleElementStream*) newANTLRRewriteRuleElementStream:(id<ANTLRTreeAdaptor>)aTreeAdaptor
-                                                        description:(NSString *)anElementDescription
-                                                           elements:(NSArray *)theElements;
-
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription;
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription element:(id)anElement;
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription elements:(NSArray *)theElements;
-
-- (void)reset;
-
-- (id<ANTLRTreeAdaptor>) getTreeAdaptor;
-- (void) setTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor;
-
-- (void) addElement:(id)anElement;
-- (NSInteger) size;
- 
-- (BOOL) hasNext;
-- (id<ANTLRTree>) nextTree;
-- (id<ANTLRTree>) _next;       // internal: TODO: redesign if necessary. maybe delegate
-
-- (id) copyElement:(id)element;
-- (id) toTree:(id)element;
-
-- (NSString *) getDescription;
-- (void) setDescription:(NSString *)description;
-
-@end
-
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRRewriteRuleSubtreeStream.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRRewriteRuleSubtreeStream.h
deleted file mode 100755
index 1d18b24..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRRewriteRuleSubtreeStream.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRewriteRuleElementStream.h"
-
-@interface ANTLRRewriteRuleSubtreeStream : ANTLRRewriteRuleElementStream {
-
-}
-
-+ (ANTLRRewriteRuleSubtreeStream *) newANTLRRewriteRuleSubtreeStream:(id<ANTLRTreeAdaptor>)aTreeAdaptor
-                                                         description:(NSString *)anElementDescription;
-+ (ANTLRRewriteRuleSubtreeStream *) newANTLRRewriteRuleSubtreeStream:(id<ANTLRTreeAdaptor>)aTreeAdaptor
-                                                         description:(NSString *)anElementDescription
-                                                             element:(id)anElement;
-+ (ANTLRRewriteRuleSubtreeStream *) newANTLRRewriteRuleSubtreeStream:(id<ANTLRTreeAdaptor>)aTreeAdaptor
-                                                         description:(NSString *)anElementDescription
-                                                            elements:(NSArray *)theElements;
-
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription;
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription element:(id)anElement;
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription elements:(NSArray *)theElements;
-
-- (id) nextNode;
-- (id) dup:(id)element;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRRewriteRuleTokenStream.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRRewriteRuleTokenStream.h
deleted file mode 100755
index 3a516de..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRRewriteRuleTokenStream.h
+++ /dev/null
@@ -1,66 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRewriteRuleElementStream.h"
-
-
-@interface ANTLRRewriteRuleTokenStream : ANTLRRewriteRuleElementStream {
-
-}
-
-+ (id) newANTLRRewriteRuleTokenStream:(id<ANTLRTreeAdaptor>)anAdaptor
-                          description:(NSString *)elementDescription;
-/** Create a stream with one element */
-+ (id) newANTLRRewriteRuleTokenStream:(id<ANTLRTreeAdaptor>)adaptor
-                          description:(NSString *)elementDescription
-                              element:(id) oneElement;
-/** Create a stream, but feed off an existing list */
-+ (id) newANTLRRewriteRuleTokenStream:(id<ANTLRTreeAdaptor>)adaptor
-                          description:(NSString *)elementDescription
-                             elements:(NSMutableArray *)elements;
-
-- (id) init;
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)anAdaptor
-               description:(NSString *)aDescription;
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)anAdaptor 
-               description:(NSString *)aDescription
-                   element:(id)element;
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)anAdaptor
-               description:(NSString *)aDescription
-                  elements:(NSMutableArray *)elements;
-                               
-/** Get next token from stream and make a node for it */
-- (id) nextNode;
-
-- (id) nextToken;
-
-/** Don't convert to a tree unless they explicitly call nextTree.
- *  This way we can do hetero tree nodes in rewrite.
- */
-- (id<ANTLRTree>) toTree:(id<ANTLRToken>)element;
-
-@end
\ No newline at end of file
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRRuleMapElement.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRRuleMapElement.h
deleted file mode 100644
index e040b18..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRRuleMapElement.h
+++ /dev/null
@@ -1,55 +0,0 @@
-//
-//  ANTLRRuleMapElement.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/16/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRBaseMapElement.h"
-
-@interface ANTLRRuleMapElement : ANTLRBaseMapElement {
-    NSNumber *ruleNum;
-}
-
-@property (retain, getter=getRuleNum, setter=setRuleNum:) NSNumber *ruleNum;
-
-+ (ANTLRRuleMapElement *) newANTLRRuleMapElement;
-+ (ANTLRRuleMapElement *) newANTLRRuleMapElementWithIndex:(NSNumber *)anIdx;
-+ (ANTLRRuleMapElement *) newANTLRRuleMapElementWithIndex:(NSNumber *)anIdx RuleNum:(NSNumber *)aRuleNum;
-- (id) init;
-- (id) initWithAnIndex:(NSNumber *)anIdx;
-- (id) initWithAnIndex:(NSNumber *)anIdx RuleNum:(NSNumber *)aRuleNum;
-
-- (id) copyWithZone:(NSZone *)aZone;
-
-- (NSNumber *)getRuleNum;
-- (void)setRuleNum:(NSNumber *)aRuleNum;
-
-- (NSInteger)size;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRRuleMemo.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRRuleMemo.h
deleted file mode 100644
index 63a5ae2..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRRuleMemo.h
+++ /dev/null
@@ -1,60 +0,0 @@
-//
-//  ANTLRRuleMemo.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/16/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRLinkBase.h"
-
-@interface ANTLRRuleMemo : ANTLRLinkBase {
-    NSNumber *startIndex;
-    NSNumber *stopIndex;
-}
-
-@property (retain, getter=getStartIndex, setter=setStartIndex) NSNumber *startIndex;
-@property (retain, getter=getStopIndex, setter=setStopIndex) NSNumber *stopIndex;
-
-+ (ANTLRRuleMemo *)newANTLRRuleMemo;
-+ (ANTLRRuleMemo *)newANTLRRuleMemoWithStartIndex:(NSNumber *)aStartIndex StopIndex:(NSNumber *)aStopIndex;
-
-- (id) init;
-- (id) initWithStartIndex:(NSNumber *)aStartIndex StopIndex:(NSNumber *)aStopIndex;
-
-- (NSInteger)count;
-- (NSInteger)size;
-
-- (ANTLRRuleMemo *)getRuleWithStartIndex:(NSInteger)aStartIndex;
-- (NSNumber *)getStartIndex:(NSInteger)aStartIndex;
-- (NSNumber *)getStopIndex:(NSInteger)aStartIndex;
-- (NSNumber *)getStartIndex;
-- (void)setStartIndex:(NSNumber *)aStartIndex;
-- (NSNumber *)getStopIndex;
-- (void)setStopIndex:(NSNumber *)aStopIndex;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRRuleReturnScope.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRRuleReturnScope.h
deleted file mode 100644
index 4750c16..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRRuleReturnScope.h
+++ /dev/null
@@ -1,55 +0,0 @@
-//
-//  ANTLRRuleReturnScope.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/17/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRToken.h"
-
-@interface ANTLRRuleReturnScope : NSObject <NSCopying> {
-
-}
-
-/** Return the start token or tree */
-- (id<ANTLRToken>) getStart;
-
-/** Return the stop token or tree */
-- (id<ANTLRToken>) getStop;
-
-/** Has a value potentially if output=AST; */
-- (id) getNode;
-
-/** Has a value potentially if output=template; Don't use StringTemplate
- *  type as it then causes a dependency with ST lib.
- */
-- (id) getTemplate;
-
-- (id) copyWithZone:(NSZone *)theZone;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRRuleStack.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRRuleStack.h
deleted file mode 100644
index 12d450b..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRRuleStack.h
+++ /dev/null
@@ -1,63 +0,0 @@
-//
-//  ANTLRRuleStack.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/9/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRBaseStack.h"
-#import "ANTLRHashRule.h"
-
-//#define GLOBAL_SCOPE       0
-//#define LOCAL_SCOPE        1
-#define HASHSIZE         101
-#define HBUFSIZE      0x2000
-
-@interface ANTLRRuleStack : ANTLRBaseStack {
-}
-
-// Contruction/Destruction
-+(ANTLRRuleStack *)newANTLRRuleStack;
-+(ANTLRRuleStack *)newANTLRRuleStack:(NSInteger)cnt;
--(id)init;
--(id)initWithLen:(NSInteger)cnt;
--(void)dealloc;
-
-// Instance Methods
-- (id) copyWithZone:(NSZone *)aZone;
-/* clear -- reinitialize the maplist array */
-
-- (NSInteger)count;
-- (NSInteger)size;
-
-- (ANTLRHashRule *) pop;
-
-- (void) insertObject:(ANTLRHashRule *)aHashRule atIndex:(NSInteger)idx;
-- (ANTLRHashRule *)objectAtIndex:(NSInteger)idx;
-- (void)putHashRuleAtRuleIndex:(NSInteger)aRuleIndex StartIndex:(NSInteger)aStartIndex StopIndex:(NSInteger)aStopIndex;
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRRuleStack.m b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRRuleStack.m
deleted file mode 100644
index 909192f..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRRuleStack.m
+++ /dev/null
@@ -1,147 +0,0 @@
-//
-//  ANTLRRuleStack.m
-//  ANTLR
-//
-//  Created by Alan Condit on 6/9/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#define SUCCESS (0)
-#define FAILURE (-1)
-
-#import "ANTLRRuleStack.h"
-#import "ANTLRTree.h"
-
-/*
- * Start of ANTLRRuleStack
- */
-@implementation ANTLRRuleStack
-
-+ (ANTLRRuleStack *)newANTLRRuleStack
-{
-    return [[ANTLRRuleStack alloc] init];
-}
-
-+ (ANTLRRuleStack *)newANTLRRuleStack:(NSInteger)cnt
-{
-    return [[ANTLRRuleStack alloc] initWithLen:cnt];
-}
-
-- (id)init
-{
-	if ((self = [super init]) != nil) {
-	}
-    return( self );
-}
-
-- (id)initWithLen:(NSInteger)cnt
-{
-	if ((self = [super initWithLen:cnt]) != nil) {
-	}
-    return( self );
-}
-
-- (void)dealloc
-{
-	[super dealloc];
-}
-
-- (id) copyWithZone:(NSZone *)aZone
-{
-    return [super copyWithZone:aZone];
-}
-
-- (NSInteger)count
-{
-    ANTLRRuleMemo *anElement;
-    NSInteger aCnt = 0;
-    for( int i = 0; i < BuffSize; i++ ) {
-        if ((anElement = ptrBuffer[i]) != nil)
-            aCnt++;
-    }
-    return aCnt;
-}
-
-- (NSInteger)size
-{
-    ANTLRRuleMemo *anElement;
-    NSInteger aSize = 0;
-    for( int i = 0; i < BuffSize; i++ ) {
-        if ((anElement = ptrBuffer[i]) != nil) {
-            aSize++;
-        }
-    }
-    return aSize;
-}
-
-- (ANTLRHashRule *)pop
-{
-    return (ANTLRHashRule *)[super pop];
-}
-
-- (void) insertObject:(ANTLRHashRule *)aRule atIndex:(NSInteger)idx
-{
-    if ( idx >= BuffSize ) {
-        NSLog( @"In ANTLRRuleStack attempting to insert aRule at Index %d, but Buffer is only %d long\n", idx, BuffSize );
-        [self ensureCapacity:idx];
-    }
-    if ( aRule != ptrBuffer[idx] ) {
-        if (ptrBuffer[idx] != nil) [ptrBuffer[idx] release];
-        [aRule retain];
-    }
-    ptrBuffer[idx] = aRule;
-}
-
-- (ANTLRHashRule *)objectAtIndex:(NSInteger)idx
-{
-    if (idx < BuffSize) {
-        return ptrBuffer[idx];
-    }
-    return nil;
-}
-
-- (void)putHashRuleAtRuleIndex:(NSInteger)aRuleIndex StartIndex:(NSInteger)aStartIndex StopIndex:(NSInteger)aStopIndex
-{
-    ANTLRHashRule *aHashRule;
-    ANTLRRuleMemo *aRuleMemo;
-
-    if (aRuleIndex >= BuffSize) {
-        NSLog( @"putHashRuleAtRuleIndex attempting to insert aRule at Index %d, but Buffer is only %d long\n", aRuleIndex, BuffSize );
-        [self ensureCapacity:aRuleIndex];
-    }
-    if ((aHashRule = ptrBuffer[aRuleIndex]) == nil) {
-        aHashRule = [[ANTLRHashRule newANTLRHashRuleWithLen:17] retain];
-        ptrBuffer[aRuleIndex] = aHashRule;
-    }
-    if (( aRuleMemo = [aHashRule objectAtIndex:aStartIndex] ) == nil ) {
-        aRuleMemo = [[ANTLRRuleMemo newANTLRRuleMemo] retain];
-        [aHashRule insertObject:aRuleMemo atIndex:aStartIndex];
-    }
-    [aRuleMemo setStartIndex:[NSNumber numberWithInteger:aStartIndex]];
-    [aRuleMemo setStopIndex:[NSNumber numberWithInteger:aStopIndex]];
-}
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRRuntimeException.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRRuntimeException.h
deleted file mode 100644
index 6cf0918..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRRuntimeException.h
+++ /dev/null
@@ -1,54 +0,0 @@
-//
-//  ANTLRRuntimeException.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/5/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-
-@interface ANTLRRuntimeException : NSException
-{
-}
-
-+ (ANTLRRuntimeException *) newANTLRNoSuchElementException:(NSString *)aReason;
-+ (ANTLRRuntimeException *) newANTLRIllegalArgumentException:(NSString *)aReason;
-+ (ANTLRRuntimeException *) newANTLRRuntimeException:(NSString *)aReason;
-+ (ANTLRRuntimeException *) newANTLRRuntimeException:(NSString *)aName reason:(NSString *)aReason;
-+ (ANTLRRuntimeException *) newANTLRRuntimeException:(NSString *)aName reason:(NSString *)aReason userInfo:aUserInfo;
-
-- (id) init;
-- (id)initWithRuntime:(NSString *)aReason;
-- (id)initWithReason:(NSString *)aReason;
-- (id)initWithName:(NSString *)aName reason:(NSString *)aReason;
-- (id)initWithName:(NSString *)aName reason:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo;
-
-- (NSString *) Description;
-
-//    - (void)setDecisionNumber:(NSInteger)decisionNumber;
-//    - (void)setStateNumber:(NSInteger)stateNumber;
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRStreamEnumerator.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRStreamEnumerator.h
deleted file mode 100644
index a0e0f69..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRStreamEnumerator.h
+++ /dev/null
@@ -1,45 +0,0 @@
-//
-//  ANTLRStreamEnumertor.h
-//  ANTLR
-//
-//  Created by Ian Michell on 29/04/2010.
-// [The "BSD licence"]
-// Copyright (c) 2010 Ian Michell 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-
-
-@interface ANTLRStreamEnumerator : NSEnumerator 
-{
-	NSInteger i;
-	id eof;
-	NSMutableArray *nodes;
-}
-
--(id) initWithNodes:(NSMutableArray *) n andEOF:(id) o;
--(BOOL) hasNext;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRStringStream.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRStringStream.h
deleted file mode 100755
index 2b13c7d..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRStringStream.h
+++ /dev/null
@@ -1,126 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRCharStream.h"
-#import "ANTLRCharStreamState.h"
-#import "ANTLRPtrBuffer.h"
-
-@interface ANTLRStringStream : NSObject < ANTLRCharStream > {
-	NSString *data;
-	NSInteger n;
-	NSInteger p;
-	NSInteger line;
-	NSInteger charPositionInLine;
-	NSInteger markDepth;
-	ANTLRPtrBuffer *markers;
-	NSInteger lastMarker;
-	NSString *name;
-    ANTLRCharStreamState *charState;
-}
-
-@property (retain, getter=getData,setter=setData:) NSString *data;
-@property (getter=getP,setter=setP:) NSInteger p;
-@property (getter=getN,setter=setN:) NSInteger n;
-@property (getter=getLine,setter=setLine:) NSInteger line;
-@property (getter=getCharPositionInLine,setter=setCharPositionInLine:) NSInteger charPositionInLine;
-@property (getter=getMarkDepth,setter=setMarkDepth:) NSInteger markDepth;
-@property (retain, getter=getMarkers, setter=setMarkers:) ANTLRPtrBuffer *markers;
-@property (getter=getLastMarker,setter=setLastMarker:) NSInteger lastMarker;
-@property (retain, getter=getSourceName, setter=setSourceName:) NSString *name;
-@property (retain, getter=getCharState, setter=setCharState:) ANTLRCharStreamState *charState;
-
-+ newANTLRStringStream;
-
-+ newANTLRStringStream:(NSString *)aString;
-
-+ newANTLRStringStream:(char *)myData Count:(NSInteger)numBytes;
-
-- (id) init;
-
-// this initializer copies the string
-- (id) initWithString:(NSString *) theString;
-
-// This is the preferred constructor as no data is copied
-- (id) initWithStringNoCopy:(NSString *) theString;
-
-- (id) initWithData:(char *)myData Count:(NSInteger)numBytes;
-
-- (void) dealloc;
-
-- (id) copyWithZone:(NSZone *)aZone;
-
-// reset the stream's state, but keep the data to feed off
-- (void) reset;
-// consume one character from the stream
-- (void) consume;
-
-// look ahead i characters
-- (NSInteger) LA:(NSInteger) i;
-- (NSInteger) LT:(NSInteger) i;
-
-// returns the position of the current input symbol
-- (NSInteger) getIndex;
-// total length of the input data
-- (NSInteger) size;
-
-// seek and rewind in the stream
-- (NSInteger) mark;
-- (void) rewind:(NSInteger) marker;
-- (void) rewind;
-- (void) release:(NSInteger) marker;
-- (void) seek:(NSInteger) index;
-
-// provide the streams data (e.g. for tokens using indices)
-- (NSString *) substring:(NSInteger)startIndex To:(NSInteger)stopIndex;
-- (NSString *) substringWithRange:(NSRange) theRange;
-
-// used for tracking the current position in the input stream
-- (NSInteger) getLine;
-- (void) setLine:(NSInteger) theLine;
-- (NSInteger) getCharPositionInLine;
-- (void) setCharPositionInLine:(NSInteger) thePos;
-
-- (NSInteger) getN;
-- (void) setN:(NSInteger)num;
-
-- (NSInteger) getP;
-- (void) setP:(NSInteger)num;
-
-- (ANTLRPtrBuffer *)getMarkers;
-- (void) setMarkers:(ANTLRPtrBuffer *)aMarkerList;
-
-- (NSString *)getSourceName;
-
-- (NSString *)toString;
-
-// accessors to the raw data of this stream
-- (NSString *) getData;
-- (void) setData: (NSString *) aData;
-
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRSymbolStack.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRSymbolStack.h
deleted file mode 100644
index 169df9f..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRSymbolStack.h
+++ /dev/null
@@ -1,75 +0,0 @@
-//
-//  ANTLRSymbolStack.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/9/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRBaseStack.h"
-// #import "ANTLRSymbolScope.h"
-
-//#define GLOBAL_SCOPE       0
-//#define LOCAL_SCOPE        1
-#define HASHSIZE         101
-#define HBUFSIZE      0x2000
-
-@interface ANTLRSymbolsScope : NSObject
-{
-    
-}
-
-+ (ANTLRSymbolsScope *)newANTLRSymbolsScope;
-
-- (id)init;
-@end
-
-
-@interface ANTLRSymbolStack : ANTLRBaseStack {
-}
-
-// Contruction/Destruction
-+(ANTLRSymbolStack *)newANTLRSymbolStack;
-+(ANTLRSymbolStack *)newANTLRSymbolStackWithLen:(NSInteger)cnt;
--(id)init;
--(id)initWithLen:(NSInteger)cnt;
--(void)dealloc;
-
-// Instance Methods
-- (id) copyWithZone:(NSZone *)aZone;
-/* clear -- reinitialize the maplist array */
-
--(ANTLRSymbolsScope *)getHashMapEntry:(NSInteger)idx;
-
--(ANTLRSymbolsScope **)getHashMap;
-
--(ANTLRSymbolsScope *) pop;
-
-- (void) insertObject:(ANTLRSymbolsScope *)aScope atIndex:(NSInteger)idx;
-- (ANTLRSymbolsScope *)objectAtIndex:(NSInteger)idx;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRSymbolStack.m b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRSymbolStack.m
deleted file mode 100644
index 1dd6775..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRSymbolStack.m
+++ /dev/null
@@ -1,123 +0,0 @@
-//
-//  ANTLRSymbolStack.m
-//  ANTLR
-//
-//  Created by Alan Condit on 6/9/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#define SUCCESS (0)
-#define FAILURE (-1)
-
-#import "ANTLRSymbolStack.h"
-#import "ANTLRTree.h"
-
-
-@implementation ANTLRSymbolsScope
-
-+ (ANTLRSymbolsScope *)newANTLRSymbolsScope
-{
-    return( [[ANTLRSymbolsScope alloc] init] );
-}
-
-- (id)init
-{
-    if ((self = [super init]) != nil) {
-    }
-    return (self);
-}
-
-@end
-
-/*
- * Start of ANTLRSymbolStack
- */
-@implementation ANTLRSymbolStack
-
-+(ANTLRSymbolStack *)newANTLRSymbolStack
-{
-    return [[ANTLRSymbolStack alloc] init];
-}
-
-+(ANTLRSymbolStack *)newANTLRSymbolStackWithLen:(NSInteger)cnt
-{
-    return [[ANTLRSymbolStack alloc] initWithLen:cnt];
-}
-
--(id)init
-{
-	if ((self = [super init]) != nil) {
-	}
-    return( self );
-}
-
--(id)initWithLen:(NSInteger)cnt
-{
-	if ((self = [super initWithLen:cnt]) != nil) {
-	}
-    return( self );
-}
-
--(void)dealloc
-{
-	[super dealloc];
-}
-
-- (id) copyWithZone:(NSZone *)aZone
-{
-    return [super copyWithZone:aZone];
-}
-
--(ANTLRSymbolsScope *)getHashMapEntry:(NSInteger)idx
-{
-	return( (ANTLRSymbolsScope *)[super objectAtIndex:idx] );
-}
-
--(ANTLRSymbolsScope **)getHashMap
-{
-	return( (ANTLRSymbolsScope **)ptrBuffer );
-}
-
--(ANTLRSymbolsScope *) pop
-{
-    return (ANTLRSymbolsScope *)[super pop];
-}
-
-- (void) insertObject:(ANTLRSymbolsScope *)aRule atIndex:(NSInteger)idx
-{
-    if (aRule != ptrBuffer[idx]) {
-        if (ptrBuffer[idx] != nil) [ptrBuffer[idx] release];
-        [aRule retain];
-    }
-    ptrBuffer[idx] = aRule;
-}
-
-- (ANTLRSymbolsScope *)objectAtIndex:(NSInteger)idx
-{
-    return (ANTLRSymbolsScope *)[super objectAtIndex:idx];
-}
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRToken+DebuggerSupport.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRToken+DebuggerSupport.h
deleted file mode 100755
index 659e763..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRToken+DebuggerSupport.h
+++ /dev/null
@@ -1,41 +0,0 @@
-//
-//  ANTLRToken+DebuggerSupport.h
-//  ANTLR
-//
-//  Created by Kay Röpke on 03.12.2006.
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-//
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRToken.h"
-#import "ANTLRCommonToken.h"
-
-@interface ANTLRCommonToken(DebuggerSupport)
-
-- (NSString *)debuggerDescription;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRToken.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRToken.h
deleted file mode 100755
index 64524f0..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRToken.h
+++ /dev/null
@@ -1,79 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-
-typedef enum {
-	ANTLRTokenTypeEOF = -1,
-	ANTLRTokenTypeInvalid,
-	ANTLRTokenTypeEOR,
-	ANTLRTokenTypeDOWN,
-	ANTLRTokenTypeUP,
-	ANTLRTokenTypeMIN
-} ANTLRTokenType;
-
-typedef enum {
-	ANTLRTokenChannelDefault = 0,
-    ANTLRTokenChannelHidden = 99
-} ANTLRTokenChannel;
-
-#define HIDDEN 99
-
-@protocol ANTLRToken < NSObject, NSCopying >
-
-// The singleton eofToken instance.
-+ (id<ANTLRToken>) eofToken;
-// The default channel for this class of Tokens
-+ (ANTLRTokenChannel) defaultChannel;
-
-// provide hooks to explicitely set the text as opposed to use the indices into the CharStream
-- (NSString *) getText;
-- (void) setText:(NSString *) theText;
-
-- (NSInteger) getType;
-- (void) setType: (NSInteger) aType;
-
-// ANTLR v3 provides automatic line and position tracking. Subclasses do not need to
-// override these, if they do not want to store line/pos tracking information
-- (NSUInteger) getLine;
-- (void) setLine: (NSUInteger) aLine;
-
-- (NSUInteger) getCharPositionInLine;
-- (void) setCharPositionInLine: (NSUInteger) aCharPositionInLine;
-
-// explicitely change the channel this Token is on. The default parser implementation
-// just sees the defaultChannel
-// Common idiom is to put whitespace tokens on channel 99.
-- (NSUInteger) getChannel;
-- (void) setChannel: (NSUInteger) aChannel;
-
-// the index of this Token into the TokenStream
-- (NSUInteger) getTokenIndex;
-- (void) setTokenIndex: (NSUInteger) aTokenIndex;
-- (NSString *)toString;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTokenRewriteStream.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTokenRewriteStream.h
deleted file mode 100644
index 0d8681f..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTokenRewriteStream.h
+++ /dev/null
@@ -1,170 +0,0 @@
-//
-//  ANTLRTokenRewriteStream.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/19/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRCommonTokenStream.h"
-#import "ANTLRLinkBase.h"
-#import "ANTLRHashMap.h"
-#import "ANTLRMapElement.h"
-#import "ANTLRTokenSource.h"
-
-// Define the rewrite operation hierarchy
-
-@interface ANTLRRewriteOperation : ANTLRCommonTokenStream
-{
-/** What index into rewrites List are we? */
-NSInteger instructionIndex;
-/** Token buffer index. */
-NSInteger index;
-NSString *text;
-}
-
-@property (getter=getInstructionIndex, setter=setInstructionIndex:) NSInteger instructionIndex;
-@property (getter=getIndex, setter=setIndex:) NSInteger index;
-@property (retain, getter=getText, setter=setText:) NSString *text;
-
-+ (ANTLRRewriteOperation *) newANTLRRewriteOperation:(NSInteger)index Text:(NSString *)text;
-
-- (id) initWithIndex:(NSInteger)anIndex Text:(NSString *)theText;
-
-/** Execute the rewrite operation by possibly adding to the buffer.
- *  Return the index of the next token to operate on.
- */
-- (NSInteger) execute:(NSString *)buf;
-
-- (NSString *)toString;
-- (NSInteger) indexOf:(char)aChar inString:(NSString *)aString;
-@end
-
-@interface ANTLRInsertBeforeOp : ANTLRRewriteOperation {
-}
-
-+ (ANTLRInsertBeforeOp *) newANTLRInsertBeforeOp:(NSInteger)anIndex Text:(NSString *)theText;
-- (id) initWithIndex:(NSInteger)anIndex Text:(NSString *)theText;
-
-@end
-
-/** I'm going to try replacing range from x..y with (y-x)+1 ReplaceOp
- *  instructions.
- */
-@interface ANTLRReplaceOp : ANTLRRewriteOperation {
-    NSInteger lastIndex;
-}
-
-@property (getter=getLastIndex, setter=setLastIndex:) NSInteger lastIndex;
-
-+ (ANTLRReplaceOp *) newANTLRReplaceOp:(NSInteger)from ToIndex:(NSInteger)to Text:(NSString*)theText;
-- (id) initWithIndex:(NSInteger)from ToIndex:(NSInteger)to Text:(NSString *)theText;
-
-- (NSInteger) execute:(NSString *)buf;
-- (NSString *)toString;
-
-@end
-
-@interface ANTLRDeleteOp : ANTLRReplaceOp {
-}
-+ (ANTLRDeleteOp *) newANTLRDeleteOp:(NSInteger)from ToIndex:(NSInteger)to;
-
-- (id) initWithIndex:(NSInteger)from ToIndex:(NSInteger)to;
-
-- (NSString *)toString;
-
-@end
-
-
-@interface ANTLRTokenRewriteStream : ANTLRCommonTokenStream {
-/** You may have multiple, named streams of rewrite operations.
- *  I'm calling these things "programs."
- *  Maps String (name) -> rewrite (List)
- */
-ANTLRHashMap *programs;
-
-/** Map String (program name) -> Integer index */
-ANTLRHashMap *lastRewriteTokenIndexes;
-}
-
-@property (retain, getter=getPrograms, setter=setPrograms:) ANTLRHashMap *programs;
-@property (retain, getter=getLastRewriteTokenIndexes, setter=setLastRewriteTokenIndexes:) ANTLRHashMap *lastRewriteTokenIndexes;
-
-+ (ANTLRTokenRewriteStream *)newANTLRTokenRewriteStream;
-+ (ANTLRTokenRewriteStream *)newANTLRTokenRewriteStream:(id<ANTLRTokenSource>) aTokenSource;
-+ (ANTLRTokenRewriteStream *)newANTLRTokenRewriteStream:(id<ANTLRTokenSource>) aTokenSource Channel:(NSInteger)aChannel;
-
-- (id) init;
-- (id)initWithTokenSource:(id<ANTLRTokenSource>)aTokenSource;
-- (id)initWithTokenSource:(id<ANTLRTokenSource>)aTokenSource Channel:(NSInteger)aChannel;
-
-- (ANTLRHashMap *)getPrograms;
-- (void)setPrograms:(ANTLRHashMap *)aProgList;
-
-- (void) rollback:(NSInteger)instructionIndex;
-- (void) rollback:(NSString *)programName Index:(NSInteger)anInstructionIndex;
-- (void) deleteProgram;
-- (void) deleteProgram:(NSString *)programName;
-- (void) insertAfterToken:(id<ANTLRToken>)t Text:(NSString *)theText;
-- (void) insertAfterIndex:(NSInteger)anIndex Text:(NSString *)theText;
-- (void) insertAfterProgNam:(NSString *)programName Index:(NSInteger)anIndex Text:(NSString *)theText;
-
-
-- (void) insertBeforeToken:(id<ANTLRToken>)t Text:(NSString *)theText;
-- (void) insertBeforeIndex:(NSInteger)anIndex Text:(NSString *)theText;
-- (void) insertBeforeProgName:(NSString *)programName Index:(NSInteger)index Text:(NSString *)theText;
-- (void) replaceFromIndex:(NSInteger)anIndex Text:(NSString *)theText;
-- (void) replaceFromIndex:(NSInteger)from ToIndex:(NSInteger)to Text:(NSString *)theText;
-- (void) replaceFromToken:(id<ANTLRToken>)indexT Text:(NSString *)theText;
-- (void) replaceFromToken:(id<ANTLRToken>)from ToToken:(id<ANTLRToken>)to Text:(NSString *)theText;
-- (void) replaceProgNam:(NSString *)programName Token:(id<ANTLRToken>)from Token:(id<ANTLRToken>)to Text:(NSString *)theText;
-- (void) replaceProgNam:(NSString *)programName FromIndex:(NSInteger)from ToIndex:(NSInteger)to Text:(NSString *)theText;
-- (void) delete:(NSInteger)anIndex;
-- (void) delete:(NSInteger)from ToIndex:(NSInteger)to;
-- (void) deleteToken:(id<ANTLRToken>)indexT;
-- (void) deleteFromToken:(id<ANTLRToken>)from ToToken:(id<ANTLRToken>)to;
-- (void) delete:(NSString *)programName FromToken:(id<ANTLRToken>)from ToToken:(id<ANTLRToken>)to;
-- (void) delete:(NSString *)programName FromIndex:(NSInteger)from ToIndex:(NSInteger)to;
-- (NSInteger)getLastRewriteTokenIndex;
-- (NSInteger)getLastRewriteTokenIndex:(NSString *)programName;
-- (void)setLastRewriteTokenIndex:(NSString *)programName Index:(NSInteger)anInt;
-- (ANTLRHashMap *) getProgram:(NSString *)name;
-- (ANTLRHashMap *) initializeProgram:(NSString *)name;
-- (NSString *)toOriginalString;
-- (NSString *)toOriginalString:(NSInteger)start End:(NSInteger)end;
-- (NSString *)toString;
-- (NSString *)toString:(NSString *)programName;
-- (NSString *)toStringFromStart:(NSInteger)start ToEnd:(NSInteger)end;
-- (NSString *)toString:(NSString *)programName FromStart:(NSInteger)start ToEnd:(NSInteger)end;
-- (ANTLRHashMap *)reduceToSingleOperationPerIndex:(ANTLRHashMap *)rewrites;
-- (ANTLRHashMap *)getKindOfOps:(ANTLRHashMap *)rewrites KindOfClass:(Class)kind;
-- (ANTLRHashMap *)getKindOfOps:(ANTLRHashMap *)rewrites KindOfClass:(Class)kind Index:(NSInteger)before;
-- (NSString *)catOpText:(id)a PrevText:(id)b;
-- (NSMutableString *)toDebugString;
-- (NSMutableString *)toDebugStringFromStart:(NSInteger)start ToEnd:(NSInteger)end;
-                    
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTokenSource.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTokenSource.h
deleted file mode 100755
index 4d6b6ee..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTokenSource.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import "ANTLRToken.h"
-
-// Anything that responds to -nextToken can be treated as a lexer.
-// For instance this can be a flex lexer or a handwritten one or even
-// a proxy for a remotely running token source (database, lexer, whatever).
-@protocol ANTLRTokenSource <NSObject, NSCopying>
-
-- (id<ANTLRToken>) nextToken;
-- (NSString *)getSourceName;
-
-@end
\ No newline at end of file
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTokenStream.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTokenStream.h
deleted file mode 100755
index c104578..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTokenStream.h
+++ /dev/null
@@ -1,62 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import "ANTLRIntStream.h"
-#import "ANTLRToken.h"
-
-@protocol ANTLRTokenStream < ANTLRIntStream >
-
-// Get Token at current input pointer + i ahead where i=1 is next Token.
-// i<0 indicates tokens in the past.  So -1 is previous token and -2 is
-// two tokens ago. LT:0 is undefined.  For i>=n, return Token.EOFToken.
-// Return null for LT:0 and any index that results in an absolute address
-// that is negative.
-
-- (id<ANTLRToken>) LT:(NSInteger) i;
-
-- (id<ANTLRToken>) getToken:(NSUInteger) i;
-
-- (id) getTokenSource;
-
-- (NSString *) toString;
-/** Return the text of all tokens from start to stop, inclusive.
- *  If the stream does not buffer all the tokens then it can just
- *  return "" or null;  Users should not access $ruleLabel.text in
- *  an action of course in that case.
- */
-- (NSString *)toStringFromStart:(NSInteger)startIdx ToEnd:(NSInteger)stopIdx;
-
-/** Because the user is not required to use a token with an index stored
- *  in it, we must provide a means for two token objects themselves to
- *  indicate the start/end location.  Most often this will just delegate
- *  to the other toString(int,int).  This is also parallel with
- *  the TreeNodeStream.toString(Object,Object).
- */
-- (NSString *) toStringFromToken:(id<ANTLRToken>)startToken ToToken:(id<ANTLRToken>)stopToken;
-
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTree.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTree.h
deleted file mode 100755
index f269b2d..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTree.h
+++ /dev/null
@@ -1,123 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-@protocol ANTLRTree < NSObject, NSCopying >
-
-//+ (id<ANTLRTree>) invalidNode;
-
-- (id<ANTLRTree>) getChild:(NSUInteger)index;
-- (NSUInteger) getChildCount;
-
-// Tree tracks parent and child index now > 3.0
-
-- (id<ANTLRTree>)getParent;
-
-- (void) setParent:(id<ANTLRTree>)t;
-
-/** Is there is a node above with token type ttype? */
-- (BOOL) hasAncestor:(NSInteger)ttype;
-
-/** Walk upwards and get first ancestor with this token type. */
-- (id<ANTLRTree>) getAncestor:(NSInteger) ttype;
-
-/** Return a list of all ancestors of this node.  The first node of
- *  list is the root and the last is the parent of this node.
- */
-- (NSMutableArray *) getAncestors;
-
-/** This node is what child index? 0..n-1 */
-- (NSInteger) getChildIndex;
-
-- (void) setChildIndex:(NSInteger) index;
-
-/** Set the parent and child index values for all children */
-- (void) freshenParentAndChildIndexes;
-
-/** Add t as a child to this node.  If t is null, do nothing.  If t
- *  is nil, add all children of t to this' children.
- */
-- (void) addChild:(id<ANTLRTree>) t;
-
-/** Set ith child (0..n-1) to t; t must be non-null and non-nil node */
-- (void) setChild:(NSInteger)i With:(id<ANTLRTree>) t;
-
-- (id) deleteChild:(NSInteger) i;
-
-/** Delete children from start to stop and replace with t even if t is
- *  a list (nil-root tree).  num of children can increase or decrease.
- *  For huge child lists, inserting children can force walking rest of
- *  children to set their childindex; could be slow.
- */
-- (void) replaceChildrenFrom:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id)t;	
-
-- (NSArray *) getChildren;
-// Add t as a child to this node.  If t is null, do nothing.  If t
-//  is nil, add all children of t to this' children.
-
-- (void) addChildren:(NSArray *) theChildren;
-//- (void) removeAllChildren;
-
-// Indicates the node is a nil node but may still have children, meaning
-// the tree is a flat list.
-
-- (BOOL) isNil;
-
-/**  What is the smallest token index (indexing from 0) for this node
- *   and its children?
- */
-- (NSInteger) getTokenStartIndex;
-
-- (void) setTokenStartIndex:(NSInteger) index;
-
-/**  What is the largest token index (indexing from 0) for this node
- *   and its children?
- */
-- (NSInteger) getTokenStopIndex;
-- (void) setTokenStopIndex:(NSInteger) index;
-
-- (id<ANTLRTree>) dupNode;
-
-- (NSString *) toString;
-
-#pragma mark Copying
-- (id) copyWithZone:(NSZone *)aZone;	// the children themselves are not copied here!
-- (id) deepCopy;					// performs a deepCopyWithZone: with the default zone
-- (id) deepCopyWithZone:(NSZone *)aZone;
-
-#pragma mark Tree Parser support
-- (NSInteger) getType;
-- (NSString *) getText;
-// In case we don't have a token payload, what is the line for errors?
-- (NSInteger) getLine;
-- (NSInteger) getCharPositionInLine;
-- (void) setCharPositionInLine:(NSInteger)pos;
-
-#pragma mark Informational
-- (NSString *) treeDescription;
-- (NSString *) description;
-
-@end
-
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTreeAdaptor.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTreeAdaptor.h
deleted file mode 100755
index e6579cf..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTreeAdaptor.h
+++ /dev/null
@@ -1,159 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import "ANTLRToken.h"
-#import "ANTLRBaseTree.h"
-#import "ANTLRTokenStream.h"
-
-#pragma warning tree/node diction is broken.
-
-@protocol ANTLRTreeAdaptor <NSObject, NSCopying>
-
-#pragma mark Construction
-
-+ (id<ANTLRTree>) newEmptyTree;
-
-- (id<ANTLRTree>) createTree:(id<ANTLRToken>)payload;
-
-#pragma mark ANTLRTreeAdaptor implementation
-- (id<ANTLRTree>)dupNode:(id<ANTLRTree>)aNode;	// copies just the node
-- (id<ANTLRTree>)dupTree:(id<ANTLRTree>)aTree;	// copies the entire subtree, recursively
-
-/** Return a nil node (an empty but non-null node) that can hold
- *  a list of element as the children.  If you want a flat tree (a list)
- *  use "t=adaptor.nil(); t.addChild(x); t.addChild(y);"
- */
-- (id) emptyNode;
-
-/** Return a tree node representing an error.  This node records the
- *  tokens consumed during error recovery.  The start token indicates the
- *  input symbol at which the error was detected.  The stop token indicates
- *  the last symbol consumed during recovery.
- *
- *  You must specify the input stream so that the erroneous text can
- *  be packaged up in the error node.  The exception could be useful
- *  to some applications; default implementation stores ptr to it in
- *  the CommonErrorNode.
- *
- *  This only makes sense during token parsing, not tree parsing.
- *  Tree parsing should happen only when parsing and tree construction
- *  succeed.
- */
-- (id) errorNode:(id<ANTLRTokenStream>)anInput
-            From:(id<ANTLRToken>)aStartToken
-              To:(id<ANTLRToken>)aStopToken
-       Exception:(NSException *) e;
-
-/** Is tree considered a nil node used to make lists of child nodes? */
-- (BOOL) isNil:(id<ANTLRTree>)aTree;
-
-
-- (void) addChild:(id<ANTLRTree>)child toTree:(id<ANTLRTree>)aTree;
-
-/** If oldRoot is a nil root, just copy or move the children to newRoot.
- *  If not a nil root, make oldRoot a child of newRoot.
- *
- *    old=^(nil a b c), new=r yields ^(r a b c)
- *    old=^(a b c), new=r yields ^(r ^(a b c))
- *
- *  If newRoot is a nil-rooted single child tree, use the single
- *  child as the new root node.
- *
- *    old=^(nil a b c), new=^(nil r) yields ^(r a b c)
- *    old=^(a b c), new=^(nil r) yields ^(r ^(a b c))
- *
- *  If oldRoot was null, it's ok, just return newRoot (even if isNil).
- *
- *    old=null, new=r yields r
- *    old=null, new=^(nil r) yields ^(nil r)
- *
- *  Return newRoot.  Throw an exception if newRoot is not a
- *  simple node or nil root with a single child node--it must be a root
- *  node.  If newRoot is ^(nil x) return x as newRoot.
- *
- *  Be advised that it's ok for newRoot to point at oldRoot's
- *  children; i.e., you don't have to copy the list.  We are
- *  constructing these nodes so we should have this control for
- *  efficiency.
- */
-- (id) becomeRoot:(id<ANTLRTree>)newRoot old:(id<ANTLRTree>)oldRoot;
-
-- (id) rulePostProcessing:(id<ANTLRTree>)root;
-
-#pragma mark Rewrite Rules
-                           
-- (NSUInteger) getUniqueID:(id<ANTLRTree>)aNode;
-
-- (id<ANTLRTree>) createTree:(NSInteger)tokenType FromToken:(id<ANTLRToken>)fromToken;
-- (id<ANTLRTree>) createTree:(NSInteger)tokenType FromToken:(id<ANTLRToken>)fromToken Text:(NSString *)text;
-- (id<ANTLRTree>) createTree:(NSInteger)tokenType Text:(NSString *)text;
-
-#pragma mark Content
-
-- (id<ANTLRTree>)dupNode:(id<ANTLRTree>)aNode;
-- (id<ANTLRTree>)dupTree:(id<ANTLRTree>)aTree;
-
-- (NSInteger) getType:(id<ANTLRTree>)aNode;
-- (void) setType:(id<ANTLRTree>)aNode Type:(NSInteger)tokenType;
-
-- (NSString *) getText:(id<ANTLRTree>)aNode;
-- (void) setText:(id<ANTLRTree>)aNode Text:(NSString *)tokenText;
-
-- (id<ANTLRToken>) getToken:(id<ANTLRTree>)t;
-
-- (void) setTokenBoundaries:(id<ANTLRTree>)aTree From:(id<ANTLRToken>)startToken To:(id<ANTLRToken>)stopToken;
-- (NSInteger) getTokenStartIndex:(id<ANTLRTree>)aTree;
-- (NSInteger) getTokenStopIndex:(id<ANTLRTree>)aTree;
-
-#pragma mark Navigation / Tree Parsing
-
-/** Get a child 0..n-1 node */
-- (id<ANTLRTree>) getChild:(id<ANTLRTree>)aNode At:(NSInteger) i;
-/** Set ith child (0..n-1) to t; t must be non-null and non-nil node */
-- (void) setChild:(id<ANTLRTree>)aTree At:(NSInteger)index Child:(id<ANTLRTree>)child;
-/** Remove ith child and shift children down from right. */
-- (id<ANTLRTree>) deleteChild:(id<ANTLRTree>)t Index:(NSInteger)index;
-
-/** How many children?  If 0, then this is a leaf node */
-- (NSInteger) getChildCount:(id<ANTLRTree>) aTree;
-
-/** Who is the parent node of this node; if null, implies node is root.
- *  If your node type doesn't handle this, it's ok but the tree rewrites
- *  in tree parsers need this functionality.
- */
-- (id<ANTLRTree>)getParent:(id<ANTLRTree>)t;
-- (void) setParent:(id<ANTLRTree>)t With:(id<ANTLRTree>)parent;
-
-/** What index is this node in the child list? Range: 0..n-1
- *  If your node type doesn't handle this, it's ok but the tree rewrites
- *  in tree parsers need this functionality.
- */
-- (NSInteger) getChildIndex:(id<ANTLRTree>)t;
-- (void) setChildIndex:(id<ANTLRTree>)t With:(NSInteger)index;
-
-- (void) replaceChildren:(id<ANTLRTree>)parent From:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id<ANTLRTree>)t;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTreeException.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTreeException.h
deleted file mode 100755
index 8ec5c45..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTreeException.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTree.h"
-#import "ANTLRRecognitionException.h"
-
-@interface ANTLRTreeException : ANTLRRecognitionException {
-	id<ANTLRTree> oldRoot;
-	id<ANTLRTree> newRoot;
-}
-
-+ (id) exceptionWithOldRoot:(id<ANTLRTree>)theOldRoot newRoot:(id<ANTLRTree>)theNewRoot stream:(id<ANTLRIntStream>)aStream;
-- (id) initWithOldRoot:(id<ANTLRTree>)theOldRoot newRoot:(id<ANTLRTree>)theNewRoot stream:(id<ANTLRIntStream>)aStream;
-
-- (void) setOldRoot:(id<ANTLRTree>)aTree;
-- (void) setNewRoot:(id<ANTLRTree>)aTree;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTreeIterator.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTreeIterator.h
deleted file mode 100644
index e6d5e71..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTreeIterator.h
+++ /dev/null
@@ -1,67 +0,0 @@
-//
-//  ANTLRTreeIterator.h
-//  ANTLR
-//
-//  Created by Ian Michell on 26/04/2010.
-// [The "BSD licence"]
-// Copyright (c) 2010 Ian Michell 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRCommonTreeAdaptor.h"
-#import "ANTLRFastQueue.h"
-#import "ANTLRTreeAdaptor.h"
-#import "ANTLRTree.h"
-
-@interface ANTLRTreeIterator : NSObject 
-{
-	id<ANTLRTreeAdaptor> adaptor;
-	id<ANTLRTree> root;
-	id<ANTLRTree> tree;
-	BOOL firstTime;
-	id<ANTLRTree> up;
-	id<ANTLRTree> down;
-	id<ANTLRTree> eof;
-	
-	ANTLRFastQueue *nodes;
-}
-
-@property(retain, readwrite) id<ANTLRTree> up;
-@property(retain, readwrite) id<ANTLRTree> down;
-@property(retain, readwrite) id<ANTLRTree> eof;
-
-+ newANTRLTreeIterator;
-+ (ANTLRTreeIterator *) newANTRLTreeIteratorWithAdaptor:(ANTLRCommonTreeAdaptor *)adaptor
-                                                andTree:(id<ANTLRTree>)tree;
-- (id) init;
-- (id) initWithTree:(id<ANTLRTree>) t;
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>) a andTree:(id<ANTLRTree>) t;
-
-- (void) reset;
-- (BOOL) hasNext;
-- (id) nextObject;
-- (NSArray *) allObjects;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTreeNodeStream.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTreeNodeStream.h
deleted file mode 100755
index bf6342c..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTreeNodeStream.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRIntStream.h"
-#import "ANTLRCharStream.h"
-#import "ANTLRTokenStream.h"
-#import "ANTLRCommonTree.h"
-#import "ANTLRCommonTreeAdaptor.h"
-
-@protocol ANTLRTreeNodeStream < ANTLRIntStream > 
-
-- (id) initWithTree:(ANTLRCommonTree *)theTree;
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)theAdaptor Tree:(ANTLRCommonTree *)theTree;
-
-- (id) LT:(NSInteger)k;
-- (id) getTreeSource;
-- (id<ANTLRTreeAdaptor>) getTreeAdaptor;
-- (id<ANTLRTokenStream>) getTokenStream; 
-- (void) setUniqueNavigationNodes:(BOOL)flag;
-
-- (id) getNode:(NSInteger) idx;
-
-- (NSString *) toStringFromNode:(id)startNode ToNode:(id)stopNode;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTreeParser.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTreeParser.h
deleted file mode 100755
index e2f01ee..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTreeParser.h
+++ /dev/null
@@ -1,89 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRBaseRecognizer.h"
-#import "ANTLRTreeNodeStream.h"
-#import "ANTLRCommonTreeAdaptor.h"
-#import "ANTLRMismatchedTreeNodeException.h"
-
-@interface ANTLRTreeParser : ANTLRBaseRecognizer {
-	id<ANTLRTreeNodeStream> input;
-}
-
-@property (retain, getter=getInput, setter=setInput:) id<ANTLRTreeNodeStream> input;
-
-+ (id) newANTLRTreeParser:(id<ANTLRTreeNodeStream>)anInput;
-+ (id) newANTLRTreeParser:(id<ANTLRTreeNodeStream>)anInput State:(ANTLRRecognizerSharedState *)state;
-
-- (id) initWithStream:(id<ANTLRTreeNodeStream>)theInput;
-- (id) initWithStream:(id<ANTLRTreeNodeStream>)theInput
-                State:(ANTLRRecognizerSharedState *)state;
-
-
-- (id<ANTLRTreeNodeStream>)getInput;
-- (void) setInput:(id<ANTLRTreeNodeStream>)anInput;
-
-- (void) setTreeNodeStream:(id<ANTLRTreeNodeStream>) anInput;
-- (id<ANTLRTreeNodeStream>) getTreeNodeStream;
-
-- (NSString *)getSourceName;
-
-- (id) getCurrentInputSymbol:(id<ANTLRIntStream>) anInput;
-
-- (id) getMissingSymbol:(id<ANTLRIntStream>)input
-              Exception:(ANTLRRecognitionException *) e
-          ExpectedToken:(NSInteger) expectedTokenType
-                 BitSet:(ANTLRBitSet *)follow;
-
-/** Match '.' in tree parser has special meaning.  Skip node or
- *  entire tree if node has children.  If children, scan until
- *  corresponding UP node.
- */
-- (void) matchAny:(id<ANTLRIntStream>)ignore;
-
-/** We have DOWN/UP nodes in the stream that have no line info; override.
- *  plus we want to alter the exception type.  Don't try to recover
- *  from tree parser errors inline...
- */
-- (id) recoverFromMismatchedToken:(id<ANTLRIntStream>)anInput
-                             Type:(NSInteger)ttype
-                           Follow:(ANTLRBitSet *)follow;
-
-/** Prefix error message with the grammar name because message is
- *  always intended for the programmer because the parser built
- *  the input tree not the user.
- */
-- (NSString *)getErrorHeader:(ANTLRRecognitionException *)e;
-
-- (NSString *)getErrorMessage:(ANTLRRecognitionException *)e TokenNames:(NSArray *) tokenNames;
-
-- (void) traceIn:(NSString *)ruleName Index:(NSInteger)ruleIndex;
-- (void) traceOut:(NSString *)ruleName Index:(NSInteger)ruleIndex;
-
-
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTreePatternLexer.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTreePatternLexer.h
deleted file mode 100644
index f6059d3..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTreePatternLexer.h
+++ /dev/null
@@ -1,87 +0,0 @@
-//
-//  ANTLRTreePatternLexer.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/18/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-
-typedef enum {
-	ANTLRLexerTokenTypeEOF = -1,
-	ANTLRLexerTokenTypeInvalid,
-	ANTLRLexerTokenTypeBEGIN,
-	ANTLRLexerTokenTypeEND,
-	ANTLRLexerTokenTypeID,
-	ANTLRLexerTokenTypeARG,
-	ANTLRLexerTokenTypePERCENT,
-	ANTLRLexerTokenTypeCOLON,
-	ANTLRLexerTokenTypeDOT,
-} ANTLRLexerTokenType;
-
-
-@interface ANTLRTreePatternLexer : NSObject {
-
-/** The tree pattern to lex like "(A B C)" */
-NSString *pattern;
-    
-/** Index into input string */
-NSInteger p;
-    
-/** Current char */
-NSInteger c;
-    
-/** How long is the pattern in char? */
-NSInteger n;
-    
-/** Set when token type is ID or ARG (name mimics Java's StreamTokenizer) */
-NSMutableData *sval;
-char *data;
-    
-BOOL error;
-
-}
-
-@property (retain, getter=getPattern, setter=setPattern:) NSString *pattern;
-@property (getter=getP, setter=setP:) NSInteger p;
-@property (getter=getC, setter=setC:) NSInteger c;
-@property (getter=getN, setter=setN:) NSInteger n;
-@property (retain, getter=getSval, setter=setSval:) NSMutableData *sval;
-@property (assign, getter=getData, setter=setData:) char *data;
-@property (getter=getError, setter=setError) BOOL error;
-
-+ (ANTLRTreePatternLexer *)newANTLRTreePatternLexer:(NSString *)aPattern;
-- (id) init;
-- (id) initWithPattern:(NSString *)aPattern;
-- (NSInteger) nextToken;
-- (void) consume;
-- (NSString *)toString;
-
-- (NSMutableData *)getSval;
-- (void) setSval:(NSMutableData *)aSval;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTreePatternParser.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTreePatternParser.h
deleted file mode 100644
index f6d6dc6..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTreePatternParser.h
+++ /dev/null
@@ -1,57 +0,0 @@
-//
-//  ANTLRTreePatternParser.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/18/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTreePatternLexer.h"
-#import "ANTLRTreeWizard.h"
-#import "ANTLRTreeAdaptor.h"
-
-@interface ANTLRTreePatternParser : NSObject {
-
-ANTLRTreePatternLexer *tokenizer;
-NSInteger ttype;
-ANTLRTreeWizard *wizard;
-id<ANTLRTreeAdaptor> adaptor;
-    
-}
-
-+ (ANTLRTreePatternParser *)newANTLRTreePatternParser:(ANTLRTreePatternLexer *)aTokenizer
-                                               Wizard:(ANTLRTreeWizard *)aWizard
-                                              Adaptor:(id<ANTLRTreeAdaptor>)anAdaptor;
-- (id) init;
-- (id) initWithTokenizer:(ANTLRTreePatternLexer *)tokenizer
-                  Wizard:(ANTLRTreeWizard *)aWizard
-                 Adaptor:(id<ANTLRTreeAdaptor>)anAdaptor;
-- (id<ANTLRTree>) pattern;
-- (id<ANTLRTree>) parseTree;
-- (id<ANTLRTree>) parseNode;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTreeRewriter.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTreeRewriter.h
deleted file mode 100644
index aee873e..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTreeRewriter.h
+++ /dev/null
@@ -1,72 +0,0 @@
-//
-//  ANTLRTreeRewriter.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/17/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTreeParser.h"
-
-@interface ANTLRfptr : NSObject {
-    id  actor;
-    SEL ruleSEL;
-}
-
-+ (ANTLRfptr *)newANTLRfptrWithRule:(SEL)aRuleAction withObject:(id)anObject;
--initWithRule:(SEL)ruleAction withObject:(id)anObject;
-
-- (id)rule;
-
-@end
-
-@interface ANTLRTreeRewriter : ANTLRTreeParser {
-    BOOL showTransformations;
-    id<ANTLRTokenStream> originalTokenStream;
-    id<ANTLRTreeAdaptor> originalAdaptor;
-    ANTLRfptr *rule;
-    ANTLRfptr *topdown_fptr;
-    ANTLRfptr *bottomup_ftpr;
-}
-
-+ (ANTLRTreeRewriter *) newANTLRTreeRewriter:(id<ANTLRTreeNodeStream>)anInput;
-+ (ANTLRTreeRewriter *) newANTLRTreeRewriter:(id<ANTLRTreeNodeStream>)anInput State:(ANTLRRecognizerSharedState *)aState;
-- (id)initWithStream:(id<ANTLRTreeNodeStream>)anInput;
-- (id)initWithStream:(id<ANTLRTreeNodeStream>)anInput State:(ANTLRRecognizerSharedState *)aState;
-- (ANTLRTreeRewriter *) applyOnce:(id<ANTLRTree>)t Rule:(ANTLRfptr *)whichRule;
-- (ANTLRTreeRewriter *) applyRepeatedly:(id<ANTLRTree>)t Rule:(ANTLRfptr *)whichRule;
-- (ANTLRTreeRewriter *) downup:(id<ANTLRTree>)t;
-- (ANTLRTreeRewriter *) pre:(id<ANTLRTree>)t;
-- (ANTLRTreeRewriter *) post:(id<ANTLRTree>)t;
-- (ANTLRTreeRewriter *) downup:(id<ANTLRTree>)t XForm:(BOOL)aShowTransformations;
-- (void)reportTransformation:(id<ANTLRTree>)oldTree Tree:(id<ANTLRTree>)newTree;
-- (ANTLRTreeRewriter *) topdown_fptr;
-- (ANTLRTreeRewriter *) bottomup_ftpr;
-- (ANTLRTreeRewriter *) topdown;
-- (ANTLRTreeRewriter *) bottomup;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTreeRuleReturnScope.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTreeRuleReturnScope.h
deleted file mode 100644
index ea8a487..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTreeRuleReturnScope.h
+++ /dev/null
@@ -1,49 +0,0 @@
-//
-//  ANTLRTreeRuleReturnScope.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/17/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRuleReturnScope.h"
-#import "ANTLRCommonTree.h"
-
-@interface ANTLRTreeRuleReturnScope : ANTLRRuleReturnScope {
-    ANTLRCommonTree *startNode;
-}
-
-@property (retain, getter=getStart, setter=setStart:) ANTLRCommonTree *startNode;
-
-/** First node or root node of tree matched for this rule. */
-
-- (ANTLRCommonTree *)getStart;
-- (void)setStart:(ANTLRCommonTree *)aStartNode;
-
-- (id) copyWithZone:(NSZone *)theZone;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTreeVisitor.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTreeVisitor.h
deleted file mode 100644
index 1f167bb..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTreeVisitor.h
+++ /dev/null
@@ -1,45 +0,0 @@
-//
-//  ANTLRTreeVisitor.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/18/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTreeAdaptor.h"
-#import "ANTLRTreeVisitorAction.h"
-
-@interface ANTLRTreeVisitor : NSObject {
-   id<ANTLRTreeAdaptor> adaptor;
-}
-+ (ANTLRTreeVisitor *)newANTLRTreeVisitor:(id<ANTLRTreeAdaptor>) anAdaptor;
-+ (ANTLRTreeVisitor *)newANTLRTreeVisitor;
-- (id)init;
-- (id)initWithAdaptor:(id<ANTLRTreeAdaptor>)anAdaptor;
-- (ANTLRTreeVisitor *)visit:(id<ANTLRTree>)t Action:(ANTLRTreeVisitorAction *)action;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTreeVisitorAction.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTreeVisitorAction.h
deleted file mode 100644
index c9c0856..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTreeVisitorAction.h
+++ /dev/null
@@ -1,56 +0,0 @@
-//
-//  ANTLRTreeVisitorAction.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/18/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-
-
-@interface ANTLRTreeVisitorAction : NSObject
-{
-
-}
-
-+ (ANTLRTreeVisitorAction *)newANTLRTreeVisitorAction;
-- (id) init;
-
-/** Execute an action before visiting children of t.  Return t or
- *  a rewritten t.  It is up to the visitor to decide what to do
- *  with the return value.  Children of returned value will be
- *  visited if using TreeVisitor.visit().
- */
-- (ANTLRTreeVisitorAction *)pre:(ANTLRTreeVisitorAction *) t;
-
-/** Execute an action after visiting children of t.  Return t or
- *  a rewritten t.  It is up to the visitor to decide what to do
- *  with the return value.
- */
-- (ANTLRTreeVisitorAction *)post:(ANTLRTreeVisitorAction *) t;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTreeWizard.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTreeWizard.h
deleted file mode 100644
index d952572..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRTreeWizard.h
+++ /dev/null
@@ -1,134 +0,0 @@
-//
-//  ANTLRTreeWizard.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/18/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRCommonTreeAdaptor.h"
-#import "ANTLRCommonTree.h"
-#import "ANTLRMapElement.h"
-#import "ANTLRMap.h"
-
-@class ANTLRVisitor;
-
-@protocol ANTLRContextVisitor <NSObject>
-// TODO: should this be called visit or something else?
-- (void) visit:(id<ANTLRTree>)t Parent:(id<ANTLRTree>)parent ChildIndex:(NSInteger)childIndex Map:(ANTLRMap *)labels;
-
-@end
-
-@interface ANTLRVisitor : NSObject <ANTLRContextVisitor> {
-    NSInteger action;
-    id actor;
-    id object1;
-    id object2;
-}
-+ (ANTLRVisitor *)newANTLRVisitor:(NSInteger)anAction Actor:(id)anActor Object:(id)anObject1 Object:(id)anObject2;
-- (id) initWithAction:(NSInteger)anAction Actor:(id)anActor Object:(id)anObject1 Object:(id)anObject2;
-
-- (void) visit:(id<ANTLRTree>)t;
-- (void) visit:(id<ANTLRTree>)t Parent:(id<ANTLRTree>)parent ChildIndex:(NSInteger)childIndex Map:(ANTLRMap *)labels;
-
-@end
-
-/** When using %label:TOKENNAME in a tree for parse(), we must
- *  track the label.
- */
-@interface ANTLRTreePattern : ANTLRCommonTree {
-    NSString *label;
-    BOOL      hasTextArg;
-}
-@property (retain, getter=getLabel, setter=setLabel:) NSString *label;
-@property (assign, getter=getHasTextArg, setter=setHasTextArg:) BOOL hasTextArg;
-
-+ (ANTLRTreePattern *)newANTLRTreePattern:(id<ANTLRToken>)payload;
-
-- (id) initWithToken:(id<ANTLRToken>)payload;
-- (NSString *)toString;
-@end
-
-@interface ANTLRWildcardTreePattern : ANTLRTreePattern {
-}
-
-+ (ANTLRWildcardTreePattern *)newANTLRWildcardTreePattern:(id<ANTLRToken>)payload;
-- (id) initWithToken:(id<ANTLRToken>)payload;
-@end
-
-/** This adaptor creates TreePattern objects for use during scan() */
-@interface ANTLRTreePatternTreeAdaptor : ANTLRCommonTreeAdaptor {
-}
-+ (ANTLRTreePatternTreeAdaptor *)newTreeAdaptor;
-#ifdef DONTUSENOMO
-+ (ANTLRTreePatternTreeAdaptor *)newTreeAdaptor:(id<ANTLRToken>)payload;
-#endif
-- (id) init;
-#ifdef DONTUSENOMO
-- initWithToken:(id<ANTLRToken>)payload;
-#endif
-- (id<ANTLRTree>)createTreePattern:(id<ANTLRToken>)payload;
-
-@end
-
-@interface ANTLRTreeWizard : NSObject {
-	id<ANTLRTreeAdaptor> adaptor;
-	ANTLRMap *tokenNameToTypeMap;
-}
-+ (ANTLRTreeWizard *) newANTLRTreeWizard:(id<ANTLRTreeAdaptor>)anAdaptor;
-+ (ANTLRTreeWizard *)newANTLRTreeWizard:(id<ANTLRTreeAdaptor>)adaptor Map:(ANTLRMap *)aTokenNameToTypeMap;
-+ (ANTLRTreeWizard *)newANTLRTreeWizard:(id<ANTLRTreeAdaptor>)adaptor TokenNames:(NSArray *)theTokNams;
-+ (ANTLRTreeWizard *)newANTLRTreeWizardWithTokenNames:(NSArray *)theTokNams;
-- (id) init;
-- (id) initWithAdaptor:(id<ANTLRTreeAdaptor>)adaptor;
-- (id) initWithAdaptor:(id<ANTLRTreeAdaptor>)adaptor Map:(ANTLRMap *)tokenNameToTypeMap;
-- (id) initWithTokenNames:(NSArray *)theTokNams;
-- (id) initWithTokenNames:(id<ANTLRTreeAdaptor>)anAdaptor TokenNames:(NSArray *)theTokNams;
-- (ANTLRMap *)computeTokenTypes:(NSArray *)theTokNams;
-- (NSInteger)getTokenType:(NSString *)tokenName;
-- (ANTLRMap *)index:(id<ANTLRTree>)t;
-- (void) _index:(id<ANTLRTree>)t Map:(ANTLRMap *)m;
-- (NSMutableArray *)find:(id<ANTLRTree>) t Pattern:(NSString *)pattern;
-- (ANTLRTreeWizard *)findFirst:(id<ANTLRTree>) t Type:(NSInteger)ttype;
-- (ANTLRTreeWizard *)findFirst:(id<ANTLRTree>) t Pattern:(NSString *)pattern;
-- (void) visit:(id<ANTLRTree>)t Type:(NSInteger)ttype Visitor:(ANTLRVisitor *)visitor;
-- (void) _visit:(id<ANTLRTree>)t
-         Parent:(id<ANTLRTree>)parent
-     ChildIndex:(NSInteger)childIndex
-           Type:(NSInteger)ttype
-        Visitor:(ANTLRVisitor *)visitor;
-- (void)visit:(id<ANTLRTree>)t Pattern:(NSString *)pattern Visitor:(ANTLRVisitor *)visitor;
-- (BOOL)parse:(id<ANTLRTree>)t Pattern:(NSString *)pattern Map:(ANTLRMap *)labels;
-- (BOOL) parse:(id<ANTLRTree>) t Pattern:(NSString *)pattern;
-- (BOOL) _parse:(id<ANTLRTree>)t1 Pattern:(ANTLRTreePattern *)tpattern Map:(ANTLRMap *)labels;
-- (id<ANTLRTree>) createTree:(NSString *)pattern;
-- (BOOL)equals:(id)t1 O2:(id)t2 Adaptor:(id<ANTLRTreeAdaptor>)anAdaptor;
-- (BOOL)equals:(id)t1 O2:(id)t2;
-- (BOOL) _equals:(id)t1 O2:(id)t2 Adaptor:(id<ANTLRTreeAdaptor>)anAdaptor;
-
-@end
-
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRUnbufferedCommonTreeNodeStreamState.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRUnbufferedCommonTreeNodeStreamState.h
deleted file mode 100755
index 9e79d86..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRUnbufferedCommonTreeNodeStreamState.h
+++ /dev/null
@@ -1,66 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRCommonTree.h"
-
-@interface ANTLRUnbufferedCommonTreeNodeStreamState : NSObject {
-	ANTLRCommonTree *currentNode;
-	ANTLRCommonTree *previousNode;
-
-	int currentChildIndex;
-	int absoluteNodeIndex;
-	unsigned int nodeStackSize;
-	unsigned int indexStackSize;
-	
-	NSMutableArray *lookahead;
-}
-
-- (ANTLRCommonTree *) currentNode;
-- (void) setCurrentNode: (ANTLRCommonTree *) aCurrentNode;
-
-- (ANTLRCommonTree *) previousNode;
-- (void) setPreviousNode: (ANTLRCommonTree *) aPreviousNode;
-
-- (NSInteger) currentChildIndex;
-- (void) setCurrentChildIndex: (NSInteger) aCurrentChildIndex;
-
-- (NSInteger) absoluteNodeIndex;
-- (void) setAbsoluteNodeIndex: (NSInteger) anAbsoluteNodeIndex;
-
-- (NSUInteger) nodeStackSize;
-- (void) setNodeStackSize: (NSUInteger) aNodeStackSize;
-
-- (NSUInteger) indexStackSize;
-- (void) setIndexStackSize: (NSUInteger) anIndexStackSize;
-
-- (NSMutableArray *) lookahead;
-- (void) setLookahead: (NSMutableArray *) aLookahead;
-
-- (void) addToLookahead: (id)lookaheadObject;
-- (void) removeFromLookahead: (id)lookaheadObject;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRUnbufferedTokenStream.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRUnbufferedTokenStream.h
deleted file mode 100644
index e4f8630..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRUnbufferedTokenStream.h
+++ /dev/null
@@ -1,62 +0,0 @@
-//
-//  ANTLRUnbufferedTokenStream.h
-//  ANTLR
-//
-//  Created by Alan Condit on 7/12/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRuntimeException.h"
-#import "ANTLRTokenSource.h"
-#import "ANTLRLookaheadStream.h"
-#import "ANTLRToken.h"
-
-@interface ANTLRUnbufferedTokenStream : ANTLRLookaheadStream {
-	id<ANTLRTokenSource> tokenSource;
-    NSInteger tokenIndex; // simple counter to set token index in tokens
-    NSInteger channel;
-}
-
-@property (retain, getter=getTokenSource, setter=setTokenSource:) id<ANTLRTokenSource> tokenSource;
-@property (getter=getTokenIndex, setter=setTokenIndex) NSInteger tokenIndex;
-@property (getter=getChannel, setter=setChannel:) NSInteger channel;
-
-+ (ANTLRUnbufferedTokenStream *)newANTLRUnbufferedTokenStream:(id<ANTLRTokenSource>)aTokenSource;
-- (id) init;
-- (id) initWithTokenSource:(id<ANTLRTokenSource>)aTokenSource;
-
-- (id<ANTLRToken>)nextElement;
-- (BOOL)isEOF:(id<ANTLRToken>) aToken;
-- (id<ANTLRTokenSource>)getTokenSource;
-- (NSString *)toStringFromStart:(NSInteger)aStart ToEnd:(NSInteger)aStop;
-- (NSString *)toStringFromToken:(id<ANTLRToken>)aStart ToEnd:(id<ANTLRToken>)aStop;
-- (NSInteger)LA:(NSInteger)anIdx;
-- (id<ANTLRToken>)objectAtIndex:(NSInteger)anIdx;
-- (NSString *)getSourceName;
-
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRUniqueIDMap.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRUniqueIDMap.h
deleted file mode 100644
index a805bd5..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRUniqueIDMap.h
+++ /dev/null
@@ -1,64 +0,0 @@
-//
-//  ANTLRUniqueIDMap.h
-//  ANTLR
-//
-//  Created by Alan Condit on 7/7/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRPtrBuffer.h"
-#import "ANTLRNodeMapElement.h"
-
-#define SUCCESS             0
-#define FAILURE             -1
-#define HASHSIZE            101
-#define HBUFSIZE            0x2000
-
-@interface ANTLRUniqueIDMap : ANTLRPtrBuffer {
-    NSInteger lastHash;
-}
-
-@property (getter=getLastHash, setter=setLastHash) NSInteger lastHash;
-
-+ (id)newANTLRUniqueIDMap;
-+ (id)newANTLRUniqueIDMapWithLen:(NSInteger)aHashSize;
-
-- (id)init;
-- (id)initWithLen:(NSInteger)cnt;
-- (void)dealloc;
-// Instance Methods
-- (NSInteger)count;
-- (NSInteger)size;
-/* clear -- reinitialize the maplist array */
-- (void) clear;
-
-- (void)deleteANTLRUniqueIDMap:(ANTLRNodeMapElement *)np;
-- (void)delete_chain:(ANTLRNodeMapElement *)np;
-- (id)getNode:(id<ANTLRTree>)aNode;
-- (void)putID:(id)anID Node:(id<ANTLRTree>)aNode;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRUnwantedTokenException.h b/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRUnwantedTokenException.h
deleted file mode 100644
index 2945bfe..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Headers/ANTLRUnwantedTokenException.h
+++ /dev/null
@@ -1,47 +0,0 @@
-//
-//  ANTLRUnwantedTokenException.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/8/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRMismatchedTokenException.h"
-
-@interface ANTLRUnwantedTokenException : ANTLRMismatchedTokenException {
-
-}
-+ (ANTLRUnwantedTokenException *)newANTLRUnwantedTokenException;
-+ (ANTLRUnwantedTokenException *)newANTLRUnwantedTokenException:(NSInteger)expected Stream:(id<ANTLRIntStream>)anInput;
-
-- (id) init;
-- (id) initWithStream:(id<ANTLRIntStream>)anInput And:(NSInteger)expected;
-- (id<ANTLRToken>)getUnexpectedToken;
-- (NSString *)toString;
-                     
-    
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Resources/English.lproj/InfoPlist.strings b/runtime/ObjC/ANTLR.framework/Versions/A/Resources/English.lproj/InfoPlist.strings
deleted file mode 100644
index fa1b75f..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Resources/English.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/ANTLR.framework/Versions/A/Resources/Info.plist b/runtime/ObjC/ANTLR.framework/Versions/A/Resources/Info.plist
deleted file mode 100644
index 24436a3..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/A/Resources/Info.plist
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>CFBundleDevelopmentRegion</key>
-	<string>English</string>
-	<key>CFBundleExecutable</key>
-	<string>ANTLR</string>
-	<key>CFBundleIdentifier</key>
-	<string>org.antlr.antlrframework</string>
-	<key>CFBundleInfoDictionaryVersion</key>
-	<string>6.0</string>
-	<key>CFBundleName</key>
-	<string>ANTLR</string>
-	<key>CFBundlePackageType</key>
-	<string>FMWK</string>
-	<key>CFBundleSignature</key>
-	<string>????</string>
-	<key>CFBundleVersion</key>
-	<string>1.0</string>
-</dict>
-</plist>
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current b/runtime/ObjC/ANTLR.framework/Versions/Current
new file mode 100755
index 0000000..8c7e5a6
--- /dev/null
+++ b/runtime/ObjC/ANTLR.framework/Versions/Current
@@ -0,0 +1 @@
+A
\ No newline at end of file
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/ANTLR b/runtime/ObjC/ANTLR.framework/Versions/Current/ANTLR
deleted file mode 100755
index 67c1d3a..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/ANTLR
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLR.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLR.h
deleted file mode 100755
index 671e783..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLR.h
+++ /dev/null
@@ -1,60 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-
-#import <ANTLR/ANTLRBitSet.h>
-#import <ANTLR/ANTLRBaseRecognizer.h>
-#import <ANTLR/ANTLRLexer.h>
-#import <ANTLR/ANTLRParser.h>
-#import <ANTLR/ANTLRTreeParser.h>
-#import <ANTLR/ANTLRDFA.h>
-#import <ANTLR/ANTLRStringStream.h>
-#import <ANTLR/ANTLRTokenSource.h>
-#import <ANTLR/ANTLRCommonTokenStream.h>
-
-#import <ANTLR/ANTLRRecognitionException.h>
-#import <ANTLR/ANTLREarlyExitException.h>
-#import <ANTLR/ANTLRMismatchedSetException.h>
-#import <ANTLR/ANTLRMismatchedTokenException.h>
-#import <ANTLR/ANTLRMismatchedRangeException.h>
-#import <ANTLR/ANTLRMismatchedTreeNodeException.h>
-#import <ANTLR/ANTLRNoViableAltException.h>
-#import <ANTLR/ANTLRFailedPredicateException.h>
-#import <ANTLR/ANTLRTreeException.h>
-
-#import <ANTLR/ANTLRParserRuleReturnScope.h>
-#import <ANTLR/ANTLRTreeRuleReturnScope.h>
-
-#import <ANTLR/ANTLRTree.h>
-#import <ANTLR/ANTLRCommonTree.h>
-#import <ANTLR/ANTLRTreeAdaptor.h>
-#import <ANTLR/ANTLRCommonTreeAdaptor.h>
-#import <ANTLR/ANTLRTreeNodeStream.h>
-#import <ANTLR/ANTLRUnbufferedCommonTreeNodeStream.h>
-#import <ANTLR/ANTLRUnbufferedCommonTreeNodeStreamState.h>
-
-#import <ANTLR/ANTLRRewriteRuleSubtreeStream.h>
-#import <ANTLR/ANTLRRewriteRuleTokenStream.h>
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRBaseMapElement.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRBaseMapElement.h
deleted file mode 100644
index b9100ac..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRBaseMapElement.h
+++ /dev/null
@@ -1,54 +0,0 @@
-//
-//  ANTLRBaseMapElement.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/16/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRLinkBase.h"
-
-@interface ANTLRBaseMapElement : ANTLRLinkBase {
-    NSNumber *index;
-}
-
-@property (retain, getter=getIndex, setter=setIndex:) NSNumber *index;
-
-+ (id) newANTLRBaseMapElement;
-+ (id) newANTLRBaseMapElementWithIndex:(NSNumber *)anIdx;
-- (id) init;
-- (id) initWithAnIndex:(NSNumber *)anIdx;
-
-- (id) copyWithZone:(NSZone *)aZone;
-
-- (NSNumber *)getIndex;
-- (void)setIndex:(NSNumber *)anIdx;
-
-- (NSInteger)count;
-- (NSInteger)size;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRBaseRecognizer.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRBaseRecognizer.h
deleted file mode 100755
index 1a922bd..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRBaseRecognizer.h
+++ /dev/null
@@ -1,183 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-#import <Foundation/Foundation.h>
-
-#import "ANTLRIntStream.h"
-
-// This is an abstract superclass for lexers and parsers.
-
-#define ANTLR_MEMO_RULE_FAILED -2
-#define ANTLR_MEMO_RULE_UNKNOWN -1
-#define ANTLR_INITIAL_FOLLOW_STACK_SIZE 100
-
-#import "ANTLRMapElement.h"
-#import "ANTLRBitSet.h"
-#import "ANTLRToken.h"
-#import "ANTLRRecognizerSharedState.h"
-#import "ANTLRRecognitionException.h"
-#import "ANTLRMissingTokenException.h"
-#import "ANTLRMismatchedTokenException.h"
-#import "ANTLRMismatchedTreeNodeException.h"
-#import "ANTLRUnwantedTokenException.h"
-#import "ANTLRNoViableAltException.h"
-#import "ANTLREarlyExitException.h"
-#import "ANTLRMismatchedSetException.h"
-#import "ANTLRMismatchedNotSetException.h"
-#import "ANTLRFailedPredicateException.h"
-
-@interface ANTLRBaseRecognizer : NSObject {
-	ANTLRRecognizerSharedState *state;	// the state of this recognizer. Might be shared with other recognizers, e.g. in grammar import scenarios.
-	NSString *grammarFileName;			// where did the grammar come from. filled in by codegeneration
-//    BOOL failed;
-    NSString *sourceName;
-//    NSInteger numberOfSyntaxErrors;
-    NSArray *tokenNames;
-}
-
-@property (retain, getter=getState, setter=setState) ANTLRRecognizerSharedState *state;
-@property (retain, getter=getGrammarFileName, setter=setGrammarFileName) NSString *grammarFileName;
-//@property (assign, getter=getFailed, setter=setFailed) BOOL failed;
-@property (retain, getter=getTokenNames, setter=setTokenNames) NSArray *tokenNames;
-@property (retain, getter=getSourceName, setter=setSourceName) NSString *sourceName;
-//@property (assign, getter=getNumberOfSyntaxErrors, setter=setNumberOfSyntaxErrors) NSInteger numberOfSyntaxErrors;
-
-+ (void) initialize;
-
-+ (ANTLRBaseRecognizer *) newANTLRBaseRecognizer;
-+ (ANTLRBaseRecognizer *) newANTLRBaseRecognizerWithRuleLen:(NSInteger)aLen;
-+ (ANTLRBaseRecognizer *) newANTLRBaseRecognizer:(ANTLRRecognizerSharedState *)aState;
-
-+ (NSArray *)getTokenNames;
-+ (void)setTokenNames:(NSArray *)aTokNamArray;
-+ (void)setGrammarFileName:(NSString *)aFileName;
-
-- (id) init;
-- (id) initWithLen:(NSInteger)aLen;
-- (id) initWithState:(ANTLRRecognizerSharedState *)aState;
-
-- (void) dealloc;
-
-// simple accessors
-- (NSInteger) getBacktrackingLevel;
-- (void) setBacktrackingLevel:(NSInteger) level;
-
-- (BOOL) getFailed;
-- (void) setFailed: (BOOL) flag;
-
-- (ANTLRRecognizerSharedState *) getState;
-- (void) setState:(ANTLRRecognizerSharedState *) theState;
-
-// reset this recognizer - might be extended by codegeneration/grammar
-- (void) reset;
-
-/** Match needs to return the current input symbol, which gets put
- *  into the label for the associated token ref; e.g., x=ID.  Token
- *  and tree parsers need to return different objects. Rather than test
- *  for input stream type or change the IntStream interface, I use
- *  a simple method to ask the recognizer to tell me what the current
- *  input symbol is.
- * 
- *  This is ignored for lexers.
- */
-- (id) getInput;
-
-- (void)skip;
-
-// do actual matching of tokens/characters
-- (id) match:(id<ANTLRIntStream>)anInput TokenType:(NSInteger)ttype Follow:(ANTLRBitSet *)follow;
-- (void) matchAny:(id<ANTLRIntStream>)anInput;
-- (BOOL) mismatchIsUnwantedToken:(id<ANTLRIntStream>)anInput TokenType:(NSInteger) ttype;
-- (BOOL) mismatchIsMissingToken:(id<ANTLRIntStream>)anInput Follow:(ANTLRBitSet *)follow;
-
-// error reporting and recovery
-- (void) reportError:(ANTLRRecognitionException *)e;
-- (void) displayRecognitionError:(NSArray *)theTokNams Exception:(ANTLRRecognitionException *)e;
-- (NSString *)getErrorMessage:(ANTLRRecognitionException *)e TokenNames:(NSArray *)theTokNams;
-- (NSInteger) getNumberOfSyntaxErrors;
-- (NSString *)getErrorHeader:(ANTLRRecognitionException *)e;
-- (NSString *)getTokenErrorDisplay:(id<ANTLRToken>)t;
-- (void) emitErrorMessage:(NSString *)msg;
-- (void) recover:(id<ANTLRIntStream>)anInput Exception:(ANTLRRecognitionException *)e;
-
-// begin hooks for debugger
-- (void) beginResync;
-- (void) endResync;
-// end hooks for debugger
-
-// compute the bitsets necessary to do matching and recovery
-- (ANTLRBitSet *)computeErrorRecoverySet;
-- (ANTLRBitSet *)computeContextSensitiveRuleFOLLOW;
-- (ANTLRBitSet *)combineFollows:(BOOL) exact;
-
-- (id<ANTLRToken>) recoverFromMismatchedToken:(id<ANTLRIntStream>)anInput 
-                                    TokenType:(NSInteger)ttype 
-                                       Follow:(ANTLRBitSet *)follow;
-                                    
-- (id<ANTLRToken>)recoverFromMismatchedSet:(id<ANTLRIntStream>)anInput
-                                    Exception:(ANTLRRecognitionException *)e
-                                    Follow:(ANTLRBitSet *)follow;
-
-- (id) getCurrentInputSymbol:(id<ANTLRIntStream>)anInput;
-- (id) getMissingSymbol:(id<ANTLRIntStream>)anInput
-              Exception:(ANTLRRecognitionException *)e
-              TokenType:(NSInteger) expectedTokenType
-                Follow:(ANTLRBitSet *)follow;
-
-// helper methods for recovery. try to resync somewhere
-- (void) consumeUntilTType:(id<ANTLRIntStream>)anInput TokenType:(NSInteger)ttype;
-- (void) consumeUntilFollow:(id<ANTLRIntStream>)anInput Follow:(ANTLRBitSet *)bitSet;
-- (void) pushFollow:(ANTLRBitSet *)fset;
-- (ANTLRBitSet *)popFollow;
-
-// to be used by the debugger to do reporting. maybe hook in incremental stuff here, too.
-- (NSMutableArray *) getRuleInvocationStack;
-- (NSMutableArray *) getRuleInvocationStack:(ANTLRRecognitionException *)exception
-					             Recognizer:(NSString *)recognizerClassName;
-
-- (NSArray *) getTokenNames;
-- (NSString *)getGrammarFileName;
-- (NSString *)getSourceName;
-- (NSMutableArray *) toStrings:(NSArray *)tokens;
-// support for memoization
-- (NSInteger) getRuleMemoization:(NSInteger)ruleIndex StartIndex:(NSInteger)ruleStartIndex;
-- (BOOL) alreadyParsedRule:(id<ANTLRIntStream>)anInput RuleIndex:(NSInteger)ruleIndex;
-- (void) memoize:(id<ANTLRIntStream>)anInput
-	     RuleIndex:(NSInteger)ruleIndex
-	    StartIndex:(NSInteger)ruleStartIndex;
-- (NSInteger) getRuleMemoizationCacheSize;
-- (void)traceIn:(NSString *)ruleName Index:(NSInteger)ruleIndex Object:(id)inputSymbol;
-- (void)traceOut:(NSString *)ruleName Index:(NSInteger)ruleIndex Object:(id)inputSymbol;
-
-
-// support for syntactic predicates. these are called indirectly to support funky stuff in grammars,
-// like supplying selectors instead of writing code directly into the actions of the grammar.
-- (BOOL) evaluateSyntacticPredicate:(SEL)synpredFragment;
-// stream:(id<ANTLRIntStream>)anInput;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRBaseStack.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRBaseStack.h
deleted file mode 100644
index 5069031..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRBaseStack.h
+++ /dev/null
@@ -1,66 +0,0 @@
-//
-//  ANTLRBaseRecognizer.m
-//  ANTLR
-//
-//  Created by Alan Condit on 6/16/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRPtrBuffer.h"
-
-//#define GLOBAL_SCOPE       0
-//#define LOCAL_SCOPE        1
-#define HASHSIZE         101
-#define HBUFSIZE      0x2000
-
-@interface ANTLRBaseStack : ANTLRPtrBuffer {
-	//ANTLRRuleStack *fNext;
-    // TStringPool *fPool;
-    NSInteger LastHash;
-}
-
-//@property (copy) ANTLRRuleStack *fNext;
-@property (getter=getLastHash, setter=setLastHash) NSInteger LastHash;
-
-// Contruction/Destruction
-+ (ANTLRBaseStack *)newANTLRBaseStack;
-+ (ANTLRBaseStack *)newANTLRBaseStackWithLen:(NSInteger)cnt;
-- (id)init;
-- (id)initWithLen:(NSInteger)cnt;
-- (void)dealloc;
-
-// Instance Methods
-- (id) copyWithZone:(NSZone *)aZone;
-
-- (NSInteger)count;
-- (NSInteger)size;
-/* clear -- reinitialize the maplist array */
-
-- (NSInteger)getLastHash;
-- (void)setLastHash:(NSInteger)aVal;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRBaseTree.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRBaseTree.h
deleted file mode 100755
index 96513f8..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRBaseTree.h
+++ /dev/null
@@ -1,199 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import "ANTLRTree.h"
-
-@protocol ANTLRBaseTree <ANTLRTree>
-
-@property (retain, getter=getChildren, setter=setChildren) NSMutableArray *children;
-
-+ (id<ANTLRBaseTree>) newANTLRBaseTree;
-+ (id<ANTLRBaseTree>) newANTLRBaseTree:(id<ANTLRBaseTree>)node;
-
-- (id<ANTLRBaseTree>) init;
-- (id<ANTLRBaseTree>) initWith:(id<ANTLRTree>)node;
-
-- (id<ANTLRBaseTree>) getChild:(NSUInteger)i;
-- (NSMutableArray *)getChildren;
-- (void) setChildren:(NSMutableArray *)anArray;
-- (id<ANTLRBaseTree>)getFirstChildWithType:(NSInteger)type;
-- (NSUInteger) getChildCount;
-
-// Add t as a child to this node.  If t is null, do nothing.  If t
-//  is nil, add all children of t to this' children.
-
-- (void) addChild:(id<ANTLRTree>) tree;
-- (void) addChildren:(NSArray *) theChildren;
-//- (void) removeAllChildren;
-
-- (void) setChild:(NSInteger) i With:(id<ANTLRTree>)t;
-- (id) deleteChild:(NSInteger) i;
-- (NSMutableArray *) createChildrenList;
-- (void) replaceChildrenFrom:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id) t;
-// Indicates the node is a nil node but may still have children, meaning
-// the tree is a flat list.
-
-- (BOOL) isNil;
-- (NSInteger) getTokenStartIndex;
-- (void) setTokenStartIndex:(NSInteger) index;
-- (NSInteger) getTokenStopIndex;
-- (void) setTokenStopIndex:(NSInteger) index;
-
-- (void) freshenParentAndChildIndexes;
-- (void) freshenParentAndChildIndexes:(NSInteger) offset;
-- (void) sanityCheckParentAndChildIndexes;
-- (void) sanityCheckParentAndChildIndexes:(id<ANTLRTree>) parent At:(NSInteger) i;
-
-- (NSInteger) getChildIndex;
-- (void) setChildIndex:(NSInteger)i;
-
-- (id<ANTLRTree>)getAncestor:(NSInteger)ttype;
-- (NSMutableArray *)getAncestors;
-
-#pragma mark Copying
-- (id) copyWithZone:(NSZone *)aZone;	// the children themselves are not copied here!
-- (id) deepCopy;					// performs a deepCopyWithZone: with the default zone
-- (id) deepCopyWithZone:(NSZone *)aZone;
-
-#pragma mark Tree Parser support
-- (NSInteger) getType;
-- (NSString *) getText;
-// In case we don't have a token payload, what is the line for errors?
-- (NSInteger) getLine;
-- (NSInteger) getCharPositionInLine;
-
-
-#pragma mark Informational
-- (NSString *) treeDescription;
-- (NSString *) description;
-
-- (NSString *) toString;
-- (NSString *) toStringTree;
-
-@end
-
-@interface ANTLRBaseTree : NSObject <ANTLRTree>
-{
-	NSMutableArray *children;
-    NSException *anException;
-}
-
-@property (retain, getter=getChildren, setter=setChildren) NSMutableArray *children;
-
-+ (id<ANTLRBaseTree>) newANTLRBaseTree;
-+ (id<ANTLRBaseTree>) newANTLRBaseTree:(id<ANTLRBaseTree>)node;
-         
-- (id<ANTLRTree>) init;
-- (id<ANTLRBaseTree>) initWith:(id<ANTLRTree>)node;
-
-- (id<ANTLRBaseTree>) getChild:(NSUInteger)i;
-- (NSMutableArray *)getChildren;
-- (void) setChildren:(NSMutableArray *)anArray;
-- (id<ANTLRBaseTree>)getFirstChildWithType:(NSInteger)type;
-- (NSUInteger) getChildCount;
-
-//- (void) removeAllChildren;
-
-// Add t as a child to this node.  If t is null, do nothing.  If t
-//  is nil, add all children of t to this' children.
-
-- (void) addChild:(id<ANTLRTree>) tree;
-- (void) addChildren:(NSArray *) theChildren;
-
-- (void) setChild:(NSInteger) i With:(id<ANTLRTree>)t;
-- (id) deleteChild:(NSInteger) i;
-- (NSMutableArray *) createChildrenList;
-- (void) replaceChildrenFrom:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id) t;
-// Indicates the node is a nil node but may still have children, meaning
-	// the tree is a flat list.
-
-- (BOOL) isNil;
-- (NSInteger) getTokenStartIndex;
-- (void) setTokenStartIndex:(NSInteger) index;
-- (NSInteger) getTokenStopIndex;
-- (void) setTokenStopIndex:(NSInteger) index;
-
-- (void) freshenParentAndChildIndexes;
-- (void) freshenParentAndChildIndexes:(NSInteger) offset;
-- (void) sanityCheckParentAndChildIndexes;
-- (void) sanityCheckParentAndChildIndexes:(id<ANTLRTree>) parent At:(NSInteger) i;
-
-- (NSInteger) getChildIndex;
-- (void) setChildIndex:(NSInteger)i;
-
-- (BOOL) hasAncestor:(NSInteger) ttype;
-- (id<ANTLRTree>)getAncestor:(NSInteger)ttype;
-- (NSMutableArray *)getAncestors;
-
-- (id) copyWithZone:(NSZone *)aZone;
-- (id) deepCopy;					// performs a deepCopyWithZone: with the default zone
-- (id) deepCopyWithZone:(NSZone *)aZone;
-
-	// Return a token type; needed for tree parsing
-- (NSInteger) getType;
-- (NSString *) getText;
-
-	// In case we don't have a token payload, what is the line for errors?
-- (NSInteger) getLine;
-- (NSInteger) getCharPositionInLine;
-- (void) setCharPositionInLine:(NSInteger)pos;
-
-- (NSString *) treeDescription;
-- (NSString *) description;
-- (NSString *) toString;
-- (NSString *) toStringTree;
-
-@end
-
-@interface ANTLRTreeNavigationNode : ANTLRBaseTree {
-}
-- (id) copyWithZone:(NSZone *)aZone;
-@end
-
-@interface ANTLRTreeNavigationNodeDown : ANTLRTreeNavigationNode {
-}
-+ (ANTLRTreeNavigationNodeDown *) getNavigationNodeDown;
-- (NSInteger) tokenType;
-- (NSString *) description;
-@end
-
-@interface ANTLRTreeNavigationNodeUp : ANTLRTreeNavigationNode {
-}
-+ (ANTLRTreeNavigationNodeUp *) getNavigationNodeUp;
-- (NSInteger) tokenType;
-- (NSString *) description;
-@end
-
-@interface ANTLRTreeNavigationNodeEOF : ANTLRTreeNavigationNode {
-}
-+ (ANTLRTreeNavigationNodeEOF *) getNavigationNodeEOF;
-- (NSInteger) tokenType;
-- (NSString *) description;
-@end
-
-extern ANTLRTreeNavigationNodeDown *navigationNodeDown;
-extern ANTLRTreeNavigationNodeUp *navigationNodeUp;
-extern ANTLRTreeNavigationNodeEOF *navigationNodeEOF;
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRBaseTreeAdaptor.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRBaseTreeAdaptor.h
deleted file mode 100644
index b4f8dad..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRBaseTreeAdaptor.h
+++ /dev/null
@@ -1,163 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTreeAdaptor.h"
-#import "ANTLRCommonErrorNode.h"
-#import "ANTLRUniqueIDMap.h"
-
-@interface ANTLRBaseTreeAdaptor : NSObject <ANTLRTreeAdaptor, NSCopying> {
-    ANTLRUniqueIDMap *treeToUniqueIDMap;
-	NSInteger uniqueNodeID;
-}
-
-@property (retain, getter=getTreeToUniqueIDMap, setter=setTreeToUniqueIDMap:) ANTLRUniqueIDMap *treeToUniqueIDMap;
-@property (getter=getUniqueNodeID, setter=setUniqueNodeID:) NSInteger uniqueNodeID;
-
-+ (id<ANTLRTreeAdaptor>) newEmptyTree;
-
-- (id) init;
-
-- (id) copyWithZone:(NSZone *)aZone;
-
-- (id) emptyNode;
-
-- (ANTLRUniqueIDMap *)getTreeToUniqueIDMap;
-- (void) setTreeToUniqueIDMap:(ANTLRUniqueIDMap *)aMapNode;
-
-- (NSInteger)getUniqueID;
-- (void) setUniqueNodeID:(NSInteger)aUniqueNodeID;
-
-/** create tree node that holds the start and stop tokens associated
- *  with an error.
- *
- *  If you specify your own kind of tree nodes, you will likely have to
- *  override this method. CommonTree returns Token.INVALID_TOKEN_TYPE
- *  if no token payload but you might have to set token type for diff
- *  node type.
- *
- *  You don't have to subclass CommonErrorNode; you will likely need to
- *  subclass your own tree node class to avoid class cast exception.
- */
-- (id) errorNode:(id<ANTLRTokenStream>)anInput
-            From:(id<ANTLRToken>)startToken
-              To:(id<ANTLRToken>)stopToken
-       Exception:(NSException *) e;
-
-- (BOOL) isNil:(id<ANTLRTree>) aTree;
-
-- (id<ANTLRTree>)dupTree:(id<ANTLRTree>)aTree;
-/** This is generic in the sense that it will work with any kind of
- *  tree (not just Tree interface).  It invokes the adaptor routines
- *  not the tree node routines to do the construction.  
- */
-- (id<ANTLRTree>)dupTree:(id<ANTLRTree>)aTree Parent:(id<ANTLRTree>)parent;
-- (id<ANTLRTree>)dupNode:(id<ANTLRTree>)aNode;
-/** Add a child to the tree t.  If child is a flat tree (a list), make all
- *  in list children of t.  Warning: if t has no children, but child does
- *  and child isNil then you can decide it is ok to move children to t via
- *  t.children = child.children; i.e., without copying the array.  Just
- *  make sure that this is consistent with have the user will build
- *  ASTs.
- */
-- (void) addChild:(id<ANTLRTree>)aChild toTree:(id<ANTLRTree>)aTree;
-
-/** If oldRoot is a nil root, just copy or move the children to newRoot.
- *  If not a nil root, make oldRoot a child of newRoot.
- *
- *    old=^(nil a b c), new=r yields ^(r a b c)
- *    old=^(a b c), new=r yields ^(r ^(a b c))
- *
- *  If newRoot is a nil-rooted single child tree, use the single
- *  child as the new root node.
- *
- *    old=^(nil a b c), new=^(nil r) yields ^(r a b c)
- *    old=^(a b c), new=^(nil r) yields ^(r ^(a b c))
- *
- *  If oldRoot was null, it's ok, just return newRoot (even if isNil).
- *
- *    old=null, new=r yields r
- *    old=null, new=^(nil r) yields ^(nil r)
- *
- *  Return newRoot.  Throw an exception if newRoot is not a
- *  simple node or nil root with a single child node--it must be a root
- *  node.  If newRoot is ^(nil x) return x as newRoot.
- *
- *  Be advised that it's ok for newRoot to point at oldRoot's
- *  children; i.e., you don't have to copy the list.  We are
- *  constructing these nodes so we should have this control for
- *  efficiency.
- */
-- (id<ANTLRTree>)becomeRoot:(id<ANTLRTree>)aNewRoot old:(id<ANTLRTree>)oldRoot;
-
-/** Transform ^(nil x) to x and nil to null */
-- (id<ANTLRTree>)rulePostProcessing:(id<ANTLRTree>)aRoot;
-
-- (id<ANTLRTree>)becomeRootfromToken:(id<ANTLRToken>)aNewRoot old:(id<ANTLRTree>)oldRoot;
-
-- (id<ANTLRTree>)createTree:(NSInteger)aTType With:(id<ANTLRToken>)aFromToken;
-
-- (id<ANTLRTree>)createTree:(NSInteger)aTType FromToken:(id<ANTLRToken>)aFromToken Text:(NSString *)theText;
-
-- (id<ANTLRTree>)createTree:(NSInteger)aTType Text:(NSString *)theText;
-
-- (NSInteger) getType:(id<ANTLRTree>)aTree;
-
-- (void) setType:(id<ANTLRTree>)aTree Type:(NSInteger)type;
-
-- (NSString *)getText:(id<ANTLRTree>)aTree;
-
-- (void) setText:(id<ANTLRTree>)aTree Text:(NSString *)theText;
-
-- (id<ANTLRTree>) getChild:(id<ANTLRTree>)aTree At:(NSInteger)i;
-
-- (void) setChild:(id<ANTLRTree>)aTree At:(NSInteger)index Child:(id<ANTLRTree>)aChild;
-
-- (id<ANTLRTree>) deleteChild:(id<ANTLRTree>)aTree Index:(NSInteger)index;
-
-- (NSInteger) getChildCount:(id<ANTLRTree>)aTree;
-
-- (NSInteger) getUniqueID:(id<ANTLRTree>)node;
-
-/** Tell me how to create a token for use with imaginary token nodes.
- *  For example, there is probably no input symbol associated with imaginary
- *  token DECL, but you need to create it as a payload or whatever for
- *  the DECL node as in ^(DECL type ID).
- *
- *  This is a variant of createToken where the new token is derived from
- *  an actual real input token.  Typically this is for converting '{'
- *  tokens to BLOCK etc...  You'll see
- *
- *    r : lc='{' ID+ '}' -> ^(BLOCK[$lc] ID+) ;
- *
- *  If you care what the token payload objects' type is, you should
- *  override this method and any other createToken variant.
- */
-- (id<ANTLRToken>)createToken:(NSInteger)aTType Text:(NSString *)theText;
-
-- (id<ANTLRToken>)createToken:(id<ANTLRToken>)aFromToken;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRBitSet.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRBitSet.h
deleted file mode 100755
index a1be117..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRBitSet.h
+++ /dev/null
@@ -1,93 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-#import <CoreFoundation/CoreFoundation.h>
-#import "ANTLRToken.h"
-
-#define BITS (sizeof(NSUInteger) * 8)
-#define LOG_BITS ((sizeof(NSUInteger)==8)?6:5)
-
-// A simple wrapper around CoreFoundation bit vectors to shield the rest of the implementation
-// from the specifics of the BitVector initialization and query functions.
-// This is fast, so there is no need to reinvent the wheel just yet.
-
-@interface ANTLRBitSet : NSObject < NSMutableCopying > {
-	CFMutableBitVectorRef bitVector;
-}
-
-#pragma mark Class Methods
-
-+ (ANTLRBitSet *) newANTLRBitSet;
-+ (ANTLRBitSet *) newANTLRBitSetWithType:(ANTLRTokenType)type;
-/** Construct a ANTLRBitSet given the size
- * @param nbits The size of the ANTLRBitSet in bits
- */
-+ (ANTLRBitSet *) newANTLRBitSetWithNBits:(NSUInteger)nbits;
-+ (ANTLRBitSet *) newANTLRBitSetWithArray:(NSMutableArray *)types;
-+ (ANTLRBitSet *) newANTLRBitSetWithBits:(const unsigned long long *)theBits Count:(NSUInteger)longCount;
-
-+ (ANTLRBitSet *) of:(NSUInteger)el;
-+ (ANTLRBitSet *) of:(NSUInteger)a And2:(NSUInteger)b;
-+ (ANTLRBitSet *) of:(NSUInteger)a And2:(NSUInteger)b And3:(NSUInteger)c;
-+ (ANTLRBitSet *) of:(NSUInteger)a And2:(NSUInteger)b And3:(NSUInteger)c And4:(NSUInteger)d;
-
-#pragma mark Initializer
-
-- (ANTLRBitSet *) init;
-- (ANTLRBitSet *) initWithType:(ANTLRTokenType)type;
-- (ANTLRBitSet *) initWithNBits:(NSUInteger)nbits;
-- (ANTLRBitSet *) initWithBitVector:(CFMutableBitVectorRef)theBitVector;
-- (ANTLRBitSet *) initWithBits:(const unsigned long long const*)theBits Count:(NSUInteger)theCount;
-- (ANTLRBitSet *) initWithArrayOfBits:(NSArray *)theArray;
-
-#pragma mark Operations
-- (ANTLRBitSet *) or:(ANTLRBitSet *) aBitSet;
-- (void) orInPlace:(ANTLRBitSet *) aBitSet;
-- (void) add:(NSUInteger) bit;
-- (void) remove:(NSUInteger) bit;
-- (void) setAllBits:(BOOL) aState;
-
-- (NSInteger) numBits;
-- (NSUInteger) size;
-- (void) setSize:(NSUInteger) noOfWords;
-
-#pragma mark Informational
-- (unsigned long long) bitMask:(NSUInteger) bitNumber;
-- (BOOL) member:(NSUInteger)bitNumber;
-- (BOOL) isNil;
-- (NSString *) toString;
-- (NSString *) description;
-
-#pragma mark NSCopying support
-
-- (id) mutableCopyWithZone:(NSZone *) theZone;
-
-
-//private
-- (CFMutableBitVectorRef) _bitVector;
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRBufferedTokenStream.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRBufferedTokenStream.h
deleted file mode 100644
index 198a6f7..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRBufferedTokenStream.h
+++ /dev/null
@@ -1,98 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTokenStream.h"
-#import "ANTLRTokenSource.h"
-#import "ANTLRBitSet.h"
-
-@interface ANTLRBufferedTokenStream : NSObject <ANTLRTokenStream> 
-{
-id<ANTLRTokenSource> tokenSource;
-    
-    /** Record every single token pulled from the source so we can reproduce
-     *  chunks of it later.  The buffer in LookaheadStream overlaps sometimes
-     *  as its moving window moves through the input.  This list captures
-     *  everything so we can access complete input text.
-     */
-NSMutableArray *tokens;
-    
-    /** Track the last mark() call result value for use in rewind(). */
-NSInteger lastMarker;
-    
-    /** The index into the tokens list of the current token (next token
-     *  to consume).  tokens[p] should be LT(1).  p=-1 indicates need
-     *  to initialize with first token.  The ctor doesn't get a token.
-     *  First call to LT(1) or whatever gets the first token and sets p=0;
-     */
-NSInteger p;
-    
-NSInteger range; // how deep have we gone?
-    
-}
-@property (retain, getter=getTokenSource,setter=setTokenSource) id<ANTLRTokenSource> tokenSource;
-@property (retain, getter=getTokens,setter=setTokens) NSMutableArray *tokens;
-@property (assign, getter=getLastMarker,setter=setLastMarker) NSInteger lastMarker;
-@property (assign, getter=getIndex,setter=setIndex) NSInteger p;
-@property (assign, getter=getRange,setter=setRange) NSInteger range;
-
-+ (ANTLRBufferedTokenStream *) newANTLRBufferedTokenStream;
-+ (ANTLRBufferedTokenStream *) newANTLRBufferedTokenStreamWith:(id<ANTLRTokenSource>)aSource;
-- (id) initWithSource:(id<ANTLRTokenSource>)aSource;
-- (id) copyWithZone:(NSZone *)aZone;
-- (NSInteger) getIndex;
-- (void) setIndex:(NSInteger)index;
-- (NSInteger) getRange;
-- (void) setRange:(NSInteger)anInt;
-- (NSInteger) mark;
-- (void) release:(NSInteger) marker;
-- (void) rewind:(NSInteger) marker;
-- (void) rewind;
-- (void) reset;
-- (void) seek:(NSInteger) index;
-- (NSInteger) size;
-- (void) consume;
-- (void) sync:(NSInteger) i;
-- (void) fetch:(NSInteger) n;
-- (id<ANTLRToken>) getToken:(NSInteger) i;
-- (NSMutableArray *)getFrom:(NSInteger)startIndex To:(NSInteger) stopIndex;
-- (NSInteger) LA:(NSInteger)k;
-- (id<ANTLRToken>) LT:(NSInteger) k;
-- (id<ANTLRToken>) LB:(NSInteger) k;
-- (void) setup;
-- (id<ANTLRTokenSource>) getTokenSource;
-- (void) setTokenSource:(id<ANTLRTokenSource>) aTokenSource;
-- (NSMutableArray *)getTokens;
-- (NSString *) getSourceName;
-- (NSMutableArray *)getTokensFrom:(NSInteger)startIndex To:(NSInteger)stopIndex;
-- (NSMutableArray *)getTokensFrom:(NSInteger)startIndex To:(NSInteger)stopIndex With:(ANTLRBitSet *)types;
-- (NSMutableArray *)getTokensFrom:(NSInteger)startIndex To:(NSInteger)stopIndex WithList:(NSMutableArray *)types;
-- (NSMutableArray *)getTokensFrom:(NSInteger)startIndex To:(NSInteger)stopIndex WithType:(NSInteger)ttype;
-- (NSString *) toStringFromStart:(NSInteger)startIndex ToEnd:(NSInteger)stopIndex;
-- (NSString *) toStringFromToken:(id<ANTLRToken>)startIndex ToToken:(id<ANTLRToken>)stopIndex;
-- (void) fill;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRBufferedTreeNodeStream.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRBufferedTreeNodeStream.h
deleted file mode 100644
index 8618ea2..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRBufferedTreeNodeStream.h
+++ /dev/null
@@ -1,156 +0,0 @@
-//
-//  ANTLRBufferedTreeNodeStream.h
-//  ANTLR
-//
-// [The "BSD licence"]
-// Copyright (c) 2010 Ian Michell 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTree.h"
-#import "ANTLRCommonTreeAdaptor.h"
-#import "ANTLRTokenStream.h"
-#import "ANTLRCommonTreeNodeStream.h"
-#import "ANTLRLookaheadStream.h"
-#import "ANTLRTreeIterator.h"
-#import "ANTLRIntArray.h"
-
-#define DEFAULT_INITIAL_BUFFER_SIZE 100
-#define INITIAL_CALL_STACK_SIZE 10
-
-#ifdef DONTUSENOMO
-@interface ANTLRStreamIterator : ANTLRTreeIterator
-{
-    NSInteger idx;
-    ANTLRBufferedTreeNodeStream input;
-    NSMutableArray *nodes;
-}
-
-+ (id) newANTLRStreamIterator:(ANTLRBufferedTreeNodeStream *) theStream;
-
-- (id) initWithStream:(ANTLRBufferedTreeNodeStream *) theStream;
-
-- (BOOL) hasNext;
-- (id) next;
-- (void) remove;
-@end
-#endif
-
-@interface ANTLRBufferedTreeNodeStream : NSObject <ANTLRTreeNodeStream> 
-{
-	id<ANTLRTree> up;
-	id<ANTLRTree> down;
-	id<ANTLRTree> eof;
-	
-	NSMutableArray *nodes;
-	
-	id<ANTLRTree> root; // root
-	
-	id<ANTLRTokenStream> tokens;
-	ANTLRCommonTreeAdaptor *adaptor;
-	
-	BOOL uniqueNavigationNodes;
-	NSInteger p;
-	NSInteger lastMarker;
-	ANTLRIntArray *calls;
-	
-	NSEnumerator *e;
-    id currentSymbol;
-	
-}
-
-@property (retain, getter=getUp, setter=setUp:) id<ANTLRTree> up;
-@property (retain, getter=getDown, setter=setDown:) id<ANTLRTree> down;
-@property (retain, getter=getEof, setter=setEof:) id<ANTLRTree> eof;
-@property (retain, getter=getNodes, setter=setNodes:) NSMutableArray *nodes;
-@property (retain, getter=getTreeSource, setter=setTreeSource:) id<ANTLRTree> root;
-@property (retain, getter=getTokenStream, setter=setTokenStream:) id<ANTLRTokenStream> tokens;
-@property (retain, getter=getAdaptor, setter=setAdaptor:) ANTLRCommonTreeAdaptor *adaptor;
-@property (assign, getter=getUniqueNavigationNodes, setter=setUniqueNavigationNodes:) BOOL uniqueNavigationNodes;
-@property (assign, getter=getIndex, setter=setIndex:) NSInteger p;
-@property (assign, getter=getLastMarker, setter=setLastMarker:) NSInteger lastMarker;
-@property (retain, getter=getCalls, setter=setCalls:) ANTLRIntArray *calls;
-@property (retain, getter=getEnum, setter=setEnum:) NSEnumerator *e;
-@property (retain, getter=getCurrentSymbol, setter=setCurrentSymbol:) id currentSymbol;
-
-+ (ANTLRBufferedTreeNodeStream *) newANTLRBufferedTreeNodeStream:(id<ANTLRTree>)tree;
-+ (ANTLRBufferedTreeNodeStream *) newANTLRBufferedTreeNodeStream:(id<ANTLRTreeAdaptor>)adaptor Tree:(id<ANTLRTree>)tree;
-+ (ANTLRBufferedTreeNodeStream *) newANTLRBufferedTreeNodeStream:(id<ANTLRTreeAdaptor>)adaptor Tree:(id<ANTLRTree>)tree withBufferSize:(NSInteger)initialBufferSize;
-
-#pragma mark Constructor
-- (id) initWithTree:(id<ANTLRTree>)tree;
-- (id) initWithTreeAdaptor:(ANTLRCommonTreeAdaptor *)anAdaptor Tree:(id<ANTLRTree>)tree;
-- (id) initWithTreeAdaptor:(ANTLRCommonTreeAdaptor *)anAdaptor Tree:(id<ANTLRTree>)tree WithBufferSize:(NSInteger)bufferSize;
-
-- (id) copyWithZone:(NSZone *)aZone;
-
-// protected methods. DO NOT USE
-#pragma mark Protected Methods
-- (void) fillBuffer;
-- (void) fillBufferWithTree:(id<ANTLRTree>) tree;
-- (NSInteger) getNodeIndex:(id<ANTLRTree>) node;
-- (void) addNavigationNode:(NSInteger) type;
-- (id) getNode:(NSInteger) i;
-- (id) LT:(NSInteger) k;
-- (id) getCurrentSymbol;
-- (id) LB:(NSInteger) i;
-#pragma mark General Methods
-- (NSString *) getSourceName;
-
-- (id<ANTLRTokenStream>) getTokenStream;
-- (void) setTokenStream:(id<ANTLRTokenStream>) tokens;
-- (id<ANTLRTreeAdaptor>) getTreeAdaptor;
-- (void) setTreeAdaptor:(id<ANTLRTreeAdaptor>) anAdaptor;
-
-- (BOOL)getUniqueNavigationNodes;
-- (void) setUniqueNavigationNodes:(BOOL)aVal;
-
-- (void) consume;
-- (NSInteger) LA:(NSInteger) i;
-- (NSInteger) mark;
-- (void) release:(NSInteger) marker;
-- (NSInteger) getIndex;
-- (void) setIndex:(NSInteger) idx;
-- (void) rewind:(NSInteger) marker;
-- (void) rewind;
-- (void) seek:(NSInteger) idx;
-
-- (void) push:(NSInteger) i;
-- (NSInteger) pop;
-
-- (void) reset;
-- (NSUInteger) count;
-- (NSEnumerator *) objectEnumerator;
-- (void) replaceChildren:(id)parent From:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id) t;
-
-- (NSString *) toTokenTypeString;
-- (NSString *) toTokenString:(NSInteger)aStart ToEnd:(NSInteger)aStop;
-- (NSString *) toStringFromNode:(id)aStart ToNode:(id)aStop;
-
-// getters and setters
-- (NSMutableArray *) getNodes;
-- (id<ANTLRTree>) getEof;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRCharStream.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRCharStream.h
deleted file mode 100755
index 379734b..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRCharStream.h
+++ /dev/null
@@ -1,55 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import "ANTLRIntStream.h"
-
-#define	ANTLRCharStreamEOF -1
-
-
-@protocol ANTLRCharStream < ANTLRIntStream >
-
-- (NSString *) substringWithRange:(NSRange) theRange;
-
-/** Get the ith character of lookahead.  This is the same usually as
- *  LA(i).  This will be used for labels in the generated
- *  lexer code.  I'd prefer to return a char here type-wise, but it's
- *  probably better to be 32-bit clean and be consistent with LA.
- */
-- (NSInteger)LT:(NSInteger) i;
-
-// ANTLR tracks the line information automatically
-- (NSInteger) getLine;
-
-// Because this stream can rewind, we need to be able to reset the line
-- (void) setLine:(NSInteger) theLine;
-
-// The index of the character relative to the beginning of the line 0..n-1
-- (NSInteger) getCharPositionInLine;
-
-- (void) setCharPositionInLine:(NSInteger) thePos;
-
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRCharStreamState.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRCharStreamState.h
deleted file mode 100644
index 2787c76..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRCharStreamState.h
+++ /dev/null
@@ -1,58 +0,0 @@
-//
-//  ANTLRCharStreamState.h
-//  ANTLR
-//
-// [The "BSD licence"]
-// Copyright (c)  2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-
-
-@interface ANTLRCharStreamState : NSObject
-{
-NSInteger p;
-NSInteger line;
-NSInteger charPositionInLine;
-}
-
-@property (getter=getP,setter=setP:) NSInteger p;
-@property (getter=getLine,setter=setLine:) NSInteger line;
-@property (getter=getCharPositionInLine,setter=setCharPositionInLine:) NSInteger charPositionInLine;
-
-+ newANTLRCharStreamState;
-
-- (id) init;
-
-- (NSInteger) getP;
-- (void) setP: (NSInteger) anIndex;
-
-- (NSInteger) getLine;
-- (void) setLine: (NSInteger) aLine;
-
-- (NSInteger) getCharPositionInLine;
-- (void) setCharPositionInLine:(NSInteger)aCharPositionInLine;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRCommonErrorNode.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRCommonErrorNode.h
deleted file mode 100644
index 79badc1..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRCommonErrorNode.h
+++ /dev/null
@@ -1,63 +0,0 @@
-//
-//  ANTLRCommonErrorNode.h
-//  ANTLR
-//
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRCommonTree.h"
-#import "ANTLRTokenStream.h"
-//#import "ANTLRIntStream.h"
-//#import "ANTLRToken.h"
-#import "ANTLRUnWantedTokenException.h"
-
-@interface ANTLRCommonErrorNode : ANTLRCommonTree
-{
-id<ANTLRIntStream> input;
-id<ANTLRToken> startToken;
-id<ANTLRToken> stopToken;
-ANTLRRecognitionException *trappedException;
-}
-
-+ (id) newANTLRCommonErrorNode:(id<ANTLRTokenStream>)anInput
-                  From:(id<ANTLRToken>)startToken
-                    To:(id<ANTLRToken>)stopToken
-                     Exception:(ANTLRRecognitionException *) e;
-
-- (id) initWithInput:(id<ANTLRTokenStream>)anInput
-                From:(id<ANTLRToken>)startToken
-                  To:(id<ANTLRToken>)stopToken
-           Exception:(ANTLRRecognitionException *) e;
-- (BOOL) isNil;
-
-- (NSInteger) getType;
-
-- (NSString *) getText;
-
-- (NSString *) toString;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRCommonToken.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRCommonToken.h
deleted file mode 100755
index 8662378..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRCommonToken.h
+++ /dev/null
@@ -1,105 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRToken.h"
-#import "ANTLRCharStream.h"
-
-@interface ANTLRCommonToken : NSObject < ANTLRToken > {
-	NSString *text;
-	NSInteger type;
-	// information about the Token's position in the input stream
-	NSUInteger line;
-	NSUInteger charPositionInLine;
-	NSUInteger channel;
-	// this token's position in the TokenStream
-	NSUInteger index;
-	
-	// indices into the CharStream to avoid copying the text
-	// can manually override the text by using -setText:
-	NSUInteger startIndex;
-	NSUInteger stopIndex;
-	// the actual input stream this token was found in
-	id<ANTLRCharStream> input;
-}
-
-@property (retain, getter=getText, setter=setText:) NSString *text;
-@property (assign, getter=getType, setter=setType:) NSInteger type;
-@property (assign, getter=getLine, setter=setLine:) NSUInteger line;
-@property (assign, getter=getCharPositionInLine, setter=setCharPositionInLine:) NSUInteger charPositionInLine;
-@property (assign, getter=getChannel, setter=setChannel:) NSUInteger channel;
-@property (assign, getter=getTokenIndex, setter=setTokenIndex:) NSUInteger index;
-@property (assign, getter=getStart, setter=setStart:) NSUInteger startIndex;
-@property (assign, getter=getStop, setter=setStop:) NSUInteger stopIndex;
-@property (retain, getter=getInput, setter=setInput:) id<ANTLRCharStream> input;
-
-+ (void) initialize;
-+ (ANTLRCommonToken *) newANTLRCommonToken;
-+ (ANTLRCommonToken *) newANTLRCommonToken:(id<ANTLRCharStream>)anInput
-                                      Type:(NSInteger)aTType
-                                   Channel:(NSInteger)aChannel
-                                     Start:(NSInteger)aStart
-                                      Stop:(NSInteger)aStop;
-+ (ANTLRCommonToken *) newANTLRCommonToken:(ANTLRTokenType)aType;
-+ (id<ANTLRToken>) newANTLRCommonToken:(NSInteger)tokenType Text:(NSString *)tokenText;
-+ (id<ANTLRToken>) newANTLRCommonTokenWithToken:(id<ANTLRToken>)fromToken;
-+ (id<ANTLRToken>) eofToken;
-+ (id<ANTLRToken>) skipToken;
-+ (id<ANTLRToken>) invalidToken;
-+ (ANTLRTokenChannel) defaultChannel;
-
-// designated initializer. This is used as the default way to initialize a Token in the generated code.
-- (ANTLRCommonToken *) init;
-- (ANTLRCommonToken *) initWithInput:(id<ANTLRCharStream>)anInput
-                                Type:(NSInteger)aTType
-                             Channel:(NSInteger)aChannel
-                               Start:(NSInteger)theStart
-                                Stop:(NSInteger)theStop;
-- (ANTLRCommonToken *) initWithToken:(ANTLRCommonToken *)aToken;
-- (ANTLRCommonToken *) initWithType:(ANTLRTokenType)aType;
-- (ANTLRCommonToken *) initWithType:(ANTLRTokenType)aTType Text:(NSString *)tokenText;
-
-- (id<ANTLRCharStream>) getInput;
-- (void) setInput: (id<ANTLRCharStream>) anInput;
-
-- (NSUInteger) getStart;
-- (void) setStart: (NSUInteger) aStart;
-
-- (NSUInteger) getStop;
-- (void) setStop: (NSUInteger) aStop;
-
-// the index of this Token into the TokenStream
-- (NSUInteger) getTokenIndex;
-- (void) setTokenIndex: (NSUInteger) aTokenIndex;
-
-// conform to NSCopying
-- (id) copyWithZone:(NSZone *)theZone;
-
-- (NSString *) description;
-- (NSString *) toString;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRCommonTokenStream.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRCommonTokenStream.h
deleted file mode 100755
index 59f9d5e..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRCommonTokenStream.h
+++ /dev/null
@@ -1,90 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTokenStream.h"
-#import "ANTLRToken.h"
-#import "ANTLRCommonToken.h"
-#import "ANTLRTokenSource.h"
-#import "ANTLRBitSet.h"
-#import "ANTLRBufferedTokenStream.h"
-
-@interface ANTLRCommonTokenStream : ANTLRBufferedTokenStream < ANTLRTokenStream >
-{
-	NSMutableDictionary *channelOverride;
-	NSInteger channel;
-}
-
-@property (retain, getter=getChannelOverride,setter=setChannelOverride) NSMutableDictionary *channelOverride;
-@property (assign, getter=getChannel,setter=setChannel) NSInteger channel;
-
-+ (ANTLRCommonTokenStream *)newANTLRCommonTokenStream;
-+ (ANTLRCommonTokenStream *)newANTLRCommonTokenStreamWithTokenSource:(id<ANTLRTokenSource>)theTokenSource;
-+ (ANTLRCommonTokenStream *)newANTLRCommonTokenStreamWithTokenSource:(id<ANTLRTokenSource>)theTokenSource
-                                                               Channel:(NSInteger)aChannel;
-
-- (id) init;
-- (id) initWithTokenSource:(id<ANTLRTokenSource>)theTokenSource;
-- (id) initWithTokenSource:(id<ANTLRTokenSource>)theTokenSource Channel:(NSInteger)aChannel;
-
-- (id<ANTLRTokenSource>) getTokenSource;
-- (void) setTokenSource: (id<ANTLRTokenSource>) aTokenSource;
-
-- (void) consume;
-- (id<ANTLRToken>) LT:(NSInteger)k;
-- (id<ANTLRToken>) LB:(NSInteger)k;
-
-- (NSInteger) skipOffChannelTokens:(NSInteger) i;
-- (NSInteger) skipOffChannelTokensReverse:(NSInteger) i;
-
-- (void)setup;
-
-- (NSArray *) tokensInRange:(NSRange)aRange;
-- (NSArray *) tokensInRange:(NSRange)aRange inBitSet:(ANTLRBitSet *)aBitSet;
-- (NSArray *) tokensInRange:(NSRange)aRange withTypes:(NSArray *)tokenTypes;
-- (NSArray *) tokensInRange:(NSRange)aRange withType:(NSInteger)tokenType;
-
-- (id<ANTLRToken>) getToken:(NSInteger)i;
-
-- (NSInteger) size;
-- (NSInteger) getIndex;
-- (void) rewind;
-- (void) rewind:(NSInteger)marker;
-- (void) seek:(NSInteger)index;
-
-- (NSString *) toString;
-- (NSString *) toStringFromStart:(NSInteger)startIndex ToEnd:(NSInteger)stopIndex;
-- (NSString *) toStringFromToken:(id<ANTLRToken>)startToken ToToken:(id<ANTLRToken>)stopToken;
-
-- (id) copyWithZone:(NSZone *)aZone;
-
-- (NSInteger)getChannel;
-- (void)setChannel:(NSInteger)aChannel;
-
-- (NSMutableDictionary *)getChannelOverride;
-- (void)setChannelOverride:(NSMutableDictionary *)anOverride;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRCommonTree.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRCommonTree.h
deleted file mode 100755
index 0966051..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRCommonTree.h
+++ /dev/null
@@ -1,88 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRCommonToken.h"
-#import "ANTLRBaseTree.h"
-
-@interface ANTLRCommonTree : ANTLRBaseTree <ANTLRTree> {
-	ANTLRCommonToken *token;
-	NSInteger startIndex;
-	NSInteger stopIndex;
-    ANTLRCommonTree *parent;
-    NSInteger childIndex;
-}
-
-@property (retain, getter=getANTLRCommonToken, setter=setANTLRCommonToken) ANTLRCommonToken *token;
-@property (assign, getter=getTokenStartIndex, setter=setTokenStartIndex) NSInteger startIndex;
-@property (assign, getter=getTokenStopIndex, setter=setTokenStopIndex) NSInteger stopIndex;
-@property (retain, getter=getParent, setter=setParent:) ANTLRCommonTree *parent;
-@property (assign, getter=getChildIndex, setter=setChildIndex) NSInteger childIndex;
-
-+ (ANTLRCommonTree *) invalidNode;
-+ (ANTLRCommonTree *) newANTLRCommonTree;
-+ (ANTLRCommonTree *) newANTLRCommonTreeWithTree:(ANTLRCommonTree *)aTree;
-+ (ANTLRCommonTree *) newANTLRCommonTreeWithToken:(ANTLRCommonToken *)aToken;
-+ (ANTLRCommonTree *) newANTLRCommonTreeWithTokenType:(NSInteger)tokenType;
-+ (ANTLRCommonTree *) newANTLRCommonTreeWithTokenType:(NSInteger)aTType Text:(NSString *)theText;
-#ifdef DONTUSEYET
-+ (id<ANTLRTree>) newANTLRCommonTreeWithTokenType:(NSInteger)tokenType;
-+ (id<ANTLRTree>) newANTLRCommonTreeWithToken:(id<ANTLRToken>)fromToken TokenType:(NSInteger)tokenType;
-+ (id<ANTLRTree>) newANTLRCommonTreeWithToken:(id<ANTLRToken>)fromToken TokenType:(NSInteger)tokenType Text:(NSString *)tokenText;
-+ (id<ANTLRTree>) newANTLRCommonTreeWithToken:(id<ANTLRToken>)fromToken Text:(NSString *)tokenText;
-#endif
-
-- (id) init;
-- (id) initWithTreeNode:(ANTLRCommonTree *)aNode;
-- (id) initWithToken:(ANTLRCommonToken *)aToken;
-- (id) initWithTokenType:(NSInteger)aTokenType;
-- (id) initWithTokenType:(NSInteger)aTokenType Text:(NSString *)theText;
-
-- (id<ANTLRTree>) copyWithZone:(NSZone *)aZone;
-
-- (BOOL) isNil;
-
-- (ANTLRCommonToken *) getToken;
-- (void) setToken:(ANTLRCommonToken *)aToken;
-- (id<ANTLRTree>) dupNode;
-- (NSInteger) getType;
-- (NSString *) getText;
-- (NSUInteger) getLine;
-- (NSUInteger) getCharPositionInLine;
-- (ANTLRCommonTree *) getParent;
-- (void) setParent:(ANTLRCommonTree *) t;
-
-#ifdef DONTUSENOMO
-- (NSString *) treeDescription;
-#endif
-- (NSString *) description;
-- (void) setUnknownTokenBoundaries;
-- (NSInteger) getTokenStartIndex;
-- (void) setTokenStartIndex: (NSInteger) aStartIndex;
-- (NSInteger) getTokenStopIndex;
-- (void) setTokenStopIndex: (NSInteger) aStopIndex;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRCommonTreeAdaptor.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRCommonTreeAdaptor.h
deleted file mode 100755
index 53287e6..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRCommonTreeAdaptor.h
+++ /dev/null
@@ -1,62 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTree.h"
-#import "ANTLRCommonToken.h"
-#import "ANTLRCommonTree.h"
-#import "ANTLRBaseTreeAdaptor.h"
-
-@interface ANTLRCommonTreeAdaptor : ANTLRBaseTreeAdaptor {
-}
-
-+ (id<ANTLRTree>) newEmptyTree;
-+ (ANTLRCommonTreeAdaptor *)newANTLRCommonTreeAdaptor;
-- (id) init;
-- (id<ANTLRTree>)dupNode:(id<ANTLRTree>)t;    
-- (ANTLRCommonTree *)createTree:(ANTLRCommonToken *)aToken;
-- (ANTLRCommonTree *)createTree:(NSInteger)tokenType Text:(NSString *)text;
-- (id<ANTLRToken>)createToken:(NSInteger)tokenType Text:(NSString *)text;
-- (void) setTokenBoundaries:(id<ANTLRTree>)t From:(id<ANTLRToken>)startToken To:(id<ANTLRToken>)stopToken;
-- (NSInteger)getTokenStartIndex:(id<ANTLRTree>)t;
-- (NSInteger)getTokenStopIndex:(id<ANTLRTree>)t;
-- (NSString *)getText:(id<ANTLRTree>)t;
-- (void)setText:(id<ANTLRTree>)t Text:(NSString *)text;
-- (NSInteger)getType:(id<ANTLRTree>)t;
-- (void) setType:(id<ANTLRTree>)t Type:(NSInteger)tokenType;
-- (id<ANTLRToken>)getToken:(id<ANTLRTree>)t;
-- (id<ANTLRTree>)getChild:(id<ANTLRTree>)t At:(NSInteger)i;
-- (void) setChild:(id<ANTLRTree>)t At:(NSInteger)i Child:(id<ANTLRTree>)child;
-- (NSInteger)getChildCount:(id<ANTLRTree>)t;
-- (id<ANTLRTree>)getParent:(id<ANTLRTree>)t;
-- (void)setParent:(id<ANTLRTree>)t With:(id<ANTLRTree>)parent;
-- (NSInteger)getChildIndex:(id<ANTLRTree>)t;
-- (void)setChildIndex:(id<ANTLRTree>)t With:(NSInteger)index;
-- (void)replaceChildren:(id<ANTLRTree>)parent From:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id<ANTLRTree>)t;
-- (id)copyWithZone:(NSZone *)zone;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRCommonTreeNodeStream.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRCommonTreeNodeStream.h
deleted file mode 100755
index 4c68f2e..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRCommonTreeNodeStream.h
+++ /dev/null
@@ -1,116 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRCommonTree.h"
-#import "ANTLRCommonTreeNodeStream.h"
-#import "ANTLRLookaheadStream.h"
-#import "ANTLRTreeNodeStream.h"
-#import "ANTLRTreeIterator.h"
-#import "ANTLRIntArray.h"
-
-@interface ANTLRCommonTreeNodeStream : ANTLRLookaheadStream <ANTLRTreeNodeStream> {
-#define DEFAULT_INITIAL_BUFFER_SIZE 100
-#define INITIAL_CALL_STACK_SIZE 10
-    
-/** Pull nodes from which tree? */
-id root;
-    
-/** If this tree (root) was created from a token stream, track it. */
-id <ANTLRTokenStream> tokens;
-    
-	/** What tree adaptor was used to build these trees */
-ANTLRCommonTreeAdaptor *adaptor;
-    
-/** The tree iterator we using */
-ANTLRTreeIterator *it;
-    
-/** Stack of indexes used for push/pop calls */
-ANTLRIntArray *calls;    
-    
-/** Tree (nil A B C) trees like flat A B C streams */
-BOOL hasNilRoot;
-    
-/** Tracks tree depth.  Level=0 means we're at root node level. */
-NSInteger level;
-}
-@property (retain, getter=getRoot, setter=setRoot:) ANTLRCommonTree *root;
-@property (retain, getter=getTokens,setter=setTokens:) id<ANTLRTokenStream> tokens;
-@property (retain, getter=getTreeAdaptor, setter=setTreeAdaptor:) ANTLRCommonTreeAdaptor *adaptor;
-
-+ (ANTLRCommonTreeNodeStream *) newANTLRCommonTreeNodeStream:(ANTLRCommonTree *)theTree;
-+ (ANTLRCommonTreeNodeStream *) newANTLRCommonTreeNodeStream:(id<ANTLRTreeAdaptor>)anAdaptor Tree:(ANTLRCommonTree *)theTree;
-
-- (id) initWithTree:(ANTLRCommonTree *)theTree;
-
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)adaptor Tree:(ANTLRCommonTree *)theTree;
-    
-- (void) reset;
-    
-    /** Pull elements from tree iterator.  Track tree level 0..max_level.
-     *  If nil rooted tree, don't give initial nil and DOWN nor final UP.
-     */
-- (id) nextElement;
-    
-- (BOOL) isEOF:(id<ANTLRTree>) o;
-- (void) setUniqueNavigationNodes:(BOOL) uniqueNavigationNodes;
-    
-- (id) getTreeSource;
-    
-- (NSString *) getSourceName;
-    
-- (id<ANTLRTokenStream>) getTokenStream;
-    
-- (void) setTokenStream:(id<ANTLRTokenStream>) tokens;
-    
-- (ANTLRCommonTreeAdaptor *) getTreeAdaptor;
-    
-- (void) setTreeAdaptor:(ANTLRCommonTreeAdaptor *) adaptor;
-    
-- (NSInteger) LA:(NSInteger) i;
-    
-    /** Make stream jump to a new location, saving old location.
-     *  Switch back with pop().
-     */
-- (ANTLRCommonTree *)getNode:(NSInteger) i;
-
-- (void) push:(NSInteger) index;
-    
-    /** Seek back to previous index saved during last push() call.
-     *  Return top of stack (return index).
-     */
-- (NSInteger) pop;
-    
-// TREE REWRITE INTERFACE
-    
-- (void) replaceChildren:(id)parent From:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id) t;
-    
-- (NSString *) toStringFromNode:(id<ANTLRTree>)startNode ToNode:(id<ANTLRTree>)stopNode;
-
-/** For debugging; destructive: moves tree iterator to end. */
-- (NSString *) toTokenTypeString;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRDFA.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRDFA.h
deleted file mode 100755
index 9094a3d..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRDFA.h
+++ /dev/null
@@ -1,75 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRBaseRecognizer.h"
-#import "ANTLRCharStream.h"
-#import "ANTLRNoViableAltException.h"
-
-@interface ANTLRDFA : NSObject {
-	// the tables are set by subclasses to their own static versions.
-	const int *eot;
-	const int *eof;
-	const unichar *min;
-	const unichar *max;
-	const int *accept;
-	const int *special;
-	const int **transition;
-	
-	ANTLRBaseRecognizer *recognizer;
-	NSInteger decisionNumber;
-    NSInteger len;
-}
-
-@property (retain, getter=getRecognizer,setter=setRecognizer:) ANTLRBaseRecognizer *recognizer;
-@property (assign, getter=getDecision,setter=setDecision:) NSInteger decisionNumber;
-@property (assign, getter=getLen,setter=setLen:) NSInteger len;
-
-- (id) initWithRecognizer:(id) theRecognizer;
-// simulate the DFA using the static tables and predict an alternative
-- (NSInteger) predict:(id<ANTLRCharStream>)anInput;
-- (void) noViableAlt:(NSInteger)state Stream:(id<ANTLRIntStream>)anInput;
-
-- (NSInteger) specialStateTransition:(NSInteger)state Stream:(id<ANTLRIntStream>)anInput;
-// - (NSInteger) specialStateTransition:(NSInteger) state;
-//- (unichar) specialTransition:(unichar) state symbol:(NSInteger) symbol;
-
-// hook for debugger support
-- (void) error:(ANTLRNoViableAltException *)nvae;
-
-- (NSString *) description;
-- (BOOL) evaluateSyntacticPredicate:(SEL)synpredFragment;
-
-+ (void) setIsEmittingDebugInfo:(BOOL) shouldEmitDebugInfo;
-
-- (NSInteger)getDecision;
-- (void)setDecision:(NSInteger)aDecison;
-
-- (ANTLRBaseRecognizer *)getRecognizer;
-- (void)setRecognizer:(ANTLRBaseRecognizer *)aRecognizer;
-- (NSInteger)length;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRDebug.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRDebug.h
deleted file mode 100755
index 87383c9..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRDebug.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import "ANTLRDebugEventListener.h"
-#import "ANTLRDebugEventProxy.h"
-#import "ANTLRDebugParser.h"
-#import "ANTLRDebugTokenStream.h"
-#import "ANTLRDebugTreeParser.h"
-#import "ANTLRDebugTreeNodeStream.h"
-#import "ANTLRDebugTreeAdaptor.h"
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRDebugEventListener.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRDebugEventListener.h
deleted file mode 100755
index c2bee6c..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRDebugEventListener.h
+++ /dev/null
@@ -1,275 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRToken.h"
-#import "ANTLRRecognitionException.h"
-
-@protocol ANTLRDebugEventListener 
-
-#define ANTLRDebugProtocolVersion 1
-
-/** The parser has just entered a rule.  No decision has been made about
-*  which alt is predicted.  This is fired AFTER init actions have been
-*  executed.  Attributes are defined and available etc...
-*/
-- (void) enterRule:(NSString *)ruleName;
-
-/** Because rules can have lots of alternatives, it is very useful to
-*  know which alt you are entering.  This is 1..n for n alts.
-*/
-- (void) enterAlt:(NSInteger)alt;
-
-/** This is the last thing executed before leaving a rule.  It is
-*  executed even if an exception is thrown.  This is triggered after
-*  error reporting and recovery have occurred (unless the exception is
-											   *  not caught in this rule).  This implies an "exitAlt" event.
-*/
-- (void) exitRule:(NSString *)ruleName;
-
-/** Track entry into any (...) subrule other EBNF construct */
-- (void) enterSubRule:(NSInteger)decisionNumber;
-
-- (void) exitSubRule:(NSInteger)decisionNumber;
-
-/** Every decision, fixed k or arbitrary, has an enter/exit event
-*  so that a GUI can easily track what LT/consume events are
-*  associated with prediction.  You will see a single enter/exit
-*  subrule but multiple enter/exit decision events, one for each
-*  loop iteration.
-*/
-- (void) enterDecision:(NSInteger)decisionNumber;
-
-- (void) exitDecision:(NSInteger)decisionNumber;
-
-/** An input token was consumed; matched by any kind of element.
-*  Trigger after the token was matched by things like match(), matchAny().
-*/
-- (void) consumeToken:(id<ANTLRToken>)t;
-
-/** An off-channel input token was consumed.
-*  Trigger after the token was matched by things like match(), matchAny().
-*  (unless of course the hidden token is first stuff in the input stream).
-*/
-- (void) consumeHiddenToken:(id<ANTLRToken>)t;
-
-/** Somebody (anybody) looked ahead.  Note that this actually gets
-*  triggered by both LA and LT calls.  The debugger will want to know
-*  which Token object was examined.  Like consumeToken, this indicates
-*  what token was seen at that depth.  A remote debugger cannot look
-*  ahead into a file it doesn't have so LT events must pass the token
-*  even if the info is redundant.
-*/
-- (void) LT:(NSInteger)i foundToken:(id<ANTLRToken>)t;
-
-/** The parser is going to look arbitrarily ahead; mark this location,
-*  the token stream's marker is sent in case you need it.
-*/
-- (void) mark:(NSInteger)marker;
-
-/** After an arbitrairly long lookahead as with a cyclic DFA (or with
-*  any backtrack), this informs the debugger that stream should be
-*  rewound to the position associated with marker.
-*/
-- (void) rewind:(NSInteger)marker;
-
-/** Rewind to the input position of the last marker.
-*  Used currently only after a cyclic DFA and just
-*  before starting a sem/syn predicate to get the
-*  input position back to the start of the decision.
-*  Do not "pop" the marker off the state.  mark(i)
-*  and rewind(i) should balance still.
-*/
-- (void) rewind;
-
-- (void) beginBacktrack:(NSInteger)level;
-
-- (void) endBacktrack:(NSInteger)level wasSuccessful:(BOOL)successful;
-
-/** To watch a parser move through the grammar, the parser needs to
-*  inform the debugger what line/charPos it is passing in the grammar.
-*  For now, this does not know how to switch from one grammar to the
-*  other and back for island grammars etc...
-*
-*  This should also allow breakpoints because the debugger can stop
-*  the parser whenever it hits this line/pos.
-*/
-- (void) locationLine:(NSInteger)line column:(NSInteger)pos;
-
-/** A recognition exception occurred such as NoViableAltException.  I made
-*  this a generic event so that I can alter the exception hierachy later
-*  without having to alter all the debug objects.
-*
-*  Upon error, the stack of enter rule/subrule must be properly unwound.
-*  If no viable alt occurs it is within an enter/exit decision, which
-*  also must be rewound.  Even the rewind for each mark must be unwount.
-*  In the Java target this is pretty easy using try/finally, if a bit
-*  ugly in the generated code.  The rewind is generated in DFA.predict()
-*  actually so no code needs to be generated for that.  For languages
-*  w/o this "finally" feature (C++?), the target implementor will have
-*  to build an event stack or something.
-*
-*  Across a socket for remote debugging, only the RecognitionException
-*  data fields are transmitted.  The token object or whatever that
-*  caused the problem was the last object referenced by LT.  The
-*  immediately preceding LT event should hold the unexpected Token or
-*  char.
-*
-*  Here is a sample event trace for grammar:
-*
-*  b : C ({;}A|B) // {;} is there to prevent A|B becoming a set
-*    | D
-*    ;
-*
-*  The sequence for this rule (with no viable alt in the subrule) for
-*  input 'c c' (there are 3 tokens) is:
-*
-*		commence
-*		LT(1)
-*		enterRule b
-*		location 7 1
-*		enter decision 3
-*		LT(1)
-*		exit decision 3
-*		enterAlt1
-*		location 7 5
-*		LT(1)
-*		consumeToken [c/<4>,1:0]
-*		location 7 7
-*		enterSubRule 2
-*		enter decision 2
-*		LT(1)
-*		LT(1)
-*		recognitionException NoViableAltException 2 1 2
-*		exit decision 2
-*		exitSubRule 2
-*		beginResync
-*		LT(1)
-*		consumeToken [c/<4>,1:1]
-*		LT(1)
-*		endResync
-*		LT(-1)
-*		exitRule b
-*		terminate
-*/
-- (void) recognitionException:(ANTLRRecognitionException *)e;
-
-/** Indicates the recognizer is about to consume tokens to resynchronize
-*  the parser.  Any consume events from here until the recovered event
-*  are not part of the parse--they are dead tokens.
-*/
-- (void) beginResync;
-
-/** Indicates that the recognizer has finished consuming tokens in order
-*  to resychronize.  There may be multiple beginResync/endResync pairs
-*  before the recognizer comes out of errorRecovery mode (in which
-*  multiple errors are suppressed).  This will be useful
-*  in a gui where you want to probably grey out tokens that are consumed
-*  but not matched to anything in grammar.  Anything between
-*  a beginResync/endResync pair was tossed out by the parser.
-*/
-- (void) endResync;
-
-/** A semantic predicate was evaluate with this result and action text */
-- (void) semanticPredicate:(NSString *)predicate matched:(BOOL)result;
-
-/** Announce that parsing has begun.  Not technically useful except for
-*  sending events over a socket.  A GUI for example will launch a thread
-*  to connect and communicate with a remote parser.  The thread will want
-*  to notify the GUI when a connection is made.  ANTLR parsers
-*  trigger this upon entry to the first rule (the ruleLevel is used to
-*  figure this out).
-*/
-- (void) commence;
-
-/** Parsing is over; successfully or not.  Mostly useful for telling
-*  remote debugging listeners that it's time to quit.  When the rule
-*  invocation level goes to zero at the end of a rule, we are done
-*  parsing.
-*/
-- (void) terminate;
-
-
-// T r e e  P a r s i n g
-
-/** Input for a tree parser is an AST, but we know nothing for sure
-*  about a node except its type and text (obtained from the adaptor).
-*  This is the analog of the consumeToken method.  Again, the ID is
-*  the hashCode usually of the node so it only works if hashCode is
-*  not implemented.  If the type is UP or DOWN, then
-*  the ID is not really meaningful as it's fixed--there is
-*  just one UP node and one DOWN navigation node.
-*/
-- (void) consumeNode:(NSInteger)nodeHash ofType:(NSInteger)type text:(NSString *)text;
-
-/** The tree parser lookedahead.  If the type is UP or DOWN,
-*  then the ID is not really meaningful as it's fixed--there is
-*  just one UP node and one DOWN navigation node.
-*/
-- (void) LT:(NSInteger)i foundNode:(unsigned)nodeHash ofType:(NSInteger)type text:(NSString *)text;
-
-
-// A S T  E v e n t s
-
-/** A nil was created (even nil nodes have a unique ID...
-*  they are not "null" per se).  As of 4/28/2006, this
-*  seems to be uniquely triggered when starting a new subtree
-*  such as when entering a subrule in automatic mode and when
-*  building a tree in rewrite mode.
-*/
-- (void) createNilNode:(unsigned)hash;
-
-/** Announce a new node built from text */
-- (void) createNode:(unsigned)hash text:(NSString *)text type:(NSInteger)type;
-
-/** Announce a new node built from an existing token */
-- (void) createNode:(unsigned)hash fromTokenAtIndex:(NSInteger)tokenIndex;
-
-/** Make a node the new root of an existing root.  See
-*
-*  Note: the newRootID parameter is possibly different
-*  than the TreeAdaptor.becomeRoot() newRoot parameter.
-*  In our case, it will always be the result of calling
-*  TreeAdaptor.becomeRoot() and not root_n or whatever.
-*
-*  The listener should assume that this event occurs
-*  only when the current subrule (or rule) subtree is
-*  being reset to newRootID.
-*
-*/
-- (void) makeNode:(unsigned)newRootHash parentOf:(unsigned)oldRootHash;
-
-/** Make childID a child of rootID.
-*  @see org.antlr.runtime.tree.TreeAdaptor.addChild()
-*/
-- (void) addChild:(unsigned)childHash toTree:(unsigned)treeHash;
-
-/** Set the token start/stop token index for a subtree root or node */
-- (void) setTokenBoundariesForTree:(unsigned)nodeHash From:(NSUInteger)tokenStartIndex To:(NSUInteger)tokenStopIndex;
-
-- (void) waitForDebuggerConnection;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRDebugEventProxy.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRDebugEventProxy.h
deleted file mode 100755
index 59bf67b..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRDebugEventProxy.h
+++ /dev/null
@@ -1,112 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRParser.h"
-#import "ANTLRDebugEventListener.h"
-#import <sys/socket.h>
-#import <netinet/in.h>
-#import <netinet/tcp.h>
-#include <arpa/inet.h>
-
-// default port for ANTLRWorks
-#define DEFAULT_DEBUGGER_PORT 0xC001
-
-@interface ANTLRDebugEventProxy : NSObject <ANTLRDebugEventListener> {
-	int serverSocket;
-	
-	struct sockaddr debugger_sockaddr;
-	socklen_t debugger_socklen;
-	int debuggerSocket;
-	NSFileHandle *debuggerFH;
-	
-	NSString *grammarName;
-	int debuggerPort;
-}
-
-- (id) init;
-- (id) initWithGrammarName:(NSString *)aGrammarName debuggerPort:(NSInteger)aPort;
-- (void) waitForDebuggerConnection;
-- (void) waitForAck;
-- (void) sendToDebugger:(NSString *)message;
-- (void) sendToDebugger:(NSString *)message waitForResponse:(BOOL)wait;
-
-- (NSInteger) serverSocket;
-- (void) setServerSocket: (NSInteger) aServerSocket;
-
-- (NSInteger) debuggerSocket;
-- (void) setDebuggerSocket: (NSInteger) aDebuggerSocket;
-
-- (NSString *) grammarName;
-- (void) setGrammarName: (NSString *) aGrammarName;
-
-- (NSInteger) debuggerPort;
-- (void) setDebuggerPort: (NSInteger) aDebuggerPort;
-
-- (NSString *) escapeNewlines:(NSString *)aString;
-
-#pragma mark -
-
-#pragma mark DebugEventListener Protocol
-- (void) enterRule:(NSString *)ruleName;
-- (void) enterAlt:(NSInteger)alt;
-- (void) exitRule:(NSString *)ruleName;
-- (void) enterSubRule:(NSInteger)decisionNumber;
-- (void) exitSubRule:(NSInteger)decisionNumber;
-- (void) enterDecision:(NSInteger)decisionNumber;
-- (void) exitDecision:(NSInteger)decisionNumber;
-- (void) consumeToken:(id<ANTLRToken>)t;
-- (void) consumeHiddenToken:(id<ANTLRToken>)t;
-- (void) LT:(NSInteger)i foundToken:(id<ANTLRToken>)t;
-- (void) mark:(NSInteger)marker;
-- (void) rewind:(NSInteger)marker;
-- (void) rewind;
-- (void) beginBacktrack:(NSInteger)level;
-- (void) endBacktrack:(NSInteger)level wasSuccessful:(BOOL)successful;
-- (void) locationLine:(NSInteger)line column:(NSInteger)pos;
-- (void) recognitionException:(ANTLRRecognitionException *)e;
-- (void) beginResync;
-- (void) endResync;
-- (void) semanticPredicate:(NSString *)predicate matched:(BOOL)result;
-- (void) commence;
-- (void) terminate;
-
-
-#pragma mark Tree Parsing
-- (void) consumeNode:(unsigned)nodeHash ofType:(NSInteger)type text:(NSString *)text;
-- (void) LT:(NSInteger)i foundNode:(unsigned)nodeHash ofType:(NSInteger)type text:(NSString *)text;
-
-
-#pragma mark AST Events
-
-- (void) createNilNode:(unsigned)hash;
-- (void) createNode:(unsigned)hash text:(NSString *)text type:(NSInteger)type;
-- (void) createNode:(unsigned)hash fromTokenAtIndex:(NSInteger)tokenIndex;
-- (void) makeNode:(unsigned)newRootHash parentOf:(unsigned)oldRootHash;
-- (void) addChild:(unsigned)childHash toTree:(unsigned)treeHash;
-- (void) setTokenBoundariesForTree:(unsigned)nodeHash From:(NSInteger)tokenStartIndex To:(NSInteger)tokenStopIndex;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRDebugParser.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRDebugParser.h
deleted file mode 100755
index b23ff50..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRDebugParser.h
+++ /dev/null
@@ -1,47 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRParser.h"
-#import "ANTLRDebugEventProxy.h"
-#import "ANTLRDebugTokenStream.h"
-
-@interface ANTLRDebugParser : ANTLRParser {
-	id<ANTLRDebugEventListener> debugListener;
-}
-
-- (id) initWithTokenStream:(id<ANTLRTokenStream>)theStream;
-- (id) initWithTokenStream:(id<ANTLRTokenStream>)theStream
-			  debuggerPort:(NSInteger)portNumber;
-// designated initializer
-- (id) initWithTokenStream:(id<ANTLRTokenStream>)theStream
-			 debugListener:(id<ANTLRDebugEventListener>)theDebugListener
-			  debuggerPort:(NSInteger)portNumber;
-
-- (id<ANTLRDebugEventListener>) debugListener;
-- (void) setDebugListener: (id<ANTLRDebugEventListener>) aDebugListener;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRDebugTokenStream.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRDebugTokenStream.h
deleted file mode 100755
index 335b002..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRDebugTokenStream.h
+++ /dev/null
@@ -1,62 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRParser.h"
-#import "ANTLRTokenStream.h"
-#import "ANTLRTokenSource.h"
-#import "ANTLRDebugTokenStream.h"
-#import "ANTLRDebugEventListener.h"
-
-@interface ANTLRDebugTokenStream : NSObject <ANTLRTokenStream>
-{
-	id<ANTLRDebugEventListener> debugListener;
-	id<ANTLRTokenStream> input;
-	BOOL initialStreamState;
-    NSInteger lastMarker;
-}
-
-- (id) initWithTokenStream:(id<ANTLRTokenStream>)theStream debugListener:(id<ANTLRDebugEventListener>)debugger;
-
-- (id<ANTLRDebugEventListener>) debugListener;
-- (void) setDebugListener: (id<ANTLRDebugEventListener>) aDebugListener;
-
-- (id<ANTLRTokenStream>) getInput;
-- (void) setInput:(id<ANTLRTokenStream>)aTokenStream;
-
-- (void) consume;
-- (id<ANTLRToken>) getToken:(NSInteger)index;
-- (NSInteger) getIndex;
-- (void) release:(NSInteger)marker;
-- (void) seek:(NSInteger)index;
-- (NSInteger) size;
-- (id<ANTLRTokenSource>) getTokenSource;
-- (NSString *) getSourceName;
-- (NSString *) toString;
-- (NSString *) toStringFromStart:(NSInteger)aStart ToEnd:(NSInteger)aStop;
-- (NSString *) toStringFromToken:(id<ANTLRToken>)startToken ToToken:(id<ANTLRToken>)stopToken;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRDebugTreeAdaptor.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRDebugTreeAdaptor.h
deleted file mode 100755
index 41965fa..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRDebugTreeAdaptor.h
+++ /dev/null
@@ -1,45 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRParser.h"
-#import "ANTLRBaseTreeAdaptor.h"
-#import "ANTLRDebugEventListener.h"
-
-@interface ANTLRDebugTreeAdaptor : ANTLRBaseTreeAdaptor {
-	id<ANTLRDebugEventListener> debugListener;
-	id<ANTLRTreeAdaptor> treeAdaptor;
-}
-
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor debugListener:(id<ANTLRDebugEventListener>)aDebugListener;
-
-- (id<ANTLRDebugEventListener>) debugListener;
-- (void) setDebugListener: (id<ANTLRDebugEventListener>) aDebugListener;
-
-- (id<ANTLRTreeAdaptor>) getTreeAdaptor;
-- (void) setTreeAdaptor: (id<ANTLRTreeAdaptor>) aTreeAdaptor;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRDebugTreeNodeStream.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRDebugTreeNodeStream.h
deleted file mode 100755
index 70f9939..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRDebugTreeNodeStream.h
+++ /dev/null
@@ -1,67 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRDebugEventListener.h"
-#import "ANTLRTreeAdaptor.h"
-#import "ANTLRTreeNodeStream.h"
-
-@interface ANTLRDebugTreeNodeStream : NSObject <ANTLRTreeNodeStream> {
-	id<ANTLRDebugEventListener> debugListener;
-	id<ANTLRTreeAdaptor> treeAdaptor;
-	id<ANTLRTreeNodeStream> input;
-	BOOL initialStreamState;
-}
-
-- (id) initWithTreeNodeStream:(id<ANTLRTreeNodeStream>)theStream debugListener:(id<ANTLRDebugEventListener>)debugger;
-
-- (id<ANTLRDebugEventListener>) debugListener;
-- (void) setDebugListener: (id<ANTLRDebugEventListener>) aDebugListener;
-
-- (id<ANTLRTreeNodeStream>) getInput;
-- (void) setInput: (id<ANTLRTreeNodeStream>) aTreeNodeStream;
-
-- (id<ANTLRTreeAdaptor>) getTreeAdaptor;
-- (void) setTreeAdaptor: (id<ANTLRTreeAdaptor>) aTreeAdaptor;
-
-#pragma mark ANTLRTreeNodeStream conformance
-
-- (id) LT:(NSInteger)k;
-- (id<ANTLRTreeAdaptor>) getTreeAdaptor;
-- (void) setUniqueNavigationNodes:(BOOL)flag;
-
-#pragma mark ANTLRIntStream conformance
-- (void) consume;
-- (NSInteger) LA:(NSUInteger) i;
-- (NSUInteger) mark;
-- (NSUInteger) getIndex;
-- (void) rewind:(NSUInteger) marker;
-- (void) rewind;
-- (void) release:(NSUInteger) marker;
-- (void) seek:(NSUInteger) index;
-- (NSUInteger) size;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRDebugTreeParser.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRDebugTreeParser.h
deleted file mode 100755
index cbeac76..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRDebugTreeParser.h
+++ /dev/null
@@ -1,48 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTreeParser.h"
-#import "ANTLRDebugEventProxy.h"
-#import "ANTLRDebugTreeNodeStream.h"
-
-@interface ANTLRDebugTreeParser : ANTLRTreeParser {
-	id<ANTLRDebugEventListener> debugListener;
-}
-
-- (id) initWithTreeNodeStream:(id<ANTLRTreeNodeStream>)theStream;
-- (id) initWithTreeNodeStream:(id<ANTLRTreeNodeStream>)theStream
-				 debuggerPort:(NSInteger)portNumber;
-	// designated initializer
-- (id) initWithTreeNodeStream:(id<ANTLRTreeNodeStream>)theStream
-				debugListener:(id<ANTLRDebugEventListener>)theDebugListener
-				 debuggerPort:(NSInteger)portNumber;
-
-- (id<ANTLRDebugEventListener>) debugListener;
-- (void) setDebugListener: (id<ANTLRDebugEventListener>) aDebugListener;
-
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLREarlyExitException.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLREarlyExitException.h
deleted file mode 100755
index 1a89bbb..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLREarlyExitException.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRecognitionException.h"
-
-@interface ANTLREarlyExitException : ANTLRRecognitionException {
-	int decisionNumber;
-}
-
-+ (ANTLREarlyExitException *) exceptionWithStream:(id<ANTLRIntStream>) anInputStream decisionNumber:(NSInteger) aDecisionNumber;
-- (id) initWithStream:(id<ANTLRIntStream>)anInputStream decisionNumber:(NSInteger) aDecisionNumber;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRError.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRError.h
deleted file mode 100644
index f2657af..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRError.h
+++ /dev/null
@@ -1,55 +0,0 @@
-//
-//  ANTLRError.h
-//  ANTLR
-//
-//  Created by Ian Michell on 30/03/2010.
-//  Copyright 2010 Ian Michell. All rights reserved.
-//
-
-// [The "BSD licence"]
-//
-// 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.
-
-#import <Cocoa/Cocoa.h>
-
-#define ANTLRErrorDomain @"ANTLRError"
-
-#define ANTLRIllegalArgumentException @"ANTLRIllegalArgumentException"
-#define ANTLRIllegalStateException @"IllegalStateException"
-//#define ANTLRRuntimeException @"RuntimeException"
-//#define ANTLRNoSuchMethodException @"NoSuchMethodException"
-//#define ANTLRNoSuchElementException @"NoSuchElementException"
-//#define ANTLRUnsupportedOperationException @"UnsupportedOperationException"
-
-
-/*typedef enum
-{
-	ANTLRIllegalState = 1,
-	ANTLRIllegalArgument = 2,
-	ANTLRRecognitionError = 3,
-	ANTLRMissingTokenError = 4,
-	ANTLRUnwantedTokenError = 5,
-	ANTLRMismatechedTokenError = 6,
-	ANTLRNoViableAltError = 7
-	
-} ANTLRErrorCode;*/
\ No newline at end of file
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRFailedPredicateException.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRFailedPredicateException.h
deleted file mode 100755
index 9788cba..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRFailedPredicateException.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRecognitionException.h"
-
-
-@interface ANTLRFailedPredicateException : ANTLRRecognitionException
-{
-	NSString *predicate;
-	NSString *ruleName;
-}
-
-@property (retain, getter=getPredicate, setter=setPredicate:) NSString *predicate;
-@property (retain, getter=getRuleName, setter=setRuleName:) NSString *ruleName;
-
-+ (ANTLRFailedPredicateException *) exceptionWithRuleName:(NSString *)theRuleName predicate:(NSString *)thePredicate stream:(id<ANTLRIntStream>)theStream;
-- (ANTLRFailedPredicateException *) initWithRuleName:(NSString *)theRuleName predicate:(NSString *)thePredicate stream:(id<ANTLRIntStream>)theStream;
-
-#ifdef DONTUSEYET
-- (NSString *) getPredicate;
-- (void) setPredicate:(NSString *)thePredicate;
-- (NSString *) getRuleName;
-- (void) setRuleName:(NSString *)theRuleName;
-#endif
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRFastQueue.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRFastQueue.h
deleted file mode 100644
index cf81817..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRFastQueue.h
+++ /dev/null
@@ -1,68 +0,0 @@
-//
-//  ANTLRFastQueue.h
-//  ANTLR
-//
-//  Created by Ian Michell on 26/04/2010.
-// [The "BSD licence"]
-// Copyright (c) 2010 Ian Michell 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-
-
-@interface ANTLRFastQueue : NSObject <NSCopying>
-{
-	NSAutoreleasePool *pool;
-	NSMutableArray *data;
-	NSInteger p;
-}
-
-@property (retain, getter=getPool, setter=setPool) NSAutoreleasePool *pool;
-@property (retain, getter=getData, setter=setData) NSMutableArray *data;
-@property (assign, getter=getP, setter=setP) NSInteger p;
-
-+ (id) newANTLRFastQueue;
-
-- (id) init;
-
-- (id) copyWithZone:(NSZone *)aZone;
-
-- (void) reset;
-- (id) remove;
-- (void) addObject:(id) o;
-- (NSInteger) count;
-- (NSInteger) size;
-- (id) head;
-- (id) objectAtIndex:(NSInteger) i;
-- (void) clear;
-- (NSString *) toString;
-- (NSAutoreleasePool *)getPool;
-- (void)setPool:(NSAutoreleasePool *)aPool;
-- (NSMutableArray *)getData;
-- (void)setData:(NSMutableArray *)myData;
-- (NSInteger) getP;
-- (void) setP:(NSInteger)anInt;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRHashMap.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRHashMap.h
deleted file mode 100644
index 04aca7b..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRHashMap.h
+++ /dev/null
@@ -1,102 +0,0 @@
-//
-//  ANTLRHashMap.h
-//  ANTLR
-//
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRLinkBase.h"
-#import "ANTLRMapElement.h"
-
-#define GLOBAL_SCOPE       0
-#define LOCAL_SCOPE        1
-#define HASHSIZE         101
-#define HBUFSIZE      0x2000
-
-@interface ANTLRHashMap : ANTLRLinkBase {
-	//	ANTLRHashMap *fNext;
-    //    TStringPool *fPool;
-    NSInteger Scope;
-    NSInteger LastHash;
-    NSInteger BuffSize;
-    ANTLRMapElement *ptrBuffer[HASHSIZE];
-    NSInteger mode;
-}
-
-//@property (copy) ANTLRHashMap *fNext;
-//@property (copy) TStringPool *fPool;
-@property (getter=getScope, setter=setScope:) NSInteger Scope;
-@property (getter=getLastHash, setter=setLastHash:) NSInteger LastHash;
-
-// Contruction/Destruction
-+ (id)newANTLRHashMap;
-+ (id)newANTLRHashMapWithLen:(NSInteger)aBuffSize;
-- (id)init;
-- (id)initWithLen:(NSInteger)aBuffSize;
-- (void)dealloc;
-- (ANTLRHashMap *)PushScope:( ANTLRHashMap **)map;
-- (ANTLRHashMap *)PopScope:( ANTLRHashMap **)map;
-
-- (NSInteger)count;
-- (NSInteger)size;
-
-// Instance Methods
-/*    form hash value for string s */
-- (NSInteger)hash:(NSString *)s;
-/*   look for s in ptrBuffer  */
-- (ANTLRHashMap *)findscope:(int)level;
-/*   look for s in ptrBuffer  */
-- (id)lookup:(NSString *)s Scope:(int)scope;
-/*   look for s in ptrBuffer  */
-- (id)install:(ANTLRMapElement *)sym Scope:(int)scope;
-/*   look for s in ptrBuffer  */
-- (void)deleteANTLRHashMap:(ANTLRMapElement *)np;
-- (int)RemoveSym:(NSString *)s;
-- (void)delete_chain:(ANTLRMapElement *)np;
-#ifdef DONTUSEYET
-- (int)bld_symtab:(KW_TABLE *)toknams;
-#endif
-- (ANTLRMapElement **)getptrBuffer;
-- (ANTLRMapElement *)getptrBufferEntry:(int)idx;
-- (void)setptrBuffer:(ANTLRMapElement *)np Index:(int)idx;
-- (NSInteger)getScope;
-- (void)setScope:(NSInteger)i;
-- (ANTLRMapElement *)getTType:(NSString *)name;
-- (ANTLRMapElement *)getNameInList:(NSInteger)ttype;
-- (void)putNode:(NSString *)name TokenType:(NSInteger)ttype;
-- (NSInteger)getMode;
-- (void)setMode:(NSInteger)aMode;
-- (void) insertObject:(id)aRule atIndex:(NSInteger)idx;
-- (id) objectAtIndex:(NSInteger)idx;
-- (void) setObject:(id)aRule atIndex:(NSInteger)idx;
-- (void)addObject:(id)anObject;
-- (ANTLRMapElement *) getName:(NSString *)aName;
-- (void) putName:(NSString *)name Node:(id)aNode;
-
-- (NSEnumerator *)objectEnumerator;
-- (BOOL) hasNext;
-- (ANTLRMapElement *)nextObject;
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRHashMap.m b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRHashMap.m
deleted file mode 100644
index a23426b..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRHashMap.m
+++ /dev/null
@@ -1,521 +0,0 @@
-//
-//  ANTLRHashMap.m
-//  ANTLR
-//
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#define SUCCESS (0)
-#define FAILURE (-1)
-
-#import "ANTLRHashMap.h"
-
-static NSInteger itIndex;
-
-/*
- * Start of ANTLRHashMap
- */
-@implementation ANTLRHashMap
-
-@synthesize Scope;
-@synthesize LastHash;
-
-+(id)newANTLRHashMap
-{
-    ANTLRHashMap *aNewANTLRHashMap;
-    
-    aNewANTLRHashMap = [[ANTLRHashMap alloc] init];
-	return( aNewANTLRHashMap );
-}
-
-+(id)newANTLRHashMapWithLen:(NSInteger)aBuffSize
-{
-    ANTLRHashMap *aNewANTLRHashMap;
-    
-    aNewANTLRHashMap = [[ANTLRHashMap alloc] initWithLen:aBuffSize];
-	return( aNewANTLRHashMap );
-}
-
--(id)init
-{
-    NSInteger idx;
-    
-	if ((self = [super init]) != nil) {
-		fNext = nil;
-        BuffSize = HASHSIZE;
-		Scope = 0;
-		if ( fNext != nil ) {
-			Scope = ((ANTLRHashMap *)fNext)->Scope+1;
-			for( idx = 0; idx < BuffSize; idx++ ) {
-				ptrBuffer[idx] = ((ANTLRHashMap *)fNext)->ptrBuffer[idx];
-			}
-		}
-        mode = 0;
-	}
-    return( self );
-}
-
--(id)initWithLen:(NSInteger)aBuffSize
-{
-    NSInteger idx;
-    
-	if ((self = [super init]) != nil) {
-		fNext = nil;
-        BuffSize = aBuffSize;
-		Scope = 0;
-		if ( fNext != nil ) {
-			Scope = ((ANTLRHashMap *)fNext)->Scope+1;
-			for( idx = 0; idx < BuffSize; idx++ ) {
-				ptrBuffer[idx] = ((ANTLRHashMap *)fNext)->ptrBuffer[idx];
-			}
-		}
-        mode = 0;
-	}
-    return( self );
-}
-
--(void)dealloc
-{
-    ANTLRMapElement *tmp, *rtmp;
-    NSInteger idx;
-	
-    if ( self.fNext != nil ) {
-        for( idx = 0; idx < BuffSize; idx++ ) {
-            tmp = ptrBuffer[idx];
-            while ( tmp && tmp != [((ANTLRHashMap *)fNext) getptrBufferEntry:idx] ) {
-                rtmp = tmp;
-                // tmp = [tmp getfNext];
-                tmp = (ANTLRMapElement *)tmp.fNext;
-                [rtmp dealloc];
-            }
-        }
-    }
-	[super dealloc];
-}
-
-- (NSInteger)count
-{
-    id anElement;
-    NSInteger aCnt = 0;
-    
-    for (NSInteger i = 0; i < BuffSize; i++) {
-        if ((anElement = ptrBuffer[i]) != nil) {
-            aCnt++;
-        }
-    }
-    return aCnt;
-}
-                          
-- (NSInteger) size
-{
-    id anElement;
-    NSInteger aSize = 0;
-    
-    for (NSInteger i = 0; i < BuffSize; i++) {
-        if ((anElement = ptrBuffer[i]) != nil) {
-            aSize += sizeof(id);
-        }
-    }
-    return aSize;
-}
-                                  
-                                  
--(void)deleteANTLRHashMap:(ANTLRMapElement *)np
-{
-    ANTLRMapElement *tmp, *rtmp;
-    NSInteger idx;
-    
-    if ( self.fNext != nil ) {
-        for( idx = 0; idx < BuffSize; idx++ ) {
-            tmp = ptrBuffer[idx];
-            while ( tmp && tmp != (ANTLRLinkBase *)[((ANTLRHashMap *)fNext) getptrBufferEntry:idx] ) {
-                rtmp = tmp;
-                tmp = [tmp getfNext];
-                [rtmp dealloc];
-            }
-        }
-    }
-}
-
--(ANTLRHashMap *)PushScope:(ANTLRHashMap **)map
-{
-    NSInteger idx;
-    ANTLRHashMap *htmp;
-    
-    htmp = [ANTLRHashMap newANTLRHashMap];
-    if ( *map != nil ) {
-        ((ANTLRHashMap *)htmp)->fNext = *map;
-        [htmp setScope:[((ANTLRHashMap *)htmp->fNext) getScope]+1];
-        for( idx = 0; idx < BuffSize; idx++ ) {
-            htmp->ptrBuffer[idx] = ((ANTLRHashMap *)htmp->fNext)->ptrBuffer[idx];
-        }
-    }
-    //    gScopeLevel++;
-    *map = htmp;
-    return( htmp );
-}
-
--(ANTLRHashMap *)PopScope:(ANTLRHashMap **)map
-{
-    NSInteger idx;
-    ANTLRMapElement *tmp;
-	ANTLRHashMap *htmp;
-    
-    htmp = *map;
-    if ( (*map)->fNext != nil ) {
-        *map = (ANTLRHashMap *)htmp->fNext;
-        for( idx = 0; idx < BuffSize; idx++ ) {
-            if ( htmp->ptrBuffer[idx] == nil ||
-                htmp->ptrBuffer[idx] == (*map)->ptrBuffer[idx] ) {
-                break;
-            }
-            tmp = htmp->ptrBuffer[idx];
-            /*
-             * must deal with parms, locals and labels at some point
-             * can not forget the debuggers
-             */
-            htmp->ptrBuffer[idx] = [tmp getfNext];
-            [ tmp dealloc];
-        }
-        *map = (ANTLRHashMap *)htmp->fNext;
-        //        gScopeLevel--;
-    }
-    return( htmp );
-}
-
-#ifdef USERDOC
-/*
- *  HASH        hash entry to get index to table
- *  NSInteger hash( ANTLRHashMap *self, char *s );
- *
- *     Inputs:  char *s             string to find
- *
- *     Returns: NSInteger                 hashed value
- *
- *  Last Revision 9/03/90
- */
-#endif
--(NSInteger)hash:(NSString *)s       /*    form hash value for string s */
-{
-	NSInteger hashval;
-	const char *tmp;
-    
-	tmp = [s cStringUsingEncoding:NSASCIIStringEncoding];
-	for( hashval = 0; *tmp != '\0'; )
-        hashval += *tmp++;
-	self->LastHash = hashval % BuffSize;
-	return( self->LastHash );
-}
-
-#ifdef USERDOC
-/*
- *  FINDSCOPE  search hashed list for entry
- *  ANTLRHashMap *findscope( ANTLRHashMap *self, NSInteger scope );
- *
- *     Inputs:  NSInteger       scope -- scope level to find
- *
- *     Returns: ANTLRHashMap   pointer to ptrBuffer of proper scope level
- *
- *  Last Revision 9/03/90
- */
-#endif
--(ANTLRHashMap *)findscope:(NSInteger)scope
-{
-    if ( self->Scope == scope ) {
-        return( self );
-    }
-    else if ( fNext ) {
-        return( [((ANTLRHashMap *)fNext) findscope:scope] );
-    }
-    return( nil );              /*   not found      */
-}
-
-#ifdef USERDOC
-/*
- *  LOOKUP  search hashed list for entry
- *  ANTLRMapElement *lookup( ANTLRHashMap *self, char *s, NSInteger scope );
- *
- *     Inputs:  char     *s          string to find
- *
- *     Returns: ANTLRMapElement  *           pointer to entry
- *
- *  Last Revision 9/03/90
- */
-#endif
--(id)lookup:(NSString *)s Scope:(NSInteger)scope
-{
-    ANTLRMapElement *np;
-    
-    for( np = self->ptrBuffer[[self hash:s]]; np != nil; np = [np getfNext] ) {
-        if ( [s isEqualToString:[np getName]] ) {
-            return( np );        /*   found it       */
-        }
-    }
-    return( nil );              /*   not found      */
-}
-
-#ifdef USERDOC
-/*
- *  INSTALL search hashed list for entry
- *  NSInteger install( ANTLRHashMap *self, ANTLRMapElement *sym, NSInteger scope );
- *
- *     Inputs:  ANTLRMapElement    *sym   -- symbol ptr to install
- *              NSInteger         scope -- level to find
- *
- *     Returns: Boolean     TRUE   if installed
- *                          FALSE  if already in table
- *
- *  Last Revision 9/03/90
- */
-#endif
--(ANTLRMapElement *)install:(ANTLRMapElement *)sym Scope:(NSInteger)scope
-{
-    ANTLRMapElement *np;
-    
-    np = [self lookup:[sym getName] Scope:scope ];
-    if ( np == nil ) {
-        [sym retain];
-        [sym setFNext:self->ptrBuffer[ self->LastHash ]];
-        self->ptrBuffer[ self->LastHash ] = sym;
-        return( self->ptrBuffer[ self->LastHash ] );
-    }
-    return( nil );            /*   not found      */
-}
-
-#ifdef USERDOC
-/*
- *  RemoveSym  search hashed list for entry
- *  NSInteger RemoveSym( ANTLRHashMap *self, char *s );
- *
- *     Inputs:  char     *s          string to find
- *
- *     Returns: NSInteger      indicator of SUCCESS OR FAILURE
- *
- *  Last Revision 9/03/90
- */
-#endif
--(NSInteger)RemoveSym:(NSString *)s
-{
-    ANTLRMapElement *np, *tmp;
-    NSInteger idx;
-    
-    idx = [self hash:s];
-    for ( tmp = self->ptrBuffer[idx], np = self->ptrBuffer[idx]; np != nil; np = [np getfNext] ) {
-        if ( [s isEqualToString:[np getName]] ) {
-            tmp = [np getfNext];             /* get the next link  */
-            [np dealloc];
-            return( SUCCESS );            /* report SUCCESS     */
-        }
-        tmp = [np getfNext];              //  BAD!!!!!!
-    }
-    return( FAILURE );                    /*   not found      */
-}
-
--(void)delete_chain:(ANTLRMapElement *)np
-{
-    if ( [np getfNext] != nil )
-		[self delete_chain:[np getfNext]];
-	[np dealloc];
-}
-
-#ifdef DONTUSEYET
--(NSInteger)bld_symtab:(KW_TABLE *)toknams
-{
-    NSInteger i;
-    ANTLRMapElement *np;
-    
-    for( i = 0; *(toknams[i].name) != '\0'; i++ ) {
-        // install symbol in ptrBuffer
-        np = [ANTLRMapElement newANTLRMapElement:[NSString stringWithFormat:@"%s", toknams[i].name]];
-        //        np->fType = toknams[i].toknum;
-        [self install:np Scope:0];
-    }
-    return( SUCCESS );
-}
-#endif
-
--(ANTLRMapElement *)getptrBufferEntry:(NSInteger)idx
-{
-	return( ptrBuffer[idx] );
-}
-
--(ANTLRMapElement **)getptrBuffer
-{
-	return( ptrBuffer );
-}
-
--(void)setptrBuffer:(ANTLRMapElement *)np Index:(NSInteger)idx
-{
-	if ( idx < BuffSize ) {
-        [np retain];
-		ptrBuffer[idx] = np;
-    }
-}
-
--(NSInteger)getScope
-{
-	return( Scope );
-}
-
--(void)setScopeScope:(NSInteger)i
-{
-	Scope = i;
-}
-
-- (ANTLRMapElement *)getTType:(NSString *)name
-{
-    return [self lookup:name Scope:0];
-}
-
-/*
- * works only for maplist indexed not by name but by TokenNumber
- */
-- (ANTLRMapElement *)getNameInList:(NSInteger)ttype
-{
-    ANTLRMapElement *np;
-    NSInteger aTType;
-
-    aTType = ttype % BuffSize;
-    for( np = self->ptrBuffer[ttype]; np != nil; np = [np getfNext] ) {
-        if ( [np.index integerValue] == ttype ) {
-            return( np );        /*   found it       */
-        }
-    }
-    return( nil );              /*   not found      */
-}
-
-- (ANTLRLinkBase *)getName:(NSString *)name
-{
-    return [self lookup:name Scope:0]; /*  nil if not found      */    
-}
-
-- (void)putNode:(NSString *)name TokenType:(NSInteger)ttype
-{
-    ANTLRMapElement *np;
-    
-    // install symbol in ptrBuffer
-    np = [ANTLRMapElement newANTLRMapElementWithName:[NSString stringWithString:name] Type:ttype];
-    //        np->fType = toknams[i].toknum;
-    [self install:np Scope:0];
-}
-
-- (NSInteger)getMode
-{
-    return mode;
-}
-
-- (void)setMode:(NSInteger)aMode
-{
-    mode = aMode;
-}
-
-- (void) addObject:(id)aRule
-{
-    NSInteger idx;
-
-    idx = [self count];
-    if ( idx >= BuffSize ) {
-        idx %= BuffSize;
-    }
-    ptrBuffer[idx] = aRule;
-}
-
-/* this may have to handle linking into the chain
- */
-- (void) insertObject:(id)aRule atIndex:(NSInteger)idx
-{
-    if ( idx >= BuffSize ) {
-        idx %= BuffSize;
-    }
-    if (aRule != ptrBuffer[idx]) {
-        if (ptrBuffer[idx] != nil) [ptrBuffer[idx] release];
-        [aRule retain];
-    }
-    ptrBuffer[idx] = aRule;
-}
-
-- (id)objectAtIndex:(NSInteger)idx
-{
-    if ( idx >= BuffSize ) {
-        idx %= BuffSize;
-    }
-    return ptrBuffer[idx];
-}
-
-/* this will never link into the chain
- */
-- (void) setObject:(id)aRule atIndex:(NSInteger)idx
-{
-    if ( idx >= BuffSize ) {
-        idx %= BuffSize;
-    }
-    if (aRule != ptrBuffer[idx]) {
-        if (ptrBuffer[idx] != nil) [ptrBuffer[idx] release];
-        [aRule retain];
-    }
-    ptrBuffer[idx] = aRule;
-}
-
-- (void)putName:(NSString *)name Node:(id)aNode
-{
-    ANTLRMapElement *np;
-    
-    np = [self lookup:name Scope:0 ];
-    if ( np == nil ) {
-        np = [ANTLRMapElement newANTLRMapElementWithName:name Node:aNode];
-        if (ptrBuffer[LastHash] != nil)
-            [ptrBuffer[LastHash] release];
-        [np retain];
-        np.fNext = ptrBuffer[ LastHash ];
-        ptrBuffer[ LastHash ] = np;
-    }
-    return;    
-}
-
-- (NSEnumerator *)objectEnumerator
-{
-    NSEnumerator *anEnumerator;
-
-    itIndex = 0;
-    return anEnumerator;
-}
-
-- (BOOL)hasNext
-{
-    if (self && [self count] < BuffSize-1) {
-        return YES;
-    }
-    return NO;
-}
-
-- (ANTLRMapElement *)nextObject
-{
-    if (self && itIndex < BuffSize-1) {
-        return ptrBuffer[itIndex];
-    }
-    return nil;
-}
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRHashRule.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRHashRule.h
deleted file mode 100644
index f1558e8..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRHashRule.h
+++ /dev/null
@@ -1,72 +0,0 @@
-//
-//  ANTLRHashRule.h
-//  ANTLR
-//
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRuleMemo.h"
-#import "ANTLRPtrBuffer.h"
-
-#define GLOBAL_SCOPE       0
-#define LOCAL_SCOPE        1
-#define HASHSIZE         101
-#define HBUFSIZE      0x2000
-
-@interface ANTLRHashRule : ANTLRPtrBuffer {
-	//	ANTLRHashRule *fNext;
-    //    TStringPool *fPool;
-    NSInteger LastHash;
-    NSInteger mode;
-}
-
-//@property (copy) ANTLRHashRule *fNext;
-@property (getter=getLastHash, setter=setLastHash:) NSInteger LastHash;
-
-// Contruction/Destruction
-+ (id)newANTLRHashRule;
-+ (id)newANTLRHashRuleWithLen:(NSInteger)aBuffSize;
-- (id)init;
-- (id)initWithLen:(NSInteger)aBuffSize;
-- (void)dealloc;
-
-- (NSInteger)count;
-- (NSInteger)length;
-- (NSInteger)size;
-
-// Instance Methods
-- (void)deleteANTLRHashRule:(ANTLRRuleMemo *)np;
-- (void)delete_chain:(ANTLRRuleMemo *)np;
-- (ANTLRRuleMemo **)getPtrBuffer;
-- (void)setPtrBuffer:(ANTLRRuleMemo **)np;
-- (NSNumber *)getRuleMemoStopIndex:(NSInteger)aStartIndex;
-- (void)putRuleMemoAtStartIndex:(NSInteger)aStartIndex StopIndex:(NSInteger)aStopIndex;
-- (NSInteger)getMode;
-- (void)setMode:(NSInteger)aMode;
-- (void) insertObject:(ANTLRRuleMemo *)aRule atIndex:(NSInteger)Index;
-- (ANTLRRuleMemo *) objectAtIndex:(NSInteger)Index;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRHashRule.m b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRHashRule.m
deleted file mode 100644
index 93ce3a1..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRHashRule.m
+++ /dev/null
@@ -1,281 +0,0 @@
-//
-//  ANTLRHashRule.m
-//  ANTLR
-//
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#define SUCCESS (0)
-#define FAILURE (-1)
-#define ANTLR_MEMO_RULE_UNKNOWN -1
-
-#import "ANTLRHashRule.h"
-
-/*
- * Start of ANTLRHashRule
- */
-@implementation ANTLRHashRule
-
-@synthesize LastHash;
-
-+(id)newANTLRHashRule
-{
-    ANTLRHashRule *aNewANTLRHashRule;
-    
-    aNewANTLRHashRule = [[ANTLRHashRule alloc] init];
-	return( aNewANTLRHashRule );
-}
-
-+(id)newANTLRHashRuleWithLen:(NSInteger)aBuffSize
-{
-    ANTLRHashRule *aNewANTLRHashRule;
-    
-    aNewANTLRHashRule = [[ANTLRHashRule alloc] initWithLen:aBuffSize];
-	return( aNewANTLRHashRule );
-}
-
--(id)init
-{
-	if ((self = [super initWithLen:HASHSIZE]) != nil) {
-		fNext = nil;
-	}
-    return( self );
-}
-
--(id)initWithLen:(NSInteger)aBuffSize
-{
-	if ((self = [super initWithLen:aBuffSize]) != nil) {
-		fNext = nil;
-        mode = 0;
-	}
-    return( self );
-}
-
--(void)dealloc
-{
-    ANTLRRuleMemo *tmp, *rtmp;
-    int Index;
-	
-    if ( self.fNext != nil ) {
-        for( Index = 0; Index < BuffSize; Index++ ) {
-            tmp = ptrBuffer[Index];
-            while ( tmp && tmp != ptrBuffer[Index] ) {
-                rtmp = tmp;
-                // tmp = [tmp getfNext];
-                tmp = (ANTLRRuleMemo *)tmp.fNext;
-                [rtmp dealloc];
-            }
-        }
-    }
-	[super dealloc];
-}
-
-- (NSInteger)count
-{
-    id anElement;
-    NSInteger aCnt = 0;
-    
-    for (int i = 0; i < BuffSize; i++) {
-        anElement = ptrBuffer[i];
-        if ( anElement != nil ) {
-            aCnt++;
-        }
-    }
-    return aCnt;
-}
-                          
-- (NSInteger) length
-{
-    return BuffSize;
-}
-
-- (NSInteger) size
-{
-    id anElement;
-    NSInteger aSize = 0;
-    
-    for (int i = 0; i < BuffSize; i++) {
-        if ((anElement = ptrBuffer[i]) != nil) {
-            aSize += sizeof(id);
-        }
-    }
-    return aSize;
-}
-                                  
-                                  
--(void)deleteANTLRHashRule:(ANTLRRuleMemo *)np
-{
-    ANTLRRuleMemo *tmp, *rtmp;
-    int Index;
-    
-    if ( self.fNext != nil ) {
-        for( Index = 0; Index < BuffSize; Index++ ) {
-            tmp = ptrBuffer[Index];
-            while ( tmp && tmp != ptrBuffer[Index ] ) {
-                rtmp = tmp;
-                tmp = tmp.fNext;
-                [rtmp dealloc];
-            }
-        }
-    }
-}
-
--(void)delete_chain:(ANTLRRuleMemo *)np
-{
-    if ( np.fNext != nil )
-		[self delete_chain:np.fNext];
-	[np dealloc];
-}
-
--(ANTLRRuleMemo **)getPtrBuffer
-{
-	return( ptrBuffer );
-}
-
--(void)setPtrBuffer:(ANTLRRuleMemo **)np
-{
-	ptrBuffer = np;
-}
-
-- (NSNumber *)getRuleMemoStopIndex:(NSInteger)aStartIndex
-{
-    ANTLRRuleMemo *aRule;
-    NSNumber *stopIndex;
-    NSInteger anIndex;
-    
-    anIndex = ( aStartIndex >= BuffSize ) ? aStartIndex %= BuffSize : aStartIndex;
-    if ((aRule = ptrBuffer[anIndex]) == nil) {
-        return nil;
-    }
-    stopIndex = [aRule getStopIndex:aStartIndex];
-    return stopIndex;
-}
-
-- (void)putRuleMemo:(ANTLRRuleMemo *)aRule AtStartIndex:(NSInteger)aStartIndex
-{
-    NSInteger anIndex;
-    
-    anIndex = (aStartIndex >= BuffSize) ? aStartIndex %= BuffSize : aStartIndex;
-    if ( ptrBuffer[anIndex] == nil ) {
-        ptrBuffer[anIndex] = aRule;
-        [aRule retain];
-    }
-    else {
-        do {
-            if ( [aRule.startIndex integerValue] == aStartIndex ) {
-                [aRule setStartIndex:aRule.stopIndex];
-                return;
-            }
-            aRule = aRule.fNext;
-        } while ( aRule != nil );
-    }
-}
-
-- (void)putRuleMemoAtStartIndex:(NSInteger)aStartIndex StopIndex:(NSInteger)aStopIndex
-{
-    ANTLRRuleMemo *aRule, *newRule;
-    NSInteger anIndex;
-    NSInteger aMatchIndex;
-
-    anIndex = (aStartIndex >= BuffSize) ? aStartIndex %= BuffSize : aStartIndex;
-    if ((aRule = ptrBuffer[anIndex]) == nil ) {
-        aRule = [ANTLRRuleMemo newANTLRRuleMemoWithStartIndex:[NSNumber numberWithInteger:aStartIndex]
-                                                    StopIndex:[NSNumber numberWithInteger:aStopIndex]];
-        [aRule retain];
-        ptrBuffer[anIndex] = aRule;
-    }
-    else {
-        aMatchIndex = [aRule.startIndex integerValue];
-        if ( aStartIndex > aMatchIndex ) {
-            if ( aRule != ptrBuffer[anIndex] ) {
-                [aRule retain];
-            }
-            aRule.fNext = ptrBuffer[anIndex];
-            ptrBuffer[anIndex] = aRule;
-            return;
-        }
-        while (aRule.fNext != nil) {
-            aMatchIndex = [((ANTLRRuleMemo *)aRule.fNext).startIndex integerValue];
-            if ( aStartIndex > aMatchIndex ) {
-                newRule = [ANTLRRuleMemo newANTLRRuleMemoWithStartIndex:[NSNumber numberWithInteger:aStartIndex]
-                                                              StopIndex:[NSNumber numberWithInteger:aStopIndex]];
-                [newRule retain];
-                newRule.fNext = aRule.fNext;
-                aRule.fNext = newRule;
-                return;
-            }
-            if ( aMatchIndex == aStartIndex ) {
-                [aRule setStartIndex:aRule.stopIndex];
-                return;
-            }
-            aRule = aRule.fNext;
-        }
-    }
-}
-
-- (NSInteger)getLastHash
-{
-    return LastHash;
-}
-
-- (void)setLastHash:(NSInteger)aHash
-{
-    LastHash = aHash;
-}
-
-- (NSInteger)getMode
-{
-    return mode;
-}
-
-- (void)setMode:(NSInteger)aMode
-{
-    mode = aMode;
-}
-
-- (void) insertObject:(ANTLRRuleMemo *)aRule atIndex:(NSInteger)anIndex
-{
-    NSInteger Index;
-    
-    Index = ( anIndex >= BuffSize ) ? anIndex %= BuffSize : anIndex;
-    if (aRule != ptrBuffer[Index]) {
-        if (ptrBuffer[Index] != nil) {
-            [ptrBuffer[Index] release];
-        }
-        [aRule retain];
-    }
-    ptrBuffer[Index] = aRule;
-}
-
-- (ANTLRRuleMemo *)objectAtIndex:(NSInteger)anIndex
-{
-    NSInteger anIdx;
-
-    anIdx = ( anIndex >= BuffSize ) ? anIndex %= BuffSize : anIndex;
-    return ptrBuffer[anIdx];
-}
-
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRIntArray.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRIntArray.h
deleted file mode 100644
index 5269b23..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRIntArray.h
+++ /dev/null
@@ -1,60 +0,0 @@
-//
-//  ANTLRIntArray.h
-//  ANTLR
-//
-// Copyright (c) 2010 Ian Michell 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRPtrBuffer.h"
-
-#define ANTLR_INT_ARRAY_INITIAL_SIZE 10
-
-@interface ANTLRIntArray : ANTLRPtrBuffer 
-{
-}
-
-+ (ANTLRIntArray *)newANTLRIntArray;
-+ (ANTLRIntArray *)newANTLRIntArrayWithLen:(NSInteger)aLen;
-
-- (id) init;
-- (id) initWithLen:(NSInteger)aLen;
-
-- (void) dealloc;
-
-- (id) copyWithZone:(NSZone *)aZone;
-
-- (void) addInteger:(NSInteger) v;
-- (void) push:(NSInteger) v;
-- (NSInteger) pop;
-- (NSInteger) integerAtIndex:(NSInteger) i;
-- (void) insertInteger:(NSInteger)anInteger AtIndex:(NSInteger) idx;
-- (NSInteger) size;
-- (void) reset;
-
-- (NSInteger) count;
-- (NSInteger) size;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRIntStream.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRIntStream.h
deleted file mode 100755
index 3790cd9..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRIntStream.h
+++ /dev/null
@@ -1,93 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-@protocol ANTLRIntStream < NSObject, NSCopying >
-
-- (void) consume;
-
-// Get unichar at current input pointer + i ahead where i=1 is next character as int for including ANTLRCharStreamEOF (-1) in the data range
-- (NSInteger) LA:(NSInteger) i;
-
-// Tell the stream to start buffering if it hasn't already.  Return
-// current input position, index(), or some other marker so that
-// when passed to rewind() you get back to the same spot.
-// rewind(mark()) should not affect the input cursor.
-// TODO: problem in that lexer stream returns not index but some marker 
-
-- (NSInteger) mark;
-
-// Return the current input symbol index 0..n where n indicates the
-// last symbol has been read.
-
-- (NSInteger) getIndex;
-
-// Reset the stream so that next call to index would return marker.
-// The marker will usually be -index but it doesn't have to be.  It's
-// just a marker to indicate what state the stream was in.  This is
-// essentially calling -release: and -seek:.  If there are markers
-// created after this marker argument, this routine must unroll them
-// like a stack.  Assume the state the stream was in when this marker
-// was created.
-
-- (void) rewind;
-- (void) rewind:(NSInteger) marker;
-
-// You may want to commit to a backtrack but don't want to force the
-// stream to keep bookkeeping objects around for a marker that is
-// no longer necessary.  This will have the same behavior as
-// rewind() except it releases resources without the backward seek.
-
-- (void) release:(NSInteger) marker;
-
-// Set the input cursor to the position indicated by index.  This is
-// normally used to seek ahead in the input stream.  No buffering is
-// required to do this unless you know your stream will use seek to
-// move backwards such as when backtracking.
-// This is different from rewind in its multi-directional
-// requirement and in that its argument is strictly an input cursor (index).
-//
-// For char streams, seeking forward must update the stream state such
-// as line number.  For seeking backwards, you will be presumably
-// backtracking using the mark/rewind mechanism that restores state and
-// so this method does not need to update state when seeking backwards.
-//
-// Currently, this method is only used for efficient backtracking, but
-// in the future it may be used for incremental parsing.
-
-- (void) seek:(NSInteger) index;
-
-/** Only makes sense for streams that buffer everything up probably, but
- *  might be useful to display the entire stream or for testing.  This
- *  value includes a single EOF.
- */
-- (NSUInteger) size;
-/** Where are you getting symbols from?  Normally, implementations will
- *  pass the buck all the way to the lexer who can ask its input stream
- *  for the file name or whatever.
- */
-- (NSString *)getSourceName;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRLexer.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRLexer.h
deleted file mode 100755
index 5cfb36f..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRLexer.h
+++ /dev/null
@@ -1,90 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTokenSource.h"
-#import "ANTLRBaseRecognizer.h"
-#import "ANTLRRecognizerSharedState.h"
-#import "ANTLRCharStream.h"
-#import "ANTLRToken.h"
-#import "ANTLRCommonToken.h"
-#import "ANTLRRecognitionException.h"
-#import "ANTLRMismatchedTokenException.h"
-#import "ANTLRMismatchedRangeException.h"
-
-@interface ANTLRLexer : ANTLRBaseRecognizer <ANTLRTokenSource> {
-	id<ANTLRCharStream> input;      ///< The character stream we pull tokens out of.
-	NSUInteger ruleNestingLevel;
-}
-
-@property (retain, getter=getInput, setter=setInput:) id<ANTLRCharStream> input;
-@property (getter=getRuleNestingLevel, setter=setRuleNestingLevel) NSUInteger ruleNestingLevel;
-
-#pragma mark Initializer
-- (id) initWithCharStream:(id<ANTLRCharStream>) anInput;
-- (id) initWithCharStream:(id<ANTLRCharStream>)anInput State:(ANTLRRecognizerSharedState *)state;
-
-- (id) copyWithZone:(NSZone *)zone;
-
-- (void) reset;
-
-// - (ANTLRRecognizerSharedState *) state;
-
-#pragma mark Tokens
-- (id<ANTLRToken>)getToken;
-- (void) setToken: (id<ANTLRToken>) aToken;
-- (id<ANTLRToken>) nextToken;
-- (void) mTokens;		// abstract, defined in generated sources
-- (void) skip;
-- (id<ANTLRCharStream>) getInput;
-- (void) setInput:(id<ANTLRCharStream>)aCharStream;
-
-- (void) emit;
-- (void) emit:(id<ANTLRToken>)aToken;
-
-#pragma mark Matching
-- (void) matchString:(NSString *)aString;
-- (void) matchAny;
-- (void) matchChar:(unichar) aChar;
-- (void) matchRangeFromChar:(unichar)fromChar to:(unichar)toChar;
-
-#pragma mark Informational
-- (NSUInteger) getLine;
-- (NSUInteger) getCharPositionInLine;
-- (NSInteger) getIndex;
-- (NSString *) getText;
-- (void) setText:(NSString *) theText;
-
-// error handling
-- (void) reportError:(ANTLRRecognitionException *)e;
-- (NSString *)getErrorMessage:(ANTLRRecognitionException *)e TokenNames:(NSMutableArray *)tokenNames;
-- (NSString *)getCharErrorDisplay:(NSInteger)c;
-- (void) recover:(ANTLRRecognitionException *)e;
-- (void)traceIn:(NSString *)ruleName Index:(NSInteger)ruleIndex;
-- (void)traceOut:(NSString *)ruleName Index:(NSInteger)ruleIndex;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRLexerRuleReturnScope.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRLexerRuleReturnScope.h
deleted file mode 100755
index 18ae374..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRLexerRuleReturnScope.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-
-@interface ANTLRLexerRuleReturnScope : NSObject {
-	int startToken;
-	int stopToken;
-}
-
-- (NSInteger) getStart;
-- (void) setStart: (NSInteger) aStart;
-
-- (NSInteger) getStop;
-- (void) setStop: (NSInteger) aStop;
-
-
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRLinkBase.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRLinkBase.h
deleted file mode 100644
index 21019e6..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRLinkBase.h
+++ /dev/null
@@ -1,74 +0,0 @@
-//
-//  ANTLRLinkBase.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/14/10.
-//  [The "BSD licence"]
-//  Copyright (c) 2010 Alan Condit
-//  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.
-
-#import <Cocoa/Cocoa.h>
-
-@protocol ANTLRLinkList <NSObject>
-
-+ (id<ANTLRLinkList>)newANTLRLinkBase;
-+ (id<ANTLRLinkList>)newANTLRLinkBase:(id<ANTLRLinkList>)np Prev:(id<ANTLRLinkList>)pp;
-
-- (void) dealloc;
-
-- (id<ANTLRLinkList>) append:(id<ANTLRLinkList>)node;
-- (id<ANTLRLinkList>) insert:(id<ANTLRLinkList>)node;
-
-- (id<ANTLRLinkList>) getfNext;
-- (void) setFNext:(id<ANTLRLinkList>)np;
-- (id<ANTLRLinkList>)getfPrev;
-- (void) setFPrev:(id<ANTLRLinkList>)pp;
-
-@end
-
-@interface ANTLRLinkBase : NSObject <ANTLRLinkList> {
-	id<ANTLRLinkList> fPrev;
-	id<ANTLRLinkList> fNext;
-}
-
-@property (retain, getter=getfPrev, setter=setFPrev:) id<ANTLRLinkList> fPrev;
-@property (retain, getter=getfNext, setter=setFNext:) id<ANTLRLinkList> fNext;
-
-+ (id<ANTLRLinkList>)newANTLRLinkBase;
-+ (id<ANTLRLinkList>)newANTLRLinkBase:(id<ANTLRLinkList>)np Prev:(id<ANTLRLinkList>)pp;
-- (id<ANTLRLinkList>)init;
-- (id<ANTLRLinkList>)initWithPtr:(id)np Prev:(id)pp;
-- (void)dealloc;
-
-- (id) copyWithZone:(NSZone *)aZone;
-
-- (id<ANTLRLinkList>)append:(id<ANTLRLinkList>)node;
-- (id<ANTLRLinkList>)insert:(id<ANTLRLinkList>)node;
-
-- (id<ANTLRLinkList>)getfNext;
-- (void)setFNext:(id<ANTLRLinkList>) np;
-- (id<ANTLRLinkList>)getfPrev;
-- (void)setFPrev:(id<ANTLRLinkList>) pp;
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRLookaheadStream.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRLookaheadStream.h
deleted file mode 100644
index ad48ff5..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRLookaheadStream.h
+++ /dev/null
@@ -1,73 +0,0 @@
-//
-//  ANTLRLookaheadStream.h
-//  ANTLR
-//
-//  Created by Ian Michell on 26/04/2010.
-//  [The "BSD licence"]
-//  Copyright (c) 2010 Ian Michell 2010 Alan Condit
-//  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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRFastQueue.h"
-
-#define UNITIALIZED_EOF_ELEMENT_INDEX NSIntegerMax
-
-@interface ANTLRLookaheadStream : ANTLRFastQueue
-{
-	id eof;
-	NSInteger eofElementIndex;
-	NSInteger lastMarker;
-	NSInteger markDepth;
-}
-
-@property (readwrite, retain, getter=getEof, setter=setEof) id eof;
-@property (assign, getter=getEofElementIndex, setter=setEofElementIndex) NSInteger eofElementIndex;
-@property (assign, getter=getLastMarker, setter=setLastMarker) NSInteger lastMarker;
-@property (assign, getter=getMarkDepth, setter=setMarkDepth) NSInteger markDepth;
-
-- (id) initWithEOF:(id) o;
-- (id) nextElement;
-- (void) consume;
-- (void) sync:(NSInteger) need;
-- (void) fill:(NSInteger) n;
-- (id) LT:(NSInteger) i;
-- (id) LB:(NSInteger) i;
-- (id) currentSymbol;
-- (NSInteger) getIndex;
-- (NSInteger) mark;
-- (void) release:(NSInteger) marker;
-- (void) rewind:(NSInteger) marker;
-- (void) rewind;
-- (void) seek:(NSInteger) i;
-- (id) getEof;
-- (void) setEof:(id) anID;
-- (NSInteger) getEofElementIndex;
-- (void) setEofElementIndex:(NSInteger) anInt;
-- (NSInteger) getLastMarker;
-- (void) setLastMarker:(NSInteger) anInt;
-- (NSInteger) getMarkDepth;
-- (void) setMarkDepth:(NSInteger) anInt;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRMap.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRMap.h
deleted file mode 100644
index 80ad486..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRMap.h
+++ /dev/null
@@ -1,82 +0,0 @@
-//
-//  ANTLRMap.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/9/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRPtrBuffer.h"
-#import "ANTLRMapElement.h"
-
-//#define GLOBAL_SCOPE      0
-//#define LOCAL_SCOPE       1
-#define HASHSIZE            101
-#define HBUFSIZE            0x2000
-
-@interface ANTLRMap : ANTLRPtrBuffer {
-	//ANTLRMap *fNext; // found in superclass
-    // TStringPool *fPool;
-    NSInteger lastHash;
-}
-
-//@property (copy) ANTLRMap *fNext;
-@property (getter=getLastHash, setter=setLastHash:) NSInteger lastHash;
-
-// Contruction/Destruction
-+ (id)newANTLRMap;
-+ (id)newANTLRMapWithLen:(NSInteger)aHashSize;
-
-- (id)init;
-- (id)initWithLen:(NSInteger)cnt;
-- (void)dealloc;
-// Instance Methods
-- (NSInteger)count;
-- (NSInteger)length;
-- (NSInteger)size;
-/* clear -- reinitialize the maplist array */
-- (void) clear;
-/* form hash value for string s */
--(NSInteger)hash:(NSString *)s;
-/*   look for s in ptrBuffer  */
--(id)lookup:(NSString *)s;
-/* look for s in ptrBuffer  */
--(id)install:(ANTLRMapElement *)sym;
-/*
- * delete entry from list
- */
-- (void)deleteANTLRMap:(ANTLRMapElement *)np;
-- (NSInteger)RemoveSym:(NSString *)s;
-- (void)delete_chain:(ANTLRMapElement *)np;
-- (ANTLRMapElement *)getTType:(NSString *)name;
-- (ANTLRMapElement *)getName:(NSInteger)ttype;
-- (NSInteger)getNode:(ANTLRMapElement *)aNode;
-- (void)putNode:(NSInteger)aTType Node:(id)aNode;
-- (void)putName:(NSString *)name TType:(NSInteger)ttype;
-- (void)putName:(NSString *)name Node:(id)aNode;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRMapElement.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRMapElement.h
deleted file mode 100644
index e20d01c..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRMapElement.h
+++ /dev/null
@@ -1,65 +0,0 @@
-//
-//  ANTLRMapElement.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/8/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRBaseMapElement.h"
-
-@interface ANTLRMapElement : ANTLRBaseMapElement {
-    NSString *name;
-    id        node;
-}
-@property (retain, getter=getName, setter=setName:) NSString *name;
-@property (retain, getter=getNode, setter=setNode:) id node;
-
-+ (id) newANTLRMapElement;
-+ (id) newANTLRMapElementWithName:(NSString *)aName Type:(NSInteger)aTType;
-+ (id) newANTLRMapElementWithNode:(NSInteger)aTType Node:(id)aNode;
-+ (id) newANTLRMapElementWithName:(NSString *)aName Node:(id)aNode;
-+ (id) newANTLRMapElementWithObj1:(id)anObj1 Obj2:(id)anObj2;
-- (id) init;
-- (id) initWithName:(NSString *)aName Type:(NSInteger)aTType;
-- (id) initWithNode:(NSInteger)aTType Node:(id)aNode;
-- (id) initWithName:(NSString *)aName Node:(id)aNode;
-- (id) initWithObj1:(id)anObj1 Obj2:(id)anObj2;
-
-- (id) copyWithZone:(NSZone *)aZone;
-
-- (NSInteger) count;
-- (NSInteger) size;
-- (NSString *)getName;
-- (void)setName:(NSString *)aName;
-- (id)getNode;
-- (void)setNode:(id)aNode;
-- (void)putNode:(id)aNode;
-- (void)putNode:(id)aNode With:(NSInteger)uniqueID;
-//- (void)setObject:(id)aNode atIndex:anIndex;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRMismatchedNotSetException.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRMismatchedNotSetException.h
deleted file mode 100644
index 57391d5..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRMismatchedNotSetException.h
+++ /dev/null
@@ -1,51 +0,0 @@
-//
-//  ANTLRMismatchedNotSetException.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/13/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRecognitionException.h"
-#import "ANTLRBitSet.h"
-
-@interface ANTLRMismatchedNotSetException : ANTLRRecognitionException
-{
-    ANTLRBitSet *expecting;
-}
-@property (retain, getter=getExpecting, setter=setExpecting) ANTLRBitSet *expecting;
-
-- (ANTLRMismatchedNotSetException *)newANTLRMismatchedNotSetException;
-- (ANTLRMismatchedNotSetException *)newANTLRMismatchedNotSetException:(id<ANTLRIntStream>)anInput
-                                                               Follow:(ANTLRBitSet *)expecting;
-
-- (id) init;
-- (id) initWithStream:(id<ANTLRIntStream>)anInput Follow:(ANTLRBitSet *)expecting;
-
-- (NSString *)toString;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRMismatchedRangeException.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRMismatchedRangeException.h
deleted file mode 100755
index abda3bb..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRMismatchedRangeException.h
+++ /dev/null
@@ -1,40 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRecognitionException.h"
-
-@protocol ANTLRIntStream;
-
-
-@interface ANTLRMismatchedRangeException : ANTLRRecognitionException {
-	NSRange range;
-}
-
-+ (id) exceptionWithRange:(NSRange) aRange stream:(id<ANTLRIntStream>) theInput;
-- (id) initWithRange:(NSRange) aRange stream:(id<ANTLRIntStream>) theInput;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRMismatchedSetException.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRMismatchedSetException.h
deleted file mode 100755
index 3bd45fc..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRMismatchedSetException.h
+++ /dev/null
@@ -1,44 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRecognitionException.h"
-
-@interface ANTLRMismatchedSetException : ANTLRRecognitionException {
-	NSSet *expecting;
-}
-
-@property (retain, getter=getExpecting, setter=setExpecting:) NSSet *expecting;
-
-+ (id) exceptionWithSet:(NSSet *) theExpectedSet stream:(id<ANTLRIntStream>) theStream;
-- (id) initWithSet:(NSSet *) theExpectedSet stream:(id<ANTLRIntStream>) theStream;
-
-- (NSSet *) getExpecting;
-- (void) setExpecting: (NSSet *) anExpectedSet;
-
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRMismatchedTokenException.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRMismatchedTokenException.h
deleted file mode 100755
index 5e1d77d..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRMismatchedTokenException.h
+++ /dev/null
@@ -1,58 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRecognitionException.h"
-#import "ANTLRBitSet.h"
-
-@protocol ANTLRIntStream;
-
-@interface ANTLRMismatchedTokenException : ANTLRRecognitionException {
-	NSInteger expecting;
-	unichar expectingChar;
-	BOOL isTokenType;
-}
-
-@property (assign, getter=getExpecting, setter=setExpecting:) NSInteger expecting;
-@property (assign, getter=getExpectingChar, setter=setExpectingChar:) unichar expectingChar;
-@property (assign, getter=getIsTokenType, setter=setIsTokenType:) BOOL isTokenType;
-
-+ (id) newANTLRMismatchedTokenException:(NSInteger)expectedTokenType Stream:(id<ANTLRIntStream>)anInput;
-+ (id) newANTLRMismatchedTokenExceptionMissing:(NSInteger)expectedTokenType
-                                        Stream:(id<ANTLRIntStream>)anInput
-                                         Token:(id<ANTLRToken>)inserted;
-+ (id) newANTLRMismatchedTokenExceptionChar:(unichar)expectedCharacter Stream:(id<ANTLRIntStream>)anInput;
-+ (id) newANTLRMismatchedTokenExceptionStream:(id<ANTLRIntStream>)anInput
-                                    Exception:(NSException *)e
-                                       Follow:(ANTLRBitSet *)follow;
-- (id) initWithTokenType:(NSInteger)expectedTokenType Stream:(id<ANTLRIntStream>)anInput;
--(id) initWithTokenType:(NSInteger)expectedTokenType
-                 Stream:(id<ANTLRIntStream>)anInput
-                  Token:(id<ANTLRToken>)inserted;
-- (id) initWithCharacter:(unichar)expectedCharacter Stream:(id<ANTLRIntStream>)anInput;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRMismatchedTreeNodeException.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRMismatchedTreeNodeException.h
deleted file mode 100755
index b61ab51..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRMismatchedTreeNodeException.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRecognitionException.h"
-
-@protocol ANTLRIntStream;
-
-@interface ANTLRMismatchedTreeNodeException : ANTLRRecognitionException {
-	NSInteger expecting;
-}
-
-@property (getter=getExpecting, setter=setExpecting) NSInteger expecting;
-
-+ (id) newANTLRMismatchedTreeNodeException:(NSInteger)expectedTokenType Stream:(id<ANTLRIntStream>)anInput;
-- (id) initWithTokenType:(NSInteger) expectedTokenType Stream:(id<ANTLRIntStream>)anInput;
-
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRMissingTokenException.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRMissingTokenException.h
deleted file mode 100644
index 1398e25..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRMissingTokenException.h
+++ /dev/null
@@ -1,51 +0,0 @@
-//
-//  ANTLRMissingTokenException.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/8/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRMismatchedTokenException.h"
-#import "ANTLRToken.h"
-
-@interface ANTLRMissingTokenException : ANTLRMismatchedTokenException {
-    id<ANTLRToken> inserted;
-}
-/** Used for remote debugger deserialization */
-+ (id) newANTLRMissingTokenException;
-+ (id) newANTLRMissingTokenException:(NSInteger)expected
-                              Stream:(id<ANTLRIntStream>)anInput
-                                With:(id<ANTLRToken>)insertedToken;
-- (id) init;
-- (id) init:(NSInteger)expected Stream:(id<ANTLRIntStream>)anInput With:(id<ANTLRToken>)insertedToken;
-
-- (NSInteger) getMissingType;
-
-- (NSString *)toString;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRNoViableAltException.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRNoViableAltException.h
deleted file mode 100755
index b71baff..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRNoViableAltException.h
+++ /dev/null
@@ -1,43 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRecognitionException.h"
-#import "ANTLRIntStream.h"
-
-@interface ANTLRNoViableAltException : ANTLRRecognitionException {
-	int decisionNumber;
-	int stateNumber;
-}
-
-+ (ANTLRNoViableAltException *) newANTLRNoViableAltException:(NSInteger)theDecisionNumber state:(NSInteger)theStateNumber stream:(id<ANTLRIntStream>)theStream;
-- (ANTLRNoViableAltException *) initWithDecision:(NSInteger)theDecisionNumber state:(NSInteger)theStateNumber stream:(id<ANTLRIntStream>)theStream;
-
-- (void)setDecisionNumber:(NSInteger)decisionNumber;
-- (void)setStateNumber:(NSInteger)stateNumber;
-
-
-@end
\ No newline at end of file
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRNodeMapElement.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRNodeMapElement.h
deleted file mode 100644
index 1c0c916..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRNodeMapElement.h
+++ /dev/null
@@ -1,56 +0,0 @@
-//
-//  ANTLRRuleMapElement.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/16/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRBaseMapElement.h"
-#import "ANTLRTree.h"
-
-@interface ANTLRNodeMapElement : ANTLRBaseMapElement {
-    id<ANTLRTree> node;
-}
-
-@property (retain, getter=getNode, setter=setNode:) id node;
-
-+ (void)initialize;
-
-+ (id) newANTLRNodeMapElement;
-+ (id) newANTLRNodeMapElementWithIndex:(id)anIndex Node:(id<ANTLRTree>)aNode;
-- (id) init;
-- (id) initWithAnIndex:(id)anIndex Node:(id)aNode;
-
-- (id) copyWithZone:(NSZone *)aZone;
-
-- (id<ANTLRTree>)getNode;
-- (void)setNode:(id<ANTLRTree>)aNode;
-
-- (NSInteger)size;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRParseTree.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRParseTree.h
deleted file mode 100644
index 92554e3..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRParseTree.h
+++ /dev/null
@@ -1,60 +0,0 @@
-//
-//  ANTLRParseTree.h
-//  ANTLR
-//
-//  Created by Alan Condit on 7/12/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRBaseTree.h"
-#import "ANTLRCommonToken.h"
-
-@interface ANTLRParseTree : ANTLRBaseTree {
-	id<ANTLRToken> payload;
-	NSMutableArray *hiddenTokens;
-}
-/** A record of the rules used to match a token sequence.  The tokens
- *  end up as the leaves of this tree and rule nodes are the interior nodes.
- *  This really adds no functionality, it is just an alias for CommonTree
- *  that is more meaningful (specific) and holds a String to display for a node.
- */
-+ (ANTLRParseTree *)newANTLRParseTree:(id<ANTLRToken>)label;
-- (id)initWithLabel:(id<ANTLRToken>)label;
-
-- (id<ANTLRTree>)dupNode;
-- (NSInteger)getType;
-- (NSString *)getText;
-- (NSInteger)getTokenStartIndex;
-- (void)setTokenStartIndex:(NSInteger)index;
-- (NSInteger)getTokenStopIndex;
-- (void)setTokenStopIndex:(NSInteger)index;
-- (NSString *)toString;
-- (NSString *)toStringWithHiddenTokens;
-- (NSString *)toInputString;
-- (void)_toStringLeaves:(NSMutableString *)buf;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRParser.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRParser.h
deleted file mode 100755
index 5ddaf50..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRParser.h
+++ /dev/null
@@ -1,59 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRBaseRecognizer.h"
-#import "ANTLRCommonToken.h"
-#import "ANTLRTokenStream.h"
-
-@interface ANTLRParser : ANTLRBaseRecognizer {
-	id<ANTLRTokenStream> input;
-}
-+ (ANTLRParser *)newANTLRParser:(id<ANTLRTokenStream>)anInput;
-+ (ANTLRParser *)newANTLRParser:(id<ANTLRTokenStream>)anInput State:(ANTLRRecognizerSharedState *)aState;
-
-- (id) initWithTokenStream:(id<ANTLRTokenStream>)theStream;
-- (id) initWithTokenStream:(id<ANTLRTokenStream>)theStream State:(ANTLRRecognizerSharedState *)aState;
-
-- (id<ANTLRTokenStream>) getInput;
-- (void) setInput: (id<ANTLRTokenStream>) anInput;
-
-- (void) reset;
-
-- (id) getCurrentInputSymbol:(id<ANTLRTokenStream>)anInput;
-- (ANTLRCommonToken *)getMissingSymbol:(id<ANTLRTokenStream>)input
-                             Exception:(ANTLRRecognitionException *)e
-                                 TType:(NSInteger)expectedTokenType
-                                BitSet:(ANTLRBitSet *)follow;
-- (void) setTokenStream:(id<ANTLRTokenStream>)anInput;
-- (id<ANTLRTokenStream>)getTokenStream;
-- (NSString *)getSourceName;
-
-- (void) traceIn:(NSString *)ruleName Index:(int)ruleIndex;
-- (void) traceOut:(NSString *)ruleName Index:(NSInteger) ruleIndex;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRParserRuleReturnScope.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRParserRuleReturnScope.h
deleted file mode 100755
index aef3dd0..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRParserRuleReturnScope.h
+++ /dev/null
@@ -1,46 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRToken.h"
-#import "ANTLRRuleReturnScope.h"
-
-@interface ANTLRParserRuleReturnScope : ANTLRRuleReturnScope {
-	id<ANTLRToken> startToken;
-	id<ANTLRToken> stopToken;
-}
-@property (retain, getter=getStart, setter=setStart:) id<ANTLRToken> startToken;
-@property (retain, getter=getStop, setter=setStop:)   id<ANTLRToken> stopToken;
-
-- (id<ANTLRToken>) getStart;
-- (void) setStart: (id<ANTLRToken>) aStart;
-
-- (id<ANTLRToken>) getStop;
-- (void) setStop: (id<ANTLRToken>) aStop;
-
-- (id) copyWithZone:(NSZone *)theZone;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRPtrBuffer.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRPtrBuffer.h
deleted file mode 100644
index 188f597..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRPtrBuffer.h
+++ /dev/null
@@ -1,91 +0,0 @@
-//
-//  ANTLRPtrBuffer.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/9/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRLinkBase.h"
-
-//#define GLOBAL_SCOPE       0
-//#define LOCAL_SCOPE        1
-#define BUFFSIZE         101
-
-@interface ANTLRPtrBuffer : ANTLRLinkBase {
-	//ANTLRPtrBuffer *fNext;
-    NSInteger BuffSize;
-    NSMutableData *buffer;
-    id *ptrBuffer;
-    NSInteger count;
-    NSInteger ptr;
-}
-
-@property (getter=getBuffSize, setter=setBuffSize:) NSInteger BuffSize;
-@property (retain, getter=getBuffer, setter=setBuffer:) NSMutableData *buffer;
-@property (retain, getter=getPtrBuffer, setter=setPtrBuffer:) id *ptrBuffer;
-@property (getter=getCount, setter=setCount:) NSInteger count;
-@property (getter=getPtr, setter=setPtr:) NSInteger ptr;
-
-// Contruction/Destruction
-+(ANTLRPtrBuffer *)newANTLRPtrBuffer;
-+(ANTLRPtrBuffer *)newANTLRPtrBufferWithLen:(NSInteger)cnt;
--(id)init;
--(id)initWithLen:(NSInteger)cnt;
--(void)dealloc;
-
-// Instance Methods
-- (id) copyWithZone:(NSZone *)aZone;
-/* clear -- reinitialize the maplist array */
-- (void) clear;
-
-- (NSInteger)count;
-- (NSInteger)length;
-- (NSInteger)size;
-
-- (NSMutableData *)getBuffer;
-- (void)setBuffer:(NSMutableData *)np;
-- (NSInteger)getCount;
-- (void)setCount:(NSInteger)aCount;
-- (id *)getPtrBuffer;
-- (void)setPtrBuffer:(id *)np;
-- (NSInteger)getPtr;
-- (void)setPtr:(NSInteger)np;
-
-- (void) push:(id) v;
-- (id) pop;
-- (id) peek;
-
-- (void) addObject:(id) v;
-- (void) addObjectsFromArray:(ANTLRPtrBuffer *)anArray;
-- (void) insertObject:(id)aRule atIndex:(NSInteger)idx;
-- (id)   objectAtIndex:(NSInteger)idx;
-- (void) removeAllObjects;
-
-- (void) ensureCapacity:(NSInteger) index;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRRecognitionException.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRRecognitionException.h
deleted file mode 100755
index 853dc0e..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRRecognitionException.h
+++ /dev/null
@@ -1,72 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRuntimeException.h"
-#import "ANTLRToken.h"
-#import "ANTLRIntStream.h"
-#import "ANTLRTree.h"
-
-@interface ANTLRRecognitionException : ANTLRRuntimeException {
-	id<ANTLRIntStream> input;
-	NSInteger index;
-	id<ANTLRToken> token;
-	id<ANTLRTree> node;
-	unichar c;
-	NSInteger line;
-	NSInteger charPositionInLine;
-}
-
-@property (retain, getter=getStream, setter=setStream:) id<ANTLRIntStream> input;
-@property (retain, getter=getToken, setter=setToken:) id<ANTLRToken>token;
-@property (retain, getter=getNode, setter=setNode:) id<ANTLRTree>node;
-@property (getter=getLine, setter=setLine:) NSInteger line;
-@property (getter=getCharPositionInLine, setter=setCharPositionInLine:) NSInteger charPositionInLine;
-
-+ (ANTLRRecognitionException *) newANTLRRecognitionException;
-+ (ANTLRRecognitionException *) exceptionWithStream:(id<ANTLRIntStream>) anInputStream; 
-- (id) init;
-- (id) initWithStream:(id<ANTLRIntStream>)anInputStream;
-- (id) initWithStream:(id<ANTLRIntStream>)anInputStream reason:(NSString *)aReason;
-- (NSInteger) unexpectedType;
-- (id<ANTLRToken>)getUnexpectedToken;
-
-- (id<ANTLRIntStream>) getStream;
-- (void) setStream: (id<ANTLRIntStream>) aStream;
-
-- (id<ANTLRToken>) getToken;
-- (void) setToken: (id<ANTLRToken>) aToken;
-
-- (id<ANTLRTree>) getNode;
-- (void) setNode: (id<ANTLRTree>) aNode;
-
-- (NSString *)getMessage;
-
-- (NSInteger)getCharPositionInLine;
-- (void)setCharPositionInLine:(NSInteger)aPos;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRRecognizerSharedState.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRRecognizerSharedState.h
deleted file mode 100755
index 0430b79..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRRecognizerSharedState.h
+++ /dev/null
@@ -1,116 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRToken.h"
-#import "ANTLRBitSet.h"
-#import "ANTLRRuleStack.h"
-
-@interface ANTLRRecognizerSharedState : NSObject {
-	NSMutableArray *following;          // a stack of FOLLOW bitsets used for context sensitive prediction and recovery
-    NSInteger _fsp;                     // Follow stack pointer
-	BOOL errorRecovery;                 // are we recovering?
-	NSInteger lastErrorIndex;
-	BOOL failed;                        // indicate that some match failed
-    NSInteger syntaxErrors;
-	NSInteger backtracking;             // the level of backtracking
-	ANTLRRuleStack *ruleMemo;			// store previous results of matching rules so we don't have to do it again. Hook in incremental stuff here, too.
-
-	id<ANTLRToken> token;
-	NSInteger  tokenStartCharIndex;
-	NSUInteger tokenStartLine;
-	NSUInteger tokenStartCharPositionInLine;
-	NSUInteger channel;
-	NSUInteger type;
-	NSString   *text;
-}
-
-@property (retain, getter=getFollowing, setter=setFollowing:) NSMutableArray *following;
-@property (assign) NSInteger _fsp;
-@property (assign) BOOL errorRecovery;
-@property (assign) NSInteger lastErrorIndex;
-@property (assign, getter=getFailed, setter=setFailed:) BOOL failed;
-@property (assign) NSInteger syntaxErrors;
-@property (assign, getter=getBacktracking, setter=setBacktracking) NSInteger backtracking;
-@property (retain, getter=getRuleMemo, setter=setRuleMemo:) ANTLRRuleStack *ruleMemo;
-@property (copy, getter=getToken, setter=setToken) id<ANTLRToken> token;
-@property (getter=getType,setter=setType:) NSUInteger type;
-@property (getter=getChannel,setter=setChannel:) NSUInteger channel;
-@property (getter=getTokenStartLine,setter=setTokenStartLine:) NSUInteger tokenStartLine;
-@property (getter=getCharPositionInLine,setter=setCharPositionInLine:) NSUInteger tokenStartCharPositionInLine;
-@property (getter=getTokenStartCharIndex,setter=setTokenStartCharIndex:) NSInteger tokenStartCharIndex;
-@property (retain, getter=getText, setter=setText) NSString *text;
-
-+ (ANTLRRecognizerSharedState *) newANTLRRecognizerSharedState;
-+ (ANTLRRecognizerSharedState *) newANTLRRecognizerSharedStateWithRuleLen:(NSInteger)aLen;
-+ (ANTLRRecognizerSharedState *) newANTLRRecognizerSharedState:(ANTLRRecognizerSharedState *)aState;
-
-- (id) init;
-- (id) initWithRuleLen:(NSInteger)aLen;
-- (id) initWithState:(ANTLRRecognizerSharedState *)state;
-
-- (id<ANTLRToken>) getToken;
-- (void) setToken:(id<ANTLRToken>) theToken;
-
-- (NSUInteger) getType;
-- (void) setType:(NSUInteger) theTokenType;
-
-- (NSUInteger) getChannel;
-- (void) setChannel:(NSUInteger) theChannel;
-
-- (NSUInteger) getTokenStartLine;
-- (void) setTokenStartLine:(NSUInteger) theTokenStartLine;
-
-- (NSUInteger) getCharPositionInLine;
-- (void) setCharPositionInLine:(NSUInteger) theCharPosition;
-
-- (NSInteger) getTokenStartCharIndex;
-- (void) setTokenStartCharIndex:(NSInteger) theTokenStartCharIndex;
-
-- (NSString *) getText;
-- (void) setText:(NSString *) theText;
-
-
-- (NSMutableArray *) getFollowing;
-- (void)setFollowing:(NSMutableArray *)aFollow;
-- (ANTLRRuleStack *) getRuleMemo;
-- (void)setRuleMemo:(ANTLRRuleStack *)aRuleMemo;
-- (BOOL) isErrorRecovery;
-- (void) setIsErrorRecovery: (BOOL) flag;
-
-- (BOOL) getFailed;
-- (void) setFailed: (BOOL) flag;
-
-- (NSInteger)  getBacktracking;
-- (void) setBacktracking:(NSInteger) value;
-- (void) increaseBacktracking;
-- (void) decreaseBacktracking;
-- (BOOL) isBacktracking;
-
-- (NSInteger) lastErrorIndex;
-- (void) setLastErrorIndex:(NSInteger) value;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRRewriteRuleElementStream.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRRewriteRuleElementStream.h
deleted file mode 100755
index 132a0cc..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRRewriteRuleElementStream.h
+++ /dev/null
@@ -1,85 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTreeAdaptor.h"
-
-typedef union {
-    id single;
-    NSMutableArray *multiple;
-} Elements;
-
-// TODO: this should be separated into stream and enumerator classes
-@interface ANTLRRewriteRuleElementStream : NSObject {
-    NSInteger cursor;
-    BOOL dirty;        ///< indicates whether the stream should return copies of its elements, set to true after a call to -reset
-    BOOL isSingleElement;
-    Elements elements;
-    
-    NSString *elementDescription;
-    id<ANTLRTreeAdaptor> treeAdaptor;
-}
-
-@property (assign, getter=GetCursor, setter=SetCursor:) NSInteger cursor;
-@property (assign, getter=Getdirty, setter=Setdirty:) BOOL dirty;
-@property (assign, getter=GetIsSingleElement, setter=SetIsSingleElement:) BOOL isSingleElement;
-@property (assign, getter=GetElement, setter=SetElement:) Elements elements;
-@property (assign, getter=GetElementDescription, setter=SetElementDescription:) NSString *elementDescription;
-@property (retain, getter=GetTreeAdaptor, setter=SetTreeAdaptor:) id<ANTLRTreeAdaptor> treeAdaptor;
-
-+ (ANTLRRewriteRuleElementStream*) newANTLRRewriteRuleElementStream:(id<ANTLRTreeAdaptor>)aTreeAdaptor
-                                                        description:(NSString *)anElementDescription;
-+ (ANTLRRewriteRuleElementStream*) newANTLRRewriteRuleElementStream:(id<ANTLRTreeAdaptor>)aTreeAdaptor
-                                                        description:(NSString *)anElementDescription
-                                                            element:(id)anElement;
-+ (ANTLRRewriteRuleElementStream*) newANTLRRewriteRuleElementStream:(id<ANTLRTreeAdaptor>)aTreeAdaptor
-                                                        description:(NSString *)anElementDescription
-                                                           elements:(NSArray *)theElements;
-
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription;
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription element:(id)anElement;
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription elements:(NSArray *)theElements;
-
-- (void)reset;
-
-- (id<ANTLRTreeAdaptor>) getTreeAdaptor;
-- (void) setTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor;
-
-- (void) addElement:(id)anElement;
-- (NSInteger) size;
- 
-- (BOOL) hasNext;
-- (id<ANTLRTree>) nextTree;
-- (id<ANTLRTree>) _next;       // internal: TODO: redesign if necessary. maybe delegate
-
-- (id) copyElement:(id)element;
-- (id) toTree:(id)element;
-
-- (NSString *) getDescription;
-- (void) setDescription:(NSString *)description;
-
-@end
-
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRRewriteRuleSubtreeStream.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRRewriteRuleSubtreeStream.h
deleted file mode 100755
index 1d18b24..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRRewriteRuleSubtreeStream.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRewriteRuleElementStream.h"
-
-@interface ANTLRRewriteRuleSubtreeStream : ANTLRRewriteRuleElementStream {
-
-}
-
-+ (ANTLRRewriteRuleSubtreeStream *) newANTLRRewriteRuleSubtreeStream:(id<ANTLRTreeAdaptor>)aTreeAdaptor
-                                                         description:(NSString *)anElementDescription;
-+ (ANTLRRewriteRuleSubtreeStream *) newANTLRRewriteRuleSubtreeStream:(id<ANTLRTreeAdaptor>)aTreeAdaptor
-                                                         description:(NSString *)anElementDescription
-                                                             element:(id)anElement;
-+ (ANTLRRewriteRuleSubtreeStream *) newANTLRRewriteRuleSubtreeStream:(id<ANTLRTreeAdaptor>)aTreeAdaptor
-                                                         description:(NSString *)anElementDescription
-                                                            elements:(NSArray *)theElements;
-
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription;
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription element:(id)anElement;
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription elements:(NSArray *)theElements;
-
-- (id) nextNode;
-- (id) dup:(id)element;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRRewriteRuleTokenStream.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRRewriteRuleTokenStream.h
deleted file mode 100755
index 3a516de..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRRewriteRuleTokenStream.h
+++ /dev/null
@@ -1,66 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRewriteRuleElementStream.h"
-
-
-@interface ANTLRRewriteRuleTokenStream : ANTLRRewriteRuleElementStream {
-
-}
-
-+ (id) newANTLRRewriteRuleTokenStream:(id<ANTLRTreeAdaptor>)anAdaptor
-                          description:(NSString *)elementDescription;
-/** Create a stream with one element */
-+ (id) newANTLRRewriteRuleTokenStream:(id<ANTLRTreeAdaptor>)adaptor
-                          description:(NSString *)elementDescription
-                              element:(id) oneElement;
-/** Create a stream, but feed off an existing list */
-+ (id) newANTLRRewriteRuleTokenStream:(id<ANTLRTreeAdaptor>)adaptor
-                          description:(NSString *)elementDescription
-                             elements:(NSMutableArray *)elements;
-
-- (id) init;
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)anAdaptor
-               description:(NSString *)aDescription;
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)anAdaptor 
-               description:(NSString *)aDescription
-                   element:(id)element;
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)anAdaptor
-               description:(NSString *)aDescription
-                  elements:(NSMutableArray *)elements;
-                               
-/** Get next token from stream and make a node for it */
-- (id) nextNode;
-
-- (id) nextToken;
-
-/** Don't convert to a tree unless they explicitly call nextTree.
- *  This way we can do hetero tree nodes in rewrite.
- */
-- (id<ANTLRTree>) toTree:(id<ANTLRToken>)element;
-
-@end
\ No newline at end of file
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRRuleMapElement.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRRuleMapElement.h
deleted file mode 100644
index e040b18..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRRuleMapElement.h
+++ /dev/null
@@ -1,55 +0,0 @@
-//
-//  ANTLRRuleMapElement.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/16/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRBaseMapElement.h"
-
-@interface ANTLRRuleMapElement : ANTLRBaseMapElement {
-    NSNumber *ruleNum;
-}
-
-@property (retain, getter=getRuleNum, setter=setRuleNum:) NSNumber *ruleNum;
-
-+ (ANTLRRuleMapElement *) newANTLRRuleMapElement;
-+ (ANTLRRuleMapElement *) newANTLRRuleMapElementWithIndex:(NSNumber *)anIdx;
-+ (ANTLRRuleMapElement *) newANTLRRuleMapElementWithIndex:(NSNumber *)anIdx RuleNum:(NSNumber *)aRuleNum;
-- (id) init;
-- (id) initWithAnIndex:(NSNumber *)anIdx;
-- (id) initWithAnIndex:(NSNumber *)anIdx RuleNum:(NSNumber *)aRuleNum;
-
-- (id) copyWithZone:(NSZone *)aZone;
-
-- (NSNumber *)getRuleNum;
-- (void)setRuleNum:(NSNumber *)aRuleNum;
-
-- (NSInteger)size;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRRuleMemo.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRRuleMemo.h
deleted file mode 100644
index 63a5ae2..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRRuleMemo.h
+++ /dev/null
@@ -1,60 +0,0 @@
-//
-//  ANTLRRuleMemo.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/16/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRLinkBase.h"
-
-@interface ANTLRRuleMemo : ANTLRLinkBase {
-    NSNumber *startIndex;
-    NSNumber *stopIndex;
-}
-
-@property (retain, getter=getStartIndex, setter=setStartIndex) NSNumber *startIndex;
-@property (retain, getter=getStopIndex, setter=setStopIndex) NSNumber *stopIndex;
-
-+ (ANTLRRuleMemo *)newANTLRRuleMemo;
-+ (ANTLRRuleMemo *)newANTLRRuleMemoWithStartIndex:(NSNumber *)aStartIndex StopIndex:(NSNumber *)aStopIndex;
-
-- (id) init;
-- (id) initWithStartIndex:(NSNumber *)aStartIndex StopIndex:(NSNumber *)aStopIndex;
-
-- (NSInteger)count;
-- (NSInteger)size;
-
-- (ANTLRRuleMemo *)getRuleWithStartIndex:(NSInteger)aStartIndex;
-- (NSNumber *)getStartIndex:(NSInteger)aStartIndex;
-- (NSNumber *)getStopIndex:(NSInteger)aStartIndex;
-- (NSNumber *)getStartIndex;
-- (void)setStartIndex:(NSNumber *)aStartIndex;
-- (NSNumber *)getStopIndex;
-- (void)setStopIndex:(NSNumber *)aStopIndex;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRRuleReturnScope.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRRuleReturnScope.h
deleted file mode 100644
index 4750c16..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRRuleReturnScope.h
+++ /dev/null
@@ -1,55 +0,0 @@
-//
-//  ANTLRRuleReturnScope.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/17/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRToken.h"
-
-@interface ANTLRRuleReturnScope : NSObject <NSCopying> {
-
-}
-
-/** Return the start token or tree */
-- (id<ANTLRToken>) getStart;
-
-/** Return the stop token or tree */
-- (id<ANTLRToken>) getStop;
-
-/** Has a value potentially if output=AST; */
-- (id) getNode;
-
-/** Has a value potentially if output=template; Don't use StringTemplate
- *  type as it then causes a dependency with ST lib.
- */
-- (id) getTemplate;
-
-- (id) copyWithZone:(NSZone *)theZone;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRRuleStack.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRRuleStack.h
deleted file mode 100644
index 12d450b..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRRuleStack.h
+++ /dev/null
@@ -1,63 +0,0 @@
-//
-//  ANTLRRuleStack.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/9/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRBaseStack.h"
-#import "ANTLRHashRule.h"
-
-//#define GLOBAL_SCOPE       0
-//#define LOCAL_SCOPE        1
-#define HASHSIZE         101
-#define HBUFSIZE      0x2000
-
-@interface ANTLRRuleStack : ANTLRBaseStack {
-}
-
-// Contruction/Destruction
-+(ANTLRRuleStack *)newANTLRRuleStack;
-+(ANTLRRuleStack *)newANTLRRuleStack:(NSInteger)cnt;
--(id)init;
--(id)initWithLen:(NSInteger)cnt;
--(void)dealloc;
-
-// Instance Methods
-- (id) copyWithZone:(NSZone *)aZone;
-/* clear -- reinitialize the maplist array */
-
-- (NSInteger)count;
-- (NSInteger)size;
-
-- (ANTLRHashRule *) pop;
-
-- (void) insertObject:(ANTLRHashRule *)aHashRule atIndex:(NSInteger)idx;
-- (ANTLRHashRule *)objectAtIndex:(NSInteger)idx;
-- (void)putHashRuleAtRuleIndex:(NSInteger)aRuleIndex StartIndex:(NSInteger)aStartIndex StopIndex:(NSInteger)aStopIndex;
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRRuleStack.m b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRRuleStack.m
deleted file mode 100644
index 909192f..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRRuleStack.m
+++ /dev/null
@@ -1,147 +0,0 @@
-//
-//  ANTLRRuleStack.m
-//  ANTLR
-//
-//  Created by Alan Condit on 6/9/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#define SUCCESS (0)
-#define FAILURE (-1)
-
-#import "ANTLRRuleStack.h"
-#import "ANTLRTree.h"
-
-/*
- * Start of ANTLRRuleStack
- */
-@implementation ANTLRRuleStack
-
-+ (ANTLRRuleStack *)newANTLRRuleStack
-{
-    return [[ANTLRRuleStack alloc] init];
-}
-
-+ (ANTLRRuleStack *)newANTLRRuleStack:(NSInteger)cnt
-{
-    return [[ANTLRRuleStack alloc] initWithLen:cnt];
-}
-
-- (id)init
-{
-	if ((self = [super init]) != nil) {
-	}
-    return( self );
-}
-
-- (id)initWithLen:(NSInteger)cnt
-{
-	if ((self = [super initWithLen:cnt]) != nil) {
-	}
-    return( self );
-}
-
-- (void)dealloc
-{
-	[super dealloc];
-}
-
-- (id) copyWithZone:(NSZone *)aZone
-{
-    return [super copyWithZone:aZone];
-}
-
-- (NSInteger)count
-{
-    ANTLRRuleMemo *anElement;
-    NSInteger aCnt = 0;
-    for( int i = 0; i < BuffSize; i++ ) {
-        if ((anElement = ptrBuffer[i]) != nil)
-            aCnt++;
-    }
-    return aCnt;
-}
-
-- (NSInteger)size
-{
-    ANTLRRuleMemo *anElement;
-    NSInteger aSize = 0;
-    for( int i = 0; i < BuffSize; i++ ) {
-        if ((anElement = ptrBuffer[i]) != nil) {
-            aSize++;
-        }
-    }
-    return aSize;
-}
-
-- (ANTLRHashRule *)pop
-{
-    return (ANTLRHashRule *)[super pop];
-}
-
-- (void) insertObject:(ANTLRHashRule *)aRule atIndex:(NSInteger)idx
-{
-    if ( idx >= BuffSize ) {
-        NSLog( @"In ANTLRRuleStack attempting to insert aRule at Index %d, but Buffer is only %d long\n", idx, BuffSize );
-        [self ensureCapacity:idx];
-    }
-    if ( aRule != ptrBuffer[idx] ) {
-        if (ptrBuffer[idx] != nil) [ptrBuffer[idx] release];
-        [aRule retain];
-    }
-    ptrBuffer[idx] = aRule;
-}
-
-- (ANTLRHashRule *)objectAtIndex:(NSInteger)idx
-{
-    if (idx < BuffSize) {
-        return ptrBuffer[idx];
-    }
-    return nil;
-}
-
-- (void)putHashRuleAtRuleIndex:(NSInteger)aRuleIndex StartIndex:(NSInteger)aStartIndex StopIndex:(NSInteger)aStopIndex
-{
-    ANTLRHashRule *aHashRule;
-    ANTLRRuleMemo *aRuleMemo;
-
-    if (aRuleIndex >= BuffSize) {
-        NSLog( @"putHashRuleAtRuleIndex attempting to insert aRule at Index %d, but Buffer is only %d long\n", aRuleIndex, BuffSize );
-        [self ensureCapacity:aRuleIndex];
-    }
-    if ((aHashRule = ptrBuffer[aRuleIndex]) == nil) {
-        aHashRule = [[ANTLRHashRule newANTLRHashRuleWithLen:17] retain];
-        ptrBuffer[aRuleIndex] = aHashRule;
-    }
-    if (( aRuleMemo = [aHashRule objectAtIndex:aStartIndex] ) == nil ) {
-        aRuleMemo = [[ANTLRRuleMemo newANTLRRuleMemo] retain];
-        [aHashRule insertObject:aRuleMemo atIndex:aStartIndex];
-    }
-    [aRuleMemo setStartIndex:[NSNumber numberWithInteger:aStartIndex]];
-    [aRuleMemo setStopIndex:[NSNumber numberWithInteger:aStopIndex]];
-}
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRRuntimeException.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRRuntimeException.h
deleted file mode 100644
index 6cf0918..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRRuntimeException.h
+++ /dev/null
@@ -1,54 +0,0 @@
-//
-//  ANTLRRuntimeException.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/5/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-
-@interface ANTLRRuntimeException : NSException
-{
-}
-
-+ (ANTLRRuntimeException *) newANTLRNoSuchElementException:(NSString *)aReason;
-+ (ANTLRRuntimeException *) newANTLRIllegalArgumentException:(NSString *)aReason;
-+ (ANTLRRuntimeException *) newANTLRRuntimeException:(NSString *)aReason;
-+ (ANTLRRuntimeException *) newANTLRRuntimeException:(NSString *)aName reason:(NSString *)aReason;
-+ (ANTLRRuntimeException *) newANTLRRuntimeException:(NSString *)aName reason:(NSString *)aReason userInfo:aUserInfo;
-
-- (id) init;
-- (id)initWithRuntime:(NSString *)aReason;
-- (id)initWithReason:(NSString *)aReason;
-- (id)initWithName:(NSString *)aName reason:(NSString *)aReason;
-- (id)initWithName:(NSString *)aName reason:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo;
-
-- (NSString *) Description;
-
-//    - (void)setDecisionNumber:(NSInteger)decisionNumber;
-//    - (void)setStateNumber:(NSInteger)stateNumber;
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRStreamEnumerator.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRStreamEnumerator.h
deleted file mode 100644
index a0e0f69..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRStreamEnumerator.h
+++ /dev/null
@@ -1,45 +0,0 @@
-//
-//  ANTLRStreamEnumertor.h
-//  ANTLR
-//
-//  Created by Ian Michell on 29/04/2010.
-// [The "BSD licence"]
-// Copyright (c) 2010 Ian Michell 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-
-
-@interface ANTLRStreamEnumerator : NSEnumerator 
-{
-	NSInteger i;
-	id eof;
-	NSMutableArray *nodes;
-}
-
--(id) initWithNodes:(NSMutableArray *) n andEOF:(id) o;
--(BOOL) hasNext;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRStringStream.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRStringStream.h
deleted file mode 100755
index 2b13c7d..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRStringStream.h
+++ /dev/null
@@ -1,126 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRCharStream.h"
-#import "ANTLRCharStreamState.h"
-#import "ANTLRPtrBuffer.h"
-
-@interface ANTLRStringStream : NSObject < ANTLRCharStream > {
-	NSString *data;
-	NSInteger n;
-	NSInteger p;
-	NSInteger line;
-	NSInteger charPositionInLine;
-	NSInteger markDepth;
-	ANTLRPtrBuffer *markers;
-	NSInteger lastMarker;
-	NSString *name;
-    ANTLRCharStreamState *charState;
-}
-
-@property (retain, getter=getData,setter=setData:) NSString *data;
-@property (getter=getP,setter=setP:) NSInteger p;
-@property (getter=getN,setter=setN:) NSInteger n;
-@property (getter=getLine,setter=setLine:) NSInteger line;
-@property (getter=getCharPositionInLine,setter=setCharPositionInLine:) NSInteger charPositionInLine;
-@property (getter=getMarkDepth,setter=setMarkDepth:) NSInteger markDepth;
-@property (retain, getter=getMarkers, setter=setMarkers:) ANTLRPtrBuffer *markers;
-@property (getter=getLastMarker,setter=setLastMarker:) NSInteger lastMarker;
-@property (retain, getter=getSourceName, setter=setSourceName:) NSString *name;
-@property (retain, getter=getCharState, setter=setCharState:) ANTLRCharStreamState *charState;
-
-+ newANTLRStringStream;
-
-+ newANTLRStringStream:(NSString *)aString;
-
-+ newANTLRStringStream:(char *)myData Count:(NSInteger)numBytes;
-
-- (id) init;
-
-// this initializer copies the string
-- (id) initWithString:(NSString *) theString;
-
-// This is the preferred constructor as no data is copied
-- (id) initWithStringNoCopy:(NSString *) theString;
-
-- (id) initWithData:(char *)myData Count:(NSInteger)numBytes;
-
-- (void) dealloc;
-
-- (id) copyWithZone:(NSZone *)aZone;
-
-// reset the stream's state, but keep the data to feed off
-- (void) reset;
-// consume one character from the stream
-- (void) consume;
-
-// look ahead i characters
-- (NSInteger) LA:(NSInteger) i;
-- (NSInteger) LT:(NSInteger) i;
-
-// returns the position of the current input symbol
-- (NSInteger) getIndex;
-// total length of the input data
-- (NSInteger) size;
-
-// seek and rewind in the stream
-- (NSInteger) mark;
-- (void) rewind:(NSInteger) marker;
-- (void) rewind;
-- (void) release:(NSInteger) marker;
-- (void) seek:(NSInteger) index;
-
-// provide the streams data (e.g. for tokens using indices)
-- (NSString *) substring:(NSInteger)startIndex To:(NSInteger)stopIndex;
-- (NSString *) substringWithRange:(NSRange) theRange;
-
-// used for tracking the current position in the input stream
-- (NSInteger) getLine;
-- (void) setLine:(NSInteger) theLine;
-- (NSInteger) getCharPositionInLine;
-- (void) setCharPositionInLine:(NSInteger) thePos;
-
-- (NSInteger) getN;
-- (void) setN:(NSInteger)num;
-
-- (NSInteger) getP;
-- (void) setP:(NSInteger)num;
-
-- (ANTLRPtrBuffer *)getMarkers;
-- (void) setMarkers:(ANTLRPtrBuffer *)aMarkerList;
-
-- (NSString *)getSourceName;
-
-- (NSString *)toString;
-
-// accessors to the raw data of this stream
-- (NSString *) getData;
-- (void) setData: (NSString *) aData;
-
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRSymbolStack.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRSymbolStack.h
deleted file mode 100644
index 169df9f..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRSymbolStack.h
+++ /dev/null
@@ -1,75 +0,0 @@
-//
-//  ANTLRSymbolStack.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/9/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRBaseStack.h"
-// #import "ANTLRSymbolScope.h"
-
-//#define GLOBAL_SCOPE       0
-//#define LOCAL_SCOPE        1
-#define HASHSIZE         101
-#define HBUFSIZE      0x2000
-
-@interface ANTLRSymbolsScope : NSObject
-{
-    
-}
-
-+ (ANTLRSymbolsScope *)newANTLRSymbolsScope;
-
-- (id)init;
-@end
-
-
-@interface ANTLRSymbolStack : ANTLRBaseStack {
-}
-
-// Contruction/Destruction
-+(ANTLRSymbolStack *)newANTLRSymbolStack;
-+(ANTLRSymbolStack *)newANTLRSymbolStackWithLen:(NSInteger)cnt;
--(id)init;
--(id)initWithLen:(NSInteger)cnt;
--(void)dealloc;
-
-// Instance Methods
-- (id) copyWithZone:(NSZone *)aZone;
-/* clear -- reinitialize the maplist array */
-
--(ANTLRSymbolsScope *)getHashMapEntry:(NSInteger)idx;
-
--(ANTLRSymbolsScope **)getHashMap;
-
--(ANTLRSymbolsScope *) pop;
-
-- (void) insertObject:(ANTLRSymbolsScope *)aScope atIndex:(NSInteger)idx;
-- (ANTLRSymbolsScope *)objectAtIndex:(NSInteger)idx;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRSymbolStack.m b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRSymbolStack.m
deleted file mode 100644
index 1dd6775..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRSymbolStack.m
+++ /dev/null
@@ -1,123 +0,0 @@
-//
-//  ANTLRSymbolStack.m
-//  ANTLR
-//
-//  Created by Alan Condit on 6/9/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#define SUCCESS (0)
-#define FAILURE (-1)
-
-#import "ANTLRSymbolStack.h"
-#import "ANTLRTree.h"
-
-
-@implementation ANTLRSymbolsScope
-
-+ (ANTLRSymbolsScope *)newANTLRSymbolsScope
-{
-    return( [[ANTLRSymbolsScope alloc] init] );
-}
-
-- (id)init
-{
-    if ((self = [super init]) != nil) {
-    }
-    return (self);
-}
-
-@end
-
-/*
- * Start of ANTLRSymbolStack
- */
-@implementation ANTLRSymbolStack
-
-+(ANTLRSymbolStack *)newANTLRSymbolStack
-{
-    return [[ANTLRSymbolStack alloc] init];
-}
-
-+(ANTLRSymbolStack *)newANTLRSymbolStackWithLen:(NSInteger)cnt
-{
-    return [[ANTLRSymbolStack alloc] initWithLen:cnt];
-}
-
--(id)init
-{
-	if ((self = [super init]) != nil) {
-	}
-    return( self );
-}
-
--(id)initWithLen:(NSInteger)cnt
-{
-	if ((self = [super initWithLen:cnt]) != nil) {
-	}
-    return( self );
-}
-
--(void)dealloc
-{
-	[super dealloc];
-}
-
-- (id) copyWithZone:(NSZone *)aZone
-{
-    return [super copyWithZone:aZone];
-}
-
--(ANTLRSymbolsScope *)getHashMapEntry:(NSInteger)idx
-{
-	return( (ANTLRSymbolsScope *)[super objectAtIndex:idx] );
-}
-
--(ANTLRSymbolsScope **)getHashMap
-{
-	return( (ANTLRSymbolsScope **)ptrBuffer );
-}
-
--(ANTLRSymbolsScope *) pop
-{
-    return (ANTLRSymbolsScope *)[super pop];
-}
-
-- (void) insertObject:(ANTLRSymbolsScope *)aRule atIndex:(NSInteger)idx
-{
-    if (aRule != ptrBuffer[idx]) {
-        if (ptrBuffer[idx] != nil) [ptrBuffer[idx] release];
-        [aRule retain];
-    }
-    ptrBuffer[idx] = aRule;
-}
-
-- (ANTLRSymbolsScope *)objectAtIndex:(NSInteger)idx
-{
-    return (ANTLRSymbolsScope *)[super objectAtIndex:idx];
-}
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRToken+DebuggerSupport.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRToken+DebuggerSupport.h
deleted file mode 100755
index 659e763..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRToken+DebuggerSupport.h
+++ /dev/null
@@ -1,41 +0,0 @@
-//
-//  ANTLRToken+DebuggerSupport.h
-//  ANTLR
-//
-//  Created by Kay Röpke on 03.12.2006.
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-//
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRToken.h"
-#import "ANTLRCommonToken.h"
-
-@interface ANTLRCommonToken(DebuggerSupport)
-
-- (NSString *)debuggerDescription;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRToken.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRToken.h
deleted file mode 100755
index 64524f0..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRToken.h
+++ /dev/null
@@ -1,79 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-
-typedef enum {
-	ANTLRTokenTypeEOF = -1,
-	ANTLRTokenTypeInvalid,
-	ANTLRTokenTypeEOR,
-	ANTLRTokenTypeDOWN,
-	ANTLRTokenTypeUP,
-	ANTLRTokenTypeMIN
-} ANTLRTokenType;
-
-typedef enum {
-	ANTLRTokenChannelDefault = 0,
-    ANTLRTokenChannelHidden = 99
-} ANTLRTokenChannel;
-
-#define HIDDEN 99
-
-@protocol ANTLRToken < NSObject, NSCopying >
-
-// The singleton eofToken instance.
-+ (id<ANTLRToken>) eofToken;
-// The default channel for this class of Tokens
-+ (ANTLRTokenChannel) defaultChannel;
-
-// provide hooks to explicitely set the text as opposed to use the indices into the CharStream
-- (NSString *) getText;
-- (void) setText:(NSString *) theText;
-
-- (NSInteger) getType;
-- (void) setType: (NSInteger) aType;
-
-// ANTLR v3 provides automatic line and position tracking. Subclasses do not need to
-// override these, if they do not want to store line/pos tracking information
-- (NSUInteger) getLine;
-- (void) setLine: (NSUInteger) aLine;
-
-- (NSUInteger) getCharPositionInLine;
-- (void) setCharPositionInLine: (NSUInteger) aCharPositionInLine;
-
-// explicitely change the channel this Token is on. The default parser implementation
-// just sees the defaultChannel
-// Common idiom is to put whitespace tokens on channel 99.
-- (NSUInteger) getChannel;
-- (void) setChannel: (NSUInteger) aChannel;
-
-// the index of this Token into the TokenStream
-- (NSUInteger) getTokenIndex;
-- (void) setTokenIndex: (NSUInteger) aTokenIndex;
-- (NSString *)toString;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTokenRewriteStream.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTokenRewriteStream.h
deleted file mode 100644
index 0d8681f..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTokenRewriteStream.h
+++ /dev/null
@@ -1,170 +0,0 @@
-//
-//  ANTLRTokenRewriteStream.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/19/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRCommonTokenStream.h"
-#import "ANTLRLinkBase.h"
-#import "ANTLRHashMap.h"
-#import "ANTLRMapElement.h"
-#import "ANTLRTokenSource.h"
-
-// Define the rewrite operation hierarchy
-
-@interface ANTLRRewriteOperation : ANTLRCommonTokenStream
-{
-/** What index into rewrites List are we? */
-NSInteger instructionIndex;
-/** Token buffer index. */
-NSInteger index;
-NSString *text;
-}
-
-@property (getter=getInstructionIndex, setter=setInstructionIndex:) NSInteger instructionIndex;
-@property (getter=getIndex, setter=setIndex:) NSInteger index;
-@property (retain, getter=getText, setter=setText:) NSString *text;
-
-+ (ANTLRRewriteOperation *) newANTLRRewriteOperation:(NSInteger)index Text:(NSString *)text;
-
-- (id) initWithIndex:(NSInteger)anIndex Text:(NSString *)theText;
-
-/** Execute the rewrite operation by possibly adding to the buffer.
- *  Return the index of the next token to operate on.
- */
-- (NSInteger) execute:(NSString *)buf;
-
-- (NSString *)toString;
-- (NSInteger) indexOf:(char)aChar inString:(NSString *)aString;
-@end
-
-@interface ANTLRInsertBeforeOp : ANTLRRewriteOperation {
-}
-
-+ (ANTLRInsertBeforeOp *) newANTLRInsertBeforeOp:(NSInteger)anIndex Text:(NSString *)theText;
-- (id) initWithIndex:(NSInteger)anIndex Text:(NSString *)theText;
-
-@end
-
-/** I'm going to try replacing range from x..y with (y-x)+1 ReplaceOp
- *  instructions.
- */
-@interface ANTLRReplaceOp : ANTLRRewriteOperation {
-    NSInteger lastIndex;
-}
-
-@property (getter=getLastIndex, setter=setLastIndex:) NSInteger lastIndex;
-
-+ (ANTLRReplaceOp *) newANTLRReplaceOp:(NSInteger)from ToIndex:(NSInteger)to Text:(NSString*)theText;
-- (id) initWithIndex:(NSInteger)from ToIndex:(NSInteger)to Text:(NSString *)theText;
-
-- (NSInteger) execute:(NSString *)buf;
-- (NSString *)toString;
-
-@end
-
-@interface ANTLRDeleteOp : ANTLRReplaceOp {
-}
-+ (ANTLRDeleteOp *) newANTLRDeleteOp:(NSInteger)from ToIndex:(NSInteger)to;
-
-- (id) initWithIndex:(NSInteger)from ToIndex:(NSInteger)to;
-
-- (NSString *)toString;
-
-@end
-
-
-@interface ANTLRTokenRewriteStream : ANTLRCommonTokenStream {
-/** You may have multiple, named streams of rewrite operations.
- *  I'm calling these things "programs."
- *  Maps String (name) -> rewrite (List)
- */
-ANTLRHashMap *programs;
-
-/** Map String (program name) -> Integer index */
-ANTLRHashMap *lastRewriteTokenIndexes;
-}
-
-@property (retain, getter=getPrograms, setter=setPrograms:) ANTLRHashMap *programs;
-@property (retain, getter=getLastRewriteTokenIndexes, setter=setLastRewriteTokenIndexes:) ANTLRHashMap *lastRewriteTokenIndexes;
-
-+ (ANTLRTokenRewriteStream *)newANTLRTokenRewriteStream;
-+ (ANTLRTokenRewriteStream *)newANTLRTokenRewriteStream:(id<ANTLRTokenSource>) aTokenSource;
-+ (ANTLRTokenRewriteStream *)newANTLRTokenRewriteStream:(id<ANTLRTokenSource>) aTokenSource Channel:(NSInteger)aChannel;
-
-- (id) init;
-- (id)initWithTokenSource:(id<ANTLRTokenSource>)aTokenSource;
-- (id)initWithTokenSource:(id<ANTLRTokenSource>)aTokenSource Channel:(NSInteger)aChannel;
-
-- (ANTLRHashMap *)getPrograms;
-- (void)setPrograms:(ANTLRHashMap *)aProgList;
-
-- (void) rollback:(NSInteger)instructionIndex;
-- (void) rollback:(NSString *)programName Index:(NSInteger)anInstructionIndex;
-- (void) deleteProgram;
-- (void) deleteProgram:(NSString *)programName;
-- (void) insertAfterToken:(id<ANTLRToken>)t Text:(NSString *)theText;
-- (void) insertAfterIndex:(NSInteger)anIndex Text:(NSString *)theText;
-- (void) insertAfterProgNam:(NSString *)programName Index:(NSInteger)anIndex Text:(NSString *)theText;
-
-
-- (void) insertBeforeToken:(id<ANTLRToken>)t Text:(NSString *)theText;
-- (void) insertBeforeIndex:(NSInteger)anIndex Text:(NSString *)theText;
-- (void) insertBeforeProgName:(NSString *)programName Index:(NSInteger)index Text:(NSString *)theText;
-- (void) replaceFromIndex:(NSInteger)anIndex Text:(NSString *)theText;
-- (void) replaceFromIndex:(NSInteger)from ToIndex:(NSInteger)to Text:(NSString *)theText;
-- (void) replaceFromToken:(id<ANTLRToken>)indexT Text:(NSString *)theText;
-- (void) replaceFromToken:(id<ANTLRToken>)from ToToken:(id<ANTLRToken>)to Text:(NSString *)theText;
-- (void) replaceProgNam:(NSString *)programName Token:(id<ANTLRToken>)from Token:(id<ANTLRToken>)to Text:(NSString *)theText;
-- (void) replaceProgNam:(NSString *)programName FromIndex:(NSInteger)from ToIndex:(NSInteger)to Text:(NSString *)theText;
-- (void) delete:(NSInteger)anIndex;
-- (void) delete:(NSInteger)from ToIndex:(NSInteger)to;
-- (void) deleteToken:(id<ANTLRToken>)indexT;
-- (void) deleteFromToken:(id<ANTLRToken>)from ToToken:(id<ANTLRToken>)to;
-- (void) delete:(NSString *)programName FromToken:(id<ANTLRToken>)from ToToken:(id<ANTLRToken>)to;
-- (void) delete:(NSString *)programName FromIndex:(NSInteger)from ToIndex:(NSInteger)to;
-- (NSInteger)getLastRewriteTokenIndex;
-- (NSInteger)getLastRewriteTokenIndex:(NSString *)programName;
-- (void)setLastRewriteTokenIndex:(NSString *)programName Index:(NSInteger)anInt;
-- (ANTLRHashMap *) getProgram:(NSString *)name;
-- (ANTLRHashMap *) initializeProgram:(NSString *)name;
-- (NSString *)toOriginalString;
-- (NSString *)toOriginalString:(NSInteger)start End:(NSInteger)end;
-- (NSString *)toString;
-- (NSString *)toString:(NSString *)programName;
-- (NSString *)toStringFromStart:(NSInteger)start ToEnd:(NSInteger)end;
-- (NSString *)toString:(NSString *)programName FromStart:(NSInteger)start ToEnd:(NSInteger)end;
-- (ANTLRHashMap *)reduceToSingleOperationPerIndex:(ANTLRHashMap *)rewrites;
-- (ANTLRHashMap *)getKindOfOps:(ANTLRHashMap *)rewrites KindOfClass:(Class)kind;
-- (ANTLRHashMap *)getKindOfOps:(ANTLRHashMap *)rewrites KindOfClass:(Class)kind Index:(NSInteger)before;
-- (NSString *)catOpText:(id)a PrevText:(id)b;
-- (NSMutableString *)toDebugString;
-- (NSMutableString *)toDebugStringFromStart:(NSInteger)start ToEnd:(NSInteger)end;
-                    
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTokenSource.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTokenSource.h
deleted file mode 100755
index 4d6b6ee..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTokenSource.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import "ANTLRToken.h"
-
-// Anything that responds to -nextToken can be treated as a lexer.
-// For instance this can be a flex lexer or a handwritten one or even
-// a proxy for a remotely running token source (database, lexer, whatever).
-@protocol ANTLRTokenSource <NSObject, NSCopying>
-
-- (id<ANTLRToken>) nextToken;
-- (NSString *)getSourceName;
-
-@end
\ No newline at end of file
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTokenStream.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTokenStream.h
deleted file mode 100755
index c104578..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTokenStream.h
+++ /dev/null
@@ -1,62 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import "ANTLRIntStream.h"
-#import "ANTLRToken.h"
-
-@protocol ANTLRTokenStream < ANTLRIntStream >
-
-// Get Token at current input pointer + i ahead where i=1 is next Token.
-// i<0 indicates tokens in the past.  So -1 is previous token and -2 is
-// two tokens ago. LT:0 is undefined.  For i>=n, return Token.EOFToken.
-// Return null for LT:0 and any index that results in an absolute address
-// that is negative.
-
-- (id<ANTLRToken>) LT:(NSInteger) i;
-
-- (id<ANTLRToken>) getToken:(NSUInteger) i;
-
-- (id) getTokenSource;
-
-- (NSString *) toString;
-/** Return the text of all tokens from start to stop, inclusive.
- *  If the stream does not buffer all the tokens then it can just
- *  return "" or null;  Users should not access $ruleLabel.text in
- *  an action of course in that case.
- */
-- (NSString *)toStringFromStart:(NSInteger)startIdx ToEnd:(NSInteger)stopIdx;
-
-/** Because the user is not required to use a token with an index stored
- *  in it, we must provide a means for two token objects themselves to
- *  indicate the start/end location.  Most often this will just delegate
- *  to the other toString(int,int).  This is also parallel with
- *  the TreeNodeStream.toString(Object,Object).
- */
-- (NSString *) toStringFromToken:(id<ANTLRToken>)startToken ToToken:(id<ANTLRToken>)stopToken;
-
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTree.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTree.h
deleted file mode 100755
index f269b2d..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTree.h
+++ /dev/null
@@ -1,123 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-@protocol ANTLRTree < NSObject, NSCopying >
-
-//+ (id<ANTLRTree>) invalidNode;
-
-- (id<ANTLRTree>) getChild:(NSUInteger)index;
-- (NSUInteger) getChildCount;
-
-// Tree tracks parent and child index now > 3.0
-
-- (id<ANTLRTree>)getParent;
-
-- (void) setParent:(id<ANTLRTree>)t;
-
-/** Is there is a node above with token type ttype? */
-- (BOOL) hasAncestor:(NSInteger)ttype;
-
-/** Walk upwards and get first ancestor with this token type. */
-- (id<ANTLRTree>) getAncestor:(NSInteger) ttype;
-
-/** Return a list of all ancestors of this node.  The first node of
- *  list is the root and the last is the parent of this node.
- */
-- (NSMutableArray *) getAncestors;
-
-/** This node is what child index? 0..n-1 */
-- (NSInteger) getChildIndex;
-
-- (void) setChildIndex:(NSInteger) index;
-
-/** Set the parent and child index values for all children */
-- (void) freshenParentAndChildIndexes;
-
-/** Add t as a child to this node.  If t is null, do nothing.  If t
- *  is nil, add all children of t to this' children.
- */
-- (void) addChild:(id<ANTLRTree>) t;
-
-/** Set ith child (0..n-1) to t; t must be non-null and non-nil node */
-- (void) setChild:(NSInteger)i With:(id<ANTLRTree>) t;
-
-- (id) deleteChild:(NSInteger) i;
-
-/** Delete children from start to stop and replace with t even if t is
- *  a list (nil-root tree).  num of children can increase or decrease.
- *  For huge child lists, inserting children can force walking rest of
- *  children to set their childindex; could be slow.
- */
-- (void) replaceChildrenFrom:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id)t;	
-
-- (NSArray *) getChildren;
-// Add t as a child to this node.  If t is null, do nothing.  If t
-//  is nil, add all children of t to this' children.
-
-- (void) addChildren:(NSArray *) theChildren;
-//- (void) removeAllChildren;
-
-// Indicates the node is a nil node but may still have children, meaning
-// the tree is a flat list.
-
-- (BOOL) isNil;
-
-/**  What is the smallest token index (indexing from 0) for this node
- *   and its children?
- */
-- (NSInteger) getTokenStartIndex;
-
-- (void) setTokenStartIndex:(NSInteger) index;
-
-/**  What is the largest token index (indexing from 0) for this node
- *   and its children?
- */
-- (NSInteger) getTokenStopIndex;
-- (void) setTokenStopIndex:(NSInteger) index;
-
-- (id<ANTLRTree>) dupNode;
-
-- (NSString *) toString;
-
-#pragma mark Copying
-- (id) copyWithZone:(NSZone *)aZone;	// the children themselves are not copied here!
-- (id) deepCopy;					// performs a deepCopyWithZone: with the default zone
-- (id) deepCopyWithZone:(NSZone *)aZone;
-
-#pragma mark Tree Parser support
-- (NSInteger) getType;
-- (NSString *) getText;
-// In case we don't have a token payload, what is the line for errors?
-- (NSInteger) getLine;
-- (NSInteger) getCharPositionInLine;
-- (void) setCharPositionInLine:(NSInteger)pos;
-
-#pragma mark Informational
-- (NSString *) treeDescription;
-- (NSString *) description;
-
-@end
-
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTreeAdaptor.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTreeAdaptor.h
deleted file mode 100755
index e6579cf..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTreeAdaptor.h
+++ /dev/null
@@ -1,159 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import "ANTLRToken.h"
-#import "ANTLRBaseTree.h"
-#import "ANTLRTokenStream.h"
-
-#pragma warning tree/node diction is broken.
-
-@protocol ANTLRTreeAdaptor <NSObject, NSCopying>
-
-#pragma mark Construction
-
-+ (id<ANTLRTree>) newEmptyTree;
-
-- (id<ANTLRTree>) createTree:(id<ANTLRToken>)payload;
-
-#pragma mark ANTLRTreeAdaptor implementation
-- (id<ANTLRTree>)dupNode:(id<ANTLRTree>)aNode;	// copies just the node
-- (id<ANTLRTree>)dupTree:(id<ANTLRTree>)aTree;	// copies the entire subtree, recursively
-
-/** Return a nil node (an empty but non-null node) that can hold
- *  a list of element as the children.  If you want a flat tree (a list)
- *  use "t=adaptor.nil(); t.addChild(x); t.addChild(y);"
- */
-- (id) emptyNode;
-
-/** Return a tree node representing an error.  This node records the
- *  tokens consumed during error recovery.  The start token indicates the
- *  input symbol at which the error was detected.  The stop token indicates
- *  the last symbol consumed during recovery.
- *
- *  You must specify the input stream so that the erroneous text can
- *  be packaged up in the error node.  The exception could be useful
- *  to some applications; default implementation stores ptr to it in
- *  the CommonErrorNode.
- *
- *  This only makes sense during token parsing, not tree parsing.
- *  Tree parsing should happen only when parsing and tree construction
- *  succeed.
- */
-- (id) errorNode:(id<ANTLRTokenStream>)anInput
-            From:(id<ANTLRToken>)aStartToken
-              To:(id<ANTLRToken>)aStopToken
-       Exception:(NSException *) e;
-
-/** Is tree considered a nil node used to make lists of child nodes? */
-- (BOOL) isNil:(id<ANTLRTree>)aTree;
-
-
-- (void) addChild:(id<ANTLRTree>)child toTree:(id<ANTLRTree>)aTree;
-
-/** If oldRoot is a nil root, just copy or move the children to newRoot.
- *  If not a nil root, make oldRoot a child of newRoot.
- *
- *    old=^(nil a b c), new=r yields ^(r a b c)
- *    old=^(a b c), new=r yields ^(r ^(a b c))
- *
- *  If newRoot is a nil-rooted single child tree, use the single
- *  child as the new root node.
- *
- *    old=^(nil a b c), new=^(nil r) yields ^(r a b c)
- *    old=^(a b c), new=^(nil r) yields ^(r ^(a b c))
- *
- *  If oldRoot was null, it's ok, just return newRoot (even if isNil).
- *
- *    old=null, new=r yields r
- *    old=null, new=^(nil r) yields ^(nil r)
- *
- *  Return newRoot.  Throw an exception if newRoot is not a
- *  simple node or nil root with a single child node--it must be a root
- *  node.  If newRoot is ^(nil x) return x as newRoot.
- *
- *  Be advised that it's ok for newRoot to point at oldRoot's
- *  children; i.e., you don't have to copy the list.  We are
- *  constructing these nodes so we should have this control for
- *  efficiency.
- */
-- (id) becomeRoot:(id<ANTLRTree>)newRoot old:(id<ANTLRTree>)oldRoot;
-
-- (id) rulePostProcessing:(id<ANTLRTree>)root;
-
-#pragma mark Rewrite Rules
-                           
-- (NSUInteger) getUniqueID:(id<ANTLRTree>)aNode;
-
-- (id<ANTLRTree>) createTree:(NSInteger)tokenType FromToken:(id<ANTLRToken>)fromToken;
-- (id<ANTLRTree>) createTree:(NSInteger)tokenType FromToken:(id<ANTLRToken>)fromToken Text:(NSString *)text;
-- (id<ANTLRTree>) createTree:(NSInteger)tokenType Text:(NSString *)text;
-
-#pragma mark Content
-
-- (id<ANTLRTree>)dupNode:(id<ANTLRTree>)aNode;
-- (id<ANTLRTree>)dupTree:(id<ANTLRTree>)aTree;
-
-- (NSInteger) getType:(id<ANTLRTree>)aNode;
-- (void) setType:(id<ANTLRTree>)aNode Type:(NSInteger)tokenType;
-
-- (NSString *) getText:(id<ANTLRTree>)aNode;
-- (void) setText:(id<ANTLRTree>)aNode Text:(NSString *)tokenText;
-
-- (id<ANTLRToken>) getToken:(id<ANTLRTree>)t;
-
-- (void) setTokenBoundaries:(id<ANTLRTree>)aTree From:(id<ANTLRToken>)startToken To:(id<ANTLRToken>)stopToken;
-- (NSInteger) getTokenStartIndex:(id<ANTLRTree>)aTree;
-- (NSInteger) getTokenStopIndex:(id<ANTLRTree>)aTree;
-
-#pragma mark Navigation / Tree Parsing
-
-/** Get a child 0..n-1 node */
-- (id<ANTLRTree>) getChild:(id<ANTLRTree>)aNode At:(NSInteger) i;
-/** Set ith child (0..n-1) to t; t must be non-null and non-nil node */
-- (void) setChild:(id<ANTLRTree>)aTree At:(NSInteger)index Child:(id<ANTLRTree>)child;
-/** Remove ith child and shift children down from right. */
-- (id<ANTLRTree>) deleteChild:(id<ANTLRTree>)t Index:(NSInteger)index;
-
-/** How many children?  If 0, then this is a leaf node */
-- (NSInteger) getChildCount:(id<ANTLRTree>) aTree;
-
-/** Who is the parent node of this node; if null, implies node is root.
- *  If your node type doesn't handle this, it's ok but the tree rewrites
- *  in tree parsers need this functionality.
- */
-- (id<ANTLRTree>)getParent:(id<ANTLRTree>)t;
-- (void) setParent:(id<ANTLRTree>)t With:(id<ANTLRTree>)parent;
-
-/** What index is this node in the child list? Range: 0..n-1
- *  If your node type doesn't handle this, it's ok but the tree rewrites
- *  in tree parsers need this functionality.
- */
-- (NSInteger) getChildIndex:(id<ANTLRTree>)t;
-- (void) setChildIndex:(id<ANTLRTree>)t With:(NSInteger)index;
-
-- (void) replaceChildren:(id<ANTLRTree>)parent From:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id<ANTLRTree>)t;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTreeException.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTreeException.h
deleted file mode 100755
index 8ec5c45..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTreeException.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTree.h"
-#import "ANTLRRecognitionException.h"
-
-@interface ANTLRTreeException : ANTLRRecognitionException {
-	id<ANTLRTree> oldRoot;
-	id<ANTLRTree> newRoot;
-}
-
-+ (id) exceptionWithOldRoot:(id<ANTLRTree>)theOldRoot newRoot:(id<ANTLRTree>)theNewRoot stream:(id<ANTLRIntStream>)aStream;
-- (id) initWithOldRoot:(id<ANTLRTree>)theOldRoot newRoot:(id<ANTLRTree>)theNewRoot stream:(id<ANTLRIntStream>)aStream;
-
-- (void) setOldRoot:(id<ANTLRTree>)aTree;
-- (void) setNewRoot:(id<ANTLRTree>)aTree;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTreeIterator.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTreeIterator.h
deleted file mode 100644
index e6d5e71..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTreeIterator.h
+++ /dev/null
@@ -1,67 +0,0 @@
-//
-//  ANTLRTreeIterator.h
-//  ANTLR
-//
-//  Created by Ian Michell on 26/04/2010.
-// [The "BSD licence"]
-// Copyright (c) 2010 Ian Michell 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRCommonTreeAdaptor.h"
-#import "ANTLRFastQueue.h"
-#import "ANTLRTreeAdaptor.h"
-#import "ANTLRTree.h"
-
-@interface ANTLRTreeIterator : NSObject 
-{
-	id<ANTLRTreeAdaptor> adaptor;
-	id<ANTLRTree> root;
-	id<ANTLRTree> tree;
-	BOOL firstTime;
-	id<ANTLRTree> up;
-	id<ANTLRTree> down;
-	id<ANTLRTree> eof;
-	
-	ANTLRFastQueue *nodes;
-}
-
-@property(retain, readwrite) id<ANTLRTree> up;
-@property(retain, readwrite) id<ANTLRTree> down;
-@property(retain, readwrite) id<ANTLRTree> eof;
-
-+ newANTRLTreeIterator;
-+ (ANTLRTreeIterator *) newANTRLTreeIteratorWithAdaptor:(ANTLRCommonTreeAdaptor *)adaptor
-                                                andTree:(id<ANTLRTree>)tree;
-- (id) init;
-- (id) initWithTree:(id<ANTLRTree>) t;
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>) a andTree:(id<ANTLRTree>) t;
-
-- (void) reset;
-- (BOOL) hasNext;
-- (id) nextObject;
-- (NSArray *) allObjects;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTreeNodeStream.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTreeNodeStream.h
deleted file mode 100755
index bf6342c..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTreeNodeStream.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRIntStream.h"
-#import "ANTLRCharStream.h"
-#import "ANTLRTokenStream.h"
-#import "ANTLRCommonTree.h"
-#import "ANTLRCommonTreeAdaptor.h"
-
-@protocol ANTLRTreeNodeStream < ANTLRIntStream > 
-
-- (id) initWithTree:(ANTLRCommonTree *)theTree;
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)theAdaptor Tree:(ANTLRCommonTree *)theTree;
-
-- (id) LT:(NSInteger)k;
-- (id) getTreeSource;
-- (id<ANTLRTreeAdaptor>) getTreeAdaptor;
-- (id<ANTLRTokenStream>) getTokenStream; 
-- (void) setUniqueNavigationNodes:(BOOL)flag;
-
-- (id) getNode:(NSInteger) idx;
-
-- (NSString *) toStringFromNode:(id)startNode ToNode:(id)stopNode;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTreeParser.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTreeParser.h
deleted file mode 100755
index e2f01ee..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTreeParser.h
+++ /dev/null
@@ -1,89 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRBaseRecognizer.h"
-#import "ANTLRTreeNodeStream.h"
-#import "ANTLRCommonTreeAdaptor.h"
-#import "ANTLRMismatchedTreeNodeException.h"
-
-@interface ANTLRTreeParser : ANTLRBaseRecognizer {
-	id<ANTLRTreeNodeStream> input;
-}
-
-@property (retain, getter=getInput, setter=setInput:) id<ANTLRTreeNodeStream> input;
-
-+ (id) newANTLRTreeParser:(id<ANTLRTreeNodeStream>)anInput;
-+ (id) newANTLRTreeParser:(id<ANTLRTreeNodeStream>)anInput State:(ANTLRRecognizerSharedState *)state;
-
-- (id) initWithStream:(id<ANTLRTreeNodeStream>)theInput;
-- (id) initWithStream:(id<ANTLRTreeNodeStream>)theInput
-                State:(ANTLRRecognizerSharedState *)state;
-
-
-- (id<ANTLRTreeNodeStream>)getInput;
-- (void) setInput:(id<ANTLRTreeNodeStream>)anInput;
-
-- (void) setTreeNodeStream:(id<ANTLRTreeNodeStream>) anInput;
-- (id<ANTLRTreeNodeStream>) getTreeNodeStream;
-
-- (NSString *)getSourceName;
-
-- (id) getCurrentInputSymbol:(id<ANTLRIntStream>) anInput;
-
-- (id) getMissingSymbol:(id<ANTLRIntStream>)input
-              Exception:(ANTLRRecognitionException *) e
-          ExpectedToken:(NSInteger) expectedTokenType
-                 BitSet:(ANTLRBitSet *)follow;
-
-/** Match '.' in tree parser has special meaning.  Skip node or
- *  entire tree if node has children.  If children, scan until
- *  corresponding UP node.
- */
-- (void) matchAny:(id<ANTLRIntStream>)ignore;
-
-/** We have DOWN/UP nodes in the stream that have no line info; override.
- *  plus we want to alter the exception type.  Don't try to recover
- *  from tree parser errors inline...
- */
-- (id) recoverFromMismatchedToken:(id<ANTLRIntStream>)anInput
-                             Type:(NSInteger)ttype
-                           Follow:(ANTLRBitSet *)follow;
-
-/** Prefix error message with the grammar name because message is
- *  always intended for the programmer because the parser built
- *  the input tree not the user.
- */
-- (NSString *)getErrorHeader:(ANTLRRecognitionException *)e;
-
-- (NSString *)getErrorMessage:(ANTLRRecognitionException *)e TokenNames:(NSArray *) tokenNames;
-
-- (void) traceIn:(NSString *)ruleName Index:(NSInteger)ruleIndex;
-- (void) traceOut:(NSString *)ruleName Index:(NSInteger)ruleIndex;
-
-
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTreePatternLexer.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTreePatternLexer.h
deleted file mode 100644
index f6059d3..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTreePatternLexer.h
+++ /dev/null
@@ -1,87 +0,0 @@
-//
-//  ANTLRTreePatternLexer.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/18/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-
-typedef enum {
-	ANTLRLexerTokenTypeEOF = -1,
-	ANTLRLexerTokenTypeInvalid,
-	ANTLRLexerTokenTypeBEGIN,
-	ANTLRLexerTokenTypeEND,
-	ANTLRLexerTokenTypeID,
-	ANTLRLexerTokenTypeARG,
-	ANTLRLexerTokenTypePERCENT,
-	ANTLRLexerTokenTypeCOLON,
-	ANTLRLexerTokenTypeDOT,
-} ANTLRLexerTokenType;
-
-
-@interface ANTLRTreePatternLexer : NSObject {
-
-/** The tree pattern to lex like "(A B C)" */
-NSString *pattern;
-    
-/** Index into input string */
-NSInteger p;
-    
-/** Current char */
-NSInteger c;
-    
-/** How long is the pattern in char? */
-NSInteger n;
-    
-/** Set when token type is ID or ARG (name mimics Java's StreamTokenizer) */
-NSMutableData *sval;
-char *data;
-    
-BOOL error;
-
-}
-
-@property (retain, getter=getPattern, setter=setPattern:) NSString *pattern;
-@property (getter=getP, setter=setP:) NSInteger p;
-@property (getter=getC, setter=setC:) NSInteger c;
-@property (getter=getN, setter=setN:) NSInteger n;
-@property (retain, getter=getSval, setter=setSval:) NSMutableData *sval;
-@property (assign, getter=getData, setter=setData:) char *data;
-@property (getter=getError, setter=setError) BOOL error;
-
-+ (ANTLRTreePatternLexer *)newANTLRTreePatternLexer:(NSString *)aPattern;
-- (id) init;
-- (id) initWithPattern:(NSString *)aPattern;
-- (NSInteger) nextToken;
-- (void) consume;
-- (NSString *)toString;
-
-- (NSMutableData *)getSval;
-- (void) setSval:(NSMutableData *)aSval;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTreePatternParser.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTreePatternParser.h
deleted file mode 100644
index f6d6dc6..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTreePatternParser.h
+++ /dev/null
@@ -1,57 +0,0 @@
-//
-//  ANTLRTreePatternParser.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/18/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTreePatternLexer.h"
-#import "ANTLRTreeWizard.h"
-#import "ANTLRTreeAdaptor.h"
-
-@interface ANTLRTreePatternParser : NSObject {
-
-ANTLRTreePatternLexer *tokenizer;
-NSInteger ttype;
-ANTLRTreeWizard *wizard;
-id<ANTLRTreeAdaptor> adaptor;
-    
-}
-
-+ (ANTLRTreePatternParser *)newANTLRTreePatternParser:(ANTLRTreePatternLexer *)aTokenizer
-                                               Wizard:(ANTLRTreeWizard *)aWizard
-                                              Adaptor:(id<ANTLRTreeAdaptor>)anAdaptor;
-- (id) init;
-- (id) initWithTokenizer:(ANTLRTreePatternLexer *)tokenizer
-                  Wizard:(ANTLRTreeWizard *)aWizard
-                 Adaptor:(id<ANTLRTreeAdaptor>)anAdaptor;
-- (id<ANTLRTree>) pattern;
-- (id<ANTLRTree>) parseTree;
-- (id<ANTLRTree>) parseNode;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTreeRewriter.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTreeRewriter.h
deleted file mode 100644
index aee873e..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTreeRewriter.h
+++ /dev/null
@@ -1,72 +0,0 @@
-//
-//  ANTLRTreeRewriter.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/17/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTreeParser.h"
-
-@interface ANTLRfptr : NSObject {
-    id  actor;
-    SEL ruleSEL;
-}
-
-+ (ANTLRfptr *)newANTLRfptrWithRule:(SEL)aRuleAction withObject:(id)anObject;
--initWithRule:(SEL)ruleAction withObject:(id)anObject;
-
-- (id)rule;
-
-@end
-
-@interface ANTLRTreeRewriter : ANTLRTreeParser {
-    BOOL showTransformations;
-    id<ANTLRTokenStream> originalTokenStream;
-    id<ANTLRTreeAdaptor> originalAdaptor;
-    ANTLRfptr *rule;
-    ANTLRfptr *topdown_fptr;
-    ANTLRfptr *bottomup_ftpr;
-}
-
-+ (ANTLRTreeRewriter *) newANTLRTreeRewriter:(id<ANTLRTreeNodeStream>)anInput;
-+ (ANTLRTreeRewriter *) newANTLRTreeRewriter:(id<ANTLRTreeNodeStream>)anInput State:(ANTLRRecognizerSharedState *)aState;
-- (id)initWithStream:(id<ANTLRTreeNodeStream>)anInput;
-- (id)initWithStream:(id<ANTLRTreeNodeStream>)anInput State:(ANTLRRecognizerSharedState *)aState;
-- (ANTLRTreeRewriter *) applyOnce:(id<ANTLRTree>)t Rule:(ANTLRfptr *)whichRule;
-- (ANTLRTreeRewriter *) applyRepeatedly:(id<ANTLRTree>)t Rule:(ANTLRfptr *)whichRule;
-- (ANTLRTreeRewriter *) downup:(id<ANTLRTree>)t;
-- (ANTLRTreeRewriter *) pre:(id<ANTLRTree>)t;
-- (ANTLRTreeRewriter *) post:(id<ANTLRTree>)t;
-- (ANTLRTreeRewriter *) downup:(id<ANTLRTree>)t XForm:(BOOL)aShowTransformations;
-- (void)reportTransformation:(id<ANTLRTree>)oldTree Tree:(id<ANTLRTree>)newTree;
-- (ANTLRTreeRewriter *) topdown_fptr;
-- (ANTLRTreeRewriter *) bottomup_ftpr;
-- (ANTLRTreeRewriter *) topdown;
-- (ANTLRTreeRewriter *) bottomup;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTreeRuleReturnScope.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTreeRuleReturnScope.h
deleted file mode 100644
index ea8a487..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTreeRuleReturnScope.h
+++ /dev/null
@@ -1,49 +0,0 @@
-//
-//  ANTLRTreeRuleReturnScope.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/17/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRuleReturnScope.h"
-#import "ANTLRCommonTree.h"
-
-@interface ANTLRTreeRuleReturnScope : ANTLRRuleReturnScope {
-    ANTLRCommonTree *startNode;
-}
-
-@property (retain, getter=getStart, setter=setStart:) ANTLRCommonTree *startNode;
-
-/** First node or root node of tree matched for this rule. */
-
-- (ANTLRCommonTree *)getStart;
-- (void)setStart:(ANTLRCommonTree *)aStartNode;
-
-- (id) copyWithZone:(NSZone *)theZone;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTreeVisitor.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTreeVisitor.h
deleted file mode 100644
index 1f167bb..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTreeVisitor.h
+++ /dev/null
@@ -1,45 +0,0 @@
-//
-//  ANTLRTreeVisitor.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/18/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTreeAdaptor.h"
-#import "ANTLRTreeVisitorAction.h"
-
-@interface ANTLRTreeVisitor : NSObject {
-   id<ANTLRTreeAdaptor> adaptor;
-}
-+ (ANTLRTreeVisitor *)newANTLRTreeVisitor:(id<ANTLRTreeAdaptor>) anAdaptor;
-+ (ANTLRTreeVisitor *)newANTLRTreeVisitor;
-- (id)init;
-- (id)initWithAdaptor:(id<ANTLRTreeAdaptor>)anAdaptor;
-- (ANTLRTreeVisitor *)visit:(id<ANTLRTree>)t Action:(ANTLRTreeVisitorAction *)action;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTreeVisitorAction.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTreeVisitorAction.h
deleted file mode 100644
index c9c0856..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTreeVisitorAction.h
+++ /dev/null
@@ -1,56 +0,0 @@
-//
-//  ANTLRTreeVisitorAction.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/18/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-
-
-@interface ANTLRTreeVisitorAction : NSObject
-{
-
-}
-
-+ (ANTLRTreeVisitorAction *)newANTLRTreeVisitorAction;
-- (id) init;
-
-/** Execute an action before visiting children of t.  Return t or
- *  a rewritten t.  It is up to the visitor to decide what to do
- *  with the return value.  Children of returned value will be
- *  visited if using TreeVisitor.visit().
- */
-- (ANTLRTreeVisitorAction *)pre:(ANTLRTreeVisitorAction *) t;
-
-/** Execute an action after visiting children of t.  Return t or
- *  a rewritten t.  It is up to the visitor to decide what to do
- *  with the return value.
- */
-- (ANTLRTreeVisitorAction *)post:(ANTLRTreeVisitorAction *) t;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTreeWizard.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTreeWizard.h
deleted file mode 100644
index d952572..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRTreeWizard.h
+++ /dev/null
@@ -1,134 +0,0 @@
-//
-//  ANTLRTreeWizard.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/18/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRCommonTreeAdaptor.h"
-#import "ANTLRCommonTree.h"
-#import "ANTLRMapElement.h"
-#import "ANTLRMap.h"
-
-@class ANTLRVisitor;
-
-@protocol ANTLRContextVisitor <NSObject>
-// TODO: should this be called visit or something else?
-- (void) visit:(id<ANTLRTree>)t Parent:(id<ANTLRTree>)parent ChildIndex:(NSInteger)childIndex Map:(ANTLRMap *)labels;
-
-@end
-
-@interface ANTLRVisitor : NSObject <ANTLRContextVisitor> {
-    NSInteger action;
-    id actor;
-    id object1;
-    id object2;
-}
-+ (ANTLRVisitor *)newANTLRVisitor:(NSInteger)anAction Actor:(id)anActor Object:(id)anObject1 Object:(id)anObject2;
-- (id) initWithAction:(NSInteger)anAction Actor:(id)anActor Object:(id)anObject1 Object:(id)anObject2;
-
-- (void) visit:(id<ANTLRTree>)t;
-- (void) visit:(id<ANTLRTree>)t Parent:(id<ANTLRTree>)parent ChildIndex:(NSInteger)childIndex Map:(ANTLRMap *)labels;
-
-@end
-
-/** When using %label:TOKENNAME in a tree for parse(), we must
- *  track the label.
- */
-@interface ANTLRTreePattern : ANTLRCommonTree {
-    NSString *label;
-    BOOL      hasTextArg;
-}
-@property (retain, getter=getLabel, setter=setLabel:) NSString *label;
-@property (assign, getter=getHasTextArg, setter=setHasTextArg:) BOOL hasTextArg;
-
-+ (ANTLRTreePattern *)newANTLRTreePattern:(id<ANTLRToken>)payload;
-
-- (id) initWithToken:(id<ANTLRToken>)payload;
-- (NSString *)toString;
-@end
-
-@interface ANTLRWildcardTreePattern : ANTLRTreePattern {
-}
-
-+ (ANTLRWildcardTreePattern *)newANTLRWildcardTreePattern:(id<ANTLRToken>)payload;
-- (id) initWithToken:(id<ANTLRToken>)payload;
-@end
-
-/** This adaptor creates TreePattern objects for use during scan() */
-@interface ANTLRTreePatternTreeAdaptor : ANTLRCommonTreeAdaptor {
-}
-+ (ANTLRTreePatternTreeAdaptor *)newTreeAdaptor;
-#ifdef DONTUSENOMO
-+ (ANTLRTreePatternTreeAdaptor *)newTreeAdaptor:(id<ANTLRToken>)payload;
-#endif
-- (id) init;
-#ifdef DONTUSENOMO
-- initWithToken:(id<ANTLRToken>)payload;
-#endif
-- (id<ANTLRTree>)createTreePattern:(id<ANTLRToken>)payload;
-
-@end
-
-@interface ANTLRTreeWizard : NSObject {
-	id<ANTLRTreeAdaptor> adaptor;
-	ANTLRMap *tokenNameToTypeMap;
-}
-+ (ANTLRTreeWizard *) newANTLRTreeWizard:(id<ANTLRTreeAdaptor>)anAdaptor;
-+ (ANTLRTreeWizard *)newANTLRTreeWizard:(id<ANTLRTreeAdaptor>)adaptor Map:(ANTLRMap *)aTokenNameToTypeMap;
-+ (ANTLRTreeWizard *)newANTLRTreeWizard:(id<ANTLRTreeAdaptor>)adaptor TokenNames:(NSArray *)theTokNams;
-+ (ANTLRTreeWizard *)newANTLRTreeWizardWithTokenNames:(NSArray *)theTokNams;
-- (id) init;
-- (id) initWithAdaptor:(id<ANTLRTreeAdaptor>)adaptor;
-- (id) initWithAdaptor:(id<ANTLRTreeAdaptor>)adaptor Map:(ANTLRMap *)tokenNameToTypeMap;
-- (id) initWithTokenNames:(NSArray *)theTokNams;
-- (id) initWithTokenNames:(id<ANTLRTreeAdaptor>)anAdaptor TokenNames:(NSArray *)theTokNams;
-- (ANTLRMap *)computeTokenTypes:(NSArray *)theTokNams;
-- (NSInteger)getTokenType:(NSString *)tokenName;
-- (ANTLRMap *)index:(id<ANTLRTree>)t;
-- (void) _index:(id<ANTLRTree>)t Map:(ANTLRMap *)m;
-- (NSMutableArray *)find:(id<ANTLRTree>) t Pattern:(NSString *)pattern;
-- (ANTLRTreeWizard *)findFirst:(id<ANTLRTree>) t Type:(NSInteger)ttype;
-- (ANTLRTreeWizard *)findFirst:(id<ANTLRTree>) t Pattern:(NSString *)pattern;
-- (void) visit:(id<ANTLRTree>)t Type:(NSInteger)ttype Visitor:(ANTLRVisitor *)visitor;
-- (void) _visit:(id<ANTLRTree>)t
-         Parent:(id<ANTLRTree>)parent
-     ChildIndex:(NSInteger)childIndex
-           Type:(NSInteger)ttype
-        Visitor:(ANTLRVisitor *)visitor;
-- (void)visit:(id<ANTLRTree>)t Pattern:(NSString *)pattern Visitor:(ANTLRVisitor *)visitor;
-- (BOOL)parse:(id<ANTLRTree>)t Pattern:(NSString *)pattern Map:(ANTLRMap *)labels;
-- (BOOL) parse:(id<ANTLRTree>) t Pattern:(NSString *)pattern;
-- (BOOL) _parse:(id<ANTLRTree>)t1 Pattern:(ANTLRTreePattern *)tpattern Map:(ANTLRMap *)labels;
-- (id<ANTLRTree>) createTree:(NSString *)pattern;
-- (BOOL)equals:(id)t1 O2:(id)t2 Adaptor:(id<ANTLRTreeAdaptor>)anAdaptor;
-- (BOOL)equals:(id)t1 O2:(id)t2;
-- (BOOL) _equals:(id)t1 O2:(id)t2 Adaptor:(id<ANTLRTreeAdaptor>)anAdaptor;
-
-@end
-
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRUnbufferedCommonTreeNodeStreamState.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRUnbufferedCommonTreeNodeStreamState.h
deleted file mode 100755
index 9e79d86..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRUnbufferedCommonTreeNodeStreamState.h
+++ /dev/null
@@ -1,66 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRCommonTree.h"
-
-@interface ANTLRUnbufferedCommonTreeNodeStreamState : NSObject {
-	ANTLRCommonTree *currentNode;
-	ANTLRCommonTree *previousNode;
-
-	int currentChildIndex;
-	int absoluteNodeIndex;
-	unsigned int nodeStackSize;
-	unsigned int indexStackSize;
-	
-	NSMutableArray *lookahead;
-}
-
-- (ANTLRCommonTree *) currentNode;
-- (void) setCurrentNode: (ANTLRCommonTree *) aCurrentNode;
-
-- (ANTLRCommonTree *) previousNode;
-- (void) setPreviousNode: (ANTLRCommonTree *) aPreviousNode;
-
-- (NSInteger) currentChildIndex;
-- (void) setCurrentChildIndex: (NSInteger) aCurrentChildIndex;
-
-- (NSInteger) absoluteNodeIndex;
-- (void) setAbsoluteNodeIndex: (NSInteger) anAbsoluteNodeIndex;
-
-- (NSUInteger) nodeStackSize;
-- (void) setNodeStackSize: (NSUInteger) aNodeStackSize;
-
-- (NSUInteger) indexStackSize;
-- (void) setIndexStackSize: (NSUInteger) anIndexStackSize;
-
-- (NSMutableArray *) lookahead;
-- (void) setLookahead: (NSMutableArray *) aLookahead;
-
-- (void) addToLookahead: (id)lookaheadObject;
-- (void) removeFromLookahead: (id)lookaheadObject;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRUnbufferedTokenStream.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRUnbufferedTokenStream.h
deleted file mode 100644
index e4f8630..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRUnbufferedTokenStream.h
+++ /dev/null
@@ -1,62 +0,0 @@
-//
-//  ANTLRUnbufferedTokenStream.h
-//  ANTLR
-//
-//  Created by Alan Condit on 7/12/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRuntimeException.h"
-#import "ANTLRTokenSource.h"
-#import "ANTLRLookaheadStream.h"
-#import "ANTLRToken.h"
-
-@interface ANTLRUnbufferedTokenStream : ANTLRLookaheadStream {
-	id<ANTLRTokenSource> tokenSource;
-    NSInteger tokenIndex; // simple counter to set token index in tokens
-    NSInteger channel;
-}
-
-@property (retain, getter=getTokenSource, setter=setTokenSource:) id<ANTLRTokenSource> tokenSource;
-@property (getter=getTokenIndex, setter=setTokenIndex) NSInteger tokenIndex;
-@property (getter=getChannel, setter=setChannel:) NSInteger channel;
-
-+ (ANTLRUnbufferedTokenStream *)newANTLRUnbufferedTokenStream:(id<ANTLRTokenSource>)aTokenSource;
-- (id) init;
-- (id) initWithTokenSource:(id<ANTLRTokenSource>)aTokenSource;
-
-- (id<ANTLRToken>)nextElement;
-- (BOOL)isEOF:(id<ANTLRToken>) aToken;
-- (id<ANTLRTokenSource>)getTokenSource;
-- (NSString *)toStringFromStart:(NSInteger)aStart ToEnd:(NSInteger)aStop;
-- (NSString *)toStringFromToken:(id<ANTLRToken>)aStart ToEnd:(id<ANTLRToken>)aStop;
-- (NSInteger)LA:(NSInteger)anIdx;
-- (id<ANTLRToken>)objectAtIndex:(NSInteger)anIdx;
-- (NSString *)getSourceName;
-
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRUniqueIDMap.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRUniqueIDMap.h
deleted file mode 100644
index a805bd5..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRUniqueIDMap.h
+++ /dev/null
@@ -1,64 +0,0 @@
-//
-//  ANTLRUniqueIDMap.h
-//  ANTLR
-//
-//  Created by Alan Condit on 7/7/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRPtrBuffer.h"
-#import "ANTLRNodeMapElement.h"
-
-#define SUCCESS             0
-#define FAILURE             -1
-#define HASHSIZE            101
-#define HBUFSIZE            0x2000
-
-@interface ANTLRUniqueIDMap : ANTLRPtrBuffer {
-    NSInteger lastHash;
-}
-
-@property (getter=getLastHash, setter=setLastHash) NSInteger lastHash;
-
-+ (id)newANTLRUniqueIDMap;
-+ (id)newANTLRUniqueIDMapWithLen:(NSInteger)aHashSize;
-
-- (id)init;
-- (id)initWithLen:(NSInteger)cnt;
-- (void)dealloc;
-// Instance Methods
-- (NSInteger)count;
-- (NSInteger)size;
-/* clear -- reinitialize the maplist array */
-- (void) clear;
-
-- (void)deleteANTLRUniqueIDMap:(ANTLRNodeMapElement *)np;
-- (void)delete_chain:(ANTLRNodeMapElement *)np;
-- (id)getNode:(id<ANTLRTree>)aNode;
-- (void)putID:(id)anID Node:(id<ANTLRTree>)aNode;
-
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRUnwantedTokenException.h b/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRUnwantedTokenException.h
deleted file mode 100644
index 2945bfe..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Headers/ANTLRUnwantedTokenException.h
+++ /dev/null
@@ -1,47 +0,0 @@
-//
-//  ANTLRUnwantedTokenException.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/8/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRMismatchedTokenException.h"
-
-@interface ANTLRUnwantedTokenException : ANTLRMismatchedTokenException {
-
-}
-+ (ANTLRUnwantedTokenException *)newANTLRUnwantedTokenException;
-+ (ANTLRUnwantedTokenException *)newANTLRUnwantedTokenException:(NSInteger)expected Stream:(id<ANTLRIntStream>)anInput;
-
-- (id) init;
-- (id) initWithStream:(id<ANTLRIntStream>)anInput And:(NSInteger)expected;
-- (id<ANTLRToken>)getUnexpectedToken;
-- (NSString *)toString;
-                     
-    
-@end
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Resources/English.lproj/InfoPlist.strings b/runtime/ObjC/ANTLR.framework/Versions/Current/Resources/English.lproj/InfoPlist.strings
deleted file mode 100644
index fa1b75f..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Resources/English.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/ANTLR.framework/Versions/Current/Resources/Info.plist b/runtime/ObjC/ANTLR.framework/Versions/Current/Resources/Info.plist
deleted file mode 100644
index 24436a3..0000000
--- a/runtime/ObjC/ANTLR.framework/Versions/Current/Resources/Info.plist
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>CFBundleDevelopmentRegion</key>
-	<string>English</string>
-	<key>CFBundleExecutable</key>
-	<string>ANTLR</string>
-	<key>CFBundleIdentifier</key>
-	<string>org.antlr.antlrframework</string>
-	<key>CFBundleInfoDictionaryVersion</key>
-	<string>6.0</string>
-	<key>CFBundleName</key>
-	<string>ANTLR</string>
-	<key>CFBundlePackageType</key>
-	<string>FMWK</string>
-	<key>CFBundleSignature</key>
-	<string>????</string>
-	<key>CFBundleVersion</key>
-	<string>1.0</string>
-</dict>
-</plist>
diff --git a/runtime/ObjC/Framework/ACBTree.h b/runtime/ObjC/Framework/ACBTree.h
index ba19527..3783cc9 100644
--- a/runtime/ObjC/Framework/ACBTree.h
+++ b/runtime/ObjC/Framework/ACBTree.h
@@ -18,7 +18,13 @@
 #define BTNODESIZE 11
 #define BTHNODESIZE ((BTNODESIZE-1)/2)
 #define BTKeySize  38
+#if defined FAILURE
+#undef FAILURE
+#endif
 #define FAILURE -1
+#if defined SUCCESS
+#undef SUCCESS
+#endif
 #define SUCCESS 0
 
 @interface ACBKey : NSObject {
@@ -34,7 +40,8 @@
 + (ACBKey *)newKeyWithKStr:(NSString *)aKey;
 - (id) init;
 - (id) initWithKStr:(NSString *)aKey;
-
+- (void)dealloc;
+- (NSString *) description;
 @end
 
 @interface ACBTree : NSObject {
@@ -74,6 +81,7 @@
 + (ACBTree *) newNodeWithDictionary:(AMutableDictionary *)theDict;
 
 - (id)initWithDictionary:(AMutableDictionary *)theDict;
+- (void)dealloc;
 
 - (ACBTree *)createnode:(ACBKey *)kp0;
 - (ACBTree *)deletekey:(NSString *)dkey;
@@ -93,5 +101,5 @@
 - (void)rotateright:(NSInteger)j;
 - (NSInteger) keyWalkLeaves;
 - (NSInteger) objectWalkLeaves;
-- (void)dealloc;
+- (NSString *) description;
 @end
diff --git a/runtime/ObjC/Framework/ACBTree.m b/runtime/ObjC/Framework/ACBTree.m
index 99c0cda..fd7f1b7 100644
--- a/runtime/ObjC/Framework/ACBTree.m
+++ b/runtime/ObjC/Framework/ACBTree.m
@@ -6,10 +6,10 @@
 //  Copyright 2011 Alan Condit. All rights reserved.
 //
 
-#import <Cocoa/Cocoa.h>
+#import <Foundation/Foundation.h>
 #import "ACBTree.h"
 #import "AMutableDictionary.h"
-#import "ANTLRRuntimeException.h"
+#import "RuntimeException.h"
 
 @class AMutableDictionary;
 
@@ -56,6 +56,19 @@
     return self;
 }
 
+- (void)dealloc
+{
+#ifdef DEBUG_DEALLOC
+    NSLog( @"called dealloc in ACBKey" );
+#endif
+    [super dealloc];
+}
+
+- (NSString *) description
+{
+    return [NSString stringWithFormat:@"len =%02d\nrecnum=%04d\nkey=%@\n", [key length], recnum, key];
+}
+
 @end
 
 @implementation ACBTree
@@ -97,6 +110,14 @@
     return self;
 }
 
+- (void)dealloc
+{
+#ifdef DEBUG_DEALLOC
+    NSLog( @"called dealloc in ACBTree" );
+#endif
+    [super dealloc];
+}
+
 - (ACBTree *)createnode:(ACBKey *)kp
 {
     ACBTree *tmp;
@@ -129,7 +150,7 @@
     else if ( [dkey isKindOfClass:[ACBKey class]] )
         dkp = (ACBKey *)dkey;
     else
-        @throw [ANTLRIllegalArgumentException newException:[NSString stringWithFormat:@"Don't understand this key:\"%@\"", dkey]];
+        @throw [IllegalArgumentException newException:[NSString stringWithFormat:@"Don't understand this key:\"%@\"", dkey]];
     sNode = [self search:dkp.key];
     if ( sNode == nil || [sNode searchnode:dkp.key match:YES] == FAILURE ) {
         if ( mustRelease ) [dkp release];
@@ -710,12 +731,17 @@
     return( idx );
 }
 
-- (void)dealloc
+- (NSString *) description
 {
-#ifdef DEBUG_DEALLOC
-    NSLog( @"called dealloc in ACBTree" );
-#endif
-    [super dealloc];
+    NSMutableString *str = [NSMutableString stringWithCapacity:16];
+    NSInteger i;
+    for (i = 0; i < numkeys; i++ ) {
+        [str appendString:[NSString stringWithFormat:@"key[%d]=%@", i, [keys[i] description]]];
+    }
+    for (i = 0; i < numkeys; i++ ) {
+        [str appendString:[NSString stringWithFormat:@"btnodes[%d]=%@\n", i, [btNodes[i] description]]];
+    }
+    return str;
 }
 
 @end
diff --git a/runtime/ObjC/Framework/ACNumber.h b/runtime/ObjC/Framework/ACNumber.h
new file mode 100644
index 0000000..7861b88
--- /dev/null
+++ b/runtime/ObjC/Framework/ACNumber.h
@@ -0,0 +1,47 @@
+//
+//  ACNumber.h
+//  ST4
+//
+//  Created by Alan Condit on 3/19/12.
+//  Copyright 2012 Alan Condit. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+
+@interface ACNumber : NSObject {
+    
+    union {
+        BOOL b;
+        char c;
+        double d;
+        NSInteger i;
+    } u;
+    
+    BOOL fBOOL   :  1;
+    BOOL fChar   :  1;
+    BOOL fDouble :  1;
+    BOOL fNSInt  :  1;
+}
+
++ (ACNumber *)numberWithBool:(BOOL)aBool;
++ (ACNumber *)numberWithChar:(char)aChar;
++ (ACNumber *)numberWithDouble:(double)aDouble;
++ (ACNumber *)numberWithInt:(NSInteger)anInt;
++ (ACNumber *)numberWithInteger:(NSInteger)anInt;
+
+- (ACNumber *)initWithBool:(BOOL)aBool;
+- (ACNumber *)initWithChar:(char)aChar;
+- (ACNumber *)initWithDouble:(double)aDouble;
+- (ACNumber *)initWithInteger:(NSInteger)anInt;
+
+- (BOOL)boolValue;
+- (char)charValue;
+- (double)doubleValue;
+- (NSInteger)intValue;
+- (NSInteger)integerValue;
+- (NSInteger)inc;
+- (NSInteger)add:(NSInteger)anInt;
+- (NSString *)description;
+
+@end
diff --git a/runtime/ObjC/Framework/ACNumber.m b/runtime/ObjC/Framework/ACNumber.m
new file mode 100644
index 0000000..989f81a
--- /dev/null
+++ b/runtime/ObjC/Framework/ACNumber.m
@@ -0,0 +1,170 @@
+//
+//  ACNumber.m
+//  ST4
+//
+//  Created by Alan Condit on 3/19/12.
+//  Copyright 2012 Alan Condit. All rights reserved.
+//
+
+#import "ACNumber.h"
+
+
+@implementation ACNumber
+
++ (ACNumber *)numberWithBool:(BOOL)aBool
+{
+    return [[ACNumber alloc] initWithBool:aBool];
+}
+
++ (ACNumber *)numberWithChar:(char)aChar
+{
+    return [[ACNumber alloc] initWithChar:aChar];
+}
+
++ (ACNumber *)numberWithDouble:(double)aDouble
+{
+    return [[ACNumber alloc] initWithDouble:aDouble];
+}
+
++ (ACNumber *)numberWithInt:(NSInteger)anInt
+{
+    return [[ACNumber alloc] initWithInteger:anInt];
+}
+
++ (ACNumber *)numberWithInteger:(NSInteger)anInt
+{
+    return [[ACNumber alloc] initWithInteger:anInt];
+}
+
+
+- (id)init
+{
+    self = [super init];
+    if (self) {
+        // Initialization code here.
+    }
+    
+    return self;
+}
+
+- (ACNumber *)initWithBool:(BOOL)aBool
+{
+    self = [super init];
+    if ( self != nil ) {
+        fBOOL = YES;
+        fChar = NO;
+        fDouble = NO;
+        fNSInt = NO;
+        u.b = aBool;
+    }
+    return self;
+}
+
+- (ACNumber *)initWithChar:(char)aChar
+{
+    self = [super init];
+    if ( self != nil ) {
+        fBOOL = NO;
+        fChar = YES;
+        fDouble = NO;
+        fNSInt = NO;
+        u.c = aChar;
+    }
+    return self;
+}
+
+- (ACNumber *)initWithDouble:(double)aDouble
+{
+    self = [super init];
+    if ( self != nil ) {
+        fBOOL = NO;
+        fChar = NO;
+        fDouble = YES;
+        fNSInt = NO;
+        u.d = aDouble;
+    }
+    return self;
+}
+
+- (ACNumber *)initWithInteger:(NSInteger)anInt
+{
+    self = [super init];
+    if ( self != nil ) {
+        fBOOL = NO;
+        fChar = NO;
+        fDouble = NO;
+        fNSInt = YES;
+        u.i = anInt;
+    }
+    return self;
+}
+
+- (void)dealloc
+{
+    [super dealloc];
+}
+
+- (BOOL)boolValue
+{
+    if (fBOOL)
+        return u.b;
+    else
+        return NO;
+}
+
+- (char)charValue
+{
+    if (fChar)
+        return u.c;
+    else
+        return (char)-1;
+}
+
+- (double)doubleValue
+{
+    if (fDouble)
+        return u.d;
+    else
+        return 0.0;
+}
+
+- (NSInteger)intValue
+{
+    if (fNSInt)
+        return u.i;
+    else
+        return -1;
+}
+
+- (NSInteger)integerValue
+{
+    if (fNSInt)
+        return u.i;
+    else
+        return -1;
+}
+
+- (NSInteger)inc
+{
+    return (u.i+=1);
+}
+
+- (NSInteger)add:(NSInteger)anInt
+{
+    return (u.i+=anInt);
+}
+
+- (NSString *)description
+{
+    if (fBOOL)
+        return (u.b == YES) ? @"true" : @"false"; 
+    else if (fChar)
+        return [NSString stringWithFormat:@"%c", u.c];
+    else if (fNSInt)
+        return [NSString stringWithFormat:@"%Ld", u.i];
+    else if (fDouble)
+        return [NSString stringWithFormat:@"%Lf", u.d];
+    return @"ACNumber not valid";
+}
+
+@end
diff --git a/runtime/ObjC/Framework/AMutableArray.h b/runtime/ObjC/Framework/AMutableArray.h
index 28d0797..45197b6 100644
--- a/runtime/ObjC/Framework/AMutableArray.h
+++ b/runtime/ObjC/Framework/AMutableArray.h
@@ -6,7 +6,7 @@
 //  Copyright 2011 Alan's MachineWorks. All rights reserved.
 //
 
-#import <Cocoa/Cocoa.h>
+#import <Foundation/Foundation.h>
 #import "ArrayIterator.h"
 
 @class ArrayIterator;
diff --git a/runtime/ObjC/Framework/AMutableArray.m b/runtime/ObjC/Framework/AMutableArray.m
index e6d1eb8..640ed37 100644
--- a/runtime/ObjC/Framework/AMutableArray.m
+++ b/runtime/ObjC/Framework/AMutableArray.m
@@ -91,10 +91,12 @@
 - (void) addObjectsFromArray:(NSArray *)otherArray
 {
     NSInteger cnt, i;
+    id tmp;
     cnt = [otherArray count];
     [self ensureCapacity:count+cnt];
     for( i = 0; i < cnt; i++) {
-        [self addObject:[otherArray objectAtIndex:i]];
+        tmp = [otherArray objectAtIndex:i];
+        [self addObject:tmp];
     }
     return;
 }
@@ -264,11 +266,13 @@
 {
     NSMutableString *str;
     NSInteger idx, cnt;
+    id tmp;
     cnt = [self count];
     str = [NSMutableString stringWithCapacity:30];
     [str appendString:@"["];
     for (idx = 0; idx < cnt; idx++ ) {
-        [str appendString:[[self objectAtIndex:idx] toString]];
+        tmp = [self objectAtIndex:idx];
+        [str appendString:((tmp == nil) ? @"nil" : [tmp description])];
     }
     [str appendString:@"]"];
     return str;
diff --git a/runtime/ObjC/Framework/AMutableDictionary.m b/runtime/ObjC/Framework/AMutableDictionary.m
index 88b85a8..0243d51 100644
--- a/runtime/ObjC/Framework/AMutableDictionary.m
+++ b/runtime/ObjC/Framework/AMutableDictionary.m
@@ -6,7 +6,7 @@
 //  Copyright 2011 Alan Condit. All rights reserved.
 //
 
-#import <Cocoa/Cocoa.h>
+#import <Foundation/Foundation.h>
 #import "AMutableDictionary.h"
 #import "ACBTree.h"
 
@@ -241,9 +241,15 @@
 
 - (void) removeAllObjects
 {
-    root = [ACBTree newNodeWithDictionary:self];
-    root.nodeid = 0;
-    nxt_nodeid = 1;
+    if ( [self count] > 0 ) {
+        // root = [ACBTree newNodeWithDictionary:self];
+        NSArray *list = [self allKeys];
+        for ( NSInteger i = [self count] - 1; i >= 0; i-- ) {
+            [self removeObjectForKey:[list objectAtIndex:i]];
+        }
+        root.nodeid = 0;
+        nxt_nodeid = 1;
+    }
 }
 
 - (NSInteger) nextNodeId
diff --git a/runtime/ObjC/Framework/ANTLR.h b/runtime/ObjC/Framework/ANTLR.h
index 3c81fc2..048cdd6 100644
--- a/runtime/ObjC/Framework/ANTLR.h
+++ b/runtime/ObjC/Framework/ANTLR.h
@@ -24,91 +24,95 @@
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 // THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+#import <ANTLR/ACNumber.h>
 #import <ANTLR/ACBTree.h>
 #import <ANTLR/AMutableArray.h>
 #import <ANTLR/AMutableDictionary.h>
-#import <ANTLR/ANTLRBaseMapElement.h>
-#import <ANTLR/ANTLRBaseRecognizer.h>
-#import <ANTLR/ANTLRBaseStack.h>
-#import <ANTLR/ANTLRBaseTree.h>
-#import <ANTLR/ANTLRBaseTreeAdaptor.h>
 #import <ANTLR/ANTLRBitSet.h>
-#import <ANTLR/ANTLRBufferedTokenStream.h>
-#import <ANTLR/ANTLRBufferedTreeNodeStream.h>
-#import <ANTLR/ANTLRCharStream.h>
-#import <ANTLR/ANTLRCharStreamState.h>
-#import <ANTLR/ANTLRCommonErrorNode.h>
-#import <ANTLR/ANTLRCommonToken.h>
-#import <ANTLR/ANTLRCommonTokenStream.h>
-#import <ANTLR/ANTLRCommonTree.h>
-#import <ANTLR/ANTLRCommonTreeAdaptor.h>
-#import <ANTLR/ANTLRCommonTreeNodeStream.h>
-#import <ANTLR/ANTLRDFA.h>
-#import <ANTLR/ANTLRDebug.h>
-#import <ANTLR/ANTLRDebugEventProxy.h>
-#import <ANTLR/ANTLRDebugEventListener.h>
-#import <ANTLR/ANTLRDebugParser.h>
-#import <ANTLR/ANTLRDebugTokenStream.h>
-#import <ANTLR/ANTLRDebugTreeAdaptor.h>
-#import <ANTLR/ANTLRDebugTreeNodeStream.h>
-#import <ANTLR/ANTLRDebugTreeParser.h>
-#import <ANTLR/ANTLRDoubleKeyMap.h>
-#import <ANTLR/ANTLREarlyExitException.h>
 #import <ANTLR/ANTLRError.h>
-#import <ANTLR/ANTLRFailedPredicateException.h>
-#import <ANTLR/ANTLRFastQueue.h>
 #import <ANTLR/ANTLRFileStream.h>
-#import <ANTLR/ANTLRHashMap.h>
-#import <ANTLR/ANTLRHashRule.h>
 #import <ANTLR/ANTLRInputStream.h>
-#import <ANTLR/ANTLRIntArray.h>
-#import <ANTLR/ANTLRIntStream.h>
-#import <ANTLR/ANTLRLexer.h>
-#import <ANTLR/ANTLRLexerRuleReturnScope.h>
-#import <ANTLR/ANTLRLinkBase.h>
-#import <ANTLR/ANTLRLookaheadStream.h>
-#import <ANTLR/ANTLRMapElement.h>
-#import <ANTLR/ANTLRMap.h>
-#import <ANTLR/ANTLRMismatchedNotSetException.h>
-#import <ANTLR/ANTLRMismatchedRangeException.h>
-#import <ANTLR/ANTLRMismatchedSetException.h>
-#import <ANTLR/ANTLRMismatchedTokenException.h>
-#import <ANTLR/ANTLRMismatchedTreeNodeException.h>
-#import <ANTLR/ANTLRMissingTokenException.h>
-#import <ANTLR/ANTLRNodeMapElement.h>
-#import <ANTLR/ANTLRNoViableAltException.h>
-#import <ANTLR/ANTLRParser.h>
-#import <ANTLR/ANTLRParserRuleReturnScope.h>
-#import <ANTLR/ANTLRPtrBuffer.h>
 #import <ANTLR/ANTLRReaderStream.h>
-#import <ANTLR/ANTLRRecognitionException.h>
-#import <ANTLR/ANTLRRecognizerSharedState.h>
-#import <ANTLR/ANTLRRewriteRuleElementStream.h>
-#import <ANTLR/ANTLRRewriteRuleNodeStream.h>
-#import <ANTLR/ANTLRRewriteRuleSubtreeStream.h>
-#import <ANTLR/ANTLRRewriteRuleTokenStream.h>
-#import <ANTLR/ANTLRRuleMemo.h>
-#import <ANTLR/ANTLRRuleStack.h>
-#import <ANTLR/ANTLRRuleReturnScope.h>
-#import <ANTLR/ANTLRRuntimeException.h>
-#import <ANTLR/ANTLRStreamEnumerator.h>
 #import <ANTLR/ANTLRStringStream.h>
-#import <ANTLR/ANTLRSymbolStack.h>
-#import <ANTLR/ANTLRToken+DebuggerSupport.h>
-#import <ANTLR/ANTLRToken.h>
-#import <ANTLR/ANTLRTokenRewriteStream.h>
-#import <ANTLR/ANTLRTokenSource.h>
-#import <ANTLR/ANTLRTokenStream.h>
-#import <ANTLR/ANTLRTree.h>
-#import <ANTLR/ANTLRTreeAdaptor.h>
-#import <ANTLR/ANTLRTreeException.h>
-#import <ANTLR/ANTLRTreeIterator.h>
-#import <ANTLR/ANTLRTreeNodeStream.h>
-#import <ANTLR/ANTLRTreeParser.h>
-#import <ANTLR/ANTLRTreeRuleReturnScope.h>
-#import <ANTLR/ANTLRUnbufferedTokenStream.h>
-//#import <ANTLR/ANTLRUnbufferedCommonTreeNodeStream.h>
-//#import <ANTLR/ANTLRUnbufferedCommonTreeNodeStreamState.h>
-#import <ANTLR/ANTLRUniqueIDMap.h>
-#import <ANTLR/ANTLRUnwantedTokenException.h>
 #import <ANTLR/ArrayIterator.h>
+#import <ANTLR/BaseMapElement.h>
+#import <ANTLR/BaseRecognizer.h>
+#import <ANTLR/BaseStack.h>
+#import <ANTLR/BaseTree.h>
+#import <ANTLR/BaseTreeAdaptor.h>
+#import <ANTLR/BufferedTokenStream.h>
+#import <ANTLR/BufferedTreeNodeStream.h>
+#import <ANTLR/CharStream.h>
+#import <ANTLR/CharStreamState.h>
+#import <ANTLR/CommonErrorNode.h>
+#import <ANTLR/CommonToken.h>
+#import <ANTLR/CommonTokenStream.h>
+#import <ANTLR/CommonTree.h>
+#import <ANTLR/CommonTreeAdaptor.h>
+#import <ANTLR/CommonTreeNodeStream.h>
+#import <ANTLR/DFA.h>
+#import <ANTLR/Debug.h>
+#import <ANTLR/DebugEventSocketProxy.h>
+#import <ANTLR/DebugEventListener.h>
+#import <ANTLR/DebugParser.h>
+#import <ANTLR/DebugTokenStream.h>
+#import <ANTLR/DebugTreeAdaptor.h>
+#import <ANTLR/DebugTreeNodeStream.h>
+#import <ANTLR/DebugTreeParser.h>
+#import <ANTLR/DoubleKeyMap.h>
+#import <ANTLR/EarlyExitException.h>
+#import <ANTLR/Entry.h>
+#import <ANTLR/FailedPredicateException.h>
+#import <ANTLR/FastQueue.h>
+#import <ANTLR/HashMap.h>
+#import <ANTLR/HashRule.h>
+#import <ANTLR/IntArray.h>
+#import <ANTLR/IntStream.h>
+#import <ANTLR/Lexer.h>
+#import <ANTLR/LexerRuleReturnScope.h>
+#import <ANTLR/LinkBase.h>
+#import <ANTLR/LinkedHashMap.h>
+#import <ANTLR/LinkedList.h>
+#import <ANTLR/LookaheadStream.h>
+#import <ANTLR/MapElement.h>
+#import <ANTLR/Map.h>
+#import <ANTLR/MismatchedNotSetException.h>
+#import <ANTLR/MismatchedRangeException.h>
+#import <ANTLR/MismatchedSetException.h>
+#import <ANTLR/MismatchedTokenException.h>
+#import <ANTLR/MismatchedTreeNodeException.h>
+#import <ANTLR/MissingTokenException.h>
+#import <ANTLR/NodeMapElement.h>
+#import <ANTLR/NoViableAltException.h>
+#import <ANTLR/Parser.h>
+#import <ANTLR/ParserRuleReturnScope.h>
+#import <ANTLR/PtrBuffer.h>
+#import <ANTLR/RecognitionException.h>
+#import <ANTLR/RecognizerSharedState.h>
+#import <ANTLR/RewriteRuleElementStream.h>
+#import <ANTLR/RewriteRuleNodeStream.h>
+#import <ANTLR/RewriteRuleSubtreeStream.h>
+#import <ANTLR/RewriteRuleTokenStream.h>
+#import <ANTLR/RuleMemo.h>
+#import <ANTLR/RuleStack.h>
+#import <ANTLR/RuleReturnScope.h>
+#import <ANTLR/RuntimeException.h>
+#import <ANTLR/StreamEnumerator.h>
+#import <ANTLR/SymbolStack.h>
+#import <ANTLR/Token+DebuggerSupport.h>
+#import <ANTLR/Token.h>
+#import <ANTLR/TokenRewriteStream.h>
+#import <ANTLR/TokenSource.h>
+#import <ANTLR/TokenStream.h>
+#import <ANTLR/Tree.h>
+#import <ANTLR/TreeAdaptor.h>
+#import <ANTLR/TreeException.h>
+#import <ANTLR/TreeIterator.h>
+#import <ANTLR/TreeNodeStream.h>
+#import <ANTLR/TreeParser.h>
+#import <ANTLR/TreeRuleReturnScope.h>
+#import <ANTLR/UnbufferedTokenStream.h>
+//#import <ANTLR/UnbufferedCommonTreeNodeStream.h>
+//#import <ANTLR/UnbufferedCommonTreeNodeStreamState.h>
+#import <ANTLR/UniqueIDMap.h>
+#import <ANTLR/UnwantedTokenException.h>
diff --git a/runtime/ObjC/Framework/ANTLR.xcodeproj/project.pbxproj b/runtime/ObjC/Framework/ANTLR.xcodeproj/project.pbxproj
index 575fd9a..3f837da 100644
--- a/runtime/ObjC/Framework/ANTLR.xcodeproj/project.pbxproj
+++ b/runtime/ObjC/Framework/ANTLR.xcodeproj/project.pbxproj
@@ -40,14 +40,14 @@
 		1A0F348612EA444500496BB8 /* Simplifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A0F347E12EA444500496BB8 /* Simplifier.h */; };
 		1A0F348912EA444500496BB8 /* PolyLexer.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A0F347B12EA444500496BB8 /* PolyLexer.m */; };
 		1A0F348A12EA444500496BB8 /* PolyParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A0F347D12EA444500496BB8 /* PolyParser.m */; };
-		1A10050611B8796D0022B434 /* ANTLRBufferedTokenStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A18EF5511B8028D0006186A /* ANTLRBufferedTokenStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1A10050611B8796D0022B434 /* BufferedTokenStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A18EF5511B8028D0006186A /* BufferedTokenStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		1A10050711B8796E0022B434 /* ANTLRBitSet.h in Headers */ = {isa = PBXBuildFile; fileRef = F7F218EE097AFB1A000472E9 /* ANTLRBitSet.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A10050811B879A40022B434 /* ANTLRFastQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A1CCC9011B6FD39002E5F53 /* ANTLRFastQueue.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A10050911B879A80022B434 /* ANTLRFailedPredicateException.h in Headers */ = {isa = PBXBuildFile; fileRef = F738D1730B07AEAA001813C4 /* ANTLRFailedPredicateException.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A10050B11B879B80022B434 /* ANTLRIntArray.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A1CCC9211B6FD39002E5F53 /* ANTLRIntArray.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A100ABB11E604FE006ABF94 /* ANTLRHashRule.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A100AB911E604FE006ABF94 /* ANTLRHashRule.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A100ABC11E604FE006ABF94 /* ANTLRHashRule.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A100ABA11E604FE006ABF94 /* ANTLRHashRule.m */; };
-		1A12110311D3A62B00F27B38 /* ANTLRCommonTokenTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A348B2311D2BE4F000C72FC /* ANTLRCommonTokenTest.m */; };
+		1A10050811B879A40022B434 /* FastQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A1CCC9011B6FD39002E5F53 /* FastQueue.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1A10050911B879A80022B434 /* FailedPredicateException.h in Headers */ = {isa = PBXBuildFile; fileRef = F738D1730B07AEAA001813C4 /* FailedPredicateException.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1A10050B11B879B80022B434 /* IntArray.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A1CCC9211B6FD39002E5F53 /* IntArray.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1A100ABB11E604FE006ABF94 /* HashRule.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A100AB911E604FE006ABF94 /* HashRule.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1A100ABC11E604FE006ABF94 /* HashRule.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A100ABA11E604FE006ABF94 /* HashRule.m */; };
+		1A12110311D3A62B00F27B38 /* CommonTokenTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A348B2311D2BE4F000C72FC /* CommonTokenTest.m */; };
 		1A12117911D3B45C00F27B38 /* ANTLR.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* ANTLR.framework */; };
 		1A12117A11D3B47000F27B38 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A348BB511D2C711000C72FC /* Cocoa.framework */; };
 		1A12117B11D3B47000F27B38 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A348BB711D2C711000C72FC /* CoreFoundation.framework */; };
@@ -58,76 +58,76 @@
 		1A12122B11D3C93500F27B38 /* ANTLR.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A12122A11D3C93500F27B38 /* ANTLR.framework */; };
 		1A12122C11D3C93500F27B38 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A348BB511D2C711000C72FC /* Cocoa.framework */; };
 		1A12122D11D3C93500F27B38 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A348BB711D2C711000C72FC /* CoreFoundation.framework */; };
-		1A12126211D3CA0100F27B38 /* ANTLRFastQueueTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A348B1811D2BE4F000C72FC /* ANTLRFastQueueTest.m */; };
+		1A12126211D3CA0100F27B38 /* FastQueueTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A348B1811D2BE4F000C72FC /* FastQueueTest.m */; };
 		1A1212E211D3F55500F27B38 /* ANTLR.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* ANTLR.framework */; };
 		1A1212E311D3F55500F27B38 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A348BB511D2C711000C72FC /* Cocoa.framework */; };
 		1A1212E411D3F55500F27B38 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A348BB711D2C711000C72FC /* CoreFoundation.framework */; };
-		1A1212E711D3F59300F27B38 /* ANTLRIntArrayTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A348B1A11D2BE4F000C72FC /* ANTLRIntArrayTest.m */; };
+		1A1212E711D3F59300F27B38 /* IntArrayTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A348B1A11D2BE4F000C72FC /* IntArrayTest.m */; };
 		1A12131211D3F7DC00F27B38 /* ANTLR.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* ANTLR.framework */; };
 		1A12131311D3F7DC00F27B38 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A348BB511D2C711000C72FC /* Cocoa.framework */; };
 		1A12131411D3F7DC00F27B38 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A348BB711D2C711000C72FC /* CoreFoundation.framework */; };
-		1A12131711D3F80500F27B38 /* ANTLRCommonTreeTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A348B2611D2BE4F000C72FC /* ANTLRCommonTreeTest.m */; };
+		1A12131711D3F80500F27B38 /* CommonTreeTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A348B2611D2BE4F000C72FC /* CommonTreeTest.m */; };
 		1A12C95911B89F62008C9BED /* ANTLRBitSet.m in Sources */ = {isa = PBXBuildFile; fileRef = F7F218EF097AFB1A000472E9 /* ANTLRBitSet.m */; };
-		1A12C95A11B89F64008C9BED /* ANTLRBufferedTokenStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A18EF5611B8028D0006186A /* ANTLRBufferedTokenStream.m */; };
-		1A12C95B11B89F65008C9BED /* ANTLRCommonToken.m in Sources */ = {isa = PBXBuildFile; fileRef = F777660409DC5CF400517181 /* ANTLRCommonToken.m */; };
-		1A12C95C11B89F67008C9BED /* ANTLRCommonTokenStream.m in Sources */ = {isa = PBXBuildFile; fileRef = F700ED950A5FF2A5005D0757 /* ANTLRCommonTokenStream.m */; };
-		1A12C95D11B89F68008C9BED /* ANTLRCommonTree.m in Sources */ = {isa = PBXBuildFile; fileRef = F72C58E90AB3911D00282574 /* ANTLRCommonTree.m */; };
-		1A12C95E11B89F69008C9BED /* ANTLRCommonTreeAdaptor.m in Sources */ = {isa = PBXBuildFile; fileRef = F72C59A60AB4F20A00282574 /* ANTLRCommonTreeAdaptor.m */; };
-		1A12C95F11B89F6A008C9BED /* ANTLRCommonTreeNodeStream.m in Sources */ = {isa = PBXBuildFile; fileRef = F76AA98F0CEA515A00AF044C /* ANTLRCommonTreeNodeStream.m */; };
-		1A12C96011B89F6B008C9BED /* ANTLRDebugEventListener.h in Headers */ = {isa = PBXBuildFile; fileRef = F7CECD7D0B1E5C370054CC3B /* ANTLRDebugEventListener.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A12C96111B89F6F008C9BED /* ANTLRLexer.m in Sources */ = {isa = PBXBuildFile; fileRef = F7A4099209659BFB002CC781 /* ANTLRLexer.m */; };
-		1A12C96211B89F70008C9BED /* ANTLRLexerRuleReturnScope.m in Sources */ = {isa = PBXBuildFile; fileRef = F7009ADA0A1BE4AE002EDD5D /* ANTLRLexerRuleReturnScope.m */; };
-		1A12C96311B89F76008C9BED /* ANTLRLookaheadStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A1CCCAA11B724B2002E5F53 /* ANTLRLookaheadStream.m */; };
-		1A12C96411B89F76008C9BED /* ANTLRMismatchedRangeException.m in Sources */ = {isa = PBXBuildFile; fileRef = F7037CEF0A0582FC0070435D /* ANTLRMismatchedRangeException.m */; };
-		1A12C96511B89F77008C9BED /* ANTLRMismatchedSetException.m in Sources */ = {isa = PBXBuildFile; fileRef = F70380BB0A07FA0D0070435D /* ANTLRMismatchedSetException.m */; };
-		1A12C96611B89F78008C9BED /* ANTLRMismatchedTokenException.m in Sources */ = {isa = PBXBuildFile; fileRef = F777668109DC719C00517181 /* ANTLRMismatchedTokenException.m */; };
-		1A12C96711B89F7A008C9BED /* ANTLRMismatchedTreeNodeException.m in Sources */ = {isa = PBXBuildFile; fileRef = F72C5D610AB63E0B00282574 /* ANTLRMismatchedTreeNodeException.m */; };
-		1A12C96811B89F7B008C9BED /* ANTLRNoViableAltException.m in Sources */ = {isa = PBXBuildFile; fileRef = F79D598A0A0E51AB00EA3CEE /* ANTLRNoViableAltException.m */; };
-		1A12C96911B89F7E008C9BED /* ANTLRParser.m in Sources */ = {isa = PBXBuildFile; fileRef = F700E8FA0A5FAD21005D0757 /* ANTLRParser.m */; };
-		1A12C96A11B89F7F008C9BED /* ANTLRParserRuleReturnScope.m in Sources */ = {isa = PBXBuildFile; fileRef = F72C5ECD0AB7E5A500282574 /* ANTLRParserRuleReturnScope.m */; };
-		1A12C96B11B89F80008C9BED /* ANTLRRecognitionException.m in Sources */ = {isa = PBXBuildFile; fileRef = F777669209DC72D600517181 /* ANTLRRecognitionException.m */; };
-		1A12C96C11B89F82008C9BED /* ANTLRRecognizerSharedState.m in Sources */ = {isa = PBXBuildFile; fileRef = F7B1E5AD0CD7CF1900CE136E /* ANTLRRecognizerSharedState.m */; };
-		1A12C96D11B89F83008C9BED /* ANTLRRewriteRuleElementStream.m in Sources */ = {isa = PBXBuildFile; fileRef = F71325870C4A060900B99F2D /* ANTLRRewriteRuleElementStream.m */; };
-		1A12C96E11B89F84008C9BED /* ANTLRRewriteRuleSubtreeStream.m in Sources */ = {isa = PBXBuildFile; fileRef = F70B11BC0C4C2B6400C3ECE0 /* ANTLRRewriteRuleSubtreeStream.m */; };
-		1A12C96F11B89F85008C9BED /* ANTLRRewriteRuleTokenStream.m in Sources */ = {isa = PBXBuildFile; fileRef = F70B11C20C4C2B7900C3ECE0 /* ANTLRRewriteRuleTokenStream.m */; };
+		1A12C95A11B89F64008C9BED /* BufferedTokenStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A18EF5611B8028D0006186A /* BufferedTokenStream.m */; };
+		1A12C95B11B89F65008C9BED /* CommonToken.m in Sources */ = {isa = PBXBuildFile; fileRef = F777660409DC5CF400517181 /* CommonToken.m */; };
+		1A12C95C11B89F67008C9BED /* CommonTokenStream.m in Sources */ = {isa = PBXBuildFile; fileRef = F700ED950A5FF2A5005D0757 /* CommonTokenStream.m */; };
+		1A12C95D11B89F68008C9BED /* CommonTree.m in Sources */ = {isa = PBXBuildFile; fileRef = F72C58E90AB3911D00282574 /* CommonTree.m */; };
+		1A12C95E11B89F69008C9BED /* CommonTreeAdaptor.m in Sources */ = {isa = PBXBuildFile; fileRef = F72C59A60AB4F20A00282574 /* CommonTreeAdaptor.m */; };
+		1A12C95F11B89F6A008C9BED /* CommonTreeNodeStream.m in Sources */ = {isa = PBXBuildFile; fileRef = F76AA98F0CEA515A00AF044C /* CommonTreeNodeStream.m */; };
+		1A12C96011B89F6B008C9BED /* DebugEventListener.h in Headers */ = {isa = PBXBuildFile; fileRef = F7CECD7D0B1E5C370054CC3B /* DebugEventListener.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1A12C96111B89F6F008C9BED /* Lexer.m in Sources */ = {isa = PBXBuildFile; fileRef = F7A4099209659BFB002CC781 /* Lexer.m */; };
+		1A12C96211B89F70008C9BED /* LexerRuleReturnScope.m in Sources */ = {isa = PBXBuildFile; fileRef = F7009ADA0A1BE4AE002EDD5D /* LexerRuleReturnScope.m */; };
+		1A12C96311B89F76008C9BED /* LookaheadStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A1CCCAA11B724B2002E5F53 /* LookaheadStream.m */; };
+		1A12C96411B89F76008C9BED /* MismatchedRangeException.m in Sources */ = {isa = PBXBuildFile; fileRef = F7037CEF0A0582FC0070435D /* MismatchedRangeException.m */; };
+		1A12C96511B89F77008C9BED /* MismatchedSetException.m in Sources */ = {isa = PBXBuildFile; fileRef = F70380BB0A07FA0D0070435D /* MismatchedSetException.m */; };
+		1A12C96611B89F78008C9BED /* MismatchedTokenException.m in Sources */ = {isa = PBXBuildFile; fileRef = F777668109DC719C00517181 /* MismatchedTokenException.m */; };
+		1A12C96711B89F7A008C9BED /* MismatchedTreeNodeException.m in Sources */ = {isa = PBXBuildFile; fileRef = F72C5D610AB63E0B00282574 /* MismatchedTreeNodeException.m */; };
+		1A12C96811B89F7B008C9BED /* NoViableAltException.m in Sources */ = {isa = PBXBuildFile; fileRef = F79D598A0A0E51AB00EA3CEE /* NoViableAltException.m */; };
+		1A12C96911B89F7E008C9BED /* Parser.m in Sources */ = {isa = PBXBuildFile; fileRef = F700E8FA0A5FAD21005D0757 /* Parser.m */; };
+		1A12C96A11B89F7F008C9BED /* ParserRuleReturnScope.m in Sources */ = {isa = PBXBuildFile; fileRef = F72C5ECD0AB7E5A500282574 /* ParserRuleReturnScope.m */; };
+		1A12C96B11B89F80008C9BED /* RecognitionException.m in Sources */ = {isa = PBXBuildFile; fileRef = F777669209DC72D600517181 /* RecognitionException.m */; };
+		1A12C96C11B89F82008C9BED /* RecognizerSharedState.m in Sources */ = {isa = PBXBuildFile; fileRef = F7B1E5AD0CD7CF1900CE136E /* RecognizerSharedState.m */; };
+		1A12C96D11B89F83008C9BED /* RewriteRuleElementStream.m in Sources */ = {isa = PBXBuildFile; fileRef = F71325870C4A060900B99F2D /* RewriteRuleElementStream.m */; };
+		1A12C96E11B89F84008C9BED /* RewriteRuleSubtreeStream.m in Sources */ = {isa = PBXBuildFile; fileRef = F70B11BC0C4C2B6400C3ECE0 /* RewriteRuleSubtreeStream.m */; };
+		1A12C96F11B89F85008C9BED /* RewriteRuleTokenStream.m in Sources */ = {isa = PBXBuildFile; fileRef = F70B11C20C4C2B7900C3ECE0 /* RewriteRuleTokenStream.m */; };
 		1A12C97011B89F87008C9BED /* ANTLRStringStream.m in Sources */ = {isa = PBXBuildFile; fileRef = F70AA7C609AA339900C3FD5E /* ANTLRStringStream.m */; };
-		1A12C97111B89F8B008C9BED /* ANTLRCharStreamState.m in Sources */ = {isa = PBXBuildFile; fileRef = F70AA7CE09AA379300C3FD5E /* ANTLRCharStreamState.m */; };
-		1A12C97211B89F8C008C9BED /* ANTLRToken+DebuggerSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = F77744040B234A3400D1F89B /* ANTLRToken+DebuggerSupport.m */; };
-		1A12C97311B89F8E008C9BED /* ANTLRTreeException.m in Sources */ = {isa = PBXBuildFile; fileRef = F738D1760B07AEAA001813C4 /* ANTLRTreeException.m */; };
-		1A12C97411B89F90008C9BED /* ANTLRTreeParser.m in Sources */ = {isa = PBXBuildFile; fileRef = F72C5D550AB63C1D00282574 /* ANTLRTreeParser.m */; };
-		1A16B13C11C66492002860C7 /* ANTLRLinkBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A16B13A11C66492002860C7 /* ANTLRLinkBase.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A16B13D11C66492002860C7 /* ANTLRLinkBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A16B13B11C66492002860C7 /* ANTLRLinkBase.m */; };
-		1A1702FE11C05D4800F6978A /* ANTLRHashMap.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A1702FC11C05D4800F6978A /* ANTLRHashMap.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A1702FF11C05D4800F6978A /* ANTLRHashMap.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A1702FD11C05D4800F6978A /* ANTLRHashMap.m */; };
-		1A1BCDBB11CB01E60051A1EC /* ANTLRRuleReturnScope.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A1BCDB911CB01E60051A1EC /* ANTLRRuleReturnScope.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A1BCDBC11CB01E60051A1EC /* ANTLRRuleReturnScope.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A1BCDBA11CB01E60051A1EC /* ANTLRRuleReturnScope.m */; };
-		1A1BCDCF11CB0B3D0051A1EC /* ANTLRTreeRuleReturnScope.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A1BCDCD11CB0B3D0051A1EC /* ANTLRTreeRuleReturnScope.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A1BCDD011CB0B3D0051A1EC /* ANTLRTreeRuleReturnScope.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A1BCDCE11CB0B3D0051A1EC /* ANTLRTreeRuleReturnScope.m */; };
-		1A1BCE2A11CB1A3E0051A1EC /* ANTLRTreeRewriter.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A1BCE2811CB1A3E0051A1EC /* ANTLRTreeRewriter.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A1BCE2B11CB1A3E0051A1EC /* ANTLRTreeRewriter.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A1BCE2911CB1A3E0051A1EC /* ANTLRTreeRewriter.m */; };
-		1A1CCCAB11B724B2002E5F53 /* ANTLRLookaheadStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A1CCCA911B724B2002E5F53 /* ANTLRLookaheadStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1A12C97111B89F8B008C9BED /* CharStreamState.m in Sources */ = {isa = PBXBuildFile; fileRef = F70AA7CE09AA379300C3FD5E /* CharStreamState.m */; };
+		1A12C97211B89F8C008C9BED /* Token+DebuggerSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = F77744040B234A3400D1F89B /* Token+DebuggerSupport.m */; };
+		1A12C97311B89F8E008C9BED /* TreeException.m in Sources */ = {isa = PBXBuildFile; fileRef = F738D1760B07AEAA001813C4 /* TreeException.m */; };
+		1A12C97411B89F90008C9BED /* TreeParser.m in Sources */ = {isa = PBXBuildFile; fileRef = F72C5D550AB63C1D00282574 /* TreeParser.m */; };
+		1A16B13C11C66492002860C7 /* LinkBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A16B13A11C66492002860C7 /* LinkBase.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1A16B13D11C66492002860C7 /* LinkBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A16B13B11C66492002860C7 /* LinkBase.m */; };
+		1A1702FE11C05D4800F6978A /* HashMap.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A1702FC11C05D4800F6978A /* HashMap.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1A1702FF11C05D4800F6978A /* HashMap.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A1702FD11C05D4800F6978A /* HashMap.m */; };
+		1A1BCDBB11CB01E60051A1EC /* RuleReturnScope.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A1BCDB911CB01E60051A1EC /* RuleReturnScope.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1A1BCDBC11CB01E60051A1EC /* RuleReturnScope.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A1BCDBA11CB01E60051A1EC /* RuleReturnScope.m */; };
+		1A1BCDCF11CB0B3D0051A1EC /* TreeRuleReturnScope.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A1BCDCD11CB0B3D0051A1EC /* TreeRuleReturnScope.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1A1BCDD011CB0B3D0051A1EC /* TreeRuleReturnScope.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A1BCDCE11CB0B3D0051A1EC /* TreeRuleReturnScope.m */; };
+		1A1BCE2A11CB1A3E0051A1EC /* TreeRewriter.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A1BCE2811CB1A3E0051A1EC /* TreeRewriter.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1A1BCE2B11CB1A3E0051A1EC /* TreeRewriter.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A1BCE2911CB1A3E0051A1EC /* TreeRewriter.m */; };
+		1A1CCCAB11B724B2002E5F53 /* LookaheadStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A1CCCA911B724B2002E5F53 /* LookaheadStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		1A1CCCC811B727B5002E5F53 /* ANTLRError.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A1CCCC711B727B5002E5F53 /* ANTLRError.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A1D465B11BE73B2001575F3 /* ANTLRBaseTreeAdaptor.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A1D465911BE73B2001575F3 /* ANTLRBaseTreeAdaptor.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A1D465C11BE73B2001575F3 /* ANTLRBaseTreeAdaptor.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A1D465A11BE73B2001575F3 /* ANTLRBaseTreeAdaptor.m */; };
-		1A1D467011BE75C0001575F3 /* ANTLRMapElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A1D466E11BE75C0001575F3 /* ANTLRMapElement.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A1D467111BE75C0001575F3 /* ANTLRMapElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A1D466F11BE75C0001575F3 /* ANTLRMapElement.m */; };
-		1A1D467C11BE8E5A001575F3 /* ANTLRCommonErrorNode.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A1D467A11BE8E5A001575F3 /* ANTLRCommonErrorNode.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A1D467D11BE8E5A001575F3 /* ANTLRCommonErrorNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A1D467B11BE8E5A001575F3 /* ANTLRCommonErrorNode.m */; };
+		1A1D465B11BE73B2001575F3 /* BaseTreeAdaptor.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A1D465911BE73B2001575F3 /* BaseTreeAdaptor.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1A1D465C11BE73B2001575F3 /* BaseTreeAdaptor.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A1D465A11BE73B2001575F3 /* BaseTreeAdaptor.m */; };
+		1A1D467011BE75C0001575F3 /* MapElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A1D466E11BE75C0001575F3 /* MapElement.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1A1D467111BE75C0001575F3 /* MapElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A1D466F11BE75C0001575F3 /* MapElement.m */; };
+		1A1D467C11BE8E5A001575F3 /* CommonErrorNode.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A1D467A11BE8E5A001575F3 /* CommonErrorNode.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1A1D467D11BE8E5A001575F3 /* CommonErrorNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A1D467B11BE8E5A001575F3 /* CommonErrorNode.m */; };
 		1A20C56512D6267500C2072A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = F700E86A0A5FA34D005D0757 /* main.m */; };
-		1A26329511C53578000DCDD4 /* ANTLRMismatchedNotSetException.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A26329311C53578000DCDD4 /* ANTLRMismatchedNotSetException.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A26329611C53578000DCDD4 /* ANTLRMismatchedNotSetException.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A26329411C53578000DCDD4 /* ANTLRMismatchedNotSetException.m */; };
-		1A270BF911C1451200DCC8F3 /* ANTLRTreeIterator.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A270BF711C1451200DCC8F3 /* ANTLRTreeIterator.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A270BFA11C1451200DCC8F3 /* ANTLRTreeIterator.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A270BF811C1451200DCC8F3 /* ANTLRTreeIterator.m */; };
-		1A2D217511E4F57C00DFE328 /* ANTLRUniqueIDMap.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A2D217311E4F57C00DFE328 /* ANTLRUniqueIDMap.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A2D217611E4F57C00DFE328 /* ANTLRUniqueIDMap.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A2D217411E4F57C00DFE328 /* ANTLRUniqueIDMap.m */; };
-		1A2D218611E502DE00DFE328 /* ANTLRNodeMapElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A2D218411E502DE00DFE328 /* ANTLRNodeMapElement.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A2D218711E502DE00DFE328 /* ANTLRNodeMapElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A2D218511E502DE00DFE328 /* ANTLRNodeMapElement.m */; };
+		1A26329511C53578000DCDD4 /* MismatchedNotSetException.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A26329311C53578000DCDD4 /* MismatchedNotSetException.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1A26329611C53578000DCDD4 /* MismatchedNotSetException.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A26329411C53578000DCDD4 /* MismatchedNotSetException.m */; };
+		1A270BF911C1451200DCC8F3 /* TreeIterator.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A270BF711C1451200DCC8F3 /* TreeIterator.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1A270BFA11C1451200DCC8F3 /* TreeIterator.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A270BF811C1451200DCC8F3 /* TreeIterator.m */; };
+		1A2D217511E4F57C00DFE328 /* UniqueIDMap.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A2D217311E4F57C00DFE328 /* UniqueIDMap.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1A2D217611E4F57C00DFE328 /* UniqueIDMap.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A2D217411E4F57C00DFE328 /* UniqueIDMap.m */; };
+		1A2D218611E502DE00DFE328 /* NodeMapElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A2D218411E502DE00DFE328 /* NodeMapElement.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1A2D218711E502DE00DFE328 /* NodeMapElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A2D218511E502DE00DFE328 /* NodeMapElement.m */; };
 		1A348B5811D2BF1C000C72FC /* ANTLR.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* ANTLR.framework */; };
 		1A348BA511D2C6A0000C72FC /* ANTLRBitSetTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A348B1D11D2BE4F000C72FC /* ANTLRBitSetTest.m */; };
-		1A348BA811D2C6AD000C72FC /* ANTLRCommonTokenTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A348B2311D2BE4F000C72FC /* ANTLRCommonTokenTest.m */; };
-		1A348BAB11D2C6B8000C72FC /* ANTLRCommonTreeTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A348B2611D2BE4F000C72FC /* ANTLRCommonTreeTest.m */; };
-		1A348BAE11D2C6C6000C72FC /* ANTLRFastQueueTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A348B1811D2BE4F000C72FC /* ANTLRFastQueueTest.m */; };
-		1A348BAF11D2C6D3000C72FC /* ANTLRIntArrayTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A348B1A11D2BE4F000C72FC /* ANTLRIntArrayTest.m */; };
+		1A348BA811D2C6AD000C72FC /* CommonTokenTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A348B2311D2BE4F000C72FC /* CommonTokenTest.m */; };
+		1A348BAB11D2C6B8000C72FC /* CommonTreeTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A348B2611D2BE4F000C72FC /* CommonTreeTest.m */; };
+		1A348BAE11D2C6C6000C72FC /* FastQueueTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A348B1811D2BE4F000C72FC /* FastQueueTest.m */; };
+		1A348BAF11D2C6D3000C72FC /* IntArrayTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A348B1A11D2BE4F000C72FC /* IntArrayTest.m */; };
 		1A348BB211D2C6E3000C72FC /* ANTLRStringStreamTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A348B2011D2BE4F000C72FC /* ANTLRStringStreamTest.m */; };
 		1A348BB611D2C711000C72FC /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A348BB511D2C711000C72FC /* Cocoa.framework */; };
 		1A348BB811D2C711000C72FC /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A348BB711D2C711000C72FC /* CoreFoundation.framework */; };
@@ -135,59 +135,59 @@
 		1A348BF311D2D0E0000C72FC /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A348BB711D2C711000C72FC /* CoreFoundation.framework */; };
 		1A348BF411D2D0E7000C72FC /* ANTLR.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* ANTLR.framework */; };
 		1A348C0611D2D22B000C72FC /* ANTLRBitSetTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A348B1D11D2BE4F000C72FC /* ANTLRBitSetTest.m */; };
-		1A3A08E611E213C500D5EE26 /* ANTLRBaseStack.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A3A08E411E213C500D5EE26 /* ANTLRBaseStack.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A3A08E711E213C500D5EE26 /* ANTLRBaseStack.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A3A08E511E213C500D5EE26 /* ANTLRBaseStack.m */; };
-		1A3A08EA11E213E100D5EE26 /* ANTLRSymbolStack.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A3A08E811E213E100D5EE26 /* ANTLRSymbolStack.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A3A08EB11E213E100D5EE26 /* ANTLRSymbolStack.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A3A08E911E213E100D5EE26 /* ANTLRSymbolStack.m */; };
+		1A3A08E611E213C500D5EE26 /* BaseStack.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A3A08E411E213C500D5EE26 /* BaseStack.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1A3A08E711E213C500D5EE26 /* BaseStack.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A3A08E511E213C500D5EE26 /* BaseStack.m */; };
+		1A3A08EA11E213E100D5EE26 /* SymbolStack.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A3A08E811E213E100D5EE26 /* SymbolStack.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1A3A08EB11E213E100D5EE26 /* SymbolStack.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A3A08E911E213E100D5EE26 /* SymbolStack.m */; };
 		1A3A09BE11E235BD00D5EE26 /* antlr3.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A3A09BD11E235BD00D5EE26 /* antlr3.h */; };
 		1A406B5612E8F2ED005EF037 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = F72C5E560AB7E41000282574 /* main.m */; };
-		1A45657711C922BE0082F421 /* ANTLRRuleMemo.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A45657511C922BE0082F421 /* ANTLRRuleMemo.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A45657811C922BE0082F421 /* ANTLRRuleMemo.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A45657611C922BE0082F421 /* ANTLRRuleMemo.m */; };
-		1A45658911C9270D0082F421 /* ANTLRBaseMapElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A45658711C9270D0082F421 /* ANTLRBaseMapElement.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A45658A11C9270D0082F421 /* ANTLRBaseMapElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A45658811C9270D0082F421 /* ANTLRBaseMapElement.m */; };
-		1A4A851211CBCE3E00E4BF1B /* ANTLRTreeVisitor.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A4A851011CBCE3E00E4BF1B /* ANTLRTreeVisitor.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A4A851311CBCE3E00E4BF1B /* ANTLRTreeVisitor.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A4A851111CBCE3E00E4BF1B /* ANTLRTreeVisitor.m */; };
-		1A4A851811CBCE5500E4BF1B /* ANTLRTreeVisitorAction.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A4A851611CBCE5500E4BF1B /* ANTLRTreeVisitorAction.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A4A851911CBCE5500E4BF1B /* ANTLRTreeVisitorAction.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A4A851711CBCE5500E4BF1B /* ANTLRTreeVisitorAction.m */; };
-		1A4A851E11CBCF3700E4BF1B /* ANTLRTreeWizard.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A4A851C11CBCF3700E4BF1B /* ANTLRTreeWizard.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A4A851F11CBCF3700E4BF1B /* ANTLRTreeWizard.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A4A851D11CBCF3700E4BF1B /* ANTLRTreeWizard.m */; };
-		1A4D5AD611B55A45001C9482 /* ANTLRBaseTree.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A4D5AD411B55A45001C9482 /* ANTLRBaseTree.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A5EA50B11CFE7CE00E8932F /* ANTLRMap.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A5EA50911CFE7CE00E8932F /* ANTLRMap.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A5EA50C11CFE7CE00E8932F /* ANTLRMap.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A5EA50A11CFE7CE00E8932F /* ANTLRMap.m */; };
-		1A65B7D811B9532A00FD8754 /* ANTLRBufferedTreeNodeStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A65B7D611B9532A00FD8754 /* ANTLRBufferedTreeNodeStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A65B7D911B9532A00FD8754 /* ANTLRBufferedTreeNodeStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A65B7D711B9532A00FD8754 /* ANTLRBufferedTreeNodeStream.m */; };
-		1A67885211B87ABA00A11EEC /* ANTLRBaseTree.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A4D5AD511B55A45001C9482 /* ANTLRBaseTree.m */; };
-		1A67885311B87AC400A11EEC /* ANTLRCharStream.h in Headers */ = {isa = PBXBuildFile; fileRef = F70AA7B509AA2B8800C3FD5E /* ANTLRCharStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A67885411B87AEA00A11EEC /* ANTLRFastQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A1CCC9111B6FD39002E5F53 /* ANTLRFastQueue.m */; };
-		1A67885511B87AEF00A11EEC /* ANTLRIntArray.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A1CCC9311B6FD39002E5F53 /* ANTLRIntArray.m */; };
-		1A6788FC11B893E100A11EEC /* ANTLRBaseRecognizer.m in Sources */ = {isa = PBXBuildFile; fileRef = F7A4098C09659BF3002CC781 /* ANTLRBaseRecognizer.m */; };
-		1A6C451711BF4EE00039788A /* ANTLRMissingTokenException.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C451511BF4EE00039788A /* ANTLRMissingTokenException.m */; };
-		1A6C452811BF50A40039788A /* ANTLRUnwantedTokenException.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6C452611BF50A40039788A /* ANTLRUnwantedTokenException.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6C452911BF50A40039788A /* ANTLRUnwantedTokenException.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C452711BF50A40039788A /* ANTLRUnwantedTokenException.m */; };
-		1A75BF5911D6B3FD0096C6F5 /* ANTLRMissingTokenException.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6C451411BF4EE00039788A /* ANTLRMissingTokenException.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A75BFBA11D6C2B10096C6F5 /* ANTLRDFA.m in Sources */ = {isa = PBXBuildFile; fileRef = F7754E3E0A5C0A0500D0873A /* ANTLRDFA.m */; };
+		1A45657711C922BE0082F421 /* RuleMemo.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A45657511C922BE0082F421 /* RuleMemo.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1A45657811C922BE0082F421 /* RuleMemo.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A45657611C922BE0082F421 /* RuleMemo.m */; };
+		1A45658911C9270D0082F421 /* BaseMapElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A45658711C9270D0082F421 /* BaseMapElement.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1A45658A11C9270D0082F421 /* BaseMapElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A45658811C9270D0082F421 /* BaseMapElement.m */; };
+		1A4A851211CBCE3E00E4BF1B /* TreeVisitor.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A4A851011CBCE3E00E4BF1B /* TreeVisitor.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1A4A851311CBCE3E00E4BF1B /* TreeVisitor.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A4A851111CBCE3E00E4BF1B /* TreeVisitor.m */; };
+		1A4A851811CBCE5500E4BF1B /* TreeVisitorAction.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A4A851611CBCE5500E4BF1B /* TreeVisitorAction.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1A4A851911CBCE5500E4BF1B /* TreeVisitorAction.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A4A851711CBCE5500E4BF1B /* TreeVisitorAction.m */; };
+		1A4A851E11CBCF3700E4BF1B /* TreeWizard.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A4A851C11CBCF3700E4BF1B /* TreeWizard.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1A4A851F11CBCF3700E4BF1B /* TreeWizard.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A4A851D11CBCF3700E4BF1B /* TreeWizard.m */; };
+		1A4D5AD611B55A45001C9482 /* BaseTree.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A4D5AD411B55A45001C9482 /* BaseTree.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1A5EA50B11CFE7CE00E8932F /* Map.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A5EA50911CFE7CE00E8932F /* Map.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1A5EA50C11CFE7CE00E8932F /* Map.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A5EA50A11CFE7CE00E8932F /* Map.m */; };
+		1A65B7D811B9532A00FD8754 /* BufferedTreeNodeStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A65B7D611B9532A00FD8754 /* BufferedTreeNodeStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1A65B7D911B9532A00FD8754 /* BufferedTreeNodeStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A65B7D711B9532A00FD8754 /* BufferedTreeNodeStream.m */; };
+		1A67885211B87ABA00A11EEC /* BaseTree.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A4D5AD511B55A45001C9482 /* BaseTree.m */; };
+		1A67885311B87AC400A11EEC /* CharStream.h in Headers */ = {isa = PBXBuildFile; fileRef = F70AA7B509AA2B8800C3FD5E /* CharStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1A67885411B87AEA00A11EEC /* FastQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A1CCC9111B6FD39002E5F53 /* FastQueue.m */; };
+		1A67885511B87AEF00A11EEC /* IntArray.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A1CCC9311B6FD39002E5F53 /* IntArray.m */; };
+		1A6788FC11B893E100A11EEC /* BaseRecognizer.m in Sources */ = {isa = PBXBuildFile; fileRef = F7A4098C09659BF3002CC781 /* BaseRecognizer.m */; };
+		1A6C451711BF4EE00039788A /* MissingTokenException.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C451511BF4EE00039788A /* MissingTokenException.m */; };
+		1A6C452811BF50A40039788A /* UnwantedTokenException.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6C452611BF50A40039788A /* UnwantedTokenException.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1A6C452911BF50A40039788A /* UnwantedTokenException.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C452711BF50A40039788A /* UnwantedTokenException.m */; };
+		1A75BF5911D6B3FD0096C6F5 /* MissingTokenException.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6C451411BF4EE00039788A /* MissingTokenException.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1A75BFBA11D6C2B10096C6F5 /* DFA.m in Sources */ = {isa = PBXBuildFile; fileRef = F7754E3E0A5C0A0500D0873A /* DFA.m */; };
 		1A77EE9312E6A57C007F323A /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A348BB511D2C711000C72FC /* Cocoa.framework */; };
 		1A77EE9412E6A57C007F323A /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A348BB711D2C711000C72FC /* CoreFoundation.framework */; };
 		1A77EE9712E6A594007F323A /* ANTLR.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* ANTLR.framework */; };
-		1A86B91B11EB9F6300C67A03 /* ANTLRParseTree.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A86B91911EB9F6300C67A03 /* ANTLRParseTree.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A86B91C11EB9F6300C67A03 /* ANTLRParseTree.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A86B91A11EB9F6300C67A03 /* ANTLRParseTree.m */; };
-		1A86BACF11EC1CD000C67A03 /* ANTLRUnbufferedTokenStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A86BACD11EC1CD000C67A03 /* ANTLRUnbufferedTokenStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A86BAD011EC1CD000C67A03 /* ANTLRUnbufferedTokenStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A86BACE11EC1CD000C67A03 /* ANTLRUnbufferedTokenStream.m */; };
-		1A8ABFC611BA9B960038DBB0 /* ANTLRCharStreamState.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A8ABFC511BA9B960038DBB0 /* ANTLRCharStreamState.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A8AC00C11BAEC710038DBB0 /* ANTLRRuntimeException.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A8AC00A11BAEC710038DBB0 /* ANTLRRuntimeException.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A8AC00D11BAEC710038DBB0 /* ANTLRRuntimeException.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A8AC00B11BAEC710038DBB0 /* ANTLRRuntimeException.m */; };
-		1AAC202C11CC621A00CF56D1 /* ANTLRTreePatternLexer.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AAC202A11CC621A00CF56D1 /* ANTLRTreePatternLexer.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1AAC202D11CC621A00CF56D1 /* ANTLRTreePatternLexer.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AAC202B11CC621A00CF56D1 /* ANTLRTreePatternLexer.m */; };
-		1AAC20A511CC790300CF56D1 /* ANTLRTreePatternParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AAC20A311CC790300CF56D1 /* ANTLRTreePatternParser.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1AAC20A611CC790300CF56D1 /* ANTLRTreePatternParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AAC20A411CC790300CF56D1 /* ANTLRTreePatternParser.m */; };
-		1AB4A54211B995290076E91A /* ANTLREarlyExitException.m in Sources */ = {isa = PBXBuildFile; fileRef = F700E61A0A5F66EC005D0757 /* ANTLREarlyExitException.m */; };
-		1AB4A54311B9952A0076E91A /* ANTLRFailedPredicateException.m in Sources */ = {isa = PBXBuildFile; fileRef = F738D1740B07AEAA001813C4 /* ANTLRFailedPredicateException.m */; };
-		1AB4A59111B9A0DA0076E91A /* ANTLRStreamEnumerator.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AB4A58F11B9A0DA0076E91A /* ANTLRStreamEnumerator.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1AB4A59211B9A0DA0076E91A /* ANTLRStreamEnumerator.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AB4A59011B9A0DA0076E91A /* ANTLRStreamEnumerator.m */; };
-		1AB5F47711E3869D00E065B0 /* ANTLRRuleMapElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AB5F47511E3869D00E065B0 /* ANTLRRuleMapElement.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1AB5F47811E3869D00E065B0 /* ANTLRRuleMapElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AB5F47611E3869D00E065B0 /* ANTLRRuleMapElement.m */; };
-		1AB5F51E11E3BE2E00E065B0 /* ANTLRPtrBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AB5F51C11E3BE2E00E065B0 /* ANTLRPtrBuffer.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1AB5F51F11E3BE2E00E065B0 /* ANTLRPtrBuffer.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AB5F51D11E3BE2E00E065B0 /* ANTLRPtrBuffer.m */; };
+		1A86B91B11EB9F6300C67A03 /* ParseTree.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A86B91911EB9F6300C67A03 /* ParseTree.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1A86B91C11EB9F6300C67A03 /* ParseTree.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A86B91A11EB9F6300C67A03 /* ParseTree.m */; };
+		1A86BACF11EC1CD000C67A03 /* UnbufferedTokenStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A86BACD11EC1CD000C67A03 /* UnbufferedTokenStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1A86BAD011EC1CD000C67A03 /* UnbufferedTokenStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A86BACE11EC1CD000C67A03 /* UnbufferedTokenStream.m */; };
+		1A8ABFC611BA9B960038DBB0 /* CharStreamState.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A8ABFC511BA9B960038DBB0 /* CharStreamState.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1A8AC00C11BAEC710038DBB0 /* RuntimeException.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A8AC00A11BAEC710038DBB0 /* RuntimeException.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1A8AC00D11BAEC710038DBB0 /* RuntimeException.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A8AC00B11BAEC710038DBB0 /* RuntimeException.m */; };
+		1AAC202C11CC621A00CF56D1 /* TreePatternLexer.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AAC202A11CC621A00CF56D1 /* TreePatternLexer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1AAC202D11CC621A00CF56D1 /* TreePatternLexer.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AAC202B11CC621A00CF56D1 /* TreePatternLexer.m */; };
+		1AAC20A511CC790300CF56D1 /* TreePatternParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AAC20A311CC790300CF56D1 /* TreePatternParser.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1AAC20A611CC790300CF56D1 /* TreePatternParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AAC20A411CC790300CF56D1 /* TreePatternParser.m */; };
+		1AB4A54211B995290076E91A /* EarlyExitException.m in Sources */ = {isa = PBXBuildFile; fileRef = F700E61A0A5F66EC005D0757 /* EarlyExitException.m */; };
+		1AB4A54311B9952A0076E91A /* FailedPredicateException.m in Sources */ = {isa = PBXBuildFile; fileRef = F738D1740B07AEAA001813C4 /* FailedPredicateException.m */; };
+		1AB4A59111B9A0DA0076E91A /* StreamEnumerator.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AB4A58F11B9A0DA0076E91A /* StreamEnumerator.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1AB4A59211B9A0DA0076E91A /* StreamEnumerator.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AB4A59011B9A0DA0076E91A /* StreamEnumerator.m */; };
+		1AB5F47711E3869D00E065B0 /* RuleMapElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AB5F47511E3869D00E065B0 /* RuleMapElement.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1AB5F47811E3869D00E065B0 /* RuleMapElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AB5F47611E3869D00E065B0 /* RuleMapElement.m */; };
+		1AB5F51E11E3BE2E00E065B0 /* PtrBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AB5F51C11E3BE2E00E065B0 /* PtrBuffer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1AB5F51F11E3BE2E00E065B0 /* PtrBuffer.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AB5F51D11E3BE2E00E065B0 /* PtrBuffer.m */; };
 		1AC5AC9E12E7BEFE00DF0C58 /* ANTLR.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* ANTLR.framework */; };
 		1AC5AC9F12E7BEFE00DF0C58 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D69BFE84028FC02AAC07 /* Foundation.framework */; };
 		1AC5ACA112E7BEFE00DF0C58 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F71F6B8F09A81E6F003221F4 /* CoreFoundation.framework */; };
@@ -198,41 +198,59 @@
 		1AC5ACE812E7CE5100DF0C58 /* LangDumpDecl.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AC5ACC612E7C03C00DF0C58 /* LangDumpDecl.m */; };
 		1ADB66F112E74341007C1661 /* FuzzyLexer.h in Headers */ = {isa = PBXBuildFile; fileRef = 1ADB66F012E74341007C1661 /* FuzzyLexer.h */; };
 		1ADB67BA12E74E82007C1661 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A348BB511D2C711000C72FC /* Cocoa.framework */; };
-		1AE8A96C11D9227A00D36FD6 /* ANTLRRuleStack.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AE8A96A11D9227A00D36FD6 /* ANTLRRuleStack.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1AE8A96D11D9227A00D36FD6 /* ANTLRRuleStack.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE8A96B11D9227A00D36FD6 /* ANTLRRuleStack.m */; };
-		1AEECE1511E7EB3C00554AAF /* ANTLRTokenRewriteStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A1FFC5911CD12A400FBB452 /* ANTLRTokenRewriteStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1AEECE1611E7EB3D00554AAF /* ANTLRTokenRewriteStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A1FFC5A11CD12A400FBB452 /* ANTLRTokenRewriteStream.m */; };
-		F7009ADB0A1BE4AE002EDD5D /* ANTLRLexerRuleReturnScope.h in Headers */ = {isa = PBXBuildFile; fileRef = F7009AD90A1BE4AE002EDD5D /* ANTLRLexerRuleReturnScope.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		F700E61B0A5F66EC005D0757 /* ANTLREarlyExitException.h in Headers */ = {isa = PBXBuildFile; fileRef = F700E6190A5F66EC005D0757 /* ANTLREarlyExitException.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		F700E8FB0A5FAD21005D0757 /* ANTLRParser.h in Headers */ = {isa = PBXBuildFile; fileRef = F700E8F90A5FAD21005D0757 /* ANTLRParser.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1AE8A96C11D9227A00D36FD6 /* RuleStack.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AE8A96A11D9227A00D36FD6 /* RuleStack.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1AE8A96D11D9227A00D36FD6 /* RuleStack.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE8A96B11D9227A00D36FD6 /* RuleStack.m */; };
+		1AEECE1511E7EB3C00554AAF /* TokenRewriteStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A1FFC5911CD12A400FBB452 /* TokenRewriteStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1AEECE1611E7EB3D00554AAF /* TokenRewriteStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A1FFC5A11CD12A400FBB452 /* TokenRewriteStream.m */; };
+		BF7D9B531519363200B58218 /* ACBTree.h in Headers */ = {isa = PBXBuildFile; fileRef = BF7D9B511519363200B58218 /* ACBTree.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		BF7D9B541519363200B58218 /* ACBTree.m in Sources */ = {isa = PBXBuildFile; fileRef = BF7D9B521519363200B58218 /* ACBTree.m */; };
+		BF7D9B571519367800B58218 /* AMutableArray.h in Headers */ = {isa = PBXBuildFile; fileRef = BF7D9B551519367800B58218 /* AMutableArray.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		BF7D9B581519367800B58218 /* AMutableArray.m in Sources */ = {isa = PBXBuildFile; fileRef = BF7D9B561519367800B58218 /* AMutableArray.m */; };
+		BF7D9B5B1519368C00B58218 /* AMutableDictionary.h in Headers */ = {isa = PBXBuildFile; fileRef = BF7D9B591519368C00B58218 /* AMutableDictionary.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		BF7D9B5C1519368C00B58218 /* AMutableDictionary.m in Sources */ = {isa = PBXBuildFile; fileRef = BF7D9B5A1519368C00B58218 /* AMutableDictionary.m */; };
+		BF7D9B5F151936B600B58218 /* DoubleKeyMap.h in Headers */ = {isa = PBXBuildFile; fileRef = BF7D9B5D151936B500B58218 /* DoubleKeyMap.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		BF7D9B60151936B600B58218 /* DoubleKeyMap.m in Sources */ = {isa = PBXBuildFile; fileRef = BF7D9B5E151936B600B58218 /* DoubleKeyMap.m */; };
+		BF7D9B63151936E700B58218 /* ANTLRFileStream.h in Headers */ = {isa = PBXBuildFile; fileRef = BF7D9B61151936E700B58218 /* ANTLRFileStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		BF7D9B64151936E700B58218 /* ANTLRFileStream.m in Sources */ = {isa = PBXBuildFile; fileRef = BF7D9B62151936E700B58218 /* ANTLRFileStream.m */; };
+		BF7D9B67151936FC00B58218 /* ANTLRInputStream.h in Headers */ = {isa = PBXBuildFile; fileRef = BF7D9B65151936FB00B58218 /* ANTLRInputStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		BF7D9B68151936FC00B58218 /* ANTLRInputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = BF7D9B66151936FB00B58218 /* ANTLRInputStream.m */; };
+		BF7D9B6B1519371200B58218 /* ANTLRReaderStream.h in Headers */ = {isa = PBXBuildFile; fileRef = BF7D9B691519371100B58218 /* ANTLRReaderStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		BF7D9B6C1519371200B58218 /* ANTLRReaderStream.m in Sources */ = {isa = PBXBuildFile; fileRef = BF7D9B6A1519371200B58218 /* ANTLRReaderStream.m */; };
+		BF7D9B6F1519373700B58218 /* RewriteRuleNodeStream.h in Headers */ = {isa = PBXBuildFile; fileRef = BF7D9B6D1519373600B58218 /* RewriteRuleNodeStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		BF7D9B701519373700B58218 /* RewriteRuleNodeStream.m in Sources */ = {isa = PBXBuildFile; fileRef = BF7D9B6E1519373600B58218 /* RewriteRuleNodeStream.m */; };
+		BF7D9B731519375200B58218 /* ArrayIterator.h in Headers */ = {isa = PBXBuildFile; fileRef = BF7D9B711519375200B58218 /* ArrayIterator.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		BF7D9B741519375200B58218 /* ArrayIterator.m in Sources */ = {isa = PBXBuildFile; fileRef = BF7D9B721519375200B58218 /* ArrayIterator.m */; };
+		F7009ADB0A1BE4AE002EDD5D /* LexerRuleReturnScope.h in Headers */ = {isa = PBXBuildFile; fileRef = F7009AD90A1BE4AE002EDD5D /* LexerRuleReturnScope.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		F700E61B0A5F66EC005D0757 /* EarlyExitException.h in Headers */ = {isa = PBXBuildFile; fileRef = F700E6190A5F66EC005D0757 /* EarlyExitException.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		F700E8FB0A5FAD21005D0757 /* Parser.h in Headers */ = {isa = PBXBuildFile; fileRef = F700E8F90A5FAD21005D0757 /* Parser.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		F700EC670A5FDF0D005D0757 /* ANTLR.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* ANTLR.framework */; };
 		F700ECA40A5FDF1A005D0757 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F71F6B8F09A81E6F003221F4 /* CoreFoundation.framework */; };
 		F700ECA50A5FDF1A005D0757 /* FuzzyLexer.h in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7B1FEA5585E11CA2CBB /* FuzzyLexer.h */; };
 		F700ECD90A5FE19A005D0757 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F71F6B8F09A81E6F003221F4 /* CoreFoundation.framework */; };
 		F700ECDA0A5FE19A005D0757 /* FuzzyLexer.h in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7B1FEA5585E11CA2CBB /* FuzzyLexer.h */; };
-		F700ED7F0A5FF17C005D0757 /* ANTLRTokenSource.h in Headers */ = {isa = PBXBuildFile; fileRef = F700ED7E0A5FF17C005D0757 /* ANTLRTokenSource.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		F700ED960A5FF2A5005D0757 /* ANTLRCommonTokenStream.h in Headers */ = {isa = PBXBuildFile; fileRef = F700ED940A5FF2A5005D0757 /* ANTLRCommonTokenStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		F7037CF00A0582FC0070435D /* ANTLRMismatchedRangeException.h in Headers */ = {isa = PBXBuildFile; fileRef = F7037CEE0A0582FC0070435D /* ANTLRMismatchedRangeException.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		F700ED7F0A5FF17C005D0757 /* TokenSource.h in Headers */ = {isa = PBXBuildFile; fileRef = F700ED7E0A5FF17C005D0757 /* TokenSource.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		F700ED960A5FF2A5005D0757 /* CommonTokenStream.h in Headers */ = {isa = PBXBuildFile; fileRef = F700ED940A5FF2A5005D0757 /* CommonTokenStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		F7037CF00A0582FC0070435D /* MismatchedRangeException.h in Headers */ = {isa = PBXBuildFile; fileRef = F7037CEE0A0582FC0070435D /* MismatchedRangeException.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		F7037EA60A05AFD70070435D /* ANTLR.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* ANTLR.framework */; };
-		F70380BC0A07FA0D0070435D /* ANTLRMismatchedSetException.h in Headers */ = {isa = PBXBuildFile; fileRef = F70380BA0A07FA0D0070435D /* ANTLRMismatchedSetException.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		F70380BC0A07FA0D0070435D /* MismatchedSetException.h in Headers */ = {isa = PBXBuildFile; fileRef = F70380BA0A07FA0D0070435D /* MismatchedSetException.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		F7048FF80B07D05400D2F326 /* TestLexer.m in Sources */ = {isa = PBXBuildFile; fileRef = F7048FF70B07D05400D2F326 /* TestLexer.m */; };
 		F7048FF90B07D05800D2F326 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = F7E983940A0D6A5F00F16093 /* main.m */; };
 		F70AA7A609AA2A6900C3FD5E /* ANTLR.h in Headers */ = {isa = PBXBuildFile; fileRef = F70AA7A509AA2A6900C3FD5E /* ANTLR.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		F70AA7AF09AA2AC000C3FD5E /* ANTLRIntStream.h in Headers */ = {isa = PBXBuildFile; fileRef = F70AA7AD09AA2AC000C3FD5E /* ANTLRIntStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		F70AA7AF09AA2AC000C3FD5E /* IntStream.h in Headers */ = {isa = PBXBuildFile; fileRef = F70AA7AD09AA2AC000C3FD5E /* IntStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		F70AA7C709AA339900C3FD5E /* ANTLRStringStream.h in Headers */ = {isa = PBXBuildFile; fileRef = F70AA7C509AA339900C3FD5E /* ANTLRStringStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		F70B11BD0C4C2B6400C3ECE0 /* ANTLRRewriteRuleSubtreeStream.h in Headers */ = {isa = PBXBuildFile; fileRef = F70B11BB0C4C2B6400C3ECE0 /* ANTLRRewriteRuleSubtreeStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		F70B11C30C4C2B7900C3ECE0 /* ANTLRRewriteRuleTokenStream.h in Headers */ = {isa = PBXBuildFile; fileRef = F70B11C10C4C2B7900C3ECE0 /* ANTLRRewriteRuleTokenStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		F71325880C4A060900B99F2D /* ANTLRRewriteRuleElementStream.h in Headers */ = {isa = PBXBuildFile; fileRef = F71325860C4A060900B99F2D /* ANTLRRewriteRuleElementStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		F72C58EA0AB3911D00282574 /* ANTLRCommonTree.h in Headers */ = {isa = PBXBuildFile; fileRef = F72C58E80AB3911D00282574 /* ANTLRCommonTree.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		F72C59A70AB4F20A00282574 /* ANTLRCommonTreeAdaptor.h in Headers */ = {isa = PBXBuildFile; fileRef = F72C59A50AB4F20A00282574 /* ANTLRCommonTreeAdaptor.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		F72C5B840AB52AD300282574 /* ANTLRTreeNodeStream.h in Headers */ = {isa = PBXBuildFile; fileRef = F72C5B820AB52AD300282574 /* ANTLRTreeNodeStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		F72C5D560AB63C1D00282574 /* ANTLRTreeParser.h in Headers */ = {isa = PBXBuildFile; fileRef = F72C5D540AB63C1D00282574 /* ANTLRTreeParser.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		F72C5D620AB63E0B00282574 /* ANTLRMismatchedTreeNodeException.h in Headers */ = {isa = PBXBuildFile; fileRef = F72C5D600AB63E0B00282574 /* ANTLRMismatchedTreeNodeException.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		F70B11BD0C4C2B6400C3ECE0 /* RewriteRuleSubtreeStream.h in Headers */ = {isa = PBXBuildFile; fileRef = F70B11BB0C4C2B6400C3ECE0 /* RewriteRuleSubtreeStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		F70B11C30C4C2B7900C3ECE0 /* RewriteRuleTokenStream.h in Headers */ = {isa = PBXBuildFile; fileRef = F70B11C10C4C2B7900C3ECE0 /* RewriteRuleTokenStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		F71325880C4A060900B99F2D /* RewriteRuleElementStream.h in Headers */ = {isa = PBXBuildFile; fileRef = F71325860C4A060900B99F2D /* RewriteRuleElementStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		F72C58EA0AB3911D00282574 /* CommonTree.h in Headers */ = {isa = PBXBuildFile; fileRef = F72C58E80AB3911D00282574 /* CommonTree.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		F72C59A70AB4F20A00282574 /* CommonTreeAdaptor.h in Headers */ = {isa = PBXBuildFile; fileRef = F72C59A50AB4F20A00282574 /* CommonTreeAdaptor.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		F72C5B840AB52AD300282574 /* TreeNodeStream.h in Headers */ = {isa = PBXBuildFile; fileRef = F72C5B820AB52AD300282574 /* TreeNodeStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		F72C5D560AB63C1D00282574 /* TreeParser.h in Headers */ = {isa = PBXBuildFile; fileRef = F72C5D540AB63C1D00282574 /* TreeParser.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		F72C5D620AB63E0B00282574 /* MismatchedTreeNodeException.h in Headers */ = {isa = PBXBuildFile; fileRef = F72C5D600AB63E0B00282574 /* MismatchedTreeNodeException.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		F72C5E620AB7E4C900282574 /* ANTLR.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* ANTLR.framework */; };
 		F72C5E630AB7E4C900282574 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D69BFE84028FC02AAC07 /* Foundation.framework */; };
 		F72C5E650AB7E4C900282574 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F71F6B8F09A81E6F003221F4 /* CoreFoundation.framework */; };
-		F72C5ECE0AB7E5A500282574 /* ANTLRParserRuleReturnScope.h in Headers */ = {isa = PBXBuildFile; fileRef = F72C5ECC0AB7E5A500282574 /* ANTLRParserRuleReturnScope.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		F738D1790B07AEAA001813C4 /* ANTLRTreeException.h in Headers */ = {isa = PBXBuildFile; fileRef = F738D1750B07AEAA001813C4 /* ANTLRTreeException.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		F72C5ECE0AB7E5A500282574 /* ParserRuleReturnScope.h in Headers */ = {isa = PBXBuildFile; fileRef = F72C5ECC0AB7E5A500282574 /* ParserRuleReturnScope.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		F738D1790B07AEAA001813C4 /* TreeException.h in Headers */ = {isa = PBXBuildFile; fileRef = F738D1750B07AEAA001813C4 /* TreeException.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		F738D1FC0B07B1BD001813C4 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = F7DD07800A7B67A7006A006C /* main.m */; };
 		F738D20D0B07B265001813C4 /* SymbolTableParser.m in Sources */ = {isa = PBXBuildFile; fileRef = F738D2010B07B1CE001813C4 /* SymbolTableParser.m */; };
 		F738D20E0B07B266001813C4 /* SymbolTableLexer.m in Sources */ = {isa = PBXBuildFile; fileRef = F738D1FF0B07B1CE001813C4 /* SymbolTableLexer.m */; };
@@ -242,12 +260,12 @@
 		F738D3610B07C105001813C4 /* CombinedLexer.m in Sources */ = {isa = PBXBuildFile; fileRef = F738D35E0B07C105001813C4 /* CombinedLexer.m */; };
 		F738D3620B07C105001813C4 /* CombinedParser.m in Sources */ = {isa = PBXBuildFile; fileRef = F738D3600B07C105001813C4 /* CombinedParser.m */; };
 		F738D37E0B07C3BD001813C4 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = F79D56C00A0E287500EA3CEE /* main.m */; };
-		F73E2B740A9CFE6A005D6267 /* ANTLRTree.h in Headers */ = {isa = PBXBuildFile; fileRef = F73E2B720A9CFE6A005D6267 /* ANTLRTree.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		F73E2B7C0A9D0AFC005D6267 /* ANTLRTreeAdaptor.h in Headers */ = {isa = PBXBuildFile; fileRef = F73E2B7A0A9D0AFC005D6267 /* ANTLRTreeAdaptor.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		F73E2B740A9CFE6A005D6267 /* Tree.h in Headers */ = {isa = PBXBuildFile; fileRef = F73E2B720A9CFE6A005D6267 /* Tree.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		F73E2B7C0A9D0AFC005D6267 /* TreeAdaptor.h in Headers */ = {isa = PBXBuildFile; fileRef = F73E2B7A0A9D0AFC005D6267 /* TreeAdaptor.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		F741D0830B381E720024DF3F /* SimpleCWalker.m in Sources */ = {isa = PBXBuildFile; fileRef = F741D0650B3812D40024DF3F /* SimpleCWalker.m */; };
 		F741D0840B381E730024DF3F /* SimpleCParser.m in Sources */ = {isa = PBXBuildFile; fileRef = F7715D310AC9DE9E00ED984D /* SimpleCParser.m */; };
 		F741D08E0B381EA90024DF3F /* SimpleCLexer.m in Sources */ = {isa = PBXBuildFile; fileRef = F7715D2F0AC9DE9E00ED984D /* SimpleCLexer.m */; };
-		F7492F5D09C016A200B25E30 /* ANTLRBaseRecognizer.h in Headers */ = {isa = PBXBuildFile; fileRef = F7A4098B09659BF3002CC781 /* ANTLRBaseRecognizer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		F7492F5D09C016A200B25E30 /* BaseRecognizer.h in Headers */ = {isa = PBXBuildFile; fileRef = F7A4098B09659BF3002CC781 /* BaseRecognizer.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		F76287130B714E77006AA7EF /* TLexer.m in Sources */ = {isa = PBXBuildFile; fileRef = F7DD06E80A7B1700006A006C /* TLexer.m */; };
 		F76287140B714E78006AA7EF /* TParser.m in Sources */ = {isa = PBXBuildFile; fileRef = F738D2240B07B3BC001813C4 /* TParser.m */; };
 		F76287150B714E82006AA7EF /* SimpleCParser.m in Sources */ = {isa = PBXBuildFile; fileRef = F738D2510B07B842001813C4 /* SimpleCParser.m */; };
@@ -255,21 +273,21 @@
 		F76287170B714EA9006AA7EF /* FuzzyLexer.m in Sources */ = {isa = PBXBuildFile; fileRef = F72B8D0B0AD01DCB0013F1E2 /* FuzzyLexer.m */; };
 		F763D4490A666D3D0061CD35 /* ANTLR.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* ANTLR.framework */; };
 		F763D51E0A66765B0061CD35 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F71F6B8F09A81E6F003221F4 /* CoreFoundation.framework */; };
-		F76AA9900CEA515A00AF044C /* ANTLRCommonTreeNodeStream.h in Headers */ = {isa = PBXBuildFile; fileRef = F76AA98E0CEA515A00AF044C /* ANTLRCommonTreeNodeStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		F7754E3F0A5C0A0500D0873A /* ANTLRDFA.h in Headers */ = {isa = PBXBuildFile; fileRef = F7754E3D0A5C0A0500D0873A /* ANTLRDFA.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		F77744050B234A3400D1F89B /* ANTLRToken+DebuggerSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = F77744030B234A3400D1F89B /* ANTLRToken+DebuggerSupport.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		F77747560B23A70600D1F89B /* ANTLRDebug.h in Headers */ = {isa = PBXBuildFile; fileRef = F77747550B23A70600D1F89B /* ANTLRDebug.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		F77765CC09DC583000517181 /* ANTLRToken.h in Headers */ = {isa = PBXBuildFile; fileRef = F77765CA09DC583000517181 /* ANTLRToken.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		F777660509DC5CF400517181 /* ANTLRCommonToken.h in Headers */ = {isa = PBXBuildFile; fileRef = F777660309DC5CF400517181 /* ANTLRCommonToken.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		F777668209DC719C00517181 /* ANTLRMismatchedTokenException.h in Headers */ = {isa = PBXBuildFile; fileRef = F777668009DC719C00517181 /* ANTLRMismatchedTokenException.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		F777669309DC72D600517181 /* ANTLRRecognitionException.h in Headers */ = {isa = PBXBuildFile; fileRef = F777669109DC72D600517181 /* ANTLRRecognitionException.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		F77766AF09DD53E800517181 /* ANTLRTokenStream.h in Headers */ = {isa = PBXBuildFile; fileRef = F77766AE09DD53E800517181 /* ANTLRTokenStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		F777678E09DD618000517181 /* ANTLRLexer.h in Headers */ = {isa = PBXBuildFile; fileRef = F7A4099109659BFB002CC781 /* ANTLRLexer.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		F79D598B0A0E51AB00EA3CEE /* ANTLRNoViableAltException.h in Headers */ = {isa = PBXBuildFile; fileRef = F79D59890A0E51AB00EA3CEE /* ANTLRNoViableAltException.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		F76AA9900CEA515A00AF044C /* CommonTreeNodeStream.h in Headers */ = {isa = PBXBuildFile; fileRef = F76AA98E0CEA515A00AF044C /* CommonTreeNodeStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		F7754E3F0A5C0A0500D0873A /* DFA.h in Headers */ = {isa = PBXBuildFile; fileRef = F7754E3D0A5C0A0500D0873A /* DFA.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		F77744050B234A3400D1F89B /* Token+DebuggerSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = F77744030B234A3400D1F89B /* Token+DebuggerSupport.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		F77747560B23A70600D1F89B /* Debug.h in Headers */ = {isa = PBXBuildFile; fileRef = F77747550B23A70600D1F89B /* Debug.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		F77765CC09DC583000517181 /* Token.h in Headers */ = {isa = PBXBuildFile; fileRef = F77765CA09DC583000517181 /* Token.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		F777660509DC5CF400517181 /* CommonToken.h in Headers */ = {isa = PBXBuildFile; fileRef = F777660309DC5CF400517181 /* CommonToken.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		F777668209DC719C00517181 /* MismatchedTokenException.h in Headers */ = {isa = PBXBuildFile; fileRef = F777668009DC719C00517181 /* MismatchedTokenException.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		F777669309DC72D600517181 /* RecognitionException.h in Headers */ = {isa = PBXBuildFile; fileRef = F777669109DC72D600517181 /* RecognitionException.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		F77766AF09DD53E800517181 /* TokenStream.h in Headers */ = {isa = PBXBuildFile; fileRef = F77766AE09DD53E800517181 /* TokenStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		F777678E09DD618000517181 /* Lexer.h in Headers */ = {isa = PBXBuildFile; fileRef = F7A4099109659BFB002CC781 /* Lexer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		F79D598B0A0E51AB00EA3CEE /* NoViableAltException.h in Headers */ = {isa = PBXBuildFile; fileRef = F79D59890A0E51AB00EA3CEE /* NoViableAltException.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		F79D5AF60A0E634900EA3CEE /* ANTLR.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* ANTLR.framework */; };
 		F79D5AF70A0E634A00EA3CEE /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D69BFE84028FC02AAC07 /* Foundation.framework */; };
 		F79D5AF80A0E634A00EA3CEE /* FuzzyLexer.h in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7B1FEA5585E11CA2CBB /* FuzzyLexer.h */; };
-		F7B1E5B00CD7CF1900CE136E /* ANTLRRecognizerSharedState.h in Headers */ = {isa = PBXBuildFile; fileRef = F7B1E5AC0CD7CF1900CE136E /* ANTLRRecognizerSharedState.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		F7B1E5B00CD7CF1900CE136E /* RecognizerSharedState.h in Headers */ = {isa = PBXBuildFile; fileRef = F7B1E5AC0CD7CF1900CE136E /* RecognizerSharedState.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		F7CD47650C64D24C00FF933A /* TreeRewriteLexer.m in Sources */ = {isa = PBXBuildFile; fileRef = F7CD46360C64BB7300FF933A /* TreeRewriteLexer.m */; };
 		F7CD47660C64D24D00FF933A /* TreeRewriteParser.m in Sources */ = {isa = PBXBuildFile; fileRef = F7CD46380C64BB7300FF933A /* TreeRewriteParser.m */; };
 		F7CD47670C64D24D00FF933A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = F7CD45FC0C64BA4B00FF933A /* main.m */; };
@@ -284,12 +302,12 @@
 		F7DD074D0A7B665C006A006C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D69BFE84028FC02AAC07 /* Foundation.framework */; };
 		F7DD074E0A7B665D006A006C /* FuzzyLexer.h in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7B1FEA5585E11CA2CBB /* FuzzyLexer.h */; };
 		F7DD074F0A7B665D006A006C /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F71F6B8F09A81E6F003221F4 /* CoreFoundation.framework */; };
-		F7E261160B1E44320013F640 /* ANTLRDebugParser.h in Headers */ = {isa = PBXBuildFile; fileRef = F7E261140B1E44320013F640 /* ANTLRDebugParser.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		F7E2611A0B1E443D0013F640 /* ANTLRDebugTreeParser.h in Headers */ = {isa = PBXBuildFile; fileRef = F7E261180B1E443C0013F640 /* ANTLRDebugTreeParser.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		F7E261200B1E44E80013F640 /* ANTLRDebugTokenStream.h in Headers */ = {isa = PBXBuildFile; fileRef = F7E2611E0B1E44E80013F640 /* ANTLRDebugTokenStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		F7E261240B1E44FA0013F640 /* ANTLRDebugTreeNodeStream.h in Headers */ = {isa = PBXBuildFile; fileRef = F7E261220B1E44FA0013F640 /* ANTLRDebugTreeNodeStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		F7E261280B1E45070013F640 /* ANTLRDebugTreeAdaptor.h in Headers */ = {isa = PBXBuildFile; fileRef = F7E261260B1E45070013F640 /* ANTLRDebugTreeAdaptor.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		F7E261390B1E45580013F640 /* ANTLRDebugEventProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = F7E261370B1E45580013F640 /* ANTLRDebugEventProxy.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		F7E261160B1E44320013F640 /* DebugParser.h in Headers */ = {isa = PBXBuildFile; fileRef = F7E261140B1E44320013F640 /* DebugParser.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		F7E2611A0B1E443D0013F640 /* DebugTreeParser.h in Headers */ = {isa = PBXBuildFile; fileRef = F7E261180B1E443C0013F640 /* DebugTreeParser.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		F7E261200B1E44E80013F640 /* DebugTokenStream.h in Headers */ = {isa = PBXBuildFile; fileRef = F7E2611E0B1E44E80013F640 /* DebugTokenStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		F7E261240B1E44FA0013F640 /* DebugTreeNodeStream.h in Headers */ = {isa = PBXBuildFile; fileRef = F7E261220B1E44FA0013F640 /* DebugTreeNodeStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		F7E261280B1E45070013F640 /* DebugTreeAdaptor.h in Headers */ = {isa = PBXBuildFile; fileRef = F7E261260B1E45070013F640 /* DebugTreeAdaptor.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		F7E261390B1E45580013F640 /* DebugEventSocketProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = F7E261370B1E45580013F640 /* DebugEventSocketProxy.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		F7E985580A0D865E00F16093 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D69BFE84028FC02AAC07 /* Foundation.framework */; };
 		F7E985590A0D866000F16093 /* FuzzyLexer.h in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7B1FEA5585E11CA2CBB /* FuzzyLexer.h */; };
 		F7F4E9BA0A6E8B110092D087 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D69BFE84028FC02AAC07 /* Foundation.framework */; };
@@ -567,8 +585,8 @@
 		1A0F347E12EA444500496BB8 /* Simplifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Simplifier.h; sourceTree = "<group>"; };
 		1A0F347F12EA444500496BB8 /* Simplifier.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Simplifier.m; sourceTree = "<group>"; };
 		1A0F348012EA444500496BB8 /* Simplifier.tokens */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Simplifier.tokens; sourceTree = "<group>"; };
-		1A100AB911E604FE006ABF94 /* ANTLRHashRule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRHashRule.h; sourceTree = "<group>"; };
-		1A100ABA11E604FE006ABF94 /* ANTLRHashRule.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRHashRule.m; sourceTree = "<group>"; };
+		1A100AB911E604FE006ABF94 /* HashRule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HashRule.h; sourceTree = "<group>"; };
+		1A100ABA11E604FE006ABF94 /* HashRule.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HashRule.m; sourceTree = "<group>"; };
 		1A1210FB11D3A5D900F27B38 /* ANTLRCommonTokenTest.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ANTLRCommonTokenTest.octest; sourceTree = BUILT_PRODUCTS_DIR; };
 		1A1210FC11D3A5DA00F27B38 /* ANTLRCommonTokenTest-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "ANTLRCommonTokenTest-Info.plist"; sourceTree = "<group>"; };
 		1A1211D111D3BF4700F27B38 /* ANTLRStringStreamTest.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ANTLRStringStreamTest.octest; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -580,110 +598,110 @@
 		1A1212DD11D3F53600F27B38 /* ANTLRIntArrayTest-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "ANTLRIntArrayTest-Info.plist"; sourceTree = "<group>"; };
 		1A12130C11D3F7CD00F27B38 /* ANTLRCommonTreeTest.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ANTLRCommonTreeTest.octest; sourceTree = BUILT_PRODUCTS_DIR; };
 		1A12130D11D3F7CD00F27B38 /* ANTLRCommonTreeTest-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "ANTLRCommonTreeTest-Info.plist"; sourceTree = "<group>"; };
-		1A16B13A11C66492002860C7 /* ANTLRLinkBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRLinkBase.h; sourceTree = "<group>"; };
-		1A16B13B11C66492002860C7 /* ANTLRLinkBase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRLinkBase.m; sourceTree = "<group>"; };
-		1A1702FC11C05D4800F6978A /* ANTLRHashMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRHashMap.h; sourceTree = "<group>"; };
-		1A1702FD11C05D4800F6978A /* ANTLRHashMap.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRHashMap.m; sourceTree = "<group>"; };
-		1A18EF5511B8028D0006186A /* ANTLRBufferedTokenStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRBufferedTokenStream.h; sourceTree = "<group>"; };
-		1A18EF5611B8028D0006186A /* ANTLRBufferedTokenStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRBufferedTokenStream.m; sourceTree = "<group>"; };
-		1A1BCDB911CB01E60051A1EC /* ANTLRRuleReturnScope.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRRuleReturnScope.h; sourceTree = "<group>"; };
-		1A1BCDBA11CB01E60051A1EC /* ANTLRRuleReturnScope.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRRuleReturnScope.m; sourceTree = "<group>"; };
-		1A1BCDCD11CB0B3D0051A1EC /* ANTLRTreeRuleReturnScope.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRTreeRuleReturnScope.h; sourceTree = "<group>"; };
-		1A1BCDCE11CB0B3D0051A1EC /* ANTLRTreeRuleReturnScope.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRTreeRuleReturnScope.m; sourceTree = "<group>"; };
-		1A1BCE2811CB1A3E0051A1EC /* ANTLRTreeRewriter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRTreeRewriter.h; sourceTree = "<group>"; };
-		1A1BCE2911CB1A3E0051A1EC /* ANTLRTreeRewriter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRTreeRewriter.m; sourceTree = "<group>"; };
-		1A1CCC9011B6FD39002E5F53 /* ANTLRFastQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRFastQueue.h; sourceTree = "<group>"; };
-		1A1CCC9111B6FD39002E5F53 /* ANTLRFastQueue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRFastQueue.m; sourceTree = "<group>"; };
-		1A1CCC9211B6FD39002E5F53 /* ANTLRIntArray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRIntArray.h; sourceTree = "<group>"; };
-		1A1CCC9311B6FD39002E5F53 /* ANTLRIntArray.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRIntArray.m; sourceTree = "<group>"; };
-		1A1CCCA911B724B2002E5F53 /* ANTLRLookaheadStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRLookaheadStream.h; sourceTree = "<group>"; };
-		1A1CCCAA11B724B2002E5F53 /* ANTLRLookaheadStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRLookaheadStream.m; sourceTree = "<group>"; };
+		1A16B13A11C66492002860C7 /* LinkBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LinkBase.h; sourceTree = "<group>"; };
+		1A16B13B11C66492002860C7 /* LinkBase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LinkBase.m; sourceTree = "<group>"; };
+		1A1702FC11C05D4800F6978A /* HashMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HashMap.h; sourceTree = "<group>"; };
+		1A1702FD11C05D4800F6978A /* HashMap.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HashMap.m; sourceTree = "<group>"; };
+		1A18EF5511B8028D0006186A /* BufferedTokenStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BufferedTokenStream.h; sourceTree = "<group>"; };
+		1A18EF5611B8028D0006186A /* BufferedTokenStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BufferedTokenStream.m; sourceTree = "<group>"; };
+		1A1BCDB911CB01E60051A1EC /* RuleReturnScope.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RuleReturnScope.h; sourceTree = "<group>"; };
+		1A1BCDBA11CB01E60051A1EC /* RuleReturnScope.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RuleReturnScope.m; sourceTree = "<group>"; };
+		1A1BCDCD11CB0B3D0051A1EC /* TreeRuleReturnScope.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TreeRuleReturnScope.h; sourceTree = "<group>"; };
+		1A1BCDCE11CB0B3D0051A1EC /* TreeRuleReturnScope.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TreeRuleReturnScope.m; sourceTree = "<group>"; };
+		1A1BCE2811CB1A3E0051A1EC /* TreeRewriter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TreeRewriter.h; sourceTree = "<group>"; };
+		1A1BCE2911CB1A3E0051A1EC /* TreeRewriter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TreeRewriter.m; sourceTree = "<group>"; };
+		1A1CCC9011B6FD39002E5F53 /* FastQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FastQueue.h; sourceTree = "<group>"; };
+		1A1CCC9111B6FD39002E5F53 /* FastQueue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FastQueue.m; sourceTree = "<group>"; };
+		1A1CCC9211B6FD39002E5F53 /* IntArray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IntArray.h; sourceTree = "<group>"; };
+		1A1CCC9311B6FD39002E5F53 /* IntArray.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IntArray.m; sourceTree = "<group>"; };
+		1A1CCCA911B724B2002E5F53 /* LookaheadStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LookaheadStream.h; sourceTree = "<group>"; };
+		1A1CCCAA11B724B2002E5F53 /* LookaheadStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LookaheadStream.m; sourceTree = "<group>"; };
 		1A1CCCC711B727B5002E5F53 /* ANTLRError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRError.h; sourceTree = "<group>"; };
-		1A1D465911BE73B2001575F3 /* ANTLRBaseTreeAdaptor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRBaseTreeAdaptor.h; sourceTree = "<group>"; };
-		1A1D465A11BE73B2001575F3 /* ANTLRBaseTreeAdaptor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRBaseTreeAdaptor.m; sourceTree = "<group>"; };
-		1A1D466E11BE75C0001575F3 /* ANTLRMapElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRMapElement.h; sourceTree = "<group>"; };
-		1A1D466F11BE75C0001575F3 /* ANTLRMapElement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRMapElement.m; sourceTree = "<group>"; };
-		1A1D467A11BE8E5A001575F3 /* ANTLRCommonErrorNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRCommonErrorNode.h; sourceTree = "<group>"; };
-		1A1D467B11BE8E5A001575F3 /* ANTLRCommonErrorNode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRCommonErrorNode.m; sourceTree = "<group>"; };
-		1A1FFC5911CD12A400FBB452 /* ANTLRTokenRewriteStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRTokenRewriteStream.h; sourceTree = "<group>"; };
-		1A1FFC5A11CD12A400FBB452 /* ANTLRTokenRewriteStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRTokenRewriteStream.m; sourceTree = "<group>"; };
-		1A26329311C53578000DCDD4 /* ANTLRMismatchedNotSetException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRMismatchedNotSetException.h; sourceTree = "<group>"; };
-		1A26329411C53578000DCDD4 /* ANTLRMismatchedNotSetException.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRMismatchedNotSetException.m; sourceTree = "<group>"; };
-		1A270BF711C1451200DCC8F3 /* ANTLRTreeIterator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRTreeIterator.h; sourceTree = "<group>"; };
-		1A270BF811C1451200DCC8F3 /* ANTLRTreeIterator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRTreeIterator.m; sourceTree = "<group>"; };
+		1A1D465911BE73B2001575F3 /* BaseTreeAdaptor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BaseTreeAdaptor.h; sourceTree = "<group>"; };
+		1A1D465A11BE73B2001575F3 /* BaseTreeAdaptor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BaseTreeAdaptor.m; sourceTree = "<group>"; };
+		1A1D466E11BE75C0001575F3 /* MapElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MapElement.h; sourceTree = "<group>"; };
+		1A1D466F11BE75C0001575F3 /* MapElement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MapElement.m; sourceTree = "<group>"; };
+		1A1D467A11BE8E5A001575F3 /* CommonErrorNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CommonErrorNode.h; sourceTree = "<group>"; };
+		1A1D467B11BE8E5A001575F3 /* CommonErrorNode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CommonErrorNode.m; sourceTree = "<group>"; };
+		1A1FFC5911CD12A400FBB452 /* TokenRewriteStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TokenRewriteStream.h; sourceTree = "<group>"; };
+		1A1FFC5A11CD12A400FBB452 /* TokenRewriteStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TokenRewriteStream.m; sourceTree = "<group>"; };
+		1A26329311C53578000DCDD4 /* MismatchedNotSetException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MismatchedNotSetException.h; sourceTree = "<group>"; };
+		1A26329411C53578000DCDD4 /* MismatchedNotSetException.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MismatchedNotSetException.m; sourceTree = "<group>"; };
+		1A270BF711C1451200DCC8F3 /* TreeIterator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TreeIterator.h; sourceTree = "<group>"; };
+		1A270BF811C1451200DCC8F3 /* TreeIterator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TreeIterator.m; sourceTree = "<group>"; };
 		1A2B096312E797DE00A75133 /* TestRewriteRuleTokenStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TestRewriteRuleTokenStream.m; path = test/runtime/TestRewriteRuleTokenStream/TestRewriteRuleTokenStream.m; sourceTree = "<group>"; };
 		1A2B096612E797F600A75133 /* TestRewriteRuleTokenStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestRewriteRuleTokenStream.h; path = test/runtime/TestRewriteRuleTokenStream/TestRewriteRuleTokenStream.h; sourceTree = "<group>"; };
-		1A2D217311E4F57C00DFE328 /* ANTLRUniqueIDMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRUniqueIDMap.h; sourceTree = "<group>"; };
-		1A2D217411E4F57C00DFE328 /* ANTLRUniqueIDMap.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRUniqueIDMap.m; sourceTree = "<group>"; };
-		1A2D218411E502DE00DFE328 /* ANTLRNodeMapElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRNodeMapElement.h; sourceTree = "<group>"; };
-		1A2D218511E502DE00DFE328 /* ANTLRNodeMapElement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRNodeMapElement.m; sourceTree = "<group>"; };
-		1A348B1711D2BE4F000C72FC /* ANTLRFastQueueTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRFastQueueTest.h; sourceTree = "<group>"; };
-		1A348B1811D2BE4F000C72FC /* ANTLRFastQueueTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRFastQueueTest.m; sourceTree = "<group>"; };
-		1A348B1911D2BE4F000C72FC /* ANTLRIntArrayTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRIntArrayTest.h; sourceTree = "<group>"; };
-		1A348B1A11D2BE4F000C72FC /* ANTLRIntArrayTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRIntArrayTest.m; sourceTree = "<group>"; };
+		1A2D217311E4F57C00DFE328 /* UniqueIDMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UniqueIDMap.h; sourceTree = "<group>"; };
+		1A2D217411E4F57C00DFE328 /* UniqueIDMap.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UniqueIDMap.m; sourceTree = "<group>"; };
+		1A2D218411E502DE00DFE328 /* NodeMapElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NodeMapElement.h; sourceTree = "<group>"; };
+		1A2D218511E502DE00DFE328 /* NodeMapElement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NodeMapElement.m; sourceTree = "<group>"; };
+		1A348B1711D2BE4F000C72FC /* FastQueueTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FastQueueTest.h; sourceTree = "<group>"; };
+		1A348B1811D2BE4F000C72FC /* FastQueueTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FastQueueTest.m; sourceTree = "<group>"; };
+		1A348B1911D2BE4F000C72FC /* IntArrayTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IntArrayTest.h; sourceTree = "<group>"; };
+		1A348B1A11D2BE4F000C72FC /* IntArrayTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IntArrayTest.m; sourceTree = "<group>"; };
 		1A348B1C11D2BE4F000C72FC /* ANTLRBitSetTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRBitSetTest.h; sourceTree = "<group>"; };
 		1A348B1D11D2BE4F000C72FC /* ANTLRBitSetTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRBitSetTest.m; sourceTree = "<group>"; };
 		1A348B1F11D2BE4F000C72FC /* ANTLRStringStreamTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRStringStreamTest.h; sourceTree = "<group>"; };
 		1A348B2011D2BE4F000C72FC /* ANTLRStringStreamTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRStringStreamTest.m; sourceTree = "<group>"; };
-		1A348B2211D2BE4F000C72FC /* ANTLRCommonTokenTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRCommonTokenTest.h; sourceTree = "<group>"; };
-		1A348B2311D2BE4F000C72FC /* ANTLRCommonTokenTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRCommonTokenTest.m; sourceTree = "<group>"; };
-		1A348B2511D2BE4F000C72FC /* ANTLRCommonTreeTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRCommonTreeTest.h; sourceTree = "<group>"; };
-		1A348B2611D2BE4F000C72FC /* ANTLRCommonTreeTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRCommonTreeTest.m; sourceTree = "<group>"; };
+		1A348B2211D2BE4F000C72FC /* CommonTokenTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CommonTokenTest.h; sourceTree = "<group>"; };
+		1A348B2311D2BE4F000C72FC /* CommonTokenTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CommonTokenTest.m; sourceTree = "<group>"; };
+		1A348B2511D2BE4F000C72FC /* CommonTreeTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CommonTreeTest.h; sourceTree = "<group>"; };
+		1A348B2611D2BE4F000C72FC /* CommonTreeTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CommonTreeTest.m; sourceTree = "<group>"; };
 		1A348B4E11D2BEE8000C72FC /* Test.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Test.octest; sourceTree = BUILT_PRODUCTS_DIR; };
 		1A348B4F11D2BEE8000C72FC /* Test-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Test-Info.plist"; sourceTree = "<group>"; };
 		1A348BB511D2C711000C72FC /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
 		1A348BB711D2C711000C72FC /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = System/Library/Frameworks/CoreFoundation.framework; sourceTree = SDKROOT; };
 		1A348BEC11D2D0A1000C72FC /* ANTLRBitsetTest.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ANTLRBitsetTest.octest; sourceTree = BUILT_PRODUCTS_DIR; };
 		1A348BED11D2D0A1000C72FC /* ANTLRBitsetTest-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "ANTLRBitsetTest-Info.plist"; sourceTree = "<group>"; };
-		1A3A08E411E213C500D5EE26 /* ANTLRBaseStack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRBaseStack.h; sourceTree = "<group>"; };
-		1A3A08E511E213C500D5EE26 /* ANTLRBaseStack.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRBaseStack.m; sourceTree = "<group>"; };
-		1A3A08E811E213E100D5EE26 /* ANTLRSymbolStack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRSymbolStack.h; sourceTree = "<group>"; };
-		1A3A08E911E213E100D5EE26 /* ANTLRSymbolStack.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRSymbolStack.m; sourceTree = "<group>"; };
+		1A3A08E411E213C500D5EE26 /* BaseStack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BaseStack.h; sourceTree = "<group>"; };
+		1A3A08E511E213C500D5EE26 /* BaseStack.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BaseStack.m; sourceTree = "<group>"; };
+		1A3A08E811E213E100D5EE26 /* SymbolStack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SymbolStack.h; sourceTree = "<group>"; };
+		1A3A08E911E213E100D5EE26 /* SymbolStack.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SymbolStack.m; sourceTree = "<group>"; };
 		1A3A09BD11E235BD00D5EE26 /* antlr3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = antlr3.h; sourceTree = "<group>"; };
-		1A45657511C922BE0082F421 /* ANTLRRuleMemo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRRuleMemo.h; sourceTree = "<group>"; };
-		1A45657611C922BE0082F421 /* ANTLRRuleMemo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRRuleMemo.m; sourceTree = "<group>"; };
-		1A45658711C9270D0082F421 /* ANTLRBaseMapElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRBaseMapElement.h; sourceTree = "<group>"; };
-		1A45658811C9270D0082F421 /* ANTLRBaseMapElement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRBaseMapElement.m; sourceTree = "<group>"; };
-		1A4A851011CBCE3E00E4BF1B /* ANTLRTreeVisitor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRTreeVisitor.h; sourceTree = "<group>"; };
-		1A4A851111CBCE3E00E4BF1B /* ANTLRTreeVisitor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRTreeVisitor.m; sourceTree = "<group>"; };
-		1A4A851611CBCE5500E4BF1B /* ANTLRTreeVisitorAction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRTreeVisitorAction.h; sourceTree = "<group>"; };
-		1A4A851711CBCE5500E4BF1B /* ANTLRTreeVisitorAction.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRTreeVisitorAction.m; sourceTree = "<group>"; };
-		1A4A851C11CBCF3700E4BF1B /* ANTLRTreeWizard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRTreeWizard.h; sourceTree = "<group>"; };
-		1A4A851D11CBCF3700E4BF1B /* ANTLRTreeWizard.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRTreeWizard.m; sourceTree = "<group>"; };
-		1A4D5AD411B55A45001C9482 /* ANTLRBaseTree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRBaseTree.h; sourceTree = "<group>"; };
-		1A4D5AD511B55A45001C9482 /* ANTLRBaseTree.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRBaseTree.m; sourceTree = "<group>"; };
-		1A5EA50911CFE7CE00E8932F /* ANTLRMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRMap.h; sourceTree = "<group>"; };
-		1A5EA50A11CFE7CE00E8932F /* ANTLRMap.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRMap.m; sourceTree = "<group>"; };
-		1A65B7D611B9532A00FD8754 /* ANTLRBufferedTreeNodeStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRBufferedTreeNodeStream.h; sourceTree = "<group>"; };
-		1A65B7D711B9532A00FD8754 /* ANTLRBufferedTreeNodeStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRBufferedTreeNodeStream.m; sourceTree = "<group>"; };
-		1A6C451411BF4EE00039788A /* ANTLRMissingTokenException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRMissingTokenException.h; sourceTree = "<group>"; };
-		1A6C451511BF4EE00039788A /* ANTLRMissingTokenException.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRMissingTokenException.m; sourceTree = "<group>"; };
-		1A6C452611BF50A40039788A /* ANTLRUnwantedTokenException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRUnwantedTokenException.h; sourceTree = "<group>"; };
-		1A6C452711BF50A40039788A /* ANTLRUnwantedTokenException.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRUnwantedTokenException.m; sourceTree = "<group>"; };
+		1A45657511C922BE0082F421 /* RuleMemo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RuleMemo.h; sourceTree = "<group>"; };
+		1A45657611C922BE0082F421 /* RuleMemo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RuleMemo.m; sourceTree = "<group>"; };
+		1A45658711C9270D0082F421 /* BaseMapElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BaseMapElement.h; sourceTree = "<group>"; };
+		1A45658811C9270D0082F421 /* BaseMapElement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BaseMapElement.m; sourceTree = "<group>"; };
+		1A4A851011CBCE3E00E4BF1B /* TreeVisitor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TreeVisitor.h; sourceTree = "<group>"; };
+		1A4A851111CBCE3E00E4BF1B /* TreeVisitor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TreeVisitor.m; sourceTree = "<group>"; };
+		1A4A851611CBCE5500E4BF1B /* TreeVisitorAction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TreeVisitorAction.h; sourceTree = "<group>"; };
+		1A4A851711CBCE5500E4BF1B /* TreeVisitorAction.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TreeVisitorAction.m; sourceTree = "<group>"; };
+		1A4A851C11CBCF3700E4BF1B /* TreeWizard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TreeWizard.h; sourceTree = "<group>"; };
+		1A4A851D11CBCF3700E4BF1B /* TreeWizard.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TreeWizard.m; sourceTree = "<group>"; };
+		1A4D5AD411B55A45001C9482 /* BaseTree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BaseTree.h; sourceTree = "<group>"; };
+		1A4D5AD511B55A45001C9482 /* BaseTree.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BaseTree.m; sourceTree = "<group>"; };
+		1A5EA50911CFE7CE00E8932F /* Map.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Map.h; sourceTree = "<group>"; };
+		1A5EA50A11CFE7CE00E8932F /* Map.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Map.m; sourceTree = "<group>"; };
+		1A65B7D611B9532A00FD8754 /* BufferedTreeNodeStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BufferedTreeNodeStream.h; sourceTree = "<group>"; };
+		1A65B7D711B9532A00FD8754 /* BufferedTreeNodeStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BufferedTreeNodeStream.m; sourceTree = "<group>"; };
+		1A6C451411BF4EE00039788A /* MissingTokenException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MissingTokenException.h; sourceTree = "<group>"; };
+		1A6C451511BF4EE00039788A /* MissingTokenException.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MissingTokenException.m; sourceTree = "<group>"; };
+		1A6C452611BF50A40039788A /* UnwantedTokenException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnwantedTokenException.h; sourceTree = "<group>"; };
+		1A6C452711BF50A40039788A /* UnwantedTokenException.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UnwantedTokenException.m; sourceTree = "<group>"; };
 		1A77EE8912E6A552007F323A /* TreeRewriteRuleTokenStream.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TreeRewriteRuleTokenStream.octest; sourceTree = BUILT_PRODUCTS_DIR; };
 		1A77EE8A12E6A552007F323A /* TreeRewriteRuleTokenStream-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "TreeRewriteRuleTokenStream-Info.plist"; sourceTree = "<group>"; };
-		1A86B91911EB9F6300C67A03 /* ANTLRParseTree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRParseTree.h; sourceTree = "<group>"; };
-		1A86B91A11EB9F6300C67A03 /* ANTLRParseTree.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRParseTree.m; sourceTree = "<group>"; };
-		1A86BACD11EC1CD000C67A03 /* ANTLRUnbufferedTokenStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRUnbufferedTokenStream.h; sourceTree = "<group>"; };
-		1A86BACE11EC1CD000C67A03 /* ANTLRUnbufferedTokenStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRUnbufferedTokenStream.m; sourceTree = "<group>"; };
-		1A8ABFC511BA9B960038DBB0 /* ANTLRCharStreamState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRCharStreamState.h; sourceTree = "<group>"; };
-		1A8AC00A11BAEC710038DBB0 /* ANTLRRuntimeException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRRuntimeException.h; sourceTree = "<group>"; };
-		1A8AC00B11BAEC710038DBB0 /* ANTLRRuntimeException.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRRuntimeException.m; sourceTree = "<group>"; };
+		1A86B91911EB9F6300C67A03 /* ParseTree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ParseTree.h; sourceTree = "<group>"; };
+		1A86B91A11EB9F6300C67A03 /* ParseTree.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ParseTree.m; sourceTree = "<group>"; };
+		1A86BACD11EC1CD000C67A03 /* UnbufferedTokenStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnbufferedTokenStream.h; sourceTree = "<group>"; };
+		1A86BACE11EC1CD000C67A03 /* UnbufferedTokenStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UnbufferedTokenStream.m; sourceTree = "<group>"; };
+		1A8ABFC511BA9B960038DBB0 /* CharStreamState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CharStreamState.h; sourceTree = "<group>"; };
+		1A8AC00A11BAEC710038DBB0 /* RuntimeException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RuntimeException.h; sourceTree = "<group>"; };
+		1A8AC00B11BAEC710038DBB0 /* RuntimeException.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RuntimeException.m; sourceTree = "<group>"; };
 		1A994CE412A84F3E001853FF /* SimpleC__.gl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = SimpleC__.gl; sourceTree = "<group>"; };
-		1A9CBD2411C9979600DA8FEF /* ANTLRUnbufferedCommonTreeNodeStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRUnbufferedCommonTreeNodeStream.h; sourceTree = "<group>"; };
-		1A9CBD2511C9979600DA8FEF /* ANTLRUnbufferedCommonTreeNodeStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRUnbufferedCommonTreeNodeStream.m; sourceTree = "<group>"; };
-		1A9CBD2611C9979600DA8FEF /* ANTLRUnbufferedCommonTreeNodeStreamState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRUnbufferedCommonTreeNodeStreamState.h; sourceTree = "<group>"; };
-		1A9CBD2711C9979600DA8FEF /* ANTLRUnbufferedCommonTreeNodeStreamState.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRUnbufferedCommonTreeNodeStreamState.m; sourceTree = "<group>"; };
-		1AAC202A11CC621A00CF56D1 /* ANTLRTreePatternLexer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRTreePatternLexer.h; sourceTree = "<group>"; };
-		1AAC202B11CC621A00CF56D1 /* ANTLRTreePatternLexer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRTreePatternLexer.m; sourceTree = "<group>"; };
-		1AAC20A311CC790300CF56D1 /* ANTLRTreePatternParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRTreePatternParser.h; sourceTree = "<group>"; };
-		1AAC20A411CC790300CF56D1 /* ANTLRTreePatternParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRTreePatternParser.m; sourceTree = "<group>"; };
-		1AB4A58F11B9A0DA0076E91A /* ANTLRStreamEnumerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRStreamEnumerator.h; sourceTree = "<group>"; };
-		1AB4A59011B9A0DA0076E91A /* ANTLRStreamEnumerator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRStreamEnumerator.m; sourceTree = "<group>"; };
-		1AB5F47511E3869D00E065B0 /* ANTLRRuleMapElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRRuleMapElement.h; sourceTree = "<group>"; };
-		1AB5F47611E3869D00E065B0 /* ANTLRRuleMapElement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRRuleMapElement.m; sourceTree = "<group>"; };
-		1AB5F51C11E3BE2E00E065B0 /* ANTLRPtrBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRPtrBuffer.h; sourceTree = "<group>"; };
-		1AB5F51D11E3BE2E00E065B0 /* ANTLRPtrBuffer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRPtrBuffer.m; sourceTree = "<group>"; };
+		1A9CBD2411C9979600DA8FEF /* UnbufferedCommonTreeNodeStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnbufferedCommonTreeNodeStream.h; sourceTree = "<group>"; };
+		1A9CBD2511C9979600DA8FEF /* UnbufferedCommonTreeNodeStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UnbufferedCommonTreeNodeStream.m; sourceTree = "<group>"; };
+		1A9CBD2611C9979600DA8FEF /* UnbufferedCommonTreeNodeStreamState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnbufferedCommonTreeNodeStreamState.h; sourceTree = "<group>"; };
+		1A9CBD2711C9979600DA8FEF /* UnbufferedCommonTreeNodeStreamState.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UnbufferedCommonTreeNodeStreamState.m; sourceTree = "<group>"; };
+		1AAC202A11CC621A00CF56D1 /* TreePatternLexer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TreePatternLexer.h; sourceTree = "<group>"; };
+		1AAC202B11CC621A00CF56D1 /* TreePatternLexer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TreePatternLexer.m; sourceTree = "<group>"; };
+		1AAC20A311CC790300CF56D1 /* TreePatternParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TreePatternParser.h; sourceTree = "<group>"; };
+		1AAC20A411CC790300CF56D1 /* TreePatternParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TreePatternParser.m; sourceTree = "<group>"; };
+		1AB4A58F11B9A0DA0076E91A /* StreamEnumerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StreamEnumerator.h; sourceTree = "<group>"; };
+		1AB4A59011B9A0DA0076E91A /* StreamEnumerator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = StreamEnumerator.m; sourceTree = "<group>"; };
+		1AB5F47511E3869D00E065B0 /* RuleMapElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RuleMapElement.h; sourceTree = "<group>"; };
+		1AB5F47611E3869D00E065B0 /* RuleMapElement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RuleMapElement.m; sourceTree = "<group>"; };
+		1AB5F51C11E3BE2E00E065B0 /* PtrBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PtrBuffer.h; sourceTree = "<group>"; };
+		1AB5F51D11E3BE2E00E065B0 /* PtrBuffer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PtrBuffer.m; sourceTree = "<group>"; };
 		1AC5AC7212E7BBB600DF0C58 /* files */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = files; path = treeparser/files; sourceTree = "<group>"; };
 		1AC5AC7312E7BBB600DF0C58 /* input */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = input; path = treeparser/input; sourceTree = "<group>"; };
 		1AC5AC7412E7BBB600DF0C58 /* Lang.g */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = Lang.g; path = treeparser/Lang.g; sourceTree = "<group>"; };
@@ -702,73 +720,91 @@
 		1AC5ACCB12E7C03C00DF0C58 /* LangParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = LangParser.m; path = treeparser/LangParser.m; sourceTree = "<group>"; };
 		1ADB66F012E74341007C1661 /* FuzzyLexer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FuzzyLexer.h; sourceTree = "<group>"; };
 		1ADE21F012E505D700E8A95C /* SimpleC.g */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = SimpleC.g; sourceTree = "<group>"; };
-		1AE8A96A11D9227A00D36FD6 /* ANTLRRuleStack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRRuleStack.h; sourceTree = "<group>"; };
-		1AE8A96B11D9227A00D36FD6 /* ANTLRRuleStack.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRRuleStack.m; sourceTree = "<group>"; };
+		1AE8A96A11D9227A00D36FD6 /* RuleStack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RuleStack.h; sourceTree = "<group>"; };
+		1AE8A96B11D9227A00D36FD6 /* RuleStack.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RuleStack.m; sourceTree = "<group>"; };
 		32DBCF5E0370ADEE00C91783 /* ANTLR_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLR_Prefix.pch; sourceTree = "<group>"; };
 		8DC2EF5A0486A6940098B216 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
 		8DC2EF5B0486A6940098B216 /* ANTLR.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ANTLR.framework; sourceTree = BUILT_PRODUCTS_DIR; };
-		F7009AD90A1BE4AE002EDD5D /* ANTLRLexerRuleReturnScope.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRLexerRuleReturnScope.h; sourceTree = "<group>"; };
-		F7009ADA0A1BE4AE002EDD5D /* ANTLRLexerRuleReturnScope.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRLexerRuleReturnScope.m; sourceTree = "<group>"; };
-		F700E6190A5F66EC005D0757 /* ANTLREarlyExitException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLREarlyExitException.h; sourceTree = "<group>"; };
-		F700E61A0A5F66EC005D0757 /* ANTLREarlyExitException.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLREarlyExitException.m; sourceTree = "<group>"; };
+		BF7D9B511519363200B58218 /* ACBTree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ACBTree.h; sourceTree = "<group>"; };
+		BF7D9B521519363200B58218 /* ACBTree.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ACBTree.m; sourceTree = "<group>"; };
+		BF7D9B551519367800B58218 /* AMutableArray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AMutableArray.h; sourceTree = "<group>"; };
+		BF7D9B561519367800B58218 /* AMutableArray.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AMutableArray.m; sourceTree = "<group>"; };
+		BF7D9B591519368C00B58218 /* AMutableDictionary.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AMutableDictionary.h; sourceTree = "<group>"; };
+		BF7D9B5A1519368C00B58218 /* AMutableDictionary.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AMutableDictionary.m; sourceTree = "<group>"; };
+		BF7D9B5D151936B500B58218 /* DoubleKeyMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DoubleKeyMap.h; sourceTree = "<group>"; };
+		BF7D9B5E151936B600B58218 /* DoubleKeyMap.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DoubleKeyMap.m; sourceTree = "<group>"; };
+		BF7D9B61151936E700B58218 /* ANTLRFileStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRFileStream.h; sourceTree = "<group>"; };
+		BF7D9B62151936E700B58218 /* ANTLRFileStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRFileStream.m; sourceTree = "<group>"; };
+		BF7D9B65151936FB00B58218 /* ANTLRInputStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRInputStream.h; sourceTree = "<group>"; };
+		BF7D9B66151936FB00B58218 /* ANTLRInputStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRInputStream.m; sourceTree = "<group>"; };
+		BF7D9B691519371100B58218 /* ANTLRReaderStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRReaderStream.h; sourceTree = "<group>"; };
+		BF7D9B6A1519371200B58218 /* ANTLRReaderStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRReaderStream.m; sourceTree = "<group>"; };
+		BF7D9B6D1519373600B58218 /* RewriteRuleNodeStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RewriteRuleNodeStream.h; sourceTree = "<group>"; };
+		BF7D9B6E1519373600B58218 /* RewriteRuleNodeStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RewriteRuleNodeStream.m; sourceTree = "<group>"; };
+		BF7D9B711519375200B58218 /* ArrayIterator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ArrayIterator.h; sourceTree = "<group>"; };
+		BF7D9B721519375200B58218 /* ArrayIterator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ArrayIterator.m; sourceTree = "<group>"; };
+		F7009AD90A1BE4AE002EDD5D /* LexerRuleReturnScope.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LexerRuleReturnScope.h; sourceTree = "<group>"; };
+		F7009ADA0A1BE4AE002EDD5D /* LexerRuleReturnScope.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LexerRuleReturnScope.m; sourceTree = "<group>"; };
+		F700E6190A5F66EC005D0757 /* EarlyExitException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EarlyExitException.h; sourceTree = "<group>"; };
+		F700E61A0A5F66EC005D0757 /* EarlyExitException.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EarlyExitException.m; sourceTree = "<group>"; };
 		F700E85E0A5FA2DE005D0757 /* Combined.g */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; name = Combined.g; path = combined/Combined.g; sourceTree = "<group>"; };
 		F700E8640A5FA31D005D0757 /* combined */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = combined; sourceTree = BUILT_PRODUCTS_DIR; };
 		F700E86A0A5FA34D005D0757 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = combined/main.m; sourceTree = "<group>"; };
-		F700E8F90A5FAD21005D0757 /* ANTLRParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRParser.h; sourceTree = "<group>"; };
-		F700E8FA0A5FAD21005D0757 /* ANTLRParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRParser.m; sourceTree = "<group>"; };
+		F700E8F90A5FAD21005D0757 /* Parser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Parser.h; sourceTree = "<group>"; };
+		F700E8FA0A5FAD21005D0757 /* Parser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Parser.m; sourceTree = "<group>"; };
 		F700ECCF0A5FE176005D0757 /* input */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = input; sourceTree = "<group>"; };
 		F700ECD00A5FE176005D0757 /* output */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = output; sourceTree = "<group>"; };
 		F700ECD70A5FE186005D0757 /* LL-star */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "LL-star"; sourceTree = BUILT_PRODUCTS_DIR; };
 		F700ECE70A5FE25D005D0757 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
-		F700ED7E0A5FF17C005D0757 /* ANTLRTokenSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRTokenSource.h; sourceTree = "<group>"; };
-		F700ED940A5FF2A5005D0757 /* ANTLRCommonTokenStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRCommonTokenStream.h; sourceTree = "<group>"; };
-		F700ED950A5FF2A5005D0757 /* ANTLRCommonTokenStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRCommonTokenStream.m; sourceTree = "<group>"; };
-		F7037CEE0A0582FC0070435D /* ANTLRMismatchedRangeException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRMismatchedRangeException.h; sourceTree = "<group>"; };
-		F7037CEF0A0582FC0070435D /* ANTLRMismatchedRangeException.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRMismatchedRangeException.m; sourceTree = "<group>"; };
+		F700ED7E0A5FF17C005D0757 /* TokenSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TokenSource.h; sourceTree = "<group>"; };
+		F700ED940A5FF2A5005D0757 /* CommonTokenStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CommonTokenStream.h; sourceTree = "<group>"; };
+		F700ED950A5FF2A5005D0757 /* CommonTokenStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CommonTokenStream.m; sourceTree = "<group>"; };
+		F7037CEE0A0582FC0070435D /* MismatchedRangeException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MismatchedRangeException.h; sourceTree = "<group>"; };
+		F7037CEF0A0582FC0070435D /* MismatchedRangeException.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MismatchedRangeException.m; sourceTree = "<group>"; };
 		F7037EA00A05AFB60070435D /* lexertest-simple */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "lexertest-simple"; sourceTree = BUILT_PRODUCTS_DIR; };
 		F7037EBD0A05B06B0070435D /* TestLexer.g */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = TestLexer.g; sourceTree = "<group>"; };
-		F70380BA0A07FA0D0070435D /* ANTLRMismatchedSetException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRMismatchedSetException.h; sourceTree = "<group>"; };
-		F70380BB0A07FA0D0070435D /* ANTLRMismatchedSetException.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRMismatchedSetException.m; sourceTree = "<group>"; };
+		F70380BA0A07FA0D0070435D /* MismatchedSetException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MismatchedSetException.h; sourceTree = "<group>"; };
+		F70380BB0A07FA0D0070435D /* MismatchedSetException.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MismatchedSetException.m; sourceTree = "<group>"; };
 		F7048FF50B07D05400D2F326 /* Test.tokens */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Test.tokens; sourceTree = "<group>"; };
 		F7048FF60B07D05400D2F326 /* TestLexer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestLexer.h; sourceTree = "<group>"; };
 		F7048FF70B07D05400D2F326 /* TestLexer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TestLexer.m; sourceTree = "<group>"; };
 		F706A55B0A0EC307008999AB /* input */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = input; sourceTree = "<group>"; };
 		F70AA7A509AA2A6900C3FD5E /* ANTLR.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLR.h; sourceTree = "<group>"; };
-		F70AA7AD09AA2AC000C3FD5E /* ANTLRIntStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRIntStream.h; sourceTree = "<group>"; };
-		F70AA7B509AA2B8800C3FD5E /* ANTLRCharStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRCharStream.h; sourceTree = "<group>"; };
+		F70AA7AD09AA2AC000C3FD5E /* IntStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IntStream.h; sourceTree = "<group>"; };
+		F70AA7B509AA2B8800C3FD5E /* CharStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CharStream.h; sourceTree = "<group>"; };
 		F70AA7C509AA339900C3FD5E /* ANTLRStringStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRStringStream.h; sourceTree = "<group>"; };
 		F70AA7C609AA339900C3FD5E /* ANTLRStringStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRStringStream.m; sourceTree = "<group>"; };
-		F70AA7CE09AA379300C3FD5E /* ANTLRCharStreamState.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRCharStreamState.m; sourceTree = "<group>"; };
-		F70B11BB0C4C2B6400C3ECE0 /* ANTLRRewriteRuleSubtreeStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRRewriteRuleSubtreeStream.h; sourceTree = "<group>"; };
-		F70B11BC0C4C2B6400C3ECE0 /* ANTLRRewriteRuleSubtreeStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRRewriteRuleSubtreeStream.m; sourceTree = "<group>"; };
-		F70B11C10C4C2B7900C3ECE0 /* ANTLRRewriteRuleTokenStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRRewriteRuleTokenStream.h; sourceTree = "<group>"; };
-		F70B11C20C4C2B7900C3ECE0 /* ANTLRRewriteRuleTokenStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRRewriteRuleTokenStream.m; sourceTree = "<group>"; };
+		F70AA7CE09AA379300C3FD5E /* CharStreamState.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CharStreamState.m; sourceTree = "<group>"; };
+		F70B11BB0C4C2B6400C3ECE0 /* RewriteRuleSubtreeStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RewriteRuleSubtreeStream.h; sourceTree = "<group>"; };
+		F70B11BC0C4C2B6400C3ECE0 /* RewriteRuleSubtreeStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RewriteRuleSubtreeStream.m; sourceTree = "<group>"; };
+		F70B11C10C4C2B7900C3ECE0 /* RewriteRuleTokenStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RewriteRuleTokenStream.h; sourceTree = "<group>"; };
+		F70B11C20C4C2B7900C3ECE0 /* RewriteRuleTokenStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RewriteRuleTokenStream.m; sourceTree = "<group>"; };
 		F70BB390098E5BB80054FEF8 /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = Library/Frameworks/SenTestingKit.framework; sourceTree = DEVELOPER_DIR; };
-		F71325860C4A060900B99F2D /* ANTLRRewriteRuleElementStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRRewriteRuleElementStream.h; sourceTree = "<group>"; };
-		F71325870C4A060900B99F2D /* ANTLRRewriteRuleElementStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRRewriteRuleElementStream.m; sourceTree = "<group>"; };
+		F71325860C4A060900B99F2D /* RewriteRuleElementStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RewriteRuleElementStream.h; sourceTree = "<group>"; };
+		F71325870C4A060900B99F2D /* RewriteRuleElementStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RewriteRuleElementStream.m; sourceTree = "<group>"; };
 		F71F6B8F09A81E6F003221F4 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = /System/Library/Frameworks/CoreFoundation.framework; sourceTree = "<absolute>"; };
 		F72B8CFA0AD01D380013F1E2 /* Fuzzy.g */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = Fuzzy.g; sourceTree = "<group>"; };
 		F72B8D090AD01DCB0013F1E2 /* Fuzzy.tokens */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Fuzzy.tokens; sourceTree = "<group>"; };
 		F72B8D0B0AD01DCB0013F1E2 /* FuzzyLexer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FuzzyLexer.m; sourceTree = "<group>"; };
-		F72C58E80AB3911D00282574 /* ANTLRCommonTree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRCommonTree.h; sourceTree = "<group>"; };
-		F72C58E90AB3911D00282574 /* ANTLRCommonTree.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRCommonTree.m; sourceTree = "<group>"; };
-		F72C59A50AB4F20A00282574 /* ANTLRCommonTreeAdaptor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRCommonTreeAdaptor.h; sourceTree = "<group>"; };
-		F72C59A60AB4F20A00282574 /* ANTLRCommonTreeAdaptor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRCommonTreeAdaptor.m; sourceTree = "<group>"; };
-		F72C5B820AB52AD300282574 /* ANTLRTreeNodeStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRTreeNodeStream.h; sourceTree = "<group>"; };
-		F72C5D540AB63C1D00282574 /* ANTLRTreeParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRTreeParser.h; sourceTree = "<group>"; };
-		F72C5D550AB63C1D00282574 /* ANTLRTreeParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRTreeParser.m; sourceTree = "<group>"; };
-		F72C5D600AB63E0B00282574 /* ANTLRMismatchedTreeNodeException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRMismatchedTreeNodeException.h; sourceTree = "<group>"; };
-		F72C5D610AB63E0B00282574 /* ANTLRMismatchedTreeNodeException.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRMismatchedTreeNodeException.m; sourceTree = "<group>"; };
+		F72C58E80AB3911D00282574 /* CommonTree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CommonTree.h; sourceTree = "<group>"; };
+		F72C58E90AB3911D00282574 /* CommonTree.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CommonTree.m; sourceTree = "<group>"; };
+		F72C59A50AB4F20A00282574 /* CommonTreeAdaptor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CommonTreeAdaptor.h; sourceTree = "<group>"; };
+		F72C59A60AB4F20A00282574 /* CommonTreeAdaptor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CommonTreeAdaptor.m; sourceTree = "<group>"; };
+		F72C5B820AB52AD300282574 /* TreeNodeStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TreeNodeStream.h; sourceTree = "<group>"; };
+		F72C5D540AB63C1D00282574 /* TreeParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TreeParser.h; sourceTree = "<group>"; };
+		F72C5D550AB63C1D00282574 /* TreeParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TreeParser.m; sourceTree = "<group>"; };
+		F72C5D600AB63E0B00282574 /* MismatchedTreeNodeException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MismatchedTreeNodeException.h; sourceTree = "<group>"; };
+		F72C5D610AB63E0B00282574 /* MismatchedTreeNodeException.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MismatchedTreeNodeException.m; sourceTree = "<group>"; };
 		F72C5E2F0AB7529C00282574 /* input */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = input; sourceTree = "<group>"; };
 		F72C5E310AB7529C00282574 /* output */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = output; sourceTree = "<group>"; };
 		F72C5E560AB7E41000282574 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
 		F72C5E690AB7E4C900282574 /* simplectree */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = simplectree; sourceTree = BUILT_PRODUCTS_DIR; };
-		F72C5ECC0AB7E5A500282574 /* ANTLRParserRuleReturnScope.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRParserRuleReturnScope.h; sourceTree = "<group>"; };
-		F72C5ECD0AB7E5A500282574 /* ANTLRParserRuleReturnScope.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRParserRuleReturnScope.m; sourceTree = "<group>"; };
-		F738D1730B07AEAA001813C4 /* ANTLRFailedPredicateException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRFailedPredicateException.h; sourceTree = "<group>"; };
-		F738D1740B07AEAA001813C4 /* ANTLRFailedPredicateException.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRFailedPredicateException.m; sourceTree = "<group>"; };
-		F738D1750B07AEAA001813C4 /* ANTLRTreeException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRTreeException.h; sourceTree = "<group>"; };
-		F738D1760B07AEAA001813C4 /* ANTLRTreeException.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRTreeException.m; sourceTree = "<group>"; };
+		F72C5ECC0AB7E5A500282574 /* ParserRuleReturnScope.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ParserRuleReturnScope.h; sourceTree = "<group>"; };
+		F72C5ECD0AB7E5A500282574 /* ParserRuleReturnScope.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ParserRuleReturnScope.m; sourceTree = "<group>"; };
+		F738D1730B07AEAA001813C4 /* FailedPredicateException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FailedPredicateException.h; sourceTree = "<group>"; };
+		F738D1740B07AEAA001813C4 /* FailedPredicateException.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FailedPredicateException.m; sourceTree = "<group>"; };
+		F738D1750B07AEAA001813C4 /* TreeException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TreeException.h; sourceTree = "<group>"; };
+		F738D1760B07AEAA001813C4 /* TreeException.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TreeException.m; sourceTree = "<group>"; };
 		F738D1FD0B07B1CE001813C4 /* SymbolTable.tokens */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = SymbolTable.tokens; sourceTree = "<group>"; };
 		F738D1FE0B07B1CE001813C4 /* SymbolTableLexer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SymbolTableLexer.h; sourceTree = "<group>"; };
 		F738D1FF0B07B1CE001813C4 /* SymbolTableLexer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SymbolTableLexer.m; sourceTree = "<group>"; };
@@ -786,13 +822,13 @@
 		F738D35E0B07C105001813C4 /* CombinedLexer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CombinedLexer.m; path = combined/CombinedLexer.m; sourceTree = "<group>"; };
 		F738D35F0B07C105001813C4 /* CombinedParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CombinedParser.h; path = combined/CombinedParser.h; sourceTree = "<group>"; };
 		F738D3600B07C105001813C4 /* CombinedParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CombinedParser.m; path = combined/CombinedParser.m; sourceTree = "<group>"; };
-		F73E2B720A9CFE6A005D6267 /* ANTLRTree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRTree.h; sourceTree = "<group>"; };
-		F73E2B7A0A9D0AFC005D6267 /* ANTLRTreeAdaptor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRTreeAdaptor.h; sourceTree = "<group>"; };
+		F73E2B720A9CFE6A005D6267 /* Tree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Tree.h; sourceTree = "<group>"; };
+		F73E2B7A0A9D0AFC005D6267 /* TreeAdaptor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TreeAdaptor.h; sourceTree = "<group>"; };
 		F741D0640B3812D40024DF3F /* SimpleCWalker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleCWalker.h; sourceTree = "<group>"; };
 		F741D0650B3812D40024DF3F /* SimpleCWalker.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleCWalker.m; sourceTree = "<group>"; };
 		F762879C0B71578D006AA7EF /* README.rtf */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.rtf; path = README.rtf; sourceTree = "<group>"; };
-		F76AA98E0CEA515A00AF044C /* ANTLRCommonTreeNodeStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRCommonTreeNodeStream.h; sourceTree = "<group>"; };
-		F76AA98F0CEA515A00AF044C /* ANTLRCommonTreeNodeStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRCommonTreeNodeStream.m; sourceTree = "<group>"; };
+		F76AA98E0CEA515A00AF044C /* CommonTreeNodeStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CommonTreeNodeStream.h; sourceTree = "<group>"; };
+		F76AA98F0CEA515A00AF044C /* CommonTreeNodeStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CommonTreeNodeStream.m; sourceTree = "<group>"; };
 		F7715D1A0AC9DCE400ED984D /* SimpleC.g */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = SimpleC.g; sourceTree = "<group>"; };
 		F7715D1B0AC9DCE500ED984D /* SimpleCWalker.g */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = SimpleCWalker.g; sourceTree = "<group>"; };
 		F7715D1C0AC9DDD800ED984D /* SimpleC.tokens */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = SimpleC.tokens; sourceTree = "<group>"; };
@@ -801,29 +837,29 @@
 		F7715D2F0AC9DE9E00ED984D /* SimpleCLexer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleCLexer.m; sourceTree = "<group>"; };
 		F7715D300AC9DE9E00ED984D /* SimpleCParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleCParser.h; sourceTree = "<group>"; };
 		F7715D310AC9DE9E00ED984D /* SimpleCParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleCParser.m; sourceTree = "<group>"; };
-		F7754E3D0A5C0A0500D0873A /* ANTLRDFA.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRDFA.h; sourceTree = "<group>"; };
-		F7754E3E0A5C0A0500D0873A /* ANTLRDFA.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRDFA.m; sourceTree = "<group>"; };
-		F77744030B234A3400D1F89B /* ANTLRToken+DebuggerSupport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ANTLRToken+DebuggerSupport.h"; sourceTree = "<group>"; };
-		F77744040B234A3400D1F89B /* ANTLRToken+DebuggerSupport.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "ANTLRToken+DebuggerSupport.m"; sourceTree = "<group>"; };
-		F77747550B23A70600D1F89B /* ANTLRDebug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRDebug.h; sourceTree = "<group>"; };
-		F77765CA09DC583000517181 /* ANTLRToken.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRToken.h; sourceTree = "<group>"; };
-		F777660309DC5CF400517181 /* ANTLRCommonToken.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRCommonToken.h; sourceTree = "<group>"; };
-		F777660409DC5CF400517181 /* ANTLRCommonToken.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRCommonToken.m; sourceTree = "<group>"; };
-		F777668009DC719C00517181 /* ANTLRMismatchedTokenException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRMismatchedTokenException.h; sourceTree = "<group>"; };
-		F777668109DC719C00517181 /* ANTLRMismatchedTokenException.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRMismatchedTokenException.m; sourceTree = "<group>"; };
-		F777669109DC72D600517181 /* ANTLRRecognitionException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRRecognitionException.h; sourceTree = "<group>"; };
-		F777669209DC72D600517181 /* ANTLRRecognitionException.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRRecognitionException.m; sourceTree = "<group>"; };
-		F77766AE09DD53E800517181 /* ANTLRTokenStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRTokenStream.h; sourceTree = "<group>"; };
+		F7754E3D0A5C0A0500D0873A /* DFA.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DFA.h; sourceTree = "<group>"; };
+		F7754E3E0A5C0A0500D0873A /* DFA.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DFA.m; sourceTree = "<group>"; };
+		F77744030B234A3400D1F89B /* Token+DebuggerSupport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "Token+DebuggerSupport.h"; sourceTree = "<group>"; };
+		F77744040B234A3400D1F89B /* Token+DebuggerSupport.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "Token+DebuggerSupport.m"; sourceTree = "<group>"; };
+		F77747550B23A70600D1F89B /* Debug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Debug.h; sourceTree = "<group>"; };
+		F77765CA09DC583000517181 /* Token.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Token.h; sourceTree = "<group>"; };
+		F777660309DC5CF400517181 /* CommonToken.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CommonToken.h; sourceTree = "<group>"; };
+		F777660409DC5CF400517181 /* CommonToken.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CommonToken.m; sourceTree = "<group>"; };
+		F777668009DC719C00517181 /* MismatchedTokenException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MismatchedTokenException.h; sourceTree = "<group>"; };
+		F777668109DC719C00517181 /* MismatchedTokenException.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MismatchedTokenException.m; sourceTree = "<group>"; };
+		F777669109DC72D600517181 /* RecognitionException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RecognitionException.h; sourceTree = "<group>"; };
+		F777669209DC72D600517181 /* RecognitionException.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RecognitionException.m; sourceTree = "<group>"; };
+		F77766AE09DD53E800517181 /* TokenStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TokenStream.h; sourceTree = "<group>"; };
 		F79D56600A0E23A400EA3CEE /* fuzzy */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = fuzzy; sourceTree = BUILT_PRODUCTS_DIR; };
 		F79D56C00A0E287500EA3CEE /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
-		F79D59890A0E51AB00EA3CEE /* ANTLRNoViableAltException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRNoViableAltException.h; sourceTree = "<group>"; };
-		F79D598A0A0E51AB00EA3CEE /* ANTLRNoViableAltException.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRNoViableAltException.m; sourceTree = "<group>"; };
-		F7A4098B09659BF3002CC781 /* ANTLRBaseRecognizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRBaseRecognizer.h; sourceTree = "<group>"; };
-		F7A4098C09659BF3002CC781 /* ANTLRBaseRecognizer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRBaseRecognizer.m; sourceTree = "<group>"; };
-		F7A4099109659BFB002CC781 /* ANTLRLexer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRLexer.h; sourceTree = "<group>"; };
-		F7A4099209659BFB002CC781 /* ANTLRLexer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRLexer.m; sourceTree = "<group>"; };
-		F7B1E5AC0CD7CF1900CE136E /* ANTLRRecognizerSharedState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRRecognizerSharedState.h; sourceTree = "<group>"; };
-		F7B1E5AD0CD7CF1900CE136E /* ANTLRRecognizerSharedState.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRRecognizerSharedState.m; sourceTree = "<group>"; };
+		F79D59890A0E51AB00EA3CEE /* NoViableAltException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NoViableAltException.h; sourceTree = "<group>"; };
+		F79D598A0A0E51AB00EA3CEE /* NoViableAltException.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NoViableAltException.m; sourceTree = "<group>"; };
+		F7A4098B09659BF3002CC781 /* BaseRecognizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BaseRecognizer.h; sourceTree = "<group>"; };
+		F7A4098C09659BF3002CC781 /* BaseRecognizer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BaseRecognizer.m; sourceTree = "<group>"; };
+		F7A4099109659BFB002CC781 /* Lexer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Lexer.h; sourceTree = "<group>"; };
+		F7A4099209659BFB002CC781 /* Lexer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Lexer.m; sourceTree = "<group>"; };
+		F7B1E5AC0CD7CF1900CE136E /* RecognizerSharedState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RecognizerSharedState.h; sourceTree = "<group>"; };
+		F7B1E5AD0CD7CF1900CE136E /* RecognizerSharedState.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RecognizerSharedState.m; sourceTree = "<group>"; };
 		F7CD45FC0C64BA4B00FF933A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
 		F7CD45FD0C64BA4B00FF933A /* TreeRewrite.g */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = TreeRewrite.g; sourceTree = "<group>"; };
 		F7CD46340C64BB7300FF933A /* TreeRewrite.tokens */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = TreeRewrite.tokens; sourceTree = "<group>"; };
@@ -832,7 +868,7 @@
 		F7CD46370C64BB7300FF933A /* TreeRewriteParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TreeRewriteParser.h; sourceTree = "<group>"; };
 		F7CD46380C64BB7300FF933A /* TreeRewriteParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TreeRewriteParser.m; sourceTree = "<group>"; };
 		F7CD475D0C64D22800FF933A /* treerewrite */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = treerewrite; sourceTree = BUILT_PRODUCTS_DIR; };
-		F7CECD7D0B1E5C370054CC3B /* ANTLRDebugEventListener.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRDebugEventListener.h; sourceTree = "<group>"; };
+		F7CECD7D0B1E5C370054CC3B /* DebugEventListener.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DebugEventListener.h; sourceTree = "<group>"; };
 		F7DD05E20A7B14BE006A006C /* input */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = input; sourceTree = "<group>"; };
 		F7DD05E30A7B14BE006A006C /* output */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = output; sourceTree = "<group>"; };
 		F7DD05E40A7B14BE006A006C /* T.g */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = T.g; sourceTree = "<group>"; };
@@ -845,18 +881,18 @@
 		F7DD073E0A7B660A006A006C /* SymbolTable.g */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = SymbolTable.g; sourceTree = "<group>"; };
 		F7DD07440A7B6618006A006C /* scopes */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = scopes; sourceTree = BUILT_PRODUCTS_DIR; };
 		F7DD07800A7B67A7006A006C /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
-		F7E261140B1E44320013F640 /* ANTLRDebugParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRDebugParser.h; sourceTree = "<group>"; };
-		F7E261150B1E44320013F640 /* ANTLRDebugParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRDebugParser.m; sourceTree = "<group>"; };
-		F7E261180B1E443C0013F640 /* ANTLRDebugTreeParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRDebugTreeParser.h; sourceTree = "<group>"; };
-		F7E261190B1E443C0013F640 /* ANTLRDebugTreeParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRDebugTreeParser.m; sourceTree = "<group>"; };
-		F7E2611E0B1E44E80013F640 /* ANTLRDebugTokenStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRDebugTokenStream.h; sourceTree = "<group>"; };
-		F7E2611F0B1E44E80013F640 /* ANTLRDebugTokenStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRDebugTokenStream.m; sourceTree = "<group>"; };
-		F7E261220B1E44FA0013F640 /* ANTLRDebugTreeNodeStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRDebugTreeNodeStream.h; sourceTree = "<group>"; };
-		F7E261230B1E44FA0013F640 /* ANTLRDebugTreeNodeStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRDebugTreeNodeStream.m; sourceTree = "<group>"; };
-		F7E261260B1E45070013F640 /* ANTLRDebugTreeAdaptor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRDebugTreeAdaptor.h; sourceTree = "<group>"; };
-		F7E261270B1E45070013F640 /* ANTLRDebugTreeAdaptor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRDebugTreeAdaptor.m; sourceTree = "<group>"; };
-		F7E261370B1E45580013F640 /* ANTLRDebugEventProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRDebugEventProxy.h; sourceTree = "<group>"; };
-		F7E261380B1E45580013F640 /* ANTLRDebugEventProxy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANTLRDebugEventProxy.m; sourceTree = "<group>"; };
+		F7E261140B1E44320013F640 /* DebugParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DebugParser.h; sourceTree = "<group>"; };
+		F7E261150B1E44320013F640 /* DebugParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DebugParser.m; sourceTree = "<group>"; };
+		F7E261180B1E443C0013F640 /* DebugTreeParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DebugTreeParser.h; sourceTree = "<group>"; };
+		F7E261190B1E443C0013F640 /* DebugTreeParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DebugTreeParser.m; sourceTree = "<group>"; };
+		F7E2611E0B1E44E80013F640 /* DebugTokenStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DebugTokenStream.h; sourceTree = "<group>"; };
+		F7E2611F0B1E44E80013F640 /* DebugTokenStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DebugTokenStream.m; sourceTree = "<group>"; };
+		F7E261220B1E44FA0013F640 /* DebugTreeNodeStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DebugTreeNodeStream.h; sourceTree = "<group>"; };
+		F7E261230B1E44FA0013F640 /* DebugTreeNodeStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DebugTreeNodeStream.m; sourceTree = "<group>"; };
+		F7E261260B1E45070013F640 /* DebugTreeAdaptor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DebugTreeAdaptor.h; sourceTree = "<group>"; };
+		F7E261270B1E45070013F640 /* DebugTreeAdaptor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DebugTreeAdaptor.m; sourceTree = "<group>"; };
+		F7E261370B1E45580013F640 /* DebugEventSocketProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DebugEventSocketProxy.h; sourceTree = "<group>"; };
+		F7E261380B1E45580013F640 /* DebugEventSocketProxy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DebugEventSocketProxy.m; sourceTree = "<group>"; };
 		F7E983940A0D6A5F00F16093 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
 		F7EFFC8B0D164E2C008EE57E /* CHANGES.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CHANGES.txt; sourceTree = "<group>"; };
 		F7F218EE097AFB1A000472E9 /* ANTLRBitSet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANTLRBitSet.h; sourceTree = "<group>"; };
@@ -1191,14 +1227,14 @@
 		1A1BCDC011CB04D20051A1EC /* Rules */ = {
 			isa = PBXGroup;
 			children = (
-				1AB5F47511E3869D00E065B0 /* ANTLRRuleMapElement.h */,
-				1AB5F47611E3869D00E065B0 /* ANTLRRuleMapElement.m */,
-				F72C5ECC0AB7E5A500282574 /* ANTLRParserRuleReturnScope.h */,
-				F72C5ECD0AB7E5A500282574 /* ANTLRParserRuleReturnScope.m */,
-				1A1BCDB911CB01E60051A1EC /* ANTLRRuleReturnScope.h */,
-				1A1BCDBA11CB01E60051A1EC /* ANTLRRuleReturnScope.m */,
-				1A1BCDCD11CB0B3D0051A1EC /* ANTLRTreeRuleReturnScope.h */,
-				1A1BCDCE11CB0B3D0051A1EC /* ANTLRTreeRuleReturnScope.m */,
+				1AB5F47511E3869D00E065B0 /* RuleMapElement.h */,
+				1AB5F47611E3869D00E065B0 /* RuleMapElement.m */,
+				F72C5ECC0AB7E5A500282574 /* ParserRuleReturnScope.h */,
+				F72C5ECD0AB7E5A500282574 /* ParserRuleReturnScope.m */,
+				1A1BCDB911CB01E60051A1EC /* RuleReturnScope.h */,
+				1A1BCDBA11CB01E60051A1EC /* RuleReturnScope.m */,
+				1A1BCDCD11CB0B3D0051A1EC /* TreeRuleReturnScope.h */,
+				1A1BCDCE11CB0B3D0051A1EC /* TreeRuleReturnScope.m */,
 			);
 			name = Rules;
 			sourceTree = "<group>";
@@ -1227,10 +1263,10 @@
 		1A348B1611D2BE4F000C72FC /* misc */ = {
 			isa = PBXGroup;
 			children = (
-				1A348B1711D2BE4F000C72FC /* ANTLRFastQueueTest.h */,
-				1A348B1811D2BE4F000C72FC /* ANTLRFastQueueTest.m */,
-				1A348B1911D2BE4F000C72FC /* ANTLRIntArrayTest.h */,
-				1A348B1A11D2BE4F000C72FC /* ANTLRIntArrayTest.m */,
+				1A348B1711D2BE4F000C72FC /* FastQueueTest.h */,
+				1A348B1811D2BE4F000C72FC /* FastQueueTest.m */,
+				1A348B1911D2BE4F000C72FC /* IntArrayTest.h */,
+				1A348B1A11D2BE4F000C72FC /* IntArrayTest.m */,
 			);
 			path = misc;
 			sourceTree = "<group>";
@@ -1256,8 +1292,8 @@
 		1A348B2111D2BE4F000C72FC /* token */ = {
 			isa = PBXGroup;
 			children = (
-				1A348B2211D2BE4F000C72FC /* ANTLRCommonTokenTest.h */,
-				1A348B2311D2BE4F000C72FC /* ANTLRCommonTokenTest.m */,
+				1A348B2211D2BE4F000C72FC /* CommonTokenTest.h */,
+				1A348B2311D2BE4F000C72FC /* CommonTokenTest.m */,
 			);
 			path = token;
 			sourceTree = "<group>";
@@ -1265,8 +1301,8 @@
 		1A348B2411D2BE4F000C72FC /* tree */ = {
 			isa = PBXGroup;
 			children = (
-				1A348B2511D2BE4F000C72FC /* ANTLRCommonTreeTest.h */,
-				1A348B2611D2BE4F000C72FC /* ANTLRCommonTreeTest.m */,
+				1A348B2511D2BE4F000C72FC /* CommonTreeTest.h */,
+				1A348B2611D2BE4F000C72FC /* CommonTreeTest.m */,
 			);
 			path = tree;
 			sourceTree = "<group>";
@@ -1310,7 +1346,7 @@
 				1A1CCCC711B727B5002E5F53 /* ANTLRError.h */,
 				32DBCF5E0370ADEE00C91783 /* ANTLR_Prefix.pch */,
 				F70AA7A509AA2A6900C3FD5E /* ANTLR.h */,
-				F77747550B23A70600D1F89B /* ANTLRDebug.h */,
+				F77747550B23A70600D1F89B /* Debug.h */,
 			);
 			name = "Other Sources";
 			sourceTree = "<group>";
@@ -1379,24 +1415,32 @@
 			isa = PBXGroup;
 			children = (
 				F71325850C4A05DC00B99F2D /* Trees */,
-				F70AA7B509AA2B8800C3FD5E /* ANTLRCharStream.h */,
-				1A18EF5511B8028D0006186A /* ANTLRBufferedTokenStream.h */,
-				1A18EF5611B8028D0006186A /* ANTLRBufferedTokenStream.m */,
-				F700ED940A5FF2A5005D0757 /* ANTLRCommonTokenStream.h */,
-				F700ED950A5FF2A5005D0757 /* ANTLRCommonTokenStream.m */,
-				F70AA7AD09AA2AC000C3FD5E /* ANTLRIntStream.h */,
-				1A1CCCA911B724B2002E5F53 /* ANTLRLookaheadStream.h */,
-				1A1CCCAA11B724B2002E5F53 /* ANTLRLookaheadStream.m */,
-				1AB4A58F11B9A0DA0076E91A /* ANTLRStreamEnumerator.h */,
-				1AB4A59011B9A0DA0076E91A /* ANTLRStreamEnumerator.m */,
+				F70AA7B509AA2B8800C3FD5E /* CharStream.h */,
+				1A18EF5511B8028D0006186A /* BufferedTokenStream.h */,
+				1A18EF5611B8028D0006186A /* BufferedTokenStream.m */,
+				F700ED940A5FF2A5005D0757 /* CommonTokenStream.h */,
+				F700ED950A5FF2A5005D0757 /* CommonTokenStream.m */,
+				F70AA7AD09AA2AC000C3FD5E /* IntStream.h */,
+				1A1CCCA911B724B2002E5F53 /* LookaheadStream.h */,
+				1A1CCCAA11B724B2002E5F53 /* LookaheadStream.m */,
+				1AB4A58F11B9A0DA0076E91A /* StreamEnumerator.h */,
+				1AB4A59011B9A0DA0076E91A /* StreamEnumerator.m */,
+				BF7D9B65151936FB00B58218 /* ANTLRInputStream.h */,
+				BF7D9B66151936FB00B58218 /* ANTLRInputStream.m */,
+				BF7D9B61151936E700B58218 /* ANTLRFileStream.h */,
+				BF7D9B62151936E700B58218 /* ANTLRFileStream.m */,
+				BF7D9B691519371100B58218 /* ANTLRReaderStream.h */,
+				BF7D9B6A1519371200B58218 /* ANTLRReaderStream.m */,
 				F70AA7C509AA339900C3FD5E /* ANTLRStringStream.h */,
 				F70AA7C609AA339900C3FD5E /* ANTLRStringStream.m */,
-				F700ED7E0A5FF17C005D0757 /* ANTLRTokenSource.h */,
-				F77766AE09DD53E800517181 /* ANTLRTokenStream.h */,
-				1A1FFC5911CD12A400FBB452 /* ANTLRTokenRewriteStream.h */,
-				1A1FFC5A11CD12A400FBB452 /* ANTLRTokenRewriteStream.m */,
-				1A86BACD11EC1CD000C67A03 /* ANTLRUnbufferedTokenStream.h */,
-				1A86BACE11EC1CD000C67A03 /* ANTLRUnbufferedTokenStream.m */,
+				BF7D9B6D1519373600B58218 /* RewriteRuleNodeStream.h */,
+				BF7D9B6E1519373600B58218 /* RewriteRuleNodeStream.m */,
+				F700ED7E0A5FF17C005D0757 /* TokenSource.h */,
+				F77766AE09DD53E800517181 /* TokenStream.h */,
+				1A1FFC5911CD12A400FBB452 /* TokenRewriteStream.h */,
+				1A1FFC5A11CD12A400FBB452 /* TokenRewriteStream.m */,
+				1A86BACD11EC1CD000C67A03 /* UnbufferedTokenStream.h */,
+				1A86BACE11EC1CD000C67A03 /* UnbufferedTokenStream.m */,
 			);
 			name = Streams;
 			sourceTree = "<group>";
@@ -1404,21 +1448,21 @@
 		F71325850C4A05DC00B99F2D /* Trees */ = {
 			isa = PBXGroup;
 			children = (
-				1A9CBD2411C9979600DA8FEF /* ANTLRUnbufferedCommonTreeNodeStream.h */,
-				1A9CBD2511C9979600DA8FEF /* ANTLRUnbufferedCommonTreeNodeStream.m */,
-				1A9CBD2611C9979600DA8FEF /* ANTLRUnbufferedCommonTreeNodeStreamState.h */,
-				1A9CBD2711C9979600DA8FEF /* ANTLRUnbufferedCommonTreeNodeStreamState.m */,
-				F72C5B820AB52AD300282574 /* ANTLRTreeNodeStream.h */,
-				1A65B7D611B9532A00FD8754 /* ANTLRBufferedTreeNodeStream.h */,
-				1A65B7D711B9532A00FD8754 /* ANTLRBufferedTreeNodeStream.m */,
-				F76AA98E0CEA515A00AF044C /* ANTLRCommonTreeNodeStream.h */,
-				F76AA98F0CEA515A00AF044C /* ANTLRCommonTreeNodeStream.m */,
-				F71325860C4A060900B99F2D /* ANTLRRewriteRuleElementStream.h */,
-				F71325870C4A060900B99F2D /* ANTLRRewriteRuleElementStream.m */,
-				F70B11BB0C4C2B6400C3ECE0 /* ANTLRRewriteRuleSubtreeStream.h */,
-				F70B11BC0C4C2B6400C3ECE0 /* ANTLRRewriteRuleSubtreeStream.m */,
-				F70B11C10C4C2B7900C3ECE0 /* ANTLRRewriteRuleTokenStream.h */,
-				F70B11C20C4C2B7900C3ECE0 /* ANTLRRewriteRuleTokenStream.m */,
+				1A9CBD2411C9979600DA8FEF /* UnbufferedCommonTreeNodeStream.h */,
+				1A9CBD2511C9979600DA8FEF /* UnbufferedCommonTreeNodeStream.m */,
+				1A9CBD2611C9979600DA8FEF /* UnbufferedCommonTreeNodeStreamState.h */,
+				1A9CBD2711C9979600DA8FEF /* UnbufferedCommonTreeNodeStreamState.m */,
+				F72C5B820AB52AD300282574 /* TreeNodeStream.h */,
+				1A65B7D611B9532A00FD8754 /* BufferedTreeNodeStream.h */,
+				1A65B7D711B9532A00FD8754 /* BufferedTreeNodeStream.m */,
+				F76AA98E0CEA515A00AF044C /* CommonTreeNodeStream.h */,
+				F76AA98F0CEA515A00AF044C /* CommonTreeNodeStream.m */,
+				F71325860C4A060900B99F2D /* RewriteRuleElementStream.h */,
+				F71325870C4A060900B99F2D /* RewriteRuleElementStream.m */,
+				F70B11BB0C4C2B6400C3ECE0 /* RewriteRuleSubtreeStream.h */,
+				F70B11BC0C4C2B6400C3ECE0 /* RewriteRuleSubtreeStream.m */,
+				F70B11C10C4C2B7900C3ECE0 /* RewriteRuleTokenStream.h */,
+				F70B11C20C4C2B7900C3ECE0 /* RewriteRuleTokenStream.m */,
 			);
 			name = Trees;
 			sourceTree = "<group>";
@@ -1446,32 +1490,34 @@
 		F73E2B590A9CF83A005D6267 /* Trees */ = {
 			isa = PBXGroup;
 			children = (
-				1A1D465911BE73B2001575F3 /* ANTLRBaseTreeAdaptor.h */,
-				1A1D465A11BE73B2001575F3 /* ANTLRBaseTreeAdaptor.m */,
-				1A4D5AD411B55A45001C9482 /* ANTLRBaseTree.h */,
-				1A4D5AD511B55A45001C9482 /* ANTLRBaseTree.m */,
-				1A8ABFC511BA9B960038DBB0 /* ANTLRCharStreamState.h */,
-				F70AA7CE09AA379300C3FD5E /* ANTLRCharStreamState.m */,
-				F72C58E80AB3911D00282574 /* ANTLRCommonTree.h */,
-				F72C58E90AB3911D00282574 /* ANTLRCommonTree.m */,
-				F72C59A50AB4F20A00282574 /* ANTLRCommonTreeAdaptor.h */,
-				F72C59A60AB4F20A00282574 /* ANTLRCommonTreeAdaptor.m */,
-				F73E2B720A9CFE6A005D6267 /* ANTLRTree.h */,
-				F73E2B7A0A9D0AFC005D6267 /* ANTLRTreeAdaptor.h */,
-				1A270BF711C1451200DCC8F3 /* ANTLRTreeIterator.h */,
-				1A270BF811C1451200DCC8F3 /* ANTLRTreeIterator.m */,
-				1AAC202A11CC621A00CF56D1 /* ANTLRTreePatternLexer.h */,
-				1AAC202B11CC621A00CF56D1 /* ANTLRTreePatternLexer.m */,
-				1AAC20A311CC790300CF56D1 /* ANTLRTreePatternParser.h */,
-				1AAC20A411CC790300CF56D1 /* ANTLRTreePatternParser.m */,
-				1A1BCE2811CB1A3E0051A1EC /* ANTLRTreeRewriter.h */,
-				1A1BCE2911CB1A3E0051A1EC /* ANTLRTreeRewriter.m */,
-				1A4A851011CBCE3E00E4BF1B /* ANTLRTreeVisitor.h */,
-				1A4A851111CBCE3E00E4BF1B /* ANTLRTreeVisitor.m */,
-				1A4A851611CBCE5500E4BF1B /* ANTLRTreeVisitorAction.h */,
-				1A4A851711CBCE5500E4BF1B /* ANTLRTreeVisitorAction.m */,
-				1A4A851C11CBCF3700E4BF1B /* ANTLRTreeWizard.h */,
-				1A4A851D11CBCF3700E4BF1B /* ANTLRTreeWizard.m */,
+				BF7D9B511519363200B58218 /* ACBTree.h */,
+				BF7D9B521519363200B58218 /* ACBTree.m */,
+				1A1D465911BE73B2001575F3 /* BaseTreeAdaptor.h */,
+				1A1D465A11BE73B2001575F3 /* BaseTreeAdaptor.m */,
+				1A4D5AD411B55A45001C9482 /* BaseTree.h */,
+				1A4D5AD511B55A45001C9482 /* BaseTree.m */,
+				1A8ABFC511BA9B960038DBB0 /* CharStreamState.h */,
+				F70AA7CE09AA379300C3FD5E /* CharStreamState.m */,
+				F72C58E80AB3911D00282574 /* CommonTree.h */,
+				F72C58E90AB3911D00282574 /* CommonTree.m */,
+				F72C59A50AB4F20A00282574 /* CommonTreeAdaptor.h */,
+				F72C59A60AB4F20A00282574 /* CommonTreeAdaptor.m */,
+				F73E2B720A9CFE6A005D6267 /* Tree.h */,
+				F73E2B7A0A9D0AFC005D6267 /* TreeAdaptor.h */,
+				1A270BF711C1451200DCC8F3 /* TreeIterator.h */,
+				1A270BF811C1451200DCC8F3 /* TreeIterator.m */,
+				1AAC202A11CC621A00CF56D1 /* TreePatternLexer.h */,
+				1AAC202B11CC621A00CF56D1 /* TreePatternLexer.m */,
+				1AAC20A311CC790300CF56D1 /* TreePatternParser.h */,
+				1AAC20A411CC790300CF56D1 /* TreePatternParser.m */,
+				1A1BCE2811CB1A3E0051A1EC /* TreeRewriter.h */,
+				1A1BCE2911CB1A3E0051A1EC /* TreeRewriter.m */,
+				1A4A851011CBCE3E00E4BF1B /* TreeVisitor.h */,
+				1A4A851111CBCE3E00E4BF1B /* TreeVisitor.m */,
+				1A4A851611CBCE5500E4BF1B /* TreeVisitorAction.h */,
+				1A4A851711CBCE5500E4BF1B /* TreeVisitorAction.m */,
+				1A4A851C11CBCF3700E4BF1B /* TreeWizard.h */,
+				1A4A851D11CBCF3700E4BF1B /* TreeWizard.m */,
 			);
 			name = Trees;
 			sourceTree = "<group>";
@@ -1479,9 +1525,9 @@
 		F7492F8D09C0171900B25E30 /* Tokens */ = {
 			isa = PBXGroup;
 			children = (
-				F77765CA09DC583000517181 /* ANTLRToken.h */,
-				F777660309DC5CF400517181 /* ANTLRCommonToken.h */,
-				F777660409DC5CF400517181 /* ANTLRCommonToken.m */,
+				F77765CA09DC583000517181 /* Token.h */,
+				F777660309DC5CF400517181 /* CommonToken.h */,
+				F777660409DC5CF400517181 /* CommonToken.m */,
 			);
 			name = Tokens;
 			sourceTree = "<group>";
@@ -1489,8 +1535,8 @@
 		F77744070B234A3B00D1F89B /* Debugging Categories */ = {
 			isa = PBXGroup;
 			children = (
-				F77744030B234A3400D1F89B /* ANTLRToken+DebuggerSupport.h */,
-				F77744040B234A3400D1F89B /* ANTLRToken+DebuggerSupport.m */,
+				F77744030B234A3400D1F89B /* Token+DebuggerSupport.h */,
+				F77744040B234A3400D1F89B /* Token+DebuggerSupport.m */,
 			);
 			name = "Debugging Categories";
 			sourceTree = "<group>";
@@ -1511,32 +1557,32 @@
 		F7A4094C096597C4002CC781 /* Exceptions */ = {
 			isa = PBXGroup;
 			children = (
-				F738D1730B07AEAA001813C4 /* ANTLRFailedPredicateException.h */,
-				F738D1740B07AEAA001813C4 /* ANTLRFailedPredicateException.m */,
-				1A26329311C53578000DCDD4 /* ANTLRMismatchedNotSetException.h */,
-				1A26329411C53578000DCDD4 /* ANTLRMismatchedNotSetException.m */,
-				F7037CEE0A0582FC0070435D /* ANTLRMismatchedRangeException.h */,
-				F7037CEF0A0582FC0070435D /* ANTLRMismatchedRangeException.m */,
-				F70380BA0A07FA0D0070435D /* ANTLRMismatchedSetException.h */,
-				F70380BB0A07FA0D0070435D /* ANTLRMismatchedSetException.m */,
-				F777668009DC719C00517181 /* ANTLRMismatchedTokenException.h */,
-				F777668109DC719C00517181 /* ANTLRMismatchedTokenException.m */,
-				F72C5D600AB63E0B00282574 /* ANTLRMismatchedTreeNodeException.h */,
-				F72C5D610AB63E0B00282574 /* ANTLRMismatchedTreeNodeException.m */,
-				1A6C451411BF4EE00039788A /* ANTLRMissingTokenException.h */,
-				1A6C451511BF4EE00039788A /* ANTLRMissingTokenException.m */,
-				1A8AC00A11BAEC710038DBB0 /* ANTLRRuntimeException.h */,
-				1A8AC00B11BAEC710038DBB0 /* ANTLRRuntimeException.m */,
-				F79D59890A0E51AB00EA3CEE /* ANTLRNoViableAltException.h */,
-				F79D598A0A0E51AB00EA3CEE /* ANTLRNoViableAltException.m */,
-				F777669109DC72D600517181 /* ANTLRRecognitionException.h */,
-				F777669209DC72D600517181 /* ANTLRRecognitionException.m */,
-				F700E6190A5F66EC005D0757 /* ANTLREarlyExitException.h */,
-				F700E61A0A5F66EC005D0757 /* ANTLREarlyExitException.m */,
-				F738D1750B07AEAA001813C4 /* ANTLRTreeException.h */,
-				F738D1760B07AEAA001813C4 /* ANTLRTreeException.m */,
-				1A6C452611BF50A40039788A /* ANTLRUnwantedTokenException.h */,
-				1A6C452711BF50A40039788A /* ANTLRUnwantedTokenException.m */,
+				F738D1730B07AEAA001813C4 /* FailedPredicateException.h */,
+				F738D1740B07AEAA001813C4 /* FailedPredicateException.m */,
+				1A26329311C53578000DCDD4 /* MismatchedNotSetException.h */,
+				1A26329411C53578000DCDD4 /* MismatchedNotSetException.m */,
+				F7037CEE0A0582FC0070435D /* MismatchedRangeException.h */,
+				F7037CEF0A0582FC0070435D /* MismatchedRangeException.m */,
+				F70380BA0A07FA0D0070435D /* MismatchedSetException.h */,
+				F70380BB0A07FA0D0070435D /* MismatchedSetException.m */,
+				F777668009DC719C00517181 /* MismatchedTokenException.h */,
+				F777668109DC719C00517181 /* MismatchedTokenException.m */,
+				F72C5D600AB63E0B00282574 /* MismatchedTreeNodeException.h */,
+				F72C5D610AB63E0B00282574 /* MismatchedTreeNodeException.m */,
+				1A6C451411BF4EE00039788A /* MissingTokenException.h */,
+				1A6C451511BF4EE00039788A /* MissingTokenException.m */,
+				1A8AC00A11BAEC710038DBB0 /* RuntimeException.h */,
+				1A8AC00B11BAEC710038DBB0 /* RuntimeException.m */,
+				F79D59890A0E51AB00EA3CEE /* NoViableAltException.h */,
+				F79D598A0A0E51AB00EA3CEE /* NoViableAltException.m */,
+				F777669109DC72D600517181 /* RecognitionException.h */,
+				F777669209DC72D600517181 /* RecognitionException.m */,
+				F700E6190A5F66EC005D0757 /* EarlyExitException.h */,
+				F700E61A0A5F66EC005D0757 /* EarlyExitException.m */,
+				F738D1750B07AEAA001813C4 /* TreeException.h */,
+				F738D1760B07AEAA001813C4 /* TreeException.m */,
+				1A6C452611BF50A40039788A /* UnwantedTokenException.h */,
+				1A6C452711BF50A40039788A /* UnwantedTokenException.m */,
 			);
 			name = Exceptions;
 			sourceTree = "<group>";
@@ -1544,8 +1590,8 @@
 		F7A40951096597D2002CC781 /* DFA */ = {
 			isa = PBXGroup;
 			children = (
-				F7754E3D0A5C0A0500D0873A /* ANTLRDFA.h */,
-				F7754E3E0A5C0A0500D0873A /* ANTLRDFA.m */,
+				F7754E3D0A5C0A0500D0873A /* DFA.h */,
+				F7754E3E0A5C0A0500D0873A /* DFA.m */,
 			);
 			name = DFA;
 			sourceTree = "<group>";
@@ -1553,20 +1599,20 @@
 		F7A4098809659BE5002CC781 /* Recognizer */ = {
 			isa = PBXGroup;
 			children = (
-				F7A4098B09659BF3002CC781 /* ANTLRBaseRecognizer.h */,
-				F7A4098C09659BF3002CC781 /* ANTLRBaseRecognizer.m */,
-				F7B1E5AC0CD7CF1900CE136E /* ANTLRRecognizerSharedState.h */,
-				F7B1E5AD0CD7CF1900CE136E /* ANTLRRecognizerSharedState.m */,
-				F7A4099109659BFB002CC781 /* ANTLRLexer.h */,
-				F7A4099209659BFB002CC781 /* ANTLRLexer.m */,
-				F7009AD90A1BE4AE002EDD5D /* ANTLRLexerRuleReturnScope.h */,
-				F7009ADA0A1BE4AE002EDD5D /* ANTLRLexerRuleReturnScope.m */,
-				F700E8F90A5FAD21005D0757 /* ANTLRParser.h */,
-				F700E8FA0A5FAD21005D0757 /* ANTLRParser.m */,
-				F72C5D540AB63C1D00282574 /* ANTLRTreeParser.h */,
-				F72C5D550AB63C1D00282574 /* ANTLRTreeParser.m */,
-				1A86B91911EB9F6300C67A03 /* ANTLRParseTree.h */,
-				1A86B91A11EB9F6300C67A03 /* ANTLRParseTree.m */,
+				F7A4098B09659BF3002CC781 /* BaseRecognizer.h */,
+				F7A4098C09659BF3002CC781 /* BaseRecognizer.m */,
+				F7B1E5AC0CD7CF1900CE136E /* RecognizerSharedState.h */,
+				F7B1E5AD0CD7CF1900CE136E /* RecognizerSharedState.m */,
+				F7A4099109659BFB002CC781 /* Lexer.h */,
+				F7A4099209659BFB002CC781 /* Lexer.m */,
+				F7009AD90A1BE4AE002EDD5D /* LexerRuleReturnScope.h */,
+				F7009ADA0A1BE4AE002EDD5D /* LexerRuleReturnScope.m */,
+				F700E8F90A5FAD21005D0757 /* Parser.h */,
+				F700E8FA0A5FAD21005D0757 /* Parser.m */,
+				F72C5D540AB63C1D00282574 /* TreeParser.h */,
+				F72C5D550AB63C1D00282574 /* TreeParser.m */,
+				1A86B91911EB9F6300C67A03 /* ParseTree.h */,
+				1A86B91A11EB9F6300C67A03 /* ParseTree.m */,
 			);
 			name = Recognizer;
 			sourceTree = "<group>";
@@ -1620,19 +1666,19 @@
 			isa = PBXGroup;
 			children = (
 				F77744070B234A3B00D1F89B /* Debugging Categories */,
-				F7CECD7D0B1E5C370054CC3B /* ANTLRDebugEventListener.h */,
-				F7E261370B1E45580013F640 /* ANTLRDebugEventProxy.h */,
-				F7E261380B1E45580013F640 /* ANTLRDebugEventProxy.m */,
-				F7E261140B1E44320013F640 /* ANTLRDebugParser.h */,
-				F7E261150B1E44320013F640 /* ANTLRDebugParser.m */,
-				F7E2611E0B1E44E80013F640 /* ANTLRDebugTokenStream.h */,
-				F7E2611F0B1E44E80013F640 /* ANTLRDebugTokenStream.m */,
-				F7E261180B1E443C0013F640 /* ANTLRDebugTreeParser.h */,
-				F7E261190B1E443C0013F640 /* ANTLRDebugTreeParser.m */,
-				F7E261220B1E44FA0013F640 /* ANTLRDebugTreeNodeStream.h */,
-				F7E261230B1E44FA0013F640 /* ANTLRDebugTreeNodeStream.m */,
-				F7E261260B1E45070013F640 /* ANTLRDebugTreeAdaptor.h */,
-				F7E261270B1E45070013F640 /* ANTLRDebugTreeAdaptor.m */,
+				F7CECD7D0B1E5C370054CC3B /* DebugEventListener.h */,
+				F7E261370B1E45580013F640 /* DebugEventSocketProxy.h */,
+				F7E261380B1E45580013F640 /* DebugEventSocketProxy.m */,
+				F7E261140B1E44320013F640 /* DebugParser.h */,
+				F7E261150B1E44320013F640 /* DebugParser.m */,
+				F7E2611E0B1E44E80013F640 /* DebugTokenStream.h */,
+				F7E2611F0B1E44E80013F640 /* DebugTokenStream.m */,
+				F7E261180B1E443C0013F640 /* DebugTreeParser.h */,
+				F7E261190B1E443C0013F640 /* DebugTreeParser.m */,
+				F7E261220B1E44FA0013F640 /* DebugTreeNodeStream.h */,
+				F7E261230B1E44FA0013F640 /* DebugTreeNodeStream.m */,
+				F7E261260B1E45070013F640 /* DebugTreeAdaptor.h */,
+				F7E261270B1E45070013F640 /* DebugTreeAdaptor.m */,
 			);
 			name = Debugging;
 			sourceTree = "<group>";
@@ -1640,40 +1686,48 @@
 		F7F218EB097AFB0C000472E9 /* Misc */ = {
 			isa = PBXGroup;
 			children = (
-				1A100AB911E604FE006ABF94 /* ANTLRHashRule.h */,
-				1A100ABA11E604FE006ABF94 /* ANTLRHashRule.m */,
-				1A2D218411E502DE00DFE328 /* ANTLRNodeMapElement.h */,
-				1A2D218511E502DE00DFE328 /* ANTLRNodeMapElement.m */,
-				1AB5F51C11E3BE2E00E065B0 /* ANTLRPtrBuffer.h */,
-				1AB5F51D11E3BE2E00E065B0 /* ANTLRPtrBuffer.m */,
-				1A3A08E811E213E100D5EE26 /* ANTLRSymbolStack.h */,
-				1A3A08E911E213E100D5EE26 /* ANTLRSymbolStack.m */,
-				1A3A08E411E213C500D5EE26 /* ANTLRBaseStack.h */,
-				1A3A08E511E213C500D5EE26 /* ANTLRBaseStack.m */,
-				1A45658711C9270D0082F421 /* ANTLRBaseMapElement.h */,
-				1A45658811C9270D0082F421 /* ANTLRBaseMapElement.m */,
+				BF7D9B551519367800B58218 /* AMutableArray.h */,
+				BF7D9B561519367800B58218 /* AMutableArray.m */,
+				BF7D9B591519368C00B58218 /* AMutableDictionary.h */,
+				BF7D9B5A1519368C00B58218 /* AMutableDictionary.m */,
+				BF7D9B711519375200B58218 /* ArrayIterator.h */,
+				BF7D9B721519375200B58218 /* ArrayIterator.m */,
+				BF7D9B5D151936B500B58218 /* DoubleKeyMap.h */,
+				BF7D9B5E151936B600B58218 /* DoubleKeyMap.m */,
+				1A100AB911E604FE006ABF94 /* HashRule.h */,
+				1A100ABA11E604FE006ABF94 /* HashRule.m */,
+				1A2D218411E502DE00DFE328 /* NodeMapElement.h */,
+				1A2D218511E502DE00DFE328 /* NodeMapElement.m */,
+				1AB5F51C11E3BE2E00E065B0 /* PtrBuffer.h */,
+				1AB5F51D11E3BE2E00E065B0 /* PtrBuffer.m */,
+				1A3A08E811E213E100D5EE26 /* SymbolStack.h */,
+				1A3A08E911E213E100D5EE26 /* SymbolStack.m */,
+				1A3A08E411E213C500D5EE26 /* BaseStack.h */,
+				1A3A08E511E213C500D5EE26 /* BaseStack.m */,
+				1A45658711C9270D0082F421 /* BaseMapElement.h */,
+				1A45658811C9270D0082F421 /* BaseMapElement.m */,
 				F7F218EE097AFB1A000472E9 /* ANTLRBitSet.h */,
 				F7F218EF097AFB1A000472E9 /* ANTLRBitSet.m */,
-				1A1D467A11BE8E5A001575F3 /* ANTLRCommonErrorNode.h */,
-				1A1D467B11BE8E5A001575F3 /* ANTLRCommonErrorNode.m */,
-				1A1CCC9011B6FD39002E5F53 /* ANTLRFastQueue.h */,
-				1A1CCC9111B6FD39002E5F53 /* ANTLRFastQueue.m */,
-				1A1702FC11C05D4800F6978A /* ANTLRHashMap.h */,
-				1A1702FD11C05D4800F6978A /* ANTLRHashMap.m */,
-				1A1CCC9211B6FD39002E5F53 /* ANTLRIntArray.h */,
-				1A1CCC9311B6FD39002E5F53 /* ANTLRIntArray.m */,
-				1A16B13A11C66492002860C7 /* ANTLRLinkBase.h */,
-				1A16B13B11C66492002860C7 /* ANTLRLinkBase.m */,
-				1A1D466E11BE75C0001575F3 /* ANTLRMapElement.h */,
-				1A1D466F11BE75C0001575F3 /* ANTLRMapElement.m */,
-				1A5EA50911CFE7CE00E8932F /* ANTLRMap.h */,
-				1A5EA50A11CFE7CE00E8932F /* ANTLRMap.m */,
-				1A45657511C922BE0082F421 /* ANTLRRuleMemo.h */,
-				1A45657611C922BE0082F421 /* ANTLRRuleMemo.m */,
-				1AE8A96A11D9227A00D36FD6 /* ANTLRRuleStack.h */,
-				1AE8A96B11D9227A00D36FD6 /* ANTLRRuleStack.m */,
-				1A2D217311E4F57C00DFE328 /* ANTLRUniqueIDMap.h */,
-				1A2D217411E4F57C00DFE328 /* ANTLRUniqueIDMap.m */,
+				1A1D467A11BE8E5A001575F3 /* CommonErrorNode.h */,
+				1A1D467B11BE8E5A001575F3 /* CommonErrorNode.m */,
+				1A1CCC9011B6FD39002E5F53 /* FastQueue.h */,
+				1A1CCC9111B6FD39002E5F53 /* FastQueue.m */,
+				1A1702FC11C05D4800F6978A /* HashMap.h */,
+				1A1702FD11C05D4800F6978A /* HashMap.m */,
+				1A1CCC9211B6FD39002E5F53 /* IntArray.h */,
+				1A1CCC9311B6FD39002E5F53 /* IntArray.m */,
+				1A16B13A11C66492002860C7 /* LinkBase.h */,
+				1A16B13B11C66492002860C7 /* LinkBase.m */,
+				1A1D466E11BE75C0001575F3 /* MapElement.h */,
+				1A1D466F11BE75C0001575F3 /* MapElement.m */,
+				1A5EA50911CFE7CE00E8932F /* Map.h */,
+				1A5EA50A11CFE7CE00E8932F /* Map.m */,
+				1A45657511C922BE0082F421 /* RuleMemo.h */,
+				1A45657611C922BE0082F421 /* RuleMemo.m */,
+				1AE8A96A11D9227A00D36FD6 /* RuleStack.h */,
+				1AE8A96B11D9227A00D36FD6 /* RuleStack.m */,
+				1A2D217311E4F57C00DFE328 /* UniqueIDMap.h */,
+				1A2D217411E4F57C00DFE328 /* UniqueIDMap.m */,
 			);
 			name = Misc;
 			sourceTree = "<group>";
@@ -1686,96 +1740,105 @@
 			buildActionMask = 2147483647;
 			files = (
 				F70AA7A609AA2A6900C3FD5E /* ANTLR.h in Headers */,
-				1A45658911C9270D0082F421 /* ANTLRBaseMapElement.h in Headers */,
-				F7492F5D09C016A200B25E30 /* ANTLRBaseRecognizer.h in Headers */,
-				1A4D5AD611B55A45001C9482 /* ANTLRBaseTree.h in Headers */,
-				1A1D465B11BE73B2001575F3 /* ANTLRBaseTreeAdaptor.h in Headers */,
+				1A45658911C9270D0082F421 /* BaseMapElement.h in Headers */,
+				F7492F5D09C016A200B25E30 /* BaseRecognizer.h in Headers */,
+				1A4D5AD611B55A45001C9482 /* BaseTree.h in Headers */,
+				1A1D465B11BE73B2001575F3 /* BaseTreeAdaptor.h in Headers */,
 				1A10050711B8796E0022B434 /* ANTLRBitSet.h in Headers */,
-				1A10050611B8796D0022B434 /* ANTLRBufferedTokenStream.h in Headers */,
-				1A65B7D811B9532A00FD8754 /* ANTLRBufferedTreeNodeStream.h in Headers */,
-				1A67885311B87AC400A11EEC /* ANTLRCharStream.h in Headers */,
-				1A8ABFC611BA9B960038DBB0 /* ANTLRCharStreamState.h in Headers */,
-				1A1D467C11BE8E5A001575F3 /* ANTLRCommonErrorNode.h in Headers */,
-				F777660509DC5CF400517181 /* ANTLRCommonToken.h in Headers */,
-				F700ED960A5FF2A5005D0757 /* ANTLRCommonTokenStream.h in Headers */,
-				F72C58EA0AB3911D00282574 /* ANTLRCommonTree.h in Headers */,
-				F76AA9900CEA515A00AF044C /* ANTLRCommonTreeNodeStream.h in Headers */,
-				F72C59A70AB4F20A00282574 /* ANTLRCommonTreeAdaptor.h in Headers */,
-				1A12C96011B89F6B008C9BED /* ANTLRDebugEventListener.h in Headers */,
-				F7E261390B1E45580013F640 /* ANTLRDebugEventProxy.h in Headers */,
-				F7E261160B1E44320013F640 /* ANTLRDebugParser.h in Headers */,
-				F7E261200B1E44E80013F640 /* ANTLRDebugTokenStream.h in Headers */,
-				F7E261240B1E44FA0013F640 /* ANTLRDebugTreeNodeStream.h in Headers */,
-				F7E261280B1E45070013F640 /* ANTLRDebugTreeAdaptor.h in Headers */,
-				F7E2611A0B1E443D0013F640 /* ANTLRDebugTreeParser.h in Headers */,
-				F77747560B23A70600D1F89B /* ANTLRDebug.h in Headers */,
-				F7754E3F0A5C0A0500D0873A /* ANTLRDFA.h in Headers */,
-				F700E61B0A5F66EC005D0757 /* ANTLREarlyExitException.h in Headers */,
+				1A10050611B8796D0022B434 /* BufferedTokenStream.h in Headers */,
+				1A65B7D811B9532A00FD8754 /* BufferedTreeNodeStream.h in Headers */,
+				1A67885311B87AC400A11EEC /* CharStream.h in Headers */,
+				1A8ABFC611BA9B960038DBB0 /* CharStreamState.h in Headers */,
+				1A1D467C11BE8E5A001575F3 /* CommonErrorNode.h in Headers */,
+				F777660509DC5CF400517181 /* CommonToken.h in Headers */,
+				F700ED960A5FF2A5005D0757 /* CommonTokenStream.h in Headers */,
+				F72C58EA0AB3911D00282574 /* CommonTree.h in Headers */,
+				F76AA9900CEA515A00AF044C /* CommonTreeNodeStream.h in Headers */,
+				F72C59A70AB4F20A00282574 /* CommonTreeAdaptor.h in Headers */,
+				1A12C96011B89F6B008C9BED /* DebugEventListener.h in Headers */,
+				F7E261390B1E45580013F640 /* DebugEventSocketProxy.h in Headers */,
+				F7E261160B1E44320013F640 /* DebugParser.h in Headers */,
+				F7E261200B1E44E80013F640 /* DebugTokenStream.h in Headers */,
+				F7E261240B1E44FA0013F640 /* DebugTreeNodeStream.h in Headers */,
+				F7E261280B1E45070013F640 /* DebugTreeAdaptor.h in Headers */,
+				F7E2611A0B1E443D0013F640 /* DebugTreeParser.h in Headers */,
+				F77747560B23A70600D1F89B /* Debug.h in Headers */,
+				F7754E3F0A5C0A0500D0873A /* DFA.h in Headers */,
+				F700E61B0A5F66EC005D0757 /* EarlyExitException.h in Headers */,
 				1A1CCCC811B727B5002E5F53 /* ANTLRError.h in Headers */,
-				1A10050911B879A80022B434 /* ANTLRFailedPredicateException.h in Headers */,
-				1A10050811B879A40022B434 /* ANTLRFastQueue.h in Headers */,
-				1A1702FE11C05D4800F6978A /* ANTLRHashMap.h in Headers */,
-				1A10050B11B879B80022B434 /* ANTLRIntArray.h in Headers */,
-				F70AA7AF09AA2AC000C3FD5E /* ANTLRIntStream.h in Headers */,
-				F777678E09DD618000517181 /* ANTLRLexer.h in Headers */,
-				F7009ADB0A1BE4AE002EDD5D /* ANTLRLexerRuleReturnScope.h in Headers */,
-				1A16B13C11C66492002860C7 /* ANTLRLinkBase.h in Headers */,
-				1A1CCCAB11B724B2002E5F53 /* ANTLRLookaheadStream.h in Headers */,
-				1A1D467011BE75C0001575F3 /* ANTLRMapElement.h in Headers */,
-				1A5EA50B11CFE7CE00E8932F /* ANTLRMap.h in Headers */,
-				1A26329511C53578000DCDD4 /* ANTLRMismatchedNotSetException.h in Headers */,
-				F7037CF00A0582FC0070435D /* ANTLRMismatchedRangeException.h in Headers */,
-				F70380BC0A07FA0D0070435D /* ANTLRMismatchedSetException.h in Headers */,
-				F777668209DC719C00517181 /* ANTLRMismatchedTokenException.h in Headers */,
-				F72C5D620AB63E0B00282574 /* ANTLRMismatchedTreeNodeException.h in Headers */,
-				1A75BF5911D6B3FD0096C6F5 /* ANTLRMissingTokenException.h in Headers */,
-				F79D598B0A0E51AB00EA3CEE /* ANTLRNoViableAltException.h in Headers */,
-				F700E8FB0A5FAD21005D0757 /* ANTLRParser.h in Headers */,
-				F72C5ECE0AB7E5A500282574 /* ANTLRParserRuleReturnScope.h in Headers */,
-				F777669309DC72D600517181 /* ANTLRRecognitionException.h in Headers */,
-				F7B1E5B00CD7CF1900CE136E /* ANTLRRecognizerSharedState.h in Headers */,
-				F71325880C4A060900B99F2D /* ANTLRRewriteRuleElementStream.h in Headers */,
-				F70B11BD0C4C2B6400C3ECE0 /* ANTLRRewriteRuleSubtreeStream.h in Headers */,
-				F70B11C30C4C2B7900C3ECE0 /* ANTLRRewriteRuleTokenStream.h in Headers */,
-				1A45657711C922BE0082F421 /* ANTLRRuleMemo.h in Headers */,
-				1A1BCDBB11CB01E60051A1EC /* ANTLRRuleReturnScope.h in Headers */,
-				1A8AC00C11BAEC710038DBB0 /* ANTLRRuntimeException.h in Headers */,
-				1AB4A59111B9A0DA0076E91A /* ANTLRStreamEnumerator.h in Headers */,
+				1A10050911B879A80022B434 /* FailedPredicateException.h in Headers */,
+				1A10050811B879A40022B434 /* FastQueue.h in Headers */,
+				1A1702FE11C05D4800F6978A /* HashMap.h in Headers */,
+				1A10050B11B879B80022B434 /* IntArray.h in Headers */,
+				F70AA7AF09AA2AC000C3FD5E /* IntStream.h in Headers */,
+				F777678E09DD618000517181 /* Lexer.h in Headers */,
+				F7009ADB0A1BE4AE002EDD5D /* LexerRuleReturnScope.h in Headers */,
+				1A16B13C11C66492002860C7 /* LinkBase.h in Headers */,
+				1A1CCCAB11B724B2002E5F53 /* LookaheadStream.h in Headers */,
+				1A1D467011BE75C0001575F3 /* MapElement.h in Headers */,
+				1A5EA50B11CFE7CE00E8932F /* Map.h in Headers */,
+				1A26329511C53578000DCDD4 /* MismatchedNotSetException.h in Headers */,
+				F7037CF00A0582FC0070435D /* MismatchedRangeException.h in Headers */,
+				F70380BC0A07FA0D0070435D /* MismatchedSetException.h in Headers */,
+				F777668209DC719C00517181 /* MismatchedTokenException.h in Headers */,
+				F72C5D620AB63E0B00282574 /* MismatchedTreeNodeException.h in Headers */,
+				1A75BF5911D6B3FD0096C6F5 /* MissingTokenException.h in Headers */,
+				F79D598B0A0E51AB00EA3CEE /* NoViableAltException.h in Headers */,
+				F700E8FB0A5FAD21005D0757 /* Parser.h in Headers */,
+				F72C5ECE0AB7E5A500282574 /* ParserRuleReturnScope.h in Headers */,
+				F777669309DC72D600517181 /* RecognitionException.h in Headers */,
+				F7B1E5B00CD7CF1900CE136E /* RecognizerSharedState.h in Headers */,
+				F71325880C4A060900B99F2D /* RewriteRuleElementStream.h in Headers */,
+				F70B11BD0C4C2B6400C3ECE0 /* RewriteRuleSubtreeStream.h in Headers */,
+				F70B11C30C4C2B7900C3ECE0 /* RewriteRuleTokenStream.h in Headers */,
+				1A45657711C922BE0082F421 /* RuleMemo.h in Headers */,
+				1A1BCDBB11CB01E60051A1EC /* RuleReturnScope.h in Headers */,
+				1A8AC00C11BAEC710038DBB0 /* RuntimeException.h in Headers */,
+				1AB4A59111B9A0DA0076E91A /* StreamEnumerator.h in Headers */,
 				F70AA7C709AA339900C3FD5E /* ANTLRStringStream.h in Headers */,
-				F77765CC09DC583000517181 /* ANTLRToken.h in Headers */,
-				F77766AF09DD53E800517181 /* ANTLRTokenStream.h in Headers */,
-				F77744050B234A3400D1F89B /* ANTLRToken+DebuggerSupport.h in Headers */,
-				F700ED7F0A5FF17C005D0757 /* ANTLRTokenSource.h in Headers */,
-				F73E2B740A9CFE6A005D6267 /* ANTLRTree.h in Headers */,
-				F73E2B7C0A9D0AFC005D6267 /* ANTLRTreeAdaptor.h in Headers */,
-				F738D1790B07AEAA001813C4 /* ANTLRTreeException.h in Headers */,
-				1A270BF911C1451200DCC8F3 /* ANTLRTreeIterator.h in Headers */,
-				F72C5B840AB52AD300282574 /* ANTLRTreeNodeStream.h in Headers */,
-				F72C5D560AB63C1D00282574 /* ANTLRTreeParser.h in Headers */,
-				1AAC202C11CC621A00CF56D1 /* ANTLRTreePatternLexer.h in Headers */,
-				1AAC20A511CC790300CF56D1 /* ANTLRTreePatternParser.h in Headers */,
-				1A1BCDCF11CB0B3D0051A1EC /* ANTLRTreeRuleReturnScope.h in Headers */,
-				1A1BCE2A11CB1A3E0051A1EC /* ANTLRTreeRewriter.h in Headers */,
-				1A4A851211CBCE3E00E4BF1B /* ANTLRTreeVisitor.h in Headers */,
-				1A4A851811CBCE5500E4BF1B /* ANTLRTreeVisitorAction.h in Headers */,
-				1A4A851E11CBCF3700E4BF1B /* ANTLRTreeWizard.h in Headers */,
-				1A6C452811BF50A40039788A /* ANTLRUnwantedTokenException.h in Headers */,
-				1AE8A96C11D9227A00D36FD6 /* ANTLRRuleStack.h in Headers */,
-				1A3A08E611E213C500D5EE26 /* ANTLRBaseStack.h in Headers */,
-				1A3A08EA11E213E100D5EE26 /* ANTLRSymbolStack.h in Headers */,
+				F77765CC09DC583000517181 /* Token.h in Headers */,
+				F77766AF09DD53E800517181 /* TokenStream.h in Headers */,
+				F77744050B234A3400D1F89B /* Token+DebuggerSupport.h in Headers */,
+				F700ED7F0A5FF17C005D0757 /* TokenSource.h in Headers */,
+				F73E2B740A9CFE6A005D6267 /* Tree.h in Headers */,
+				F73E2B7C0A9D0AFC005D6267 /* TreeAdaptor.h in Headers */,
+				F738D1790B07AEAA001813C4 /* TreeException.h in Headers */,
+				1A270BF911C1451200DCC8F3 /* TreeIterator.h in Headers */,
+				F72C5B840AB52AD300282574 /* TreeNodeStream.h in Headers */,
+				F72C5D560AB63C1D00282574 /* TreeParser.h in Headers */,
+				1AAC202C11CC621A00CF56D1 /* TreePatternLexer.h in Headers */,
+				1AAC20A511CC790300CF56D1 /* TreePatternParser.h in Headers */,
+				1A1BCDCF11CB0B3D0051A1EC /* TreeRuleReturnScope.h in Headers */,
+				1A1BCE2A11CB1A3E0051A1EC /* TreeRewriter.h in Headers */,
+				1A4A851211CBCE3E00E4BF1B /* TreeVisitor.h in Headers */,
+				1A4A851811CBCE5500E4BF1B /* TreeVisitorAction.h in Headers */,
+				1A4A851E11CBCF3700E4BF1B /* TreeWizard.h in Headers */,
+				1A6C452811BF50A40039788A /* UnwantedTokenException.h in Headers */,
+				1AE8A96C11D9227A00D36FD6 /* RuleStack.h in Headers */,
+				1A3A08E611E213C500D5EE26 /* BaseStack.h in Headers */,
+				1A3A08EA11E213E100D5EE26 /* SymbolStack.h in Headers */,
 				1A3A09BE11E235BD00D5EE26 /* antlr3.h in Headers */,
-				1AB5F47711E3869D00E065B0 /* ANTLRRuleMapElement.h in Headers */,
-				1AB5F51E11E3BE2E00E065B0 /* ANTLRPtrBuffer.h in Headers */,
-				1A2D217511E4F57C00DFE328 /* ANTLRUniqueIDMap.h in Headers */,
-				1A2D218611E502DE00DFE328 /* ANTLRNodeMapElement.h in Headers */,
-				1A100ABB11E604FE006ABF94 /* ANTLRHashRule.h in Headers */,
-				1AEECE1511E7EB3C00554AAF /* ANTLRTokenRewriteStream.h in Headers */,
-				1A86B91B11EB9F6300C67A03 /* ANTLRParseTree.h in Headers */,
-				1A86BACF11EC1CD000C67A03 /* ANTLRUnbufferedTokenStream.h in Headers */,
+				1AB5F47711E3869D00E065B0 /* RuleMapElement.h in Headers */,
+				1AB5F51E11E3BE2E00E065B0 /* PtrBuffer.h in Headers */,
+				1A2D217511E4F57C00DFE328 /* UniqueIDMap.h in Headers */,
+				1A2D218611E502DE00DFE328 /* NodeMapElement.h in Headers */,
+				1A100ABB11E604FE006ABF94 /* HashRule.h in Headers */,
+				1AEECE1511E7EB3C00554AAF /* TokenRewriteStream.h in Headers */,
+				1A86B91B11EB9F6300C67A03 /* ParseTree.h in Headers */,
+				1A86BACF11EC1CD000C67A03 /* UnbufferedTokenStream.h in Headers */,
 				1ADB66F112E74341007C1661 /* FuzzyLexer.h in Headers */,
 				1A0F348212EA444500496BB8 /* PolyLexer.h in Headers */,
 				1A0F348412EA444500496BB8 /* PolyParser.h in Headers */,
 				1A0F348612EA444500496BB8 /* Simplifier.h in Headers */,
+				BF7D9B531519363200B58218 /* ACBTree.h in Headers */,
+				BF7D9B571519367800B58218 /* AMutableArray.h in Headers */,
+				BF7D9B5B1519368C00B58218 /* AMutableDictionary.h in Headers */,
+				BF7D9B5F151936B600B58218 /* DoubleKeyMap.h in Headers */,
+				BF7D9B63151936E700B58218 /* ANTLRFileStream.h in Headers */,
+				BF7D9B67151936FC00B58218 /* ANTLRInputStream.h in Headers */,
+				BF7D9B6B1519371200B58218 /* ANTLRReaderStream.h in Headers */,
+				BF7D9B6F1519373700B58218 /* RewriteRuleNodeStream.h in Headers */,
+				BF7D9B731519375200B58218 /* ArrayIterator.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -2514,7 +2577,7 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				1A12110311D3A62B00F27B38 /* ANTLRCommonTokenTest.m in Sources */,
+				1A12110311D3A62B00F27B38 /* CommonTokenTest.m in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -2530,7 +2593,7 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				1A12126211D3CA0100F27B38 /* ANTLRFastQueueTest.m in Sources */,
+				1A12126211D3CA0100F27B38 /* FastQueueTest.m in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -2538,7 +2601,7 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				1A1212E711D3F59300F27B38 /* ANTLRIntArrayTest.m in Sources */,
+				1A1212E711D3F59300F27B38 /* IntArrayTest.m in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -2546,7 +2609,7 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				1A12131711D3F80500F27B38 /* ANTLRCommonTreeTest.m in Sources */,
+				1A12131711D3F80500F27B38 /* CommonTreeTest.m in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -2555,10 +2618,10 @@
 			buildActionMask = 2147483647;
 			files = (
 				1A348BA511D2C6A0000C72FC /* ANTLRBitSetTest.m in Sources */,
-				1A348BA811D2C6AD000C72FC /* ANTLRCommonTokenTest.m in Sources */,
-				1A348BAB11D2C6B8000C72FC /* ANTLRCommonTreeTest.m in Sources */,
-				1A348BAE11D2C6C6000C72FC /* ANTLRFastQueueTest.m in Sources */,
-				1A348BAF11D2C6D3000C72FC /* ANTLRIntArrayTest.m in Sources */,
+				1A348BA811D2C6AD000C72FC /* CommonTokenTest.m in Sources */,
+				1A348BAB11D2C6B8000C72FC /* CommonTreeTest.m in Sources */,
+				1A348BAE11D2C6C6000C72FC /* FastQueueTest.m in Sources */,
+				1A348BAF11D2C6D3000C72FC /* IntArrayTest.m in Sources */,
 				1A348BB211D2C6E3000C72FC /* ANTLRStringStreamTest.m in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
@@ -2593,74 +2656,83 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				1A67885211B87ABA00A11EEC /* ANTLRBaseTree.m in Sources */,
-				1A67885411B87AEA00A11EEC /* ANTLRFastQueue.m in Sources */,
-				1A67885511B87AEF00A11EEC /* ANTLRIntArray.m in Sources */,
-				1A6788FC11B893E100A11EEC /* ANTLRBaseRecognizer.m in Sources */,
+				1A67885211B87ABA00A11EEC /* BaseTree.m in Sources */,
+				1A67885411B87AEA00A11EEC /* FastQueue.m in Sources */,
+				1A67885511B87AEF00A11EEC /* IntArray.m in Sources */,
+				1A6788FC11B893E100A11EEC /* BaseRecognizer.m in Sources */,
 				1A12C95911B89F62008C9BED /* ANTLRBitSet.m in Sources */,
-				1A12C95A11B89F64008C9BED /* ANTLRBufferedTokenStream.m in Sources */,
-				1A12C95B11B89F65008C9BED /* ANTLRCommonToken.m in Sources */,
-				1A12C95C11B89F67008C9BED /* ANTLRCommonTokenStream.m in Sources */,
-				1A12C95D11B89F68008C9BED /* ANTLRCommonTree.m in Sources */,
-				1A12C95E11B89F69008C9BED /* ANTLRCommonTreeAdaptor.m in Sources */,
-				1A12C95F11B89F6A008C9BED /* ANTLRCommonTreeNodeStream.m in Sources */,
-				1A12C96111B89F6F008C9BED /* ANTLRLexer.m in Sources */,
-				1A12C96211B89F70008C9BED /* ANTLRLexerRuleReturnScope.m in Sources */,
-				1A12C96311B89F76008C9BED /* ANTLRLookaheadStream.m in Sources */,
-				1A12C96411B89F76008C9BED /* ANTLRMismatchedRangeException.m in Sources */,
-				1A12C96511B89F77008C9BED /* ANTLRMismatchedSetException.m in Sources */,
-				1A12C96611B89F78008C9BED /* ANTLRMismatchedTokenException.m in Sources */,
-				1A12C96711B89F7A008C9BED /* ANTLRMismatchedTreeNodeException.m in Sources */,
-				1A12C96811B89F7B008C9BED /* ANTLRNoViableAltException.m in Sources */,
-				1A12C96911B89F7E008C9BED /* ANTLRParser.m in Sources */,
-				1A12C96A11B89F7F008C9BED /* ANTLRParserRuleReturnScope.m in Sources */,
-				1A12C96B11B89F80008C9BED /* ANTLRRecognitionException.m in Sources */,
-				1A12C96C11B89F82008C9BED /* ANTLRRecognizerSharedState.m in Sources */,
-				1A12C96D11B89F83008C9BED /* ANTLRRewriteRuleElementStream.m in Sources */,
-				1A12C96E11B89F84008C9BED /* ANTLRRewriteRuleSubtreeStream.m in Sources */,
-				1A12C96F11B89F85008C9BED /* ANTLRRewriteRuleTokenStream.m in Sources */,
+				1A12C95A11B89F64008C9BED /* BufferedTokenStream.m in Sources */,
+				1A12C95B11B89F65008C9BED /* CommonToken.m in Sources */,
+				1A12C95C11B89F67008C9BED /* CommonTokenStream.m in Sources */,
+				1A12C95D11B89F68008C9BED /* CommonTree.m in Sources */,
+				1A12C95E11B89F69008C9BED /* CommonTreeAdaptor.m in Sources */,
+				1A12C95F11B89F6A008C9BED /* CommonTreeNodeStream.m in Sources */,
+				1A12C96111B89F6F008C9BED /* Lexer.m in Sources */,
+				1A12C96211B89F70008C9BED /* LexerRuleReturnScope.m in Sources */,
+				1A12C96311B89F76008C9BED /* LookaheadStream.m in Sources */,
+				1A12C96411B89F76008C9BED /* MismatchedRangeException.m in Sources */,
+				1A12C96511B89F77008C9BED /* MismatchedSetException.m in Sources */,
+				1A12C96611B89F78008C9BED /* MismatchedTokenException.m in Sources */,
+				1A12C96711B89F7A008C9BED /* MismatchedTreeNodeException.m in Sources */,
+				1A12C96811B89F7B008C9BED /* NoViableAltException.m in Sources */,
+				1A12C96911B89F7E008C9BED /* Parser.m in Sources */,
+				1A12C96A11B89F7F008C9BED /* ParserRuleReturnScope.m in Sources */,
+				1A12C96B11B89F80008C9BED /* RecognitionException.m in Sources */,
+				1A12C96C11B89F82008C9BED /* RecognizerSharedState.m in Sources */,
+				1A12C96D11B89F83008C9BED /* RewriteRuleElementStream.m in Sources */,
+				1A12C96E11B89F84008C9BED /* RewriteRuleSubtreeStream.m in Sources */,
+				1A12C96F11B89F85008C9BED /* RewriteRuleTokenStream.m in Sources */,
 				1A12C97011B89F87008C9BED /* ANTLRStringStream.m in Sources */,
-				1A12C97111B89F8B008C9BED /* ANTLRCharStreamState.m in Sources */,
-				1A12C97211B89F8C008C9BED /* ANTLRToken+DebuggerSupport.m in Sources */,
-				1A12C97311B89F8E008C9BED /* ANTLRTreeException.m in Sources */,
-				1A12C97411B89F90008C9BED /* ANTLRTreeParser.m in Sources */,
-				1A65B7D911B9532A00FD8754 /* ANTLRBufferedTreeNodeStream.m in Sources */,
-				1AB4A54211B995290076E91A /* ANTLREarlyExitException.m in Sources */,
-				1AB4A54311B9952A0076E91A /* ANTLRFailedPredicateException.m in Sources */,
-				1AB4A59211B9A0DA0076E91A /* ANTLRStreamEnumerator.m in Sources */,
-				1A8AC00D11BAEC710038DBB0 /* ANTLRRuntimeException.m in Sources */,
-				1A1D465C11BE73B2001575F3 /* ANTLRBaseTreeAdaptor.m in Sources */,
-				1A1D467111BE75C0001575F3 /* ANTLRMapElement.m in Sources */,
-				1A1D467D11BE8E5A001575F3 /* ANTLRCommonErrorNode.m in Sources */,
-				1A6C451711BF4EE00039788A /* ANTLRMissingTokenException.m in Sources */,
-				1A6C452911BF50A40039788A /* ANTLRUnwantedTokenException.m in Sources */,
-				1A1702FF11C05D4800F6978A /* ANTLRHashMap.m in Sources */,
-				1A270BFA11C1451200DCC8F3 /* ANTLRTreeIterator.m in Sources */,
-				1A26329611C53578000DCDD4 /* ANTLRMismatchedNotSetException.m in Sources */,
-				1A16B13D11C66492002860C7 /* ANTLRLinkBase.m in Sources */,
-				1A45657811C922BE0082F421 /* ANTLRRuleMemo.m in Sources */,
-				1A45658A11C9270D0082F421 /* ANTLRBaseMapElement.m in Sources */,
-				1A1BCDBC11CB01E60051A1EC /* ANTLRRuleReturnScope.m in Sources */,
-				1A1BCDD011CB0B3D0051A1EC /* ANTLRTreeRuleReturnScope.m in Sources */,
-				1A1BCE2B11CB1A3E0051A1EC /* ANTLRTreeRewriter.m in Sources */,
-				1A4A851311CBCE3E00E4BF1B /* ANTLRTreeVisitor.m in Sources */,
-				1A4A851911CBCE5500E4BF1B /* ANTLRTreeVisitorAction.m in Sources */,
-				1A4A851F11CBCF3700E4BF1B /* ANTLRTreeWizard.m in Sources */,
-				1AAC202D11CC621A00CF56D1 /* ANTLRTreePatternLexer.m in Sources */,
-				1AAC20A611CC790300CF56D1 /* ANTLRTreePatternParser.m in Sources */,
-				1A5EA50C11CFE7CE00E8932F /* ANTLRMap.m in Sources */,
-				1A75BFBA11D6C2B10096C6F5 /* ANTLRDFA.m in Sources */,
-				1AE8A96D11D9227A00D36FD6 /* ANTLRRuleStack.m in Sources */,
-				1A3A08E711E213C500D5EE26 /* ANTLRBaseStack.m in Sources */,
-				1A3A08EB11E213E100D5EE26 /* ANTLRSymbolStack.m in Sources */,
-				1AB5F47811E3869D00E065B0 /* ANTLRRuleMapElement.m in Sources */,
-				1AB5F51F11E3BE2E00E065B0 /* ANTLRPtrBuffer.m in Sources */,
-				1A2D217611E4F57C00DFE328 /* ANTLRUniqueIDMap.m in Sources */,
-				1A2D218711E502DE00DFE328 /* ANTLRNodeMapElement.m in Sources */,
-				1A100ABC11E604FE006ABF94 /* ANTLRHashRule.m in Sources */,
-				1AEECE1611E7EB3D00554AAF /* ANTLRTokenRewriteStream.m in Sources */,
-				1A86B91C11EB9F6300C67A03 /* ANTLRParseTree.m in Sources */,
-				1A86BAD011EC1CD000C67A03 /* ANTLRUnbufferedTokenStream.m in Sources */,
+				1A12C97111B89F8B008C9BED /* CharStreamState.m in Sources */,
+				1A12C97211B89F8C008C9BED /* Token+DebuggerSupport.m in Sources */,
+				1A12C97311B89F8E008C9BED /* TreeException.m in Sources */,
+				1A12C97411B89F90008C9BED /* TreeParser.m in Sources */,
+				1A65B7D911B9532A00FD8754 /* BufferedTreeNodeStream.m in Sources */,
+				1AB4A54211B995290076E91A /* EarlyExitException.m in Sources */,
+				1AB4A54311B9952A0076E91A /* FailedPredicateException.m in Sources */,
+				1AB4A59211B9A0DA0076E91A /* StreamEnumerator.m in Sources */,
+				1A8AC00D11BAEC710038DBB0 /* RuntimeException.m in Sources */,
+				1A1D465C11BE73B2001575F3 /* BaseTreeAdaptor.m in Sources */,
+				1A1D467111BE75C0001575F3 /* MapElement.m in Sources */,
+				1A1D467D11BE8E5A001575F3 /* CommonErrorNode.m in Sources */,
+				1A6C451711BF4EE00039788A /* MissingTokenException.m in Sources */,
+				1A6C452911BF50A40039788A /* UnwantedTokenException.m in Sources */,
+				1A1702FF11C05D4800F6978A /* HashMap.m in Sources */,
+				1A270BFA11C1451200DCC8F3 /* TreeIterator.m in Sources */,
+				1A26329611C53578000DCDD4 /* MismatchedNotSetException.m in Sources */,
+				1A16B13D11C66492002860C7 /* LinkBase.m in Sources */,
+				1A45657811C922BE0082F421 /* RuleMemo.m in Sources */,
+				1A45658A11C9270D0082F421 /* BaseMapElement.m in Sources */,
+				1A1BCDBC11CB01E60051A1EC /* RuleReturnScope.m in Sources */,
+				1A1BCDD011CB0B3D0051A1EC /* TreeRuleReturnScope.m in Sources */,
+				1A1BCE2B11CB1A3E0051A1EC /* TreeRewriter.m in Sources */,
+				1A4A851311CBCE3E00E4BF1B /* TreeVisitor.m in Sources */,
+				1A4A851911CBCE5500E4BF1B /* TreeVisitorAction.m in Sources */,
+				1A4A851F11CBCF3700E4BF1B /* TreeWizard.m in Sources */,
+				1AAC202D11CC621A00CF56D1 /* TreePatternLexer.m in Sources */,
+				1AAC20A611CC790300CF56D1 /* TreePatternParser.m in Sources */,
+				1A5EA50C11CFE7CE00E8932F /* Map.m in Sources */,
+				1A75BFBA11D6C2B10096C6F5 /* DFA.m in Sources */,
+				1AE8A96D11D9227A00D36FD6 /* RuleStack.m in Sources */,
+				1A3A08E711E213C500D5EE26 /* BaseStack.m in Sources */,
+				1A3A08EB11E213E100D5EE26 /* SymbolStack.m in Sources */,
+				1AB5F47811E3869D00E065B0 /* RuleMapElement.m in Sources */,
+				1AB5F51F11E3BE2E00E065B0 /* PtrBuffer.m in Sources */,
+				1A2D217611E4F57C00DFE328 /* UniqueIDMap.m in Sources */,
+				1A2D218711E502DE00DFE328 /* NodeMapElement.m in Sources */,
+				1A100ABC11E604FE006ABF94 /* HashRule.m in Sources */,
+				1AEECE1611E7EB3D00554AAF /* TokenRewriteStream.m in Sources */,
+				1A86B91C11EB9F6300C67A03 /* ParseTree.m in Sources */,
+				1A86BAD011EC1CD000C67A03 /* UnbufferedTokenStream.m in Sources */,
+				BF7D9B541519363200B58218 /* ACBTree.m in Sources */,
+				BF7D9B581519367800B58218 /* AMutableArray.m in Sources */,
+				BF7D9B5C1519368C00B58218 /* AMutableDictionary.m in Sources */,
+				BF7D9B60151936B600B58218 /* DoubleKeyMap.m in Sources */,
+				BF7D9B64151936E700B58218 /* ANTLRFileStream.m in Sources */,
+				BF7D9B68151936FC00B58218 /* ANTLRInputStream.m in Sources */,
+				BF7D9B6C1519371200B58218 /* ANTLRReaderStream.m in Sources */,
+				BF7D9B701519373700B58218 /* RewriteRuleNodeStream.m in Sources */,
+				BF7D9B741519375200B58218 /* ArrayIterator.m in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -4530,6 +4602,7 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				ANTLR_EXTRA_JAVA_ARGS = "/Library/Java/Extensions/antlr-2.7.7.jar:/Users/acondit/IdeaProjects/antlr3/out/production/antlr3:/Users/acondit/IdeaProjects/antlr3/out/production/stringtemplate";
+				ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
 				COPY_PHASE_STRIP = NO;
 				CURRENT_PROJECT_VERSION = 1;
 				DEBUG_INFORMATION_FORMAT = dwarf;
@@ -4560,10 +4633,7 @@
 		1DEB91AF08733DA50010E9CD /* Release */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ARCHS = (
-					ppc,
-					i386,
-				);
+				ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
 				BUILD_VARIANTS = (
 					normal,
 					debug,
@@ -4591,6 +4661,7 @@
 			buildSettings = {
 				ANTLR_EXTRA_ARGS = "";
 				ANTLR_EXTRA_JAVA_ARGS = "";
+				ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
 				DEBUG_INFORMATION_FORMAT = dwarf;
 				GCC_C_LANGUAGE_STANDARD = gnu99;
 				GCC_DEBUGGING_SYMBOLS = full;
@@ -4618,10 +4689,7 @@
 			buildSettings = {
 				ANTLR_EXTRA_ARGS = "";
 				ANTLR_EXTRA_JAVA_ARGS = "";
-				ARCHS = (
-					ppc,
-					i386,
-				);
+				ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
 				GCC_C_LANGUAGE_STANDARD = gnu99;
 				GCC_ENABLE_OBJC_EXCEPTIONS = YES;
 				GCC_WARN_ABOUT_MISSING_NEWLINE = YES;
@@ -5030,6 +5098,7 @@
 			buildSettings = {
 				ANTLR_EXTRA_ARGS = "";
 				ANTLR_EXTRA_JAVA_ARGS = "";
+				ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
 				DEBUG_INFORMATION_FORMAT = dwarf;
 				GCC_C_LANGUAGE_STANDARD = gnu99;
 				GCC_DEBUGGING_SYMBOLS = full;
@@ -5054,6 +5123,7 @@
 		F7C562310CD513D400727DB0 /* Debug with StringTemplate Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
+				ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
 				COPY_PHASE_STRIP = NO;
 				CURRENT_PROJECT_VERSION = 1;
 				DEBUG_INFORMATION_FORMAT = dwarf;
diff --git a/runtime/ObjC/Framework/ANTLR/ANTLR.xcodeproj/project.pbxproj b/runtime/ObjC/Framework/ANTLR/ANTLR.xcodeproj/project.pbxproj
deleted file mode 100644
index 1596463..0000000
--- a/runtime/ObjC/Framework/ANTLR/ANTLR.xcodeproj/project.pbxproj
+++ /dev/null
@@ -1,3048 +0,0 @@
-// !$*UTF8*$!
-{
-	archiveVersion = 1;
-	classes = {
-	};
-	objectVersion = 46;
-	objects = {
-
-/* Begin PBXBuildFile section */
-		1A048D21134E8C1100005F57 /* antlr3.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A048D01134E8C1000005F57 /* antlr3.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A048D22134E8C1100005F57 /* ANTLRBaseMapElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A048D02134E8C1000005F57 /* ANTLRBaseMapElement.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A048D23134E8C1100005F57 /* ANTLRBaseRecognizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A048D03134E8C1000005F57 /* ANTLRBaseRecognizer.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A048D24134E8C1100005F57 /* ANTLRBaseStack.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A048D04134E8C1000005F57 /* ANTLRBaseStack.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A048D25134E8C1100005F57 /* ANTLRBaseTree.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A048D05134E8C1000005F57 /* ANTLRBaseTree.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A048D26134E8C1100005F57 /* ANTLRBaseTreeAdaptor.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A048D06134E8C1000005F57 /* ANTLRBaseTreeAdaptor.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A048D27134E8C1100005F57 /* ANTLRBitSet.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A048D07134E8C1000005F57 /* ANTLRBitSet.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A048D28134E8C1100005F57 /* ANTLRBufferedTokenStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A048D08134E8C1000005F57 /* ANTLRBufferedTokenStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A048D29134E8C1100005F57 /* ANTLRBufferedTreeNodeStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A048D09134E8C1000005F57 /* ANTLRBufferedTreeNodeStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A048D2A134E8C1100005F57 /* ANTLRCharStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A048D0A134E8C1000005F57 /* ANTLRCharStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A048D2B134E8C1100005F57 /* ANTLRCharStreamState.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A048D0B134E8C1000005F57 /* ANTLRCharStreamState.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A048D2C134E8C1100005F57 /* ANTLRCommonErrorNode.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A048D0C134E8C1000005F57 /* ANTLRCommonErrorNode.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A048D2D134E8C1100005F57 /* ANTLRCommonToken.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A048D0D134E8C1000005F57 /* ANTLRCommonToken.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A048D2E134E8C1100005F57 /* ANTLRCommonTokenStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A048D0E134E8C1000005F57 /* ANTLRCommonTokenStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A048D2F134E8C1100005F57 /* ANTLRCommonTree.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A048D0F134E8C1000005F57 /* ANTLRCommonTree.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A048D30134E8C1100005F57 /* ANTLRCommonTreeAdaptor.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A048D10134E8C1000005F57 /* ANTLRCommonTreeAdaptor.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A048D31134E8C1100005F57 /* ANTLRCommonTreeNodeStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A048D11134E8C1000005F57 /* ANTLRCommonTreeNodeStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A048D33134E8C1100005F57 /* ANTLRDebug.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A048D13134E8C1100005F57 /* ANTLRDebug.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A048D34134E8C1100005F57 /* ANTLRDebugEventListener.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A048D14134E8C1100005F57 /* ANTLRDebugEventListener.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A048D35134E8C1100005F57 /* ANTLRDebugEventProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A048D15134E8C1100005F57 /* ANTLRDebugEventProxy.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A048D36134E8C1100005F57 /* ANTLRDebugParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A048D16134E8C1100005F57 /* ANTLRDebugParser.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A048D37134E8C1100005F57 /* ANTLRDebugTokenStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A048D17134E8C1100005F57 /* ANTLRDebugTokenStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A048D38134E8C1100005F57 /* ANTLRDebugTreeAdaptor.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A048D18134E8C1100005F57 /* ANTLRDebugTreeAdaptor.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A048D39134E8C1100005F57 /* ANTLRDebugTreeNodeStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A048D19134E8C1100005F57 /* ANTLRDebugTreeNodeStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A048D3A134E8C1100005F57 /* ANTLRDebugTreeParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A048D1A134E8C1100005F57 /* ANTLRDebugTreeParser.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A048D3B134E8C1100005F57 /* ANTLRDFA.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A048D1B134E8C1100005F57 /* ANTLRDFA.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A048D3C134E8C1100005F57 /* ANTLRDoubleKeyMap.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A048D1C134E8C1100005F57 /* ANTLRDoubleKeyMap.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A048D3D134E8C1100005F57 /* ANTLREarlyExitException.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A048D1D134E8C1100005F57 /* ANTLREarlyExitException.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A048D3E134E8C1100005F57 /* ANTLRError.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A048D1E134E8C1100005F57 /* ANTLRError.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A048D3F134E8C1100005F57 /* ANTLRFailedPredicateException.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A048D1F134E8C1100005F57 /* ANTLRFailedPredicateException.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A048D40134E8C1100005F57 /* ANTLRFastQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A048D20134E8C1100005F57 /* ANTLRFastQueue.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A63BC6E134F5DE5002EDFB4 /* FuzzyLexer.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A63BC6B134F5DE4002EDFB4 /* FuzzyLexer.m */; };
-		1A63BC6F134F5DE5002EDFB4 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A63BC6C134F5DE5002EDFB4 /* main.m */; };
-		1A63BC70134F5E43002EDFB4 /* ANTLR.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1AE72318134E860B001C3F35 /* ANTLR.framework */; };
-		1A63BD89134F5FF3002EDFB4 /* CombinedLexer.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A63BC7E134F5EB1002EDFB4 /* CombinedLexer.m */; };
-		1A63BD8A134F5FF3002EDFB4 /* CombinedParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A63BC80134F5EB1002EDFB4 /* CombinedParser.m */; };
-		1A63BD8B134F5FF3002EDFB4 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A63BC81134F5EB1002EDFB4 /* main.m */; };
-		1A63BD94134F606A002EDFB4 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A63BC9E134F5EB2002EDFB4 /* main.m */; };
-		1A63BD95134F606A002EDFB4 /* TestLexer.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A63BCA9134F5EB2002EDFB4 /* TestLexer.m */; };
-		1A63BDAF134F614D002EDFB4 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1AE7231B134E860B001C3F35 /* Cocoa.framework */; };
-		1A63BDB4134F6154002EDFB4 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1AE7231B134E860B001C3F35 /* Cocoa.framework */; };
-		1A63BDB9134F615A002EDFB4 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1AE7231B134E860B001C3F35 /* Cocoa.framework */; };
-		1A63BDBE134F6160002EDFB4 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1AE7231B134E860B001C3F35 /* Cocoa.framework */; };
-		1A63BDC3134F6167002EDFB4 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1AE7231B134E860B001C3F35 /* Cocoa.framework */; };
-		1A63BDC7134F61E4002EDFB4 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A63BCB0134F5EB2002EDFB4 /* main.m */; };
-		1A63BDC8134F61E8002EDFB4 /* SimpleCLexer.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A63BCB6134F5EB2002EDFB4 /* SimpleCLexer.m */; };
-		1A63BDC9134F61EC002EDFB4 /* SimpleCParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A63BCB8134F5EB2002EDFB4 /* SimpleCParser.m */; };
-		1A63BDCA134F6218002EDFB4 /* Main.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A63BCBC134F5EB2002EDFB4 /* Main.m */; };
-		1A63BDCB134F6218002EDFB4 /* PolyDifferentiator.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A63BCCB134F5EB2002EDFB4 /* PolyDifferentiator.m */; };
-		1A63BDCC134F6218002EDFB4 /* PolyLexer.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A63BCCD134F5EB2002EDFB4 /* PolyLexer.m */; };
-		1A63BDCD134F6218002EDFB4 /* PolyParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A63BCCF134F5EB2002EDFB4 /* PolyParser.m */; };
-		1A63BDCE134F6218002EDFB4 /* PolyPrinter.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A63BCD2134F5EB2002EDFB4 /* PolyPrinter.m */; };
-		1A63BDCF134F6218002EDFB4 /* Simplifier.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A63BCD6134F5EB2002EDFB4 /* Simplifier.m */; };
-		1A63BDDD134F6258002EDFB4 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A63BCDB134F5EB2002EDFB4 /* main.m */; };
-		1A63BDDE134F6258002EDFB4 /* SymbolTableLexer.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A63BCE7134F5EB2002EDFB4 /* SymbolTableLexer.m */; };
-		1A63BDDF134F6258002EDFB4 /* SymbolTableParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A63BCE9134F5EB2002EDFB4 /* SymbolTableParser.m */; };
-		1A63BDE1134F626A002EDFB4 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1AE7231B134E860B001C3F35 /* Cocoa.framework */; };
-		1A63BDE7134F62CB002EDFB4 /* SimpleCLexer.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A63BD00134F5EB2002EDFB4 /* SimpleCLexer.m */; };
-		1A63BDE8134F62D0002EDFB4 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A63BCED134F5EB2002EDFB4 /* main.m */; };
-		1A63BDEA134F62D0002EDFB4 /* SimpleCTP.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A63BD07134F5EB2002EDFB4 /* SimpleCTP.m */; };
-		1A63BDEB134F62D0002EDFB4 /* SimpleCWalker.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A63BD0B134F5EB2002EDFB4 /* SimpleCWalker.m */; };
-		1A63BDEE134F932E002EDFB4 /* ANTLRIntStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AE72368134E8AB4001C3F35 /* ANTLRIntStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A63BDEF134F93A5002EDFB4 /* ANTLR.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1AE72318134E860B001C3F35 /* ANTLR.framework */; };
-		1A63BDF0134F93AC002EDFB4 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1AE7231B134E860B001C3F35 /* Cocoa.framework */; };
-		1A63BDF1134FAB4B002EDFB4 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1AE7231B134E860B001C3F35 /* Cocoa.framework */; };
-		1A63BDF2134FAB60002EDFB4 /* ANTLR.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1AE72318134E860B001C3F35 /* ANTLR.framework */; };
-		1A63BDF3134FAB63002EDFB4 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1AE7231B134E860B001C3F35 /* Cocoa.framework */; };
-		1A63BDF4134FAF58002EDFB4 /* ANTLR.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1AE72318134E860B001C3F35 /* ANTLR.framework */; };
-		1A63BDF5134FB55B002EDFB4 /* TreeRewriteLexer.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A63BD2B134F5EB2002EDFB4 /* TreeRewriteLexer.m */; };
-		1A63BDF6134FB55F002EDFB4 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A63BD21134F5EB2002EDFB4 /* main.m */; };
-		1A63BDF7134FB564002EDFB4 /* TreeRewriteParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A63BD2D134F5EB2002EDFB4 /* TreeRewriteParser.m */; };
-		1A63BE05134FB807002EDFB4 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A63BC94134F5EB2002EDFB4 /* main.m */; };
-		1A63BE06134FB80B002EDFB4 /* TLexer.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A63BC99134F5EB2002EDFB4 /* TLexer.m */; };
-		1A63BE07134FB80E002EDFB4 /* TParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A63BC9B134F5EB2002EDFB4 /* TParser.m */; };
-		1A63BE08134FB814002EDFB4 /* ANTLR.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1AE72318134E860B001C3F35 /* ANTLR.framework */; };
-		1A63BE09134FB818002EDFB4 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1AE7231B134E860B001C3F35 /* Cocoa.framework */; };
-		1A63BE0C134FB855002EDFB4 /* ANTLR.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1AE72318134E860B001C3F35 /* ANTLR.framework */; };
-		1A6B1CD7134E8CF70016A47D /* ANTLRFileStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1C97134E8CF70016A47D /* ANTLRFileStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1CD8134E8CF70016A47D /* ANTLRHashMap.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1C98134E8CF70016A47D /* ANTLRHashMap.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1CD9134E8CF70016A47D /* ANTLRHashRule.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1C99134E8CF70016A47D /* ANTLRHashRule.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1CDA134E8CF70016A47D /* ANTLRInputStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1C9A134E8CF70016A47D /* ANTLRInputStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1CDB134E8CF70016A47D /* ANTLRIntArray.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1C9B134E8CF70016A47D /* ANTLRIntArray.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1CDC134E8CF70016A47D /* ANTLRLexer.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1C9C134E8CF70016A47D /* ANTLRLexer.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1CDD134E8CF70016A47D /* ANTLRLexerRuleReturnScope.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1C9D134E8CF70016A47D /* ANTLRLexerRuleReturnScope.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1CDE134E8CF70016A47D /* ANTLRLexerState.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1C9E134E8CF70016A47D /* ANTLRLexerState.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1CDF134E8CF70016A47D /* ANTLRLinkBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1C9F134E8CF70016A47D /* ANTLRLinkBase.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1CE0134E8CF70016A47D /* ANTLRLookaheadStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CA0134E8CF70016A47D /* ANTLRLookaheadStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1CE1134E8CF70016A47D /* ANTLRMap.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CA1134E8CF70016A47D /* ANTLRMap.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1CE2134E8CF70016A47D /* ANTLRMapElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CA2134E8CF70016A47D /* ANTLRMapElement.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1CE3134E8CF70016A47D /* ANTLRMismatchedNotSetException.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CA3134E8CF70016A47D /* ANTLRMismatchedNotSetException.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1CE4134E8CF70016A47D /* ANTLRMismatchedRangeException.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CA4134E8CF70016A47D /* ANTLRMismatchedRangeException.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1CE5134E8CF70016A47D /* ANTLRMismatchedSetException.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CA5134E8CF70016A47D /* ANTLRMismatchedSetException.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1CE6134E8CF70016A47D /* ANTLRMismatchedTokenException.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CA6134E8CF70016A47D /* ANTLRMismatchedTokenException.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1CE7134E8CF70016A47D /* ANTLRMismatchedTreeNodeException.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CA7134E8CF70016A47D /* ANTLRMismatchedTreeNodeException.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1CE8134E8CF70016A47D /* ANTLRMissingTokenException.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CA8134E8CF70016A47D /* ANTLRMissingTokenException.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1CE9134E8CF70016A47D /* ANTLRNodeMapElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CA9134E8CF70016A47D /* ANTLRNodeMapElement.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1CEA134E8CF70016A47D /* ANTLRNoViableAltException.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CAA134E8CF70016A47D /* ANTLRNoViableAltException.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1CEB134E8CF70016A47D /* ANTLRParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CAB134E8CF70016A47D /* ANTLRParser.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1CEC134E8CF70016A47D /* ANTLRParserRuleReturnScope.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CAC134E8CF70016A47D /* ANTLRParserRuleReturnScope.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1CED134E8CF80016A47D /* ANTLRParseTree.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CAD134E8CF70016A47D /* ANTLRParseTree.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1CEE134E8CF80016A47D /* ANTLRPtrBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CAE134E8CF70016A47D /* ANTLRPtrBuffer.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1CEF134E8CF80016A47D /* ANTLRPtrStack.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CAF134E8CF70016A47D /* ANTLRPtrStack.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1CF0134E8CF80016A47D /* ANTLRReaderStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CB0134E8CF70016A47D /* ANTLRReaderStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1CF1134E8CF80016A47D /* ANTLRRecognitionException.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CB1134E8CF70016A47D /* ANTLRRecognitionException.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1CF2134E8CF80016A47D /* ANTLRRecognizerSharedState.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CB2134E8CF70016A47D /* ANTLRRecognizerSharedState.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1CF3134E8CF80016A47D /* ANTLRRewriteRuleElementStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CB3134E8CF70016A47D /* ANTLRRewriteRuleElementStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1CF4134E8CF80016A47D /* ANTLRRewriteRuleNodeStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CB4134E8CF70016A47D /* ANTLRRewriteRuleNodeStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1CF5134E8CF80016A47D /* ANTLRRewriteRuleSubtreeStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CB5134E8CF70016A47D /* ANTLRRewriteRuleSubtreeStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1CF6134E8CF80016A47D /* ANTLRRewriteRuleTokenStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CB6134E8CF70016A47D /* ANTLRRewriteRuleTokenStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1CF7134E8CF80016A47D /* ANTLRRuleMapElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CB7134E8CF70016A47D /* ANTLRRuleMapElement.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1CF8134E8CF80016A47D /* ANTLRRuleMemo.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CB8134E8CF70016A47D /* ANTLRRuleMemo.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1CF9134E8CF80016A47D /* ANTLRRuleReturnScope.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CB9134E8CF70016A47D /* ANTLRRuleReturnScope.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1CFA134E8CF80016A47D /* ANTLRRuleStack.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CBA134E8CF70016A47D /* ANTLRRuleStack.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1CFB134E8CF80016A47D /* ANTLRRuntimeException.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CBB134E8CF70016A47D /* ANTLRRuntimeException.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1CFC134E8CF80016A47D /* ANTLRStreamEnumerator.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CBC134E8CF70016A47D /* ANTLRStreamEnumerator.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1CFD134E8CF80016A47D /* ANTLRStringStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CBD134E8CF70016A47D /* ANTLRStringStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1CFE134E8CF80016A47D /* ANTLRStringStreamState.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CBE134E8CF70016A47D /* ANTLRStringStreamState.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1CFF134E8CF80016A47D /* ANTLRSymbolStack.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CBF134E8CF70016A47D /* ANTLRSymbolStack.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1D00134E8CF80016A47D /* ANTLRToken.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CC0134E8CF70016A47D /* ANTLRToken.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1D01134E8CF80016A47D /* ANTLRToken+DebuggerSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CC1134E8CF70016A47D /* ANTLRToken+DebuggerSupport.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1D02134E8CF80016A47D /* ANTLRTokenRewriteStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CC2134E8CF70016A47D /* ANTLRTokenRewriteStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1D03134E8CF80016A47D /* ANTLRTokenSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CC3134E8CF70016A47D /* ANTLRTokenSource.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1D04134E8CF80016A47D /* ANTLRTokenStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CC4134E8CF70016A47D /* ANTLRTokenStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1D05134E8CF80016A47D /* ANTLRTree.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CC5134E8CF70016A47D /* ANTLRTree.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1D06134E8CF80016A47D /* ANTLRTreeAdaptor.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CC6134E8CF70016A47D /* ANTLRTreeAdaptor.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1D07134E8CF80016A47D /* ANTLRTreeException.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CC7134E8CF70016A47D /* ANTLRTreeException.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1D08134E8CF90016A47D /* ANTLRTreeIterator.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CC8134E8CF70016A47D /* ANTLRTreeIterator.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1D09134E8CF90016A47D /* ANTLRTreeNodeStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CC9134E8CF70016A47D /* ANTLRTreeNodeStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1D0A134E8CF90016A47D /* ANTLRTreeParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CCA134E8CF70016A47D /* ANTLRTreeParser.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1D0B134E8CF90016A47D /* ANTLRTreePatternLexer.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CCB134E8CF70016A47D /* ANTLRTreePatternLexer.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1D0C134E8CF90016A47D /* ANTLRTreePatternParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CCC134E8CF70016A47D /* ANTLRTreePatternParser.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1D0D134E8CF90016A47D /* ANTLRTreeRewriter.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CCD134E8CF70016A47D /* ANTLRTreeRewriter.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1D0E134E8CF90016A47D /* ANTLRTreeRuleReturnScope.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CCE134E8CF70016A47D /* ANTLRTreeRuleReturnScope.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1D0F134E8CF90016A47D /* ANTLRTreeVisitor.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CCF134E8CF70016A47D /* ANTLRTreeVisitor.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1D10134E8CF90016A47D /* ANTLRTreeVisitorAction.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CD0134E8CF70016A47D /* ANTLRTreeVisitorAction.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1D11134E8CF90016A47D /* ANTLRTreeWizard.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CD1134E8CF70016A47D /* ANTLRTreeWizard.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1D12134E8CF90016A47D /* ANTLRUnbufferedCommonTreeNodeStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CD2134E8CF70016A47D /* ANTLRUnbufferedCommonTreeNodeStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1D13134E8CF90016A47D /* ANTLRUnbufferedCommonTreeNodeStreamState.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CD3134E8CF70016A47D /* ANTLRUnbufferedCommonTreeNodeStreamState.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1D14134E8CF90016A47D /* ANTLRUnbufferedTokenStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CD4134E8CF70016A47D /* ANTLRUnbufferedTokenStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1D15134E8CF90016A47D /* ANTLRUniqueIDMap.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CD5134E8CF70016A47D /* ANTLRUniqueIDMap.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1D16134E8CF90016A47D /* ANTLRUnwantedTokenException.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6B1CD6134E8CF70016A47D /* ANTLRUnwantedTokenException.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1A6B1D64134E8DEB0016A47D /* ANTLRFastQueueTest.h in Sources */ = {isa = PBXBuildFile; fileRef = 1A6B1D4A134E8DA10016A47D /* ANTLRFastQueueTest.h */; };
-		1A6B1D65134E8DEB0016A47D /* ANTLRFastQueueTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A6B1D4B134E8DA10016A47D /* ANTLRFastQueueTest.m */; };
-		1A6B1D66134E8DEB0016A47D /* ANTLRIntArrayTest.h in Sources */ = {isa = PBXBuildFile; fileRef = 1A6B1D4C134E8DA10016A47D /* ANTLRIntArrayTest.h */; };
-		1A6B1D67134E8DEB0016A47D /* ANTLRIntArrayTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A6B1D4D134E8DA10016A47D /* ANTLRIntArrayTest.m */; };
-		1A6B1D68134E8DEB0016A47D /* ANTLRRecognizerTest.h in Sources */ = {isa = PBXBuildFile; fileRef = 1A6B1D4F134E8DA10016A47D /* ANTLRRecognizerTest.h */; };
-		1A6B1D69134E8DEB0016A47D /* ANTLRRecognizerTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A6B1D50134E8DA10016A47D /* ANTLRRecognizerTest.m */; };
-		1A6B1D6A134E8DEB0016A47D /* ANTLRBitSetTest.h in Sources */ = {isa = PBXBuildFile; fileRef = 1A6B1D52134E8DA10016A47D /* ANTLRBitSetTest.h */; };
-		1A6B1D6B134E8DEB0016A47D /* ANTLRBitSetTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A6B1D53134E8DA10016A47D /* ANTLRBitSetTest.m */; };
-		1A6B1D6C134E8DEB0016A47D /* ANTLRStringStreamTest.h in Sources */ = {isa = PBXBuildFile; fileRef = 1A6B1D55134E8DA10016A47D /* ANTLRStringStreamTest.h */; };
-		1A6B1D6D134E8DEB0016A47D /* ANTLRStringStreamTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A6B1D56134E8DA10016A47D /* ANTLRStringStreamTest.m */; };
-		1A6B1D6E134E8DEB0016A47D /* TestRewriteRuleTokenStream.h in Sources */ = {isa = PBXBuildFile; fileRef = 1A6B1D58134E8DA10016A47D /* TestRewriteRuleTokenStream.h */; };
-		1A6B1D6F134E8DEB0016A47D /* TestRewriteRuleTokenStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A6B1D59134E8DA10016A47D /* TestRewriteRuleTokenStream.m */; };
-		1A6B1D70134E8DEB0016A47D /* ANTLRCommonTokenTest.h in Sources */ = {isa = PBXBuildFile; fileRef = 1A6B1D5B134E8DA10016A47D /* ANTLRCommonTokenTest.h */; };
-		1A6B1D71134E8DEB0016A47D /* ANTLRCommonTokenTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A6B1D5C134E8DA10016A47D /* ANTLRCommonTokenTest.m */; };
-		1A6B1D72134E8DEB0016A47D /* ANTLRCommonErrorNodeTest.h in Sources */ = {isa = PBXBuildFile; fileRef = 1A6B1D5E134E8DA10016A47D /* ANTLRCommonErrorNodeTest.h */; };
-		1A6B1D73134E8DEB0016A47D /* ANTLRCommonErrorNodeTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A6B1D5F134E8DA10016A47D /* ANTLRCommonErrorNodeTest.m */; };
-		1A6B1D74134E8DEB0016A47D /* ANTLRCommonTreeAdaptorTest.h in Sources */ = {isa = PBXBuildFile; fileRef = 1A6B1D60134E8DA10016A47D /* ANTLRCommonTreeAdaptorTest.h */; };
-		1A6B1D75134E8DEC0016A47D /* ANTLRCommonTreeAdaptorTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A6B1D61134E8DA10016A47D /* ANTLRCommonTreeAdaptorTest.m */; };
-		1A6B1D76134E8DEC0016A47D /* ANTLRCommonTreeTest.h in Sources */ = {isa = PBXBuildFile; fileRef = 1A6B1D62134E8DA10016A47D /* ANTLRCommonTreeTest.h */; };
-		1A6B1D77134E8DEC0016A47D /* ANTLRCommonTreeTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A6B1D63134E8DA10016A47D /* ANTLRCommonTreeTest.m */; };
-		1A6B1D79134EA0970016A47D /* SenTestingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A6B1D78134EA0970016A47D /* SenTestingKit.framework */; };
-		1A76A02F134FD4160041634F /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A63BD1B134F5EB2002EDFB4 /* main.m */; };
-		1A76A030134FD4A00041634F /* LangLexer.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A63BD17134F5EB2002EDFB4 /* LangLexer.m */; };
-		1A76A031134FD4A40041634F /* LangParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A63BD19134F5EB2002EDFB4 /* LangParser.m */; };
-		1A76A032134FD4B90041634F /* LangDumpDecl.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A63BD14134F5EB2002EDFB4 /* LangDumpDecl.m */; };
-		1AAC1C3D134FD6A500B2DC68 /* ANTLR.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AAC1C3C134FD6A500B2DC68 /* ANTLR.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		1AB7FE15134FBF900059474B /* ANTLR.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1AE72318134E860B001C3F35 /* ANTLR.framework */; };
-		1AB7FE16134FBF9F0059474B /* ANTLR.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1AE72318134E860B001C3F35 /* ANTLR.framework */; };
-		1AB7FE17134FBFB20059474B /* ANTLR.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1AE72318134E860B001C3F35 /* ANTLR.framework */; };
-		1AB7FE18134FC0800059474B /* ANTLR.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1AE72318134E860B001C3F35 /* ANTLR.framework */; };
-		1AE7231C134E860B001C3F35 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1AE7231B134E860B001C3F35 /* Cocoa.framework */; };
-		1AE72326134E860B001C3F35 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1AE72324134E860B001C3F35 /* InfoPlist.strings */; };
-		1AE7232E134E860B001C3F35 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1AE7231B134E860B001C3F35 /* Cocoa.framework */; };
-		1AE72331134E860B001C3F35 /* ANTLR.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1AE72318134E860B001C3F35 /* ANTLR.framework */; };
-		1AE72337134E860B001C3F35 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1AE72335134E860B001C3F35 /* InfoPlist.strings */; };
-		1AE7233A134E860B001C3F35 /* ANTLRTests.h in Resources */ = {isa = PBXBuildFile; fileRef = 1AE72339134E860B001C3F35 /* ANTLRTests.h */; };
-		1AE7233C134E860B001C3F35 /* ANTLRTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE7233B134E860B001C3F35 /* ANTLRTests.m */; };
-		1AE72347134E89BF001C3F35 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1AE72345134E89BF001C3F35 /* CoreFoundation.framework */; };
-		1AE72348134E89BF001C3F35 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1AE72346134E89BF001C3F35 /* Foundation.framework */; };
-		1AE7239F134E8AB4001C3F35 /* ANTLRBaseMapElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72349134E8AB4001C3F35 /* ANTLRBaseMapElement.m */; };
-		1AE723A0134E8AB4001C3F35 /* ANTLRBaseRecognizer.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE7234A134E8AB4001C3F35 /* ANTLRBaseRecognizer.m */; };
-		1AE723A1134E8AB4001C3F35 /* ANTLRBaseStack.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE7234B134E8AB4001C3F35 /* ANTLRBaseStack.m */; };
-		1AE723A2134E8AB4001C3F35 /* ANTLRBaseTree.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE7234C134E8AB4001C3F35 /* ANTLRBaseTree.m */; };
-		1AE723A3134E8AB4001C3F35 /* ANTLRBaseTreeAdaptor.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE7234D134E8AB4001C3F35 /* ANTLRBaseTreeAdaptor.m */; };
-		1AE723A4134E8AB4001C3F35 /* ANTLRBitSet.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE7234E134E8AB4001C3F35 /* ANTLRBitSet.m */; };
-		1AE723A5134E8AB4001C3F35 /* ANTLRBufferedTokenStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE7234F134E8AB4001C3F35 /* ANTLRBufferedTokenStream.m */; };
-		1AE723A6134E8AB4001C3F35 /* ANTLRBufferedTreeNodeStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72350134E8AB4001C3F35 /* ANTLRBufferedTreeNodeStream.m */; };
-		1AE723A7134E8AB4001C3F35 /* ANTLRCharStreamState.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72351134E8AB4001C3F35 /* ANTLRCharStreamState.m */; };
-		1AE723A8134E8AB4001C3F35 /* ANTLRCommonErrorNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72352134E8AB4001C3F35 /* ANTLRCommonErrorNode.m */; };
-		1AE723A9134E8AB4001C3F35 /* ANTLRCommonToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72353134E8AB4001C3F35 /* ANTLRCommonToken.m */; };
-		1AE723AA134E8AB4001C3F35 /* ANTLRCommonTokenStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72354134E8AB4001C3F35 /* ANTLRCommonTokenStream.m */; };
-		1AE723AB134E8AB4001C3F35 /* ANTLRCommonTree.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72355134E8AB4001C3F35 /* ANTLRCommonTree.m */; };
-		1AE723AC134E8AB4001C3F35 /* ANTLRCommonTreeAdaptor.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72356134E8AB4001C3F35 /* ANTLRCommonTreeAdaptor.m */; };
-		1AE723AD134E8AB4001C3F35 /* ANTLRCommonTreeNodeStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72357134E8AB4001C3F35 /* ANTLRCommonTreeNodeStream.m */; };
-		1AE723AE134E8AB4001C3F35 /* ANTLRDebugEventProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72358134E8AB4001C3F35 /* ANTLRDebugEventProxy.m */; };
-		1AE723AF134E8AB4001C3F35 /* ANTLRDebugParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72359134E8AB4001C3F35 /* ANTLRDebugParser.m */; };
-		1AE723B0134E8AB4001C3F35 /* ANTLRDebugTokenStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE7235A134E8AB4001C3F35 /* ANTLRDebugTokenStream.m */; };
-		1AE723B1134E8AB4001C3F35 /* ANTLRDebugTreeAdaptor.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE7235B134E8AB4001C3F35 /* ANTLRDebugTreeAdaptor.m */; };
-		1AE723B2134E8AB4001C3F35 /* ANTLRDebugTreeNodeStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE7235C134E8AB4001C3F35 /* ANTLRDebugTreeNodeStream.m */; };
-		1AE723B3134E8AB4001C3F35 /* ANTLRDebugTreeParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE7235D134E8AB4001C3F35 /* ANTLRDebugTreeParser.m */; };
-		1AE723B4134E8AB4001C3F35 /* ANTLRDFA.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE7235E134E8AB4001C3F35 /* ANTLRDFA.m */; };
-		1AE723B5134E8AB4001C3F35 /* ANTLRDoubleKeyMap.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE7235F134E8AB4001C3F35 /* ANTLRDoubleKeyMap.m */; };
-		1AE723B6134E8AB4001C3F35 /* ANTLREarlyExitException.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72360134E8AB4001C3F35 /* ANTLREarlyExitException.m */; };
-		1AE723B7134E8AB4001C3F35 /* ANTLRFailedPredicateException.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72361134E8AB4001C3F35 /* ANTLRFailedPredicateException.m */; };
-		1AE723B8134E8AB4001C3F35 /* ANTLRFastQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72362134E8AB4001C3F35 /* ANTLRFastQueue.m */; };
-		1AE723B9134E8AB4001C3F35 /* ANTLRFileStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72363134E8AB4001C3F35 /* ANTLRFileStream.m */; };
-		1AE723BA134E8AB5001C3F35 /* ANTLRHashMap.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72364134E8AB4001C3F35 /* ANTLRHashMap.m */; };
-		1AE723BB134E8AB5001C3F35 /* ANTLRHashRule.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72365134E8AB4001C3F35 /* ANTLRHashRule.m */; };
-		1AE723BC134E8AB5001C3F35 /* ANTLRInputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72366134E8AB4001C3F35 /* ANTLRInputStream.m */; };
-		1AE723BD134E8AB5001C3F35 /* ANTLRIntArray.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72367134E8AB4001C3F35 /* ANTLRIntArray.m */; };
-		1AE723BF134E8AB5001C3F35 /* ANTLRLexer.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72369134E8AB4001C3F35 /* ANTLRLexer.m */; };
-		1AE723C0134E8AB5001C3F35 /* ANTLRLexerRuleReturnScope.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE7236A134E8AB4001C3F35 /* ANTLRLexerRuleReturnScope.m */; };
-		1AE723C1134E8AB5001C3F35 /* ANTLRLexerState.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE7236B134E8AB4001C3F35 /* ANTLRLexerState.m */; };
-		1AE723C2134E8AB5001C3F35 /* ANTLRLinkBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE7236C134E8AB4001C3F35 /* ANTLRLinkBase.m */; };
-		1AE723C3134E8AB5001C3F35 /* ANTLRLookaheadStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE7236D134E8AB4001C3F35 /* ANTLRLookaheadStream.m */; };
-		1AE723C4134E8AB5001C3F35 /* ANTLRMap.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE7236E134E8AB4001C3F35 /* ANTLRMap.m */; };
-		1AE723C5134E8AB5001C3F35 /* ANTLRMapElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE7236F134E8AB4001C3F35 /* ANTLRMapElement.m */; };
-		1AE723C6134E8AB5001C3F35 /* ANTLRMismatchedNotSetException.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72370134E8AB4001C3F35 /* ANTLRMismatchedNotSetException.m */; };
-		1AE723C7134E8AB5001C3F35 /* ANTLRMismatchedRangeException.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72371134E8AB4001C3F35 /* ANTLRMismatchedRangeException.m */; };
-		1AE723C8134E8AB5001C3F35 /* ANTLRMismatchedSetException.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72372134E8AB4001C3F35 /* ANTLRMismatchedSetException.m */; };
-		1AE723C9134E8AB5001C3F35 /* ANTLRMismatchedTokenException.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72373134E8AB4001C3F35 /* ANTLRMismatchedTokenException.m */; };
-		1AE723CA134E8AB5001C3F35 /* ANTLRMismatchedTreeNodeException.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72374134E8AB4001C3F35 /* ANTLRMismatchedTreeNodeException.m */; };
-		1AE723CB134E8AB5001C3F35 /* ANTLRMissingTokenException.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72375134E8AB4001C3F35 /* ANTLRMissingTokenException.m */; };
-		1AE723CC134E8AB5001C3F35 /* ANTLRNodeMapElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72376134E8AB4001C3F35 /* ANTLRNodeMapElement.m */; };
-		1AE723CD134E8AB5001C3F35 /* ANTLRNoViableAltException.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72377134E8AB4001C3F35 /* ANTLRNoViableAltException.m */; };
-		1AE723CE134E8AB5001C3F35 /* ANTLRParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72378134E8AB4001C3F35 /* ANTLRParser.m */; };
-		1AE723CF134E8AB5001C3F35 /* ANTLRParserRuleReturnScope.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72379134E8AB4001C3F35 /* ANTLRParserRuleReturnScope.m */; };
-		1AE723D0134E8AB5001C3F35 /* ANTLRParseTree.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE7237A134E8AB4001C3F35 /* ANTLRParseTree.m */; };
-		1AE723D1134E8AB5001C3F35 /* ANTLRPtrBuffer.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE7237B134E8AB4001C3F35 /* ANTLRPtrBuffer.m */; };
-		1AE723D2134E8AB5001C3F35 /* ANTLRPtrStack.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE7237C134E8AB4001C3F35 /* ANTLRPtrStack.m */; };
-		1AE723D3134E8AB5001C3F35 /* ANTLRReaderStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE7237D134E8AB4001C3F35 /* ANTLRReaderStream.m */; };
-		1AE723D4134E8AB5001C3F35 /* ANTLRRecognitionException.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE7237E134E8AB4001C3F35 /* ANTLRRecognitionException.m */; };
-		1AE723D5134E8AB5001C3F35 /* ANTLRRecognizerSharedState.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE7237F134E8AB4001C3F35 /* ANTLRRecognizerSharedState.m */; };
-		1AE723D6134E8AB5001C3F35 /* ANTLRRewriteRuleElementStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72380134E8AB4001C3F35 /* ANTLRRewriteRuleElementStream.m */; };
-		1AE723D7134E8AB5001C3F35 /* ANTLRRewriteRuleNodeStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72381134E8AB4001C3F35 /* ANTLRRewriteRuleNodeStream.m */; };
-		1AE723D8134E8AB5001C3F35 /* ANTLRRewriteRuleSubtreeStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72382134E8AB4001C3F35 /* ANTLRRewriteRuleSubtreeStream.m */; };
-		1AE723D9134E8AB5001C3F35 /* ANTLRRewriteRuleTokenStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72383134E8AB4001C3F35 /* ANTLRRewriteRuleTokenStream.m */; };
-		1AE723DA134E8AB5001C3F35 /* ANTLRRuleMapElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72384134E8AB4001C3F35 /* ANTLRRuleMapElement.m */; };
-		1AE723DB134E8AB5001C3F35 /* ANTLRRuleMemo.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72385134E8AB4001C3F35 /* ANTLRRuleMemo.m */; };
-		1AE723DC134E8AB5001C3F35 /* ANTLRRuleReturnScope.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72386134E8AB4001C3F35 /* ANTLRRuleReturnScope.m */; };
-		1AE723DD134E8AB5001C3F35 /* ANTLRRuleStack.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72387134E8AB4001C3F35 /* ANTLRRuleStack.m */; };
-		1AE723DE134E8AB5001C3F35 /* ANTLRRuntimeException.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72388134E8AB4001C3F35 /* ANTLRRuntimeException.m */; };
-		1AE723DF134E8AB5001C3F35 /* ANTLRStreamEnumerator.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72389134E8AB4001C3F35 /* ANTLRStreamEnumerator.m */; };
-		1AE723E0134E8AB5001C3F35 /* ANTLRStringStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE7238A134E8AB4001C3F35 /* ANTLRStringStream.m */; };
-		1AE723E1134E8AB5001C3F35 /* ANTLRSymbolStack.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE7238B134E8AB4001C3F35 /* ANTLRSymbolStack.m */; };
-		1AE723E2134E8AB5001C3F35 /* ANTLRToken+DebuggerSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE7238C134E8AB4001C3F35 /* ANTLRToken+DebuggerSupport.m */; };
-		1AE723E3134E8AB6001C3F35 /* ANTLRTokenRewriteStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE7238D134E8AB4001C3F35 /* ANTLRTokenRewriteStream.m */; };
-		1AE723E5134E8AB6001C3F35 /* ANTLRTreeAdaptor.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE7238F134E8AB4001C3F35 /* ANTLRTreeAdaptor.m */; };
-		1AE723E6134E8AB6001C3F35 /* ANTLRTreeException.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72390134E8AB4001C3F35 /* ANTLRTreeException.m */; };
-		1AE723E7134E8AB6001C3F35 /* ANTLRTreeIterator.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72391134E8AB4001C3F35 /* ANTLRTreeIterator.m */; };
-		1AE723E8134E8AB6001C3F35 /* ANTLRTreeParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72392134E8AB4001C3F35 /* ANTLRTreeParser.m */; };
-		1AE723E9134E8AB6001C3F35 /* ANTLRTreePatternLexer.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72393134E8AB4001C3F35 /* ANTLRTreePatternLexer.m */; };
-		1AE723EA134E8AB6001C3F35 /* ANTLRTreePatternParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72394134E8AB4001C3F35 /* ANTLRTreePatternParser.m */; };
-		1AE723EB134E8AB6001C3F35 /* ANTLRTreeRewriter.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72395134E8AB4001C3F35 /* ANTLRTreeRewriter.m */; };
-		1AE723EC134E8AB6001C3F35 /* ANTLRTreeRuleReturnScope.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72396134E8AB4001C3F35 /* ANTLRTreeRuleReturnScope.m */; };
-		1AE723ED134E8AB6001C3F35 /* ANTLRTreeVisitor.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72397134E8AB4001C3F35 /* ANTLRTreeVisitor.m */; };
-		1AE723EE134E8AB6001C3F35 /* ANTLRTreeVisitorAction.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72398134E8AB4001C3F35 /* ANTLRTreeVisitorAction.m */; };
-		1AE723EF134E8AB6001C3F35 /* ANTLRTreeWizard.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE72399134E8AB4001C3F35 /* ANTLRTreeWizard.m */; };
-		1AE723F0134E8AB6001C3F35 /* ANTLRUnbufferedCommonTreeNodeStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE7239A134E8AB4001C3F35 /* ANTLRUnbufferedCommonTreeNodeStream.m */; };
-		1AE723F1134E8AB6001C3F35 /* ANTLRUnbufferedCommonTreeNodeStreamState.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE7239B134E8AB4001C3F35 /* ANTLRUnbufferedCommonTreeNodeStreamState.m */; };
-		1AE723F2134E8AB6001C3F35 /* ANTLRUnbufferedTokenStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE7239C134E8AB4001C3F35 /* ANTLRUnbufferedTokenStream.m */; };
-		1AE723F3134E8AB6001C3F35 /* ANTLRUniqueIDMap.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE7239D134E8AB4001C3F35 /* ANTLRUniqueIDMap.m */; };
-		1AE723F4134E8AB6001C3F35 /* ANTLRUnwantedTokenException.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE7239E134E8AB4001C3F35 /* ANTLRUnwantedTokenException.m */; };
-/* End PBXBuildFile section */
-
-/* Begin PBXBuildRule section */
-		1A63BDEC134F649F002EDFB4 /* PBXBuildRule */ = {
-			isa = PBXBuildRule;
-			compilerSpec = com.apple.compilers.proxy.script;
-			fileType = pattern.proxy;
-			isEditable = 1;
-			name = .g.m;
-			outputFiles = (
-				$1Lexer.h,
-				$1Lexer.m,
-				$1Parser.h,
-				$1Parser.m,
-			);
-			script = "-jar /Library/Java/Extensions/antlr-3.3.1.jar $1.g";
-		};
-		1A63BDED134F6810002EDFB4 /* PBXBuildRule */ = {
-			isa = PBXBuildRule;
-			compilerSpec = com.apple.compilers.proxy.script;
-			fileType = pattern.proxy;
-			isEditable = 1;
-			outputFiles = (
-				$1Lexer.h,
-				$1Lexer.m,
-				$1Parser.h,
-				$1Parser.m,
-			);
-			script = "-jar /Library/Java/Extensions/antlr-3.3.1.jar $1.g";
-		};
-		1A76A02C134FC7540041634F /* PBXBuildRule */ = {
-			isa = PBXBuildRule;
-			compilerSpec = com.apple.compilers.proxy.script;
-			fileType = pattern.proxy;
-			isEditable = 1;
-			name = "Files '.g.m' using Script";
-			outputFiles = (
-				treeRewriteLexer.h,
-				treeRewriteLexer.m,
-				treeRewriteParser.h,
-				treeRewriteParser.m,
-			);
-			script = "-jar /Library/Java/Extensions/antlr-3.3.1.jar treeRewrite.g";
-		};
-/* End PBXBuildRule section */
-
-/* Begin PBXContainerItemProxy section */
-		1A63BD9E134F6093002EDFB4 /* PBXContainerItemProxy */ = {
-			isa = PBXContainerItemProxy;
-			containerPortal = 1AE7230E134E860A001C3F35 /* Project object */;
-			proxyType = 1;
-			remoteGlobalIDString = 1AE72317134E860B001C3F35;
-			remoteInfo = ANTLR;
-		};
-		1A63BDA0134F609B002EDFB4 /* PBXContainerItemProxy */ = {
-			isa = PBXContainerItemProxy;
-			containerPortal = 1AE7230E134E860A001C3F35 /* Project object */;
-			proxyType = 1;
-			remoteGlobalIDString = 1AE72317134E860B001C3F35;
-			remoteInfo = ANTLR;
-		};
-		1A63BDA2134F60A7002EDFB4 /* PBXContainerItemProxy */ = {
-			isa = PBXContainerItemProxy;
-			containerPortal = 1AE7230E134E860A001C3F35 /* Project object */;
-			proxyType = 1;
-			remoteGlobalIDString = 1AE72317134E860B001C3F35;
-			remoteInfo = ANTLR;
-		};
-		1A63BDA4134F60B0002EDFB4 /* PBXContainerItemProxy */ = {
-			isa = PBXContainerItemProxy;
-			containerPortal = 1AE7230E134E860A001C3F35 /* Project object */;
-			proxyType = 1;
-			remoteGlobalIDString = 1AE72317134E860B001C3F35;
-			remoteInfo = ANTLR;
-		};
-		1A63BDA6134F60BC002EDFB4 /* PBXContainerItemProxy */ = {
-			isa = PBXContainerItemProxy;
-			containerPortal = 1AE7230E134E860A001C3F35 /* Project object */;
-			proxyType = 1;
-			remoteGlobalIDString = 1AE72317134E860B001C3F35;
-			remoteInfo = ANTLR;
-		};
-		1A63BDA8134F60C3002EDFB4 /* PBXContainerItemProxy */ = {
-			isa = PBXContainerItemProxy;
-			containerPortal = 1AE7230E134E860A001C3F35 /* Project object */;
-			proxyType = 1;
-			remoteGlobalIDString = 1AE72317134E860B001C3F35;
-			remoteInfo = ANTLR;
-		};
-		1A63BDAA134F60CC002EDFB4 /* PBXContainerItemProxy */ = {
-			isa = PBXContainerItemProxy;
-			containerPortal = 1AE7230E134E860A001C3F35 /* Project object */;
-			proxyType = 1;
-			remoteGlobalIDString = 1AE72317134E860B001C3F35;
-			remoteInfo = ANTLR;
-		};
-		1A63BDAC134F60D2002EDFB4 /* PBXContainerItemProxy */ = {
-			isa = PBXContainerItemProxy;
-			containerPortal = 1AE7230E134E860A001C3F35 /* Project object */;
-			proxyType = 1;
-			remoteGlobalIDString = 1AE72317134E860B001C3F35;
-			remoteInfo = ANTLR;
-		};
-		1A63BDE5134F629B002EDFB4 /* PBXContainerItemProxy */ = {
-			isa = PBXContainerItemProxy;
-			containerPortal = 1AE7230E134E860A001C3F35 /* Project object */;
-			proxyType = 1;
-			remoteGlobalIDString = 1AE72317134E860B001C3F35;
-			remoteInfo = ANTLR;
-		};
-		1A63BE0A134FB824002EDFB4 /* PBXContainerItemProxy */ = {
-			isa = PBXContainerItemProxy;
-			containerPortal = 1AE7230E134E860A001C3F35 /* Project object */;
-			proxyType = 1;
-			remoteGlobalIDString = 1AE72317134E860B001C3F35;
-			remoteInfo = ANTLR;
-		};
-		1AE7232F134E860B001C3F35 /* PBXContainerItemProxy */ = {
-			isa = PBXContainerItemProxy;
-			containerPortal = 1AE7230E134E860A001C3F35 /* Project object */;
-			proxyType = 1;
-			remoteGlobalIDString = 1AE72317134E860B001C3F35;
-			remoteInfo = ANTLR;
-		};
-/* End PBXContainerItemProxy section */
-
-/* Begin PBXCopyFilesBuildPhase section */
-		1A63BC5F134F5DAB002EDFB4 /* CopyFiles */ = {
-			isa = PBXCopyFilesBuildPhase;
-			buildActionMask = 2147483647;
-			dstPath = /usr/share/man/man1/;
-			dstSubfolderSpec = 0;
-			files = (
-			);
-			runOnlyForDeploymentPostprocessing = 1;
-		};
-		1A63BD30134F5F1E002EDFB4 /* CopyFiles */ = {
-			isa = PBXCopyFilesBuildPhase;
-			buildActionMask = 2147483647;
-			dstPath = /usr/share/man/man1/;
-			dstSubfolderSpec = 0;
-			files = (
-			);
-			runOnlyForDeploymentPostprocessing = 1;
-		};
-		1A63BD3D134F5F36002EDFB4 /* CopyFiles */ = {
-			isa = PBXCopyFilesBuildPhase;
-			buildActionMask = 2147483647;
-			dstPath = /usr/share/man/man1/;
-			dstSubfolderSpec = 0;
-			files = (
-			);
-			runOnlyForDeploymentPostprocessing = 1;
-		};
-		1A63BD4A134F5F43002EDFB4 /* CopyFiles */ = {
-			isa = PBXCopyFilesBuildPhase;
-			buildActionMask = 2147483647;
-			dstPath = /usr/share/man/man1/;
-			dstSubfolderSpec = 0;
-			files = (
-			);
-			runOnlyForDeploymentPostprocessing = 1;
-		};
-		1A63BD57134F5F4D002EDFB4 /* CopyFiles */ = {
-			isa = PBXCopyFilesBuildPhase;
-			buildActionMask = 2147483647;
-			dstPath = /usr/share/man/man1/;
-			dstSubfolderSpec = 0;
-			files = (
-			);
-			runOnlyForDeploymentPostprocessing = 1;
-		};
-		1A63BD64134F5F5E002EDFB4 /* CopyFiles */ = {
-			isa = PBXCopyFilesBuildPhase;
-			buildActionMask = 2147483647;
-			dstPath = /usr/share/man/man1/;
-			dstSubfolderSpec = 0;
-			files = (
-			);
-			runOnlyForDeploymentPostprocessing = 1;
-		};
-		1A63BD71134F5F67002EDFB4 /* CopyFiles */ = {
-			isa = PBXCopyFilesBuildPhase;
-			buildActionMask = 2147483647;
-			dstPath = /usr/share/man/man1/;
-			dstSubfolderSpec = 0;
-			files = (
-			);
-			runOnlyForDeploymentPostprocessing = 1;
-		};
-		1A63BD7E134F5F71002EDFB4 /* Copy Files */ = {
-			isa = PBXCopyFilesBuildPhase;
-			buildActionMask = 2147483647;
-			dstPath = /usr/share/man/man1/;
-			dstSubfolderSpec = 0;
-			files = (
-			);
-			name = "Copy Files";
-			runOnlyForDeploymentPostprocessing = 1;
-		};
-		1A63BDD2134F6233002EDFB4 /* CopyFiles */ = {
-			isa = PBXCopyFilesBuildPhase;
-			buildActionMask = 2147483647;
-			dstPath = /usr/share/man/man1/;
-			dstSubfolderSpec = 0;
-			files = (
-			);
-			runOnlyForDeploymentPostprocessing = 1;
-		};
-		1A63BDFA134FB75E002EDFB4 /* CopyFiles */ = {
-			isa = PBXCopyFilesBuildPhase;
-			buildActionMask = 2147483647;
-			dstPath = /usr/share/man/man1/;
-			dstSubfolderSpec = 0;
-			files = (
-			);
-			runOnlyForDeploymentPostprocessing = 1;
-		};
-/* End PBXCopyFilesBuildPhase section */
-
-/* Begin PBXFileReference section */
-		1A048D01134E8C1000005F57 /* antlr3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = antlr3.h; path = ../antlr3.h; sourceTree = "<group>"; };
-		1A048D02134E8C1000005F57 /* ANTLRBaseMapElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRBaseMapElement.h; path = ../ANTLRBaseMapElement.h; sourceTree = "<group>"; };
-		1A048D03134E8C1000005F57 /* ANTLRBaseRecognizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRBaseRecognizer.h; path = ../ANTLRBaseRecognizer.h; sourceTree = "<group>"; };
-		1A048D04134E8C1000005F57 /* ANTLRBaseStack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRBaseStack.h; path = ../ANTLRBaseStack.h; sourceTree = "<group>"; };
-		1A048D05134E8C1000005F57 /* ANTLRBaseTree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRBaseTree.h; path = ../ANTLRBaseTree.h; sourceTree = "<group>"; };
-		1A048D06134E8C1000005F57 /* ANTLRBaseTreeAdaptor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRBaseTreeAdaptor.h; path = ../ANTLRBaseTreeAdaptor.h; sourceTree = "<group>"; };
-		1A048D07134E8C1000005F57 /* ANTLRBitSet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRBitSet.h; path = ../ANTLRBitSet.h; sourceTree = "<group>"; };
-		1A048D08134E8C1000005F57 /* ANTLRBufferedTokenStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRBufferedTokenStream.h; path = ../ANTLRBufferedTokenStream.h; sourceTree = "<group>"; };
-		1A048D09134E8C1000005F57 /* ANTLRBufferedTreeNodeStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRBufferedTreeNodeStream.h; path = ../ANTLRBufferedTreeNodeStream.h; sourceTree = "<group>"; };
-		1A048D0A134E8C1000005F57 /* ANTLRCharStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRCharStream.h; path = ../ANTLRCharStream.h; sourceTree = "<group>"; };
-		1A048D0B134E8C1000005F57 /* ANTLRCharStreamState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRCharStreamState.h; path = ../ANTLRCharStreamState.h; sourceTree = "<group>"; };
-		1A048D0C134E8C1000005F57 /* ANTLRCommonErrorNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRCommonErrorNode.h; path = ../ANTLRCommonErrorNode.h; sourceTree = "<group>"; };
-		1A048D0D134E8C1000005F57 /* ANTLRCommonToken.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRCommonToken.h; path = ../ANTLRCommonToken.h; sourceTree = "<group>"; };
-		1A048D0E134E8C1000005F57 /* ANTLRCommonTokenStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRCommonTokenStream.h; path = ../ANTLRCommonTokenStream.h; sourceTree = "<group>"; };
-		1A048D0F134E8C1000005F57 /* ANTLRCommonTree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRCommonTree.h; path = ../ANTLRCommonTree.h; sourceTree = "<group>"; };
-		1A048D10134E8C1000005F57 /* ANTLRCommonTreeAdaptor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRCommonTreeAdaptor.h; path = ../ANTLRCommonTreeAdaptor.h; sourceTree = "<group>"; };
-		1A048D11134E8C1000005F57 /* ANTLRCommonTreeNodeStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRCommonTreeNodeStream.h; path = ../ANTLRCommonTreeNodeStream.h; sourceTree = "<group>"; };
-		1A048D12134E8C1100005F57 /* ANTLRCommonTreeTest-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "ANTLRCommonTreeTest-Info.plist"; path = "../ANTLRCommonTreeTest-Info.plist"; sourceTree = "<group>"; };
-		1A048D13134E8C1100005F57 /* ANTLRDebug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRDebug.h; path = ../ANTLRDebug.h; sourceTree = "<group>"; };
-		1A048D14134E8C1100005F57 /* ANTLRDebugEventListener.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRDebugEventListener.h; path = ../ANTLRDebugEventListener.h; sourceTree = "<group>"; };
-		1A048D15134E8C1100005F57 /* ANTLRDebugEventProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRDebugEventProxy.h; path = ../ANTLRDebugEventProxy.h; sourceTree = "<group>"; };
-		1A048D16134E8C1100005F57 /* ANTLRDebugParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRDebugParser.h; path = ../ANTLRDebugParser.h; sourceTree = "<group>"; };
-		1A048D17134E8C1100005F57 /* ANTLRDebugTokenStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRDebugTokenStream.h; path = ../ANTLRDebugTokenStream.h; sourceTree = "<group>"; };
-		1A048D18134E8C1100005F57 /* ANTLRDebugTreeAdaptor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRDebugTreeAdaptor.h; path = ../ANTLRDebugTreeAdaptor.h; sourceTree = "<group>"; };
-		1A048D19134E8C1100005F57 /* ANTLRDebugTreeNodeStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRDebugTreeNodeStream.h; path = ../ANTLRDebugTreeNodeStream.h; sourceTree = "<group>"; };
-		1A048D1A134E8C1100005F57 /* ANTLRDebugTreeParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRDebugTreeParser.h; path = ../ANTLRDebugTreeParser.h; sourceTree = "<group>"; };
-		1A048D1B134E8C1100005F57 /* ANTLRDFA.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRDFA.h; path = ../ANTLRDFA.h; sourceTree = "<group>"; };
-		1A048D1C134E8C1100005F57 /* ANTLRDoubleKeyMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRDoubleKeyMap.h; path = ../ANTLRDoubleKeyMap.h; sourceTree = "<group>"; };
-		1A048D1D134E8C1100005F57 /* ANTLREarlyExitException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLREarlyExitException.h; path = ../ANTLREarlyExitException.h; sourceTree = "<group>"; };
-		1A048D1E134E8C1100005F57 /* ANTLRError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRError.h; path = ../ANTLRError.h; sourceTree = "<group>"; };
-		1A048D1F134E8C1100005F57 /* ANTLRFailedPredicateException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRFailedPredicateException.h; path = ../ANTLRFailedPredicateException.h; sourceTree = "<group>"; };
-		1A048D20134E8C1100005F57 /* ANTLRFastQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRFastQueue.h; path = ../ANTLRFastQueue.h; sourceTree = "<group>"; };
-		1A63BC61134F5DAB002EDFB4 /* Fuzzy */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = Fuzzy; sourceTree = BUILT_PRODUCTS_DIR; };
-		1A63BC6B134F5DE4002EDFB4 /* FuzzyLexer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FuzzyLexer.m; sourceTree = "<group>"; };
-		1A63BC6C134F5DE5002EDFB4 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
-		1A63BC79134F5EB1002EDFB4 /* antlr3.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = antlr3.h; sourceTree = "<group>"; };
-		1A63BC7A134F5EB1002EDFB4 /* Combined.g */ = {isa = PBXFileReference; lastKnownFileType = text; path = Combined.g; sourceTree = "<group>"; };
-		1A63BC7B134F5EB1002EDFB4 /* Combined.tokens */ = {isa = PBXFileReference; lastKnownFileType = text; path = Combined.tokens; sourceTree = "<group>"; };
-		1A63BC7C134F5EB1002EDFB4 /* Combined__.gl */ = {isa = PBXFileReference; lastKnownFileType = text; path = Combined__.gl; sourceTree = "<group>"; };
-		1A63BC7D134F5EB1002EDFB4 /* CombinedLexer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CombinedLexer.h; sourceTree = "<group>"; };
-		1A63BC7E134F5EB1002EDFB4 /* CombinedLexer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CombinedLexer.m; sourceTree = "<group>"; };
-		1A63BC7F134F5EB1002EDFB4 /* CombinedParser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CombinedParser.h; sourceTree = "<group>"; };
-		1A63BC80134F5EB1002EDFB4 /* CombinedParser.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CombinedParser.m; sourceTree = "<group>"; };
-		1A63BC81134F5EB1002EDFB4 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
-		1A63BC83134F5EB1002EDFB4 /* Combined.tokens */ = {isa = PBXFileReference; lastKnownFileType = text; path = Combined.tokens; sourceTree = "<group>"; };
-		1A63BC85134F5EB1002EDFB4 /* antlr3.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = antlr3.h; sourceTree = "<group>"; };
-		1A63BC86134F5EB1002EDFB4 /* Fuzzy.g */ = {isa = PBXFileReference; lastKnownFileType = text; path = Fuzzy.g; sourceTree = "<group>"; };
-		1A63BC88134F5EB2002EDFB4 /* Fuzzy.tokens */ = {isa = PBXFileReference; lastKnownFileType = text; path = Fuzzy.tokens; sourceTree = "<group>"; };
-		1A63BC89134F5EB2002EDFB4 /* FuzzyLexer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FuzzyLexer.h; sourceTree = "<group>"; };
-		1A63BC8B134F5EB2002EDFB4 /* input */ = {isa = PBXFileReference; lastKnownFileType = text; path = input; sourceTree = "<group>"; };
-		1A63BC8E134F5EB2002EDFB4 /* Fuzzy.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Fuzzy.m; sourceTree = "<group>"; };
-		1A63BC8F134F5EB2002EDFB4 /* Fuzzy.tokens */ = {isa = PBXFileReference; lastKnownFileType = text; path = Fuzzy.tokens; sourceTree = "<group>"; };
-		1A63BC90134F5EB2002EDFB4 /* FuzzyLexer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FuzzyLexer.h; sourceTree = "<group>"; };
-		1A63BC92134F5EB2002EDFB4 /* antlr3.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = antlr3.h; sourceTree = "<group>"; };
-		1A63BC93134F5EB2002EDFB4 /* input */ = {isa = PBXFileReference; lastKnownFileType = text; path = input; sourceTree = "<group>"; };
-		1A63BC94134F5EB2002EDFB4 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
-		1A63BC95134F5EB2002EDFB4 /* output */ = {isa = PBXFileReference; lastKnownFileType = text; path = output; sourceTree = "<group>"; };
-		1A63BC96134F5EB2002EDFB4 /* T.g */ = {isa = PBXFileReference; lastKnownFileType = text; path = T.g; sourceTree = "<group>"; };
-		1A63BC97134F5EB2002EDFB4 /* T.tokens */ = {isa = PBXFileReference; lastKnownFileType = text; path = T.tokens; sourceTree = "<group>"; };
-		1A63BC98134F5EB2002EDFB4 /* TLexer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TLexer.h; sourceTree = "<group>"; };
-		1A63BC99134F5EB2002EDFB4 /* TLexer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TLexer.m; sourceTree = "<group>"; };
-		1A63BC9A134F5EB2002EDFB4 /* TParser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TParser.h; sourceTree = "<group>"; };
-		1A63BC9B134F5EB2002EDFB4 /* TParser.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TParser.m; sourceTree = "<group>"; };
-		1A63BC9D134F5EB2002EDFB4 /* antlr3.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = antlr3.h; sourceTree = "<group>"; };
-		1A63BC9E134F5EB2002EDFB4 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
-		1A63BCA0134F5EB2002EDFB4 /* Test.tokens */ = {isa = PBXFileReference; lastKnownFileType = text; path = Test.tokens; sourceTree = "<group>"; };
-		1A63BCA1134F5EB2002EDFB4 /* TestLexer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TestLexer.h; sourceTree = "<group>"; };
-		1A63BCA2134F5EB2002EDFB4 /* Testlexer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Testlexer.m; sourceTree = "<group>"; };
-		1A63BCA3134F5EB2002EDFB4 /* TestLexer.tokens */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestLexer.tokens; sourceTree = "<group>"; };
-		1A63BCA4134F5EB2002EDFB4 /* TestLexerLexer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TestLexerLexer.h; sourceTree = "<group>"; };
-		1A63BCA5134F5EB2002EDFB4 /* Test.tokens */ = {isa = PBXFileReference; lastKnownFileType = text; path = Test.tokens; sourceTree = "<group>"; };
-		1A63BCA6134F5EB2002EDFB4 /* TestLexer.g */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestLexer.g; sourceTree = "<group>"; };
-		1A63BCA7134F5EB2002EDFB4 /* TestLexer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TestLexer.h; sourceTree = "<group>"; };
-		1A63BCA8134F5EB2002EDFB4 /* TestLexer.h.old */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestLexer.h.old; sourceTree = "<group>"; };
-		1A63BCA9134F5EB2002EDFB4 /* TestLexer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TestLexer.m; sourceTree = "<group>"; };
-		1A63BCAA134F5EB2002EDFB4 /* TestLexer.m.old */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestLexer.m.old; sourceTree = "<group>"; };
-		1A63BCAB134F5EB2002EDFB4 /* TestLexer.tokens */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestLexer.tokens; sourceTree = "<group>"; };
-		1A63BCAC134F5EB2002EDFB4 /* TestLexerLexer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TestLexerLexer.h; sourceTree = "<group>"; };
-		1A63BCAE134F5EB2002EDFB4 /* antlr3.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = antlr3.h; sourceTree = "<group>"; };
-		1A63BCAF134F5EB2002EDFB4 /* input */ = {isa = PBXFileReference; lastKnownFileType = text; path = input; sourceTree = "<group>"; };
-		1A63BCB0134F5EB2002EDFB4 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
-		1A63BCB1134F5EB2002EDFB4 /* output */ = {isa = PBXFileReference; lastKnownFileType = text; path = output; sourceTree = "<group>"; };
-		1A63BCB2134F5EB2002EDFB4 /* SimpleC.g */ = {isa = PBXFileReference; lastKnownFileType = text; path = SimpleC.g; sourceTree = "<group>"; };
-		1A63BCB3134F5EB2002EDFB4 /* SimpleC.tokens */ = {isa = PBXFileReference; lastKnownFileType = text; path = SimpleC.tokens; sourceTree = "<group>"; };
-		1A63BCB4134F5EB2002EDFB4 /* SimpleC__.gl */ = {isa = PBXFileReference; lastKnownFileType = text; path = SimpleC__.gl; sourceTree = "<group>"; };
-		1A63BCB5134F5EB2002EDFB4 /* SimpleCLexer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SimpleCLexer.h; sourceTree = "<group>"; };
-		1A63BCB6134F5EB2002EDFB4 /* SimpleCLexer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SimpleCLexer.m; sourceTree = "<group>"; };
-		1A63BCB7134F5EB2002EDFB4 /* SimpleCParser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SimpleCParser.h; sourceTree = "<group>"; };
-		1A63BCB8134F5EB2002EDFB4 /* SimpleCParser.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SimpleCParser.m; sourceTree = "<group>"; };
-		1A63BCBA134F5EB2002EDFB4 /* files */ = {isa = PBXFileReference; lastKnownFileType = text; path = files; sourceTree = "<group>"; };
-		1A63BCBB134F5EB2002EDFB4 /* input */ = {isa = PBXFileReference; lastKnownFileType = text; path = input; sourceTree = "<group>"; };
-		1A63BCBC134F5EB2002EDFB4 /* Main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Main.m; sourceTree = "<group>"; };
-		1A63BCBD134F5EB2002EDFB4 /* output */ = {isa = PBXFileReference; lastKnownFileType = text; path = output; sourceTree = "<group>"; };
-		1A63BCBF134F5EB2002EDFB4 /* Poly.tokens */ = {isa = PBXFileReference; lastKnownFileType = text; path = Poly.tokens; sourceTree = "<group>"; };
-		1A63BCC0134F5EB2002EDFB4 /* PolyDifferentiator.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PolyDifferentiator.m; sourceTree = "<group>"; };
-		1A63BCC1134F5EB2002EDFB4 /* PolyLexer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PolyLexer.h; sourceTree = "<group>"; };
-		1A63BCC2134F5EB2002EDFB4 /* PolyLexer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PolyLexer.m; sourceTree = "<group>"; };
-		1A63BCC3134F5EB2002EDFB4 /* PolyParser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PolyParser.h; sourceTree = "<group>"; };
-		1A63BCC4134F5EB2002EDFB4 /* PolyParser.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PolyParser.m; sourceTree = "<group>"; };
-		1A63BCC5134F5EB2002EDFB4 /* Simplifier.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Simplifier.h; sourceTree = "<group>"; };
-		1A63BCC6134F5EB2002EDFB4 /* Simplifier.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Simplifier.m; sourceTree = "<group>"; };
-		1A63BCC7134F5EB2002EDFB4 /* Simplifier.tokens */ = {isa = PBXFileReference; lastKnownFileType = text; path = Simplifier.tokens; sourceTree = "<group>"; };
-		1A63BCC8134F5EB2002EDFB4 /* Poly.g */ = {isa = PBXFileReference; lastKnownFileType = text; path = Poly.g; sourceTree = "<group>"; };
-		1A63BCC9134F5EB2002EDFB4 /* Poly.tokens */ = {isa = PBXFileReference; lastKnownFileType = text; path = Poly.tokens; sourceTree = "<group>"; };
-		1A63BCCA134F5EB2002EDFB4 /* PolyDifferentiator.g */ = {isa = PBXFileReference; lastKnownFileType = text; path = PolyDifferentiator.g; sourceTree = "<group>"; };
-		1A63BCCB134F5EB2002EDFB4 /* PolyDifferentiator.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PolyDifferentiator.m; sourceTree = "<group>"; };
-		1A63BCCC134F5EB2002EDFB4 /* PolyLexer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PolyLexer.h; sourceTree = "<group>"; };
-		1A63BCCD134F5EB2002EDFB4 /* PolyLexer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PolyLexer.m; sourceTree = "<group>"; };
-		1A63BCCE134F5EB2002EDFB4 /* PolyParser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PolyParser.h; sourceTree = "<group>"; };
-		1A63BCCF134F5EB2002EDFB4 /* PolyParser.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PolyParser.m; sourceTree = "<group>"; };
-		1A63BCD0134F5EB2002EDFB4 /* PolyPrinter.g */ = {isa = PBXFileReference; lastKnownFileType = text; path = PolyPrinter.g; sourceTree = "<group>"; };
-		1A63BCD1134F5EB2002EDFB4 /* PolyPrinter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PolyPrinter.h; sourceTree = "<group>"; };
-		1A63BCD2134F5EB2002EDFB4 /* PolyPrinter.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PolyPrinter.m; sourceTree = "<group>"; };
-		1A63BCD3134F5EB2002EDFB4 /* PolyPrinter.tokens */ = {isa = PBXFileReference; lastKnownFileType = text; path = PolyPrinter.tokens; sourceTree = "<group>"; };
-		1A63BCD4134F5EB2002EDFB4 /* Simplifier.g */ = {isa = PBXFileReference; lastKnownFileType = text; path = Simplifier.g; sourceTree = "<group>"; };
-		1A63BCD5134F5EB2002EDFB4 /* Simplifier.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Simplifier.h; sourceTree = "<group>"; };
-		1A63BCD6134F5EB2002EDFB4 /* Simplifier.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Simplifier.m; sourceTree = "<group>"; };
-		1A63BCD7134F5EB2002EDFB4 /* Simplifier.tokens */ = {isa = PBXFileReference; lastKnownFileType = text; path = Simplifier.tokens; sourceTree = "<group>"; };
-		1A63BCD9134F5EB2002EDFB4 /* antlr3.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = antlr3.h; sourceTree = "<group>"; };
-		1A63BCDA134F5EB2002EDFB4 /* input */ = {isa = PBXFileReference; lastKnownFileType = text; path = input; sourceTree = "<group>"; };
-		1A63BCDB134F5EB2002EDFB4 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
-		1A63BCDC134F5EB2002EDFB4 /* output */ = {isa = PBXFileReference; lastKnownFileType = text; path = output; sourceTree = "<group>"; };
-		1A63BCDE134F5EB2002EDFB4 /* SymbolTable.tokens */ = {isa = PBXFileReference; lastKnownFileType = text; path = SymbolTable.tokens; sourceTree = "<group>"; };
-		1A63BCDF134F5EB2002EDFB4 /* SymbolTableLexer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SymbolTableLexer.h; sourceTree = "<group>"; };
-		1A63BCE0134F5EB2002EDFB4 /* SymbolTableLexer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SymbolTableLexer.m; sourceTree = "<group>"; };
-		1A63BCE1134F5EB2002EDFB4 /* SymbolTableParser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SymbolTableParser.h; sourceTree = "<group>"; };
-		1A63BCE2134F5EB2002EDFB4 /* SymbolTableParser.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SymbolTableParser.m; sourceTree = "<group>"; };
-		1A63BCE3134F5EB2002EDFB4 /* SymbolTable.g */ = {isa = PBXFileReference; lastKnownFileType = text; path = SymbolTable.g; sourceTree = "<group>"; };
-		1A63BCE4134F5EB2002EDFB4 /* SymbolTable.tokens */ = {isa = PBXFileReference; lastKnownFileType = text; path = SymbolTable.tokens; sourceTree = "<group>"; };
-		1A63BCE5134F5EB2002EDFB4 /* SymbolTable__.gl */ = {isa = PBXFileReference; lastKnownFileType = text; path = SymbolTable__.gl; sourceTree = "<group>"; };
-		1A63BCE6134F5EB2002EDFB4 /* SymbolTableLexer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SymbolTableLexer.h; sourceTree = "<group>"; };
-		1A63BCE7134F5EB2002EDFB4 /* SymbolTableLexer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SymbolTableLexer.m; sourceTree = "<group>"; };
-		1A63BCE8134F5EB2002EDFB4 /* SymbolTableParser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SymbolTableParser.h; sourceTree = "<group>"; };
-		1A63BCE9134F5EB2002EDFB4 /* SymbolTableParser.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SymbolTableParser.m; sourceTree = "<group>"; };
-		1A63BCEB134F5EB2002EDFB4 /* antlr3.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = antlr3.h; sourceTree = "<group>"; };
-		1A63BCEC134F5EB2002EDFB4 /* input */ = {isa = PBXFileReference; lastKnownFileType = text; path = input; sourceTree = "<group>"; };
-		1A63BCED134F5EB2002EDFB4 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
-		1A63BCEE134F5EB2002EDFB4 /* output */ = {isa = PBXFileReference; lastKnownFileType = text; path = output; sourceTree = "<group>"; };
-		1A63BCF0134F5EB2002EDFB4 /* SimpleC.tokens */ = {isa = PBXFileReference; lastKnownFileType = text; path = SimpleC.tokens; sourceTree = "<group>"; };
-		1A63BCF1134F5EB2002EDFB4 /* SimpleCLexer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SimpleCLexer.h; sourceTree = "<group>"; };
-		1A63BCF2134F5EB2002EDFB4 /* SimpleCLexer.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = SimpleCLexer.java; sourceTree = "<group>"; };
-		1A63BCF3134F5EB2002EDFB4 /* SimpleCLexer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SimpleCLexer.m; sourceTree = "<group>"; };
-		1A63BCF4134F5EB2002EDFB4 /* SimpleCParser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SimpleCParser.h; sourceTree = "<group>"; };
-		1A63BCF5134F5EB2002EDFB4 /* SimpleCParser.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = SimpleCParser.java; sourceTree = "<group>"; };
-		1A63BCF6134F5EB2002EDFB4 /* SimpleCParser.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SimpleCParser.m; sourceTree = "<group>"; };
-		1A63BCF7134F5EB2002EDFB4 /* SimpleCTP.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SimpleCTP.h; sourceTree = "<group>"; };
-		1A63BCF8134F5EB2002EDFB4 /* SimpleCTP.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = SimpleCTP.java; sourceTree = "<group>"; };
-		1A63BCF9134F5EB2002EDFB4 /* SimpleCTP.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SimpleCTP.m; sourceTree = "<group>"; };
-		1A63BCFA134F5EB2002EDFB4 /* SimpleCTP.tokens */ = {isa = PBXFileReference; lastKnownFileType = text; path = SimpleCTP.tokens; sourceTree = "<group>"; };
-		1A63BCFB134F5EB2002EDFB4 /* SimpleC.g */ = {isa = PBXFileReference; lastKnownFileType = text; path = SimpleC.g; sourceTree = "<group>"; };
-		1A63BCFC134F5EB2002EDFB4 /* SimpleC.tokens */ = {isa = PBXFileReference; lastKnownFileType = text; path = SimpleC.tokens; sourceTree = "<group>"; };
-		1A63BCFD134F5EB2002EDFB4 /* SimpleC__.gl */ = {isa = PBXFileReference; lastKnownFileType = text; path = SimpleC__.gl; sourceTree = "<group>"; };
-		1A63BCFE134F5EB2002EDFB4 /* SimpleCLexer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SimpleCLexer.h; sourceTree = "<group>"; };
-		1A63BCFF134F5EB2002EDFB4 /* SimpleCLexer.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = SimpleCLexer.java; sourceTree = "<group>"; };
-		1A63BD00134F5EB2002EDFB4 /* SimpleCLexer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SimpleCLexer.m; sourceTree = "<group>"; };
-		1A63BD01134F5EB2002EDFB4 /* SimpleCParser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SimpleCParser.h; sourceTree = "<group>"; };
-		1A63BD02134F5EB2002EDFB4 /* SimpleCParser.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = SimpleCParser.java; sourceTree = "<group>"; };
-		1A63BD03134F5EB2002EDFB4 /* SimpleCParser.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SimpleCParser.m; sourceTree = "<group>"; };
-		1A63BD04134F5EB2002EDFB4 /* SimpleCTP.g */ = {isa = PBXFileReference; lastKnownFileType = text; path = SimpleCTP.g; sourceTree = "<group>"; };
-		1A63BD05134F5EB2002EDFB4 /* SimpleCTP.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SimpleCTP.h; sourceTree = "<group>"; };
-		1A63BD06134F5EB2002EDFB4 /* SimpleCTP.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = SimpleCTP.java; sourceTree = "<group>"; };
-		1A63BD07134F5EB2002EDFB4 /* SimpleCTP.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SimpleCTP.m; sourceTree = "<group>"; };
-		1A63BD08134F5EB2002EDFB4 /* SimpleCTP.tokens */ = {isa = PBXFileReference; lastKnownFileType = text; path = SimpleCTP.tokens; sourceTree = "<group>"; };
-		1A63BD09134F5EB2002EDFB4 /* SimpleCWalker.g */ = {isa = PBXFileReference; lastKnownFileType = text; path = SimpleCWalker.g; sourceTree = "<group>"; };
-		1A63BD0A134F5EB2002EDFB4 /* SimpleCWalker.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SimpleCWalker.h; sourceTree = "<group>"; };
-		1A63BD0B134F5EB2002EDFB4 /* SimpleCWalker.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SimpleCWalker.m; sourceTree = "<group>"; };
-		1A63BD0C134F5EB2002EDFB4 /* SimpleCWalker.tokens */ = {isa = PBXFileReference; lastKnownFileType = text; path = SimpleCWalker.tokens; sourceTree = "<group>"; };
-		1A63BD0E134F5EB2002EDFB4 /* files */ = {isa = PBXFileReference; lastKnownFileType = text; path = files; sourceTree = "<group>"; };
-		1A63BD0F134F5EB2002EDFB4 /* input */ = {isa = PBXFileReference; lastKnownFileType = text; path = input; sourceTree = "<group>"; };
-		1A63BD10134F5EB2002EDFB4 /* Lang.g */ = {isa = PBXFileReference; lastKnownFileType = text; path = Lang.g; sourceTree = "<group>"; };
-		1A63BD11134F5EB2002EDFB4 /* Lang.tokens */ = {isa = PBXFileReference; lastKnownFileType = text; path = Lang.tokens; sourceTree = "<group>"; };
-		1A63BD12134F5EB2002EDFB4 /* LangDumpDecl.g */ = {isa = PBXFileReference; lastKnownFileType = text; path = LangDumpDecl.g; sourceTree = "<group>"; };
-		1A63BD13134F5EB2002EDFB4 /* LangDumpDecl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LangDumpDecl.h; sourceTree = "<group>"; };
-		1A63BD14134F5EB2002EDFB4 /* LangDumpDecl.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = LangDumpDecl.m; sourceTree = "<group>"; };
-		1A63BD15134F5EB2002EDFB4 /* LangDumpDecl.tokens */ = {isa = PBXFileReference; lastKnownFileType = text; path = LangDumpDecl.tokens; sourceTree = "<group>"; };
-		1A63BD16134F5EB2002EDFB4 /* LangLexer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LangLexer.h; sourceTree = "<group>"; };
-		1A63BD17134F5EB2002EDFB4 /* LangLexer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = LangLexer.m; sourceTree = "<group>"; };
-		1A63BD18134F5EB2002EDFB4 /* LangParser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LangParser.h; sourceTree = "<group>"; };
-		1A63BD19134F5EB2002EDFB4 /* LangParser.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = LangParser.m; sourceTree = "<group>"; };
-		1A63BD1A134F5EB2002EDFB4 /* Main.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = Main.java; sourceTree = "<group>"; };
-		1A63BD1B134F5EB2002EDFB4 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
-		1A63BD1C134F5EB2002EDFB4 /* output */ = {isa = PBXFileReference; lastKnownFileType = text; path = output; sourceTree = "<group>"; };
-		1A63BD1E134F5EB2002EDFB4 /* README.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = README.txt; sourceTree = "<group>"; };
-		1A63BD20134F5EB2002EDFB4 /* antlr3.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = antlr3.h; sourceTree = "<group>"; };
-		1A63BD21134F5EB2002EDFB4 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
-		1A63BD23134F5EB2002EDFB4 /* TreeRewrite.tokens */ = {isa = PBXFileReference; lastKnownFileType = text; path = TreeRewrite.tokens; sourceTree = "<group>"; };
-		1A63BD24134F5EB2002EDFB4 /* TreeRewriteLexer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TreeRewriteLexer.h; sourceTree = "<group>"; };
-		1A63BD25134F5EB2002EDFB4 /* TreeRewriteLexer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TreeRewriteLexer.m; sourceTree = "<group>"; };
-		1A63BD26134F5EB2002EDFB4 /* TreeRewriteParser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TreeRewriteParser.h; sourceTree = "<group>"; };
-		1A63BD27134F5EB2002EDFB4 /* TreeRewriteParser.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TreeRewriteParser.m; sourceTree = "<group>"; };
-		1A63BD28134F5EB2002EDFB4 /* TreeRewrite.g */ = {isa = PBXFileReference; lastKnownFileType = text; path = TreeRewrite.g; sourceTree = "<group>"; };
-		1A63BD29134F5EB2002EDFB4 /* TreeRewrite.tokens */ = {isa = PBXFileReference; lastKnownFileType = text; path = TreeRewrite.tokens; sourceTree = "<group>"; };
-		1A63BD2A134F5EB2002EDFB4 /* TreeRewriteLexer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TreeRewriteLexer.h; sourceTree = "<group>"; };
-		1A63BD2B134F5EB2002EDFB4 /* TreeRewriteLexer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TreeRewriteLexer.m; sourceTree = "<group>"; };
-		1A63BD2C134F5EB2002EDFB4 /* TreeRewriteParser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TreeRewriteParser.h; sourceTree = "<group>"; };
-		1A63BD2D134F5EB2002EDFB4 /* TreeRewriteParser.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TreeRewriteParser.m; sourceTree = "<group>"; };
-		1A63BD32134F5F1E002EDFB4 /* combined */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = combined; sourceTree = BUILT_PRODUCTS_DIR; };
-		1A63BD3F134F5F36002EDFB4 /* lexertest-simple */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "lexertest-simple"; sourceTree = BUILT_PRODUCTS_DIR; };
-		1A63BD4C134F5F43002EDFB4 /* LL-start */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "LL-start"; sourceTree = BUILT_PRODUCTS_DIR; };
-		1A63BD59134F5F4D002EDFB4 /* polydiff */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = polydiff; sourceTree = BUILT_PRODUCTS_DIR; };
-		1A63BD66134F5F5E002EDFB4 /* simplecTreeParser */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = simplecTreeParser; sourceTree = BUILT_PRODUCTS_DIR; };
-		1A63BD73134F5F67002EDFB4 /* treeparser */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = treeparser; sourceTree = BUILT_PRODUCTS_DIR; };
-		1A63BD80134F5F71002EDFB4 /* treerewrite */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = treerewrite; sourceTree = BUILT_PRODUCTS_DIR; };
-		1A63BDD4134F6233002EDFB4 /* scopes */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = scopes; sourceTree = BUILT_PRODUCTS_DIR; };
-		1A63BDFC134FB75E002EDFB4 /* hoistedPredicates */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = hoistedPredicates; sourceTree = BUILT_PRODUCTS_DIR; };
-		1A6B1C97134E8CF70016A47D /* ANTLRFileStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRFileStream.h; path = ../ANTLRFileStream.h; sourceTree = "<group>"; };
-		1A6B1C98134E8CF70016A47D /* ANTLRHashMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRHashMap.h; path = ../ANTLRHashMap.h; sourceTree = "<group>"; };
-		1A6B1C99134E8CF70016A47D /* ANTLRHashRule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRHashRule.h; path = ../ANTLRHashRule.h; sourceTree = "<group>"; };
-		1A6B1C9A134E8CF70016A47D /* ANTLRInputStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRInputStream.h; path = ../ANTLRInputStream.h; sourceTree = "<group>"; };
-		1A6B1C9B134E8CF70016A47D /* ANTLRIntArray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRIntArray.h; path = ../ANTLRIntArray.h; sourceTree = "<group>"; };
-		1A6B1C9C134E8CF70016A47D /* ANTLRLexer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRLexer.h; path = ../ANTLRLexer.h; sourceTree = "<group>"; };
-		1A6B1C9D134E8CF70016A47D /* ANTLRLexerRuleReturnScope.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRLexerRuleReturnScope.h; path = ../ANTLRLexerRuleReturnScope.h; sourceTree = "<group>"; };
-		1A6B1C9E134E8CF70016A47D /* ANTLRLexerState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRLexerState.h; path = ../ANTLRLexerState.h; sourceTree = "<group>"; };
-		1A6B1C9F134E8CF70016A47D /* ANTLRLinkBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRLinkBase.h; path = ../ANTLRLinkBase.h; sourceTree = "<group>"; };
-		1A6B1CA0134E8CF70016A47D /* ANTLRLookaheadStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRLookaheadStream.h; path = ../ANTLRLookaheadStream.h; sourceTree = "<group>"; };
-		1A6B1CA1134E8CF70016A47D /* ANTLRMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRMap.h; path = ../ANTLRMap.h; sourceTree = "<group>"; };
-		1A6B1CA2134E8CF70016A47D /* ANTLRMapElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRMapElement.h; path = ../ANTLRMapElement.h; sourceTree = "<group>"; };
-		1A6B1CA3134E8CF70016A47D /* ANTLRMismatchedNotSetException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRMismatchedNotSetException.h; path = ../ANTLRMismatchedNotSetException.h; sourceTree = "<group>"; };
-		1A6B1CA4134E8CF70016A47D /* ANTLRMismatchedRangeException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRMismatchedRangeException.h; path = ../ANTLRMismatchedRangeException.h; sourceTree = "<group>"; };
-		1A6B1CA5134E8CF70016A47D /* ANTLRMismatchedSetException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRMismatchedSetException.h; path = ../ANTLRMismatchedSetException.h; sourceTree = "<group>"; };
-		1A6B1CA6134E8CF70016A47D /* ANTLRMismatchedTokenException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRMismatchedTokenException.h; path = ../ANTLRMismatchedTokenException.h; sourceTree = "<group>"; };
-		1A6B1CA7134E8CF70016A47D /* ANTLRMismatchedTreeNodeException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRMismatchedTreeNodeException.h; path = ../ANTLRMismatchedTreeNodeException.h; sourceTree = "<group>"; };
-		1A6B1CA8134E8CF70016A47D /* ANTLRMissingTokenException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRMissingTokenException.h; path = ../ANTLRMissingTokenException.h; sourceTree = "<group>"; };
-		1A6B1CA9134E8CF70016A47D /* ANTLRNodeMapElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRNodeMapElement.h; path = ../ANTLRNodeMapElement.h; sourceTree = "<group>"; };
-		1A6B1CAA134E8CF70016A47D /* ANTLRNoViableAltException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRNoViableAltException.h; path = ../ANTLRNoViableAltException.h; sourceTree = "<group>"; };
-		1A6B1CAB134E8CF70016A47D /* ANTLRParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRParser.h; path = ../ANTLRParser.h; sourceTree = "<group>"; };
-		1A6B1CAC134E8CF70016A47D /* ANTLRParserRuleReturnScope.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRParserRuleReturnScope.h; path = ../ANTLRParserRuleReturnScope.h; sourceTree = "<group>"; };
-		1A6B1CAD134E8CF70016A47D /* ANTLRParseTree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRParseTree.h; path = ../ANTLRParseTree.h; sourceTree = "<group>"; };
-		1A6B1CAE134E8CF70016A47D /* ANTLRPtrBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRPtrBuffer.h; path = ../ANTLRPtrBuffer.h; sourceTree = "<group>"; };
-		1A6B1CAF134E8CF70016A47D /* ANTLRPtrStack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRPtrStack.h; path = ../ANTLRPtrStack.h; sourceTree = "<group>"; };
-		1A6B1CB0134E8CF70016A47D /* ANTLRReaderStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRReaderStream.h; path = ../ANTLRReaderStream.h; sourceTree = "<group>"; };
-		1A6B1CB1134E8CF70016A47D /* ANTLRRecognitionException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRRecognitionException.h; path = ../ANTLRRecognitionException.h; sourceTree = "<group>"; };
-		1A6B1CB2134E8CF70016A47D /* ANTLRRecognizerSharedState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRRecognizerSharedState.h; path = ../ANTLRRecognizerSharedState.h; sourceTree = "<group>"; };
-		1A6B1CB3134E8CF70016A47D /* ANTLRRewriteRuleElementStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRRewriteRuleElementStream.h; path = ../ANTLRRewriteRuleElementStream.h; sourceTree = "<group>"; };
-		1A6B1CB4134E8CF70016A47D /* ANTLRRewriteRuleNodeStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRRewriteRuleNodeStream.h; path = ../ANTLRRewriteRuleNodeStream.h; sourceTree = "<group>"; };
-		1A6B1CB5134E8CF70016A47D /* ANTLRRewriteRuleSubtreeStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRRewriteRuleSubtreeStream.h; path = ../ANTLRRewriteRuleSubtreeStream.h; sourceTree = "<group>"; };
-		1A6B1CB6134E8CF70016A47D /* ANTLRRewriteRuleTokenStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRRewriteRuleTokenStream.h; path = ../ANTLRRewriteRuleTokenStream.h; sourceTree = "<group>"; };
-		1A6B1CB7134E8CF70016A47D /* ANTLRRuleMapElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRRuleMapElement.h; path = ../ANTLRRuleMapElement.h; sourceTree = "<group>"; };
-		1A6B1CB8134E8CF70016A47D /* ANTLRRuleMemo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRRuleMemo.h; path = ../ANTLRRuleMemo.h; sourceTree = "<group>"; };
-		1A6B1CB9134E8CF70016A47D /* ANTLRRuleReturnScope.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRRuleReturnScope.h; path = ../ANTLRRuleReturnScope.h; sourceTree = "<group>"; };
-		1A6B1CBA134E8CF70016A47D /* ANTLRRuleStack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRRuleStack.h; path = ../ANTLRRuleStack.h; sourceTree = "<group>"; };
-		1A6B1CBB134E8CF70016A47D /* ANTLRRuntimeException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRRuntimeException.h; path = ../ANTLRRuntimeException.h; sourceTree = "<group>"; };
-		1A6B1CBC134E8CF70016A47D /* ANTLRStreamEnumerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRStreamEnumerator.h; path = ../ANTLRStreamEnumerator.h; sourceTree = "<group>"; };
-		1A6B1CBD134E8CF70016A47D /* ANTLRStringStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRStringStream.h; path = ../ANTLRStringStream.h; sourceTree = "<group>"; };
-		1A6B1CBE134E8CF70016A47D /* ANTLRStringStreamState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRStringStreamState.h; path = ../ANTLRStringStreamState.h; sourceTree = "<group>"; };
-		1A6B1CBF134E8CF70016A47D /* ANTLRSymbolStack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRSymbolStack.h; path = ../ANTLRSymbolStack.h; sourceTree = "<group>"; };
-		1A6B1CC0134E8CF70016A47D /* ANTLRToken.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRToken.h; path = ../ANTLRToken.h; sourceTree = "<group>"; };
-		1A6B1CC1134E8CF70016A47D /* ANTLRToken+DebuggerSupport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "ANTLRToken+DebuggerSupport.h"; path = "../ANTLRToken+DebuggerSupport.h"; sourceTree = "<group>"; };
-		1A6B1CC2134E8CF70016A47D /* ANTLRTokenRewriteStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRTokenRewriteStream.h; path = ../ANTLRTokenRewriteStream.h; sourceTree = "<group>"; };
-		1A6B1CC3134E8CF70016A47D /* ANTLRTokenSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRTokenSource.h; path = ../ANTLRTokenSource.h; sourceTree = "<group>"; };
-		1A6B1CC4134E8CF70016A47D /* ANTLRTokenStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRTokenStream.h; path = ../ANTLRTokenStream.h; sourceTree = "<group>"; };
-		1A6B1CC5134E8CF70016A47D /* ANTLRTree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRTree.h; path = ../ANTLRTree.h; sourceTree = "<group>"; };
-		1A6B1CC6134E8CF70016A47D /* ANTLRTreeAdaptor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRTreeAdaptor.h; path = ../ANTLRTreeAdaptor.h; sourceTree = "<group>"; };
-		1A6B1CC7134E8CF70016A47D /* ANTLRTreeException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRTreeException.h; path = ../ANTLRTreeException.h; sourceTree = "<group>"; };
-		1A6B1CC8134E8CF70016A47D /* ANTLRTreeIterator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRTreeIterator.h; path = ../ANTLRTreeIterator.h; sourceTree = "<group>"; };
-		1A6B1CC9134E8CF70016A47D /* ANTLRTreeNodeStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRTreeNodeStream.h; path = ../ANTLRTreeNodeStream.h; sourceTree = "<group>"; };
-		1A6B1CCA134E8CF70016A47D /* ANTLRTreeParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRTreeParser.h; path = ../ANTLRTreeParser.h; sourceTree = "<group>"; };
-		1A6B1CCB134E8CF70016A47D /* ANTLRTreePatternLexer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRTreePatternLexer.h; path = ../ANTLRTreePatternLexer.h; sourceTree = "<group>"; };
-		1A6B1CCC134E8CF70016A47D /* ANTLRTreePatternParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRTreePatternParser.h; path = ../ANTLRTreePatternParser.h; sourceTree = "<group>"; };
-		1A6B1CCD134E8CF70016A47D /* ANTLRTreeRewriter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRTreeRewriter.h; path = ../ANTLRTreeRewriter.h; sourceTree = "<group>"; };
-		1A6B1CCE134E8CF70016A47D /* ANTLRTreeRuleReturnScope.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRTreeRuleReturnScope.h; path = ../ANTLRTreeRuleReturnScope.h; sourceTree = "<group>"; };
-		1A6B1CCF134E8CF70016A47D /* ANTLRTreeVisitor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRTreeVisitor.h; path = ../ANTLRTreeVisitor.h; sourceTree = "<group>"; };
-		1A6B1CD0134E8CF70016A47D /* ANTLRTreeVisitorAction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRTreeVisitorAction.h; path = ../ANTLRTreeVisitorAction.h; sourceTree = "<group>"; };
-		1A6B1CD1134E8CF70016A47D /* ANTLRTreeWizard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRTreeWizard.h; path = ../ANTLRTreeWizard.h; sourceTree = "<group>"; };
-		1A6B1CD2134E8CF70016A47D /* ANTLRUnbufferedCommonTreeNodeStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRUnbufferedCommonTreeNodeStream.h; path = ../ANTLRUnbufferedCommonTreeNodeStream.h; sourceTree = "<group>"; };
-		1A6B1CD3134E8CF70016A47D /* ANTLRUnbufferedCommonTreeNodeStreamState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRUnbufferedCommonTreeNodeStreamState.h; path = ../ANTLRUnbufferedCommonTreeNodeStreamState.h; sourceTree = "<group>"; };
-		1A6B1CD4134E8CF70016A47D /* ANTLRUnbufferedTokenStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRUnbufferedTokenStream.h; path = ../ANTLRUnbufferedTokenStream.h; sourceTree = "<group>"; };
-		1A6B1CD5134E8CF70016A47D /* ANTLRUniqueIDMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRUniqueIDMap.h; path = ../ANTLRUniqueIDMap.h; sourceTree = "<group>"; };
-		1A6B1CD6134E8CF70016A47D /* ANTLRUnwantedTokenException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLRUnwantedTokenException.h; path = ../ANTLRUnwantedTokenException.h; sourceTree = "<group>"; };
-		1A6B1D1F134E8DA10016A47D /* BaseTest.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = BaseTest.java; sourceTree = "<group>"; };
-		1A6B1D20134E8DA10016A47D /* DebugTestAutoAST.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = DebugTestAutoAST.java; sourceTree = "<group>"; };
-		1A6B1D21134E8DA10016A47D /* DebugTestCompositeGrammars.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = DebugTestCompositeGrammars.java; sourceTree = "<group>"; };
-		1A6B1D22134E8DA10016A47D /* DebugTestRewriteAST.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = DebugTestRewriteAST.java; sourceTree = "<group>"; };
-		1A6B1D23134E8DA10016A47D /* ErrorQueue.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = ErrorQueue.java; sourceTree = "<group>"; };
-		1A6B1D24134E8DA10016A47D /* TestASTConstruction.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = TestASTConstruction.java; sourceTree = "<group>"; };
-		1A6B1D25134E8DA10016A47D /* TestAttributes.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = TestAttributes.java; sourceTree = "<group>"; };
-		1A6B1D26134E8DA10016A47D /* TestAutoAST.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = TestAutoAST.java; sourceTree = "<group>"; };
-		1A6B1D27134E8DA10016A47D /* TestBufferedTreeNodeStream.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = TestBufferedTreeNodeStream.java; sourceTree = "<group>"; };
-		1A6B1D28134E8DA10016A47D /* TestCharDFAConversion.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = TestCharDFAConversion.java; sourceTree = "<group>"; };
-		1A6B1D29134E8DA10016A47D /* TestCommonTokenStream.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = TestCommonTokenStream.java; sourceTree = "<group>"; };
-		1A6B1D2A134E8DA10016A47D /* TestCompositeGrammars.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = TestCompositeGrammars.java; sourceTree = "<group>"; };
-		1A6B1D2B134E8DA10016A47D /* TestDFAConversion.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = TestDFAConversion.java; sourceTree = "<group>"; };
-		1A6B1D2C134E8DA10016A47D /* TestDFAMatching.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = TestDFAMatching.java; sourceTree = "<group>"; };
-		1A6B1D2D134E8DA10016A47D /* TestFastQueue.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = TestFastQueue.java; sourceTree = "<group>"; };
-		1A6B1D2E134E8DA10016A47D /* TestHeteroAST.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = TestHeteroAST.java; sourceTree = "<group>"; };
-		1A6B1D2F134E8DA10016A47D /* TestInterpretedLexing.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = TestInterpretedLexing.java; sourceTree = "<group>"; };
-		1A6B1D30134E8DA10016A47D /* TestInterpretedParsing.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = TestInterpretedParsing.java; sourceTree = "<group>"; };
-		1A6B1D31134E8DA10016A47D /* TestIntervalSet.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = TestIntervalSet.java; sourceTree = "<group>"; };
-		1A6B1D32134E8DA10016A47D /* TestJavaCodeGeneration.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = TestJavaCodeGeneration.java; sourceTree = "<group>"; };
-		1A6B1D33134E8DA10016A47D /* TestLeftRecursion.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = TestLeftRecursion.java; sourceTree = "<group>"; };
-		1A6B1D34134E8DA10016A47D /* TestLexer.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = TestLexer.java; sourceTree = "<group>"; };
-		1A6B1D35134E8DA10016A47D /* TestMessages.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = TestMessages.java; sourceTree = "<group>"; };
-		1A6B1D36134E8DA10016A47D /* TestNFAConstruction.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = TestNFAConstruction.java; sourceTree = "<group>"; };
-		1A6B1D37134E8DA10016A47D /* TestRewriteAST.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = TestRewriteAST.java; sourceTree = "<group>"; };
-		1A6B1D38134E8DA10016A47D /* TestRewriteTemplates.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = TestRewriteTemplates.java; sourceTree = "<group>"; };
-		1A6B1D39134E8DA10016A47D /* TestSemanticPredicateEvaluation.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = TestSemanticPredicateEvaluation.java; sourceTree = "<group>"; };
-		1A6B1D3A134E8DA10016A47D /* TestSemanticPredicates.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = TestSemanticPredicates.java; sourceTree = "<group>"; };
-		1A6B1D3B134E8DA10016A47D /* TestSets.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = TestSets.java; sourceTree = "<group>"; };
-		1A6B1D3C134E8DA10016A47D /* TestSymbolDefinitions.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = TestSymbolDefinitions.java; sourceTree = "<group>"; };
-		1A6B1D3D134E8DA10016A47D /* TestSyntacticPredicateEvaluation.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = TestSyntacticPredicateEvaluation.java; sourceTree = "<group>"; };
-		1A6B1D3E134E8DA10016A47D /* TestSyntaxErrors.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = TestSyntaxErrors.java; sourceTree = "<group>"; };
-		1A6B1D3F134E8DA10016A47D /* TestTemplates.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = TestTemplates.java; sourceTree = "<group>"; };
-		1A6B1D40134E8DA10016A47D /* TestTokenRewriteStream.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = TestTokenRewriteStream.java; sourceTree = "<group>"; };
-		1A6B1D41134E8DA10016A47D /* TestTopologicalSort.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = TestTopologicalSort.java; sourceTree = "<group>"; };
-		1A6B1D42134E8DA10016A47D /* TestTreeGrammarRewriteAST.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = TestTreeGrammarRewriteAST.java; sourceTree = "<group>"; };
-		1A6B1D43134E8DA10016A47D /* TestTreeIterator.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = TestTreeIterator.java; sourceTree = "<group>"; };
-		1A6B1D44134E8DA10016A47D /* TestTreeNodeStream.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = TestTreeNodeStream.java; sourceTree = "<group>"; };
-		1A6B1D45134E8DA10016A47D /* TestTreeParsing.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = TestTreeParsing.java; sourceTree = "<group>"; };
-		1A6B1D46134E8DA10016A47D /* TestTrees.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = TestTrees.java; sourceTree = "<group>"; };
-		1A6B1D47134E8DA10016A47D /* TestTreeWizard.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = TestTreeWizard.java; sourceTree = "<group>"; };
-		1A6B1D4A134E8DA10016A47D /* ANTLRFastQueueTest.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ANTLRFastQueueTest.h; sourceTree = "<group>"; };
-		1A6B1D4B134E8DA10016A47D /* ANTLRFastQueueTest.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ANTLRFastQueueTest.m; sourceTree = "<group>"; };
-		1A6B1D4C134E8DA10016A47D /* ANTLRIntArrayTest.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ANTLRIntArrayTest.h; sourceTree = "<group>"; };
-		1A6B1D4D134E8DA10016A47D /* ANTLRIntArrayTest.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ANTLRIntArrayTest.m; sourceTree = "<group>"; };
-		1A6B1D4F134E8DA10016A47D /* ANTLRRecognizerTest.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ANTLRRecognizerTest.h; sourceTree = "<group>"; };
-		1A6B1D50134E8DA10016A47D /* ANTLRRecognizerTest.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ANTLRRecognizerTest.m; sourceTree = "<group>"; };
-		1A6B1D52134E8DA10016A47D /* ANTLRBitSetTest.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ANTLRBitSetTest.h; sourceTree = "<group>"; };
-		1A6B1D53134E8DA10016A47D /* ANTLRBitSetTest.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ANTLRBitSetTest.m; sourceTree = "<group>"; };
-		1A6B1D55134E8DA10016A47D /* ANTLRStringStreamTest.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ANTLRStringStreamTest.h; sourceTree = "<group>"; };
-		1A6B1D56134E8DA10016A47D /* ANTLRStringStreamTest.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ANTLRStringStreamTest.m; sourceTree = "<group>"; };
-		1A6B1D58134E8DA10016A47D /* TestRewriteRuleTokenStream.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TestRewriteRuleTokenStream.h; sourceTree = "<group>"; };
-		1A6B1D59134E8DA10016A47D /* TestRewriteRuleTokenStream.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TestRewriteRuleTokenStream.m; sourceTree = "<group>"; };
-		1A6B1D5B134E8DA10016A47D /* ANTLRCommonTokenTest.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ANTLRCommonTokenTest.h; sourceTree = "<group>"; };
-		1A6B1D5C134E8DA10016A47D /* ANTLRCommonTokenTest.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ANTLRCommonTokenTest.m; sourceTree = "<group>"; };
-		1A6B1D5E134E8DA10016A47D /* ANTLRCommonErrorNodeTest.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ANTLRCommonErrorNodeTest.h; sourceTree = "<group>"; };
-		1A6B1D5F134E8DA10016A47D /* ANTLRCommonErrorNodeTest.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ANTLRCommonErrorNodeTest.m; sourceTree = "<group>"; };
-		1A6B1D60134E8DA10016A47D /* ANTLRCommonTreeAdaptorTest.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ANTLRCommonTreeAdaptorTest.h; sourceTree = "<group>"; };
-		1A6B1D61134E8DA10016A47D /* ANTLRCommonTreeAdaptorTest.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ANTLRCommonTreeAdaptorTest.m; sourceTree = "<group>"; };
-		1A6B1D62134E8DA10016A47D /* ANTLRCommonTreeTest.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ANTLRCommonTreeTest.h; sourceTree = "<group>"; };
-		1A6B1D63134E8DA10016A47D /* ANTLRCommonTreeTest.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ANTLRCommonTreeTest.m; sourceTree = "<group>"; };
-		1A6B1D78134EA0970016A47D /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = Library/Frameworks/SenTestingKit.framework; sourceTree = DEVELOPER_DIR; };
-		1AAC1C3C134FD6A500B2DC68 /* ANTLR.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ANTLR.h; path = ../ANTLR.h; sourceTree = "<group>"; };
-		1AE72318134E860B001C3F35 /* ANTLR.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ANTLR.framework; sourceTree = BUILT_PRODUCTS_DIR; };
-		1AE7231B134E860B001C3F35 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
-		1AE7231E134E860B001C3F35 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; };
-		1AE7231F134E860B001C3F35 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; };
-		1AE72323134E860B001C3F35 /* ANTLR-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "ANTLR-Info.plist"; sourceTree = "<group>"; };
-		1AE72325134E860B001C3F35 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
-		1AE72327134E860B001C3F35 /* ANTLR-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ANTLR-Prefix.pch"; sourceTree = "<group>"; };
-		1AE7232D134E860B001C3F35 /* ANTLRTests.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ANTLRTests.octest; sourceTree = BUILT_PRODUCTS_DIR; };
-		1AE72334134E860B001C3F35 /* ANTLRTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "ANTLRTests-Info.plist"; sourceTree = "<group>"; };
-		1AE72336134E860B001C3F35 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
-		1AE72338134E860B001C3F35 /* ANTLRTests-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ANTLRTests-Prefix.pch"; sourceTree = "<group>"; };
-		1AE72339134E860B001C3F35 /* ANTLRTests.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ANTLRTests.h; sourceTree = "<group>"; };
-		1AE7233B134E860B001C3F35 /* ANTLRTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ANTLRTests.m; sourceTree = "<group>"; };
-		1AE72345134E89BF001C3F35 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = System/Library/Frameworks/CoreFoundation.framework; sourceTree = SDKROOT; };
-		1AE72346134E89BF001C3F35 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
-		1AE72349134E8AB4001C3F35 /* ANTLRBaseMapElement.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRBaseMapElement.m; path = ../ANTLRBaseMapElement.m; sourceTree = SOURCE_ROOT; };
-		1AE7234A134E8AB4001C3F35 /* ANTLRBaseRecognizer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRBaseRecognizer.m; path = ../ANTLRBaseRecognizer.m; sourceTree = SOURCE_ROOT; };
-		1AE7234B134E8AB4001C3F35 /* ANTLRBaseStack.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRBaseStack.m; path = ../ANTLRBaseStack.m; sourceTree = SOURCE_ROOT; };
-		1AE7234C134E8AB4001C3F35 /* ANTLRBaseTree.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRBaseTree.m; path = ../ANTLRBaseTree.m; sourceTree = SOURCE_ROOT; };
-		1AE7234D134E8AB4001C3F35 /* ANTLRBaseTreeAdaptor.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRBaseTreeAdaptor.m; path = ../ANTLRBaseTreeAdaptor.m; sourceTree = SOURCE_ROOT; };
-		1AE7234E134E8AB4001C3F35 /* ANTLRBitSet.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRBitSet.m; path = ../ANTLRBitSet.m; sourceTree = SOURCE_ROOT; };
-		1AE7234F134E8AB4001C3F35 /* ANTLRBufferedTokenStream.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRBufferedTokenStream.m; path = ../ANTLRBufferedTokenStream.m; sourceTree = SOURCE_ROOT; };
-		1AE72350134E8AB4001C3F35 /* ANTLRBufferedTreeNodeStream.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRBufferedTreeNodeStream.m; path = ../ANTLRBufferedTreeNodeStream.m; sourceTree = SOURCE_ROOT; };
-		1AE72351134E8AB4001C3F35 /* ANTLRCharStreamState.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRCharStreamState.m; path = ../ANTLRCharStreamState.m; sourceTree = SOURCE_ROOT; };
-		1AE72352134E8AB4001C3F35 /* ANTLRCommonErrorNode.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRCommonErrorNode.m; path = ../ANTLRCommonErrorNode.m; sourceTree = SOURCE_ROOT; };
-		1AE72353134E8AB4001C3F35 /* ANTLRCommonToken.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRCommonToken.m; path = ../ANTLRCommonToken.m; sourceTree = SOURCE_ROOT; };
-		1AE72354134E8AB4001C3F35 /* ANTLRCommonTokenStream.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRCommonTokenStream.m; path = ../ANTLRCommonTokenStream.m; sourceTree = SOURCE_ROOT; };
-		1AE72355134E8AB4001C3F35 /* ANTLRCommonTree.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRCommonTree.m; path = ../ANTLRCommonTree.m; sourceTree = SOURCE_ROOT; };
-		1AE72356134E8AB4001C3F35 /* ANTLRCommonTreeAdaptor.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRCommonTreeAdaptor.m; path = ../ANTLRCommonTreeAdaptor.m; sourceTree = SOURCE_ROOT; };
-		1AE72357134E8AB4001C3F35 /* ANTLRCommonTreeNodeStream.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRCommonTreeNodeStream.m; path = ../ANTLRCommonTreeNodeStream.m; sourceTree = SOURCE_ROOT; };
-		1AE72358134E8AB4001C3F35 /* ANTLRDebugEventProxy.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRDebugEventProxy.m; path = ../ANTLRDebugEventProxy.m; sourceTree = SOURCE_ROOT; };
-		1AE72359134E8AB4001C3F35 /* ANTLRDebugParser.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRDebugParser.m; path = ../ANTLRDebugParser.m; sourceTree = SOURCE_ROOT; };
-		1AE7235A134E8AB4001C3F35 /* ANTLRDebugTokenStream.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRDebugTokenStream.m; path = ../ANTLRDebugTokenStream.m; sourceTree = SOURCE_ROOT; };
-		1AE7235B134E8AB4001C3F35 /* ANTLRDebugTreeAdaptor.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRDebugTreeAdaptor.m; path = ../ANTLRDebugTreeAdaptor.m; sourceTree = SOURCE_ROOT; };
-		1AE7235C134E8AB4001C3F35 /* ANTLRDebugTreeNodeStream.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRDebugTreeNodeStream.m; path = ../ANTLRDebugTreeNodeStream.m; sourceTree = SOURCE_ROOT; };
-		1AE7235D134E8AB4001C3F35 /* ANTLRDebugTreeParser.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRDebugTreeParser.m; path = ../ANTLRDebugTreeParser.m; sourceTree = SOURCE_ROOT; };
-		1AE7235E134E8AB4001C3F35 /* ANTLRDFA.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRDFA.m; path = ../ANTLRDFA.m; sourceTree = SOURCE_ROOT; };
-		1AE7235F134E8AB4001C3F35 /* ANTLRDoubleKeyMap.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRDoubleKeyMap.m; path = ../ANTLRDoubleKeyMap.m; sourceTree = SOURCE_ROOT; };
-		1AE72360134E8AB4001C3F35 /* ANTLREarlyExitException.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLREarlyExitException.m; path = ../ANTLREarlyExitException.m; sourceTree = SOURCE_ROOT; };
-		1AE72361134E8AB4001C3F35 /* ANTLRFailedPredicateException.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRFailedPredicateException.m; path = ../ANTLRFailedPredicateException.m; sourceTree = SOURCE_ROOT; };
-		1AE72362134E8AB4001C3F35 /* ANTLRFastQueue.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRFastQueue.m; path = ../ANTLRFastQueue.m; sourceTree = SOURCE_ROOT; };
-		1AE72363134E8AB4001C3F35 /* ANTLRFileStream.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRFileStream.m; path = ../ANTLRFileStream.m; sourceTree = SOURCE_ROOT; };
-		1AE72364134E8AB4001C3F35 /* ANTLRHashMap.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRHashMap.m; path = ../ANTLRHashMap.m; sourceTree = SOURCE_ROOT; };
-		1AE72365134E8AB4001C3F35 /* ANTLRHashRule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRHashRule.m; path = ../ANTLRHashRule.m; sourceTree = SOURCE_ROOT; };
-		1AE72366134E8AB4001C3F35 /* ANTLRInputStream.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRInputStream.m; path = ../ANTLRInputStream.m; sourceTree = SOURCE_ROOT; };
-		1AE72367134E8AB4001C3F35 /* ANTLRIntArray.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRIntArray.m; path = ../ANTLRIntArray.m; sourceTree = SOURCE_ROOT; };
-		1AE72368134E8AB4001C3F35 /* ANTLRIntStream.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ANTLRIntStream.h; path = ../ANTLRIntStream.h; sourceTree = SOURCE_ROOT; };
-		1AE72369134E8AB4001C3F35 /* ANTLRLexer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRLexer.m; path = ../ANTLRLexer.m; sourceTree = SOURCE_ROOT; };
-		1AE7236A134E8AB4001C3F35 /* ANTLRLexerRuleReturnScope.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRLexerRuleReturnScope.m; path = ../ANTLRLexerRuleReturnScope.m; sourceTree = SOURCE_ROOT; };
-		1AE7236B134E8AB4001C3F35 /* ANTLRLexerState.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRLexerState.m; path = ../ANTLRLexerState.m; sourceTree = SOURCE_ROOT; };
-		1AE7236C134E8AB4001C3F35 /* ANTLRLinkBase.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRLinkBase.m; path = ../ANTLRLinkBase.m; sourceTree = SOURCE_ROOT; };
-		1AE7236D134E8AB4001C3F35 /* ANTLRLookaheadStream.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRLookaheadStream.m; path = ../ANTLRLookaheadStream.m; sourceTree = SOURCE_ROOT; };
-		1AE7236E134E8AB4001C3F35 /* ANTLRMap.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRMap.m; path = ../ANTLRMap.m; sourceTree = SOURCE_ROOT; };
-		1AE7236F134E8AB4001C3F35 /* ANTLRMapElement.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRMapElement.m; path = ../ANTLRMapElement.m; sourceTree = SOURCE_ROOT; };
-		1AE72370134E8AB4001C3F35 /* ANTLRMismatchedNotSetException.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRMismatchedNotSetException.m; path = ../ANTLRMismatchedNotSetException.m; sourceTree = SOURCE_ROOT; };
-		1AE72371134E8AB4001C3F35 /* ANTLRMismatchedRangeException.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRMismatchedRangeException.m; path = ../ANTLRMismatchedRangeException.m; sourceTree = SOURCE_ROOT; };
-		1AE72372134E8AB4001C3F35 /* ANTLRMismatchedSetException.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRMismatchedSetException.m; path = ../ANTLRMismatchedSetException.m; sourceTree = SOURCE_ROOT; };
-		1AE72373134E8AB4001C3F35 /* ANTLRMismatchedTokenException.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRMismatchedTokenException.m; path = ../ANTLRMismatchedTokenException.m; sourceTree = SOURCE_ROOT; };
-		1AE72374134E8AB4001C3F35 /* ANTLRMismatchedTreeNodeException.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRMismatchedTreeNodeException.m; path = ../ANTLRMismatchedTreeNodeException.m; sourceTree = SOURCE_ROOT; };
-		1AE72375134E8AB4001C3F35 /* ANTLRMissingTokenException.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRMissingTokenException.m; path = ../ANTLRMissingTokenException.m; sourceTree = SOURCE_ROOT; };
-		1AE72376134E8AB4001C3F35 /* ANTLRNodeMapElement.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRNodeMapElement.m; path = ../ANTLRNodeMapElement.m; sourceTree = SOURCE_ROOT; };
-		1AE72377134E8AB4001C3F35 /* ANTLRNoViableAltException.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRNoViableAltException.m; path = ../ANTLRNoViableAltException.m; sourceTree = SOURCE_ROOT; };
-		1AE72378134E8AB4001C3F35 /* ANTLRParser.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRParser.m; path = ../ANTLRParser.m; sourceTree = SOURCE_ROOT; };
-		1AE72379134E8AB4001C3F35 /* ANTLRParserRuleReturnScope.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRParserRuleReturnScope.m; path = ../ANTLRParserRuleReturnScope.m; sourceTree = SOURCE_ROOT; };
-		1AE7237A134E8AB4001C3F35 /* ANTLRParseTree.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRParseTree.m; path = ../ANTLRParseTree.m; sourceTree = SOURCE_ROOT; };
-		1AE7237B134E8AB4001C3F35 /* ANTLRPtrBuffer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRPtrBuffer.m; path = ../ANTLRPtrBuffer.m; sourceTree = SOURCE_ROOT; };
-		1AE7237C134E8AB4001C3F35 /* ANTLRPtrStack.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRPtrStack.m; path = ../ANTLRPtrStack.m; sourceTree = SOURCE_ROOT; };
-		1AE7237D134E8AB4001C3F35 /* ANTLRReaderStream.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRReaderStream.m; path = ../ANTLRReaderStream.m; sourceTree = SOURCE_ROOT; };
-		1AE7237E134E8AB4001C3F35 /* ANTLRRecognitionException.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRRecognitionException.m; path = ../ANTLRRecognitionException.m; sourceTree = SOURCE_ROOT; };
-		1AE7237F134E8AB4001C3F35 /* ANTLRRecognizerSharedState.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRRecognizerSharedState.m; path = ../ANTLRRecognizerSharedState.m; sourceTree = SOURCE_ROOT; };
-		1AE72380134E8AB4001C3F35 /* ANTLRRewriteRuleElementStream.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRRewriteRuleElementStream.m; path = ../ANTLRRewriteRuleElementStream.m; sourceTree = SOURCE_ROOT; };
-		1AE72381134E8AB4001C3F35 /* ANTLRRewriteRuleNodeStream.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRRewriteRuleNodeStream.m; path = ../ANTLRRewriteRuleNodeStream.m; sourceTree = SOURCE_ROOT; };
-		1AE72382134E8AB4001C3F35 /* ANTLRRewriteRuleSubtreeStream.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRRewriteRuleSubtreeStream.m; path = ../ANTLRRewriteRuleSubtreeStream.m; sourceTree = SOURCE_ROOT; };
-		1AE72383134E8AB4001C3F35 /* ANTLRRewriteRuleTokenStream.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRRewriteRuleTokenStream.m; path = ../ANTLRRewriteRuleTokenStream.m; sourceTree = SOURCE_ROOT; };
-		1AE72384134E8AB4001C3F35 /* ANTLRRuleMapElement.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRRuleMapElement.m; path = ../ANTLRRuleMapElement.m; sourceTree = SOURCE_ROOT; };
-		1AE72385134E8AB4001C3F35 /* ANTLRRuleMemo.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRRuleMemo.m; path = ../ANTLRRuleMemo.m; sourceTree = SOURCE_ROOT; };
-		1AE72386134E8AB4001C3F35 /* ANTLRRuleReturnScope.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRRuleReturnScope.m; path = ../ANTLRRuleReturnScope.m; sourceTree = SOURCE_ROOT; };
-		1AE72387134E8AB4001C3F35 /* ANTLRRuleStack.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRRuleStack.m; path = ../ANTLRRuleStack.m; sourceTree = SOURCE_ROOT; };
-		1AE72388134E8AB4001C3F35 /* ANTLRRuntimeException.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRRuntimeException.m; path = ../ANTLRRuntimeException.m; sourceTree = SOURCE_ROOT; };
-		1AE72389134E8AB4001C3F35 /* ANTLRStreamEnumerator.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRStreamEnumerator.m; path = ../ANTLRStreamEnumerator.m; sourceTree = SOURCE_ROOT; };
-		1AE7238A134E8AB4001C3F35 /* ANTLRStringStream.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRStringStream.m; path = ../ANTLRStringStream.m; sourceTree = SOURCE_ROOT; };
-		1AE7238B134E8AB4001C3F35 /* ANTLRSymbolStack.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRSymbolStack.m; path = ../ANTLRSymbolStack.m; sourceTree = SOURCE_ROOT; };
-		1AE7238C134E8AB4001C3F35 /* ANTLRToken+DebuggerSupport.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = "ANTLRToken+DebuggerSupport.m"; path = "../ANTLRToken+DebuggerSupport.m"; sourceTree = SOURCE_ROOT; };
-		1AE7238D134E8AB4001C3F35 /* ANTLRTokenRewriteStream.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRTokenRewriteStream.m; path = ../ANTLRTokenRewriteStream.m; sourceTree = SOURCE_ROOT; };
-		1AE7238F134E8AB4001C3F35 /* ANTLRTreeAdaptor.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRTreeAdaptor.m; path = ../ANTLRTreeAdaptor.m; sourceTree = SOURCE_ROOT; };
-		1AE72390134E8AB4001C3F35 /* ANTLRTreeException.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRTreeException.m; path = ../ANTLRTreeException.m; sourceTree = SOURCE_ROOT; };
-		1AE72391134E8AB4001C3F35 /* ANTLRTreeIterator.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRTreeIterator.m; path = ../ANTLRTreeIterator.m; sourceTree = SOURCE_ROOT; };
-		1AE72392134E8AB4001C3F35 /* ANTLRTreeParser.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRTreeParser.m; path = ../ANTLRTreeParser.m; sourceTree = SOURCE_ROOT; };
-		1AE72393134E8AB4001C3F35 /* ANTLRTreePatternLexer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRTreePatternLexer.m; path = ../ANTLRTreePatternLexer.m; sourceTree = SOURCE_ROOT; };
-		1AE72394134E8AB4001C3F35 /* ANTLRTreePatternParser.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRTreePatternParser.m; path = ../ANTLRTreePatternParser.m; sourceTree = SOURCE_ROOT; };
-		1AE72395134E8AB4001C3F35 /* ANTLRTreeRewriter.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRTreeRewriter.m; path = ../ANTLRTreeRewriter.m; sourceTree = SOURCE_ROOT; };
-		1AE72396134E8AB4001C3F35 /* ANTLRTreeRuleReturnScope.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRTreeRuleReturnScope.m; path = ../ANTLRTreeRuleReturnScope.m; sourceTree = SOURCE_ROOT; };
-		1AE72397134E8AB4001C3F35 /* ANTLRTreeVisitor.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRTreeVisitor.m; path = ../ANTLRTreeVisitor.m; sourceTree = SOURCE_ROOT; };
-		1AE72398134E8AB4001C3F35 /* ANTLRTreeVisitorAction.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRTreeVisitorAction.m; path = ../ANTLRTreeVisitorAction.m; sourceTree = SOURCE_ROOT; };
-		1AE72399134E8AB4001C3F35 /* ANTLRTreeWizard.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRTreeWizard.m; path = ../ANTLRTreeWizard.m; sourceTree = SOURCE_ROOT; };
-		1AE7239A134E8AB4001C3F35 /* ANTLRUnbufferedCommonTreeNodeStream.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRUnbufferedCommonTreeNodeStream.m; path = ../ANTLRUnbufferedCommonTreeNodeStream.m; sourceTree = SOURCE_ROOT; };
-		1AE7239B134E8AB4001C3F35 /* ANTLRUnbufferedCommonTreeNodeStreamState.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRUnbufferedCommonTreeNodeStreamState.m; path = ../ANTLRUnbufferedCommonTreeNodeStreamState.m; sourceTree = SOURCE_ROOT; };
-		1AE7239C134E8AB4001C3F35 /* ANTLRUnbufferedTokenStream.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRUnbufferedTokenStream.m; path = ../ANTLRUnbufferedTokenStream.m; sourceTree = SOURCE_ROOT; };
-		1AE7239D134E8AB4001C3F35 /* ANTLRUniqueIDMap.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRUniqueIDMap.m; path = ../ANTLRUniqueIDMap.m; sourceTree = SOURCE_ROOT; };
-		1AE7239E134E8AB4001C3F35 /* ANTLRUnwantedTokenException.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ANTLRUnwantedTokenException.m; path = ../ANTLRUnwantedTokenException.m; sourceTree = SOURCE_ROOT; };
-/* End PBXFileReference section */
-
-/* Begin PBXFrameworksBuildPhase section */
-		1A63BC5E134F5DAB002EDFB4 /* Frameworks */ = {
-			isa = PBXFrameworksBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				1A63BC70134F5E43002EDFB4 /* ANTLR.framework in Frameworks */,
-				1A63BDF1134FAB4B002EDFB4 /* Cocoa.framework in Frameworks */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		1A63BD2F134F5F1E002EDFB4 /* Frameworks */ = {
-			isa = PBXFrameworksBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				1A63BDEF134F93A5002EDFB4 /* ANTLR.framework in Frameworks */,
-				1A63BDF0134F93AC002EDFB4 /* Cocoa.framework in Frameworks */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		1A63BD3C134F5F36002EDFB4 /* Frameworks */ = {
-			isa = PBXFrameworksBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				1A63BDF2134FAB60002EDFB4 /* ANTLR.framework in Frameworks */,
-				1A63BDF3134FAB63002EDFB4 /* Cocoa.framework in Frameworks */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		1A63BD49134F5F43002EDFB4 /* Frameworks */ = {
-			isa = PBXFrameworksBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				1AB7FE18134FC0800059474B /* ANTLR.framework in Frameworks */,
-				1A63BDAF134F614D002EDFB4 /* Cocoa.framework in Frameworks */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		1A63BD56134F5F4D002EDFB4 /* Frameworks */ = {
-			isa = PBXFrameworksBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				1A63BE0C134FB855002EDFB4 /* ANTLR.framework in Frameworks */,
-				1A63BDB4134F6154002EDFB4 /* Cocoa.framework in Frameworks */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		1A63BD63134F5F5E002EDFB4 /* Frameworks */ = {
-			isa = PBXFrameworksBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				1AB7FE17134FBFB20059474B /* ANTLR.framework in Frameworks */,
-				1A63BDB9134F615A002EDFB4 /* Cocoa.framework in Frameworks */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		1A63BD70134F5F67002EDFB4 /* Frameworks */ = {
-			isa = PBXFrameworksBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				1AB7FE15134FBF900059474B /* ANTLR.framework in Frameworks */,
-				1A63BDBE134F6160002EDFB4 /* Cocoa.framework in Frameworks */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		1A63BD7D134F5F71002EDFB4 /* Frameworks */ = {
-			isa = PBXFrameworksBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				1AB7FE16134FBF9F0059474B /* ANTLR.framework in Frameworks */,
-				1A63BDC3134F6167002EDFB4 /* Cocoa.framework in Frameworks */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		1A63BDD1134F6233002EDFB4 /* Frameworks */ = {
-			isa = PBXFrameworksBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				1A63BDF4134FAF58002EDFB4 /* ANTLR.framework in Frameworks */,
-				1A63BDE1134F626A002EDFB4 /* Cocoa.framework in Frameworks */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		1A63BDF9134FB75E002EDFB4 /* Frameworks */ = {
-			isa = PBXFrameworksBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				1A63BE08134FB814002EDFB4 /* ANTLR.framework in Frameworks */,
-				1A63BE09134FB818002EDFB4 /* Cocoa.framework in Frameworks */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		1AE72314134E860B001C3F35 /* Frameworks */ = {
-			isa = PBXFrameworksBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				1AE7231C134E860B001C3F35 /* Cocoa.framework in Frameworks */,
-				1AE72347134E89BF001C3F35 /* CoreFoundation.framework in Frameworks */,
-				1AE72348134E89BF001C3F35 /* Foundation.framework in Frameworks */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		1AE72329134E860B001C3F35 /* Frameworks */ = {
-			isa = PBXFrameworksBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				1A6B1D79134EA0970016A47D /* SenTestingKit.framework in Frameworks */,
-				1AE72331134E860B001C3F35 /* ANTLR.framework in Frameworks */,
-				1AE7232E134E860B001C3F35 /* Cocoa.framework in Frameworks */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-/* End PBXFrameworksBuildPhase section */
-
-/* Begin PBXGroup section */
-		1A048CFF134E8B9100005F57 /* Classes */ = {
-			isa = PBXGroup;
-			children = (
-				1AAC1C3C134FD6A500B2DC68 /* ANTLR.h */,
-				1A048D01134E8C1000005F57 /* antlr3.h */,
-				1A048D02134E8C1000005F57 /* ANTLRBaseMapElement.h */,
-				1A048D03134E8C1000005F57 /* ANTLRBaseRecognizer.h */,
-				1A048D04134E8C1000005F57 /* ANTLRBaseStack.h */,
-				1A048D05134E8C1000005F57 /* ANTLRBaseTree.h */,
-				1A048D06134E8C1000005F57 /* ANTLRBaseTreeAdaptor.h */,
-				1A048D07134E8C1000005F57 /* ANTLRBitSet.h */,
-				1A048D08134E8C1000005F57 /* ANTLRBufferedTokenStream.h */,
-				1A048D09134E8C1000005F57 /* ANTLRBufferedTreeNodeStream.h */,
-				1A048D0A134E8C1000005F57 /* ANTLRCharStream.h */,
-				1A048D0B134E8C1000005F57 /* ANTLRCharStreamState.h */,
-				1A048D0C134E8C1000005F57 /* ANTLRCommonErrorNode.h */,
-				1A048D0D134E8C1000005F57 /* ANTLRCommonToken.h */,
-				1A048D0E134E8C1000005F57 /* ANTLRCommonTokenStream.h */,
-				1A048D0F134E8C1000005F57 /* ANTLRCommonTree.h */,
-				1A048D10134E8C1000005F57 /* ANTLRCommonTreeAdaptor.h */,
-				1A048D11134E8C1000005F57 /* ANTLRCommonTreeNodeStream.h */,
-				1A048D12134E8C1100005F57 /* ANTLRCommonTreeTest-Info.plist */,
-				1A048D13134E8C1100005F57 /* ANTLRDebug.h */,
-				1A048D14134E8C1100005F57 /* ANTLRDebugEventListener.h */,
-				1A048D15134E8C1100005F57 /* ANTLRDebugEventProxy.h */,
-				1A048D16134E8C1100005F57 /* ANTLRDebugParser.h */,
-				1A048D17134E8C1100005F57 /* ANTLRDebugTokenStream.h */,
-				1A048D18134E8C1100005F57 /* ANTLRDebugTreeAdaptor.h */,
-				1A048D19134E8C1100005F57 /* ANTLRDebugTreeNodeStream.h */,
-				1A048D1A134E8C1100005F57 /* ANTLRDebugTreeParser.h */,
-				1A048D1B134E8C1100005F57 /* ANTLRDFA.h */,
-				1A048D1C134E8C1100005F57 /* ANTLRDoubleKeyMap.h */,
-				1A048D1D134E8C1100005F57 /* ANTLREarlyExitException.h */,
-				1A048D1E134E8C1100005F57 /* ANTLRError.h */,
-				1A048D1F134E8C1100005F57 /* ANTLRFailedPredicateException.h */,
-				1A048D20134E8C1100005F57 /* ANTLRFastQueue.h */,
-				1A6B1C97134E8CF70016A47D /* ANTLRFileStream.h */,
-				1A6B1C98134E8CF70016A47D /* ANTLRHashMap.h */,
-				1A6B1C99134E8CF70016A47D /* ANTLRHashRule.h */,
-				1A6B1C9A134E8CF70016A47D /* ANTLRInputStream.h */,
-				1A6B1C9B134E8CF70016A47D /* ANTLRIntArray.h */,
-				1AE72368134E8AB4001C3F35 /* ANTLRIntStream.h */,
-				1A6B1C9C134E8CF70016A47D /* ANTLRLexer.h */,
-				1A6B1C9D134E8CF70016A47D /* ANTLRLexerRuleReturnScope.h */,
-				1A6B1C9E134E8CF70016A47D /* ANTLRLexerState.h */,
-				1A6B1C9F134E8CF70016A47D /* ANTLRLinkBase.h */,
-				1A6B1CA0134E8CF70016A47D /* ANTLRLookaheadStream.h */,
-				1A6B1CA1134E8CF70016A47D /* ANTLRMap.h */,
-				1A6B1CA2134E8CF70016A47D /* ANTLRMapElement.h */,
-				1A6B1CA3134E8CF70016A47D /* ANTLRMismatchedNotSetException.h */,
-				1A6B1CA4134E8CF70016A47D /* ANTLRMismatchedRangeException.h */,
-				1A6B1CA5134E8CF70016A47D /* ANTLRMismatchedSetException.h */,
-				1A6B1CA6134E8CF70016A47D /* ANTLRMismatchedTokenException.h */,
-				1A6B1CA7134E8CF70016A47D /* ANTLRMismatchedTreeNodeException.h */,
-				1A6B1CA8134E8CF70016A47D /* ANTLRMissingTokenException.h */,
-				1A6B1CA9134E8CF70016A47D /* ANTLRNodeMapElement.h */,
-				1A6B1CAA134E8CF70016A47D /* ANTLRNoViableAltException.h */,
-				1A6B1CAB134E8CF70016A47D /* ANTLRParser.h */,
-				1A6B1CAC134E8CF70016A47D /* ANTLRParserRuleReturnScope.h */,
-				1A6B1CAD134E8CF70016A47D /* ANTLRParseTree.h */,
-				1A6B1CAE134E8CF70016A47D /* ANTLRPtrBuffer.h */,
-				1A6B1CAF134E8CF70016A47D /* ANTLRPtrStack.h */,
-				1A6B1CB0134E8CF70016A47D /* ANTLRReaderStream.h */,
-				1A6B1CB1134E8CF70016A47D /* ANTLRRecognitionException.h */,
-				1A6B1CB2134E8CF70016A47D /* ANTLRRecognizerSharedState.h */,
-				1A6B1CB3134E8CF70016A47D /* ANTLRRewriteRuleElementStream.h */,
-				1A6B1CB4134E8CF70016A47D /* ANTLRRewriteRuleNodeStream.h */,
-				1A6B1CB5134E8CF70016A47D /* ANTLRRewriteRuleSubtreeStream.h */,
-				1A6B1CB6134E8CF70016A47D /* ANTLRRewriteRuleTokenStream.h */,
-				1A6B1CB7134E8CF70016A47D /* ANTLRRuleMapElement.h */,
-				1A6B1CB8134E8CF70016A47D /* ANTLRRuleMemo.h */,
-				1A6B1CB9134E8CF70016A47D /* ANTLRRuleReturnScope.h */,
-				1A6B1CBA134E8CF70016A47D /* ANTLRRuleStack.h */,
-				1A6B1CBB134E8CF70016A47D /* ANTLRRuntimeException.h */,
-				1A6B1CBC134E8CF70016A47D /* ANTLRStreamEnumerator.h */,
-				1A6B1CBD134E8CF70016A47D /* ANTLRStringStream.h */,
-				1A6B1CBE134E8CF70016A47D /* ANTLRStringStreamState.h */,
-				1A6B1CBF134E8CF70016A47D /* ANTLRSymbolStack.h */,
-				1A6B1CC0134E8CF70016A47D /* ANTLRToken.h */,
-				1A6B1CC1134E8CF70016A47D /* ANTLRToken+DebuggerSupport.h */,
-				1A6B1CC2134E8CF70016A47D /* ANTLRTokenRewriteStream.h */,
-				1A6B1CC3134E8CF70016A47D /* ANTLRTokenSource.h */,
-				1A6B1CC4134E8CF70016A47D /* ANTLRTokenStream.h */,
-				1A6B1CC5134E8CF70016A47D /* ANTLRTree.h */,
-				1A6B1CC6134E8CF70016A47D /* ANTLRTreeAdaptor.h */,
-				1A6B1CC7134E8CF70016A47D /* ANTLRTreeException.h */,
-				1A6B1CC8134E8CF70016A47D /* ANTLRTreeIterator.h */,
-				1A6B1CC9134E8CF70016A47D /* ANTLRTreeNodeStream.h */,
-				1A6B1CCA134E8CF70016A47D /* ANTLRTreeParser.h */,
-				1A6B1CCB134E8CF70016A47D /* ANTLRTreePatternLexer.h */,
-				1A6B1CCC134E8CF70016A47D /* ANTLRTreePatternParser.h */,
-				1A6B1CCD134E8CF70016A47D /* ANTLRTreeRewriter.h */,
-				1A6B1CCE134E8CF70016A47D /* ANTLRTreeRuleReturnScope.h */,
-				1A6B1CCF134E8CF70016A47D /* ANTLRTreeVisitor.h */,
-				1A6B1CD0134E8CF70016A47D /* ANTLRTreeVisitorAction.h */,
-				1A6B1CD1134E8CF70016A47D /* ANTLRTreeWizard.h */,
-				1A6B1CD2134E8CF70016A47D /* ANTLRUnbufferedCommonTreeNodeStream.h */,
-				1A6B1CD3134E8CF70016A47D /* ANTLRUnbufferedCommonTreeNodeStreamState.h */,
-				1A6B1CD4134E8CF70016A47D /* ANTLRUnbufferedTokenStream.h */,
-				1A6B1CD5134E8CF70016A47D /* ANTLRUniqueIDMap.h */,
-				1A6B1CD6134E8CF70016A47D /* ANTLRUnwantedTokenException.h */,
-				1AE72349134E8AB4001C3F35 /* ANTLRBaseMapElement.m */,
-				1AE7234A134E8AB4001C3F35 /* ANTLRBaseRecognizer.m */,
-				1AE7234B134E8AB4001C3F35 /* ANTLRBaseStack.m */,
-				1AE7234C134E8AB4001C3F35 /* ANTLRBaseTree.m */,
-				1AE7234D134E8AB4001C3F35 /* ANTLRBaseTreeAdaptor.m */,
-				1AE7234E134E8AB4001C3F35 /* ANTLRBitSet.m */,
-				1AE7234F134E8AB4001C3F35 /* ANTLRBufferedTokenStream.m */,
-				1AE72350134E8AB4001C3F35 /* ANTLRBufferedTreeNodeStream.m */,
-				1AE72351134E8AB4001C3F35 /* ANTLRCharStreamState.m */,
-				1AE72352134E8AB4001C3F35 /* ANTLRCommonErrorNode.m */,
-				1AE72353134E8AB4001C3F35 /* ANTLRCommonToken.m */,
-				1AE72354134E8AB4001C3F35 /* ANTLRCommonTokenStream.m */,
-				1AE72355134E8AB4001C3F35 /* ANTLRCommonTree.m */,
-				1AE72356134E8AB4001C3F35 /* ANTLRCommonTreeAdaptor.m */,
-				1AE72357134E8AB4001C3F35 /* ANTLRCommonTreeNodeStream.m */,
-				1AE72358134E8AB4001C3F35 /* ANTLRDebugEventProxy.m */,
-				1AE72359134E8AB4001C3F35 /* ANTLRDebugParser.m */,
-				1AE7235A134E8AB4001C3F35 /* ANTLRDebugTokenStream.m */,
-				1AE7235B134E8AB4001C3F35 /* ANTLRDebugTreeAdaptor.m */,
-				1AE7235C134E8AB4001C3F35 /* ANTLRDebugTreeNodeStream.m */,
-				1AE7235D134E8AB4001C3F35 /* ANTLRDebugTreeParser.m */,
-				1AE7235E134E8AB4001C3F35 /* ANTLRDFA.m */,
-				1AE7235F134E8AB4001C3F35 /* ANTLRDoubleKeyMap.m */,
-				1AE72360134E8AB4001C3F35 /* ANTLREarlyExitException.m */,
-				1AE72361134E8AB4001C3F35 /* ANTLRFailedPredicateException.m */,
-				1AE72362134E8AB4001C3F35 /* ANTLRFastQueue.m */,
-				1AE72363134E8AB4001C3F35 /* ANTLRFileStream.m */,
-				1AE72364134E8AB4001C3F35 /* ANTLRHashMap.m */,
-				1AE72365134E8AB4001C3F35 /* ANTLRHashRule.m */,
-				1AE72366134E8AB4001C3F35 /* ANTLRInputStream.m */,
-				1AE72367134E8AB4001C3F35 /* ANTLRIntArray.m */,
-				1AE72369134E8AB4001C3F35 /* ANTLRLexer.m */,
-				1AE7236A134E8AB4001C3F35 /* ANTLRLexerRuleReturnScope.m */,
-				1AE7236B134E8AB4001C3F35 /* ANTLRLexerState.m */,
-				1AE7236C134E8AB4001C3F35 /* ANTLRLinkBase.m */,
-				1AE7236D134E8AB4001C3F35 /* ANTLRLookaheadStream.m */,
-				1AE7236E134E8AB4001C3F35 /* ANTLRMap.m */,
-				1AE7236F134E8AB4001C3F35 /* ANTLRMapElement.m */,
-				1AE72370134E8AB4001C3F35 /* ANTLRMismatchedNotSetException.m */,
-				1AE72371134E8AB4001C3F35 /* ANTLRMismatchedRangeException.m */,
-				1AE72372134E8AB4001C3F35 /* ANTLRMismatchedSetException.m */,
-				1AE72373134E8AB4001C3F35 /* ANTLRMismatchedTokenException.m */,
-				1AE72374134E8AB4001C3F35 /* ANTLRMismatchedTreeNodeException.m */,
-				1AE72375134E8AB4001C3F35 /* ANTLRMissingTokenException.m */,
-				1AE72376134E8AB4001C3F35 /* ANTLRNodeMapElement.m */,
-				1AE72377134E8AB4001C3F35 /* ANTLRNoViableAltException.m */,
-				1AE72378134E8AB4001C3F35 /* ANTLRParser.m */,
-				1AE72379134E8AB4001C3F35 /* ANTLRParserRuleReturnScope.m */,
-				1AE7237A134E8AB4001C3F35 /* ANTLRParseTree.m */,
-				1AE7237B134E8AB4001C3F35 /* ANTLRPtrBuffer.m */,
-				1AE7237C134E8AB4001C3F35 /* ANTLRPtrStack.m */,
-				1AE7237D134E8AB4001C3F35 /* ANTLRReaderStream.m */,
-				1AE7237E134E8AB4001C3F35 /* ANTLRRecognitionException.m */,
-				1AE7237F134E8AB4001C3F35 /* ANTLRRecognizerSharedState.m */,
-				1AE72380134E8AB4001C3F35 /* ANTLRRewriteRuleElementStream.m */,
-				1AE72381134E8AB4001C3F35 /* ANTLRRewriteRuleNodeStream.m */,
-				1AE72382134E8AB4001C3F35 /* ANTLRRewriteRuleSubtreeStream.m */,
-				1AE72383134E8AB4001C3F35 /* ANTLRRewriteRuleTokenStream.m */,
-				1AE72384134E8AB4001C3F35 /* ANTLRRuleMapElement.m */,
-				1AE72385134E8AB4001C3F35 /* ANTLRRuleMemo.m */,
-				1AE72386134E8AB4001C3F35 /* ANTLRRuleReturnScope.m */,
-				1AE72387134E8AB4001C3F35 /* ANTLRRuleStack.m */,
-				1AE72388134E8AB4001C3F35 /* ANTLRRuntimeException.m */,
-				1AE72389134E8AB4001C3F35 /* ANTLRStreamEnumerator.m */,
-				1AE7238A134E8AB4001C3F35 /* ANTLRStringStream.m */,
-				1AE7238B134E8AB4001C3F35 /* ANTLRSymbolStack.m */,
-				1AE7238C134E8AB4001C3F35 /* ANTLRToken+DebuggerSupport.m */,
-				1AE7238D134E8AB4001C3F35 /* ANTLRTokenRewriteStream.m */,
-				1AE7238F134E8AB4001C3F35 /* ANTLRTreeAdaptor.m */,
-				1AE72390134E8AB4001C3F35 /* ANTLRTreeException.m */,
-				1AE72391134E8AB4001C3F35 /* ANTLRTreeIterator.m */,
-				1AE72392134E8AB4001C3F35 /* ANTLRTreeParser.m */,
-				1AE72393134E8AB4001C3F35 /* ANTLRTreePatternLexer.m */,
-				1AE72394134E8AB4001C3F35 /* ANTLRTreePatternParser.m */,
-				1AE72395134E8AB4001C3F35 /* ANTLRTreeRewriter.m */,
-				1AE72396134E8AB4001C3F35 /* ANTLRTreeRuleReturnScope.m */,
-				1AE72397134E8AB4001C3F35 /* ANTLRTreeVisitor.m */,
-				1AE72398134E8AB4001C3F35 /* ANTLRTreeVisitorAction.m */,
-				1AE72399134E8AB4001C3F35 /* ANTLRTreeWizard.m */,
-				1AE7239A134E8AB4001C3F35 /* ANTLRUnbufferedCommonTreeNodeStream.m */,
-				1AE7239B134E8AB4001C3F35 /* ANTLRUnbufferedCommonTreeNodeStreamState.m */,
-				1AE7239C134E8AB4001C3F35 /* ANTLRUnbufferedTokenStream.m */,
-				1AE7239D134E8AB4001C3F35 /* ANTLRUniqueIDMap.m */,
-				1AE7239E134E8AB4001C3F35 /* ANTLRUnwantedTokenException.m */,
-			);
-			name = Classes;
-			sourceTree = "<group>";
-		};
-		1A63BC77134F5EB1002EDFB4 /* examples */ = {
-			isa = PBXGroup;
-			children = (
-				1A63BC78134F5EB1002EDFB4 /* combined */,
-				1A63BC84134F5EB1002EDFB4 /* fuzzy */,
-				1A63BC91134F5EB2002EDFB4 /* hoistedPredicates */,
-				1A63BC9C134F5EB2002EDFB4 /* lexertest-simple */,
-				1A63BCAD134F5EB2002EDFB4 /* LL-star */,
-				1A63BCB9134F5EB2002EDFB4 /* polydiff */,
-				1A63BCD8134F5EB2002EDFB4 /* scopes */,
-				1A63BCEA134F5EB2002EDFB4 /* simplecTreeParser */,
-				1A63BD0D134F5EB2002EDFB4 /* treeparser */,
-				1A63BD1F134F5EB2002EDFB4 /* treerewrite */,
-			);
-			name = examples;
-			path = ../examples;
-			sourceTree = "<group>";
-		};
-		1A63BC78134F5EB1002EDFB4 /* combined */ = {
-			isa = PBXGroup;
-			children = (
-				1A63BC79134F5EB1002EDFB4 /* antlr3.h */,
-				1A63BC7A134F5EB1002EDFB4 /* Combined.g */,
-				1A63BC7B134F5EB1002EDFB4 /* Combined.tokens */,
-				1A63BC7C134F5EB1002EDFB4 /* Combined__.gl */,
-				1A63BC7D134F5EB1002EDFB4 /* CombinedLexer.h */,
-				1A63BC7E134F5EB1002EDFB4 /* CombinedLexer.m */,
-				1A63BC7F134F5EB1002EDFB4 /* CombinedParser.h */,
-				1A63BC80134F5EB1002EDFB4 /* CombinedParser.m */,
-				1A63BC81134F5EB1002EDFB4 /* main.m */,
-				1A63BC82134F5EB1002EDFB4 /* output1 */,
-			);
-			path = combined;
-			sourceTree = "<group>";
-		};
-		1A63BC82134F5EB1002EDFB4 /* output1 */ = {
-			isa = PBXGroup;
-			children = (
-				1A63BC83134F5EB1002EDFB4 /* Combined.tokens */,
-			);
-			path = output1;
-			sourceTree = "<group>";
-		};
-		1A63BC84134F5EB1002EDFB4 /* fuzzy */ = {
-			isa = PBXGroup;
-			children = (
-				1A63BC85134F5EB1002EDFB4 /* antlr3.h */,
-				1A63BC86134F5EB1002EDFB4 /* Fuzzy.g */,
-				1A63BC88134F5EB2002EDFB4 /* Fuzzy.tokens */,
-				1A63BC89134F5EB2002EDFB4 /* FuzzyLexer.h */,
-				1A63BC6B134F5DE4002EDFB4 /* FuzzyLexer.m */,
-				1A63BC8B134F5EB2002EDFB4 /* input */,
-				1A63BC6C134F5DE5002EDFB4 /* main.m */,
-				1A63BC8D134F5EB2002EDFB4 /* output1 */,
-			);
-			path = fuzzy;
-			sourceTree = "<group>";
-		};
-		1A63BC8D134F5EB2002EDFB4 /* output1 */ = {
-			isa = PBXGroup;
-			children = (
-				1A63BC8E134F5EB2002EDFB4 /* Fuzzy.m */,
-				1A63BC8F134F5EB2002EDFB4 /* Fuzzy.tokens */,
-				1A63BC90134F5EB2002EDFB4 /* FuzzyLexer.h */,
-			);
-			path = output1;
-			sourceTree = "<group>";
-		};
-		1A63BC91134F5EB2002EDFB4 /* hoistedPredicates */ = {
-			isa = PBXGroup;
-			children = (
-				1A63BC92134F5EB2002EDFB4 /* antlr3.h */,
-				1A63BC93134F5EB2002EDFB4 /* input */,
-				1A63BC94134F5EB2002EDFB4 /* main.m */,
-				1A63BC95134F5EB2002EDFB4 /* output */,
-				1A63BC96134F5EB2002EDFB4 /* T.g */,
-				1A63BC97134F5EB2002EDFB4 /* T.tokens */,
-				1A63BC98134F5EB2002EDFB4 /* TLexer.h */,
-				1A63BC99134F5EB2002EDFB4 /* TLexer.m */,
-				1A63BC9A134F5EB2002EDFB4 /* TParser.h */,
-				1A63BC9B134F5EB2002EDFB4 /* TParser.m */,
-			);
-			path = hoistedPredicates;
-			sourceTree = "<group>";
-		};
-		1A63BC9C134F5EB2002EDFB4 /* lexertest-simple */ = {
-			isa = PBXGroup;
-			children = (
-				1A63BC9D134F5EB2002EDFB4 /* antlr3.h */,
-				1A63BC9E134F5EB2002EDFB4 /* main.m */,
-				1A63BC9F134F5EB2002EDFB4 /* output1 */,
-				1A63BCA5134F5EB2002EDFB4 /* Test.tokens */,
-				1A63BCA6134F5EB2002EDFB4 /* TestLexer.g */,
-				1A63BCA7134F5EB2002EDFB4 /* TestLexer.h */,
-				1A63BCA8134F5EB2002EDFB4 /* TestLexer.h.old */,
-				1A63BCA9134F5EB2002EDFB4 /* TestLexer.m */,
-				1A63BCAA134F5EB2002EDFB4 /* TestLexer.m.old */,
-				1A63BCAB134F5EB2002EDFB4 /* TestLexer.tokens */,
-				1A63BCAC134F5EB2002EDFB4 /* TestLexerLexer.h */,
-			);
-			path = "lexertest-simple";
-			sourceTree = "<group>";
-		};
-		1A63BC9F134F5EB2002EDFB4 /* output1 */ = {
-			isa = PBXGroup;
-			children = (
-				1A63BCA0134F5EB2002EDFB4 /* Test.tokens */,
-				1A63BCA1134F5EB2002EDFB4 /* TestLexer.h */,
-				1A63BCA2134F5EB2002EDFB4 /* Testlexer.m */,
-				1A63BCA3134F5EB2002EDFB4 /* TestLexer.tokens */,
-				1A63BCA4134F5EB2002EDFB4 /* TestLexerLexer.h */,
-			);
-			path = output1;
-			sourceTree = "<group>";
-		};
-		1A63BCAD134F5EB2002EDFB4 /* LL-star */ = {
-			isa = PBXGroup;
-			children = (
-				1A63BCAE134F5EB2002EDFB4 /* antlr3.h */,
-				1A63BCAF134F5EB2002EDFB4 /* input */,
-				1A63BCB0134F5EB2002EDFB4 /* main.m */,
-				1A63BCB1134F5EB2002EDFB4 /* output */,
-				1A63BCB2134F5EB2002EDFB4 /* SimpleC.g */,
-				1A63BCB3134F5EB2002EDFB4 /* SimpleC.tokens */,
-				1A63BCB4134F5EB2002EDFB4 /* SimpleC__.gl */,
-				1A63BCB5134F5EB2002EDFB4 /* SimpleCLexer.h */,
-				1A63BCB6134F5EB2002EDFB4 /* SimpleCLexer.m */,
-				1A63BCB7134F5EB2002EDFB4 /* SimpleCParser.h */,
-				1A63BCB8134F5EB2002EDFB4 /* SimpleCParser.m */,
-			);
-			path = "LL-star";
-			sourceTree = "<group>";
-		};
-		1A63BCB9134F5EB2002EDFB4 /* polydiff */ = {
-			isa = PBXGroup;
-			children = (
-				1A63BCBA134F5EB2002EDFB4 /* files */,
-				1A63BCBB134F5EB2002EDFB4 /* input */,
-				1A63BCBC134F5EB2002EDFB4 /* Main.m */,
-				1A63BCBD134F5EB2002EDFB4 /* output */,
-				1A63BCBE134F5EB2002EDFB4 /* output1 */,
-				1A63BCC8134F5EB2002EDFB4 /* Poly.g */,
-				1A63BCC9134F5EB2002EDFB4 /* Poly.tokens */,
-				1A63BCCA134F5EB2002EDFB4 /* PolyDifferentiator.g */,
-				1A63BCCB134F5EB2002EDFB4 /* PolyDifferentiator.m */,
-				1A63BCCC134F5EB2002EDFB4 /* PolyLexer.h */,
-				1A63BCCD134F5EB2002EDFB4 /* PolyLexer.m */,
-				1A63BCCE134F5EB2002EDFB4 /* PolyParser.h */,
-				1A63BCCF134F5EB2002EDFB4 /* PolyParser.m */,
-				1A63BCD0134F5EB2002EDFB4 /* PolyPrinter.g */,
-				1A63BCD1134F5EB2002EDFB4 /* PolyPrinter.h */,
-				1A63BCD2134F5EB2002EDFB4 /* PolyPrinter.m */,
-				1A63BCD3134F5EB2002EDFB4 /* PolyPrinter.tokens */,
-				1A63BCD4134F5EB2002EDFB4 /* Simplifier.g */,
-				1A63BCD5134F5EB2002EDFB4 /* Simplifier.h */,
-				1A63BCD6134F5EB2002EDFB4 /* Simplifier.m */,
-				1A63BCD7134F5EB2002EDFB4 /* Simplifier.tokens */,
-			);
-			path = polydiff;
-			sourceTree = "<group>";
-		};
-		1A63BCBE134F5EB2002EDFB4 /* output1 */ = {
-			isa = PBXGroup;
-			children = (
-				1A63BCBF134F5EB2002EDFB4 /* Poly.tokens */,
-				1A63BCC0134F5EB2002EDFB4 /* PolyDifferentiator.m */,
-				1A63BCC1134F5EB2002EDFB4 /* PolyLexer.h */,
-				1A63BCC2134F5EB2002EDFB4 /* PolyLexer.m */,
-				1A63BCC3134F5EB2002EDFB4 /* PolyParser.h */,
-				1A63BCC4134F5EB2002EDFB4 /* PolyParser.m */,
-				1A63BCC5134F5EB2002EDFB4 /* Simplifier.h */,
-				1A63BCC6134F5EB2002EDFB4 /* Simplifier.m */,
-				1A63BCC7134F5EB2002EDFB4 /* Simplifier.tokens */,
-			);
-			path = output1;
-			sourceTree = "<group>";
-		};
-		1A63BCD8134F5EB2002EDFB4 /* scopes */ = {
-			isa = PBXGroup;
-			children = (
-				1A63BCD9134F5EB2002EDFB4 /* antlr3.h */,
-				1A63BCDA134F5EB2002EDFB4 /* input */,
-				1A63BCDB134F5EB2002EDFB4 /* main.m */,
-				1A63BCDC134F5EB2002EDFB4 /* output */,
-				1A63BCDD134F5EB2002EDFB4 /* output1 */,
-				1A63BCE3134F5EB2002EDFB4 /* SymbolTable.g */,
-				1A63BCE4134F5EB2002EDFB4 /* SymbolTable.tokens */,
-				1A63BCE5134F5EB2002EDFB4 /* SymbolTable__.gl */,
-				1A63BCE6134F5EB2002EDFB4 /* SymbolTableLexer.h */,
-				1A63BCE7134F5EB2002EDFB4 /* SymbolTableLexer.m */,
-				1A63BCE8134F5EB2002EDFB4 /* SymbolTableParser.h */,
-				1A63BCE9134F5EB2002EDFB4 /* SymbolTableParser.m */,
-			);
-			path = scopes;
-			sourceTree = "<group>";
-		};
-		1A63BCDD134F5EB2002EDFB4 /* output1 */ = {
-			isa = PBXGroup;
-			children = (
-				1A63BCDE134F5EB2002EDFB4 /* SymbolTable.tokens */,
-				1A63BCDF134F5EB2002EDFB4 /* SymbolTableLexer.h */,
-				1A63BCE0134F5EB2002EDFB4 /* SymbolTableLexer.m */,
-				1A63BCE1134F5EB2002EDFB4 /* SymbolTableParser.h */,
-				1A63BCE2134F5EB2002EDFB4 /* SymbolTableParser.m */,
-			);
-			path = output1;
-			sourceTree = "<group>";
-		};
-		1A63BCEA134F5EB2002EDFB4 /* simplecTreeParser */ = {
-			isa = PBXGroup;
-			children = (
-				1A63BCEB134F5EB2002EDFB4 /* antlr3.h */,
-				1A63BCEC134F5EB2002EDFB4 /* input */,
-				1A63BCED134F5EB2002EDFB4 /* main.m */,
-				1A63BCEE134F5EB2002EDFB4 /* output */,
-				1A63BCEF134F5EB2002EDFB4 /* output1 */,
-				1A63BCFB134F5EB2002EDFB4 /* SimpleC.g */,
-				1A63BCFC134F5EB2002EDFB4 /* SimpleC.tokens */,
-				1A63BCFD134F5EB2002EDFB4 /* SimpleC__.gl */,
-				1A63BCFE134F5EB2002EDFB4 /* SimpleCLexer.h */,
-				1A63BCFF134F5EB2002EDFB4 /* SimpleCLexer.java */,
-				1A63BD00134F5EB2002EDFB4 /* SimpleCLexer.m */,
-				1A63BD01134F5EB2002EDFB4 /* SimpleCParser.h */,
-				1A63BD02134F5EB2002EDFB4 /* SimpleCParser.java */,
-				1A63BD03134F5EB2002EDFB4 /* SimpleCParser.m */,
-				1A63BD04134F5EB2002EDFB4 /* SimpleCTP.g */,
-				1A63BD05134F5EB2002EDFB4 /* SimpleCTP.h */,
-				1A63BD06134F5EB2002EDFB4 /* SimpleCTP.java */,
-				1A63BD07134F5EB2002EDFB4 /* SimpleCTP.m */,
-				1A63BD08134F5EB2002EDFB4 /* SimpleCTP.tokens */,
-				1A63BD09134F5EB2002EDFB4 /* SimpleCWalker.g */,
-				1A63BD0A134F5EB2002EDFB4 /* SimpleCWalker.h */,
-				1A63BD0B134F5EB2002EDFB4 /* SimpleCWalker.m */,
-				1A63BD0C134F5EB2002EDFB4 /* SimpleCWalker.tokens */,
-			);
-			path = simplecTreeParser;
-			sourceTree = "<group>";
-		};
-		1A63BCEF134F5EB2002EDFB4 /* output1 */ = {
-			isa = PBXGroup;
-			children = (
-				1A63BCF0134F5EB2002EDFB4 /* SimpleC.tokens */,
-				1A63BCF1134F5EB2002EDFB4 /* SimpleCLexer.h */,
-				1A63BCF2134F5EB2002EDFB4 /* SimpleCLexer.java */,
-				1A63BCF3134F5EB2002EDFB4 /* SimpleCLexer.m */,
-				1A63BCF4134F5EB2002EDFB4 /* SimpleCParser.h */,
-				1A63BCF5134F5EB2002EDFB4 /* SimpleCParser.java */,
-				1A63BCF6134F5EB2002EDFB4 /* SimpleCParser.m */,
-				1A63BCF7134F5EB2002EDFB4 /* SimpleCTP.h */,
-				1A63BCF8134F5EB2002EDFB4 /* SimpleCTP.java */,
-				1A63BCF9134F5EB2002EDFB4 /* SimpleCTP.m */,
-				1A63BCFA134F5EB2002EDFB4 /* SimpleCTP.tokens */,
-			);
-			path = output1;
-			sourceTree = "<group>";
-		};
-		1A63BD0D134F5EB2002EDFB4 /* treeparser */ = {
-			isa = PBXGroup;
-			children = (
-				1A63BD0E134F5EB2002EDFB4 /* files */,
-				1A63BD0F134F5EB2002EDFB4 /* input */,
-				1A63BD10134F5EB2002EDFB4 /* Lang.g */,
-				1A63BD11134F5EB2002EDFB4 /* Lang.tokens */,
-				1A63BD12134F5EB2002EDFB4 /* LangDumpDecl.g */,
-				1A63BD13134F5EB2002EDFB4 /* LangDumpDecl.h */,
-				1A63BD14134F5EB2002EDFB4 /* LangDumpDecl.m */,
-				1A63BD15134F5EB2002EDFB4 /* LangDumpDecl.tokens */,
-				1A63BD16134F5EB2002EDFB4 /* LangLexer.h */,
-				1A63BD17134F5EB2002EDFB4 /* LangLexer.m */,
-				1A63BD18134F5EB2002EDFB4 /* LangParser.h */,
-				1A63BD19134F5EB2002EDFB4 /* LangParser.m */,
-				1A63BD1A134F5EB2002EDFB4 /* Main.java */,
-				1A63BD1B134F5EB2002EDFB4 /* main.m */,
-				1A63BD1C134F5EB2002EDFB4 /* output */,
-				1A63BD1D134F5EB2002EDFB4 /* output1 */,
-				1A63BD1E134F5EB2002EDFB4 /* README.txt */,
-			);
-			path = treeparser;
-			sourceTree = "<group>";
-		};
-		1A63BD1D134F5EB2002EDFB4 /* output1 */ = {
-			isa = PBXGroup;
-			children = (
-			);
-			path = output1;
-			sourceTree = "<group>";
-		};
-		1A63BD1F134F5EB2002EDFB4 /* treerewrite */ = {
-			isa = PBXGroup;
-			children = (
-				1A63BD20134F5EB2002EDFB4 /* antlr3.h */,
-				1A63BD21134F5EB2002EDFB4 /* main.m */,
-				1A63BD22134F5EB2002EDFB4 /* output1 */,
-				1A63BD28134F5EB2002EDFB4 /* TreeRewrite.g */,
-				1A63BD29134F5EB2002EDFB4 /* TreeRewrite.tokens */,
-				1A63BD2A134F5EB2002EDFB4 /* TreeRewriteLexer.h */,
-				1A63BD2B134F5EB2002EDFB4 /* TreeRewriteLexer.m */,
-				1A63BD2C134F5EB2002EDFB4 /* TreeRewriteParser.h */,
-				1A63BD2D134F5EB2002EDFB4 /* TreeRewriteParser.m */,
-			);
-			path = treerewrite;
-			sourceTree = "<group>";
-		};
-		1A63BD22134F5EB2002EDFB4 /* output1 */ = {
-			isa = PBXGroup;
-			children = (
-				1A63BD23134F5EB2002EDFB4 /* TreeRewrite.tokens */,
-				1A63BD24134F5EB2002EDFB4 /* TreeRewriteLexer.h */,
-				1A63BD25134F5EB2002EDFB4 /* TreeRewriteLexer.m */,
-				1A63BD26134F5EB2002EDFB4 /* TreeRewriteParser.h */,
-				1A63BD27134F5EB2002EDFB4 /* TreeRewriteParser.m */,
-			);
-			path = output1;
-			sourceTree = "<group>";
-		};
-		1A6B1D1D134E8DA10016A47D /* ANTLRTests */ = {
-			isa = PBXGroup;
-			children = (
-				1A6B1D1E134E8DA10016A47D /* java */,
-				1A6B1D48134E8DA10016A47D /* runtime */,
-			);
-			name = ANTLRTests;
-			path = ../test;
-			sourceTree = "<group>";
-		};
-		1A6B1D1E134E8DA10016A47D /* java */ = {
-			isa = PBXGroup;
-			children = (
-				1A6B1D1F134E8DA10016A47D /* BaseTest.java */,
-				1A6B1D20134E8DA10016A47D /* DebugTestAutoAST.java */,
-				1A6B1D21134E8DA10016A47D /* DebugTestCompositeGrammars.java */,
-				1A6B1D22134E8DA10016A47D /* DebugTestRewriteAST.java */,
-				1A6B1D23134E8DA10016A47D /* ErrorQueue.java */,
-				1A6B1D24134E8DA10016A47D /* TestASTConstruction.java */,
-				1A6B1D25134E8DA10016A47D /* TestAttributes.java */,
-				1A6B1D26134E8DA10016A47D /* TestAutoAST.java */,
-				1A6B1D27134E8DA10016A47D /* TestBufferedTreeNodeStream.java */,
-				1A6B1D28134E8DA10016A47D /* TestCharDFAConversion.java */,
-				1A6B1D29134E8DA10016A47D /* TestCommonTokenStream.java */,
-				1A6B1D2A134E8DA10016A47D /* TestCompositeGrammars.java */,
-				1A6B1D2B134E8DA10016A47D /* TestDFAConversion.java */,
-				1A6B1D2C134E8DA10016A47D /* TestDFAMatching.java */,
-				1A6B1D2D134E8DA10016A47D /* TestFastQueue.java */,
-				1A6B1D2E134E8DA10016A47D /* TestHeteroAST.java */,
-				1A6B1D2F134E8DA10016A47D /* TestInterpretedLexing.java */,
-				1A6B1D30134E8DA10016A47D /* TestInterpretedParsing.java */,
-				1A6B1D31134E8DA10016A47D /* TestIntervalSet.java */,
-				1A6B1D32134E8DA10016A47D /* TestJavaCodeGeneration.java */,
-				1A6B1D33134E8DA10016A47D /* TestLeftRecursion.java */,
-				1A6B1D34134E8DA10016A47D /* TestLexer.java */,
-				1A6B1D35134E8DA10016A47D /* TestMessages.java */,
-				1A6B1D36134E8DA10016A47D /* TestNFAConstruction.java */,
-				1A6B1D37134E8DA10016A47D /* TestRewriteAST.java */,
-				1A6B1D38134E8DA10016A47D /* TestRewriteTemplates.java */,
-				1A6B1D39134E8DA10016A47D /* TestSemanticPredicateEvaluation.java */,
-				1A6B1D3A134E8DA10016A47D /* TestSemanticPredicates.java */,
-				1A6B1D3B134E8DA10016A47D /* TestSets.java */,
-				1A6B1D3C134E8DA10016A47D /* TestSymbolDefinitions.java */,
-				1A6B1D3D134E8DA10016A47D /* TestSyntacticPredicateEvaluation.java */,
-				1A6B1D3E134E8DA10016A47D /* TestSyntaxErrors.java */,
-				1A6B1D3F134E8DA10016A47D /* TestTemplates.java */,
-				1A6B1D40134E8DA10016A47D /* TestTokenRewriteStream.java */,
-				1A6B1D41134E8DA10016A47D /* TestTopologicalSort.java */,
-				1A6B1D42134E8DA10016A47D /* TestTreeGrammarRewriteAST.java */,
-				1A6B1D43134E8DA10016A47D /* TestTreeIterator.java */,
-				1A6B1D44134E8DA10016A47D /* TestTreeNodeStream.java */,
-				1A6B1D45134E8DA10016A47D /* TestTreeParsing.java */,
-				1A6B1D46134E8DA10016A47D /* TestTrees.java */,
-				1A6B1D47134E8DA10016A47D /* TestTreeWizard.java */,
-			);
-			path = java;
-			sourceTree = "<group>";
-		};
-		1A6B1D48134E8DA10016A47D /* runtime */ = {
-			isa = PBXGroup;
-			children = (
-				1A6B1D49134E8DA10016A47D /* misc */,
-				1A6B1D4E134E8DA10016A47D /* recognizer */,
-				1A6B1D51134E8DA10016A47D /* sets */,
-				1A6B1D54134E8DA10016A47D /* stream */,
-				1A6B1D57134E8DA10016A47D /* TestRewriteRuleTokenStream */,
-				1A6B1D5A134E8DA10016A47D /* token */,
-				1A6B1D5D134E8DA10016A47D /* tree */,
-			);
-			path = runtime;
-			sourceTree = "<group>";
-		};
-		1A6B1D49134E8DA10016A47D /* misc */ = {
-			isa = PBXGroup;
-			children = (
-				1A6B1D4A134E8DA10016A47D /* ANTLRFastQueueTest.h */,
-				1A6B1D4B134E8DA10016A47D /* ANTLRFastQueueTest.m */,
-				1A6B1D4C134E8DA10016A47D /* ANTLRIntArrayTest.h */,
-				1A6B1D4D134E8DA10016A47D /* ANTLRIntArrayTest.m */,
-			);
-			path = misc;
-			sourceTree = "<group>";
-		};
-		1A6B1D4E134E8DA10016A47D /* recognizer */ = {
-			isa = PBXGroup;
-			children = (
-				1A6B1D4F134E8DA10016A47D /* ANTLRRecognizerTest.h */,
-				1A6B1D50134E8DA10016A47D /* ANTLRRecognizerTest.m */,
-			);
-			path = recognizer;
-			sourceTree = "<group>";
-		};
-		1A6B1D51134E8DA10016A47D /* sets */ = {
-			isa = PBXGroup;
-			children = (
-				1A6B1D52134E8DA10016A47D /* ANTLRBitSetTest.h */,
-				1A6B1D53134E8DA10016A47D /* ANTLRBitSetTest.m */,
-			);
-			path = sets;
-			sourceTree = "<group>";
-		};
-		1A6B1D54134E8DA10016A47D /* stream */ = {
-			isa = PBXGroup;
-			children = (
-				1A6B1D55134E8DA10016A47D /* ANTLRStringStreamTest.h */,
-				1A6B1D56134E8DA10016A47D /* ANTLRStringStreamTest.m */,
-			);
-			path = stream;
-			sourceTree = "<group>";
-		};
-		1A6B1D57134E8DA10016A47D /* TestRewriteRuleTokenStream */ = {
-			isa = PBXGroup;
-			children = (
-				1A6B1D58134E8DA10016A47D /* TestRewriteRuleTokenStream.h */,
-				1A6B1D59134E8DA10016A47D /* TestRewriteRuleTokenStream.m */,
-			);
-			path = TestRewriteRuleTokenStream;
-			sourceTree = "<group>";
-		};
-		1A6B1D5A134E8DA10016A47D /* token */ = {
-			isa = PBXGroup;
-			children = (
-				1A6B1D5B134E8DA10016A47D /* ANTLRCommonTokenTest.h */,
-				1A6B1D5C134E8DA10016A47D /* ANTLRCommonTokenTest.m */,
-			);
-			path = token;
-			sourceTree = "<group>";
-		};
-		1A6B1D5D134E8DA10016A47D /* tree */ = {
-			isa = PBXGroup;
-			children = (
-				1A6B1D5E134E8DA10016A47D /* ANTLRCommonErrorNodeTest.h */,
-				1A6B1D5F134E8DA10016A47D /* ANTLRCommonErrorNodeTest.m */,
-				1A6B1D60134E8DA10016A47D /* ANTLRCommonTreeAdaptorTest.h */,
-				1A6B1D61134E8DA10016A47D /* ANTLRCommonTreeAdaptorTest.m */,
-				1A6B1D62134E8DA10016A47D /* ANTLRCommonTreeTest.h */,
-				1A6B1D63134E8DA10016A47D /* ANTLRCommonTreeTest.m */,
-			);
-			path = tree;
-			sourceTree = "<group>";
-		};
-		1AE7230C134E860A001C3F35 = {
-			isa = PBXGroup;
-			children = (
-				1AE72318134E860B001C3F35 /* ANTLR.framework */,
-				1A048CFF134E8B9100005F57 /* Classes */,
-				1A6B1D1D134E8DA10016A47D /* ANTLRTests */,
-				1A63BC77134F5EB1002EDFB4 /* examples */,
-				1AE72321134E860B001C3F35 /* ANTLR */,
-				1AE72332134E860B001C3F35 /* ANTLRTests */,
-				1AE7231A134E860B001C3F35 /* Frameworks */,
-				1AE72319134E860B001C3F35 /* Products */,
-			);
-			sourceTree = "<group>";
-		};
-		1AE72319134E860B001C3F35 /* Products */ = {
-			isa = PBXGroup;
-			children = (
-				1AE7232D134E860B001C3F35 /* ANTLRTests.octest */,
-				1A63BC61134F5DAB002EDFB4 /* Fuzzy */,
-				1A63BD32134F5F1E002EDFB4 /* combined */,
-				1A63BD3F134F5F36002EDFB4 /* lexertest-simple */,
-				1A63BD4C134F5F43002EDFB4 /* LL-start */,
-				1A63BD59134F5F4D002EDFB4 /* polydiff */,
-				1A63BD66134F5F5E002EDFB4 /* simplecTreeParser */,
-				1A63BD73134F5F67002EDFB4 /* treeparser */,
-				1A63BD80134F5F71002EDFB4 /* treerewrite */,
-				1A63BDD4134F6233002EDFB4 /* scopes */,
-				1A63BDFC134FB75E002EDFB4 /* hoistedPredicates */,
-			);
-			name = Products;
-			sourceTree = "<group>";
-		};
-		1AE7231A134E860B001C3F35 /* Frameworks */ = {
-			isa = PBXGroup;
-			children = (
-				1AE7231E134E860B001C3F35 /* AppKit.framework */,
-				1AE7231B134E860B001C3F35 /* Cocoa.framework */,
-				1AE7231F134E860B001C3F35 /* CoreData.framework */,
-				1AE72345134E89BF001C3F35 /* CoreFoundation.framework */,
-				1AE72346134E89BF001C3F35 /* Foundation.framework */,
-				1A6B1D78134EA0970016A47D /* SenTestingKit.framework */,
-				1AE7231D134E860B001C3F35 /* Other Frameworks */,
-			);
-			name = Frameworks;
-			sourceTree = "<group>";
-		};
-		1AE7231D134E860B001C3F35 /* Other Frameworks */ = {
-			isa = PBXGroup;
-			children = (
-			);
-			name = "Other Frameworks";
-			sourceTree = "<group>";
-		};
-		1AE72321134E860B001C3F35 /* ANTLR */ = {
-			isa = PBXGroup;
-			children = (
-				1AE72322134E860B001C3F35 /* Supporting Files */,
-			);
-			path = ANTLR;
-			sourceTree = "<group>";
-		};
-		1AE72322134E860B001C3F35 /* Supporting Files */ = {
-			isa = PBXGroup;
-			children = (
-				1AE72323134E860B001C3F35 /* ANTLR-Info.plist */,
-				1AE72324134E860B001C3F35 /* InfoPlist.strings */,
-				1AE72327134E860B001C3F35 /* ANTLR-Prefix.pch */,
-			);
-			name = "Supporting Files";
-			sourceTree = "<group>";
-		};
-		1AE72332134E860B001C3F35 /* ANTLRTests */ = {
-			isa = PBXGroup;
-			children = (
-				1AE72339134E860B001C3F35 /* ANTLRTests.h */,
-				1AE7233B134E860B001C3F35 /* ANTLRTests.m */,
-				1AE72333134E860B001C3F35 /* Supporting Files */,
-			);
-			path = ANTLRTests;
-			sourceTree = "<group>";
-		};
-		1AE72333134E860B001C3F35 /* Supporting Files */ = {
-			isa = PBXGroup;
-			children = (
-				1AE72334134E860B001C3F35 /* ANTLRTests-Info.plist */,
-				1AE72335134E860B001C3F35 /* InfoPlist.strings */,
-				1AE72338134E860B001C3F35 /* ANTLRTests-Prefix.pch */,
-			);
-			name = "Supporting Files";
-			sourceTree = "<group>";
-		};
-/* End PBXGroup section */
-
-/* Begin PBXHeadersBuildPhase section */
-		1AE72315134E860B001C3F35 /* Headers */ = {
-			isa = PBXHeadersBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				1AAC1C3D134FD6A500B2DC68 /* ANTLR.h in Headers */,
-				1A048D21134E8C1100005F57 /* antlr3.h in Headers */,
-				1A048D22134E8C1100005F57 /* ANTLRBaseMapElement.h in Headers */,
-				1A048D23134E8C1100005F57 /* ANTLRBaseRecognizer.h in Headers */,
-				1A048D24134E8C1100005F57 /* ANTLRBaseStack.h in Headers */,
-				1A048D25134E8C1100005F57 /* ANTLRBaseTree.h in Headers */,
-				1A048D26134E8C1100005F57 /* ANTLRBaseTreeAdaptor.h in Headers */,
-				1A048D27134E8C1100005F57 /* ANTLRBitSet.h in Headers */,
-				1A048D28134E8C1100005F57 /* ANTLRBufferedTokenStream.h in Headers */,
-				1A048D29134E8C1100005F57 /* ANTLRBufferedTreeNodeStream.h in Headers */,
-				1A048D2A134E8C1100005F57 /* ANTLRCharStream.h in Headers */,
-				1A048D2B134E8C1100005F57 /* ANTLRCharStreamState.h in Headers */,
-				1A048D2C134E8C1100005F57 /* ANTLRCommonErrorNode.h in Headers */,
-				1A048D2D134E8C1100005F57 /* ANTLRCommonToken.h in Headers */,
-				1A048D2E134E8C1100005F57 /* ANTLRCommonTokenStream.h in Headers */,
-				1A048D2F134E8C1100005F57 /* ANTLRCommonTree.h in Headers */,
-				1A048D30134E8C1100005F57 /* ANTLRCommonTreeAdaptor.h in Headers */,
-				1A048D31134E8C1100005F57 /* ANTLRCommonTreeNodeStream.h in Headers */,
-				1A048D33134E8C1100005F57 /* ANTLRDebug.h in Headers */,
-				1A048D34134E8C1100005F57 /* ANTLRDebugEventListener.h in Headers */,
-				1A048D35134E8C1100005F57 /* ANTLRDebugEventProxy.h in Headers */,
-				1A048D36134E8C1100005F57 /* ANTLRDebugParser.h in Headers */,
-				1A048D37134E8C1100005F57 /* ANTLRDebugTokenStream.h in Headers */,
-				1A048D38134E8C1100005F57 /* ANTLRDebugTreeAdaptor.h in Headers */,
-				1A048D39134E8C1100005F57 /* ANTLRDebugTreeNodeStream.h in Headers */,
-				1A048D3A134E8C1100005F57 /* ANTLRDebugTreeParser.h in Headers */,
-				1A048D3B134E8C1100005F57 /* ANTLRDFA.h in Headers */,
-				1A048D3C134E8C1100005F57 /* ANTLRDoubleKeyMap.h in Headers */,
-				1A048D3D134E8C1100005F57 /* ANTLREarlyExitException.h in Headers */,
-				1A048D3E134E8C1100005F57 /* ANTLRError.h in Headers */,
-				1A048D3F134E8C1100005F57 /* ANTLRFailedPredicateException.h in Headers */,
-				1A048D40134E8C1100005F57 /* ANTLRFastQueue.h in Headers */,
-				1A6B1CD7134E8CF70016A47D /* ANTLRFileStream.h in Headers */,
-				1A6B1CD8134E8CF70016A47D /* ANTLRHashMap.h in Headers */,
-				1A6B1CD9134E8CF70016A47D /* ANTLRHashRule.h in Headers */,
-				1A6B1CDA134E8CF70016A47D /* ANTLRInputStream.h in Headers */,
-				1A6B1CDB134E8CF70016A47D /* ANTLRIntArray.h in Headers */,
-				1A63BDEE134F932E002EDFB4 /* ANTLRIntStream.h in Headers */,
-				1A6B1CDC134E8CF70016A47D /* ANTLRLexer.h in Headers */,
-				1A6B1CDD134E8CF70016A47D /* ANTLRLexerRuleReturnScope.h in Headers */,
-				1A6B1CDE134E8CF70016A47D /* ANTLRLexerState.h in Headers */,
-				1A6B1CDF134E8CF70016A47D /* ANTLRLinkBase.h in Headers */,
-				1A6B1CE0134E8CF70016A47D /* ANTLRLookaheadStream.h in Headers */,
-				1A6B1CE1134E8CF70016A47D /* ANTLRMap.h in Headers */,
-				1A6B1CE2134E8CF70016A47D /* ANTLRMapElement.h in Headers */,
-				1A6B1CE3134E8CF70016A47D /* ANTLRMismatchedNotSetException.h in Headers */,
-				1A6B1CE4134E8CF70016A47D /* ANTLRMismatchedRangeException.h in Headers */,
-				1A6B1CE5134E8CF70016A47D /* ANTLRMismatchedSetException.h in Headers */,
-				1A6B1CE6134E8CF70016A47D /* ANTLRMismatchedTokenException.h in Headers */,
-				1A6B1CE7134E8CF70016A47D /* ANTLRMismatchedTreeNodeException.h in Headers */,
-				1A6B1CE8134E8CF70016A47D /* ANTLRMissingTokenException.h in Headers */,
-				1A6B1CE9134E8CF70016A47D /* ANTLRNodeMapElement.h in Headers */,
-				1A6B1CEA134E8CF70016A47D /* ANTLRNoViableAltException.h in Headers */,
-				1A6B1CEB134E8CF70016A47D /* ANTLRParser.h in Headers */,
-				1A6B1CEC134E8CF70016A47D /* ANTLRParserRuleReturnScope.h in Headers */,
-				1A6B1CED134E8CF80016A47D /* ANTLRParseTree.h in Headers */,
-				1A6B1CEE134E8CF80016A47D /* ANTLRPtrBuffer.h in Headers */,
-				1A6B1CEF134E8CF80016A47D /* ANTLRPtrStack.h in Headers */,
-				1A6B1CF0134E8CF80016A47D /* ANTLRReaderStream.h in Headers */,
-				1A6B1CF1134E8CF80016A47D /* ANTLRRecognitionException.h in Headers */,
-				1A6B1CF2134E8CF80016A47D /* ANTLRRecognizerSharedState.h in Headers */,
-				1A6B1CF3134E8CF80016A47D /* ANTLRRewriteRuleElementStream.h in Headers */,
-				1A6B1CF4134E8CF80016A47D /* ANTLRRewriteRuleNodeStream.h in Headers */,
-				1A6B1CF5134E8CF80016A47D /* ANTLRRewriteRuleSubtreeStream.h in Headers */,
-				1A6B1CF6134E8CF80016A47D /* ANTLRRewriteRuleTokenStream.h in Headers */,
-				1A6B1CF7134E8CF80016A47D /* ANTLRRuleMapElement.h in Headers */,
-				1A6B1CF8134E8CF80016A47D /* ANTLRRuleMemo.h in Headers */,
-				1A6B1CF9134E8CF80016A47D /* ANTLRRuleReturnScope.h in Headers */,
-				1A6B1CFA134E8CF80016A47D /* ANTLRRuleStack.h in Headers */,
-				1A6B1CFB134E8CF80016A47D /* ANTLRRuntimeException.h in Headers */,
-				1A6B1CFC134E8CF80016A47D /* ANTLRStreamEnumerator.h in Headers */,
-				1A6B1CFD134E8CF80016A47D /* ANTLRStringStream.h in Headers */,
-				1A6B1CFE134E8CF80016A47D /* ANTLRStringStreamState.h in Headers */,
-				1A6B1CFF134E8CF80016A47D /* ANTLRSymbolStack.h in Headers */,
-				1A6B1D00134E8CF80016A47D /* ANTLRToken.h in Headers */,
-				1A6B1D01134E8CF80016A47D /* ANTLRToken+DebuggerSupport.h in Headers */,
-				1A6B1D02134E8CF80016A47D /* ANTLRTokenRewriteStream.h in Headers */,
-				1A6B1D03134E8CF80016A47D /* ANTLRTokenSource.h in Headers */,
-				1A6B1D04134E8CF80016A47D /* ANTLRTokenStream.h in Headers */,
-				1A6B1D05134E8CF80016A47D /* ANTLRTree.h in Headers */,
-				1A6B1D06134E8CF80016A47D /* ANTLRTreeAdaptor.h in Headers */,
-				1A6B1D07134E8CF80016A47D /* ANTLRTreeException.h in Headers */,
-				1A6B1D08134E8CF90016A47D /* ANTLRTreeIterator.h in Headers */,
-				1A6B1D09134E8CF90016A47D /* ANTLRTreeNodeStream.h in Headers */,
-				1A6B1D0A134E8CF90016A47D /* ANTLRTreeParser.h in Headers */,
-				1A6B1D0B134E8CF90016A47D /* ANTLRTreePatternLexer.h in Headers */,
-				1A6B1D0C134E8CF90016A47D /* ANTLRTreePatternParser.h in Headers */,
-				1A6B1D0D134E8CF90016A47D /* ANTLRTreeRewriter.h in Headers */,
-				1A6B1D0E134E8CF90016A47D /* ANTLRTreeRuleReturnScope.h in Headers */,
-				1A6B1D0F134E8CF90016A47D /* ANTLRTreeVisitor.h in Headers */,
-				1A6B1D10134E8CF90016A47D /* ANTLRTreeVisitorAction.h in Headers */,
-				1A6B1D11134E8CF90016A47D /* ANTLRTreeWizard.h in Headers */,
-				1A6B1D12134E8CF90016A47D /* ANTLRUnbufferedCommonTreeNodeStream.h in Headers */,
-				1A6B1D13134E8CF90016A47D /* ANTLRUnbufferedCommonTreeNodeStreamState.h in Headers */,
-				1A6B1D14134E8CF90016A47D /* ANTLRUnbufferedTokenStream.h in Headers */,
-				1A6B1D15134E8CF90016A47D /* ANTLRUniqueIDMap.h in Headers */,
-				1A6B1D16134E8CF90016A47D /* ANTLRUnwantedTokenException.h in Headers */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-/* End PBXHeadersBuildPhase section */
-
-/* Begin PBXNativeTarget section */
-		1A63BC60134F5DAB002EDFB4 /* Fuzzy */ = {
-			isa = PBXNativeTarget;
-			buildConfigurationList = 1A63BC67134F5DAC002EDFB4 /* Build configuration list for PBXNativeTarget "Fuzzy" */;
-			buildPhases = (
-				1A63BC5D134F5DAB002EDFB4 /* Sources */,
-				1A63BC5E134F5DAB002EDFB4 /* Frameworks */,
-				1A63BC5F134F5DAB002EDFB4 /* CopyFiles */,
-			);
-			buildRules = (
-				1A63BDED134F6810002EDFB4 /* PBXBuildRule */,
-			);
-			dependencies = (
-				1A63BDA3134F60A7002EDFB4 /* PBXTargetDependency */,
-			);
-			name = Fuzzy;
-			productName = Fuzzy;
-			productReference = 1A63BC61134F5DAB002EDFB4 /* Fuzzy */;
-			productType = "com.apple.product-type.tool";
-		};
-		1A63BD31134F5F1E002EDFB4 /* combined */ = {
-			isa = PBXNativeTarget;
-			buildConfigurationList = 1A63BD38134F5F1E002EDFB4 /* Build configuration list for PBXNativeTarget "combined" */;
-			buildPhases = (
-				1A63BD2E134F5F1E002EDFB4 /* Sources */,
-				1A63BD2F134F5F1E002EDFB4 /* Frameworks */,
-				1A63BD30134F5F1E002EDFB4 /* CopyFiles */,
-			);
-			buildRules = (
-				1A63BDEC134F649F002EDFB4 /* PBXBuildRule */,
-			);
-			dependencies = (
-				1A63BDA1134F609B002EDFB4 /* PBXTargetDependency */,
-			);
-			name = combined;
-			productName = combined;
-			productReference = 1A63BD32134F5F1E002EDFB4 /* combined */;
-			productType = "com.apple.product-type.tool";
-		};
-		1A63BD3E134F5F36002EDFB4 /* lexertest-simple */ = {
-			isa = PBXNativeTarget;
-			buildConfigurationList = 1A63BD45134F5F36002EDFB4 /* Build configuration list for PBXNativeTarget "lexertest-simple" */;
-			buildPhases = (
-				1A63BD3B134F5F36002EDFB4 /* Sources */,
-				1A63BD3C134F5F36002EDFB4 /* Frameworks */,
-				1A63BD3D134F5F36002EDFB4 /* CopyFiles */,
-			);
-			buildRules = (
-			);
-			dependencies = (
-				1A63BD9F134F6093002EDFB4 /* PBXTargetDependency */,
-			);
-			name = "lexertest-simple";
-			productName = "lexertest-simple";
-			productReference = 1A63BD3F134F5F36002EDFB4 /* lexertest-simple */;
-			productType = "com.apple.product-type.tool";
-		};
-		1A63BD4B134F5F43002EDFB4 /* LL-start */ = {
-			isa = PBXNativeTarget;
-			buildConfigurationList = 1A63BD52134F5F43002EDFB4 /* Build configuration list for PBXNativeTarget "LL-start" */;
-			buildPhases = (
-				1A63BD48134F5F43002EDFB4 /* Sources */,
-				1A63BD49134F5F43002EDFB4 /* Frameworks */,
-				1A63BD4A134F5F43002EDFB4 /* CopyFiles */,
-			);
-			buildRules = (
-			);
-			dependencies = (
-				1A63BDA5134F60B0002EDFB4 /* PBXTargetDependency */,
-			);
-			name = "LL-start";
-			productName = "LL-start";
-			productReference = 1A63BD4C134F5F43002EDFB4 /* LL-start */;
-			productType = "com.apple.product-type.tool";
-		};
-		1A63BD58134F5F4D002EDFB4 /* polydiff */ = {
-			isa = PBXNativeTarget;
-			buildConfigurationList = 1A63BD5F134F5F4D002EDFB4 /* Build configuration list for PBXNativeTarget "polydiff" */;
-			buildPhases = (
-				1A63BD55134F5F4D002EDFB4 /* Sources */,
-				1A63BD56134F5F4D002EDFB4 /* Frameworks */,
-				1A63BD57134F5F4D002EDFB4 /* CopyFiles */,
-			);
-			buildRules = (
-			);
-			dependencies = (
-				1A63BDA7134F60BC002EDFB4 /* PBXTargetDependency */,
-			);
-			name = polydiff;
-			productName = polydiff;
-			productReference = 1A63BD59134F5F4D002EDFB4 /* polydiff */;
-			productType = "com.apple.product-type.tool";
-		};
-		1A63BD65134F5F5E002EDFB4 /* simplecTreeParser */ = {
-			isa = PBXNativeTarget;
-			buildConfigurationList = 1A63BD6C134F5F5E002EDFB4 /* Build configuration list for PBXNativeTarget "simplecTreeParser" */;
-			buildPhases = (
-				1A63BD62134F5F5E002EDFB4 /* Sources */,
-				1A63BD63134F5F5E002EDFB4 /* Frameworks */,
-				1A63BD64134F5F5E002EDFB4 /* CopyFiles */,
-			);
-			buildRules = (
-			);
-			dependencies = (
-				1A63BDA9134F60C3002EDFB4 /* PBXTargetDependency */,
-			);
-			name = simplecTreeParser;
-			productName = simplecTreeParser;
-			productReference = 1A63BD66134F5F5E002EDFB4 /* simplecTreeParser */;
-			productType = "com.apple.product-type.tool";
-		};
-		1A63BD72134F5F67002EDFB4 /* treeparser */ = {
-			isa = PBXNativeTarget;
-			buildConfigurationList = 1A63BD79134F5F68002EDFB4 /* Build configuration list for PBXNativeTarget "treeparser" */;
-			buildPhases = (
-				1A63BD6F134F5F67002EDFB4 /* Sources */,
-				1A63BD70134F5F67002EDFB4 /* Frameworks */,
-				1A63BD71134F5F67002EDFB4 /* CopyFiles */,
-			);
-			buildRules = (
-			);
-			dependencies = (
-				1A63BDAB134F60CC002EDFB4 /* PBXTargetDependency */,
-			);
-			name = treeparser;
-			productName = treeparser;
-			productReference = 1A63BD73134F5F67002EDFB4 /* treeparser */;
-			productType = "com.apple.product-type.tool";
-		};
-		1A63BD7F134F5F71002EDFB4 /* treerewrite */ = {
-			isa = PBXNativeTarget;
-			buildConfigurationList = 1A63BD86134F5F72002EDFB4 /* Build configuration list for PBXNativeTarget "treerewrite" */;
-			buildPhases = (
-				1A63BD7C134F5F71002EDFB4 /* Sources */,
-				1A63BD7D134F5F71002EDFB4 /* Frameworks */,
-				1A63BD7E134F5F71002EDFB4 /* Copy Files */,
-			);
-			buildRules = (
-				1A76A02C134FC7540041634F /* PBXBuildRule */,
-			);
-			dependencies = (
-				1A63BDAD134F60D2002EDFB4 /* PBXTargetDependency */,
-			);
-			name = treerewrite;
-			productName = treerewrite;
-			productReference = 1A63BD80134F5F71002EDFB4 /* treerewrite */;
-			productType = "com.apple.product-type.tool";
-		};
-		1A63BDD3134F6233002EDFB4 /* scopes */ = {
-			isa = PBXNativeTarget;
-			buildConfigurationList = 1A63BDDA134F6234002EDFB4 /* Build configuration list for PBXNativeTarget "scopes" */;
-			buildPhases = (
-				1A63BDD0134F6233002EDFB4 /* Sources */,
-				1A63BDD1134F6233002EDFB4 /* Frameworks */,
-				1A63BDD2134F6233002EDFB4 /* CopyFiles */,
-			);
-			buildRules = (
-			);
-			dependencies = (
-				1A63BDE6134F629B002EDFB4 /* PBXTargetDependency */,
-			);
-			name = scopes;
-			productName = scopes;
-			productReference = 1A63BDD4134F6233002EDFB4 /* scopes */;
-			productType = "com.apple.product-type.tool";
-		};
-		1A63BDFB134FB75E002EDFB4 /* hoistedPredicates */ = {
-			isa = PBXNativeTarget;
-			buildConfigurationList = 1A63BE02134FB75F002EDFB4 /* Build configuration list for PBXNativeTarget "hoistedPredicates" */;
-			buildPhases = (
-				1A63BDF8134FB75E002EDFB4 /* Sources */,
-				1A63BDF9134FB75E002EDFB4 /* Frameworks */,
-				1A63BDFA134FB75E002EDFB4 /* CopyFiles */,
-			);
-			buildRules = (
-			);
-			dependencies = (
-				1A63BE0B134FB824002EDFB4 /* PBXTargetDependency */,
-			);
-			name = hoistedPredicates;
-			productName = hoistedPredicates;
-			productReference = 1A63BDFC134FB75E002EDFB4 /* hoistedPredicates */;
-			productType = "com.apple.product-type.tool";
-		};
-		1AE72317134E860B001C3F35 /* ANTLR */ = {
-			isa = PBXNativeTarget;
-			buildConfigurationList = 1AE7233F134E860B001C3F35 /* Build configuration list for PBXNativeTarget "ANTLR" */;
-			buildPhases = (
-				1AE72313134E860B001C3F35 /* Sources */,
-				1AE72314134E860B001C3F35 /* Frameworks */,
-				1AE72315134E860B001C3F35 /* Headers */,
-				1AE72316134E860B001C3F35 /* Resources */,
-			);
-			buildRules = (
-			);
-			dependencies = (
-			);
-			name = ANTLR;
-			productName = ANTLR;
-			productReference = 1AE72318134E860B001C3F35 /* ANTLR.framework */;
-			productType = "com.apple.product-type.framework";
-		};
-		1AE7232C134E860B001C3F35 /* ANTLRTests */ = {
-			isa = PBXNativeTarget;
-			buildConfigurationList = 1AE72342134E860B001C3F35 /* Build configuration list for PBXNativeTarget "ANTLRTests" */;
-			buildPhases = (
-				1AE72328134E860B001C3F35 /* Sources */,
-				1AE72329134E860B001C3F35 /* Frameworks */,
-				1AE7232A134E860B001C3F35 /* Resources */,
-				1AE7232B134E860B001C3F35 /* ShellScript */,
-			);
-			buildRules = (
-			);
-			dependencies = (
-				1AE72330134E860B001C3F35 /* PBXTargetDependency */,
-			);
-			name = ANTLRTests;
-			productName = ANTLRTests;
-			productReference = 1AE7232D134E860B001C3F35 /* ANTLRTests.octest */;
-			productType = "com.apple.product-type.bundle";
-		};
-/* End PBXNativeTarget section */
-
-/* Begin PBXProject section */
-		1AE7230E134E860A001C3F35 /* Project object */ = {
-			isa = PBXProject;
-			attributes = {
-				ORGANIZATIONNAME = "Alan's MachineWorks";
-			};
-			buildConfigurationList = 1AE72311134E860A001C3F35 /* Build configuration list for PBXProject "ANTLR" */;
-			compatibilityVersion = "Xcode 3.2";
-			developmentRegion = English;
-			hasScannedForEncodings = 0;
-			knownRegions = (
-				en,
-			);
-			mainGroup = 1AE7230C134E860A001C3F35;
-			productRefGroup = 1AE72319134E860B001C3F35 /* Products */;
-			projectDirPath = "";
-			projectRoot = "";
-			targets = (
-				1AE72317134E860B001C3F35 /* ANTLR */,
-				1AE7232C134E860B001C3F35 /* ANTLRTests */,
-				1A63BD31134F5F1E002EDFB4 /* combined */,
-				1A63BC60134F5DAB002EDFB4 /* Fuzzy */,
-				1A63BDFB134FB75E002EDFB4 /* hoistedPredicates */,
-				1A63BD3E134F5F36002EDFB4 /* lexertest-simple */,
-				1A63BD4B134F5F43002EDFB4 /* LL-start */,
-				1A63BD58134F5F4D002EDFB4 /* polydiff */,
-				1A63BDD3134F6233002EDFB4 /* scopes */,
-				1A63BD65134F5F5E002EDFB4 /* simplecTreeParser */,
-				1A63BD72134F5F67002EDFB4 /* treeparser */,
-				1A63BD7F134F5F71002EDFB4 /* treerewrite */,
-			);
-		};
-/* End PBXProject section */
-
-/* Begin PBXResourcesBuildPhase section */
-		1AE72316134E860B001C3F35 /* Resources */ = {
-			isa = PBXResourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				1AE72326134E860B001C3F35 /* InfoPlist.strings in Resources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		1AE7232A134E860B001C3F35 /* Resources */ = {
-			isa = PBXResourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				1AE72337134E860B001C3F35 /* InfoPlist.strings in Resources */,
-				1AE7233A134E860B001C3F35 /* ANTLRTests.h in Resources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-/* End PBXResourcesBuildPhase section */
-
-/* Begin PBXShellScriptBuildPhase section */
-		1AE7232B134E860B001C3F35 /* ShellScript */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			inputPaths = (
-			);
-			outputPaths = (
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = "# Run the unit tests in this test bundle.\n\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\"\n";
-		};
-/* End PBXShellScriptBuildPhase section */
-
-/* Begin PBXSourcesBuildPhase section */
-		1A63BC5D134F5DAB002EDFB4 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				1A63BC6F134F5DE5002EDFB4 /* main.m in Sources */,
-				1A63BC6E134F5DE5002EDFB4 /* FuzzyLexer.m in Sources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		1A63BD2E134F5F1E002EDFB4 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				1A63BD8B134F5FF3002EDFB4 /* main.m in Sources */,
-				1A63BD89134F5FF3002EDFB4 /* CombinedLexer.m in Sources */,
-				1A63BD8A134F5FF3002EDFB4 /* CombinedParser.m in Sources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		1A63BD3B134F5F36002EDFB4 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				1A63BD94134F606A002EDFB4 /* main.m in Sources */,
-				1A63BD95134F606A002EDFB4 /* TestLexer.m in Sources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		1A63BD48134F5F43002EDFB4 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				1A63BDC7134F61E4002EDFB4 /* main.m in Sources */,
-				1A63BDC8134F61E8002EDFB4 /* SimpleCLexer.m in Sources */,
-				1A63BDC9134F61EC002EDFB4 /* SimpleCParser.m in Sources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		1A63BD55134F5F4D002EDFB4 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				1A63BDCA134F6218002EDFB4 /* Main.m in Sources */,
-				1A63BDCB134F6218002EDFB4 /* PolyDifferentiator.m in Sources */,
-				1A63BDCC134F6218002EDFB4 /* PolyLexer.m in Sources */,
-				1A63BDCD134F6218002EDFB4 /* PolyParser.m in Sources */,
-				1A63BDCE134F6218002EDFB4 /* PolyPrinter.m in Sources */,
-				1A63BDCF134F6218002EDFB4 /* Simplifier.m in Sources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		1A63BD62134F5F5E002EDFB4 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				1A63BDE8134F62D0002EDFB4 /* main.m in Sources */,
-				1A63BDEA134F62D0002EDFB4 /* SimpleCTP.m in Sources */,
-				1A63BDEB134F62D0002EDFB4 /* SimpleCWalker.m in Sources */,
-				1A63BDE7134F62CB002EDFB4 /* SimpleCLexer.m in Sources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		1A63BD6F134F5F67002EDFB4 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				1A76A02F134FD4160041634F /* main.m in Sources */,
-				1A76A032134FD4B90041634F /* LangDumpDecl.m in Sources */,
-				1A76A030134FD4A00041634F /* LangLexer.m in Sources */,
-				1A76A031134FD4A40041634F /* LangParser.m in Sources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		1A63BD7C134F5F71002EDFB4 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				1A63BDF6134FB55F002EDFB4 /* main.m in Sources */,
-				1A63BDF5134FB55B002EDFB4 /* TreeRewriteLexer.m in Sources */,
-				1A63BDF7134FB564002EDFB4 /* TreeRewriteParser.m in Sources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		1A63BDD0134F6233002EDFB4 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				1A63BDDD134F6258002EDFB4 /* main.m in Sources */,
-				1A63BDDE134F6258002EDFB4 /* SymbolTableLexer.m in Sources */,
-				1A63BDDF134F6258002EDFB4 /* SymbolTableParser.m in Sources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		1A63BDF8134FB75E002EDFB4 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				1A63BE05134FB807002EDFB4 /* main.m in Sources */,
-				1A63BE06134FB80B002EDFB4 /* TLexer.m in Sources */,
-				1A63BE07134FB80E002EDFB4 /* TParser.m in Sources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		1AE72313134E860B001C3F35 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				1AE7239F134E8AB4001C3F35 /* ANTLRBaseMapElement.m in Sources */,
-				1AE723A0134E8AB4001C3F35 /* ANTLRBaseRecognizer.m in Sources */,
-				1AE723A1134E8AB4001C3F35 /* ANTLRBaseStack.m in Sources */,
-				1AE723A2134E8AB4001C3F35 /* ANTLRBaseTree.m in Sources */,
-				1AE723A3134E8AB4001C3F35 /* ANTLRBaseTreeAdaptor.m in Sources */,
-				1AE723A4134E8AB4001C3F35 /* ANTLRBitSet.m in Sources */,
-				1AE723A5134E8AB4001C3F35 /* ANTLRBufferedTokenStream.m in Sources */,
-				1AE723A6134E8AB4001C3F35 /* ANTLRBufferedTreeNodeStream.m in Sources */,
-				1AE723A7134E8AB4001C3F35 /* ANTLRCharStreamState.m in Sources */,
-				1AE723A8134E8AB4001C3F35 /* ANTLRCommonErrorNode.m in Sources */,
-				1AE723A9134E8AB4001C3F35 /* ANTLRCommonToken.m in Sources */,
-				1AE723AA134E8AB4001C3F35 /* ANTLRCommonTokenStream.m in Sources */,
-				1AE723AB134E8AB4001C3F35 /* ANTLRCommonTree.m in Sources */,
-				1AE723AC134E8AB4001C3F35 /* ANTLRCommonTreeAdaptor.m in Sources */,
-				1AE723AD134E8AB4001C3F35 /* ANTLRCommonTreeNodeStream.m in Sources */,
-				1AE723AE134E8AB4001C3F35 /* ANTLRDebugEventProxy.m in Sources */,
-				1AE723AF134E8AB4001C3F35 /* ANTLRDebugParser.m in Sources */,
-				1AE723B0134E8AB4001C3F35 /* ANTLRDebugTokenStream.m in Sources */,
-				1AE723B1134E8AB4001C3F35 /* ANTLRDebugTreeAdaptor.m in Sources */,
-				1AE723B2134E8AB4001C3F35 /* ANTLRDebugTreeNodeStream.m in Sources */,
-				1AE723B3134E8AB4001C3F35 /* ANTLRDebugTreeParser.m in Sources */,
-				1AE723B4134E8AB4001C3F35 /* ANTLRDFA.m in Sources */,
-				1AE723B5134E8AB4001C3F35 /* ANTLRDoubleKeyMap.m in Sources */,
-				1AE723B6134E8AB4001C3F35 /* ANTLREarlyExitException.m in Sources */,
-				1AE723B7134E8AB4001C3F35 /* ANTLRFailedPredicateException.m in Sources */,
-				1AE723B8134E8AB4001C3F35 /* ANTLRFastQueue.m in Sources */,
-				1AE723B9134E8AB4001C3F35 /* ANTLRFileStream.m in Sources */,
-				1AE723BA134E8AB5001C3F35 /* ANTLRHashMap.m in Sources */,
-				1AE723BB134E8AB5001C3F35 /* ANTLRHashRule.m in Sources */,
-				1AE723BC134E8AB5001C3F35 /* ANTLRInputStream.m in Sources */,
-				1AE723BD134E8AB5001C3F35 /* ANTLRIntArray.m in Sources */,
-				1AE723BF134E8AB5001C3F35 /* ANTLRLexer.m in Sources */,
-				1AE723C0134E8AB5001C3F35 /* ANTLRLexerRuleReturnScope.m in Sources */,
-				1AE723C1134E8AB5001C3F35 /* ANTLRLexerState.m in Sources */,
-				1AE723C2134E8AB5001C3F35 /* ANTLRLinkBase.m in Sources */,
-				1AE723C3134E8AB5001C3F35 /* ANTLRLookaheadStream.m in Sources */,
-				1AE723C4134E8AB5001C3F35 /* ANTLRMap.m in Sources */,
-				1AE723C5134E8AB5001C3F35 /* ANTLRMapElement.m in Sources */,
-				1AE723C6134E8AB5001C3F35 /* ANTLRMismatchedNotSetException.m in Sources */,
-				1AE723C7134E8AB5001C3F35 /* ANTLRMismatchedRangeException.m in Sources */,
-				1AE723C8134E8AB5001C3F35 /* ANTLRMismatchedSetException.m in Sources */,
-				1AE723C9134E8AB5001C3F35 /* ANTLRMismatchedTokenException.m in Sources */,
-				1AE723CA134E8AB5001C3F35 /* ANTLRMismatchedTreeNodeException.m in Sources */,
-				1AE723CB134E8AB5001C3F35 /* ANTLRMissingTokenException.m in Sources */,
-				1AE723CC134E8AB5001C3F35 /* ANTLRNodeMapElement.m in Sources */,
-				1AE723CD134E8AB5001C3F35 /* ANTLRNoViableAltException.m in Sources */,
-				1AE723CE134E8AB5001C3F35 /* ANTLRParser.m in Sources */,
-				1AE723CF134E8AB5001C3F35 /* ANTLRParserRuleReturnScope.m in Sources */,
-				1AE723D0134E8AB5001C3F35 /* ANTLRParseTree.m in Sources */,
-				1AE723D1134E8AB5001C3F35 /* ANTLRPtrBuffer.m in Sources */,
-				1AE723D2134E8AB5001C3F35 /* ANTLRPtrStack.m in Sources */,
-				1AE723D3134E8AB5001C3F35 /* ANTLRReaderStream.m in Sources */,
-				1AE723D4134E8AB5001C3F35 /* ANTLRRecognitionException.m in Sources */,
-				1AE723D5134E8AB5001C3F35 /* ANTLRRecognizerSharedState.m in Sources */,
-				1AE723D6134E8AB5001C3F35 /* ANTLRRewriteRuleElementStream.m in Sources */,
-				1AE723D7134E8AB5001C3F35 /* ANTLRRewriteRuleNodeStream.m in Sources */,
-				1AE723D8134E8AB5001C3F35 /* ANTLRRewriteRuleSubtreeStream.m in Sources */,
-				1AE723D9134E8AB5001C3F35 /* ANTLRRewriteRuleTokenStream.m in Sources */,
-				1AE723DA134E8AB5001C3F35 /* ANTLRRuleMapElement.m in Sources */,
-				1AE723DB134E8AB5001C3F35 /* ANTLRRuleMemo.m in Sources */,
-				1AE723DC134E8AB5001C3F35 /* ANTLRRuleReturnScope.m in Sources */,
-				1AE723DD134E8AB5001C3F35 /* ANTLRRuleStack.m in Sources */,
-				1AE723DE134E8AB5001C3F35 /* ANTLRRuntimeException.m in Sources */,
-				1AE723DF134E8AB5001C3F35 /* ANTLRStreamEnumerator.m in Sources */,
-				1AE723E0134E8AB5001C3F35 /* ANTLRStringStream.m in Sources */,
-				1AE723E1134E8AB5001C3F35 /* ANTLRSymbolStack.m in Sources */,
-				1AE723E2134E8AB5001C3F35 /* ANTLRToken+DebuggerSupport.m in Sources */,
-				1AE723E3134E8AB6001C3F35 /* ANTLRTokenRewriteStream.m in Sources */,
-				1AE723E5134E8AB6001C3F35 /* ANTLRTreeAdaptor.m in Sources */,
-				1AE723E6134E8AB6001C3F35 /* ANTLRTreeException.m in Sources */,
-				1AE723E7134E8AB6001C3F35 /* ANTLRTreeIterator.m in Sources */,
-				1AE723E8134E8AB6001C3F35 /* ANTLRTreeParser.m in Sources */,
-				1AE723E9134E8AB6001C3F35 /* ANTLRTreePatternLexer.m in Sources */,
-				1AE723EA134E8AB6001C3F35 /* ANTLRTreePatternParser.m in Sources */,
-				1AE723EB134E8AB6001C3F35 /* ANTLRTreeRewriter.m in Sources */,
-				1AE723EC134E8AB6001C3F35 /* ANTLRTreeRuleReturnScope.m in Sources */,
-				1AE723ED134E8AB6001C3F35 /* ANTLRTreeVisitor.m in Sources */,
-				1AE723EE134E8AB6001C3F35 /* ANTLRTreeVisitorAction.m in Sources */,
-				1AE723EF134E8AB6001C3F35 /* ANTLRTreeWizard.m in Sources */,
-				1AE723F0134E8AB6001C3F35 /* ANTLRUnbufferedCommonTreeNodeStream.m in Sources */,
-				1AE723F1134E8AB6001C3F35 /* ANTLRUnbufferedCommonTreeNodeStreamState.m in Sources */,
-				1AE723F2134E8AB6001C3F35 /* ANTLRUnbufferedTokenStream.m in Sources */,
-				1AE723F3134E8AB6001C3F35 /* ANTLRUniqueIDMap.m in Sources */,
-				1AE723F4134E8AB6001C3F35 /* ANTLRUnwantedTokenException.m in Sources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		1AE72328134E860B001C3F35 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				1AE7233C134E860B001C3F35 /* ANTLRTests.m in Sources */,
-				1A6B1D6A134E8DEB0016A47D /* ANTLRBitSetTest.h in Sources */,
-				1A6B1D6B134E8DEB0016A47D /* ANTLRBitSetTest.m in Sources */,
-				1A6B1D70134E8DEB0016A47D /* ANTLRCommonTokenTest.h in Sources */,
-				1A6B1D71134E8DEB0016A47D /* ANTLRCommonTokenTest.m in Sources */,
-				1A6B1D72134E8DEB0016A47D /* ANTLRCommonErrorNodeTest.h in Sources */,
-				1A6B1D73134E8DEB0016A47D /* ANTLRCommonErrorNodeTest.m in Sources */,
-				1A6B1D74134E8DEB0016A47D /* ANTLRCommonTreeAdaptorTest.h in Sources */,
-				1A6B1D75134E8DEC0016A47D /* ANTLRCommonTreeAdaptorTest.m in Sources */,
-				1A6B1D76134E8DEC0016A47D /* ANTLRCommonTreeTest.h in Sources */,
-				1A6B1D77134E8DEC0016A47D /* ANTLRCommonTreeTest.m in Sources */,
-				1A6B1D64134E8DEB0016A47D /* ANTLRFastQueueTest.h in Sources */,
-				1A6B1D65134E8DEB0016A47D /* ANTLRFastQueueTest.m in Sources */,
-				1A6B1D66134E8DEB0016A47D /* ANTLRIntArrayTest.h in Sources */,
-				1A6B1D67134E8DEB0016A47D /* ANTLRIntArrayTest.m in Sources */,
-				1A6B1D68134E8DEB0016A47D /* ANTLRRecognizerTest.h in Sources */,
-				1A6B1D69134E8DEB0016A47D /* ANTLRRecognizerTest.m in Sources */,
-				1A6B1D6C134E8DEB0016A47D /* ANTLRStringStreamTest.h in Sources */,
-				1A6B1D6D134E8DEB0016A47D /* ANTLRStringStreamTest.m in Sources */,
-				1A6B1D6E134E8DEB0016A47D /* TestRewriteRuleTokenStream.h in Sources */,
-				1A6B1D6F134E8DEB0016A47D /* TestRewriteRuleTokenStream.m in Sources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-/* End PBXSourcesBuildPhase section */
-
-/* Begin PBXTargetDependency section */
-		1A63BD9F134F6093002EDFB4 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 1AE72317134E860B001C3F35 /* ANTLR */;
-			targetProxy = 1A63BD9E134F6093002EDFB4 /* PBXContainerItemProxy */;
-		};
-		1A63BDA1134F609B002EDFB4 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 1AE72317134E860B001C3F35 /* ANTLR */;
-			targetProxy = 1A63BDA0134F609B002EDFB4 /* PBXContainerItemProxy */;
-		};
-		1A63BDA3134F60A7002EDFB4 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 1AE72317134E860B001C3F35 /* ANTLR */;
-			targetProxy = 1A63BDA2134F60A7002EDFB4 /* PBXContainerItemProxy */;
-		};
-		1A63BDA5134F60B0002EDFB4 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 1AE72317134E860B001C3F35 /* ANTLR */;
-			targetProxy = 1A63BDA4134F60B0002EDFB4 /* PBXContainerItemProxy */;
-		};
-		1A63BDA7134F60BC002EDFB4 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 1AE72317134E860B001C3F35 /* ANTLR */;
-			targetProxy = 1A63BDA6134F60BC002EDFB4 /* PBXContainerItemProxy */;
-		};
-		1A63BDA9134F60C3002EDFB4 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 1AE72317134E860B001C3F35 /* ANTLR */;
-			targetProxy = 1A63BDA8134F60C3002EDFB4 /* PBXContainerItemProxy */;
-		};
-		1A63BDAB134F60CC002EDFB4 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 1AE72317134E860B001C3F35 /* ANTLR */;
-			targetProxy = 1A63BDAA134F60CC002EDFB4 /* PBXContainerItemProxy */;
-		};
-		1A63BDAD134F60D2002EDFB4 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 1AE72317134E860B001C3F35 /* ANTLR */;
-			targetProxy = 1A63BDAC134F60D2002EDFB4 /* PBXContainerItemProxy */;
-		};
-		1A63BDE6134F629B002EDFB4 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 1AE72317134E860B001C3F35 /* ANTLR */;
-			targetProxy = 1A63BDE5134F629B002EDFB4 /* PBXContainerItemProxy */;
-		};
-		1A63BE0B134FB824002EDFB4 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 1AE72317134E860B001C3F35 /* ANTLR */;
-			targetProxy = 1A63BE0A134FB824002EDFB4 /* PBXContainerItemProxy */;
-		};
-		1AE72330134E860B001C3F35 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 1AE72317134E860B001C3F35 /* ANTLR */;
-			targetProxy = 1AE7232F134E860B001C3F35 /* PBXContainerItemProxy */;
-		};
-/* End PBXTargetDependency section */
-
-/* Begin PBXVariantGroup section */
-		1AE72324134E860B001C3F35 /* InfoPlist.strings */ = {
-			isa = PBXVariantGroup;
-			children = (
-				1AE72325134E860B001C3F35 /* en */,
-			);
-			name = InfoPlist.strings;
-			sourceTree = "<group>";
-		};
-		1AE72335134E860B001C3F35 /* InfoPlist.strings */ = {
-			isa = PBXVariantGroup;
-			children = (
-				1AE72336134E860B001C3F35 /* en */,
-			);
-			name = InfoPlist.strings;
-			sourceTree = "<group>";
-		};
-/* End PBXVariantGroup section */
-
-/* Begin XCBuildConfiguration section */
-		1A63BC68134F5DAC002EDFB4 /* Debug */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = YES;
-				ARCHS = "$(NATIVE_ARCH_ACTUAL)";
-				COPY_PHASE_STRIP = NO;
-				FRAMEWORK_SEARCH_PATHS = /Library/Frameworks;
-				"FRAMEWORK_SEARCH_PATHS[arch=*]" = /Library/Frameworks;
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_OBJC_EXCEPTIONS = YES;
-				GCC_ENABLE_OBJC_GC = required;
-				HEADER_SEARCH_PATHS = /Library/Frameworks;
-				ONLY_ACTIVE_ARCH = YES;
-				PRODUCT_NAME = "$(TARGET_NAME)";
-				TEST_AFTER_BUILD = YES;
-			};
-			name = Debug;
-		};
-		1A63BC69134F5DAC002EDFB4 /* Release */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = YES;
-				ARCHS = "$(NATIVE_ARCH_ACTUAL)";
-				COPY_PHASE_STRIP = YES;
-				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
-				FRAMEWORK_SEARCH_PATHS = /Library/Frameworks;
-				GCC_ENABLE_OBJC_EXCEPTIONS = YES;
-				GCC_ENABLE_OBJC_GC = required;
-				ONLY_ACTIVE_ARCH = YES;
-				PRODUCT_NAME = "$(TARGET_NAME)";
-				TEST_AFTER_BUILD = YES;
-			};
-			name = Release;
-		};
-		1A63BD39134F5F1E002EDFB4 /* Debug */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = YES;
-				ARCHS = "$(NATIVE_ARCH_ACTUAL)";
-				COPY_PHASE_STRIP = NO;
-				FRAMEWORK_SEARCH_PATHS = /Library/Frameworks;
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_OBJC_EXCEPTIONS = YES;
-				GCC_ENABLE_OBJC_GC = required;
-				ONLY_ACTIVE_ARCH = YES;
-				PRODUCT_NAME = "$(TARGET_NAME)";
-				TEST_AFTER_BUILD = YES;
-			};
-			name = Debug;
-		};
-		1A63BD3A134F5F1E002EDFB4 /* Release */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = YES;
-				ARCHS = "$(NATIVE_ARCH_ACTUAL)";
-				COPY_PHASE_STRIP = YES;
-				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
-				FRAMEWORK_SEARCH_PATHS = /Library/Frameworks;
-				GCC_ENABLE_OBJC_EXCEPTIONS = YES;
-				GCC_ENABLE_OBJC_GC = required;
-				ONLY_ACTIVE_ARCH = YES;
-				PRODUCT_NAME = "$(TARGET_NAME)";
-				TEST_AFTER_BUILD = YES;
-			};
-			name = Release;
-		};
-		1A63BD46134F5F36002EDFB4 /* Debug */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = YES;
-				ARCHS = "$(NATIVE_ARCH_ACTUAL)";
-				COPY_PHASE_STRIP = NO;
-				FRAMEWORK_SEARCH_PATHS = /Library/Frameworks;
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_OBJC_EXCEPTIONS = YES;
-				GCC_ENABLE_OBJC_GC = required;
-				HEADER_SEARCH_PATHS = /Library/Frameworks;
-				ONLY_ACTIVE_ARCH = YES;
-				PRODUCT_NAME = "$(TARGET_NAME)";
-				TEST_AFTER_BUILD = YES;
-			};
-			name = Debug;
-		};
-		1A63BD47134F5F36002EDFB4 /* Release */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = YES;
-				ARCHS = "$(NATIVE_ARCH_ACTUAL)";
-				COPY_PHASE_STRIP = YES;
-				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
-				FRAMEWORK_SEARCH_PATHS = /Library/Frameworks;
-				GCC_ENABLE_OBJC_EXCEPTIONS = YES;
-				GCC_ENABLE_OBJC_GC = required;
-				ONLY_ACTIVE_ARCH = YES;
-				PRODUCT_NAME = "$(TARGET_NAME)";
-				TEST_AFTER_BUILD = YES;
-			};
-			name = Release;
-		};
-		1A63BD53134F5F43002EDFB4 /* Debug */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = YES;
-				ARCHS = "$(NATIVE_ARCH_ACTUAL)";
-				COPY_PHASE_STRIP = NO;
-				FRAMEWORK_SEARCH_PATHS = /Library/Frameworks;
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_OBJC_EXCEPTIONS = YES;
-				GCC_ENABLE_OBJC_GC = required;
-				ONLY_ACTIVE_ARCH = YES;
-				PRODUCT_NAME = "$(TARGET_NAME)";
-			};
-			name = Debug;
-		};
-		1A63BD54134F5F43002EDFB4 /* Release */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = YES;
-				ARCHS = "$(NATIVE_ARCH_ACTUAL)";
-				COPY_PHASE_STRIP = YES;
-				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
-				FRAMEWORK_SEARCH_PATHS = /Library/Frameworks;
-				GCC_ENABLE_OBJC_EXCEPTIONS = YES;
-				GCC_ENABLE_OBJC_GC = required;
-				ONLY_ACTIVE_ARCH = YES;
-				PRODUCT_NAME = "$(TARGET_NAME)";
-			};
-			name = Release;
-		};
-		1A63BD60134F5F4D002EDFB4 /* Debug */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = YES;
-				ARCHS = "$(NATIVE_ARCH_ACTUAL)";
-				COPY_PHASE_STRIP = NO;
-				FRAMEWORK_SEARCH_PATHS = /Library/Frameworks;
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_OBJC_EXCEPTIONS = YES;
-				GCC_ENABLE_OBJC_GC = required;
-				HEADER_SEARCH_PATHS = /Library/Frameworks;
-				ONLY_ACTIVE_ARCH = YES;
-				PRODUCT_NAME = "$(TARGET_NAME)";
-				USER_HEADER_SEARCH_PATHS = /Library/Frameworks;
-			};
-			name = Debug;
-		};
-		1A63BD61134F5F4D002EDFB4 /* Release */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = YES;
-				ARCHS = "$(NATIVE_ARCH_ACTUAL)";
-				COPY_PHASE_STRIP = YES;
-				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
-				FRAMEWORK_SEARCH_PATHS = /Library/Frameworks;
-				GCC_ENABLE_OBJC_EXCEPTIONS = YES;
-				GCC_ENABLE_OBJC_GC = required;
-				ONLY_ACTIVE_ARCH = YES;
-				PRODUCT_NAME = "$(TARGET_NAME)";
-				USER_HEADER_SEARCH_PATHS = /Library/Frameworks;
-			};
-			name = Release;
-		};
-		1A63BD6D134F5F5E002EDFB4 /* Debug */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = YES;
-				ARCHS = "$(NATIVE_ARCH_ACTUAL)";
-				COPY_PHASE_STRIP = NO;
-				FRAMEWORK_SEARCH_PATHS = /Library/Frameworks;
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_OBJC_EXCEPTIONS = YES;
-				GCC_ENABLE_OBJC_GC = required;
-				ONLY_ACTIVE_ARCH = YES;
-				PRODUCT_NAME = "$(TARGET_NAME)";
-			};
-			name = Debug;
-		};
-		1A63BD6E134F5F5E002EDFB4 /* Release */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = YES;
-				ARCHS = "$(NATIVE_ARCH_ACTUAL)";
-				COPY_PHASE_STRIP = YES;
-				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
-				FRAMEWORK_SEARCH_PATHS = /Library/Frameworks;
-				GCC_ENABLE_OBJC_EXCEPTIONS = YES;
-				GCC_ENABLE_OBJC_GC = required;
-				ONLY_ACTIVE_ARCH = YES;
-				PRODUCT_NAME = "$(TARGET_NAME)";
-			};
-			name = Release;
-		};
-		1A63BD7A134F5F68002EDFB4 /* Debug */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = YES;
-				ARCHS = "$(NATIVE_ARCH_ACTUAL)";
-				COPY_PHASE_STRIP = NO;
-				FRAMEWORK_SEARCH_PATHS = /Library/Frameworks;
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_OBJC_EXCEPTIONS = YES;
-				GCC_ENABLE_OBJC_GC = required;
-				ONLY_ACTIVE_ARCH = YES;
-				PRODUCT_NAME = "$(TARGET_NAME)";
-				TEST_AFTER_BUILD = YES;
-			};
-			name = Debug;
-		};
-		1A63BD7B134F5F68002EDFB4 /* Release */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = YES;
-				ARCHS = "$(NATIVE_ARCH_ACTUAL)";
-				COPY_PHASE_STRIP = YES;
-				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
-				FRAMEWORK_SEARCH_PATHS = /Library/Frameworks;
-				GCC_ENABLE_OBJC_EXCEPTIONS = YES;
-				GCC_ENABLE_OBJC_GC = required;
-				ONLY_ACTIVE_ARCH = YES;
-				PRODUCT_NAME = "$(TARGET_NAME)";
-				TEST_AFTER_BUILD = YES;
-			};
-			name = Release;
-		};
-		1A63BD87134F5F72002EDFB4 /* Debug */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = YES;
-				ARCHS = "$(NATIVE_ARCH_ACTUAL)";
-				COPY_PHASE_STRIP = NO;
-				FRAMEWORK_SEARCH_PATHS = /Library/Frameworks;
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_OBJC_EXCEPTIONS = YES;
-				ONLY_ACTIVE_ARCH = YES;
-				PRODUCT_NAME = "$(TARGET_NAME)";
-				TEST_AFTER_BUILD = YES;
-			};
-			name = Debug;
-		};
-		1A63BD88134F5F72002EDFB4 /* Release */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = YES;
-				ARCHS = "$(NATIVE_ARCH_ACTUAL)";
-				COPY_PHASE_STRIP = YES;
-				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
-				FRAMEWORK_SEARCH_PATHS = /Library/Frameworks;
-				GCC_ENABLE_OBJC_EXCEPTIONS = YES;
-				ONLY_ACTIVE_ARCH = YES;
-				PRODUCT_NAME = "$(TARGET_NAME)";
-				TEST_AFTER_BUILD = YES;
-			};
-			name = Release;
-		};
-		1A63BDDB134F6234002EDFB4 /* Debug */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = YES;
-				ARCHS = "$(NATIVE_ARCH_ACTUAL)";
-				COPY_PHASE_STRIP = NO;
-				FRAMEWORK_SEARCH_PATHS = /Library/Frameworks;
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_OBJC_EXCEPTIONS = YES;
-				GCC_ENABLE_OBJC_GC = required;
-				ONLY_ACTIVE_ARCH = YES;
-				PRODUCT_NAME = "$(TARGET_NAME)";
-				TEST_AFTER_BUILD = YES;
-				USER_HEADER_SEARCH_PATHS = /Library/Frameworks;
-			};
-			name = Debug;
-		};
-		1A63BDDC134F6234002EDFB4 /* Release */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = YES;
-				ARCHS = "$(NATIVE_ARCH_ACTUAL)";
-				COPY_PHASE_STRIP = YES;
-				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
-				FRAMEWORK_SEARCH_PATHS = /Library/Frameworks;
-				GCC_ENABLE_OBJC_EXCEPTIONS = YES;
-				GCC_ENABLE_OBJC_GC = required;
-				ONLY_ACTIVE_ARCH = YES;
-				PRODUCT_NAME = "$(TARGET_NAME)";
-				TEST_AFTER_BUILD = YES;
-				USER_HEADER_SEARCH_PATHS = /Library/Frameworks;
-			};
-			name = Release;
-		};
-		1A63BE03134FB75F002EDFB4 /* Debug */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				ARCHS = "$(NATIVE_ARCH_ACTUAL)";
-				COPY_PHASE_STRIP = NO;
-				FRAMEWORK_SEARCH_PATHS = /Library/Frameworks;
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_OBJC_EXCEPTIONS = YES;
-				GCC_ENABLE_OBJC_GC = required;
-				ONLY_ACTIVE_ARCH = YES;
-				PRODUCT_NAME = "$(TARGET_NAME)";
-			};
-			name = Debug;
-		};
-		1A63BE04134FB75F002EDFB4 /* Release */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				ARCHS = "$(NATIVE_ARCH_ACTUAL)";
-				COPY_PHASE_STRIP = YES;
-				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
-				FRAMEWORK_SEARCH_PATHS = /Library/Frameworks;
-				GCC_ENABLE_OBJC_EXCEPTIONS = YES;
-				GCC_ENABLE_OBJC_GC = required;
-				ONLY_ACTIVE_ARCH = YES;
-				PRODUCT_NAME = "$(TARGET_NAME)";
-			};
-			name = Release;
-		};
-		1AE7233D134E860B001C3F35 /* Debug */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ARCHS = "$(ARCHS_STANDARD_32_BIT)";
-				GCC_C_LANGUAGE_STANDARD = gnu99;
-				GCC_ENABLE_OBJC_GC = supported;
-				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_PREPROCESSOR_DEFINITIONS = DEBUG;
-				GCC_SYMBOLS_PRIVATE_EXTERN = NO;
-				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
-				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
-				GCC_WARN_ABOUT_RETURN_TYPE = YES;
-				GCC_WARN_UNUSED_VARIABLE = YES;
-				HEADER_SEARCH_PATHS = /Library/Frameworks;
-				MACOSX_DEPLOYMENT_TARGET = 10.6;
-				ONLY_ACTIVE_ARCH = NO;
-				SDKROOT = macosx;
-				USER_HEADER_SEARCH_PATHS = /Library/Frameworks;
-				VALID_ARCHS = i386;
-			};
-			name = Debug;
-		};
-		1AE7233E134E860B001C3F35 /* Release */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ARCHS = "$(ARCHS_STANDARD_32_BIT)";
-				GCC_C_LANGUAGE_STANDARD = gnu99;
-				GCC_ENABLE_OBJC_GC = supported;
-				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
-				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
-				GCC_WARN_ABOUT_RETURN_TYPE = YES;
-				GCC_WARN_UNUSED_VARIABLE = YES;
-				HEADER_SEARCH_PATHS = /Library/Frameworks;
-				MACOSX_DEPLOYMENT_TARGET = 10.6;
-				ONLY_ACTIVE_ARCH = NO;
-				SDKROOT = macosx;
-				USER_HEADER_SEARCH_PATHS = /Library/Frameworks;
-				VALID_ARCHS = i386;
-			};
-			name = Release;
-		};
-		1AE72340134E860B001C3F35 /* Debug */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				ARCHS = "$(ARCHS_STANDARD_32_BIT)";
-				COPY_PHASE_STRIP = NO;
-				DYLIB_COMPATIBILITY_VERSION = 1;
-				DYLIB_CURRENT_VERSION = 1;
-				FRAMEWORK_VERSION = A;
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_OBJC_EXCEPTIONS = YES;
-				GCC_ENABLE_OBJC_GC = required;
-				GCC_PRECOMPILE_PREFIX_HEADER = YES;
-				GCC_PREFIX_HEADER = "ANTLR/ANTLR-Prefix.pch";
-				INFOPLIST_FILE = "ANTLR/ANTLR-Info.plist";
-				PRODUCT_NAME = "$(TARGET_NAME)";
-				VALID_ARCHS = i386;
-				WRAPPER_EXTENSION = framework;
-			};
-			name = Debug;
-		};
-		1AE72341134E860B001C3F35 /* Release */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				ARCHS = "$(ARCHS_STANDARD_32_BIT)";
-				COPY_PHASE_STRIP = YES;
-				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
-				DYLIB_COMPATIBILITY_VERSION = 1;
-				DYLIB_CURRENT_VERSION = 1;
-				FRAMEWORK_VERSION = A;
-				GCC_ENABLE_OBJC_EXCEPTIONS = YES;
-				GCC_ENABLE_OBJC_GC = required;
-				GCC_PRECOMPILE_PREFIX_HEADER = YES;
-				GCC_PREFIX_HEADER = "ANTLR/ANTLR-Prefix.pch";
-				INFOPLIST_FILE = "ANTLR/ANTLR-Info.plist";
-				PRODUCT_NAME = "$(TARGET_NAME)";
-				VALID_ARCHS = i386;
-				WRAPPER_EXTENSION = framework;
-			};
-			name = Release;
-		};
-		1AE72343134E860B001C3F35 /* Debug */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				COPY_PHASE_STRIP = NO;
-				FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks";
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_OBJC_EXCEPTIONS = YES;
-				GCC_PRECOMPILE_PREFIX_HEADER = YES;
-				GCC_PREFIX_HEADER = "ANTLRTests/ANTLRTests-Prefix.pch";
-				INFOPLIST_FILE = "ANTLRTests/ANTLRTests-Info.plist";
-				OTHER_LDFLAGS = (
-					"-framework",
-					SenTestingKit,
-				);
-				PRODUCT_NAME = "$(TARGET_NAME)";
-				WRAPPER_EXTENSION = octest;
-			};
-			name = Debug;
-		};
-		1AE72344134E860B001C3F35 /* Release */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				COPY_PHASE_STRIP = YES;
-				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
-				FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks";
-				GCC_ENABLE_OBJC_EXCEPTIONS = YES;
-				GCC_PRECOMPILE_PREFIX_HEADER = YES;
-				GCC_PREFIX_HEADER = "ANTLRTests/ANTLRTests-Prefix.pch";
-				INFOPLIST_FILE = "ANTLRTests/ANTLRTests-Info.plist";
-				OTHER_LDFLAGS = (
-					"-framework",
-					SenTestingKit,
-				);
-				PRODUCT_NAME = "$(TARGET_NAME)";
-				WRAPPER_EXTENSION = octest;
-			};
-			name = Release;
-		};
-/* End XCBuildConfiguration section */
-
-/* Begin XCConfigurationList section */
-		1A63BC67134F5DAC002EDFB4 /* Build configuration list for PBXNativeTarget "Fuzzy" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				1A63BC68134F5DAC002EDFB4 /* Debug */,
-				1A63BC69134F5DAC002EDFB4 /* Release */,
-			);
-			defaultConfigurationIsVisible = 0;
-			defaultConfigurationName = Release;
-		};
-		1A63BD38134F5F1E002EDFB4 /* Build configuration list for PBXNativeTarget "combined" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				1A63BD39134F5F1E002EDFB4 /* Debug */,
-				1A63BD3A134F5F1E002EDFB4 /* Release */,
-			);
-			defaultConfigurationIsVisible = 0;
-			defaultConfigurationName = Release;
-		};
-		1A63BD45134F5F36002EDFB4 /* Build configuration list for PBXNativeTarget "lexertest-simple" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				1A63BD46134F5F36002EDFB4 /* Debug */,
-				1A63BD47134F5F36002EDFB4 /* Release */,
-			);
-			defaultConfigurationIsVisible = 0;
-			defaultConfigurationName = Release;
-		};
-		1A63BD52134F5F43002EDFB4 /* Build configuration list for PBXNativeTarget "LL-start" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				1A63BD53134F5F43002EDFB4 /* Debug */,
-				1A63BD54134F5F43002EDFB4 /* Release */,
-			);
-			defaultConfigurationIsVisible = 0;
-			defaultConfigurationName = Release;
-		};
-		1A63BD5F134F5F4D002EDFB4 /* Build configuration list for PBXNativeTarget "polydiff" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				1A63BD60134F5F4D002EDFB4 /* Debug */,
-				1A63BD61134F5F4D002EDFB4 /* Release */,
-			);
-			defaultConfigurationIsVisible = 0;
-			defaultConfigurationName = Release;
-		};
-		1A63BD6C134F5F5E002EDFB4 /* Build configuration list for PBXNativeTarget "simplecTreeParser" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				1A63BD6D134F5F5E002EDFB4 /* Debug */,
-				1A63BD6E134F5F5E002EDFB4 /* Release */,
-			);
-			defaultConfigurationIsVisible = 0;
-			defaultConfigurationName = Release;
-		};
-		1A63BD79134F5F68002EDFB4 /* Build configuration list for PBXNativeTarget "treeparser" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				1A63BD7A134F5F68002EDFB4 /* Debug */,
-				1A63BD7B134F5F68002EDFB4 /* Release */,
-			);
-			defaultConfigurationIsVisible = 0;
-			defaultConfigurationName = Release;
-		};
-		1A63BD86134F5F72002EDFB4 /* Build configuration list for PBXNativeTarget "treerewrite" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				1A63BD87134F5F72002EDFB4 /* Debug */,
-				1A63BD88134F5F72002EDFB4 /* Release */,
-			);
-			defaultConfigurationIsVisible = 0;
-			defaultConfigurationName = Release;
-		};
-		1A63BDDA134F6234002EDFB4 /* Build configuration list for PBXNativeTarget "scopes" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				1A63BDDB134F6234002EDFB4 /* Debug */,
-				1A63BDDC134F6234002EDFB4 /* Release */,
-			);
-			defaultConfigurationIsVisible = 0;
-			defaultConfigurationName = Release;
-		};
-		1A63BE02134FB75F002EDFB4 /* Build configuration list for PBXNativeTarget "hoistedPredicates" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				1A63BE03134FB75F002EDFB4 /* Debug */,
-				1A63BE04134FB75F002EDFB4 /* Release */,
-			);
-			defaultConfigurationIsVisible = 0;
-			defaultConfigurationName = Release;
-		};
-		1AE72311134E860A001C3F35 /* Build configuration list for PBXProject "ANTLR" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				1AE7233D134E860B001C3F35 /* Debug */,
-				1AE7233E134E860B001C3F35 /* Release */,
-			);
-			defaultConfigurationIsVisible = 0;
-			defaultConfigurationName = Release;
-		};
-		1AE7233F134E860B001C3F35 /* Build configuration list for PBXNativeTarget "ANTLR" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				1AE72340134E860B001C3F35 /* Debug */,
-				1AE72341134E860B001C3F35 /* Release */,
-			);
-			defaultConfigurationIsVisible = 0;
-			defaultConfigurationName = Release;
-		};
-		1AE72342134E860B001C3F35 /* Build configuration list for PBXNativeTarget "ANTLRTests" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				1AE72343134E860B001C3F35 /* Debug */,
-				1AE72344134E860B001C3F35 /* Release */,
-			);
-			defaultConfigurationIsVisible = 0;
-			defaultConfigurationName = Release;
-		};
-/* End XCConfigurationList section */
-	};
-	rootObject = 1AE7230E134E860A001C3F35 /* Project object */;
-}
diff --git a/runtime/ObjC/Framework/ANTLR/ANTLR.xcodeproj/project.xcworkspace/xcuserdata/acondit.xcuserdatad/UserInterfaceState.xcuserstate b/runtime/ObjC/Framework/ANTLR/ANTLR.xcodeproj/project.xcworkspace/xcuserdata/acondit.xcuserdatad/UserInterfaceState.xcuserstate
deleted file mode 100644
index 03da13b..0000000
--- a/runtime/ObjC/Framework/ANTLR/ANTLR.xcodeproj/project.xcworkspace/xcuserdata/acondit.xcuserdatad/UserInterfaceState.xcuserstate
+++ /dev/null
@@ -1,99027 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>$archiver</key>
-	<string>NSKeyedArchiver</string>
-	<key>$objects</key>
-	<array>
-		<string>$null</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>6</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>7</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>8</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>9</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>10</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>11</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>12</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>13</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>14</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>15</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>16</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>17</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>18</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>19</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>20</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>21</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>22</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>23</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>24</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>25</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>26</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>27</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>28</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>29</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>30</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>31</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>32</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>33</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>34</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>35</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>36</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>37</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>38</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>39</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>40</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>41</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>222</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>309</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>395</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>471</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>636</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>764</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>824</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>884</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>964</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1044</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1104</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1204</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1264</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1324</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1403</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1463</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1530</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1587</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1644</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1704</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1787</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1871</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3031</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4325</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4382</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4453</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4530</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4590</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4667</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4724</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4801</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4861</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4940</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4997</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5076</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5133</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5190</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5274</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>8B8DDC6B-DDE2-4247-8F0D-A06E0D4B2DBD</string>
-		<string>3E880256-37A7-45EE-9711-6A7B5B8E709E</string>
-		<string>2A0687CA-9E09-43DA-AAB4-66AB0EF9AB0D</string>
-		<string>267DE2B3-8A97-43DB-B258-865995C3291E</string>
-		<string>9869D367-F4FF-47E1-9F0B-EC2129F3C250</string>
-		<string>C5B8F73C-C719-4392-B73A-2E9BC23A265E</string>
-		<string>2060A434-A276-41E2-9ADB-28BB1B8C65B3</string>
-		<string>51912CD1-86C0-4E43-BF83-A46B6AEE9BB9</string>
-		<string>33B3EA90-9D12-4F88-A34B-E2B32A707D40</string>
-		<string>984062D3-D917-4552-92A9-E57F4A3BA955</string>
-		<string>F7CA7E77-5E1E-4D51-B349-95E0260321DE</string>
-		<string>6EC9948E-0F92-459C-AF9D-782DA9D80829</string>
-		<string>DDBEAFBD-8E5A-4C34-83BD-2C4637025539</string>
-		<string>DDC0C46D-96FA-46F0-84C0-8E712DE1EB6A</string>
-		<string>B9397168-C6E4-4B33-9B07-E4E7C78BB1F5</string>
-		<string>2DE3D2D0-EE66-4B5F-8EAD-32D8585B9607</string>
-		<string>C345EBB9-FE8A-47EB-AA26-842A6A8726A3</string>
-		<string>BD9F3C49-0864-4BF6-8624-E3FE059EC4B3</string>
-		<string>8916566A-4F13-46CD-B79C-3C921EEE7D49</string>
-		<string>1F68007A-BC1A-4A45-B3EB-7C585A74C0C8</string>
-		<string>AED3ECB9-6F72-47B5-83EB-D9ED381ACAD7</string>
-		<string>65F4C6DD-94DD-44AD-8D8F-22A5797CE3AE</string>
-		<string>IDEWorkspaceDocument</string>
-		<string>94527DF4-8A4A-4B44-A86F-9E177764020F</string>
-		<string>787499DC-17C3-4BB8-94ED-F5F4A0D91345</string>
-		<string>36E20E99-C4B5-4408-9469-AD3DBB319BE0</string>
-		<string>97C4F628-88C1-41B1-9AC9-DF72045A615B</string>
-		<string>228B9835-EB0C-47C4-AF0C-562AE82B00DD</string>
-		<string>38E9C286-2E78-48F4-BE55-7F0891FDBB6A</string>
-		<string>6ABB3AFD-D548-4BC7-8153-8135D4962AA6</string>
-		<string>73A1D02F-4ED6-4C89-82A1-AD3DCB688C00</string>
-		<string>FE7B2FCF-EF2F-4DEB-8DE2-36A865A2803C</string>
-		<string>1A2E2AE9-7B63-407A-8A8F-B5149057CDD7</string>
-		<string>F47E26E1-DE28-455F-98EF-EA339320AD36</string>
-		<string>9B93B8C8-2C83-499A-AA57-E9AB210F54F5</string>
-		<string>827C8A69-A567-412B-A2F1-1FC135ED4231</string>
-		<string>9525D734-BB03-4B02-BF0B-2B807EC3DF3B</string>
-		<string>D005C949-00BD-483D-8EFC-E251FE97FA2B</string>
-		<string>C25840B0-EB05-42A5-84AC-811CFB8C95FC</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>42</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>43</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>44</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>45</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>46</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>47</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>46</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>49</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>50</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>221</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEWindowToolbarIsVisible</string>
-		<string>IDEActiveWorkspaceTabController</string>
-		<string>IDEWindowFrame</string>
-		<string>IDEWorkspaceWindowControllerUniqueIdentifier</string>
-		<string>IDEWorkspaceTabController_CC7ABA9A-DE2E-4A35-BE25-9FFBEFB51B96</string>
-		<string>IDEOrderedWorkspaceTabControllers</string>
-		<false/>
-		<string>{{142, 337}, {600, 646}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>51</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>52</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>53</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>54</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>57</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>58</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>59</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>61</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>172</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>205</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>212</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDETabLabel</string>
-		<string>AssistantEditorsLayout</string>
-		<string>IDEShowNavigator</string>
-		<string>IDEShowUtilities</string>
-		<string>IDEEditorArea</string>
-		<string>IDENavigatorArea</string>
-		<string>IDEWorkspaceTabControllerUtilityAreaSplitView</string>
-		<string>IDEWorkspaceTabControllerDesignAreaSplitView</string>
-		<string>ANTLRUnbufferedCommonTreeNodeStream.m</string>
-		<integer>0</integer>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>62</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>63</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>64</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>65</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>66</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>67</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>68</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>69</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>70</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>72</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>104</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>125</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>DefaultPersistentRepresentations</string>
-		<string>IDEEDitorArea_DebugArea</string>
-		<string>layoutTree</string>
-		<string>IDEEditorMode_Standard</string>
-		<string>ShowDebuggerArea</string>
-		<string>EditorMode</string>
-		<string>DebuggerSplitView</string>
-		<string>IDEShowEditor</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$classes</key>
-			<array>
-				<string>NSMutableDictionary</string>
-				<string>NSDictionary</string>
-				<string>NSObject</string>
-			</array>
-			<key>$classname</key>
-			<string>NSMutableDictionary</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>73</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>74</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>75</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>76</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>77</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>78</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>79</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>92</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>99</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>102</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEDebugArea_SplitView</string>
-		<string>IDEDebuggerAreaSplitView</string>
-		<string>LayoutMode</string>
-		<string>LayoutFocusMode</string>
-		<string>variables</string>
-		<string>console</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>81</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>DVTSplitViewItems</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>82</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>88</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>86</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>DVTIdentifier</string>
-		<string>DVTViewMagnitude</string>
-		<string>VariablesView</string>
-		<real>298</real>
-		<dict>
-			<key>$classes</key>
-			<array>
-				<string>NSDictionary</string>
-				<string>NSObject</string>
-			</array>
-			<key>$classname</key>
-			<string>NSDictionary</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>90</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>ConsoleArea</string>
-		<real>301</real>
-		<dict>
-			<key>$classes</key>
-			<array>
-				<string>NSMutableArray</string>
-				<string>NSArray</string>
-				<string>NSObject</string>
-			</array>
-			<key>$classname</key>
-			<string>NSMutableArray</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>93</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>94</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>96</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>95</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>97</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<integer>1</integer>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>100</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>101</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>DBGVariablesViewFilterMode</string>
-		<integer>2</integer>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>103</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>ConsoleFilterMode</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>124</integer>
-			</dict>
-			<key>geniusEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>primaryEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>105</integer>
-			</dict>
-			<key>rootLayoutTreeNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>121</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>1</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>106</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>121</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>116</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>107</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>108</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>60</integer>
-			</dict>
-		</dict>
-		<string>Xcode.IDENavigableItemDomain.WorkspaceStructure</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>109</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>111</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>113</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>59</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$classes</key>
-			<array>
-				<string>IDEArchivableStringIndexPair</string>
-				<string>NSObject</string>
-			</array>
-			<key>$classname</key>
-			<string>IDEArchivableStringIndexPair</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>112</integer>
-			</dict>
-		</dict>
-		<string>Classes</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>114</integer>
-			</dict>
-		</dict>
-		<string>ANTLR</string>
-		<dict>
-			<key>$classes</key>
-			<array>
-				<string>NSArray</string>
-				<string>NSObject</string>
-			</array>
-			<key>$classname</key>
-			<string>NSArray</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>119</integer>
-			</dict>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>117</integer>
-			</dict>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRUnbufferedCommonTreeNodeStream.m</string>
-		</dict>
-		<dict>
-			<key>$classes</key>
-			<array>
-				<string>NSMutableString</string>
-				<string>NSString</string>
-				<string>NSObject</string>
-			</array>
-			<key>$classname</key>
-			<string>NSMutableString</string>
-		</dict>
-		<dict>
-			<key>$classes</key>
-			<array>
-				<string>DVTDocumentLocation</string>
-				<string>NSObject</string>
-			</array>
-			<key>$classname</key>
-			<string>DVTDocumentLocation</string>
-		</dict>
-		<dict>
-			<key>$classes</key>
-			<array>
-				<string>IDENavigableItemArchivableRepresentation</string>
-				<string>NSObject</string>
-			</array>
-			<key>$classname</key>
-			<string>IDENavigableItemArchivableRepresentation</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>122</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>0</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>105</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$classes</key>
-			<array>
-				<string>IDEWorkspaceTabControllerLayoutTreeNode</string>
-				<string>NSObject</string>
-			</array>
-			<key>$classname</key>
-			<string>IDEWorkspaceTabControllerLayoutTreeNode</string>
-		</dict>
-		<dict>
-			<key>$classes</key>
-			<array>
-				<string>IDEWorkspaceTabControllerLayoutTree</string>
-				<string>NSObject</string>
-			</array>
-			<key>$classname</key>
-			<string>IDEWorkspaceTabControllerLayoutTree</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>126</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>127</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>EditorLayout_PersistentRepresentation</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>128</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>129</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>Main</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>130</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>131</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>132</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>133</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>161</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>EditorLayout_StateSavingStateDictionaries</string>
-		<string>EditorLayout_Selected</string>
-		<string>EditorLayout_Geometry</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>134</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>135</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>136</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>137</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>138</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>139</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>140</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>141</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>142</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>143</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>144</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>59</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>152</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>153</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>156</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>DocumentExtensionIdentifier</string>
-		<string>NavigableItemName</string>
-		<string>EditorState</string>
-		<string>DocumentNavigableItemName</string>
-		<string>FileDataType</string>
-		<string>DocumentURL</string>
-		<string>ArchivableRepresentation</string>
-		<string>Xcode.IDEKit.EditorDocument.SourceCode</string>
-		<string>@implementation ANTLRUnbufferedCommonTreeNodeStream</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>149</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>150</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>151</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>HideAllIssues</string>
-		<string>PrimaryDocumentTimestamp</string>
-		<string>PrimaryDocumentVisibleCharacterRange</string>
-		<string>PrimaryDocumentSelectedCharacterRange</string>
-		<real>324417698.23469198</real>
-		<string>{0, 1992}</string>
-		<string>{1697, 0}</string>
-		<string>public.objective-c-source</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>154</integer>
-			</dict>
-		</dict>
-		<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRUnbufferedCommonTreeNodeStream.m</string>
-		<dict>
-			<key>$classes</key>
-			<array>
-				<string>NSURL</string>
-				<string>NSObject</string>
-			</array>
-			<key>$classname</key>
-			<string>NSURL</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>116</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>107</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>157</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>60</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>160</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>59</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>112</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>114</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>162</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>{{0, 0}, {600, 600}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>164</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>165</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>168</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>166</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>167</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEEditor</string>
-		<real>203</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>169</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>170</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEDebuggerArea</string>
-		<real>115</real>
-		<true/>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>173</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>174</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>175</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>176</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>188</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>174</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>Xcode.IDEKit.Navigator.Structure</string>
-		<string>Xcode.IDEKit.Navigator.Issues</string>
-		<string>SelectedNavigator</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>178</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>179</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>180</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>182</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>183</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>184</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>185</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDESelectedObjects</string>
-		<string>IDEUnsavedDocumentFilteringEnabled</string>
-		<string>IDESCMStatusFilteringEnabled</string>
-		<string>IDERecentDocumentFilteringEnabled</string>
-		<string>IDEVisibleRect</string>
-		<string>IDENavigatorExpandedItemsBeforeFilteringSet</string>
-		<string>IDEExpandedItemsSet</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>{{0, 0}, {259, 832}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>187</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$classes</key>
-			<array>
-				<string>NSSet</string>
-				<string>NSObject</string>
-			</array>
-			<key>$classname</key>
-			<string>NSSet</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>189</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>190</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>191</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>192</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>193</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>194</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>195</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>196</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>197</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>198</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>200</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>201</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>202</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>203</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>204</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEErrorFilteringEnabled</string>
-		<string>IDECollapsedGroups</string>
-		<string>IDEExpandedIssues</string>
-		<string>IDECollapsedFiles</string>
-		<string>IDERecentFilteringEnabled</string>
-		<string>IDEShowsByType</string>
-		<string>IDECollapsedTypes</string>
-		<string>IDESelectedNavigables</string>
-		<string>IDESchemeFilteringEnabled</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$classes</key>
-			<array>
-				<string>NSMutableSet</string>
-				<string>NSSet</string>
-				<string>NSObject</string>
-			</array>
-			<key>$classname</key>
-			<string>NSMutableSet</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>{{0, 0}, {0, 0}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>206</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>207</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>210</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>209</integer>
-				</dict>
-			</array>
-		</dict>
-		<string></string>
-		<real>377</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>211</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>223</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>213</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>214</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>216</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>218</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>215</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>586</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>217</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>987</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>219</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>220</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEUtilitiesArea</string>
-		<real>354</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>46</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>47</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>44</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>43</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>42</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>45</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>223</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>224</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>225</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>223</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>226</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEWorkspaceTabController_1F24F9E0-9508-47FA-913F-2D38EC4B42F9</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>223</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>{{205, 359}, {600, 646}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>51</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>52</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>53</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>54</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>57</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>58</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>227</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>228</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>285</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>295</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>301</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>SimpleCTP.h</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>62</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>63</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>64</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>65</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>66</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>67</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>68</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>69</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>229</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>230</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>245</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>259</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>279</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>73</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>74</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>75</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>76</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>77</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>78</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>231</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>237</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>243</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>244</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>232</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>233</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>235</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>234</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>236</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>238</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>239</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>241</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>240</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>242</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>100</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>101</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>103</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>124</integer>
-			</dict>
-			<key>geniusEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>primaryEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>246</integer>
-			</dict>
-			<key>rootLayoutTreeNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>257</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>1</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>247</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>257</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>255</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>107</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>248</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>60</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>249</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>250</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>252</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>254</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>227</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>251</integer>
-			</dict>
-		</dict>
-		<string>simplecTreeParser</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>253</integer>
-			</dict>
-		</dict>
-		<string>examples</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>114</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>119</integer>
-			</dict>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>256</integer>
-			</dict>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>258</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>0</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>246</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>126</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>260</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>128</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>261</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>130</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>131</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>132</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>262</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>278</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>263</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>135</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>136</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>137</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>138</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>139</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>140</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>141</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>142</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>264</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>265</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>227</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>269</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>270</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>272</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>EOF</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>266</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>267</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>268</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323990081.71608299</real>
-		<string>{0, 1023}</string>
-		<string>{574, 0}</string>
-		<string>public.c-header</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>271</integer>
-			</dict>
-		</dict>
-		<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.h</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>255</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>107</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>273</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>60</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>274</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>275</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>276</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>277</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>227</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>251</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>253</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>114</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>162</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>280</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>281</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>283</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>166</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>282</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>203</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>169</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>284</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>115</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>173</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>175</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>286</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>287</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>286</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>288</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>Xcode.IDEKit.Navigator.Logs</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>178</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>179</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>180</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>182</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>183</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>184</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>185</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>289</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>290</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>291</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>292</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>202</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>293</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>294</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDELogNavigatorVisibleRectStateKey</string>
-		<string>IDELogNavigatorSelectedObjectsStateKey</string>
-		<string>IDELogNavigatorExpandedItemsStateKey</string>
-		<string>IDELogNavigatorRecentFilterStateKey</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>296</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>297</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>299</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>298</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>377</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>300</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>223</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>302</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>303</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>305</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>307</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>304</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>457</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>306</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>1116</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>219</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>308</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>354</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>42</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>43</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>44</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>45</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>310</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>47</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>310</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>311</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>312</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>394</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEWorkspaceTabController_66D45BE6-C0B4-41C3-B7F3-D54D52CBDC48</string>
-		<string>{{163, 316}, {600, 668}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>51</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>52</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>53</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>54</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>57</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>58</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>313</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>314</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>368</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>380</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>386</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>main.m</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>62</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>63</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>64</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>65</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>66</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>67</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>68</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>69</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>315</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>316</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>331</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>344</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>362</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>73</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>74</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>75</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>76</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>77</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>78</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>317</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>323</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>329</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>330</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>318</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>319</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>321</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>320</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>322</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>324</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>325</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>327</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>326</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>328</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>100</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>101</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>103</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>124</integer>
-			</dict>
-			<key>geniusEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>primaryEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>332</integer>
-			</dict>
-			<key>rootLayoutTreeNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>342</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>1</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>333</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>342</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>340</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>107</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>334</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>60</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>335</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>336</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>338</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>339</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>313</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>337</integer>
-			</dict>
-		</dict>
-		<string>treeparser</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>253</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>114</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>119</integer>
-			</dict>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>341</integer>
-			</dict>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/treeparser/main.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>343</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>0</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>332</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>126</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>345</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>128</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>346</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>130</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>131</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>132</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>347</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>361</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>348</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>141</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>135</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>137</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>138</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>139</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>140</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>136</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>349</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>142</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>355</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>313</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>152</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>359</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>313</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>340</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>107</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>350</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>60</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>351</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>352</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>353</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>354</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>313</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>337</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>253</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>114</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>356</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>357</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>358</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323993967.40714198</real>
-		<string>{217, 1612}</string>
-		<string>{0, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>360</integer>
-			</dict>
-		</dict>
-		<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/treeparser/main.m</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>162</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>363</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>364</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>366</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>166</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>365</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>203</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>169</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>367</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>115</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>173</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>175</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>369</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>173</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>178</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>179</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>180</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>182</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>183</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>370</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>202</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>372</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>371</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>114</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>253</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>337</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>313</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>187</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>373</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>374</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>375</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>376</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>378</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>114</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>114</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>253</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>114</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>253</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>337</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>114</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>253</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>377</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>treerewrite</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>114</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>379</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>Frameworks</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>381</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>382</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>384</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>383</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>399</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>385</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>223</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>387</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>388</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>390</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>392</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>389</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>457</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>391</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>1116</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>219</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>393</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>354</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>310</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>42</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>43</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>44</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>45</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>396</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>47</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>396</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>397</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>398</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>470</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEWorkspaceTabController_789FE7FF-C37B-4DAE-8869-39BFB0787273</string>
-		<string>{{226, 336}, {600, 646}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>51</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>52</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>53</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>54</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>57</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>58</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>399</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>400</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>451</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>456</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>462</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>Build LL-start</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>62</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>63</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>64</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>65</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>66</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>67</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>68</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>69</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>401</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>402</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>417</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>429</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>445</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>73</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>74</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>75</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>76</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>77</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>78</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>403</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>409</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>415</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>416</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>404</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>405</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>407</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>406</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>408</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>410</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>411</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>413</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>412</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>414</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>100</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>101</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>103</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>124</integer>
-			</dict>
-			<key>geniusEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>primaryEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>418</integer>
-			</dict>
-			<key>rootLayoutTreeNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>427</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>1</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>419</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>427</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>425</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>420</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>421</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>424</integer>
-			</dict>
-		</dict>
-		<string>Xcode.IDENavigableItem.WorkspaceLogsDomain</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>422</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>423</integer>
-			</dict>
-		</dict>
-		<string>Build LL-start : 2:21:49 PM</string>
-		<integer>2147483647</integer>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>119</integer>
-			</dict>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>426</integer>
-			</dict>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<string>x-xcode-log://CF33AB74-A9A8-4346-8979-13E89E7154B5</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>428</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>0</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>418</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>126</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>430</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>128</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>431</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>130</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>131</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>132</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>432</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>444</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>433</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>135</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>136</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>137</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>138</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>139</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>140</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>141</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>434</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>423</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>435</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>423</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>437</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>438</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>439</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>Xcode.IDEKit.EditorDocument.LogDocument</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>436</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>184</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>SelectedDocumentLocations</string>
-		<string>com.apple.dt.IDE.BuildLogContentType</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>426</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>443</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>420</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>440</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>442</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>441</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>423</integer>
-			</dict>
-		</dict>
-		<integer>2147483647</integer>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>119</integer>
-			</dict>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>426</integer>
-			</dict>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>162</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>446</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>447</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>449</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>166</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>448</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>203</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>169</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>450</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>115</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>173</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>175</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>286</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>452</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>286</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>453</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>178</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>179</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>180</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>182</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>183</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>184</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>185</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>289</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>290</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>291</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>292</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>202</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>454</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>455</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>457</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>458</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>460</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>459</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>377</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>461</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>223</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>463</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>464</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>466</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>468</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>465</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>457</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>467</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>1116</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>219</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>469</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>354</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>396</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>472</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>473</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>474</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>475</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>476</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>477</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>476</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>478</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>6</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>479</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>635</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEWindowToolbarIsVisible</string>
-		<string>IDEActiveWorkspaceTabController</string>
-		<string>IDEWindowFrame</string>
-		<string>IDEWorkspaceWindowControllerUniqueIdentifier</string>
-		<string>IDEWorkspaceTabController_976F992C-63EB-4603-83E4-98D2941DDB9F</string>
-		<string>IDEOrderedWorkspaceTabControllers</string>
-		<string>{{205, 242}, {1127, 763}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>480</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>481</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>482</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>483</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>484</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>485</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>486</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>487</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>488</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>489</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>588</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>619</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>626</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDETabLabel</string>
-		<string>AssistantEditorsLayout</string>
-		<string>IDEShowNavigator</string>
-		<string>IDEShowUtilities</string>
-		<string>IDEEditorArea</string>
-		<string>IDENavigatorArea</string>
-		<string>IDEWorkspaceTabControllerUtilityAreaSplitView</string>
-		<string>IDEWorkspaceTabControllerDesignAreaSplitView</string>
-		<string>ANTLRTreeRewriter.m</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>490</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>491</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>492</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>493</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>494</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>495</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>496</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>497</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>498</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>499</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>527</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>542</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>580</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>DefaultPersistentRepresentations</string>
-		<string>IDEEDitorArea_DebugArea</string>
-		<string>layoutTree</string>
-		<string>IDEEditorMode_Standard</string>
-		<string>ShowDebuggerArea</string>
-		<string>EditorMode</string>
-		<string>DebuggerSplitView</string>
-		<string>IDEShowEditor</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>500</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>501</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>502</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>503</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>504</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>505</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>506</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>517</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>523</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>525</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEDebugArea_SplitView</string>
-		<string>IDEDebuggerAreaSplitView</string>
-		<string>LayoutMode</string>
-		<string>LayoutFocusMode</string>
-		<string>variables</string>
-		<string>console</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>507</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>508</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>DVTSplitViewItems</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>509</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>514</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>512</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>513</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>DVTIdentifier</string>
-		<string>DVTViewMagnitude</string>
-		<string>VariablesView</string>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>515</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>516</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>ConsoleArea</string>
-		<real>828</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>507</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>518</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>519</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>521</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>512</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>520</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>515</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>522</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>828</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>524</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>101</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>DBGVariablesViewFilterMode</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>526</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>ConsoleFilterMode</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>124</integer>
-			</dict>
-			<key>geniusEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>primaryEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>528</integer>
-			</dict>
-			<key>rootLayoutTreeNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>540</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>1</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>529</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>540</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>538</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>530</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>531</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>60</integer>
-			</dict>
-		</dict>
-		<string>Xcode.IDENavigableItemDomain.WorkspaceStructure</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>532</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>534</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>536</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>533</integer>
-			</dict>
-		</dict>
-		<string>ANTLRTreeRewriter.m</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>535</integer>
-			</dict>
-		</dict>
-		<string>Classes</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>537</integer>
-			</dict>
-		</dict>
-		<string>ANTLR</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>119</integer>
-			</dict>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>539</integer>
-			</dict>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/antlr3-main/runtime/ObjC/Framework/ANTLRTreeRewriter.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>541</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>0</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>528</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>543</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>544</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>EditorLayout_PersistentRepresentation</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>545</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>546</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>Main</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>547</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>548</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>549</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>550</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>578</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>EditorLayout_StateSavingStateDictionaries</string>
-		<string>EditorLayout_Selected</string>
-		<string>EditorLayout_Geometry</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>551</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>552</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>553</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>554</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>555</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>556</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>557</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>558</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>559</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>560</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>566</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>533</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>574</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>575</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>577</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>NavigableItemName</string>
-		<string>ArchivableRepresentation</string>
-		<string>EditorState</string>
-		<string>DocumentNavigableItemName</string>
-		<string>FileDataType</string>
-		<string>DocumentURL</string>
-		<string>DocumentExtensionIdentifier</string>
-		<string>-applyOnce:Rule:</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>538</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>530</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>561</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>60</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>562</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>563</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>564</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>533</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>535</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>565</integer>
-			</dict>
-		</dict>
-		<string>ANTLR</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>567</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>568</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>569</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>570</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>571</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>572</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>573</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>PrimaryDocumentTimestamp</string>
-		<string>HideAllIssues</string>
-		<string>PrimaryDocumentVisibleCharacterRange</string>
-		<string>PrimaryDocumentSelectedCharacterRange</string>
-		<real>324441057.59489697</real>
-		<string>{3432, 2012}</string>
-		<string>{4860, 0}</string>
-		<string>public.objective-c-source</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>576</integer>
-			</dict>
-		</dict>
-		<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/antlr3-main/runtime/ObjC/Framework/ANTLRTreeRewriter.m</string>
-		<string>Xcode.IDEKit.EditorDocument.SourceCode</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>579</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>{{0, 0}, {1127, 717}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>507</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>581</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>582</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>585</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>583</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>584</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEEditor</string>
-		<real>203</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>586</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>587</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEDebuggerArea</string>
-		<real>115</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>589</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>590</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>591</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>592</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>602</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>590</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>Xcode.IDEKit.Navigator.Structure</string>
-		<string>Xcode.IDEKit.Navigator.Issues</string>
-		<string>SelectedNavigator</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>593</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>594</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>595</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>596</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>597</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>598</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>599</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>600</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>601</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDESelectedObjects</string>
-		<string>IDEUnsavedDocumentFilteringEnabled</string>
-		<string>IDESCMStatusFilteringEnabled</string>
-		<string>IDERecentDocumentFilteringEnabled</string>
-		<string>IDEVisibleRect</string>
-		<string>IDENavigatorExpandedItemsBeforeFilteringSet</string>
-		<string>IDEExpandedItemsSet</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>{{0, 0}, {259, 832}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>603</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>604</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>605</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>606</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>607</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>608</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>609</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>610</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>611</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>612</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>613</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>614</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>615</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>616</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>617</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>618</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEErrorFilteringEnabled</string>
-		<string>IDECollapsedGroups</string>
-		<string>IDEExpandedIssues</string>
-		<string>IDECollapsedFiles</string>
-		<string>IDEVisibleRect</string>
-		<string>IDERecentFilteringEnabled</string>
-		<string>IDEShowsByType</string>
-		<string>IDECollapsedTypes</string>
-		<string>IDESelectedNavigables</string>
-		<string>IDESchemeFilteringEnabled</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>{{0, 0}, {0, 0}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>507</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>620</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>621</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>624</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>622</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>623</integer>
-				</dict>
-			</array>
-		</dict>
-		<string></string>
-		<real>506</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>622</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>625</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>211</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>507</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>627</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>628</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>630</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>632</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>485</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>629</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>260</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>484</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>631</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>982</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>633</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>634</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEUtilitiesArea</string>
-		<real>340</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>476</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>42</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>43</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>44</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>45</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>637</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>47</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>637</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>638</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>7</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>639</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>184</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEWorkspaceTabController_DD922F63-58E5-4424-9493-5E8068570F13</string>
-		<string>{{118, -179}, {1400, 974}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>51</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>52</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>53</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>54</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>57</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>58</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>640</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>641</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>741</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>750</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>756</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>ANTLRTree.h</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>62</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>63</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>64</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>65</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>66</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>67</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>642</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>68</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>69</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>643</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>644</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>659</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>683</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>701</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>735</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEEditorMode_Genius</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>73</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>74</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>75</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>76</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>77</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>78</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>645</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>651</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>657</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>658</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>646</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>647</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>649</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>648</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>330</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>650</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>549</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>652</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>653</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>655</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>654</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>330</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>656</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>549</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>100</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>101</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>103</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>124</integer>
-			</dict>
-			<key>geniusEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>670</integer>
-			</dict>
-			<key>primaryEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>660</integer>
-			</dict>
-			<key>rootLayoutTreeNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>668</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>1</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>661</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>668</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>666</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>107</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>662</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>60</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>663</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>664</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>665</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>640</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>112</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>114</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>119</integer>
-			</dict>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>667</integer>
-			</dict>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRTree.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>669</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>0</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>660</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>670</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>671</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>0</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>1</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>668</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>672</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>2</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>673</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>670</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>681</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>674</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>60</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>675</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>678</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>676</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>677</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>navigableItem_name</string>
-		<string>ANTLRTree.m</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>679</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>680</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>identifier</string>
-		<string>Xcode.IDEKit.GeniusCategory.Counterparts</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>119</integer>
-			</dict>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>682</integer>
-			</dict>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRTree.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>126</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>684</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>128</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>685</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>130</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>131</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>132</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>686</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>699</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>687</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>136</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>141</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>137</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>138</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>139</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>140</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>135</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>640</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>688</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>693</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>640</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>269</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>697</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>142</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>666</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>107</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>689</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>60</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>690</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>691</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>692</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>640</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>112</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>114</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>694</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>695</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>696</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323919127.41417199</real>
-		<string>{0, 2668}</string>
-		<string>{1505, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>698</integer>
-			</dict>
-		</dict>
-		<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRTree.h</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>700</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>{{0, 0}, {880, 876}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>126</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>702</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>703</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>734</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>SplitPosition</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>128</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>704</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>705</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>719</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>Alternate</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>130</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>131</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>132</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>706</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>718</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>707</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>136</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>141</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>137</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>138</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>139</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>140</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>135</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>708</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>709</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>714</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>640</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>269</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>717</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>142</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>@protocol ANTLRTree</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>666</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>107</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>710</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>60</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>711</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>712</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>713</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>640</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>112</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>114</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>715</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>716</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>696</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323919130.07890499</real>
-		<string>{382, 1955}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>698</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>700</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>130</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>131</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>132</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>720</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>732</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>721</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>136</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>141</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>137</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>138</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>139</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>140</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>135</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>677</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>722</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>726</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>677</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>152</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>730</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>142</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>681</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>723</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>60</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>724</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>725</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>676</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>677</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>679</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>680</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>727</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>728</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>729</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323919130.07915699</real>
-		<string>{825, 1423}</string>
-		<string>{3330, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>731</integer>
-			</dict>
-		</dict>
-		<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRTree.m</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>733</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>{{0, 0}, {439, 876}}</string>
-		<real>0.5</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>736</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>737</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>739</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>166</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>738</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>203</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>169</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>740</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>115</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>173</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>174</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>175</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>742</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>743</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>174</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>178</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>179</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>180</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>182</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>183</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>184</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>185</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>189</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>190</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>191</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>192</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>193</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>194</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>195</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>196</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>197</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>744</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>745</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>746</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>747</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>748</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>749</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>{{0, 0}, {244, 810}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>751</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>752</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>754</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>753</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>665</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>755</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>211</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>757</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>758</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>760</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>762</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>759</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>260</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>761</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>880</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>219</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>763</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>260</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>42</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>43</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>44</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>45</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>765</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>47</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>765</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>766</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>8</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>767</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>823</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEWorkspaceTabController_F5D326C0-04C4-47F6-8741-20A565897CC8</string>
-		<string>{{140, 349}, {240, 646}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>52</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>53</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>54</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>57</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>58</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>768</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>801</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>809</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>815</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>62</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>63</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>64</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>65</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>66</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>67</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>68</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>69</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>769</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>770</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>785</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>789</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>795</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>73</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>74</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>75</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>76</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>77</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>78</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>771</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>777</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>783</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>784</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>772</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>773</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>775</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>774</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>776</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>778</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>779</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>781</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>780</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>782</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>100</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>101</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>103</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>124</integer>
-			</dict>
-			<key>geniusEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>primaryEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>786</integer>
-			</dict>
-			<key>rootLayoutTreeNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>787</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>1</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>787</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>788</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>0</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>786</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>126</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>790</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>128</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>791</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>130</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>131</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>132</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>792</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>794</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>793</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>162</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>796</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>797</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>799</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>166</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>798</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>203</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>169</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>800</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>115</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>173</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>174</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>175</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>802</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>803</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>174</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>178</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>179</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>180</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>182</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>183</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>184</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>185</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>189</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>190</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>191</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>192</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>193</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>194</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>195</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>196</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>197</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>804</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>805</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>806</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>202</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>807</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>808</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>810</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>811</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>813</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>812</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>389</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>814</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>211</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>816</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>817</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>819</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>821</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>818</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>661</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>820</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>921</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>219</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>822</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>354</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>765</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>825</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>44</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>43</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>42</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>45</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>47</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>826</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>882</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>825</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>9</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>883</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEWorkspaceTabController_932DCD76-57BC-4F32-BB6F-2C5F20724E0A</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>52</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>53</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>54</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>57</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>58</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>827</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>860</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>868</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>874</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>62</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>63</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>64</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>65</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>66</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>67</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>68</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>69</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>828</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>829</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>844</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>848</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>854</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>73</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>74</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>75</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>76</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>77</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>78</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>830</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>836</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>842</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>843</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>831</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>832</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>834</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>833</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>835</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>837</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>838</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>840</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>839</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>841</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>100</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>101</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>103</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>124</integer>
-			</dict>
-			<key>geniusEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>primaryEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>845</integer>
-			</dict>
-			<key>rootLayoutTreeNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>846</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>1</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>846</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>847</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>0</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>845</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>126</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>849</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>128</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>850</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>130</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>131</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>132</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>851</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>853</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>852</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>162</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>855</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>856</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>858</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>166</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>857</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>203</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>169</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>859</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>115</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>173</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>174</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>175</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>861</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>862</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>174</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>178</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>179</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>180</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>182</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>183</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>184</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>185</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>189</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>190</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>191</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>192</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>193</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>194</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>195</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>196</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>197</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>863</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>864</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>865</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>202</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>866</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>867</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>869</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>870</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>872</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>871</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>389</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>873</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>211</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>875</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>876</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>878</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>880</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>877</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>277</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>879</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>810</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>219</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>881</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>354</real>
-		<string>{{14, 359}, {240, 646}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>825</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>42</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>43</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>44</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>45</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>885</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>47</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>885</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>886</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>10</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>887</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>963</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEWorkspaceTabController_E1713161-A393-4544-8845-403A2045B239</string>
-		<string>{{18, 382}, {600, 646}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>51</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>52</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>53</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>54</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>57</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>58</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>888</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>889</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>944</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>949</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>955</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>SimpleCTP.m</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>62</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>63</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>64</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>65</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>66</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>67</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>68</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>69</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>890</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>891</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>906</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>918</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>938</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>73</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>74</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>75</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>76</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>77</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>78</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>892</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>898</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>904</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>905</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>893</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>894</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>896</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>895</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>897</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>899</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>900</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>902</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>901</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>903</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>100</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>101</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>103</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>124</integer>
-			</dict>
-			<key>geniusEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>primaryEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>907</integer>
-			</dict>
-			<key>rootLayoutTreeNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>916</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>1</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>908</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>916</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>914</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>107</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>909</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>60</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>910</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>911</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>912</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>913</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>888</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>251</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>253</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>114</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>119</integer>
-			</dict>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>915</integer>
-			</dict>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>917</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>0</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>907</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>126</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>919</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>128</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>920</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>130</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>131</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>132</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>921</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>936</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>922</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>135</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>136</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>137</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>138</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>139</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>140</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>141</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>142</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>923</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>924</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>888</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>152</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>928</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>930</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>-atom</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>925</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>926</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>927</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323991249.92976499</real>
-		<string>{21219, 1327}</string>
-		<string>{40731, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>929</integer>
-			</dict>
-		</dict>
-		<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.m</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>914</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>107</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>931</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>60</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>932</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>933</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>934</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>935</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>888</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>251</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>253</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>114</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>937</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>{{0, 0}, {600, 578}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>939</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>940</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>942</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>166</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>941</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>203</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>169</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>943</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>115</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>173</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>175</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>286</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>945</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>286</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>946</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>178</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>179</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>180</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>182</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>183</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>184</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>185</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>289</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>290</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>291</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>292</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>202</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>947</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>948</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>950</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>951</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>953</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>952</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>377</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>954</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>223</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>956</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>957</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>959</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>961</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>958</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>457</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>960</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>1116</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>219</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>962</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>354</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>885</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>965</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>44</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>43</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>42</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>45</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>47</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>966</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>49</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>965</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>11</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1043</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEWorkspaceTabController_9E45EA5C-8211-4C60-B769-E55D97496BF5</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>51</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>52</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>53</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>54</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>57</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>58</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>313</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>967</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1019</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1029</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1035</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>62</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>63</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>64</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>65</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>66</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>67</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>68</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>69</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>968</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>969</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>984</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>996</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1013</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>73</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>74</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>75</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>76</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>77</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>78</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>970</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>976</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>982</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>983</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>971</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>972</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>974</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>973</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>975</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>977</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>978</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>980</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>979</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>981</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>100</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>101</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>103</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>124</integer>
-			</dict>
-			<key>geniusEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>primaryEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>985</integer>
-			</dict>
-			<key>rootLayoutTreeNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>994</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>1</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>986</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>994</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>992</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>107</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>987</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>60</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>988</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>989</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>990</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>991</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>313</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>251</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>253</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>114</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>119</integer>
-			</dict>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>993</integer>
-			</dict>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/simplecTreeParser/main.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>995</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>0</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>985</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>126</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>997</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>128</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>998</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>130</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>131</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>132</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>999</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1012</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1000</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>141</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>135</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>137</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>138</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>139</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>140</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>136</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1001</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>142</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1007</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>313</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>152</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1010</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>313</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>992</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>107</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1002</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>60</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1003</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1004</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1005</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1006</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>313</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>251</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>253</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>114</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1008</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1009</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>358</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323993875.32485598</real>
-		<string>{0, 1506}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1011</integer>
-			</dict>
-		</dict>
-		<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/simplecTreeParser/main.m</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>162</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1014</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1015</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1017</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>166</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1016</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>203</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>169</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1018</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>115</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>173</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>175</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1020</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>173</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>178</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>179</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>180</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>182</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>183</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1021</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>202</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1023</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1022</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>114</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>253</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>251</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>313</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>187</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1024</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1025</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1026</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1027</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1028</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>114</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>114</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>253</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>114</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>253</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>377</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>114</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>253</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>251</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>114</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>379</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1030</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1031</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1033</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1032</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>377</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1034</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>223</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1036</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1037</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1039</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1041</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1038</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>457</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1040</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>1116</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>219</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1042</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>354</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>965</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>42</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>43</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>44</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>45</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1045</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>47</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1045</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1046</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>12</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1047</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1103</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEWorkspaceTabController_F33080DA-636E-4BF6-B5C1-24B49B17E33D</string>
-		<string>{{268, 382}, {240, 646}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>52</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>53</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>54</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>57</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>58</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1048</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1081</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1089</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1095</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>62</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>63</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>64</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>65</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>66</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>67</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>68</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>69</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1049</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1050</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1065</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1069</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1075</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>73</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>74</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>75</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>76</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>77</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>78</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1051</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1057</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1063</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1064</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1052</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1053</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1055</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1054</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1056</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1058</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1059</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1061</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1060</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1062</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>100</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>101</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>103</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>124</integer>
-			</dict>
-			<key>geniusEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>primaryEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1066</integer>
-			</dict>
-			<key>rootLayoutTreeNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1067</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>1</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1067</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1068</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>0</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1066</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>126</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1070</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>128</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1071</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>130</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>131</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>132</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1072</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1074</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1073</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>162</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1076</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1077</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1079</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>166</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1078</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>203</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>169</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1080</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>115</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>173</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>174</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>175</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1082</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1083</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>174</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>178</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>179</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>180</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>182</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>183</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>184</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>185</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>189</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>190</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>191</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>192</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>193</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>194</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>195</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>196</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>197</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1084</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1085</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1086</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>202</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1087</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1088</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1090</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1091</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1093</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1092</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>389</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1094</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>211</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1096</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1097</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1099</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1101</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1098</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>277</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1100</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>810</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>219</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1102</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>354</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1045</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>472</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>473</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>474</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>475</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1105</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>477</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1105</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1106</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>13</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1107</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1203</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEWorkspaceTabController_2356F5AA-2FD8-4EDE-B754-CC2194BB1038</string>
-		<string>{{500, 210}, {1145, 763}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>480</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>481</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>482</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>483</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>484</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>485</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>486</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>487</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1108</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1109</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1189</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1195</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>ANTLRTreeRuleReturnScope.m</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>490</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>491</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>492</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>493</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>494</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>495</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>496</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>497</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1110</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1111</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1126</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1139</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1157</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>500</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>501</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>502</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>503</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>504</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>505</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1112</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1118</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1124</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1125</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>507</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1113</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1114</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1116</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>512</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1115</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>569</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>515</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1117</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>315</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>507</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1119</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1120</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1122</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>512</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1121</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>569</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>515</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1123</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>315</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>524</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>101</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>526</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>124</integer>
-			</dict>
-			<key>geniusEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>primaryEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1127</integer>
-			</dict>
-			<key>rootLayoutTreeNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1137</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>1</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1128</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1137</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1135</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>530</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1129</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>60</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1130</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1132</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1133</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1131</integer>
-			</dict>
-		</dict>
-		<string>ANTLRTreeRuleReturnScope.m</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>535</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1134</integer>
-			</dict>
-		</dict>
-		<string>ANTLR</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>119</integer>
-			</dict>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1136</integer>
-			</dict>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/antlr3-main/runtime/ObjC/Framework/ANTLRTreeRuleReturnScope.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1138</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>0</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1127</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>543</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1140</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>545</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1141</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>547</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>548</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>549</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1142</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1155</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1143</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>552</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>553</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>554</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>555</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>556</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>557</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>558</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1131</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1144</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1150</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1131</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>574</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1153</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>577</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1135</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>530</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1145</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>60</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1148</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1131</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>535</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1149</integer>
-			</dict>
-		</dict>
-		<string>ANTLR</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>567</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>568</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>569</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>570</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1151</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1152</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>358</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324441058.64650702</real>
-		<string>{47, 2017}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1154</integer>
-			</dict>
-		</dict>
-		<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/antlr3-main/runtime/ObjC/Framework/ANTLRTreeRuleReturnScope.m</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1156</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>{{0, 0}, {885, 717}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>507</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1158</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1161</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>583</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1160</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>203</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>586</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1162</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>115</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1164</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>590</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>591</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>589</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1165</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1179</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1164</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1186</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>Xcode.IDEKit.Navigator.BatchFind</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1166</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1167</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1169</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1170</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1171</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1172</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1173</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1175</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>622</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1178</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEBatchFindNavigatorCollapsedGroups</string>
-		<string>IDEBatchFindNavigatorFindMode</string>
-		<string>IDEBatchFindNavigatorSelectedRowIndexes</string>
-		<string>IDEBatchFindNavigatorReplaceString</string>
-		<string>IDEBatchFindNavigatorScrollPosition</string>
-		<string>IDEBatchFindNavigatorFindString</string>
-		<string>IDEBatchFindNavigatorShowsOptions</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1174</integer>
-			</dict>
-			<key>NSRangeCount</key>
-			<integer>0</integer>
-		</dict>
-		<dict>
-			<key>$classes</key>
-			<array>
-				<string>NSMutableIndexSet</string>
-				<string>NSIndexSet</string>
-				<string>NSObject</string>
-			</array>
-			<key>$classname</key>
-			<string>NSMutableIndexSet</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1176</integer>
-			</dict>
-			<key>NSLength</key>
-			<integer>3</integer>
-			<key>NSLocation</key>
-			<integer>23</integer>
-			<key>NSRangeCount</key>
-			<integer>1</integer>
-		</dict>
-		<dict>
-			<key>$classes</key>
-			<array>
-				<string>NSIndexSet</string>
-				<string>NSObject</string>
-			</array>
-			<key>$classname</key>
-			<string>NSIndexSet</string>
-		</dict>
-		<integer>294</integer>
-		<string>ANTLRLexerRuleReturnScope</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>603</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>604</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>605</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>606</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>607</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>608</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>609</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>610</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>611</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>612</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1180</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1182</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1183</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1184</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1185</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>{{0, 0}, {168, 651}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>593</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>594</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>595</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>596</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>597</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>598</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>599</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1187</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1188</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>{{0, 0}, {259, 832}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>507</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1190</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1191</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1193</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>622</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1192</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>506</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>622</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1194</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>211</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>507</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1196</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1197</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1199</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1201</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>485</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1198</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>260</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>484</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1200</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>885</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>633</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1202</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>340</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1105</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>42</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>43</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>44</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>45</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1205</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>47</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1205</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1206</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>14</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1207</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1263</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEWorkspaceTabController_F6D47396-B5A1-43DA-8459-FA61D4CD1CA9</string>
-		<string>{{98, 359}, {240, 646}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>52</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>53</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>54</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>57</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>58</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1241</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1249</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1255</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>62</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>63</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>64</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>65</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>66</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>67</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>68</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>69</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1209</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1210</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1225</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1229</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1235</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>73</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>74</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>75</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>76</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>77</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>78</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1211</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1217</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1223</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1224</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1212</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1213</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1215</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1214</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1216</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1218</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1219</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1221</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1220</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1222</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>100</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>101</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>103</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>124</integer>
-			</dict>
-			<key>geniusEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>primaryEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1226</integer>
-			</dict>
-			<key>rootLayoutTreeNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1227</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>1</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1227</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1228</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>0</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1226</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>126</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1230</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>128</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1231</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>130</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>131</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>132</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1232</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1234</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1233</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>162</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1236</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1237</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1239</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>166</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1238</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>203</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>169</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1240</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>115</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>173</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>174</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>175</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1242</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1243</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>174</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>178</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>179</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>180</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>182</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>183</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>184</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>185</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>189</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>190</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>191</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>192</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>193</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>194</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>195</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>196</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>197</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1244</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1245</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1246</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>202</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1247</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1248</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1250</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1251</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1253</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1252</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>389</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1254</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>211</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1256</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1257</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1259</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1261</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1258</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>661</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1260</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>921</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>219</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1262</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>354</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1205</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1265</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>44</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>43</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>42</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>45</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>47</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1266</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1322</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1265</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>15</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1323</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEWorkspaceTabController_CDAD906A-B3FD-4DE9-9B32-BA0E6A2D92D2</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>52</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>53</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>54</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>57</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>58</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1267</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1300</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1308</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1314</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>62</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>63</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>64</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>65</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>66</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>67</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>68</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>69</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1268</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1269</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1284</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1288</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1294</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>73</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>74</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>75</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>76</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>77</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>78</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1270</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1276</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1282</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1283</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1271</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1272</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1274</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1273</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1275</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1277</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1278</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1280</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1279</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1281</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>100</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>101</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>103</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>124</integer>
-			</dict>
-			<key>geniusEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>primaryEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1285</integer>
-			</dict>
-			<key>rootLayoutTreeNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1286</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>1</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1286</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1287</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>0</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1285</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>126</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1289</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>128</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1290</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>130</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>131</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>132</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1291</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1293</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1292</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>162</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1295</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1296</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1298</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>166</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1297</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>203</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>169</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1299</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>115</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>173</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>174</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>175</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1301</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1302</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>174</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>178</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>179</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>180</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>182</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>183</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>184</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>185</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>189</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>190</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>191</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>192</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>193</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>194</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>195</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>196</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>197</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1303</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1304</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1305</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>202</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1306</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1307</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1309</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1310</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1312</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1311</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>389</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1313</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>211</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1315</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1316</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1318</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1320</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1317</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>661</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1319</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>921</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>219</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1321</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>354</real>
-		<string>{{77, 382}, {240, 646}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1265</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>42</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>43</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>44</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>45</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1325</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>47</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1325</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>49</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>16</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1326</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1402</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEWorkspaceTabController_0FE96BB2-94D6-44F4-B2EB-13242DED799C</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>51</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>52</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>53</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>54</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>57</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>58</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1327</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1328</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1380</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1388</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1394</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>ANTLRTests.m</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>62</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>63</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>64</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>65</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>66</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>67</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>68</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>69</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1329</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1330</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1345</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1357</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1374</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>73</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>74</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>75</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>76</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>77</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>78</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1331</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1337</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1343</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1344</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1332</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1333</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1335</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1334</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1336</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1338</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1339</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1341</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1340</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1342</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>100</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>101</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>103</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>124</integer>
-			</dict>
-			<key>geniusEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>primaryEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1346</integer>
-			</dict>
-			<key>rootLayoutTreeNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1355</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>1</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1347</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1355</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1353</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>107</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1348</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>60</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1349</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1350</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1352</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1327</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1351</integer>
-			</dict>
-		</dict>
-		<string>ANTLRTests</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>114</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>119</integer>
-			</dict>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1354</integer>
-			</dict>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLR/ANTLRTests/ANTLRTests.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1356</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>0</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1346</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>126</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1358</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>128</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1359</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>130</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>131</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>132</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1360</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1373</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1361</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>135</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>136</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>137</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>138</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>139</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>140</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>141</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>142</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1327</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1362</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1327</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>152</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1366</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1368</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1363</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1364</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1365</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323970804.32803798</real>
-		<string>{0, 344}</string>
-		<string>{344, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1367</integer>
-			</dict>
-		</dict>
-		<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLR/ANTLRTests/ANTLRTests.m</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1353</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>107</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1369</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>60</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1370</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1371</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1372</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1327</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1351</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>114</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>162</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1375</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1376</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1378</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>166</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1377</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>203</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>169</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1379</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>115</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>173</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>174</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>175</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1381</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1382</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>174</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>178</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>179</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>180</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>182</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>183</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>184</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>185</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>189</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>190</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>191</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>192</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>193</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>194</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>195</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>196</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>197</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1383</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1384</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1385</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>202</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1386</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1387</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1389</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1390</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1392</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1391</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>377</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1393</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>223</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1395</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1396</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1398</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1400</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1397</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>260</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1399</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>1313</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>219</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1401</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>354</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1325</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>42</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>43</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>44</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>45</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1404</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>47</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1404</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1405</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>17</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1406</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1462</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEWorkspaceTabController_9D6F2215-F4FA-46B0-90C4-C0671DE09770</string>
-		<string>{{247, 338}, {240, 646}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>52</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>53</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>54</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>57</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>58</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1407</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1440</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1448</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1454</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>62</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>63</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>64</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>65</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>66</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>67</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>68</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>69</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1408</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1409</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1424</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1428</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1434</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>73</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>74</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>75</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>76</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>77</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>78</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1410</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1416</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1422</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1423</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1411</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1412</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1414</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1413</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1415</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1417</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1418</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1420</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1419</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1421</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>100</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>101</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>103</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>124</integer>
-			</dict>
-			<key>geniusEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>primaryEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1425</integer>
-			</dict>
-			<key>rootLayoutTreeNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1426</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>1</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1426</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1427</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>0</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1425</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>126</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1429</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>128</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1430</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>130</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>131</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>132</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1431</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1433</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1432</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>162</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1435</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1436</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1438</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>166</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1437</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>203</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>169</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1439</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>115</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>173</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>174</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>175</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1441</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1442</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>174</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>178</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>179</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>180</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>182</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>183</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>184</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>185</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>189</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>190</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>191</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>192</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>193</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>194</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>195</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>196</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>197</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1443</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1444</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1445</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>202</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1446</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1447</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1449</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1450</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1452</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1451</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>389</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1453</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>211</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1455</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1456</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1458</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1460</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1457</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>277</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1459</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>810</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>219</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1461</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>354</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1404</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>42</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>43</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>44</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>45</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1464</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>47</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1464</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1465</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>18</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1466</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1529</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEWorkspaceTabController_DD4A7D9F-63E4-467E-A0FD-C95A8591EAC6</string>
-		<string>{{245, 338}, {240, 646}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>52</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>53</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>54</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>57</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>58</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1467</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1500</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1515</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1521</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>62</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>63</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>64</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>65</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>66</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>67</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>68</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>69</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1468</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1469</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1484</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1488</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1494</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>73</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>74</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>75</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>76</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>77</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>78</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1470</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1476</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1482</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1483</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1471</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1472</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1474</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1473</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1475</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1477</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1478</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1480</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1479</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1481</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>100</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>101</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>103</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>124</integer>
-			</dict>
-			<key>geniusEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>primaryEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1485</integer>
-			</dict>
-			<key>rootLayoutTreeNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1486</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>1</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1486</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1487</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>0</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1485</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>126</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1489</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>128</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1490</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>130</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>131</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>132</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1491</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1493</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1492</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>162</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1495</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1496</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1498</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>166</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1497</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>203</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>169</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1499</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>115</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>173</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1501</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>175</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1502</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1503</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1501</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>Xcode.IDEKit.Navigator.BatchFind</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>178</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>179</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>180</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>182</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>183</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>184</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>185</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1504</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1505</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1506</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1507</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1508</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1509</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1510</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1511</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1512</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1513</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1514</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEBatchFindNavigatorCollapsedGroups</string>
-		<string>IDEBatchFindNavigatorFindMode</string>
-		<string>IDEBatchFindNavigatorSelectedRowIndexes</string>
-		<string>IDEBatchFindNavigatorReplaceString</string>
-		<string>IDEBatchFindNavigatorScrollPosition</string>
-		<string>IDEBatchFindNavigatorFindString</string>
-		<string>IDEBatchFindNavigatorShowsOptions</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1174</integer>
-			</dict>
-			<key>NSRangeCount</key>
-			<integer>0</integer>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1176</integer>
-			</dict>
-			<key>NSRangeCount</key>
-			<integer>0</integer>
-		</dict>
-		<string>id&lt;ANTLRBaseTree&gt;</string>
-		<string>createTree</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1516</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1517</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1519</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1518</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>389</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1520</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>211</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1522</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1523</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1525</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1527</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1524</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>629</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1526</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>953</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>219</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1528</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>354</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1464</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1531</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>44</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>43</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>42</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>45</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>47</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1532</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1585</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1531</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>19</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1586</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEWorkspaceTabController_CBA99461-DAF4-4594-8438-4FBCFC6D29E7</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>52</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>53</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>54</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>57</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>58</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1533</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1566</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1571</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1577</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>62</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>63</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>64</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>65</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>66</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>67</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>68</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>69</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1534</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1535</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1550</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1554</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1560</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>73</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>74</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>75</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>76</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>77</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>78</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1536</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1542</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1548</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1549</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1537</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1538</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1540</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1539</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1541</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1543</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1544</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1546</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1545</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1547</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>100</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>101</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>103</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>124</integer>
-			</dict>
-			<key>geniusEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>primaryEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1551</integer>
-			</dict>
-			<key>rootLayoutTreeNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1552</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>1</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1552</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1553</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>0</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1551</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>126</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1555</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>128</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1556</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>130</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>131</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>132</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1557</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1559</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1558</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>162</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1561</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1562</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1564</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>166</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1563</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>203</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>169</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1565</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>115</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>173</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1501</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>175</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1567</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1568</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1501</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>178</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>179</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>180</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>182</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>183</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>184</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>185</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1504</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1505</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1506</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1507</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1508</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1509</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1510</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1569</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1570</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1513</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1514</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1174</integer>
-			</dict>
-			<key>NSRangeCount</key>
-			<integer>0</integer>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1176</integer>
-			</dict>
-			<key>NSRangeCount</key>
-			<integer>0</integer>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1572</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1573</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1575</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1574</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>389</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1576</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>211</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1578</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1579</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1581</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1583</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1580</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>629</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1582</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>953</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>219</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1584</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>354</real>
-		<string>{{45, 336}, {240, 646}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1531</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1588</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>44</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>43</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>42</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>45</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>47</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1589</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1642</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1588</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>20</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1643</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEWorkspaceTabController_F5B531A8-A5F4-4360-9351-259E374487A2</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>52</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>53</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>54</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>57</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>58</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1590</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1623</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1628</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1634</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>62</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>63</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>64</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>65</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>66</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>67</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>68</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>69</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1591</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1592</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1607</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1611</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1617</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>73</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>74</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>75</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>76</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>77</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>78</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1593</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1599</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1605</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1606</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1594</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1595</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1597</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1596</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1598</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1600</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1601</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1603</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1602</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1604</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>100</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>101</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>103</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>124</integer>
-			</dict>
-			<key>geniusEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>primaryEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1608</integer>
-			</dict>
-			<key>rootLayoutTreeNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1609</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>1</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1609</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1610</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>0</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1608</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>126</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1612</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>128</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1613</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>130</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>131</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>132</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1614</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1616</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1615</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>162</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1618</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1619</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1621</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>166</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1620</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>203</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>169</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1622</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>115</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>173</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1501</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>175</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1624</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1625</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1501</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>178</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>179</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>180</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>182</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>183</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>184</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>185</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1504</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1505</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1506</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1507</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1508</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1509</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1510</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1626</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1627</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1513</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1514</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1174</integer>
-			</dict>
-			<key>NSRangeCount</key>
-			<integer>0</integer>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1176</integer>
-			</dict>
-			<key>NSRangeCount</key>
-			<integer>0</integer>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1629</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1630</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1632</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1631</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>389</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1633</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>211</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1635</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1636</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1638</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1640</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1637</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>630</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1639</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>952</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>219</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1641</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>354</real>
-		<string>{{182, 359}, {240, 646}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1588</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>42</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>43</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>44</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>45</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1645</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>47</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1645</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1646</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>21</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1647</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1703</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEWorkspaceTabController_06062238-A35F-4397-A2EB-12BF21080894</string>
-		<string>{{35, 336}, {240, 646}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>52</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>53</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>54</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>57</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>58</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1648</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1681</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1689</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1695</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>62</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>63</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>64</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>65</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>66</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>67</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>68</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>69</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1649</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1650</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1665</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1669</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1675</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>73</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>74</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>75</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>76</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>77</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>78</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1651</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1657</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1663</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1664</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1652</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1653</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1655</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1654</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1656</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1658</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1659</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1661</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1660</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1662</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>100</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>101</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>103</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>124</integer>
-			</dict>
-			<key>geniusEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>primaryEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1666</integer>
-			</dict>
-			<key>rootLayoutTreeNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1667</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>1</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1667</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1668</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>0</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1666</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>126</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1670</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>128</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1671</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>130</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>131</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>132</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1672</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1674</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1673</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>162</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1676</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1677</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1679</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>166</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1678</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>203</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>169</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1680</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>115</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>173</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>174</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>175</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1682</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1683</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>174</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>178</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>179</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>180</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>182</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>183</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>184</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>185</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>189</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>190</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>191</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>192</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>193</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>194</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>195</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>196</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>197</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1684</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1685</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1686</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>202</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1687</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1688</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1690</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1691</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1693</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1692</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>389</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1694</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>211</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1696</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1697</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1699</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1701</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1698</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>277</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1700</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>810</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>219</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1702</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>354</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1645</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>472</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>473</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>474</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>475</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1705</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>477</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1705</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1706</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>22</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1707</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1786</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEWorkspaceTabController_A8605124-DF69-4621-B7EB-52B137DAB6ED</string>
-		<string>{{226, 149}, {1443, 833}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>480</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>481</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>482</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>483</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>484</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>485</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>486</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>487</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1708</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1709</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1765</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1772</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1778</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>ANTLRLexerRuleReturnScope.m</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>490</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>491</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>492</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>493</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>494</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>495</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>496</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>497</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1710</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1711</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1726</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1739</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1759</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>500</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>501</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>502</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>503</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>504</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>505</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1712</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1718</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1724</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1725</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>507</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1713</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1714</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1716</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>512</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1715</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>717</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>515</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1717</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>725</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>507</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1719</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1720</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1722</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>512</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1721</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>717</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>515</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1723</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>725</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>524</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>101</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>526</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>124</integer>
-			</dict>
-			<key>geniusEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>primaryEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1727</integer>
-			</dict>
-			<key>rootLayoutTreeNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1737</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>1</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1728</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1737</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1735</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>530</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1729</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>60</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1730</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1732</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1733</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1731</integer>
-			</dict>
-		</dict>
-		<string>ANTLRLexerRuleReturnScope.m</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>535</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1734</integer>
-			</dict>
-		</dict>
-		<string>ANTLR</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>119</integer>
-			</dict>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1736</integer>
-			</dict>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/antlr3-main/runtime/ObjC/Framework/ANTLRLexerRuleReturnScope.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1738</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>0</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1727</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>543</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1740</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>545</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1741</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>547</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>548</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>549</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1742</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1757</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1743</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>552</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>553</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>554</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>555</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>556</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>557</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>558</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1744</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1745</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1751</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1731</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>574</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1755</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>577</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>-getStart</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1735</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>530</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1746</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>60</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1747</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1748</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1749</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1731</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>535</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1750</integer>
-			</dict>
-		</dict>
-		<string>ANTLR</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>567</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>568</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>569</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>570</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1752</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1753</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1754</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324441055.65792698</real>
-		<string>{78, 2018}</string>
-		<string>{1759, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1756</integer>
-			</dict>
-		</dict>
-		<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/antlr3-main/runtime/ObjC/Framework/ANTLRLexerRuleReturnScope.m</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1758</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>{{0, 0}, {1443, 787}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>507</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1760</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1761</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1763</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>583</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1762</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>203</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>586</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1764</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>115</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>589</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>591</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1164</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1766</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1164</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1769</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>593</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>594</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>595</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>596</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>597</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>598</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>599</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1767</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1768</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>{{0, 0}, {259, 832}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1166</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1167</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1169</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1170</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1171</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1172</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1770</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1771</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>622</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1178</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1174</integer>
-			</dict>
-			<key>NSRangeCount</key>
-			<integer>0</integer>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1176</integer>
-			</dict>
-			<key>NSRangeCount</key>
-			<integer>0</integer>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>507</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1773</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1774</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1776</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>622</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1775</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>576</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>622</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1777</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>211</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>507</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1779</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1780</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1782</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1784</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>485</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1781</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>260</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>484</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1783</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>982</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>633</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1785</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>340</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1705</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>42</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>43</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>44</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>45</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1788</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>47</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1788</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1789</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>23</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1790</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1870</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEWorkspaceTabController_E89174C7-252B-475D-9A02-F71427918439</string>
-		<string>{{184, 382}, {600, 646}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>51</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>52</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>53</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>54</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>57</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>58</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1791</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1792</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1848</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1856</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1862</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>NSObject.h</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>62</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>63</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>64</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>65</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>66</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>67</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>68</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>69</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1793</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1794</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1809</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1824</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1842</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>73</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>74</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>75</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>76</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>77</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>78</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1795</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1801</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1807</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1808</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1796</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1797</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1799</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1798</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1800</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1802</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1803</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1805</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1804</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1806</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>100</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>101</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>103</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>124</integer>
-			</dict>
-			<key>geniusEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>primaryEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1810</integer>
-			</dict>
-			<key>rootLayoutTreeNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1822</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>1</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1811</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1822</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1820</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1812</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1813</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>60</integer>
-			</dict>
-		</dict>
-		<string>Xcode.IDENavigableItemDomain.FrameworkFilePath</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1814</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1815</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1817</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1818</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1791</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1816</integer>
-			</dict>
-		</dict>
-		<string>Foundation.framework</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>379</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1819</integer>
-			</dict>
-		</dict>
-		<string>MacOSX10.6</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>119</integer>
-			</dict>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1821</integer>
-			</dict>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Versions/C/Headers/NSObject.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1823</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>0</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1810</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>126</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1825</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>128</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1826</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>130</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>131</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>132</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1827</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1841</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1828</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>135</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>136</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>137</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>138</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>139</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>140</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>141</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>142</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1791</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1829</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1791</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>269</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1832</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1834</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1830</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1831</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>358</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324417838.38949198</real>
-		<string>{0, 935}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1833</integer>
-			</dict>
-		</dict>
-		<string>file://localhost/Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Versions/C/Headers/NSObject.h</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1840</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1812</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1835</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>60</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1836</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1837</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1838</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1839</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1791</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1816</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>379</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1819</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>119</integer>
-			</dict>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1821</integer>
-			</dict>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>162</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1843</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1844</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1846</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>166</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1845</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>203</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>169</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1847</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>115</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>173</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>174</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>175</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1849</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1850</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>174</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>178</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>179</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>180</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>182</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>183</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>184</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>185</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>189</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>190</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>191</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>192</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>193</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>194</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>195</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>196</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>197</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1851</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1852</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1853</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>202</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1854</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1855</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1857</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1858</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1860</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1859</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>377</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1861</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>223</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1863</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1864</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1866</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1868</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1865</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>586</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1867</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>987</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>219</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1869</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>354</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1788</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1872</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1873</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1874</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1875</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1876</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1877</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1878</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1879</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1880</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1881</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1882</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1883</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1915</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1916</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1921</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2001</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2022</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3028</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>LastCompletedPersistentSchemeBasedActivityReport</string>
-		<string>DocumentWindows</string>
-		<string>DebuggingWindowBehavior</string>
-		<string>ActiveRunDestination</string>
-		<string>MiniDebuggingConsole</string>
-		<string>DefaultEditorFrameSizeForURLs</string>
-		<string>RecentEditorDocumentURLs</string>
-		<string>DefaultEditorStatesForURLs</string>
-		<string>AppFocusInMiniDebugging</string>
-		<string>BreakpointsActivated</string>
-		<string>ActiveScheme</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1884</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1885</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1886</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1887</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1888</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1914</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEActivityReportTitle</string>
-		<string>IDEActivityReportCompletionSummaryStringSegments</string>
-		<string>IDEActivityReportOptions</string>
-		<string>ANTLR</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1889</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1896</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1900</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1905</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1890</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1891</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1892</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1893</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1894</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1895</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEActivityReportStringSegmentBackSeparator</string>
-		<string>IDEActivityReportStringSegmentPriority</string>
-		<string>IDEActivityReportStringSegmentStringValue</string>
-		<string> </string>
-		<real>2</real>
-		<string>Build</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1890</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1891</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1892</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1897</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1898</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1899</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>: </string>
-		<real>4</real>
-		<string>ANTLR</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1890</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1891</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1892</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1901</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1902</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1903</integer>
-				</dict>
-			</array>
-		</dict>
-		<string> │ </string>
-		<real>1</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1904</integer>
-			</dict>
-			<key>NS.data</key>
-			<data>
-			YnBsaXN0MDDUAQIDBAUIPT5UJHRvcFgkb2JqZWN0c1gkdmVyc2lv
-			blkkYXJjaGl2ZXLRBgdUcm9vdIABrQkKERIcHR4mJy0zNjlVJG51
-			bGzTCwwNDg8QXE5TQXR0cmlidXRlc1YkY2xhc3NYTlNTdHJpbmeA
-			A4AMgAJZU3VjY2VlZGVk0xMUDBUYG1pOUy5vYmplY3RzV05TLmtl
-			eXOiFheABoAJohkagASABYALVk5TRm9udFdOU0NvbG9y1B8gDCEi
-			IyQlVk5TU2l6ZVZOU05hbWVYTlNmRmxhZ3MjQCYAAAAAAACAB4AI
-			EQ0QXxARTHVjaWRhR3JhbmRlLUJvbGTSKCkqK1gkY2xhc3Nlc1ok
-			Y2xhc3NuYW1loissVk5TRm9udFhOU09iamVjdNMuLwwwMTJXTlNX
-			aGl0ZVxOU0NvbG9yU3BhY2VCMAAQA4AK0igpNDWiNSxXTlNDb2xv
-			ctIoKTc4ojgsXE5TRGljdGlvbmFyedIoKTo8ojssXxASTlNBdHRy
-			aWJ1dGVkU3RyaW5nXxASTlNBdHRyaWJ1dGVkU3RyaW5nEgABhqBf
-			EA9OU0tleWVkQXJjaGl2ZXIACAARABYAHwAoADIANQA6ADwASgBQ
-			AFcAZABrAHQAdgB4AHoAhACLAJYAngChAKMApQCoAKoArACuALUA
-			vQDGAM0A1ADdAOYA6ADqAO0BAQEGAQ8BGgEdASQBLQE0ATwBSQFM
-			AU4BUAFVAVgBYAFlAWgBdQF6AX0BkgGnAawAAAAAAAACAQAAAAAA
-			AAA/AAAAAAAAAAAAAAAAAAABvg==
-			</data>
-		</dict>
-		<dict>
-			<key>$classes</key>
-			<array>
-				<string>NSMutableData</string>
-				<string>NSData</string>
-				<string>NSObject</string>
-			</array>
-			<key>$classname</key>
-			<string>NSMutableData</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1892</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1906</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1891</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1907</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1908</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1909</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1910</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1911</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1912</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEActivityReportStringSegmentDateStyle</string>
-		<string>IDEActivityReportStringSegmentType</string>
-		<string>IDEActivityReportStringSegmentTimeStyle</string>
-		<string>IDEActivityReportStringSegmentDate</string>
-		<string>Today at 7:27 PM</string>
-		<real>3</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1913</integer>
-			</dict>
-			<key>NS.time</key>
-			<real>324440863.47144002</real>
-		</dict>
-		<dict>
-			<key>$classes</key>
-			<array>
-				<string>NSDate</string>
-				<string>NSObject</string>
-			</array>
-			<key>$classname</key>
-			<string>NSDate</string>
-		</dict>
-		<integer>106</integer>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>13</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1917</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1918</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1919</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1920</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEDeviceLocation</string>
-		<string>IDEDeviceArchitecture</string>
-		<string>dvtdevice-local-computer:localhost</string>
-		<string>i386</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1922</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1924</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1925</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1926</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1927</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1929</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1931</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1932</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1933</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1934</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1935</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1937</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1938</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1940</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1942</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1943</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1944</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1946</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1951</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1954</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1957</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1960</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1963</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1968</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1971</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1974</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1977</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1980</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1983</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1986</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1989</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1992</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1995</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1998</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1923</integer>
-			</dict>
-		</dict>
-		<string>x-xcode-log://0CBB9AA9-E42F-400E-9F34-053023A4DD9A</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>426</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1833</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>929</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1928</integer>
-			</dict>
-		</dict>
-		<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/polydiff/Simplifier.m</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1930</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/antlr3-main/runtime/ObjC/Framework/ANTLRTreeAdaptor.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1367</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1011</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>360</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>154</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1936</integer>
-			</dict>
-		</dict>
-		<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRCommonTreeAdaptor.h</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1736</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1939</integer>
-			</dict>
-		</dict>
-		<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/fuzzy/FuzzyLexer.h</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1941</integer>
-			</dict>
-		</dict>
-		<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBaseTree.h</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>539</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>271</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1945</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/antlr3-main/runtime/ObjC/Framework/ANTLRTreeRuleReturnScope.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1947</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1948</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1949</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1950</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>width</string>
-		<string>height</string>
-		<real>600</real>
-		<real>600</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1947</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1948</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1952</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1953</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>600</real>
-		<real>600</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1947</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1948</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1955</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1956</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>600</real>
-		<real>600</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1947</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1948</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1958</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1959</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>600</real>
-		<real>578</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1947</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1948</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1961</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1962</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>600</real>
-		<real>600</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1964</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1965</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1966</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1967</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>width</string>
-		<string>height</string>
-		<real>1095</real>
-		<real>720</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1947</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1948</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1969</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1970</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>600</real>
-		<real>600</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1947</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1948</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1972</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1973</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>600</real>
-		<real>600</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1947</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1948</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1975</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1976</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>600</real>
-		<real>600</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1947</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1948</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1978</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1979</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>600</real>
-		<real>600</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1947</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1948</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1981</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1982</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>600</real>
-		<real>600</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1964</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1965</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1984</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1985</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>1443</real>
-		<real>787</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1947</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1948</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1987</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1988</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>600</real>
-		<real>600</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1947</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1948</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1990</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1991</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>600</real>
-		<real>600</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1964</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1965</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1993</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1994</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>1127</real>
-		<real>717</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1947</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1948</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1996</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1997</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>600</real>
-		<real>600</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1964</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1965</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1999</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2000</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>899</real>
-		<real>859</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2002</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2004</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2006</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2008</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2010</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2012</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2014</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2016</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2018</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2020</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2003</integer>
-			</dict>
-		</dict>
-		<string>x-xcode-log://128D3AC5-F4C6-4508-8BEA-E26CF7377619</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2005</integer>
-			</dict>
-		</dict>
-		<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/antlr3-main/runtime/ObjC/Framework/ANTLRLexerRuleReturnScope.m</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2007</integer>
-			</dict>
-		</dict>
-		<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/antlr3-main/runtime/ObjC/Framework/ANTLRLexerRuleReturnScope.h</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2009</integer>
-			</dict>
-		</dict>
-		<string>x-xcode-log://DF871C4F-2A91-4770-B164-12F2B22E77CB</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2011</integer>
-			</dict>
-		</dict>
-		<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/antlr3-main/runtime/ObjC/Framework/ANTLRTreeRewriter.m</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2013</integer>
-			</dict>
-		</dict>
-		<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/antlr3-main/runtime/ObjC/Framework/ANTLRTreeAdaptor.m</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2015</integer>
-			</dict>
-		</dict>
-		<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/antlr3-main/runtime/ObjC/Framework/ANTLRTreeRuleReturnScope.m</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2017</integer>
-			</dict>
-		</dict>
-		<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/antlr3-main/runtime/ObjC/Framework/ANTLRTreeRuleReturnScope.h</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2019</integer>
-			</dict>
-		</dict>
-		<string>x-xcode-log://CD03766F-8B5F-414D-84B4-BECC59F190F5</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2021</integer>
-			</dict>
-		</dict>
-		<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRCommonTreeAdaptor.m</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2023</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2024</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>142</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2025</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>434</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2026</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2035</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2288</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2943</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2961</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEQuickLookEditor.Editor</string>
-		<string>Xcode.Xcode3ProjectSupport.EditorDocument.Xcode3Project</string>
-		<string>Xcode.IDEKit.EditorDocument.DebuggerLogDocument</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2027</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2029</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2028</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/Library/Developer/Xcode/DerivedData/ANTLR-awfvqfoybjihuiaoxllmwcgxqxnm/Build/Products/Debug/Fuzzy</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>436</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2030</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2031</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2034</integer>
-			</dict>
-			<key>IDEQuickLookPageNumber</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>60</integer>
-			</dict>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2032</integer>
-			</dict>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2033</integer>
-			</dict>
-		</dict>
-		<string>file://localhost/Users/acondit/Library/Developer/Xcode/DerivedData/ANTLR-awfvqfoybjihuiaoxllmwcgxqxnm/Build/Products/Debug/Fuzzy</string>
-		<real>323996585.291471</real>
-		<dict>
-			<key>$classes</key>
-			<array>
-				<string>IDEQuickLookDocumentLocation</string>
-				<string>DVTDocumentLocation</string>
-				<string>NSObject</string>
-			</array>
-			<key>$classname</key>
-			<string>IDEQuickLookDocumentLocation</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2036</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2038</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2037</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLR/ANTLR.xcodeproj/</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2039</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2040</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2041</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2042</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2043</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2044</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2045</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2046</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2047</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2048</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2076</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2077</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2078</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2079</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2080</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2081</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2087</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2095</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>Xcode3ProjectEditor_Xcode3BuildPhasesEditor</string>
-		<string>Xcode3ProjectEditor_Xcode3InfoEditor</string>
-		<string>Xcode3ProjectEditor_Xcode3ProjectInfoEditor</string>
-		<string>Xcode3ProjectEditor_Xcode3BuildSettingsEditor</string>
-		<string>Xcode3ProjectEditor_Xcode3BuildRulesEditor</string>
-		<string>Xcode3ProjectEditorPreviousProjectEditorClass</string>
-		<string>Xcode3ProjectEditor.sourceList.splitview</string>
-		<string>Xcode3ProjectEditorSelectedDocumentLocations</string>
-		<string>Xcode3ProjectEditorPreviousTargetEditorClass</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2049</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2050</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2051</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2052</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2053</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2054</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2055</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2056</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2057</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2058</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2059</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2060</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2061</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2062</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>358</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2063</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2066</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2067</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2068</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2069</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2071</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2072</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2073</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2074</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2075</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>1AE7232C134E860B001C3F35</string>
-		<string>kXcode3BuildPhasesEditorScrollPointKey</string>
-		<string>1AE72315134E860B001C3F35</string>
-		<string>1AE72328134E860B001C3F35</string>
-		<string>1AE7232B134E860B001C3F35</string>
-		<string>1AE72317134E860B001C3F35</string>
-		<string>Xcode3BuildPhasesEditorDisclosedNamesKey</string>
-		<string>1AE72313134E860B001C3F35</string>
-		<string>Xcode3BuildPhasesEditorFilterKey</string>
-		<string>1AE72314134E860B001C3F35</string>
-		<string>1AE72316134E860B001C3F35</string>
-		<string>1AE7232A134E860B001C3F35</string>
-		<string>1AE72329134E860B001C3F35</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2064</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2065</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>Xcode3HeadersBuildPhaseDisclosedIndexes</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1176</integer>
-			</dict>
-			<key>NSLength</key>
-			<integer>1</integer>
-			<key>NSLocation</key>
-			<integer>0</integer>
-			<key>NSRangeCount</key>
-			<integer>1</integer>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2070</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>Link Binary With Libraries</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Xcode3ProjectInfoEditor</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2082</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2083</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2085</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2084</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>371</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2086</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>415</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2088</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2287</integer>
-			</dict>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2089</integer>
-			</dict>
-			<key>selection</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2091</integer>
-			</dict>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2090</integer>
-			</dict>
-		</dict>
-		<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLR/ANTLR.xcodeproj/</string>
-		<real>324364227.89618599</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2092</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2093</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2094</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2095</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>114</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2096</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>Editor</string>
-		<string>Target</string>
-		<string>Xcode3BuildSettingsEditorLocations</string>
-		<string>Xcode3BuildSettingsEditor</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2097</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2098</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2099</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2100</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2101</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2102</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2103</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2104</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2105</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>Xcode3BuildPropertyNameDisplayMode</string>
-		<string>Xcode3BuildPropertyValueDisplayMode</string>
-		<string>Xcode3BuildSettingsEditorDisplayMode</string>
-		<string>Selected Build Properties</string>
-		<string>Collapsed Build Property Categories</string>
-		<string>Xcode3BuildSettingsEditorMode</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2106</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2107</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2108</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2109</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2110</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2111</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2112</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2113</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2114</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2115</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2116</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2117</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2118</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2119</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2120</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2121</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2122</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2123</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2124</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2125</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2126</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2127</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2128</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2129</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2130</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2131</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2132</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2133</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2134</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2135</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2136</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2137</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2138</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2139</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2140</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2141</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2142</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2143</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2144</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2148</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2149</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2150</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2151</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2152</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2153</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2154</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2155</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2156</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2157</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2162</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2164</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2165</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2166</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2167</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2169</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2170</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2171</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2172</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2173</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2174</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2175</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2176</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2178</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2179</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2180</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2182</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2183</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2184</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2185</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2186</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2187</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2188</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2189</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2190</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2191</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2192</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2193</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2194</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2195</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2196</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2197</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2198</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2199</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2200</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2201</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2202</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2203</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2204</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2205</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2206</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2207</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2209</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2210</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2211</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2212</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2213</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2214</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2215</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2216</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2217</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2218</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2219</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2220</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2221</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2222</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2223</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2224</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2225</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2226</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2227</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2228</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2229</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2230</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2231</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2232</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2233</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2234</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2235</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2236</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2237</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2238</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2239</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2240</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2241</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2242</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2243</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2244</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2245</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2246</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2247</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2248</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2249</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2250</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2251</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2252</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2253</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2254</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2255</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2256</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2257</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2258</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2259</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2260</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2261</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2262</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2263</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2264</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2265</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2266</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2267</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2268</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2269</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2270</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2271</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2272</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2273</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2274</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2275</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2276</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2277</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2278</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2279</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2280</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2281</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2282</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2283</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2284</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2285</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2286</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Architectures||ADDITIONAL_SDKS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Architectures||ARCHS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Architectures||ONLY_ACTIVE_ARCH</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Architectures||SDKROOT</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Architectures||SUPPORTED_PLATFORMS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Architectures||VALID_ARCHS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Build Locations||OBJROOT</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Build Locations||SHARED_PRECOMPS_DIR</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Build Locations||SYMROOT</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Build Options||BUILD_VARIANTS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Build Options||ENABLE_OPENMP_SUPPORT</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Build Options||GENERATE_PROFILING_CODE</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Build Options||PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Build Options||RUN_CLANG_STATIC_ANALYZER</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Build Options||SCAN_ALL_SOURCE_FILES_FOR_INCLUDES</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Build Options||VALIDATE_PRODUCT</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Code Signing||CODE_SIGN_ENTITLEMENTS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Code Signing||CODE_SIGN_IDENTITY</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Code Signing||CODE_SIGN_RESOURCE_RULES_PATH</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Code Signing||OTHER_CODE_SIGN_FLAGS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Compiler Version||GCC_VERSION</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Deployment||ALTERNATE_GROUP</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Deployment||ALTERNATE_MODE</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Deployment||ALTERNATE_OWNER</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Deployment||ALTERNATE_PERMISSIONS_FILES</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Deployment||COMBINE_HIDPI_IMAGES</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Deployment||DEPLOYMENT_LOCATION</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Deployment||DEPLOYMENT_POSTPROCESSING</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Deployment||DSTROOT</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Deployment||INSTALL_GROUP</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Deployment||INSTALL_MODE_FLAG</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Deployment||INSTALL_OWNER</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Deployment||INSTALL_PATH</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Deployment||MACOSX_DEPLOYMENT_TARGET</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Deployment||SEPARATE_STRIP</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Deployment||SKIP_INSTALL</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Deployment||STRIPFLAGS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Deployment||STRIP_INSTALLED_PRODUCT</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Deployment||STRIP_STYLE</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Kernel Module||MODULE_NAME</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Kernel Module||MODULE_START</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Kernel Module||MODULE_STOP</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Kernel Module||MODULE_VERSION</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Linking||BUNDLE_LOADER</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Linking||DEAD_CODE_STRIPPING</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Linking||DYLIB_COMPATIBILITY_VERSION</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Linking||DYLIB_CURRENT_VERSION</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Linking||EXPORTED_SYMBOLS_FILE</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Linking||GENERATE_MASTER_OBJECT_FILE</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Linking||INIT_ROUTINE</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Linking||KEEP_PRIVATE_EXTERNS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Linking||LD_DYLIB_INSTALL_NAME</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Linking||LD_GENERATE_MAP_FILE</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Linking||LD_OPENMP_FLAGS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Linking||LD_RUNPATH_SEARCH_PATHS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Linking||LINKER_DISPLAYS_MANGLED_NAMES</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Linking||LINK_WITH_STANDARD_LIBRARIES</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Linking||MACH_O_TYPE</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Linking||ORDER_FILE</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Linking||OTHER_LDFLAGS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Linking||PRELINK_FLAGS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Linking||PRELINK_LIBS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Linking||PRESERVE_DEAD_CODE_INITS_AND_TERMS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Linking||SECTORDER_FLAGS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Linking||SEPARATE_SYMBOL_EDIT</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Linking||STANDARD_C_PLUS_PLUS_LIBRARY_TYPE</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Linking||UNEXPORTED_SYMBOLS_FILE</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Linking||WARNING_LDFLAGS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Packaging||APPLY_RULES_IN_COPY_FILES</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Packaging||COPYING_PRESERVES_HFS_DATA</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Packaging||EXECUTABLE_EXTENSION</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Packaging||EXECUTABLE_PREFIX</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Packaging||FRAMEWORK_VERSION</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Packaging||GENERATE_PKGINFO_FILE</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Packaging||INFOPLIST_EXPAND_BUILD_SETTINGS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Packaging||INFOPLIST_FILE</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Packaging||INFOPLIST_OTHER_PREPROCESSOR_FLAGS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Packaging||INFOPLIST_OUTPUT_FORMAT</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Packaging||INFOPLIST_PREFIX_HEADER</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Packaging||INFOPLIST_PREPROCESS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Packaging||INFOPLIST_PREPROCESSOR_DEFINITIONS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Packaging||PLIST_FILE_OUTPUT_FORMAT</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Packaging||PRIVATE_HEADERS_FOLDER_PATH</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Packaging||PRODUCT_NAME</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Packaging||PUBLIC_HEADERS_FOLDER_PATH</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Packaging||STRINGS_FILE_OUTPUT_ENCODING</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Packaging||WRAPPER_EXTENSION</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Search Paths||ALWAYS_SEARCH_USER_PATHS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Search Paths||EXCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Search Paths||FRAMEWORK_SEARCH_PATHS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Search Paths||HEADER_SEARCH_PATHS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Search Paths||INCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Search Paths||LIBRARY_SEARCH_PATHS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Search Paths||REZ_SEARCH_PATHS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Search Paths||USER_HEADER_SEARCH_PATHS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Unit Testing||OTHER_TEST_FLAGS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Unit Testing||TEST_AFTER_BUILD</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Unit Testing||TEST_HOST</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Unit Testing||TEST_RIG</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Versioning||CURRENT_PROJECT_VERSION</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Versioning||VERSIONING_SYSTEM</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Versioning||VERSION_INFO_BUILDER</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Versioning||VERSION_INFO_EXPORT_DECL</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Versioning||VERSION_INFO_FILE</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Versioning||VERSION_INFO_PREFIX</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>Versioning||VERSION_INFO_SUFFIX</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Code Generation||GCC_DYNAMIC_NO_PIC</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Code Generation||GCC_ENABLE_KERNEL_DEVELOPMENT</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Code Generation||GCC_ENABLE_OBJC_GC</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Code Generation||GCC_ENABLE_SSE3_EXTENSIONS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Code Generation||GCC_ENABLE_SSE41_EXTENSIONS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Code Generation||GCC_ENABLE_SSE42_EXTENSIONS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Code Generation||GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Code Generation||GCC_FAST_MATH</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Code Generation||GCC_FAST_OBJC_DISPATCH</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Code Generation||GCC_GENERATE_DEBUGGING_SYMBOLS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Code Generation||GCC_INLINES_ARE_PRIVATE_EXTERN</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Code Generation||GCC_NO_COMMON_BLOCKS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Code Generation||GCC_REUSE_STRINGS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Code Generation||GCC_STRICT_ALIASING</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Code Generation||GCC_SYMBOLS_PRIVATE_EXTERN</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Code Generation||GCC_THREADSAFE_STATICS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Code Generation||GCC_UNROLL_LOOPS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Code Generation||LLVM_LTO</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Language||GCC_CHAR_IS_UNSIGNED_CHAR</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Language||GCC_CW_ASM_SYNTAX</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Language||GCC_C_LANGUAGE_STANDARD</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Language||GCC_ENABLE_ASM_KEYWORD</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Language||GCC_ENABLE_BUILTIN_FUNCTIONS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Language||GCC_ENABLE_CPP_EXCEPTIONS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Language||GCC_ENABLE_CPP_RTTI</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Language||GCC_ENABLE_FLOATING_POINT_LIBRARY_CALLS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Language||GCC_ENABLE_OBJC_EXCEPTIONS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Language||GCC_ENABLE_PASCAL_STRINGS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Language||GCC_ENABLE_TRIGRAPHS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Language||GCC_FORCE_CPU_SUBTYPE_ALL</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Language||GCC_INCREASE_PRECOMPILED_HEADER_SHARING</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Language||GCC_INPUT_FILETYPE</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Language||GCC_LINK_WITH_DYNAMIC_LIBRARIES</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Language||GCC_PRECOMPILE_PREFIX_HEADER</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Language||GCC_PREFIX_HEADER</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Language||GCC_SHORT_ENUMS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Language||GCC_USE_INDIRECT_FUNCTION_CALLS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Language||GCC_USE_REGISTER_FUNCTION_CALLS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Language||GCC_USE_STANDARD_INCLUDE_SEARCHING</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Language||OTHER_CFLAGS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Language||OTHER_CPLUSPLUSFLAGS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Preprocessing||GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Warnings||GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Warnings||GCC_TREAT_WARNINGS_AS_ERRORS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Warnings||GCC_WARN_64_TO_32_BIT_CONVERSION</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Warnings||GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Warnings||GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Warnings||GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Warnings||GCC_WARN_ABOUT_MISSING_NEWLINE</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Warnings||GCC_WARN_ABOUT_MISSING_PROTOTYPES</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Warnings||GCC_WARN_ABOUT_POINTER_SIGNEDNESS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Warnings||GCC_WARN_ABOUT_RETURN_TYPE</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Warnings||GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Warnings||GCC_WARN_CHECK_SWITCH_STATEMENTS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Warnings||GCC_WARN_FOUR_CHARACTER_CONSTANTS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Warnings||GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Warnings||GCC_WARN_INHIBIT_ALL_WARNINGS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Warnings||GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Warnings||GCC_WARN_MISSING_PARENTHESES</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Warnings||GCC_WARN_MULTIPLE_DEFINITION_TYPES_FOR_SELECTOR</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Warnings||GCC_WARN_NON_VIRTUAL_DESTRUCTOR</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Warnings||GCC_WARN_PEDANTIC</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Warnings||GCC_WARN_SHADOW</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Warnings||GCC_WARN_SIGN_COMPARE</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Warnings||GCC_WARN_STRICT_SELECTOR_MATCH</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Warnings||GCC_WARN_TYPECHECK_CALLS_TO_PRINTF</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Warnings||GCC_WARN_UNDECLARED_SELECTOR</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Warnings||GCC_WARN_UNINITIALIZED_AUTOS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Warnings||GCC_WARN_UNKNOWN_PRAGMAS</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Warnings||GCC_WARN_UNUSED_FUNCTION</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Warnings||GCC_WARN_UNUSED_LABEL</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Warnings||GCC_WARN_UNUSED_PARAMETER</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Warnings||GCC_WARN_UNUSED_VALUE</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Warnings||GCC_WARN_UNUSED_VARIABLE</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>LLVM compiler 2.0 - Warnings||WARNING_CFLAGS</string>
-		</dict>
-		<dict>
-			<key>$classes</key>
-			<array>
-				<string>Xcode3ProjectDocumentLocation</string>
-				<string>DVTDocumentLocation</string>
-				<string>NSObject</string>
-			</array>
-			<key>$classname</key>
-			<string>Xcode3ProjectDocumentLocation</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2289</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2291</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2293</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2295</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2297</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2299</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2301</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2303</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2305</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2307</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2309</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2311</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2313</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2315</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2317</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2319</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2321</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2323</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2325</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2327</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2329</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2331</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2333</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1929</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2335</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2337</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2339</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2341</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2343</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2345</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2347</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2349</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2351</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2353</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2355</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2357</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2359</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2361</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2363</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2365</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2367</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2369</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2371</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2373</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2375</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2377</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2379</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2381</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2383</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2385</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2387</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2389</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2391</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2393</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2395</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2397</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2399</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2401</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2403</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2405</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2407</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2409</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2411</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2413</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2415</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1944</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2417</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2419</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2421</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2423</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2425</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2427</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2429</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2431</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2433</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2435</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2437</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2439</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2441</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2443</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2445</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2447</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2449</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2451</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2453</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2455</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2457</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2459</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1942</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1937</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2461</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2463</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2465</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2467</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2469</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2471</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2473</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2475</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2477</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2479</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2481</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2483</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2485</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2487</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2489</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2491</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2492</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2494</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2496</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2498</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2500</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2502</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2504</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2506</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2508</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2512</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2514</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2517</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2521</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2525</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2529</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2533</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2536</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2539</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2543</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2547</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2551</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2554</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2558</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2562</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2566</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2569</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2572</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2576</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2580</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2583</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2586</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2589</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2593</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2597</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2601</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2605</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2609</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2613</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2617</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2621</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2625</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2629</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2633</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2636</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2639</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2643</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2646</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2650</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2653</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2656</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2659</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2663</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2667</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2671</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2675</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2678</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2682</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2686</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2690</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2694</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2697</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2700</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2704</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2707</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2710</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2714</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2717</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2721</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2725</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2728</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2732</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2736</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2739</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2743</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2747</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2751</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2755</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2759</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2763</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2767</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2771</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2775</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2778</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2782</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2785</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2789</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2792</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2796</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2799</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2803</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2807</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2811</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2815</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2819</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2823</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2827</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2831</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2834</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2838</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2842</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2846</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2850</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2853</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2857</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2861</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2865</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2869</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2873</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2877</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2880</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2883</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2887</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2891</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2895</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2898</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2902</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2905</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2909</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2913</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2917</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2920</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2923</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2927</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2931</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2934</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2937</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2939</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2290</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/treeparser/Main.java</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2292</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Versions/C/Headers/NSAppleScript.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2294</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/polydiff/Simplifier.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2296</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRUnbufferedCommonTreeNodeStream.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2298</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/polydiff/PolyLexer.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2300</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/treeparser/LangLexer.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2302</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRRecognizerSharedState.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2304</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRTreeIterator.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2306</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRCommonToken.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2308</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRParseTree.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2310</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/polydiff/PolyParser.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2312</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBaseTree.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2314</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRTree.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2316</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/treerewrite/TreeRewriteLexer.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2318</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/treerewrite/output1/TreeRewriteLexer.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2320</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/var/folders/g7/g7-mBaqj2RaJUU+F71D0SU+++TI/-Tmp-/objc_msgSend_disassembly_0x9881dedb.nasm</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2322</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBufferedTreeNodeStream.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2324</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRLexerState.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2326</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/simplecTreeParser/input</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2328</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/treeparser/input</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2330</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/scopes/input</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2332</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRTreeAdaptor.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2334</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRCommonToken.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2336</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBaseTreeAdaptor.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2338</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/polydiff/Simplifier.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2340</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRFastQueue.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2342</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/LL-star/main.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2344</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/hoistedPredicates/main.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2346</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/simplecTreeParser/main.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2348</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRLookaheadStream.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2350</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/treeparser/main.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2352</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/treerewrite/main.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2354</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/fuzzy/FuzzyLexer.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2356</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/scopes/main.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2358</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/combined/main.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2360</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/fuzzy/main.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2362</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/lexertest-simple/main.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2364</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2366</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBaseMapElement.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2368</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBaseTree.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2370</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRRecognizerSharedState.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2372</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBaseTreeAdaptor.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2374</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRPtrBuffer.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2376</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/scopes/SymbolTableLexer.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2378</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRDoubleKeyMap.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2380</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRTreeNodeStream.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2382</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCParser.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2384</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/treerewrite/TreeRewriteParser.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2386</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/treerewrite/TreeRewrite.g</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2388</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRDebugTreeNodeStream.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2390</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRCommonTreeNodeStream.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2392</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/simplecTreeParser/output</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2394</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRCommonTree.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2396</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRInputStream.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2398</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRTreePatternParser.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2400</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRTree.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2402</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRPtrStack.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2404</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRRewriteRuleElementStream.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2406</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/test/runtime/token/ANTLRCommonTokenTest.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2408</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBufferedTokenStream.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2410</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRRuntimeException.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2412</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRParseTree.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2414</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRCommonTokenStream.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2416</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRUniqueIDMap.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2418</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRTreeAdaptor.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2420</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRTreeVisitor.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2422</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRRewriteRuleNodeStream.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2424</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRTreeWizard.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2426</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2428</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/scopes/SymbolTableParser.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2430</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/LL-star/SimpleCParser.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2432</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCParser.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2434</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/hoistedPredicates/TParser.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2436</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Versions/C/Headers/NSObject.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2438</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRCommonTree.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2440</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/test/runtime/sets/ANTLRBitSetTest.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2442</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRRuntimeException.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2444</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRCommonTreeAdaptor.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2446</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRCommonTokenStream.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2448</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRNodeMapElement.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2450</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBaseRecognizer.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2452</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/treeparser/LangParser.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2454</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Versions/C/Headers/NSString.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2456</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRTreeRewriter.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2458</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRPtrStack.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2460</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBufferedTokenStream.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2462</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRStringStream.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2464</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRUnbufferedCommonTreeNodeStream.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2466</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRTreePatternParser.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2468</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRLookaheadStream.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2470</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRDFA.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2472</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRTreeWizard.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2474</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/treeparser/LangDumpDecl.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2476</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/antlr3-main/runtime/ObjC/Framework/ANTLRLexerRuleReturnScope.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2478</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRRewriteRuleTokenStream.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2480</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/scopes/SymbolTable.g</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2482</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRMap.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2484</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRDebugTreeAdaptor.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2486</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRPtrBuffer.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2488</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/treeparser/LangParser.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2490</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRTreeRewriter.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1136</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2493</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/treeparser/LangDumpDecl.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2495</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRCommonTreeAdaptor.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2497</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRCommonTreeNodeStream.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2499</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/LL-star/SimpleCLexer.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2501</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCLexer.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2503</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRRewriteRuleNodeStream.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2505</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRLexerState.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2507</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/hoistedPredicates/TLexer.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2509</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBaseStack.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2511</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2513</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRRecognitionException.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2515</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2516</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>358</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323994196.47168499</real>
-		<string>{0, 694}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2518</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2519</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2520</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324409866.92811</real>
-		<string>{0, 2523}</string>
-		<string>{1904, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2522</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2523</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2524</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323992265.70342797</real>
-		<string>{15643, 725}</string>
-		<string>{16364, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2526</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2527</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2528</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324431688.50582999</real>
-		<string>{0, 2923}</string>
-		<string>{1661, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2530</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2531</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2532</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323991920.336025</real>
-		<string>{0, 951}</string>
-		<string>{247, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2534</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2535</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2532</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323998977.39440101</real>
-		<string>{0, 1393}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2537</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2538</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>358</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324400472.07226503</real>
-		<string>{0, 3189}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2540</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2541</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2542</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323916640.42540002</real>
-		<string>{3272, 1581}</string>
-		<string>{4662, 20}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2544</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2545</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2546</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324429732.66660303</real>
-		<string>{3267, 2188}</string>
-		<string>{3258, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2548</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2549</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2550</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324426667.94757599</real>
-		<string>{0, 2638}</string>
-		<string>{2084, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2552</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2553</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2532</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323991925.66436201</real>
-		<string>{0, 737}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2555</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2556</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2557</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324432773.92324698</real>
-		<string>{2871, 1937}</string>
-		<string>{3733, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2559</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2560</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2561</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323918775.21388799</real>
-		<string>{825, 1664}</string>
-		<string>{3364, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2563</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2564</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2565</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323991958.93438703</real>
-		<string>{0, 947}</string>
-		<string>{243, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2567</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2568</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>358</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323995435.26982701</real>
-		<string>{0, 904}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2570</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2571</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>358</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323963868.237019</real>
-		<string>{0, 1445}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2573</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2574</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2575</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324414176.27392399</real>
-		<string>{11291, 1545}</string>
-		<string>{12802, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2577</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2578</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2579</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324401544.86127102</real>
-		<string>{0, 2259}</string>
-		<string>{1883, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2581</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2582</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>358</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323993804.56084901</real>
-		<string>{0, 118}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2584</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2585</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>358</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323994255.81979299</real>
-		<string>{0, 7}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2587</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2588</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>358</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323995809.48964798</real>
-		<string>{0, 97}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2590</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2591</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2592</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324437798.21673</real>
-		<string>{3553, 2268}</string>
-		<string>{3868, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2594</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2595</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2596</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324432938.69757497</real>
-		<string>{394, 2191}</string>
-		<string>{9292, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>567</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>568</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>569</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>570</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2598</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2599</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2600</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324440456.98038799</real>
-		<string>{2869, 1679}</string>
-		<string>{3716, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2602</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2603</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2604</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324436297.57894599</real>
-		<string>{4094, 2581}</string>
-		<string>{4957, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2606</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2607</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2608</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323991935.93480003</real>
-		<string>{0, 902}</string>
-		<string>{253, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2610</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2611</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2612</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324412765.68417799</real>
-		<string>{2555, 1260}</string>
-		<string>{3290, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2614</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2615</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2616</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323997773.22955102</real>
-		<string>{0, 1098}</string>
-		<string>{190, 239}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2618</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2619</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2620</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323997633.580167</real>
-		<string>{0, 1074}</string>
-		<string>{200, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2622</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2623</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2624</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323998098.80162501</real>
-		<string>{0, 1691}</string>
-		<string>{390, 249}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2626</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2627</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2628</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324413128.654562</real>
-		<string>{3, 2278}</string>
-		<string>{1887, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2630</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2631</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2632</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323998229.417656</real>
-		<string>{0, 2002}</string>
-		<string>{960, 242}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2634</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2635</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>358</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323998272.29509199</real>
-		<string>{0, 1289}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2637</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2638</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2532</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323993444.857252</real>
-		<string>{0, 1036}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2640</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2641</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2642</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323997879.67560601</real>
-		<string>{0, 1109}</string>
-		<string>{197, 238}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2644</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2645</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>358</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323996597.73368597</real>
-		<string>{0, 748}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2647</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2648</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2649</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323997564.08925098</real>
-		<string>{0, 955}</string>
-		<string>{211, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2651</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2652</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>358</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323997740.41328001</real>
-		<string>{0, 631}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2654</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2655</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>268</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323991956.51889098</real>
-		<string>{0, 821}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2657</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2658</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>358</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323914776.143372</real>
-		<string>{0, 2221}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2660</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2661</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2662</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324431511.42497897</real>
-		<string>{0, 2454}</string>
-		<string>{2246, 11}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2664</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2665</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2666</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324400607.254843</real>
-		<string>{1283, 2182}</string>
-		<string>{6261, 1}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2668</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2669</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2670</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324436274.26169902</real>
-		<string>{7238, 2038}</string>
-		<string>{8431, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2672</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2673</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2674</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323917736.789765</real>
-		<string>{5708, 1546}</string>
-		<string>{6321, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2676</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2677</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2565</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323995781.52013803</real>
-		<string>{0, 909}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2679</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2680</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2681</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323917645.241445</real>
-		<string>{0, 1288}</string>
-		<string>{127, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2683</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2684</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2685</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324431658.89625299</real>
-		<string>{0, 2174}</string>
-		<string>{1817, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2687</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2688</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2689</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323998717.00971699</real>
-		<string>{46491, 2812}</string>
-		<string>{24064, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2691</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2692</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2693</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323991960.92231297</real>
-		<string>{0, 849}</string>
-		<string>{254, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2695</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2696</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>358</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323995447.02758801</real>
-		<string>{0, 195}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2698</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2699</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>358</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324432009.839122</real>
-		<string>{0, 2419}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2701</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2702</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2703</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324422636.81480199</real>
-		<string>{4578, 1748}</string>
-		<string>{5858, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2705</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2706</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>358</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323993798.49312198</real>
-		<string>{0, 233}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2708</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2709</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>358</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324436728.64446801</real>
-		<string>{0, 1681}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2711</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2712</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2713</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323917693.27358299</real>
-		<string>{0, 1837}</string>
-		<string>{1836, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2715</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2716</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>358</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324422407.05101901</real>
-		<string>{0, 2563}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2718</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2719</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2720</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324426155.38032198</real>
-		<string>{2376, 2026}</string>
-		<string>{1582, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2722</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2723</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2724</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323917102.30272698</real>
-		<string>{0, 1158}</string>
-		<string>{543, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2726</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2727</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>358</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323916228.22060299</real>
-		<string>{0, 3469}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2729</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2730</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2731</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323963859.82644898</real>
-		<string>{2834, 1401}</string>
-		<string>{3758, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2733</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2734</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2735</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324409948.76730502</real>
-		<string>{1181, 1454}</string>
-		<string>{2325, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2737</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2738</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>358</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323916551.38835502</real>
-		<string>{0, 2730}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2740</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2741</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2742</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324426418.68622297</real>
-		<string>{0, 2343}</string>
-		<string>{1931, 13}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2744</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2745</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2746</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324412735.31168002</real>
-		<string>{1359, 1828}</string>
-		<string>{2852, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2748</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2749</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2750</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324414185.99766701</real>
-		<string>{2616, 1311}</string>
-		<string>{3656, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>567</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>568</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>569</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>570</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2752</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2753</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2754</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324440370.639184</real>
-		<string>{0, 2023}</string>
-		<string>{1752, 83}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2756</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2757</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2758</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324437798.219513</real>
-		<string>{9059, 2872}</string>
-		<string>{9164, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2760</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2761</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2762</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324431765.90748399</real>
-		<string>{1492, 2008}</string>
-		<string>{2875, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2764</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2765</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2766</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323996535.758793</real>
-		<string>{380, 2043}</string>
-		<string>{2367, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2768</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2769</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2770</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324436864.92715198</real>
-		<string>{0, 1684}</string>
-		<string>{4936, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2772</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2773</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2774</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323991883.09180599</real>
-		<string>{0, 775}</string>
-		<string>{256, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2776</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2777</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2565</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323991947.84153402</real>
-		<string>{0, 755}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2779</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2780</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2781</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323991940.85978901</real>
-		<string>{0, 895}</string>
-		<string>{250, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2783</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2780</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2784</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323991949.74583501</real>
-		<string>{239, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2786</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2787</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2788</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323993442.86846501</real>
-		<string>{584, 1666}</string>
-		<string>{233, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2790</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2791</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>358</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324417873.568241</real>
-		<string>{0, 1255}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2793</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2794</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2795</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324425413.43702298</real>
-		<string>{0, 3283}</string>
-		<string>{1739, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2797</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2798</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>358</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323968006.69858402</real>
-		<string>{0, 923}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2800</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2801</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2802</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324431829.74965</real>
-		<string>{5540, 1396}</string>
-		<string>{6662, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2804</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2805</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2806</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324437401.74129099</real>
-		<string>{0, 3346}</string>
-		<string>{1797, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2808</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2809</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2810</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324421435.024073</real>
-		<string>{102, 2861}</string>
-		<string>{193, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2812</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2813</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2814</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324426394.96874899</real>
-		<string>{0, 2146}</string>
-		<string>{1639, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2816</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2817</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2818</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324436606.93009198</real>
-		<string>{3687, 1874}</string>
-		<string>{4722, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2820</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2821</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2822</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323999071.56422198</real>
-		<string>{12932, 1171}</string>
-		<string>{13981, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2824</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2825</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2826</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323995848.84945101</real>
-		<string>{21965, 1757}</string>
-		<string>{22896, 95}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2828</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2829</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2830</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324415593.73750901</real>
-		<string>{5439, 1874}</string>
-		<string>{7064, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2832</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2833</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>358</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323917117.24232203</real>
-		<string>{2409, 1259}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2835</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2836</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2837</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324410006.29558802</real>
-		<string>{1940, 2182}</string>
-		<string>{3080, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>567</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>568</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>569</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>570</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2839</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2840</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2841</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324440890.34305298</real>
-		<string>{3432, 2012}</string>
-		<string>{4860, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>567</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>568</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>569</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>570</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2843</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2844</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2845</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324440890.34319198</real>
-		<string>{78, 2018}</string>
-		<string>{1759, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2847</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2848</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2849</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323917830.14173597</real>
-		<string>{6240, 2512}</string>
-		<string>{7297, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2851</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2852</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>151</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324431694.36976302</real>
-		<string>{0, 2678}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2854</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2855</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2856</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324431995.00957501</real>
-		<string>{3979, 1931}</string>
-		<string>{4147, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2858</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2859</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2860</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324413092.90767199</real>
-		<string>{341, 2680}</string>
-		<string>{2305, 34}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2862</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2863</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2864</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324399293.830338</real>
-		<string>{6483, 1894}</string>
-		<string>{7621, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2866</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2867</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2868</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324422940.22563303</real>
-		<string>{3038, 2830}</string>
-		<string>{5494, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2870</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2871</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2872</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323998972.84941399</real>
-		<string>{0, 1716}</string>
-		<string>{236, 19}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>567</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>568</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>569</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>570</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2874</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2875</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2876</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324440838.34989101</real>
-		<string>{0, 1840}</string>
-		<string>{1601, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2878</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2879</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>358</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323916742.91389602</real>
-		<string>{0, 3071}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2881</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2882</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>358</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323995798.68886</real>
-		<string>{0, 587}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2884</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2885</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2886</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324426367.06206697</real>
-		<string>{739, 1744}</string>
-		<string>{1634, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2888</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2889</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2890</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323919665.61871201</real>
-		<string>{2253, 1777}</string>
-		<string>{3066, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2892</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2893</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2894</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323917746.03652102</real>
-		<string>{1269, 1981}</string>
-		<string>{3133, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2896</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2897</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2532</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323999027.071006</real>
-		<string>{0, 1113}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2899</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2900</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2901</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324415638.39336997</real>
-		<string>{524, 2814}</string>
-		<string>{2988, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>567</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>568</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>569</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>570</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2903</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2904</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>358</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324441058.64298302</real>
-		<string>{47, 2017}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2906</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2907</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2908</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323999335.35239202</real>
-		<string>{2017, 2058}</string>
-		<string>{3482, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2910</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2911</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2912</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324437832.25074202</real>
-		<string>{1951, 2511}</string>
-		<string>{2100, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2914</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2915</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2916</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324421603.58039403</real>
-		<string>{2413, 2126}</string>
-		<string>{3075, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2918</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2919</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2784</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323991938.742567</real>
-		<string>{0, 905}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2921</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2922</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2784</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323991951.46779501</real>
-		<string>{0, 920}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2924</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2925</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2926</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324402854.21050298</real>
-		<string>{0, 2222}</string>
-		<string>{559, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2928</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2929</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2930</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324400673.29259199</real>
-		<string>{1813, 941}</string>
-		<string>{2099, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2932</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2933</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2788</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323991962.84279197</real>
-		<string>{0, 924}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2935</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2936</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>358</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324400461.89105803</real>
-		<string>{0, 2382}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2938</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>926</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>927</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323991202.52781898</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2940</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2941</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2942</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324422018.73711902</real>
-		<string>{0, 2893}</string>
-		<string>{1632, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2944</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2946</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2948</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2950</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2952</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2955</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2957</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2959</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2945</integer>
-			</dict>
-		</dict>
-		<string>x-xcode-log://D77EB64F-D96E-4EE1-9AD5-C2E8CC6078D1</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2947</integer>
-			</dict>
-		</dict>
-		<string>x-xcode-log://F5EF2CEA-3A6E-4CE0-88F1-CD36958A1A8E</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2949</integer>
-			</dict>
-		</dict>
-		<string>x-xcode-log://4C3C7F23-F763-4ED2-A9D1-2D50EAB289F4</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2951</integer>
-			</dict>
-		</dict>
-		<string>x-xcode-log://2CCA3A1A-094A-4C2D-8C04-BDB027FCB6DA</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2953</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2954</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>DBGConsoleLogEditorScrollRange</string>
-		<string>{7913, 4599}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2953</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2956</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>{0, 2227}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2953</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2958</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>{745, 2156}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2953</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2960</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>{11436, 1351}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2962</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1924</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2964</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2018</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2002</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2965</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2967</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2969</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2971</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2008</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2973</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2975</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2977</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2979</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2981</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2982</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2983</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2984</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2992</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2993</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2998</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3003</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3004</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3009</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3014</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3019</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3024</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3027</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2963</integer>
-			</dict>
-		</dict>
-		<string>x-xcode-log://CF5FF470-4F4A-4184-96B3-5B2F8B4DADFF</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1923</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2966</integer>
-			</dict>
-		</dict>
-		<string>x-xcode-log://F12883C6-1F90-4A68-A7B2-A84A97A444FF</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2968</integer>
-			</dict>
-		</dict>
-		<string>x-xcode-log://C56D6006-8D04-4E05-8056-E1B0EAE370EC</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2970</integer>
-			</dict>
-		</dict>
-		<string>x-xcode-log://35FB82FA-7610-48F5-AA8F-444EB49C032E</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2972</integer>
-			</dict>
-		</dict>
-		<string>x-xcode-log://86811926-3971-46D4-A0DD-2A6798C8B85F</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2974</integer>
-			</dict>
-		</dict>
-		<string>x-xcode-log://F062C011-F180-4D28-8936-769801EA2730</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2976</integer>
-			</dict>
-		</dict>
-		<string>x-xcode-log://0C4538B8-C5BC-4D32-AEC7-BC703EA08568</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2978</integer>
-			</dict>
-		</dict>
-		<string>x-xcode-log://4B1732E0-4B96-4015-94F9-C167BBAAE89D</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2980</integer>
-			</dict>
-		</dict>
-		<string>x-xcode-log://935AF1AA-6982-47AB-B679-13A9D4F93CE6</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>436</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>184</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>436</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>184</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>436</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>184</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2985</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2986</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>SelectedDocumentLocations</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2987</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2991</integer>
-			</dict>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2019</integer>
-			</dict>
-			<key>expandTranscript</key>
-			<false/>
-			<key>indexPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2988</integer>
-			</dict>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2990</integer>
-			</dict>
-			<key>NSIndexPathData</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2989</integer>
-			</dict>
-			<key>NSIndexPathLength</key>
-			<integer>3</integer>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1904</integer>
-			</dict>
-			<key>NS.data</key>
-			<data>
-			AFEG
-			</data>
-		</dict>
-		<dict>
-			<key>$classes</key>
-			<array>
-				<string>NSIndexPath</string>
-				<string>NSObject</string>
-			</array>
-			<key>$classname</key>
-			<string>NSIndexPath</string>
-		</dict>
-		<dict>
-			<key>$classes</key>
-			<array>
-				<string>IDELogDocumentLocation</string>
-				<string>DVTDocumentLocation</string>
-				<string>NSObject</string>
-			</array>
-			<key>$classname</key>
-			<string>IDELogDocumentLocation</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2985</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>184</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>436</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2994</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2995</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2991</integer>
-			</dict>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2966</integer>
-			</dict>
-			<key>expandTranscript</key>
-			<false/>
-			<key>indexPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2996</integer>
-			</dict>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2990</integer>
-			</dict>
-			<key>NSIndexPathData</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2997</integer>
-			</dict>
-			<key>NSIndexPathLength</key>
-			<integer>2</integer>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1904</integer>
-			</dict>
-			<key>NS.data</key>
-			<data>
-			AQE=
-			</data>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>436</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2999</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3000</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2991</integer>
-			</dict>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2968</integer>
-			</dict>
-			<key>expandTranscript</key>
-			<false/>
-			<key>indexPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3001</integer>
-			</dict>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2990</integer>
-			</dict>
-			<key>NSIndexPathData</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3002</integer>
-			</dict>
-			<key>NSIndexPathLength</key>
-			<integer>2</integer>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1904</integer>
-			</dict>
-			<key>NS.data</key>
-			<data>
-			AAI=
-			</data>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>436</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>184</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>436</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3005</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3006</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2991</integer>
-			</dict>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2972</integer>
-			</dict>
-			<key>expandTranscript</key>
-			<false/>
-			<key>indexPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3007</integer>
-			</dict>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2990</integer>
-			</dict>
-			<key>NSIndexPathData</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3008</integer>
-			</dict>
-			<key>NSIndexPathLength</key>
-			<integer>2</integer>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1904</integer>
-			</dict>
-			<key>NS.data</key>
-			<data>
-			AL8B
-			</data>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2985</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3010</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3011</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2991</integer>
-			</dict>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2009</integer>
-			</dict>
-			<key>expandTranscript</key>
-			<false/>
-			<key>indexPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3012</integer>
-			</dict>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2990</integer>
-			</dict>
-			<key>NSIndexPathData</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3013</integer>
-			</dict>
-			<key>NSIndexPathLength</key>
-			<integer>3</integer>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1904</integer>
-			</dict>
-			<key>NS.data</key>
-			<data>
-			ACwA
-			</data>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>436</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3015</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3016</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2991</integer>
-			</dict>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2974</integer>
-			</dict>
-			<key>expandTranscript</key>
-			<false/>
-			<key>indexPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3017</integer>
-			</dict>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2990</integer>
-			</dict>
-			<key>NSIndexPathData</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3018</integer>
-			</dict>
-			<key>NSIndexPathLength</key>
-			<integer>2</integer>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1904</integer>
-			</dict>
-			<key>NS.data</key>
-			<data>
-			AAA=
-			</data>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>436</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3020</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3021</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2991</integer>
-			</dict>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2976</integer>
-			</dict>
-			<key>expandTranscript</key>
-			<false/>
-			<key>indexPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3022</integer>
-			</dict>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2990</integer>
-			</dict>
-			<key>NSIndexPathData</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3023</integer>
-			</dict>
-			<key>NSIndexPathLength</key>
-			<integer>3</integer>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1904</integer>
-			</dict>
-			<key>NS.data</key>
-			<data>
-			AQMA
-			</data>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>436</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3025</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3026</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2991</integer>
-			</dict>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2978</integer>
-			</dict>
-			<key>expandTranscript</key>
-			<false/>
-			<key>indexPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2996</integer>
-			</dict>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>436</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>184</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3029</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3030</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDENameString</string>
-		<string>ANTLR</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>637</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>474</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3032</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3033</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>473</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>45</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>477</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>472</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3034</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3974</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3975</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4203</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3033</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>25</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4324</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEWorkspaceTabController_F18AFCAA-0B06-4A4A-B3A3-172BB6FE3FF0</string>
-		<string>IDEWorkspaceTabController_0E300015-F55C-40BA-9D74-6F096B3B8016</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>51</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>52</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>53</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>54</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>57</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>58</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3035</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3036</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3133</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3960</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3966</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>ANTLRTreeAdaptor.m</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>62</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>63</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>64</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>65</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>66</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>67</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>642</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>68</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>69</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3037</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3038</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3053</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3064</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3083</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3127</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>73</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>74</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>75</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>76</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>77</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>78</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3039</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3045</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3051</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3052</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3040</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3041</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3043</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3042</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>309</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3044</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>459</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3046</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3047</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3049</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3048</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>309</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3050</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>459</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>100</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>103</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>124</integer>
-			</dict>
-			<key>geniusEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>primaryEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3054</integer>
-			</dict>
-			<key>rootLayoutTreeNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3062</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>1</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3055</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3062</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3060</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>107</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3056</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>60</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3057</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3058</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3059</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3035</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>112</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>114</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>119</integer>
-			</dict>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3061</integer>
-			</dict>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRTreeAdaptor.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3063</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>0</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3054</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>126</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3065</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>128</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3066</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>130</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>131</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>132</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3067</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3081</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3068</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>141</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>135</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>137</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>138</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>139</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>140</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>136</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3069</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>142</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3074</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3035</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>152</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3078</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3080</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3060</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>107</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3070</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>60</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3071</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3072</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3073</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3035</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>112</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>114</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3075</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3076</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3077</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324436605.33686697</real>
-		<string>{6581, 1360}</string>
-		<string>{3905, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3079</integer>
-			</dict>
-		</dict>
-		<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRTreeAdaptor.m</string>
-		<string>-copyNode:</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3082</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>{{0, 0}, {769, 925}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>126</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>702</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3084</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3126</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>128</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>704</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3085</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3103</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>130</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>131</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>132</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3086</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3101</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3087</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>135</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>136</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>137</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>138</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>139</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>140</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>141</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>142</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3088</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3089</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3035</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>152</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3093</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3094</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>-newTreeWithTokenType:</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3090</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3091</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3092</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324412008.05151898</real>
-		<string>{1608, 1437}</string>
-		<string>{2146, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3079</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3099</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>107</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3095</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>60</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3096</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3097</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3098</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3035</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>112</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>114</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>119</integer>
-			</dict>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3100</integer>
-			</dict>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRTreeAdaptor.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3102</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>{{0, 0}, {1239, 891}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>130</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>131</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>132</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3104</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3124</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3105</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>135</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>136</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>137</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>138</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>139</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>140</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>141</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>142</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3106</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3107</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3111</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>269</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3112</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3114</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>-createTree:</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3108</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3109</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3110</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324412008.05183703</real>
-		<string>{2872, 2448}</string>
-		<string>{1770, 14}</string>
-		<string>ANTLRTreeAdaptor.h</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3113</integer>
-			</dict>
-		</dict>
-		<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRTreeAdaptor.h</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3122</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3115</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>60</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3116</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3117</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3118</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3120</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3111</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>112</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>676</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3119</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>114</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>107</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>manualDomainIdentifier</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>679</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3121</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>Xcode.IDEKit.GeniusCategory.Manual</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>119</integer>
-			</dict>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3123</integer>
-			</dict>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRTreeAdaptor.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3125</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>{{0, 0}, {727, 891}}</string>
-		<real>0.41242939233779907</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3128</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3129</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3131</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>166</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3130</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>203</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>169</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3132</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>115</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>173</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1501</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>174</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>175</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3134</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>286</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3135</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3149</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>174</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3952</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3956</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>Xcode.DebuggerKit.ThreadsStacksNavigator</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>178</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>179</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>180</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>182</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>183</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3136</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3138</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3139</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3137</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>114</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>{{0, 0}, {456, 847}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>187</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3140</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3141</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3142</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3144</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>114</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>114</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>379</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>114</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>253</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3143</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>scopes</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>114</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>253</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1504</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1505</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1506</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1507</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1508</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1509</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1510</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1513</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3148</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1174</integer>
-			</dict>
-			<key>NSRangeCount</key>
-			<integer>0</integer>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1176</integer>
-			</dict>
-			<key>NSRangeCount</key>
-			<integer>0</integer>
-		</dict>
-		<string>invalidNode</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>189</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>190</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>191</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>192</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>193</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>194</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>195</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>196</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>197</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3150</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3156</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3906</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3949</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3950</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3951</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>251</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3151</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>337</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3152</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3143</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3153</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3154</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3155</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>377</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>hoistedPredicates</string>
-		<string>LL-start</string>
-		<string>lexertest-simple</string>
-		<string>Fuzzy</string>
-		<string>polydiff</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3157</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3199</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3230</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3252</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3269</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3297</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3326</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3354</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3499</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3608</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3627</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3635</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3641</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3681</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3741</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3765</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3783</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3800</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3815</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3826</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3840</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3863</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3869</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3894</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3164</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3195</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3195</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3196</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>type</string>
-		<string>subissues</string>
-		<string>shortMessage</string>
-		<string>fullMessage</string>
-		<string>documentLocations</string>
-		<string>Semantic Issue</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3165</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3189</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3166</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3187</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3187</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3188</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3167</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3175</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3181</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3169</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3170</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3170</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3171</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>Uncategorized</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>In file included from /Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLR/../ANTLRBaseTreeAdaptor.h:28:</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3172</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3173</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>27</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>27</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBaseTreeAdaptor.h</string>
-		</dict>
-		<dict>
-			<key>$classes</key>
-			<array>
-				<string>DVTTextDocumentLocation</string>
-				<string>DVTDocumentLocation</string>
-				<string>NSObject</string>
-			</array>
-			<key>$classname</key>
-			<string>DVTTextDocumentLocation</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3176</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3178</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>In file included from /Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLR/../ANTLRBaseTreeAdaptor.m:27:</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3179</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3180</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>26</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>26</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBaseTreeAdaptor.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3182</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3183</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3183</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3184</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Method declared here in /Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRTreeAdaptor.h</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3185</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3186</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>0</integer>
-			<key>endingLineNumber</key>
-			<integer>124</integer>
-			<key>startingColumnNumber</key>
-			<integer>0</integer>
-			<key>startingLineNumber</key>
-			<integer>124</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRTreeAdaptor.h</string>
-		</dict>
-		<string>Method declared here</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3185</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3190</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3191</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3191</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3192</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Required for direct or indirect protocol 'ANTLRTreeAdaptor'</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3193</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3194</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>0</integer>
-			<key>endingLineNumber</key>
-			<integer>31</integer>
-			<key>startingColumnNumber</key>
-			<integer>0</integer>
-			<key>startingLineNumber</key>
-			<integer>31</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBaseTreeAdaptor.h</string>
-		</dict>
-		<string>Method in protocol not implemented</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3197</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3198</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>0</integer>
-			<key>endingLineNumber</key>
-			<integer>31</integer>
-			<key>startingColumnNumber</key>
-			<integer>0</integer>
-			<key>startingLineNumber</key>
-			<integer>31</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBaseTreeAdaptor.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3200</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3223</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3224</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3225</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3201</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3202</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3217</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3217</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3218</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3203</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3210</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3204</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3205</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3205</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3206</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>In file included from /Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLR/../ANTLRCommonTokenStream.m:28:</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3207</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3208</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>27</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>27</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3209</integer>
-			</dict>
-		</dict>
-		<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRCommonTokenStream.m</string>
-		<real>0.0</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3211</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3212</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3212</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3213</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Previous definition is here in /Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRCommonTokenStream.h</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3214</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3215</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>84</integer>
-			<key>endingLineNumber</key>
-			<integer>50</integer>
-			<key>startingColumnNumber</key>
-			<integer>84</integer>
-			<key>startingLineNumber</key>
-			<integer>50</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3216</integer>
-			</dict>
-		</dict>
-		<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRCommonTokenStream.h</string>
-		<real>0.0</real>
-		<string>Previous definition is here</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3219</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3221</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3215</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>84</integer>
-			<key>endingLineNumber</key>
-			<integer>50</integer>
-			<key>startingColumnNumber</key>
-			<integer>84</integer>
-			<key>startingLineNumber</key>
-			<integer>50</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3220</integer>
-			</dict>
-		</dict>
-		<real>0.0</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3215</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>83</integer>
-			<key>endingLineNumber</key>
-			<integer>50</integer>
-			<key>startingColumnNumber</key>
-			<integer>73</integer>
-			<key>startingLineNumber</key>
-			<integer>50</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3222</integer>
-			</dict>
-		</dict>
-		<real>0.0</real>
-		<string>Conflicting parameter types in implementation of 'initWithTokenSource:Channel:': 'NSUInteger'</string>
-		<string>Conflicting parameter types in implementation of 'initWithTokenSource:Channel:': 'NSUInteger' (aka 'unsigned int') vs 'NSInteger' (aka 'int')</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3226</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3228</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3208</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>83</integer>
-			<key>endingLineNumber</key>
-			<integer>72</integer>
-			<key>startingColumnNumber</key>
-			<integer>83</integer>
-			<key>startingLineNumber</key>
-			<integer>72</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3227</integer>
-			</dict>
-		</dict>
-		<real>0.0</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3208</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>82</integer>
-			<key>endingLineNumber</key>
-			<integer>72</integer>
-			<key>startingColumnNumber</key>
-			<integer>73</integer>
-			<key>startingLineNumber</key>
-			<integer>72</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3229</integer>
-			</dict>
-		</dict>
-		<real>0.0</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3231</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3224</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3224</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3249</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3232</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3233</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3217</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3217</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3244</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3234</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3239</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3235</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3205</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3205</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3236</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3237</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3208</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>27</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>27</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3238</integer>
-			</dict>
-		</dict>
-		<real>0.0</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3240</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3212</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3212</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3241</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3242</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3215</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>84</integer>
-			<key>endingLineNumber</key>
-			<integer>50</integer>
-			<key>startingColumnNumber</key>
-			<integer>84</integer>
-			<key>startingLineNumber</key>
-			<integer>50</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3243</integer>
-			</dict>
-		</dict>
-		<real>0.0</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3245</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3247</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3215</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>84</integer>
-			<key>endingLineNumber</key>
-			<integer>50</integer>
-			<key>startingColumnNumber</key>
-			<integer>84</integer>
-			<key>startingLineNumber</key>
-			<integer>50</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3246</integer>
-			</dict>
-		</dict>
-		<real>0.0</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3215</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>83</integer>
-			<key>endingLineNumber</key>
-			<integer>50</integer>
-			<key>startingColumnNumber</key>
-			<integer>73</integer>
-			<key>startingLineNumber</key>
-			<integer>50</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3248</integer>
-			</dict>
-		</dict>
-		<real>0.0</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3250</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3251</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3208</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>72</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>72</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3208</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>72</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>72</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3253</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3254</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3267</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3267</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3268</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>Lexical or Preprocessor Issue</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3255</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3261</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3256</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3257</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3257</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3258</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>In file included from /Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLR/../examples/simplecTreeParser/SimpleCParser.m:46:</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3259</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3260</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>45</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>45</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCParser.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3262</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3263</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3263</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3264</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>'ANTLR/ANTLR.h' file not found in /Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCParser.h</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3265</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3266</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>8</integer>
-			<key>endingLineNumber</key>
-			<integer>6</integer>
-			<key>startingColumnNumber</key>
-			<integer>8</integer>
-			<key>startingLineNumber</key>
-			<integer>6</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCParser.h</string>
-		</dict>
-		<string>'ANTLR/ANTLR.h' file not found</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3265</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3270</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3195</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3195</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3294</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3271</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3289</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3272</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3187</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3187</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3288</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3273</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3278</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3283</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3274</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3170</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3170</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3275</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3276</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3277</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>27</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>27</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBaseTreeAdaptor.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3279</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3280</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3281</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3282</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>26</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>26</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBaseTreeAdaptor.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3284</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3183</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3183</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3285</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3286</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3287</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>0</integer>
-			<key>endingLineNumber</key>
-			<integer>38</integer>
-			<key>startingColumnNumber</key>
-			<integer>0</integer>
-			<key>startingLineNumber</key>
-			<integer>38</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRTreeAdaptor.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3286</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3290</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3191</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3191</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3291</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3292</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3293</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>0</integer>
-			<key>endingLineNumber</key>
-			<integer>31</integer>
-			<key>startingColumnNumber</key>
-			<integer>0</integer>
-			<key>startingLineNumber</key>
-			<integer>31</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBaseTreeAdaptor.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3295</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3296</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>31</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>31</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBaseTreeAdaptor.m</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3298</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3319</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3320</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3321</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3299</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3300</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3217</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3217</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3314</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3301</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3308</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3302</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3303</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3303</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3304</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>In file included from /Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLR/../ANTLRBaseTree.m:28:</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3305</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3306</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>27</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>27</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3307</integer>
-			</dict>
-		</dict>
-		<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBaseTree.m</string>
-		<real>0.0</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3309</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3310</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3310</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3311</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Previous definition is here in /Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBaseTree.h</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3312</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1941</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>32</integer>
-			<key>endingLineNumber</key>
-			<integer>126</integer>
-			<key>startingColumnNumber</key>
-			<integer>32</integer>
-			<key>startingLineNumber</key>
-			<integer>126</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3313</integer>
-			</dict>
-		</dict>
-		<real>0.0</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3315</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3317</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1941</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>32</integer>
-			<key>endingLineNumber</key>
-			<integer>126</integer>
-			<key>startingColumnNumber</key>
-			<integer>32</integer>
-			<key>startingLineNumber</key>
-			<integer>126</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3316</integer>
-			</dict>
-		</dict>
-		<real>0.0</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1941</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>30</integer>
-			<key>endingLineNumber</key>
-			<integer>126</integer>
-			<key>startingColumnNumber</key>
-			<integer>20</integer>
-			<key>startingLineNumber</key>
-			<integer>126</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3318</integer>
-			</dict>
-		</dict>
-		<real>0.0</real>
-		<string>Conflicting parameter types in implementation of 'deleteChild:': 'NSUInteger'</string>
-		<string>Conflicting parameter types in implementation of 'deleteChild:': 'NSUInteger' (aka 'unsigned int') vs 'NSInteger' (aka 'int')</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3322</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3324</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3306</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>31</integer>
-			<key>endingLineNumber</key>
-			<integer>226</integer>
-			<key>startingColumnNumber</key>
-			<integer>31</integer>
-			<key>startingLineNumber</key>
-			<integer>226</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3323</integer>
-			</dict>
-		</dict>
-		<real>0.0</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3306</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>29</integer>
-			<key>endingLineNumber</key>
-			<integer>226</integer>
-			<key>startingColumnNumber</key>
-			<integer>20</integer>
-			<key>startingLineNumber</key>
-			<integer>226</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3325</integer>
-			</dict>
-		</dict>
-		<real>0.0</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3327</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3351</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3351</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3352</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3328</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3346</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3329</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3187</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3187</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3345</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3330</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3335</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3340</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3331</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3170</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3170</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3332</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3333</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3334</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>27</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>27</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBaseTreeAdaptor.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3336</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3337</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3338</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3339</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>26</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>26</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBaseTreeAdaptor.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3341</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3183</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3183</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3342</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3343</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3344</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>0</integer>
-			<key>endingLineNumber</key>
-			<integer>38</integer>
-			<key>startingColumnNumber</key>
-			<integer>0</integer>
-			<key>startingLineNumber</key>
-			<integer>38</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRTreeAdaptor.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3343</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3347</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3191</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3191</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3348</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3349</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3350</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>0</integer>
-			<key>endingLineNumber</key>
-			<integer>31</integer>
-			<key>startingColumnNumber</key>
-			<integer>0</integer>
-			<key>startingLineNumber</key>
-			<integer>31</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBaseTreeAdaptor.h</string>
-		</dict>
-		<string>Incomplete implementation</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3353</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3296</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>32</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>32</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3355</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3351</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3351</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3497</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3356</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3362</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3367</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3372</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3377</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3382</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3387</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3392</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3397</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3402</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3407</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3412</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3417</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3422</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3427</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3432</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3437</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3442</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3447</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3452</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3457</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3462</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3467</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3472</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3477</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3482</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3487</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3492</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3357</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3358</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3358</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3359</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Method definition for 'init' not found</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3360</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3361</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>38</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>38</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBaseTreeAdaptor.h</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3363</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3364</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3364</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3365</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Method definition for 'copyWithZone:' not found</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3366</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3361</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>40</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>40</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3368</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3369</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3369</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3370</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Method definition for 'emptyNode' not found</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3371</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3361</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>42</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>42</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3373</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3374</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3374</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3375</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Method definition for 'errorNode:From:To:Exception:' not found</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3376</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3361</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>55</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>55</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3378</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3379</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3379</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3380</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Method definition for 'isNil:' not found</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3381</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3361</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>60</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>60</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3383</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3384</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3384</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3385</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Method definition for 'dupTree:' not found</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3386</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3361</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>62</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>62</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3388</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3389</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3389</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3390</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Method definition for 'dupTree:Parent:' not found</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3391</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3361</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>68</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>68</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3393</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3394</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3394</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3395</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Method definition for 'dupNode:' not found</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3396</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3361</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>69</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>69</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3398</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3399</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3399</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3400</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Method definition for 'addChild:toTree:' not found</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3401</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3361</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>77</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>77</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3403</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3404</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3404</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3405</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Method definition for 'becomeRoot:old:' not found</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3406</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3361</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>105</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>105</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3408</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3409</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3409</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3410</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Method definition for 'rulePostProcessing:' not found</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3411</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3361</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>108</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>108</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3413</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3414</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3414</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3415</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Method definition for 'becomeRootfromToken:old:' not found</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3416</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3361</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>110</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>110</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3418</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3419</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3419</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3420</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Method definition for 'createTree:FromToken:' not found</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3421</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3361</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>112</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>112</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3423</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3424</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3424</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3425</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Method definition for 'createTree:FromToken:Text:' not found</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3426</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3361</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>114</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>114</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3428</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3429</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3429</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3430</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Method definition for 'createTree:Text:' not found</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3431</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3361</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>116</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>116</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3433</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3434</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3434</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3435</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Method definition for 'getType:' not found</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3436</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3361</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>118</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>118</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3438</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3439</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3439</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3440</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Method definition for 'setType:Type:' not found</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3441</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3361</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>120</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>120</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3443</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3444</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3444</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3445</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Method definition for 'getText:' not found</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3446</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3361</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>122</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>122</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3448</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3449</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3449</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3450</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Method definition for 'setText:Text:' not found</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3451</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3361</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>124</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>124</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3453</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3454</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3454</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3455</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Method definition for 'getChild:At:' not found</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3456</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3361</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>126</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>126</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3458</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3459</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3459</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3460</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Method definition for 'setChild:At:Child:' not found</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3461</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3361</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>128</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>128</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3463</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3464</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3464</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3465</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Method definition for 'deleteChild:Index:' not found</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3466</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3361</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>130</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>130</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3468</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3469</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3469</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3470</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Method definition for 'getChildCount:' not found</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3471</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3361</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>132</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>132</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3473</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3474</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3474</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3475</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Method definition for 'getUniqueID:' not found</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3476</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3361</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>134</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>134</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3478</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3479</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3479</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3480</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Method definition for 'getUniqueID' not found</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3481</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3361</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>144</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>144</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3483</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3484</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3484</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3485</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Method definition for 'createToken:Text:' not found</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3486</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3361</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>160</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>160</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3488</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3489</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3489</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3490</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Method definition for 'createToken:' not found</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3491</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3361</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>162</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>162</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3493</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3494</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3494</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3495</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Method definition for 'newEmptyTree' not found</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3496</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3361</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>36</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>36</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3498</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3296</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>31</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>31</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3500</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3351</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3351</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3606</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3501</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3521</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3538</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3555</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3572</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3589</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3502</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3517</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3517</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3518</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3503</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3510</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3504</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3505</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3505</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3506</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>In file included from /Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLR/../ANTLRLexerState.m:27:</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3507</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3508</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>26</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>26</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3509</integer>
-			</dict>
-		</dict>
-		<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRLexerState.m</string>
-		<real>0.0</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3511</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3512</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3512</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3513</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Method definition for 'getTokenType' not found in /Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRLexerState.h</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3514</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3515</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>0</integer>
-			<key>endingLineNumber</key>
-			<integer>38</integer>
-			<key>startingColumnNumber</key>
-			<integer>0</integer>
-			<key>startingLineNumber</key>
-			<integer>38</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3516</integer>
-			</dict>
-		</dict>
-		<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRLexerState.h</string>
-		<real>0.0</real>
-		<string>Method definition for 'getTokenType' not found</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3519</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3515</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>0</integer>
-			<key>endingLineNumber</key>
-			<integer>38</integer>
-			<key>startingColumnNumber</key>
-			<integer>0</integer>
-			<key>startingLineNumber</key>
-			<integer>38</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3520</integer>
-			</dict>
-		</dict>
-		<real>0.0</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3522</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3534</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3534</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3535</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3523</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3528</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3524</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3505</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3505</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3525</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3526</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3508</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>26</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>26</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3527</integer>
-			</dict>
-		</dict>
-		<real>0.0</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3529</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3530</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3530</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3531</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Method definition for 'getChannel' not found in /Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRLexerState.h</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3532</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3515</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>0</integer>
-			<key>endingLineNumber</key>
-			<integer>41</integer>
-			<key>startingColumnNumber</key>
-			<integer>0</integer>
-			<key>startingLineNumber</key>
-			<integer>41</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3533</integer>
-			</dict>
-		</dict>
-		<real>0.0</real>
-		<string>Method definition for 'getChannel' not found</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3536</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3515</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>0</integer>
-			<key>endingLineNumber</key>
-			<integer>41</integer>
-			<key>startingColumnNumber</key>
-			<integer>0</integer>
-			<key>startingLineNumber</key>
-			<integer>41</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3537</integer>
-			</dict>
-		</dict>
-		<real>0.0</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3539</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3551</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3551</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3552</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3540</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3545</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3541</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3505</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3505</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3542</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3543</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3508</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>26</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>26</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3544</integer>
-			</dict>
-		</dict>
-		<real>0.0</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3546</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3547</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3547</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3548</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Method definition for 'getTokenStartLine' not found in /Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRLexerState.h</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3549</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3515</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>0</integer>
-			<key>endingLineNumber</key>
-			<integer>44</integer>
-			<key>startingColumnNumber</key>
-			<integer>0</integer>
-			<key>startingLineNumber</key>
-			<integer>44</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3550</integer>
-			</dict>
-		</dict>
-		<real>0.0</real>
-		<string>Method definition for 'getTokenStartLine' not found</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3553</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3515</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>0</integer>
-			<key>endingLineNumber</key>
-			<integer>44</integer>
-			<key>startingColumnNumber</key>
-			<integer>0</integer>
-			<key>startingLineNumber</key>
-			<integer>44</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3554</integer>
-			</dict>
-		</dict>
-		<real>0.0</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3556</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3568</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3568</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3569</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3557</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3562</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3558</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3505</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3505</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3559</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3560</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3508</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>26</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>26</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3561</integer>
-			</dict>
-		</dict>
-		<real>0.0</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3563</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3564</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3564</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3565</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Method definition for 'getTokenCharPositionInLine' not found in /Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRLexerState.h</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3566</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3515</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>0</integer>
-			<key>endingLineNumber</key>
-			<integer>47</integer>
-			<key>startingColumnNumber</key>
-			<integer>0</integer>
-			<key>startingLineNumber</key>
-			<integer>47</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3567</integer>
-			</dict>
-		</dict>
-		<real>0.0</real>
-		<string>Method definition for 'getTokenCharPositionInLine' not found</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3570</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3515</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>0</integer>
-			<key>endingLineNumber</key>
-			<integer>47</integer>
-			<key>startingColumnNumber</key>
-			<integer>0</integer>
-			<key>startingLineNumber</key>
-			<integer>47</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3571</integer>
-			</dict>
-		</dict>
-		<real>0.0</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3573</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3585</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3585</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3586</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3574</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3579</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3575</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3505</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3505</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3576</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3577</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3508</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>26</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>26</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3578</integer>
-			</dict>
-		</dict>
-		<real>0.0</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3580</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3581</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3581</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3582</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Method definition for 'getTokenStartCharIndex' not found in /Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRLexerState.h</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3583</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3515</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>0</integer>
-			<key>endingLineNumber</key>
-			<integer>50</integer>
-			<key>startingColumnNumber</key>
-			<integer>0</integer>
-			<key>startingLineNumber</key>
-			<integer>50</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3584</integer>
-			</dict>
-		</dict>
-		<real>0.0</real>
-		<string>Method definition for 'getTokenStartCharIndex' not found</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3587</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3515</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>0</integer>
-			<key>endingLineNumber</key>
-			<integer>50</integer>
-			<key>startingColumnNumber</key>
-			<integer>0</integer>
-			<key>startingLineNumber</key>
-			<integer>50</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3588</integer>
-			</dict>
-		</dict>
-		<real>0.0</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3590</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3602</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3602</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3603</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3591</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3596</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3592</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3505</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3505</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3593</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3594</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3508</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>26</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>26</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3595</integer>
-			</dict>
-		</dict>
-		<real>0.0</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3597</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3598</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3598</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3599</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Method definition for 'getText' not found in /Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRLexerState.h</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3600</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3515</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>0</integer>
-			<key>endingLineNumber</key>
-			<integer>53</integer>
-			<key>startingColumnNumber</key>
-			<integer>0</integer>
-			<key>startingLineNumber</key>
-			<integer>53</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3601</integer>
-			</dict>
-		</dict>
-		<real>0.0</real>
-		<string>Method definition for 'getText' not found</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3604</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3515</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>0</integer>
-			<key>endingLineNumber</key>
-			<integer>53</integer>
-			<key>startingColumnNumber</key>
-			<integer>0</integer>
-			<key>startingLineNumber</key>
-			<integer>53</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3605</integer>
-			</dict>
-		</dict>
-		<real>0.0</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3607</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3508</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>29</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>29</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3609</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3351</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3351</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3624</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3610</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3611</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3479</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3479</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3623</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3612</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3617</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3613</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3614</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3615</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3616</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>26</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>26</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBaseTreeAdaptor.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3618</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3619</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3619</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3620</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Method definition for 'getUniqueID' not found in /Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBaseTreeAdaptor.h</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3621</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3622</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>0</integer>
-			<key>endingLineNumber</key>
-			<integer>144</integer>
-			<key>startingColumnNumber</key>
-			<integer>0</integer>
-			<key>startingLineNumber</key>
-			<integer>144</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBaseTreeAdaptor.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3621</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3625</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3626</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>0</integer>
-			<key>endingLineNumber</key>
-			<integer>31</integer>
-			<key>startingColumnNumber</key>
-			<integer>0</integer>
-			<key>startingLineNumber</key>
-			<integer>31</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBaseTreeAdaptor.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3628</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3187</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3187</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3345</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3629</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3631</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3633</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3630</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3170</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3170</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3332</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3632</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3337</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3634</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3183</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3183</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3342</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3636</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3479</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3479</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3623</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3637</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3639</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3638</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3614</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3640</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3619</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3619</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3620</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3642</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3677</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3677</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3678</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3643</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3650</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3657</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3664</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3671</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3644</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3645</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3645</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3646</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>In file included from /Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLR/../examples/combined/antlr3.h:59:</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3647</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3648</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>58</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>58</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3649</integer>
-			</dict>
-		</dict>
-		<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/combined/antlr3.h</string>
-		<real>0.0</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3651</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3652</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3652</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3653</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>In file included from /Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLR/../examples/combined/CombinedLexer.h:7:</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3654</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3655</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>6</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>6</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3656</integer>
-			</dict>
-		</dict>
-		<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/combined/CombinedLexer.h</string>
-		<real>0.0</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3658</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3659</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3659</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3660</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>In file included from /Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLR/../examples/combined/main.m:2:</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3661</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3662</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>1</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>1</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3663</integer>
-			</dict>
-		</dict>
-		<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/combined/main.m</string>
-		<real>0.0</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3665</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3666</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3666</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3667</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Duplicate protocol definition of 'ANTLRIntStream' is ignored in /Users/acondit/Library/Developer/Xcode/DerivedData/ANTLR-awfvqfoybjihuiaoxllmwcgxqxnm/Build/Products/Debug/ANTLR.framework/Headers/ANTLRIntStream.h</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3668</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3669</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>10</integer>
-			<key>endingLineNumber</key>
-			<integer>26</integer>
-			<key>startingColumnNumber</key>
-			<integer>10</integer>
-			<key>startingLineNumber</key>
-			<integer>26</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3670</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLR/../ANTLRIntStream.h</string>
-		</dict>
-		<real>0.0</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3672</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3217</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3217</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3673</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3674</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3675</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>0</integer>
-			<key>endingLineNumber</key>
-			<integer>26</integer>
-			<key>startingColumnNumber</key>
-			<integer>0</integer>
-			<key>startingLineNumber</key>
-			<integer>26</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3676</integer>
-			</dict>
-		</dict>
-		<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRIntStream.h</string>
-		<real>0.0</real>
-		<string>Duplicate protocol definition of 'ANTLRIntStream' is ignored</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3679</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3669</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>10</integer>
-			<key>endingLineNumber</key>
-			<integer>26</integer>
-			<key>startingColumnNumber</key>
-			<integer>10</integer>
-			<key>startingLineNumber</key>
-			<integer>26</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3680</integer>
-			</dict>
-		</dict>
-		<real>0.0</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3682</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3195</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3195</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3739</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3683</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3685</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3687</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3689</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3691</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3693</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3695</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3697</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3699</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3701</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3703</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3705</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3707</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3709</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3711</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3713</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3715</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3717</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3719</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3721</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3723</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3725</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3727</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3729</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3731</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3733</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3735</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3737</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3684</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3358</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3358</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3359</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3686</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3364</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3364</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3365</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3688</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3369</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3369</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3370</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3690</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3374</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3374</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3375</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3692</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3379</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3379</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3380</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3694</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3384</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3384</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3385</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3696</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3389</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3389</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3390</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3698</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3394</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3394</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3395</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3700</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3399</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3399</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3400</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3702</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3404</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3404</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3405</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3704</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3409</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3409</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3410</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3706</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3414</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3414</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3415</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3708</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3419</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3419</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3420</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3710</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3424</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3424</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3425</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3712</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3429</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3429</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3430</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3714</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3434</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3434</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3435</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3716</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3439</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3439</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3440</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3718</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3444</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3444</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3445</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3720</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3449</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3449</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3450</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3722</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3454</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3454</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3455</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3724</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3459</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3459</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3460</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3726</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3464</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3464</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3465</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3728</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3469</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3469</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3470</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3730</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3474</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3474</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3475</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3732</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3479</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3479</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3480</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3734</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3484</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3484</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3485</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3736</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3489</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3489</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3490</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3738</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3494</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3494</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3495</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3740</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3296</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>31</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>31</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3742</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3760</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3760</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3761</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3743</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3744</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3217</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3217</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3757</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3745</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3751</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3746</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3747</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3747</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3748</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>In file included from /Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLR/../ANTLRBufferedTreeNodeStream.m:31:</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3749</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3750</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>30</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>30</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBufferedTreeNodeStream.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3752</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3753</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3753</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3754</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Previous definition is here in /Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBufferedTreeNodeStream.h</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3755</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3756</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>27</integer>
-			<key>endingLineNumber</key>
-			<integer>114</integer>
-			<key>startingColumnNumber</key>
-			<integer>27</integer>
-			<key>startingLineNumber</key>
-			<integer>114</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBufferedTreeNodeStream.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3755</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3758</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3759</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>25</integer>
-			<key>endingLineNumber</key>
-			<integer>114</integer>
-			<key>startingColumnNumber</key>
-			<integer>16</integer>
-			<key>startingLineNumber</key>
-			<integer>114</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBufferedTreeNodeStream.h</string>
-		</dict>
-		<string>Conflicting parameter types in implementation of 'getNode:': 'NSInteger' (aka 'int') vs 'NSUInteger' (aka 'unsigned int')</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3762</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3764</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3763</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>269</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>269</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBufferedTreeNodeStream.m</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3763</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>269</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>269</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3766</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3187</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3187</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3782</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3767</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3772</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3777</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3768</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3170</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3170</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3769</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3770</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3771</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>27</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>27</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBaseTreeAdaptor.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3773</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3774</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3775</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3776</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>26</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>26</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBaseTreeAdaptor.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3778</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3183</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3183</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3779</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3780</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3781</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>0</integer>
-			<key>endingLineNumber</key>
-			<integer>126</integer>
-			<key>startingColumnNumber</key>
-			<integer>0</integer>
-			<key>startingLineNumber</key>
-			<integer>126</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRTreeAdaptor.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3780</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3784</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3195</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3195</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3798</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3785</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3793</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3786</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3187</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3187</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3782</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3787</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3789</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3791</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3788</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3170</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3170</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3769</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3790</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3774</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3792</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3183</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3183</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3779</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3794</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3191</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3191</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3795</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3796</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3797</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>0</integer>
-			<key>endingLineNumber</key>
-			<integer>31</integer>
-			<key>startingColumnNumber</key>
-			<integer>0</integer>
-			<key>startingLineNumber</key>
-			<integer>31</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBaseTreeAdaptor.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3799</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3296</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>31</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>31</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3801</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3195</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3195</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3812</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3802</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3810</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3803</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3187</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3187</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3288</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3804</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3806</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3808</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3805</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3170</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3170</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3275</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3807</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3280</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3809</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3183</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3183</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3285</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3811</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3191</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3191</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3291</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3813</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3814</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>0</integer>
-			<key>endingLineNumber</key>
-			<integer>31</integer>
-			<key>startingColumnNumber</key>
-			<integer>0</integer>
-			<key>startingLineNumber</key>
-			<integer>31</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBaseTreeAdaptor.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3816</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3822</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3822</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3823</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3817</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3818</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3819</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3819</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3820</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Passing argument to parameter 'node' here</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3821</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1941</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>106</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>106</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<string>Sending 'id&lt;ANTLRTree&gt;' to parameter of incompatible type 'id&lt;ANTLRBaseTree&gt;'</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3824</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3825</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2021</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>58</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>58</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2021</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>58</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>58</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3827</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3195</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3195</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3838</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3828</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3836</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3829</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3187</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3187</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3345</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3830</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3832</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3834</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3831</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3170</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3170</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3332</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3833</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3337</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3835</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3183</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3183</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3342</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3837</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3191</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3191</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3348</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3839</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3296</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>32</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>32</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3841</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3351</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3351</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3861</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3842</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3843</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3857</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3857</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3858</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3844</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3850</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3845</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3846</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3846</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3847</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>In file included from /Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLR/../ANTLRUnbufferedCommonTreeNodeStream.m:28:</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3848</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>154</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>27</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>27</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3849</integer>
-			</dict>
-		</dict>
-		<real>0.0</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3851</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3852</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3852</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3853</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Method definition for 'toStringFromNode:toNode:' not found in /Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRUnbufferedCommonTreeNodeStream.h</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3854</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3855</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>0</integer>
-			<key>endingLineNumber</key>
-			<integer>92</integer>
-			<key>startingColumnNumber</key>
-			<integer>0</integer>
-			<key>startingLineNumber</key>
-			<integer>92</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3856</integer>
-			</dict>
-		</dict>
-		<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRUnbufferedCommonTreeNodeStream.h</string>
-		<real>0.0</real>
-		<string>Method definition for 'toStringFromNode:toNode:' not found</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3859</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3855</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>0</integer>
-			<key>endingLineNumber</key>
-			<integer>92</integer>
-			<key>startingColumnNumber</key>
-			<integer>0</integer>
-			<key>startingLineNumber</key>
-			<integer>92</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3860</integer>
-			</dict>
-		</dict>
-		<real>0.0</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3862</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>154</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>33</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>33</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3864</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3857</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3857</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3858</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3865</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3867</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3866</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3846</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3846</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3847</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3868</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3852</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3852</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3853</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3870</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3351</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3351</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3891</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3871</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3872</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3887</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3887</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3888</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3873</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3880</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3874</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3875</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3875</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3876</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>In file included from /Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLR/../ANTLRRuntimeException.m:32:</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3877</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3878</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>31</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>31</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3879</integer>
-			</dict>
-		</dict>
-		<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRRuntimeException.m</string>
-		<real>0.0</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3881</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3882</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3882</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3883</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Method definition for 'initWithName:reason:userInfo:' not found in /Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRRuntimeException.h</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3884</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3885</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>0</integer>
-			<key>endingLineNumber</key>
-			<integer>97</integer>
-			<key>startingColumnNumber</key>
-			<integer>0</integer>
-			<key>startingLineNumber</key>
-			<integer>97</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3886</integer>
-			</dict>
-		</dict>
-		<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRRuntimeException.h</string>
-		<real>0.0</real>
-		<string>Method definition for 'initWithName:reason:userInfo:' not found</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3889</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3885</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>0</integer>
-			<key>endingLineNumber</key>
-			<integer>97</integer>
-			<key>startingColumnNumber</key>
-			<integer>0</integer>
-			<key>startingLineNumber</key>
-			<integer>97</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3890</integer>
-			</dict>
-		</dict>
-		<real>0.0</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3892</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3878</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>0</integer>
-			<key>endingLineNumber</key>
-			<integer>232</integer>
-			<key>startingColumnNumber</key>
-			<integer>0</integer>
-			<key>startingLineNumber</key>
-			<integer>232</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3893</integer>
-			</dict>
-		</dict>
-		<real>0.0</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3895</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3902</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3902</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3903</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3896</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3897</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3898</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3898</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3899</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Previous declaration is here</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3900</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3901</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>0</integer>
-			<key>endingLineNumber</key>
-			<integer>93</integer>
-			<key>startingColumnNumber</key>
-			<integer>0</integer>
-			<key>startingLineNumber</key>
-			<integer>93</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRTreeAdaptor.m</string>
-		</dict>
-		<string>Duplicate declaration of method 'createTree:text:'</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3904</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3905</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>0</integer>
-			<key>endingLineNumber</key>
-			<integer>126</integer>
-			<key>startingColumnNumber</key>
-			<integer>0</integer>
-			<key>startingLineNumber</key>
-			<integer>126</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRTreeAdaptor.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3907</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3908</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3909</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3910</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3911</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3912</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3913</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3914</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3915</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3916</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3917</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3918</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3919</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3920</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3921</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3922</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3923</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3924</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3925</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3926</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3927</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3928</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3929</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3930</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3931</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3932</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3933</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3934</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3935</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3936</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3937</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3938</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3939</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3940</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3941</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3942</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3943</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3944</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3945</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3946</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3947</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3948</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>ANTLRTests/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/test/runtime/tree/ANTLRCommonTreeTest.m</string>
-		<string>ANTLR/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRFailedPredicateException.h</string>
-		<string>polydiff/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/polydiff/PolyPrinter.m</string>
-		<string>simplecTreeParser/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCLexer.m</string>
-		<string>polydiff/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/polydiff/Simplifier.m</string>
-		<string>ANTLRTests/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/test/runtime/token/ANTLRCommonTokenTest.m</string>
-		<string>polydiff/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/polydiff/PolyLexer.m</string>
-		<string>Fuzzy/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/fuzzy/main.m</string>
-		<string>ANTLR/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRTreeRewriter.m</string>
-		<string>ANTLR/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRUnbufferedCommonTreeNodeStream.m</string>
-		<string>lexertest-simple/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/lexertest-simple/TestLexer.h</string>
-		<string>simplecTreeParser/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.h</string>
-		<string>ANTLR/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRTokenRewriteStream.h</string>
-		<string>treeparser/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/treeparser/LangParser.m</string>
-		<string>ANTLR/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRDebugTreeAdaptor.m</string>
-		<string>treerewrite/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/treerewrite/TreeRewriteParser.m</string>
-		<string>simplecTreeParser/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.m</string>
-		<string>ANTLR/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRStringStream.m</string>
-		<string>polydiff/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/polydiff/PolyPrinter.h</string>
-		<string>ANTLR/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRRewriteRuleTokenStream.m</string>
-		<string>ANTLR/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRPtrBuffer.m</string>
-		<string>ANTLR/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBufferedTreeNodeStream.m</string>
-		<string>Fuzzy/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/fuzzy/FuzzyLexer.m</string>
-		<string>LL-start/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/LL-star/SimpleCParser.m</string>
-		<string>ANTLR/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRCommonTree.m</string>
-		<string>ANTLR/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRDebugEventProxy.m</string>
-		<string>simplecTreeParser/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCParser.m</string>
-		<string>ANTLR/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBaseTreeAdaptor.m</string>
-		<string>ANTLR/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRDebugTreeNodeStream.m</string>
-		<string>ANTLR/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRDebugTokenStream.m</string>
-		<string>ANTLR/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRTokenRewriteStream.m</string>
-		<string>hoistedPredicates/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/hoistedPredicates/TParser.m</string>
-		<string>treeparser/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/treeparser/LangDumpDecl.m</string>
-		<string>ANTLR/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRDebugParser.m</string>
-		<string>ANTLR/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBaseTree.h</string>
-		<string>ANTLRTests/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLR/ANTLRTests/ANTLRTests.m</string>
-		<string>ANTLR/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRTree.m</string>
-		<string>polydiff/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/polydiff/PolyParser.m</string>
-		<string>Fuzzy/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/fuzzy/FuzzyLexer.h</string>
-		<string>scopes/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/scopes/SymbolTableParser.m</string>
-		<string>ANTLR/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRReaderStream.m</string>
-		<string>ANTLR/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRDebugTreeParser.m</string>
-		<string>{{0, 0}, {317, 859}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3953</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3954</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3955</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>101</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEStackCompressionValue</string>
-		<string>IDEThreadsOrQueuesMode</string>
-		<string>IDEHideAncestorForNonInterestingFrames</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>289</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>290</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>291</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>292</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3957</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3958</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3959</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>{{0, 0}, {259, 847}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3961</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3962</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3964</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3963</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>687</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3965</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>238</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3967</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3968</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3970</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3972</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3969</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>318</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3971</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>769</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>219</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3973</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>354</real>
-		<string>{{51, 7}, {1582, 1014}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>480</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>481</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>482</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>484</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>483</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>485</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>486</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>487</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3976</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3977</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4026</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4189</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4195</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>ANTLRCommonTreeAdaptor.m</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>490</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>491</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>492</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>65</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>494</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>495</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>642</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>496</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>497</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3978</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3979</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3994</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4005</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3083</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4020</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>500</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>501</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>502</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>503</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>504</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>505</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3980</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3986</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3992</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3993</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>507</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3981</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3982</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3984</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>512</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3983</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>694</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>515</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3985</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>627</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>507</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3987</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3988</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3990</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>512</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3989</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>694</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>515</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3991</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>627</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>524</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>101</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>526</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>124</integer>
-			</dict>
-			<key>geniusEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>primaryEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3995</integer>
-			</dict>
-			<key>rootLayoutTreeNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4003</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>1</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3996</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4003</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4001</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>107</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3997</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>60</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3998</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3999</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4000</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3976</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>112</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>114</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>119</integer>
-			</dict>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4002</integer>
-			</dict>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRCommonTreeAdaptor.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4004</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>0</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3995</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>126</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4006</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>128</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4007</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>130</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>131</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>132</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4008</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4018</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4009</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>141</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>135</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>137</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>138</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>139</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>140</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>136</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4010</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>142</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4015</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3976</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>152</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4017</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3976</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4001</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>107</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4011</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>60</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4012</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4013</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4014</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3976</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>112</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>114</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4016</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2911</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2912</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324437832.25516802</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>2021</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4019</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>{{0, 0}, {953, 916}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>507</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4021</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4022</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4024</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>583</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4023</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>514</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>586</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4025</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>402</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>173</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1501</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>174</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>591</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3134</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>286</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3135</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4027</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4030</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>590</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4183</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4184</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1504</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1505</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1506</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1507</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1508</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1509</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1510</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4028</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4029</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1513</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1514</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1174</integer>
-			</dict>
-			<key>NSRangeCount</key>
-			<integer>0</integer>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1176</integer>
-			</dict>
-			<key>NSLength</key>
-			<integer>1</integer>
-			<key>NSLocation</key>
-			<integer>37</integer>
-			<key>NSRangeCount</key>
-			<integer>1</integer>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>189</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>190</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>191</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>192</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>193</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>194</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>195</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>196</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>197</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4031</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4032</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4176</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4180</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4182</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>377</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3151</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>337</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3152</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3143</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3153</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3154</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1351</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3155</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>251</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3783</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3499</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3608</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3269</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3800</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3326</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3815</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3627</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3199</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3230</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3157</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3252</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3297</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3354</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3635</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3641</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3681</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3741</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3765</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3826</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3840</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3863</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4033</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4078</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4088</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4107</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4129</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4140</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4154</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4034</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4076</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4076</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4077</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4035</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4041</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4046</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4051</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4057</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4036</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4037</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4037</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4038</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>In file included from /Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLR/../ANTLRTreeAdaptor.h:28:</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4039</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4040</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>27</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>27</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRTreeAdaptor.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4042</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3170</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3170</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4043</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4044</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4045</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>27</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>27</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBaseTreeAdaptor.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4047</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4048</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4049</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4050</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>26</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>26</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBaseTreeAdaptor.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4052</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4053</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4053</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4054</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Property has a previous declaration in /Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBaseTree.h</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4055</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4056</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>76</integer>
-			<key>endingLineNumber</key>
-			<integer>103</integer>
-			<key>startingColumnNumber</key>
-			<integer>76</integer>
-			<key>startingLineNumber</key>
-			<integer>103</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBaseTree.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4058</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4074</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4074</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4075</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4059</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4062</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4065</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4068</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4060</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4037</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4037</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4061</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4039</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4063</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3170</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3170</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4064</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4044</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4066</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4067</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4049</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4069</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4070</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4070</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4071</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Property declared here in /Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBaseTree.h</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4072</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4073</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>76</integer>
-			<key>endingLineNumber</key>
-			<integer>31</integer>
-			<key>startingColumnNumber</key>
-			<integer>76</integer>
-			<key>startingLineNumber</key>
-			<integer>31</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBaseTree.h</string>
-		</dict>
-		<string>Property declared here</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4072</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>Property has a previous declaration</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4055</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4079</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4074</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4074</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4075</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4080</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4082</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4084</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4086</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4081</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4037</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4037</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4061</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4083</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3170</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3170</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4064</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4085</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4067</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4087</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4070</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4070</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4071</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4089</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3351</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3351</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4105</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4090</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3163</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4091</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4103</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4103</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4104</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4092</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4097</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4093</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4094</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4095</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4096</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>26</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>26</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBaseTreeAdaptor.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4098</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4099</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4099</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4100</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Method definition for 'createTree:' not found in /Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBaseTreeAdaptor.h</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4101</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4102</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>0</integer>
-			<key>endingLineNumber</key>
-			<integer>36</integer>
-			<key>startingColumnNumber</key>
-			<integer>0</integer>
-			<key>startingLineNumber</key>
-			<integer>36</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBaseTreeAdaptor.h</string>
-		</dict>
-		<string>Method definition for 'createTree:' not found</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4101</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4106</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3296</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>32</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>32</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4108</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4109</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4127</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4127</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4128</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>Parse Issue</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4110</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4116</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4121</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4111</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4112</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4112</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4113</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>In file included from /Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLR/../ANTLRBufferedTreeNodeStream.h:33:</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4114</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4115</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>32</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>32</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBufferedTreeNodeStream.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4117</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3747</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3747</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4118</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4119</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4120</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>-1</integer>
-			<key>endingLineNumber</key>
-			<integer>30</integer>
-			<key>startingColumnNumber</key>
-			<integer>-1</integer>
-			<key>startingLineNumber</key>
-			<integer>30</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBufferedTreeNodeStream.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4122</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4123</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4123</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4124</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Expected ';' after method prototype in /Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRCommonTreeAdaptor.h</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4125</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4126</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>53</integer>
-			<key>endingLineNumber</key>
-			<integer>41</integer>
-			<key>startingColumnNumber</key>
-			<integer>53</integer>
-			<key>startingLineNumber</key>
-			<integer>41</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRCommonTreeAdaptor.h</string>
-		</dict>
-		<string>Expected ';' after method prototype</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4125</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4130</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4133</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4133</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4137</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4131</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4132</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4133</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4133</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4134</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>The Objective-C class 'ANTLRCommonTree', which is derived from class 'ANTLRBaseTree', defines the instance method 'getLine' whose return type is 'NSUInteger'.  A method with the same name (same selector) is also defined in class 'ANTLRBaseTree' and has a return type of 'NSInteger'.  These two types are incompatible, and may result in undefined behavior for clients of these classes</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4135</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4135</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4136</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>0</integer>
-			<key>endingLineNumber</key>
-			<integer>203</integer>
-			<key>startingColumnNumber</key>
-			<integer>0</integer>
-			<key>startingLineNumber</key>
-			<integer>203</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLR/../ANTLRCommonTree.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4138</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4135</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4139</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>0</integer>
-			<key>endingLineNumber</key>
-			<integer>203</integer>
-			<key>startingColumnNumber</key>
-			<integer>0</integer>
-			<key>startingLineNumber</key>
-			<integer>203</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLR/../ANTLRCommonTree.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4141</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4142</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4151</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>Dead store</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4143</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4144</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4146</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Value stored to 'msg' during its initialization is never read</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4149</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4148</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>14</integer>
-			<key>endingLineNumber</key>
-			<integer>329</integer>
-			<key>startingColumnNumber</key>
-			<integer>14</integer>
-			<key>startingLineNumber</key>
-			<integer>329</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLR/../ANTLRBaseRecognizer.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4150</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>34</integer>
-			<key>endingLineNumber</key>
-			<integer>329</integer>
-			<key>startingColumnNumber</key>
-			<integer>20</integer>
-			<key>startingLineNumber</key>
-			<integer>329</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLR/../ANTLRBaseRecognizer.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4152</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4149</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4153</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>14</integer>
-			<key>endingLineNumber</key>
-			<integer>329</integer>
-			<key>startingColumnNumber</key>
-			<integer>14</integer>
-			<key>startingLineNumber</key>
-			<integer>329</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLR/../ANTLRBaseRecognizer.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4155</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4156</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4167</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4167</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4173</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>Logic error</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4157</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4165</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4160</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Variable 'tpattern' declared without an initial value</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4163</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4162</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>4</integer>
-			<key>endingLineNumber</key>
-			<integer>500</integer>
-			<key>startingColumnNumber</key>
-			<integer>4</integer>
-			<key>startingLineNumber</key>
-			<integer>500</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLR/../ANTLRTreeWizard.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4164</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>30</integer>
-			<key>endingLineNumber</key>
-			<integer>500</integer>
-			<key>startingColumnNumber</key>
-			<integer>4</integer>
-			<key>startingLineNumber</key>
-			<integer>500</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLR/../ANTLRTreeWizard.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3159</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3160</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3162</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4166</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4167</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4167</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4168</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>Receiver in message expression is an uninitialized value</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4169</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4171</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4170</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>9</integer>
-			<key>endingLineNumber</key>
-			<integer>509</integer>
-			<key>startingColumnNumber</key>
-			<integer>9</integer>
-			<key>startingLineNumber</key>
-			<integer>509</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLR/../ANTLRTreeWizard.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4172</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>18</integer>
-			<key>endingLineNumber</key>
-			<integer>509</integer>
-			<key>startingColumnNumber</key>
-			<integer>10</integer>
-			<key>startingLineNumber</key>
-			<integer>509</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLR/../ANTLRTreeWizard.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4174</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4171</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3174</integer>
-			</dict>
-			<key>characterRangeLen</key>
-			<integer>0</integer>
-			<key>characterRangeLoc</key>
-			<integer>-1</integer>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4175</integer>
-			</dict>
-			<key>endingColumnNumber</key>
-			<integer>9</integer>
-			<key>endingLineNumber</key>
-			<integer>509</integer>
-			<key>startingColumnNumber</key>
-			<integer>9</integer>
-			<key>startingLineNumber</key>
-			<integer>509</integer>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLR/../ANTLRTreeWizard.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3947</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3948</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3909</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3910</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3911</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3912</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3913</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3914</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3915</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3916</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3917</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3918</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3919</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3920</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3921</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4178</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3922</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3923</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3924</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3925</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4179</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3927</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3928</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3929</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3930</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3932</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3933</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3936</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3935</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3937</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3938</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3939</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3940</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3941</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3942</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3943</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3944</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3907</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3946</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3945</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3908</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>ANTLR/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRRuntimeException.m</string>
-		<string>ANTLR/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRTreeAdaptor.m</string>
-		<string>ANTLR/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRTreeVisitor.m</string>
-		<string>{{0, 464}, {613, 850}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3953</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3954</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3955</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>101</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>289</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>290</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>291</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>292</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3957</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4185</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4188</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4186</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4187</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>Debug treerewrite : Recording</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>507</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4190</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4191</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4193</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>622</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4192</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>678</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>622</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4194</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>238</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>507</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4196</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4197</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4199</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4201</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>485</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4198</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>629</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>484</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4200</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>953</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>633</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4202</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>354</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>481</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>480</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>482</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>483</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>484</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>485</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>486</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>487</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4204</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4205</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4260</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4310</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4316</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>Build ANTLR</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>490</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>491</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>492</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>493</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>494</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>495</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>496</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>497</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4206</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4207</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4222</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4234</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4254</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>500</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>501</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>502</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>503</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>504</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>505</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4214</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4220</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4221</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>507</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4209</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4210</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4212</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>512</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4211</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>515</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4213</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>683</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>507</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4215</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4216</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4218</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>512</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4217</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>515</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4219</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>683</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>524</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>101</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>526</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>124</integer>
-			</dict>
-			<key>geniusEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>primaryEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4223</integer>
-			</dict>
-			<key>rootLayoutTreeNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4232</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>1</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4224</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4232</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4230</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4225</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4226</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4229</integer>
-			</dict>
-		</dict>
-		<string>Xcode.IDENavigableItem.WorkspaceLogsDomain</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4227</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4228</integer>
-			</dict>
-		</dict>
-		<string>Build ANTLR : 7:27:43 PM</string>
-		<integer>2147483647</integer>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>119</integer>
-			</dict>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4231</integer>
-			</dict>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<string>x-xcode-log://128D3AC5-F4C6-4508-8BEA-E26CF7377619</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4233</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>0</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4223</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>543</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4235</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>545</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4236</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>547</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>548</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>549</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4237</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4252</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4238</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>552</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>553</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>554</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>555</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>556</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>557</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>558</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4239</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4240</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4247</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4239</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4248</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4249</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4251</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>Build ANTLR : 7:27:43 PM</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4245</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4225</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4241</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4244</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4242</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4243</integer>
-			</dict>
-		</dict>
-		<string>Build ANTLR : 7:27:43 PM</string>
-		<integer>2147483647</integer>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>119</integer>
-			</dict>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4246</integer>
-			</dict>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<string>x-xcode-log://128D3AC5-F4C6-4508-8BEA-E26CF7377619</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2985</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>184</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>com.apple.dt.IDE.BuildLogContentType</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4250</integer>
-			</dict>
-		</dict>
-		<string>x-xcode-log://128D3AC5-F4C6-4508-8BEA-E26CF7377619</string>
-		<string>Xcode.IDEKit.EditorDocument.LogDocument</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4253</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>{{0, 0}, {982, 916}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>507</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4255</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4256</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4258</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>583</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4257</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>203</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>586</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4259</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>115</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3134</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1164</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>590</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>591</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>589</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4261</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4262</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4263</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4266</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4261</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4288</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4302</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>Xcode.IDEKit.Navigator.Logs</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3953</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3954</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3955</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>101</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1166</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1167</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1169</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1170</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1171</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1172</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4264</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4265</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>622</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1178</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1174</integer>
-			</dict>
-			<key>NSRangeCount</key>
-			<integer>0</integer>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1176</integer>
-			</dict>
-			<key>NSLength</key>
-			<integer>2</integer>
-			<key>NSLocation</key>
-			<integer>20</integer>
-			<key>NSRangeCount</key>
-			<integer>1</integer>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>603</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>604</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>605</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>606</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>607</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>608</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>609</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>610</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>611</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>612</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4267</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4268</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4269</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4285</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4286</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4287</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>251</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3151</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>337</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3152</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3143</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3153</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3154</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3155</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>377</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3946</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4270</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3948</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3908</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3909</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3910</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4271</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3913</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4272</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3911</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3914</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4273</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4274</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3917</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4275</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4276</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3918</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3919</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4277</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3920</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3921</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4278</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3922</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3923</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3924</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3925</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4178</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4279</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3926</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3927</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3928</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4280</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3930</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3929</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4281</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4282</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3932</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3934</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3935</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3936</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3937</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3938</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3940</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3944</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4283</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4284</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3947</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>ANTLR/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBaseTree.m</string>
-		<string>ANTLR/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRLookaheadStream.m</string>
-		<string>ANTLR/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRFastQueue.m</string>
-		<string>ANTLR/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRTreePatternParser.m</string>
-		<string>ANTLR/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBaseTreeAdaptor.h</string>
-		<string>ANTLR/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRLexerState.m</string>
-		<string>ANTLR/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRDFA.m</string>
-		<string>ANTLR/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRPtrStack.h</string>
-		<string>ANTLR/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRFileStream.m</string>
-		<string>ANTLR/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBaseRecognizer.m</string>
-		<string>ANTLR/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBufferedTokenStream.m</string>
-		<string>ANTLR/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRCommonTokenStream.m</string>
-		<string>ANTLR/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRLookaheadStream.h</string>
-		<string>ANTLR/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRRewriteRuleNodeStream.m</string>
-		<string>ANTLR/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRMap.m</string>
-		<string>{{0, 4191}, {244, 850}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>593</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>594</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>595</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>596</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>597</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>598</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>599</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4289</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4292</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4293</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4290</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4291</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>535</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1731</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>ANTLR</string>
-		<string>{{0, 1762}, {244, 872}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>187</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4294</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4295</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4296</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4298</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4300</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4291</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4291</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>535</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4291</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4297</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>examples</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4291</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4299</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>Products</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4291</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4297</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4301</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>treeparser</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>289</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4303</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4304</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4305</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>185</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4306</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4309</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDELogNavigatorSelectedObjectsStateKey</string>
-		<string>IDELogNavigatorExpandedItemsStateKey</string>
-		<string>IDELogNavigatorRecentFilterStateKey</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4307</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4308</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>Build ANTLR : 7:27:43 PM</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>507</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4311</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4312</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4314</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>622</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4313</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>698</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>622</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4315</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>218</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>507</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4317</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4318</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4320</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4322</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>485</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4319</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>260</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>484</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4321</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>982</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>633</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4323</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>340</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3033</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>3032</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>42</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>43</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>44</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>45</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4326</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>47</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4326</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4327</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>26</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4328</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4381</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEWorkspaceTabController_302D15CD-F2E4-4591-BBEA-87156BE3FC43</string>
-		<string>{{24, 359}, {240, 646}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>52</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>53</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>54</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>57</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>58</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4329</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4362</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4367</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4373</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>62</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>63</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>64</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>65</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>66</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>67</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>68</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>69</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4330</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4331</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4346</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4350</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4356</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>73</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>74</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>75</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>76</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>77</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>78</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4332</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4338</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4344</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4345</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4333</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4334</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4336</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4335</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4337</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4339</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4340</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4342</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4341</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4343</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>100</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>101</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>103</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>124</integer>
-			</dict>
-			<key>geniusEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>primaryEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4347</integer>
-			</dict>
-			<key>rootLayoutTreeNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4348</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>1</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4348</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4349</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>0</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4347</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>126</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4351</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>128</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4352</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>130</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>131</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>132</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4353</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4355</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4354</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>162</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4357</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4358</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4360</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>166</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4359</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>203</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>169</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4361</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>115</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>173</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1501</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>175</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4363</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4364</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1501</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>178</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>179</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>180</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>182</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>183</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>184</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>185</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1504</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1505</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1506</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1507</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1508</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1509</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1510</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4365</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4366</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1513</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1514</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1174</integer>
-			</dict>
-			<key>NSRangeCount</key>
-			<integer>0</integer>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1176</integer>
-			</dict>
-			<key>NSRangeCount</key>
-			<integer>0</integer>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4368</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4369</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4371</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4370</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>389</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4372</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>211</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4374</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4375</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4377</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4379</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4376</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>629</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4378</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>953</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>219</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4380</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>354</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4326</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>42</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>43</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>44</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>45</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4383</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>47</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4383</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4384</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>27</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4385</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4452</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEWorkspaceTabController_BF1D8188-61A0-4891-9E5B-744667FD84B4</string>
-		<string>{{247, 338}, {600, 646}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>51</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>52</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>53</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>54</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>57</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>58</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4386</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4387</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4433</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4438</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4444</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>Build scopes</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>62</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>63</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>64</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>65</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>66</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>67</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>68</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>69</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4388</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4389</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4404</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4414</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4427</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>73</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>74</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>75</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>76</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>77</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>78</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4390</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4396</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4402</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4403</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4391</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4392</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4394</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4393</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4395</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4397</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4398</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4400</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4399</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4401</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>100</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>101</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>103</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>124</integer>
-			</dict>
-			<key>geniusEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>primaryEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4405</integer>
-			</dict>
-			<key>rootLayoutTreeNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4412</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>1</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4406</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4412</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4411</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>420</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4407</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4410</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4408</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4409</integer>
-			</dict>
-		</dict>
-		<string>Build scopes : 2:22:51 PM</string>
-		<integer>2147483647</integer>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>119</integer>
-			</dict>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1923</integer>
-			</dict>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4413</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>0</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4405</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>126</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4415</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>128</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4416</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>130</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>131</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>132</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4417</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4426</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4418</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>135</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>136</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>137</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>138</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>139</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>140</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>141</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>434</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4409</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4419</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4409</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>437</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4420</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4421</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>436</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>184</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1923</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4425</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>420</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4422</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4424</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4423</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4409</integer>
-			</dict>
-		</dict>
-		<integer>2147483647</integer>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>119</integer>
-			</dict>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1923</integer>
-			</dict>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>162</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4428</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4429</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4431</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>166</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4430</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>203</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>169</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4432</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>115</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>173</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>175</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>286</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4434</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>286</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4435</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>178</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>179</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>180</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>182</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>183</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>184</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>185</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>289</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>290</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>291</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>292</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>202</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4436</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4437</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4439</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4440</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4442</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4441</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>377</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4443</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>223</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4445</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4446</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4448</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4450</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4447</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>457</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4449</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>1116</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>219</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4451</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>354</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4383</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4454</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>44</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>43</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>42</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>45</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>47</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4455</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>397</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4454</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>28</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4529</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEWorkspaceTabController_643C9C67-AF73-4A43-899C-9F86EE0BA865</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>52</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>51</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>53</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>54</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>57</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>58</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4456</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4457</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4507</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4515</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4521</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>ANTLRCommonTreeAdaptor.h</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>62</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>63</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>64</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>65</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>66</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>67</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>68</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>69</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4458</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4459</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4474</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4485</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4501</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>73</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>74</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>75</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>76</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>77</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>78</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4460</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4466</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4472</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4473</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4461</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4462</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4464</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4463</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4465</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4467</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4468</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4470</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4469</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4471</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>100</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>101</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>103</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>124</integer>
-			</dict>
-			<key>geniusEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>primaryEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4475</integer>
-			</dict>
-			<key>rootLayoutTreeNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4483</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>1</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4476</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4483</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4481</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>107</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4477</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>60</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4478</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4479</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4480</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4456</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>112</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>114</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>119</integer>
-			</dict>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4482</integer>
-			</dict>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRCommonTreeAdaptor.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4484</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>0</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4475</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>126</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4486</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>128</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4487</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>130</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>131</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>132</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4488</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4500</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4489</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>141</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>135</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>137</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>138</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>139</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>140</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>136</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4490</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>142</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4495</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4456</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>269</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4498</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4456</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4481</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>107</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4491</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>60</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4492</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4493</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4494</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4456</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>112</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>114</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4496</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4497</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>358</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324436616.01285303</real>
-		<string>{0, 2064}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4499</integer>
-			</dict>
-		</dict>
-		<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRCommonTreeAdaptor.h</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>162</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4502</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4503</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4505</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>166</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4504</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>203</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>169</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4506</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>115</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>173</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>174</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>175</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4508</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4509</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>174</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>178</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>179</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>180</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>182</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>183</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>184</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>185</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>189</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>190</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>191</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>192</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>193</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>194</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>195</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>196</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>197</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4511</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4512</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>202</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4513</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4514</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4516</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4517</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4519</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4518</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>389</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4520</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>211</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4522</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4523</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4525</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4527</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4524</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>277</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4526</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>810</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>219</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4528</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>354</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4454</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>42</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>43</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>44</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>45</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4531</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>47</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4531</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4532</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>29</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4533</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4589</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEWorkspaceTabController_739FB955-3296-4612-AC20-1CDF97DE7A33</string>
-		<string>{{119, 336}, {240, 646}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>52</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>53</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>54</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>57</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>58</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4534</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4567</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4575</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4581</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>62</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>63</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>64</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>65</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>66</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>67</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>68</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>69</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4535</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4536</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4551</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4555</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4561</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>73</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>74</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>75</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>76</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>77</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>78</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4537</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4543</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4549</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4550</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4538</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4539</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4541</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4540</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4542</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4544</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4545</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4547</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4546</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4548</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>100</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>101</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>103</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>124</integer>
-			</dict>
-			<key>geniusEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>primaryEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4552</integer>
-			</dict>
-			<key>rootLayoutTreeNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4553</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>1</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4553</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4554</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>0</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4552</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>126</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4556</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>128</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4557</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>130</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>131</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>132</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4558</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4560</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4559</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>162</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4562</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4563</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4565</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>166</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4564</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>203</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>169</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4566</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>115</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>173</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>174</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>175</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4568</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4569</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>174</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>178</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>179</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>180</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>182</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>183</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>184</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>185</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>189</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>190</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>191</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>192</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>193</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>194</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>195</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>196</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>197</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4570</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4571</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4572</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>202</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4573</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4574</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4576</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4577</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4579</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4578</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>389</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4580</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>211</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4582</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4583</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4585</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4587</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4584</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>661</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4586</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>921</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>219</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4588</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>354</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4531</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>42</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>43</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>44</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>45</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4591</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>47</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4591</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4592</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>30</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4593</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4666</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEWorkspaceTabController_814C37BB-0594-46EB-9B90-B9116756F804</string>
-		<string>{{163, 349}, {600, 646}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>51</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>52</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>53</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>54</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>57</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>58</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1791</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4594</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4644</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4652</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4658</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>62</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>63</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>64</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>65</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>66</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>67</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>68</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>69</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4595</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4596</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4611</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4622</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4638</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>73</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>74</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>75</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>76</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>77</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>78</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4597</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4603</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4609</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4610</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4598</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4599</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4601</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4600</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4602</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4604</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4605</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4607</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4606</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4608</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>100</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>101</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>103</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>124</integer>
-			</dict>
-			<key>geniusEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>primaryEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4612</integer>
-			</dict>
-			<key>rootLayoutTreeNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4620</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>1</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4613</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4620</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4619</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1812</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4614</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>60</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4615</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4616</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4617</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4618</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1791</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1816</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>379</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1819</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>119</integer>
-			</dict>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1821</integer>
-			</dict>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4621</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>0</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4612</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>126</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4623</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>128</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4624</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>130</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>131</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>132</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4625</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4637</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4626</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>135</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>136</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>137</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>138</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>139</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>140</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>141</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>142</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1791</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4627</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1791</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>269</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4629</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4630</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4628</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1831</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>358</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324417807.90071499</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1833</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4636</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1812</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4631</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>60</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4632</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4633</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4634</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4635</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1791</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1816</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>379</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1819</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>119</integer>
-			</dict>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1821</integer>
-			</dict>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>162</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4639</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4640</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4642</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>166</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4641</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>203</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>169</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4643</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>115</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>173</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>174</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>175</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4645</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4646</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>174</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>178</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>179</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>180</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>182</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>183</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>184</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>185</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>189</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>190</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>191</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>192</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>193</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>194</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>195</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>196</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>197</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4647</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4648</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4649</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>202</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4650</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4651</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4653</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4654</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4656</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4655</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>377</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4657</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>223</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4659</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4660</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4662</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4664</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4661</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>586</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4663</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>987</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>219</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4665</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>354</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4591</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>42</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>43</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>44</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>45</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4668</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>47</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4668</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4669</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>31</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4670</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4723</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEWorkspaceTabController_33ED8F40-5853-4B5E-82D1-ED44495458A6</string>
-		<string>{{266, 382}, {240, 646}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>52</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>53</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>54</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>57</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>58</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4671</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4704</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4709</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4715</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>62</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>63</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>64</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>65</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>66</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>67</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>68</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>69</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4672</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4673</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4688</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4692</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4698</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>73</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>74</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>75</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>76</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>77</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>78</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4674</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4680</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4686</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4687</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4675</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4676</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4678</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4677</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4679</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4681</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4682</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4684</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4683</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4685</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>100</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>101</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>103</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>124</integer>
-			</dict>
-			<key>geniusEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>primaryEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4689</integer>
-			</dict>
-			<key>rootLayoutTreeNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4690</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>1</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4690</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4691</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>0</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4689</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>126</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4693</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>128</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4694</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>130</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>131</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>132</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4695</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4697</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4696</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>162</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4699</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4700</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4702</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>166</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4701</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>203</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>169</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4703</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>115</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>173</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1501</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>175</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4705</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4706</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1501</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>178</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>179</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>180</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>182</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>183</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>184</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>185</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1504</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1505</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1506</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1507</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1508</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1509</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1510</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4707</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4708</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1513</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1514</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1174</integer>
-			</dict>
-			<key>NSRangeCount</key>
-			<integer>0</integer>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1176</integer>
-			</dict>
-			<key>NSRangeCount</key>
-			<integer>0</integer>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4710</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4711</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4713</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4712</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>389</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4714</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>211</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4716</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4717</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4719</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4721</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4718</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>629</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4720</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>953</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>219</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4722</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>354</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4668</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>42</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>43</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>44</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>45</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4725</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>47</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4725</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>225</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>32</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4726</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4800</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEWorkspaceTabController_F2B57B98-941D-4238-9379-7473B3430A7E</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>52</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>51</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>53</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>54</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>57</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>58</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4727</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4728</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4779</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4786</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4792</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>ANTLRBaseTree.h</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>62</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>63</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>64</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>65</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>66</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>67</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>68</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>69</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4729</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4730</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4745</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4756</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4773</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>73</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>74</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>75</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>76</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>77</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>78</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4731</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4737</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4743</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4744</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4732</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4733</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4735</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4734</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4736</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4738</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4739</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4741</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4740</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4742</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>100</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>101</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>103</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>124</integer>
-			</dict>
-			<key>geniusEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>primaryEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4746</integer>
-			</dict>
-			<key>rootLayoutTreeNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4754</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>1</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4747</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4754</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4752</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>107</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4748</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>60</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4749</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4750</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4751</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4727</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>112</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>114</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>119</integer>
-			</dict>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4753</integer>
-			</dict>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/ANTLRBaseTree.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4755</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>0</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4746</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>126</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4757</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>128</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4758</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>130</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>131</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>132</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4759</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4772</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4760</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>135</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>136</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>137</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>138</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>139</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>140</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>141</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>142</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4761</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4762</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4727</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>269</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4766</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4767</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>-addChild:</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4763</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4764</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4765</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324421881.86844403</real>
-		<string>{1527, 1531}</string>
-		<string>{2218, 17}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1941</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4752</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>107</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4768</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>60</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4769</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4770</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4771</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4727</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>112</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>114</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>162</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4774</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4775</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4777</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>166</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4776</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>203</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>169</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4778</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>115</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>173</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>175</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1501</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4780</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1501</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4781</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>178</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>179</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>180</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>182</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>183</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>184</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>185</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1504</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1505</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1506</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1507</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1508</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1509</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1510</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4782</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4783</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4784</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4785</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1174</integer>
-			</dict>
-			<key>NSRangeCount</key>
-			<integer>0</integer>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1176</integer>
-			</dict>
-			<key>NSRangeCount</key>
-			<integer>0</integer>
-		</dict>
-		<string>id&lt;ANTLRTreeAdaptor&gt;</string>
-		<string>id&lt;ANTLRTree&gt;</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4787</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4788</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4790</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4789</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>377</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4791</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>223</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4793</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4794</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4796</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4798</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4795</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>586</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4797</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>987</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>219</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4799</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>354</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4725</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>42</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>43</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>44</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>45</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4802</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>47</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4802</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4803</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>33</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4804</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4860</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEWorkspaceTabController_5A5562D3-2457-44ED-87EC-EE25A7A3221D</string>
-		<string>{{56, 349}, {240, 646}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>52</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>53</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>54</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>57</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>58</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4805</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4838</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4846</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4852</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>62</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>63</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>64</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>65</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>66</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>67</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>68</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>69</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4806</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4807</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4822</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4826</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4832</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>73</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>74</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>75</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>76</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>77</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>78</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4808</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4814</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4820</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4821</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4809</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4810</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4812</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4811</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4813</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4815</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4816</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4818</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4817</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4819</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>100</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>101</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>103</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>124</integer>
-			</dict>
-			<key>geniusEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>primaryEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4823</integer>
-			</dict>
-			<key>rootLayoutTreeNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4824</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>1</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4824</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4825</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>0</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4823</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>126</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4827</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>128</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4828</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>130</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>131</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>132</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4829</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4831</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4830</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>162</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4833</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4834</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4836</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>166</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4835</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>203</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>169</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4837</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>115</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>173</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>174</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>175</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4839</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4840</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>174</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>178</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>179</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>180</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>182</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>183</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>184</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>185</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>189</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>190</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>191</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>192</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>193</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>194</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>195</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>196</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>197</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4841</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4842</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4843</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>202</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4844</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4845</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4847</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4848</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4850</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4849</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>389</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4851</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>211</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4853</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4854</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4856</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4858</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4855</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>661</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4857</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>921</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>219</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4859</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>354</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4802</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>47</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>44</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>43</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>42</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>45</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4862</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4863</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4864</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4862</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>34</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4865</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEWorkspaceTabController_EB09D177-511E-48E6-97D0-A5368084A1FF</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4862</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>{{49, 309}, {600, 646}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>51</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>52</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>53</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>54</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>57</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>58</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4866</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4867</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4918</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4926</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4932</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>FuzzyLexer.h</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>62</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>63</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>64</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>65</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>66</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>67</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>68</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>69</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4868</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4869</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4884</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4897</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4912</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>73</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>74</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>75</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>76</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>77</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>78</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4870</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4876</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4882</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4883</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4871</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4872</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4874</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4873</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>300</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4875</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>299</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4877</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4878</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4880</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4879</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>300</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4881</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>299</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>100</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>101</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>103</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>124</integer>
-			</dict>
-			<key>geniusEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>primaryEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4885</integer>
-			</dict>
-			<key>rootLayoutTreeNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4895</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>1</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4886</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4895</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4893</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>107</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4887</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>60</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4888</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4889</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4891</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4892</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4866</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4890</integer>
-			</dict>
-		</dict>
-		<string>fuzzy</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>253</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>114</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>119</integer>
-			</dict>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4894</integer>
-			</dict>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/fuzzy/FuzzyLexer.h</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4896</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>0</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4885</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>126</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4898</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>128</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4899</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>130</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>131</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>132</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4900</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4911</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4901</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>141</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>135</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>137</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>138</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>139</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>140</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>136</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4902</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>142</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4908</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4866</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>269</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4910</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4866</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4893</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>107</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4903</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>60</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4904</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4905</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4906</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4907</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4866</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4890</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>253</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>114</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4909</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2638</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2532</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323993445.39168298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1939</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>162</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4913</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4914</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4916</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>166</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4915</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>203</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>169</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4917</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>115</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>173</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>174</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>175</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4919</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4920</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>174</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>178</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>179</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>180</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>182</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>183</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>184</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>185</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>189</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>190</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>191</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>192</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>193</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>194</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>195</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>196</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>197</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4921</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4922</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4923</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>202</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4924</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4925</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4927</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4928</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4930</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4929</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>377</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4931</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>223</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4933</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4934</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4936</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4938</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4935</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>260</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4937</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>1313</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>219</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4939</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>354</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>42</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>43</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>44</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>45</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4941</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>47</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4941</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4942</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>35</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4943</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4996</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEWorkspaceTabController_D7C117CF-2DCE-4CBA-B705-19535B08742D</string>
-		<string>{{161, 382}, {240, 646}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>52</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>53</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>54</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>57</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>58</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4944</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4977</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4982</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4988</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>62</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>63</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>64</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>65</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>66</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>67</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>68</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>69</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4945</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4946</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4961</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4965</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4971</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>73</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>74</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>75</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>76</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>77</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>78</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4947</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4953</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4959</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4960</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4948</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4949</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4951</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4950</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4952</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4954</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4955</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4957</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4956</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4958</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>100</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>101</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>103</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>124</integer>
-			</dict>
-			<key>geniusEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>primaryEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4962</integer>
-			</dict>
-			<key>rootLayoutTreeNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4963</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>1</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4963</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>4964</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>0</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4962</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>126</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4966</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>128</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4967</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>130</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>131</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>132</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4968</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4970</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4969</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>162</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4972</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4973</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4975</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>166</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4974</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>203</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>169</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4976</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>115</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>173</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1501</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>175</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4978</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4979</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1501</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>178</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>179</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>180</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>182</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>183</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>184</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>185</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1504</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1505</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1506</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1507</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1508</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1509</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1510</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4980</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4981</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1513</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1514</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1174</integer>
-			</dict>
-			<key>NSRangeCount</key>
-			<integer>0</integer>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1176</integer>
-			</dict>
-			<key>NSRangeCount</key>
-			<integer>0</integer>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4983</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4984</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4986</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4985</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>389</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4987</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>211</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4989</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4990</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4992</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4994</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4991</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>630</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4993</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>952</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>219</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4995</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>354</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4941</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>47</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>44</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>43</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>42</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>45</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4998</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4999</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5000</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4998</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>36</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5001</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEWorkspaceTabController_2ACC26B0-F5C0-41D8-832E-AD4A74EA1F07</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>4998</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>{{268, 360}, {600, 668}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>51</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>52</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>53</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>54</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>57</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>58</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5002</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5003</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5054</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5062</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5068</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>Simplifier.m</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>62</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>63</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>64</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>65</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>66</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>67</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>68</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>69</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5004</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5005</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5020</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5032</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5048</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>73</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>74</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>75</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>76</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>77</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>78</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5006</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5012</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5018</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5019</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5007</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5008</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5010</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5009</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5011</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5013</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5014</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5016</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5015</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5017</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>100</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>101</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>103</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>124</integer>
-			</dict>
-			<key>geniusEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>primaryEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5021</integer>
-			</dict>
-			<key>rootLayoutTreeNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5030</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>1</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5022</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5030</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5028</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>107</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5023</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>60</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5024</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5025</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5026</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5027</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5002</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3155</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>253</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>114</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>119</integer>
-			</dict>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5029</integer>
-			</dict>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>118</integer>
-			</dict>
-			<key>NS.string</key>
-			<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/polydiff/Simplifier.m</string>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5031</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>0</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5021</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>126</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5033</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>128</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5034</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>130</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>131</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>132</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5035</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5047</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5036</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>135</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>136</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>137</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>138</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>139</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>140</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>141</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>142</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5002</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5037</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5002</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>152</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5040</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5041</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>145</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>147</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>148</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5038</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5039</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>2524</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>323992277.437558</real>
-		<string>{15643, 721}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1928</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5028</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>107</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5042</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>60</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5043</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5044</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5045</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5046</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5002</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>3155</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>253</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>114</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>162</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5049</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5050</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5052</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>166</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5051</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>203</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>169</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5053</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>115</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>173</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>174</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>175</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5055</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5056</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>174</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>178</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>179</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>180</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>182</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>183</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>184</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>185</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>189</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>190</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>191</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>192</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>193</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>194</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>195</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>196</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>197</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5057</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5058</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5059</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>202</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5060</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5061</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5063</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5064</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5066</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5065</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>399</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5067</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>223</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5069</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5070</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5072</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5074</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5071</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>457</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5073</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>1116</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>219</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5075</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>354</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>42</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>43</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>44</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>45</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5077</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>47</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5077</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5078</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>37</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5079</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5132</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEWorkspaceTabController_7BDC7074-7CDB-4F9D-BA7D-78C9C1EDE74B</string>
-		<string>{{203, 336}, {240, 646}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>52</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>53</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>54</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>57</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>58</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5080</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5113</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5118</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5124</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>62</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>63</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>64</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>65</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>66</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>67</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>68</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>69</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5081</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5082</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5097</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5101</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5107</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>73</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>74</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>75</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>76</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>77</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>78</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5083</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5089</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5095</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5096</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5084</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5085</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5087</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5086</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5088</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5090</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5091</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5093</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5092</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5094</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>100</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>101</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>103</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>124</integer>
-			</dict>
-			<key>geniusEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>primaryEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5098</integer>
-			</dict>
-			<key>rootLayoutTreeNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5099</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>1</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5099</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5100</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>0</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5098</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>126</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5102</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>128</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5103</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>130</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>131</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>132</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5104</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5106</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5105</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>162</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5108</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5109</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5111</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>166</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5110</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>203</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>169</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5112</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>115</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>173</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1501</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>175</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5114</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5115</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1501</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>178</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>179</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>180</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>182</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>183</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>184</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>185</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1504</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1505</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1506</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1507</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1508</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1509</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1510</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5116</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5117</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1513</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1514</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1174</integer>
-			</dict>
-			<key>NSRangeCount</key>
-			<integer>0</integer>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1176</integer>
-			</dict>
-			<key>NSRangeCount</key>
-			<integer>0</integer>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5119</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5120</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5122</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5121</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>389</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5123</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>211</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5125</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5126</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5128</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5130</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5127</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>629</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5129</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>953</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>219</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5131</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>354</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5077</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>42</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>43</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>44</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>45</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5134</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>47</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5134</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5135</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>38</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5136</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5189</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEWorkspaceTabController_2B2152F1-B07F-4225-B664-24F65D0A9243</string>
-		<string>{{224, 349}, {240, 646}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>52</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>53</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>54</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>57</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>58</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5137</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5170</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5175</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5181</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>62</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>63</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>64</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>65</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>66</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>67</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>68</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>69</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5138</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5139</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5154</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5158</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5164</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>73</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>74</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>75</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>76</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>77</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>78</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5140</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5146</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5152</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5153</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5141</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5142</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5144</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5143</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5145</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5147</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5148</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5150</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>85</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5149</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>298</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>89</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5151</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>301</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>100</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>101</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>103</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>124</integer>
-			</dict>
-			<key>geniusEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>primaryEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5155</integer>
-			</dict>
-			<key>rootLayoutTreeNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5156</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>1</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5156</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5157</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>0</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5155</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>126</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5159</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>128</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5160</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>130</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>131</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>132</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5161</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5163</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5162</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>162</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5165</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5166</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5168</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>166</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5167</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>203</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>169</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5169</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>115</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>173</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1501</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>175</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5171</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5172</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1501</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>178</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>179</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>180</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>181</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>182</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>183</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>184</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>185</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1504</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1505</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1506</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1507</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1508</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1509</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1510</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5173</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5174</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1513</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1514</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1174</integer>
-			</dict>
-			<key>NSRangeCount</key>
-			<integer>0</integer>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1176</integer>
-			</dict>
-			<key>NSRangeCount</key>
-			<integer>0</integer>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5176</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5177</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5179</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5178</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>389</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>208</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5180</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>211</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>80</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5182</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5183</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5185</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5187</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>56</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5184</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>629</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>55</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5186</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>953</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>83</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>84</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>219</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5188</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>354</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5134</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5191</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>474</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>473</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>472</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>475</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>477</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5192</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5272</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5191</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>39</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5273</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEWorkspaceTabController_7C9CA7DC-C1BD-4E3C-87A4-808B1D459FCA</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>480</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>481</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>482</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>483</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>484</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>485</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>486</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>487</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5193</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5194</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5250</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5258</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5264</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>ANTLRTreeRuleReturnScope.h</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>490</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>491</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>492</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>493</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>494</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>495</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>496</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>497</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5195</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5196</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5211</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5223</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5244</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>500</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>501</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>502</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>503</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>504</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>505</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5197</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5203</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5209</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5210</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>507</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5198</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5199</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5201</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>512</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5200</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>447</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>515</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5202</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>451</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>507</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5204</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5205</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5207</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>512</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5206</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>447</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>515</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5208</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>451</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>524</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>101</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>526</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>124</integer>
-			</dict>
-			<key>geniusEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>primaryEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5212</integer>
-			</dict>
-			<key>rootLayoutTreeNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5221</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>1</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5213</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5221</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5220</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>530</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5214</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>60</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5215</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5217</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5218</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5216</integer>
-			</dict>
-		</dict>
-		<string>ANTLRTreeRuleReturnScope.h</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>535</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5219</integer>
-			</dict>
-		</dict>
-		<string>ANTLR</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>119</integer>
-			</dict>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1945</integer>
-			</dict>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5222</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>0</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5212</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>543</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5224</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>545</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5225</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>547</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>548</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>549</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5226</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5242</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5227</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>552</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>553</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>554</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>555</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>556</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>557</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>558</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5228</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5229</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5235</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5216</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5239</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5240</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>577</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>startNode</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5220</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>530</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5230</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>60</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5231</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5232</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5233</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5216</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>535</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5234</integer>
-			</dict>
-		</dict>
-		<string>ANTLR</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>567</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>568</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>569</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>570</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5236</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5237</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5238</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324440398.24771601</real>
-		<string>{0, 1988}</string>
-		<string>{1952, 0}</string>
-		<string>public.c-header</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5241</integer>
-			</dict>
-		</dict>
-		<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/antlr3-main/runtime/ObjC/Framework/ANTLRTreeRuleReturnScope.h</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5243</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>{{0, 0}, {899, 859}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>507</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5245</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5246</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5248</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>583</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5247</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>203</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>586</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5249</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>115</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>589</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>591</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1164</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5251</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1164</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5254</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>593</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>594</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>595</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>596</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>597</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>598</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>599</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5252</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5253</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>{{0, 0}, {259, 832}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1166</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1167</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1168</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1169</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1170</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1171</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>1172</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5255</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5256</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>622</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5257</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1174</integer>
-			</dict>
-			<key>NSRangeCount</key>
-			<integer>0</integer>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1176</integer>
-			</dict>
-			<key>NSRangeCount</key>
-			<integer>0</integer>
-		</dict>
-		<string>ANTLRTreeRuleReturn</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>507</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5259</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5260</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5262</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>622</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5261</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>489</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>622</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5263</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>370</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>507</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5265</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5266</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5268</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5270</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>485</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5267</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>260</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>484</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5269</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>885</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>633</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5271</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>340</real>
-		<string>{{163, 90}, {899, 905}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5191</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>472</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>473</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>474</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>475</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5275</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>477</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5275</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5276</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>40</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5277</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5359</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>IDEWorkspaceTabController_A37CC082-FCE5-4465-8D92-5B82D5AFB5B0</string>
-		<string>{{184, 262}, {1095, 766}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>480</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>481</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>482</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>483</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>484</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>485</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>486</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>487</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5278</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5279</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5334</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5345</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5351</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>ANTLRTreeAdaptor.m</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>490</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>491</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>492</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>493</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>494</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>495</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>496</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>497</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5280</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5281</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5296</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5308</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5328</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>171</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array/>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>500</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>501</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>502</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>503</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>504</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>505</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5282</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5288</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>98</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5294</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5295</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>507</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5283</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5284</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5286</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>512</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5285</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>544</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>515</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5287</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>550</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>507</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5289</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5290</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5292</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>512</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5291</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>544</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>515</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5293</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>550</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>524</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>101</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>526</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>124</integer>
-			</dict>
-			<key>geniusEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>primaryEditorContextNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5297</integer>
-			</dict>
-			<key>rootLayoutTreeNode</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5306</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>1</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5298</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5306</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5305</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>530</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5299</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>60</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5300</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5302</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5303</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5301</integer>
-			</dict>
-		</dict>
-		<string>ANTLRTreeAdaptor.m</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>535</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5304</integer>
-			</dict>
-		</dict>
-		<string>ANTLR</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>119</integer>
-			</dict>
-			<key>documentURL</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>1930</integer>
-			</dict>
-			<key>timestamp</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>123</integer>
-			</dict>
-			<key>children</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5307</integer>
-			</dict>
-			<key>contentType</key>
-			<integer>0</integer>
-			<key>documentArchivableRepresentation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>orientation</key>
-			<integer>0</integer>
-			<key>parent</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5297</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>543</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5309</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>545</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5310</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>547</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>548</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>549</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5311</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>60</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5326</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5312</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>552</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>553</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>554</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>555</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>556</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>557</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>558</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5313</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5314</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5320</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5301</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>574</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5324</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>577</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>@implementation ANTLRTreeAdaptor</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>120</integer>
-			</dict>
-			<key>DocumentLocation</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5305</integer>
-			</dict>
-			<key>DomainIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>530</integer>
-			</dict>
-			<key>IdentifierPath</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5315</integer>
-			</dict>
-			<key>IndexOfDocumentIdentifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>60</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5316</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5317</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5318</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5301</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>535</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>110</integer>
-			</dict>
-			<key>Identifier</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5319</integer>
-			</dict>
-		</dict>
-		<string>ANTLR</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>567</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>568</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>569</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>570</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5321</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5322</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5323</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>324440596.88617098</real>
-		<string>{2169, 1696}</string>
-		<string>{3488, 0}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>155</integer>
-			</dict>
-			<key>NS.base</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>NS.relative</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>5325</integer>
-			</dict>
-		</dict>
-		<string>file://localhost/Users/acondit/source/antlr3/acondit_localhost/code/antlr/antlr3-main/runtime/ObjC/Framework/ANTLRTreeAdaptor.m</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5327</integer>
-				</dict>
-			</array>
-		</dict>
-		<string>{{0, 0}, {1095, 720}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>507</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5329</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5330</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5332</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>583</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5331</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>203</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>586</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5333</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>115</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>589</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>590</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>591</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5335</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5338</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>590</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>593</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>594</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>595</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>596</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>597</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>598</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>599</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5336</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5337</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>186</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>{{0, 0}, {259, 832}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>603</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>604</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>605</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>606</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>607</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>608</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>609</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>610</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>611</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>612</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5339</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5340</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5341</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5342</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5343</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5344</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>48</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<string>{{0, 0}, {0, 0}}</string>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>199</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array/>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>507</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5346</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5347</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5349</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>622</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5348</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>509</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>622</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5350</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>211</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>71</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>507</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5352</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>91</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5353</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5355</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5357</integer>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>485</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5354</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>260</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>484</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5356</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>982</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>87</integer>
-			</dict>
-			<key>NS.keys</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>510</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>511</integer>
-				</dict>
-			</array>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>633</integer>
-				</dict>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5358</integer>
-				</dict>
-			</array>
-		</dict>
-		<real>340</real>
-		<dict>
-			<key>$class</key>
-			<dict>
-				<key>CF$UID</key>
-				<integer>115</integer>
-			</dict>
-			<key>NS.objects</key>
-			<array>
-				<dict>
-					<key>CF$UID</key>
-					<integer>5275</integer>
-				</dict>
-			</array>
-		</dict>
-	</array>
-	<key>$top</key>
-	<dict>
-		<key>State</key>
-		<dict>
-			<key>CF$UID</key>
-			<integer>1</integer>
-		</dict>
-	</dict>
-	<key>$version</key>
-	<integer>100000</integer>
-</dict>
-</plist>
diff --git a/runtime/ObjC/Framework/ANTLR/ANTLR.xcodeproj/xcuserdata/acondit.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist b/runtime/ObjC/Framework/ANTLR/ANTLR.xcodeproj/xcuserdata/acondit.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist
deleted file mode 100644
index 05301bc..0000000
--- a/runtime/ObjC/Framework/ANTLR/ANTLR.xcodeproj/xcuserdata/acondit.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Bucket
-   type = "1"
-   version = "1.0">
-</Bucket>
diff --git a/runtime/ObjC/Framework/ANTLR/ANTLR.xcodeproj/xcuserdata/acondit.xcuserdatad/xcschemes/ANTLR.xcscheme b/runtime/ObjC/Framework/ANTLR/ANTLR.xcodeproj/xcuserdata/acondit.xcuserdatad/xcschemes/ANTLR.xcscheme
deleted file mode 100644
index 0b76a62..0000000
--- a/runtime/ObjC/Framework/ANTLR/ANTLR.xcodeproj/xcuserdata/acondit.xcuserdatad/xcschemes/ANTLR.xcscheme
+++ /dev/null
@@ -1,82 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Scheme
-   version = "1.3">
-   <BuildAction
-      parallelizeBuildables = "YES"
-      buildImplicitDependencies = "NO">
-      <BuildActionEntries>
-         <BuildActionEntry
-            buildForTesting = "NO"
-            buildForRunning = "YES"
-            buildForProfiling = "YES"
-            buildForArchiving = "YES"
-            buildForAnalyzing = "YES">
-            <BuildableReference
-               BuildableIdentifier = "primary"
-               BlueprintIdentifier = "1AE72317134E860B001C3F35"
-               BuildableName = "ANTLR.framework"
-               BlueprintName = "ANTLR"
-               ReferencedContainer = "container:ANTLR.xcodeproj">
-            </BuildableReference>
-         </BuildActionEntry>
-         <BuildActionEntry
-            buildForTesting = "YES"
-            buildForRunning = "NO"
-            buildForProfiling = "NO"
-            buildForArchiving = "NO"
-            buildForAnalyzing = "NO">
-            <BuildableReference
-               BuildableIdentifier = "primary"
-               BlueprintIdentifier = "1AE7232C134E860B001C3F35"
-               BuildableName = "ANTLRTests.octest"
-               BlueprintName = "ANTLRTests"
-               ReferencedContainer = "container:ANTLR.xcodeproj">
-            </BuildableReference>
-         </BuildActionEntry>
-      </BuildActionEntries>
-   </BuildAction>
-   <TestAction
-      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB"
-      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB"
-      shouldUseLaunchSchemeArgsEnv = "YES"
-      buildConfiguration = "Debug">
-      <Testables>
-         <TestableReference
-            skipped = "NO">
-            <BuildableReference
-               BuildableIdentifier = "primary"
-               BlueprintIdentifier = "1AE7232C134E860B001C3F35"
-               BuildableName = "ANTLRTests.octest"
-               BlueprintName = "ANTLRTests"
-               ReferencedContainer = "container:ANTLR.xcodeproj">
-            </BuildableReference>
-         </TestableReference>
-      </Testables>
-   </TestAction>
-   <LaunchAction
-      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB"
-      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB"
-      displayScaleIsEnabled = "NO"
-      displayScale = "1.00"
-      launchStyle = "0"
-      useCustomWorkingDirectory = "NO"
-      buildConfiguration = "Debug">
-      <AdditionalOptions>
-      </AdditionalOptions>
-   </LaunchAction>
-   <ProfileAction
-      displayScaleIsEnabled = "NO"
-      displayScale = "1.00"
-      shouldUseLaunchSchemeArgsEnv = "YES"
-      savedToolIdentifier = ""
-      useCustomWorkingDirectory = "NO"
-      buildConfiguration = "Release">
-   </ProfileAction>
-   <AnalyzeAction
-      buildConfiguration = "Debug">
-   </AnalyzeAction>
-   <ArchiveAction
-      buildConfiguration = "Release"
-      revealArchiveInOrganizer = "YES">
-   </ArchiveAction>
-</Scheme>
diff --git a/runtime/ObjC/Framework/ANTLR/ANTLR.xcodeproj/xcuserdata/acondit.xcuserdatad/xcschemes/Fuzzy.xcscheme b/runtime/ObjC/Framework/ANTLR/ANTLR.xcodeproj/xcuserdata/acondit.xcuserdatad/xcschemes/Fuzzy.xcscheme
deleted file mode 100644
index bb165e3..0000000
--- a/runtime/ObjC/Framework/ANTLR/ANTLR.xcodeproj/xcuserdata/acondit.xcuserdatad/xcschemes/Fuzzy.xcscheme
+++ /dev/null
@@ -1,82 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Scheme
-   version = "1.3">
-   <BuildAction
-      parallelizeBuildables = "YES"
-      buildImplicitDependencies = "YES">
-      <BuildActionEntries>
-         <BuildActionEntry
-            buildForTesting = "YES"
-            buildForRunning = "YES"
-            buildForProfiling = "YES"
-            buildForArchiving = "YES"
-            buildForAnalyzing = "YES">
-            <BuildableReference
-               BuildableIdentifier = "primary"
-               BlueprintIdentifier = "1A63BC60134F5DAB002EDFB4"
-               BuildableName = "Fuzzy"
-               BlueprintName = "Fuzzy"
-               ReferencedContainer = "container:ANTLR.xcodeproj">
-            </BuildableReference>
-         </BuildActionEntry>
-      </BuildActionEntries>
-   </BuildAction>
-   <TestAction
-      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB"
-      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB"
-      shouldUseLaunchSchemeArgsEnv = "YES"
-      buildConfiguration = "Debug">
-      <Testables>
-      </Testables>
-   </TestAction>
-   <LaunchAction
-      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB"
-      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB"
-      displayScaleIsEnabled = "NO"
-      displayScale = "1.00"
-      launchStyle = "0"
-      useCustomWorkingDirectory = "NO"
-      buildConfiguration = "Debug">
-      <BuildableProductRunnable>
-         <BuildableReference
-            BuildableIdentifier = "primary"
-            BlueprintIdentifier = "1A63BC60134F5DAB002EDFB4"
-            BuildableName = "Fuzzy"
-            BlueprintName = "Fuzzy"
-            ReferencedContainer = "container:ANTLR.xcodeproj">
-         </BuildableReference>
-      </BuildableProductRunnable>
-      <EnvironmentVariables>
-         <EnvironmentVariable
-            value = ""
-            isEnabled = "NO">
-         </EnvironmentVariable>
-      </EnvironmentVariables>
-      <AdditionalOptions>
-      </AdditionalOptions>
-   </LaunchAction>
-   <ProfileAction
-      displayScaleIsEnabled = "NO"
-      displayScale = "1.00"
-      shouldUseLaunchSchemeArgsEnv = "YES"
-      savedToolIdentifier = ""
-      useCustomWorkingDirectory = "NO"
-      buildConfiguration = "Release">
-      <BuildableProductRunnable>
-         <BuildableReference
-            BuildableIdentifier = "primary"
-            BlueprintIdentifier = "1A63BC60134F5DAB002EDFB4"
-            BuildableName = "Fuzzy"
-            BlueprintName = "Fuzzy"
-            ReferencedContainer = "container:ANTLR.xcodeproj">
-         </BuildableReference>
-      </BuildableProductRunnable>
-   </ProfileAction>
-   <AnalyzeAction
-      buildConfiguration = "Debug">
-   </AnalyzeAction>
-   <ArchiveAction
-      buildConfiguration = "Release"
-      revealArchiveInOrganizer = "YES">
-   </ArchiveAction>
-</Scheme>
diff --git a/runtime/ObjC/Framework/ANTLR/ANTLR.xcodeproj/xcuserdata/acondit.xcuserdatad/xcschemes/LL-start.xcscheme b/runtime/ObjC/Framework/ANTLR/ANTLR.xcodeproj/xcuserdata/acondit.xcuserdatad/xcschemes/LL-start.xcscheme
deleted file mode 100644
index 5e618e1..0000000
--- a/runtime/ObjC/Framework/ANTLR/ANTLR.xcodeproj/xcuserdata/acondit.xcuserdatad/xcschemes/LL-start.xcscheme
+++ /dev/null
@@ -1,76 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Scheme
-   version = "1.3">
-   <BuildAction
-      parallelizeBuildables = "YES"
-      buildImplicitDependencies = "YES">
-      <BuildActionEntries>
-         <BuildActionEntry
-            buildForTesting = "YES"
-            buildForRunning = "YES"
-            buildForProfiling = "YES"
-            buildForArchiving = "YES"
-            buildForAnalyzing = "YES">
-            <BuildableReference
-               BuildableIdentifier = "primary"
-               BlueprintIdentifier = "1A63BD4B134F5F43002EDFB4"
-               BuildableName = "LL-start"
-               BlueprintName = "LL-start"
-               ReferencedContainer = "container:ANTLR.xcodeproj">
-            </BuildableReference>
-         </BuildActionEntry>
-      </BuildActionEntries>
-   </BuildAction>
-   <TestAction
-      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB"
-      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB"
-      shouldUseLaunchSchemeArgsEnv = "YES"
-      buildConfiguration = "Debug">
-      <Testables>
-      </Testables>
-   </TestAction>
-   <LaunchAction
-      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB"
-      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB"
-      displayScaleIsEnabled = "NO"
-      displayScale = "1.00"
-      launchStyle = "0"
-      useCustomWorkingDirectory = "NO"
-      buildConfiguration = "Debug">
-      <BuildableProductRunnable>
-         <BuildableReference
-            BuildableIdentifier = "primary"
-            BlueprintIdentifier = "1A63BD4B134F5F43002EDFB4"
-            BuildableName = "LL-start"
-            BlueprintName = "LL-start"
-            ReferencedContainer = "container:ANTLR.xcodeproj">
-         </BuildableReference>
-      </BuildableProductRunnable>
-      <AdditionalOptions>
-      </AdditionalOptions>
-   </LaunchAction>
-   <ProfileAction
-      displayScaleIsEnabled = "NO"
-      displayScale = "1.00"
-      shouldUseLaunchSchemeArgsEnv = "YES"
-      savedToolIdentifier = ""
-      useCustomWorkingDirectory = "NO"
-      buildConfiguration = "Release">
-      <BuildableProductRunnable>
-         <BuildableReference
-            BuildableIdentifier = "primary"
-            BlueprintIdentifier = "1A63BD4B134F5F43002EDFB4"
-            BuildableName = "LL-start"
-            BlueprintName = "LL-start"
-            ReferencedContainer = "container:ANTLR.xcodeproj">
-         </BuildableReference>
-      </BuildableProductRunnable>
-   </ProfileAction>
-   <AnalyzeAction
-      buildConfiguration = "Debug">
-   </AnalyzeAction>
-   <ArchiveAction
-      buildConfiguration = "Release"
-      revealArchiveInOrganizer = "YES">
-   </ArchiveAction>
-</Scheme>
diff --git a/runtime/ObjC/Framework/ANTLR/ANTLR.xcodeproj/xcuserdata/acondit.xcuserdatad/xcschemes/xcschememanagement.plist b/runtime/ObjC/Framework/ANTLR/ANTLR.xcodeproj/xcuserdata/acondit.xcuserdatad/xcschemes/xcschememanagement.plist
deleted file mode 100644
index 348d7aa..0000000
--- a/runtime/ObjC/Framework/ANTLR/ANTLR.xcodeproj/xcuserdata/acondit.xcuserdatad/xcschemes/xcschememanagement.plist
+++ /dev/null
@@ -1,132 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>SchemeUserState</key>
-	<dict>
-		<key>ANTLR.xcscheme</key>
-		<dict>
-			<key>orderHint</key>
-			<integer>0</integer>
-		</dict>
-		<key>ANTLRTests.xcscheme</key>
-		<dict>
-			<key>orderHint</key>
-			<integer>1</integer>
-		</dict>
-		<key>Fuzzy.xcscheme</key>
-		<dict>
-			<key>orderHint</key>
-			<integer>3</integer>
-		</dict>
-		<key>LL-start.xcscheme</key>
-		<dict>
-			<key>orderHint</key>
-			<integer>6</integer>
-		</dict>
-		<key>combined.xcscheme</key>
-		<dict>
-			<key>orderHint</key>
-			<integer>2</integer>
-		</dict>
-		<key>hoistedPredicates.xcscheme</key>
-		<dict>
-			<key>orderHint</key>
-			<integer>4</integer>
-		</dict>
-		<key>lexertest-simple.xcscheme</key>
-		<dict>
-			<key>orderHint</key>
-			<integer>5</integer>
-		</dict>
-		<key>polydiff.xcscheme</key>
-		<dict>
-			<key>orderHint</key>
-			<integer>7</integer>
-		</dict>
-		<key>scopes.xcscheme</key>
-		<dict>
-			<key>orderHint</key>
-			<integer>8</integer>
-		</dict>
-		<key>simplecTreeParser.xcscheme</key>
-		<dict>
-			<key>orderHint</key>
-			<integer>9</integer>
-		</dict>
-		<key>treeparser.xcscheme</key>
-		<dict>
-			<key>orderHint</key>
-			<integer>10</integer>
-		</dict>
-		<key>treerewrite.xcscheme</key>
-		<dict>
-			<key>orderHint</key>
-			<integer>11</integer>
-		</dict>
-	</dict>
-	<key>SuppressBuildableAutocreation</key>
-	<dict>
-		<key>1A63BC60134F5DAB002EDFB4</key>
-		<dict>
-			<key>primary</key>
-			<true/>
-		</dict>
-		<key>1A63BD31134F5F1E002EDFB4</key>
-		<dict>
-			<key>primary</key>
-			<true/>
-		</dict>
-		<key>1A63BD3E134F5F36002EDFB4</key>
-		<dict>
-			<key>primary</key>
-			<true/>
-		</dict>
-		<key>1A63BD4B134F5F43002EDFB4</key>
-		<dict>
-			<key>primary</key>
-			<true/>
-		</dict>
-		<key>1A63BD58134F5F4D002EDFB4</key>
-		<dict>
-			<key>primary</key>
-			<true/>
-		</dict>
-		<key>1A63BD65134F5F5E002EDFB4</key>
-		<dict>
-			<key>primary</key>
-			<true/>
-		</dict>
-		<key>1A63BD72134F5F67002EDFB4</key>
-		<dict>
-			<key>primary</key>
-			<true/>
-		</dict>
-		<key>1A63BD7F134F5F71002EDFB4</key>
-		<dict>
-			<key>primary</key>
-			<true/>
-		</dict>
-		<key>1A63BDD3134F6233002EDFB4</key>
-		<dict>
-			<key>primary</key>
-			<true/>
-		</dict>
-		<key>1A63BDFB134FB75E002EDFB4</key>
-		<dict>
-			<key>primary</key>
-			<true/>
-		</dict>
-		<key>1AE72317134E860B001C3F35</key>
-		<dict>
-			<key>primary</key>
-			<true/>
-		</dict>
-		<key>1AE7232C134E860B001C3F35</key>
-		<dict>
-			<key>primary</key>
-			<true/>
-		</dict>
-	</dict>
-</dict>
-</plist>
diff --git a/runtime/ObjC/Framework/ANTLR/ANTLRTests/ANTLRTests-Info.plist b/runtime/ObjC/Framework/ANTLR/ANTLRTests/ANTLRTests-Info.plist
deleted file mode 100644
index 4814b62..0000000
--- a/runtime/ObjC/Framework/ANTLR/ANTLRTests/ANTLRTests-Info.plist
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>CFBundleDevelopmentRegion</key>
-	<string>en</string>
-	<key>CFBundleExecutable</key>
-	<string>${EXECUTABLE_NAME}</string>
-	<key>CFBundleIdentifier</key>
-	<string>AMKS.${PRODUCT_NAME:rfc1034identifier}</string>
-	<key>CFBundleInfoDictionaryVersion</key>
-	<string>6.0</string>
-	<key>CFBundlePackageType</key>
-	<string>BNDL</string>
-	<key>CFBundleShortVersionString</key>
-	<string>1.0</string>
-	<key>CFBundleSignature</key>
-	<string>????</string>
-	<key>CFBundleVersion</key>
-	<string>1</string>
-</dict>
-</plist>
diff --git a/runtime/ObjC/Framework/ANTLR/ANTLRTests/ANTLRTests-Prefix.pch b/runtime/ObjC/Framework/ANTLR/ANTLRTests/ANTLRTests-Prefix.pch
deleted file mode 100644
index 9d05c98..0000000
--- a/runtime/ObjC/Framework/ANTLR/ANTLRTests/ANTLRTests-Prefix.pch
+++ /dev/null
@@ -1,7 +0,0 @@
-//
-// Prefix header for all source files of the 'ANTLRTests' target in the 'ANTLRTests' project
-//
-
-#ifdef __OBJC__
-    #import <Cocoa/Cocoa.h>
-#endif
diff --git a/runtime/ObjC/Framework/ANTLR/ANTLRTests/ANTLRTests.h b/runtime/ObjC/Framework/ANTLR/ANTLRTests/ANTLRTests.h
deleted file mode 100644
index a4b4456..0000000
--- a/runtime/ObjC/Framework/ANTLR/ANTLRTests/ANTLRTests.h
+++ /dev/null
@@ -1,17 +0,0 @@
-//
-//  ANTLRTests.h
-//  ANTLRTests
-//
-//  Created by Alan Condit on 4/7/11.
-//  Copyright 2011 Alan's MachineWorks. All rights reserved.
-//
-
-#import <SenTestingKit/SenTestingKit.h>
-
-
-@interface ANTLRTests : SenTestCase {
-@private
-    
-}
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLR/ANTLRTests/ANTLRTests.m b/runtime/ObjC/Framework/ANTLR/ANTLRTests/ANTLRTests.m
deleted file mode 100644
index c0386a0..0000000
--- a/runtime/ObjC/Framework/ANTLR/ANTLRTests/ANTLRTests.m
+++ /dev/null
@@ -1,28 +0,0 @@
-//
-//  ANTLRTests.m
-//  ANTLRTests
-//
-//  Created by Alan Condit on 4/7/11.
-//  Copyright 2011 Alan's MachineWorks. All rights reserved.
-//
-
-#import "ANTLRTests.h"
-
-
-@implementation ANTLRTests
-
-- (void)setUp
-{
-    [super setUp];
-    
-    // Set-up code here.
-}
-
-- (void)tearDown
-{
-    // Tear-down code here.
-    
-    [super tearDown];
-}
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRBaseMapElement.h b/runtime/ObjC/Framework/ANTLRBaseMapElement.h
deleted file mode 100644
index 0815165..0000000
--- a/runtime/ObjC/Framework/ANTLRBaseMapElement.h
+++ /dev/null
@@ -1,51 +0,0 @@
-//
-//  ANTLRBaseMapElement.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/16/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRLinkBase.h"
-
-@interface ANTLRBaseMapElement : ANTLRLinkBase {
-    NSNumber *index;
-}
-
-@property (retain) NSNumber *index;
-
-+ (id) newANTLRBaseMapElement;
-+ (id) newANTLRBaseMapElementWithIndex:(NSNumber *)anIdx;
-- (id) init;
-- (id) initWithAnIndex:(NSNumber *)anIdx;
-
-- (id) copyWithZone:(NSZone *)aZone;
-
-- (NSInteger)count;
-- (NSInteger)size;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRBaseMapElement.m b/runtime/ObjC/Framework/ANTLRBaseMapElement.m
deleted file mode 100644
index 7197799..0000000
--- a/runtime/ObjC/Framework/ANTLRBaseMapElement.m
+++ /dev/null
@@ -1,95 +0,0 @@
-//
-//  ANTLRBaseMapElement.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/16/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import "ANTLRBaseMapElement.h"
-
-
-@implementation ANTLRBaseMapElement
-
-@synthesize index;
-
-+ (ANTLRBaseMapElement *)newANTLRBaseMapElement
-{
-    return [[ANTLRBaseMapElement alloc] init];
-}
-
-+ (ANTLRBaseMapElement *)newANTLRBaseMapElementWithIndex:(NSNumber *)aNumber
-{
-    return [[ANTLRBaseMapElement alloc] initWithAnIndex:(NSNumber *)aNumber];
-}
-
-- (id) init
-{
-    if ((self = [super init]) != nil ) {
-        index = nil;
-    }
-    return (self);
-}
-
-- (id) initWithAnIndex:(NSNumber *)aNumber
-{
-    if ((self = [super init]) != nil ) {
-        index = aNumber;
-        if ( index ) [index retain];
-    }
-    return (self);
-}
-
-- (void) dealloc
-{
-#ifdef DEBUG_DEALLOC
-    NSLog( @"called dealloc in ANTLRBaseMapElement" );
-#endif
-    if ( index ) [index release];
-    [super dealloc];
-}
-
-- (id) copyWithZone:(NSZone *)aZone
-{
-    ANTLRBaseMapElement *copy;
-    
-    copy = [super copyWithZone:aZone];
-    copy.index = index;
-    return( copy );
-}
-
-- (NSInteger)count
-{
-    return 1;
-}
-                          
-                          
-- (NSInteger)size
-{
-    return(  sizeof(index) );
-}
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRBaseRecognizer.h b/runtime/ObjC/Framework/ANTLRBaseRecognizer.h
deleted file mode 100644
index 346a857..0000000
--- a/runtime/ObjC/Framework/ANTLRBaseRecognizer.h
+++ /dev/null
@@ -1,180 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-#import <Foundation/Foundation.h>
-
-#import "ANTLRIntStream.h"
-#import "AMutableArray.h"
-
-// This is an abstract superclass for lexers and parsers.
-
-#define ANTLR_MEMO_RULE_FAILED -2
-#define ANTLR_MEMO_RULE_UNKNOWN -1
-#define ANTLR_INITIAL_FOLLOW_STACK_SIZE 100
-
-#import "ANTLRMapElement.h"
-#import "ANTLRBitSet.h"
-#import "ANTLRToken.h"
-#import "ANTLRRecognizerSharedState.h"
-#import "ANTLRRecognitionException.h"
-#import "ANTLRMissingTokenException.h"
-#import "ANTLRMismatchedTokenException.h"
-#import "ANTLRMismatchedTreeNodeException.h"
-#import "ANTLRUnwantedTokenException.h"
-#import "ANTLRNoViableAltException.h"
-#import "ANTLREarlyExitException.h"
-#import "ANTLRMismatchedSetException.h"
-#import "ANTLRMismatchedNotSetException.h"
-#import "ANTLRFailedPredicateException.h"
-
-@interface ANTLRBaseRecognizer : NSObject {
-    __strong ANTLRRecognizerSharedState *state;  // the state of this recognizer. Might be shared with other recognizers, e.g. in grammar import scenarios.
-    __strong NSString *grammarFileName;          // where did the grammar come from. filled in by codegeneration
-    __strong NSString *sourceName;
-    __strong AMutableArray *tokenNames;
-}
-
-+ (void) initialize;
-
-+ (ANTLRBaseRecognizer *) newANTLRBaseRecognizer;
-+ (ANTLRBaseRecognizer *) newANTLRBaseRecognizerWithRuleLen:(NSInteger)aLen;
-+ (ANTLRBaseRecognizer *) newANTLRBaseRecognizer:(ANTLRRecognizerSharedState *)aState;
-
-+ (AMutableArray *)getTokenNames;
-+ (void)setTokenNames:(NSArray *)aTokNamArray;
-+ (void)setGrammarFileName:(NSString *)aFileName;
-
-- (id) init;
-- (id) initWithLen:(NSInteger)aLen;
-- (id) initWithState:(ANTLRRecognizerSharedState *)aState;
-
-- (void) dealloc;
-
-// simple accessors
-- (NSInteger) getBacktrackingLevel;
-- (void) setBacktrackingLevel:(NSInteger) level;
-
-- (BOOL) getFailed;
-- (void) setFailed: (BOOL) flag;
-
-- (ANTLRRecognizerSharedState *) getState;
-- (void) setState:(ANTLRRecognizerSharedState *) theState;
-
-// reset this recognizer - might be extended by codegeneration/grammar
-- (void) reset;
-
-/** Match needs to return the current input symbol, which gets put
- *  into the label for the associated token ref; e.g., x=ID.  Token
- *  and tree parsers need to return different objects. Rather than test
- *  for input stream type or change the IntStream interface, I use
- *  a simple method to ask the recognizer to tell me what the current
- *  input symbol is.
- * 
- *  This is ignored for lexers.
- */
-- (id) input;
-
-- (void)skip;
-
-// do actual matching of tokens/characters
-- (id) match:(id<ANTLRIntStream>)anInput TokenType:(NSInteger)ttype Follow:(ANTLRBitSet *)follow;
-- (void) matchAny:(id<ANTLRIntStream>)anInput;
-- (BOOL) mismatchIsUnwantedToken:(id<ANTLRIntStream>)anInput TokenType:(NSInteger) ttype;
-- (BOOL) mismatchIsMissingToken:(id<ANTLRIntStream>)anInput Follow:(ANTLRBitSet *)follow;
-
-// error reporting and recovery
-- (void) reportError:(ANTLRRecognitionException *)e;
-- (void) displayRecognitionError:(AMutableArray *)theTokNams Exception:(ANTLRRecognitionException *)e;
-- (NSString *)getErrorMessage:(ANTLRRecognitionException *)e TokenNames:(AMutableArray *)theTokNams;
-- (NSInteger) getNumberOfSyntaxErrors;
-- (NSString *)getErrorHeader:(ANTLRRecognitionException *)e;
-- (NSString *)getTokenErrorDisplay:(id<ANTLRToken>)t;
-- (void) emitErrorMessage:(NSString *)msg;
-- (void) recover:(id<ANTLRIntStream>)anInput Exception:(ANTLRRecognitionException *)e;
-
-// begin hooks for debugger
-- (void) beginResync;
-- (void) endResync;
-// end hooks for debugger
-
-// compute the bitsets necessary to do matching and recovery
-- (ANTLRBitSet *)computeErrorRecoverySet;
-- (ANTLRBitSet *)computeContextSensitiveRuleFOLLOW;
-- (ANTLRBitSet *)combineFollows:(BOOL) exact;
-
-- (id<ANTLRToken>) recoverFromMismatchedToken:(id<ANTLRIntStream>)anInput 
-                                    TokenType:(NSInteger)ttype 
-                                       Follow:(ANTLRBitSet *)follow;
-                                    
-- (id<ANTLRToken>)recoverFromMismatchedSet:(id<ANTLRIntStream>)anInput
-                                    Exception:(ANTLRRecognitionException *)e
-                                    Follow:(ANTLRBitSet *)follow;
-
-- (id) getCurrentInputSymbol:(id<ANTLRIntStream>)anInput;
-- (id) getMissingSymbol:(id<ANTLRIntStream>)anInput
-              Exception:(ANTLRRecognitionException *)e
-              TokenType:(NSInteger) expectedTokenType
-                Follow:(ANTLRBitSet *)follow;
-
-// helper methods for recovery. try to resync somewhere
-- (void) consumeUntilTType:(id<ANTLRIntStream>)anInput TokenType:(NSInteger)ttype;
-- (void) consumeUntilFollow:(id<ANTLRIntStream>)anInput Follow:(ANTLRBitSet *)bitSet;
-- (void) pushFollow:(ANTLRBitSet *)fset;
-- (ANTLRBitSet *)popFollow;
-
-// to be used by the debugger to do reporting. maybe hook in incremental stuff here, too.
-- (AMutableArray *) getRuleInvocationStack;
-- (AMutableArray *) getRuleInvocationStack:(ANTLRRecognitionException *)exception
-                                 Recognizer:(NSString *)recognizerClassName;
-
-- (AMutableArray *) getTokenNames;
-- (NSString *)getGrammarFileName;
-- (NSString *)getSourceName;
-- (AMutableArray *) toStrings:(NSArray *)tokens;
-// support for memoization
-- (NSInteger) getRuleMemoization:(NSInteger)ruleIndex StartIndex:(NSInteger)ruleStartIndex;
-- (BOOL) alreadyParsedRule:(id<ANTLRIntStream>)anInput RuleIndex:(NSInteger)ruleIndex;
-- (void) memoize:(id<ANTLRIntStream>)anInput
-         RuleIndex:(NSInteger)ruleIndex
-        StartIndex:(NSInteger)ruleStartIndex;
-- (NSInteger) getRuleMemoizationCacheSize;
-- (void)traceIn:(NSString *)ruleName Index:(NSInteger)ruleIndex Object:(id)inputSymbol;
-- (void)traceOut:(NSString *)ruleName Index:(NSInteger)ruleIndex Object:(id)inputSymbol;
-
-
-// support for syntactic predicates. these are called indirectly to support funky stuff in grammars,
-// like supplying selectors instead of writing code directly into the actions of the grammar.
-- (BOOL) evaluateSyntacticPredicate:(SEL)synpredFragment;
-// stream:(id<ANTLRIntStream>)anInput;
-
-@property (retain) ANTLRRecognizerSharedState *state;
-@property (retain) NSString *grammarFileName;
-@property (retain) NSString *sourceName;
-@property (retain) AMutableArray *tokenNames;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRBaseRecognizer.m b/runtime/ObjC/Framework/ANTLRBaseRecognizer.m
deleted file mode 100644
index 573e0dc..0000000
--- a/runtime/ObjC/Framework/ANTLRBaseRecognizer.m
+++ /dev/null
@@ -1,1129 +0,0 @@
-//
-//  ANTLRBaseRecognizer.m
-//  ANTLR
-//
-//  Created by Alan Condit on 6/16/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import "ANTLRBaseRecognizer.h"
-#import "ANTLRHashRule.h"
-#import "ANTLRRuleMemo.h"
-#import "ANTLRCommonToken.h"
-#import "ANTLRMap.h"
-
-extern NSInteger debug;
-
-@implementation ANTLRBaseRecognizer
-
-static AMutableArray *_tokenNames;
-static NSString *_grammarFileName;
-static NSString *NEXT_TOKEN_RULE_NAME;
-
-@synthesize state;
-@synthesize grammarFileName;
-//@synthesize failed;
-@synthesize sourceName;
-//@synthesize numberOfSyntaxErrors;
-@synthesize tokenNames;
-
-+ (void) initialize
-{
-    NEXT_TOKEN_RULE_NAME = [NSString stringWithString:@"nextToken"];
-    [NEXT_TOKEN_RULE_NAME retain];
-}
-
-+ (ANTLRBaseRecognizer *) newANTLRBaseRecognizer
-{
-    return [[ANTLRBaseRecognizer alloc] init];
-}
-
-+ (ANTLRBaseRecognizer *) newANTLRBaseRecognizerWithRuleLen:(NSInteger)aLen
-{
-    return [[ANTLRBaseRecognizer alloc] initWithLen:aLen];
-}
-
-+ (ANTLRBaseRecognizer *) newANTLRBaseRecognizer:(ANTLRRecognizerSharedState *)aState
-{
-	return [[ANTLRBaseRecognizer alloc] initWithState:aState];
-}
-
-+ (AMutableArray *)getTokenNames
-{
-    return _tokenNames;
-}
-
-+ (void)setTokenNames:(AMutableArray *)theTokNams
-{
-    if ( _tokenNames != theTokNams ) {
-        if ( _tokenNames ) [_tokenNames release];
-        [theTokNams retain];
-    }
-    _tokenNames = theTokNams;
-}
-
-+ (void)setGrammarFileName:(NSString *)aFileName
-{
-    if ( _grammarFileName != aFileName ) {
-        if ( _grammarFileName ) [_grammarFileName release];
-        [aFileName retain];
-    }
-    [_grammarFileName retain];
-}
-
-- (id) init
-{
-	if ((self = [super init]) != nil) {
-        if (state == nil) {
-            state = [[ANTLRRecognizerSharedState newANTLRRecognizerSharedState] retain];
-        }
-        tokenNames = _tokenNames;
-        if ( tokenNames ) [tokenNames retain];
-        grammarFileName = _grammarFileName;
-        if ( grammarFileName ) [grammarFileName retain];
-        state._fsp = -1;
-        state.errorRecovery = NO;		// are we recovering?
-        state.lastErrorIndex = -1;
-        state.failed = NO;				// indicate that some match failed
-        state.syntaxErrors = 0;
-        state.backtracking = 0;			// the level of backtracking
-        state.tokenStartCharIndex = -1;
-	}
-	return self;
-}
-
-- (id) initWithLen:(NSInteger)aLen
-{
-	if ((self = [super init]) != nil) {
-        if (state == nil) {
-            state = [[ANTLRRecognizerSharedState newANTLRRecognizerSharedStateWithRuleLen:aLen] retain];
-        }
-        tokenNames = _tokenNames;
-        if ( tokenNames ) [tokenNames retain];
-        grammarFileName = _grammarFileName;
-        if ( grammarFileName ) [grammarFileName retain];
-        state._fsp = -1;
-        state.errorRecovery = NO;		// are we recovering?
-        state.lastErrorIndex = -1;
-        state.failed = NO;				// indicate that some match failed
-        state.syntaxErrors = 0;
-        state.backtracking = 0;			// the level of backtracking
-        state.tokenStartCharIndex = -1;
-	}
-	return self;
-}
-
-- (id) initWithState:(ANTLRRecognizerSharedState *)aState
-{
-	if ((self = [super init]) != nil) {
-		state = aState;
-        if (state == nil) {
-            state = [ANTLRRecognizerSharedState newANTLRRecognizerSharedState];
-        }
-        [state retain];
-        tokenNames = _tokenNames;
-        if ( tokenNames ) [tokenNames retain];
-        grammarFileName = _grammarFileName;
-        if ( grammarFileName ) [grammarFileName retain];
-        state._fsp = -1;
-        state.errorRecovery = NO;		// are we recovering?
-        state.lastErrorIndex = -1;
-        state.failed = NO;				// indicate that some match failed
-        state.syntaxErrors = 0;
-        state.backtracking = 0;			// the level of backtracking
-        state.tokenStartCharIndex = -1;
-	}
-	return self;
-}
-
-- (void)dealloc
-{
-#ifdef DEBUG_DEALLOC
-    NSLog( @"called dealloc in ANTLRBaseRecognizer" );
-#endif
-	if ( grammarFileName ) [grammarFileName release];
-	if ( tokenNames ) [tokenNames release];
-	if ( state ) [state release];
-	[super dealloc];
-}
-
-// reset the recognizer to the initial state. does not touch the token source!
-// this can be extended by the grammar writer to reset custom ivars
-- (void) reset
-{
-    if ( state == nil )
-        return; 
-    if ( state.following != nil ) {
-        if ( [state.following count] )
-            [state.following removeAllObjects];
-    }
-    state._fsp = -1;
-    state.errorRecovery = NO;		// are we recovering?
-    state.lastErrorIndex = -1;
-    state.failed = NO;				// indicate that some match failed
-    state.syntaxErrors = 0;
-    state.backtracking = 0;			// the level of backtracking
-    state.tokenStartCharIndex = -1;
-    if ( state.ruleMemo != nil ) {
-        if ( [state.ruleMemo count] )
-            [state.ruleMemo removeAllObjects];
-    }
-}
-
-- (BOOL) getFailed
-{
-	return [state getFailed];
-}
-
-- (void) setFailed:(BOOL)flag
-{
-	[state setFailed:flag];
-}
-
-- (ANTLRRecognizerSharedState *) getState
-{
-	return state;
-}
-
-- (void) setState:(ANTLRRecognizerSharedState *) theState
-{
-	if (state != theState) {
-		if ( state ) [state release];
-		state = theState;
-		[state retain];
-	}
-}
-
-- (id)input
-{
-    return nil; // Must be overriden in inheriting class
-}
-
-- (void)skip // override in inheriting class
-{
-    return;
-}
-
--(id) match:(id<ANTLRIntStream>)anInput TokenType:(NSInteger)ttype Follow:(ANTLRBitSet *)follow
-{
-	id matchedSymbol = [self getCurrentInputSymbol:anInput];
-	if ([anInput LA:1] == ttype) {
-		[anInput consume];
-		state.errorRecovery = NO;
-		state.failed = NO;
-		return matchedSymbol;
-	}
-	if (state.backtracking > 0) {
-		state.failed = YES;
-		return matchedSymbol;
-	}
-	matchedSymbol = [self recoverFromMismatchedToken:anInput TokenType:ttype Follow:follow];
-	return matchedSymbol;
-}
-
--(void) matchAny:(id<ANTLRIntStream>)anInput
-{
-    state.errorRecovery = NO;
-    state.failed = NO;
-    [anInput consume];
-}
-
--(BOOL) mismatchIsUnwantedToken:(id<ANTLRIntStream>)anInput TokenType:(NSInteger)ttype
-{
-    return [anInput LA:2] == ttype;
-}
-
--(BOOL) mismatchIsMissingToken:(id<ANTLRIntStream>)anInput Follow:(ANTLRBitSet *) follow
-{
-    if ( follow == nil ) {
-        // we have no information about the follow; we can only consume
-        // a single token and hope for the best
-        return NO;
-    }
-    // compute what can follow this grammar element reference
-    if ( [follow member:ANTLRTokenTypeEOR] ) {
-        ANTLRBitSet *viableTokensFollowingThisRule = [self computeContextSensitiveRuleFOLLOW];
-        follow = [follow or:viableTokensFollowingThisRule];
-        if ( state._fsp >= 0 ) { // remove EOR if we're not the start symbol
-            [follow remove:(ANTLRTokenTypeEOR)];
-        }
-    }
-    // if current token is consistent with what could come after set
-    // then we know we're missing a token; error recovery is free to
-    // "insert" the missing token
-    
-    //System.out.println("viable tokens="+follow.toString(getTokenNames()));
-    //System.out.println("LT(1)="+((TokenStream)input).LT(1));
-    
-    // BitSet cannot handle negative numbers like -1 (EOF) so I leave EOR
-    // in follow set to indicate that the fall of the start symbol is
-    // in the set (EOF can follow).
-    if ( [follow member:[anInput LA:1]] || [follow member:ANTLRTokenTypeEOR] ) {
-        //System.out.println("LT(1)=="+((TokenStream)input).LT(1)+" is consistent with what follows; inserting...");
-        return YES;
-    }
-    return NO;
-}
-
-/** Report a recognition problem.
- *
- *  This method sets errorRecovery to indicate the parser is recovering
- *  not parsing.  Once in recovery mode, no errors are generated.
- *  To get out of recovery mode, the parser must successfully match
- *  a token (after a resync).  So it will go:
- *
- * 		1. error occurs
- * 		2. enter recovery mode, report error
- * 		3. consume until token found in resynch set
- * 		4. try to resume parsing
- * 		5. next match() will reset errorRecovery mode
- *
- *  If you override, make sure to update syntaxErrors if you care about that.
- */
--(void) reportError:(ANTLRRecognitionException *) e
-{
-    // if we've already reported an error and have not matched a token
-    // yet successfully, don't report any errors.
-    if ( state.errorRecovery ) {
-        //System.err.print("[SPURIOUS] ");
-        return;
-    }
-    state.syntaxErrors++; // don't count spurious
-    state.errorRecovery = YES;
-    
-    [self displayRecognitionError:[self getTokenNames] Exception:e];
-}
-
--(void) displayRecognitionError:(AMutableArray *)theTokNams Exception:(ANTLRRecognitionException *)e
-{
-    NSString *hdr = [self getErrorHeader:e];
-    NSString *msg = [self getErrorMessage:e TokenNames:theTokNams];
-    [self emitErrorMessage:[NSString stringWithFormat:@" %@ %@", hdr, msg]];
-}
-
-/** What error message should be generated for the various
- *  exception types?
- *
- *  Not very object-oriented code, but I like having all error message
- *  generation within one method rather than spread among all of the
- *  exception classes. This also makes it much easier for the exception
- *  handling because the exception classes do not have to have pointers back
- *  to this object to access utility routines and so on. Also, changing
- *  the message for an exception type would be difficult because you
- *  would have to subclassing exception, but then somehow get ANTLR
- *  to make those kinds of exception objects instead of the default.
- *  This looks weird, but trust me--it makes the most sense in terms
- *  of flexibility.
- *
- *  For grammar debugging, you will want to override this to add
- *  more information such as the stack frame with
- *  getRuleInvocationStack(e, this.getClass().getName()) and,
- *  for no viable alts, the decision description and state etc...
- *
- *  Override this to change the message generated for one or more
- *  exception types.
- */
-- (NSString *)getErrorMessage:(ANTLRRecognitionException *)e TokenNames:(AMutableArray *)theTokNams
-{
-    // NSString *msg = [e getMessage];
-    NSString *msg;
-    if ( [e isKindOfClass:[ANTLRUnwantedTokenException class]] ) {
-        ANTLRUnwantedTokenException *ute = (ANTLRUnwantedTokenException *)e;
-        NSString *tokenName=@"<unknown>";
-        if ( ute.expecting == ANTLRTokenTypeEOF ) {
-            tokenName = @"EOF";
-        }
-        else {
-            tokenName = (NSString *)[theTokNams objectAtIndex:ute.expecting];
-        }
-        msg = [NSString stringWithFormat:@"extraneous input %@ expecting %@", [self getTokenErrorDisplay:[ute getUnexpectedToken]],
-               tokenName];
-    }
-    else if ( [e isKindOfClass:[ANTLRMissingTokenException class] ] ) {
-        ANTLRMissingTokenException *mte = (ANTLRMissingTokenException *)e;
-        NSString *tokenName=@"<unknown>";
-        if ( mte.expecting== ANTLRTokenTypeEOF ) {
-            tokenName = @"EOF";
-        }
-        else {
-            tokenName = [theTokNams objectAtIndex:mte.expecting];
-        }
-        msg = [NSString stringWithFormat:@"missing %@ at %@", tokenName, [self getTokenErrorDisplay:(e.token)] ];
-    }
-    else if ( [e isKindOfClass:[ANTLRMismatchedTokenException class]] ) {
-        ANTLRMismatchedTokenException *mte = (ANTLRMismatchedTokenException *)e;
-        NSString *tokenName=@"<unknown>";
-        if ( mte.expecting== ANTLRTokenTypeEOF ) {
-            tokenName = @"EOF";
-        }
-        else {
-            tokenName = [theTokNams objectAtIndex:mte.expecting];
-        }
-        msg = [NSString stringWithFormat:@"mismatched input %@ expecting %@",[self getTokenErrorDisplay:(e.token)], tokenName];
-    }
-    else if ( [e isKindOfClass:[ANTLRMismatchedTreeNodeException class]] ) {
-        ANTLRMismatchedTreeNodeException *mtne = (ANTLRMismatchedTreeNodeException *)e;
-        NSString *tokenName=@"<unknown>";
-        if ( mtne.expecting==ANTLRTokenTypeEOF ) {
-            tokenName = @"EOF";
-        }
-        else {
-            tokenName = [theTokNams objectAtIndex:mtne.expecting];
-        }
-        msg = [NSString stringWithFormat:@"mismatched tree node: %@ expecting %@", mtne.node, tokenName];
-    }
-    else if ( [e isKindOfClass:[ANTLRNoViableAltException class]] ) {
-        //NoViableAltException *nvae = (NoViableAltException *)e;
-        // for development, can add "decision=<<"+nvae.grammarDecisionDescription+">>"
-        // and "(decision="+nvae.decisionNumber+") and
-        // "state "+nvae.stateNumber
-        msg = [NSString stringWithFormat:@"no viable alternative at input %@", [self getTokenErrorDisplay:e.token]];
-    }
-    else if ( [e isKindOfClass:[ANTLREarlyExitException class]] ) {
-        //ANTLREarlyExitException *eee = (ANTLREarlyExitException *)e;
-        // for development, can add "(decision="+eee.decisionNumber+")"
-        msg =[NSString stringWithFormat: @"required (...)+ loop did not match anything at input ", [self getTokenErrorDisplay:e.token]];
-    }
-    else if ( [e isKindOfClass:[ANTLRMismatchedSetException class]] ) {
-        ANTLRMismatchedSetException *mse = (ANTLRMismatchedSetException *)e;
-        msg = [NSString stringWithFormat:@"mismatched input %@ expecting set %@",
-               [self getTokenErrorDisplay:(e.token)],
-               mse.expecting];
-    }
-#pragma warning NotSet not yet implemented.
-    else if ( [e isKindOfClass:[ANTLRMismatchedNotSetException class] ] ) {
-        ANTLRMismatchedNotSetException *mse = (ANTLRMismatchedNotSetException *)e;
-        msg = [NSString stringWithFormat:@"mismatched input %@ expecting set %@",
-               [self getTokenErrorDisplay:(e.token)],
-               mse.expecting];
-    }
-    else if ( [e isKindOfClass:[ANTLRFailedPredicateException class]] ) {
-        ANTLRFailedPredicateException *fpe = (ANTLRFailedPredicateException *)e;
-        msg = [NSString stringWithFormat:@"rule %@ failed predicate: { %@ }?", fpe.ruleName, fpe.predicate];
-    }
-    else {
-        msg = [NSString stringWithFormat:@"Exception= %@\n", e.name];
-    }
-    return msg;
-}
-
-/** Get number of recognition errors (lexer, parser, tree parser).  Each
- *  recognizer tracks its own number.  So parser and lexer each have
- *  separate count.  Does not count the spurious errors found between
- *  an error and next valid token match
- *
- *  See also reportError()
- */
-- (NSInteger) getNumberOfSyntaxErrors
-{
-    return state.syntaxErrors;
-}
-
-/** What is the error header, normally line/character position information? */
-- (NSString *)getErrorHeader:(ANTLRRecognitionException *)e
-{
-    return [NSString stringWithFormat:@"line %d:%d", e.line, e.charPositionInLine];
-}
-
-/** How should a token be displayed in an error message? The default
- *  is to display just the text, but during development you might
- *  want to have a lot of information spit out.  Override in that case
- *  to use t.toString() (which, for CommonToken, dumps everything about
- *  the token). This is better than forcing you to override a method in
- *  your token objects because you don't have to go modify your lexer
- *  so that it creates a new Java type.
- */
-- (NSString *)getTokenErrorDisplay:(id<ANTLRToken>)t
-{
-    NSString *s = t.text;
-    if ( s == nil ) {
-        if ( t.type == ANTLRTokenTypeEOF ) {
-            s = @"<EOF>";
-        }
-        else {
-            s = [NSString stringWithFormat:@"<%@>", t.type];
-        }
-    }
-    s = [s stringByReplacingOccurrencesOfString:@"\n" withString:@"\\\\n"];
-    s = [s stringByReplacingOccurrencesOfString:@"\r" withString:@"\\\\r"];
-    s = [s stringByReplacingOccurrencesOfString:@"\t" withString:@"\\\\t"];
-    return [NSString stringWithFormat:@"\'%@\'", s];
-}
-                                        
-/** Override this method to change where error messages go */
-- (void) emitErrorMessage:(NSString *) msg
-{
-//    System.err.println(msg);
-    NSLog(@"%@", msg);
-}
-
-/** Recover from an error found on the input stream.  This is
- *  for NoViableAlt and mismatched symbol exceptions.  If you enable
- *  single token insertion and deletion, this will usually not
- *  handle mismatched symbol exceptions but there could be a mismatched
- *  token that the match() routine could not recover from.
- */
-- (void)recover:(id<ANTLRIntStream>)anInput Exception:(ANTLRRecognitionException *)re
-{
-    if ( state.lastErrorIndex == anInput.index ) {
-        // uh oh, another error at same token index; must be a case
-        // where LT(1) is in the recovery token set so nothing is
-        // consumed; consume a single token so at least to prevent
-        // an infinite loop; this is a failsafe.
-        [anInput consume];
-    }
-    state.lastErrorIndex = anInput.index;
-    ANTLRBitSet *followSet = [self computeErrorRecoverySet];
-    [self beginResync];
-    [self consumeUntilFollow:anInput Follow:followSet];
-    [self endResync];
-}
-
-- (void) beginResync
-{
-    
-}
-
-- (void) endResync
-{
-    
-}
-                            
-/*  Compute the error recovery set for the current rule.  During
- *  rule invocation, the parser pushes the set of tokens that can
- *  follow that rule reference on the stack; this amounts to
- *  computing FIRST of what follows the rule reference in the
- *  enclosing rule. This local follow set only includes tokens
- *  from within the rule; i.e., the FIRST computation done by
- *  ANTLR stops at the end of a rule.
- *
- *  EXAMPLE
- *
- *  When you find a "no viable alt exception", the input is not
- *  consistent with any of the alternatives for rule r.  The best
- *  thing to do is to consume tokens until you see something that
- *  can legally follow a call to r *or* any rule that called r.
- *  You don't want the exact set of viable next tokens because the
- *  input might just be missing a token--you might consume the
- *  rest of the input looking for one of the missing tokens.
- *
- *  Consider grammar:
- *
- *  a : '[' b ']'
- *    | '(' b ')'
- *    ;
- *  b : c '^' INT ;
- *  c : ID
- *    | INT
- *    ;
- *
- *  At each rule invocation, the set of tokens that could follow
- *  that rule is pushed on a stack.  Here are the various "local"
- *  follow sets:
- *
- *  FOLLOW(b1_in_a) = FIRST(']') = ']'
- *  FOLLOW(b2_in_a) = FIRST(')') = ')'
- *  FOLLOW(c_in_b) = FIRST('^') = '^'
- *
- *  Upon erroneous input "[]", the call chain is
- *
- *  a -> b -> c
- *
- *  and, hence, the follow context stack is:
- *
- *  depth  local follow set     after call to rule
- *    0         <EOF>                    a (from main())
- *    1          ']'                     b
- *    3          '^'                     c
- *
- *  Notice that ')' is not included, because b would have to have
- *  been called from a different context in rule a for ')' to be
- *  included.
- *
- *  For error recovery, we cannot consider FOLLOW(c)
- *  (context-sensitive or otherwise).  We need the combined set of
- *  all context-sensitive FOLLOW sets--the set of all tokens that
- *  could follow any reference in the call chain.  We need to
- *  resync to one of those tokens.  Note that FOLLOW(c)='^' and if
- *  we resync'd to that token, we'd consume until EOF.  We need to
- *  sync to context-sensitive FOLLOWs for a, b, and c: {']','^'}.
- *  In this case, for input "[]", LA(1) is in this set so we would
- *  not consume anything and after printing an error rule c would
- *  return normally.  It would not find the required '^' though.
- *  At this point, it gets a mismatched token error and throws an
- *  exception (since LA(1) is not in the viable following token
- *  set).  The rule exception handler tries to recover, but finds
- *  the same recovery set and doesn't consume anything.  Rule b
- *  exits normally returning to rule a.  Now it finds the ']' (and
- *  with the successful match exits errorRecovery mode).
- *
- *  So, you cna see that the parser walks up call chain looking
- *  for the token that was a member of the recovery set.
- *
- *  Errors are not generated in errorRecovery mode.
- *
- *  ANTLR's error recovery mechanism is based upon original ideas:
- *
- *  "Algorithms + Data Structures = Programs" by Niklaus Wirth
- *
- *  and
- *
- *  "A note on error recovery in recursive descent parsers":
- *  http://portal.acm.org/citation.cfm?id=947902.947905
- *
- *  Later, Josef Grosch had some good ideas:
- *
- *  "Efficient and Comfortable Error Recovery in Recursive Descent
- *  Parsers":
- *  ftp://www.cocolab.com/products/cocktail/doca4.ps/ell.ps.zip
- *
- *  Like Grosch I implemented local FOLLOW sets that are combined
- *  at run-time upon error to avoid overhead during parsing.
- */
-- (ANTLRBitSet *) computeErrorRecoverySet
-{
-    return [self combineFollows:NO];
-}
-
-/** Compute the context-sensitive FOLLOW set for current rule.
- *  This is set of token types that can follow a specific rule
- *  reference given a specific call chain.  You get the set of
- *  viable tokens that can possibly come next (lookahead depth 1)
- *  given the current call chain.  Contrast this with the
- *  definition of plain FOLLOW for rule r:
- *
- *   FOLLOW(r)={x | S=>*alpha r beta in G and x in FIRST(beta)}
- *
- *  where x in T* and alpha, beta in V*; T is set of terminals and
- *  V is the set of terminals and nonterminals.  In other words,
- *  FOLLOW(r) is the set of all tokens that can possibly follow
- *  references to r in *any* sentential form (context).  At
- *  runtime, however, we know precisely which context applies as
- *  we have the call chain.  We may compute the exact (rather
- *  than covering superset) set of following tokens.
- *
- *  For example, consider grammar:
- *
- *  stat : ID '=' expr ';'      // FOLLOW(stat)=={EOF}
- *       | "return" expr '.'
- *       ;
- *  expr : atom ('+' atom)* ;   // FOLLOW(expr)=={';','.',')'}
- *  atom : INT                  // FOLLOW(atom)=={'+',')',';','.'}
- *       | '(' expr ')'
- *       ;
- *
- *  The FOLLOW sets are all inclusive whereas context-sensitive
- *  FOLLOW sets are precisely what could follow a rule reference.
- *  For input input "i=(3);", here is the derivation:
- *
- *  stat => ID '=' expr ';'
- *       => ID '=' atom ('+' atom)* ';'
- *       => ID '=' '(' expr ')' ('+' atom)* ';'
- *       => ID '=' '(' atom ')' ('+' atom)* ';'
- *       => ID '=' '(' INT ')' ('+' atom)* ';'
- *       => ID '=' '(' INT ')' ';'
- *
- *  At the "3" token, you'd have a call chain of
- *
- *    stat -> expr -> atom -> expr -> atom
- *
- *  What can follow that specific nested ref to atom?  Exactly ')'
- *  as you can see by looking at the derivation of this specific
- *  input.  Contrast this with the FOLLOW(atom)={'+',')',';','.'}.
- *
- *  You want the exact viable token set when recovering from a
- *  token mismatch.  Upon token mismatch, if LA(1) is member of
- *  the viable next token set, then you know there is most likely
- *  a missing token in the input stream.  "Insert" one by just not
- *  throwing an exception.
- */
-- (ANTLRBitSet *)computeContextSensitiveRuleFOLLOW
-{
-    return [self combineFollows:YES];
-}
-
-// what is exact? it seems to only add sets from above on stack
-// if EOR is in set i.  When it sees a set w/o EOR, it stops adding.
-// Why would we ever want them all?  Maybe no viable alt instead of
-// mismatched token?
-- (ANTLRBitSet *)combineFollows:(BOOL) exact
-{
-    NSInteger top = state._fsp;
-    ANTLRBitSet *followSet = [[ANTLRBitSet newANTLRBitSet] retain];
-    for (int i = top; i >= 0; i--) {
-        ANTLRBitSet *localFollowSet = (ANTLRBitSet *)[state.following objectAtIndex:i];
-        /*
-         System.out.println("local follow depth "+i+"="+
-         localFollowSet.toString(getTokenNames())+")");
-         */
-        [followSet orInPlace:localFollowSet];
-        if ( exact ) {
-            // can we see end of rule?
-            if ( [localFollowSet member:ANTLRTokenTypeEOR] ) {
-                // Only leave EOR in set if at top (start rule); this lets
-                // us know if have to include follow(start rule); i.e., EOF
-                if ( i > 0 ) {
-                    [followSet remove:ANTLRTokenTypeEOR];
-                }
-            }
-            else { // can't see end of rule, quit
-                break;
-            }
-        }
-    }
-    return followSet;
-}
-
-/** Attempt to recover from a single missing or extra token.
- *
- *  EXTRA TOKEN
- *
- *  LA(1) is not what we are looking for.  If LA(2) has the right token,
- *  however, then assume LA(1) is some extra spurious token.  Delete it
- *  and LA(2) as if we were doing a normal match(), which advances the
- *  input.
- *
- *  MISSING TOKEN
- *
- *  If current token is consistent with what could come after
- *  ttype then it is ok to "insert" the missing token, else throw
- *  exception For example, Input "i=(3;" is clearly missing the
- *  ')'.  When the parser returns from the nested call to expr, it
- *  will have call chain:
- *
- *    stat -> expr -> atom
- *
- *  and it will be trying to match the ')' at this point in the
- *  derivation:
- *
- *       => ID '=' '(' INT ')' ('+' atom)* ';'
- *                          ^
- *  match() will see that ';' doesn't match ')' and report a
- *  mismatched token error.  To recover, it sees that LA(1)==';'
- *  is in the set of tokens that can follow the ')' token
- *  reference in rule atom.  It can assume that you forgot the ')'.
- */
-- (id<ANTLRToken>)recoverFromMismatchedToken:(id<ANTLRIntStream>)anInput
-                       TokenType:(NSInteger)ttype
-                          Follow:(ANTLRBitSet *)follow
-{
-    ANTLRRecognitionException *e = nil;
-    // if next token is what we are looking for then "delete" this token
-    if ( [self mismatchIsUnwantedToken:anInput TokenType:ttype] ) {
-        e = [ANTLRUnwantedTokenException newException:ttype Stream:anInput];
-        /*
-         System.err.println("recoverFromMismatchedToken deleting "+
-         ((TokenStream)input).LT(1)+
-         " since "+((TokenStream)input).LT(2)+" is what we want");
-         */
-        [self beginResync];
-        [anInput consume]; // simply delete extra token
-        [self endResync];
-        [self reportError:e];  // report after consuming so AW sees the token in the exception
-                         // we want to return the token we're actually matching
-        id matchedSymbol = [self getCurrentInputSymbol:anInput];
-        [anInput consume]; // move past ttype token as if all were ok
-        return matchedSymbol;
-    }
-    // can't recover with single token deletion, try insertion
-    if ( [self mismatchIsMissingToken:anInput Follow:follow] ) {
-        id<ANTLRToken> inserted = [self getMissingSymbol:anInput Exception:e TokenType:ttype Follow:follow];
-        e = [ANTLRMissingTokenException newException:ttype Stream:anInput With:inserted];
-        [self reportError:e];  // report after inserting so AW sees the token in the exception
-        return inserted;
-    }
-    // even that didn't work; must throw the exception
-    e = [ANTLRMismatchedTokenException newException:ttype Stream:anInput];
-    @throw e;
-}
-
-/** Not currently used */
--(id) recoverFromMismatchedSet:(id<ANTLRIntStream>)anInput
-                     Exception:(ANTLRRecognitionException *)e
-                        Follow:(ANTLRBitSet *) follow
-{
-    if ( [self mismatchIsMissingToken:anInput Follow:follow] ) {
-        // System.out.println("missing token");
-        [self reportError:e];
-        // we don't know how to conjure up a token for sets yet
-        return [self getMissingSymbol:anInput Exception:e TokenType:ANTLRTokenTypeInvalid Follow:follow];
-    }
-    // TODO do single token deletion like above for Token mismatch
-    @throw e;
-}
-
-/** Match needs to return the current input symbol, which gets put
- *  into the label for the associated token ref; e.g., x=ID.  Token
- *  and tree parsers need to return different objects. Rather than test
- *  for input stream type or change the IntStream interface, I use
- *  a simple method to ask the recognizer to tell me what the current
- *  input symbol is.
- * 
- *  This is ignored for lexers.
- */
-- (id) getCurrentInputSymbol:(id<ANTLRIntStream>)anInput
-{
-    return nil;
-}
-
-/** Conjure up a missing token during error recovery.
- *
- *  The recognizer attempts to recover from single missing
- *  symbols. But, actions might refer to that missing symbol.
- *  For example, x=ID {f($x);}. The action clearly assumes
- *  that there has been an identifier matched previously and that
- *  $x points at that token. If that token is missing, but
- *  the next token in the stream is what we want we assume that
- *  this token is missing and we keep going. Because we
- *  have to return some token to replace the missing token,
- *  we have to conjure one up. This method gives the user control
- *  over the tokens returned for missing tokens. Mostly,
- *  you will want to create something special for identifier
- *  tokens. For literals such as '{' and ',', the default
- *  action in the parser or tree parser works. It simply creates
- *  a CommonToken of the appropriate type. The text will be the token.
- *  If you change what tokens must be created by the lexer,
- *  override this method to create the appropriate tokens.
- */
-- (id)getMissingSymbol:(id<ANTLRIntStream>)anInput
-             Exception:(ANTLRRecognitionException *)e
-             TokenType:(NSInteger)expectedTokenType
-                Follow:(ANTLRBitSet *)follow
-{
-    return nil;
-}
-
-
--(void) consumeUntilTType:(id<ANTLRIntStream>)anInput TokenType:(NSInteger)tokenType
-{
-    //System.out.println("consumeUntil "+tokenType);
-    int ttype = [anInput LA:1];
-    while (ttype != ANTLRTokenTypeEOF && ttype != tokenType) {
-        [anInput consume];
-        ttype = [anInput LA:1];
-    }
-}
-
-/** Consume tokens until one matches the given token set */
--(void) consumeUntilFollow:(id<ANTLRIntStream>)anInput Follow:(ANTLRBitSet *)set
-{
-    //System.out.println("consumeUntil("+set.toString(getTokenNames())+")");
-    int ttype = [anInput LA:1];
-    while (ttype != ANTLRTokenTypeEOF && ![set member:ttype] ) {
-        //System.out.println("consume during recover LA(1)="+getTokenNames()[input.LA(1)]);
-        [anInput consume];
-        ttype = [anInput LA:1];
-    }
-}
-
-/** Push a rule's follow set using our own hardcoded stack */
-- (void)pushFollow:(ANTLRBitSet *)fset
-{
-    if ( (state._fsp +1) >= [state.following count] ) {
-        //        AMutableArray *f = [AMutableArray arrayWithCapacity:[[state.following] count]*2];
-        //        System.arraycopy(state.following, 0, f, 0, state.following.length);
-        //        state.following = f;
-        [state.following addObject:fset];
-        [fset retain];
-        state._fsp++;
-    }
-    else {
-        [state.following replaceObjectAtIndex:++state._fsp withObject:fset];
-    }
-}
-
-- (ANTLRBitSet *)popFollow
-{
-    ANTLRBitSet *fset;
-
-    if ( state._fsp >= 0 && [state.following count] > 0 ) {
-        fset = [state.following objectAtIndex:state._fsp--];
-        [state.following removeLastObject];
-        return fset;
-    }
-    else {
-        NSLog( @"Attempted to pop a follow when none exists on the stack\n" );
-    }
-    return nil;
-}
-
-/** Return List<String> of the rules in your parser instance
- *  leading up to a call to this method.  You could override if
- *  you want more details such as the file/line info of where
- *  in the parser java code a rule is invoked.
- *
- *  This is very useful for error messages and for context-sensitive
- *  error recovery.
- */
-- (AMutableArray *)getRuleInvocationStack
-{
-    NSString *parserClassName = [[self className] retain];
-    return [self getRuleInvocationStack:[ANTLRRecognitionException newException] Recognizer:parserClassName];
-}
-
-/** A more general version of getRuleInvocationStack where you can
- *  pass in, for example, a RecognitionException to get it's rule
- *  stack trace.  This routine is shared with all recognizers, hence,
- *  static.
- *
- *  TODO: move to a utility class or something; weird having lexer call this
- */
-- (AMutableArray *)getRuleInvocationStack:(ANTLRRecognitionException *)e
-                                Recognizer:(NSString *)recognizerClassName
-{
-    // char *name;
-    AMutableArray *rules = [[AMutableArray arrayWithCapacity:20] retain];
-    NSArray *stack = [e callStackSymbols];
-    int i = 0;
-    for (i = [stack count]-1; i >= 0; i--) {
-        NSString *t = [stack objectAtIndex:i];
-        // NSLog(@"stack %d = %@\n", i, t);
-        if ( [t commonPrefixWithString:@"org.antlr.runtime." options:NSLiteralSearch] ) {
-            // id aClass = objc_getClass( [t UTF8String] );
-            continue; // skip support code such as this method
-        }
-        if ( [t isEqualTo:NEXT_TOKEN_RULE_NAME] ) {
-            // name = sel_getName(method_getName(method));
-            // NSString *aMethod = [NSString stringWithFormat:@"%s", name];
-            continue;
-        }
-        if ( ![t isEqualTo:recognizerClassName] ) {
-            // name = class_getName( [t UTF8String] );
-            continue; // must not be part of this parser
-        }
-        [rules addObject:t];
-    }
-#ifdef DONTUSEYET
-    StackTraceElement[] stack = e.getStackTrace();
-    int i = 0;
-    for (i=stack.length-1; i>=0; i--) {
-        StackTraceElement t = stack[i];
-        if ( [t getClassName().startsWith("org.antlr.runtime.") ) {
-            continue; // skip support code such as this method
-        }
-              if ( [[t getMethodName] equals:NEXT_TOKEN_RULE_NAME] ) {
-            continue;
-        }
-              if ( ![[t getClassName] equals:recognizerClassName] ) {
-            continue; // must not be part of this parser
-        }
-              [rules addObject:[t getMethodName]];
-    }
-#endif
-    [stack release];
-    return rules;
-}
-
-- (NSInteger) getBacktrackingLevel
-{
-    return [state getBacktracking];
-}
-      
-- (void) setBacktrackingLevel:(NSInteger)level
-{
-    [state setBacktracking:level];
-}
-      
-        /** Used to print out token names like ID during debugging and
- *  error reporting.  The generated parsers implement a method
- *  that overrides this to point to their String[] tokenNames.
- */
-- (NSArray *)getTokenNames
-{
-    return tokenNames;
-}
-
-/** For debugging and other purposes, might want the grammar name.
- *  Have ANTLR generate an implementation for this method.
- */
-- (NSString *)getGrammarFileName
-{
-    return grammarFileName;
-}
-
-- (NSString *)getSourceName
-{
-    return nil;
-}
-
-/** A convenience method for use most often with template rewrites.
- *  Convert a List<Token> to List<String>
- */
-- (AMutableArray *)toStrings:(AMutableArray *)tokens
-{
-    if ( tokens == nil )
-        return nil;
-    AMutableArray *strings = [AMutableArray arrayWithCapacity:[tokens count]];
-    id object;
-    NSInteger i = 0;
-    for (object in tokens) {
-        [strings addObject:[object text]];
-        i++;
-    }
-    return strings;
-}
-
-/** Given a rule number and a start token index number, return
- *  ANTLR_MEMO_RULE_UNKNOWN if the rule has not parsed input starting from
- *  start index.  If this rule has parsed input starting from the
- *  start index before, then return where the rule stopped parsing.
- *  It returns the index of the last token matched by the rule.
- *
- *  For now we use a hashtable and just the slow Object-based one.
- *  Later, we can make a special one for ints and also one that
- *  tosses out data after we commit past input position i.
- */
-- (NSInteger)getRuleMemoization:(NSInteger)ruleIndex StartIndex:(NSInteger)ruleStartIndex
-{
-    NSNumber *stopIndexI;
-    ANTLRHashRule *aHashRule;
-    if ( (aHashRule = [state.ruleMemo objectAtIndex:ruleIndex]) == nil ) {
-        aHashRule = [ANTLRHashRule newANTLRHashRuleWithLen:17];
-        [state.ruleMemo insertObject:aHashRule atIndex:ruleIndex];
-    }
-    stopIndexI = [aHashRule getRuleMemoStopIndex:ruleStartIndex];
-    if ( stopIndexI == nil ) {
-        return ANTLR_MEMO_RULE_UNKNOWN;
-    }
-    return [stopIndexI integerValue];
-}
-
-/** Has this rule already parsed input at the current index in the
- *  input stream?  Return the stop token index or MEMO_RULE_UNKNOWN.
- *  If we attempted but failed to parse properly before, return
- *  MEMO_RULE_FAILED.
- *
- *  This method has a side-effect: if we have seen this input for
- *  this rule and successfully parsed before, then seek ahead to
- *  1 past the stop token matched for this rule last time.
- */
-- (BOOL)alreadyParsedRule:(id<ANTLRIntStream>)anInput RuleIndex:(NSInteger)ruleIndex
-{
-    NSInteger aStopIndex = [self getRuleMemoization:ruleIndex StartIndex:anInput.index];
-    if ( aStopIndex == ANTLR_MEMO_RULE_UNKNOWN ) {
-        // NSLog(@"rule %d not yet encountered\n", ruleIndex);
-        return NO;
-    }
-    if ( aStopIndex == ANTLR_MEMO_RULE_FAILED ) {
-        if (debug) NSLog(@"rule %d will never succeed\n", ruleIndex);
-        state.failed = YES;
-    }
-    else {
-        if (debug) NSLog(@"seen rule %d before; skipping ahead to %d failed = %@\n", ruleIndex, aStopIndex+1, state.failed?@"YES":@"NO");
-        [anInput seek:(aStopIndex+1)]; // jump to one past stop token
-    }
-    return YES;
-}
-      
-/** Record whether or not this rule parsed the input at this position
- *  successfully.  Use a standard java hashtable for now.
- */
-- (void)memoize:(id<ANTLRIntStream>)anInput
-      RuleIndex:(NSInteger)ruleIndex
-     StartIndex:(NSInteger)ruleStartIndex
-{
-    ANTLRRuleStack *aRuleStack;
-    NSInteger stopTokenIndex;
-
-    aRuleStack = state.ruleMemo;
-    stopTokenIndex = (state.failed ? ANTLR_MEMO_RULE_FAILED : (anInput.index-1));
-    if ( aRuleStack == nil ) {
-        if (debug) NSLog(@"!!!!!!!!! memo array is nil for %@", [self getGrammarFileName]);
-        return;
-    }
-    if ( ruleIndex >= [aRuleStack length] ) {
-        if (debug) NSLog(@"!!!!!!!!! memo size is %d, but rule index is %d", [state.ruleMemo length], ruleIndex);
-        return;
-    }
-    if ( [aRuleStack objectAtIndex:ruleIndex] != nil ) {
-        [aRuleStack putHashRuleAtRuleIndex:ruleIndex StartIndex:ruleStartIndex StopIndex:stopTokenIndex];
-    }
-    return;
-}
-   
-/** return how many rule/input-index pairs there are in total.
- *  TODO: this includes synpreds. :(
- */
-- (NSInteger)getRuleMemoizationCacheSize
-{
-    ANTLRRuleStack *aRuleStack;
-    ANTLRHashRule *aHashRule;
-
-    int aCnt = 0;
-    aRuleStack = state.ruleMemo;
-    for (NSUInteger i = 0; aRuleStack != nil && i < [aRuleStack length]; i++) {
-        aHashRule = [aRuleStack objectAtIndex:i];
-        if ( aHashRule != nil ) {
-            aCnt += [aHashRule count]; // how many input indexes are recorded?
-        }
-    }
-    return aCnt;
-}
-
-#pragma warning Have to fix traceIn and traceOut.
-- (void)traceIn:(NSString *)ruleName Index:(NSInteger)ruleIndex Object:(id)inputSymbol
-{
-    NSLog(@"enter %@ %@", ruleName, inputSymbol);
-    if ( state.backtracking > 0 ) {
-        NSLog(@" backtracking=%s", ((state.backtracking==YES)?"YES":"NO"));
-    }
-    NSLog(@"\n");
-}
-
-- (void)traceOut:(NSString *)ruleName Index:(NSInteger)ruleIndex Object:(id)inputSymbol
-{
-    NSLog(@"exit %@ -- %@", ruleName, inputSymbol);
-    if ( state.backtracking > 0 ) {
-        NSLog(@" backtracking=%s %s", state.backtracking?"YES":"NO", state.failed ? "failed":"succeeded");
-    }
-    NSLog(@"\n");
-}
-
-
-// call a syntactic predicate methods using its selector. this way we can support arbitrary synpreds.
-- (BOOL) evaluateSyntacticPredicate:(SEL)synpredFragment // stream:(id<ANTLRIntStream>)input
-{
-    id<ANTLRIntStream> input;
-
-    state.backtracking++;
-    // input = state.token.input;
-    input = self.input;
-    int start = [input mark];
-    @try {
-        [self performSelector:synpredFragment];
-    }
-    @catch (ANTLRRecognitionException *re) {
-        NSLog(@"impossible synpred: %@", re.name);
-    }
-    BOOL success = (state.failed == NO);
-    [input rewind:start];
-    state.backtracking--;
-    state.failed = NO;
-    return success;
-}
-              
-@end
-                               
diff --git a/runtime/ObjC/Framework/ANTLRBaseStack.h b/runtime/ObjC/Framework/ANTLRBaseStack.h
deleted file mode 100644
index 2356178..0000000
--- a/runtime/ObjC/Framework/ANTLRBaseStack.h
+++ /dev/null
@@ -1,66 +0,0 @@
-//
-//  ANTLRBaseRecognizer.m
-//  ANTLR
-//
-//  Created by Alan Condit on 6/16/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRPtrBuffer.h"
-
-//#define GLOBAL_SCOPE       0
-//#define LOCAL_SCOPE        1
-#define HASHSIZE         101
-#define HBUFSIZE      0x2000
-
-@interface ANTLRBaseStack : ANTLRPtrBuffer {
-	//ANTLRRuleStack *fNext;
-    // TStringPool *fPool;
-    NSInteger LastHash;
-}
-
-//@property (copy) ANTLRRuleStack *fNext;
-@property (getter=getLastHash, setter=setLastHash:) NSInteger LastHash;
-
-// Contruction/Destruction
-+ (ANTLRBaseStack *)newANTLRBaseStack;
-+ (ANTLRBaseStack *)newANTLRBaseStackWithLen:(NSInteger)cnt;
-- (id)init;
-- (id)initWithLen:(NSInteger)cnt;
-- (void)dealloc;
-
-// Instance Methods
-- (id) copyWithZone:(NSZone *)aZone;
-
-- (NSUInteger)count;
-- (NSUInteger)size;
-/* clear -- reinitialize the maplist array */
-
-- (NSInteger)getLastHash;
-- (void)setLastHash:(NSInteger)aVal;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRBaseStack.m b/runtime/ObjC/Framework/ANTLRBaseStack.m
deleted file mode 100644
index 7bd2282..0000000
--- a/runtime/ObjC/Framework/ANTLRBaseStack.m
+++ /dev/null
@@ -1,131 +0,0 @@
-//
-//  ANTLRBaseRecognizer.m
-//  ANTLR
-//
-//  Created by Alan Condit on 6/16/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#define SUCCESS (0)
-#define FAILURE (-1)
-
-#import "ANTLRBaseStack.h"
-#import "ANTLRTree.h"
-
-/*
- * Start of ANTLRBaseStack
- */
-@implementation ANTLRBaseStack
-
-@synthesize LastHash;
-
-+(ANTLRBaseStack *)newANTLRBaseStack
-{
-    return [[ANTLRBaseStack alloc] init];
-}
-
-+(ANTLRBaseStack *)newANTLRBaseStackWithLen:(NSInteger)cnt
-{
-    return [[ANTLRBaseStack alloc] initWithLen:cnt];
-}
-
--(id)init
-{
-	self = [super initWithLen:HASHSIZE];
-	if ( self != nil ) {
-	}
-    return( self );
-}
-
--(id)initWithLen:(NSInteger)cnt
-{
-	self = [super initWithLen:cnt];
-    if ( self != nil ) {
-	}
-    return( self );
-}
-
-- (void)dealloc
-{
-#ifdef DEBUG_DEALLOC
-    NSLog( @"called dealloc in ANTLRBaseStack" );
-#endif
-	[super dealloc];
-}
-
-- (id) copyWithZone:(NSZone *)aZone
-{
-    ANTLRBaseStack *copy;
-    
-    copy = [super copyWithZone:aZone];
-    return copy;
-}
-
-- (NSUInteger)count
-{
-    NSUInteger aCnt = 0;
-    
-    for (int i = 0; i < BuffSize; i++) {
-        if (ptrBuffer[i] != nil) {
-            aCnt++;
-        }
-    }
-    return aCnt;
-}
-
-- (NSUInteger) size
-{
-    return BuffSize;
-}
-
--(void)deleteANTLRBaseStack:(ANTLRBaseStack *)np
-{
-    id tmp, rtmp;
-    NSInteger idx;
-    
-    if ( self.fNext != nil ) {
-        for( idx = 0; idx < BuffSize; idx++ ) {
-            tmp = (ANTLRLinkBase *)ptrBuffer[idx];
-            while ( tmp ) {
-                rtmp = tmp;
-                tmp = [tmp getfNext];
-                [rtmp release];
-            }
-        }
-    }
-}
-
-- (NSInteger)getLastHash
-{
-    return LastHash;
-}
-
-- (void)setLastHash:(NSInteger)aVal
-{
-    LastHash = aVal;
-}
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRBaseTree.h b/runtime/ObjC/Framework/ANTLRBaseTree.h
deleted file mode 100755
index 1139cd0..0000000
--- a/runtime/ObjC/Framework/ANTLRBaseTree.h
+++ /dev/null
@@ -1,210 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import "ANTLRTree.h"
-#import "ANTLRCommonToken.h"
-#import "AMutableArray.h"
-
-@protocol ANTLRBaseTree <ANTLRTree>
-
-+ (id<ANTLRBaseTree>) INVALID_NODE;
-
-+ (id<ANTLRBaseTree>) newTree;
-+ (id<ANTLRBaseTree>) newTree:(id<ANTLRBaseTree>)node;
-
-- (id<ANTLRBaseTree>) init;
-- (id<ANTLRBaseTree>) initWith:(id<ANTLRBaseTree>)node;
-
-- (id<ANTLRBaseTree>) getChild:(NSUInteger)i;
-- (AMutableArray *)children;
-- (void) setChildren:(AMutableArray *)anArray;
-- (id<ANTLRBaseTree>)getFirstChildWithType:(NSInteger)type;
-- (NSUInteger) getChildCount;
-
-// Add t as a child to this node.  If t is null, do nothing.  If t
-//  is nil, add all children of t to this' children.
-
-- (void) addChild:(id<ANTLRBaseTree>) tree;
-- (void) addChildren:(NSArray *) theChildren;
-//- (void) removeAllChildren;
-
-- (void) setChild:(NSInteger) i With:(id<ANTLRBaseTree>)t;
-- (id) deleteChild:(NSInteger) i;
-- (AMutableArray *) createChildrenList;
-- (void) replaceChildrenFrom:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id) t;
-// Indicates the node is a nil node but may still have children, meaning
-// the tree is a flat list.
-
-- (BOOL) isNil;
-- (NSInteger) getTokenStartIndex;
-- (void) setTokenStartIndex:(NSInteger) index;
-- (NSInteger) getTokenStopIndex;
-- (void) setTokenStopIndex:(NSInteger) index;
-
-- (void) freshenParentAndChildIndexes;
-- (void) freshenParentAndChildIndexes:(NSInteger) offset;
-- (void) sanityCheckParentAndChildIndexes;
-- (void) sanityCheckParentAndChildIndexes:(id<ANTLRBaseTree>) parent At:(NSInteger) i;
-
-- (NSInteger) getChildIndex;
-- (void) setChildIndex:(NSInteger)i;
-
-- (id<ANTLRBaseTree>)getAncestor:(NSInteger)ttype;
-- (AMutableArray *)getAncestors;
-
-#pragma mark Copying
-- (id) copyWithZone:(NSZone *)aZone;	// the children themselves are not copied here!
-- (id) deepCopy;					// performs a deepCopyWithZone: with the default zone
-- (id) deepCopyWithZone:(NSZone *)aZone;
-
-#pragma mark Tree Parser support
-- (NSInteger)type;
-- (NSString *)text;
-// In case we don't have a token payload, what is the line for errors?
-- (NSUInteger)line;
-- (NSUInteger)charPositionInLine;
-
-
-#pragma mark Informational
-- (NSString *) treeDescription;
-- (NSString *) description;
-
-- (NSString *) toString;
-- (NSString *) toStringTree;
-
-@property (retain) AMutableArray *children;
-@property (retain) NSException *anException;
-
-@end
-
-@interface ANTLRBaseTree : NSObject <ANTLRTree>
-{
-	__strong AMutableArray *children;
-    __strong NSException *anException;
-}
-
-+ (id<ANTLRBaseTree>) INVALID_NODE;
-+ (id<ANTLRBaseTree>) newTree;
-+ (id<ANTLRBaseTree>) newTree:(id<ANTLRBaseTree>)node;
-         
-- (id<ANTLRBaseTree>) init;
-- (id<ANTLRBaseTree>) initWith:(id<ANTLRBaseTree>)node;
-
-- (id<ANTLRBaseTree>) getChild:(NSUInteger)i;
-- (AMutableArray *)children;
-- (void) setChildren:(AMutableArray *)anArray;
-- (id<ANTLRBaseTree>)getFirstChildWithType:(NSInteger)type;
-- (NSUInteger) getChildCount;
-
-//- (void) removeAllChildren;
-
-// Add t as a child to this node.  If t is null, do nothing.  If t
-//  is nil, add all children of t to this' children.
-
-- (void) addChild:(id<ANTLRBaseTree>) tree;
-- (void) addChildren:(NSArray *) theChildren;
-
-- (void) setChild:(NSUInteger) i With:(id<ANTLRBaseTree>)t;
-- (id) deleteChild:(NSUInteger) idx;
-- (AMutableArray *) createChildrenList;
-- (void) replaceChildrenFrom:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id) t;
-// Indicates the node is a nil node but may still have children, meaning
-	// the tree is a flat list.
-
-- (BOOL) isNil;
-- (NSInteger) getTokenStartIndex;
-- (void) setTokenStartIndex:(NSInteger) index;
-- (NSInteger) getTokenStopIndex;
-- (void) setTokenStopIndex:(NSInteger) index;
-
-- (void) freshenParentAndChildIndexes;
-- (void) freshenParentAndChildIndexes:(NSInteger) offset;
-- (void) sanityCheckParentAndChildIndexes;
-- (void) sanityCheckParentAndChildIndexes:(id<ANTLRBaseTree>)parent At:(NSInteger) i;
-
-- (NSInteger) getChildIndex;
-- (void) setChildIndex:(NSInteger)i;
-
-- (BOOL) hasAncestor:(NSInteger) ttype;
-- (id<ANTLRBaseTree>)getAncestor:(NSInteger)ttype;
-- (AMutableArray *)getAncestors;
-
-- (id) copyWithZone:(NSZone *)aZone;
-- (id) deepCopy;					// performs a deepCopyWithZone: with the default zone
-- (id) deepCopyWithZone:(NSZone *)aZone;
-
-	// Return a token type; needed for tree parsing
-- (NSInteger)type;
-- (NSString *)text;
-
-	// In case we don't have a token payload, what is the line for errors?
-- (NSUInteger)line;
-- (NSUInteger)charPositionInLine;
-- (void) setCharPositionInLine:(NSUInteger)pos;
-
-- (NSString *) treeDescription;
-- (NSString *) description;
-- (NSString *) toString;
-- (NSString *) toStringTree;
-
-@property (retain) AMutableArray *children;
-@property (retain) NSException *anException;
-
-@end
-
-@interface ANTLRTreeNavigationNode : ANTLRBaseTree {
-}
-- (id) init;
-- (id) copyWithZone:(NSZone *)aZone;
-@end
-
-@interface ANTLRTreeNavigationNodeDown : ANTLRTreeNavigationNode {
-}
-+ (ANTLRTreeNavigationNodeDown *) getNavigationNodeDown;
-- (id) init;
-- (NSInteger) tokenType;
-- (NSString *) description;
-@end
-
-@interface ANTLRTreeNavigationNodeUp : ANTLRTreeNavigationNode {
-}
-+ (ANTLRTreeNavigationNodeUp *) getNavigationNodeUp;
-- (id) init;
-- (NSInteger) tokenType;
-- (NSString *) description;
-@end
-
-@interface ANTLRTreeNavigationNodeEOF : ANTLRTreeNavigationNode {
-}
-+ (ANTLRTreeNavigationNodeEOF *) getNavigationNodeEOF;
-- (id) init;
-- (NSInteger) tokenType;
-- (NSString *) description;
-@end
-
-extern ANTLRTreeNavigationNodeDown *navigationNodeDown;
-extern ANTLRTreeNavigationNodeUp *navigationNodeUp;
-extern ANTLRTreeNavigationNodeEOF *navigationNodeEOF;
diff --git a/runtime/ObjC/Framework/ANTLRBaseTree.m b/runtime/ObjC/Framework/ANTLRBaseTree.m
deleted file mode 100755
index 5ba4eac..0000000
--- a/runtime/ObjC/Framework/ANTLRBaseTree.m
+++ /dev/null
@@ -1,616 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import "ANTLRBaseTree.h"
-#import "ANTLRBaseTreeAdaptor.h"
-#import "ANTLRToken.h"
-// TODO: this shouldn't be here...but needed for invalidNode
-#import "AMutableArray.h"
-#import "ANTLRCommonTree.h"
-#import "ANTLRRuntimeException.h"
-#import "ANTLRError.h"
-
-#pragma mark - Navigation Nodes
-ANTLRTreeNavigationNodeDown *navigationNodeDown = nil;
-ANTLRTreeNavigationNodeUp *navigationNodeUp = nil;
-ANTLRTreeNavigationNodeEOF *navigationNodeEOF = nil;
-
-
-@implementation ANTLRBaseTree
-
-static id<ANTLRBaseTree> invalidNode = nil;
-
-#pragma mark ANTLRTree protocol conformance
-
-+ (id<ANTLRBaseTree>) INVALID_NODE
-{
-	if ( invalidNode == nil ) {
-		invalidNode = [[ANTLRCommonTree alloc] initWithTokenType:ANTLRTokenTypeInvalid];
-	}
-	return invalidNode;
-}
-
-+ (id<ANTLRBaseTree>) invalidNode
-{
-	if ( invalidNode == nil ) {
-		invalidNode = [[ANTLRCommonTree alloc] initWithTokenType:ANTLRTokenTypeInvalid];
-	}
-	return invalidNode;
-}
-
-+ newTree
-{
-    return [[ANTLRBaseTree alloc] init];
-}
-
-/** Create a new node from an existing node does nothing for ANTLRBaseTree
- *  as there are no fields other than the children list, which cannot
- *  be copied as the children are not considered part of this node. 
- */
-+ newTree:(id<ANTLRBaseTree>) node
-{
-    return [[ANTLRBaseTree alloc] initWith:(id<ANTLRBaseTree>) node];
-}
-
-- (id) init
-{
-    self = [super init];
-    if ( self != nil ) {
-        children = nil;
-        return self;
-    }
-    return nil;
-}
-
-- (id) initWith:(id<ANTLRBaseTree>)node
-{
-    self = [super init];
-    if ( self != nil ) {
-        // children = [[AMutableArray arrayWithCapacity:5] retain];
-        // [children addObject:node];
-        [self addChild:node];
-        return self;
-    }
-    return nil;
-}
-
-- (void) dealloc
-{
-#ifdef DEBUG_DEALLOC
-    NSLog( @"called dealloc in ANTLRBaseTree" );
-#endif
-	if ( children ) [children release];
-	[super dealloc];
-}
-
-- (id<ANTLRBaseTree>) getChild:(NSUInteger)i
-{
-    if ( children == nil || i >= [children count] ) {
-        return nil;
-    }
-    return (id<ANTLRBaseTree>)[children objectAtIndex:i];
-}
-
-/** Get the children internal List; note that if you directly mess with
- *  the list, do so at your own risk.
- */
-- (AMutableArray *) children
-{
-    return children;
-}
-
-- (void) setChildren:(AMutableArray *)anArray
-{
-    if ( children != anArray ) {
-        if ( children ) [children release];
-        if ( anArray ) [anArray retain];
-    }
-    children = anArray;
-}
-
-- (id<ANTLRBaseTree>) getFirstChildWithType:(NSInteger) aType
-{
-    for (NSUInteger i = 0; children != nil && i < [children count]; i++) {
-        id<ANTLRBaseTree> t = (id<ANTLRBaseTree>) [children objectAtIndex:i];
-        if ( t.type == aType ) {
-            return t;
-        }
-    }	
-    return nil;
-}
-
-- (NSUInteger) getChildCount
-{
-    if ( children == nil ) {
-        return 0;
-    }
-    return [children count];
-}
-
-/** Add t as child of this node.
- *
- *  Warning: if t has no children, but child does
- *  and child isNil then this routine moves children to t via
- *  t.children = child.children; i.e., without copying the array.
- */
-- (void) addChild:(id<ANTLRBaseTree>) t
-{
-    //System.out.println("add child "+t.toStringTree()+" "+self.toStringTree());
-    //System.out.println("existing children: "+children);
-    if ( t == nil ) {
-        return; // do nothing upon addChild(nil)
-    }
-    if ( self == (ANTLRBaseTree *)t )
-        @throw [ANTLRIllegalArgumentException newException:@"ANTLRBaseTree Can't add self to self as child"];        
-    id<ANTLRBaseTree> childTree = (id<ANTLRBaseTree>) t;
-    if ( [childTree isNil] ) { // t is an empty node possibly with children
-        if ( children != nil && children == childTree.children ) {
-            @throw [ANTLRRuntimeException newException:@"ANTLRBaseTree add child list to itself"];
-        }
-        // just add all of childTree's children to this
-        if ( childTree.children != nil ) {
-            if ( children != nil ) { // must copy, this has children already
-                int n = [childTree.children count];
-                for ( int i = 0; i < n; i++) {
-                    id<ANTLRBaseTree> c = (id<ANTLRBaseTree>)[childTree.children objectAtIndex:i];
-                    [children addObject:c];
-                    // handle double-link stuff for each child of nil root
-                    [c setParent:(id<ANTLRBaseTree>)self];
-                    [c setChildIndex:[children count]-1];
-                }
-            }
-            else {
-                // no children for this but t has children; just set pointer
-                // call general freshener routine
-                children = childTree.children;
-                [self freshenParentAndChildIndexes];
-            }
-        }
-    }
-    else { // child is not nil (don't care about children)
-        if ( children == nil ) {
-            children = [[AMutableArray arrayWithCapacity:5] retain]; // create children list on demand
-        }
-        [children addObject:t];
-        [childTree setParent:(id<ANTLRBaseTree>)self];
-        [childTree setChildIndex:[children count]-1];
-    }
-    // System.out.println("now children are: "+children);
-}
-
-/** Add all elements of kids list as children of this node */
-- (void) addChildren:(AMutableArray *) kids
-{
-    for (NSUInteger i = 0; i < [kids count]; i++) {
-        id<ANTLRBaseTree> t = (id<ANTLRBaseTree>) [kids objectAtIndex:i];
-        [self addChild:t];
-    }
-}
-
-- (void) setChild:(NSUInteger) i With:(id<ANTLRBaseTree>)t
-{
-    if ( t == nil ) {
-        return;
-    }
-    if ( [t isNil] ) {
-        @throw [ANTLRIllegalArgumentException newException:@"ANTLRBaseTree Can't set single child to a list"];        
-    }
-    if ( children == nil ) {
-        children = [[AMutableArray arrayWithCapacity:5] retain];
-    }
-    if ([children count] > i ) {
-        [children replaceObjectAtIndex:i withObject:t];
-    }
-    else {
-        [children insertObject:t atIndex:i];
-    }
-    [t setParent:(id<ANTLRBaseTree>)self];
-    [t setChildIndex:i];
-}
-
-- (id) deleteChild:(NSUInteger) idx
-{
-    if ( children == nil ) {
-        return nil;
-    }
-    id<ANTLRBaseTree> killed = (id<ANTLRBaseTree>)[children objectAtIndex:idx];
-    [children removeObjectAtIndex:idx];
-    // walk rest and decrement their child indexes
-    [self freshenParentAndChildIndexes:idx];
-    return killed;
-}
-
-/** Delete children from start to stop and replace with t even if t is
- *  a list (nil-root ANTLRTree).  num of children can increase or decrease.
- *  For huge child lists, inserting children can force walking rest of
- *  children to set their childindex; could be slow.
- */
-- (void) replaceChildrenFrom:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id) t
-{
-    /*
-     System.out.println("replaceChildren "+startChildIndex+", "+stopChildIndex+
-     " with "+((ANTLRBaseTree)t).toStringTree());
-     System.out.println("in="+toStringTree());
-     */
-    if ( children == nil ) {
-        @throw [ANTLRIllegalArgumentException newException:@"ANTLRBaseTree Invalid Indexes; no children in list"];        
-    }
-    int replacingHowMany = stopChildIndex - startChildIndex + 1;
-    int replacingWithHowMany;
-    id<ANTLRBaseTree> newTree = (id<ANTLRBaseTree>) t;
-    AMutableArray *newChildren = nil;
-    // normalize to a list of children to add: newChildren
-    if ( [newTree isNil] ) {
-        newChildren = newTree.children;
-    }
-    else {
-        newChildren = [AMutableArray arrayWithCapacity:5];
-        [newChildren addObject:newTree];
-    }
-    replacingWithHowMany = [newChildren count];
-    int numNewChildren = [newChildren count];
-    int delta = replacingHowMany - replacingWithHowMany;
-    // if same number of nodes, do direct replace
-    if ( delta == 0 ) {
-        int j = 0; // index into new children
-        for (int i=startChildIndex; i <= stopChildIndex; i++) {
-            id<ANTLRBaseTree> child = (id<ANTLRBaseTree>)[newChildren objectAtIndex:j];
-            [children replaceObjectAtIndex:i withObject:(id)child];
-            [child setParent:(id<ANTLRBaseTree>)self];
-            [child setChildIndex:i];
-            j++;
-        }
-    }
-    else if ( delta > 0 ) { // fewer new nodes than there were
-                            // set children and then delete extra
-        for (int j = 0; j < numNewChildren; j++) {
-            [children replaceObjectAtIndex:startChildIndex+j withObject:[newChildren objectAtIndex:j]];
-        }
-        int indexToDelete = startChildIndex+numNewChildren;
-        for (int c=indexToDelete; c<=stopChildIndex; c++) {
-            // delete same index, shifting everybody down each time
-            [children removeObjectAtIndex:indexToDelete];
-        }
-        [self freshenParentAndChildIndexes:startChildIndex];
-    }
-    else { // more new nodes than were there before
-           // fill in as many children as we can (replacingHowMany) w/o moving data
-        for (int j=0; j<replacingHowMany; j++) {
-            [children replaceObjectAtIndex:startChildIndex+j withObject:[newChildren objectAtIndex:j]];
-        }
-        //        int numToInsert = replacingWithHowMany-replacingHowMany;
-        for (int j=replacingHowMany; j<replacingWithHowMany; j++) {
-            [children insertObject:[newChildren objectAtIndex:j] atIndex:startChildIndex+j];
-        }
-        [self freshenParentAndChildIndexes:startChildIndex];
-    }
-    //System.out.println("out="+toStringTree());
-}
-
-/** Override in a subclass to change the impl of children list */
-- (AMutableArray *) createChildrenList
-{
-    return [AMutableArray arrayWithCapacity:5];
-}
-
-- (BOOL) isNil
-{
-    return NO;
-}
-
-/** Set the parent and child index values for all child of t */
-- (void) freshenParentAndChildIndexes
-{
-    [self freshenParentAndChildIndexes:0];
-}
-               
-- (void) freshenParentAndChildIndexes:(NSInteger) offset
-{
-    int n = [self getChildCount];
-    for (int i = offset; i < n; i++) {
-        id<ANTLRBaseTree> child = (id<ANTLRBaseTree>)[self getChild:i];
-        [child setChildIndex:i];
-        [child setParent:(id<ANTLRBaseTree>)self];
-    }
-}
-               
-- (void) sanityCheckParentAndChildIndexes
-{
-    [self sanityCheckParentAndChildIndexes:nil At:-1];
-}
-               
-- (void) sanityCheckParentAndChildIndexes:(id<ANTLRBaseTree>)aParent At:(NSInteger) i
-{
-    if ( aParent != [self getParent] ) {
-        @throw [ANTLRIllegalStateException newException:[NSString stringWithFormat:@"parents don't match; expected %s found %s", aParent, [self getParent]]];
-    }
-    if ( i != [self getChildIndex] ) {
-        @throw [ANTLRIllegalStateException newException:[NSString stringWithFormat:@"child indexes don't match; expected %d found %d", i, [self getChildIndex]]];
-    }
-    int n = [self getChildCount];
-    for (int c = 0; c < n; c++) {
-        id<ANTLRBaseTree> child = (id<ANTLRBaseTree>)[self getChild:c];
-        [child sanityCheckParentAndChildIndexes:(id<ANTLRBaseTree>)self At:c];
-    }
-}
-               
-/**  What is the smallest token index (indexing from 0) for this node
- *   and its children?
- */
-- (NSInteger) getTokenStartIndex
-{
-    return 0;
-}
-
-- (void) setTokenStartIndex:(NSInteger) anIndex
-{
-}
-
-/**  What is the largest token index (indexing from 0) for this node
- *   and its children?
- */
-- (NSInteger) getTokenStopIndex
-{
-    return 0;
-}
-
-- (void) setTokenStopIndex:(NSInteger) anIndex
-{
-}
-
-- (id<ANTLRBaseTree>) dupNode
-{
-    return nil;
-}
-
-
-/** ANTLRBaseTree doesn't track child indexes. */
-- (NSInteger) getChildIndex
-{
-    return 0;
-}
-
-- (void) setChildIndex:(NSInteger) anIndex
-{
-}
-
-/** ANTLRBaseTree doesn't track parent pointers. */
-- (id<ANTLRBaseTree>) getParent
-{
-    return nil;
-}
-
-- (void) setParent:(id<ANTLRBaseTree>) t
-{
-}
-
-/** Walk upwards looking for ancestor with this token type. */
-- (BOOL) hasAncestor:(NSInteger) ttype
-{
-    return([self getAncestor:ttype] != nil);
-}
-
-/** Walk upwards and get first ancestor with this token type. */
-- (id<ANTLRBaseTree>) getAncestor:(NSInteger) ttype
-{
-    id<ANTLRBaseTree> t = (id<ANTLRBaseTree>)self;
-    t = (id<ANTLRBaseTree>)[t getParent];
-    while ( t != nil ) {
-        if ( t.type == ttype )
-            return t;
-        t = (id<ANTLRBaseTree>)[t getParent];
-    }
-    return nil;
-}
-
-/** Return a list of all ancestors of this node.  The first node of
- *  list is the root and the last is the parent of this node.
- */
-- (AMutableArray *)getAncestors
-{
-    if ( [self getParent] == nil )
-        return nil;
-    AMutableArray *ancestors = [AMutableArray arrayWithCapacity:5];
-    id<ANTLRBaseTree> t = (id<ANTLRBaseTree>)self;
-    t = (id<ANTLRBaseTree>)[t getParent];
-    while ( t != nil ) {
-        [ancestors insertObject:t atIndex:0]; // insert at start
-        t = (id<ANTLRBaseTree>)[t getParent];
-    }
-    return ancestors;
-}
-
-- (NSInteger)type
-{
-    return ANTLRTokenTypeInvalid;
-}
-
-- (NSString *)text
-{
-    return nil;
-}
-
-- (NSUInteger)line
-{
-    return 0;
-}
-
-- (NSUInteger)charPositionInLine
-{
-    return 0;
-}
-
-- (void) setCharPositionInLine:(NSUInteger) pos
-{
-}
-
-#pragma mark Copying
-     
-     // the children themselves are not copied here!
-- (id) copyWithZone:(NSZone *)aZone
-{
-    id<ANTLRBaseTree> theCopy = [[[self class] allocWithZone:aZone] init];
-    [theCopy addChildren:self.children];
-    return theCopy;
-}
-     
-- (id) deepCopy 					// performs a deepCopyWithZone: with the default zone
-{
-    return [self deepCopyWithZone:NULL];
-}
-     
-- (id) deepCopyWithZone:(NSZone *)aZone
-{
-    id<ANTLRBaseTree> theCopy = [self copyWithZone:aZone];
-        
-    if ( [theCopy.children count] )
-        [theCopy.children removeAllObjects];
-    AMutableArray *childrenCopy = theCopy.children;
-    for (id loopItem in children) {
-        id<ANTLRBaseTree> childCopy = [loopItem deepCopyWithZone:aZone];
-        [theCopy addChild:childCopy];
-    }
-    if ( childrenCopy ) [childrenCopy release];
-    return theCopy;
-}
-     
-- (NSString *) treeDescription
-{
-    if ( children == nil || [children count] == 0 ) {
-        return [self description];
-    }
-    NSMutableString *buf = [NSMutableString stringWithCapacity:[children count]];
-    if ( ![self isNil] ) {
-        [buf appendString:@"("];
-        [buf appendString:[self toString]];
-        [buf appendString:@" "];
-    }
-    for (int i = 0; children != nil && i < [children count]; i++) {
-        id<ANTLRBaseTree> t = (id<ANTLRBaseTree>)[children objectAtIndex:i];
-        if ( i > 0 ) {
-            [buf appendString:@" "];
-        }
-        [buf appendString:[(id<ANTLRBaseTree>)t toStringTree]];
-    }
-    if ( ![self isNil] ) {
-        [buf appendString:@")"];
-    }
-    return buf;
-}
-
-/** Print out a whole tree not just a node */
-- (NSString *) toStringTree
-{
-    return [self treeDescription];
-}
-
-- (NSString *) description
-{
-    return nil;
-}
-
-/** Override to say how a node (not a tree) should look as text */
-- (NSString *) toString
-{
-    return nil;
-}
-
-@synthesize children;
-@synthesize anException;
-
-@end
-
-#pragma mark -
-
-@implementation ANTLRTreeNavigationNode
-- (id)init
-{
-    self = (ANTLRTreeNavigationNode *)[super init];
-    return self;
-}
-
-- (id) copyWithZone:(NSZone *)aZone
-{
-	return nil;
-}
-@end
-
-@implementation ANTLRTreeNavigationNodeDown
-+ (ANTLRTreeNavigationNodeDown *) getNavigationNodeDown
-{
-    if ( navigationNodeDown == nil )
-        navigationNodeDown = [[ANTLRTreeNavigationNodeDown alloc] init];
-    return navigationNodeDown;
-}
-
-- (id)init
-{
-    self = [super init];
-    return self;
-}
-
-- (NSInteger) tokenType { return ANTLRTokenTypeDOWN; }
-- (NSString *) description { return @"DOWN"; }
-@end
-
-@implementation ANTLRTreeNavigationNodeUp
-+ (ANTLRTreeNavigationNodeUp *) getNavigationNodeUp
-{
-    if ( navigationNodeUp == nil )
-        navigationNodeUp = [[ANTLRTreeNavigationNodeUp alloc] init];
-    return navigationNodeUp;
-}
-
-
-- (id)init
-{
-    self = [super init];
-    return self;
-}
-
-- (NSInteger) tokenType { return ANTLRTokenTypeUP; }
-- (NSString *) description { return @"UP"; }
-@end
-
-@implementation ANTLRTreeNavigationNodeEOF
-+ (ANTLRTreeNavigationNodeEOF *) getNavigationNodeEOF
-{
-    if ( navigationNodeEOF == nil )
-        navigationNodeEOF = [[ANTLRTreeNavigationNodeEOF alloc] init];
-    return navigationNodeEOF;
-}
-
-- (id)init
-{
-    self = [super init];
-    return self;
-}
-
-- (NSInteger) tokenType { return ANTLRTokenTypeEOF; }
-- (NSString *) description { return @"EOF"; }
-
-@end
-
diff --git a/runtime/ObjC/Framework/ANTLRBaseTreeAdaptor.h b/runtime/ObjC/Framework/ANTLRBaseTreeAdaptor.h
deleted file mode 100644
index f8ed0d2..0000000
--- a/runtime/ObjC/Framework/ANTLRBaseTreeAdaptor.h
+++ /dev/null
@@ -1,182 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTreeAdaptor.h"
-#import "ANTLRCommonErrorNode.h"
-#import "ANTLRUniqueIDMap.h"
-
-@interface ANTLRBaseTreeAdaptor : NSObject <ANTLRTreeAdaptor, NSCopying> {
-    ANTLRUniqueIDMap *treeToUniqueIDMap;
-	NSInteger uniqueNodeID;
-}
-
-- (id) init;
-
-- (id) copyWithZone:(NSZone *)aZone;
-
-- (id) emptyNode;
-
-- (id) createNil;
-
-/** create tree node that holds the start and stop tokens associated
- *  with an error.
- *
- *  If you specify your own kind of tree nodes, you will likely have to
- *  override this method. CommonTree returns Token.INVALID_TOKEN_TYPE
- *  if no token payload but you might have to set token type for diff
- *  node type.
- *
- *  You don't have to subclass CommonErrorNode; you will likely need to
- *  subclass your own tree node class to avoid class cast exception.
- */
-- (id) errorNode:(id<ANTLRTokenStream>)anInput
-            From:(id<ANTLRToken>)startToken
-              To:(id<ANTLRToken>)stopToken
-       Exception:(NSException *) e;
-
-- (BOOL) isNil:(id<ANTLRBaseTree>) aTree;
-
-- (id<ANTLRBaseTree>)dupTree:(id<ANTLRBaseTree>)aTree;
-
-/** This is generic in the sense that it will work with any kind of
- *  tree (not just Tree interface).  It invokes the adaptor routines
- *  not the tree node routines to do the construction.  
- */
-- (id<ANTLRBaseTree>)dupTree:(id<ANTLRBaseTree>)aTree Parent:(id<ANTLRBaseTree>)parent;
-- (id<ANTLRBaseTree>)dupNode:(id<ANTLRBaseTree>)aNode;
-/** Add a child to the tree t.  If child is a flat tree (a list), make all
- *  in list children of t.  Warning: if t has no children, but child does
- *  and child isNil then you can decide it is ok to move children to t via
- *  t.children = child.children; i.e., without copying the array.  Just
- *  make sure that this is consistent with have the user will build
- *  ASTs.
- */
-- (void) addChild:(id<ANTLRBaseTree>)aChild toTree:(id<ANTLRBaseTree>)aTree;
-
-/** If oldRoot is a nil root, just copy or move the children to newRoot.
- *  If not a nil root, make oldRoot a child of newRoot.
- *
- *    old=^(nil a b c), new=r yields ^(r a b c)
- *    old=^(a b c), new=r yields ^(r ^(a b c))
- *
- *  If newRoot is a nil-rooted single child tree, use the single
- *  child as the new root node.
- *
- *    old=^(nil a b c), new=^(nil r) yields ^(r a b c)
- *    old=^(a b c), new=^(nil r) yields ^(r ^(a b c))
- *
- *  If oldRoot was null, it's ok, just return newRoot (even if isNil).
- *
- *    old=null, new=r yields r
- *    old=null, new=^(nil r) yields ^(nil r)
- *
- *  Return newRoot.  Throw an exception if newRoot is not a
- *  simple node or nil root with a single child node--it must be a root
- *  node.  If newRoot is ^(nil x) return x as newRoot.
- *
- *  Be advised that it's ok for newRoot to point at oldRoot's
- *  children; i.e., you don't have to copy the list.  We are
- *  constructing these nodes so we should have this control for
- *  efficiency.
- */
-- (id<ANTLRBaseTree>)becomeRoot:(id<ANTLRBaseTree>)aNewRoot old:(id<ANTLRBaseTree>)oldRoot;
-
-/** Transform ^(nil x) to x and nil to null */
-- (id<ANTLRBaseTree>)rulePostProcessing:(id<ANTLRBaseTree>)aRoot;
-
-- (id<ANTLRBaseTree>)becomeRootfromToken:(id<ANTLRToken>)aNewRoot old:(id<ANTLRBaseTree>)oldRoot;
-
-- (id<ANTLRBaseTree>) create:(id<ANTLRToken>)payload;
-- (id<ANTLRBaseTree>) createTree:(NSInteger)aTType FromToken:(id<ANTLRToken>)aFromToken;
-- (id<ANTLRBaseTree>) createTree:(NSInteger)aTType FromToken:(id<ANTLRToken>)aFromToken Text:(NSString *)theText;
-- (id<ANTLRBaseTree>) createTree:(NSInteger)aTType Text:(NSString *)theText;
-
-- (NSInteger) getType:(id<ANTLRBaseTree>)aTree;
-
-- (void) setType:(id<ANTLRBaseTree>)aTree Type:(NSInteger)type;
-
-- (id<ANTLRToken>)getToken:(ANTLRCommonTree *)t;
-
-- (NSString *)getText:(ANTLRCommonTree *)aTree;
-
-- (void) setText:(id<ANTLRBaseTree>)aTree Text:(NSString *)theText;
-
-- (id<ANTLRBaseTree>) getChild:(id<ANTLRBaseTree>)aTree At:(NSInteger)i;
-
-- (void) setChild:(id<ANTLRBaseTree>)aTree At:(NSInteger)index Child:(id<ANTLRBaseTree>)aChild;
-
-- (id<ANTLRBaseTree>) deleteChild:(id<ANTLRBaseTree>)aTree Index:(NSInteger)index;
-
-- (NSInteger) getChildCount:(id<ANTLRBaseTree>)aTree;
-
-- (id<ANTLRBaseTree>) getParent:(id<ANTLRBaseTree>) t;
-
-- (void) setParent:(id<ANTLRBaseTree>)t With:(id<ANTLRBaseTree>) parent;
-
-/** What index is this node in the child list? Range: 0..n-1
- *  If your node type doesn't handle this, it's ok but the tree rewrites
- *  in tree parsers need this functionality.
- */
-- (NSInteger) getChildIndex:(id)t;
-- (void) setChildIndex:(id)t With:(NSInteger)index;
-
-- (void) replaceChildren:(id)parent From:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id)t;
-
-- (NSInteger) getUniqueID:(id<ANTLRBaseTree>)node;
-
-#ifdef DONTUSENOMO
-- (NSInteger) getUniqueID;
-
-- (void) setUniqueNodeID:(NSInteger)aUniqueNodeID;
-
-- (ANTLRUniqueIDMap *)getTreeToUniqueIDMap;
-
-- (void) setTreeToUniqueIDMap:(ANTLRUniqueIDMap *)aMapNode;
-#endif
-
-/** Tell me how to create a token for use with imaginary token nodes.
- *  For example, there is probably no input symbol associated with imaginary
- *  token DECL, but you need to create it as a payload or whatever for
- *  the DECL node as in ^(DECL type ID).
- *
- *  This is a variant of createToken where the new token is derived from
- *  an actual real input token.  Typically this is for converting '{'
- *  tokens to BLOCK etc...  You'll see
- *
- *    r : lc='{' ID+ '}' -> ^(BLOCK[$lc] ID+) ;
- *
- *  If you care what the token payload objects' type is, you should
- *  override this method and any other createToken variant.
- */
-- (id<ANTLRToken>)createToken:(NSInteger)aTType Text:(NSString *)theText;
-
-- (id<ANTLRToken>)createToken:(id<ANTLRToken>)aFromToken;
-
-@property (retain) ANTLRUniqueIDMap *treeToUniqueIDMap;
-@property (assign) NSInteger uniqueNodeID;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRBaseTreeAdaptor.m b/runtime/ObjC/Framework/ANTLRBaseTreeAdaptor.m
deleted file mode 100644
index 58b181d..0000000
--- a/runtime/ObjC/Framework/ANTLRBaseTreeAdaptor.m
+++ /dev/null
@@ -1,429 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import "ANTLRBaseTreeAdaptor.h"
-#import "ANTLRRuntimeException.h"
-#import "ANTLRUniqueIDMap.h"
-#import "ANTLRMapElement.h"
-#import "ANTLRCommonTree.h"
-
-@implementation ANTLRBaseTreeAdaptor
-
-@synthesize treeToUniqueIDMap;
-@synthesize uniqueNodeID;
-
-+ (id<ANTLRTree>) newEmptyTree
-{
-    return [[ANTLRCommonTree alloc] init];
-}
-
-- (id) init
-{
-    self = [super init];
-    if ( self != nil ) {
-    }
-    return self;
-}
-
-- (id) copyWithZone:(NSZone *)aZone
-{
-    ANTLRBaseTreeAdaptor *copy;
-    
-    copy = [[[self class] alloc] init];
-    if (treeToUniqueIDMap)
-        copy.treeToUniqueIDMap = [treeToUniqueIDMap copyWithZone:aZone];
-    copy.uniqueNodeID = uniqueNodeID;
-    return copy;
-}
-    
-
-- (id) createNil
-{
-    return [ANTLRCommonTree newTreeWithToken:nil];
-}
-
-- (id) emptyNode
-{
-    return [ANTLRCommonTree newTreeWithToken:nil];
-}
-
-/** create tree node that holds the start and stop tokens associated
- *  with an error.
- *
- *  If you specify your own kind of tree nodes, you will likely have to
- *  override this method. CommonTree returns Token.INVALID_TOKEN_TYPE
- *  if no token payload but you might have to set token type for diff
- *  node type.
- *
- *  You don't have to subclass CommonErrorNode; you will likely need to
- *  subclass your own tree node class to avoid class cast exception.
- */
-- (id) errorNode:(id<ANTLRTokenStream>)anInput
-            From:(id<ANTLRToken>)startToken
-              To:(id<ANTLRToken>)stopToken
-       Exception:(ANTLRRecognitionException *) e;
-{
-    //System.out.println("returning error node '"+t+"' @index="+anInput.index());
-    return [ANTLRCommonErrorNode newANTLRCommonErrorNode:anInput
-                                                    From:startToken
-                                                      To:stopToken
-                                               Exception:e];
-}
-
-- (BOOL) isNil:(id) tree
-{
-    return [(id)tree isNil];
-}
-
-- (id)dupTree:(id)tree
-{
-    return [self dupTree:(id)tree Parent:nil];
-}
-
-/** This is generic in the sense that it will work with any kind of
- *  tree (not just Tree interface).  It invokes the adaptor routines
- *  not the tree node routines to do the construction.  
- */
-- (id)dupTree:(id)t Parent:(id)parent
-{
-    if ( t==nil ) {
-        return nil;
-    }
-    id newTree = [self dupNode:t];
-    // ensure new subtree root has parent/child index set
-    [self setChildIndex:newTree With:[self getChildIndex:t]]; // same index in new tree
-    [self setParent:newTree With:parent];
-    NSInteger n = [self getChildCount:t];
-    for (NSInteger i = 0; i < n; i++) {
-        id child = [self getChild:t At:i];
-        id newSubTree = [self dupTree:child Parent:t];
-        [self addChild:newSubTree toTree:newTree];
-    }
-    return newTree;
-}
-
-- (id)dupNode:(id)aNode
-{
-    return aNode; // override for better results :>)
-}
-/** Add a child to the tree t.  If child is a flat tree (a list), make all
- *  in list children of t.  Warning: if t has no children, but child does
- *  and child isNil then you can decide it is ok to move children to t via
- *  t.children = child.children; i.e., without copying the array.  Just
- *  make sure that this is consistent with have the user will build
- *  ASTs.
- */
-- (void) addChild:(id)child toTree:(id)t
-{
-    if ( t != nil && child != nil ) {
-        [(id)t addChild:child];
-    }
-}
-
-/** If oldRoot is a nil root, just copy or move the children to newRoot.
- *  If not a nil root, make oldRoot a child of newRoot.
- *
- *    old=^(nil a b c), new=r yields ^(r a b c)
- *    old=^(a b c), new=r yields ^(r ^(a b c))
- *
- *  If newRoot is a nil-rooted single child tree, use the single
- *  child as the new root node.
- *
- *    old=^(nil a b c), new=^(nil r) yields ^(r a b c)
- *    old=^(a b c), new=^(nil r) yields ^(r ^(a b c))
- *
- *  If oldRoot was null, it's ok, just return newRoot (even if isNil).
- *
- *    old=null, new=r yields r
- *    old=null, new=^(nil r) yields ^(nil r)
- *
- *  Return newRoot.  Throw an exception if newRoot is not a
- *  simple node or nil root with a single child node--it must be a root
- *  node.  If newRoot is ^(nil x) return x as newRoot.
- *
- *  Be advised that it's ok for newRoot to point at oldRoot's
- *  children; i.e., you don't have to copy the list.  We are
- *  constructing these nodes so we should have this control for
- *  efficiency.
- */
-- (id)becomeRoot:(id)newRoot old:(id)oldRoot
-{
-    if ( oldRoot == nil ) {
-        return newRoot;
-    }
-    //System.out.println("becomeroot new "+newRoot.toString()+" old "+oldRoot);
-    id newRootTree = (id)newRoot;
-    id oldRootTree = (id)oldRoot;
-    // handle ^(nil real-node)
-    if ( [newRootTree isNil] ) {
-        NSInteger nc = [newRootTree getChildCount];
-        if ( nc == 1 ) newRootTree = [(id)newRootTree getChild:0];
-        else if ( nc > 1 ) {
-            // TODO: make tree run time exceptions hierarchy
-            @throw [ANTLRRuntimeException newException:NSStringFromClass([self class]) reason:@"more than one node as root (TODO: make exception hierarchy)"];
-        }
-    }
-    // add oldRoot to newRoot; addChild takes care of case where oldRoot
-    // is a flat list (i.e., nil-rooted tree).  All children of oldRoot
-    // are added to newRoot.
-    [newRootTree addChild:oldRootTree];
-    return newRootTree;
-}
-
-/** Transform ^(nil x) to x and nil to null */
-- (id)rulePostProcessing:(id)root
-{
-    //System.out.println("rulePostProcessing: "+((Tree)root).toStringTree());
-    id r = (id)root;
-    if ( r != nil && [r isNil] ) {
-        if ( [r getChildCount] == 0 ) {
-            r = nil;
-        }
-        else if ( [r getChildCount] == 1 ) {
-            r = (id)[r getChild:0];
-            // whoever invokes rule will set parent and child index
-            [r setParent:nil];
-            [r setChildIndex:-1];
-        }
-    }
-    return r;
-}
-
-- (id)becomeRootfromToken:(id<ANTLRToken>)newRoot old:(id)oldRoot
-{
-    return [self becomeRoot:(id)[self create:newRoot] old:oldRoot];
-}
-
-- (id) create:(id<ANTLRToken>)aToken
-{
-    return [ANTLRCommonTree newTreeWithToken:aToken];
-}
-
-- (id)createTree:(NSInteger)tokenType FromToken:(id<ANTLRToken>)fromToken
-{
-    fromToken = [self createToken:fromToken];
-    //((ClassicToken)fromToken).setType(tokenType);
-    [fromToken setType:tokenType];
-    id t = [self create:fromToken];
-    return t;
-}
-
-- (id)createTree:(NSInteger)tokenType FromToken:(id<ANTLRToken>)fromToken Text:(NSString *)text
-{
-    if (fromToken == nil)
-        return [self createTree:tokenType Text:text];
-    fromToken = [self createToken:fromToken];
-    [fromToken setType:tokenType];
-    [fromToken setText:text];
-    id t = [self create:fromToken];
-    return t;
-}
-
-- (id)createTree:(NSInteger)tokenType Text:(NSString *)text
-{
-    id<ANTLRToken> fromToken = [self createToken:tokenType Text:text];
-    id t = (id)[self create:fromToken];
-    return t;
-}
-
-- (NSInteger) getType:(ANTLRCommonTree *) t
-{
-    return [t type];
-}
-
-- (void) setType:(id)t Type:(NSInteger)type
-{
-    @throw [ANTLRNoSuchElementException newException:@"don't know enough about Tree node"];
-}
-
-/** What is the Token associated with this node?  If
- *  you are not using ANTLRCommonTree, then you must
- *  override this in your own adaptor.
- */
-- (id<ANTLRToken>) getToken:(ANTLRCommonTree *) t
-{
-    if ( [t isKindOfClass:[ANTLRCommonTree class]] ) {
-        return [t getToken];
-    }
-    return nil; // no idea what to do
-}
-
-- (NSString *)getText:(ANTLRCommonTree *)t
-{
-    return [t text];
-}
-
-- (void) setText:(id)t Text:(NSString *)text
-{
-    @throw [ANTLRNoSuchElementException newException:@"don't know enough about Tree node"];
-}
-
-- (id) getChild:(id)t At:(NSInteger)index
-{
-    return [(id)t getChild:index ];
-}
-
-- (void) setChild:(id)t At:(NSInteger)index Child:(id)child
-{
-    [(id)t setChild:index With:(id)child];
-}
-
-- (id) deleteChild:(id)t Index:(NSInteger)index
-{
-    return [(id)t deleteChild:index];
-}
-
-- (NSInteger) getChildCount:(id)t
-{
-    return [(id)t getChildCount];
-}
-
-- (id<ANTLRBaseTree>) getParent:(id<ANTLRBaseTree>) t
-{
-    if ( t == nil )
-        return nil;
-    return (id<ANTLRBaseTree>)[t getParent];
-}
-
-- (void) setParent:(id<ANTLRBaseTree>)t With:(id<ANTLRBaseTree>) parent
-{
-    if ( t != nil )
-        [(id<ANTLRBaseTree>) t setParent:(id<ANTLRBaseTree>)parent];
-}
-
-/** What index is this node in the child list? Range: 0..n-1
- *  If your node type doesn't handle this, it's ok but the tree rewrites
- *  in tree parsers need this functionality.
- */
-- (NSInteger) getChildIndex:(id)t
-{
-    return ((ANTLRCommonTree *)t).childIndex;
-}
-
-- (void) setChildIndex:(id)t With:(NSInteger)index
-{
-    ((ANTLRCommonTree *)t).childIndex = index;
-}
-
-- (void) replaceChildren:(id)parent From:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id)t
-{
-    return;
-}
-
-- (NSInteger) getUniqueID:(id)node
-{
-    if ( treeToUniqueIDMap == nil ) {
-        treeToUniqueIDMap = [ANTLRUniqueIDMap newANTLRUniqueIDMap];
-    }
-    NSNumber *prevID = [treeToUniqueIDMap getNode:node];
-    if ( prevID != nil ) {
-        return [prevID integerValue];
-    }
-    NSInteger anID = uniqueNodeID;
-    // ANTLRMapElement *aMapNode = [ANTLRMapElement newANTLRMapElementWithObj1:[NSNumber numberWithInteger:anID] Obj2:node];
-    [treeToUniqueIDMap putID:[NSNumber numberWithInteger:anID] Node:node];
-    uniqueNodeID++;
-    return anID;
-    // GCC makes these nonunique:
-    // return System.identityHashCode(node);
-}
-
-/** Tell me how to create a token for use with imaginary token nodes.
- *  For example, there is probably no input symbol associated with imaginary
- *  token DECL, but you need to create it as a payload or whatever for
- *  the DECL node as in ^(DECL type ID).
- *
- *  If you care what the token payload objects' type is, you should
- *  override this method and any other createToken variant.
- */
-- (id<ANTLRToken>) createToken:(NSInteger)aTType Text:(NSString *)text
-{
-    return nil;
-}
-
-/** Tell me how to create a token for use with imaginary token nodes.
- *  For example, there is probably no input symbol associated with imaginary
- *  token DECL, but you need to create it as a payload or whatever for
- *  the DECL node as in ^(DECL type ID).
- *
- *  This is a variant of createToken where the new token is derived from
- *  an actual real input token.  Typically this is for converting '{'
- *  tokens to BLOCK etc...  You'll see
- *
- *    r : lc='{' ID+ '}' -> ^(BLOCK[$lc] ID+) ;
- *
- *  If you care what the token payload objects' type is, you should
- *  override this method and any other createToken variant.
- */
-- (id<ANTLRToken>) createToken:(id<ANTLRToken>) fromToken
-{
-    return nil;
-}
-
-/** Track start/stop token for subtree root created for a rule.
- *  Only works with Tree nodes.  For rules that match nothing,
- *  seems like this will yield start=i and stop=i-1 in a nil node.
- *  Might be useful info so I'll not force to be i..i.
- */
-- (void) setTokenBoundaries:(id)aTree From:(id<ANTLRToken>)startToken To:(id<ANTLRToken>)stopToken
-{
-    return;
-}
-
-- (NSInteger) getTokenStartIndex:(id)aTree
-{
-    return -1;
-}
-
-- (NSInteger) getTokenStopIndex:(id)aTree
-{
-    return -1;
-}
-
-#ifdef DONTUSENOMO
-- (NSInteger)getUniqueID
-{
-    return uniqueNodeID;
-}
-
-- (void) setUniqueNodeID:(NSInteger)aUniqueNodeID
-{
-    uniqueNodeID = aUniqueNodeID;
-}
-
-- (ANTLRUniqueIDMap *)getTreeToUniqueIDMap
-{
-    return treeToUniqueIDMap;
-}
-
-- (void) setTreeToUniqueIDMap:(ANTLRUniqueIDMap *)aMapListNode
-{
-    treeToUniqueIDMap = aMapListNode;
-}
-
-#endif
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRBitSet.h b/runtime/ObjC/Framework/ANTLRBitSet.h
index 8fd75b1..140e94d 100644
--- a/runtime/ObjC/Framework/ANTLRBitSet.h
+++ b/runtime/ObjC/Framework/ANTLRBitSet.h
@@ -25,9 +25,9 @@
 // THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 
-#import <Cocoa/Cocoa.h>
+#import <Foundation/Foundation.h>
 #import <CoreFoundation/CoreFoundation.h>
-#import "ANTLRToken.h"
+#import "Token.h"
 #import "AMutableArray.h"
 
 #define BITS (sizeof(NSUInteger) * 8)
@@ -43,14 +43,14 @@
 
 #pragma mark Class Methods
 
-+ (ANTLRBitSet *) newANTLRBitSet;
-+ (ANTLRBitSet *) newANTLRBitSetWithType:(ANTLRTokenType)type;
++ (ANTLRBitSet *) newBitSet;
++ (ANTLRBitSet *) newBitSetWithType:(TokenType)type;
 /** Construct a ANTLRBitSet given the size
  * @param nbits The size of the ANTLRBitSet in bits
  */
-+ (ANTLRBitSet *) newANTLRBitSetWithNBits:(NSUInteger)nbits;
-+ (ANTLRBitSet *) newANTLRBitSetWithArray:(AMutableArray *)types;
-+ (ANTLRBitSet *) newANTLRBitSetWithBits:(const unsigned long long *)theBits Count:(NSUInteger)longCount;
++ (ANTLRBitSet *) newBitSetWithNBits:(NSUInteger)nbits;
++ (ANTLRBitSet *) newBitSetWithArray:(AMutableArray *)types;
++ (ANTLRBitSet *) newBitSetWithBits:(const unsigned long long *)theBits Count:(NSUInteger)longCount;
 
 + (ANTLRBitSet *) of:(NSUInteger)el;
 + (ANTLRBitSet *) of:(NSUInteger)a And2:(NSUInteger)b;
@@ -60,7 +60,7 @@
 #pragma mark Initializer
 
 - (ANTLRBitSet *) init;
-- (ANTLRBitSet *) initWithType:(ANTLRTokenType)type;
+- (ANTLRBitSet *) initWithType:(TokenType)type;
 - (ANTLRBitSet *) initWithNBits:(NSUInteger)nbits;
 - (ANTLRBitSet *) initWithBitVector:(CFMutableBitVectorRef)theBitVector;
 - (ANTLRBitSet *) initWithBits:(const unsigned long long const*)theBits Count:(NSUInteger)theCount;
@@ -81,8 +81,8 @@
 - (unsigned long long) bitMask:(NSUInteger) bitNumber;
 - (BOOL) member:(NSUInteger)bitNumber;
 - (BOOL) isNil;
-- (NSString *) toString;
 - (NSString *) description;
+- (NSString *) toString;
 
 #pragma mark NSCopying support
 
diff --git a/runtime/ObjC/Framework/ANTLRBitSet.m b/runtime/ObjC/Framework/ANTLRBitSet.m
index 3f77e36..46c02c6 100644
--- a/runtime/ObjC/Framework/ANTLRBitSet.m
+++ b/runtime/ObjC/Framework/ANTLRBitSet.m
@@ -29,12 +29,12 @@
 @implementation ANTLRBitSet
 #pragma mark Class Methods
 
-+ (ANTLRBitSet *) newANTLRBitSet
++ (ANTLRBitSet *) newBitSet
 {
     return [[ANTLRBitSet alloc] init];
 }
 
-+ (ANTLRBitSet *) newANTLRBitSetWithType:(ANTLRTokenType)type
++ (ANTLRBitSet *) newBitSetWithType:(TokenType)type
 {
     return [[ANTLRBitSet alloc] initWithType:type];
 }
@@ -42,17 +42,17 @@
 /** Construct a ANTLRBitSet given the size
  * @param nbits The size of the ANTLRBitSet in bits
  */
-+ (ANTLRBitSet *) newANTLRBitSetWithNBits:(NSUInteger)nbits
++ (ANTLRBitSet *) newBitSetWithNBits:(NSUInteger)nbits
 {
     return [[ANTLRBitSet alloc] initWithNBits:nbits];
 }
 
-+ (ANTLRBitSet *) newANTLRBitSetWithArray:(AMutableArray *)types
++ (ANTLRBitSet *) newBitSetWithArray:(AMutableArray *)types
 {
     return [[ANTLRBitSet alloc] initWithArrayOfBits:types];
 }
 
-+ (ANTLRBitSet *) newANTLRBitSetWithBits:(const unsigned long long *)theBits Count:(NSUInteger)longCount
++ (ANTLRBitSet *) newBitSetWithBits:(const unsigned long long *)theBits Count:(NSUInteger)longCount
 {
     return [[ANTLRBitSet alloc] initWithBits:theBits Count:longCount];
 }
@@ -60,7 +60,7 @@
 
 + (ANTLRBitSet *) of:(NSUInteger) el
 {
-    ANTLRBitSet *s = [ANTLRBitSet newANTLRBitSetWithNBits:(el + 1)];
+    ANTLRBitSet *s = [ANTLRBitSet newBitSetWithNBits:(el + 1)];
     [s add:el];
     return s;
 }
@@ -68,7 +68,7 @@
 + (ANTLRBitSet *) of:(NSUInteger) a And2:(NSUInteger) b
 {
     NSInteger c = (((a>b)?a:b)+1);
-    ANTLRBitSet *s = [ANTLRBitSet newANTLRBitSetWithNBits:c];
+    ANTLRBitSet *s = [ANTLRBitSet newBitSetWithNBits:c];
     [s add:a];
     [s add:b];
     return s;
@@ -78,7 +78,7 @@
 {
     NSUInteger d = ((a>b)?a:b);
     d = ((c>d)?c:d)+1;
-    ANTLRBitSet *s = [ANTLRBitSet newANTLRBitSetWithNBits:d];
+    ANTLRBitSet *s = [ANTLRBitSet newBitSetWithNBits:d];
     [s add:a];
     [s add:b];
     [s add:c];
@@ -90,7 +90,7 @@
     NSUInteger e = ((a>b)?a:b);
     NSUInteger f = ((c>d)?c:d);
     e = ((e>f)?e:f)+1;
-    ANTLRBitSet *s = [ANTLRBitSet newANTLRBitSetWithNBits:e];
+    ANTLRBitSet *s = [ANTLRBitSet newBitSetWithNBits:e];
     [s add:a];
     [s add:b];
     [s add:c];
@@ -109,7 +109,7 @@
 	return self;
 }
 
-- (ANTLRBitSet *) initWithType:(ANTLRTokenType)type
+- (ANTLRBitSet *) initWithType:(TokenType)type
 {
 	if ((self = [super init]) != nil) {
 		bitVector = CFBitVectorCreateMutable(kCFAllocatorDefault,0);
@@ -143,14 +143,16 @@
 {
 	if ((self = [super init]) != nil) {
 		unsigned int longNo;
+//        unsigned long long swappedBits = 0LL;
 		CFIndex bitIdx;
         bitVector = CFBitVectorCreateMutable ( kCFAllocatorDefault, 0 );
 		CFBitVectorSetCount( bitVector, sizeof(unsigned long long)*8*longCount );
 
 		for (longNo = 0; longNo < longCount; longNo++) {
 			for (bitIdx = 0; bitIdx < (CFIndex)sizeof(unsigned long long)*8; bitIdx++) {
-				unsigned long long swappedBits = CFSwapInt64HostToBig(theBits[longNo]);
-				if (swappedBits & (1LL << bitIdx)) {
+//				swappedBits = CFSwapInt64HostToBig(theBits[longNo]);
+//				if (swappedBits & (1LL << bitIdx)) {
+				if (theBits[longNo] & (1LL << bitIdx)) {
 					CFBitVectorSetBitAtIndex(bitVector, bitIdx+(longNo*(sizeof(unsigned long long)*8)), 1);
 				}
 			}
@@ -272,8 +274,9 @@
 	return ((CFBitVectorGetCountOfBit(bitVector, CFRangeMake(0,CFBitVectorGetCount(bitVector)), 1) == 0) ? YES : NO);
 }
 
+// debugging aid. GDB invokes this automagically
 // return a string representation of the bit vector, indicating by their bitnumber which bits are set
-- (NSString *) toString
+- (NSString *) description
 {
 	CFIndex length = CFBitVectorGetCount(bitVector);
 	CFIndex currBit;
@@ -292,10 +295,11 @@
 	return descString;
 }
 
-// debugging aid. GDB invokes this automagically
-- (NSString *) description
+// return a string representation of the bit vector, indicating by their bitnumber which bits are set
+- (NSString *) toString
 {
-	return [self toString];
+	
+	return [self description];
 }
 
 	// NSCopying
diff --git a/runtime/ObjC/Framework/ANTLRBufferedTokenStream.h b/runtime/ObjC/Framework/ANTLRBufferedTokenStream.h
deleted file mode 100644
index 28d1418..0000000
--- a/runtime/ObjC/Framework/ANTLRBufferedTokenStream.h
+++ /dev/null
@@ -1,102 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTokenStream.h"
-#import "ANTLRTokenSource.h"
-#import "ANTLRBitSet.h"
-#import "ANTLRCommonToken.h"
-#import "AMutableArray.h"
-
-@interface ANTLRBufferedTokenStream : NSObject <ANTLRTokenStream> 
-{
-__strong id<ANTLRTokenSource> tokenSource;
-    
-    /** Record every single token pulled from the source so we can reproduce
-     *  chunks of it later.  The buffer in LookaheadStream overlaps sometimes
-     *  as its moving window moves through the input.  This list captures
-     *  everything so we can access complete input text.
-     */
-__strong AMutableArray *tokens;
-    
-    /** Track the last mark() call result value for use in rewind(). */
-NSInteger lastMarker;
-    
-    /** The index into the tokens list of the current token (next token
-     *  to consume).  tokens[index] should be LT(1).  index=-1 indicates need
-     *  to initialize with first token.  The ctor doesn't get a token.
-     *  First call to LT(1) or whatever gets the first token and sets index=0;
-     */
-NSInteger index;
-    
-NSInteger range; // how deep have we gone?
-    
-}
-@property (retain, getter=getTokenSource,setter=setTokenSource:) id<ANTLRTokenSource> tokenSource;
-@property (retain, getter=getTokens,setter=setTokens:) AMutableArray *tokens;
-@property (assign, getter=getLastMarker,setter=setLastMarker:) NSInteger lastMarker;
-@property (assign) NSInteger index;
-@property (assign, getter=getRange,setter=setRange:) NSInteger range;
-
-+ (ANTLRBufferedTokenStream *) newANTLRBufferedTokenStream;
-+ (ANTLRBufferedTokenStream *) newANTLRBufferedTokenStreamWith:(id<ANTLRTokenSource>)aSource;
-- (id) initWithTokenSource:(id<ANTLRTokenSource>)aSource;
-- (void)dealloc;
-- (id) copyWithZone:(NSZone *)aZone;
-- (NSUInteger)charPositionInLine;
-- (NSUInteger)line;
-- (NSInteger) getRange;
-- (void) setRange:(NSInteger)anInt;
-- (NSInteger) mark;
-- (void) release:(NSInteger) marker;
-- (void) rewind:(NSInteger) marker;
-- (void) rewind;
-- (void) reset;
-- (void) seek:(NSInteger) anIndex;
-- (NSInteger) size;
-- (void) consume;
-- (void) sync:(NSInteger) i;
-- (void) fetch:(NSInteger) n;
-- (id<ANTLRToken>) getToken:(NSInteger) i;
-- (AMutableArray *)getFrom:(NSInteger)startIndex To:(NSInteger) stopIndex;
-- (NSInteger) LA:(NSInteger)i;
-- (id<ANTLRToken>) LB:(NSInteger) k;
-- (id<ANTLRToken>) LT:(NSInteger) k;
-- (void) setup;
-- (id<ANTLRTokenSource>) getTokenSource;
-- (void) setTokenSource:(id<ANTLRTokenSource>) aTokenSource;
-- (AMutableArray *)getTokens;
-- (NSString *) getSourceName;
-- (AMutableArray *)getTokensFrom:(NSInteger)startIndex To:(NSInteger)stopIndex;
-- (AMutableArray *)getTokensFrom:(NSInteger)startIndex To:(NSInteger)stopIndex With:(ANTLRBitSet *)types;
-- (AMutableArray *)getTokensFrom:(NSInteger)startIndex To:(NSInteger)stopIndex WithList:(AMutableArray *)types;
-- (AMutableArray *)getTokensFrom:(NSInteger)startIndex To:(NSInteger)stopIndex WithType:(NSInteger)ttype;
-- (NSString *) toString;
-- (NSString *) toStringFromStart:(NSInteger)startIndex ToEnd:(NSInteger)stopIndex;
-- (NSString *) toStringFromToken:(id<ANTLRToken>)startIndex ToToken:(id<ANTLRToken>)stopIndex;
-- (void) fill;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRBufferedTokenStream.m b/runtime/ObjC/Framework/ANTLRBufferedTokenStream.m
deleted file mode 100644
index 94802b5..0000000
--- a/runtime/ObjC/Framework/ANTLRBufferedTokenStream.m
+++ /dev/null
@@ -1,392 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import "ANTLRBufferedTokenStream.h"
-#import "ANTLRTokenSource.h"
-#import "ANTLRCommonTreeAdaptor.h"
-#import "ANTLRRuntimeException.h"
-
-extern NSInteger debug;
-
-@implementation ANTLRBufferedTokenStream
-
-@synthesize tokenSource;
-@synthesize tokens;
-@synthesize lastMarker;
-@synthesize index;
-@synthesize range;
-
-+ (ANTLRBufferedTokenStream *) newANTLRBufferedTokenStream
-{
-    return [[ANTLRBufferedTokenStream alloc] init];
-}
-
-+ (ANTLRBufferedTokenStream *) newANTLRBufferedTokenStreamWith:(id<ANTLRTokenSource>)aSource
-{
-    return [[ANTLRBufferedTokenStream alloc] initWithTokenSource:aSource];
-}
-
-- (ANTLRBufferedTokenStream *) init
-{
-	if ((self = [super init]) != nil)
-	{
-        tokenSource = nil;
-        tokens = [[AMutableArray arrayWithCapacity:1000] retain];
-        index = -1;
-        range = -1;
-	}
-	return self;
-}
-
--(id) initWithTokenSource:(id<ANTLRTokenSource>)aSource
-{
-	if ((self = [super init]) != nil)
-	{
-        tokenSource = [aSource retain];
-        tokens = [[AMutableArray arrayWithCapacity:1000] retain];
-        index = -1;
-        range = -1;
-	}
-	return self;
-}
-
-- (id) copyWithZone:(NSZone *)aZone
-{
-    ANTLRBufferedTokenStream *copy;
-    
-    copy = [[[self class] allocWithZone:aZone] init];
-    copy.tokenSource = self.tokenSource;
-    if ( self.tokens )
-        copy.tokens = [tokens copyWithZone:aZone];
-    copy.lastMarker = self.lastMarker;
-    copy.index = self.index;
-    copy.range = self.range;
-    return copy;
-}
-
-- (void)dealloc
-{
-#ifdef DEBUG_DEALLOC
-    NSLog( @"called dealloc in ANTLRBufferedTokenStream" );
-#endif
-    if ( tokens ) [tokens release];
-    if ( tokenSource ) [tokenSource release];
-	[super dealloc];
-}
-
-- (NSUInteger)line
-{
-    return ((ANTLRCommonToken *)[tokens objectAtIndex:index]).line;
-}
-
-- (NSUInteger)charPositionInLine
-{
-    return ((ANTLRCommonToken *)[tokens objectAtIndex:index]).charPositionInLine;
-}
-
-- (id<ANTLRTokenSource>) getTokenSource
-{
-    return tokenSource;
-}
-
-- (NSInteger) getRange
-{
-    return range;
-}
-
-- (void) setRange:(NSInteger)anInt
-{
-    range = anInt;
-}
-
-- (NSInteger) mark
-{
-    if ( index == -1 ) {
-        [self setup];
-//        [self fill];
-    }
-    lastMarker = self.index;
-    return lastMarker;
-}
-
-- (void) release:(NSInteger) marker
-{
-    // no resources to release
-}
-
-- (void) rewind:(NSInteger) marker
-{
-    [self seek:marker];
-}
-
-- (void) rewind
-{
-    [self seek:lastMarker];
-}
-
-- (void) reset
-{
-    index = 0;
-    lastMarker = 0;
-}
-
-- (void) seek:(NSInteger) anIndex
-{
-    index = anIndex;
-}
-
-- (NSInteger) size
-{
-    return [tokens count];
-}
-
-/** Move the input pointer to the next incoming token.  The stream
- *  must become active with LT(1) available.  consume() simply
- *  moves the input pointer so that LT(1) points at the next
- *  input symbol. Consume at least one token.
- *
- *  Walk past any token not on the channel the parser is listening to.
- */
-- (void) consume
-{
-    if ( index == -1 ) {
-        [self setup];
-//        [self fill];
-    }
-    index++;
-    [self sync:index];
-}
-
-/** Make sure index i in tokens has a token. */
-- (void) sync:(NSInteger) i
-{
-    // how many more elements we need?
-    NSInteger n = (i - [tokens count]) + 1;
-    if (debug > 1) NSLog(@"[self sync:%d] needs %d\n", i, n);
-    if ( n > 0 )
-        [self fetch:n];
-}
-
-/** add n elements to buffer */
-- (void) fetch:(NSInteger)n
-{
-    for (NSInteger i=1; i <= n; i++) {
-        id<ANTLRToken> t = [tokenSource nextToken];
-        [t setTokenIndex:[tokens count]];
-        if (debug > 1) NSLog(@"adding %@ at index %d\n", [t text], [tokens count]);
-        [tokens addObject:t];
-        if ( t.type == ANTLRTokenTypeEOF )
-            break;
-    }
-}
-
-- (id<ANTLRToken>) getToken:(NSInteger) i
-{
-    if ( i < 0 || i >= [tokens count] ) {
-        @throw [ANTLRNoSuchElementException newException:[NSString stringWithFormat:@"token index %d out of range 0..%d", i, [tokens count]-1]];
-    }
-    return [tokens objectAtIndex:i];
-}
-
-/** Get all tokens from start..stop inclusively */
-- (AMutableArray *)getFrom:(NSInteger)startIndex To:(NSInteger)stopIndex
-{
-    if ( startIndex < 0 || stopIndex < 0 )
-        return nil;
-    if ( index == -1 ) {
-        [self setup];
-//        [self fill];
-    }
-    AMutableArray *subset = [AMutableArray arrayWithCapacity:5];
-    if ( stopIndex >= [tokens count] )
-        stopIndex = [tokens count]-1;
-    for (NSInteger i = startIndex; i <= stopIndex; i++) {
-        id<ANTLRToken>t = [tokens objectAtIndex:i];
-        if ( t.type == ANTLRTokenTypeEOF )
-            break;
-        [subset addObject:t];
-    }
-    return subset;
-}
-
-- (NSInteger) LA:(NSInteger)i
-{
-    return [[self LT:i] type];
-}
-
-- (id<ANTLRToken>) LB:(NSInteger)k
-{
-    if ( (index - k) < 0 )
-        return nil;
-    return [tokens objectAtIndex:(index-k)];
-}
-
-- (id<ANTLRToken>) LT:(NSInteger)k
-{
-    if ( index == -1 ) {
-        [self setup];
-//        [self fill];
-    }
-    if ( k == 0 )
-        return nil;
-    if ( k < 0 )
-        return [self LB:-k];
-    
-    NSInteger i = index + k - 1;
-    [self sync:i];
-    if ( i >= [tokens count] ) { // return EOF token
-                                // EOF must be last token
-        return [tokens objectAtIndex:([tokens count]-1)];
-    }
-    if ( i > range )
-        range = i; 		
-    return [tokens objectAtIndex:i];
-}
-
-- (void) setup
-{
-    [self sync:0];
-    index = 0;
-}
-
-/** Reset this token stream by setting its token source. */
-- (void) setTokenSource:(id<ANTLRTokenSource>) aTokenSource
-{
-    tokenSource = aTokenSource;
-    if ( [tokens count] )
-        [tokens removeAllObjects];
-    index = -1;
-}
-
-- (AMutableArray *)getTokens
-{
-    return tokens;
-}
-
-- (AMutableArray *)getTokensFrom:(NSInteger) startIndex To:(NSInteger) stopIndex
-{
-    return [self getTokensFrom:startIndex To:stopIndex With:(ANTLRBitSet *)nil];
-}
-
-/** Given a start and stop index, return a List of all tokens in
- *  the token type BitSet.  Return null if no tokens were found.  This
- *  method looks at both on and off channel tokens.
- */
-- (AMutableArray *)getTokensFrom:(NSInteger)startIndex To:(NSInteger)stopIndex With:(ANTLRBitSet *)types
-{
-    if ( index == -1 ) {
-        [self setup];
-//        [self fill];
-    }
-    if ( stopIndex >= [tokens count] )
-        stopIndex = [tokens count]-1;
-    if ( startIndex < 0 )
-        startIndex = 0;
-    if ( startIndex > stopIndex )
-        return nil;
-    
-    // list = tokens[start:stop]:{Token t, t.getType() in types}
-    AMutableArray *filteredTokens = [AMutableArray arrayWithCapacity:5];
-    for (NSInteger i = startIndex; i <= stopIndex; i++) {
-        id<ANTLRToken>t = [tokens objectAtIndex:i];
-        if ( types == nil || [types member:t.type] ) {
-            [filteredTokens addObject:t];
-        }
-    }
-    if ( [filteredTokens count] == 0 ) {
-        filteredTokens = nil;
-    }
-    return filteredTokens;
-}
-
-- (AMutableArray *)getTokensFrom:(NSInteger)startIndex To:(NSInteger)stopIndex WithType:(NSInteger)ttype
-{
-    return [self getTokensFrom:startIndex To:stopIndex With:[ANTLRBitSet of:ttype]];
-}
-
-- (AMutableArray *)getTokensFrom:(NSInteger)startIndex To:(NSInteger)stopIndex WithList:(AMutableArray *)types
-{
-    return [self getTokensFrom:startIndex To:stopIndex With:[ANTLRBitSet newANTLRBitSetWithArray:types]];
-}
-            
-- (NSString *)getSourceName
-{
-    return [tokenSource getSourceName];
-}
-
-/** Grab *all* tokens from stream and return string */
-- (NSString *) toString
-{
-    if ( index == -1 ) {
-        [self setup];
-    }
-    [self fill];
-    return [self toStringFromStart:0 ToEnd:[tokens count]-1];
-}
-
-- (NSString *) toStringFromStart:(NSInteger)startIdx ToEnd:(NSInteger)stopIdx
-{
-    if ( startIdx < 0 || stopIdx < 0 )
-        return nil;
-    if ( index == -1 ) {
-        [self setup];
-    }
-    if ( stopIdx >= [tokens count] )
-        stopIdx = [tokens count]-1;
-    NSMutableString *buf = [NSMutableString stringWithCapacity:5];
-    for (NSInteger i = startIdx; i <= stopIdx; i++) {
-        id<ANTLRToken>t = [tokens objectAtIndex:i];
-        if ( t.type == ANTLRTokenTypeEOF )
-            break;
-        [buf appendString:[t text]];
-    }
-    return buf;
-}
-
-- (NSString *) toStringFromToken:(id<ANTLRToken>)startToken ToToken:(id<ANTLRToken>)stopToken
-{
-    if ( startToken != nil && stopToken != nil ) {
-        return [self toStringFromStart:[startToken getTokenIndex] ToEnd:[stopToken getTokenIndex]];
-    }
-    return nil;
-}
-
-/** Get all tokens from lexer until EOF */
-- (void) fill
-{
-    if ( index == -1 ) [self setup];
-    if ( [((ANTLRCommonToken *)[tokens objectAtIndex:index]) type] == ANTLRTokenTypeEOF )
-        return;
-    
-    NSInteger i = index+1;
-    [self sync:i];
-    while ( [((ANTLRCommonToken *)[tokens objectAtIndex:i]) type] != ANTLRTokenTypeEOF ) {
-        i++;
-        [self sync:i];
-    }
-}
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRBufferedTreeNodeStream.h b/runtime/ObjC/Framework/ANTLRBufferedTreeNodeStream.h
deleted file mode 100644
index 07555a5..0000000
--- a/runtime/ObjC/Framework/ANTLRBufferedTreeNodeStream.h
+++ /dev/null
@@ -1,157 +0,0 @@
-//
-//  ANTLRBufferedTreeNodeStream.h
-//  ANTLR
-//
-// [The "BSD licence"]
-// Copyright (c) 2010 Ian Michell 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTree.h"
-#import "ANTLRCommonTreeAdaptor.h"
-#import "ANTLRTokenStream.h"
-#import "ANTLRCommonTreeNodeStream.h"
-#import "ANTLRLookaheadStream.h"
-#import "ANTLRTreeIterator.h"
-#import "ANTLRIntArray.h"
-#import "AMutableArray.h"
-
-#define DEFAULT_INITIAL_BUFFER_SIZE 100
-#define INITIAL_CALL_STACK_SIZE 10
-
-#ifdef DONTUSENOMO
-@interface ANTLRStreamIterator : ANTLRTreeIterator
-{
-    NSInteger idx;
-    __strong ANTLRBufferedTreeNodeStream *input;
-    __strong AMutableArray *nodes;
-}
-
-+ (id) newANTLRStreamIterator:(ANTLRBufferedTreeNodeStream *) theStream;
-
-- (id) initWithStream:(ANTLRBufferedTreeNodeStream *) theStream;
-
-- (BOOL) hasNext;
-- (id) next;
-- (void) remove;
-@end
-#endif
-
-@interface ANTLRBufferedTreeNodeStream : NSObject <ANTLRTreeNodeStream> 
-{
-	id up;
-	id down;
-	id eof;
-	
-	AMutableArray *nodes;
-	
-	id root; // root
-	
-	id<ANTLRTokenStream> tokens;
-	ANTLRCommonTreeAdaptor *adaptor;
-	
-	BOOL uniqueNavigationNodes;
-	NSInteger index;
-	NSInteger lastMarker;
-	ANTLRIntArray *calls;
-	
-	NSEnumerator *e;
-    id currentSymbol;
-	
-}
-
-@property (retain, getter=getUp, setter=setUp:) id up;
-@property (retain, getter=getDown, setter=setDown:) id down;
-@property (retain, getter=eof, setter=setEof:) id eof;
-@property (retain, getter=getNodes, setter=setNodes:) AMutableArray *nodes;
-@property (retain, getter=getTreeSource, setter=setTreeSource:) id root;
-@property (retain, getter=getTokenStream, setter=setTokenStream:) id<ANTLRTokenStream> tokens;
-@property (retain, getter=getAdaptor, setter=setAdaptor:) ANTLRCommonTreeAdaptor *adaptor;
-@property (assign, getter=getUniqueNavigationNodes, setter=setUniqueNavigationNodes:) BOOL uniqueNavigationNodes;
-@property (assign) NSInteger index;
-@property (assign, getter=getLastMarker, setter=setLastMarker:) NSInteger lastMarker;
-@property (retain, getter=getCalls, setter=setCalls:) ANTLRIntArray *calls;
-@property (retain, getter=getEnum, setter=setEnum:) NSEnumerator *e;
-@property (retain, getter=getCurrentSymbol, setter=setCurrentSymbol:) id currentSymbol;
-
-+ (ANTLRBufferedTreeNodeStream *) newANTLRBufferedTreeNodeStream:(ANTLRCommonTree *)tree;
-+ (ANTLRBufferedTreeNodeStream *) newANTLRBufferedTreeNodeStream:(id<ANTLRTreeAdaptor>)adaptor Tree:(ANTLRCommonTree *)tree;
-+ (ANTLRBufferedTreeNodeStream *) newANTLRBufferedTreeNodeStream:(id<ANTLRTreeAdaptor>)adaptor Tree:(ANTLRCommonTree *)tree withBufferSize:(NSInteger)initialBufferSize;
-
-#pragma mark Constructor
-- (id) initWithTree:(ANTLRCommonTree *)tree;
-- (id) initWithTreeAdaptor:(ANTLRCommonTreeAdaptor *)anAdaptor Tree:(ANTLRCommonTree *)tree;
-- (id) initWithTreeAdaptor:(ANTLRCommonTreeAdaptor *)anAdaptor Tree:(ANTLRCommonTree *)tree WithBufferSize:(NSInteger)bufferSize;
-
-- (void)dealloc;
-- (id) copyWithZone:(NSZone *)aZone;
-
-// protected methods. DO NOT USE
-#pragma mark Protected Methods
-- (void) fillBuffer;
-- (void) fillBufferWithTree:(ANTLRCommonTree *) tree;
-- (NSInteger) getNodeIndex:(ANTLRCommonTree *) node;
-- (void) addNavigationNode:(NSInteger) type;
-- (id) getNode:(NSUInteger) i;
-- (id) LT:(NSInteger) k;
-- (id) getCurrentSymbol;
-- (id) LB:(NSInteger) i;
-#pragma mark General Methods
-- (NSString *) getSourceName;
-
-- (id<ANTLRTokenStream>) getTokenStream;
-- (void) setTokenStream:(id<ANTLRTokenStream>) tokens;
-- (id<ANTLRTreeAdaptor>) getTreeAdaptor;
-- (void) setTreeAdaptor:(id<ANTLRTreeAdaptor>) anAdaptor;
-
-- (BOOL)getUniqueNavigationNodes;
-- (void) setUniqueNavigationNodes:(BOOL)aVal;
-
-- (void) consume;
-- (NSInteger) LA:(NSInteger) i;
-- (NSInteger) mark;
-- (void) release:(NSInteger) marker;
-- (void) rewind:(NSInteger) marker;
-- (void) rewind;
-- (void) seek:(NSInteger) idx;
-
-- (void) push:(NSInteger) i;
-- (NSInteger) pop;
-
-- (void) reset;
-- (NSUInteger) count;
-- (NSEnumerator *) objectEnumerator;
-- (void) replaceChildren:(id)parent From:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id) t;
-
-- (NSString *) toTokenTypeString;
-- (NSString *) toTokenString:(NSInteger)aStart ToEnd:(NSInteger)aStop;
-- (NSString *) toStringFromNode:(id)aStart ToNode:(id)aStop;
-
-// getters and setters
-- (AMutableArray *) getNodes;
-- (id) eof;
-- (void)setEof:(id)anEOF;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRBufferedTreeNodeStream.m b/runtime/ObjC/Framework/ANTLRBufferedTreeNodeStream.m
deleted file mode 100644
index a8f73d8..0000000
--- a/runtime/ObjC/Framework/ANTLRBufferedTreeNodeStream.m
+++ /dev/null
@@ -1,556 +0,0 @@
-//
-//  ANTLRBufferedTreeNodeStream.m
-//  ANTLR
-//
-// [The "BSD licence"]
-// Copyright (c) 2010 Ian Michell 2010 Alan Condit
-// 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.
-
-#import "ANTLRBufferedTreeNodeStream.h"
-#import "ANTLRStreamEnumerator.h"
-#import "ANTLRCommonTreeAdaptor.h"
-
-extern NSInteger debug;
-
-#ifdef DONTUSENOMO
-@implementation ANTLRTreeStreamIterator
-+ newANTLRTreeStreamIteratorWithNodes:(ANTLRBufferedTreeNodeStream *)theStream
-{
-    return[[ANTLRTreeStreamIterator alloc] initWithStream:theStream];
-}
-
-- (id) initWithStream:(ANTLRBufferedTreeNodeStream *)theStream
-{
-    if ((self = [super init]) != nil) {
-        idx = 0;
-        input = theStream;
-        nodes = [theStream getNodes];
-    }
-    return self;
-}
-
-- (BOOL) hasNext
-{
-    return idx < [nodes count];
-}
-
-- (id) next
-{
-    NSInteger current = idx;
-    idx++;
-    if (current < [nodes count]) {
-    }
-    return [nodes getEof];
-}
-
-- (void) remove
-{
-	@throw [ANTLRRuntimeException newException:@"cannot remove nodes from stream"];
-}
-
-@end
-#endif
-
-@implementation ANTLRBufferedTreeNodeStream
-
-@synthesize up;
-@synthesize down;
-@synthesize eof;
-@synthesize nodes;
-@synthesize root;
-@synthesize tokens;
-@synthesize adaptor;
-@synthesize uniqueNavigationNodes;
-@synthesize index;
-@synthesize lastMarker;
-@synthesize calls;
-@synthesize e;
-@synthesize currentSymbol;
-
-+ (ANTLRBufferedTreeNodeStream *) newANTLRBufferedTreeNodeStream:(ANTLRCommonTree *) aTree
-{
-    return [((ANTLRBufferedTreeNodeStream *)[ANTLRBufferedTreeNodeStream alloc]) initWithTree:(ANTLRCommonTree *)aTree];
-}
-
-+ (ANTLRBufferedTreeNodeStream *) newANTLRBufferedTreeNodeStream:(id<ANTLRTreeAdaptor>)adaptor Tree:(ANTLRCommonTree *)aTree
-{
-    return [[ANTLRBufferedTreeNodeStream alloc] initWithTreeAdaptor:adaptor Tree:(ANTLRCommonTree *)aTree];
-}
-
-+ (ANTLRBufferedTreeNodeStream *) newANTLRBufferedTreeNodeStream:(id<ANTLRTreeAdaptor>)adaptor Tree:(ANTLRCommonTree *)aTree withBufferSize:(NSInteger)initialBufferSize
-{
-    return [[ANTLRBufferedTreeNodeStream alloc] initWithTreeAdaptor:adaptor Tree:(ANTLRCommonTree *)aTree WithBufferSize:initialBufferSize];
-}
-
--(ANTLRBufferedTreeNodeStream *) init
-{
-	self = [super init];
-	if (self) {
-		index = -1;
-		uniqueNavigationNodes = NO;
-        root = [[ANTLRCommonTree alloc] init];
-        //		tokens = tree;
-        adaptor = [[[ANTLRCommonTreeAdaptor alloc] init] retain];
-        nodes = [[AMutableArray arrayWithCapacity:DEFAULT_INITIAL_BUFFER_SIZE] retain];
-        down = [[adaptor createTree:ANTLRTokenTypeDOWN Text:@"DOWN"] retain];
-        up = [[adaptor createTree:ANTLRTokenTypeUP Text:@"UP"] retain];
-        eof = [[adaptor createTree:ANTLRTokenTypeEOF Text:@"EOF"] retain];
-    }
-	return self;
-}
-
-- (ANTLRBufferedTreeNodeStream *)initWithTree:(ANTLRCommonTree *) aTree
-{
-	self = [super init];
-	if (self) {
-		index = -1;
-		uniqueNavigationNodes = NO;
-        root = aTree;
-        //		tokens = aTree;
-        adaptor = [[[ANTLRCommonTreeAdaptor alloc] init] retain];
-        nodes = [[AMutableArray arrayWithCapacity:DEFAULT_INITIAL_BUFFER_SIZE] retain];
-        down = [[adaptor createTree:ANTLRTokenTypeDOWN Text:@"DOWN"] retain];
-        up = [[adaptor createTree:ANTLRTokenTypeUP Text:@"UP"] retain];
-        eof = [[adaptor createTree:ANTLRTokenTypeEOF Text:@"EOF"] retain];
-    }
-	return self;
-}
-
--(ANTLRBufferedTreeNodeStream *) initWithTreeAdaptor:(ANTLRCommonTreeAdaptor *)anAdaptor Tree:(ANTLRCommonTree *)aTree
-{
-	self = [super init];
-	if (self) {
-		index = -1;
-		uniqueNavigationNodes = NO;
-        root = aTree;
-        //		tokens = aTree;
-        adaptor = [anAdaptor retain];
-        nodes = [[AMutableArray arrayWithCapacity:DEFAULT_INITIAL_BUFFER_SIZE] retain];
-        down = [[adaptor createTree:ANTLRTokenTypeDOWN Text:@"DOWN"] retain];
-        up = [[adaptor createTree:ANTLRTokenTypeUP Text:@"UP"] retain];
-        eof = [[adaptor createTree:ANTLRTokenTypeEOF Text:@"EOF"] retain];
-    }
-	return self;
-}
-
--(ANTLRBufferedTreeNodeStream *) initWithTreeAdaptor:(ANTLRCommonTreeAdaptor *)anAdaptor Tree:(ANTLRCommonTree *)aTree WithBufferSize:(NSInteger)bufferSize
-{
-	self = [super init];
-	if (self) {
-        //		down = [adaptor createToken:ANTLRTokenTypeDOWN withText:@"DOWN"];
-        //		up = [adaptor createToken:ANTLRTokenTypeDOWN withText:@"UP"];
-        //		eof = [adaptor createToken:ANTLRTokenTypeDOWN withText:@"EOF"];
-		index = -1;
-		uniqueNavigationNodes = NO;
-        root = aTree;
-        //		tokens = aTree;
-        adaptor = [anAdaptor retain];
-        nodes = [[AMutableArray arrayWithCapacity:bufferSize] retain];
-        down = [[adaptor createTree:ANTLRTokenTypeDOWN Text:@"DOWN"] retain];
-        up = [[adaptor createTree:ANTLRTokenTypeUP Text:@"UP"] retain];
-        eof = [[adaptor createTree:ANTLRTokenTypeEOF Text:@"EOF"] retain];
-	}
-	return self;
-}
-
-- (void)dealloc
-{
-#ifdef DEBUG_DEALLOC
-    NSLog( @"called dealloc in ANTLRBufferedTreeNodeStream" );
-#endif
-    if ( adaptor ) [adaptor release];
-    if ( nodes ) [nodes release];
-    if ( root ) [root release];
-    if ( down ) [down release];
-    if ( up ) [up release];
-    if ( eof ) [eof release];
-	[super dealloc];
-}
-
-- (id) copyWithZone:(NSZone *)aZone
-{
-    ANTLRBufferedTreeNodeStream *copy;
-    
-    copy = [[[self class] allocWithZone:aZone] init];
-    if ( up )
-        copy.up = [up copyWithZone:aZone];
-    if ( down )
-        copy.down = [down copyWithZone:aZone];
-    if ( eof )
-        copy.eof = [eof copyWithZone:aZone];
-    if ( nodes )
-        copy.nodes = [nodes copyWithZone:aZone];
-    if ( root )
-        copy.root = [root copyWithZone:aZone];
-    if ( tokens )
-        copy.tokens = [tokens copyWithZone:aZone];
-    if ( adaptor )
-        copy.adaptor = [adaptor copyWithZone:aZone];
-    copy.uniqueNavigationNodes = self.uniqueNavigationNodes;
-    copy.index = self.index;
-    copy.lastMarker = self.lastMarker;
-    if ( calls )
-        copy.calls = [calls copyWithZone:aZone];
-    return copy;
-}
-
-// protected methods. DO NOT USE
-#pragma mark Protected Methods
--(void) fillBuffer
-{
-	[self fillBufferWithTree:root];
-	// if (debug > 1) NSLog("revIndex=%@", tokenTypeToStreamIndexesMap);
-	index = 0; // buffer of nodes intialized now
-}
-
--(void) fillBufferWithTree:(ANTLRCommonTree *) aTree
-{
-	BOOL empty = [adaptor isNil:aTree];
-	if (!empty) {
-		[nodes addObject:aTree];
-	}
-	NSInteger n = [adaptor getChildCount:aTree];
-	if (!empty && n > 0) {
-		[self addNavigationNode:ANTLRTokenTypeDOWN];
-	}
-	for (NSInteger c = 0; c < n; c++) {
-		id child = [adaptor getChild:aTree At:c];
-		[self fillBufferWithTree:child];
-	}
-	if (!empty && n > 0) {
-		[self addNavigationNode:ANTLRTokenTypeUP];
-	}
-}
-
--(NSInteger) getNodeIndex:(ANTLRCommonTree *) node
-{
-	if (index == -1) {
-		[self fillBuffer];
-	}
-	for (NSUInteger i = 0; i < [nodes count]; i++) {
-		id t = [nodes objectAtIndex:i];
-		if (t == node) {
-			return i;
-		}
-	}
-	return -1;
-}
-
--(void) addNavigationNode:(NSInteger) type
-{
-	id navNode = nil;
-	if (type == ANTLRTokenTypeDOWN) {
-		if (self.uniqueNavigationNodes) {
-			navNode = [adaptor createToken:ANTLRTokenTypeDOWN Text:@"DOWN"];
-		}
-		else {
-			navNode = down;
-		}
-
-	}
-	else {
-		if (self.uniqueNavigationNodes) {
-			navNode = [adaptor createToken:ANTLRTokenTypeUP Text:@"UP"];
-		}
-		else {
-			navNode = up;
-		}
-	}
-	[nodes addObject:navNode];
-}
-
--(id) getNode:(NSUInteger) i
-{
-	if (index == -1) {
-		[self fillBuffer];
-	}
-	return [nodes objectAtIndex:i];
-}
-
--(id) LT:(NSInteger) k
-{
-	if (index == -1) {
-		[self fillBuffer];
-	}
-	if (k == 0) {
-		return nil;
-	}
-	if (k < 0) {
-		return [self LB:-k];
-	}
-	if ((index + k - 1) >= [nodes count]) {
-		return eof;
-	}
-	return [nodes objectAtIndex:(index + k - 1)];
-}
-
--(id) getCurrentSymbol
-{
-	return [self LT:1];
-}
-
--(id) LB:(NSInteger) k
-{
-	if (k == 0) {
-		return nil;
-	}
-	if ((index - k) < 0) {
-		return nil;
-	}
-	return [nodes objectAtIndex:(index - k)];
-}
-
-- (ANTLRCommonTree *)getTreeSource
-{
-    return root;
-}
-
--(NSString *)getSourceName
-{
-	return [[self getTokenStream] getSourceName];
-}
-
-- (id<ANTLRTokenStream>)getTokenStream
-{
-    return tokens;
-}
-
-- (void) setTokenStream:(id<ANTLRTokenStream>)newtokens
-{
-    tokens = newtokens;
-}
-
-- (id<ANTLRTreeAdaptor>)getTreeAdaptor
-{
-    return adaptor;
-}
-
-- (void) setTreeAdaptor:(id<ANTLRTreeAdaptor>)anAdaptor
-{
-    adaptor = anAdaptor;
-}
-
-- (BOOL)getUniqueNavigationNodes
-{
-    return uniqueNavigationNodes;
-}
-
-- (void) setUniqueNavigationNodes:(BOOL)aVal
-{
-    uniqueNavigationNodes = aVal;
-}
-
--(void) consume
-{
-	if (index == -1) {
-		[self fillBuffer];
-	}
-	index++;
-}
-
--(NSInteger) LA:(NSInteger) i
-{
-	return [adaptor getType:[self LT:i]];
-}
-
--(NSInteger) mark
-{
-	if (index == -1) {
-		[self fillBuffer];
-	}
-	lastMarker = self.index;
-	return lastMarker;
-}
-
--(void) release:(NSInteger) marker
-{
-	// do nothing
-}
-
--(void) rewind:(NSInteger) marker
-{
-	[self seek:marker];
-}
-
--(void) rewind
-{
-	[self seek:lastMarker];
-}
-
--(void) seek:(NSInteger) i
-{
-	if (index == -1) {
-		[self fillBuffer];
-	}
-	index = i;
-}
-
--(void) push:(NSInteger) i
-{
-	if (calls == nil) {
-		calls = [ANTLRIntArray newArrayWithLen:INITIAL_CALL_STACK_SIZE];
-	}
-	[calls push:index];
-	[self seek:i];
-}
-
--(NSInteger) pop
-{
-	NSInteger ret = [calls pop];
-	[self seek:ret];
-	return ret;
-}
-
--(void) reset
-{
-	index = 0;
-	lastMarker = 0;
-	if (calls != nil) {
-		[calls reset];
-	}
-}
-
--(NSUInteger) count
-{
-	if (index == -1) {
-		[self fillBuffer];
-	}
-	return [nodes count];
-}
-
--(NSUInteger) size
-{
-	return [self count];
-}
-
--(NSEnumerator *) objectEnumerator
-{
-	if (e == nil) {
-		e = [[ANTLRStreamEnumerator alloc] initWithNodes:nodes andEOF:eof];
-	}
-	return e;
-}
-
--(void) replaceChildren:(ANTLRCommonTree *) parent From:(NSInteger)startIdx To:(NSInteger)stopIdx With:(ANTLRCommonTree *)aTree
-{
-	if (parent != nil) {
-		[adaptor replaceChildren:parent From:startIdx To:stopIdx With:aTree];
-	}
-}
-
--(NSString *) toTokenTypeString
-{
-	if (index == -1)
-	{
-		[self fillBuffer];
-	}
-	NSMutableString *buf = [NSMutableString stringWithCapacity:10];
-	for (NSUInteger i= 0; i < [nodes count]; i++) {
-		ANTLRCommonTree * aTree = (ANTLRCommonTree *)[self getNode:i];
-		[buf appendFormat:@" %d", [adaptor getType:aTree]];
-	}
-	return buf;
-}
-
--(NSString *) toTokenString:(NSInteger)aStart ToEnd:(NSInteger)aStop
-{
-	if (index == -1) {
-		[self fillBuffer];
-	}
-	NSMutableString *buf = [NSMutableString stringWithCapacity:10];
-	for (NSUInteger i = aStart; i < [nodes count] && i <= aStop; i++) {
-		ANTLRCommonTree * t = (ANTLRCommonTree *)[self getNode:i];
-		[buf appendFormat:@" %d", [adaptor getType:t]];
-	}
-	return buf;
-}
-
--(NSString *) toStringFromNode:(id)aStart ToNode:(id)aStop
-{
-	if (aStart == nil || aStop == nil) {
-		return nil;
-	}
-	if (index == -1) {
-		[self fillBuffer];
-	}
-	
-	// if we have a token stream, use that to dump text in order
-	if ([self getTokenStream] != nil) {
-		NSInteger beginTokenIndex = [adaptor getTokenStartIndex:aStart];
-		NSInteger endTokenIndex = [adaptor getTokenStopIndex:aStop];
-		
-		if ([adaptor getType:aStop] == ANTLRTokenTypeUP) {
-			endTokenIndex = [adaptor getTokenStopIndex:aStart];
-		}
-		else if ([adaptor getType:aStop] == ANTLRTokenTypeEOF) {
-			endTokenIndex = [self count] - 2; //don't use EOF
-		}
-        [tokens toStringFromStart:beginTokenIndex ToEnd:endTokenIndex];
-	}
-	// walk nodes looking for aStart
-	ANTLRCommonTree * aTree = nil;
-	NSUInteger i = 0;
-	for (; i < [nodes count]; i++) {
-		aTree = [nodes objectAtIndex:i];
-		if (aTree == aStart) {
-			break;
-		}
-	}
-	NSMutableString *buf = [NSMutableString stringWithCapacity:10];
-	aTree = [nodes objectAtIndex:i]; // why?
-	while (aTree != aStop) {
-		NSString *text = [adaptor getText:aTree];
-		if (text == nil) {
-			text = [NSString stringWithFormat:@" %d", [adaptor getType:aTree]];
-		}
-		[buf appendString:text];
-		i++;
-		aTree = [nodes objectAtIndex:i];
-	}
-	NSString *text = [adaptor getText:aStop];
-	if (text == nil) {
-		text = [NSString stringWithFormat:@" %d", [adaptor getType:aStop]];
-	}
-	[buf appendString:text];
-	return buf;
-}
-
-// getters and setters
-- (AMutableArray *) getNodes
-{
-    return nodes;
-}
-
-- (id) eof
-{
-    return eof;
-}
-
-- (void) setEof:(id)theEOF
-{
-    eof = theEOF;
-}
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRCharStream.h b/runtime/ObjC/Framework/ANTLRCharStream.h
deleted file mode 100644
index f7be94b..0000000
--- a/runtime/ObjC/Framework/ANTLRCharStream.h
+++ /dev/null
@@ -1,49 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import "ANTLRIntStream.h"
-
-#define	ANTLRCharStreamEOF -1
-
-
-@protocol ANTLRCharStream < ANTLRIntStream >
-
-- (NSString *) substringWithRange:(NSRange) theRange;
-
-/** Get the ith character of lookahead.  This is the same usually as
- *  LA(i).  This will be used for labels in the generated
- *  lexer code.  I'd prefer to return a char here type-wise, but it's
- *  probably better to be 32-bit clean and be consistent with LA.
- */
-- (NSInteger)LT:(NSInteger) i;
-
-// ANTLR tracks the line information automatically
-
-// Because this stream can rewind, we need to be able to reset the line
-
-// The index of the character relative to the beginning of the line 0..n-1
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRCharStreamState.h b/runtime/ObjC/Framework/ANTLRCharStreamState.h
deleted file mode 100644
index 0cf872f..0000000
--- a/runtime/ObjC/Framework/ANTLRCharStreamState.h
+++ /dev/null
@@ -1,49 +0,0 @@
-//
-//  ANTLRCharStreamState.h
-//  ANTLR
-//
-// [The "BSD licence"]
-// Copyright (c)  2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-
-
-@interface ANTLRCharStreamState : NSObject
-{
-NSInteger index;
-NSUInteger line;
-NSUInteger charPositionInLine;
-}
-
-@property (assign) NSInteger index;
-@property (assign) NSUInteger line;
-@property (assign) NSUInteger charPositionInLine;
-
-+ newANTLRCharStreamState;
-
-- (id) init;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRCharStreamState.m b/runtime/ObjC/Framework/ANTLRCharStreamState.m
deleted file mode 100755
index b2a7e3a..0000000
--- a/runtime/ObjC/Framework/ANTLRCharStreamState.m
+++ /dev/null
@@ -1,52 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-
-#import "ANTLRCharStreamState.h"
-
-
-@implementation ANTLRCharStreamState
-
-@synthesize index;
-@synthesize line;
-@synthesize charPositionInLine;
-
-+ newANTLRCharStreamState
-{
-    return [[ANTLRCharStreamState alloc] init];
-}
-
-- (id) init
-{
-    if ((self = [super init]) != nil) {
-        index = 0;
-        line = 1;
-        charPositionInLine = 0;
-    }
-    return self;
-}
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRCommonErrorNode.h b/runtime/ObjC/Framework/ANTLRCommonErrorNode.h
deleted file mode 100644
index d01af00..0000000
--- a/runtime/ObjC/Framework/ANTLRCommonErrorNode.h
+++ /dev/null
@@ -1,67 +0,0 @@
-//
-//  ANTLRCommonErrorNode.h
-//  ANTLR
-//
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRCommonTree.h"
-#import "ANTLRTokenStream.h"
-//#import "ANTLRIntStream.h"
-//#import "ANTLRToken.h"
-#import "ANTLRUnWantedTokenException.h"
-
-@interface ANTLRCommonErrorNode : ANTLRCommonTree
-{
-id<ANTLRIntStream> input;
-id<ANTLRToken> startToken;
-id<ANTLRToken> stopToken;
-ANTLRRecognitionException *trappedException;
-}
-
-+ (id) newANTLRCommonErrorNode:(id<ANTLRTokenStream>)anInput
-                  From:(id<ANTLRToken>)startToken
-                    To:(id<ANTLRToken>)stopToken
-                     Exception:(ANTLRRecognitionException *) e;
-
-- (id) initWithInput:(id<ANTLRTokenStream>)anInput
-                From:(id<ANTLRToken>)startToken
-                  To:(id<ANTLRToken>)stopToken
-           Exception:(ANTLRRecognitionException *) e;
-
-- (void)dealloc;
-- (BOOL) isNil;
-
-- (NSInteger)type;
-- (NSString *)text;
-- (NSString *)toString;
-
-@property (retain) id<ANTLRIntStream> input;
-@property (retain) id<ANTLRToken> startToken;
-@property (retain) id<ANTLRToken> stopToken;
-@property (retain) ANTLRRecognitionException *trappedException;
-@end
diff --git a/runtime/ObjC/Framework/ANTLRCommonErrorNode.m b/runtime/ObjC/Framework/ANTLRCommonErrorNode.m
deleted file mode 100644
index 17fec33..0000000
--- a/runtime/ObjC/Framework/ANTLRCommonErrorNode.m
+++ /dev/null
@@ -1,159 +0,0 @@
-//
-//  ANTLRCommonErrorNode.m
-//  ANTLR
-//
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import "ANTLRCommonErrorNode.h"
-#import "ANTLRMissingTokenException.h"
-#import "ANTLRNoViableAltException.h"
-#import "ANTLRTreeNodeStream.h"
-#import "ANTLRUnwantedTokenException.h"
-
-@implementation ANTLRCommonErrorNode
-
-+ (id) newANTLRCommonErrorNode:(id<ANTLRTokenStream>)anInput
-                          From:(id<ANTLRToken>)aStartToken
-                            To:(id<ANTLRToken>)aStopToken
-                     Exception:(ANTLRRecognitionException *) e
-{
-    return [[ANTLRCommonErrorNode alloc] initWithInput:anInput From:aStartToken To:aStopToken Exception:e];
-}
-
-- (id) init
-{
-    self = [super init];
-    if ( self != nil ) {
-    }
-    return self;
-}
-
-- (id) initWithInput:(id<ANTLRTokenStream>)anInput
-                From:(id<ANTLRToken>)aStartToken
-                  To:(id<ANTLRToken>)aStopToken
-           Exception:(ANTLRRecognitionException *) e
-{
-    self = [super init];
-    if ( self != nil ) {
-        //System.out.println("aStartToken: "+aStartToken+", aStopToken: "+aStopToken);
-        if ( aStopToken == nil ||
-            ([aStopToken getTokenIndex] < [aStartToken getTokenIndex] &&
-             aStopToken.type != ANTLRTokenTypeEOF) )
-        {
-            // sometimes resync does not consume a token (when LT(1) is
-            // in follow set.  So, aStopToken will be 1 to left to aStartToken. adjust.
-            // Also handle case where aStartToken is the first token and no token
-            // is consumed during recovery; LT(-1) will return null.
-            aStopToken = aStartToken;
-        }
-        input = anInput;
-        if ( input ) [input retain];
-        startToken = aStartToken;
-        if ( startToken ) [startToken retain];
-        stopToken = aStopToken;
-        if ( stopToken ) [stopToken retain];
-        trappedException = e;
-        if ( trappedException ) [trappedException retain];
-    }
-    return self;
-}
-
-- (void)dealloc
-{
-#ifdef DEBUG_DEALLOC
-    NSLog( @"called dealloc in ANTLRCommonErrorNode" );
-#endif
-    if ( input ) [input release];
-    if ( startToken ) [startToken release];
-    if ( stopToken ) [stopToken release];
-    if ( trappedException ) [trappedException release];
-	[super dealloc];
-}
-
-- (BOOL) isNil
-{
-    return NO;
-}
-
-- (NSInteger)type
-{
-    return ANTLRTokenTypeInvalid;
-}
-
-- (NSString *)text
-{
-    NSString *badText = nil;
-    if ( [startToken isKindOfClass:[self class]] ) {
-        int i = [(id<ANTLRToken>)startToken getTokenIndex];
-        int j = [(id<ANTLRToken>)stopToken getTokenIndex];
-        if ( stopToken.type == ANTLRTokenTypeEOF ) {
-            j = [(id<ANTLRTokenStream>)input size];
-        }
-        badText = [(id<ANTLRTokenStream>)input toStringFromStart:i ToEnd:j];
-    }
-    else if ( [startToken isKindOfClass:[self class]] ) {
-        badText = [(id<ANTLRTreeNodeStream>)input toStringFromNode:startToken ToNode:stopToken];
-    }
-    else {
-        // people should subclass if they alter the tree type so this
-        // next one is for sure correct.
-        badText = @"<unknown>";
-    }
-    return badText;
-}
-
-- (NSString *)toString
-{
-    NSString *aString;
-    if ( [trappedException isKindOfClass:[ANTLRMissingTokenException class]] ) {
-        aString = [NSString stringWithFormat:@"<missing type: %@ >",
-        [(ANTLRMissingTokenException *)trappedException getMissingType]];
-        return aString;
-    }
-    else if ( [trappedException isKindOfClass:[ANTLRUnwantedTokenException class]] ) {
-        aString = [NSString stringWithFormat:@"<extraneous: %@, resync=%@>",
-        [trappedException getUnexpectedToken],
-        [self text]];
-        return aString;
-    }
-    else if ( [trappedException isKindOfClass:[ANTLRMismatchedTokenException class]] ) {
-        aString = [NSString stringWithFormat:@"<mismatched token: %@, resync=%@>", trappedException.token, [self text]];
-        return aString;
-    }
-    else if ( [trappedException isKindOfClass:[ANTLRNoViableAltException class]] ) {
-        aString = [NSString stringWithFormat:@"<unexpected:  %@, resync=%@>", trappedException.token, [self text]];
-        return aString;
-    }
-    aString = [NSString stringWithFormat:@"<error: %@>",[self text]];
-    return aString;
-}
-
-@synthesize input;
-@synthesize startToken;
-@synthesize stopToken;
-@synthesize trappedException;
-@end
diff --git a/runtime/ObjC/Framework/ANTLRCommonToken.h b/runtime/ObjC/Framework/ANTLRCommonToken.h
deleted file mode 100644
index 948e129..0000000
--- a/runtime/ObjC/Framework/ANTLRCommonToken.h
+++ /dev/null
@@ -1,129 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRToken.h"
-#import "ANTLRCharStream.h"
-
-@interface ANTLRCommonToken : NSObject < ANTLRToken > {
-	__strong NSString *text;
-	NSInteger type;
-	// information about the Token's position in the input stream
-	NSUInteger line;
-	NSUInteger charPositionInLine;
-	NSUInteger channel;
-	// this token's position in the TokenStream
-	NSInteger index;
-	
-	// indices into the CharStream to avoid copying the text
-	// can manually override the text by using -setText:
-	NSInteger startIndex;
-	NSInteger stopIndex;
-	// the actual input stream this token was found in
-	__strong id<ANTLRCharStream> input;
-}
-
-+ (void) initialize;
-+ (NSInteger) DEFAULT_CHANNEL;
-+ (id<ANTLRToken>)INVALID_TOKEN;
-+ (NSInteger) INVALID_TOKEN_TYPE;
-+ (id<ANTLRToken>) newToken;
-+ (id<ANTLRToken>) newToken:(id<ANTLRCharStream>)anInput
-                       Type:(NSInteger)aTType
-                    Channel:(NSInteger)aChannel
-                      Start:(NSInteger)aStart
-                       Stop:(NSInteger)aStop;
-+ (id<ANTLRToken>) newToken:(ANTLRTokenType)aType;
-+ (id<ANTLRToken>) newToken:(NSInteger)tokenType Text:(NSString *)tokenText;
-+ (id<ANTLRToken>) newTokenWithToken:(ANTLRCommonToken *)fromToken;
-+ (id<ANTLRToken>) eofToken;
-+ (id<ANTLRToken>) skipToken;
-+ (id<ANTLRToken>) invalidToken;
-+ (ANTLRTokenChannel) defaultChannel;
-
-// designated initializer. This is used as the default way to initialize a Token in the generated code.
-- (id) init;
-- (id) initWithInput:(id<ANTLRCharStream>)anInput
-                                Type:(NSInteger)aTType
-                             Channel:(NSInteger)aChannel
-                               Start:(NSInteger)theStart
-                                Stop:(NSInteger)theStop;
-- (id) initWithToken:(id<ANTLRToken>)aToken;
-- (id) initWithType:(ANTLRTokenType)aType;
-- (id) initWithType:(ANTLRTokenType)aTType Text:(NSString *)tokenText;
-
-//---------------------------------------------------------- 
-//  text 
-//---------------------------------------------------------- 
-- (NSString *)text;
-- (void) setText:(NSString *)aText;
-
-//---------------------------------------------------------- 
-//  type 
-//---------------------------------------------------------- 
-- (NSInteger)type;
-- (void) setType:(NSInteger)aType;
-
-//---------------------------------------------------------- 
-//  channel 
-//---------------------------------------------------------- 
-- (NSUInteger)channel;
-- (void) setChannel:(NSUInteger)aChannel;
-
-//---------------------------------------------------------- 
-//  input 
-//---------------------------------------------------------- 
-- (id<ANTLRCharStream>)input;
-- (void) setInput:(id<ANTLRCharStream>)anInput;
-
-- (NSInteger)getStart;
-- (void) setStart: (NSInteger)aStart;
-
-- (NSInteger)getStop;
-- (void) setStop: (NSInteger) aStop;
-
-// the index of this Token into the TokenStream
-- (NSInteger)getTokenIndex;
-- (void) setTokenIndex:(NSInteger)aTokenIndex;
-
-// conform to NSCopying
-- (id) copyWithZone:(NSZone *)theZone;
-
-- (NSString *) description;
-- (NSString *) toString;
-
-@property (retain, getter = text, setter = setText:) NSString *text;
-@property (assign) NSInteger type;
-@property (assign, getter = line, setter = setLine:) NSUInteger line;
-@property (assign, getter=charPositionInLine, setter = setCharPositionInLine:) NSUInteger charPositionInLine;
-@property (assign) NSUInteger channel;
-@property (assign) NSInteger index;
-@property (assign, getter=getStart, setter=setStart:) NSInteger startIndex;
-@property (assign, getter=getStop, setter=setStop:) NSInteger stopIndex;
-@property (retain) id<ANTLRCharStream> input;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRCommonToken.m b/runtime/ObjC/Framework/ANTLRCommonToken.m
deleted file mode 100644
index ee0e018..0000000
--- a/runtime/ObjC/Framework/ANTLRCommonToken.m
+++ /dev/null
@@ -1,397 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import "ANTLRCommonToken.h"
-
-static ANTLRCommonToken *SKIP_TOKEN;
-static ANTLRCommonToken *EOF_TOKEN;
-static ANTLRCommonToken *INVALID_TOKEN;
-
-@implementation ANTLRCommonToken
-
-    static NSInteger DEFAULT_CHANNEL = ANTLRTokenChannelDefault;
-    static NSInteger INVALID_TOKEN_TYPE = ANTLRTokenTypeInvalid;
-
-
-@synthesize text;
-@synthesize type;
-@synthesize line;
-@synthesize charPositionInLine;
-@synthesize channel;
-@synthesize index;
-@synthesize startIndex;
-@synthesize stopIndex;
-@synthesize input;
-
-+ (void) initialize
-{
-    EOF_TOKEN = [ANTLRCommonToken newToken:ANTLRTokenTypeEOF Text:@"EOF"];
-    SKIP_TOKEN = [ANTLRCommonToken newToken:ANTLRTokenTypeInvalid Text:@"Skip"];
-    INVALID_TOKEN = [ANTLRCommonToken newToken:ANTLRTokenTypeInvalid Text:@"Invalid"];
-    [EOF_TOKEN retain];
-    [SKIP_TOKEN retain];
-    [INVALID_TOKEN retain];
-}
-
-+ (ANTLRCommonToken *)INVALID_TOKEN
-{
-    return INVALID_TOKEN;
-}
-
-+ (NSInteger) DEFAULT_CHANNEL
-{
-    return DEFAULT_CHANNEL;
-}
-
-+ (NSInteger) INVALID_TOKEN_TYPE
-{
-    return INVALID_TOKEN_TYPE;
-}
-
-+ (ANTLRCommonToken *) newToken
-{
-    return [[ANTLRCommonToken alloc] init];
-}
-
-+ (ANTLRCommonToken *) newToken:(id<ANTLRCharStream>)anInput Type:(NSInteger)aTType Channel:(NSInteger)aChannel Start:(NSInteger)aStart Stop:(NSInteger)aStop
-{
-    return [[ANTLRCommonToken alloc] initWithInput:(id<ANTLRCharStream>)anInput Type:(NSInteger)aTType Channel:(NSInteger)aChannel Start:(NSInteger)aStart Stop:(NSInteger)aStop];
-}
-
-+ (ANTLRCommonToken *) newToken:(ANTLRTokenType)tokenType
-{
-    return( [[ANTLRCommonToken alloc] initWithType:tokenType] );
-}
-
-+ (ANTLRCommonToken *) newToken:(NSInteger)tokenType Text:(NSString *)tokenText
-{
-    return( [[ANTLRCommonToken alloc] initWithType:tokenType Text:tokenText] );
-}
-
-+ (ANTLRCommonToken *) newTokenWithToken:(ANTLRCommonToken *)fromToken
-{
-    return( [[ANTLRCommonToken alloc] initWithToken:fromToken] );
-}
-
-// return the singleton EOF Token 
-+ (id<ANTLRToken>) eofToken
-{
-    if (EOF_TOKEN == nil) {
-        EOF_TOKEN = [[ANTLRCommonToken newToken:ANTLRTokenTypeEOF Text:@"EOF"] retain];
-    }
-    return EOF_TOKEN;
-}
-
-// return the singleton skip Token 
-+ (id<ANTLRToken>) skipToken
-{
-    if (SKIP_TOKEN == nil) {
-        SKIP_TOKEN = [[ANTLRCommonToken newToken:ANTLRTokenTypeInvalid Text:@"Skip"] retain];
-    }
-    return SKIP_TOKEN;
-}
-
-// return the singleton skip Token 
-+ (id<ANTLRToken>) invalidToken
-{
-    if (INVALID_TOKEN == nil) {
-        INVALID_TOKEN = [[ANTLRCommonToken newToken:ANTLRTokenTypeInvalid Text:@"Invalid"] retain];
-    }
-    return SKIP_TOKEN;
-}
-
-// the default channel for this class of Tokens
-+ (ANTLRTokenChannel) defaultChannel
-{
-    return ANTLRTokenChannelDefault;
-}
-
-- (id) init
-{
-    if ((self = [super init]) != nil) {
-        input = nil;
-        type = ANTLRTokenTypeInvalid;
-        channel = ANTLRTokenChannelDefault;
-        startIndex = 0;
-        stopIndex = 0;
-    }
-    return self;
-}
-
-// designated initializer
-- (id) initWithInput:(id<ANTLRCharStream>)anInput
-                           Type:(NSInteger)aTType
-                             Channel:(NSInteger)aChannel
-                               Start:(NSInteger)aStart
-                                Stop:(NSInteger)aStop
-{
-    if ((self = [super init]) != nil) {
-        input = anInput;
-        if ( input ) [input retain];
-        type = aTType;
-        channel = aChannel;
-        startIndex = aStart;
-        stopIndex = aStop;
-        if (type == ANTLRTokenTypeEOF)
-            text = @"EOF";
-        else
-            text = [input substringWithRange:NSMakeRange(startIndex, (stopIndex-startIndex)+1)];
-        if ( text ) [text retain];
-    }
-    return self;
-}
-
-- (id) initWithToken:(ANTLRCommonToken *)oldToken
-{
-    if ((self = [super init]) != nil) {
-        text = [NSString stringWithString:oldToken.text];
-        if ( text ) [text retain];
-        type = oldToken.type;
-        line = oldToken.line;
-        index = oldToken.index;
-        charPositionInLine = oldToken.charPositionInLine;
-        channel = oldToken.channel;
-        input = oldToken.input;
-        if ( input ) [input retain];
-        if ( [oldToken isKindOfClass:[ANTLRCommonToken class]] ) {
-            startIndex = oldToken.startIndex;
-            stopIndex = oldToken.stopIndex;
-        }
-    }
-    return self;
-}
-
-- (id) initWithType:(ANTLRTokenType)aTType
-{
-    if ((self = [super init]) != nil) {
-        self.type = aTType;
-    }
-    return self;
-}
-
-- (id) initWithType:(ANTLRTokenType)aTType Text:(NSString *)tokenText
-{
-    if ((self = [super init]) != nil) {
-        self.type = aTType;
-        self.text = [NSString stringWithString:tokenText];
-        if ( text ) [text retain];
-    }
-    return self;
-}
-
-- (void)dealloc
-{
-#ifdef DEBUG_DEALLOC
-    NSLog( @"called dealloc in ANTLRCommonToken" );
-#endif
-    if ( input ) [input release];
-    if ( text ) [text release];
-    [super dealloc];
-}
-
-// create a copy, including the text if available
-// the input stream is *not* copied!
-- (id) copyWithZone:(NSZone *)theZone
-{
-    ANTLRCommonToken *copy = [[[self class] allocWithZone:theZone] init];
-    
-    if (text)
-        copy.text = [text copyWithZone:nil];
-    copy.type = type;
-    copy.line = line;
-    copy.charPositionInLine = charPositionInLine;
-    copy.channel = channel;
-    copy.index = index;
-    copy.startIndex = startIndex;
-    copy.stopIndex = stopIndex;
-    copy.input = input;
-    return copy;
-}
-
-
-//---------------------------------------------------------- 
-//  charPositionInLine 
-//---------------------------------------------------------- 
-- (NSUInteger) charPositionInLine
-{
-    return charPositionInLine;
-}
-
-- (void) setCharPositionInLine:(NSUInteger)aCharPositionInLine
-{
-    charPositionInLine = aCharPositionInLine;
-}
-
-//---------------------------------------------------------- 
-//  line 
-//---------------------------------------------------------- 
-- (NSUInteger) line
-{
-    return line;
-}
-
-- (void) setLine:(NSUInteger)aLine
-{
-    line = aLine;
-}
-
-//---------------------------------------------------------- 
-//  text 
-//---------------------------------------------------------- 
-- (NSString *) text
-{
-    if (text != nil) {
-        return text;
-    }
-    if (input == nil) {
-        return nil;
-    }
-    return [input substringWithRange:NSMakeRange(startIndex, (stopIndex-startIndex)+1)];
-}
-
-- (void) setText:(NSString *)aText
-{
-    if (text != aText) {
-        if ( text ) [text release];
-        text = aText;
-        [text retain];
-    }
-}
-
-
-//---------------------------------------------------------- 
-//  type 
-//---------------------------------------------------------- 
-- (NSInteger)type
-{
-    return type;
-}
-
-- (void) setType:(NSInteger)aType
-{
-    type = aType;
-}
-
-//---------------------------------------------------------- 
-//  channel 
-//---------------------------------------------------------- 
-- (NSUInteger)channel
-{
-    return channel;
-}
-
-- (void) setChannel:(NSUInteger)aChannel
-{
-    channel = aChannel;
-}
-
-
-//---------------------------------------------------------- 
-//  input 
-//---------------------------------------------------------- 
-- (id<ANTLRCharStream>) input
-{
-    return input; 
-}
-
-- (void) setInput: (id<ANTLRCharStream>) anInput
-{
-    if (input != anInput) {
-        if ( input ) [input release];
-        [anInput retain];
-    }
-    input = anInput;
-}
-
-
-//---------------------------------------------------------- 
-//  start 
-//---------------------------------------------------------- 
-- (NSInteger) getStart
-{
-    return startIndex;
-}
-
-- (void) setStart: (NSInteger) aStart
-{
-    startIndex = aStart;
-}
-
-//---------------------------------------------------------- 
-//  stop 
-//---------------------------------------------------------- 
-- (NSInteger) getStop
-{
-    return stopIndex;
-}
-
-- (void) setStop: (NSInteger) aStop
-{
-    stopIndex = aStop;
-}
-
-//---------------------------------------------------------- 
-//  index 
-//---------------------------------------------------------- 
-- (NSInteger) getTokenIndex;
-{
-    return index;
-}
-
-- (void) setTokenIndex: (NSInteger) aTokenIndex;
-{
-    index = aTokenIndex;
-}
-
-
-// provide a textual representation for debugging
-- (NSString *) description
-{
-    NSString *channelStr;
-    NSMutableString *txtString;
-
-    channelStr = @"";
-    if ( channel > 0 ) {
-        channelStr = [NSString stringWithFormat:@",channel=%d\n", channel];
-    }
-    if ([self text] != nil) {
-        txtString = [NSMutableString stringWithString:[self text]];
-        [txtString replaceOccurrencesOfString:@"\n" withString:@"\\\\n" options:NSAnchoredSearch range:NSMakeRange(0, [txtString length])];
-        [txtString replaceOccurrencesOfString:@"\r" withString:@"\\\\r" options:NSAnchoredSearch range:NSMakeRange(0, [txtString length])];
-        [txtString replaceOccurrencesOfString:@"\t" withString:@"\\\\t" options:NSAnchoredSearch range:NSMakeRange(0, [txtString length])];
-    } else {
-        txtString = [NSMutableString stringWithString:@"<no text>"];
-    }
-    return [NSString stringWithFormat:@"[@%d, %d:%d='%@',<%d>%@,%d:%d]", index, startIndex, stopIndex, txtString, type, channelStr, line, charPositionInLine];
-}
-
-- (NSString *)toString
-{
-   return [self description];
-}
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRCommonTokenStream.h b/runtime/ObjC/Framework/ANTLRCommonTokenStream.h
deleted file mode 100644
index c26130e..0000000
--- a/runtime/ObjC/Framework/ANTLRCommonTokenStream.h
+++ /dev/null
@@ -1,95 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTokenStream.h"
-#import "ANTLRToken.h"
-#import "ANTLRCommonToken.h"
-#import "ANTLRTokenSource.h"
-#import "ANTLRBitSet.h"
-#import "ANTLRBufferedTokenStream.h"
-#import "AMutableDictionary.h"
-
-@interface ANTLRCommonTokenStream : ANTLRBufferedTokenStream < ANTLRTokenStream >
-{
-	__strong AMutableDictionary *channelOverride;
-	NSUInteger channel;
-}
-
-@property (retain, getter=getChannelOverride,setter=setChannelOverride:) AMutableDictionary *channelOverride;
-@property (assign, getter=channel,setter=setChannel:) NSUInteger channel;
-
-+ (ANTLRCommonTokenStream *)newANTLRCommonTokenStream;
-+ (ANTLRCommonTokenStream *)newANTLRCommonTokenStreamWithTokenSource:(id<ANTLRTokenSource>)theTokenSource;
-+ (ANTLRCommonTokenStream *)newANTLRCommonTokenStreamWithTokenSource:(id<ANTLRTokenSource>)theTokenSource
-                                                               Channel:(NSUInteger)aChannel;
-
-- (id) init;
-- (id) initWithTokenSource:(id<ANTLRTokenSource>)theTokenSource;
-- (id) initWithTokenSource:(id<ANTLRTokenSource>)theTokenSource Channel:(NSUInteger)aChannel;
-
-- (void) consume;
-- (id<ANTLRToken>) LB:(NSInteger)k;
-- (id<ANTLRToken>) LT:(NSInteger)k;
-
-- (NSInteger) skipOffChannelTokens:(NSInteger) i;
-- (NSInteger) skipOffChannelTokensReverse:(NSInteger) i;
-
-- (void)setup;
-
-- (NSInteger) getNumberOfOnChannelTokens;
-
-// - (id<ANTLRTokenSource>) getTokenSource;
-- (void) setTokenSource: (id<ANTLRTokenSource>) aTokenSource;
-
-- (NSUInteger)channel;
-- (void)setChannel:(NSUInteger)aChannel;
-
-- (AMutableDictionary *)channelOverride;
-- (void)setChannelOverride:(AMutableDictionary *)anOverride;
-
-- (id) copyWithZone:(NSZone *)aZone;
-
-#ifdef DONTUSENOMO
-- (NSArray *) tokensInRange:(NSRange)aRange;
-- (NSArray *) tokensInRange:(NSRange)aRange inBitSet:(ANTLRBitSet *)aBitSet;
-- (NSArray *) tokensInRange:(NSRange)aRange withTypes:(NSArray *)tokenTypes;
-- (NSArray *) tokensInRange:(NSRange)aRange withType:(NSInteger)tokenType;
-
-- (id<ANTLRToken>) getToken:(NSInteger)i;
-
-- (NSInteger) size;
-- (void) rewind;
-- (void) rewind:(NSInteger)marker;
-- (void) seek:(NSInteger)index;
-
-- (NSString *) toString;
-- (NSString *) toStringFromStart:(NSInteger)startIndex ToEnd:(NSInteger)stopIndex;
-- (NSString *) toStringFromToken:(id<ANTLRToken>)startToken ToToken:(id<ANTLRToken>)stopToken;
-
-#endif
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRCommonTokenStream.m b/runtime/ObjC/Framework/ANTLRCommonTokenStream.m
deleted file mode 100644
index 9ebc325..0000000
--- a/runtime/ObjC/Framework/ANTLRCommonTokenStream.m
+++ /dev/null
@@ -1,352 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import "ANTLRToken.h"
-#import "ANTLRCommonTokenStream.h"
-
-
-@implementation ANTLRCommonTokenStream
-
-@synthesize channelOverride;
-@synthesize channel;
-
-#pragma mark Initialization
-
-+ (ANTLRCommonTokenStream *)newANTLRCommonTokenStream
-{
-    return [[ANTLRCommonTokenStream alloc] init];
-}
-
-+ (ANTLRCommonTokenStream *)newANTLRCommonTokenStreamWithTokenSource:(id<ANTLRTokenSource>)theTokenSource
-{
-    return [[ANTLRCommonTokenStream alloc] initWithTokenSource:(id<ANTLRTokenSource>)theTokenSource];
-}
-
-+ (ANTLRCommonTokenStream *)newANTLRCommonTokenStreamWithTokenSource:(id<ANTLRTokenSource>)theTokenSource Channel:(NSUInteger)aChannel
-{
-    return [[ANTLRCommonTokenStream alloc] initWithTokenSource:(id<ANTLRTokenSource>)theTokenSource Channel:aChannel];
-}
-
-- (id) init
-{
-	if ((self = [super init]) != nil) {
-		channelOverride = [[AMutableDictionary dictionaryWithCapacity:100] retain];
-		channel = ANTLRTokenChannelDefault;
-	}
-	return self;
-}
-
-- (id) initWithTokenSource:(id<ANTLRTokenSource>)theTokenSource
-{
-	if ((self = [super initWithTokenSource:theTokenSource]) != nil) {
-		channelOverride = [[AMutableDictionary dictionaryWithCapacity:100] retain];
-		channel = ANTLRTokenChannelDefault;
-	}
-	return self;
-}
-
-- (id) initWithTokenSource:(id<ANTLRTokenSource>)theTokenSource Channel:(NSUInteger)aChannel
-{
-	if ((self = [super initWithTokenSource:theTokenSource]) != nil) {
-		channelOverride = [[AMutableDictionary dictionaryWithCapacity:100] retain];
-		channel = aChannel;
-	}
-	return self;
-}
-
-- (void) dealloc
-{
-#ifdef DEBUG_DEALLOC
-    NSLog( @"called dealloc in ANTLRCommonTokenStream" );
-#endif
-	if ( channelOverride ) [channelOverride release];
-	if ( tokens ) [tokens release];
-	[self setTokenSource:nil];
-	[super dealloc];
-}
-
-/** Always leave index on an on-channel token. */
-- (void) consume
-{
-    if (index == -1) [self setup];
-    index++;
-    [self sync:index];
-    while ( ((ANTLRCommonToken *)[tokens objectAtIndex:index]).channel != channel ) {
-		index++;
-		[self sync:index];
-	}
-}
-
-#pragma mark Lookahead
-
-- (id<ANTLRToken>) LB:(NSInteger)k
-{
-	if ( k == 0 || (index-k) < 0 ) {
-		return nil;
-	}
-	int i = index;
-	int n = 1;
-    // find k good tokens looking backwards
-	while ( n <= k ) {
-		i = [self skipOffChannelTokensReverse:i-1];
-		n++;
-	}
-	if ( i < 0 ) {
-		return nil;
-	}
-	return [tokens objectAtIndex:i];
-}
-
-- (id<ANTLRToken>) LT:(NSInteger)k
-{
-	if ( index == -1 ) [self setup];
-	if ( k == 0 ) return nil;
-	if ( k < 0 ) return [self LB:-k];
-	int i = index;
-	int n = 1;
-	while ( n < k ) {
-		i = [self skipOffChannelTokens:i+1];
-		n++;
-	}
-//	if ( i >= (NSInteger)[tokens count] ) {
-//		return [ANTLRCommonToken eofToken];
-//	}
-    if ( i > range ) range = i;
-	return [tokens objectAtIndex:i];
-}
-
-#pragma mark Channels & Skipping
-
-- (NSInteger) skipOffChannelTokens:(NSInteger) idx
-{
-    [self sync:idx];
-	while ( ((ANTLRCommonToken *)[tokens objectAtIndex:idx]).channel != channel ) {
-		idx++;
-        [self sync:idx];
-	}
-	return idx;
-}
-
-- (NSInteger) skipOffChannelTokensReverse:(NSInteger) i
-{
-	while ( i >= 0 && ((ANTLRCommonToken *)[tokens objectAtIndex:i]).channel != channel ) {
-		i--;
-	}
-	return i;
-}
-
-- (void) setup
-{
-    index = 0;
-    [self sync:0];
-    int i = 0;
-    while ( ((ANTLRCommonToken *)[tokens objectAtIndex:i]).channel != channel ) {
-        i++;
-        [self sync:i];
-    }
-	// leave index pointing at first token on channel
-    index = i;
-}
-
-- (NSInteger) getNumberOfOnChannelTokens
-{
-    NSInteger n = 0;
-    [self fill];
-    for( int i = 0; i < [tokens count]; i++ ) {
-        ANTLRCommonToken *t = [tokens objectAtIndex:i];
-        if ( t.channel == channel )
-            n++;
-        if ( t.type == ANTLRTokenTypeEOF )
-            break;
-    }
-    return n;
-}
-
-/** Reset this token stream by setting its token source. */
-- (void) setTokenSource:(id<ANTLRTokenSource>)aTokenSource
-{
-    [super setTokenSource:aTokenSource];
-    channel = ANTLRTokenChannelDefault;
-}
-
-- (id) copyWithZone:(NSZone *)aZone
-{
-    ANTLRCommonTokenStream *copy;
-	
-    //    copy = [[[self class] allocWithZone:aZone] init];
-    copy = [super copyWithZone:aZone]; // allocation occurs in ANTLRBaseTree
-    if ( self.channelOverride )
-        copy.channelOverride = [channelOverride copyWithZone:aZone];
-    copy.channel = channel;
-    return copy;
-}
-
-- (NSUInteger)channel
-{
-    return channel;
-}
-
-- (void)setChannel:(NSUInteger)aChannel
-{
-    channel = aChannel;
-}
-
-- (AMutableDictionary *)channelOverride
-{
-    return channelOverride;
-}
-
-- (void)setChannelOverride:(AMutableDictionary *)anOverride
-{
-    channelOverride = anOverride;
-}
-
-#ifdef DONTUSENOMO
-#pragma mark Token access
-
-- (NSArray *) tokensInRange:(NSRange)aRange
-{
-	return [tokens subarrayWithRange:aRange];
-}
-
-#pragma mark Accessors
-
-- (id<ANTLRTokenSource>) getTokenSource
-{
-    return tokenSource; 
-}
-
-- (NSArray *) tokensInRange:(NSRange)aRange inBitSet:(ANTLRBitSet *)aBitSet
-{
-	unsigned int startIndex = aRange.location;
-	unsigned int stopIndex = aRange.location+aRange.length;
-	if ( index == -1 ) {
-		[self setup];
-	}
-	if (stopIndex >= [tokens count]) {
-		stopIndex = [tokens count] - 1;
-	}
-	AMutableArray *filteredTokens = [AMutableArray arrayWithCapacity:100];
-	unsigned int i=0;
-	for (i = startIndex; i<=stopIndex; i++) {
-		id<ANTLRToken> token = [tokens objectAtIndex:i];
-		if (aBitSet == nil || [aBitSet member:token.type]) {
-			[filteredTokens addObject:token];
-		}
-	}
-	if ([filteredTokens count]) {
-		return filteredTokens;
-	} else {
-		[filteredTokens release];
-		return nil;
-	}
-}
-
-- (NSArray *) tokensInRange:(NSRange)aRange withTypes:(NSArray *)tokenTypes
-{
-	ANTLRBitSet *bits = [[ANTLRBitSet alloc] initWithArrayOfBits:tokenTypes];
-	NSArray *returnTokens = [[self tokensInRange:aRange inBitSet:bits] retain];
-	[bits release];
-	return returnTokens;
-}
-
-- (NSArray *) tokensInRange:(NSRange)aRange withType:(NSInteger)tokenType
-{
-	ANTLRBitSet *bits = [[ANTLRBitSet alloc] init];
-	[bits add:tokenType];
-	NSArray *returnTokens = [[self tokensInRange:aRange inBitSet:bits] retain];
-	[bits release];
-	return returnTokens;
-}
-
-- (id<ANTLRToken>) getToken:(NSInteger)i
-{
-	return [tokens objectAtIndex:i];
-}
-
-- (NSInteger) size
-{
-	return [tokens count];
-}
-
-- (void) rewind
-{
-	[self seek:lastMarker];
-}
-
-- (void) rewind:(NSInteger)marker
-{
-	[self seek:marker];
-}
-
-- (void) seek:(NSInteger)anIndex
-{
-	index = anIndex;
-}
-#pragma mark toString routines
-
-- (NSString *) toString
-{
-	if ( index == -1 ) {
-		[self setup];
-	}
-	return [self toStringFromStart:0 ToEnd:[tokens count]];
-}
-
-- (NSString *) toStringFromStart:(NSInteger)startIdx ToEnd:(NSInteger) stopIdx
-{
-    NSMutableString *stringBuffer;
-    id<ANTLRToken> t;
-
-    if ( startIdx < 0 || stopIdx < 0 ) {
-        return nil;
-    }
-    if ( index == -1 ) {
-        [self setup];
-    }
-    if ( stopIdx >= [tokens count] ) {
-        stopIdx = [tokens count]-1;
-    }
-    stringBuffer = [NSMutableString stringWithCapacity:30];
-    for (int i = startIdx; i <= stopIdx; i++) {
-        t = (id<ANTLRToken>)[tokens objectAtIndex:i];
-        [stringBuffer appendString:[t text]];
-    }
-    return stringBuffer;
-}
-
-- (NSString *) toStringFromToken:(id<ANTLRToken>)startToken ToToken:(id<ANTLRToken>)stopToken
-{
-	if (startToken && stopToken) {
-		int startIdx = [startToken getTokenIndex];
-		int stopIdx = [stopToken getTokenIndex];
-		return [self toStringFromStart:startIdx ToEnd:stopIdx];
-	}
-	return nil;
-}
-#endif
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRCommonTree.h b/runtime/ObjC/Framework/ANTLRCommonTree.h
deleted file mode 100644
index 2becb76..0000000
--- a/runtime/ObjC/Framework/ANTLRCommonTree.h
+++ /dev/null
@@ -1,92 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRCommonToken.h"
-#import "ANTLRBaseTree.h"
-
-@interface ANTLRCommonTree : ANTLRBaseTree <ANTLRTree> {
-	__strong ANTLRCommonToken *token;
-	NSInteger startIndex;
-	NSInteger stopIndex;
-    __strong ANTLRCommonTree *parent;
-    NSInteger childIndex;
-}
-
-+ (ANTLRCommonTree *) invalidNode;
-+ (ANTLRCommonTree *) newTree;
-+ (ANTLRCommonTree *) newTreeWithTree:(ANTLRCommonTree *)aTree;
-+ (ANTLRCommonTree *) newTreeWithToken:(ANTLRCommonToken *)aToken;
-+ (ANTLRCommonTree *) newTreeWithTokenType:(NSInteger)tokenType;
-+ (ANTLRCommonTree *) newTreeWithTokenType:(NSInteger)aTType Text:(NSString *)theText;
-
-- (id) init;
-- (id) initWithTreeNode:(ANTLRCommonTree *)aNode;
-- (id) initWithToken:(ANTLRCommonToken *)aToken;
-- (id) initWithTokenType:(NSInteger)aTokenType;
-- (id) initWithTokenType:(NSInteger)aTokenType Text:(NSString *)theText;
-
-- (id<ANTLRBaseTree>) copyWithZone:(NSZone *)aZone;
-
-- (BOOL) isNil;
-
-- (ANTLRCommonToken *) getToken;
-- (void) setToken:(ANTLRCommonToken *)aToken;
-- (ANTLRCommonToken *) dupNode;
-- (NSInteger)type;
-- (NSString *)text;
-- (NSUInteger)line;
-- (void) setLine:(NSUInteger)aLine;
-- (NSUInteger)charPositionInLine;
-- (void) setCharPositionInLine:(NSUInteger)pos;
-- (ANTLRCommonTree *) getParent;
-- (void) setParent:(ANTLRCommonTree *) t;
-
-#ifdef DONTUSENOMO
-- (NSString *) treeDescription;
-#endif
-- (NSString *) description;
-- (void) setUnknownTokenBoundaries;
-- (NSInteger) getTokenStartIndex;
-- (void) setTokenStartIndex: (NSInteger) aStartIndex;
-- (NSInteger) getTokenStopIndex;
-- (void) setTokenStopIndex: (NSInteger) aStopIndex;
-
-/*
- @property (retain, getter=getANTLRCommonToken, setter=setANTLRCommonToken:) ANTLRCommonToken *token;
- @property (assign, getter=getTokenStartIndex, setter=setTokenStartIndex:) NSInteger startIndex;
- @property (assign, getter=getTokenStopIndex, setter=setTokenStopIndex:) NSInteger stopIndex;
- @property (retain, getter=getParent, setter=setParent:) id<ANTLRBaseTree> parentparent;
- @property (assign, getter=getChildIndex, setter=setChildIndex:) NSInteger childIndex;
- */
-
-@property (retain) ANTLRCommonToken *token;
-@property (assign) NSInteger startIndex;
-@property (assign) NSInteger stopIndex;
-@property (retain) ANTLRCommonTree *parent;
-@property (assign) NSInteger childIndex;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRCommonTree.m b/runtime/ObjC/Framework/ANTLRCommonTree.m
deleted file mode 100644
index 68c1fc1..0000000
--- a/runtime/ObjC/Framework/ANTLRCommonTree.m
+++ /dev/null
@@ -1,345 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import "ANTLRCommonTree.h"
-
-
-@implementation ANTLRCommonTree
-
-+ (ANTLRCommonTree *)INVALID_NODE
-{
-	return [[ANTLRCommonTree alloc] initWithToken:[ANTLRCommonToken invalidToken]];
-}
-
-+ (ANTLRCommonTree *)invalidNode
-{
-    // Had to cast to ANTLRCommonTree * here, because GCC is dumb.
-	return [[ANTLRCommonTree alloc] initWithToken:ANTLRCommonToken.INVALID_TOKEN];
-}
-
-+ (ANTLRCommonTree *)newTree
-{
-    return [[ANTLRCommonTree alloc] init];
-}
-
-+ (ANTLRCommonTree *)newTreeWithTree:(ANTLRCommonTree *)aTree
-{
-    return [[ANTLRCommonTree alloc] initWithTreeNode:aTree];
-}
-
-+ (ANTLRCommonTree *)newTreeWithToken:(id<ANTLRToken>)aToken
-{
-	return [[ANTLRCommonTree alloc] initWithToken:aToken];
-}
-
-+ (ANTLRCommonTree *)newTreeWithTokenType:(NSInteger)aTType
-{
-	return [[ANTLRCommonTree alloc] initWithTokenType:(NSInteger)aTType];
-}
-
-+ (ANTLRCommonTree *)newTreeWithTokenType:(NSInteger)aTType Text:(NSString *)theText
-{
-	return [[ANTLRCommonTree alloc] initWithTokenType:(NSInteger)aTType Text:theText];
-}
-
-- (id)init
-{
-	self = (ANTLRCommonTree *)[super init];
-	if ( self != nil ) {
-        token = nil;
-		startIndex = -1;
-		stopIndex = -1;
-        parent = nil;
-        childIndex = -1;
-	}
-	return (ANTLRCommonTree *)self;
-}
-
-- (id)initWithTreeNode:(ANTLRCommonTree *)aNode
-{
-	self = (ANTLRCommonTree *)[super init];
-	if ( self != nil ) {
-		token = aNode.token;
-        if ( token ) [token retain];
-		startIndex = aNode.startIndex;
-		stopIndex = aNode.stopIndex;
-        parent = nil;
-        childIndex = -1;
-	}
-	return self;
-}
-
-- (id)initWithToken:(id<ANTLRToken>)aToken
-{
-	self = (ANTLRCommonTree *)[super init];
-	if ( self != nil ) {
-		token = aToken;
-        if ( token ) [token retain];
-		startIndex = -1;
-		stopIndex = -1;
-        parent = nil;
-        childIndex = -1;
-	}
-	return self;
-}
-
-- (id)initWithTokenType:(NSInteger)aTokenType
-{
-	self = (ANTLRCommonTree *)[super init];
-	if ( self != nil ) {
-		token = [[ANTLRCommonToken newToken:aTokenType] retain];
-//		startIndex = token.startIndex;
-		startIndex = -1;
-//		stopIndex = token.stopIndex;
-		stopIndex = -1;
-        parent = nil;
-        childIndex = -1;
-	}
-	return self;
-}
-
-- (id) initWithTokenType:(NSInteger)aTokenType Text:(NSString *)theText
-{
-	self = (ANTLRCommonTree *)[super init];
-	if ( self != nil ) {
-		token = [[ANTLRCommonToken newToken:aTokenType Text:theText] retain];
-//		startIndex = token.startIndex;
-		startIndex = -1;
-//		stopIndex = token.stopIndex;
-		stopIndex = -1;
-        parent = nil;
-        childIndex = -1;
-	}
-	return self;
-}
-
-- (void) dealloc
-{
-    if ( token ) {
-        [token release];
-        token = nil;
-    }
-    if ( parent ) {
-        [parent release];
-        parent = nil;
-    }
-	[super dealloc];
-}
-
-- (id) copyWithZone:(NSZone *)aZone
-{
-    ANTLRCommonTree *copy;
-	
-    //    copy = [[[self class] allocWithZone:aZone] init];
-    copy = [super copyWithZone:aZone]; // allocation occurs in ANTLRBaseTree
-    if ( self.token )
-        copy.token = [self.token copyWithZone:aZone];
-    copy.startIndex = startIndex;
-    copy.stopIndex = stopIndex;
-    copy.parent = (ANTLRCommonTree *)[self.parent copyWithZone:aZone];
-    copy.childIndex = childIndex;
-    return copy;
-}
-
-- (BOOL) isNil
-{
-	return token == nil;
-}
-
-- (ANTLRCommonToken *) getToken
-{
-	return token;
-}
-
-- (void) setToken:(ANTLRCommonToken *) aToken
-{
-	if ( token != aToken ) {
-		if ( token ) [token release];
-		[aToken retain];
-		token = aToken;
-	}
-}
-
-- (ANTLRCommonTree *) dupNode
-{
-    return [ANTLRCommonTree newTreeWithTree:self ];
-}
-
-- (NSInteger)type
-{
-	if (token)
-		return token.type;
-	return ANTLRTokenTypeInvalid;
-}
-
-- (NSString *)text
-{
-	if (token)
-		return token.text;
-	return nil;
-}
-
-- (NSUInteger)line
-{
-	if (token)
-		return token.line;
-	return 0;
-}
-
-- (void) setLine:(NSUInteger)aLine
-{
-    if (token)
-        token.line = aLine;
-}
-
-- (NSUInteger)charPositionInLine
-{
-	if (token)
-		return token.charPositionInLine;
-	return 0;
-}
-
-- (void) setCharPositionInLine:(NSUInteger)pos
-{
-    if (token)
-        token.charPositionInLine = pos;
-}
-
-- (NSInteger) getTokenStartIndex
-{
-	if ( startIndex == -1 && token != nil ) {
-		return [token getTokenIndex];
-	}
-    return startIndex;
-}
-
-- (void) setTokenStartIndex: (NSInteger) aStartIndex
-{
-    startIndex = aStartIndex;
-}
-
-- (NSInteger) getTokenStopIndex
-{
-	if ( stopIndex == -1 && token != nil ) {
-		return [token getTokenIndex];
-	}
-    return stopIndex;
-}
-
-- (void) setTokenStopIndex: (NSInteger) aStopIndex
-{
-    stopIndex = aStopIndex;
-}
-
-#ifdef DONTUSENOMO
-- (NSString *) treeDescription
-{
-	if (children) {
-		NSMutableString *desc = [NSMutableString stringWithString:@"(^"];
-		[desc appendString:[self description]];
-		unsigned int childIdx;
-		for (childIdx = 0; childIdx < [children count]; childIdx++) {
-			[desc appendFormat:@"%@", [[children objectAtIndex:childIdx] treeDescription]];
-		}
-		[desc appendString:@")"];
-		return desc;
-	} else {
-		return [self description];
-	}
-}
-#endif
-
-/** For every node in this subtree, make sure it's start/stop token's
- *  are set.  Walk depth first, visit bottom up.  Only updates nodes
- *  with at least one token index < 0.
- */
-- (void) setUnknownTokenBoundaries
-{
-    if ( children == nil ) {
-        if ( startIndex<0 || stopIndex<0 ) {
-            startIndex = stopIndex = [token getTokenIndex];
-        }
-        return;
-    }
-    for (NSUInteger i=0; i < [children count]; i++) {
-        [[children objectAtIndex:i] setUnknownTokenBoundaries];
-    }
-    if ( startIndex >= 0 && stopIndex >= 0 )
-         return; // already set
-    if ( [children count] > 0 ) {
-        ANTLRCommonTree *firstChild = (ANTLRCommonTree *)[children objectAtIndex:0];
-        ANTLRCommonTree *lastChild = (ANTLRCommonTree *)[children objectAtIndex:[children count]-1];
-        startIndex = [firstChild getTokenStartIndex];
-        stopIndex = [lastChild getTokenStopIndex];
-    }
-}
-
-- (NSInteger) getChildIndex
-{
-    return childIndex;
-}
-
-- (ANTLRCommonTree *) getParent
-{
-    return parent;
-}
-
-- (void) setParent:(ANTLRCommonTree *) t
-{
-    parent = t;
-}
-
-- (void) setChildIndex:(NSInteger) anIndex
-{
-    childIndex = anIndex;
-}
-
-- (NSString *) description
-{
-    return [self toString];
-}
-
-- (NSString *) toString
-{
-    if ( [self isNil] ) {
-        return @"nil";
-    }
-    if ( [self type] == ANTLRTokenTypeInvalid ) {
-        return @"<errornode>";
-    }
-    if ( token==nil ) {
-        return nil;
-    }
-    return token.text;
-}
-
-@synthesize token;
-@synthesize startIndex;
-@synthesize stopIndex;
-@synthesize parent;
-@synthesize childIndex;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRCommonTreeAdaptor.h b/runtime/ObjC/Framework/ANTLRCommonTreeAdaptor.h
deleted file mode 100644
index e79f0ab..0000000
--- a/runtime/ObjC/Framework/ANTLRCommonTreeAdaptor.h
+++ /dev/null
@@ -1,65 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTree.h"
-#import "ANTLRCommonToken.h"
-#import "ANTLRCommonTree.h"
-#import "ANTLRBaseTreeAdaptor.h"
-
-@interface ANTLRCommonTreeAdaptor : ANTLRBaseTreeAdaptor {
-}
-
-+ (ANTLRCommonTree *) newEmptyTree;
-+ (ANTLRCommonTreeAdaptor *)newTreeAdaptor;
-- (id) init;
-- (ANTLRCommonTree *)dupNode:(ANTLRCommonTree *)t;   
-
-- (ANTLRCommonTree *) create:(id<ANTLRToken>) payload;
-//- (ANTLRCommonTree *) createTree:(NSInteger)tokenType fromToken:(ANTLRCommonToken *)aToken;
-//- (ANTLRCommonTree *) createTree:(NSInteger)tokenType fromToken:(ANTLRCommonToken *)aToken Text:(NSString *)text;
-- (id<ANTLRToken>)createToken:(NSInteger)tokenType Text:(NSString *)text;
-- (id<ANTLRToken>)createToken:(id<ANTLRToken>)fromToken;
-- (void) setTokenBoundaries:(ANTLRCommonTree *)t From:(id<ANTLRToken>)startToken To:(id<ANTLRToken>)stopToken;
-- (NSInteger)getTokenStartIndex:(ANTLRCommonTree *)t;
-- (NSInteger)getTokenStopIndex:(ANTLRCommonTree *)t;
-- (NSString *)getText:(ANTLRCommonTree *)t;
-- (void)setText:(ANTLRCommonTree *)t Text:(NSString *)text;
-- (NSInteger)getType:(ANTLRCommonTree *)t;
-- (void) setType:(ANTLRCommonTree *)t Type:(NSInteger)tokenType;
-- (id<ANTLRToken>)getToken:(ANTLRCommonTree *)t;
-- (ANTLRCommonTree *)getChild:(ANTLRCommonTree *)t At:(NSInteger)i;
-- (void) setChild:(ANTLRCommonTree *)t At:(NSInteger)i Child:(ANTLRCommonTree *)child;
-- (NSInteger)getChildCount:(ANTLRCommonTree *)t;
-- (ANTLRCommonTree *)getParent:(ANTLRCommonTree *)t;
-- (void)setParent:(ANTLRCommonTree *)t With:(ANTLRCommonTree *)parent;
-- (NSInteger)getChildIndex:(ANTLRCommonTree *)t;
-- (void)setChildIndex:(ANTLRCommonTree *)t With:(NSInteger)index;
-- (void)replaceChildren:(ANTLRCommonTree *)parent From:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(ANTLRCommonTree *)t;
-- (id)copyWithZone:(NSZone *)zone;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRCommonTreeAdaptor.m b/runtime/ObjC/Framework/ANTLRCommonTreeAdaptor.m
deleted file mode 100644
index 7609698..0000000
--- a/runtime/ObjC/Framework/ANTLRCommonTreeAdaptor.m
+++ /dev/null
@@ -1,240 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import "ANTLRCommonTreeAdaptor.h"
-
-@implementation ANTLRCommonTreeAdaptor
-
-+ (ANTLRCommonTree *) newEmptyTree;
-{
-    return [ANTLRCommonTree newTree];
-}
-
-+ (ANTLRCommonTreeAdaptor *)newTreeAdaptor
-{
-    return[[ANTLRCommonTreeAdaptor alloc] init];
-}
-
-- (id) init
-{
-    self = [super init];
-    if (self) {
-    }
-    return self;
-}
-
-/** Duplicate a node.  This is part of the factory;
- *	override if you want another kind of node to be built.
- *
- *  I could use reflection to prevent having to override this
- *  but reflection is slow.
- */
-- (id) dupNode:(id<ANTLRBaseTree>)t
-{
-    if ( t==nil )
-        return nil;
-    return [ANTLRCommonTree newTree:t];
-}
-
-/** Tell me how to create a token for use with imaginary token nodes.
- *  For example, there is probably no input symbol associated with imaginary
- *  token DECL, but you need to create it as a payload or whatever for
- *  the DECL node as in ^(DECL type ID).
- *
- *  This is a variant of createToken where the new token is derived from
- *  an actual real input token.  Typically this is for converting '{'
- *  tokens to BLOCK etc...  You'll see
- *
- *    r : lc='{' ID+ '}' -> ^(BLOCK[$lc] ID+) ;
- *
- *  If you care what the token payload objects' type is, you should
- *  override this method and any other createToken variant.
- */
-- (ANTLRCommonTree *) create:(ANTLRCommonToken *)aToken
-{
-    return [ANTLRCommonTree newTreeWithToken:aToken];
-}
-
-/** Tell me how to create a token for use with imaginary token nodes.
- *  For example, there is probably no input symbol associated with imaginary
- *  token DECL, but you need to create it as a payload or whatever for
- *  the DECL node as in ^(DECL type ID).
- *
- *  If you care what the token payload objects' type is, you should
- *  override this method and any other createToken variant.
- */
-- (ANTLRCommonTree *)createTree:(NSInteger)tokenType Text:(NSString *)text
-{
-    return [ANTLRCommonTree newTreeWithTokenType:tokenType Text:text];
-}
-
-- (id<ANTLRToken>)createToken:(NSInteger)tokenType Text:(NSString *)text
-{
-    id<ANTLRToken> fromToken = [ANTLRCommonToken newToken:tokenType Text:text];
-    return fromToken;
-}
-
-- (id<ANTLRToken>)createToken:(id<ANTLRToken>)fromToken
-{
-    return [ANTLRCommonToken newTokenWithToken:(ANTLRCommonToken *)fromToken];
-}
-
-/** Track start/stop token for subtree root created for a rule.
- *  Only works with Tree nodes.  For rules that match nothing,
- *  seems like this will yield start=i and stop=i-1 in a nil node.
- *  Might be useful info so I'll not force to be i..i.
- */
-- (void) setTokenBoundaries:(id<ANTLRBaseTree>)aTree From:(id<ANTLRToken>)startToken To:(id<ANTLRToken>)stopToken
-{
-    if ( aTree == nil )
-        return;
-    int startTokIdx = 0;
-    int stopTokIdx = 0;
-    if ( startToken != nil )
-        startTokIdx = [startToken getTokenIndex];
-    if ( stopToken != nil )
-        stopTokIdx = [stopToken getTokenIndex];
-    [(id<ANTLRBaseTree>)aTree setTokenStartIndex:startTokIdx];
-    [(id<ANTLRBaseTree>)aTree setTokenStopIndex:stopTokIdx];
-}
-
-- (NSInteger)getTokenStartIndex:(id<ANTLRBaseTree>) t
-{
-    if ( t == nil )
-        return -1;
-    return [(id<ANTLRBaseTree>)t getTokenStartIndex];
-}
-
-- (NSInteger)getTokenStopIndex:(id<ANTLRBaseTree>) t
-{
-    if ( t == nil )
-        return -1;
-    return [(id<ANTLRBaseTree>)t getTokenStopIndex];
-}
-
-- (NSString *)getText:(ANTLRCommonTree *)t
-{
-    if ( t == nil )
-        return nil;
-    return t.token.text;
-}
-
-- (void)setText:(id<ANTLRBaseTree>)t Text:(NSString *)text
-{
-    if ( t == nil )
-        return;
-}
-
-- (NSInteger)getType:(ANTLRCommonTree *)t
-{
-    if ( t==nil )
-        return ANTLRTokenTypeInvalid;
-    return t.token.type;
-}
-
-- (void) setType:(id<ANTLRBaseTree>)t Type:(NSInteger)tokenType
-{
-    if ( t==nil )
-        return;
-}
-
-/** What is the Token associated with this node?  If
- *  you are not using ANTLRCommonTree, then you must
- *  override this in your own adaptor.
- */
-- (id<ANTLRToken>) getToken:(ANTLRCommonTree *) t
-{
-    if ( [t isKindOfClass:[ANTLRCommonTree class]] ) {
-        return t.token;
-    }
-    return nil; // no idea what to do
-}
-
-- (id<ANTLRBaseTree>) getChild:(id<ANTLRBaseTree>)t At:(NSInteger)i
-{
-    if ( t == nil )
-        return nil;
-    return [(id<ANTLRBaseTree>)t getChild:i];
-}
-
-- (void) setChild:(id<ANTLRBaseTree>)t At:(NSInteger)i Child:(id<ANTLRBaseTree>)child
-{
-    if ( t == nil )
-        return;
-    [(id<ANTLRBaseTree>)t setChild:i With:child];
-}
-
-- (id) deleteChild:(id<ANTLRBaseTree>)t Index:(NSInteger)anIndex
-{
-    return [t deleteChild:anIndex];
-}
-
-- (NSInteger) getChildCount:(id<ANTLRBaseTree>) t
-{
-    if ( t == nil )
-        return 0;
-    return [(id<ANTLRBaseTree>) t getChildCount];
-}
-
-- (id<ANTLRBaseTree>) getParent:(id<ANTLRBaseTree>) t
-{
-    if ( t == nil )
-        return nil;
-    return (id<ANTLRBaseTree>)[t getParent];
-}
-
-- (void) setParent:(id<ANTLRBaseTree>)t With:(id<ANTLRBaseTree>) parent
-{
-    if ( t != nil )
-        [(id<ANTLRBaseTree>) t setParent:(id<ANTLRBaseTree>)parent];
-}
-
-- (NSInteger) getChildIndex:(id<ANTLRBaseTree>) t
-{
-    if ( t == nil )
-        return 0;
-    return [(id<ANTLRBaseTree>) t getChildIndex];
-}
-
-- (void) setChildIndex:(id<ANTLRBaseTree>)t With:(NSInteger)anIndex
-{
-    if ( t!=nil )
-        [(id<ANTLRBaseTree>)t setChildIndex:anIndex];
-}
-
-- (void) replaceChildren:(id<ANTLRBaseTree>)parent From:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id<ANTLRBaseTree>)t
-{
-    if ( parent != nil ) {
-        [(id<ANTLRBaseTree>)parent replaceChildrenFrom:startChildIndex To:stopChildIndex With:t];
-    }
-}
-
-- (id) copyWithZone:(NSZone *)aZone
-{
-    return [[[self class] allocWithZone:aZone] init];
-}
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRCommonTreeNodeStream.h b/runtime/ObjC/Framework/ANTLRCommonTreeNodeStream.h
deleted file mode 100644
index 52efc0f..0000000
--- a/runtime/ObjC/Framework/ANTLRCommonTreeNodeStream.h
+++ /dev/null
@@ -1,120 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRCommonTree.h"
-#import "ANTLRCommonTreeNodeStream.h"
-#import "ANTLRLookaheadStream.h"
-#import "ANTLRTreeNodeStream.h"
-#import "ANTLRTreeIterator.h"
-#import "ANTLRIntArray.h"
-
-@interface ANTLRCommonTreeNodeStream : ANTLRLookaheadStream <ANTLRTreeNodeStream> {
-#define DEFAULT_INITIAL_BUFFER_SIZE 100
-#define INITIAL_CALL_STACK_SIZE 10
-    
-/** Pull nodes from which tree? */
-__strong id root;
-    
-/** If this tree (root) was created from a token stream, track it. */
-__strong id <ANTLRTokenStream> tokens;
-    
-	/** What tree adaptor was used to build these trees */
-__strong ANTLRCommonTreeAdaptor *adaptor;
-    
-/** The tree iterator we using */
-__strong ANTLRTreeIterator *it;
-    
-/** Stack of indexes used for push/pop calls */
-__strong ANTLRIntArray *calls;    
-    
-/** Tree (nil A B C) trees like flat A B C streams */
-BOOL hasNilRoot;
-    
-/** Tracks tree depth.  Level=0 means we're at root node level. */
-NSInteger level;
-}
-@property (retain, getter=getRoot, setter=setRoot:) ANTLRCommonTree *root;
-@property (retain, getter=getTokens,setter=setTokens:) id<ANTLRTokenStream> tokens;
-@property (retain, getter=getTreeAdaptor, setter=setTreeAdaptor:) ANTLRCommonTreeAdaptor *adaptor;
-@property (assign, getter=getLevel, setter=setLevel:) NSInteger level;
-
-+ (ANTLRCommonTreeNodeStream *) newANTLRCommonTreeNodeStream:(ANTLRCommonTree *)theTree;
-+ (ANTLRCommonTreeNodeStream *) newANTLRCommonTreeNodeStream:(id<ANTLRTreeAdaptor>)anAdaptor Tree:(ANTLRCommonTree *)theTree;
-
-- (id) initWithTree:(ANTLRCommonTree *)theTree;
-
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)adaptor Tree:(ANTLRCommonTree *)theTree;
-    
-- (void) reset;
-    
-    /** Pull elements from tree iterator.  Track tree level 0..max_level.
-     *  If nil rooted tree, don't give initial nil and DOWN nor final UP.
-     */
-- (id) nextElement;
-    
-- (BOOL) isEOF:(id<ANTLRBaseTree>) obj;
-- (void) setUniqueNavigationNodes:(BOOL) uniqueNavigationNodes;
-    
-- (id) getTreeSource;
-    
-- (NSString *) getSourceName;
-    
-- (id<ANTLRTokenStream>) getTokenStream;
-    
-- (void) setTokenStream:(id<ANTLRTokenStream>) tokens;
-    
-- (ANTLRCommonTreeAdaptor *) getTreeAdaptor;
-    
-- (void) setTreeAdaptor:(ANTLRCommonTreeAdaptor *) adaptor;
-    
-- (NSInteger) LA:(NSInteger) i;
-    
-    /** Make stream jump to a new location, saving old location.
-     *  Switch back with pop().
-     */
-- (ANTLRCommonTree *)getNode:(NSInteger) i;
-
-- (void) push:(NSInteger) index;
-    
-    /** Seek back to previous index saved during last push() call.
-     *  Return top of stack (return index).
-     */
-- (NSInteger) pop;
-    
-// TREE REWRITE INTERFACE
-    
-- (void) replaceChildren:(id)parent From:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id) t;
-    
-- (NSString *) toStringFromNode:(id<ANTLRBaseTree>)startNode ToNode:(id<ANTLRBaseTree>)stopNode;
-
-/** For debugging; destructive: moves tree iterator to end. */
-- (NSString *) toTokenTypeString;
-
-@property (retain) ANTLRTreeIterator *it;
-@property (retain) ANTLRIntArray *calls;
-@property BOOL hasNilRoot;
-@end
diff --git a/runtime/ObjC/Framework/ANTLRCommonTreeNodeStream.m b/runtime/ObjC/Framework/ANTLRCommonTreeNodeStream.m
deleted file mode 100644
index 23eddee..0000000
--- a/runtime/ObjC/Framework/ANTLRCommonTreeNodeStream.m
+++ /dev/null
@@ -1,249 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import "ANTLRCommonTreeNodeStream.h"
-#import "ANTLRTokenStream.h"
-#import "ANTLRIntStream.h"
-#import "ANTLRCharStream.h"
-#import "AMutableArray.h"
-#import "ANTLRCommonTreeAdaptor.h"
-
-#ifndef DEBUG_DEALLOC
-#define DEBUG_DEALLOC
-#endif
-
-@implementation ANTLRCommonTreeNodeStream
-
-@synthesize root;
-@synthesize tokens;
-@synthesize adaptor;
-@synthesize level;
-
-+ (ANTLRCommonTreeNodeStream *) newANTLRCommonTreeNodeStream:(ANTLRCommonTree *)theTree
-{
-    return [[ANTLRCommonTreeNodeStream alloc] initWithTree:theTree];
-}
-
-+ (ANTLRCommonTreeNodeStream *) newANTLRCommonTreeNodeStream:(id<ANTLRTreeAdaptor>)anAdaptor Tree:(ANTLRCommonTree *)theTree
-{
-    return [[ANTLRCommonTreeNodeStream alloc] initWithTreeAdaptor:anAdaptor Tree:theTree];
-}
-
-- (id) initWithTree:(ANTLRCommonTree *)theTree
-{
-    if ((self = [super init]) != nil ) {
-        adaptor = [[ANTLRCommonTreeAdaptor newTreeAdaptor] retain];
-        root = [theTree retain];
-        navigationNodeEOF = [[adaptor createTree:ANTLRTokenTypeEOF Text:@"EOF"] retain]; // set EOF
-        it = [[ANTLRTreeIterator newANTRLTreeIteratorWithAdaptor:adaptor andTree:root] retain];
-        calls = [[ANTLRIntArray newArrayWithLen:INITIAL_CALL_STACK_SIZE] retain];
-        /** Tree (nil A B C) trees like flat A B C streams */
-        hasNilRoot = NO;
-        level = 0;
-    }
-    return self;
-}
-
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)anAdaptor Tree:(ANTLRCommonTree *)theTree
-{
-    if ((self = [super init]) != nil ) {
-        adaptor = [anAdaptor retain];
-        root = [theTree retain];
-        navigationNodeEOF = [[adaptor createTree:ANTLRTokenTypeEOF Text:@"EOF"] retain]; // set EOF
-        //    it = [root objectEnumerator];
-        it = [[ANTLRTreeIterator newANTRLTreeIteratorWithAdaptor:adaptor andTree:root] retain];
-        calls = [[ANTLRIntArray newArrayWithLen:INITIAL_CALL_STACK_SIZE] retain];
-        /** Tree (nil A B C) trees like flat A B C streams */
-        hasNilRoot = NO;
-        level = 0;
-    }
-    //    eof = [self isEOF]; // make sure tree iterator returns the EOF we want
-    return self;
-}
-
-- (void)dealloc
-{
-#ifdef DEBUG_DEALLOC
-    NSLog( @"called dealloc in ANTLRCommonTreeNodeStream" );
-#endif
-    if ( root ) [root release];
-    if ( tokens ) [tokens release];
-    if ( adaptor ) [adaptor release];
-    if ( it ) [it release];
-    if ( calls ) [calls release];    
-    [super dealloc];
-}
-
-- (void) reset
-{
-    [super reset];
-    [it reset];
-    hasNilRoot = false;
-    level = 0;
-    if ( calls != nil )
-        [calls reset];  // [calls clear]; // in Java
-}
-
-/** Pull elements from tree iterator.  Track tree level 0..max_level.
- *  If nil rooted tree, don't give initial nil and DOWN nor final UP.
- */
-- (id) nextElement
-{
-    id t = [it nextObject];
-    //System.out.println("pulled "+adaptor.getType(t));
-    if ( t == [it up] ) {
-        level--;
-        if ( level==0 && hasNilRoot ) return [it nextObject]; // don't give last UP; get EOF
-    }
-    else if ( t == [it down] )
-        level++;
-    if ( level == 0 && [adaptor isNil:t] ) { // if nil root, scarf nil, DOWN
-        hasNilRoot = true;
-        t = [it nextObject]; // t is now DOWN, so get first real node next
-        level++;
-        t = [it nextObject];
-    }
-    return t;
-}
-
-- (BOOL) isEOF:(id<ANTLRBaseTree>) aTree
-{
-    return [adaptor getType:(ANTLRCommonTree *)aTree] == ANTLRTokenTypeEOF;
-}
-
-- (void) setUniqueNavigationNodes:(BOOL) uniqueNavigationNodes
-{
-}
-
-- (id) getTreeSource
-{
-    return root;
-}
-
-- (NSString *) getSourceName
-{
-    return [[self getTokenStream] getSourceName];
-}
-
-- (id<ANTLRTokenStream>) getTokenStream
-{
-    return tokens;
-}
-
-- (void) setTokenStream:(id<ANTLRTokenStream>)theTokens
-{
-    if ( tokens != theTokens ) {
-        if ( tokens ) [tokens release];
-        [theTokens retain];
-    }
-    tokens = theTokens;
-}
-
-- (ANTLRCommonTreeAdaptor *) getTreeAdaptor
-{
-    return adaptor;
-}
-
-- (void) setTreeAdaptor:(ANTLRCommonTreeAdaptor *) anAdaptor
-{
-    if ( adaptor != anAdaptor ) {
-        if ( adaptor ) [adaptor release];
-        [anAdaptor retain];
-    }
-    adaptor = anAdaptor;
-}
-
-- (ANTLRCommonTree *)getNode:(NSInteger) i
-{
-    @throw [ANTLRRuntimeException newException:@"Absolute node indexes are meaningless in an unbuffered stream"];
-    return nil;
-}
-
-- (NSInteger) LA:(NSInteger) i
-{
-    return [adaptor getType:[self LT:i]];
-}
-
-/** Make stream jump to a new location, saving old location.
- *  Switch back with pop().
- */
-- (void) push:(NSInteger) anIndex
-{
-    if ( calls == nil ) {
-        calls = [[ANTLRIntArray newArrayWithLen:INITIAL_CALL_STACK_SIZE] retain];
-    }
-    [calls push:p]; // save current anIndex
-    [self seek:anIndex];
-}
-
-/** Seek back to previous anIndex saved during last push() call.
- *  Return top of stack (return anIndex).
- */
-- (NSInteger) pop
-{
-    int ret = [calls pop];
-    [self seek:ret];
-    return ret;
-}    
-
-// TREE REWRITE INTERFACE
-
-- (void) replaceChildren:(id) parent From:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id) aTree
-{
-    if ( parent != nil ) {
-        [adaptor replaceChildren:parent From:startChildIndex To:stopChildIndex With:aTree];
-    }
-}
-
-- (NSString *) toStringFromNode:(id<ANTLRBaseTree>)startNode ToNode:(id<ANTLRBaseTree>)stopNode
-{
-    // we'll have to walk from start to stop in tree; we're not keeping
-    // a complete node stream buffer
-    return @"n/a";
-}
-
-/** For debugging; destructive: moves tree iterator to end. */
-- (NSString *) toTokenTypeString
-{
-    [self reset];
-    NSMutableString *buf = [NSMutableString stringWithCapacity:5];
-    id obj = [self LT:1];
-    NSInteger type = [adaptor getType:obj];
-    while ( type != ANTLRTokenTypeEOF ) {
-        [buf appendString:@" "];
-        [buf appendString:[NSString stringWithFormat:@"%d", type]];
-        [self consume];
-        obj = [self LT:1];
-        type = [adaptor getType:obj];
-    }
-    return buf;
-}
-
-@synthesize it;
-@synthesize calls;
-@synthesize hasNilRoot;
-@end
-
diff --git a/runtime/ObjC/Framework/ANTLRDFA.h b/runtime/ObjC/Framework/ANTLRDFA.h
deleted file mode 100644
index 9adedb1..0000000
--- a/runtime/ObjC/Framework/ANTLRDFA.h
+++ /dev/null
@@ -1,82 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRBaseRecognizer.h"
-#import "ANTLRCharStream.h"
-#import "ANTLRNoViableAltException.h"
-
-@interface ANTLRDFA : NSObject {
-	// the tables are set by subclasses to their own static versions.
-	const int *eot;
-	const int *eof;
-	const unichar *min;
-	const unichar *max;
-	const int *accept;
-	const int *special;
-	const int **transition;
-	
-	__strong ANTLRBaseRecognizer *recognizer;
-	NSInteger decisionNumber;
-    NSInteger len;
-}
-
-- (id) initWithRecognizer:(id) theRecognizer;
-// simulate the DFA using the static tables and predict an alternative
-- (NSInteger) predict:(id<ANTLRCharStream>)anInput;
-- (void) noViableAlt:(NSInteger)state Stream:(id<ANTLRIntStream>)anInput;
-
-- (NSInteger) specialStateTransition:(NSInteger)state Stream:(id<ANTLRIntStream>)anInput;
-// - (NSInteger) specialStateTransition:(NSInteger) state;
-//- (unichar) specialTransition:(unichar) state symbol:(NSInteger) symbol;
-
-// hook for debugger support
-- (void) error:(ANTLRNoViableAltException *)nvae;
-
-- (NSString *) description;
-- (BOOL) evaluateSyntacticPredicate:(SEL)synpredFragment;
-
-+ (void) setIsEmittingDebugInfo:(BOOL) shouldEmitDebugInfo;
-
-- (NSInteger)getDecision;
-- (void)setDecision:(NSInteger)aDecison;
-
-- (ANTLRBaseRecognizer *)getRecognizer;
-- (void)setRecognizer:(ANTLRBaseRecognizer *)aRecognizer;
-- (NSInteger)length;
-
-@property const int *eot;
-@property const int *eof;
-@property const unichar *min;
-@property const unichar *max;
-@property const int *accept;
-@property const int *special;
-@property const int **transition;
-
-@property (retain, getter=getRecognizer,setter=setRecognizer:) ANTLRBaseRecognizer *recognizer;
-@property (assign, getter=getDecision,setter=setDecision:) NSInteger decisionNumber;
-@property (assign, getter=getLen,setter=setLen:) NSInteger len;
-@end
diff --git a/runtime/ObjC/Framework/ANTLRDFA.m b/runtime/ObjC/Framework/ANTLRDFA.m
deleted file mode 100644
index b42daf5..0000000
--- a/runtime/ObjC/Framework/ANTLRDFA.m
+++ /dev/null
@@ -1,262 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import "ANTLRDFA.h"
-#import <ANTLRToken.h>
-#import <ANTLRNoViableAltException.h>
-
-NSInteger debug = 0;
-
-@implementation ANTLRDFA
-@synthesize recognizer;
-@synthesize decisionNumber;
-@synthesize len;
-
-- (id) initWithRecognizer:(ANTLRBaseRecognizer *) theRecognizer
-{
-	if ((self = [super init]) != nil) {
-		recognizer = theRecognizer;
-        [recognizer retain];
-        debug = 0;
-	}
-	return self;
-}
-
-// using the tables ANTLR generates for the DFA based prediction this method simulates the DFA
-// and returns the prediction of the alternative to be used.
-- (NSInteger) predict:(id<ANTLRIntStream>)input
-{
-    if ( debug > 2 ) {
-        NSLog(@"Enter DFA.predict for decision %d", decisionNumber);
-    }
-	int aMark = [input mark];
-	int s = 0;
-	@try {
-		while (YES) {
-			if ( debug > 2 )
-                NSLog(@"DFA %d state %d LA(1)='%c'(%x)", decisionNumber, s, (unichar)[input LA:1], [input LA:1]);
-			NSInteger specialState = special[s];
-			if (specialState >= 0) {
-				// this state is special in that it has some code associated with it. we cannot do this in a pure DFA so
-				// we signal the caller accordingly.
-				if ( debug > 2 ) {
-                    NSLog(@"DFA %d state %d is special state %d", decisionNumber, s, specialState);
-                }
-				s = [self specialStateTransition:specialState Stream:input];
-                if ( debug > 2 ) {
-                    NSLog(@"DFA %d returns from special state %d to %d", decisionNumber, specialState, s);
-                }
-                if (s == -1 ) {
-                    [self noViableAlt:s Stream:input];
-                    return 0;
-                }
-				[input consume];
-				continue;
-			}
-			if (accept[s] >= 1) {  // if this is an accepting state return the prediction
-				if ( debug > 2 ) NSLog(@"accept; predict %d from state %d", accept[s], s);
-				return accept[s];
-			}
-			// based on the lookahead lookup the next transition, consume and do transition
-			// or signal that we have no viable alternative
-			int c = [input LA:1];
-			if ( (unichar)c >= min[s] && (unichar)c <= max[s]) {
-				int snext = transition[s][c-min[s]];
-				if (snext < 0) {
-                    // was in range but not a normal transition
-                    // must check EOT, which is like the else clause.
-                    // eot[s]>=0 indicates that an EOT edge goes to another
-                    // state.
-					if (eot[s] >= 0) {
-						if ( debug > 2 ) NSLog(@"EOT transition");
-						s = eot[s];
-						[input consume];
-                        // TODO: I had this as return accept[eot[s]]
-                        // which assumed here that the EOT edge always
-                        // went to an accept...faster to do this, but
-                        // what about predicated edges coming from EOT
-                        // target?
-						continue;
-					}
-					[self noViableAlt:s Stream:input];
-					return 0;
-				}
-				s = snext;
-				[input consume];
-				continue;
-			}
-			
-			if (eot[s] >= 0) {// EOT transition? we may still accept the input in the next state
-				if ( debug > 2 ) NSLog(@"EOT transition");
-				s = eot[s];
-				[input consume];
-				continue;
-			}
-			if ( c == ANTLRTokenTypeEOF && eof[s] >= 0) {  // we are at EOF and may even accept the input.
-				if ( debug > 2 ) NSLog(@"accept via EOF; predict %d from %d", accept[eof[s]], eof[s]);
-				return accept[eof[s]];
-			}
-			if ( debug > 2 ) {
-                NSLog(@"no viable alt!\n");
-                NSLog(@"min[%d] = %d\n", s, min[s]);
-                NSLog(@"max[%d] = %d\n", s, min[s]);
-                NSLog(@"eot[%d] = %d\n", s, min[s]);
-                NSLog(@"eof[%d] = %d\n", s, min[s]);
-                for (NSInteger p = 0; p < self.len; p++) {
-                    NSLog(@"%d ", transition[s][p]);
-                }
-                NSLog(@"\n");
-            }
-			[self noViableAlt:s Stream:input];
-            return 0;
-		}
-	}
-	@finally {
-		[input rewind:aMark];
-	}
-	return 0; // silence warning
-}
-
-- (void) noViableAlt:(NSInteger)state Stream:(id<ANTLRIntStream>)anInput
-{
-	if ([recognizer.state isBacktracking]) {
-		[recognizer.state setFailed:YES];
-		return;
-	}
-	ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newException:decisionNumber state:state stream:anInput];
-	[self error:nvae];
-	@throw nvae;
-}
-
-- (NSInteger) specialStateTransition:(NSInteger)state Stream:(id<ANTLRIntStream>)anInput
-{
-    @throw [ANTLRNoViableAltException newException:-1 state:state stream:anInput];
-	return -1;
-}
-
-- (void) error:(ANTLRNoViableAltException *)nvae
-{
-	// empty, hook for debugger support
-}
-
-- (NSString *) description
-{
-	return @"subclass responsibility";
-}
-
-- (BOOL) evaluateSyntacticPredicate:(SEL)synpredFragment
-{
-	return [recognizer evaluateSyntacticPredicate:synpredFragment];
-}
-
-+ (void) setIsEmittingDebugInfo:(BOOL) shouldEmitDebugInfo
-{
-	debug = shouldEmitDebugInfo;
-}
-
-/** Given a String that has a run-length-encoding of some unsigned shorts
- *  like "\1\2\3\9", convert to short[] {2,9,9,9}.  We do this to avoid
- *  static short[] which generates so much init code that the class won't
- *  compile. :(
- */
-- (short *) unpackEncodedString:(NSString *)encodedString
-{
-    // walk first to find how big it is.
-    int size = 0;
-    for (int i=0; i < [encodedString length]; i+=2) {
-        size += [encodedString characterAtIndex:i];
-    }
-    __strong short *data = (short *)calloc(size, sizeof(short));
-    int di = 0;
-    for (int i=0; i < [encodedString length]; i+=2) {
-        char n = [encodedString characterAtIndex:i];
-        char v = [encodedString characterAtIndex:i+1];
-        // add v n times to data
-        for (int j = 0; j < n; j++) {
-            data[di++] = v;
-        }
-    }
-    return data;
-}
-
-/** Hideous duplication of code, but I need different typed arrays out :( */
-- (char *) unpackEncodedStringToUnsignedChars:(NSString *)encodedString
-{
-    // walk first to find how big it is.
-    int size = 0;
-    for (int i=0; i < [encodedString length]; i+=2) {
-        size += [encodedString characterAtIndex:i];
-    }
-    __strong short *data = (short *)calloc(size, sizeof(short));
-    int di = 0;
-    for (int i=0; i < [encodedString length]; i+=2) {
-        char n = [encodedString characterAtIndex:i];
-        char v = [encodedString characterAtIndex:i+1];
-        // add v n times to data
-        for (int j = 0; j < n; j++) {
-            data[di++] = v;
-        }
-    }
-    return (char *)data;
-}
-
-- (NSInteger)getDecision
-{
-    return decisionNumber;
-}
-
-- (void)setDecision:(NSInteger)aDecison
-{
-    decisionNumber = aDecison;
-}
-
-- (ANTLRBaseRecognizer *)getRecognizer
-{
-    return recognizer;
-}
-
-- (void)setRecognizer:(ANTLRBaseRecognizer *)aRecognizer
-{
-    if ( recognizer != aRecognizer ) {
-        if ( recognizer ) [recognizer release];
-        [aRecognizer retain];
-    }
-    recognizer = aRecognizer;
-}
-
-- (NSInteger)length
-{
-    return len;
-}
-
-@synthesize eot;
-@synthesize eof;
-@synthesize min;
-@synthesize max;
-@synthesize accept;
-@synthesize special;
-@synthesize transition;
-@end
diff --git a/runtime/ObjC/Framework/ANTLRDebug.h b/runtime/ObjC/Framework/ANTLRDebug.h
deleted file mode 100644
index 87383c9..0000000
--- a/runtime/ObjC/Framework/ANTLRDebug.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import "ANTLRDebugEventListener.h"
-#import "ANTLRDebugEventProxy.h"
-#import "ANTLRDebugParser.h"
-#import "ANTLRDebugTokenStream.h"
-#import "ANTLRDebugTreeParser.h"
-#import "ANTLRDebugTreeNodeStream.h"
-#import "ANTLRDebugTreeAdaptor.h"
diff --git a/runtime/ObjC/Framework/ANTLRDebugEventListener.h b/runtime/ObjC/Framework/ANTLRDebugEventListener.h
deleted file mode 100644
index c2bee6c..0000000
--- a/runtime/ObjC/Framework/ANTLRDebugEventListener.h
+++ /dev/null
@@ -1,275 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRToken.h"
-#import "ANTLRRecognitionException.h"
-
-@protocol ANTLRDebugEventListener 
-
-#define ANTLRDebugProtocolVersion 1
-
-/** The parser has just entered a rule.  No decision has been made about
-*  which alt is predicted.  This is fired AFTER init actions have been
-*  executed.  Attributes are defined and available etc...
-*/
-- (void) enterRule:(NSString *)ruleName;
-
-/** Because rules can have lots of alternatives, it is very useful to
-*  know which alt you are entering.  This is 1..n for n alts.
-*/
-- (void) enterAlt:(NSInteger)alt;
-
-/** This is the last thing executed before leaving a rule.  It is
-*  executed even if an exception is thrown.  This is triggered after
-*  error reporting and recovery have occurred (unless the exception is
-											   *  not caught in this rule).  This implies an "exitAlt" event.
-*/
-- (void) exitRule:(NSString *)ruleName;
-
-/** Track entry into any (...) subrule other EBNF construct */
-- (void) enterSubRule:(NSInteger)decisionNumber;
-
-- (void) exitSubRule:(NSInteger)decisionNumber;
-
-/** Every decision, fixed k or arbitrary, has an enter/exit event
-*  so that a GUI can easily track what LT/consume events are
-*  associated with prediction.  You will see a single enter/exit
-*  subrule but multiple enter/exit decision events, one for each
-*  loop iteration.
-*/
-- (void) enterDecision:(NSInteger)decisionNumber;
-
-- (void) exitDecision:(NSInteger)decisionNumber;
-
-/** An input token was consumed; matched by any kind of element.
-*  Trigger after the token was matched by things like match(), matchAny().
-*/
-- (void) consumeToken:(id<ANTLRToken>)t;
-
-/** An off-channel input token was consumed.
-*  Trigger after the token was matched by things like match(), matchAny().
-*  (unless of course the hidden token is first stuff in the input stream).
-*/
-- (void) consumeHiddenToken:(id<ANTLRToken>)t;
-
-/** Somebody (anybody) looked ahead.  Note that this actually gets
-*  triggered by both LA and LT calls.  The debugger will want to know
-*  which Token object was examined.  Like consumeToken, this indicates
-*  what token was seen at that depth.  A remote debugger cannot look
-*  ahead into a file it doesn't have so LT events must pass the token
-*  even if the info is redundant.
-*/
-- (void) LT:(NSInteger)i foundToken:(id<ANTLRToken>)t;
-
-/** The parser is going to look arbitrarily ahead; mark this location,
-*  the token stream's marker is sent in case you need it.
-*/
-- (void) mark:(NSInteger)marker;
-
-/** After an arbitrairly long lookahead as with a cyclic DFA (or with
-*  any backtrack), this informs the debugger that stream should be
-*  rewound to the position associated with marker.
-*/
-- (void) rewind:(NSInteger)marker;
-
-/** Rewind to the input position of the last marker.
-*  Used currently only after a cyclic DFA and just
-*  before starting a sem/syn predicate to get the
-*  input position back to the start of the decision.
-*  Do not "pop" the marker off the state.  mark(i)
-*  and rewind(i) should balance still.
-*/
-- (void) rewind;
-
-- (void) beginBacktrack:(NSInteger)level;
-
-- (void) endBacktrack:(NSInteger)level wasSuccessful:(BOOL)successful;
-
-/** To watch a parser move through the grammar, the parser needs to
-*  inform the debugger what line/charPos it is passing in the grammar.
-*  For now, this does not know how to switch from one grammar to the
-*  other and back for island grammars etc...
-*
-*  This should also allow breakpoints because the debugger can stop
-*  the parser whenever it hits this line/pos.
-*/
-- (void) locationLine:(NSInteger)line column:(NSInteger)pos;
-
-/** A recognition exception occurred such as NoViableAltException.  I made
-*  this a generic event so that I can alter the exception hierachy later
-*  without having to alter all the debug objects.
-*
-*  Upon error, the stack of enter rule/subrule must be properly unwound.
-*  If no viable alt occurs it is within an enter/exit decision, which
-*  also must be rewound.  Even the rewind for each mark must be unwount.
-*  In the Java target this is pretty easy using try/finally, if a bit
-*  ugly in the generated code.  The rewind is generated in DFA.predict()
-*  actually so no code needs to be generated for that.  For languages
-*  w/o this "finally" feature (C++?), the target implementor will have
-*  to build an event stack or something.
-*
-*  Across a socket for remote debugging, only the RecognitionException
-*  data fields are transmitted.  The token object or whatever that
-*  caused the problem was the last object referenced by LT.  The
-*  immediately preceding LT event should hold the unexpected Token or
-*  char.
-*
-*  Here is a sample event trace for grammar:
-*
-*  b : C ({;}A|B) // {;} is there to prevent A|B becoming a set
-*    | D
-*    ;
-*
-*  The sequence for this rule (with no viable alt in the subrule) for
-*  input 'c c' (there are 3 tokens) is:
-*
-*		commence
-*		LT(1)
-*		enterRule b
-*		location 7 1
-*		enter decision 3
-*		LT(1)
-*		exit decision 3
-*		enterAlt1
-*		location 7 5
-*		LT(1)
-*		consumeToken [c/<4>,1:0]
-*		location 7 7
-*		enterSubRule 2
-*		enter decision 2
-*		LT(1)
-*		LT(1)
-*		recognitionException NoViableAltException 2 1 2
-*		exit decision 2
-*		exitSubRule 2
-*		beginResync
-*		LT(1)
-*		consumeToken [c/<4>,1:1]
-*		LT(1)
-*		endResync
-*		LT(-1)
-*		exitRule b
-*		terminate
-*/
-- (void) recognitionException:(ANTLRRecognitionException *)e;
-
-/** Indicates the recognizer is about to consume tokens to resynchronize
-*  the parser.  Any consume events from here until the recovered event
-*  are not part of the parse--they are dead tokens.
-*/
-- (void) beginResync;
-
-/** Indicates that the recognizer has finished consuming tokens in order
-*  to resychronize.  There may be multiple beginResync/endResync pairs
-*  before the recognizer comes out of errorRecovery mode (in which
-*  multiple errors are suppressed).  This will be useful
-*  in a gui where you want to probably grey out tokens that are consumed
-*  but not matched to anything in grammar.  Anything between
-*  a beginResync/endResync pair was tossed out by the parser.
-*/
-- (void) endResync;
-
-/** A semantic predicate was evaluate with this result and action text */
-- (void) semanticPredicate:(NSString *)predicate matched:(BOOL)result;
-
-/** Announce that parsing has begun.  Not technically useful except for
-*  sending events over a socket.  A GUI for example will launch a thread
-*  to connect and communicate with a remote parser.  The thread will want
-*  to notify the GUI when a connection is made.  ANTLR parsers
-*  trigger this upon entry to the first rule (the ruleLevel is used to
-*  figure this out).
-*/
-- (void) commence;
-
-/** Parsing is over; successfully or not.  Mostly useful for telling
-*  remote debugging listeners that it's time to quit.  When the rule
-*  invocation level goes to zero at the end of a rule, we are done
-*  parsing.
-*/
-- (void) terminate;
-
-
-// T r e e  P a r s i n g
-
-/** Input for a tree parser is an AST, but we know nothing for sure
-*  about a node except its type and text (obtained from the adaptor).
-*  This is the analog of the consumeToken method.  Again, the ID is
-*  the hashCode usually of the node so it only works if hashCode is
-*  not implemented.  If the type is UP or DOWN, then
-*  the ID is not really meaningful as it's fixed--there is
-*  just one UP node and one DOWN navigation node.
-*/
-- (void) consumeNode:(NSInteger)nodeHash ofType:(NSInteger)type text:(NSString *)text;
-
-/** The tree parser lookedahead.  If the type is UP or DOWN,
-*  then the ID is not really meaningful as it's fixed--there is
-*  just one UP node and one DOWN navigation node.
-*/
-- (void) LT:(NSInteger)i foundNode:(unsigned)nodeHash ofType:(NSInteger)type text:(NSString *)text;
-
-
-// A S T  E v e n t s
-
-/** A nil was created (even nil nodes have a unique ID...
-*  they are not "null" per se).  As of 4/28/2006, this
-*  seems to be uniquely triggered when starting a new subtree
-*  such as when entering a subrule in automatic mode and when
-*  building a tree in rewrite mode.
-*/
-- (void) createNilNode:(unsigned)hash;
-
-/** Announce a new node built from text */
-- (void) createNode:(unsigned)hash text:(NSString *)text type:(NSInteger)type;
-
-/** Announce a new node built from an existing token */
-- (void) createNode:(unsigned)hash fromTokenAtIndex:(NSInteger)tokenIndex;
-
-/** Make a node the new root of an existing root.  See
-*
-*  Note: the newRootID parameter is possibly different
-*  than the TreeAdaptor.becomeRoot() newRoot parameter.
-*  In our case, it will always be the result of calling
-*  TreeAdaptor.becomeRoot() and not root_n or whatever.
-*
-*  The listener should assume that this event occurs
-*  only when the current subrule (or rule) subtree is
-*  being reset to newRootID.
-*
-*/
-- (void) makeNode:(unsigned)newRootHash parentOf:(unsigned)oldRootHash;
-
-/** Make childID a child of rootID.
-*  @see org.antlr.runtime.tree.TreeAdaptor.addChild()
-*/
-- (void) addChild:(unsigned)childHash toTree:(unsigned)treeHash;
-
-/** Set the token start/stop token index for a subtree root or node */
-- (void) setTokenBoundariesForTree:(unsigned)nodeHash From:(NSUInteger)tokenStartIndex To:(NSUInteger)tokenStopIndex;
-
-- (void) waitForDebuggerConnection;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRDebugEventProxy.h b/runtime/ObjC/Framework/ANTLRDebugEventProxy.h
deleted file mode 100644
index af8cd33..0000000
--- a/runtime/ObjC/Framework/ANTLRDebugEventProxy.h
+++ /dev/null
@@ -1,112 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRParser.h"
-#import "ANTLRDebugEventListener.h"
-#import <sys/socket.h>
-#import <netinet/in.h>
-#import <netinet/tcp.h>
-#include <arpa/inet.h>
-
-// default port for ANTLRWorks
-#define DEFAULT_DEBUGGER_PORT 49001
-
-@interface ANTLRDebugEventProxy : NSObject <ANTLRDebugEventListener> {
-	int serverSocket;
-	
-	struct sockaddr debugger_sockaddr;
-	socklen_t debugger_socklen;
-	int debuggerSocket;
-	NSFileHandle *debuggerFH;
-	
-	NSString *grammarName;
-	int debuggerPort;
-}
-
-- (id) init;
-- (id) initWithGrammarName:(NSString *)aGrammarName debuggerPort:(NSInteger)aPort;
-- (void) waitForDebuggerConnection;
-- (void) waitForAck;
-- (void) sendToDebugger:(NSString *)message;
-- (void) sendToDebugger:(NSString *)message waitForResponse:(BOOL)wait;
-
-- (NSInteger) serverSocket;
-- (void) setServerSocket: (NSInteger) aServerSocket;
-
-- (NSInteger) debuggerSocket;
-- (void) setDebuggerSocket: (NSInteger) aDebuggerSocket;
-
-- (NSString *) grammarName;
-- (void) setGrammarName: (NSString *) aGrammarName;
-
-- (NSInteger) debuggerPort;
-- (void) setDebuggerPort: (NSInteger) aDebuggerPort;
-
-- (NSString *) escapeNewlines:(NSString *)aString;
-
-#pragma mark -
-
-#pragma mark DebugEventListener Protocol
-- (void) enterRule:(NSString *)ruleName;
-- (void) enterAlt:(NSInteger)alt;
-- (void) exitRule:(NSString *)ruleName;
-- (void) enterSubRule:(NSInteger)decisionNumber;
-- (void) exitSubRule:(NSInteger)decisionNumber;
-- (void) enterDecision:(NSInteger)decisionNumber;
-- (void) exitDecision:(NSInteger)decisionNumber;
-- (void) consumeToken:(id<ANTLRToken>)t;
-- (void) consumeHiddenToken:(id<ANTLRToken>)t;
-- (void) LT:(NSInteger)i foundToken:(id<ANTLRToken>)t;
-- (void) mark:(NSInteger)marker;
-- (void) rewind:(NSInteger)marker;
-- (void) rewind;
-- (void) beginBacktrack:(NSInteger)level;
-- (void) endBacktrack:(NSInteger)level wasSuccessful:(BOOL)successful;
-- (void) locationLine:(NSInteger)line column:(NSInteger)pos;
-- (void) recognitionException:(ANTLRRecognitionException *)e;
-- (void) beginResync;
-- (void) endResync;
-- (void) semanticPredicate:(NSString *)predicate matched:(BOOL)result;
-- (void) commence;
-- (void) terminate;
-
-
-#pragma mark Tree Parsing
-- (void) consumeNode:(unsigned)nodeHash ofType:(NSInteger)type text:(NSString *)text;
-- (void) LT:(NSInteger)i foundNode:(unsigned)nodeHash ofType:(NSInteger)type text:(NSString *)text;
-
-
-#pragma mark AST Events
-
-- (void) createNilNode:(unsigned)hash;
-- (void) createNode:(unsigned)hash text:(NSString *)text type:(NSInteger)type;
-- (void) createNode:(unsigned)hash fromTokenAtIndex:(NSInteger)tokenIndex;
-- (void) makeNode:(unsigned)newRootHash parentOf:(unsigned)oldRootHash;
-- (void) addChild:(unsigned)childHash toTree:(unsigned)treeHash;
-- (void) setTokenBoundariesForTree:(unsigned)nodeHash From:(NSInteger)tokenStartIndex To:(NSInteger)tokenStopIndex;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRDebugEventProxy.m b/runtime/ObjC/Framework/ANTLRDebugEventProxy.m
deleted file mode 100644
index f68059a..0000000
--- a/runtime/ObjC/Framework/ANTLRDebugEventProxy.m
+++ /dev/null
@@ -1,370 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import "ANTLRDebugEventProxy.h"
-#import "ANTLRToken+DebuggerSupport.h"
-#include <string.h>
-
-static NSData *newlineData = nil;
-static unsigned lengthOfUTF8Ack = 0;
-
-@implementation ANTLRDebugEventProxy
-
-+ (void) initialize
-{
-	if (!newlineData) newlineData = [@"\n" dataUsingEncoding:NSUTF8StringEncoding];
-	if (!lengthOfUTF8Ack) lengthOfUTF8Ack = [[@"ack\n" dataUsingEncoding:NSUTF8StringEncoding] length];
-}
-
-- (id) init
-{
-	return [self initWithGrammarName:nil debuggerPort:DEFAULT_DEBUGGER_PORT];
-}
-
-- (id) initWithGrammarName:(NSString *)aGrammarName debuggerPort:(NSInteger)aPort
-{
-	self = [super init];
-	if (self) {
-		serverSocket = -1;
-		[self setGrammarName:aGrammarName];
-		if (aPort == -1) aPort = DEFAULT_DEBUGGER_PORT;
-		[self setDebuggerPort:aPort];
-	}
-	return self;
-}
-
-- (void) dealloc
-{
-	if (serverSocket != -1) 
-		shutdown(serverSocket,SHUT_RDWR);
-	serverSocket = -1;
-	[debuggerFH release];
-    [self setGrammarName:nil];
-    [super dealloc];
-}
-
-- (void) waitForDebuggerConnection
-{
-	if (serverSocket == -1) {
-		serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
-		
-		NSAssert1(serverSocket != -1, @"Failed to create debugger socket. %s", strerror(errno));
-		
-		int yes = 1;
-		setsockopt(serverSocket, SOL_SOCKET, SO_KEEPALIVE|SO_REUSEPORT|SO_REUSEADDR|TCP_NODELAY, (void *)&yes, sizeof(NSInteger));
-
-		struct sockaddr_in server_addr;
-		bzero(&server_addr, sizeof(struct sockaddr_in));
-		server_addr.sin_family = AF_INET;
-		server_addr.sin_port = htons([self debuggerPort]);
-		server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
-		NSAssert1( bind(serverSocket, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) != -1, @"bind(2) failed. %s", strerror(errno));
-
-		NSAssert1(listen(serverSocket,50) == 0, @"listen(2) failed. %s", strerror(errno));
-		
-		NSLog(@"ANTLR waiting for debugger attach (grammar %@)", [self grammarName]);
-		
-		debuggerSocket = accept(serverSocket, &debugger_sockaddr, &debugger_socklen);
-		NSAssert1( debuggerSocket != -1, @"accept(2) failed. %s", strerror(errno));
-		
-		debuggerFH = [[NSFileHandle alloc] initWithFileDescriptor:debuggerSocket];
-		[self sendToDebugger:[NSString stringWithFormat:@"ANTLR %d", ANTLRDebugProtocolVersion] waitForResponse:NO];
-		[self sendToDebugger:[NSString stringWithFormat:@"grammar \"%@", [self grammarName]] waitForResponse:NO];
-	}
-}
-
-- (void) waitForAck
-{
-	NSString *response;
-	@try {
-		NSData *newLine = [debuggerFH readDataOfLength:lengthOfUTF8Ack];
-		response = [[NSString alloc] initWithData:newLine encoding:NSUTF8StringEncoding];
-		if (![response isEqualToString:@"ack\n"]) @throw [NSException exceptionWithName:@"ANTLRDebugEventProxy" reason:@"illegal response from debugger" userInfo:nil];
-	}
-	@catch (NSException *e) {
-		NSLog(@"socket died or debugger misbehaved: %@ read <%@>", e, response);
-	}
-	@finally {
-		[response release];
-	}
-}
-
-- (void) sendToDebugger:(NSString *)message
-{
-	[self sendToDebugger:message waitForResponse:YES];
-}
-
-- (void) sendToDebugger:(NSString *)message waitForResponse:(BOOL)wait
-{
-	if (! debuggerFH ) return;
-	[debuggerFH writeData:[message dataUsingEncoding:NSUTF8StringEncoding]];
-	[debuggerFH writeData:newlineData];
-	if (wait) [self waitForAck];
-}
-
-- (NSInteger) serverSocket
-{
-    return serverSocket;
-}
-
-- (void) setServerSocket: (NSInteger) aServerSocket
-{
-    serverSocket = aServerSocket;
-}
-
-- (NSInteger) debuggerSocket
-{
-    return debuggerSocket;
-}
-
-- (void) setDebuggerSocket: (NSInteger) aDebuggerSocket
-{
-    debuggerSocket = aDebuggerSocket;
-}
-
-- (NSString *) grammarName
-{
-    return grammarName; 
-}
-
-- (void) setGrammarName: (NSString *) aGrammarName
-{
-    if (grammarName != aGrammarName) {
-        [aGrammarName retain];
-        [grammarName release];
-        grammarName = aGrammarName;
-    }
-}
-
-- (NSInteger) debuggerPort
-{
-    return debuggerPort;
-}
-
-- (void) setDebuggerPort: (NSInteger) aDebuggerPort
-{
-    debuggerPort = aDebuggerPort;
-}
-
-- (NSString *) escapeNewlines:(NSString *)aString
-{
-	NSMutableString *escapedText;
-	if (aString) {
-		escapedText = [NSMutableString stringWithString:aString];
-		NSRange wholeString = NSMakeRange(0,[escapedText length]);
-		[escapedText replaceOccurrencesOfString:@"%" withString:@"%25" options:0 range:wholeString];
-		[escapedText replaceOccurrencesOfString:@"\n" withString:@"%0A" options:0 range:wholeString];
-		[escapedText replaceOccurrencesOfString:@"\r" withString:@"%0D" options:0 range:wholeString];
-	} else {
-		escapedText = [NSMutableString stringWithString:@""];
-	}
-	return escapedText;
-}
-
-#pragma mark -
-
-#pragma mark DebugEventListener Protocol
-- (void) enterRule:(NSString *)ruleName
-{
-	[self sendToDebugger:[NSString stringWithFormat:@"enterRule %@", ruleName]];
-}
-
-- (void) enterAlt:(NSInteger)alt
-{
-	[self sendToDebugger:[NSString stringWithFormat:@"enterAlt %d", alt]]; 
-}
-
-- (void) exitRule:(NSString *)ruleName
-{
-	[self sendToDebugger:[NSString stringWithFormat:@"exitRule %@", ruleName]];
-}
-
-- (void) enterSubRule:(NSInteger)decisionNumber
-{
-	[self sendToDebugger:[NSString stringWithFormat:@"enterSubRule %d", decisionNumber]];
-}
-
-- (void) exitSubRule:(NSInteger)decisionNumber
-{
-	[self sendToDebugger:[NSString stringWithFormat:@"exitSubRule %d", decisionNumber]];
-}
-
-- (void) enterDecision:(NSInteger)decisionNumber
-{
-	[self sendToDebugger:[NSString stringWithFormat:@"enterDecision %d", decisionNumber]];
-}
-
-- (void) exitDecision:(NSInteger)decisionNumber
-{
-	[self sendToDebugger:[NSString stringWithFormat:@"exitDecision %d", decisionNumber]];
-}
-
-- (void) consumeToken:(id<ANTLRToken>)t
-{
-	[self sendToDebugger:[NSString stringWithFormat:@"consumeToken %@", [self escapeNewlines:[t description]]]];
-}
-
-- (void) consumeHiddenToken:(id<ANTLRToken>)t
-{
-	[self sendToDebugger:[NSString stringWithFormat:@"consumeHiddenToken %@", [self escapeNewlines:[t description]]]];
-}
-
-- (void) LT:(NSInteger)i foundToken:(id<ANTLRToken>)t
-{
-	[self sendToDebugger:[NSString stringWithFormat:@"LT %d %@", i, [self escapeNewlines:[t description]]]];
-}
-
-- (void) mark:(NSInteger)marker
-{
-	[self sendToDebugger:[NSString stringWithFormat:@"mark %d", marker]];
-}
-- (void) rewind:(NSInteger)marker
-{
-	[self sendToDebugger:[NSString stringWithFormat:@"rewind %d", marker]];
-}
-
-- (void) rewind
-{
-	[self sendToDebugger:@"rewind"];
-}
-
-- (void) beginBacktrack:(NSInteger)level
-{
-	[self sendToDebugger:[NSString stringWithFormat:@"beginBacktrack %d", level]];
-}
-
-- (void) endBacktrack:(NSInteger)level wasSuccessful:(BOOL)successful
-{
-	[self sendToDebugger:[NSString stringWithFormat:@"endBacktrack %d %d", level, successful ? 1 : 0]];
-}
-
-- (void) locationLine:(NSInteger)line column:(NSInteger)pos
-{
-	[self sendToDebugger:[NSString stringWithFormat:@"location %d %d", line, pos]];
-}
-
-- (void) recognitionException:(ANTLRRecognitionException *)e
-{
-#warning TODO: recognition exceptions
-	// these must use the names of the corresponding Java exception classes, because ANTLRWorks recreates the exception
-	// objects on the Java side.
-	// Write categories for Objective-C exceptions to provide those names
-}
-
-- (void) beginResync
-{
-	[self sendToDebugger:@"beginResync"];
-}
-	
-- (void) endResync
-{
-	[self sendToDebugger:@"endResync"];
-}
-
-- (void) semanticPredicate:(NSString *)predicate matched:(BOOL)result
-{
-	[self sendToDebugger:[NSString stringWithFormat:@"semanticPredicate %d %@", result?1:0, [self escapeNewlines:predicate]]];
-}
-
-- (void) commence
-{
-	// no need to send event
-}
-
-- (void) terminate
-{
-	[self sendToDebugger:@"terminate"];
-	@try {
-		[debuggerFH closeFile];
-	}
-	@finally {
-#warning TODO: make socket handling robust. too lazy now...
-		shutdown(serverSocket,SHUT_RDWR);
-		serverSocket = -1;
-	}
-}
-
-
-#pragma mark Tree Parsing
-- (void) consumeNode:(unsigned)nodeHash ofType:(NSInteger)type text:(NSString *)text
-{
-	[self sendToDebugger:[NSString stringWithFormat:@"consumeNode %u %d %@",
-		nodeHash,
-		type,
-		[self escapeNewlines:text]
-		]];
-}
-
-- (void) LT:(NSInteger)i foundNode:(unsigned)nodeHash ofType:(NSInteger)type text:(NSString *)text
-{
-	[self sendToDebugger:[NSString stringWithFormat:@"LN %d %u %d %@",
-		i,
-		nodeHash,
-		type,
-		[self escapeNewlines:text]
-		]];
-}
-
-
-#pragma mark AST Events
-
-- (void) createNilNode:(unsigned)hash
-{
-	[self sendToDebugger:[NSString stringWithFormat:@"nilNode %u", hash]];
-}
-
-- (void) createNode:(unsigned)hash text:(NSString *)text type:(NSInteger)type
-{
-	[self sendToDebugger:[NSString stringWithFormat:@"createNodeFromToken %u %d %@", 
-		hash,
-		type,
-		[self escapeNewlines:text]
-		]];
-}
-
-- (void) createNode:(unsigned)hash fromTokenAtIndex:(NSInteger)tokenIndex
-{
-	[self sendToDebugger:[NSString stringWithFormat:@"createNode %u %d", hash, tokenIndex]];
-}
-
-- (void) becomeRoot:(unsigned)newRootHash old:(unsigned)oldRootHash
-{
-	[self sendToDebugger:[NSString stringWithFormat:@"becomeRoot %u %u", newRootHash, oldRootHash]];
-}
-
-- (void) addChild:(unsigned)childHash toTree:(unsigned)treeHash
-{
-	[self sendToDebugger:[NSString stringWithFormat:@"addChild %u %u", treeHash, childHash]];
-}
-
-- (void) setTokenBoundariesForTree:(unsigned)nodeHash From:(NSInteger)tokenStartIndex To:(NSInteger)tokenStopIndex
-{
-	[self sendToDebugger:[NSString stringWithFormat:@"setTokenBoundaries %u %d %d", nodeHash, tokenStartIndex, tokenStopIndex]];
-}
-
-
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRDebugParser.h b/runtime/ObjC/Framework/ANTLRDebugParser.h
deleted file mode 100644
index ed403ef..0000000
--- a/runtime/ObjC/Framework/ANTLRDebugParser.h
+++ /dev/null
@@ -1,57 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRParser.h"
-#import "ANTLRDebugEventProxy.h"
-#import "ANTLRDebugTokenStream.h"
-
-@interface ANTLRDebugParser : ANTLRParser {
-	id<ANTLRDebugEventListener> debugListener;
-}
-
-+ (id) newDebugParser:(id<ANTLRTokenStream>)theStream
-        debugListener:(id<ANTLRDebugEventListener>)debugListener;
-
-+ (id) newDebugParser:(id<ANTLRTokenStream>)theStream
-                state:(ANTLRRecognizerSharedState *)state;
-
-+ (id) newDebugParser:(id<ANTLRTokenStream>)theStream
-        debugListener:(id<ANTLRDebugEventListener>)debugListener
-                state:(ANTLRRecognizerSharedState *)state;
-
-- (id) initWithTokenStream:(id<ANTLRTokenStream>)theStream;
-- (id) initWithTokenStream:(id<ANTLRTokenStream>)theStream
-			  debuggerPort:(NSInteger)portNumber;
-// designated initializer
-- (id) initWithTokenStream:(id<ANTLRTokenStream>)theStream
-			 debugListener:(id<ANTLRDebugEventListener>)theDebugListener
-			  debuggerPort:(NSInteger)portNumber;
-
-- (id<ANTLRDebugEventListener>) debugListener;
-- (void) setDebugListener: (id<ANTLRDebugEventListener>) aDebugListener;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRDebugParser.m b/runtime/ObjC/Framework/ANTLRDebugParser.m
deleted file mode 100644
index f86a8ba..0000000
--- a/runtime/ObjC/Framework/ANTLRDebugParser.m
+++ /dev/null
@@ -1,113 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import "ANTLRDebugParser.h"
-
-
-@implementation ANTLRDebugParser
-
-- (id) initWithTokenStream:(id<ANTLRTokenStream>)theStream
-{
-	return [self initWithTokenStream:theStream debugListener:nil debuggerPort:-1];
-}
-
-- (id) initWithTokenStream:(id<ANTLRTokenStream>)theStream
-			  debuggerPort:(NSInteger)portNumber
-{
-	return [self initWithTokenStream:theStream debugListener:nil debuggerPort:portNumber];
-}
-
-- (id) initWithTokenStream:(id<ANTLRTokenStream>)theStream
-			 debugListener:(id<ANTLRDebugEventListener>)theDebugListener
-			  debuggerPort:(NSInteger)portNumber
-{
-	id<ANTLRDebugEventListener,NSObject> debugger = nil;
-	id<ANTLRTokenStream> tokenStream = nil;
-	if (theDebugListener) {
-		debugger = [(id<ANTLRDebugEventListener,NSObject>)theDebugListener retain];
-		debugger = theDebugListener;
-	} else {
-		debugger = [[ANTLRDebugEventProxy alloc] initWithGrammarName:[self grammarFileName] debuggerPort:portNumber];
-	}
-	if (theStream && ![theStream isKindOfClass:[ANTLRDebugTokenStream class]]) {
-		tokenStream = [[ANTLRDebugTokenStream alloc] initWithTokenStream:theStream debugListener:debugger];
-	} else {
-		tokenStream = [theStream retain];
-		tokenStream = theStream;
-	}
-	self = [super initWithTokenStream:tokenStream];
-	if (self) {
-		[self setDebugListener:debugger];
-		[debugger release];
-		[tokenStream release];
-		[debugListener waitForDebuggerConnection];
-	}
-	return self;
-}
-
-- (void) dealloc
-{
-    [self setDebugListener: nil];
-    [super dealloc];
-}
-
-- (id<ANTLRDebugEventListener>) debugListener
-{
-    return debugListener; 
-}
-
-- (void) setDebugListener: (id<ANTLRDebugEventListener>) aDebugListener
-{
-    if (debugListener != aDebugListener) {
-        [(id<ANTLRDebugEventListener,NSObject>)aDebugListener retain];
-        [(id<ANTLRDebugEventListener,NSObject>)debugListener release];
-        debugListener = aDebugListener;
-    }
-}
-
-#pragma mark -
-#pragma mark Overrides
-
-- (void) beginResync
-{
-	[debugListener beginResync];
-}
-
-- (void) endResync
-{
-	[debugListener endResync];
-}
-- (void)beginBacktracking:(NSInteger)level
-{
-	[debugListener beginBacktrack:level];
-}
-
-- (void)endBacktracking:(NSInteger)level wasSuccessful:(BOOL)successful
-{
-	[debugListener endBacktrack:level wasSuccessful:successful];
-}
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRDebugTokenStream.h b/runtime/ObjC/Framework/ANTLRDebugTokenStream.h
deleted file mode 100644
index 9f6c438..0000000
--- a/runtime/ObjC/Framework/ANTLRDebugTokenStream.h
+++ /dev/null
@@ -1,62 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRParser.h"
-#import "ANTLRTokenStream.h"
-#import "ANTLRTokenSource.h"
-#import "ANTLRDebugTokenStream.h"
-#import "ANTLRDebugEventListener.h"
-
-@interface ANTLRDebugTokenStream : NSObject <ANTLRTokenStream>
-{
-	id<ANTLRDebugEventListener> debugListener;
-	id<ANTLRTokenStream> input;
-	BOOL initialStreamState;
-    NSInteger lastMarker;
-}
-
-- (id) initWithTokenStream:(id<ANTLRTokenStream>)theStream debugListener:(id<ANTLRDebugEventListener>)debugger;
-
-- (id<ANTLRDebugEventListener>) debugListener;
-- (void) setDebugListener: (id<ANTLRDebugEventListener>) aDebugListener;
-
-- (id<ANTLRTokenStream>) input;
-- (void) setInput:(id<ANTLRTokenStream>)aTokenStream;
-
-- (void) consume;
-- (id<ANTLRToken>) getToken:(NSInteger)index;
-- (NSInteger) getIndex;
-- (void) release:(NSInteger)marker;
-- (void) seek:(NSInteger)index;
-- (NSInteger) size;
-- (id<ANTLRTokenSource>) getTokenSource;
-- (NSString *) getSourceName;
-- (NSString *) toString;
-- (NSString *) toStringFromStart:(NSInteger)aStart ToEnd:(NSInteger)aStop;
-- (NSString *) toStringFromToken:(id<ANTLRToken>)startToken ToToken:(id<ANTLRToken>)stopToken;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRDebugTokenStream.m b/runtime/ObjC/Framework/ANTLRDebugTokenStream.m
deleted file mode 100644
index 8a294c9..0000000
--- a/runtime/ObjC/Framework/ANTLRDebugTokenStream.m
+++ /dev/null
@@ -1,204 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import "ANTLRDebugTokenStream.h"
-
-
-@implementation ANTLRDebugTokenStream
-
-
-- (id) initWithTokenStream:(id<ANTLRTokenStream>)theStream debugListener:(id<ANTLRDebugEventListener>)debugger
-{
-	self = [super init];
-	if (self) {
-		[self setDebugListener:debugger];
-		[self setInput:theStream];
-		[self.input LT:1];	// force reading first on-channel token
-		initialStreamState = YES;
-	}
-	return self;
-}
-
-- (void) dealloc
-{
-    [self setDebugListener:nil];
-    self.input = nil;
-    [super dealloc];
-}
-
-
-- (id<ANTLRDebugEventListener>) debugListener
-{
-    return debugListener; 
-}
-
-- (void) setDebugListener: (id<ANTLRDebugEventListener>) aDebugListener
-{
-    if (debugListener != aDebugListener) {
-        [(id<ANTLRDebugEventListener,NSObject>)aDebugListener retain];
-        [(id<ANTLRDebugEventListener,NSObject>)debugListener release];
-        debugListener = aDebugListener;
-    }
-}
-
-- (id<ANTLRTokenStream>) input
-{
-    return input; 
-}
-
-- (void) setInput: (id<ANTLRTokenStream>) aTokenStream
-{
-    if (input != aTokenStream) {
-        if ( input ) [input release];
-        input = aTokenStream;
-        [input retain];
-    }
-}
-
-- (void) consumeInitialHiddenTokens
-{
-	int firstIdx = input.index;
-	for (int i = 0; i<firstIdx; i++)
-		[debugListener consumeHiddenToken:[input getToken:i]];
-	initialStreamState = NO;
-}
-
-#pragma mark -
-#pragma mark Proxy implementation
-
-// anything else that hasn't some debugger event assicioated with it, is simply
-// forwarded to the actual token stream
-- (void) forwardInvocation:(NSInvocation *)anInvocation
-{
-	[anInvocation invokeWithTarget:self.input];
-}
-
-- (void) consume
-{
-	if ( initialStreamState )
-		[self consumeInitialHiddenTokens];
-	int a = input.index;
-	id<ANTLRToken> token = [input LT:1];
-	[input consume];
-	int b = input.index;
-	[debugListener consumeToken:token];
-	if (b > a+1) // must have consumed hidden tokens
-		for (int i = a+1; i < b; i++)
-			[debugListener consumeHiddenToken:[input getToken:i]];
-}
-
-- (NSInteger) mark
-{
-	lastMarker = [input mark];
-	[debugListener mark:lastMarker];
-	return lastMarker;
-}
-
-- (void) rewind
-{
-	[debugListener rewind];
-	[input rewind];
-}
-
-- (void) rewind:(NSInteger)marker
-{
-	[debugListener rewind:marker];
-	[input rewind:marker];
-}
-
-- (id<ANTLRToken>) LT:(NSInteger)k
-{
-	if ( initialStreamState )
-		[self consumeInitialHiddenTokens];
-	[debugListener LT:k foundToken:[input LT:k]];
-	return [input LT:k];
-}
-
-- (NSInteger) LA:(NSInteger)k
-{
-	if ( initialStreamState )
-		[self consumeInitialHiddenTokens];
-	[debugListener LT:k foundToken:[input LT:k]];
-	return [input LA:k];
-}
-
-- (id<ANTLRToken>) getToken:(NSInteger)i
-{
-    return [input getToken:i];
-}
-
-- (NSInteger) getIndex
-{
-    return input.index;
-}
-
-- (void) release:(NSInteger) marker
-{
-}
-
-- (void) seek:(NSInteger)index
-{
-    // TODO: implement seek in dbg interface
-    // db.seek(index);
-    [input seek:index];
-}
-
-- (NSInteger) size
-{
-    return [input size];
-}
-
-- (id<ANTLRTokenSource>) getTokenSource
-{
-    return [input getTokenSource];
-}
-
-- (NSString *) getSourceName
-{
-    return [[input getTokenSource] getSourceName];
-}
-
-- (NSString *) description
-{
-    return [input toString];
-}
-
-- (NSString *) toString
-{
-    return [input toString];
-}
-
-- (NSString *) toStringFromStart:(NSInteger)startIndex ToEnd:(NSInteger)stopIndex
-{
-    return [input toStringFromStart:startIndex ToEnd:stopIndex];
-}
-
-- (NSString *) toStringFromToken:(id<ANTLRToken>)startToken ToToken:(id<ANTLRToken>)stopToken
-{
-    return [input toStringFromStart:[startToken getStart] ToEnd:[stopToken getStopToken]];
-}
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRDebugTreeAdaptor.h b/runtime/ObjC/Framework/ANTLRDebugTreeAdaptor.h
deleted file mode 100644
index f8dd07e..0000000
--- a/runtime/ObjC/Framework/ANTLRDebugTreeAdaptor.h
+++ /dev/null
@@ -1,45 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRParser.h"
-#import "ANTLRCommonTreeAdaptor.h"
-#import "ANTLRDebugEventListener.h"
-
-@interface ANTLRDebugTreeAdaptor : ANTLRBaseTreeAdaptor {
-	id<ANTLRDebugEventListener> debugListener;
-	ANTLRCommonTreeAdaptor *treeAdaptor;
-}
-
-- (id) initWithTreeAdaptor:(ANTLRCommonTreeAdaptor *)aTreeAdaptor debugListener:(id<ANTLRDebugEventListener>)aDebugListener;
-
-- (id<ANTLRDebugEventListener>)debugListener;
-- (void) setDebugListener:(id<ANTLRDebugEventListener>)aDebugListener;
-
-- (ANTLRCommonTreeAdaptor *) getTreeAdaptor;
-- (void) setTreeAdaptor:(ANTLRCommonTreeAdaptor *)aTreeAdaptor;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRDebugTreeAdaptor.m b/runtime/ObjC/Framework/ANTLRDebugTreeAdaptor.m
deleted file mode 100644
index 01c4c6e..0000000
--- a/runtime/ObjC/Framework/ANTLRDebugTreeAdaptor.m
+++ /dev/null
@@ -1,229 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import "ANTLRDebugTreeAdaptor.h"
-
-
-@implementation ANTLRDebugTreeAdaptor
-
-
-- (id) initWithTreeAdaptor:(ANTLRCommonTreeAdaptor *)aTreeAdaptor debugListener:(id<ANTLRDebugEventListener>)aDebugListener
-{
-	self = [super init];
-	if (self) {
-		[self setDebugListener:aDebugListener];
-		[self setTreeAdaptor:aTreeAdaptor];
-	}
-	return self;
-}
-
-- (void) dealloc
-{
-    [self setDebugListener: nil];
-    [self setTreeAdaptor: nil];
-    [super dealloc];
-}
-
-- (id<ANTLRDebugEventListener>) debugListener
-{
-    return debugListener; 
-}
-
-- (void) setDebugListener: (id<ANTLRDebugEventListener>) aDebugListener
-{
-    if (debugListener != aDebugListener) {
-        [(id<ANTLRTreeAdaptor,NSObject>)aDebugListener retain];
-        [(id<ANTLRTreeAdaptor,NSObject>)debugListener release];
-        debugListener = aDebugListener;
-    }
-}
-
-- (ANTLRCommonTreeAdaptor *) getTreeAdaptor
-{
-    return treeAdaptor; 
-}
-
-- (void) setTreeAdaptor: (ANTLRCommonTreeAdaptor *) aTreeAdaptor
-{
-    if (treeAdaptor != aTreeAdaptor) {
-        [aTreeAdaptor retain];
-        [treeAdaptor release];
-        treeAdaptor = aTreeAdaptor;
-    }
-}
-
-#pragma mark -
-#pragma mark Proxy implementation
-
-// anything else that hasn't some debugger event assicioated with it, is simply
-// forwarded to the actual token stream
-- (void) forwardInvocation:(NSInvocation *)anInvocation
-{
-	[anInvocation invokeWithTarget:[self getTreeAdaptor]];
-}
-
-#pragma mark -
-
-#pragma mark Construction
-
-- (id<ANTLRBaseTree>) newANTLRTreeWithToken:(id<ANTLRToken>) payload
-{
-	id<ANTLRBaseTree> newTree = [ANTLRCommonTree newTreeWithToken:payload];
-	[debugListener createNode:[treeAdaptor uniqueIdForTree:newTree] fromTokenAtIndex:[payload getTokenIndex]];
-	return newTree;
-}
-
-- (id<ANTLRBaseTree>) emptyTree
-{
-	id<ANTLRBaseTree> newTree = [treeAdaptor newEmptyTree];
-	[debugListener createNilNode:[treeAdaptor uniqueIdForTree:newTree]];
-	return newTree;
-}
-
-/*	We don't have debug events for those:
- - (id) copyNode:(id<ANTLRBaseTree>)aNode
-{
-}
-- (id) copyTree:(id<ANTLRBaseTree>)aTree
-{
-}
-*/
-
-- (void) addChild:(id<ANTLRBaseTree>)child toTree:(id<ANTLRBaseTree>)aTree
-{
-	[treeAdaptor addChild:child toTree:aTree];
-	[debugListener addChild:[treeAdaptor uniqueIdForTree:child] toTree:[self uniqueIdForTree:aTree]];
-}
-
-- (id<ANTLRBaseTree>) becomeRoot:(id<ANTLRBaseTree>)newRoot old:(id<ANTLRBaseTree>)oldRoot
-{
-	id<ANTLRBaseTree> newTree = [treeAdaptor becomeRoot:newRoot old:oldRoot];
-	[debugListener becomeRoot:[treeAdaptor uniqueIdForTree:newTree] old:[self uniqueIdForTree:oldRoot]];
-	return newTree;
-}
-
-/* handle by forwardInvocation: 
-- (NSUInteger) uniqueIdForTree:(id<ANTLRBaseTree>)aNode
-{
-}
-*/
-
-#pragma mark Rewrite Rules
-
- - (void) addTokenAsChild:(id<ANTLRToken>)child toTree:(id<ANTLRBaseTree>)aTree
-{
-	id<ANTLRBaseTree> newChild = [self newANTLRTreeWithToken:child];
-	[self addChild:newChild toTree:aTree];
-}
-
-- (id<ANTLRBaseTree>) makeToken:(id<ANTLRToken>)newRoot parentOf:(id<ANTLRBaseTree>)oldRoot
-{
-	id<ANTLRBaseTree> newNode = [self newANTLRTreeWithToken:newRoot];
-	return [self becomeRoot:newNode old:oldRoot];
-}
-
-- (id<ANTLRBaseTree>) newANTLRTreeWithTokenType:(NSInteger)tokenType
-{
-	id<ANTLRBaseTree> newTree = [treeAdaptor newANTLRTreeWithTokenType:tokenType];
-	[debugListener createNode:[treeAdaptor uniqueIdForTree:newTree] text:nil type:tokenType];
-	return newTree;
-}
-
-- (id<ANTLRBaseTree>) newANTLRTreeWithTokenType:(NSInteger)tokenType text:(NSString *)tokenText
-{
-	id<ANTLRBaseTree> newTree = [treeAdaptor newANTLRTreeWithTokenType:tokenType text:tokenText];
-	[debugListener createNode:[treeAdaptor uniqueIdForTree:newTree] text:tokenText type:tokenType];
-	return newTree;
-}
-- (id<ANTLRBaseTree>) newANTLRTreeWithToken:(id<ANTLRToken>)fromToken tokenType:(NSInteger)tokenType
-{
-	id<ANTLRBaseTree> newTree = [treeAdaptor newANTLRTreeWithToken:fromToken tokenType:tokenType];
-	[debugListener createNode:[treeAdaptor uniqueIdForTree:newTree] text:fromToken.text type:tokenType];
-	return newTree;
-}
-
-- (id<ANTLRBaseTree>) newANTLRTreeWithToken:(id<ANTLRToken>)fromToken tokenType:(NSInteger)tokenType text:(NSString *)tokenText
-{
-	id<ANTLRBaseTree> newTree = [treeAdaptor newANTLRTreeWithToken:fromToken tokenType:tokenType text:tokenText];
-	[debugListener createNode:[treeAdaptor uniqueIdForTree:newTree] text:tokenText type:tokenType];
-	return newTree;
-}
-
-- (id<ANTLRBaseTree>) newANTLRTreeWithToken:(id<ANTLRToken>)fromToken text:(NSString *)tokenText
-{
-	id<ANTLRBaseTree> newTree = [treeAdaptor newANTLRTreeWithToken:fromToken text:tokenText];
-	[debugListener createNode:[treeAdaptor uniqueIdForTree:newTree] text:tokenText type:fromToken.type];
-	return newTree;
-}
-
-#pragma mark Content
-
-/* handled by forwardInvocation:
-- (NSInteger) tokenTypeForNode:(id<ANTLRBaseTree>)aNode
-{
-}
- 
-- (void) setTokenType:(NSInteger)tokenType forNode:(id)aNode
-{
-}
-
-- (NSString *) textForNode:(id<ANTLRBaseTree>)aNode
-{
-}
- 
-- (void) setText:(NSString *)tokenText forNode:(id<ANTLRBaseTree>)aNode
-{
-}
-*/
-- (void) setBoundariesForTree:(id<ANTLRBaseTree>)aTree fromToken:(id<ANTLRToken>)startToken toToken:(id<ANTLRToken>)stopToken
-{
-	[treeAdaptor setBoundariesForTree:aTree fromToken:startToken toToken:stopToken];
-	if (aTree && startToken && stopToken) {
-		[debugListener setTokenBoundariesForTree:[aTree hash] From:[startToken getTokenIndex] To:[stopToken getTokenIndex]];
-	}
-}
-/* handled by forwardInvocation:
-- (NSInteger) tokenStartIndexForTree:(id<ANTLRBaseTree>)aTree
-{
-}
- 
-- (NSInteger) tokenStopIndexForTree:(id<ANTLRBaseTree>)aTree
-{
-}
-*/
-
-#pragma mark Navigation / Tree Parsing
-/* handled by forwardInvocation:
-- (id<ANTLRBaseTree>) childForNode:(id<ANTLRBaseTree>) aNode atIndex:(NSInteger) i
-{
-}
- 
-- (NSInteger) childCountForTree:(id<ANTLRBaseTree>) aTree
-{
-}
-*/
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRDebugTreeNodeStream.h b/runtime/ObjC/Framework/ANTLRDebugTreeNodeStream.h
deleted file mode 100644
index 733f6fd..0000000
--- a/runtime/ObjC/Framework/ANTLRDebugTreeNodeStream.h
+++ /dev/null
@@ -1,67 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRDebugEventListener.h"
-#import "ANTLRTreeAdaptor.h"
-#import "ANTLRTreeNodeStream.h"
-
-@interface ANTLRDebugTreeNodeStream : NSObject <ANTLRTreeNodeStream> {
-	id<ANTLRDebugEventListener> debugListener;
-	id<ANTLRTreeAdaptor> treeAdaptor;
-	id<ANTLRTreeNodeStream> input;
-	BOOL initialStreamState;
-}
-
-- (id) initWithTreeNodeStream:(id<ANTLRTreeNodeStream>)theStream debugListener:(id<ANTLRDebugEventListener>)debugger;
-
-- (id<ANTLRDebugEventListener>) debugListener;
-- (void) setDebugListener: (id<ANTLRDebugEventListener>) aDebugListener;
-
-- (id<ANTLRTreeNodeStream>) input;
-- (void) setInput: (id<ANTLRTreeNodeStream>) aTreeNodeStream;
-
-- (id<ANTLRTreeAdaptor>) getTreeAdaptor;
-- (void) setTreeAdaptor: (id<ANTLRTreeAdaptor>) aTreeAdaptor;
-
-#pragma mark ANTLRTreeNodeStream conformance
-
-- (id) LT:(NSInteger)k;
-- (id<ANTLRTreeAdaptor>) getTreeAdaptor;
-- (void) setUniqueNavigationNodes:(BOOL)flag;
-
-#pragma mark ANTLRIntStream conformance
-- (void) consume;
-- (NSInteger) LA:(NSUInteger) i;
-- (NSUInteger) mark;
-- (NSUInteger) getIndex;
-- (void) rewind:(NSUInteger) marker;
-- (void) rewind;
-- (void) release:(NSUInteger) marker;
-- (void) seek:(NSUInteger) index;
-- (NSUInteger) size;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRDebugTreeNodeStream.m b/runtime/ObjC/Framework/ANTLRDebugTreeNodeStream.m
deleted file mode 100644
index 37f55de..0000000
--- a/runtime/ObjC/Framework/ANTLRDebugTreeNodeStream.m
+++ /dev/null
@@ -1,175 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import "ANTLRDebugTreeNodeStream.h"
-
-
-@implementation ANTLRDebugTreeNodeStream
-
-- (id) initWithTreeNodeStream:(id<ANTLRTreeNodeStream>)theStream debugListener:(id<ANTLRDebugEventListener>)debugger
-{
-	self = [super init];
-	if (self) {
-		[self setDebugListener:debugger];
-		[self setTreeAdaptor:[theStream treeAdaptor]];
-		[self setInput:theStream];
-	}
-	return self;
-}
-
-- (void) dealloc
-{
-    [self setDebugListener: nil];
-    [self setTreeAdaptor: nil];
-    input = nil;
-    [super dealloc];
-}
-
-- (id<ANTLRDebugEventListener>) debugListener
-{
-    return debugListener; 
-}
-
-- (void) setDebugListener: (id<ANTLRDebugEventListener>) aDebugListener
-{
-    if (debugListener != aDebugListener) {
-        [(id<ANTLRDebugEventListener,NSObject>)aDebugListener retain];
-        [(id<ANTLRDebugEventListener,NSObject>)debugListener release];
-        debugListener = aDebugListener;
-    }
-}
-
-
-- (id<ANTLRTreeAdaptor>) getTreeAdaptor
-{
-    return treeAdaptor; 
-}
-
-- (void) setTreeAdaptor: (id<ANTLRTreeAdaptor>) aTreeAdaptor
-{
-    if (treeAdaptor != aTreeAdaptor) {
-        [(id<ANTLRTreeAdaptor,NSObject>)aTreeAdaptor retain];
-        [(id<ANTLRTreeAdaptor,NSObject>)treeAdaptor release];
-        treeAdaptor = aTreeAdaptor;
-    }
-}
-
-
-- (id<ANTLRTreeNodeStream>) input
-{
-    return input; 
-}
-
-- (void) setInput:(id<ANTLRTreeNodeStream>) aTreeNodeStream
-{
-    if (input != aTreeNodeStream) {
-        [input release];
-        [(id<ANTLRTreeNodeStream,NSObject>)aTreeNodeStream retain];
-    }
-    input = aTreeNodeStream;
-}
-
-
-#pragma mark ANTLRTreeNodeStream conformance
-
-- (id) LT:(NSInteger)k
-{
-	id node = [input LT:k];
-	unsigned hash = [treeAdaptor uniqueIdForTree:node];
-	NSString *text = [treeAdaptor textForNode:node];
-	int type = [treeAdaptor tokenTypeForNode:node];
-	[debugListener LT:k foundNode:hash ofType:type text:text];
-	return node;
-}
-
-- (void) setUniqueNavigationNodes:(BOOL)flag
-{
-	[input setUniqueNavigationNodes:flag];
-}
-
-#pragma mark ANTLRIntStream conformance
-- (void) consume
-{
-	id node = [input LT:1];
-	[input consume];
-	unsigned hash = [treeAdaptor uniqueIdForTree:node];
-	NSString *theText = [treeAdaptor textForNode:node];
-	int aType = [treeAdaptor tokenTypeForNode:node];
-	[debugListener consumeNode:hash ofType:aType text:theText];
-}
-
-- (NSInteger) LA:(NSUInteger) i
-{
-	id<ANTLRBaseTree> node = [self LT:1];
-	return node.type;
-}
-
-- (NSUInteger) mark
-{
-	unsigned lastMarker = [input mark];
-	[debugListener mark:lastMarker];
-	return lastMarker;
-}
-
-- (NSUInteger) getIndex
-{
-	return input.index;
-}
-
-- (void) rewind:(NSUInteger) marker
-{
-	[input rewind:marker];
-	[debugListener rewind:marker];
-}
-
-- (void) rewind
-{
-	[input rewind];
-	[debugListener rewind];
-}
-
-- (void) release:(NSUInteger) marker
-{
-	[input release:marker];
-}
-
-- (void) seek:(NSUInteger) index
-{
-	[input seek:index];
-	// todo: seek missing in debug protocol
-}
-
-- (NSUInteger) size
-{
-	return [input size];
-}
-
-- (NSString *) toStringFromToken:(id)startNode ToToken:(id)stopNode
-{
-    return [input toStringFromToken:(id<ANTLRToken>)startNode ToToken:(id<ANTLRToken>)stopNode];
-}
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRDebugTreeParser.h b/runtime/ObjC/Framework/ANTLRDebugTreeParser.h
deleted file mode 100644
index 171c1e7..0000000
--- a/runtime/ObjC/Framework/ANTLRDebugTreeParser.h
+++ /dev/null
@@ -1,52 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTreeParser.h"
-#import "ANTLRDebugEventProxy.h"
-#import "ANTLRDebugTreeNodeStream.h"
-
-@interface ANTLRDebugTreeParser : ANTLRTreeParser {
-	id<ANTLRDebugEventListener> debugListener;
-}
-
-- (id) initWithTreeNodeStream:(id<ANTLRTreeNodeStream>)theStream;
-- (id) initWithTreeNodeStream:(id<ANTLRTreeNodeStream>)theStream
-				 debuggerPort:(NSInteger)portNumber;
-	// designated initializer
-- (id) initWithTreeNodeStream:(id<ANTLRTreeNodeStream>)theStream
-				debugListener:(id<ANTLRDebugEventListener>)theDebugListener
-				 debuggerPort:(NSInteger)portNumber;
-
-- (id<ANTLRDebugEventListener>) debugListener;
-- (void) setDebugListener: (id<ANTLRDebugEventListener>) aDebugListener;
-
-- (void) recoverFromMismatchedToken:(id<ANTLRIntStream>)inputStream 
-						  exception:(NSException *)e 
-						  tokenType:(ANTLRTokenType)ttype 
-							 follow:(ANTLRBitSet *)follow;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRDebugTreeParser.m b/runtime/ObjC/Framework/ANTLRDebugTreeParser.m
deleted file mode 100644
index 5692993..0000000
--- a/runtime/ObjC/Framework/ANTLRDebugTreeParser.m
+++ /dev/null
@@ -1,128 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import "ANTLRDebugTreeParser.h"
-
-
-@implementation ANTLRDebugTreeParser
-
-- (id) initWithTreeNodeStream:(id<ANTLRTreeNodeStream>)theStream
-{
-	return [self initWithTreeNodeStream:theStream debugListener:nil debuggerPort:-1];
-}
-
-- (id) initWithTreeNodeStream:(id<ANTLRTreeNodeStream>)theStream
-				 debuggerPort:(NSInteger)portNumber
-{
-	return [self initWithTreeNodeStream:theStream debugListener:nil debuggerPort:portNumber];
-}
-
-- (id) initWithTreeNodeStream:(id<ANTLRTreeNodeStream>)theStream
-				debugListener:(id<ANTLRDebugEventListener>)theDebugListener
-				 debuggerPort:(NSInteger)portNumber
-{
-	id<ANTLRDebugEventListener,NSObject> debugger = nil;
-	id<ANTLRTreeNodeStream> treeNodeStream = nil;
-	if (theDebugListener) {
-		debugger = (id<ANTLRDebugEventListener>)theDebugListener;
-	} else {
-		debugger = [[ANTLRDebugEventProxy alloc] initWithGrammarName:[self grammarFileName] debuggerPort:portNumber];
-	}
-	if (theStream && ![theStream isKindOfClass:[ANTLRDebugTreeNodeStream class]]) {
-		treeNodeStream = [[ANTLRDebugTreeNodeStream alloc] initWithTreeNodeStream:theStream debugListener:debugger];
-	} else {
-		treeNodeStream = theStream;
-	}
-	self = [super initWithStream:treeNodeStream];
-	if ( self ) {
-		[self setDebugListener:debugger];
-		//[debugger release];
-		//[treeNodeStream release];
-		[debugListener waitForDebuggerConnection];
-	}
-	return self;
-}
-
-- (void) dealloc
-{
-    [self setDebugListener: nil];
-    [super dealloc];
-}
-
-- (id<ANTLRDebugEventListener>) debugListener
-{
-    return debugListener; 
-}
-
-- (void) setDebugListener: (id<ANTLRDebugEventListener>) aDebugListener
-{
-    if (debugListener != aDebugListener) {
-        [(id<ANTLRDebugEventListener,NSObject>)aDebugListener retain];
-        [(id<ANTLRDebugEventListener,NSObject>)debugListener release];
-        debugListener = aDebugListener;
-    }
-}
-
-#pragma mark -
-#pragma mark Overrides
-
-- (void) beginResync
-{
-	[debugListener beginResync];
-}
-
-- (void) endResync
-{
-	[debugListener endResync];
-}
-- (void)beginBacktracking:(NSInteger)level
-{
-	[debugListener beginBacktrack:level];
-}
-
-- (void)endBacktracking:(NSInteger)level wasSuccessful:(BOOL)successful
-{
-	[debugListener endBacktrack:level wasSuccessful:successful];
-}
-
-- (void) recoverFromMismatchedToken:(id<ANTLRIntStream>)inputStream 
-						  exception:(NSException *)e 
-						  tokenType:(ANTLRTokenType)ttype 
-							 follow:(ANTLRBitSet *)follow
-{
-#warning TODO: recoverFromMismatchedToken in debugger
-	[self recoverFromMismatchedToken:inputStream exception:e follow:follow];
-}
-
-- (void) recoverFromMismatchedSet:(id<ANTLRIntStream>)inputStream
-						exception:(NSException *)e
-						   follow:(ANTLRBitSet *)follow
-{
-#warning TODO: recoverFromMismatchedSet in debugger
-	[super recoverFromMismatchedSet:inputStream];
-}
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRDoubleKeyMap.h b/runtime/ObjC/Framework/ANTLRDoubleKeyMap.h
deleted file mode 100644
index 7885879..0000000
--- a/runtime/ObjC/Framework/ANTLRDoubleKeyMap.h
+++ /dev/null
@@ -1,28 +0,0 @@
-
-#import "AMutableArray.h"
-#import "AMutableDictionary.h"
-#import "ANTLRLinkBase.h"
-/**
- * Sometimes we need to map a key to a value but key is two pieces of data.
- * This nested hash table saves creating a single key each time we access
- * map; avoids mem creation.
- */
-
-@class AMutableArray;
-
-@interface ANTLRDoubleKeyMap : ANTLRLinkBase {
-    AMutableDictionary *data;
-}
-
-- (id) init;
-- (id) setObject:(id)v forKey1:(id)k1 forKey2:(NSString *)k2;
-- (id) objectForKey1:(id)k1 forKey2:(id)k2;
-- (AMutableDictionary *) objectForKey:(id)k1;
-- (NSArray *) valuesForKey:(id)k1;
-- (NSArray *) allKeys1;
-- (AMutableArray *) allKeys2:(id)k1;
-- (NSArray *) values;
-
-@property (retain) AMutableDictionary *data;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRDoubleKeyMap.m b/runtime/ObjC/Framework/ANTLRDoubleKeyMap.m
deleted file mode 100644
index 3642ef0..0000000
--- a/runtime/ObjC/Framework/ANTLRDoubleKeyMap.m
+++ /dev/null
@@ -1,101 +0,0 @@
-#import "ANTLRDoubleKeyMap.h"
-
-@implementation ANTLRDoubleKeyMap
-
-- (id) init
-{
-    self = [super init];
-    if ( self  != nil ) {
-        data = [[AMutableDictionary dictionaryWithCapacity:30] retain];
-    }
-    return self;
-}
-
-- (id) setObject:(id)v forKey1:(id)k1 forKey2:(id)k2
-{
-    AMutableDictionary *data2 = [data objectForKey:k1];
-    id prev = nil;
-    if ( data2 == nil ) {
-        data2 = [AMutableDictionary dictionaryWithCapacity:30];
-        [data setObject:data2 forKey:k1];
-    }
-    else {
-        prev = [data2 objectForKey:k2];
-    }
-    [data2 setObject:v forKey:k2];
-    return prev;
-}
-
-- (id) objectForKey1:(id)k1 forKey2:(id)k2
-{
-    AMutableDictionary *data2 = [data objectForKey:k1];
-    if ( data2 == nil )
-        return nil;
-    return [data2 objectForKey:k2];
-}
-
-- (AMutableDictionary *) objectForKey:(id)k1
-{
-    return [data objectForKey:k1];
-}
-
-
-/**
- * Get all values associated with primary key
- */
-- (NSArray *) valuesForKey:(id)k1
-{
-    AMutableDictionary *data2 = [data objectForKey:k1];
-    if ( data2 == nil )
-        return nil;
-    return [data2 allValues];
-}
-
-
-/**
- * get all primary keys
- */
-- (NSArray *) allKeys1
-{
-    return [data allKeys];
-}
-
-
-/**
- * get all secondary keys associated with a primary key
- */
-- (NSArray *) allKeys2:(id)k1
-{
-    AMutableDictionary * data2 = [data objectForKey:k1];
-    if ( data2 == nil )
-        return nil;
-    return [data2 allKeys];
-}
-
-- (AMutableArray *) values
-{
-//    ANTLRHashMap *s = [[ANTLRHashMap newANTLRHashMapWithLen:30];
-    AMutableArray *s = [AMutableArray arrayWithCapacity:30];
-    
-    for (AMutableDictionary *k2 in [data allValues]) {
-        
-        for ( NSString *v in [k2 allValues]) {
-            [s addObject:v];
-        }
-        
-    }
-    
-    return s;
-}
-
-- (void) dealloc
-{
-#ifdef DEBUG_DEALLOC
-    NSLog( @"called dealloc in ANTLRCommonToken" );
-#endif
-    [data release];
-    [super dealloc];
-}
-
-@synthesize data;
-@end
diff --git a/runtime/ObjC/Framework/ANTLREarlyExitException.h b/runtime/ObjC/Framework/ANTLREarlyExitException.h
deleted file mode 100644
index 07e840d..0000000
--- a/runtime/ObjC/Framework/ANTLREarlyExitException.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRecognitionException.h"
-
-@interface ANTLREarlyExitException : ANTLRRecognitionException {
-	int decisionNumber;
-}
-
-+ (ANTLREarlyExitException *) newException:(id<ANTLRIntStream>)anInputStream decisionNumber:(NSInteger)aDecisionNumber;
-- (id) initWithStream:(id<ANTLRIntStream>)anInputStream decisionNumber:(NSInteger) aDecisionNumber;
-
-@property int decisionNumber;
-@end
-
diff --git a/runtime/ObjC/Framework/ANTLREarlyExitException.m b/runtime/ObjC/Framework/ANTLREarlyExitException.m
deleted file mode 100644
index 81ffb26..0000000
--- a/runtime/ObjC/Framework/ANTLREarlyExitException.m
+++ /dev/null
@@ -1,54 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import "ANTLREarlyExitException.h"
-
-
-@implementation ANTLREarlyExitException
-
-+ (ANTLREarlyExitException *) newException:(id<ANTLRIntStream>) anInputStream decisionNumber:(NSInteger) aDecisionNumber
-{
-	return [[self alloc] initWithStream:anInputStream decisionNumber:aDecisionNumber];
-}
-
-- (id) initWithStream:(id<ANTLRIntStream>)anInputStream decisionNumber:(NSInteger) aDecisionNumber
-{
-	if ((self = [super initWithStream:anInputStream]) != nil) {
-		decisionNumber = aDecisionNumber;
-	}
-	return self;
-}
-
-- (NSString *) description
-{
-	NSMutableString *desc = (NSMutableString *)[super description];
-	[desc appendFormat:@" decision:%d", decisionNumber];
-	return desc;
-}
-
-@synthesize decisionNumber;
-@end
-
diff --git a/runtime/ObjC/Framework/ANTLRError.h b/runtime/ObjC/Framework/ANTLRError.h
index 9a15702..5d974e4 100644
--- a/runtime/ObjC/Framework/ANTLRError.h
+++ b/runtime/ObjC/Framework/ANTLRError.h
@@ -30,6 +30,6 @@
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 // THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-#import <Cocoa/Cocoa.h>
+#import <Foundation/Foundation.h>
 
 #define ANTLRErrorDomain @"ANTLRError"
diff --git a/runtime/ObjC/Framework/ANTLRFailedPredicateException.h b/runtime/ObjC/Framework/ANTLRFailedPredicateException.h
deleted file mode 100644
index afbb653..0000000
--- a/runtime/ObjC/Framework/ANTLRFailedPredicateException.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRecognitionException.h"
-
-
-@interface ANTLRFailedPredicateException : ANTLRRecognitionException
-{
-	NSString *predicate;
-	NSString *ruleName;
-}
-
-@property (retain) NSString *predicate;
-@property (retain) NSString *ruleName;
-
-+ (ANTLRFailedPredicateException *) newException:(NSString *)theRuleName predicate:(NSString *)thePredicate stream:(id<ANTLRIntStream>)theStream;
-- (ANTLRFailedPredicateException *) initWithRuleName:(NSString *)theRuleName predicate:(NSString *)thePredicate stream:(id<ANTLRIntStream>)theStream;
-
-#ifdef DONTUSEYET
-- (NSString *) getPredicate;
-- (void) setPredicate:(NSString *)thePredicate;
-- (NSString *) getRuleName;
-- (void) setRuleName:(NSString *)theRuleName;
-#endif
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRFailedPredicateException.m b/runtime/ObjC/Framework/ANTLRFailedPredicateException.m
deleted file mode 100644
index caf7716..0000000
--- a/runtime/ObjC/Framework/ANTLRFailedPredicateException.m
+++ /dev/null
@@ -1,96 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 20110 Alan Condit
-// 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.
-
-#import "ANTLRFailedPredicateException.h"
-
-
-@implementation ANTLRFailedPredicateException
-
-@synthesize predicate;
-@synthesize ruleName;
-
-+ (ANTLRFailedPredicateException *) newException:(NSString *)theRuleName predicate:(NSString *)thePredicate stream:(id<ANTLRIntStream>)theStream
-{
-	return [[ANTLRFailedPredicateException alloc] initWithRuleName:theRuleName predicate:thePredicate stream:theStream];
-}
-
-- (ANTLRFailedPredicateException *) initWithRuleName:(NSString *)theRuleName predicate:(NSString *)thePredicate stream:(id<ANTLRIntStream>)theStream
-{
-	if ((self = [super initWithStream:theStream])) {
-		[self setPredicate:thePredicate];
-		[self setRuleName:theRuleName];
-	}
-	return self;
-}
-
-- (void) dealloc
-{
-#ifdef DEBUG_DEALLOC
-    NSLog( @"called dealloc in ANTLRFailedPredicateException" );
-#endif
-	[self setPredicate:nil];
-	[self setRuleName:nil];
-	[super dealloc];
-}
-
-- (NSString *) description
-{
-	NSMutableString *desc = (NSMutableString *)[super description];
-	[desc appendFormat:@" rule: %@ predicate failed: %@", ruleName, predicate];
-	return desc;
-}
-
-#ifdef DONTUSEYET
-- (NSString *) getPredicate
-{
-	return predicate;
-}
-
-- (void) setPredicate:(NSString *)thePredicate
-{
-	if (thePredicate != predicate) {
-		[thePredicate retain];
-		if ( predicate ) [predicate release];
-		predicate = thePredicate;
-	}
-}
-
-- (NSString *) getRuleName
-{
-	return ruleName;
-}
-
-- (void) setRuleName:(NSString *)theRuleName
-{
-	if (theRuleName != ruleName) {
-		[theRuleName retain];
-		if ( ruleName ) [ruleName release];
-		ruleName = theRuleName;
-	}
-}
-#endif
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRFastQueue.h b/runtime/ObjC/Framework/ANTLRFastQueue.h
deleted file mode 100644
index f5ba582..0000000
--- a/runtime/ObjC/Framework/ANTLRFastQueue.h
+++ /dev/null
@@ -1,64 +0,0 @@
-//
-//  ANTLRFastQueue.h
-//  ANTLR
-//
-//  Created by Ian Michell on 26/04/2010.
-// [The "BSD licence"]
-// Copyright (c) 2010 Ian Michell 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "AMutableArray.h"
-
-@interface ANTLRFastQueue : NSObject <NSCopying>
-{
-    __strong AMutableArray *data;
-    NSUInteger p;
-    NSUInteger range;
-}
-
-@property (retain) AMutableArray *data;
-@property (assign) NSUInteger p;
-@property (assign) NSUInteger range;
-
-+ (id) newANTLRFastQueue;
-
-- (id) init;
-
-- (id) copyWithZone:(NSZone *)aZone;
-
-- (void) reset;
-- (id) remove;
-- (void) addObject:(id) obj;
-- (NSUInteger) count;
-- (NSUInteger) size;
-- (NSUInteger) range;
-- (id) head;
-- (id) objectAtIndex:(NSUInteger) i;
-- (void) clear;
-- (NSString *) toString;
-- (NSString *) description;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRFastQueue.m b/runtime/ObjC/Framework/ANTLRFastQueue.m
deleted file mode 100644
index 6944b6d..0000000
--- a/runtime/ObjC/Framework/ANTLRFastQueue.m
+++ /dev/null
@@ -1,174 +0,0 @@
-//
-//  ANTLRFastQueue.m
-//  ANTLR
-//
-//  Created by Ian Michell on 26/04/2010.
-// [The "BSD licence"]
-// Copyright (c) 2010 Ian Michell 2010 Alan Condit
-// 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.
-
-#import "ANTLRFastQueue.h"
-#import "ANTLRError.h"
-#import "ANTLRRuntimeException.h"
-
-@implementation ANTLRFastQueue
-
-//@synthesize pool;
-@synthesize data;
-@synthesize p;
-@synthesize range;
-
-+ (id) newANTLRFastQueue
-{
-    return [[ANTLRFastQueue alloc] init];
-}
-
-- (id) init
-{
-	self = [super init];
-	if ( self != nil ) {
-		data = [[AMutableArray arrayWithCapacity:100] retain];
-		p = 0;
-		range = -1;
-	}
-	return self;
-}
-
-- (void) dealloc
-{
-#ifdef DEBUG_DEALLOC
-    NSLog( @"called dealloc in ANTLRFastQueue" );
-#endif
-	if ( data ) [data release];
-	[super dealloc];
-}
-
-- (id) copyWithZone:(NSZone *)aZone
-{
-    ANTLRFastQueue *copy;
-    
-    copy = [[[self class] allocWithZone:aZone] init];
-    copy.data = [data copyWithZone:nil];
-    copy.p = p;
-    copy.range = range;
-    return copy;
-}
-
-// FIXME: Java code has this, it doesn't seem like it needs to be there... Then again a lot of the code in the java runtime is not great...
-- (void) reset
-{
-	[self clear];
-}
-
-- (void) clear
-{
-	p = 0;
-    if ( [data count] )
-        [data removeAllObjects];
-}
-
-- (id) remove
-{
-	id obj = [self objectAtIndex:0];
-	p++;
-	// check to see if we have hit the end of the buffer
-	if ( p == [data count] ) {
-		// if we have, then we need to clear it out
-		[self clear];
-	}
-	return obj;
-}
-
-- (void) addObject:(id) obj
-{
-    [data addObject:obj];
-}
-
-- (NSUInteger) count
-{
-	return [data count];
-}
-
-- (NSUInteger) size
-{
-	return [data count] - p;
-}
-
-- (NSUInteger) range
-{
-    return range;
-}
-
-- (id) head
-{
-	return [self objectAtIndex:0];
-}
-
-- (id) objectAtIndex:(NSUInteger) i
-{
-    NSUInteger absIndex;
-
-    absIndex = p + i;
-	if ( absIndex >= [data count] ) {
-		@throw [ANTLRNoSuchElementException newException:[NSString stringWithFormat:@"queue index %d > last index %d", absIndex, [data count]-1]];
-	}
-	if ( absIndex < 0 ) {
-	    @throw [ANTLRNoSuchElementException newException:[NSString stringWithFormat:@"queue index %d < 0", absIndex]];
-	}
-	if ( absIndex > range ) range = absIndex;
-	return [data objectAtIndex:absIndex];
-}
-
-- (NSString *) toString
-{
-    return [self description];
-}
-
-- (NSString *) description
-{
-	NSMutableString *buf = [NSMutableString stringWithCapacity:30];
-	NSInteger n = [self size];
-	for (NSInteger i = 0; i < n; i++) {
-		[buf appendString:[[self objectAtIndex:i] description]];
-		if ((i + 1) < n) {
-			[buf appendString:@" "];
-		}
-	}
-	return buf;
-}
-
-#ifdef DONTUSENOMO
-- (NSAutoreleasePool *)getPool
-{
-    return pool;
-}
-
-- (void)setPool:(NSAutoreleasePool *)aPool
-{
-    pool = aPool;
-}
-#endif
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRFileStream.h b/runtime/ObjC/Framework/ANTLRFileStream.h
index 6c9a881..a4a931d 100644
--- a/runtime/ObjC/Framework/ANTLRFileStream.h
+++ b/runtime/ObjC/Framework/ANTLRFileStream.h
@@ -29,7 +29,7 @@
 
 /** This is a char buffer stream that is loaded from a file
  *  all at once when you construct the object.  This looks very
- *  much like an ANTLReader or ANTLRInputStream, but it's a special case
+ *  much like an ANTLRReader or ANTLRInputStream, but it's a special case
  *  since we know the exact size of the object to load.  We can avoid lots
  *  of data copying. 
  */
diff --git a/runtime/ObjC/Framework/ANTLRFileStream.m b/runtime/ObjC/Framework/ANTLRFileStream.m
index f0e5417..bbb6fb2 100644
--- a/runtime/ObjC/Framework/ANTLRFileStream.m
+++ b/runtime/ObjC/Framework/ANTLRFileStream.m
@@ -28,7 +28,7 @@
 
 /** This is a char buffer stream that is loaded from a file
  *  all at once when you construct the object.  This looks very
- *  much like an ANTLReader or ANTLRInputStream, but it's a special case
+ *  much like an ANTLRReader or ANTLRInputStream, but it's a special case
  *  since we know the exact size of the object to load.  We can avoid lots
  *  of data copying. 
  */
diff --git a/runtime/ObjC/Framework/ANTLRHashMap.h b/runtime/ObjC/Framework/ANTLRHashMap.h
deleted file mode 100644
index 113cb65..0000000
--- a/runtime/ObjC/Framework/ANTLRHashMap.h
+++ /dev/null
@@ -1,110 +0,0 @@
-//
-//  ANTLRHashMap.h
-//  ANTLR
-//
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRLinkBase.h"
-#import "ANTLRMapElement.h"
-
-#define GLOBAL_SCOPE       0
-#define LOCAL_SCOPE        1
-#define HASHSIZE         101
-#define HBUFSIZE      0x2000
-
-@interface ANTLRHashMap : ANTLRLinkBase {
-    //    TStringPool *fPool;
-    NSInteger Scope;
-    NSInteger LastHash;
-    NSInteger BuffSize;
-    NSUInteger count;
-    NSUInteger ptr;
-    __strong NSMutableData *buffer;
-    __strong ANTLRMapElement **ptrBuffer;
-    NSInteger mode;
-}
-
-// Contruction/Destruction
-+ (id)newANTLRHashMap;
-+ (id)newANTLRHashMapWithLen:(NSInteger)aBuffSize;
-- (id)init;
-- (id)initWithLen:(NSInteger)aBuffSize;
-- (void)dealloc;
-- (ANTLRHashMap *)PushScope:( ANTLRHashMap **)map;
-- (ANTLRHashMap *)PopScope:( ANTLRHashMap **)map;
-
-- (NSInteger)count;
-- (NSInteger)size;
-
-// Instance Methods
-/*    form hash value for string s */
-- (NSInteger)hash:(NSString *)s;
-/*   look for s in ptrBuffer  */
-- (ANTLRHashMap *)findscope:(int)level;
-/*   look for s in ptrBuffer  */
-- (id)lookup:(NSString *)s Scope:(int)scope;
-/*   look for s in ptrBuffer  */
-- (id)install:(ANTLRMapElement *)sym Scope:(int)scope;
-/*   look for s in ptrBuffer  */
-- (void)deleteANTLRHashMap:(ANTLRMapElement *)np;
-- (int)RemoveSym:(NSString *)s;
-- (void)delete_chain:(ANTLRMapElement *)np;
-#ifdef DONTUSEYET
-- (int)bld_symtab:(KW_TABLE *)toknams;
-#endif
-- (ANTLRMapElement **)getptrBuffer;
-- (ANTLRMapElement *)getptrBufferEntry:(int)idx;
-- (void)setptrBuffer:(ANTLRMapElement *)np Index:(int)idx;
-- (NSInteger)getScope;
-- (void)setScope:(NSInteger)i;
-- (ANTLRMapElement *)getTType:(NSString *)name;
-- (ANTLRMapElement *)getNameInList:(NSInteger)ttype;
-- (void)putNode:(NSString *)name TokenType:(NSInteger)ttype;
-- (NSInteger)getMode;
-- (void)setMode:(NSInteger)aMode;
-- (void) insertObject:(id)aRule atIndex:(NSInteger)idx;
-- (id) objectAtIndex:(NSInteger)idx;
-- (void) setObject:(id)aRule atIndex:(NSInteger)idx;
-- (void)addObject:(id)anObject;
-- (ANTLRMapElement *) getName:(NSString *)aName;
-- (void) putName:(NSString *)name Node:(id)aNode;
-
-- (NSEnumerator *)objectEnumerator;
-- (BOOL) hasNext;
-- (ANTLRMapElement *)nextObject;
-
-//@property (copy) TStringPool *fPool;
-@property (getter=getScope, setter=setScope:) NSInteger Scope;
-@property (getter=getLastHash, setter=setLastHash:) NSInteger LastHash;
-
-@property (getter=getMode,setter=setMode:) NSInteger mode;
-@property NSInteger BuffSize;
-@property (getter=getCount, setter=setCount:) NSUInteger count;
-@property (assign) NSUInteger ptr;
-@property (retain, getter=getBuffer, setter=setBuffer:) NSMutableData *buffer;
-@property (assign, getter=getPtrBuffer, setter=setPtrBuffer:) ANTLRMapElement **ptrBuffer;
-@end
diff --git a/runtime/ObjC/Framework/ANTLRHashMap.m b/runtime/ObjC/Framework/ANTLRHashMap.m
deleted file mode 100644
index ab025a9..0000000
--- a/runtime/ObjC/Framework/ANTLRHashMap.m
+++ /dev/null
@@ -1,529 +0,0 @@
-//
-//  ANTLRHashMap.m
-//  ANTLR
-//
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#define SUCCESS (0)
-#define FAILURE (-1)
-
-#import "ANTLRHashMap.h"
-
-static NSInteger itIndex;
-
-/*
- * Start of ANTLRHashMap
- */
-@implementation ANTLRHashMap
-
-@synthesize Scope;
-@synthesize LastHash;
-
-+(id)newANTLRHashMap
-{
-    return [[ANTLRHashMap alloc] init];
-}
-
-+(id)newANTLRHashMapWithLen:(NSInteger)aBuffSize
-{
-    return [[ANTLRHashMap alloc] initWithLen:aBuffSize];
-}
-
--(id)init
-{
-    NSInteger idx;
-    
-    if ((self = [super init]) != nil) {
-        fNext = nil;
-        Scope = 0;
-        ptr = 0;
-        BuffSize = HASHSIZE;
-        buffer = [[NSMutableData dataWithLength:(NSUInteger)BuffSize * sizeof(id)] retain];
-        ptrBuffer = (ANTLRMapElement **) [buffer mutableBytes];
-        if ( fNext != nil ) {
-            Scope = ((ANTLRHashMap *)fNext)->Scope+1;
-            for( idx = 0; idx < BuffSize; idx++ ) {
-                ptrBuffer[idx] = ((ANTLRHashMap *)fNext)->ptrBuffer[idx];
-            }
-        }
-        mode = 0;
-    }
-    return( self );
-}
-
--(id)initWithLen:(NSInteger)aBuffSize
-{
-    NSInteger idx;
-    
-    if ((self = [super init]) != nil) {
-        fNext = nil;
-        BuffSize = aBuffSize;
-        Scope = 0;
-        ptr = 0;
-        buffer = [[NSMutableData dataWithLength:(NSUInteger)BuffSize * sizeof(id)] retain];
-        ptrBuffer = (ANTLRMapElement **) [buffer mutableBytes];
-        if ( fNext != nil ) {
-            Scope = ((ANTLRHashMap *)fNext)->Scope+1;
-            for( idx = 0; idx < BuffSize; idx++ ) {
-                ptrBuffer[idx] = ((ANTLRHashMap *)fNext)->ptrBuffer[idx];
-            }
-        }
-        mode = 0;
-    }
-    return( self );
-}
-
--(void)dealloc
-{
-#ifdef DEBUG_DEALLOC
-    NSLog( @"called dealloc in ANTLRHashMap" );
-#endif
-    ANTLRMapElement *tmp, *rtmp;
-    NSInteger idx;
-
-    if ( self.fNext != nil ) {
-        for( idx = 0; idx < BuffSize; idx++ ) {
-            tmp = ptrBuffer[idx];
-            while ( tmp && tmp != [((ANTLRHashMap *)fNext) getptrBufferEntry:idx] ) {
-                rtmp = tmp;
-                // tmp = [tmp getfNext];
-                tmp = (ANTLRMapElement *)tmp.fNext;
-                [rtmp release];
-            }
-        }
-    }
-    if ( buffer ) [buffer release];
-    [super dealloc];
-}
-
-- (NSInteger)count
-{
-    NSInteger aCnt = 0;
-    
-    for (NSInteger i = 0; i < BuffSize; i++) {
-        if ( ptrBuffer[i] != nil ) {
-            aCnt++;
-        }
-    }
-    return aCnt;
-}
-                          
-- (NSInteger) size
-{
-    NSInteger aSize = 0;
-    
-    for (NSInteger i = 0; i < BuffSize; i++) {
-        if ( ptrBuffer[i] != nil ) {
-            aSize += sizeof(id);
-        }
-    }
-    return aSize;
-}
-                                  
-                                  
--(void)deleteANTLRHashMap:(ANTLRMapElement *)np
-{
-    ANTLRMapElement *tmp, *rtmp;
-    NSInteger idx;
-    
-    if ( self.fNext != nil ) {
-        for( idx = 0; idx < BuffSize; idx++ ) {
-            tmp = ptrBuffer[idx];
-            while ( tmp && tmp != (ANTLRLinkBase *)[((ANTLRHashMap *)fNext) getptrBufferEntry:idx] ) {
-                rtmp = tmp;
-                tmp = [tmp getfNext];
-                [rtmp release];
-            }
-        }
-    }
-}
-
--(ANTLRHashMap *)PushScope:(ANTLRHashMap **)map
-{
-    NSInteger idx;
-    ANTLRHashMap *htmp;
-    
-    htmp = [ANTLRHashMap newANTLRHashMap];
-    if ( *map != nil ) {
-        ((ANTLRHashMap *)htmp)->fNext = *map;
-        [htmp setScope:[((ANTLRHashMap *)htmp->fNext) getScope]+1];
-        for( idx = 0; idx < BuffSize; idx++ ) {
-            htmp->ptrBuffer[idx] = ((ANTLRHashMap *)htmp->fNext)->ptrBuffer[idx];
-        }
-    }
-    //    gScopeLevel++;
-    *map = htmp;
-    return( htmp );
-}
-
--(ANTLRHashMap *)PopScope:(ANTLRHashMap **)map
-{
-    NSInteger idx;
-    ANTLRMapElement *tmp;
-    ANTLRHashMap *htmp;
-    
-    htmp = *map;
-    if ( (*map)->fNext != nil ) {
-        *map = (ANTLRHashMap *)htmp->fNext;
-        for( idx = 0; idx < BuffSize; idx++ ) {
-            if ( htmp->ptrBuffer[idx] == nil ||
-                htmp->ptrBuffer[idx] == (*map)->ptrBuffer[idx] ) {
-                break;
-            }
-            tmp = htmp->ptrBuffer[idx];
-            /*
-             * must deal with parms, locals and labels at some point
-             * can not forget the debuggers
-             */
-            htmp->ptrBuffer[idx] = [tmp getfNext];
-            [tmp release];
-        }
-        *map = (ANTLRHashMap *)htmp->fNext;
-        //        gScopeLevel--;
-    }
-    return( htmp );
-}
-
-#ifdef USERDOC
-/*
- *  HASH        hash entry to get index to table
- *  NSInteger hash( ANTLRHashMap *self, char *s );
- *
- *     Inputs:  char *s             string to find
- *
- *     Returns: NSInteger                 hashed value
- *
- *  Last Revision 9/03/90
- */
-#endif
--(NSInteger)hash:(NSString *)s       /*    form hash value for string s */
-{
-    NSInteger hashval;
-    const char *tmp;
-    
-    tmp = [s cStringUsingEncoding:NSASCIIStringEncoding];
-    for( hashval = 0; *tmp != '\0'; )
-        hashval += *tmp++;
-    self->LastHash = hashval % BuffSize;
-    return( self->LastHash );
-}
-
-#ifdef USERDOC
-/*
- *  FINDSCOPE  search hashed list for entry
- *  ANTLRHashMap *findscope( ANTLRHashMap *self, NSInteger scope );
- *
- *     Inputs:  NSInteger       scope -- scope level to find
- *
- *     Returns: ANTLRHashMap   pointer to ptrBuffer of proper scope level
- *
- *  Last Revision 9/03/90
- */
-#endif
--(ANTLRHashMap *)findscope:(NSInteger)scope
-{
-    if ( self->Scope == scope ) {
-        return( self );
-    }
-    else if ( fNext ) {
-        return( [((ANTLRHashMap *)fNext) findscope:scope] );
-    }
-    return( nil );              /*   not found      */
-}
-
-#ifdef USERDOC
-/*
- *  LOOKUP  search hashed list for entry
- *  ANTLRMapElement *lookup( ANTLRHashMap *self, char *s, NSInteger scope );
- *
- *     Inputs:  char     *s          string to find
- *
- *     Returns: ANTLRMapElement  *           pointer to entry
- *
- *  Last Revision 9/03/90
- */
-#endif
--(id)lookup:(NSString *)s Scope:(NSInteger)scope
-{
-    ANTLRMapElement *np;
-    
-    for( np = self->ptrBuffer[[self hash:s]]; np != nil; np = [np getfNext] ) {
-        if ( [s isEqualToString:[np getName]] ) {
-            return( np );        /*   found it       */
-        }
-    }
-    return( nil );              /*   not found      */
-}
-
-#ifdef USERDOC
-/*
- *  INSTALL search hashed list for entry
- *  NSInteger install( ANTLRHashMap *self, ANTLRMapElement *sym, NSInteger scope );
- *
- *     Inputs:  ANTLRMapElement    *sym   -- symbol ptr to install
- *              NSInteger         scope -- level to find
- *
- *     Returns: Boolean     TRUE   if installed
- *                          FALSE  if already in table
- *
- *  Last Revision 9/03/90
- */
-#endif
--(ANTLRMapElement *)install:(ANTLRMapElement *)sym Scope:(NSInteger)scope
-{
-    ANTLRMapElement *np;
-    
-    np = [self lookup:[sym getName] Scope:scope ];
-    if ( np == nil ) {
-        [sym retain];
-        [sym setFNext:self->ptrBuffer[ self->LastHash ]];
-        self->ptrBuffer[ self->LastHash ] = sym;
-        return( self->ptrBuffer[ self->LastHash ] );
-    }
-    return( nil );            /*   not found      */
-}
-
-#ifdef USERDOC
-/*
- *  RemoveSym  search hashed list for entry
- *  NSInteger RemoveSym( ANTLRHashMap *self, char *s );
- *
- *     Inputs:  char     *s          string to find
- *
- *     Returns: NSInteger      indicator of SUCCESS OR FAILURE
- *
- *  Last Revision 9/03/90
- */
-#endif
--(NSInteger)RemoveSym:(NSString *)s
-{
-    ANTLRMapElement *np, *tmp;
-    NSInteger idx;
-    
-    idx = [self hash:s];
-    for ( tmp = self->ptrBuffer[idx], np = self->ptrBuffer[idx]; np != nil; np = [np getfNext] ) {
-        if ( [s isEqualToString:[np getName]] ) {
-            tmp = [np getfNext];             /* get the next link  */
-            [np release];
-            return( SUCCESS );            /* report SUCCESS     */
-        }
-        tmp = [np getfNext];              //  BAD!!!!!!
-    }
-    return( FAILURE );                    /*   not found      */
-}
-
--(void)delete_chain:(ANTLRMapElement *)np
-{
-    if ( [np getfNext] != nil )
-        [self delete_chain:[np getfNext]];
-    [np dealloc];
-}
-
-#ifdef DONTUSEYET
--(NSInteger)bld_symtab:(KW_TABLE *)toknams
-{
-    NSInteger i;
-    ANTLRMapElement *np;
-    
-    for( i = 0; *(toknams[i].name) != '\0'; i++ ) {
-        // install symbol in ptrBuffer
-        np = [ANTLRMapElement newANTLRMapElement:[NSString stringWithFormat:@"%s", toknams[i].name]];
-        //        np->fType = toknams[i].toknum;
-        [self install:np Scope:0];
-    }
-    return( SUCCESS );
-}
-#endif
-
--(ANTLRMapElement *)getptrBufferEntry:(NSInteger)idx
-{
-    return( ptrBuffer[idx] );
-}
-
--(ANTLRMapElement **)getptrBuffer
-{
-    return( ptrBuffer );
-}
-
--(void)setptrBuffer:(ANTLRMapElement *)np Index:(NSInteger)idx
-{
-    if ( idx < BuffSize ) {
-        [np retain];
-        ptrBuffer[idx] = np;
-    }
-}
-
--(NSInteger)getScope
-{
-    return( Scope );
-}
-
--(void)setScopeScope:(NSInteger)i
-{
-    Scope = i;
-}
-
-- (ANTLRMapElement *)getTType:(NSString *)name
-{
-    return [self lookup:name Scope:0];
-}
-
-/*
- * works only for maplist indexed not by name but by TokenNumber
- */
-- (ANTLRMapElement *)getNameInList:(NSInteger)ttype
-{
-    ANTLRMapElement *np;
-    NSInteger aTType;
-
-    aTType = ttype % BuffSize;
-    for( np = self->ptrBuffer[aTType]; np != nil; np = [np getfNext] ) {
-        if ( [(NSNumber *)np.node integerValue] == ttype ) {
-            return( np );        /*   found it       */
-        }
-    }
-    return( nil );              /*   not found      */
-}
-
-- (ANTLRLinkBase *)getName:(NSString *)name
-{
-    return [self lookup:name Scope:0]; /*  nil if not found      */    
-}
-
-- (void)putNode:(NSString *)name TokenType:(NSInteger)ttype
-{
-    ANTLRMapElement *np;
-    
-    // install symbol in ptrBuffer
-    np = [ANTLRMapElement newANTLRMapElementWithName:[NSString stringWithString:name] Type:ttype];
-    //        np->fType = toknams[i].toknum;
-    [self install:np Scope:0];
-}
-
-- (NSInteger)getMode
-{
-    return mode;
-}
-
-- (void)setMode:(NSInteger)aMode
-{
-    mode = aMode;
-}
-
-- (void) addObject:(id)aRule
-{
-    NSInteger idx;
-
-    idx = [self count];
-    if ( idx >= BuffSize ) {
-        idx %= BuffSize;
-    }
-    ptrBuffer[idx] = aRule;
-}
-
-/* this may have to handle linking into the chain
- */
-- (void) insertObject:(id)aRule atIndex:(NSInteger)idx
-{
-    if ( idx >= BuffSize ) {
-        idx %= BuffSize;
-    }
-    if ( aRule != ptrBuffer[idx] ) {
-        if ( ptrBuffer[idx] ) [ptrBuffer[idx] release];
-        [aRule retain];
-    }
-    ptrBuffer[idx] = aRule;
-}
-
-- (id)objectAtIndex:(NSInteger)idx
-{
-    if ( idx >= BuffSize ) {
-        idx %= BuffSize;
-    }
-    return ptrBuffer[idx];
-}
-
-/* this will never link into the chain
- */
-- (void) setObject:(id)aRule atIndex:(NSInteger)idx
-{
-    if ( idx >= BuffSize ) {
-        idx %= BuffSize;
-    }
-    if ( aRule != ptrBuffer[idx] ) {
-        if ( ptrBuffer[idx] ) [ptrBuffer[idx] release];
-        [aRule retain];
-    }
-    ptrBuffer[idx] = aRule;
-}
-
-- (void)putName:(NSString *)name Node:(id)aNode
-{
-    ANTLRMapElement *np;
-    
-    np = [self lookup:name Scope:0 ];
-    if ( np == nil ) {
-        np = [ANTLRMapElement newANTLRMapElementWithName:name Node:aNode];
-        if ( ptrBuffer[LastHash] )
-            [ptrBuffer[LastHash] release];
-        [np retain];
-        np.fNext = ptrBuffer[ LastHash ];
-        ptrBuffer[ LastHash ] = np;
-    }
-    return;    
-}
-
-- (NSEnumerator *)objectEnumerator
-{
-#pragma mark fix this its broken
-    NSEnumerator *anEnumerator;
-
-    itIndex = 0;
-    return anEnumerator;
-}
-
-- (BOOL)hasNext
-{
-    if (self && [self count] < BuffSize-1) {
-        return YES;
-    }
-    return NO;
-}
-
-- (ANTLRMapElement *)nextObject
-{
-    if (self && itIndex < BuffSize-1) {
-        return ptrBuffer[itIndex];
-    }
-    return nil;
-}
-
-@synthesize BuffSize;
-@synthesize count;
-@synthesize ptr;
-@synthesize ptrBuffer;
-@synthesize buffer;
-@end
diff --git a/runtime/ObjC/Framework/ANTLRHashRule.h b/runtime/ObjC/Framework/ANTLRHashRule.h
deleted file mode 100644
index 75ef581..0000000
--- a/runtime/ObjC/Framework/ANTLRHashRule.h
+++ /dev/null
@@ -1,70 +0,0 @@
-//
-//  ANTLRHashRule.h
-//  ANTLR
-//
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRuleMemo.h"
-#import "ANTLRPtrBuffer.h"
-
-#define GLOBAL_SCOPE       0
-#define LOCAL_SCOPE        1
-#define HASHSIZE         101
-#define HBUFSIZE      0x2000
-
-@interface ANTLRHashRule : ANTLRPtrBuffer {
-    //    TStringPool *fPool;
-    NSInteger LastHash;
-    NSInteger mode;
-}
-
-// Contruction/Destruction
-+ (id)newANTLRHashRule;
-+ (id)newANTLRHashRuleWithLen:(NSInteger)aBuffSize;
-- (id)init;
-- (id)initWithLen:(NSInteger)aBuffSize;
-- (void)dealloc;
-
-- (NSInteger)count;
-- (NSInteger)length;
-- (NSInteger)size;
-
-// Instance Methods
-- (void)deleteANTLRHashRule:(ANTLRRuleMemo *)np;
-- (void)delete_chain:(ANTLRRuleMemo *)np;
-- (ANTLRRuleMemo **)getPtrBuffer;
-- (void)setPtrBuffer:(ANTLRRuleMemo **)np;
-- (NSNumber *)getRuleMemoStopIndex:(NSInteger)aStartIndex;
-- (void)putRuleMemoAtStartIndex:(NSInteger)aStartIndex StopIndex:(NSInteger)aStopIndex;
-- (NSInteger)getMode;
-- (void)setMode:(NSInteger)aMode;
-- (void) insertObject:(ANTLRRuleMemo *)aRule atIndex:(NSInteger)Index;
-- (ANTLRRuleMemo *) objectAtIndex:(NSInteger)Index;
-
-@property (getter=getLastHash, setter=setLastHash:) NSInteger LastHash;
-@property (getter=getMode,setter=setMode:) NSInteger mode;
-@end
diff --git a/runtime/ObjC/Framework/ANTLRHashRule.m b/runtime/ObjC/Framework/ANTLRHashRule.m
deleted file mode 100644
index 3bca78f..0000000
--- a/runtime/ObjC/Framework/ANTLRHashRule.m
+++ /dev/null
@@ -1,279 +0,0 @@
-//
-//  ANTLRHashRule.m
-//  ANTLR
-//
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#define SUCCESS (0)
-#define FAILURE (-1)
-#define ANTLR_MEMO_RULE_UNKNOWN -1
-
-#import "ANTLRHashRule.h"
-
-/*
- * Start of ANTLRHashRule
- */
-@implementation ANTLRHashRule
-
-@synthesize LastHash;
-
-+(id)newANTLRHashRule
-{
-    return [[ANTLRHashRule alloc] init];
-}
-
-+(id)newANTLRHashRuleWithLen:(NSInteger)aBuffSize
-{
-    return [[ANTLRHashRule alloc] initWithLen:aBuffSize];
-}
-
--(id)init
-{
-    self = [super initWithLen:HASHSIZE];
-    if ( self != nil ) {
-    }
-    return( self );
-}
-
--(id)initWithLen:(NSInteger)aBuffSize
-{
-    self = [super initWithLen:aBuffSize];
-    if ( self != nil ) {
-        mode = 0;
-    }
-    return( self );
-}
-
--(void)dealloc
-{
-#ifdef DEBUG_DEALLOC
-    NSLog( @"called dealloc in ANTLRHashRule" );
-#endif
-    ANTLRRuleMemo *tmp, *rtmp;
-    int Index;
-    
-    if ( self.fNext != nil ) {
-        for( Index = 0; Index < BuffSize; Index++ ) {
-            tmp = ptrBuffer[Index];
-            while ( tmp && tmp != ptrBuffer[Index] ) {
-                rtmp = tmp;
-                if ([tmp isKindOfClass:[ANTLRLinkBase class]])
-                    tmp = (ANTLRRuleMemo *)tmp.fNext;
-                else
-                    tmp = nil;
-                [rtmp dealloc];
-            }
-        }
-    }
-    [super dealloc];
-}
-
-- (NSInteger)count
-{
-    NSInteger aCnt = 0;
-    
-    for (int i = 0; i < BuffSize; i++) {
-        if ( ptrBuffer[i] != nil ) {
-            aCnt++;
-        }
-    }
-    return aCnt;
-}
-                          
-- (NSInteger) length
-{
-    return BuffSize;
-}
-
-- (NSInteger) size
-{
-    NSInteger aSize = 0;
-    
-    for (int i = 0; i < BuffSize; i++) {
-        if ( ptrBuffer[i] != nil ) {
-            aSize += sizeof(id);
-        }
-    }
-    return aSize;
-}
-                                  
-                                  
--(void)deleteANTLRHashRule:(ANTLRRuleMemo *)np
-{
-    ANTLRRuleMemo *tmp, *rtmp;
-    int Index;
-    
-    if ( self.fNext != nil ) {
-        for( Index = 0; Index < BuffSize; Index++ ) {
-            tmp = ptrBuffer[Index];
-            while ( tmp && tmp != ptrBuffer[Index ] ) {
-                rtmp = tmp;
-                if ([tmp isKindOfClass:[ANTLRLinkBase class]])
-                    tmp = (ANTLRRuleMemo *)tmp.fNext;
-                else
-                    tmp = nil;
-                [rtmp release];
-            }
-        }
-    }
-}
-
--(void)delete_chain:(ANTLRRuleMemo *)np
-{
-    if ( np.fNext != nil )
-        [self delete_chain:np.fNext];
-    [np dealloc];
-}
-
--(ANTLRRuleMemo **)getPtrBuffer
-{
-    return( ptrBuffer );
-}
-
--(void)setPtrBuffer:(ANTLRRuleMemo **)np
-{
-    ptrBuffer = np;
-}
-
-- (NSNumber *)getRuleMemoStopIndex:(NSInteger)aStartIndex
-{
-    ANTLRRuleMemo *aRule;
-    NSNumber *stopIndex;
-    NSInteger anIndex;
-    
-    anIndex = ( aStartIndex >= BuffSize ) ? aStartIndex % BuffSize : aStartIndex;
-    if ((aRule = ptrBuffer[anIndex]) == nil) {
-        return nil;
-    }
-    stopIndex = [aRule getStopIndex:aStartIndex];
-    return stopIndex;
-}
-
-- (void)putRuleMemo:(ANTLRRuleMemo *)aRule AtStartIndex:(NSInteger)aStartIndex
-{
-    NSInteger anIndex;
-    
-    anIndex = (aStartIndex >= BuffSize) ? aStartIndex %= BuffSize : aStartIndex;
-    if ( ptrBuffer[anIndex] == nil ) {
-        ptrBuffer[anIndex] = aRule;
-        [aRule retain];
-    }
-    else {
-        do {
-            if ( [aRule.startIndex integerValue] == aStartIndex ) {
-                [aRule setStartIndex:aRule.stopIndex];
-                return;
-            }
-            aRule = aRule.fNext;
-        } while ( aRule != nil );
-    }
-}
-
-- (void)putRuleMemoAtStartIndex:(NSInteger)aStartIndex StopIndex:(NSInteger)aStopIndex
-{
-    ANTLRRuleMemo *aRule, *newRule;
-    NSInteger anIndex;
-    NSInteger aMatchIndex;
-
-    anIndex = (aStartIndex >= BuffSize) ? aStartIndex % BuffSize : aStartIndex;
-    aRule = ptrBuffer[anIndex];
-    if ( aRule == nil ) {
-        aRule = [ANTLRRuleMemo newANTLRRuleMemoWithStartIndex:[NSNumber numberWithInteger:aStartIndex]
-                                                    StopIndex:[NSNumber numberWithInteger:aStopIndex]];
-        [aRule retain];
-        ptrBuffer[anIndex] = aRule;
-    }
-    else {
-        aMatchIndex = [aRule.startIndex integerValue];
-        if ( aStartIndex > aMatchIndex ) {
-            if ( aRule != ptrBuffer[anIndex] ) {
-                [aRule retain];
-            }
-            aRule.fNext = ptrBuffer[anIndex];
-            ptrBuffer[anIndex] = aRule;
-            return;
-        }
-        while (aRule.fNext != nil) {
-            aMatchIndex = [((ANTLRRuleMemo *)aRule.fNext).startIndex integerValue];
-            if ( aStartIndex > aMatchIndex ) {
-                newRule = [ANTLRRuleMemo newANTLRRuleMemoWithStartIndex:[NSNumber numberWithInteger:aStartIndex]
-                                                              StopIndex:[NSNumber numberWithInteger:aStopIndex]];
-                [newRule retain];
-                newRule.fNext = aRule.fNext;
-                aRule.fNext = newRule;
-                return;
-            }
-            if ( aMatchIndex == aStartIndex ) {
-                [aRule setStartIndex:aRule.stopIndex];
-                return;
-            }
-            aRule = aRule.fNext;
-        }
-    }
-}
-
-- (NSInteger)getLastHash
-{
-    return LastHash;
-}
-
-- (void)setLastHash:(NSInteger)aHash
-{
-    LastHash = aHash;
-}
-
-- (NSInteger)getMode
-{
-    return mode;
-}
-
-- (void)setMode:(NSInteger)aMode
-{
-    mode = aMode;
-}
-
-- (void) insertObject:(ANTLRRuleMemo *)aRule atIndex:(NSInteger)anIndex
-{
-    NSInteger Index;
-    
-    Index = ( anIndex >= BuffSize ) ? anIndex % BuffSize : anIndex;
-    if (aRule != ptrBuffer[Index]) {
-        if ( ptrBuffer[Index] ) [ptrBuffer[Index] release];
-        [aRule retain];
-    }
-    ptrBuffer[Index] = aRule;
-}
-
-- (ANTLRRuleMemo *)objectAtIndex:(NSInteger)anIndex
-{
-    NSInteger anIdx;
-
-    anIdx = ( anIndex >= BuffSize ) ? anIndex % BuffSize : anIndex;
-    return ptrBuffer[anIdx];
-}
-
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRInputStream.h b/runtime/ObjC/Framework/ANTLRInputStream.h
index 7bbdd6f..5127cdb 100644
--- a/runtime/ObjC/Framework/ANTLRInputStream.h
+++ b/runtime/ObjC/Framework/ANTLRInputStream.h
@@ -6,7 +6,7 @@
 //  Copyright 2011 Alan's MachineWorks. All rights reserved.
 //
 
-#import <Cocoa/Cocoa.h>
+#import <Foundation/Foundation.h>
 #import "AntlrReaderStream.h"
 
 @interface ANTLRInputStream : ANTLRReaderStream {
@@ -16,15 +16,15 @@
 @property (assign) NSStringEncoding encoding;
 
 + (id) newANTLRInputStream;
-+ (id) newANTLRInputStream:(NSFileHandle *)anInput;
-+ (id) newANTLRInputStream:(NSFileHandle *)anInput size:(NSInteger)theSize;
-+ (id) newANTLRInputStream:(NSFileHandle *)anInput encoding:(NSStringEncoding)theEncoding;
-+ (id) newANTLRInputStream:(NSFileHandle *)anInput
++ (id) newANTLRInputStream:(NSInputStream *)anInput;
++ (id) newANTLRInputStream:(NSInputStream *)anInput size:(NSInteger)theSize;
++ (id) newANTLRInputStream:(NSInputStream *)anInput encoding:(NSStringEncoding)theEncoding;
++ (id) newANTLRInputStream:(NSInputStream *)anInput
                       size:(NSInteger)theSize
             readBufferSize:(NSInteger)theRBSize
                   encoding:(NSStringEncoding)theEncoding;
 - (id) init;
-- (id) initWithInput:(NSFileHandle *)anInput
+- (id) initWithInput:(NSInputStream *)anInput
                 size:(NSInteger)theSize
       readBufferSize:(NSInteger)theRBSize
             encoding:(NSStringEncoding)theEncoding;
diff --git a/runtime/ObjC/Framework/ANTLRInputStream.m b/runtime/ObjC/Framework/ANTLRInputStream.m
index 3d041c5..ca5bc4a 100644
--- a/runtime/ObjC/Framework/ANTLRInputStream.m
+++ b/runtime/ObjC/Framework/ANTLRInputStream.m
@@ -6,7 +6,7 @@
 //  Copyright 2011 Alan's MachineWorks. All rights reserved.
 //
 
-#import <Cocoa/Cocoa.h>
+#import <Foundation/Foundation.h>
 #import "ANTLRInputStream.h"
 
 
@@ -19,22 +19,22 @@
     return [[ANTLRInputStream alloc] init];
 }
 
-+ (id) newANTLRInputStream:(NSFileHandle *)anInput
++ (id) newANTLRInputStream:(NSInputStream *)anInput
 {
     return [[ANTLRInputStream alloc] initWithInput:anInput size:ANTLRReaderStream.INITIAL_BUFFER_SIZE readBufferSize:ANTLRReaderStream.READ_BUFFER_SIZE encoding:NSASCIIStringEncoding];
 }
 
-+ (id) newANTLRInputStream:(NSFileHandle *)anInput size:(NSInteger)theSize
++ (id) newANTLRInputStream:(NSInputStream *)anInput size:(NSInteger)theSize
 {
     return [[ANTLRInputStream alloc] initWithInput:anInput size:theSize readBufferSize:ANTLRReaderStream.READ_BUFFER_SIZE encoding:NSASCIIStringEncoding];
 }
 
-+ (id) newANTLRInputStream:(NSFileHandle *)anInput encoding:(NSStringEncoding)theEncoding
++ (id) newANTLRInputStream:(NSInputStream *)anInput encoding:(NSStringEncoding)theEncoding
 {
     return [[ANTLRInputStream alloc] initWithInput:anInput size:ANTLRReaderStream.INITIAL_BUFFER_SIZE readBufferSize:ANTLRReaderStream.READ_BUFFER_SIZE encoding:theEncoding];
 }
 
-+ (id) newANTLRInputStream:(NSFileHandle *)anInput
++ (id) newANTLRInputStream:(NSInputStream *)anInput
                       size:(NSInteger)theSize
             readBufferSize:(NSInteger)theRBSize
                   encoding:(NSStringEncoding)theEncoding
@@ -48,14 +48,14 @@
     return self;
 }
 
-- (id) initWithInput:(NSFileHandle *)anInput
+- (id) initWithInput:(NSInputStream *)anInput
                 size:(NSInteger)theSize
       readBufferSize:(NSInteger)theRBSize
             encoding:(NSStringEncoding)theEncoding
 {
-    ;self = [super initWithReader:anInput size:theSize readBufferSize:theRBSize];
+    self = [super initWithReader:anInput size:theSize readBufferSize:theRBSize];
     if ( self != nil ) {
-        //[self load:theSize readBufferSize:theRBSize];
+        //[self load:theSize readBufferSize:theRBSize]; // load called in super class
     }
     return self;
 }
diff --git a/runtime/ObjC/Framework/ANTLRIntArray.h b/runtime/ObjC/Framework/ANTLRIntArray.h
deleted file mode 100644
index 9182377..0000000
--- a/runtime/ObjC/Framework/ANTLRIntArray.h
+++ /dev/null
@@ -1,74 +0,0 @@
-//
-//  ANTLRIntArray.h
-//  ANTLR
-//
-// Copyright (c) 2010 Ian Michell 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-
-#define ANTLR_INT_ARRAY_INITIAL_SIZE 10
-
-@interface ANTLRIntArray : NSObject 
-{
-    NSUInteger BuffSize;
-    NSUInteger count;
-    NSInteger idx;
-    NSMutableData *buffer;
-    __strong NSInteger *intBuffer;
-    BOOL SPARSE;
-}
-
-+ (ANTLRIntArray *)newArray;
-+ (ANTLRIntArray *)newArrayWithLen:(NSUInteger)aLen;
-
-- (id) init;
-- (id) initWithLen:(NSUInteger)aLen;
-
-- (void) dealloc;
-
-- (id) copyWithZone:(NSZone *)aZone;
-
-- (void) addInteger:(NSInteger) value;
-- (NSInteger) pop;
-- (void) push:(NSInteger) value;
-- (NSInteger) integerAtIndex:(NSUInteger) index;
-- (void) insertInteger:(NSInteger)anInteger AtIndex:(NSUInteger) anIndex;
-- (NSInteger)removeIntegerAtIndex:(NSUInteger) anIndex;
-- (void)replaceInteger:(NSInteger)aValue AtIndex:(NSUInteger)anIndex;
-- (void) reset;
-
-- (NSUInteger) count;
-- (NSUInteger) size;
-- (void) ensureCapacity:(NSUInteger) anIndex;
-
-@property (assign) NSUInteger BuffSize;
-@property (assign) NSUInteger count;
-@property (assign) NSInteger idx;
-@property (retain) NSMutableData *buffer;
-@property (assign) NSInteger *intBuffer;
-@property (assign) BOOL SPARSE;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRIntArray.m b/runtime/ObjC/Framework/ANTLRIntArray.m
deleted file mode 100644
index f715372..0000000
--- a/runtime/ObjC/Framework/ANTLRIntArray.m
+++ /dev/null
@@ -1,199 +0,0 @@
-//
-//  ANTLRIntArray.m
-//  ANTLR
-//
-//  Created by Ian Michell on 27/04/2010.
-// Copyright (c) 2010 Ian Michell 2010 Alan Condit
-// 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.
-
-#import "ANTLRIntArray.h"
-#import "ANTLRRuntimeException.h"
-
-@implementation ANTLRIntArray
-
-@synthesize BuffSize;
-@synthesize count;
-@synthesize idx;
-@synthesize buffer;
-@synthesize intBuffer;
-@synthesize SPARSE;
-
-+ (ANTLRIntArray *)newArray
-{
-    return [[ANTLRIntArray alloc] init];
-}
-
-+ (ANTLRIntArray *)newArrayWithLen:(NSUInteger)aLen
-{
-    return [[ANTLRIntArray alloc] initWithLen:aLen];
-}
-
-- (id)init
-{
-    self = [super init];
-    if ( self != nil ) {
-        BuffSize  = (ANTLR_INT_ARRAY_INITIAL_SIZE * (sizeof(NSInteger)/sizeof(id)));
-        count = 0;
-        idx = -1;
-        buffer = [[NSMutableData dataWithLength:(NSUInteger)BuffSize * sizeof(id)] retain];
-        intBuffer = (NSInteger *)[buffer mutableBytes];
-        SPARSE = NO;
-    }
-    return self;
-}
-
-- (id)initWithLen:(NSUInteger)aLen
-{
-    self = [super init];
-    if ( self != nil ) {
-        BuffSize  = (ANTLR_INT_ARRAY_INITIAL_SIZE * (sizeof(NSInteger)/sizeof(id)));
-        count = 0;
-        idx = -1;
-        buffer = [[NSMutableData dataWithLength:(NSUInteger)BuffSize * sizeof(id)] retain];
-        intBuffer = (NSInteger *)[buffer mutableBytes];
-        SPARSE = NO;
-    }
-    return self;
-}
-
-- (void)dealloc
-{
-#ifdef DEBUG_DEALLOC
-    NSLog( @"called dealloc in ANTLRIntArray" );
-#endif
-    if ( buffer ) [buffer release];
-    [super dealloc];
-}
-
-- (id)copyWithZone:(NSZone *)aZone
-{
-    ANTLRIntArray *copy;
-    
-    copy = [[[self class] alloc] initWithLen:BuffSize];
-    copy.idx = self.idx;
-    NSInteger anIndex;
-    for ( anIndex = 0; anIndex < BuffSize; anIndex++ ) {
-        [copy addInteger:intBuffer[anIndex]];
-    }
-    return copy;
-}
-
-- (NSUInteger)count
-{
-    return count;
-}
-
-// FIXME: Java runtime returns p, I'm not so sure it's right so have added p + 1 to show true size!
-- (NSUInteger)size
-{
-    if ( count > 0 )
-        return ( count * sizeof(NSInteger));
-    return 0;
-}
-
-- (void)addInteger:(NSInteger) value
-{
-    [self ensureCapacity:idx+1];
-    intBuffer[++idx] = (NSInteger) value;
-    count++;
-}
-
-- (NSInteger)pop
-{
-    if ( idx < 0 ) {
-        @throw [ANTLRIllegalArgumentException newException:[NSString stringWithFormat:@"Nothing to pop, count = %d", count]];
-    }
-    NSInteger value = (NSInteger) intBuffer[idx--];
-    count--;
-    return value;
-}
-
-- (void)push:(NSInteger)aValue
-{
-    [self addInteger:aValue];
-}
-
-- (NSInteger)integerAtIndex:(NSUInteger) anIndex
-{
-    if ( SPARSE==NO  && anIndex > idx ) {
-        @throw [ANTLRIllegalArgumentException newException:[NSString stringWithFormat:@"Index %d must be less than count %d", anIndex, count]];
-    }
-    else if ( SPARSE == YES && anIndex >= BuffSize ) {
-        @throw [ANTLRIllegalArgumentException newException:[NSString stringWithFormat:@"Index %d must be less than BuffSize %d", anIndex, BuffSize]];
-    }
-    return intBuffer[anIndex];
-}
-
-- (void)insertInteger:(NSInteger)aValue AtIndex:(NSUInteger)anIndex
-{
-    [self replaceInteger:aValue AtIndex:anIndex];
-    count++;
-}
-
-- (NSInteger)removeIntegerAtIndex:(NSUInteger) anIndex
-{
-    if ( SPARSE==NO && anIndex > idx ) {
-        @throw [ANTLRIllegalArgumentException newException:[NSString stringWithFormat:@"Index %d must be less than count %d", anIndex, count]];
-        return (NSInteger)-1;
-    } else if ( SPARSE==YES && anIndex >= BuffSize ) {
-        @throw [ANTLRIllegalArgumentException newException:[NSString stringWithFormat:@"Index %d must be less than BuffSize %d", anIndex, BuffSize]];
-    }
-    count--;
-    return intBuffer[anIndex];
-}
-
-- (void)replaceInteger:(NSInteger)aValue AtIndex:(NSUInteger)anIndex
-{
-    if ( SPARSE == NO && anIndex > idx ) {
-        @throw [ANTLRIllegalArgumentException newException:[NSString stringWithFormat:@"Index %d must be less than count %d", anIndex, count]];
-    }
-    else if ( SPARSE == YES && anIndex >= BuffSize ) {
-        @throw [ANTLRIllegalArgumentException newException:[NSString stringWithFormat:@"Index %d must be less than BuffSize %d", anIndex, BuffSize]];
-    }
-    intBuffer[anIndex] = aValue;
-}
-
--(void) reset
-{
-    count = 0;
-    idx = -1;
-}
-
-- (void) ensureCapacity:(NSUInteger) anIndex
-{
-    if ( (anIndex * sizeof(NSUInteger)) >= [buffer length] )
-    {
-        NSUInteger newSize = ([buffer length] / sizeof(NSInteger)) * 2;
-        if (anIndex > newSize) {
-            newSize = anIndex + 1;
-        }
-        BuffSize = newSize;
-        [buffer setLength:(BuffSize * sizeof(NSUInteger))];
-        intBuffer = (NSInteger *)[buffer mutableBytes];
-    }
-}
-
-@end
-
diff --git a/runtime/ObjC/Framework/ANTLRIntStream.h b/runtime/ObjC/Framework/ANTLRIntStream.h
deleted file mode 100644
index e37f907..0000000
--- a/runtime/ObjC/Framework/ANTLRIntStream.h
+++ /dev/null
@@ -1,106 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#ifndef DEBUG_DEALLOC
-#define DEBUG_DEALLOC
-#endif
-
-@protocol ANTLRIntStream < NSObject, NSCopying >
-
-- (void) consume;
-
-// Get unichar at current input pointer + i ahead where i=1 is next character as int for including ANTLRCharStreamEOF (-1) in the data range
-- (NSInteger) LA:(NSInteger) i;
-
-// Tell the stream to start buffering if it hasn't already.  Return
-// current input position, index(), or some other marker so that
-// when passed to rewind() you get back to the same spot.
-// rewind(mark()) should not affect the input cursor.
-// TODO: problem in that lexer stream returns not index but some marker 
-
-- (NSInteger) mark;
-
-// Return the current input symbol index 0..n where n indicates the
-// last symbol has been read.
-
-- (NSInteger) index;
-
-- (NSUInteger) line;
-
-- (NSUInteger) charPositionInLine;
-
-// Reset the stream so that next call to index would return marker.
-// The marker will usually be -index but it doesn't have to be.  It's
-// just a marker to indicate what state the stream was in.  This is
-// essentially calling -release: and -seek:.  If there are markers
-// created after this marker argument, this routine must unroll them
-// like a stack.  Assume the state the stream was in when this marker
-// was created.
-
-- (void) rewind;
-- (void) rewind:(NSInteger) marker;
-
-// You may want to commit to a backtrack but don't want to force the
-// stream to keep bookkeeping objects around for a marker that is
-// no longer necessary.  This will have the same behavior as
-// rewind() except it releases resources without the backward seek.
-
-- (void) release:(NSInteger) marker;
-
-// Set the input cursor to the position indicated by index.  This is
-// normally used to seek ahead in the input stream.  No buffering is
-// required to do this unless you know your stream will use seek to
-// move backwards such as when backtracking.
-// This is different from rewind in its multi-directional
-// requirement and in that its argument is strictly an input cursor (index).
-//
-// For char streams, seeking forward must update the stream state such
-// as line number.  For seeking backwards, you will be presumably
-// backtracking using the mark/rewind mechanism that restores state and
-// so this method does not need to update state when seeking backwards.
-//
-// Currently, this method is only used for efficient backtracking, but
-// in the future it may be used for incremental parsing.
-
-- (void) seek:(NSInteger) anIndex;
-
-/** Only makes sense for streams that buffer everything up probably, but
- *  might be useful to display the entire stream or for testing.  This
- *  value includes a single EOF.
- */
-- (NSUInteger) size;
-/** Where are you getting symbols from?  Normally, implementations will
- *  pass the buck all the way to the lexer who can ask its input stream
- *  for the file name or whatever.
- */
-- (NSString *)getSourceName;
-
-//@property (assign) NSInteger index;
-//@property (assign) NSUInteger line;
-//@property (assign) NSUInteger charPositionInLine;
-
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRLexer.h b/runtime/ObjC/Framework/ANTLRLexer.h
deleted file mode 100644
index cd985cc..0000000
--- a/runtime/ObjC/Framework/ANTLRLexer.h
+++ /dev/null
@@ -1,90 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTokenSource.h"
-#import "ANTLRBaseRecognizer.h"
-#import "ANTLRRecognizerSharedState.h"
-#import "ANTLRCharStream.h"
-#import "ANTLRToken.h"
-#import "ANTLRCommonToken.h"
-#import "ANTLRRecognitionException.h"
-#import "ANTLRMismatchedTokenException.h"
-#import "ANTLRMismatchedRangeException.h"
-
-@interface ANTLRLexer : ANTLRBaseRecognizer <ANTLRTokenSource> {
-	id<ANTLRCharStream> input;      ///< The character stream we pull tokens out of.
-	NSUInteger ruleNestingLevel;
-}
-
-@property (retain, getter=input, setter=setInput:) id<ANTLRCharStream> input;
-@property (getter=getRuleNestingLevel, setter=setRuleNestingLevel:) NSUInteger ruleNestingLevel;
-
-#pragma mark Initializer
-- (id) initWithCharStream:(id<ANTLRCharStream>) anInput;
-- (id) initWithCharStream:(id<ANTLRCharStream>)anInput State:(ANTLRRecognizerSharedState *)state;
-
-- (id) copyWithZone:(NSZone *)zone;
-
-- (void) reset;
-
-// - (ANTLRRecognizerSharedState *) state;
-
-#pragma mark Tokens
-- (id<ANTLRToken>)getToken;
-- (void) setToken: (id<ANTLRToken>) aToken;
-- (id<ANTLRToken>) nextToken;
-- (void) mTokens;		// abstract, defined in generated sources
-- (void) skip;
-- (id<ANTLRCharStream>) input;
-- (void) setInput:(id<ANTLRCharStream>)aCharStream;
-
-- (void) emit;
-- (void) emit:(id<ANTLRToken>)aToken;
-
-#pragma mark Matching
-- (void) matchString:(NSString *)aString;
-- (void) matchAny;
-- (void) matchChar:(unichar) aChar;
-- (void) matchRangeFromChar:(unichar)fromChar to:(unichar)toChar;
-
-#pragma mark Informational
-- (NSUInteger) line;
-- (NSUInteger) charPositionInLine;
-- (NSInteger) index;
-- (NSString *) text;
-- (void) setText:(NSString *) theText;
-
-// error handling
-- (void) reportError:(ANTLRRecognitionException *)e;
-- (NSString *)getErrorMessage:(ANTLRRecognitionException *)e TokenNames:(AMutableArray *)tokenNames;
-- (NSString *)getCharErrorDisplay:(NSInteger)c;
-- (void) recover:(ANTLRRecognitionException *)e;
-- (void)traceIn:(NSString *)ruleName Index:(NSInteger)ruleIndex;
-- (void)traceOut:(NSString *)ruleName Index:(NSInteger)ruleIndex;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRLexer.m b/runtime/ObjC/Framework/ANTLRLexer.m
deleted file mode 100644
index de1a0a3..0000000
--- a/runtime/ObjC/Framework/ANTLRLexer.m
+++ /dev/null
@@ -1,428 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <ANTLR/antlr.h>
-#import "ANTLRLexer.h"
-
-@implementation ANTLRLexer
-
-@synthesize input;
-@synthesize ruleNestingLevel;
-#pragma mark Initializer
-
-- (id) initWithCharStream:(id<ANTLRCharStream>)anInput
-{
-	self = [super initWithState:[[ANTLRRecognizerSharedState alloc] init]];
-	if ( self != nil ) {
-        input = [anInput retain];
-        if (state.token != nil)
-            [((ANTLRCommonToken *)state.token) setInput:anInput];
-		ruleNestingLevel = 0;
-	}
-	return self;
-}
-
-- (id) initWithCharStream:(id<ANTLRCharStream>)anInput State:(ANTLRRecognizerSharedState *)aState
-{
-	self = [super initWithState:aState];
-	if ( self != nil ) {
-        input = [anInput retain];
-        if (state.token != nil)
-            [((ANTLRCommonToken *)state.token) setInput:anInput];
-		ruleNestingLevel = 0;
-	}
-	return self;
-}
-
-- (void) dealloc
-{
-    if ( input ) [input release];
-    [super dealloc];
-}
-
-- (id) copyWithZone:(NSZone *)aZone
-{
-    ANTLRLexer *copy;
-	
-    copy = [[[self class] allocWithZone:aZone] init];
-    //    copy = [super copyWithZone:aZone]; // allocation occurs here
-    if ( input != nil )
-        copy.input = input;
-    copy.ruleNestingLevel = ruleNestingLevel;
-    return copy;
-}
-
-- (void) reset
-{
-    [super reset]; // reset all recognizer state variables
-                   // wack Lexer state variables
-    if ( input != nil ) {
-        [input seek:0]; // rewind the input
-    }
-    if ( state == nil ) {
-        return; // no shared state work to do
-    }
-    state.token = nil;
-    state.type = ANTLRCommonToken.INVALID_TOKEN_TYPE;
-    state.channel = ANTLRCommonToken.DEFAULT_CHANNEL;
-    state.tokenStartCharIndex = -1;
-    state.tokenStartCharPositionInLine = -1;
-    state.tokenStartLine = -1;
-    state.text = nil;
-}
-
-// token stuff
-#pragma mark Tokens
-
-- (id<ANTLRToken>)getToken
-{
-    return [state getToken]; 
-}
-
-- (void) setToken: (id<ANTLRToken>) aToken
-{
-    if (state.token != aToken) {
-        [aToken retain];
-        state.token = aToken;
-    }
-}
-
-
-// this method may be overridden in the generated lexer if we generate a filtering lexer.
-- (id<ANTLRToken>) nextToken
-{
-	while (YES) {
-        [self setToken:nil];
-        state.channel = ANTLRCommonToken.DEFAULT_CHANNEL;
-        state.tokenStartCharIndex = input.index;
-        state.tokenStartCharPositionInLine = input.charPositionInLine;
-        state.tokenStartLine = input.line;
-        state.text = nil;
-        
-        // [self setText:[self text]];
-		if ([input LA:1] == ANTLRCharStreamEOF) {
-            ANTLRCommonToken *eof = [ANTLRCommonToken newToken:input
-                                                          Type:ANTLRTokenTypeEOF
-                                                       Channel:ANTLRCommonToken.DEFAULT_CHANNEL
-                                                         Start:input.index
-                                                          Stop:input.index];
-            [eof setLine:input.line];
-            [eof setCharPositionInLine:input.charPositionInLine];
-			return eof;
-		}
-		@try {
-			[self mTokens];
-            // SEL aMethod = @selector(mTokens);
-            // [[self class] instancesRespondToSelector:aMethod];
-            if ( state.token == nil)
-                [self emit];
-            else if ( state.token == [ANTLRCommonToken skipToken] ) {
-                continue;
-            }
-			return state.token;
-		}
-		@catch (ANTLRNoViableAltException *nva) {
-			[self reportError:nva];
-			[self recover:nva];
-		}
-		@catch (ANTLRRecognitionException *e) {
-			[self reportError:e];
-		}
-	}
-}
-
-- (void) mTokens
-{   // abstract, defined in generated source as a starting point for matching
-    [self doesNotRecognizeSelector:_cmd];
-}
-
-- (void) skip
-{
-    state.token = [ANTLRCommonToken skipToken];
-}
-
-- (id<ANTLRCharStream>) input
-{
-    return input; 
-}
-
-- (void) setInput:(id<ANTLRCharStream>) anInput
-{
-    if ( anInput != input ) {
-        if ( input ) [input release];
-    }
-    input = nil;
-    [self reset];
-    input = anInput;
-    [input retain];
-}
-
-/** Currently does not support multiple emits per nextToken invocation
- *  for efficiency reasons.  Subclass and override this method and
- *  nextToken (to push tokens into a list and pull from that list rather
- *  than a single variable as this implementation does).
- */
-- (void) emit:(id<ANTLRToken>)aToken
-{
-	state.token = aToken;
-}
-
-/** The standard method called to automatically emit a token at the
- *  outermost lexical rule.  The token object should point into the
- *  char buffer start..stop.  If there is a text override in 'text',
- *  use that to set the token's text.  Override this method to emit
- *  custom Token objects.
- *
- *  If you are building trees, then you should also override
- *  Parser or TreeParser.getMissingSymbol().
- */
-- (void) emit
-{
-	id<ANTLRToken> aToken = [ANTLRCommonToken newToken:input
-                                                  Type:state.type
-                                               Channel:state.channel
-                                                 Start:state.tokenStartCharIndex
-                                                  Stop:input.index-1];
-	[aToken setLine:state.tokenStartLine];
-    aToken.text = [self text];
-	[aToken setCharPositionInLine:state.tokenStartCharPositionInLine];
-    [aToken retain];
-	[self emit:aToken];
-	// [aToken release];
-}
-
-// matching
-#pragma mark Matching
-- (void) matchString:(NSString *)aString
-{
-    unichar c;
-	unsigned int i = 0;
-	unsigned int stringLength = [aString length];
-	while ( i < stringLength ) {
-		c = [input LA:1];
-        if ( c != [aString characterAtIndex:i] ) {
-			if ([state getBacktracking] > 0) {
-				state.failed = YES;
-				return;
-			}
-			ANTLRMismatchedTokenException *mte = [ANTLRMismatchedTokenException newExceptionChar:[aString characterAtIndex:i] Stream:input];
-            mte.c = c;
-			[self recover:mte];
-			@throw mte;
-		}
-		i++;
-		[input consume];
-		state.failed = NO;
-	}
-}
-
-- (void) matchAny
-{
-	[input consume];
-}
-
-- (void) matchChar:(unichar) aChar
-{
-	// TODO: -LA: is returning an int because it sometimes is used in the generated parser to compare lookahead with a tokentype.
-	//		 try to change all those occurrences to -LT: if possible (i.e. if ANTLR can be made to generate LA only for lexer code)
-    unichar charLA;
-	charLA = [input LA:1];
-	if ( charLA != aChar) {
-		if ([state getBacktracking] > 0) {
-			state.failed = YES;
-			return;
-		}
-		ANTLRMismatchedTokenException  *mte = [ANTLRMismatchedTokenException newExceptionChar:aChar Stream:input];
-        mte.c = charLA;
-		[self recover:mte];
-		@throw mte;
-	}
-	[input consume];
-	state.failed = NO;
-}
-
-- (void) matchRangeFromChar:(unichar)fromChar to:(unichar)toChar
-{
-	unichar charLA = (unichar)[input LA:1];
-	if ( charLA < fromChar || charLA > toChar ) {
-		if ([state getBacktracking] > 0) {
-			state.failed = YES;
-			return;
-		}
-		ANTLRMismatchedRangeException  *mre = [ANTLRMismatchedRangeException
-					newException:NSMakeRange((NSUInteger)fromChar,(NSUInteger)toChar)
-							   stream:input];
-        mre.c = charLA;
-		[self recover:mre];
-		@throw mre;
-	}		
-	[input consume];
-	state.failed = NO;
-}
-
-	// info
-#pragma mark Informational
-
-- (NSUInteger) line
-{
-	return input.line;
-}
-
-- (NSUInteger) charPositionInLine
-{
-	return input.charPositionInLine;
-}
-
-- (NSInteger) index
-{
-    return 0;
-}
-
-- (NSString *) text
-{
-    if (state.text != nil) {
-        return state.text;
-    }
-	return [input substringWithRange:NSMakeRange(state.tokenStartCharIndex, input.index-state.tokenStartCharIndex)];
-}
-
-- (void) setText:(NSString *) theText
-{
-    state.text = theText;
-}
-
-	// error handling
-- (void) reportError:(ANTLRRecognitionException *)e
-{
-    /** TODO: not thought about recovery in lexer yet.
-     *
-     // if we've already reported an error and have not matched a token
-     // yet successfully, don't report any errors.
-     if ( errorRecovery ) {
-     //System.err.print("[SPURIOUS] ");
-     return;
-     }
-     errorRecovery = true;
-     */
-    
-    [self displayRecognitionError:[self getTokenNames] Exception:e];
-}
-
-- (NSString *)getErrorMessage:(ANTLRRecognitionException *)e TokenNames:(AMutableArray *)tokenNames
-{
-/*    NSString *msg = [NSString stringWithFormat:@"Gotta fix getErrorMessage in ANTLRLexer.m--%@\n",
-                     e.name];
- */
-    NSString *msg = nil;
-    if ( [e isKindOfClass:[ANTLRMismatchedTokenException class]] ) {
-        ANTLRMismatchedTokenException *mte = (ANTLRMismatchedTokenException *)e;
-        msg = [NSString stringWithFormat:@"mismatched character \"%@\" expecting \"%@\"",
-               [self getCharErrorDisplay:mte.c], [self getCharErrorDisplay:mte.expecting]];
-    }
-    else if ( [e isKindOfClass:[ANTLRNoViableAltException class]] ) {
-        ANTLRNoViableAltException *nvae = (ANTLRNoViableAltException *)e;
-        // for development, can add "decision=<<"+nvae.grammarDecisionDescription+">>"
-        // and "(decision="+nvae.decisionNumber+") and
-        // "state "+nvae.stateNumber
-        msg = [NSString stringWithFormat:@"no viable alternative at character \"%@\"",
-               [self getCharErrorDisplay:(nvae.c)]];
-    }
-    else if ( [e isKindOfClass:[ANTLREarlyExitException class]] ) {
-        ANTLREarlyExitException *eee = (ANTLREarlyExitException *)e;
-        // for development, can add "(decision="+eee.decisionNumber+")"
-        msg = [NSString stringWithFormat:@"required (...)+ loop did not match anything at character \"%@\"",
-               [self getCharErrorDisplay:(eee.c)]];
-    }
-    else if ( [e isKindOfClass:[ANTLRMismatchedNotSetException class]] ) {
-        ANTLRMismatchedNotSetException *mse = (ANTLRMismatchedNotSetException *)e;
-        msg = [NSString stringWithFormat:@"mismatched character \"%@\"  expecting set \"%@\"",
-               [self getCharErrorDisplay:(mse.c)], mse.expecting];
-    }
-    else if ( [e isKindOfClass:[ANTLRMismatchedSetException class]] ) {
-        ANTLRMismatchedSetException *mse = (ANTLRMismatchedSetException *)e;
-        msg = [NSString stringWithFormat:@"mismatched character \"%@\" expecting set \"%@\"",
-               [self getCharErrorDisplay:(mse.c)], mse.expecting];
-    }
-    else if ( [e isKindOfClass:[ANTLRMismatchedRangeException class]] ) {
-        ANTLRMismatchedRangeException *mre = (ANTLRMismatchedRangeException *)e;
-        msg = [NSString stringWithFormat:@"mismatched character \"%@\" \"%@..%@\"",
-               [self getCharErrorDisplay:(mre.c)], [self getCharErrorDisplay:(mre.range.location)],
-               [self getCharErrorDisplay:(mre.range.location+mre.range.length-1)]];
-    }
-    else {
-        msg = [super getErrorMessage:e TokenNames:[self getTokenNames]];
-    }
-    return msg;
-}
-
-- (NSString *)getCharErrorDisplay:(NSInteger)c
-{
-    NSString *s;
-    switch ( c ) {
-        case ANTLRTokenTypeEOF :
-            s = @"<EOF>";
-            break;
-        case '\n' :
-            s = @"\\n";
-            break;
-        case '\t' :
-            s = @"\\t";
-            break;
-        case '\r' :
-            s = @"\\r";
-            break;
-        default:
-            s = [NSString stringWithFormat:@"%c", (char)c];
-            break;
-    }
-    return s;
-}
-
-/** Lexers can normally match any char in it's vocabulary after matching
- *  a token, so do the easy thing and just kill a character and hope
- *  it all works out.  You can instead use the rule invocation stack
- *  to do sophisticated error recovery if you are in a fragment rule.
- */
-- (void)recover:(ANTLRRecognitionException *)re
-{
-    //System.out.println("consuming char "+(char)input.LA(1)+" during recovery");
-    //re.printStackTrace();
-    [input consume];
-}
-
-- (void)traceIn:(NSString *)ruleName Index:(NSInteger)ruleIndex
-{
-    NSString *inputSymbol = [NSString stringWithFormat:@"%c line=%d:%d\n", [input LT:1], input.line, input.charPositionInLine];
-    [super traceIn:ruleName Index:ruleIndex Object:inputSymbol];
-}
-
-- (void)traceOut:(NSString *)ruleName Index:(NSInteger)ruleIndex
-{
-    NSString *inputSymbol = [NSString stringWithFormat:@"%c line=%d:%d\n", [input LT:1], input.line, input.charPositionInLine];
-    [super traceOut:ruleName Index:ruleIndex Object:inputSymbol];
-}
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRLexerRuleReturnScope.h b/runtime/ObjC/Framework/ANTLRLexerRuleReturnScope.h
deleted file mode 100644
index 27b8abc..0000000
--- a/runtime/ObjC/Framework/ANTLRLexerRuleReturnScope.h
+++ /dev/null
@@ -1,43 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-
-@interface ANTLRLexerRuleReturnScope : NSObject {
-	NSInteger start;
-	NSInteger stopToken;
-}
-
-- (NSInteger) getStart;
-- (void) setStart: (NSInteger) aStart;
-
-- (NSInteger) getStop;
-- (void) setStop: (NSInteger) aStop;
-
-@property (assign, getter=getStart, setter=setStart:) NSInteger start;
-@property (getter=getStop,setter=setStop:) NSInteger stopToken;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRLexerRuleReturnScope.m b/runtime/ObjC/Framework/ANTLRLexerRuleReturnScope.m
deleted file mode 100644
index ac69380..0000000
--- a/runtime/ObjC/Framework/ANTLRLexerRuleReturnScope.m
+++ /dev/null
@@ -1,62 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import "ANTLRLexerRuleReturnScope.h"
-
-
-@implementation ANTLRLexerRuleReturnScope
-
-@synthesize start;
-
-//---------------------------------------------------------- 
-//  start 
-//---------------------------------------------------------- 
-- (NSInteger) getStart
-{
-    return start;
-}
-
-- (void) setStart: (NSInteger) aStart
-{
-    start = aStart;
-}
-
-//---------------------------------------------------------- 
-//  stop 
-//---------------------------------------------------------- 
-- (NSInteger) getStop
-{
-    return stopToken;
-}
-
-- (void) setStop: (NSInteger) aStop
-{
-    stopToken = aStop;
-}
-
-
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRLexerState.h b/runtime/ObjC/Framework/ANTLRLexerState.h
deleted file mode 100644
index 7132a48..0000000
--- a/runtime/ObjC/Framework/ANTLRLexerState.h
+++ /dev/null
@@ -1,57 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2007 Kay Roepke
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRToken.h"
-#import "ANTLRRecognizerSharedState.h"
-
-@interface ANTLRLexerState : ANTLRRecognizerSharedState {
-}
-
-- (void) reset;
-
-- (id<ANTLRToken>) getToken;
-- (void) setToken:(id<ANTLRToken>) theToken;
-
-- (NSUInteger) getTokenType;
-- (void) setTokenType:(unsigned int) theTokenType;
-
-- (NSUInteger) channel;
-- (void) setChannel:(unsigned int) theChannel;
-
-- (NSUInteger) getTokenStartLine;
-- (void) setTokenStartLine:(unsigned int) theTokenStartLine;
-
-- (NSUInteger) getTokenCharPositionInLine;
-- (void) setTokenCharPositionInLine:(unsigned int) theCharPosition;
-
-- (NSInteger) getTokenStartCharIndex;
-- (void) setTokenStartCharIndex:(int) theTokenStartCharIndex;
-
-- (NSString *) text;
-- (void) setText:(NSString *) theText;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRLexerState.m b/runtime/ObjC/Framework/ANTLRLexerState.m
deleted file mode 100644
index 88284b7..0000000
--- a/runtime/ObjC/Framework/ANTLRLexerState.m
+++ /dev/null
@@ -1,139 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2007 Kay Roepke
-// 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.
-
-#import "ANTLRLexerState.h"
-
-
-@implementation ANTLRLexerState
-
-- (id) init
-{
-	self = [super init];
-	if (self) {
-		[self reset];
-	}
-	return self;
-}
-
-- (void) reset
-{
-	[self setToken:nil];
-	type = 0;				
-	channel = 0;				
-	tokenStartLine = 0;		
-	tokenStartCharPositionInLine = 0;
-	tokenStartCharIndex = -1;    
-	[self setText:nil];
-}
-
-- (void) dealloc
-{
-#ifdef DEBUG_DEALLOC
-    NSLog( @"called dealloc in ANTLRLexerState" );
-#endif
-	[self setText:nil];
-	[self setToken:nil];
-	[super dealloc];
-}
-
-- (id<ANTLRToken>) getToken
-{
-	return token;
-}
-
-- (void) setToken:(id<ANTLRToken>) theToken
-{
-	if (theToken != token) {
-		if ( token ) [token release];
-		token = [theToken retain];
-	}
-}
-
-
-- (NSUInteger) getTokenType
-{
-	return type;
-}
-
-- (void) setTokenType:(NSUInteger) theTokenType
-{
-	type = theTokenType;
-}
-
-- (NSUInteger)channel
-{
-	return channel;
-}
-
-- (void) setChannel:(NSUInteger) theChannel
-{
-	channel = theChannel;
-}
-
-- (NSUInteger) getTokenStartLine
-{
-	return tokenStartLine;
-}
-
-- (void) setTokenStartLine:(NSUInteger) theTokenStartLine
-{
-	tokenStartLine = theTokenStartLine;
-}
-
-- (unsigned int) getTokenCharPositionInLine
-{
-	return tokenStartCharPositionInLine;
-}
-
-- (void) setTokenCharPositionInLine:(unsigned int) theCharPosition
-{
-	tokenStartCharPositionInLine = theCharPosition;
-}
-
-- (int) getTokenStartCharIndex
-{
-	return tokenStartCharIndex;
-}
-
-- (void) setTokenStartCharIndex:(int) theTokenStartCharIndex
-{
-	tokenStartCharIndex = theTokenStartCharIndex;
-}
-
-- (NSString *) text
-{
-	return text;
-}
-
-- (void) setText:(NSString *) theText
-{
-	if (text != theText) {
-		if ( text ) [text release];
-		text = [theText retain];
-	}
-}
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRLinkBase.h b/runtime/ObjC/Framework/ANTLRLinkBase.h
deleted file mode 100644
index f4c337e..0000000
--- a/runtime/ObjC/Framework/ANTLRLinkBase.h
+++ /dev/null
@@ -1,80 +0,0 @@
-//
-//  ANTLRLinkBase.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/14/10.
-//  [The "BSD licence"]
-//  Copyright (c) 2010 Alan Condit
-//  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.
-
-#import <Cocoa/Cocoa.h>
-
-#ifndef DEBUG_DEALLOC
-#define DEBUG_DEALLOC
-#endif
-
-@protocol ANTLRLinkList <NSObject>
-
-+ (id<ANTLRLinkList>)newANTLRLinkBase;
-+ (id<ANTLRLinkList>)newANTLRLinkBase:(id<ANTLRLinkList>)np Prev:(id<ANTLRLinkList>)pp;
-
-- (void) dealloc;
-
-- (id<ANTLRLinkList>) append:(id<ANTLRLinkList>)node;
-- (id<ANTLRLinkList>) insert:(id<ANTLRLinkList>)node;
-
-- (id<ANTLRLinkList>) getfNext;
-- (void) setFNext:(id<ANTLRLinkList>)np;
-- (id<ANTLRLinkList>)getfPrev;
-- (void) setFPrev:(id<ANTLRLinkList>)pp;
-
-@property (retain) id<ANTLRLinkList> fPrev;
-@property (retain) id<ANTLRLinkList> fNext;
-@end
-
-@interface ANTLRLinkBase : NSObject <ANTLRLinkList> {
-	id<ANTLRLinkList> fPrev;
-	id<ANTLRLinkList> fNext;
-}
-
-@property (retain) id<ANTLRLinkList> fPrev;
-@property (retain) id<ANTLRLinkList> fNext;
-
-+ (id<ANTLRLinkList>)newANTLRLinkBase;
-+ (id<ANTLRLinkList>)newANTLRLinkBase:(id<ANTLRLinkList>)np Prev:(id<ANTLRLinkList>)pp;
-- (id<ANTLRLinkList>)init;
-- (id<ANTLRLinkList>)initWithPtr:(id)np Prev:(id)pp;
-- (void)dealloc;
-
-- (id) copyWithZone:(NSZone *)aZone;
-
-- (id<ANTLRLinkList>)append:(id<ANTLRLinkList>)node;
-- (id<ANTLRLinkList>)insert:(id<ANTLRLinkList>)node;
-
-- (id<ANTLRLinkList>)getfNext;
-- (void)setfNext:(id<ANTLRLinkList>) np;
-- (id<ANTLRLinkList>)getfPrev;
-- (void)setfPrev:(id<ANTLRLinkList>) pp;
-@end
diff --git a/runtime/ObjC/Framework/ANTLRLinkBase.m b/runtime/ObjC/Framework/ANTLRLinkBase.m
deleted file mode 100644
index d352993..0000000
--- a/runtime/ObjC/Framework/ANTLRLinkBase.m
+++ /dev/null
@@ -1,127 +0,0 @@
-//
-//  ANTLRLinkBase.m
-//  ANTLR
-//
-//  Created by Alan Condit on 6/14/10.
-//  [The "BSD licence"]
-//  Copyright (c) 2010 Alan Condit
-//  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.
-
-#import "ANTLRLinkBase.h"
-
-@implementation ANTLRLinkBase
-
-@synthesize fPrev;
-@synthesize fNext;
-
-+(id<ANTLRLinkList>)newANTLRLinkBase
-{
-	return [[ANTLRLinkBase alloc] init];
-}
-
-+(id<ANTLRLinkList>)newANTLRLinkBase:(id<ANTLRLinkList>)np Prev:(id<ANTLRLinkList>)pp
-{
-	return [[ANTLRLinkBase alloc] initWithPtr:np Prev:pp];
-}
-
--(id<ANTLRLinkList>)init
-{
-	if ((self = [super init]) != nil) {
-		fNext = nil;
-		fPrev = nil;
-	}
-	return(self);
-}
-
--(id<ANTLRLinkList>)initWithPtr:(id<ANTLRLinkList>)np Prev:(id<ANTLRLinkList>)pp
-{
-	if ((self = [super init]) != nil) {
-		fNext = np;
-		fPrev = pp;
-	}
-	return(self);
-}
-
--(void)dealloc
-{
-#ifdef DEBUG_DEALLOC
-    NSLog( @"called dealloc in ANTLRLinkBase" );
-#endif
-	if (fNext) [fNext dealloc];
-	if (fPrev) [fPrev dealloc];
-	[super dealloc];
-}
-
-- (id) copyWithZone:(NSZone *)aZone
-{
-    ANTLRLinkBase *copy;
-    
-    copy = [[self class] allocWithZone:aZone];
-    copy.fPrev = fPrev;
-    copy.fNext = fNext;
-    return( copy );
-}
-
--(id<ANTLRLinkList>)append:(id<ANTLRLinkList>)node
-{
-	node.fPrev = (id<ANTLRLinkList>)self;
-	node.fNext = (id<ANTLRLinkList>)self.fNext;
-	if (node.fNext != nil)
-        node.fNext.fPrev = node;
-    self.fNext = node;
-    return( node );
-}
-
--(id<ANTLRLinkList>)insert:(id<ANTLRLinkList>)node
-{
-	node.fNext = self;
-	node.fPrev = self.fPrev;
-    if (node.fPrev != nil) 
-        node.fPrev.fNext = node;
-	self.fPrev = node;
-	return( node );
-}
-
--(id<ANTLRLinkList>)getfNext
-{
-	return(fNext);
-}
-
--(void)setfNext:(id<ANTLRLinkList>)np
-{
-	fNext = np;
-}
-
--(id<ANTLRLinkList>)getfPrev
-{
-	return(fPrev);
-}
-
--(void)setfPrev:(id<ANTLRLinkList>)pp
-{
-	fPrev = pp;
-}
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRLookaheadStream.h b/runtime/ObjC/Framework/ANTLRLookaheadStream.h
deleted file mode 100644
index 3ec121e..0000000
--- a/runtime/ObjC/Framework/ANTLRLookaheadStream.h
+++ /dev/null
@@ -1,77 +0,0 @@
-//
-//  ANTLRLookaheadStream.h
-//  ANTLR
-//
-//  Created by Ian Michell on 26/04/2010.
-//  [The "BSD licence"]
-//  Copyright (c) 2010 Ian Michell 2010 Alan Condit
-//  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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRFastQueue.h"
-
-#define UNITIALIZED_EOF_ELEMENT_INDEX NSIntegerMax
-
-@interface ANTLRLookaheadStream : ANTLRFastQueue
-{
-    NSInteger index;
-	NSInteger eofElementIndex;
-	NSInteger lastMarker;
-	NSInteger markDepth;
-	id prevElement;
-	id eof;
-}
-
-@property (readwrite, retain, getter=getEof, setter=setEof:) id eof;
-@property (assign) NSInteger index;
-@property (assign, getter=getEofElementIndex, setter=setEofElementIndex:) NSInteger eofElementIndex;
-@property (assign, getter=getLastMarker, setter=setLastMarker:) NSInteger lastMarker;
-@property (assign, getter=getMarkDepth, setter=setMarkDepth:) NSInteger markDepth;
-@property (retain) id prevElement;
-
-- (id) initWithEOF:(id) obj;
-- (id) nextElement;
-- (id) remove;
-- (void) consume;
-- (void) sync:(NSInteger) need;
-- (void) fill:(NSInteger) n;
-- (id) LT:(NSInteger) i;
-- (id) LB:(NSInteger) i;
-- (id) getCurrentSymbol;
-- (NSInteger) mark;
-- (void) release:(NSInteger) marker;
-- (void) rewind:(NSInteger) marker;
-- (void) rewind;
-- (void) seek:(NSInteger) i;
-- (id) getEof;
-- (void) setEof:(id) anID;
-- (NSInteger) getEofElementIndex;
-- (void) setEofElementIndex:(NSInteger) anInt;
-- (NSInteger) getLastMarker;
-- (void) setLastMarker:(NSInteger) anInt;
-- (NSInteger) getMarkDepth;
-- (void) setMarkDepth:(NSInteger) anInt;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRLookaheadStream.m b/runtime/ObjC/Framework/ANTLRLookaheadStream.m
deleted file mode 100644
index 57e489e..0000000
--- a/runtime/ObjC/Framework/ANTLRLookaheadStream.m
+++ /dev/null
@@ -1,229 +0,0 @@
-//
-//  ANTLRLookaheadStream.m
-//  ANTLR
-//
-//  Created by Ian Michell on 26/04/2010.
-// [The "BSD licence"]
-// Copyright (c) 2010 Ian Michell 2010 Alan Condit
-// 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.
-
-#import "ANTLRLookaheadStream.h"
-#import "ANTLRError.h"
-#import "ANTLRRecognitionException.h"
-#import "ANTLRCommonToken.h"
-#import "ANTLRRuntimeException.h"
-
-@implementation ANTLRLookaheadStream
-
-@synthesize eof;
-@synthesize index;
-@synthesize eofElementIndex;
-@synthesize lastMarker;
-@synthesize markDepth;
-@synthesize prevElement;
-
--(id) init
-{
-	self = [super init];
-	if ( self != nil ) {
-        eof = [[ANTLRCommonToken eofToken] retain];
-		eofElementIndex = UNITIALIZED_EOF_ELEMENT_INDEX;
-		markDepth = 0;
-        index = 0;
-	}
-	return self;
-}
-
--(id) initWithEOF:(id)obj
-{
-	if ((self = [super init]) != nil) {
-		self.eof = obj;
-        if ( self.eof ) [self.eof retain];
-	}
-	return self;
-}
-
-- (void) reset
-{
-	[super reset];
-    index = 0;
-    p = 0;
-    prevElement = nil;
-	eofElementIndex = UNITIALIZED_EOF_ELEMENT_INDEX;
-}
-
--(id) nextElement
-{
-//	[self doesNotRecognizeSelector:_cmd];
-	return nil;
-}
-
-- (id) remove
-{
-    id obj = [self objectAtIndex:0];
-    p++;
-    // have we hit end of buffer and not backtracking?
-    if ( p == [data count] && markDepth==0 ) {
-        // if so, it's an opportunity to start filling at index 0 again
-        [self clear]; // size goes to 0, but retains memory
-    }
-    [obj release];
-    return obj;
-}
-
--(void) consume
-{
-	[self sync:1];
-	prevElement = [self remove];
-    index++;
-}
-
--(void) sync:(NSInteger) need
-{
-	NSInteger n = (p + need - 1) - [data count] + 1;
-	if ( n > 0 ) {
-		[self fill:n];
-	}
-}
-
--(void) fill:(NSInteger) n
-{
-    id obj;
-	for (NSInteger i = 1; i <= n; i++) {
-		obj = [self nextElement];
-		if ( obj == eof ) {
-			[data addObject:self.eof];
-			eofElementIndex = [data count] - 1;
-		}
-		else {
-			[data addObject:obj];
-		}
-	}
-}
-
--(NSUInteger) count
-{
-	@throw [NSException exceptionWithName:@"ANTLRUnsupportedOperationException" reason:@"Streams have no defined size" userInfo:nil];
-}
-
--(id) LT:(NSInteger) k
-{
-	if (k == 0) {
-		return nil;
-	}
-	if (k < 0) {
-		return [self LB:-k];
-	}
-	if ((p + k - 1) >= eofElementIndex) {
-		return self.eof;
-	}
-	[self sync:k];
-	return [self objectAtIndex:(k - 1)];
-}
-
--(id) LB:(NSInteger) k
-{
-	if (k == 1) {
-		return prevElement;
-	}
-	@throw [ANTLRNoSuchElementException newException:@"can't look backwards more than one token in this stream"];
-}
-
--(id) getCurrentSymbol
-{
-	return [self LT:1];
-}
-
--(NSInteger) mark
-{
-	markDepth++;
-	lastMarker = p;
-	return lastMarker;
-}
-
--(void) release:(NSInteger) marker
-{
-	// no resources to release
-}
-
--(void) rewind:(NSInteger) marker
-{
-	markDepth--;
-	[self seek:marker];
-//    if (marker == 0) [self reset];
-}
-
--(void) rewind
-{
-	[self seek:lastMarker];
-//    if (lastMarker == 0) [self reset];
-}
-
--(void) seek:(NSInteger) anIndex
-{
-	p = anIndex;
-}
-
-- (id) getEof
-{
-    return eof;
-}
-
-- (void) setEof:(id) anID
-{
-    eof = anID;
-}
-
-- (NSInteger) getEofElementIndex
-{
-    return eofElementIndex;
-}
-
-- (void) setEofElementIndex:(NSInteger) anInt
-{
-    eofElementIndex = anInt;
-}
-
-- (NSInteger) getLastMarker
-{
-    return lastMarker;
-}
-
-- (void) setLastMarker:(NSInteger) anInt
-{
-    lastMarker = anInt;
-}
-
-- (NSInteger) getMarkDepthlastMarker
-{
-    return markDepth;
-}
-
-- (void) setMarkDepth:(NSInteger) anInt
-{
-    markDepth = anInt;
-}
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRMap.h b/runtime/ObjC/Framework/ANTLRMap.h
deleted file mode 100644
index 80ad486..0000000
--- a/runtime/ObjC/Framework/ANTLRMap.h
+++ /dev/null
@@ -1,82 +0,0 @@
-//
-//  ANTLRMap.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/9/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRPtrBuffer.h"
-#import "ANTLRMapElement.h"
-
-//#define GLOBAL_SCOPE      0
-//#define LOCAL_SCOPE       1
-#define HASHSIZE            101
-#define HBUFSIZE            0x2000
-
-@interface ANTLRMap : ANTLRPtrBuffer {
-	//ANTLRMap *fNext; // found in superclass
-    // TStringPool *fPool;
-    NSInteger lastHash;
-}
-
-//@property (copy) ANTLRMap *fNext;
-@property (getter=getLastHash, setter=setLastHash:) NSInteger lastHash;
-
-// Contruction/Destruction
-+ (id)newANTLRMap;
-+ (id)newANTLRMapWithLen:(NSInteger)aHashSize;
-
-- (id)init;
-- (id)initWithLen:(NSInteger)cnt;
-- (void)dealloc;
-// Instance Methods
-- (NSInteger)count;
-- (NSInteger)length;
-- (NSInteger)size;
-/* clear -- reinitialize the maplist array */
-- (void) clear;
-/* form hash value for string s */
--(NSInteger)hash:(NSString *)s;
-/*   look for s in ptrBuffer  */
--(id)lookup:(NSString *)s;
-/* look for s in ptrBuffer  */
--(id)install:(ANTLRMapElement *)sym;
-/*
- * delete entry from list
- */
-- (void)deleteANTLRMap:(ANTLRMapElement *)np;
-- (NSInteger)RemoveSym:(NSString *)s;
-- (void)delete_chain:(ANTLRMapElement *)np;
-- (ANTLRMapElement *)getTType:(NSString *)name;
-- (ANTLRMapElement *)getName:(NSInteger)ttype;
-- (NSInteger)getNode:(ANTLRMapElement *)aNode;
-- (void)putNode:(NSInteger)aTType Node:(id)aNode;
-- (void)putName:(NSString *)name TType:(NSInteger)ttype;
-- (void)putName:(NSString *)name Node:(id)aNode;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRMap.m b/runtime/ObjC/Framework/ANTLRMap.m
deleted file mode 100644
index 6bfb088..0000000
--- a/runtime/ObjC/Framework/ANTLRMap.m
+++ /dev/null
@@ -1,362 +0,0 @@
-//
-//  ANTLRMap.m
-//  ANTLR
-//
-//  Created by Alan Condit on 6/9/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#define SUCCESS (0)
-#define FAILURE (-1)
-
-#import "ANTLRMap.h"
-#import "ANTLRBaseTree.h"
-
-/*
- * Start of ANTLRMap
- */
-@implementation ANTLRMap
-
-@synthesize lastHash;
-
-+(id)newANTLRMap
-{
-    return [[ANTLRMap alloc] init];
-}
-
-+(id)newANTLRMapWithLen:(NSInteger)aBuffSize
-{
-    return [[ANTLRMap alloc] initWithLen:aBuffSize];
-}
-
--(id)init
-{
-    NSInteger idx;
-    
-	self = [super initWithLen:HASHSIZE];
-    if ( self != nil ) {
-		fNext = nil;
-        for( idx = 0; idx < HASHSIZE; idx++ ) {
-            ptrBuffer[idx] = nil;
-        }
-	}
-    return( self );
-}
-
--(id)initWithLen:(NSInteger)aBuffSize
-{
-	self = [super initWithLen:aBuffSize];
-    if ( self != nil ) {
-	}
-    return( self );
-}
-
--(void)dealloc
-{
-#ifdef DEBUG_DEALLOC
-    NSLog( @"called dealloc in ANTLRMMap" );
-#endif
-    ANTLRMapElement *tmp, *rtmp;
-    NSInteger idx;
-	
-    if ( self.fNext != nil ) {
-        for( idx = 0; idx < BuffSize; idx++ ) {
-            tmp = ptrBuffer[idx];
-            while ( tmp ) {
-                rtmp = tmp;
-                tmp = (ANTLRMapElement *)tmp.fNext;
-                [rtmp release];
-            }
-        }
-    }
-	[super dealloc];
-}
-
--(void)deleteANTLRMap:(ANTLRMapElement *)np
-{
-    ANTLRMapElement *tmp, *rtmp;
-    NSInteger idx;
-    
-    if ( self.fNext != nil ) {
-        for( idx = 0; idx < BuffSize; idx++ ) {
-            tmp = ptrBuffer[idx];
-            while ( tmp ) {
-                rtmp = tmp;
-                tmp = [tmp getfNext];
-                [rtmp release];
-            }
-        }
-    }
-}
-
-- (void)clear
-{
-    ANTLRMapElement *tmp, *rtmp;
-    NSInteger idx;
-
-    for( idx = 0; idx < BuffSize; idx++ ) {
-        tmp = ptrBuffer[idx];
-        while ( tmp ) {
-            rtmp = tmp;
-            tmp = [tmp getfNext];
-            [rtmp dealloc];
-        }
-        ptrBuffer[idx] = nil;
-    }
-}
-
-- (NSInteger)count
-{
-    NSInteger aCnt = 0;
-    
-    for (int i = 0; i < BuffSize; i++) {
-        if (ptrBuffer[i] != nil) {
-            aCnt++;
-        }
-    }
-    return aCnt;
-}
-
-- (NSInteger)length
-{
-    return BuffSize;
-}
-
-- (NSInteger)size
-{
-    ANTLRMapElement *anElement;
-    NSInteger aSize = 0;
-    
-    for (int i = 0; i < BuffSize; i++) {
-        if ((anElement = ptrBuffer[i]) != nil) {
-            aSize += (NSInteger)[anElement size];
-        }
-    }
-    return aSize;
-}
-                          
-#ifdef USERDOC
-/*
- *  HASH        hash entry to get index to table
- *  NSInteger hash( ANTLRMap *self, char *s );
- *
- *     Inputs:  NSString *s         string to find
- *
- *     Returns: NSInteger                 hashed value
- *
- *  Last Revision 9/03/90
- */
-#endif
--(NSInteger)hash:(NSString *)s       /*    form hash value for string s */
-{
-	NSInteger hashval;
-	const char *tmp;
-    
-	tmp = [s cStringUsingEncoding:NSASCIIStringEncoding];
-	for( hashval = 0; *tmp != '\0'; )
-        hashval += *tmp++;
-	self->lastHash = hashval % HASHSIZE;
-	return( self->lastHash );
-}
-
-#ifdef USERDOC
-/*
- *  LOOKUP  search hashed list for entry
- *  ANTLRMapElement *lookup:(NSString *)s;
- *
- *     Inputs:  NSString  *s       string to find
- *
- *     Returns: ANTLRMapElement  *        pointer to entry
- *
- *  Last Revision 9/03/90
- */
-#endif
--(id)lookup:(NSString *)s
-{
-    ANTLRMapElement *np;
-    
-    for( np = self->ptrBuffer[[self hash:s]]; np != nil; np = [np getfNext] ) {
-        if ( [s isEqualToString:[np getName]] ) {
-            return( np );        /*   found it       */
-        }
-    }
-    return( nil );              /*   not found      */
-}
-
-#ifdef USERDOC
-/*
- *  INSTALL search hashed list for entry
- *  NSInteger install( ANTLRMap *self, ANTLRMapElement *sym );
- *
- *     Inputs:  ANTLRMapElement    *sym   -- symbol ptr to install
- *              NSInteger         scope -- level to find
- *
- *     Returns: Boolean     TRUE   if installed
- *                          FALSE  if already in table
- *
- *  Last Revision 9/03/90
- */
-#endif
--(ANTLRMapElement *)install:(ANTLRMapElement *)sym
-{
-    ANTLRMapElement *np;
-    
-    np = [self lookup:[sym getName]];
-    if ( np == nil ) {
-        [sym setFNext:ptrBuffer[ lastHash ]];
-        ptrBuffer[ lastHash ] = sym;
-        [sym retain];
-        return( ptrBuffer[ lastHash ] );
-    }
-    return( nil );            /*   not found      */
-}
-
-#ifdef USERDOC
-/*
- *  RemoveSym  search hashed list for entry
- *  NSInteger RemoveSym( ANTLRMap *self, char *s );
- *
- *     Inputs:  char     *s          string to find
- *
- *     Returns: NSInteger      indicator of SUCCESS OR FAILURE
- *
- *  Last Revision 9/03/90
- */
-#endif
--(NSInteger)RemoveSym:(NSString *)s
-{
-    ANTLRMapElement *np, *tmp;
-    NSInteger idx;
-    
-    idx = [self hash:s];
-    for ( tmp = self->ptrBuffer[idx], np = self->ptrBuffer[idx]; np != nil; np = [np getfNext] ) {
-        if ( [s isEqualToString:[np getName]] ) {
-            tmp = [np getfNext];             /* get the next link  */
-            [np release];
-            return( SUCCESS );            /* report SUCCESS     */
-        }
-        tmp = [np getfNext];              //  BAD!!!!!!
-    }
-    return( FAILURE );                    /*   not found      */
-}
-
--(void)delete_chain:(ANTLRMapElement *)np
-{
-    if ( [np getfNext] != nil )
-		[self delete_chain:[np getfNext]];
-	[np release];
-}
-
-#ifdef DONTUSEYET
--(NSInteger)bld_symtab:(KW_TABLE *)toknams
-{
-    NSInteger i;
-    ANTLRMapElement *np;
-    
-    for( i = 0; *(toknams[i].name) != '\0'; i++ ) {
-        // install symbol in ptrBuffer
-        np = [ANTLRMapElement newANTLRMapElement:[NSString stringWithFormat:@"%s", toknams[i].name]];
-        //        np->fType = toknams[i].toknum;
-        [self install:np Scope:0];
-    }
-    return( SUCCESS );
-}
-#endif
-
-/*
- * works only for maplist indexed not by name but by TokenNumber
- */
-- (ANTLRMapElement *)getName:(NSInteger)ttype
-{
-    ANTLRMapElement *np;
-    NSInteger aTType;
-
-    aTType = ttype % HASHSIZE;
-    for( np = self->ptrBuffer[ttype]; np != nil; np = [np getfNext] ) {
-        if ( [(NSNumber *)np.node integerValue] == ttype ) {
-            return( np );        /*   found it       */
-        }
-    }
-    return( nil );              /*   not found      */
-}
-
-- (NSInteger)getNode:(id<ANTLRBaseTree>)aNode
-{
-    ANTLRMapElement *np;
-    NSInteger idx;
-
-    idx = [(id<ANTLRBaseTree>)aNode type];
-    idx %= HASHSIZE;
-    np = ptrBuffer[idx];
-    return( [(NSNumber *)np.node integerValue] );
-}
-
-- (ANTLRMapElement *)getTType:(NSString *)name
-{
-    return [self lookup:name];
-}
-
-// create node and install node in ptrBuffer
-- (void)putName:(NSString *)name TType:(NSInteger)ttype
-{
-    ANTLRMapElement *np;
-    
-    np = [ANTLRMapElement newANTLRMapElementWithName:[NSString stringWithString:name] Type:ttype];
-    [self install:np];
-}
-
-// create node and install node in ptrBuffer
-- (void)putName:(NSString *)name Node:(id)aNode
-{
-    ANTLRMapElement *np, *np1;
-    NSInteger idx;
-    
-    idx = [self hash:name];
-    np1 = [ANTLRMapElement newANTLRMapElementWithName:[NSString stringWithString:name] Type:idx];
-    np = [self lookup:name];
-    if ( np == nil ) {
-        [np1 setFNext:self->ptrBuffer[ self->lastHash ]];
-        self->ptrBuffer[ self->lastHash ] = np1;
-        [np1 retain];
-    }
-    else {
-        // ptrBuffer[idx] = np;
-    }
-    return;
-}
-
-// create node and install node in ptrBuffer
-- (void)putNode:(NSInteger)aTType Node:(id)aNode
-{
-    ANTLRMapElement *np;
-    NSInteger ttype;
-    
-    ttype = aTType % HASHSIZE;
-    np = [ANTLRMapElement newANTLRMapElementWithNode:ttype Node:(id)aNode];
-    ptrBuffer[ttype] = np;
-}
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRMapElement.h b/runtime/ObjC/Framework/ANTLRMapElement.h
deleted file mode 100644
index e20d01c..0000000
--- a/runtime/ObjC/Framework/ANTLRMapElement.h
+++ /dev/null
@@ -1,65 +0,0 @@
-//
-//  ANTLRMapElement.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/8/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRBaseMapElement.h"
-
-@interface ANTLRMapElement : ANTLRBaseMapElement {
-    NSString *name;
-    id        node;
-}
-@property (retain, getter=getName, setter=setName:) NSString *name;
-@property (retain, getter=getNode, setter=setNode:) id node;
-
-+ (id) newANTLRMapElement;
-+ (id) newANTLRMapElementWithName:(NSString *)aName Type:(NSInteger)aTType;
-+ (id) newANTLRMapElementWithNode:(NSInteger)aTType Node:(id)aNode;
-+ (id) newANTLRMapElementWithName:(NSString *)aName Node:(id)aNode;
-+ (id) newANTLRMapElementWithObj1:(id)anObj1 Obj2:(id)anObj2;
-- (id) init;
-- (id) initWithName:(NSString *)aName Type:(NSInteger)aTType;
-- (id) initWithNode:(NSInteger)aTType Node:(id)aNode;
-- (id) initWithName:(NSString *)aName Node:(id)aNode;
-- (id) initWithObj1:(id)anObj1 Obj2:(id)anObj2;
-
-- (id) copyWithZone:(NSZone *)aZone;
-
-- (NSInteger) count;
-- (NSInteger) size;
-- (NSString *)getName;
-- (void)setName:(NSString *)aName;
-- (id)getNode;
-- (void)setNode:(id)aNode;
-- (void)putNode:(id)aNode;
-- (void)putNode:(id)aNode With:(NSInteger)uniqueID;
-//- (void)setObject:(id)aNode atIndex:anIndex;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRMapElement.m b/runtime/ObjC/Framework/ANTLRMapElement.m
deleted file mode 100644
index bce1c9f..0000000
--- a/runtime/ObjC/Framework/ANTLRMapElement.m
+++ /dev/null
@@ -1,207 +0,0 @@
-//
-//  ANTLRMapElement.m
-//  ANTLR
-//
-//  Created by Alan Condit on 6/8/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRMapElement.h"
-
-
-@implementation ANTLRMapElement
-
-@synthesize name;
-@synthesize node;
-
-+ (id) newANTLRMapElement
-{
-    return [[ANTLRMapElement alloc] init];
-}
-
-+ (id) newANTLRMapElementWithName:(NSString *)aName Type:(NSInteger)aTType
-{
-    return [[ANTLRMapElement alloc] initWithName:aName Type:aTType];
-}
-
-+ (id) newANTLRMapElementWithNode:(NSInteger)aTType Node:(id)aNode
-{
-    return [[ANTLRMapElement alloc] initWithNode:aTType Node:aNode];
-}
-
-+ (id) newANTLRMapElementWithName:(NSString *)aName Node:(id)aNode
-{
-    return [[ANTLRMapElement alloc] initWithName:aName Node:aNode];
-}
-
-+ (id) newANTLRMapElementWithObj1:(id)anObj1 Obj2:(id)anObj2
-{
-    return [[ANTLRMapElement alloc] initWithObj1:anObj1 Obj2:anObj2];
-}
-
-- (id) init
-{
-    self = [super init];
-    if ( self != nil ) {
-        index = nil;
-        name  = nil;
-    }
-    return self;
-}
-
-- (id) initWithName:(NSString *)aName Type:(NSInteger)aTType
-{
-    self = [super init];
-    if ( self != nil ) {
-        index = [[NSNumber numberWithInteger: aTType] retain];
-        name  = [[NSString stringWithString:aName] retain];
-    }
-    return self;
-}
-
-- (id) initWithNode:(NSInteger)aTType Node:(id)aNode
-{
-    self = [super initWithAnIndex:[NSNumber numberWithInteger:aTType]];
-    if ( self != nil ) {
-        node  = aNode;
-        if ( node ) [node retain];
-    }
-    return self;
-}
-
-- (id) initWithName:(NSString *)aName Node:(id)aNode
-{
-    self = [super init];
-    if ( self != nil ) {
-        name  = [[NSString stringWithString:aName] retain];
-        node = aNode;
-        if ( node ) [node retain];
-    }
-    return self;
-}
-
-- (id) initWithObj1:(id)anIndex Obj2:(id)aNode
-{
-    self = [super initWithAnIndex:anIndex];
-    if ( self != nil ) {
-        node = aNode;
-        if ( node ) [node retain];
-    }
-    return self;
-}
-
-- (void) dealloc
-{
-#ifdef DEBUG_DEALLOC
-    NSLog( @"called dealloc in ANTLRMapElement" );
-#endif
-    if ( name ) [name release];
-    if ( node ) [node release];
-    [super dealloc];
-}
-
-- (id) copyWithZone:(NSZone *)aZone
-{
-    ANTLRMapElement *copy;
-
-    copy = [super copyWithZone:aZone];
-    if (name) copy.name = name;
-    if (node) copy.node = node;
-    return( copy );
-}
-
-- (NSInteger) count
-{
-    NSInteger aCnt = 0;
-    if (name != nil) aCnt++;;
-    if (node != nil) aCnt++;;
-    return aCnt;
-}
-
-- (NSInteger)size
-{
-    NSInteger aSize = 0;
-    if ( name ) aSize += sizeof(id);
-    if ( node ) aSize += sizeof(id);
-    return aSize;
-}
-
-
-- (NSString *)getName
-{
-    return name;
-}
-
-- (void)setName:(NSString *)aName
-{
-    if ( aName != name ) {
-        if ( name ) [name release];
-        [aName retain];
-    }
-    name = aName;
-}
-
-- (id)getNode
-{
-    return node;
-}
-
-- (void)setNode:(id)aNode
-{   if ( aNode != node ) {
-        if ( node ) [node release];
-        [aNode retain];
-    }
-    node = aNode;
-}
-
-- (void)putNode:(id)aNode
-{
-    index = ((ANTLRMapElement *)aNode).index;
-    if (((ANTLRMapElement *)aNode).name) {
-        name = [((ANTLRMapElement *)aNode).name retain];
-        node = nil;
-    }
-    if (((ANTLRMapElement *)aNode).node) {
-        name = nil;
-        node = [((ANTLRMapElement *)aNode).node retain];
-    }
-}
-
-- (void)putNode:(id)aNode With:(NSInteger)uniqueID
-{
-    index = ((ANTLRMapElement *)aNode).index;
-    if (((ANTLRMapElement *)aNode).name) {
-        name = [((ANTLRMapElement *)aNode).name retain];
-        node = nil;
-    }
-    if (((ANTLRMapElement *)aNode).node) {
-        name = nil;
-        node = [((ANTLRMapElement *)aNode).node retain];
-    }
-}
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRMismatchedNotSetException.h b/runtime/ObjC/Framework/ANTLRMismatchedNotSetException.h
deleted file mode 100644
index 95d191d..0000000
--- a/runtime/ObjC/Framework/ANTLRMismatchedNotSetException.h
+++ /dev/null
@@ -1,51 +0,0 @@
-//
-//  ANTLRMismatchedNotSetException.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/13/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRecognitionException.h"
-#import "ANTLRBitSet.h"
-
-@interface ANTLRMismatchedNotSetException : ANTLRRecognitionException
-{
-    NSString *expecting;
-}
-@property (retain, getter=getExpecting, setter=setExpecting:) NSString *expecting;
-
-- (ANTLRMismatchedNotSetException *)newException;
-- (ANTLRMismatchedNotSetException *)newException:(id<ANTLRIntStream>)anInput
-                                                               Follow:(NSString *)expecting;
-
-- (id) init;
-- (id) initWithStream:(id<ANTLRIntStream>)anInput Follow:(NSString *)expecting;
-
-- (NSString *)toString;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRMismatchedNotSetException.m b/runtime/ObjC/Framework/ANTLRMismatchedNotSetException.m
deleted file mode 100644
index e43e1b1..0000000
--- a/runtime/ObjC/Framework/ANTLRMismatchedNotSetException.m
+++ /dev/null
@@ -1,69 +0,0 @@
-//
-//  ANTLRMismatchedNotSetException.m
-//  ANTLR
-//
-//  Created by Alan Condit on 6/13/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import "ANTLRMismatchedNotSetException.h"
-
-@implementation ANTLRMismatchedNotSetException
-
-@synthesize expecting;
-
-- (ANTLRMismatchedNotSetException *)newException
-{
-    return [[ANTLRMismatchedNotSetException alloc] init];
-}
-
-- (ANTLRMismatchedNotSetException *)newException:(id<ANTLRIntStream>)anInput
-                                                               Follow:(NSString *)expected
-{
-    return [[ANTLRMismatchedNotSetException alloc] initWithStream:anInput Follow:(NSString *)expected];
-}
-
-- (id) init
-{
-    if ((self = [super init]) != nil ) {
-    }
-    return(self);
-}
-
-- (id) initWithStream:(id<ANTLRIntStream>)anInput Follow:(NSString *)expected
-{
-    if ((self = [super initWithStream:anInput]) != nil ) {
-        expecting = expected;
-    }
-    return(self);
-}
-
-- (NSString *)toString
-{
-    return [NSString stringWithFormat:@"MismatchedNotSetException( %d != %@ )", [self unexpectedType], expecting];
-}
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRMismatchedRangeException.h b/runtime/ObjC/Framework/ANTLRMismatchedRangeException.h
deleted file mode 100644
index 678af61..0000000
--- a/runtime/ObjC/Framework/ANTLRMismatchedRangeException.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRecognitionException.h"
-
-@protocol ANTLRIntStream;
-
-
-@interface ANTLRMismatchedRangeException : ANTLRRecognitionException {
-	NSRange range;
-}
-
-@property (assign) NSRange range;
-
-+ (id) newException:(NSRange) aRange stream:(id<ANTLRIntStream>) theInput;
-- (id) initWithRange:(NSRange) aRange stream:(id<ANTLRIntStream>) theInput;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRMismatchedRangeException.m b/runtime/ObjC/Framework/ANTLRMismatchedRangeException.m
deleted file mode 100644
index 0647254..0000000
--- a/runtime/ObjC/Framework/ANTLRMismatchedRangeException.m
+++ /dev/null
@@ -1,55 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import "ANTLRMismatchedRangeException.h"
-
-
-@implementation ANTLRMismatchedRangeException
-
-@synthesize range;
-
-+ (id) newException:(NSRange) aRange stream:(id<ANTLRIntStream>) theInput
-{
-	return [[ANTLRMismatchedRangeException alloc] initWithRange:aRange stream:theInput];
-}
-
-- (id) initWithRange:(NSRange) aRange stream:(id<ANTLRIntStream>) theInput
-{
-	if ((self = [super initWithStream:theInput]) != nil) {
-		range = aRange;
-	}
-	return self;
-}
-
-- (NSString *) description
-{
-	NSMutableString *desc = (NSMutableString *)[super description];
-	[desc appendFormat:@" range:%@", NSStringFromRange(range)];
-	return desc;
-}
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRMismatchedSetException.h b/runtime/ObjC/Framework/ANTLRMismatchedSetException.h
deleted file mode 100644
index 0610973..0000000
--- a/runtime/ObjC/Framework/ANTLRMismatchedSetException.h
+++ /dev/null
@@ -1,44 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRecognitionException.h"
-
-@interface ANTLRMismatchedSetException : ANTLRRecognitionException {
-	NSString *expecting;
-}
-
-@property (retain, getter=getExpecting, setter=setExpecting:) NSString *expecting;
-
-+ (id) newException:(NSString *) theExpectedSet stream:(id<ANTLRIntStream>) theStream;
-- (id) initWithSet:(NSString *) theExpectedSet stream:(id<ANTLRIntStream>) theStream;
-
-- (NSString *) getExpecting;
-- (void) setExpecting: (NSString *) anExpectedSet;
-
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRMismatchedSetException.m b/runtime/ObjC/Framework/ANTLRMismatchedSetException.m
deleted file mode 100644
index b5248d2..0000000
--- a/runtime/ObjC/Framework/ANTLRMismatchedSetException.m
+++ /dev/null
@@ -1,79 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import "ANTLRMismatchedSetException.h"
-
-
-@implementation ANTLRMismatchedSetException
-
-@synthesize expecting;
-
-+ (id) newException:(NSString *) theExpectedSet stream:(id<ANTLRIntStream>) theStream
-{
-	return [[ANTLRMismatchedSetException alloc] initWithSet:theExpectedSet stream:theStream];
-}
-
-- (id) initWithSet:(NSString *) theExpectedSet stream:(id<ANTLRIntStream>) theStream
-{
-	if ((self = [super initWithStream:theStream]) != nil) {
-		[self setExpecting:theExpectedSet];
-	}
-	return self;
-}
-
-- (void) dealloc
-{
-	[self setExpecting:nil];
-	[super dealloc];
-}
-
-- (NSString *) description
-{
-	NSMutableString *desc =(NSMutableString *)[super description];
-	[desc appendFormat:@" set:%@", expecting];
-	return desc;
-}
-
-
-//---------------------------------------------------------- 
-//  expectedSet 
-//---------------------------------------------------------- 
-- (NSString *) getExpecting
-{
-    return expecting; 
-}
-
-- (void) setExpecting: (NSString *) anExpectedSet
-{
-    if ( expecting != anExpectedSet ) {
-        if ( expecting ) [expecting release];
-        [anExpectedSet retain];
-        expecting = anExpectedSet;
-    }
-}
-
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRMismatchedTokenException.h b/runtime/ObjC/Framework/ANTLRMismatchedTokenException.h
deleted file mode 100644
index 8e28dcc..0000000
--- a/runtime/ObjC/Framework/ANTLRMismatchedTokenException.h
+++ /dev/null
@@ -1,58 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRecognitionException.h"
-#import "ANTLRBitSet.h"
-
-@protocol ANTLRIntStream;
-
-@interface ANTLRMismatchedTokenException : ANTLRRecognitionException {
-	NSInteger expecting;
-	unichar expectingChar;
-	BOOL isTokenType;
-}
-
-@property (assign, getter=getExpecting, setter=setExpecting:) NSInteger expecting;
-@property (assign, getter=getExpectingChar, setter=setExpectingChar:) unichar expectingChar;
-@property (assign, getter=getIsTokenType, setter=setIsTokenType:) BOOL isTokenType;
-
-+ (id) newException:(NSInteger)expectedTokenType Stream:(id<ANTLRIntStream>)anInput;
-+ (id) newExceptionMissing:(NSInteger)expectedTokenType
-                                        Stream:(id<ANTLRIntStream>)anInput
-                                         Token:(id<ANTLRToken>)inserted;
-+ (id) newExceptionChar:(unichar)expectedCharacter Stream:(id<ANTLRIntStream>)anInput;
-+ (id) newExceptionStream:(id<ANTLRIntStream>)anInput
-                                    Exception:(NSException *)e
-                                       Follow:(ANTLRBitSet *)follow;
-- (id) initWithTokenType:(NSInteger)expectedTokenType Stream:(id<ANTLRIntStream>)anInput;
--(id) initWithTokenType:(NSInteger)expectedTokenType
-                 Stream:(id<ANTLRIntStream>)anInput
-                  Token:(id<ANTLRToken>)inserted;
-- (id) initWithCharacter:(unichar)expectedCharacter Stream:(id<ANTLRIntStream>)anInput;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRMismatchedTokenException.m b/runtime/ObjC/Framework/ANTLRMismatchedTokenException.m
deleted file mode 100644
index a8807fa..0000000
--- a/runtime/ObjC/Framework/ANTLRMismatchedTokenException.m
+++ /dev/null
@@ -1,99 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import "ANTLRMismatchedTokenException.h"
-
-
-@implementation ANTLRMismatchedTokenException
-
-@synthesize expecting;
-@synthesize expectingChar;
-@synthesize isTokenType;
-
-
-+ (id) newException:(NSInteger)expectedTokenType Stream:(id<ANTLRIntStream>)anInput
-{
-	return [[ANTLRMismatchedTokenException alloc] initWithTokenType:expectedTokenType Stream:anInput];
-}
-
-+ (id) newExceptionMissing:(NSInteger)expectedTokenType
-                                        Stream:(id<ANTLRIntStream>)anInput
-                                         Token:(id<ANTLRToken>)inserted
-{
-	return [[ANTLRMismatchedTokenException alloc] initWithTokenType:expectedTokenType Stream:anInput Token:inserted];
-}
-
-+ (id) newExceptionChar:(unichar) expectedCharacter Stream:(id<ANTLRIntStream>)anInput
-{
-	return [[ANTLRMismatchedTokenException alloc] initWithCharacter:expectedCharacter Stream:anInput];
-}
-
-+ (id) newExceptionStream:(id<ANTLRIntStream>)anInput Exception:(NSException *)e Follow:(ANTLRBitSet *) follow
-{
-	return [[ANTLRMismatchedTokenException alloc] initWithStream:anInput];
-}
-
--(id) initWithTokenType:(NSInteger)expectedTokenType Stream:(id<ANTLRIntStream>)anInput
-{
-	if ((self = [super initWithStream:anInput]) != nil) {
-		expecting = expectedTokenType;
-		isTokenType = YES;
-	}
-	return self;
-}
-
--(id) initWithTokenType:(NSInteger)expectedTokenType
-                 Stream:(id<ANTLRIntStream>)anInput
-                  Token:(id<ANTLRToken>)inserted
-{
-	if ((self = [super initWithStream:anInput]) != nil) {
-		expecting = expectedTokenType;
-		isTokenType = YES;
-	}
-	return self;
-}
-
-- (id) initWithCharacter:(unichar) expectedCharacter Stream:(id<ANTLRIntStream>)anInput
-{
-	if ((self = [super initWithStream:anInput]) != nil) {
-		expectingChar = expectedCharacter;
-		isTokenType = NO;
-	}
-	return self;
-}
-
-- (NSString *) description
-{
-	NSMutableString *desc = (NSMutableString *)[super description];
-	if (isTokenType) {
-		[desc appendFormat:@" expected:%d got:%d", expecting, [self unexpectedType]];
-	} else {
-		[desc appendFormat:@" expected:%c got:%c", expectingChar, (unichar)[self unexpectedType]];
-	}
-	return desc;
-}
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRMismatchedTreeNodeException.h b/runtime/ObjC/Framework/ANTLRMismatchedTreeNodeException.h
deleted file mode 100644
index 3528cba..0000000
--- a/runtime/ObjC/Framework/ANTLRMismatchedTreeNodeException.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRecognitionException.h"
-
-@protocol ANTLRIntStream;
-
-@interface ANTLRMismatchedTreeNodeException : ANTLRRecognitionException {
-	NSInteger expecting;
-}
-
-@property (getter=getExpecting, setter=setExpecting:) NSInteger expecting;
-
-+ (id) newException:(NSInteger)expectedTokenType Stream:(id<ANTLRIntStream>)anInput;
-- (id) initWithTokenType:(NSInteger) expectedTokenType Stream:(id<ANTLRIntStream>)anInput;
-
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRMismatchedTreeNodeException.m b/runtime/ObjC/Framework/ANTLRMismatchedTreeNodeException.m
deleted file mode 100644
index 60d5184..0000000
--- a/runtime/ObjC/Framework/ANTLRMismatchedTreeNodeException.m
+++ /dev/null
@@ -1,54 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import "ANTLRMismatchedTreeNodeException.h"
-
-
-@implementation ANTLRMismatchedTreeNodeException
-
-@synthesize expecting;
-
-+ (id) newException:(NSInteger)expectedTokenType Stream:(id<ANTLRIntStream>)anInput
-{
-	return [[ANTLRMismatchedTreeNodeException alloc] initWithTokenType:expectedTokenType Stream:anInput];
-}
-
--(id) initWithTokenType:(NSInteger)expectedTokenType Stream:(id<ANTLRIntStream>)anInput
-{
-	if ((self = [super initWithStream:anInput]) != nil) {
-		expecting = expectedTokenType;
-	}
-	return self;
-}
-
-- (NSString *) description
-{
-	NSMutableString *desc = (NSMutableString *)[super description];
-	[desc appendFormat:@" expected:%d got:%d", expecting, [self unexpectedType]];
-	return desc;
-}
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRMissingTokenException.h b/runtime/ObjC/Framework/ANTLRMissingTokenException.h
deleted file mode 100644
index 1ae8103..0000000
--- a/runtime/ObjC/Framework/ANTLRMissingTokenException.h
+++ /dev/null
@@ -1,52 +0,0 @@
-//
-//  ANTLRMissingTokenException.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/8/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRMismatchedTokenException.h"
-#import "ANTLRToken.h"
-
-@interface ANTLRMissingTokenException : ANTLRMismatchedTokenException {
-    id<ANTLRToken> inserted;
-}
-/** Used for remote debugger deserialization */
-+ (id) newException;
-+ (id) newException:(NSInteger)expected
-             Stream:(id<ANTLRIntStream>)anInput
-               With:(id<ANTLRToken>)insertedToken;
-- (id) init;
-- (id) init:(NSInteger)expected Stream:(id<ANTLRIntStream>)anInput With:(id<ANTLRToken>)insertedToken;
-
-- (NSInteger) getMissingType;
-
-- (NSString *)toString;
-
-@property (retain) id<ANTLRToken> inserted;
-@end
diff --git a/runtime/ObjC/Framework/ANTLRMissingTokenException.m b/runtime/ObjC/Framework/ANTLRMissingTokenException.m
deleted file mode 100644
index 35bd130..0000000
--- a/runtime/ObjC/Framework/ANTLRMissingTokenException.m
+++ /dev/null
@@ -1,83 +0,0 @@
-//
-//  ANTLRMissingTokenException.m
-//  ANTLR
-//
-//  Created by Alan Condit on 6/8/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import "ANTLRMissingTokenException.h"
-
-
-@implementation ANTLRMissingTokenException
-/** Used for remote debugger deserialization */
-+ (id) newException
-{
-    return [[ANTLRMissingTokenException alloc] init];
-}
-
-+ (id) newException:(NSInteger)expected
-             Stream:(id<ANTLRIntStream>)anInput
-               With:(id<ANTLRToken>)insertedToken
-{
-    return [[ANTLRMissingTokenException alloc] init:expected Stream:anInput With:insertedToken];
-}
-
-- (id) init
-{
-    if ((self = [super init]) != nil) {
-    }
-    return self;
-}
-
-- (id) init:(NSInteger)expected Stream:(id<ANTLRIntStream>)anInput With:(id<ANTLRToken>)insertedToken
-{
-    if ((self = [super initWithStream:anInput]) != nil) {
-        expecting = expected;
-        input = anInput;
-        inserted = insertedToken;
-    }
-    return self;
-}
-
-- (NSInteger) getMissingType
-{
-    return expecting;
-}
-
-- (NSString *)toString
-{
-    if ( inserted != nil && token != nil ) {
-        return [NSString stringWithFormat:@"MissingTokenException(inserted %@ at %@)", inserted, token.text];
-    }
-    if ( token!=nil ) {
-        return [NSString stringWithFormat:@"MissingTokenException(at %@)", token.text ];
-    }
-    return @"MissingTokenException";
-}
-
-@synthesize inserted;
-@end
diff --git a/runtime/ObjC/Framework/ANTLRNoViableAltException.h b/runtime/ObjC/Framework/ANTLRNoViableAltException.h
deleted file mode 100644
index 9b2e521..0000000
--- a/runtime/ObjC/Framework/ANTLRNoViableAltException.h
+++ /dev/null
@@ -1,45 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRecognitionException.h"
-#import "ANTLRIntStream.h"
-
-@interface ANTLRNoViableAltException : ANTLRRecognitionException {
-	int decisionNumber;
-	int stateNumber;
-}
-
-+ (ANTLRNoViableAltException *) newException:(NSInteger)theDecisionNumber state:(NSInteger)theStateNumber stream:(id<ANTLRIntStream>)theStream;
-- (ANTLRNoViableAltException *) initWithDecision:(NSInteger)theDecisionNumber state:(NSInteger)theStateNumber stream:(id<ANTLRIntStream>)theStream;
-
-- (void)setDecisionNumber:(NSInteger)decisionNumber;
-- (void)setStateNumber:(NSInteger)stateNumber;
-
-
-@property (getter=decisionNumber,setter=setDecisionNumber:) NSInteger decisionNumber;
-@property (getter=stateNumber,setter=setStateNumber:) NSInteger stateNumber;
-@end
diff --git a/runtime/ObjC/Framework/ANTLRNoViableAltException.m b/runtime/ObjC/Framework/ANTLRNoViableAltException.m
deleted file mode 100644
index e519581..0000000
--- a/runtime/ObjC/Framework/ANTLRNoViableAltException.m
+++ /dev/null
@@ -1,83 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import "ANTLRNoViableAltException.h"
-
-
-@implementation ANTLRNoViableAltException
-
-
-+ (ANTLRNoViableAltException *) newException:(NSInteger)theDecisionNumber state:(NSInteger)theStateNumber stream:(id<ANTLRIntStream>)theStream
-{
-	return [[self alloc] initWithDecision:theDecisionNumber state:theStateNumber stream:theStream];
-}
-
-
-- (ANTLRNoViableAltException *) initWithDecision:(NSInteger)theDecisionNumber state:(NSInteger)theStateNumber stream:(id<ANTLRIntStream>)theStream
-{
-	if ((self = [super initWithStream:theStream]) != nil) {
-		decisionNumber = theDecisionNumber;
-		stateNumber = theStateNumber;
-	}
-	return self;
-}
-
-- (NSString *) description
-{
-	NSMutableString *desc = (NSMutableString *)[super description];
-	[desc appendFormat:@" decision:%d state:%d", decisionNumber, stateNumber];
-	return desc;
-}
-
-//---------------------------------------------------------- 
-//  decisionNumber 
-//---------------------------------------------------------- 
-- (NSInteger) decisionNumber
-{
-    return decisionNumber;
-}
-
-- (void) setDecisionNumber: (NSInteger) aDecisionNumber
-{
-    decisionNumber = aDecisionNumber;
-}
-
-//---------------------------------------------------------- 
-//  stateNumber 
-//---------------------------------------------------------- 
-- (NSInteger) stateNumber
-{
-    return stateNumber;
-}
-
-- (void) setStateNumber: (NSInteger) aStateNumber
-{
-    stateNumber = aStateNumber;
-}
-
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRNodeMapElement.h b/runtime/ObjC/Framework/ANTLRNodeMapElement.h
deleted file mode 100644
index 3bbf7b7..0000000
--- a/runtime/ObjC/Framework/ANTLRNodeMapElement.h
+++ /dev/null
@@ -1,56 +0,0 @@
-//
-//  ANTLRRuleMapElement.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/16/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRBaseMapElement.h"
-#import "ANTLRBaseTree.h"
-
-@interface ANTLRNodeMapElement : ANTLRBaseMapElement {
-    id<ANTLRBaseTree> node;
-}
-
-@property (retain, getter=getNode, setter=setNode:) id<ANTLRBaseTree> node;
-
-+ (void)initialize;
-
-+ (id) newANTLRNodeMapElement;
-+ (id) newANTLRNodeMapElementWithIndex:(id)anIndex Node:(id<ANTLRBaseTree>)aNode;
-- (id) init;
-- (id) initWithAnIndex:(id)anIndex Node:(id)aNode;
-
-- (id) copyWithZone:(NSZone *)aZone;
-
-- (id<ANTLRBaseTree>)getNode;
-- (void)setNode:(id<ANTLRBaseTree>)aNode;
-
-- (NSInteger)size;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRNodeMapElement.m b/runtime/ObjC/Framework/ANTLRNodeMapElement.m
deleted file mode 100644
index 06f35cc..0000000
--- a/runtime/ObjC/Framework/ANTLRNodeMapElement.m
+++ /dev/null
@@ -1,108 +0,0 @@
-//
-//  ANTLRNodeMapElement.m
-//  ANTLR
-//
-//  Created by Alan Condit on 6/16/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import "ANTLRNodeMapElement.h"
-
-static NSInteger _aUniqueID;
-
-@implementation ANTLRNodeMapElement
-
-@synthesize node;
-
-+ (void)initialize
-{
-    _aUniqueID = 0;
-}
-
-+ (ANTLRNodeMapElement *)newANTLRNodeMapElement
-{
-    return [[ANTLRNodeMapElement alloc] init];
-}
-
-+ (ANTLRNodeMapElement *)newANTLRNodeMapElementWithIndex:(id)anIndex Node:(id<ANTLRBaseTree>)aNode
-{
-    return [[ANTLRNodeMapElement alloc] initWithAnIndex:anIndex Node:aNode];
-}
-
-- (id) init
-{
-    if ((self = [super init]) != nil ) {
-        index = nil;
-        node = nil;
-    }
-    return (self);
-}
-
-- (id) initWithAnIndex:(id)anIndex Node:(id)aNode
-{
-    self = [super initWithAnIndex:anIndex];
-    if ( self ) {
-        if ( aNode != node ) {
-            if ( node ) [node release];
-            [aNode retain];
-        }
-        node = aNode;
-    }
-    return (self);
-}
-
-- (id) copyWithZone:(NSZone *)aZone
-{
-    ANTLRNodeMapElement *copy;
-    
-    copy = [super copyWithZone:aZone];
-    copy.node = node;
-    return( copy );
-}
-
-- (id<ANTLRBaseTree>)getNode
-{
-    return node;
-}
-
-- (void)setNode:(id<ANTLRBaseTree>)aNode
-{
-    if ( aNode != node ) {
-        if ( node ) [node release];
-        [aNode retain];
-    }
-    node = aNode;
-}
-
-- (NSInteger)size
-{
-    NSInteger aSize = 0;
-    if (node != nil) aSize += sizeof(id);
-    if (index != nil) aSize += sizeof(id);
-    return( aSize );
-}
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRParseTree.h b/runtime/ObjC/Framework/ANTLRParseTree.h
deleted file mode 100644
index 5331005..0000000
--- a/runtime/ObjC/Framework/ANTLRParseTree.h
+++ /dev/null
@@ -1,64 +0,0 @@
-//
-//  ANTLRParseTree.h
-//  ANTLR
-//
-//  Created by Alan Condit on 7/12/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRBaseTree.h"
-#import "ANTLRCommonToken.h"
-#import "AMutableArray.h"
-
-@interface ANTLRParseTree : ANTLRBaseTree <ANTLRBaseTree> {
-	__strong id<ANTLRToken> payload;
-	__strong AMutableArray *hiddenTokens;
-}
-/** A record of the rules used to match a token sequence.  The tokens
- *  end up as the leaves of this tree and rule nodes are the interior nodes.
- *  This really adds no functionality, it is just an alias for CommonTree
- *  that is more meaningful (specific) and holds a String to display for a node.
- */
-+ (id<ANTLRBaseTree>)newANTLRParseTree:(id<ANTLRToken>)label;
-- (id)initWithLabel:(id<ANTLRToken>)label;
-
-- (id<ANTLRBaseTree>)dupNode;
-- (NSInteger)type;
-- (NSString *)text;
-- (NSInteger)getTokenStartIndex;
-- (void)setTokenStartIndex:(NSInteger)index;
-- (NSInteger)getTokenStopIndex;
-- (void)setTokenStopIndex:(NSInteger)index;
-- (NSString *)description;
-- (NSString *)toString;
-- (NSString *)toStringWithHiddenTokens;
-- (NSString *)toInputString;
-- (void)_toStringLeaves:(NSMutableString *)buf;
-
-@property (retain) id<ANTLRToken> payload;
-@property (retain) AMutableArray *hiddenTokens;
-@end
diff --git a/runtime/ObjC/Framework/ANTLRParseTree.m b/runtime/ObjC/Framework/ANTLRParseTree.m
deleted file mode 100644
index 8339640..0000000
--- a/runtime/ObjC/Framework/ANTLRParseTree.m
+++ /dev/null
@@ -1,149 +0,0 @@
-//
-//  ANTLRParseTree.m
-//  ANTLR
-//
-//  Created by Alan Condit on 7/12/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import "ANTLRParseTree.h"
-
-/** A record of the rules used to match a token sequence.  The tokens
- *  end up as the leaves of this tree and rule nodes are the interior nodes.
- *  This really adds no functionality, it is just an alias for CommonTree
- *  that is more meaningful (specific) and holds a String to display for a node.
- */
-@implementation ANTLRParseTree
-+ (ANTLRParseTree *)newANTLRParseTree:(id<ANTLRToken>)label
-{
-    return [[ANTLRParseTree alloc] initWithLabel:label];
-}
-    
-- (id)initWithLabel:(id<ANTLRToken>)label
-{
-    self = [super init];
-    if ( self != nil) {
-        payload = [label retain];
-    }
-    return self;
-}
-
-- (id<ANTLRBaseTree>)dupNode
-{
-    return nil;
-}
-    
-- (NSInteger)type
-{
-    return 0;
-}
-    
-- (NSString *)text
-{
-    return [self toString];
-}
-    
-- (NSInteger)getTokenStartIndex
-{
-    return 0;
-}
-    
-- (void)setTokenStartIndex:(NSInteger)anIndex
-{
-}
-    
-- (NSInteger)getTokenStopIndex
-{
-    return 0;
-}
-    
-- (void)setTokenStopIndex:(NSInteger)anIndex
-{
-}
-
-- (NSString *)description
-{
-    if ( [payload isKindOfClass:[ANTLRCommonToken class]] ) {
-        id<ANTLRToken> t = (id<ANTLRToken>)payload;
-        if ( t.type == ANTLRTokenTypeEOF ) {
-            return @"<EOF>";
-        }
-        return [t text];
-    }
-    return [payload description];
-}
-    
-- (NSString *)toString
-{
-    return [self description];
-}
-    
-/** Emit a token and all hidden nodes before.  EOF node holds all
- *  hidden tokens after last real token.
- */
-- (NSString *)toStringWithHiddenTokens
-{
-    NSMutableString *buf = [NSMutableString stringWithCapacity:25];
-    if ( hiddenTokens!=nil ) {
-        for (NSUInteger i = 0; i < [hiddenTokens count]; i++) {
-            id<ANTLRToken>  hidden = (id<ANTLRToken> ) [hiddenTokens objectAtIndex:i];
-            [buf appendString:[hidden text]];
-        }
-    }
-    NSString *nodeText = [self toString];
-    if ( ![nodeText isEqualTo:@"<EOF>"] )
-        [buf appendString:nodeText];
-    return buf;
-}
-    
-/** Print out the leaves of this tree, which means printing original
- *  input back out.
- */
-- (NSString *)toInputString
-{
-    NSMutableString *buf = [NSMutableString stringWithCapacity:25];
-    [self _toStringLeaves:buf];
-    return buf;
-}
-    
-- (void)_toStringLeaves:(NSMutableString *)buf
-{
-    if ( [payload isKindOfClass:[ANTLRCommonToken class]] ) { // leaf node token?
-        [buf appendString:[self toStringWithHiddenTokens]];
-        return;
-    }
-    for (int i = 0; children!=nil && i < [children count]; i++) {
-        ANTLRParseTree *t = (ANTLRParseTree *) [children objectAtIndex:i];
-        [t _toStringLeaves:buf];
-    }
-}
-    
-@synthesize payload;
-@synthesize hiddenTokens;
-@synthesize children;
-@synthesize anException;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRParser.h b/runtime/ObjC/Framework/ANTLRParser.h
deleted file mode 100644
index 067b313..0000000
--- a/runtime/ObjC/Framework/ANTLRParser.h
+++ /dev/null
@@ -1,59 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRBaseRecognizer.h"
-#import "ANTLRCommonToken.h"
-#import "ANTLRTokenStream.h"
-
-@interface ANTLRParser : ANTLRBaseRecognizer {
-	id<ANTLRTokenStream> input;
-}
-+ (ANTLRParser *)newANTLRParser:(id<ANTLRTokenStream>)anInput;
-+ (ANTLRParser *)newANTLRParser:(id<ANTLRTokenStream>)anInput State:(ANTLRRecognizerSharedState *)aState;
-
-- (id) initWithTokenStream:(id<ANTLRTokenStream>)theStream;
-- (id) initWithTokenStream:(id<ANTLRTokenStream>)theStream State:(ANTLRRecognizerSharedState *)aState;
-
-- (id<ANTLRTokenStream>) input;
-- (void) setInput: (id<ANTLRTokenStream>) anInput;
-
-- (void) reset;
-
-- (id) getCurrentInputSymbol:(id<ANTLRTokenStream>)anInput;
-- (ANTLRCommonToken *)getMissingSymbol:(id<ANTLRTokenStream>)input
-                             Exception:(ANTLRRecognitionException *)e
-                                 TType:(NSInteger)expectedTokenType
-                                BitSet:(ANTLRBitSet *)follow;
-- (void) setTokenStream:(id<ANTLRTokenStream>)anInput;
-- (id<ANTLRTokenStream>)getTokenStream;
-- (NSString *)getSourceName;
-
-- (void) traceIn:(NSString *)ruleName Index:(int)ruleIndex;
-- (void) traceOut:(NSString *)ruleName Index:(NSInteger) ruleIndex;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRParser.m b/runtime/ObjC/Framework/ANTLRParser.m
deleted file mode 100644
index df559b2..0000000
--- a/runtime/ObjC/Framework/ANTLRParser.m
+++ /dev/null
@@ -1,147 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import "ANTLRParser.h"
-
-
-@implementation ANTLRParser
-
-+ (ANTLRParser *)newANTLRParser:(id<ANTLRTokenStream>)anInput
-{
-    return [[ANTLRParser alloc] initWithTokenStream:anInput];
-}
-
-+ (ANTLRParser *)newANTLRParser:(id<ANTLRTokenStream>)anInput State:(ANTLRRecognizerSharedState *)aState
-{
-    return [[ANTLRParser alloc] initWithTokenStream:anInput State:aState];
-}
-
-- (id) initWithTokenStream:(id<ANTLRTokenStream>)theStream
-{
-	if ((self = [super init]) != nil) {
-		input = theStream;
-	}
-	return self;
-}
-
-- (id) initWithTokenStream:(id<ANTLRTokenStream>)theStream State:(ANTLRRecognizerSharedState *)aState
-{
-	if ((self = [super initWithState:aState]) != nil) {
-        input = theStream;
-	}
-	return self;
-}
-
-- (void) reset
-{
-    [super reset]; // reset all recognizer state variables
-    if ( input!=nil ) {
-        [input seek:0]; // rewind the input
-    }
-}
-
-- (void) dealloc
-{
-#ifdef DEBUG_DEALLOC
-    NSLog( @"called dealloc in ANTLRParser" );
-#endif
-	[self setInput:nil];
-	[super dealloc];
-}
-
-//---------------------------------------------------------- 
-//  input 
-//---------------------------------------------------------- 
-- (id<ANTLRTokenStream>) input
-{
-    return input; 
-}
-
-- (void) setInput: (id<ANTLRTokenStream>) anInput
-{
-    if (input != anInput) {
-        if ( input ) [input release];
-        [anInput retain];
-    }
-    input = anInput;
-}
-
-- (id) getCurrentInputSymbol:(id<ANTLRTokenStream>)anInput
-{
-    state.token = [input LT:1];
-    return state.token;
-}
-
-- (ANTLRCommonToken *)getMissingSymbol:(id<ANTLRTokenStream>)anInput
-                             Exception:(ANTLRRecognitionException *)e
-                                 TType:(NSInteger)expectedTokenType
-                                BitSet:(ANTLRBitSet *)follow
-{
-    NSString *tokenText = nil;
-    if ( expectedTokenType == ANTLRTokenTypeEOF )
-        tokenText = @"<missing EOF>";
-    else
-        tokenText = [NSString stringWithFormat:@"<missing %@>\n",[[ANTLRBaseRecognizer getTokenNames] objectAtIndex:expectedTokenType]];
-    ANTLRCommonToken *t = [[ANTLRCommonToken newToken:expectedTokenType Text:tokenText] retain];
-    ANTLRCommonToken *current = [anInput LT:1];
-    if ( current.type == ANTLRTokenTypeEOF ) {
-        current = [anInput LT:-1];
-    }
-    t.line = current.line;
-    t.charPositionInLine = current.charPositionInLine;
-    t.channel = ANTLRTokenChannelDefault;
-    return t;
-}
-
-/** Set the token stream and reset the parser */
-- (void) setTokenStream:(id<ANTLRTokenStream>)anInput
-{
-    input = nil;
-    [self reset];
-    input = anInput;
-}
-
-- (id<ANTLRTokenStream>)getTokenStream
-{
-    return input;
-}
-
-- (NSString *)getSourceName
-{
-    return [input getSourceName];
-}
-
-- (void) traceIn:(NSString *)ruleName Index:(int)ruleIndex
-{
-    [super traceIn:ruleName Index:ruleIndex Object:[input LT:1]];
-}
-
-- (void) traceOut:(NSString *)ruleName Index:(NSInteger) ruleIndex
-{
-    [super traceOut:ruleName Index:ruleIndex Object:[input LT:1]];
-}
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRParserRuleReturnScope.h b/runtime/ObjC/Framework/ANTLRParserRuleReturnScope.h
deleted file mode 100644
index d788c21..0000000
--- a/runtime/ObjC/Framework/ANTLRParserRuleReturnScope.h
+++ /dev/null
@@ -1,46 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRToken.h"
-#import "ANTLRRuleReturnScope.h"
-
-@interface ANTLRParserRuleReturnScope : ANTLRRuleReturnScope {
-	id<ANTLRToken> start;
-	id<ANTLRToken> stopToken;
-}
-@property (retain, getter=getStart, setter=setStart:) id<ANTLRToken> start;
-@property (retain, getter=getStop, setter=setStop:)   id<ANTLRToken> stopToken;
-
-- (id<ANTLRToken>) getStart;
-- (void) setStart: (id<ANTLRToken>) aStart;
-
-- (id<ANTLRToken>) getStop;
-- (void) setStop: (id<ANTLRToken>) aStop;
-
-- (id) copyWithZone:(NSZone *)theZone;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRParserRuleReturnScope.m b/runtime/ObjC/Framework/ANTLRParserRuleReturnScope.m
deleted file mode 100644
index 2bc2392..0000000
--- a/runtime/ObjC/Framework/ANTLRParserRuleReturnScope.m
+++ /dev/null
@@ -1,80 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import "ANTLRParserRuleReturnScope.h"
-
-
-@implementation ANTLRParserRuleReturnScope
-
-@synthesize start;
-@synthesize stopToken;
-
-- (void) dealloc
-{
-    [self setStart:nil];
-    [self setStop:nil];
-    [super dealloc];
-}
-
-- (id<ANTLRToken>) getStart
-{
-    return start; 
-}
-
-- (void) setStart: (id<ANTLRToken>) aStart
-{
-    if (start != aStart) {
-        [aStart retain];
-        if ( start ) [start release];
-        start = aStart;
-    }
-}
-
-- (id<ANTLRToken>) getStop
-{
-    return stopToken; 
-}
-
-- (void) setStop: (id<ANTLRToken>) aStop
-{
-    if (stopToken != aStop) {
-        [aStop retain];
-        if ( stopToken ) [stopToken release];
-        stopToken = aStop;
-    }
-}
-
-// create a copy, including the text if available
-// the input stream is *not* copied!
-- (id) copyWithZone:(NSZone *)theZone
-{
-    ANTLRParserRuleReturnScope *copy = [super copyWithZone:theZone];
-    copy.start = start;
-    copy.stopToken = stopToken;
-    return copy;
-}
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRPtrBuffer.h b/runtime/ObjC/Framework/ANTLRPtrBuffer.h
deleted file mode 100644
index baf929b..0000000
--- a/runtime/ObjC/Framework/ANTLRPtrBuffer.h
+++ /dev/null
@@ -1,93 +0,0 @@
-//
-//  ANTLRPtrBuffer.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/9/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRLinkBase.h"
-
-//#define GLOBAL_SCOPE       0
-//#define LOCAL_SCOPE        1
-#define BUFFSIZE         101
-
-@interface ANTLRPtrBuffer : ANTLRLinkBase {
-    NSUInteger BuffSize;
-    NSUInteger count;
-    NSUInteger ptr;
-    __strong NSMutableData *buffer;
-    __strong id *ptrBuffer;
-}
-
-@property (getter=getBuffSize, setter=setBuffSize:) NSUInteger BuffSize;
-@property (getter=getCount, setter=setCount:) NSUInteger count;
-@property (getter=getPtr, setter=setPtr:) NSUInteger ptr;
-@property (retain, getter=getBuffer, setter=setBuffer:) NSMutableData *buffer;
-@property (assign, getter=getPtrBuffer, setter=setPtrBuffer:) id *ptrBuffer;
-
-// Contruction/Destruction
-+(ANTLRPtrBuffer *)newANTLRPtrBuffer;
-+(ANTLRPtrBuffer *)newANTLRPtrBufferWithLen:(NSInteger)cnt;
--(id)init;
--(id)initWithLen:(NSUInteger)cnt;
--(void)dealloc;
-
-// Instance Methods
-- (id) copyWithZone:(NSZone *)aZone;
-/* clear -- reinitialize the maplist array */
-- (void) clear;
-
-- (NSUInteger)count;
-- (NSUInteger)length;
-- (NSUInteger)size;
-
-- (NSMutableData *)getBuffer;
-- (void)setBuffer:(NSMutableData *)np;
-- (NSUInteger)getCount;
-- (void)setCount:(NSUInteger)aCount;
-- (id *)getPtrBuffer;
-- (void)setPtrBuffer:(id *)np;
-- (NSUInteger)getPtr;
-- (void)setPtr:(NSUInteger)np;
-
-- (void) push:(id) v;
-- (id) pop;
-- (id) peek;
-
-- (void) addObject:(id) v;
-- (void) addObjectsFromArray:(ANTLRPtrBuffer *)anArray;
-- (void) insertObject:(id)aRule atIndex:(NSUInteger)idx;
-- (id)   objectAtIndex:(NSUInteger)idx;
-- (void) removeAllObjects;
-- (void)removeObjectAtIndex:(NSInteger)idx;
-
-- (void) ensureCapacity:(NSUInteger) index;
-- (NSString *) description;
-- (NSString *) toString;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRPtrBuffer.m b/runtime/ObjC/Framework/ANTLRPtrBuffer.m
deleted file mode 100644
index 392a7b7..0000000
--- a/runtime/ObjC/Framework/ANTLRPtrBuffer.m
+++ /dev/null
@@ -1,353 +0,0 @@
-//
-//  ANTLRPtrBuffer.m
-//  ANTLR
-//
-//  Created by Alan Condit on 6/9/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#define SUCCESS (0)
-#define FAILURE (-1)
-
-#import "ANTLRPtrBuffer.h"
-#import "ANTLRTree.h"
-
-/*
- * Start of ANTLRPtrBuffer
- */
-@implementation ANTLRPtrBuffer
-
-@synthesize BuffSize;
-@synthesize buffer;
-@synthesize ptrBuffer;
-@synthesize count;
-@synthesize ptr;
-
-+(ANTLRPtrBuffer *)newANTLRPtrBuffer
-{
-    return [[ANTLRPtrBuffer alloc] init];
-}
-
-+(ANTLRPtrBuffer *)newANTLRPtrBufferWithLen:(NSInteger)cnt
-{
-    return [[ANTLRPtrBuffer alloc] initWithLen:cnt];
-}
-
--(id)init
-{
-    NSUInteger idx;
-    
-    self = [super init];
-    if ( self != nil ) {
-        BuffSize  = BUFFSIZE;
-        ptr = 0;
-        buffer = [[NSMutableData dataWithLength:(NSUInteger)BuffSize * sizeof(id)] retain];
-        ptrBuffer = (id *) [buffer mutableBytes];
-        for( idx = 0; idx < BuffSize; idx++ ) {
-            ptrBuffer[idx] = nil;
-        }
-        count = 0;
-    }
-    return( self );
-}
-
--(id)initWithLen:(NSUInteger)cnt
-{
-    NSUInteger idx;
-    
-    self = [super init];
-    if ( self != nil ) {
-        BuffSize  = cnt;
-        ptr = 0;
-        buffer = [[NSMutableData dataWithLength:(NSUInteger)BuffSize * sizeof(id)] retain];
-        ptrBuffer = (id *)[buffer mutableBytes];
-        for( idx = 0; idx < BuffSize; idx++ ) {
-            ptrBuffer[idx] = nil;
-        }
-        count = 0;
-    }
-    return( self );
-}
-
--(void)dealloc
-{
-#ifdef DEBUG_DEALLOC
-    NSLog( @"called dealloc in ANTLRPtrBuffer" );
-#endif
-    ANTLRLinkBase *tmp, *rtmp;
-    NSInteger idx;
-    
-    if ( self.fNext != nil ) {
-        for( idx = 0; idx < BuffSize; idx++ ) {
-            tmp = ptrBuffer[idx];
-            while ( tmp ) {
-                rtmp = tmp;
-                if ([tmp isKindOfClass:[ANTLRLinkBase class]])
-                    tmp = (id)tmp.fNext;
-                else
-                    tmp = nil;
-                [rtmp release];
-            }
-        }
-    }
-    [buffer release];
-    [super dealloc];
-}
-
-- (id) copyWithZone:(NSZone *)aZone
-{
-    ANTLRPtrBuffer *copy;
-    
-    copy = [[[self class] allocWithZone:aZone] init];
-    if ( buffer )
-        copy.buffer = [buffer copyWithZone:aZone];
-    copy.ptrBuffer = ptrBuffer;
-    copy.ptr = ptr;
-    return copy;
-}
-
-- (void)clear
-{
-    ANTLRLinkBase *tmp, *rtmp;
-    NSInteger idx;
-
-    for( idx = 0; idx < BuffSize; idx++ ) {
-        tmp = ptrBuffer[idx];
-        while ( tmp ) {
-            rtmp = tmp;
-            if ([tmp isKindOfClass:[ANTLRLinkBase class]])
-                tmp = (id)tmp.fNext;
-            else
-                tmp = nil;
-            [rtmp dealloc];
-        }
-        ptrBuffer[idx] = nil;
-    }
-    count = 0;
-}
-
-- (NSMutableData *)getBuffer
-{
-    return( buffer );
-}
-
-- (void)setBuffer:(NSMutableData *)np
-{
-    buffer = np;
-}
-
-- (NSUInteger)getCount
-{
-    return( count );
-}
-
-- (void)setCount:(NSUInteger)aCount
-{
-    count = aCount;
-}
-
-- (id *)getPtrBuffer
-{
-    return( ptrBuffer );
-}
-
-- (void)setPtrBuffer:(id *)np
-{
-    ptrBuffer = np;
-}
-
-- (NSUInteger)getPtr
-{
-    return( ptr );
-}
-
-- (void)setPtr:(NSUInteger)aPtr
-{
-    ptr = aPtr;
-}
-
-- (void) addObject:(id) v
-{
-    [self ensureCapacity:ptr];
-    if ( v ) [v retain];
-    ptrBuffer[ptr++] = v;
-    count++;
-}
-
-- (void) push:(id) v
-{
-    if ( ptr >= BuffSize - 1 ) {
-        [self ensureCapacity:ptr];
-    }
-    if ( v ) [v retain];
-    ptrBuffer[ptr++] = v;
-    count++;
-}
-
-- (id) pop
-{
-    id v = nil;
-    if ( ptr > 0 ) {
-        v = ptrBuffer[--ptr];
-        ptrBuffer[ptr] = nil;
-    }
-    count--;
-    if ( v ) [v release];
-    return v;
-}
-
-- (id) peek
-{
-    id v = nil;
-    if ( ptr > 0 ) {
-        v = ptrBuffer[ptr-1];
-    }
-    return v;
-}
-
-- (NSUInteger)count
-{
-#ifdef DONTUSENOMO
-    int cnt = 0;
-    
-    for (NSInteger i = 0; i < BuffSize; i++ ) {
-        if ( ptrBuffer[i] != nil ) {
-            cnt++;
-        }
-    }
-    if ( cnt != count ) count = cnt;
-#endif
-    return count;
-}
-
-- (NSUInteger)length
-{
-    return BuffSize;
-}
-
-- (NSUInteger)size
-{
-    NSUInteger aSize = 0;
-    for (int i = 0; i < BuffSize; i++ ) {
-        if (ptrBuffer[i] != nil) {
-            aSize += sizeof(id);
-        }
-    }
-    return aSize;
-}
-
-- (void) insertObject:(id)aRule atIndex:(NSUInteger)idx
-{
-    if ( idx >= BuffSize ) {
-        [self ensureCapacity:idx];
-    }
-    if ( aRule != ptrBuffer[idx] ) {
-        if ( ptrBuffer[idx] ) [ptrBuffer[idx] release];
-        if ( aRule ) [aRule retain];
-    }
-    ptrBuffer[idx] = aRule;
-    count++;
-}
-
-- (id)objectAtIndex:(NSUInteger)idx
-{
-    if ( idx < BuffSize ) {
-        return ptrBuffer[idx];
-    }
-    return nil;
-}
-
-- (void)addObjectsFromArray:(ANTLRPtrBuffer *)anArray
-{
-    NSInteger cnt, i;
-    cnt = [anArray count];
-    for( i = 0; i < cnt; i++) {
-        id tmp = [anArray objectAtIndex:i];
-        if ( tmp ) [tmp retain];
-        [self insertObject:tmp atIndex:i];
-    }
-    count += cnt;
-    return;
-}
-
-- (void)removeAllObjects
-{
-    int i;
-    for ( i = 0; i < BuffSize; i++ ) {
-        if ( ptrBuffer[i] ) [ptrBuffer[i] release];
-        ptrBuffer[i] = nil;
-    }
-    count = 0;
-    ptr = 0;
-}
-
-- (void)removeObjectAtIndex:(NSInteger)idx
-{
-    int i;
-    if ( idx >= 0 && idx < count ) {
-        if ( ptrBuffer[idx] ) [ptrBuffer[idx] release];
-        for ( i = idx; i < count-1; i++ ) {
-            ptrBuffer[i] = ptrBuffer[i+1];
-        }
-        ptrBuffer[i] = nil;
-        count--;
-    }
-}
-
-- (void) ensureCapacity:(NSUInteger) anIndex
-{
-    if ((anIndex * sizeof(id)) >= [buffer length])
-    {
-        NSInteger newSize = ([buffer length] / sizeof(id)) * 2;
-        if (anIndex > newSize) {
-            newSize = anIndex + 1;
-        }
-        BuffSize = newSize;
-        [buffer setLength:(BuffSize * sizeof(id))];
-        ptrBuffer = [buffer mutableBytes];
-    }
-}
-
-- (NSString *) description
-{
-    NSMutableString *str;
-    NSInteger idx, cnt;
-    cnt = [self count];
-    str = [NSMutableString stringWithCapacity:30];
-    [str appendString:@"["];
-    for (idx = 0; idx < cnt; idx++ ) {
-        [str appendString:[[self objectAtIndex:idx] description]];
-    }
-    [str appendString:@"]"];
-    return str;
-}
-
-- (NSString *) toString
-{
-    return [self description];
-}
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRPtrStack.h b/runtime/ObjC/Framework/ANTLRPtrStack.h
deleted file mode 100644
index 7aa65a9..0000000
--- a/runtime/ObjC/Framework/ANTLRPtrStack.h
+++ /dev/null
@@ -1,51 +0,0 @@
-//
-//  ANTLRPtrStack.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/9/10.
-//  Copyright 2010 Alan's MachineWorks. All rights reserved.
-//ptrBuffer
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRBaseStack.h"
-#import "ANTLRRuleMemo.h"
-
-//#define GLOBAL_SCOPE       0
-//#define LOCAL_SCOPE        1
-#define HASHSIZE         101
-#define HBUFSIZE      0x2000
-
-@interface ANTLRPtrStack : ANTLRBaseStack {
-	//ANTLRPtrStack *fNext;
-    // TStringPool *fPool;
-}
-
-//@property (copy) ANTLRPtrStack *fNext;
-//@property (copy) TStringPool *fPool;
-
-// Contruction/Destruction
-+ (ANTLRPtrStack *)newANTLRPtrStack;
-+ (ANTLRPtrStack *)newANTLRPtrStack:(NSInteger)cnt;
-- (id)init;
-- (id)initWithLen:(NSInteger)aLen;
-- (void)dealloc;
-
-// Instance Methods
-- (id) copyWithZone:(NSZone *)aZone;
-/* clear -- reinitialize the maplist array */
-
-#ifdef DONTUSENOMO
-/* form hash value for string s */
-- (NSInteger)hash:(NSString *)s;
-/*   look for s in ptrBuffer  */
-- (id)lookup:(NSString *)s;
-/* look for s in ptrBuffer  */
-- (id)install:(id)sym;
-#endif
-
-#ifdef DONTUSENOMO
-- (id)getTType:(NSString *)name;
-- (id)getName:(NSInteger)ttype;
-#endif
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRPtrStack.m b/runtime/ObjC/Framework/ANTLRPtrStack.m
deleted file mode 100644
index 5b180f2..0000000
--- a/runtime/ObjC/Framework/ANTLRPtrStack.m
+++ /dev/null
@@ -1,191 +0,0 @@
-//
-//  ANTLRPtrStack.m
-//  ANTLR
-//
-//  Created by Alan Condit on 6/9/10.
-//  Copyright 2010 Alan's MachineWorks. All rights reserved.
-//
-#define SUCCESS (0)
-#define FAILURE (-1)
-
-#import "ANTLRPtrStack.h"
-#import "ANTLRTree.h"
-
-/*
- * Start of ANTLRPtrStack
- */
-@implementation ANTLRPtrStack
-
-+(ANTLRPtrStack *)newANTLRPtrStack
-{
-    return [[ANTLRPtrStack alloc] init];
-}
-
-+(ANTLRPtrStack *)newANTLRPtrStack:(NSInteger)cnt
-{
-    return [[ANTLRPtrStack alloc] initWithLen:cnt];
-}
-
--(id)init
-{
-	self = [super initWithLen:HASHSIZE];
-	if ( self != nil ) {
-	}
-    return( self );
-}
-
--(id)initWithLen:(NSInteger)cnt
-{
-	self = [super initWithLen:cnt];
-	if ( self != nil ) {
-	}
-    return( self );
-}
-
--(void)dealloc
-{
-#ifdef DEBUG_DEALLOC
-    NSLog( @"called dealloc in ANTLRPtrStack" );
-#endif
-	[super dealloc];
-}
-
--(void)deleteANTLRPtrStack:(ANTLRPtrStack *)np
-{
-    ANTLRLinkBase *tmp, *rtmp;
-    NSInteger idx;
-    
-    if ( self.fNext != nil ) {
-        for( idx = 0; idx < BuffSize; idx++ ) {
-            tmp = ptrBuffer[idx];
-            while ( tmp ) {
-                rtmp = tmp;
-                tmp = [tmp getfNext];
-                [rtmp release];
-            }
-        }
-    }
-}
-
-#ifdef DONTUSENOMO
-#ifdef USERDOC
-/*
- *  HASH        hash entry to get index to table
- *  NSInteger hash( ANTLRPtrStack *self, char *s );
- *
- *     Inputs:  NSString *s         string to find
- *
- *     Returns: NSInteger                 hashed value
- *
- *  Last Revision 9/03/90
- */
-#endif
--(NSInteger)hash:(NSString *)s       /*    form hash value for string s */
-{
-	NSInteger hashval;
-	const char *tmp;
-    
-	tmp = [s cStringUsingEncoding:NSASCIIStringEncoding];
-	for( hashval = 0; *tmp != '\0'; )
-        hashval += *tmp++;
-	LastHash = hashval % HashSize;
-	return( LastHash );
-}
-
-#ifdef USERDOC
-/*
- *  LOOKUP  search hashed list for entry
- *  id lookup:(NSString *)s;
- *
- *     Inputs:  NSString  *s       string to find
- *
- *     Returns: ANTLRRuleMemo  *        pointer to entry
- *
- *  Last Revision 9/03/90
- */
-#endif
--(id)lookup:(NSString *)s
-{
-    ANTLRLinkBase *np;
-    
-    for( np = ptrBuffer[[self hash:s]]; np != nil; np = [np getfNext] ) {
-        if ( [s isEqualToString:[np getName]] ) {
-            return( np );        /*   found it       */
-        }
-    }
-    return( nil );              /*   not found      */
-}
-
-#ifdef USERDOC
-/*
- *  INSTALL search hashed list for entry
- *  NSInteger install( ANTLRPtrStack *self, id sym );
- *
- *     Inputs:  ANTLRRuleMemo    *sym   -- symbol ptr to install
- *              NSInteger         scope -- level to find
- *
- *     Returns: Boolean     TRUE   if installed
- *                          FALSE  if already in table
- *
- *  Last Revision 9/03/90
- */
-#endif
--(id)install:(id)sym
-{
-    ANTLRLinkBase *np;
-    
-    np = [self lookup:[sym getName]];
-    if ( np == nil ) {
-        [sym setFNext:ptrBuffer[ LastHash ]];
-        ptrBuffer[ LastHash ] = [sym retain];
-        return( ptrBuffer[ LastHash ] );
-    }
-    return( nil );            /*   not found      */
-}
-#endif
-
--(id)getptrBufferEntry:(NSInteger)idx
-{
-	return( ptrBuffer[idx] );
-}
-
--(id *)getptrBuffer
-{
-	return( ptrBuffer );
-}
-
--(void)setptrBuffer:(id *)np
-{
-    ptrBuffer = np;
-}
-
-#ifdef DONTUSENOMO
-/*
- * works only for maplist indexed not by name but by TokenNumber
- */
-- (id)getName:(NSInteger)ttype
-{
-    id np;
-    NSInteger aTType;
-
-    aTType = ttype % HashSize;
-    for( np = ptrBuffer[ttype]; np != nil; np = [np getfNext] ) {
-        if ( np.index == ttype ) {
-            return( np );        /*   found it       */
-        }
-    }
-    return( nil );              /*   not found      */
-}
-
-- (id)getTType:(NSString *)name
-{
-    return [self lookup:name];
-}
-#endif
-
-- (id) copyWithZone:(NSZone *)aZone
-{
-    return [super copyWithZone:aZone];
-}
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRReaderStream.h b/runtime/ObjC/Framework/ANTLRReaderStream.h
index 1dd19d1..4187fe8 100644
--- a/runtime/ObjC/Framework/ANTLRReaderStream.h
+++ b/runtime/ObjC/Framework/ANTLRReaderStream.h
@@ -6,17 +6,18 @@
 //  Copyright 2011 Alan's MachineWorks. All rights reserved.
 //
 
-#import <Cocoa/Cocoa.h>
+#import <Foundation/Foundation.h>
 #import "ANTLRStringStream.h"
 
 @interface ANTLRReaderStream : ANTLRStringStream {
-    NSFileHandle *fh;
+    NSInputStream *is;
     NSInteger size;
     NSInteger rbSize;
     //NSData *data; /* ANTLRStringStream has NSString *data */
+    NSInteger p1;
 }
 
-@property (retain) NSFileHandle *fh;
+@property (retain) NSInputStream *is;
 @property (assign) NSInteger size;
 @property (assign) NSInteger rbSize;
 //@property (retain) NSData *data;
@@ -25,11 +26,13 @@
 + (NSInteger) INITIAL_BUFFER_SIZE;
 
 + (id) newANTLRReaderStream;
-+ (id) newANTLRReaderStream:(NSFileHandle *)r;
-+ (id) newANTLRReaderStream:(NSFileHandle *)r size:(NSInteger)aSize;
-+ (id) newANTLRReaderStream:(NSFileHandle *)r size:(NSInteger)aSize readBufferSize:(NSInteger)aReadChunkSize;
-- (id) initWithReader:(NSFileHandle *)r size:(NSInteger)aSize readBufferSize:(NSInteger)aReadChunkSize;
++ (id) newANTLRReaderStream:(NSInputStream *)r;
++ (id) newANTLRReaderStream:(NSInputStream *)r size:(NSInteger)aSize;
++ (id) newANTLRReaderStream:(NSInputStream *)r size:(NSInteger)aSize readBufferSize:(NSInteger)aReadChunkSize;
+- (id) initWithReader:(NSInputStream *)r size:(NSInteger)aSize readBufferSize:(NSInteger)aReadChunkSize;
 - (void) load:(NSInteger)aSize readBufferSize:(NSInteger)aReadChunkSize;
+- (void) setUpStreamForFile;
+- (void) stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode;
 - (void) close;
 
 @end
diff --git a/runtime/ObjC/Framework/ANTLRReaderStream.m b/runtime/ObjC/Framework/ANTLRReaderStream.m
index a71b827..de86e13 100644
--- a/runtime/ObjC/Framework/ANTLRReaderStream.m
+++ b/runtime/ObjC/Framework/ANTLRReaderStream.m
@@ -7,11 +7,11 @@
 //
 
 #import "ANTLRReaderStream.h"
-
+#import "ACNumber.h"
 
 @implementation ANTLRReaderStream
 
-@synthesize fh;
+@synthesize is;
 @synthesize size;
 @synthesize rbSize;
 
@@ -33,17 +33,17 @@
     return [[ANTLRReaderStream alloc] init];
 }
 
-+ (id) newANTLRReaderStream:(NSFileHandle *)r
++ (id) newANTLRReaderStream:(NSInputStream *)r
 {
     return [[ANTLRReaderStream alloc] initWithReader:r size:INITIAL_BUFFER_SIZE readBufferSize:READ_BUFFER_SIZE];
 }
 
-+ (id) newANTLRReaderStream:(NSFileHandle *)r size:(NSInteger)aSize
++ (id) newANTLRReaderStream:(NSInputStream *)r size:(NSInteger)aSize
 {
     return [[ANTLRReaderStream alloc] initWithReader:r size:aSize readBufferSize:READ_BUFFER_SIZE];
 }
 
-+ (id) newANTLRReaderStream:(NSFileHandle *)r size:(NSInteger)aSize readBufferSize:(NSInteger)aReadChunkSize
++ (id) newANTLRReaderStream:(NSInputStream *)r size:(NSInteger)aSize readBufferSize:(NSInteger)aReadChunkSize
 {
 //    load(r, aSize, aReadChunkSize);
     return [[ANTLRReaderStream alloc] initWithReader:r size:aSize readBufferSize:aReadChunkSize];
@@ -53,29 +53,36 @@
 {
 	self = [super init];
 	if ( self != nil ) {
-        fh = nil;
+        int p1 = n;  // init from ANTLRStringStream val
+        is = nil;
         rbSize = READ_BUFFER_SIZE;
         size = INITIAL_BUFFER_SIZE;
     }
     return self;
 }
 
-- (id) initWithReader:(NSFileHandle *)r size:(NSInteger)aSize readBufferSize:(NSInteger)aReadChunkSize
+- (id) initWithReader:(NSInputStream *)r size:(NSInteger)aSize readBufferSize:(NSInteger)aReadChunkSize
 {
 	self = [super init];
 	if ( self != nil ) {
-        fh = r;
+        int p1 = n;  // init from ANTLRStringStream val
+        is = r;
         rbSize = aSize;
         size = aReadChunkSize;
-        [self load:aSize readBufferSize:aReadChunkSize];
+        [is open];
+//        [self setUpStreamForFile];
+        if ( [is hasBytesAvailable] ) {
+            [self load:aSize readBufferSize:aReadChunkSize];
+        }
     }
     return self;
 }
 
 - (void) load:(NSInteger)aSize readBufferSize:(NSInteger)aReadChunkSize
 {
-    NSData *retData = nil;
-    if ( fh==nil ) {
+    NSMutableData *retData = nil;
+    uint8_t buf[1024];
+    if ( is==nil ) {
         return;
     }
     if ( aSize<=0 ) {
@@ -87,46 +94,49 @@
 #pragma mark fix these NSLog calls
     @try {
         int numRead=0;
-        int p1 = 0;
-        retData = [fh readDataToEndOfFile];
-        numRead = [retData length];
+        numRead = [is read:buf maxLength:aReadChunkSize];
+        retData = [NSMutableData dataWithCapacity:numRead];
+        [retData appendBytes:(const void *)buf length:numRead];
         NSLog( @"read %d chars; p was %d is now %d", n, p1, (p1+numRead) );
         p1 += numRead;
         n = p1;
         data = [[NSString alloc] initWithData:retData encoding:NSASCIIStringEncoding];
-        NSLog( @"n=%d", n );
+        NSLog( @"n=%d\n", n );
     }
     @finally {
-        [fh closeFile];
+        [self close];
     }
 }
 
-- (void)setUpStreamForFile:(NSString *)path {
+- (void)setUpStreamForFile
+{
     // iStream is NSInputStream instance variable
-    NSInputStream *iStream = [[NSInputStream alloc] initWithFileAtPath:path];
-//    [iStream setDelegate:self];
-    [iStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
+//    if ( is == nil )
+//        is = [[NSInputStream alloc] initWithFileAtPath:path];
+    [is setDelegate:self];
+    [is scheduleInRunLoop:[NSRunLoop currentRunLoop]
                        forMode:NSDefaultRunLoopMode];
-    [iStream open];
+    [is open];
 }
 
 - (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode
 {
     NSMutableData *myData = nil;
-    NSNumber *bytesRead = [NSNumber numberWithInteger:0];
+    ACNumber *bytesRead = [ACNumber numberWithInteger:0];
+    uint8_t buf[1024];
     switch(eventCode) {
         case NSStreamEventHasBytesAvailable:
         {
             if(!myData) {
                 myData = [[NSMutableData data] retain];
             }
-            uint8_t buf[1024];
             unsigned int len = 0;
             len = [(NSInputStream *)stream read:buf maxLength:1024];
             if(len) {
                 [myData appendBytes:(const void *)buf length:len];
-                // bytesRead is an instance variable of type NSNumber.
-                bytesRead = [NSNumber numberWithInteger:[bytesRead intValue]+len];
+                // bytesRead is an instance variable of type ACNumber.
+                bytesRead = [ACNumber numberWithInteger:[bytesRead integerValue]+len];
+                data = [[NSString alloc] initWithData:myData encoding:NSASCIIStringEncoding];
             } else {
                 NSLog(@"no buffer!");
             }
@@ -141,13 +151,14 @@
             stream = nil; // stream is ivar, so reinit it
             break;
         }
-            // continued
+        // continued
     }
 }
 
 - (void) close
 {
-    [fh closeFile];
+    [is close];
+    is = nil;
 }
 
 @end
diff --git a/runtime/ObjC/Framework/ANTLRRecognitionException.h b/runtime/ObjC/Framework/ANTLRRecognitionException.h
deleted file mode 100644
index 9bd799d..0000000
--- a/runtime/ObjC/Framework/ANTLRRecognitionException.h
+++ /dev/null
@@ -1,74 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRuntimeException.h"
-#import "ANTLRToken.h"
-#import "ANTLRIntStream.h"
-#import "ANTLRBaseTree.h"
-
-@interface ANTLRRecognitionException : ANTLRRuntimeException {
-	id<ANTLRIntStream> input;
-	NSInteger index;
-	id<ANTLRToken> token;
-	id<ANTLRBaseTree> node;
-	unichar c;
-	NSUInteger line;
-	NSUInteger charPositionInLine;
-}
-
-@property (retain, getter=getStream, setter=setStream:) id<ANTLRIntStream> input;
-@property (assign) NSInteger index;
-@property (retain, getter=getToken, setter=setToken:) id<ANTLRToken>token;
-@property (retain, getter=getNode, setter=setNode:) id<ANTLRBaseTree>node;
-@property (assign) unichar c;
-@property (assign) NSUInteger line;
-@property (assign) NSUInteger charPositionInLine;
-
-+ (id) newException;
-+ (id) newException:(id<ANTLRIntStream>) anInputStream; 
-- (id) init;
-- (id) initWithStream:(id<ANTLRIntStream>)anInputStream;
-- (id) initWithStream:(id<ANTLRIntStream>)anInputStream reason:(NSString *)aReason;
-- (id) initWithName:(NSString *)aName reason:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo;
-
-- (NSInteger) unexpectedType;
-- (id<ANTLRToken>)getUnexpectedToken;
-
-- (id<ANTLRIntStream>) getStream;
-- (void) setStream: (id<ANTLRIntStream>) aStream;
-
-- (id<ANTLRToken>) getToken;
-- (void) setToken: (id<ANTLRToken>) aToken;
-
-- (id<ANTLRBaseTree>) getNode;
-- (void) setNode: (id<ANTLRBaseTree>) aNode;
-
-- (NSString *)getMessage;
-
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRRecognitionException.m b/runtime/ObjC/Framework/ANTLRRecognitionException.m
deleted file mode 100644
index 0d0e11f..0000000
--- a/runtime/ObjC/Framework/ANTLRRecognitionException.m
+++ /dev/null
@@ -1,215 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import "ANTLRRecognitionException.h"
-#import "ANTLRTokenStream.h"
-#import "ANTLRTreeNodeStream.h"
-
-@implementation ANTLRRecognitionException
-
-@synthesize input;
-@synthesize token;
-@synthesize node;
-@synthesize line;
-@synthesize charPositionInLine;
-
-+ (id) newException
-{
-	return [[ANTLRRecognitionException alloc] init];
-}
-
-+ (id) newException:(id<ANTLRIntStream>) anInputStream
-{
-	return [[ANTLRRecognitionException alloc] initWithStream:anInputStream];
-}
-
-+ (id) newException:(id<ANTLRIntStream>) anInputStream reason:(NSString *)aReason
-{
-	return [[ANTLRRecognitionException alloc] initWithStream:anInputStream reason:aReason];
-}
-
-- (id) init
-{
-	self = [super initWithName:@"Recognition Exception" reason:@"Recognition Exception" userInfo:nil];
-	if ( self != nil ) {
-	}
-	return self;
-}
-
-- (id) initWithStream:(id<ANTLRIntStream>)anInputStream reason:(NSString *)aReason
-{
-	self = [super initWithName:NSStringFromClass([self class]) reason:aReason userInfo:nil];
-	if ( self != nil ) {
-		[self setStream:anInputStream];
-		index = input.index;
-		
-		Class inputClass = [input class];
-		if ([inputClass conformsToProtocol:@protocol(ANTLRTokenStream)]) {
-			[self setToken:[(id<ANTLRTokenStream>)input LT:1]];
-			line = token.line;
-			charPositionInLine = token.charPositionInLine;
-		} else if ([inputClass conformsToProtocol:@protocol(ANTLRCharStream)]) {
-			c = (unichar)[input LA:1];
-			line = ((id<ANTLRCharStream>)input).line;
-			charPositionInLine = ((id<ANTLRCharStream>)input).charPositionInLine;
-		} else if ([inputClass conformsToProtocol:@protocol(ANTLRTreeNodeStream)]) {
-			[self setNode:[(id<ANTLRTreeNodeStream>)input LT:1]];
-			line = [node line];
-			charPositionInLine = [node charPositionInLine];
-		} else {
-			c = (unichar)[input LA:1];
-		}
-	}
-	return self;
-}
-
-- (id) initWithStream:(id<ANTLRIntStream>)anInputStream
-{
-	self = [super initWithName:NSStringFromClass([self class]) reason:@"Runtime Exception" userInfo:nil];
-	if ( self != nil ) {
-	}
-	return self;
-}
-
-- (id) initWithName:(NSString *)aName reason:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo
-{
-	self = [super initWithName:aName reason:aReason userInfo:aUserInfo];
-	if ( self != nil ) {
-    }
-    return self;
-}
-
-- (void) dealloc
-{
-#ifdef DEBUG_DEALLOC
-    NSLog( @"called dealloc in ANTLRRecognitionException" );
-#endif
-	if ( input ) [input release];
-	if ( token ) [token release];
-	if ( node ) [node release];
-	[super dealloc];
-}
-
-- (NSInteger) unexpectedType
-{
-	if (token) {
-		return token.type;
-    } else if (node) {
-        return [node type];
-	} else {
-		return c;
-	}
-}
-
-- (id<ANTLRToken>)getUnexpectedToken
-{
-    return token;
-}
-
-- (NSString *) description
-{
-	//NSMutableString *desc = [[NSMutableString alloc] initWithString:NSStringFromClass([self class])];
-	NSMutableString *desc = [NSMutableString stringWithString:[self className]];
-	if (token) {
-		[desc appendFormat:@" token:%@", token];
-	} else if (node) {
-		[desc appendFormat:@" node:%@", node];
-	} else {
-		[desc appendFormat:@" char:%c", c];
-	}
-	[desc appendFormat:@" line:%d position:%d", line, charPositionInLine];
-	return desc;
-}
-
-//---------------------------------------------------------- 
-//  input 
-//---------------------------------------------------------- 
-- (id<ANTLRIntStream>) getStream
-{
-    return input; 
-}
-
-- (void) setStream: (id<ANTLRIntStream>) aStream
-{
-    if ( input != aStream ) {
-        if ( input ) [input release];
-        if ( aStream ) [aStream retain];
-        input = aStream;
-    }
-}
-
-//---------------------------------------------------------- 
-//  token 
-//---------------------------------------------------------- 
-- (id<ANTLRToken>) getToken
-{
-    return token; 
-}
-
-- (void) setToken: (id<ANTLRToken>) aToken
-{
-    if (token != aToken) {
-        if ( token ) [token release];
-        if ( aToken ) [aToken retain];
-        token = aToken;
-    }
-}
-
-//---------------------------------------------------------- 
-//  node 
-//---------------------------------------------------------- 
-- (id<ANTLRBaseTree>) getNode
-{
-    return node; 
-}
-
-- (void) setNode: (id<ANTLRBaseTree>) aNode
-{
-    if (node != aNode) {
-        if ( node ) [node release];
-        if ( aNode ) [aNode retain];
-        node = aNode;
-    }
-}
-
-- (NSString *)getMessage
-{
-    return @"Fix getMessage in ANTLRRecognitionException";
-}
-
-- (NSUInteger)charPositionInLine
-{
-    return charPositionInLine;
-}
-
-- (void)setCharPositionInLine:(NSUInteger)aPos
-{
-    charPositionInLine = aPos;
-}
-
-@synthesize index;
-@synthesize c;
-@end
diff --git a/runtime/ObjC/Framework/ANTLRRecognizerSharedState.h b/runtime/ObjC/Framework/ANTLRRecognizerSharedState.h
deleted file mode 100755
index 0878dba..0000000
--- a/runtime/ObjC/Framework/ANTLRRecognizerSharedState.h
+++ /dev/null
@@ -1,117 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRToken.h"
-#import "ANTLRBitSet.h"
-#import "ANTLRRuleStack.h"
-#import "AMutableArray.h"
-
-@interface ANTLRRecognizerSharedState : NSObject {
-	__strong AMutableArray *following;  // a stack of FOLLOW bitsets used for context sensitive prediction and recovery
-    NSInteger _fsp;                     // Follow stack pointer
-	BOOL errorRecovery;                 // are we recovering?
-	NSInteger lastErrorIndex;
-	BOOL failed;                        // indicate that some match failed
-    NSInteger syntaxErrors;
-	NSInteger backtracking;             // the level of backtracking
-	__strong ANTLRRuleStack *ruleMemo;	// store previous results of matching rules so we don't have to do it again. Hook in incremental stuff here, too.
-
-	__strong id<ANTLRToken> token;
-	NSInteger  tokenStartCharIndex;
-	NSUInteger tokenStartLine;
-	NSUInteger tokenStartCharPositionInLine;
-	NSUInteger channel;
-	NSUInteger type;
-	NSString   *text;
-}
-
-@property (retain, getter=getFollowing, setter=setFollowing:) AMutableArray *following;
-@property (assign) NSInteger _fsp;
-@property (assign) BOOL errorRecovery;
-@property (assign) NSInteger lastErrorIndex;
-@property (assign, getter=getFailed, setter=setFailed:) BOOL failed;
-@property (assign) NSInteger syntaxErrors;
-@property (assign, getter=getBacktracking, setter=setBacktracking:) NSInteger backtracking;
-@property (retain, getter=getRuleMemo, setter=setRuleMemo:) ANTLRRuleStack *ruleMemo;
-@property (copy, getter=getToken, setter=setToken:) id<ANTLRToken> token;
-@property (getter=type,setter=setType:) NSUInteger type;
-@property (getter=channel,setter=setChannel:) NSUInteger channel;
-@property (getter=getTokenStartLine,setter=setTokenStartLine:) NSUInteger tokenStartLine;
-@property (getter=charPositionInLine,setter=setCharPositionInLine:) NSUInteger tokenStartCharPositionInLine;
-@property (getter=getTokenStartCharIndex,setter=setTokenStartCharIndex:) NSInteger tokenStartCharIndex;
-@property (retain, getter=text, setter=setText:) NSString *text;
-
-+ (ANTLRRecognizerSharedState *) newANTLRRecognizerSharedState;
-+ (ANTLRRecognizerSharedState *) newANTLRRecognizerSharedStateWithRuleLen:(NSInteger)aLen;
-+ (ANTLRRecognizerSharedState *) newANTLRRecognizerSharedState:(ANTLRRecognizerSharedState *)aState;
-
-- (id) init;
-- (id) initWithRuleLen:(NSInteger)aLen;
-- (id) initWithState:(ANTLRRecognizerSharedState *)state;
-
-- (id<ANTLRToken>) getToken;
-- (void) setToken:(id<ANTLRToken>) theToken;
-
-- (NSUInteger)type;
-- (void) setType:(NSUInteger) theTokenType;
-
-- (NSUInteger)channel;
-- (void) setChannel:(NSUInteger) theChannel;
-
-- (NSUInteger) getTokenStartLine;
-- (void) setTokenStartLine:(NSUInteger) theTokenStartLine;
-
-- (NSUInteger) charPositionInLine;
-- (void) setCharPositionInLine:(NSUInteger) theCharPosition;
-
-- (NSInteger) getTokenStartCharIndex;
-- (void) setTokenStartCharIndex:(NSInteger) theTokenStartCharIndex;
-
-- (NSString *)text;
-- (void) setText:(NSString *) theText;
-
-
-- (AMutableArray *) getFollowing;
-- (void)setFollowing:(AMutableArray *)aFollow;
-- (ANTLRRuleStack *) getRuleMemo;
-- (void)setRuleMemo:(ANTLRRuleStack *)aRuleMemo;
-- (BOOL) isErrorRecovery;
-- (void) setIsErrorRecovery: (BOOL) flag;
-
-- (BOOL) getFailed;
-- (void) setFailed: (BOOL) flag;
-
-- (NSInteger)  getBacktracking;
-- (void) setBacktracking:(NSInteger) value;
-- (void) increaseBacktracking;
-- (void) decreaseBacktracking;
-- (BOOL) isBacktracking;
-
-- (NSInteger) lastErrorIndex;
-- (void) setLastErrorIndex:(NSInteger) value;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRRecognizerSharedState.m b/runtime/ObjC/Framework/ANTLRRecognizerSharedState.m
deleted file mode 100755
index 79dda2d..0000000
--- a/runtime/ObjC/Framework/ANTLRRecognizerSharedState.m
+++ /dev/null
@@ -1,331 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import "ANTLRRecognizerSharedState.h"
-#import "ANTLRCharStream.h"
-#import "ANTLRCommonToken.h"
-#import "ANTLRMismatchedTokenException.h"
-#import "ANTLRMismatchedRangeException.h"
-
-@implementation ANTLRRecognizerSharedState
-
-@synthesize following;
-@synthesize _fsp;
-@synthesize errorRecovery;
-@synthesize lastErrorIndex;
-@synthesize failed;
-@synthesize syntaxErrors;
-@synthesize backtracking;
-@synthesize ruleMemo;
-@synthesize token;
-@synthesize type;
-@synthesize channel;
-@synthesize tokenStartLine;
-@synthesize tokenStartCharPositionInLine;
-@synthesize tokenStartCharIndex;
-@synthesize text;
-
-+ (ANTLRRecognizerSharedState *) newANTLRRecognizerSharedState
-{
-    return [[[ANTLRRecognizerSharedState alloc] init] retain];
-}
-
-+ (ANTLRRecognizerSharedState *) newANTLRRecognizerSharedStateWithRuleLen:(NSInteger)aLen
-{
-    return [[[ANTLRRecognizerSharedState alloc] initWithRuleLen:aLen] retain];
-}
-
-+ (ANTLRRecognizerSharedState *) newANTLRRecognizerSharedState:(ANTLRRecognizerSharedState *)aState
-{
-    return [[[ANTLRRecognizerSharedState alloc] initWithState:aState] retain];
-}
-
-- (id) init
-{
-    ANTLRHashRule *aHashRule;
-	if ((self = [super init]) != nil ) {
-        following = [[AMutableArray arrayWithCapacity:10] retain];
-        _fsp = -1;
-        errorRecovery = NO;			// are we recovering?
-        lastErrorIndex = -1;
-        failed = NO;				// indicate that some match failed
-        syntaxErrors = 0;
-        backtracking = 0;			// the level of backtracking
-        tokenStartCharIndex = -1;
-        tokenStartLine = 0;
-        int cnt = 200;
-		ruleMemo = [[ANTLRRuleStack newANTLRRuleStack:cnt] retain];
-        for (int i = 0; i < cnt; i++ ) {
-            aHashRule = [[ANTLRHashRule newANTLRHashRuleWithLen:17] retain];
-            [ruleMemo addObject:aHashRule];
-        }
-#ifdef DONTUSEYET
-        token = state.token;
-        tokenStartCharIndex = state.tokenStartCharIndex;
-        tokenStartCharPositionInLine = state.tokenStartCharPositionInLine;
-        channel = state.channel;
-        type = state.type;
-        text = state.text;
-#endif
-	}
-	return self;
-}
-
-- (id) initWithRuleLen:(NSInteger)aLen
-{
-    ANTLRHashRule *aHashRule;
-	if ((self = [super init]) != nil ) {
-        following = [[AMutableArray arrayWithCapacity:10] retain];
-        _fsp = -1;
-        errorRecovery = NO;			// are we recovering?
-        lastErrorIndex = -1;
-        failed = NO;				// indicate that some match failed
-        syntaxErrors = 0;
-        backtracking = 0;			// the level of backtracking
-        tokenStartCharIndex = -1;
-        tokenStartLine = 0;
-		ruleMemo = [[ANTLRRuleStack newANTLRRuleStack:aLen] retain];
-        for (int i = 0; i < aLen; i++ ) {
-            aHashRule = [[ANTLRHashRule newANTLRHashRuleWithLen:17] retain];
-            [ruleMemo addObject:aHashRule];
-        }
-#ifdef DONTUSEYET
-        token = state.token;
-        tokenStartCharIndex = state.tokenStartCharIndex;
-        tokenStartCharPositionInLine = state.tokenStartCharPositionInLine;
-        channel = state.channel;
-        type = state.type;
-        text = state.text;
-#endif
-	}
-	return self;
-}
-
-- (id) initWithState:(ANTLRRecognizerSharedState *)aState
-{
-    ANTLRHashRule *aHashRule;
-    if ( [following count] < [aState.following count] ) {
-        //        following = new BitSet[state.following.size];
-    }
-    [following setArray:aState.following];
-    _fsp = aState._fsp;
-    errorRecovery = aState.errorRecovery;
-    lastErrorIndex = aState.lastErrorIndex;
-    failed = aState.failed;
-    syntaxErrors = aState.syntaxErrors;
-    backtracking = aState.backtracking;
-    if ( aState.ruleMemo == nil ) {
-        int cnt = 200;
-        ruleMemo = [[ANTLRRuleStack newANTLRRuleStack:cnt] retain];
-        for (int i = 0; i < cnt; i++ ) {
-            aHashRule = [[ANTLRHashRule newANTLRHashRuleWithLen:17] retain];
-            [ruleMemo addObject:aHashRule];
-        }
-    }
-    else {
-        ruleMemo = aState.ruleMemo;
-        if ( [ruleMemo count] == 0 ) {
-            int cnt = [ruleMemo length];
-            for (int i = 0; i < cnt; i++ ) {
-                [ruleMemo addObject:[[ANTLRHashRule newANTLRHashRuleWithLen:17] retain]];
-            }
-        }
-        else {
-            [ruleMemo addObjectsFromArray:aState.ruleMemo];
-        }
-    }
-    token = aState.token;
-    tokenStartCharIndex = aState.tokenStartCharIndex;
-    tokenStartCharPositionInLine = aState.tokenStartCharPositionInLine;
-    tokenStartLine = aState.tokenStartLine;
-    channel = aState.channel;
-    type = aState.type;
-    text = aState.text;
-    return( self );
-}
-
-- (void) dealloc
-{
-#ifdef DEBUG_DEALLOC
-    NSLog( @"called dealloc in ANTLRRecognizerSharedState" );
-#endif
-    if ( token ) [token release];
-	if ( following ) [following release];
-	if ( ruleMemo ) [ruleMemo release];
-	[super dealloc];
-}
-
-// token stuff
-#pragma mark Tokens
-
-- (id<ANTLRToken>)getToken
-{
-    return token; 
-}
-
-- (void) setToken: (id<ANTLRToken>) aToken
-{
-    if (token != aToken) {
-        [aToken retain];
-        if ( token ) [token release];
-        token = aToken;
-    }
-}
-
-- (NSUInteger)channel
-{
-    return channel;
-}
-
-- (void) setChannel:(NSUInteger) theChannel
-{
-    channel = theChannel;
-}
-
-- (NSUInteger) getTokenStartLine
-{
-    return tokenStartLine;
-}
-
-- (void) setTokenStartLine:(NSUInteger) theTokenStartLine
-{
-    tokenStartLine = theTokenStartLine;
-}
-
-- (NSUInteger) charPositionInLine
-{
-    return tokenStartCharPositionInLine;
-}
-
-- (void) setCharPositionInLine:(NSUInteger) theCharPosition
-{
-    tokenStartCharPositionInLine = theCharPosition;
-}
-
-- (NSInteger) getTokenStartCharIndex;
-{
-    return tokenStartCharIndex;
-}
-
-- (void) setTokenStartCharIndex:(NSInteger) theTokenStartCharIndex
-{
-    tokenStartCharIndex = theTokenStartCharIndex;
-}
-
-// error handling
-- (void) reportError:(ANTLRRecognitionException *)e
-{
-	NSLog(@"%@", e.name);
-}
-
-- (AMutableArray *) getFollowing
-{
-	return following;
-}
-
-- (void)setFollowing:(AMutableArray *)aFollow
-{
-    if ( following != aFollow ) {
-        if ( following ) [following release];
-        [aFollow retain];
-    }
-    following = aFollow;
-}
-
-- (ANTLRRuleStack *) getRuleMemo
-{
-	return ruleMemo;
-}
-
-- (void)setRuleMemo:(ANTLRRuleStack *)aRuleMemo
-{
-    if ( ruleMemo != aRuleMemo ) {
-        if ( ruleMemo ) [ruleMemo release];
-        [aRuleMemo retain];
-    }
-    ruleMemo = aRuleMemo;
-}
-
-- (BOOL) isErrorRecovery
-{
-	return errorRecovery;
-}
-
-- (void) setIsErrorRecovery: (BOOL) flag
-{
-	errorRecovery = flag;
-}
-
-
-- (BOOL) getFailed
-{
-	return failed;
-}
-
-- (void) setFailed:(BOOL)flag
-{
-	failed = flag;
-}
-
-
-- (NSInteger) backtracking
-{
-	return backtracking;
-}
-
-- (void) setBacktracking:(NSInteger) value
-{
-	backtracking = value;
-}
-
-- (void) increaseBacktracking
-{
-	backtracking++;
-}
-
-- (void) decreaseBacktracking
-{
-	backtracking--;
-}
-
-- (BOOL) isBacktracking
-{
-	return backtracking > 0;
-}
-
-
-- (NSInteger) lastErrorIndex
-{
-    return lastErrorIndex;
-}
-
-- (void) setLastErrorIndex:(NSInteger) value
-{
-	lastErrorIndex = value;
-}
-
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRRewriteRuleElementStream.h b/runtime/ObjC/Framework/ANTLRRewriteRuleElementStream.h
deleted file mode 100644
index 46e0190..0000000
--- a/runtime/ObjC/Framework/ANTLRRewriteRuleElementStream.h
+++ /dev/null
@@ -1,82 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTreeAdaptor.h"
-
-// TODO: this should be separated into stream and enumerator classes
-@interface ANTLRRewriteRuleElementStream : NSObject {
-    NSInteger cursor;
-    BOOL dirty;        ///< indicates whether the stream should return copies of its elements, set to true after a call to -reset
-    BOOL isSingleElement;
-    id singleElement;
-    __strong AMutableArray *elements;
-    
-    __strong NSString *elementDescription;
-    __strong id<ANTLRTreeAdaptor> treeAdaptor;
-}
-
-@property (assign) NSInteger cursor;
-@property (assign) BOOL dirty;
-@property (assign) BOOL isSingleElement;
-@property (assign) id singleElement;
-@property (assign) AMutableArray *elements;
-@property (assign) NSString *elementDescription;
-@property (retain) id<ANTLRTreeAdaptor> treeAdaptor;
-
-+ (ANTLRRewriteRuleElementStream*) newANTLRRewriteRuleElementStream:(id<ANTLRTreeAdaptor>)aTreeAdaptor
-                                                        description:(NSString *)anElementDescription;
-+ (ANTLRRewriteRuleElementStream*) newANTLRRewriteRuleElementStream:(id<ANTLRTreeAdaptor>)aTreeAdaptor
-                                                        description:(NSString *)anElementDescription
-                                                            element:(id)anElement;
-+ (ANTLRRewriteRuleElementStream*) newANTLRRewriteRuleElementStream:(id<ANTLRTreeAdaptor>)aTreeAdaptor
-                                                        description:(NSString *)anElementDescription
-                                                           elements:(NSArray *)theElements;
-
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription;
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription element:(id)anElement;
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription elements:(NSArray *)theElements;
-
-- (void)reset;
-
-- (id<ANTLRTreeAdaptor>) getTreeAdaptor;
-- (void) setTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor;
-
-- (void) addElement:(id)anElement;
-- (NSInteger) size;
- 
-- (BOOL) hasNext;
-- (id<ANTLRBaseTree>) nextTree;
-- (id<ANTLRBaseTree>) _next;       // internal: TODO: redesign if necessary. maybe delegate
-
-- (id) copyElement:(id)element;
-- (id) toTree:(id)element;
-
-- (NSString *) getDescription;
-- (void) setDescription:(NSString *)description;
-
-@end
-
diff --git a/runtime/ObjC/Framework/ANTLRRewriteRuleElementStream.m b/runtime/ObjC/Framework/ANTLRRewriteRuleElementStream.m
deleted file mode 100644
index 138163c..0000000
--- a/runtime/ObjC/Framework/ANTLRRewriteRuleElementStream.m
+++ /dev/null
@@ -1,258 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import "ANTLRRewriteRuleElementStream.h"
-
-@implementation ANTLRRewriteRuleElementStream
-
-@synthesize cursor;
-@synthesize dirty;
-@synthesize isSingleElement;
-@synthesize singleElement;
-@synthesize elements;
-@synthesize elementDescription;
-@synthesize treeAdaptor;
-
-+ (ANTLRRewriteRuleElementStream *) newANTLRRewriteRuleElementStream:(id<ANTLRTreeAdaptor>)aTreeAdaptor
-                                                         description:(NSString *)anElementDescription
-{
-    return [[ANTLRRewriteRuleElementStream alloc] initWithTreeAdaptor:aTreeAdaptor
-                                                          description:anElementDescription];
-}
-
-+ (ANTLRRewriteRuleElementStream *) newANTLRRewriteRuleElementStream:(id<ANTLRTreeAdaptor>)aTreeAdaptor
-                                                         description:(NSString *)anElementDescription
-                                                             element:(id)anElement
-{
-    return [[ANTLRRewriteRuleElementStream alloc] initWithTreeAdaptor:aTreeAdaptor
-                                                          description:anElementDescription
-                                                              element:anElement];
-}
-
-+ (ANTLRRewriteRuleElementStream *) newANTLRRewriteRuleElementStream:(id<ANTLRTreeAdaptor>)aTreeAdaptor
-                                                         description:(NSString *)anElementDescription
-                                                            elements:(NSArray *)theElements;
-{
-    return [[ANTLRRewriteRuleElementStream alloc] initWithTreeAdaptor:aTreeAdaptor
-                                                          description:anElementDescription
-                                                             elements:theElements];
-}
-
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription
-{
-    if ((self = [super init]) != nil) {
-        cursor = 0;
-        dirty = NO;
-        [self setDescription:anElementDescription];
-        [self setTreeAdaptor:aTreeAdaptor];
-        dirty = NO;
-        isSingleElement = YES;
-        singleElement = nil;
-        elements = nil;
-    }
-    return self;
-}
-
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription element:(id)anElement
-{
-    if ((self = [super init]) != nil) {
-        cursor = 0;
-        dirty = NO;
-        [self setDescription:anElementDescription];
-        [self setTreeAdaptor:aTreeAdaptor];
-        dirty = NO;
-        isSingleElement = YES;
-        singleElement = nil;
-        elements = nil;
-        [self addElement:anElement];
-    }
-    return self;
-}
-
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription elements:(NSArray *)theElements
-{
-    self = [super init];
-    if (self) {
-        cursor = 0;
-        dirty = NO;
-        [self setDescription:anElementDescription];
-        [self setTreeAdaptor:aTreeAdaptor];
-        dirty = NO;
-        singleElement = nil;
-        isSingleElement = NO;
-        elements = [[AMutableArray arrayWithArray:theElements] retain];
-    }
-    return self;
-}
-
-- (void) dealloc
-{
-#ifdef DEBUG_DEALLOC
-    NSLog( @"called dealloc in ANTLRRewriteRuleElementStream" );
-#endif
-    if ( singleElement && isSingleElement ) [singleElement release];
-    else if ( elements && !isSingleElement ) [elements release];
-    [self setDescription:nil];
-    [self setTreeAdaptor:nil];
-    [super dealloc];
-}
-
-- (void)reset
-{
-    cursor = 0;
-    dirty = YES;
-}
-
-- (id<ANTLRTreeAdaptor>) getTreeAdaptor
-{
-    return treeAdaptor;
-}
-
-- (void) setTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor
-{
-    if (treeAdaptor != aTreeAdaptor) {
-        if ( treeAdaptor ) [treeAdaptor release];
-        treeAdaptor = aTreeAdaptor;
-        [treeAdaptor retain];
-    }
-}
-
-- (void) addElement: (id)anElement
-{
-    if (anElement == nil)
-        return;
-    if (elements != nil) {
-        [elements addObject:anElement];
-        return;
-        }
-    if (singleElement == nil) {
-        singleElement = anElement;
-        singleElement = [anElement retain];
-        return;
-    }
-    isSingleElement = NO;
-    elements = [[AMutableArray arrayWithCapacity:5] retain];
-    [elements addObject:singleElement];
-    singleElement = nil;  // balance previous retain in initializer/addElement
-    [elements addObject:anElement];
-}
-
-- (void) setElement: (id)anElement
-{
-    if (anElement == nil)
-        return;
-    if (elements != nil) {
-        [elements addObject:anElement];
-        return;
-        }
-    if (singleElement == nil) {
-        singleElement = anElement;
-        singleElement = [anElement retain];
-        return;
-    }
-    isSingleElement = NO;
-    elements = [[AMutableArray arrayWithCapacity:5] retain];
-    [elements addObject:singleElement];
-    singleElement = nil;  // balance previous retain in initializer/addElement
-    [elements addObject:anElement];
-}
-
-- (id<ANTLRBaseTree>) nextTree
-{
-    NSInteger n = [self size];
-    if ( dirty && (cursor >= 0 && n == 1)) {
-        // if out of elements and size is 1, dup
-        id element = [self _next];
-        return [self copyElement:element];
-    }
-    // test size above then fetch
-    id element = [self _next];
-    return element;
-}
-
-- (id) _next       // internal: TODO: redesign if necessary. maybe delegate
-{
-    NSInteger n = [self size];
-    if (n == 0) {
-        @throw [NSException exceptionWithName:@"RewriteEmptyStreamException" reason:nil userInfo:nil];// TODO: fill in real exception
-    }
-    if ( cursor >= n ) {
-        if ( n == 1 ) {
-            return [self toTree:singleElement]; // will be dup'ed in -next
-        }
-        @throw [NSException exceptionWithName:@"RewriteCardinalityException" reason:nil userInfo:nil];// TODO: fill in real exception
-    }
-    if (singleElement != nil) {
-        cursor++;
-        return [self toTree:singleElement];
-    }
-    id el = [elements objectAtIndex:cursor];
-    cursor++;
-    return [self toTree:el];
-}
-
-- (BOOL) hasNext
-{
-    return (singleElement != nil && cursor < 1) ||
-            (elements != nil && cursor < [elements count]);
-}
-
-- (NSInteger) size
-{
-    NSInteger n = 0;
-    if (singleElement != nil)
-        n = 1;
-    if (elements != nil)
-        return [elements count];
-    return n;
-}
-
-- (id) copyElement:(id)element
-{
-    [self doesNotRecognizeSelector:_cmd];   // subclass responsibility
-    return nil;
-}
-
-- (id<ANTLRBaseTree>) toTree:(id)element
-{
-    return element;
-}
-
-- (NSString *) getDescription
-{
-    return elementDescription;
-}
-
-- (void) setDescription:(NSString *) description
-{
-    if ( description != nil && description != elementDescription ) {
-        if (elementDescription != nil) [elementDescription release];
-        elementDescription = [NSString stringWithString:description];
-        [elementDescription retain];
-    }
-}
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRRewriteRuleNodeStream.h b/runtime/ObjC/Framework/ANTLRRewriteRuleNodeStream.h
deleted file mode 100755
index 2789e45..0000000
--- a/runtime/ObjC/Framework/ANTLRRewriteRuleNodeStream.h
+++ /dev/null
@@ -1,46 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRewriteRuleElementStream.h"
-
-@interface ANTLRRewriteRuleNodeStream : ANTLRRewriteRuleElementStream {
-
-}
-
-+ (ANTLRRewriteRuleNodeStream *) newANTLRRewriteRuleNodeStream:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription;
-+ (ANTLRRewriteRuleNodeStream *) newANTLRRewriteRuleNodeStream:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription element:(id)anElement;
-+ (ANTLRRewriteRuleNodeStream *) newANTLRRewriteRuleNode:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription elements:(NSArray *)theElements;
-
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription;
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription element:(id)anElement;
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription elements:(NSArray *)theElements;
-
-- (id) nextNode;
-- (id) toTree:(id<ANTLRBaseTree>)element;
-- (id) dup:(id)element;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRRewriteRuleNodeStream.m b/runtime/ObjC/Framework/ANTLRRewriteRuleNodeStream.m
deleted file mode 100755
index 8dfedd7..0000000
--- a/runtime/ObjC/Framework/ANTLRRewriteRuleNodeStream.m
+++ /dev/null
@@ -1,74 +0,0 @@
-//
-//  ANTLRRewriteRuleNodeStream.m
-//  ANTLR
-//
-//  Created by Kay Röpke on 7/16/07.
-//  Copyright 2007 classDump. All rights reserved.
-//
-
-#import "ANTLRRewriteRuleNodeStream.h"
-#import "ANTLRRuntimeException.h"
-
-@implementation ANTLRRewriteRuleNodeStream
-
-+ (ANTLRRewriteRuleNodeStream*) newANTLRRewriteRuleNodeStream:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription;
-{
-    return [[ANTLRRewriteRuleNodeStream alloc] initWithTreeAdaptor:aTreeAdaptor description:anElementDescription];
-}
-
-+ (ANTLRRewriteRuleNodeStream*) newANTLRRewriteRuleNodeStream:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription element:(id)anElement;
-{
-    return [[ANTLRRewriteRuleNodeStream alloc] initWithTreeAdaptor:aTreeAdaptor description:anElementDescription element:anElement];
-}
-
-+ (ANTLRRewriteRuleNodeStream*) newANTLRRewriteRuleNode:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription elements:(NSArray *)theElements;
-{
-    return [[ANTLRRewriteRuleNodeStream alloc] initWithTreeAdaptor:aTreeAdaptor description:anElementDescription elements:theElements];
-}
-
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription
-{
-    if ((self = [super initWithTreeAdaptor:aTreeAdaptor description:anElementDescription]) != nil) {
-        dirty = NO;
-        isSingleElement = YES;
-    }
-    return self;
-}
-
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription element:(id)anElement
-{
-    if ((self = [super initWithTreeAdaptor:aTreeAdaptor description:anElementDescription element:anElement]) != nil) {
-        dirty = NO;
-    }
-    return self;
-}
-
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription elements:(NSArray *)theElements
-{
-    if ((self = [super init]) != nil) {
-        dirty = NO;
-    }
-    return self;
-}
-
-
-- (id) nextNode
-{
-    if (dirty || (cursor >= [self size] && [self size] == 1))
-        return [treeAdaptor dupNode:[self _next]];
-    else 
-        return [self _next];
-}
-
-- (id<ANTLRBaseTree>) toTree:(id<ANTLRBaseTree>)element
-{
-    return [treeAdaptor dupNode:element];
-}
-
-- (id) dup:(id)element
-{
-    return [treeAdaptor dupTree:element];
-    @throw [ANTLRRuntimeException newException:@"ANTLRUnsupportedOperationException" reason:@"dup can't be called for a node stream."];
-}
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRRewriteRuleSubtreeStream.h b/runtime/ObjC/Framework/ANTLRRewriteRuleSubtreeStream.h
deleted file mode 100644
index 1d18b24..0000000
--- a/runtime/ObjC/Framework/ANTLRRewriteRuleSubtreeStream.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRewriteRuleElementStream.h"
-
-@interface ANTLRRewriteRuleSubtreeStream : ANTLRRewriteRuleElementStream {
-
-}
-
-+ (ANTLRRewriteRuleSubtreeStream *) newANTLRRewriteRuleSubtreeStream:(id<ANTLRTreeAdaptor>)aTreeAdaptor
-                                                         description:(NSString *)anElementDescription;
-+ (ANTLRRewriteRuleSubtreeStream *) newANTLRRewriteRuleSubtreeStream:(id<ANTLRTreeAdaptor>)aTreeAdaptor
-                                                         description:(NSString *)anElementDescription
-                                                             element:(id)anElement;
-+ (ANTLRRewriteRuleSubtreeStream *) newANTLRRewriteRuleSubtreeStream:(id<ANTLRTreeAdaptor>)aTreeAdaptor
-                                                         description:(NSString *)anElementDescription
-                                                            elements:(NSArray *)theElements;
-
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription;
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription element:(id)anElement;
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription elements:(NSArray *)theElements;
-
-- (id) nextNode;
-- (id) dup:(id)element;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRRewriteRuleSubtreeStream.m b/runtime/ObjC/Framework/ANTLRRewriteRuleSubtreeStream.m
deleted file mode 100644
index 48910bd..0000000
--- a/runtime/ObjC/Framework/ANTLRRewriteRuleSubtreeStream.m
+++ /dev/null
@@ -1,101 +0,0 @@
-//
-//  ANTLRRewriteRuleSubtreeStream.m
-//  ANTLR
-//
-//  Created by Kay Röpke on 7/16/07.
-// [The "BSD licence"]
-// Copyright (c) 2007 Kay Röpke 2010 Alan Condit
-// 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.
-
-#import "ANTLRRewriteRuleSubtreeStream.h"
-
-
-@implementation ANTLRRewriteRuleSubtreeStream
-
-+ (ANTLRRewriteRuleSubtreeStream*) newANTLRRewriteRuleSubtreeStream:(id<ANTLRTreeAdaptor>)aTreeAdaptor
-                                                        description:(NSString *)anElementDescription;
-{
-    return [[ANTLRRewriteRuleSubtreeStream alloc] initWithTreeAdaptor:aTreeAdaptor
-                                                          description:anElementDescription];
-}
-
-+ (ANTLRRewriteRuleSubtreeStream*) newANTLRRewriteRuleSubtreeStream:(id<ANTLRTreeAdaptor>)aTreeAdaptor
-                                                        description:(NSString *)anElementDescription
-                                                            element:(id)anElement;
-{
-    return [[ANTLRRewriteRuleSubtreeStream alloc] initWithTreeAdaptor:aTreeAdaptor
-                                                          description:anElementDescription
-                                                              element:anElement];
-}
-
-+ (ANTLRRewriteRuleSubtreeStream*) newANTLRRewriteRuleSubtreeStream:(id<ANTLRTreeAdaptor>)aTreeAdaptor
-                                                        description:(NSString *)anElementDescription
-                                                           elements:(NSArray *)theElements;
-{
-    return [[ANTLRRewriteRuleSubtreeStream alloc] initWithTreeAdaptor:aTreeAdaptor
-                                                          description:anElementDescription
-                                                             elements:theElements];
-}
-
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription
-{
-    if ((self = [super initWithTreeAdaptor:aTreeAdaptor description:anElementDescription]) != nil) {
-        dirty = NO;
-        isSingleElement = YES;
-    }
-    return self;
-}
-
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription element:(id)anElement
-{
-    if ((self = [super initWithTreeAdaptor:aTreeAdaptor description:anElementDescription element:anElement]) != nil) {
-        dirty = NO;
-    }
-    return self;
-}
-
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription elements:(NSArray *)theElements
-{
-    if ((self = [super initWithTreeAdaptor:aTreeAdaptor description:anElementDescription elements:theElements]) != nil) {
-        dirty = NO;
-    }
-    return self;
-}
-
-
-- (id) nextNode
-{
-    if (dirty || (cursor >= [self size] && [self size] == 1))
-        return [treeAdaptor dupNode:[self _next]];
-    else 
-        return [self _next];
-}
-
-- (id) dup:(id)element
-{
-    return [treeAdaptor dupTree:element];
-}
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRRewriteRuleTokenStream.h b/runtime/ObjC/Framework/ANTLRRewriteRuleTokenStream.h
deleted file mode 100644
index 620a0bd..0000000
--- a/runtime/ObjC/Framework/ANTLRRewriteRuleTokenStream.h
+++ /dev/null
@@ -1,66 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRewriteRuleElementStream.h"
-
-
-@interface ANTLRRewriteRuleTokenStream : ANTLRRewriteRuleElementStream {
-
-}
-
-+ (id) newANTLRRewriteRuleTokenStream:(id<ANTLRTreeAdaptor>)anAdaptor
-                          description:(NSString *)elementDescription;
-/** Create a stream with one element */
-+ (id) newANTLRRewriteRuleTokenStream:(id<ANTLRTreeAdaptor>)adaptor
-                          description:(NSString *)elementDescription
-                              element:(id) oneElement;
-/** Create a stream, but feed off an existing list */
-+ (id) newANTLRRewriteRuleTokenStream:(id<ANTLRTreeAdaptor>)adaptor
-                          description:(NSString *)elementDescription
-                             elements:(AMutableArray *)elements;
-
-- (id) init;
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)anAdaptor
-               description:(NSString *)aDescription;
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)anAdaptor 
-               description:(NSString *)aDescription
-                   element:(id)element;
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)anAdaptor
-               description:(NSString *)aDescription
-                  elements:(AMutableArray *)elements;
-                               
-/** Get next token from stream and make a node for it */
-- (id) nextNode;
-
-- (id) nextToken;
-
-/** Don't convert to a tree unless they explicitly call nextTree.
- *  This way we can do hetero tree nodes in rewrite.
- */
-- (id<ANTLRBaseTree>) toTree:(id<ANTLRToken>)element;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRRewriteRuleTokenStream.m b/runtime/ObjC/Framework/ANTLRRewriteRuleTokenStream.m
deleted file mode 100644
index 5aea3f8..0000000
--- a/runtime/ObjC/Framework/ANTLRRewriteRuleTokenStream.m
+++ /dev/null
@@ -1,128 +0,0 @@
-//
-//  ANTLRRewriteRuleTokenStream.m
-//  ANTLR
-//
-//  Created by Kay Röpke on 7/16/07.
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import "ANTLRRewriteRuleTokenStream.h"
-#import "ANTLRRuntimeException.h"
-#import "ANTLRHashMap.h"
-#import "ANTLRMapElement.h"
-
-@implementation ANTLRRewriteRuleTokenStream
-
-+ (id) newANTLRRewriteRuleTokenStream:(id<ANTLRTreeAdaptor>)anAdaptor
-                          description:(NSString *)elementDescription
-{
-    return [[ANTLRRewriteRuleTokenStream alloc] initWithTreeAdaptor:anAdaptor
-                                                        description:elementDescription];
-}
-
-/** Create a stream with one element */
-+ (id) newANTLRRewriteRuleTokenStream:(id<ANTLRTreeAdaptor>)adaptor
-                          description:(NSString *)elementDescription
-                              element:(id) oneElement
-{
-    return [[ANTLRRewriteRuleTokenStream alloc] initWithTreeAdaptor:adaptor
-                                                        description:elementDescription
-                                                            element:oneElement];
-}
-
-/** Create a stream, but feed off an existing list */
-+ (id) newANTLRRewriteRuleTokenStream:(id<ANTLRTreeAdaptor>)adaptor
-                          description:(NSString *)elementDescription
-                             elements:(AMutableArray *)elements
-{
-    return [[ANTLRRewriteRuleTokenStream alloc] initWithTreeAdaptor:adaptor
-                                                        description:elementDescription
-                                                           elements:elements];
-}
-
-- (id) init
-{
-    if ((self = [super init]) != nil ) {
-    }
-    return self;
-}
-
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)anAdaptor
-               description:(NSString *)aDescription
-{
-    if ((self = [super initWithTreeAdaptor:anAdaptor
-                               description:aDescription]) != nil ) {
-    }
-    return self;
-}
-
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)anAdaptor
-               description:(NSString *)aDescription
-                   element:(id)anElement
-{
-    if ((self = [super initWithTreeAdaptor:anAdaptor
-                               description:aDescription
-                                   element:anElement]) != nil ) {
-    }
-    return self;
-}
-
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)anAdaptor
-               description:(NSString *)aDescription
-                  elements:(AMutableArray *)elementList
-{
-    if ((self = [super initWithTreeAdaptor:anAdaptor
-                               description:aDescription
-                                  elements:elementList]) != nil ) {
-    }
-    return self;
-}
-
-- (id<ANTLRBaseTree>) nextNode
-{
-    id<ANTLRToken> t = [self _next];
-    return [treeAdaptor create:t];
-}
-
-- (id) nextToken
-{
-    return [self _next];
-}
-
-/** Don't convert to a tree unless they explicitly call nextTree.
- *  This way we can do hetero tree nodes in rewrite.
- */
-- (id<ANTLRBaseTree>) toTree:(id<ANTLRToken>)element
-{
-    return element;
-}
-
-- (id) copyElement:(id)element
-{
-    @throw [ANTLRRuntimeException newException:@"copy can't be called for a token stream."];
-}
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRRuleMapElement.h b/runtime/ObjC/Framework/ANTLRRuleMapElement.h
deleted file mode 100644
index e040b18..0000000
--- a/runtime/ObjC/Framework/ANTLRRuleMapElement.h
+++ /dev/null
@@ -1,55 +0,0 @@
-//
-//  ANTLRRuleMapElement.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/16/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRBaseMapElement.h"
-
-@interface ANTLRRuleMapElement : ANTLRBaseMapElement {
-    NSNumber *ruleNum;
-}
-
-@property (retain, getter=getRuleNum, setter=setRuleNum:) NSNumber *ruleNum;
-
-+ (ANTLRRuleMapElement *) newANTLRRuleMapElement;
-+ (ANTLRRuleMapElement *) newANTLRRuleMapElementWithIndex:(NSNumber *)anIdx;
-+ (ANTLRRuleMapElement *) newANTLRRuleMapElementWithIndex:(NSNumber *)anIdx RuleNum:(NSNumber *)aRuleNum;
-- (id) init;
-- (id) initWithAnIndex:(NSNumber *)anIdx;
-- (id) initWithAnIndex:(NSNumber *)anIdx RuleNum:(NSNumber *)aRuleNum;
-
-- (id) copyWithZone:(NSZone *)aZone;
-
-- (NSNumber *)getRuleNum;
-- (void)setRuleNum:(NSNumber *)aRuleNum;
-
-- (NSInteger)size;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRRuleMapElement.m b/runtime/ObjC/Framework/ANTLRRuleMapElement.m
deleted file mode 100644
index 0e8c463..0000000
--- a/runtime/ObjC/Framework/ANTLRRuleMapElement.m
+++ /dev/null
@@ -1,111 +0,0 @@
-//
-//  ANTLRRuleMapElement.m
-//  ANTLR
-//
-//  Created by Alan Condit on 6/16/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import "ANTLRRuleMapElement.h"
-
-
-@implementation ANTLRRuleMapElement
-
-@synthesize ruleNum;
-
-+ (ANTLRRuleMapElement *)newANTLRRuleMapElement
-{
-    return [[ANTLRRuleMapElement alloc] init];
-}
-
-+ (ANTLRRuleMapElement *)newANTLRRuleMapElementWithIndex:(NSNumber *)aNumber
-{
-    return [[ANTLRRuleMapElement alloc] initWithAnIndex:(NSNumber *)aNumber];
-}
-
-+ (ANTLRRuleMapElement *)newANTLRRuleMapElementWithIndex:(NSNumber *)aNumber RuleNum:(NSNumber *)aRuleNum
-{
-    return [[ANTLRRuleMapElement alloc] initWithAnIndex:aNumber RuleNum:aRuleNum];
-}
-
-- (id) init
-{
-    if ((self = [super init]) != nil ) {
-        index = nil;
-        ruleNum = nil;
-    }
-    return (self);
-}
-
-- (id) initWithAnIndex:(NSNumber *)aNumber
-{
-    if ((self = [super initWithAnIndex:aNumber]) != nil ) {
-        ruleNum = nil;
-    }
-    return (self);
-}
-
-- (id) initWithAnIndex:(NSNumber *)aNumber RuleNum:(NSNumber *)aRuleNum
-{
-    if ((self = [super initWithAnIndex:aNumber]) != nil ) {
-        [aRuleNum retain];
-        ruleNum = aRuleNum;
-    }
-    return (self);
-}
-
-- (id) copyWithZone:(NSZone *)aZone
-{
-    ANTLRRuleMapElement *copy;
-    
-    copy = [super copyWithZone:aZone];
-    copy.ruleNum = ruleNum;
-    return( copy );
-}
-
-- (id)getRuleNum
-{
-    return ruleNum;
-}
-
-- (void)setRuleNum:(id)aRuleNum
-{
-    if ( aRuleNum != ruleNum ) {
-        if ( ruleNum ) [ruleNum release];
-        [aRuleNum retain];
-    }
-    ruleNum = aRuleNum;
-}
-
-- (NSInteger)size
-{
-    NSInteger aSize = 0;
-    if (ruleNum != nil) aSize++;
-    if (index != nil) aSize++;
-    return( aSize );
-}
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRRuleMemo.h b/runtime/ObjC/Framework/ANTLRRuleMemo.h
deleted file mode 100644
index ed95af6..0000000
--- a/runtime/ObjC/Framework/ANTLRRuleMemo.h
+++ /dev/null
@@ -1,60 +0,0 @@
-//
-//  ANTLRRuleMemo.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/16/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRLinkBase.h"
-
-@interface ANTLRRuleMemo : ANTLRLinkBase {
-    NSNumber *startIndex;
-    NSNumber *stopIndex;
-}
-
-@property (retain, getter=getStartIndex, setter=setStartIndex:) NSNumber *startIndex;
-@property (retain, getter=getStopIndex, setter=setStopIndex:) NSNumber *stopIndex;
-
-+ (ANTLRRuleMemo *)newANTLRRuleMemo;
-+ (ANTLRRuleMemo *)newANTLRRuleMemoWithStartIndex:(NSNumber *)aStartIndex StopIndex:(NSNumber *)aStopIndex;
-
-- (id) init;
-- (id) initWithStartIndex:(NSNumber *)aStartIndex StopIndex:(NSNumber *)aStopIndex;
-
-- (NSInteger)count;
-- (NSInteger)size;
-
-- (ANTLRRuleMemo *)getRuleWithStartIndex:(NSInteger)aStartIndex;
-- (NSNumber *)getStartIndex:(NSInteger)aStartIndex;
-- (NSNumber *)getStopIndex:(NSInteger)aStartIndex;
-- (NSNumber *)getStartIndex;
-- (void)setStartIndex:(NSNumber *)aStartIndex;
-- (NSNumber *)getStopIndex;
-- (void)setStopIndex:(NSNumber *)aStopIndex;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRRuleMemo.m b/runtime/ObjC/Framework/ANTLRRuleMemo.m
deleted file mode 100644
index 836d355..0000000
--- a/runtime/ObjC/Framework/ANTLRRuleMemo.m
+++ /dev/null
@@ -1,158 +0,0 @@
-//
-//  ANTLRRuleMemo.m
-//  ANTLR
-//
-//  Created by Alan Condit on 6/16/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import "ANTLRRuleMemo.h"
-
-
-@implementation ANTLRRuleMemo
-
-@synthesize startIndex;
-@synthesize stopIndex;
-
-+ (ANTLRRuleMemo *)newANTLRRuleMemo
-{
-    return [[ANTLRRuleMemo alloc] init];
-}
-
-+ (ANTLRRuleMemo *)newANTLRRuleMemoWithStartIndex:(NSNumber *)anIndex StopIndex:(NSNumber *)aStopIndex
-{
-    return [[ANTLRRuleMemo alloc] initWithStartIndex:anIndex StopIndex:aStopIndex];
-}
-
-- (id) init
-{
-    if ((self = [super init]) != nil ) {
-        startIndex = nil;
-        stopIndex = nil;
-    }
-    return (self);
-}
-
-- (id) initWithStartIndex:(NSNumber *)aStartIndex StopIndex:(NSNumber *)aStopIndex
-{
-    if ((self = [super init]) != nil ) {
-        [aStartIndex retain];
-        startIndex = aStartIndex;
-        [aStopIndex retain];
-        stopIndex = aStopIndex;
-    }
-    return (self);
-}
-
-- (id) copyWithZone:(NSZone *)aZone
-{
-    ANTLRRuleMemo *copy;
-    
-    copy = [super copyWithZone:aZone];
-    copy.startIndex = startIndex;
-    copy.stopIndex = stopIndex;
-    return( copy );
-}
-
-- (NSInteger)count
-{
-    NSInteger aCnt = 0;
-    
-    if (startIndex != nil) aCnt++;
-    if (stopIndex != nil) aCnt++;
-    return aCnt;
-}
-
-- (NSInteger) size
-{
-    return (2 * sizeof(id));
-}
-
-- (ANTLRRuleMemo *)getRuleWithStartIndex:(NSInteger)aStartIndex
-{
-    ANTLRRuleMemo *aMatchMemo = self;
-    do {
-        if (aStartIndex == [aMatchMemo.startIndex integerValue] ) {
-            return aMatchMemo;
-        }
-        aMatchMemo = aMatchMemo.fNext;
-    } while ( aMatchMemo != nil );
-    return nil;
-}
-
-- (NSNumber *)getStartIndex:(NSInteger)aStartIndex
-{
-    ANTLRRuleMemo *aMatchMemo = self;
-    do {
-        if (aStartIndex == [aMatchMemo.startIndex integerValue] ) {
-            return aMatchMemo.stopIndex;
-        }
-        aMatchMemo = aMatchMemo.fNext;
-    } while ( aMatchMemo != nil );
-    return nil;
-}
-
-- (NSNumber *)getStopIndex:(NSInteger)aStartIndex
-{
-    ANTLRRuleMemo *aMatchMemo = self;
-    do {
-        if (aStartIndex == [aMatchMemo.startIndex integerValue] ) {
-            return aMatchMemo.stopIndex;
-        }
-        aMatchMemo = aMatchMemo.fNext;
-    } while ( aMatchMemo != nil );
-    return nil;
-}
-
-- (NSNumber *)getStartIndex;
-{
-    return startIndex;
-}
-
-- (void)setStartIndex:(NSNumber *)aStartIndex
-{
-    if ( aStartIndex != startIndex ) {
-        if ( startIndex ) [startIndex release];
-        [aStartIndex retain];
-    }
-    startIndex = aStartIndex;
-}
-
-- (NSNumber *)getStopIndex;
-{
-    return stopIndex;
-}
-
-- (void)setStopIndex:(NSNumber *)aStopIndex
-{
-    if ( aStopIndex != stopIndex ) {
-        if ( stopIndex ) [stopIndex release];
-        [aStopIndex retain];
-    }
-    stopIndex = aStopIndex;
-}
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRRuleReturnScope.h b/runtime/ObjC/Framework/ANTLRRuleReturnScope.h
deleted file mode 100644
index b9313ed..0000000
--- a/runtime/ObjC/Framework/ANTLRRuleReturnScope.h
+++ /dev/null
@@ -1,55 +0,0 @@
-//
-//  ANTLRRuleReturnScope.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/17/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRToken.h"
-
-@interface ANTLRRuleReturnScope : NSObject <NSCopying> {
-
-}
-
-/** Return the start token or tree */
-- (id<ANTLRToken>) getStart;
-
-/** Return the stop token or tree */
-- (id<ANTLRToken>) getStop;
-
-/** Has a value potentially if output=AST; */
-- (id) getTree;
-
-/** Has a value potentially if output=template; Don't use StringTemplate
- *  type as it then causes a dependency with ST lib.
- */
-- (id) getTemplate;
-
-- (id) copyWithZone:(NSZone *)theZone;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRRuleReturnScope.m b/runtime/ObjC/Framework/ANTLRRuleReturnScope.m
deleted file mode 100644
index 70878a3..0000000
--- a/runtime/ObjC/Framework/ANTLRRuleReturnScope.m
+++ /dev/null
@@ -1,71 +0,0 @@
-//
-//  ANTLRRuleReturnScope.m
-//  ANTLR
-//
-//  Created by Alan Condit on 6/17/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import "ANTLRRuleReturnScope.h"
-
-
-@implementation ANTLRRuleReturnScope
-
-/** Return the start token or tree */
-- (id) getStart
-{
-    return nil;
-}
-
-/** Return the stop token or tree */
-- (id) getStop
-{
-    return nil;
-}
-
-/** Has a value potentially if output=AST; */
-- (id) getTree
-{
-    return nil;
-}
-
-/** Has a value potentially if output=template; Don't use StringTemplate
- *  type as it then causes a dependency with ST lib.
- */
-- (id) getTemplate
-{
-    return nil;
-}
-
-// create a copy, including the text if available
-// the input stream is *not* copied!
-- (id) copyWithZone:(NSZone *)theZone
-{
-    ANTLRRuleReturnScope *copy = [[[self class] allocWithZone:theZone] init];
-    return copy;
-}
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRRuleStack.h b/runtime/ObjC/Framework/ANTLRRuleStack.h
deleted file mode 100644
index 12d450b..0000000
--- a/runtime/ObjC/Framework/ANTLRRuleStack.h
+++ /dev/null
@@ -1,63 +0,0 @@
-//
-//  ANTLRRuleStack.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/9/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRBaseStack.h"
-#import "ANTLRHashRule.h"
-
-//#define GLOBAL_SCOPE       0
-//#define LOCAL_SCOPE        1
-#define HASHSIZE         101
-#define HBUFSIZE      0x2000
-
-@interface ANTLRRuleStack : ANTLRBaseStack {
-}
-
-// Contruction/Destruction
-+(ANTLRRuleStack *)newANTLRRuleStack;
-+(ANTLRRuleStack *)newANTLRRuleStack:(NSInteger)cnt;
--(id)init;
--(id)initWithLen:(NSInteger)cnt;
--(void)dealloc;
-
-// Instance Methods
-- (id) copyWithZone:(NSZone *)aZone;
-/* clear -- reinitialize the maplist array */
-
-- (NSInteger)count;
-- (NSInteger)size;
-
-- (ANTLRHashRule *) pop;
-
-- (void) insertObject:(ANTLRHashRule *)aHashRule atIndex:(NSInteger)idx;
-- (ANTLRHashRule *)objectAtIndex:(NSInteger)idx;
-- (void)putHashRuleAtRuleIndex:(NSInteger)aRuleIndex StartIndex:(NSInteger)aStartIndex StopIndex:(NSInteger)aStopIndex;
-@end
diff --git a/runtime/ObjC/Framework/ANTLRRuleStack.m b/runtime/ObjC/Framework/ANTLRRuleStack.m
deleted file mode 100644
index 39e93b2..0000000
--- a/runtime/ObjC/Framework/ANTLRRuleStack.m
+++ /dev/null
@@ -1,152 +0,0 @@
-//
-//  ANTLRRuleStack.m
-//  ANTLR
-//
-//  Created by Alan Condit on 6/9/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#define SUCCESS (0)
-#define FAILURE (-1)
-
-extern NSInteger debug;
-
-#import "ANTLRRuleStack.h"
-#import "ANTLRTree.h"
-
-/*
- * Start of ANTLRRuleStack
- */
-@implementation ANTLRRuleStack
-
-+ (ANTLRRuleStack *)newANTLRRuleStack
-{
-    return [[ANTLRRuleStack alloc] init];
-}
-
-+ (ANTLRRuleStack *)newANTLRRuleStack:(NSInteger)cnt
-{
-    return [[ANTLRRuleStack alloc] initWithLen:cnt];
-}
-
-- (id)init
-{
-	if ((self = [super init]) != nil) {
-	}
-    return( self );
-}
-
-- (id)initWithLen:(NSInteger)cnt
-{
-	if ((self = [super initWithLen:cnt]) != nil) {
-	}
-    return( self );
-}
-
-- (void)dealloc
-{
-#ifdef DEBUG_DEALLOC
-    NSLog( @"called dealloc in ANTLRRuleStack" );
-#endif
-	[super dealloc];
-}
-
-- (id) copyWithZone:(NSZone *)aZone
-{
-    return [super copyWithZone:aZone];
-}
-
-- (NSInteger)count
-{
-    ANTLRRuleMemo *anElement;
-    NSInteger aCnt = 0;
-    for( int i = 0; i < BuffSize; i++ ) {
-        if ((anElement = ptrBuffer[i]) != nil)
-            aCnt++;
-    }
-    return aCnt;
-}
-
-- (NSInteger)size
-{
-    ANTLRRuleMemo *anElement;
-    NSInteger aSize = 0;
-    for( int i = 0; i < BuffSize; i++ ) {
-        if ((anElement = ptrBuffer[i]) != nil) {
-            aSize++;
-        }
-    }
-    return aSize;
-}
-
-- (ANTLRHashRule *)pop
-{
-    return (ANTLRHashRule *)[super pop];
-}
-
-- (void) insertObject:(ANTLRHashRule *)aRule atIndex:(NSInteger)idx
-{
-    if ( idx >= BuffSize ) {
-        if ( debug > 2 ) NSLog( @"In ANTLRRuleStack attempting to insert aRule at Index %d, but Buffer is only %d long\n", idx, BuffSize );
-        [self ensureCapacity:idx];
-    }
-    if ( aRule != ptrBuffer[idx] ) {
-        if ( ptrBuffer[idx] ) [ptrBuffer[idx] release];
-        [aRule retain];
-    }
-    ptrBuffer[idx] = aRule;
-}
-
-- (ANTLRHashRule *)objectAtIndex:(NSInteger)idx
-{
-    if (idx < BuffSize) {
-        return ptrBuffer[idx];
-    }
-    return nil;
-}
-
-- (void)putHashRuleAtRuleIndex:(NSInteger)aRuleIndex StartIndex:(NSInteger)aStartIndex StopIndex:(NSInteger)aStopIndex
-{
-    ANTLRHashRule *aHashRule;
-    ANTLRRuleMemo *aRuleMemo;
-
-    if (aRuleIndex >= BuffSize) {
-        if ( debug) NSLog( @"putHashRuleAtRuleIndex attempting to insert aRule at Index %d, but Buffer is only %d long\n", aRuleIndex, BuffSize );
-        [self ensureCapacity:aRuleIndex];
-    }
-    if ((aHashRule = ptrBuffer[aRuleIndex]) == nil) {
-        aHashRule = [[ANTLRHashRule newANTLRHashRuleWithLen:17] retain];
-        ptrBuffer[aRuleIndex] = aHashRule;
-    }
-    if (( aRuleMemo = [aHashRule objectAtIndex:aStartIndex] ) == nil ) {
-        aRuleMemo = [[ANTLRRuleMemo newANTLRRuleMemo] retain];
-        [aHashRule insertObject:aRuleMemo atIndex:aStartIndex];
-    }
-    [aRuleMemo setStartIndex:[NSNumber numberWithInteger:aStartIndex]];
-    [aRuleMemo setStopIndex:[NSNumber numberWithInteger:aStopIndex]];
-}
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRRuntimeException.h b/runtime/ObjC/Framework/ANTLRRuntimeException.h
deleted file mode 100644
index 47834d2..0000000
--- a/runtime/ObjC/Framework/ANTLRRuntimeException.h
+++ /dev/null
@@ -1,111 +0,0 @@
-//
-//  ANTLRRuntimeException.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/5/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-
-@interface ANTLRRuntimeException : NSException {
-}
-
-+ (ANTLRRuntimeException *) newException;
-+ (ANTLRRuntimeException *) newException:(NSString *)aReason;
-+ (ANTLRRuntimeException *) newException:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo;
-
-+ (ANTLRRuntimeException *) newException:(NSString *)aName reason:(NSString *)aReason;
-+ (ANTLRRuntimeException *) newException:(NSString *)aName reason:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo;
-
-- (id) init;
-- (id) init:(NSString *)aReason;
-- (id) init:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo;
-- (id) initWithName:(NSString *)aName reason:(NSString *)aReason;
-- (id) initWithName:(NSString *)aName reason:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo;
-
-- (NSString *) Description;
-- (id) stackTrace:(NSException *)e;
-
-@end
-
-@interface ANTLRIllegalArgumentException : ANTLRRuntimeException {
-}
-
-+ (id) newException;
-+ (id) newException:(NSString *)aReason;
-+ (id) newException:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo;
-
-- (id) init;
-- (id)init:(NSString *)aReason;
-- (id)init:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo;
-
-@end
-
-@interface ANTLRIllegalStateException : ANTLRRuntimeException {
-}
-
-+ (id) newException;
-+ (id) newException:(NSString *)aReason;
-+ (id) newException:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo;
-
-- (id) init;
-- (id)init:(NSString *)aReason;
-- (id)init:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo;
-
-@end
-
-@interface ANTLRNoSuchElementException : ANTLRRuntimeException {
-}
-
-+ (id) newException;
-+ (id) newException:(NSString *)aReason;
-+ (id) newException:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo;
-
-- (id) init;
-- (id) init:(NSString *)aReason;
-- (id) init:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo;
-
-@end
-
-@interface ANTLRRewriteEarlyExitException : ANTLRRuntimeException {
-}
-
-+ (id) newException;
-- (id) initWithName:(NSString *)aName reason:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo;
-
-@end
-
-@interface ANTLRUnsupportedOperationException : ANTLRRuntimeException {
-}
-
-+ (id) newException:(NSString *)aReason;
-
-- (id) initWithName:(NSString *)aName reason:(NSString *)aReason;
-- (id) initWithName:(NSString *)aMsg reason:(NSString *)aCause userInfo:(NSDictionary *)userInfo;
-
-@end
-
diff --git a/runtime/ObjC/Framework/ANTLRRuntimeException.m b/runtime/ObjC/Framework/ANTLRRuntimeException.m
deleted file mode 100644
index 827fc43..0000000
--- a/runtime/ObjC/Framework/ANTLRRuntimeException.m
+++ /dev/null
@@ -1,279 +0,0 @@
-//
-//  ANTLRRuntimeException.m
-//  ANTLR
-//
-//  Created by Alan Condit on 6/5/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import "ANTLRRuntimeException.h"
-
-
-@implementation ANTLRRuntimeException
-
-+ (id) newException
-{
-    return [[ANTLRRuntimeException alloc] init];
-}
-
-+ (id) newException:(NSString *)aReason
-{
-    return [[ANTLRRuntimeException alloc] init:aReason];
-}
-
-+ (id) newException:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo
-{
-    return [[ANTLRRuntimeException alloc] init:aReason userInfo:aUserInfo];
-}
-
-+ (id) newException:(NSString *)aName reason:(NSString *)aReason;
-{
-    return [[ANTLRRuntimeException alloc] initWithName:aName reason:aReason];
-}
-
-+ (id) newException:(NSString *)aName reason:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo;
-{
-    return [[ANTLRRuntimeException alloc] initWithName:aName reason:aReason userInfo:aUserInfo];
-}
-
-
-- (id) init
-{
-    self = [super initWithName:@"ANTLRRuntimeException" reason:@"UnknownException" userInfo:nil];
-    return(self);
-}
-
-- (id) init:(NSString *)aReason
-{
-    self = [super initWithName:(NSString *)@"ANTLRRuntimeException" reason:(NSString *)aReason userInfo:(NSDictionary *)nil];
-    return(self);
-}
-
-- (id) init:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo
-{
-    self = [super initWithName:@"ANTLRRuntimeException" reason:aReason userInfo:aUserInfo];
-    return(self);
-}
-
-- (id) initWithName:(NSString *)aName reason:(NSString *)aReason
-{
-    self = [super initWithName:(NSString *)aName reason:(NSString *)aReason userInfo:(NSDictionary *)nil];
-    return(self);
-}
-
-- (id) initWithName:(NSString *)aName reason:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo
-{
-    self = [super initWithName:(NSString *)aName reason:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo];
-    return(self);
-}
-
-- (NSString *) Description
-{
-    return [super reason];
-}
-
-- (id) stackTrace:(NSException *)e
-{
-    NSArray *addrs = [e callStackReturnAddresses];
-    NSArray *trace = [e callStackSymbols];
-    
-    for (NSString *traceStr in trace) {
-        NSLog( @"%@", traceStr);
-        // TODO: remove special after testing
-        if ([traceStr hasPrefix:@"main("] > 0)
-            return traceStr;
-        if (![traceStr hasPrefix:@"org.stringtemplate"])
-            return traceStr;
-    }
-    return trace;    
-}
-
-@end
-
-@implementation ANTLRIllegalArgumentException
-
-+ (id) newException
-{
-    return [[ANTLRIllegalArgumentException alloc] init];
-}
-
-+ (id) newException:(NSString *)aReason
-{
-    return [[ANTLRIllegalArgumentException alloc] init:aReason];
-}
-
-+ (id) newException:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo
-{
-    return [[ANTLRIllegalArgumentException alloc] init:aReason userInfo:aUserInfo];
-}
-
-- (id) init
-{
-    self = [super initWithName:@"ANTLRIllegalArgumentException" reason:@"UnknownException" userInfo:nil];
-    return(self);
-}
-
-- (id) init:(NSString *)aReason
-{
-    self = [super initWithName:@"ANTLRIllegalArgumentException" reason:(NSString *)aReason userInfo:nil];
-    return(self);
-}
-
-- (id) init:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo
-{
-    self = [super initWithName:@"ANTLRIllegalArgumentException" reason:aReason userInfo:aUserInfo];
-    return(self);
-}
-
-@end
-
-@implementation ANTLRIllegalStateException
-
-+ (id) newException
-{
-    return [[ANTLRIllegalStateException alloc] init];
-}
-
-+ (id) newException:(NSString *)aReason
-{
-    return [[ANTLRIllegalStateException alloc] init:aReason];
-}
-
-+ (id) newException:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo
-{
-    return [[ANTLRIllegalStateException alloc] init:aReason userInfo:aUserInfo];
-}
-
-- (id) init
-{
-    self = [super initWithName:@"ANTLRIllegalStateException" reason:@"UnknownException" userInfo:nil];
-    return(self);
-}
-
-- (id) init:(NSString *)aReason
-{
-    self = [super initWithName:@"ANTLRIllegalStateException" reason:(NSString *)aReason userInfo:nil];
-    return(self);
-}
-
-- (id) init:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo
-{
-    self = [super initWithName:@"ANTLRIllegalStateException" reason:aReason userInfo:aUserInfo];
-    return(self);
-}
-
-@end
-
-@implementation ANTLRNoSuchElementException
-
-+ (id) newException
-{
-    return [[ANTLRNoSuchElementException alloc] init];
-}
-
-+ (id) newException:(NSString *)aReason
-{
-    return [[ANTLRNoSuchElementException alloc] init:aReason];
-}
-
-+ (id) newException:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo
-{
-    return [[ANTLRNoSuchElementException alloc] init:aReason userInfo:(NSDictionary *)aUserInfo];
-}
-
-- (id) init
-{
-    self = [super initWithName:@"ANTLRNoSuchElementException" reason:@"UnknownException" userInfo:nil];
-    return(self);
-}
-
-- (id) init:(NSString *)aReason
-{
-    self = [super initWithName:@"ANTLRNoSuchElementException" reason:(NSString *)aReason userInfo:(NSDictionary *)nil];
-    return(self);
-}
-
-- (id) init:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo
-{
-    self = [super initWithName:@"ANTLRNoSuchElementException" reason:aReason userInfo:aUserInfo];
-    return(self);
-}
-
-- (id) initWithName:(NSString *)aName reason:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo
-{
-    self = [super initWithName:aName reason:aReason userInfo:aUserInfo];
-    return(self);
-}
-
-@end
-
-@implementation ANTLRRewriteEarlyExitException
-
-+ (id) newException
-{
-	return [[self alloc] init];
-}
-
-- (id) init
-{
-	self = [super initWithName:@"RewriteEarlyExitException" reason:nil userInfo:nil];
-	return self;
-}
-
-- (id) initWithName:(NSString *)aName reason:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo
-{
-    self = [super initWithName:aName reason:aReason userInfo:aUserInfo];
-    return(self);
-}
-
-- (NSString *) description
-{
-	return [self name];
-}
-
-@end
-
-@implementation ANTLRUnsupportedOperationException
-
-+ (id) newException:(NSString *)aReason
-{
-    return [[ANTLRRuntimeException alloc] initWithName:@"Unsupported Operation Exception" reason:aReason userInfo:nil];
-}
-
-- (id) initWithName:(NSString *)aName reason:(NSString *)aReason
-{
-    self=[super initWithName:aName reason:aReason userInfo:nil];
-    return self;
-}
-
-- (id) initWithName:(NSString *)aName reason:(NSString *)aReason userInfo:(NSDictionary *)userInfo
-{
-    self=[super initWithName:aName reason:aReason userInfo:userInfo];
-    return self;
-}
-
-@end
-
diff --git a/runtime/ObjC/Framework/ANTLRStreamEnumerator.h b/runtime/ObjC/Framework/ANTLRStreamEnumerator.h
deleted file mode 100644
index 9e102f2..0000000
--- a/runtime/ObjC/Framework/ANTLRStreamEnumerator.h
+++ /dev/null
@@ -1,48 +0,0 @@
-//
-//  ANTLRStreamEnumertor.h
-//  ANTLR
-//
-//  Created by Ian Michell on 29/04/2010.
-// [The "BSD licence"]
-// Copyright (c) 2010 Ian Michell 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "AMutableArray.h"
-
-@interface ANTLRStreamEnumerator : NSEnumerator 
-{
-	NSInteger i;
-	id eof;
-	AMutableArray *nodes;
-}
-
--(id) initWithNodes:(AMutableArray *) n andEOF:(id) obj;
--(BOOL) hasNext;
-
-@property NSInteger i;
-@property (retain) id eof;
-@property (retain) AMutableArray *nodes;
-@end
diff --git a/runtime/ObjC/Framework/ANTLRStreamEnumerator.m b/runtime/ObjC/Framework/ANTLRStreamEnumerator.m
deleted file mode 100644
index 103646e..0000000
--- a/runtime/ObjC/Framework/ANTLRStreamEnumerator.m
+++ /dev/null
@@ -1,77 +0,0 @@
-//
-//  ANTLRStreamEnumertor.m
-//  ANTLR
-//
-//  Created by Ian Michell on 29/04/2010.
-// [The "BSD licence"]
-// Copyright (c) 2010 Ian Michell 2010 Alan Condit
-// 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.
-
-#import "ANTLRStreamEnumerator.h"
-
-
-@implementation ANTLRStreamEnumerator
-
--(id) init
-{
-	self = [super init];
-	if (self)
-	{
-		i = 0;
-	}
-	return self;
-}
-
--(id) initWithNodes:(AMutableArray *) n andEOF:(id) obj
-{
-	self = [self init];
-	if (self)
-	{
-		nodes = n;
-		eof = obj;
-	}
-	return self;
-}
-
--(BOOL) hasNext
-{
-	return i < [nodes count];
-}
-
--(id) nextObject
-{
-	NSUInteger current = i;
-	i++;
-	if (current < [nodes count])
-	{
-		return [nodes objectAtIndex:current];
-	}
-	return eof;
-}
-
-@synthesize i;
-@synthesize eof;
-@synthesize nodes;
-@end
diff --git a/runtime/ObjC/Framework/ANTLRStringStream.h b/runtime/ObjC/Framework/ANTLRStringStream.h
index e004a15..061a4b1 100644
--- a/runtime/ObjC/Framework/ANTLRStringStream.h
+++ b/runtime/ObjC/Framework/ANTLRStringStream.h
@@ -25,22 +25,22 @@
 // THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 
-#import <Cocoa/Cocoa.h>
-#import "ANTLRCharStream.h"
-#import "ANTLRCharStreamState.h"
-#import "ANTLRPtrBuffer.h"
+#import <Foundation/Foundation.h>
+#import "CharStream.h"
+#import "CharStreamState.h"
+#import "PtrBuffer.h"
 
-@interface ANTLRStringStream : NSObject < ANTLRCharStream > {
+@interface ANTLRStringStream : NSObject < CharStream > {
 	NSString *data;
 	NSInteger n;
 	NSInteger index;
 	NSUInteger line;
 	NSUInteger charPositionInLine;
 	NSInteger markDepth;
-	ANTLRPtrBuffer *markers;
+	PtrBuffer *markers;
 	NSInteger lastMarker;
 	NSString *name;
-    ANTLRCharStreamState *charState;
+    CharStreamState *charState;
 }
 
 + newANTLRStringStream;
@@ -86,8 +86,13 @@
 - (NSString *) substring:(NSInteger)startIndex To:(NSInteger)stopIndex;
 - (NSString *) substringWithRange:(NSRange) theRange;
 
-- (ANTLRPtrBuffer *)getMarkers;
-- (void) setMarkers:(ANTLRPtrBuffer *)aMarkerList;
+- (NSUInteger) getLine;
+- (NSUInteger) getCharPositionInLine;
+- (void) setLine:(NSUInteger) aLine;
+- (void) setCharPositionInLine:(NSUInteger) pos;
+
+- (PtrBuffer *)getMarkers;
+- (void) setMarkers:(PtrBuffer *)aMarkerList;
 
 - (NSString *)getSourceName;
 
@@ -101,9 +106,9 @@
 @property (assign) NSUInteger line;
 @property (assign) NSUInteger charPositionInLine;
 @property (assign) NSInteger markDepth;
-@property (retain) ANTLRPtrBuffer *markers;
+@property (retain) PtrBuffer *markers;
 @property (assign) NSInteger lastMarker;
 @property (retain) NSString *name;
-@property (retain) ANTLRCharStreamState *charState;
+@property (retain) CharStreamState *charState;
 
 @end
diff --git a/runtime/ObjC/Framework/ANTLRStringStream.m b/runtime/ObjC/Framework/ANTLRStringStream.m
index 1e1da4d..9010b4a 100644
--- a/runtime/ObjC/Framework/ANTLRStringStream.m
+++ b/runtime/ObjC/Framework/ANTLRStringStream.m
@@ -67,10 +67,10 @@
         line = 1;
         charPositionInLine = 0;
         markDepth = 0;
-		markers = [ANTLRPtrBuffer newANTLRPtrBufferWithLen:10];
+		markers = [PtrBuffer newPtrBufferWithLen:10];
         [markers retain];
         [markers addObject:[NSNull null]]; // ANTLR generates code that assumes markers to be 1-based,
-        charState = [[ANTLRCharStreamState newANTLRCharStreamState] retain];
+        charState = [[CharStreamState newCharStreamState] retain];
 	}
 	return self;
 }
@@ -85,9 +85,9 @@
         line = 1;
         charPositionInLine = 0;
         markDepth = 0;
-		markers = [[ANTLRPtrBuffer newANTLRPtrBufferWithLen:10] retain];
+		markers = [[PtrBuffer newPtrBufferWithLen:10] retain];
         [markers addObject:[NSNull null]]; // ANTLR generates code that assumes markers to be 1-based,
-        charState = [[ANTLRCharStreamState newANTLRCharStreamState] retain];
+        charState = [[CharStreamState newCharStreamState] retain];
 	}
 	return self;
 }
@@ -102,10 +102,10 @@
         line = 1;
         charPositionInLine = 0;
         markDepth = 0;
-		markers = [ANTLRPtrBuffer newANTLRPtrBufferWithLen:100];
+		markers = [PtrBuffer newPtrBufferWithLen:100];
         [markers retain];
         [markers addObject:[NSNull null]]; // ANTLR generates code that assumes markers to be 1-based,
-        charState = [[ANTLRCharStreamState newANTLRCharStreamState] retain];
+        charState = [[CharStreamState newCharStreamState] retain];
 	}
 	return self;
 }
@@ -119,10 +119,10 @@
         line = 1;
         charPositionInLine = 0;
         markDepth = 0;
-		markers = [ANTLRPtrBuffer newANTLRPtrBufferWithLen:100];
+		markers = [PtrBuffer newPtrBufferWithLen:100];
         [markers retain];
         [markers addObject:[NSNull null]]; // ANTLR generates code that assumes markers to be 1-based,
-        charState = [[ANTLRCharStreamState newANTLRCharStreamState] retain];
+        charState = [[CharStreamState newCharStreamState] retain];
     }
     return( self );
 }
@@ -204,11 +204,11 @@
     if ( i < 0 ) {
         i++;
         if ( index+i-1 < 0 ) {
-		    return ANTLRCharStreamEOF;
+		    return CharStreamEOF;
 		}
 	}
     if ( (index+i-1) >= n ) {
-		return ANTLRCharStreamEOF;
+		return CharStreamEOF;
 	}
     c = [data characterAtIndex:index+i-1];
 	return (NSInteger)c;
@@ -231,15 +231,15 @@
 {
     if (debug > 1) NSLog(@"mark entry -- markers=%x, markDepth=%d\n", (int)markers, markDepth);
     if ( markers == nil ) {
-        markers = [ANTLRPtrBuffer newANTLRPtrBufferWithLen:100];
+        markers = [PtrBuffer newPtrBufferWithLen:100];
 		[markers addObject:[NSNull null]]; // ANTLR generates code that assumes markers to be 1-based,
         markDepth = markers.ptr;
     }
     markDepth++;
-	ANTLRCharStreamState *State = nil;
+	CharStreamState *State = nil;
 	if ( (markDepth) >= [markers count] ) {
         if ( markDepth > 1 ) {
-            State = [ANTLRCharStreamState newANTLRCharStreamState];
+            State = [CharStreamState newCharStreamState];
             [State retain];
         }
         if ( markDepth == 1 )
@@ -251,7 +251,7 @@
         if (debug > 1) NSLog(@"mark retrieve markers=%x markDepth=%d\n", (NSUInteger)markers, markDepth);
         State = [markers objectAtIndex:markDepth];
         [State retain];
-        State = (ANTLRCharStreamState *)[markers objectAtIndex:markDepth];
+        State = (CharStreamState *)[markers objectAtIndex:markDepth];
         if (debug > 1) NSLog(@"mark retrieve charState %x from %d, index=%d, line=%d, charPositionInLine=%d\n", (NSUInteger)State, markDepth, State.index, State.line, State.charPositionInLine);
 	}
     State.index = index;
@@ -264,12 +264,12 @@
 
 - (void) rewind:(NSInteger) marker 
 {
-    ANTLRCharStreamState *State;
+    CharStreamState *State;
     if (debug > 1) NSLog(@"rewind entry -- markers=%x marker=%d\n", (NSUInteger)markers, marker);
     if ( marker == 1 )
         State = charState;
     else
-        State = (ANTLRCharStreamState *)[markers objectAtIndex:marker];
+        State = (CharStreamState *)[markers objectAtIndex:marker];
     if (debug > 1) NSLog(@"rewind entry -- marker=%d charState=%x, index=%d, line=%d, charPositionInLine=%d\n", marker, (NSUInteger)charState, charState.index, charState.line, charState.charPositionInLine);
 	// restore stream charState
 	[self seek:State.index];
@@ -327,12 +327,32 @@
 }
 
 
-- (ANTLRPtrBuffer *)getMarkers
+- (NSUInteger) getLine
+{
+    return line;
+}
+
+- (NSUInteger) getCharPositionInLine
+{
+    return charPositionInLine;
+}
+
+- (void) setLine:(NSUInteger) aLine
+{
+    line = aLine;
+}
+
+- (void) setCharPositionInLine:(NSUInteger) pos
+{
+    charPositionInLine = pos;
+}
+
+- (PtrBuffer *)getMarkers
 {
     return markers;
 }
 
-- (void) setMarkers:(ANTLRPtrBuffer *)aMarkerList
+- (void) setMarkers:(PtrBuffer *)aMarkerList
 {
     markers = aMarkerList;
 }
@@ -352,12 +372,12 @@
 }
 
 
-- (ANTLRCharStreamState *)getCharState
+- (CharStreamState *)getCharState
 {
     return charState;
 }
 
-- (void) setCharState:(ANTLRCharStreamState *)aCharState
+- (void) setCharState:(CharStreamState *)aCharState
 {
     charState = aCharState;
 }
diff --git a/runtime/ObjC/Framework/ANTLRSymbolStack.h b/runtime/ObjC/Framework/ANTLRSymbolStack.h
deleted file mode 100644
index 169df9f..0000000
--- a/runtime/ObjC/Framework/ANTLRSymbolStack.h
+++ /dev/null
@@ -1,75 +0,0 @@
-//
-//  ANTLRSymbolStack.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/9/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRBaseStack.h"
-// #import "ANTLRSymbolScope.h"
-
-//#define GLOBAL_SCOPE       0
-//#define LOCAL_SCOPE        1
-#define HASHSIZE         101
-#define HBUFSIZE      0x2000
-
-@interface ANTLRSymbolsScope : NSObject
-{
-    
-}
-
-+ (ANTLRSymbolsScope *)newANTLRSymbolsScope;
-
-- (id)init;
-@end
-
-
-@interface ANTLRSymbolStack : ANTLRBaseStack {
-}
-
-// Contruction/Destruction
-+(ANTLRSymbolStack *)newANTLRSymbolStack;
-+(ANTLRSymbolStack *)newANTLRSymbolStackWithLen:(NSInteger)cnt;
--(id)init;
--(id)initWithLen:(NSInteger)cnt;
--(void)dealloc;
-
-// Instance Methods
-- (id) copyWithZone:(NSZone *)aZone;
-/* clear -- reinitialize the maplist array */
-
--(ANTLRSymbolsScope *)getHashMapEntry:(NSInteger)idx;
-
--(ANTLRSymbolsScope **)getHashMap;
-
--(ANTLRSymbolsScope *) pop;
-
-- (void) insertObject:(ANTLRSymbolsScope *)aScope atIndex:(NSInteger)idx;
-- (ANTLRSymbolsScope *)objectAtIndex:(NSInteger)idx;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRSymbolStack.m b/runtime/ObjC/Framework/ANTLRSymbolStack.m
deleted file mode 100644
index 3c43ebb..0000000
--- a/runtime/ObjC/Framework/ANTLRSymbolStack.m
+++ /dev/null
@@ -1,126 +0,0 @@
-//
-//  ANTLRSymbolStack.m
-//  ANTLR
-//
-//  Created by Alan Condit on 6/9/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#define SUCCESS (0)
-#define FAILURE (-1)
-
-#import "ANTLRSymbolStack.h"
-#import "ANTLRTree.h"
-
-
-@implementation ANTLRSymbolsScope
-
-+ (ANTLRSymbolsScope *)newANTLRSymbolsScope
-{
-    return( [[ANTLRSymbolsScope alloc] init] );
-}
-
-- (id)init
-{
-    if ((self = [super init]) != nil) {
-    }
-    return (self);
-}
-
-@end
-
-/*
- * Start of ANTLRSymbolStack
- */
-@implementation ANTLRSymbolStack
-
-+(ANTLRSymbolStack *)newANTLRSymbolStack
-{
-    return [[ANTLRSymbolStack alloc] initWithLen:30];
-}
-
-+(ANTLRSymbolStack *)newANTLRSymbolStackWithLen:(NSInteger)cnt
-{
-    return [[ANTLRSymbolStack alloc] initWithLen:cnt];
-}
-
--(id)init
-{
-	if ((self = [super init]) != nil) {
-	}
-    return( self );
-}
-
--(id)initWithLen:(NSInteger)cnt
-{
-	if ((self = [super initWithLen:cnt]) != nil) {
-	}
-    return( self );
-}
-
--(void)dealloc
-{
-#ifdef DEBUG_DEALLOC
-    NSLog( @"called dealloc in ANTLRSymbolStack" );
-#endif
-	[super dealloc];
-}
-
-- (id) copyWithZone:(NSZone *)aZone
-{
-    return [super copyWithZone:aZone];
-}
-
--(ANTLRSymbolsScope *)getHashMapEntry:(NSInteger)idx
-{
-	return( (ANTLRSymbolsScope *)[super objectAtIndex:idx] );
-}
-
--(ANTLRSymbolsScope **)getHashMap
-{
-	return( (ANTLRSymbolsScope **)ptrBuffer );
-}
-
--(ANTLRSymbolsScope *) pop
-{
-    return (ANTLRSymbolsScope *)[super pop];
-}
-
-- (void) insertObject:(ANTLRSymbolsScope *)aRule atIndex:(NSInteger)idx
-{
-    if ( aRule != ptrBuffer[idx] ) {
-        if ( ptrBuffer[idx] ) [ptrBuffer[idx] release];
-        [aRule retain];
-    }
-    ptrBuffer[idx] = aRule;
-}
-
-- (ANTLRSymbolsScope *)objectAtIndex:(NSInteger)idx
-{
-    return (ANTLRSymbolsScope *)[super objectAtIndex:idx];
-}
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRToken+DebuggerSupport.h b/runtime/ObjC/Framework/ANTLRToken+DebuggerSupport.h
deleted file mode 100644
index 659e763..0000000
--- a/runtime/ObjC/Framework/ANTLRToken+DebuggerSupport.h
+++ /dev/null
@@ -1,41 +0,0 @@
-//
-//  ANTLRToken+DebuggerSupport.h
-//  ANTLR
-//
-//  Created by Kay Röpke on 03.12.2006.
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-//
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRToken.h"
-#import "ANTLRCommonToken.h"
-
-@interface ANTLRCommonToken(DebuggerSupport)
-
-- (NSString *)debuggerDescription;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRToken+DebuggerSupport.m b/runtime/ObjC/Framework/ANTLRToken+DebuggerSupport.m
deleted file mode 100644
index 114b236..0000000
--- a/runtime/ObjC/Framework/ANTLRToken+DebuggerSupport.m
+++ /dev/null
@@ -1,61 +0,0 @@
-//
-//  ANTLRToken+DebuggerSupport.m
-//  ANTLR
-//
-//  Created by Kay Röpke on 03.12.2006.
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import "ANTLRToken+DebuggerSupport.h"
-
-
-@implementation ANTLRCommonToken(DebuggerSupport)
-
-- (NSString *)debuggerDescription
-{
-	NSString *_text = self.text;
-	NSMutableString *escapedText;
-	if (_text) {
-		escapedText = [_text copyWithZone:nil];
-		NSRange wholeString = NSMakeRange(0,[escapedText length]);
-		[escapedText replaceOccurrencesOfString:@"%" withString:@"%25" options:0 range:wholeString];
-		[escapedText replaceOccurrencesOfString:@"\n" withString:@"%0A" options:0 range:wholeString];
-		[escapedText replaceOccurrencesOfString:@"\r" withString:@"%0D" options:0 range:wholeString];
-	} else {
-		escapedText = [NSMutableString stringWithString:@""];
-	}
-	// format is tokenIndex, type, channel, line, col, (escaped)text
-	return [NSString stringWithFormat:@"%u %d %u %u %u \"%@", 
-		[self getTokenIndex],
-		self.type,
-		self.channel,
-		self.line,
-		self.charPositionInLine,
-		escapedText
-		];
-}
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRToken.h b/runtime/ObjC/Framework/ANTLRToken.h
deleted file mode 100644
index 04724bd..0000000
--- a/runtime/ObjC/Framework/ANTLRToken.h
+++ /dev/null
@@ -1,89 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-
-#ifndef DEBUG_DEALLOC
-#define DEBUG_DEALLOC
-#endif
-
-typedef enum {
-    ANTLRTokenTypeEOF = -1,
-    ANTLRTokenTypeInvalid,
-    ANTLRTokenTypeEOR,
-    ANTLRTokenTypeDOWN,
-    ANTLRTokenTypeUP,
-    ANTLRTokenTypeMIN
-} ANTLRTokenType;
-
-typedef enum {
-    ANTLRTokenChannelDefault = 0,
-    ANTLRTokenChannelHidden = 99
-} ANTLRTokenChannel;
-
-#define HIDDEN 99
-
-@protocol ANTLRToken < NSObject, NSCopying >
-
-@property (retain, getter = text, setter = setText:) NSString *text;
-@property (assign) NSInteger type;
-@property (assign) NSUInteger line;
-@property (assign) NSUInteger charPositionInLine;
-
-// The singleton eofToken instance.
-+ (id<ANTLRToken>) eofToken;
-// The default channel for this class of Tokens
-+ (ANTLRTokenChannel) defaultChannel;
-
-// provide hooks to explicitely set the text as opposed to use the indices into the CharStream
-- (NSString *) text;
-- (void) setText:(NSString *)theText;
-
-- (NSInteger)type;
-- (void) setType: (NSInteger) aType;
-
-// ANTLR v3 provides automatic line and position tracking. Subclasses do not need to
-// override these, if they do not want to store line/pos tracking information
-- (NSUInteger)line;
-- (void) setLine: (NSUInteger) aLine;
-
-- (NSUInteger)charPositionInLine;
-- (void) setCharPositionInLine:(NSUInteger)aCharPositionInLine;
-
-// explicitely change the channel this Token is on. The default parser implementation
-// just sees the defaultChannel
-// Common idiom is to put whitespace tokens on channel 99.
-- (NSUInteger)channel;
-- (void) setChannel: (NSUInteger) aChannel;
-
-// the index of this Token into the TokenStream
-- (NSInteger) getTokenIndex;
-- (void) setTokenIndex: (NSInteger) aTokenIndex;
-- (NSString *)toString;
-
-@end
-
diff --git a/runtime/ObjC/Framework/ANTLRTokenRewriteStream.h b/runtime/ObjC/Framework/ANTLRTokenRewriteStream.h
deleted file mode 100644
index 7b97168..0000000
--- a/runtime/ObjC/Framework/ANTLRTokenRewriteStream.h
+++ /dev/null
@@ -1,170 +0,0 @@
-//
-//  ANTLRTokenRewriteStream.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/19/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRCommonTokenStream.h"
-#import "ANTLRLinkBase.h"
-#import "ANTLRHashMap.h"
-#import "ANTLRMapElement.h"
-#import "ANTLRTokenSource.h"
-
-// Define the rewrite operation hierarchy
-
-@interface ANTLRRewriteOperation : ANTLRCommonTokenStream
-{
-/** What rwIndex into rewrites List are we? */
-NSInteger instructionIndex;
-/** Token buffer rwIndex. */
-NSInteger rwIndex;
-NSString *text;
-}
-
-@property (getter=getInstructionIndex, setter=setInstructionIndex:) NSInteger instructionIndex;
-@property (assign) NSInteger rwIndex;
-@property (retain, getter=text, setter=setText:) NSString *text;
-
-+ (ANTLRRewriteOperation *) newANTLRRewriteOperation:(NSInteger)anIndex Text:(NSString *)text;
-
-- (id) initWithIndex:(NSInteger)anIndex Text:(NSString *)theText;
-
-/** Execute the rewrite operation by possibly adding to the buffer.
- *  Return the rwIndex of the next token to operate on.
- */
-- (NSInteger) execute:(NSString *)buf;
-
-- (NSString *)toString;
-- (NSInteger) indexOf:(char)aChar inString:(NSString *)aString;
-@end
-
-@interface ANTLRInsertBeforeOp : ANTLRRewriteOperation {
-}
-
-+ (ANTLRInsertBeforeOp *) newANTLRInsertBeforeOp:(NSInteger)anIndex Text:(NSString *)theText;
-- (id) initWithIndex:(NSInteger)anIndex Text:(NSString *)theText;
-
-@end
-
-/** I'm going to try replacing range from x..y with (y-x)+1 ReplaceOp
- *  instructions.
- */
-@interface ANTLRReplaceOp : ANTLRRewriteOperation {
-    NSInteger lastIndex;
-}
-
-@property (assign) NSInteger lastIndex;
-
-+ (ANTLRReplaceOp *) newANTLRReplaceOp:(NSInteger)from ToIndex:(NSInteger)to Text:(NSString*)theText;
-- (id) initWithIndex:(NSInteger)from ToIndex:(NSInteger)to Text:(NSString *)theText;
-
-- (NSInteger) execute:(NSString *)buf;
-- (NSString *)toString;
-
-@end
-
-@interface ANTLRDeleteOp : ANTLRReplaceOp {
-}
-+ (ANTLRDeleteOp *) newANTLRDeleteOp:(NSInteger)from ToIndex:(NSInteger)to;
-
-- (id) initWithIndex:(NSInteger)from ToIndex:(NSInteger)to;
-
-- (NSString *)toString;
-
-@end
-
-
-@interface ANTLRTokenRewriteStream : ANTLRCommonTokenStream {
-/** You may have multiple, named streams of rewrite operations.
- *  I'm calling these things "programs."
- *  Maps String (name) -> rewrite (List)
- */
-ANTLRHashMap *programs;
-
-/** Map String (program name) -> Integer rwIndex */
-ANTLRHashMap *lastRewriteTokenIndexes;
-}
-
-@property (retain, getter=getPrograms, setter=setPrograms:) ANTLRHashMap *programs;
-@property (retain, getter=getLastRewriteTokenIndexes, setter=setLastRewriteTokenIndexes:) ANTLRHashMap *lastRewriteTokenIndexes;
-
-+ (ANTLRTokenRewriteStream *)newANTLRTokenRewriteStream;
-+ (ANTLRTokenRewriteStream *)newANTLRTokenRewriteStream:(id<ANTLRTokenSource>) aTokenSource;
-+ (ANTLRTokenRewriteStream *)newANTLRTokenRewriteStream:(id<ANTLRTokenSource>) aTokenSource Channel:(NSInteger)aChannel;
-
-- (id) init;
-- (id)initWithTokenSource:(id<ANTLRTokenSource>)aTokenSource;
-- (id)initWithTokenSource:(id<ANTLRTokenSource>)aTokenSource Channel:(NSInteger)aChannel;
-
-- (ANTLRHashMap *)getPrograms;
-- (void)setPrograms:(ANTLRHashMap *)aProgList;
-
-- (void) rollback:(NSInteger)instructionIndex;
-- (void) rollback:(NSString *)programName Index:(NSInteger)anInstructionIndex;
-- (void) deleteProgram;
-- (void) deleteProgram:(NSString *)programName;
-- (void) insertAfterToken:(id<ANTLRToken>)t Text:(NSString *)theText;
-- (void) insertAfterIndex:(NSInteger)anIndex Text:(NSString *)theText;
-- (void) insertAfterProgNam:(NSString *)programName Index:(NSInteger)anIndex Text:(NSString *)theText;
-
-
-- (void) insertBeforeToken:(id<ANTLRToken>)t Text:(NSString *)theText;
-- (void) insertBeforeIndex:(NSInteger)anIndex Text:(NSString *)theText;
-- (void) insertBeforeProgName:(NSString *)programName Index:(NSInteger)anIndex Text:(NSString *)theText;
-- (void) replaceFromIndex:(NSInteger)anIndex Text:(NSString *)theText;
-- (void) replaceFromIndex:(NSInteger)from ToIndex:(NSInteger)to Text:(NSString *)theText;
-- (void) replaceFromToken:(id<ANTLRToken>)indexT Text:(NSString *)theText;
-- (void) replaceFromToken:(id<ANTLRToken>)from ToToken:(id<ANTLRToken>)to Text:(NSString *)theText;
-- (void) replaceProgNam:(NSString *)programName Token:(id<ANTLRToken>)from Token:(id<ANTLRToken>)to Text:(NSString *)theText;
-- (void) replaceProgNam:(NSString *)programName FromIndex:(NSInteger)from ToIndex:(NSInteger)to Text:(NSString *)theText;
-- (void) delete:(NSInteger)anIndex;
-- (void) delete:(NSInteger)from ToIndex:(NSInteger)to;
-- (void) deleteToken:(id<ANTLRToken>)indexT;
-- (void) deleteFromToken:(id<ANTLRToken>)from ToToken:(id<ANTLRToken>)to;
-- (void) delete:(NSString *)programName FromToken:(id<ANTLRToken>)from ToToken:(id<ANTLRToken>)to;
-- (void) delete:(NSString *)programName FromIndex:(NSInteger)from ToIndex:(NSInteger)to;
-- (NSInteger)getLastRewriteTokenIndex;
-- (NSInteger)getLastRewriteTokenIndex:(NSString *)programName;
-- (void)setLastRewriteTokenIndex:(NSString *)programName Index:(NSInteger)anInt;
-- (ANTLRHashMap *) getProgram:(NSString *)name;
-- (ANTLRHashMap *) initializeProgram:(NSString *)name;
-- (NSString *)toOriginalString;
-- (NSString *)toOriginalString:(NSInteger)start End:(NSInteger)end;
-- (NSString *)toString;
-- (NSString *)toString:(NSString *)programName;
-- (NSString *)toStringFromStart:(NSInteger)start ToEnd:(NSInteger)end;
-- (NSString *)toString:(NSString *)programName FromStart:(NSInteger)start ToEnd:(NSInteger)end;
-- (ANTLRHashMap *)reduceToSingleOperationPerIndex:(ANTLRHashMap *)rewrites;
-- (ANTLRHashMap *)getKindOfOps:(ANTLRHashMap *)rewrites KindOfClass:(Class)kind;
-- (ANTLRHashMap *)getKindOfOps:(ANTLRHashMap *)rewrites KindOfClass:(Class)kind Index:(NSInteger)before;
-- (NSString *)catOpText:(id)a PrevText:(id)b;
-- (NSMutableString *)toDebugString;
-- (NSMutableString *)toDebugStringFromStart:(NSInteger)start ToEnd:(NSInteger)end;
-                    
-@end
diff --git a/runtime/ObjC/Framework/ANTLRTokenRewriteStream.m b/runtime/ObjC/Framework/ANTLRTokenRewriteStream.m
deleted file mode 100644
index e94f885..0000000
--- a/runtime/ObjC/Framework/ANTLRTokenRewriteStream.m
+++ /dev/null
@@ -1,692 +0,0 @@
-//
-//  ANTLRTokenRewriteStream.m
-//  ANTLR
-//
-//  Created by Alan Condit on 6/19/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import "ANTLRTokenRewriteStream.h"
-#import "ANTLRRuntimeException.h"
-
-static NSString *DEFAULT_PROGRAM_NAME = @"default";
-static NSInteger PROGRAM_INIT_SIZE = 100;
-static NSInteger MIN_TOKEN_INDEX = 0;
-
-extern NSInteger debug;
-
-// Define the rewrite operation hierarchy
-
-@implementation ANTLRRewriteOperation
-
-@synthesize instructionIndex;
-@synthesize rwIndex;
-@synthesize text;
-
-+ (ANTLRRewriteOperation *) newANTLRRewriteOperation:(NSInteger)anIndex Text:(NSString *)theText
-{
-    return [[ANTLRRewriteOperation alloc] initWithIndex:anIndex Text:theText];
-}
-    
-- (id) initWithIndex:(NSInteger)anIndex Text:(NSString *)theText
-{
-    if ((self = [super init]) != nil) {
-        rwIndex = anIndex;
-        text = theText;
-    }
-    return self;
-}
-
-/** Execute the rewrite operation by possibly adding to the buffer.
- *  Return the rwIndex of the next token to operate on.
- */
-- (NSInteger) execute:(NSString *)buf
-{
-    return rwIndex;
-}
-    
-- (NSString *)toString
-{
-    NSString *opName = [self className];
-    int $index = [self indexOf:'$' inString:opName];
-    opName = [opName substringWithRange:NSMakeRange($index+1, [opName length])];
-    return [NSString stringWithFormat:@"<%@%d:\"%@\">", opName, rwIndex, opName];			
-}
-
-- (NSInteger) indexOf:(char)aChar inString:(NSString *)aString
-{
-    char indexedChar;
-
-    for( int i = 0; i < [aString length]; i++ ) {
-        indexedChar = [aString characterAtIndex:i];
-        if (indexedChar == aChar) {
-            return i;
-        }
-    }
-    return -1;
-}
-                                                    
-@end
-
-@implementation ANTLRInsertBeforeOp
-
-+ (ANTLRInsertBeforeOp *) newANTLRInsertBeforeOp:(NSInteger) anIndex Text:(NSString *)theText
-{
-    return [[ANTLRInsertBeforeOp alloc] initWithIndex:anIndex Text:theText];
-}
-
-- (id) initWithIndex:(NSInteger)anIndex Text:(NSString *)theText
-{
-    if ((self = [super initWithIndex:anIndex Text:theText]) != nil) {
-        rwIndex = anIndex;
-        text = theText;
-    }
-    return self;
-}
-
-
-- (NSInteger) execute:(NSMutableString *)buf
-{
-    [buf appendString:text];
-    if ( ((ANTLRCommonToken *)[tokens objectAtIndex:rwIndex]).type != ANTLRTokenTypeEOF ) {
-        [buf appendString:[[tokens objectAtIndex:rwIndex] text]];
-    }
-    return rwIndex+1;
-}
-
-@end
-     
-/** I'm going to try replacing range from x..y with (y-x)+1 ANTLRReplaceOp
- *  instructions.
- */
-@implementation ANTLRReplaceOp
-
-@synthesize lastIndex;
-
-+ (ANTLRReplaceOp *) newANTLRReplaceOp:(NSInteger)from ToIndex:(NSInteger)to Text:(NSString*)theText
-{
-    return [[ANTLRReplaceOp alloc] initWithIndex:from ToIndex:to Text:theText];
-}
-
-- (id) initWithIndex:(NSInteger)from ToIndex:(NSInteger)to Text:(NSString *)theText
-{
-    if ((self = [super initWithIndex:from Text:theText]) != nil) {
-        lastIndex = to;
-    }
-    return self;
-}
- 
- 
-- (NSInteger) execute:(NSMutableString *)buf
-{
-    if ( text!=nil ) {
-        [buf appendString:text];
-    }
-        return lastIndex+1;
-}
-
-- (NSString *)toString
-{
-    return [NSString stringWithFormat:@"<ANTLRReplaceOp@ %d..%d :>%@\n", rwIndex, lastIndex, text];
-}
-
-@end
-
-@implementation ANTLRDeleteOp
-
-+ (ANTLRDeleteOp *) newANTLRDeleteOp:(NSInteger)from ToIndex:(NSInteger)to
-{
-    // super(from To:to, null);
-    return [[ANTLRDeleteOp alloc] initWithIndex:from ToIndex:to];
-}
-
- - (id) initWithIndex:(NSInteger)from ToIndex:(NSInteger)to
-{
-    if ((self = [super initWithIndex:from ToIndex:to Text:nil]) != nil) {
-        lastIndex = to;
-    }
-    return self;
-}
-     
-- (NSString *)toString
-{
-    return [NSString stringWithFormat:@"<DeleteOp@ %d..%d\n",  rwIndex, lastIndex];
-}
-
-@end
-
-
-@implementation ANTLRTokenRewriteStream
-
-@synthesize programs;
-@synthesize lastRewriteTokenIndexes;
-
-+ (ANTLRTokenRewriteStream *)newANTLRTokenRewriteStream
-{
-    return [[ANTLRTokenRewriteStream alloc] init];
-}
-
-+ (ANTLRTokenRewriteStream *)newANTLRTokenRewriteStream:(id<ANTLRTokenSource>) aTokenSource
-{
-    return [[ANTLRTokenRewriteStream alloc] initWithTokenSource:aTokenSource];
-}
-
-+ (ANTLRTokenRewriteStream *)newANTLRTokenRewriteStream:(id<ANTLRTokenSource>) aTokenSource Channel:(NSInteger)aChannel
-{
-    return [[ANTLRTokenRewriteStream alloc] initWithTokenSource:aTokenSource Channel:aChannel];
-}
- 
-- (id) init
-{
-    if ((self = [super init]) != nil) {
-        programs = [ANTLRHashMap newANTLRHashMap];
-        [programs addObject:[ANTLRMapElement newANTLRMapElementWithName:DEFAULT_PROGRAM_NAME Node:[ANTLRHashMap newANTLRHashMapWithLen:PROGRAM_INIT_SIZE]]];
-        lastRewriteTokenIndexes = [ANTLRHashMap newANTLRHashMap];
-    }
-    return self;
-}
- 
-- (id)initWithTokenSource:(id<ANTLRTokenSource>)aTokenSource
-{
-    if ((self = [super init]) != nil) {
-        programs = [ANTLRHashMap newANTLRHashMap];
-        [programs addObject:[ANTLRMapElement newANTLRMapElementWithName:DEFAULT_PROGRAM_NAME Node:[ANTLRHashMap newANTLRHashMapWithLen:PROGRAM_INIT_SIZE]]];
-        lastRewriteTokenIndexes = [ANTLRHashMap newANTLRHashMap];
-        tokenSource = aTokenSource;
-    }
-    return self;
-}
-
-- (id)initWithTokenSource:(id<ANTLRTokenSource>)aTokenSource Channel:(NSInteger)aChannel
-{
-    if ((self = [super init]) != nil) {
-        programs = [ANTLRHashMap newANTLRHashMap];
-        [programs addObject:[ANTLRMapElement newANTLRMapElementWithName:DEFAULT_PROGRAM_NAME Node:[ANTLRHashMap newANTLRHashMapWithLen:PROGRAM_INIT_SIZE]]];
-        lastRewriteTokenIndexes = [ANTLRHashMap newANTLRHashMap];
-        tokenSource = aTokenSource;
-        channel = aChannel;
-    }
-    return self;
-}
- 
-- (ANTLRHashMap *)getPrograms
-{
-    return programs;
-}
- 
-- (void)setPrograms:(ANTLRHashMap *)aProgList
-{
-    programs = aProgList;
-}
-
-- (void) rollback:(NSInteger)instructionIndex
-{
-    [self rollback:DEFAULT_PROGRAM_NAME Index:instructionIndex];
-}
-
-/** Rollback the instruction stream for a program so that
- *  the indicated instruction (via instructionIndex) is no
- *  longer in the stream.  UNTESTED!
- */
-- (void) rollback:(NSString *)programName Index:(NSInteger)anInstructionIndex
-{
-    id object;
-    ANTLRHashMap *is;
-
-    //    AMutableArray *is = [programs get(programName)];
-    is = [self getPrograms];
-    object = [is getName:programName];
-    if ( is != nil ) {
-#pragma warning this has to be fixed
-        [programs insertObject:programName  atIndex:anInstructionIndex];
-    }
-}
-
-- (void) deleteProgram
-{
-    [self deleteProgram:DEFAULT_PROGRAM_NAME];
-}
-
-/** Reset the program so that no instructions exist */
-- (void) deleteProgram:(NSString *)programName
-{
-    [self rollback:programName Index:MIN_TOKEN_INDEX];
-}
-
-- (void) insertAfterToken:(id<ANTLRToken>)t Text:(NSString *)theText
-{
-    [self insertAfterProgNam:DEFAULT_PROGRAM_NAME Index:[t getTokenIndex] Text:theText];
-}
-
-- (void) insertAfterIndex:(NSInteger)anIndex Text:(NSString *)theText
-{
-    [self insertAfterProgNam:DEFAULT_PROGRAM_NAME Index:(NSInteger)anIndex Text:(NSString *)theText];
-}
-
-- (void) insertAfterProgNam:(NSString *)programName Index:(NSInteger)anIndex Text:(NSString *)theText
-{
-    // to insert after, just insert before next rwIndex (even if past end)
-    [self insertBeforeProgName:programName Index:anIndex+1 Text:theText];
-    //addToSortedRewriteList(programName, new InsertAfterOp(rwIndex,text));
-}
-
-
-
-
-
-
-
-
-
-- (void) insertBeforeToken:(id<ANTLRToken>)t Text:(NSString *)theText
-{
-    [self insertBeforeProgName:DEFAULT_PROGRAM_NAME Index:[t getTokenIndex] Text:theText];
-}
-
-- (void) insertBeforeIndex:(NSInteger)anIndex Text:(NSString *)theText
-{
-    [self insertBeforeProgName:DEFAULT_PROGRAM_NAME Index:anIndex Text:theText];
-}
-
-- (void) insertBeforeProgName:(NSString *)programName Index:(NSInteger)rwIndex Text:(NSString *)theText
-{
-    //addToSortedRewriteList(programName, new ANTLRInsertBeforeOp(rwIndex,text));
-    ANTLRRewriteOperation *op = [ANTLRInsertBeforeOp newANTLRInsertBeforeOp:rwIndex Text:theText];
-    ANTLRHashMap *rewrites = [self getProgram:programName];
-    op.instructionIndex = [rewrites count];
-    [rewrites addObject:op];		
-}
-
-- (void) replaceFromIndex:(NSInteger)anIndex Text:(NSString *)theText
-{
-    [self replaceProgNam:DEFAULT_PROGRAM_NAME FromIndex:anIndex ToIndex:anIndex Text:theText];
-}
-
-- (void) replaceFromIndex:(NSInteger)from ToIndex:(NSInteger)to Text:(NSString *)theText
-{
-    [self replaceProgNam:DEFAULT_PROGRAM_NAME FromIndex:from ToIndex:to Text:theText];
-}
-
-- (void) replaceFromToken:(id<ANTLRToken>)anIndexT Text:(NSString *)theText
-{
-    [self replaceProgNam:DEFAULT_PROGRAM_NAME FromIndex:[anIndexT getTokenIndex] ToIndex:[anIndexT getTokenIndex] Text:theText];
-}
-
-- (void) replaceFromToken:(id<ANTLRToken>)from ToToken:(id<ANTLRToken>)to Text:(NSString *)theText
-{
-    [self replaceProgNam:DEFAULT_PROGRAM_NAME FromIndex:[from getTokenIndex] ToIndex:[to getTokenIndex] Text:theText];
-}
-
-- (void) replaceProgNam:(NSString *)programName Token:(id<ANTLRToken>)from Token:(id<ANTLRToken>)to Text:(NSString *)theText
-{
-    [self replaceProgNam:programName FromIndex:[from getTokenIndex] ToIndex:[to getTokenIndex] Text:theText];
-}
-                         
-- (void) replaceProgNam:(NSString *)programName FromIndex:(NSInteger)from ToIndex:(NSInteger)to Text:(NSString *)theText
-{
-    if ( from > to || from < 0 || to < 0 || to >= [tokens count] ) {
-        @throw [ANTLRIllegalArgumentException newException:[NSString stringWithFormat:@"replace: range invalid: %d..%d size=%d\n", from, to, [tokens count]]];
-    }
-    ANTLRRewriteOperation *op = [ANTLRReplaceOp newANTLRReplaceOp:from ToIndex:to Text:theText];
-    ANTLRHashMap *rewrites = (ANTLRHashMap *)[lastRewriteTokenIndexes getName:programName];
-    op.instructionIndex = [rewrites count];
-    [rewrites addObject:op];
-}
-
-- (void) delete:(NSInteger)anIndex
-{
-    [self delete:DEFAULT_PROGRAM_NAME  FromIndex:(NSInteger)anIndex  ToIndex:(NSInteger)anIndex];
-}
-
-- (void) delete:(NSInteger)from ToIndex:(NSInteger)to
-{
-    [self delete:DEFAULT_PROGRAM_NAME FromIndex:from ToIndex:to];
-}
-
-- (void) deleteToken:(id<ANTLRToken>)anIndexT
-{
-    [self delete:DEFAULT_PROGRAM_NAME FromIndex:[anIndexT getTokenIndex] ToIndex:[anIndexT getTokenIndex]];
-}
-
-- (void) deleteFromToken:(id<ANTLRToken>)from ToToken:(id<ANTLRToken>)to
-{
-    [self delete:DEFAULT_PROGRAM_NAME FromIndex:[from getTokenIndex] ToIndex:[to getTokenIndex]];
-}
-
-- (void) delete:(NSString *)programName FromToken:(id<ANTLRToken>)from ToToken:(id<ANTLRToken>)to
-{
-    [self replaceProgNam:programName FromIndex:[from getTokenIndex] ToIndex:[to getTokenIndex] Text:nil];
-}
-
-- (void) delete:(NSString *)programName FromIndex:(NSInteger)from ToIndex:(NSInteger)to
-{
-    [self replaceProgNam:programName FromIndex:from ToIndex:to Text:nil];
-}
-
-- (NSInteger)getLastRewriteTokenIndex
-{
-    return [self getLastRewriteTokenIndex:DEFAULT_PROGRAM_NAME];
-}
-
-- (NSInteger)getLastRewriteTokenIndex:(NSString *)programName
-{
-#pragma warning fix this to look up the hashed name
-    NSInteger anInt = -1;
-    ANTLRMapElement *node = [lastRewriteTokenIndexes lookup:programName Scope:0];
-    if ( node != nil ) {
-        anInt = [lastRewriteTokenIndexes hash:programName];
-    }
-    return anInt;
-}
-
-- (void)setLastRewriteTokenIndex:(NSString *)programName Index:(NSInteger)anInt
-{
-    [lastRewriteTokenIndexes insertObject:programName atIndex:anInt];
-}
-
--(ANTLRHashMap *) getProgram:(NSString *)name
-{
-   ANTLRHashMap *is = (ANTLRHashMap *)[programs getName:name];
-    if ( is == nil ) {
-        is = [self initializeProgram:name];
-    }
-    return is;
-}
-
--(ANTLRHashMap *) initializeProgram:(NSString *)name
-{
-    ANTLRHashMap *is = [ANTLRHashMap newANTLRHashMapWithLen:PROGRAM_INIT_SIZE];
-    [is putName:name Node:nil];
-    return is;
-}
-
-- (NSString *)toOriginalString
-{
-    [super fill];
-    return [self toOriginalString:MIN_TOKEN_INDEX End:[tokens count]-1];
-}
-
-- (NSString *)toOriginalString:(NSInteger)start End:(NSInteger)end
-{
-    NSMutableString *buf = [NSMutableString stringWithCapacity:100];
-    for (int i = start; i >= MIN_TOKEN_INDEX && i <= end && i< [tokens count]; i++) {
-        if ( [[lastRewriteTokenIndexes objectAtIndex:i] type] != ANTLRTokenTypeEOF )
-            [buf appendString:[[tokens objectAtIndex:i] text]];
-    }
-    return [NSString stringWithString:buf];
-}
-
-- (NSString *)toString
-{
-    [super fill];
-    return [self toStringFromStart:MIN_TOKEN_INDEX ToEnd:[tokens count]-1];
-}
-
-- (NSString *)toString:(NSString *)programName
-{
-    [super fill];
-    return [self toString:programName FromStart:MIN_TOKEN_INDEX ToEnd:[[programs objectAtIndex:MIN_TOKEN_INDEX] count]-1];
-}
-
-- (NSString *)toStringFromStart:(NSInteger)start ToEnd:(NSInteger)end
-{
-    return [self toString:DEFAULT_PROGRAM_NAME FromStart:start ToEnd:end];
-}
-
-- (NSString *)toString:(NSString *)programName FromStart:(NSInteger)start ToEnd:(NSInteger)end
-{
-    ANTLRHashMap *rewrites = (ANTLRHashMap *)[programs getName:programName];
-    
-    // ensure start/end are in range
-    if ( end > [tokens count]-1 ) end = [tokens count]-1;
-    if ( start < 0 )
-        start = 0;
-    
-    if ( rewrites == nil || [rewrites count] == 0 ) {
-        return [self toOriginalString:start End:end]; // no instructions to execute
-    }
-    NSMutableString *buf = [NSMutableString stringWithCapacity:100];
-    
-    // First, optimize instruction stream
-    ANTLRHashMap *indexToOp = [self reduceToSingleOperationPerIndex:rewrites];
-    
-    // Walk buffer, executing instructions and emitting tokens
-    int i = start;
-    while ( i <= end && i < [tokens count] ) {
-        ANTLRRewriteOperation *op = (ANTLRRewriteOperation *)[indexToOp objectAtIndex:i];
-        [indexToOp setObject:nil atIndex:i]; // remove so any left have rwIndex size-1
-        id<ANTLRToken>t = (id<ANTLRToken>) [tokens objectAtIndex:i];
-        if ( op == nil ) {
-            // no operation at that rwIndex, just dump token
-            if ( t.type != ANTLRTokenTypeEOF )
-                [buf appendString:t.text];
-            i++; // move to next token
-        }
-        else {
-            i = [op execute:buf]; // execute operation and skip
-        }
-    }
-    
-    // include stuff after end if it's last rwIndex in buffer
-    // So, if they did an insertAfter(lastValidIndex, "foo"), include
-    // foo if end==lastValidIndex.
-    //if ( end == [tokens size]-1 ) {
-    if ( end == [tokens count]-1 ) {
-        // Scan any remaining operations after last token
-        // should be included (they will be inserts).
-        int i2 = 0;
-        while ( i2 < [indexToOp count] - 1 ) {
-            ANTLRRewriteOperation *op = [indexToOp objectAtIndex:i2];
-            if ( op.rwIndex >= [tokens count]-1 ) {
-                [buf appendString:op.text];
-            }
-        }
-    }
-    return [NSString stringWithString:buf];
-}
-
-/** We need to combine operations and report invalid operations (like
- *  overlapping replaces that are not completed nested).  Inserts to
- *  same rwIndex need to be combined etc...   Here are the cases:
- *
- *  I.i.u I.j.v								leave alone, nonoverlapping
- *  I.i.u I.i.v								combine: Iivu
- *
- *  R.i-j.u R.x-y.v	| i-j in x-y			delete first R
- *  R.i-j.u R.i-j.v							delete first R
- *  R.i-j.u R.x-y.v	| x-y in i-j			ERROR
- *  R.i-j.u R.x-y.v	| boundaries overlap	ERROR
- *
- *  I.i.u R.x-y.v | i in x-y				delete I
- *  I.i.u R.x-y.v | i not in x-y			leave alone, nonoverlapping
- *  R.x-y.v I.i.u | i in x-y				ERROR
- *  R.x-y.v I.x.u 							R.x-y.uv (combine, delete I)
- *  R.x-y.v I.i.u | i not in x-y			leave alone, nonoverlapping
- *
- *  I.i.u = insert u before op @ rwIndex i
- *  R.x-y.u = replace x-y indexed tokens with u
- *
- *  First we need to examine replaces.  For any replace op:
- *
- * 		1. wipe out any insertions before op within that range.
- *		2. Drop any replace op before that is contained completely within
- *         that range.
- *		3. Throw exception upon boundary overlap with any previous replace.
- *
- *  Then we can deal with inserts:
- *
- * 		1. for any inserts to same rwIndex, combine even if not adjacent.
- * 		2. for any prior replace with same left boundary, combine this
- *         insert with replace and delete this replace.
- * 		3. throw exception if rwIndex in same range as previous replace
- *
- *  Don't actually delete; make op null in list. Easier to walk list.
- *  Later we can throw as we add to rwIndex -> op map.
- *
- *  Note that I.2 R.2-2 will wipe out I.2 even though, technically, the
- *  inserted stuff would be before the replace range.  But, if you
- *  add tokens in front of a method body '{' and then delete the method
- *  body, I think the stuff before the '{' you added should disappear too.
- *
- *  Return a map from token rwIndex to operation.
- */
-- (ANTLRHashMap *)reduceToSingleOperationPerIndex:(ANTLRHashMap *)rewrites
-{
-    //System.out.println("rewrites="+rewrites);
-    if (debug > 1) NSLog(@"rewrites=%@\n", [rewrites getName:DEFAULT_PROGRAM_NAME]);
-    // WALK REPLACES
-    for (int i = 0; i < [rewrites count]; i++) {
-        ANTLRRewriteOperation *op = (ANTLRRewriteOperation *)[rewrites objectAtIndex:i];
-        if ( op==nil )
-            continue;
-        if ( !([[op class] isKindOfClass:[ANTLRReplaceOp class]]) )
-            continue;
-        ANTLRReplaceOp *rop = (ANTLRReplaceOp *)[rewrites objectAtIndex:i];
-        // Wipe prior inserts within range
-        //List inserts = getKindOfOps(rewrites, ANTLRInsertBeforeOp.class, i);
-        ANTLRHashMap *inserts = [self getKindOfOps:rewrites KindOfClass:[ANTLRInsertBeforeOp class] Index:i];
-        for (int j = 0; j < [inserts size]; j++) {
-            ANTLRInsertBeforeOp *iop = (ANTLRInsertBeforeOp *)[inserts objectAtIndex:j];
-            if ( iop.rwIndex >= rop.rwIndex && iop.rwIndex <= rop.lastIndex ) {
-                // delete insert as it's a no-op.
-                [rewrites insertObject:nil atIndex:iop.instructionIndex];
-            }
-        }
-        // Drop any prior replaces contained within
-        ANTLRHashMap *prevReplaces = [self getKindOfOps:rewrites KindOfClass:[ANTLRReplaceOp class] Index:i];
-        for (int j = 0; j < [prevReplaces count]; j++) {
-            ANTLRReplaceOp *prevRop = (ANTLRReplaceOp *) [prevReplaces objectAtIndex:j];
-            if ( prevRop.rwIndex>=rop.rwIndex && prevRop.lastIndex <= rop.lastIndex ) {
-                // delete replace as it's a no-op.
-                [rewrites setObject:nil atIndex:prevRop.instructionIndex];
-                continue;
-            }
-            // throw exception unless disjoint or identical
-            BOOL disjoint = prevRop.lastIndex<rop.rwIndex || prevRop.rwIndex > rop.lastIndex;
-            BOOL same = prevRop.rwIndex==rop.rwIndex && prevRop.lastIndex==rop.lastIndex;
-            if ( !disjoint && !same ) {
-                @throw [ANTLRIllegalArgumentException newException:
-                        [NSString stringWithFormat:@"replace op boundaries of %@, overlap with previous %@\n", rop, prevRop]];
-            }
-        }
-    }
-    
-    // WALK INSERTS
-    for (int i = 0; i < [rewrites count]; i++) {
-        ANTLRRewriteOperation *op = (ANTLRRewriteOperation *)[rewrites objectAtIndex:i];
-        if ( op == nil )
-            continue;
-        if ( !([[op class] isKindOfClass:[ANTLRInsertBeforeOp class]]) )
-            continue;
-        ANTLRInsertBeforeOp *iop = (ANTLRInsertBeforeOp *)[rewrites objectAtIndex:i];
-        // combine current insert with prior if any at same rwIndex
-        ANTLRHashMap *prevInserts = (ANTLRHashMap *)[self getKindOfOps:rewrites KindOfClass:[ANTLRInsertBeforeOp class] Index:i];
-        for (int j = 0; j < [prevInserts count]; j++) {
-            ANTLRInsertBeforeOp *prevIop = (ANTLRInsertBeforeOp *) [prevInserts objectAtIndex:j];
-            if ( prevIop.rwIndex == iop.rwIndex ) { // combine objects
-                                                // convert to strings...we're in process of toString'ing
-                                                // whole token buffer so no lazy eval issue with any templates
-                iop.text = [self catOpText:iop.text PrevText:prevIop.text];
-                // delete redundant prior insert
-                [rewrites setObject:nil atIndex:prevIop.instructionIndex];
-            }
-        }
-        // look for replaces where iop.rwIndex is in range; error
-        ANTLRHashMap *prevReplaces = (ANTLRHashMap *)[self getKindOfOps:rewrites KindOfClass:[ANTLRReplaceOp class] Index:i];
-        for (int j = 0; j < [prevReplaces count]; j++) {
-            ANTLRReplaceOp *rop = (ANTLRReplaceOp *) [prevReplaces objectAtIndex:j];
-            if ( iop.rwIndex == rop.rwIndex ) {
-                rop.text = [self catOpText:iop.text PrevText:rop.text];
-                [rewrites setObject:nil atIndex:i];  // delete current insert
-                continue;
-            }
-            if ( iop.rwIndex >= rop.rwIndex && iop.rwIndex <= rop.lastIndex ) {
-                @throw [ANTLRIllegalArgumentException newException:[NSString stringWithFormat:@"insert op %d within boundaries of previous %d", iop, rop]];
-            }
-        }
-    }
-    // System.out.println("rewrites after="+rewrites);
-    ANTLRHashMap *m = [ANTLRHashMap newANTLRHashMapWithLen:15];
-    for (int i = 0; i < [rewrites count]; i++) {
-        ANTLRRewriteOperation *op = (ANTLRRewriteOperation *)[rewrites objectAtIndex:i];
-        if ( op == nil )
-            continue; // ignore deleted ops
-        if ( [m objectAtIndex:op.rwIndex] != nil ) {
-            @throw [ANTLRRuntimeException newException:@"should only be one op per rwIndex\n"];
-        }
-        //[m put(new Integer(op.rwIndex), op);
-        [m setObject:op atIndex:op.rwIndex];
-    }
-    //System.out.println("rwIndex to op: "+m);
-    if (debug > 1) NSLog(@"rwIndex to  op %d\n", (NSInteger)m);
-    return m;
-}
-
-- (NSString *)catOpText:(id)a PrevText:(id)b
-{
-    NSString *x = @"";
-    NSString *y = @"";
-    if ( a != nil )
-        x = [a toString];
-    if ( b != nil )
-        y = [b toString];
-    return [NSString stringWithFormat:@"%@%@",x, y];
-}
-
-- (ANTLRHashMap *)getKindOfOps:(ANTLRHashMap *)rewrites KindOfClass:(Class)kind
-{
-    return [self getKindOfOps:rewrites KindOfClass:kind Index:[rewrites count]];
-}
-
-/** Get all operations before an rwIndex of a particular kind */
-- (ANTLRHashMap *)getKindOfOps:(ANTLRHashMap *)rewrites KindOfClass:(Class)kind Index:(NSInteger)before
-{
-    ANTLRHashMap *ops = [ANTLRHashMap newANTLRHashMapWithLen:15];
-    for (int i = 0; i < before && i < [rewrites count]; i++) {
-        ANTLRRewriteOperation *op = (ANTLRRewriteOperation *)[rewrites objectAtIndex:i];
-        if ( op == nil )
-            continue; // ignore deleted
-        if ( [op isKindOfClass:(Class)kind] )
-            [ops addObject:op];
-    }		
-    return ops;
-}
-
-- (NSMutableString *)toDebugString
-{
-    return [self toDebugStringFromStart:MIN_TOKEN_INDEX ToEnd:[tokens count]-1];
-}
-
-- (NSMutableString *)toDebugStringFromStart:(NSInteger)start ToEnd:(NSInteger)end
-{
-    NSMutableString *buf = [NSMutableString stringWithCapacity:100];
-    for (int i = start; i >= MIN_TOKEN_INDEX && i <= end && i < [tokens count]; i++) {
-        [buf appendString:[[tokens objectAtIndex:i] text]];
-    }
-    return [NSString stringWithString:buf];
-}
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRTokenSource.h b/runtime/ObjC/Framework/ANTLRTokenSource.h
deleted file mode 100644
index ca1fa2b..0000000
--- a/runtime/ObjC/Framework/ANTLRTokenSource.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import "ANTLRToken.h"
-
-// Anything that responds to -nextToken can be treated as a lexer.
-// For instance this can be a flex lexer or a handwritten one or even
-// a proxy for a remotely running token source (database, lexer, whatever).
-@protocol ANTLRTokenSource <NSObject, NSCopying>
-
-- (id<ANTLRToken>) nextToken;
-- (NSString *)getSourceName;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRTokenStream.h b/runtime/ObjC/Framework/ANTLRTokenStream.h
deleted file mode 100644
index c104578..0000000
--- a/runtime/ObjC/Framework/ANTLRTokenStream.h
+++ /dev/null
@@ -1,62 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import "ANTLRIntStream.h"
-#import "ANTLRToken.h"
-
-@protocol ANTLRTokenStream < ANTLRIntStream >
-
-// Get Token at current input pointer + i ahead where i=1 is next Token.
-// i<0 indicates tokens in the past.  So -1 is previous token and -2 is
-// two tokens ago. LT:0 is undefined.  For i>=n, return Token.EOFToken.
-// Return null for LT:0 and any index that results in an absolute address
-// that is negative.
-
-- (id<ANTLRToken>) LT:(NSInteger) i;
-
-- (id<ANTLRToken>) getToken:(NSUInteger) i;
-
-- (id) getTokenSource;
-
-- (NSString *) toString;
-/** Return the text of all tokens from start to stop, inclusive.
- *  If the stream does not buffer all the tokens then it can just
- *  return "" or null;  Users should not access $ruleLabel.text in
- *  an action of course in that case.
- */
-- (NSString *)toStringFromStart:(NSInteger)startIdx ToEnd:(NSInteger)stopIdx;
-
-/** Because the user is not required to use a token with an index stored
- *  in it, we must provide a means for two token objects themselves to
- *  indicate the start/end location.  Most often this will just delegate
- *  to the other toString(int,int).  This is also parallel with
- *  the TreeNodeStream.toString(Object,Object).
- */
-- (NSString *) toStringFromToken:(id<ANTLRToken>)startToken ToToken:(id<ANTLRToken>)stopToken;
-
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRTree.h b/runtime/ObjC/Framework/ANTLRTree.h
deleted file mode 100644
index 32f603a..0000000
--- a/runtime/ObjC/Framework/ANTLRTree.h
+++ /dev/null
@@ -1,129 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#ifndef DEBUG_DEALLOC
-#define DEBUG_DEALLOC
-#endif
-
-#import "AMutableArray.h"
-
-@protocol ANTLRTree < NSObject, NSCopying >
-
-//+ (id<ANTLRTree>) invalidNode;
-
-- (id<ANTLRTree>) getChild:(NSUInteger)index;
-- (NSUInteger) getChildCount;
-
-// Tree tracks parent and child index now > 3.0
-
-- (id<ANTLRTree>)getParent;
-
-- (void) setParent:(id<ANTLRTree>)t;
-
-/** Is there is a node above with token type ttype? */
-- (BOOL) hasAncestor:(NSInteger)ttype;
-
-/** Walk upwards and get first ancestor with this token type. */
-- (id<ANTLRTree>) getAncestor:(NSInteger) ttype;
-
-/** Return a list of all ancestors of this node.  The first node of
- *  list is the root and the last is the parent of this node.
- */
-- (AMutableArray *) getAncestors;
-
-/** This node is what child index? 0..n-1 */
-- (NSInteger) getChildIndex;
-
-- (void) setChildIndex:(NSInteger) index;
-
-/** Set the parent and child index values for all children */
-- (void) freshenParentAndChildIndexes;
-
-/** Add t as a child to this node.  If t is null, do nothing.  If t
- *  is nil, add all children of t to this' children.
- */
-- (void) addChild:(id<ANTLRTree>) t;
-
-/** Set ith child (0..n-1) to t; t must be non-null and non-nil node */
-- (void) setChild:(NSInteger)i With:(id<ANTLRTree>) t;
-
-- (id) deleteChild:(NSInteger) i;
-
-/** Delete children from start to stop and replace with t even if t is
- *  a list (nil-root tree).  num of children can increase or decrease.
- *  For huge child lists, inserting children can force walking rest of
- *  children to set their childindex; could be slow.
- */
-- (void) replaceChildrenFrom:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id)t;	
-
-- (NSArray *) children;
-// Add t as a child to this node.  If t is null, do nothing.  If t
-//  is nil, add all children of t to this' children.
-
-- (void) addChildren:(NSArray *) theChildren;
-//- (void) removeAllChildren;
-
-// Indicates the node is a nil node but may still have children, meaning
-// the tree is a flat list.
-
-- (BOOL) isNil;
-
-/**  What is the smallest token index (indexing from 0) for this node
- *   and its children?
- */
-- (NSInteger) getTokenStartIndex;
-
-- (void) setTokenStartIndex:(NSInteger) index;
-
-/**  What is the largest token index (indexing from 0) for this node
- *   and its children?
- */
-- (NSInteger) getTokenStopIndex;
-- (void) setTokenStopIndex:(NSInteger) index;
-
-- (id<ANTLRTree>) dupNode;
-
-- (NSString *) toString;
-
-#pragma mark Copying
-- (id) copyWithZone:(NSZone *)aZone;	// the children themselves are not copied here!
-- (id) deepCopy;					// performs a deepCopyWithZone: with the default zone
-- (id) deepCopyWithZone:(NSZone *)aZone;
-
-#pragma mark Tree Parser support
-- (NSInteger)type;
-- (NSString *)text;
-// In case we don't have a token payload, what is the line for errors?
-- (NSUInteger)line;
-- (NSUInteger)charPositionInLine;
-- (void) setCharPositionInLine:(NSUInteger)pos;
-
-#pragma mark Informational
-- (NSString *) treeDescription;
-- (NSString *) description;
-
-@end
-
diff --git a/runtime/ObjC/Framework/ANTLRTree.m b/runtime/ObjC/Framework/ANTLRTree.m
deleted file mode 100644
index 4d9edaa..0000000
--- a/runtime/ObjC/Framework/ANTLRTree.m
+++ /dev/null
@@ -1,149 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import "ANTLRTree.h"
-#import "ANTLRToken.h"
-// TODO: this shouldn't be here...but needed for invalidNode
-#import "ANTLRCommonTree.h"
-
-@implementation ANTLRTree
-
-@synthesize isEmpty;
-@synthesize isEmptyNode;
-@synthesize invalidNode;
-@synthesize children;
-
-#pragma mark ANTLRTree protocol conformance
-
-+ (id<ANTLRTree>) invalidNode
-{
-	static id<ANTLRTree> invalidNode = nil;
-	if (!invalidNode) {
-		invalidNode = [[ANTLRCommonTree alloc] initWithTokenType:ANTLRTokenTypeInvalid];
-	}
-	return invalidNode;
-}
-
-- (id<ANTLRTree>) init
-{
-	self = [super init];
-	if ( self != nil ) {
-		isEmptyNode = NO;
-	}
-	return self;
-}
-
-- (void) dealloc
-{
-	[super dealloc];
-}
-
-- (id<ANTLRTree>) getChild:(NSUInteger) index
-{
-	return nil;
-}
-
-- (NSUInteger) getChildCount
-{
-	return 0;
-}
-
-- (NSArray *) getChildren
-{
-	return nil;
-}
-
-	// Add tree as a child to this node.  If tree is nil, do nothing.  If tree
-	// is an empty node, add all children of tree to our children.
-
-- (void) addChild:(id<ANTLRTree>) tree
-{
-}
-
-- (void) addChildren:(NSArray *) theChildren
-{
-}
-
-- (void) removeAllChildren
-{
-}
-
-	// Indicates the node is an empty node but may still have children, meaning
-	// the tree is a flat list.
-
-- (BOOL) isEmpty
-{
-	return isEmptyNode;
-}
-
-- (void) setIsEmpty:(BOOL)emptyFlag
-{
-	isEmptyNode = emptyFlag;
-}
-
-#pragma mark ANTLRTree abstract base class
-
-	// Return a token type; needed for tree parsing
-- (NSInteger) getType
-{
-	return 0;
-}
-
-- (NSString *) getText
-{
-	return [self description];
-}
-
-	// In case we don't have a token payload, what is the line for errors?
-- (NSInteger) getLine
-{
-	return 0;
-}
-
-- (NSInteger) getCharPositionInLine
-{
-	return 0;
-}
-
-- (NSString *) treeDescription
-{
-	return @"";
-}
-
-- (NSString *) description
-{
-	return @"";
-}
-
-- (void) _createChildrenList
-{
-	if ( children == nil )
-		children = [[NSMutableArray alloc] init];
-}
-
-@end
-
-@end
\ No newline at end of file
diff --git a/runtime/ObjC/Framework/ANTLRTreeAdaptor.h b/runtime/ObjC/Framework/ANTLRTreeAdaptor.h
deleted file mode 100644
index e0d94e0..0000000
--- a/runtime/ObjC/Framework/ANTLRTreeAdaptor.h
+++ /dev/null
@@ -1,157 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import "ANTLRToken.h"
-#import "ANTLRBaseTree.h"
-#import "ANTLRTokenStream.h"
-
-#pragma warning tree/node diction is broken.
-
-@protocol ANTLRTreeAdaptor <NSObject, NSCopying>
-
-#pragma mark Construction
-
-#pragma mark ANTLRTreeAdaptor implementation
-- (id)dupNode:(id)aNode;	// copies just the node
-- (id)dupTree:(id)aTree;	// copies the entire subtree, recursively
-
-/** Return a nil node (an empty but non-null node) that can hold
- *  a list of element as the children.  If you want a flat tree (a list)
- *  use "t=adaptor.nil(); t.addChild(x); t.addChild(y);"
- */
-- (id) emptyNode;
-
-/** Return a tree node representing an error.  This node records the
- *  tokens consumed during error recovery.  The start token indicates the
- *  input symbol at which the error was detected.  The stop token indicates
- *  the last symbol consumed during recovery.
- *
- *  You must specify the input stream so that the erroneous text can
- *  be packaged up in the error node.  The exception could be useful
- *  to some applications; default implementation stores ptr to it in
- *  the CommonErrorNode.
- *
- *  This only makes sense during token parsing, not tree parsing.
- *  Tree parsing should happen only when parsing and tree construction
- *  succeed.
- */
-- (id) errorNode:(id<ANTLRTokenStream>)anInput
-            From:(id<ANTLRToken>)aStartToken
-              To:(id<ANTLRToken>)aStopToken
-       Exception:(NSException *) e;
-
-/** Is tree considered a nil node used to make lists of child nodes? */
-- (BOOL) isNil:(id)aTree;
-
-
-- (void) addChild:(id)child toTree:(id)aTree;
-
-/** If oldRoot is a nil root, just copy or move the children to newRoot.
- *  If not a nil root, make oldRoot a child of newRoot.
- *
- *    old=^(nil a b c), new=r yields ^(r a b c)
- *    old=^(a b c), new=r yields ^(r ^(a b c))
- *
- *  If newRoot is a nil-rooted single child tree, use the single
- *  child as the new root node.
- *
- *    old=^(nil a b c), new=^(nil r) yields ^(r a b c)
- *    old=^(a b c), new=^(nil r) yields ^(r ^(a b c))
- *
- *  If oldRoot was null, it's ok, just return newRoot (even if isNil).
- *
- *    old=null, new=r yields r
- *    old=null, new=^(nil r) yields ^(nil r)
- *
- *  Return newRoot.  Throw an exception if newRoot is not a
- *  simple node or nil root with a single child node--it must be a root
- *  node.  If newRoot is ^(nil x) return x as newRoot.
- *
- *  Be advised that it's ok for newRoot to point at oldRoot's
- *  children; i.e., you don't have to copy the list.  We are
- *  constructing these nodes so we should have this control for
- *  efficiency.
- */
-- (id) becomeRoot:(id)newRoot old:(id)oldRoot;
-
-- (id) rulePostProcessing:(id)root;
-
-#pragma mark Rewrite Rules
-                           
-- (NSUInteger) getUniqueID:(id)aNode;
-
-- (id) create:(id<ANTLRToken>)payload;
-- (id) createTree:(NSInteger)tokenType FromToken:(id<ANTLRToken>)fromToken;
-- (id) createTree:(NSInteger)tokenType FromToken:(id<ANTLRToken>)fromToken Text:(NSString *)text;
-- (id) createTree:(NSInteger)tokenType Text:(NSString *)text;
-
-#pragma mark Content
-
-- (id)dupNode:(id)aNode;
-- (id)dupTree:(id)aTree;
-
-- (NSInteger) getType:(id)aNode;
-- (void) setType:(id)aNode Type:(NSInteger)tokenType;
-
-- (NSString *) getText:(id)aNode;
-- (void) setText:(id)aNode Text:(NSString *)tokenText;
-
-//- (id<ANTLRToken>) getToken:(id)t;
-
-- (void) setTokenBoundaries:(id)aTree From:(id<ANTLRToken>)startToken To:(id<ANTLRToken>)stopToken;
-- (NSInteger) getTokenStartIndex:(id)aTree;
-- (NSInteger) getTokenStopIndex:(id)aTree;
-
-#pragma mark Navigation / Tree Parsing
-
-/** Get a child 0..n-1 node */
-- (id) getChild:(id)aNode At:(NSInteger) i;
-/** Set ith child (0..n-1) to t; t must be non-null and non-nil node */
-- (void) setChild:(id)aTree At:(NSInteger)index Child:(id)child;
-/** Remove ith child and shift children down from right. */
-- (id) deleteChild:(id)t Index:(NSInteger)index;
-
-/** How many children?  If 0, then this is a leaf node */
-- (NSInteger) getChildCount:(id) aTree;
-
-/** Who is the parent node of this node; if null, implies node is root.
- *  If your node type doesn't handle this, it's ok but the tree rewrites
- *  in tree parsers need this functionality.
- */
-- (id)getParent:(id)t;
-- (void) setParent:(id)t With:(id)parent;
-
-/** What index is this node in the child list? Range: 0..n-1
- *  If your node type doesn't handle this, it's ok but the tree rewrites
- *  in tree parsers need this functionality.
- */
-- (NSInteger) getChildIndex:(id)t;
-- (void) setChildIndex:(id)t With:(NSInteger)index;
-
-- (void) replaceChildren:(id)parent From:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id)t;
-
-@end
-
diff --git a/runtime/ObjC/Framework/ANTLRTreeAdaptor.m b/runtime/ObjC/Framework/ANTLRTreeAdaptor.m
deleted file mode 100644
index ce64b13..0000000
--- a/runtime/ObjC/Framework/ANTLRTreeAdaptor.m
+++ /dev/null
@@ -1,238 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-#import "ANTLRTreeAdaptor.h"
-#import "ANTLRTreeException.h"
-#import "ANTLRBaseTree.h"
-
-@implementation ANTLRTreeAdaptor
-
-
-+ (id<ANTLRBaseTree>) newEmptyTree
-{
-	return [ANTLRTreeAdaptor newTreeWithToken:nil];
-}
-
-+ (id) newAdaptor
-{
-    return [[ANTLRTreeAdaptor alloc] init];
-}
-
-- (id) init
-{
-    self = [super init];
-    return self;
-}
-
-- (id) initWithPayload:(id<ANTLRToken>)payload
-{
-    self = [super init];
-    return self;
-}
-
-#pragma mark Rewrite Rules
-
-/** Create a tree node from Token object; for CommonTree type trees,
- *  then the token just becomes the payload.  This is the most
- *  common create call.
- *
- *  Override if you want another kind of node to be built.
- */
-- (id<ANTLRBaseTree>) create:(id<ANTLRToken>) payload
-{
-    return nil;
-}
-
-/** Create a new node derived from a token, with a new token type.
- *  This is invoked from an imaginary node ref on right side of a
- *  rewrite rule as IMAG[$tokenLabel].
- *
- *  This should invoke createToken(Token).
- */
-- (id<ANTLRBaseTree>) createTree:(NSInteger)tokenType fromToken:(id<ANTLRToken>)fromToken
-{
-	id<ANTLRToken> newToken = [self createToken:fromToken];
-	[newToken setType:tokenType];
-    
-	id<ANTLRBaseTree> newTree = [self create:newToken];
-	[newToken release];
-	return newTree;
-}
-
-/** Create a new node derived from a token, with a new token type.
- *  This is invoked from an imaginary node ref on right side of a
- *  rewrite rule as IMAG[$tokenLabel].
- *
- *  This should invoke createToken(Token).
- */
-- (id<ANTLRBaseTree>) createTree:(NSInteger)tokenType fromToken:(id<ANTLRToken>)fromToken text:(NSString *)tokenText
-{
-	id<ANTLRToken> newToken = [self createToken:fromToken];
-	[newToken setText:tokenText];
-	
-	id<ANTLRBaseTree> newTree = [self create:newToken];
-	[newToken release];
-	return newTree;
-}
-
-/** Create a new node derived from a token, with a new token type.
- *  This is invoked from an imaginary node ref on right side of a
- *  rewrite rule as IMAG["IMAG"].
- *
- *  This should invoke createToken(int,String).
- */
-- (id<ANTLRBaseTree>) createTree:(NSInteger)tokenType text:(NSString *)tokenText
-{
-	id<ANTLRToken> newToken = [self createToken:tokenType text:tokenText];
-	
-	id<ANTLRBaseTree> newTree = [self create:newToken];
-	[newToken release];
-	return newTree;
-}
-
-- (id) copyNode:(id<ANTLRBaseTree>)aNode
-{
-	return [aNode copyWithZone:nil];	// not -copy: to silence warnings
-}
-
-- (id) copyTree:(id<ANTLRBaseTree>)aTree
-{
-	return [aTree deepCopy];
-}
-
-
-- (void) addChild:(id<ANTLRBaseTree>)child toTree:(id<ANTLRBaseTree>)aTree
-{
-	[aTree addChild:child];
-}
-
-- (id) makeNode:(id<ANTLRBaseTree>)newRoot parentOf:(id<ANTLRBaseTree>)oldRoot
-{
-	id<ANTLRBaseTree> newRootNode = newRoot;
-
-	if (oldRoot == nil)
-		return newRootNode;
-    // handles ^(nil real-node) case
-	if ([newRootNode isNil]) {
-		if ([newRootNode getChildCount] > 1) {
-#warning TODO: Find a way to the current input stream here!
-			@throw [ANTLRTreeException exceptionWithOldRoot:oldRoot newRoot:newRootNode stream:nil];
-		}
-#warning TODO: double check memory management with respect to code generation
-		// remove the empty node, placing its sole child in its role.
-		id<ANTLRBaseTree> tmpRootNode = [[newRootNode childAtIndex:0] retain];
-		[newRootNode release];
-		newRootNode = tmpRootNode;		
-	}
-	// the handling of an empty node at the root of oldRoot happens in addChild:
-	[newRootNode addChild:oldRoot];
-    // this release relies on the fact that the ANTLR code generator always assigns the return value of this method
-    // to the variable originally holding oldRoot. If we don't release we leak the reference.
-    // FIXME: this is totally non-obvious. maybe do it in calling code by comparing pointers and conditionally releasing
-    // the old object
-    [oldRoot release];
-    
-    // what happens to newRootNode's retain count? Should we be autoreleasing this one? Probably.
-	return [newRootNode retain];
-}
-
-
-- (id<ANTLRBaseTree>) postProcessTree:(id<ANTLRBaseTree>)aTree
-{
-	id<ANTLRBaseTree> processedNode = aTree;
-	if (aTree != nil && [aTree isNil] != NO && [aTree getChildCount] == 1) {
-		processedNode = [aTree childAtIndex:0];
-	}
-	return processedNode;
-}
-
-
-- (NSUInteger) uniqueIdForTree:(id<ANTLRBaseTree>)aNode
-{
-	// TODO: is hash appropriate here?
-	return [aNode hash];
-}
-
-
-#pragma mark Content
-
-- (NSInteger) tokenTypeForNode:(id<ANTLRBaseTree>)aNode
-{
-	return [aNode getType];
-}
-
-- (void) setTokenType:(NSInteger)tokenType forNode:(id)aNode
-{
-	// currently unimplemented
-}
-
-
-- (NSString *) textForNode:(id<ANTLRBaseTree>)aNode
-{
-	return [aNode getText];
-}
-
-- (void) setText:(NSString *)tokenText forNode:(id<ANTLRBaseTree>)aNode
-{
-	// currently unimplemented
-}
-
-
-#pragma mark Navigation / Tree Parsing
-
-- (id<ANTLRBaseTree>) childForNode:(id<ANTLRBaseTree>) aNode atIndex:(NSInteger) i
-{
-	// currently unimplemented
-	return nil;
-}
-
-- (NSInteger) childCountForTree:(id<ANTLRBaseTree>) aTree
-{
-	// currently unimplemented
-	return 0;
-}
-
-#pragma mark Subclass Responsibilties
-
-- (void) setBoundariesForTree:(id<ANTLRBaseTree>)aTree fromToken:(id<ANTLRToken>)startToken toToken:(id<ANTLRToken>)stopToken
-{
-	// subclass responsibility
-}
-
-- (NSInteger) tokenStartIndexForTree:(id<ANTLRBaseTree>)aTree
-{
-	// subclass responsibility
-	return 0;
-}
-
-- (NSInteger) tokenStopIndexForTree:(id<ANTLRBaseTree>)aTree
-{
-	// subclass responsibility
-	return 0;
-}
-
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRTreeException.h b/runtime/ObjC/Framework/ANTLRTreeException.h
deleted file mode 100644
index 28330af..0000000
--- a/runtime/ObjC/Framework/ANTLRTreeException.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTree.h"
-#import "ANTLRRecognitionException.h"
-
-@interface ANTLRTreeException : ANTLRRecognitionException {
-	id<ANTLRBaseTree> oldRoot;
-	id<ANTLRBaseTree> newRoot;
-}
-
-+ (id) newException:(id<ANTLRBaseTree>)theOldRoot newRoot:(id<ANTLRBaseTree>)theNewRoot stream:(id<ANTLRIntStream>)aStream;
-- (id) initWithOldRoot:(id<ANTLRBaseTree>)theOldRoot newRoot:(id<ANTLRBaseTree>)theNewRoot stream:(id<ANTLRIntStream>)aStream;
-
-- (void) setOldRoot:(id<ANTLRBaseTree>)aTree;
-- (void) setNewRoot:(id<ANTLRBaseTree>)aTree;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRTreeException.m b/runtime/ObjC/Framework/ANTLRTreeException.m
deleted file mode 100644
index b61d29c..0000000
--- a/runtime/ObjC/Framework/ANTLRTreeException.m
+++ /dev/null
@@ -1,85 +0,0 @@
-//
-//  ANTLRTreeException.m
-//  ANTLR
-//
-//  Created by Kay Röpke on 24.10.2006.
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import "ANTLRTreeException.h"
-
-
-@implementation ANTLRTreeException
-
-+ (id) newException:(id<ANTLRBaseTree>)theOldRoot newRoot:(id<ANTLRBaseTree>)theNewRoot stream:(id<ANTLRIntStream>)aStream;
-{
-	return [[ANTLRTreeException alloc] initWithOldRoot:theOldRoot newRoot:theNewRoot stream:aStream];
-}
-
-- (id) initWithOldRoot:(id<ANTLRBaseTree>)theOldRoot newRoot:(id<ANTLRBaseTree>)theNewRoot stream:(id<ANTLRIntStream>)aStream;
-{
-	if ((self = [super initWithStream:aStream reason:@"The new root has more than one child. Cannot make it the root node."]) != nil ) {
-		[self setOldRoot:theOldRoot];
-		[self setNewRoot:theNewRoot];
-	}
-	return self;
-}
-
-- (void) dealloc
-{
-#ifdef DEBUG_DEALLOC
-    NSLog( @"called dealloc in ANTLRTreeException" );
-#endif
-	[self setOldRoot:nil];
-	[self setNewRoot:nil];
-	[super dealloc];
-}
-
-- (void) setNewRoot:(id<ANTLRBaseTree>)aTree
-{
-	if (newRoot != aTree) {
-		[aTree retain];
-		if ( newRoot ) [newRoot release];
-		newRoot = aTree;
-	}
-}
-
-- (void) setOldRoot:(id<ANTLRBaseTree>)aTree
-{
-	if (oldRoot != aTree) {
-		[aTree retain];
-		if ( oldRoot ) [oldRoot release];
-		oldRoot = aTree;
-	}
-}
-
-- (NSString *) description
-{
-	 return [NSMutableString stringWithFormat:@"%@ old root: <%@> new root: <%@>", [super description], [oldRoot treeDescription], [newRoot treeDescription]];
-}
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRTreeIterator.h b/runtime/ObjC/Framework/ANTLRTreeIterator.h
deleted file mode 100644
index b5cf8c3..0000000
--- a/runtime/ObjC/Framework/ANTLRTreeIterator.h
+++ /dev/null
@@ -1,72 +0,0 @@
-//
-//  ANTLRTreeIterator.h
-//  ANTLR
-//
-//  Created by Ian Michell on 26/04/2010.
-// [The "BSD licence"]
-// Copyright (c) 2010 Ian Michell 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRCommonTreeAdaptor.h"
-#import "ANTLRFastQueue.h"
-#import "ANTLRTreeAdaptor.h"
-#import "ANTLRTree.h"
-
-@interface ANTLRTreeIterator : NSObject 
-{
-	BOOL firstTime;
-	__strong id<ANTLRTreeAdaptor> adaptor;
-	__strong id<ANTLRBaseTree> root;
-	__strong id<ANTLRBaseTree> tree;
-	
-	__strong ANTLRFastQueue *nodes;
-	__strong id<ANTLRBaseTree> up;
-	__strong id<ANTLRBaseTree> down;
-	__strong id<ANTLRBaseTree> eof;
-}
-
-@property BOOL firstTime;
-@property(retain) id<ANTLRTreeAdaptor> adaptor;
-@property(retain) id<ANTLRBaseTree> root;
-@property(retain) id<ANTLRBaseTree> tree;
-@property(retain) ANTLRFastQueue *nodes;
-@property(retain, readwrite) id<ANTLRBaseTree> up;
-@property(retain, readwrite) id<ANTLRBaseTree> down;
-@property(retain, readwrite) id<ANTLRBaseTree> eof;
-
-+ newANTRLTreeIterator;
-+ (ANTLRTreeIterator *) newANTRLTreeIteratorWithAdaptor:(ANTLRCommonTreeAdaptor *)adaptor
-                                                andTree:(id<ANTLRBaseTree>)tree;
-- (id) init;
-- (id) initWithTree:(id<ANTLRBaseTree>) t;
-- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>) a andTree:(id<ANTLRBaseTree>) t;
-
-- (void) reset;
-- (BOOL) hasNext;
-- (id) nextObject;
-- (NSArray *) allObjects;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRTreeIterator.m b/runtime/ObjC/Framework/ANTLRTreeIterator.m
deleted file mode 100644
index b760f88..0000000
--- a/runtime/ObjC/Framework/ANTLRTreeIterator.m
+++ /dev/null
@@ -1,202 +0,0 @@
-//
-//  ANTLRTreeIterator.m
-//  ANTLR
-//
-//  Created by Ian Michell on 26/04/2010.
-// Copyright (c) 2010 Ian Michell 2010 Alan Condit
-// 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.
-
-
-#import "ANTLRTreeIterator.h"
-#import "ANTLRCommonTreeAdaptor.h"
-
-@implementation ANTLRTreeIterator
-
-+ (ANTLRTreeIterator *) newANTRLTreeIterator
-{
-    return [[ANTLRTreeIterator alloc] init];
-}
-
-+ (ANTLRTreeIterator *) newANTRLTreeIteratorWithAdaptor:(ANTLRCommonTreeAdaptor *)adaptor
-                                                andTree:(id<ANTLRBaseTree>)tree
-{
-    return [[ANTLRTreeIterator alloc] initWithTreeAdaptor:adaptor andTree:tree];
-}
-
-- (id) init
-{
-    self = [super init];
-    if ( self != nil ) {
-        firstTime = YES;
-        nodes = [[ANTLRFastQueue newANTLRFastQueue] retain];
-        down = [[adaptor createTree:ANTLRTokenTypeDOWN Text:@"DOWN"] retain];
-        up = [[adaptor createTree:ANTLRTokenTypeUP Text:@"UP"] retain];
-        eof = [[adaptor createTree:ANTLRTokenTypeEOF Text:@"EOF"] retain];
-        tree = eof;
-        root = eof;
-    }
-    return self;
-}
-
--(id) initWithTree:(id<ANTLRBaseTree>) t
-{
-    self = [super init];
-    if ( self != nil ) {
-        firstTime = YES;
-        adaptor = [[ANTLRCommonTreeAdaptor newTreeAdaptor] retain];
-        tree = [t retain];
-        root = t;
-        nodes = [[ANTLRFastQueue newANTLRFastQueue] retain];
-        down = [[adaptor createTree:ANTLRTokenTypeDOWN Text:@"DOWN"] retain];
-        up = [[adaptor createTree:ANTLRTokenTypeUP Text:@"UP"] retain];
-        eof = [[adaptor createTree:ANTLRTokenTypeEOF Text:@"EOF"] retain];
-    }
-    return self;
-}
-
--(id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)a andTree:(id<ANTLRBaseTree>)t
-{
-    self = [super init];
-    if ( self != nil ) {
-        firstTime = YES;
-        adaptor = [a retain];
-        tree = [t retain];
-        root = t;
-        nodes = [[ANTLRFastQueue newANTLRFastQueue] retain];
-        down = [[adaptor createTree:ANTLRTokenTypeDOWN Text:@"DOWN"] retain];
-        up = [[adaptor createTree:ANTLRTokenTypeUP Text:@"UP"] retain];
-        eof = [[adaptor createTree:ANTLRTokenTypeEOF Text:@"EOF"] retain];
-    }
-    return self;
-}
-
-- (void)dealloc
-{
-#ifdef DEBUG_DEALLOC
-    NSLog( @"called dealloc in ANTLRTreeIterator" );
-#endif
-    if ( adaptor ) [adaptor release];
-    if ( nodes ) [nodes release];
-    if ( tree && tree != eof ) [tree release];
-    if ( root && root != eof && root != tree ) [root release];
-    if ( down ) [down release];    
-    if ( up ) [up release];    
-    if ( eof ) [eof release];    
-    [super dealloc];
-}
-
-- (void)reset
-{
-    firstTime = YES;
-    tree = root;
-    [nodes clear];
-}
-
--(BOOL) hasNext
-{
-    if ( firstTime ) {
-        return root != nil;
-    }
-    if ( nodes && [nodes size] > 0) {
-        return YES;
-    }
-    if ( tree == nil ) {
-        return NO;
-    }
-    if ( [adaptor getChildCount:tree] > 0 ) {
-        return YES;
-    }
-    return [adaptor getParent:tree] != nil;
-}
-
--(id) nextObject
-{
-    // is this the first time we are using this method?
-    if ( firstTime ) {
-        firstTime = NO;
-        if ( [adaptor getChildCount:tree] == 0 ) {
-            [nodes addObject:eof];
-            return tree;
-        }
-        return tree;
-    }
-    // do we have any objects queued up?
-    if ( nodes && [nodes size] > 0 ) {
-        return [nodes remove];
-    }
-    // no nodes left?
-    if ( tree == nil ) {
-        return eof;
-    }
-    if ( [adaptor getChildCount:tree] > 0 ) {
-        tree = [adaptor getChild:tree At:0];
-        [nodes addObject:tree]; // real node is next after down
-        return self.down;
-    }
-    // if no children, look for next sibling of ancestor
-    id<ANTLRBaseTree> parent = [adaptor getParent:tree];
-    while (parent != nil && ([adaptor getChildIndex:tree] + 1) >= [adaptor getChildCount:parent]) {
-        [nodes addObject:up];
-        tree = parent;
-        parent = [adaptor getParent:tree];
-    }
-    if ( parent == nil ) {
-        tree = nil;
-        [nodes addObject:self.eof];
-        return [nodes remove];
-    }
-    // must have found a node with an unvisited sibling
-    // move to it and return it
-    NSInteger nextSiblingIndex = [adaptor getChildIndex:tree] + 1;
-    tree = [adaptor getChild:parent At:nextSiblingIndex];
-    [nodes addObject:tree];
-    return [nodes remove];
-}
-
--(NSArray *) allObjects
-{
-    AMutableArray *array = [AMutableArray arrayWithCapacity:10];
-    while ( [self hasNext] ) {
-        [array addObject:[self nextObject]];
-    }
-    return array;
-}
-
-- (void)remove
-{
-    @throw [ANTLRRuntimeException newException:@"ANTLRUnsupportedOperationException"];
-}
-
-@synthesize firstTime;
-@synthesize adaptor;
-@synthesize root;
-@synthesize tree;
-@synthesize nodes;
-
-@synthesize up;
-@synthesize down;
-@synthesize eof;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRTreeNodeStream.h b/runtime/ObjC/Framework/ANTLRTreeNodeStream.h
deleted file mode 100644
index 8d10aaa..0000000
--- a/runtime/ObjC/Framework/ANTLRTreeNodeStream.h
+++ /dev/null
@@ -1,52 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRIntStream.h"
-#import "ANTLRCharStream.h"
-#import "ANTLRTokenStream.h"
-#import "ANTLRCommonTree.h"
-#import "ANTLRCommonTreeAdaptor.h"
-
-@protocol ANTLRTreeNodeStream < ANTLRIntStream > 
-
-- (id) initWithTree:(ANTLRCommonTree *)theTree;
-
-- (id) getTree:(NSInteger) idx;
-- (id) LT:(NSInteger)k;
-- (id) getTreeSource;
-- (id<ANTLRTokenStream>) getTokenStream; 
-- (id<ANTLRTreeAdaptor>) getTreeAdaptor;
-- (void) setUniqueNavigationNodes:(BOOL)flag;
-- (void) reset;
-
-- (NSString *) toStringFromNode:(id)startNode ToNode:(id)stopNode;
-
-- (void) replaceChildren:(id)parent From:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id) t;
-    
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRTreeParser.h b/runtime/ObjC/Framework/ANTLRTreeParser.h
deleted file mode 100644
index 9d2d5c6..0000000
--- a/runtime/ObjC/Framework/ANTLRTreeParser.h
+++ /dev/null
@@ -1,87 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRBaseRecognizer.h"
-#import "ANTLRTreeNodeStream.h"
-#import "ANTLRCommonTreeAdaptor.h"
-#import "ANTLRMismatchedTreeNodeException.h"
-
-@interface ANTLRTreeParser : ANTLRBaseRecognizer {
-	id<ANTLRTreeNodeStream> input;
-}
-
-@property (retain, getter=input, setter=setInput:) id<ANTLRTreeNodeStream> input;
-
-+ (id) newANTLRTreeParser:(id<ANTLRTreeNodeStream>)anInput;
-+ (id) newANTLRTreeParser:(id<ANTLRTreeNodeStream>)anInput State:(ANTLRRecognizerSharedState *)state;
-
-- (id) initWithStream:(id<ANTLRTreeNodeStream>)theInput;
-- (id) initWithStream:(id<ANTLRTreeNodeStream>)theInput
-                State:(ANTLRRecognizerSharedState *)state;
-
-
-- (id<ANTLRTreeNodeStream>)input;
-- (void) setInput:(id<ANTLRTreeNodeStream>)anInput;
-
-- (void) setTreeNodeStream:(id<ANTLRTreeNodeStream>) anInput;
-- (id<ANTLRTreeNodeStream>) getTreeNodeStream;
-
-- (NSString *)getSourceName;
-
-- (id) getCurrentInputSymbol:(id<ANTLRIntStream>) anInput;
-
-- (id) getMissingSymbol:(id<ANTLRIntStream>)input
-              Exception:(ANTLRRecognitionException *) e
-          ExpectedToken:(NSInteger) expectedTokenType
-                 BitSet:(ANTLRBitSet *)follow;
-
-/** Match '.' in tree parser has special meaning.  Skip node or
- *  entire tree if node has children.  If children, scan until
- *  corresponding UP node.
- */
-- (void) matchAny:(id<ANTLRIntStream>)ignore;
-
-/** We have DOWN/UP nodes in the stream that have no line info; override.
- *  plus we want to alter the exception type.  Don't try to recover
- *  from tree parser errors inline...
- */
-- (id) recoverFromMismatchedToken:(id<ANTLRIntStream>)anInput
-                             Type:(NSInteger)ttype
-                           Follow:(ANTLRBitSet *)follow;
-
-/** Prefix error message with the grammar name because message is
- *  always intended for the programmer because the parser built
- *  the input tree not the user.
- */
-- (NSString *)getErrorHeader:(ANTLRRecognitionException *)e;
-
-- (NSString *)getErrorMessage:(ANTLRRecognitionException *)e TokenNames:(AMutableArray *) tokenNames;
-
-- (void) traceIn:(NSString *)ruleName Index:(NSInteger)ruleIndex;
-- (void) traceOut:(NSString *)ruleName Index:(NSInteger)ruleIndex;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRTreeParser.m b/runtime/ObjC/Framework/ANTLRTreeParser.m
deleted file mode 100644
index 599ec7c..0000000
--- a/runtime/ObjC/Framework/ANTLRTreeParser.m
+++ /dev/null
@@ -1,192 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import "ANTLRTreeParser.h"
-
-@implementation ANTLRTreeParser
-
-@synthesize input;
-
-+ (id) newANTLRTreeParser:(id<ANTLRTreeNodeStream>)anInput
-{
-    return [[ANTLRTreeParser alloc] initWithStream:anInput];
-}
-
-+ (id) newANTLRTreeParser:(id<ANTLRTreeNodeStream>)anInput State:(ANTLRRecognizerSharedState *)theState
-{
-    return [[ANTLRTreeParser alloc] initWithStream:anInput State:theState];
-}
-
-- (id) initWithStream:(id<ANTLRTreeNodeStream>)theInput
-{
-	if ((self = [super init]) != nil) {
-		[self setInput:theInput];
-	}
-	return self;
-}
-
-- (id) initWithStream:(id<ANTLRTreeNodeStream>)theInput State:(ANTLRRecognizerSharedState *)theState
-{
-	if ((self = [super init]) != nil) {
-		[self setInput:theInput];
-        state = theState;
-	}
-	return self;
-}
-
-- (void) dealloc
-{
-#ifdef DEBUG_DEALLOC
-    NSLog( @"called dealloc in ANTLRTreeParser" );
-#endif
-	if ( input ) [input release];
-	[super dealloc];
-}
-
-- (void) reset
-{
-    [super reset]; // reset all recognizer state variables
-    if ( input != nil ) {
-        [input seek:0]; // rewind the input
-    }
-}
-
-- (void) mismatch:(id<ANTLRIntStream>)aStream tokenType:(ANTLRTokenType)aTType follow:(ANTLRBitSet *)aBitset
-{
-	ANTLRMismatchedTreeNodeException *mte = [ANTLRMismatchedTreeNodeException newException:aTType Stream:aStream];
-    [mte setNode:[((id<ANTLRTreeNodeStream>)aStream) LT:1]];
-	[self recoverFromMismatchedToken:aStream Type:aTType Follow:aBitset];
-}
-
-- (void) setTreeNodeStream:(id<ANTLRTreeNodeStream>) anInput
-{
-    input = anInput;
-}
-
-- (id<ANTLRTreeNodeStream>) getTreeNodeStream
-{
-    return input;
-}
-
-- (NSString *)getSourceName
-{
-    return [input getSourceName];
-}
-
-- (id) getCurrentInputSymbol:(id<ANTLRIntStream>) anInput
-{
-    return [(id<ANTLRTreeNodeStream>)anInput LT:1];
-}
-
-- (id) getMissingSymbol:(id<ANTLRIntStream>)anInput
-              Exception:(ANTLRRecognitionException *)e
-          ExpectedToken:(NSInteger)expectedTokenType
-                 BitSet:(ANTLRBitSet *)follow
-{
-    NSString *tokenText =[NSString stringWithFormat:@"<missing %@ %d>", [self getTokenNames], expectedTokenType];
-    //id<ANTLRTreeAdaptor> anAdaptor = (id<ANTLRTreeAdaptor>)[((id<ANTLRTreeNodeStream>)e.input) getTreeAdaptor];
-    //return [anAdaptor createToken:expectedTokenType Text:tokenText];
-    return [ANTLRCommonToken newToken:expectedTokenType Text:tokenText];
-}
-
-/** Match '.' in tree parser has special meaning.  Skip node or
- *  entire tree if node has children.  If children, scan until
- *  corresponding UP node.
- */
-- (void) matchAny:(id<ANTLRIntStream>)ignore
-{ // ignore stream, copy of input
-    state.errorRecovery = NO;
-    state.failed = NO;
-    id look = [input LT:1];
-    if ( [((ANTLRCommonTreeAdaptor *)[input getTreeAdaptor]) getChildCount:look] == 0) {
-        [input consume]; // not subtree, consume 1 node and return
-        return;
-    }
-    // current node is a subtree, skip to corresponding UP.
-    // must count nesting level to get right UP
-    int level=0;
-    int tokenType = [((id<ANTLRTreeAdaptor>)[input getTreeAdaptor]) getType:look];
-    while ( tokenType != ANTLRTokenTypeEOF && !( tokenType == ANTLRTokenTypeUP && level == 0) ) {
-        [input consume];
-        look = [input LT:1];
-        tokenType = [((id<ANTLRTreeAdaptor>)[input getTreeAdaptor]) getType:look];
-        if ( tokenType == ANTLRTokenTypeDOWN ) {
-            level++;
-        }
-        else if ( tokenType == ANTLRTokenTypeUP ) {
-            level--;
-        }
-    }
-    [input consume]; // consume UP
-}
-
-/** We have DOWN/UP nodes in the stream that have no line info; override.
- *  plus we want to alter the exception type.  Don't try to recover
- *  from tree parser errors inline...
- */
-- (id) recoverFromMismatchedToken:(id<ANTLRIntStream>)anInput Type:(NSInteger)ttype Follow:(ANTLRBitSet *)follow
-{
-    @throw [ANTLRMismatchedTreeNodeException newException:ttype Stream:anInput];
-}
-
-/** Prefix error message with the grammar name because message is
- *  always intended for the programmer because the parser built
- *  the input tree not the user.
- */
-- (NSString *)getErrorHeader:(ANTLRRecognitionException *)e
-{
-     return [NSString stringWithFormat:@"%@: node after line %@:%@",
-            [self getGrammarFileName], e.line, e.charPositionInLine];
-}
-
-/** Tree parsers parse nodes they usually have a token object as
- *  payload. Set the exception token and do the default behavior.
- */
-- (NSString *)getErrorMessage:(ANTLRRecognitionException *)e  TokenNames:(AMutableArray *) theTokNams
-{
-    if ( [self isKindOfClass:[ANTLRTreeParser class]] ) {
-        ANTLRCommonTreeAdaptor *adaptor = (ANTLRCommonTreeAdaptor *)[((id<ANTLRTreeNodeStream>)e.input) getTreeAdaptor];
-        e.token = [adaptor getToken:((id<ANTLRBaseTree>)e.node)];
-        if ( e.token == nil ) { // could be an UP/DOWN node
-            e.token = [ANTLRCommonToken newToken:[adaptor getType:e.node]
-                                                        Text:[adaptor getText:e.node]];
-        }
-    }
-    return [super getErrorMessage:e TokenNames:theTokNams];
-}
-
-- (void) traceIn:(NSString *)ruleName Index:(NSInteger)ruleIndex
-{
-    [super traceIn:ruleName Index:ruleIndex Object:[input LT:1]];
-}
-
-- (void) traceOut:(NSString *)ruleName Index:(NSInteger)ruleIndex
-{
-    [super traceOut:ruleName Index:ruleIndex  Object:[input LT:1]];
-}
-
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRTreePatternLexer.h b/runtime/ObjC/Framework/ANTLRTreePatternLexer.h
deleted file mode 100644
index 430bc83..0000000
--- a/runtime/ObjC/Framework/ANTLRTreePatternLexer.h
+++ /dev/null
@@ -1,89 +0,0 @@
-//
-//  ANTLRTreePatternLexer.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/18/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-
-typedef enum {
-	ANTLRLexerTokenTypeEOF = -1,
-	ANTLRLexerTokenTypeInvalid,
-	ANTLRLexerTokenTypeBEGIN,
-	ANTLRLexerTokenTypeEND,
-	ANTLRLexerTokenTypeID,
-	ANTLRLexerTokenTypeARG,
-	ANTLRLexerTokenTypePERCENT,
-	ANTLRLexerTokenTypeCOLON,
-	ANTLRLexerTokenTypeDOT,
-} ANTLRLexerTokenType;
-
-
-@interface ANTLRTreePatternLexer : NSObject {
-
-/** The tree pattern to lex like "(A B C)" */
-NSString *pattern;
-    
-/** Index into input string */
-NSInteger p;
-    
-/** Current char */
-NSInteger c;
-    
-/** How long is the pattern in char? */
-NSInteger n;
-    
-/** Set when token type is ID or ARG (name mimics Java's StreamTokenizer) */
-NSMutableData *sval;
-__strong char *data;
-    
-BOOL error;
-
-}
-
-@property (retain) NSString *pattern;
-@property (assign) NSInteger p;
-@property (assign) NSInteger c;
-@property (assign) NSInteger n;
-@property (retain, getter=getSval, setter=setSval:) NSMutableData *sval;
-@property (assign) char *data;
-@property (assign) BOOL error;
-
-+ (ANTLRTreePatternLexer *)newANTLRTreePatternLexer:(NSString *)aPattern;
-- (id) init;
-- (id) initWithPattern:(NSString *)aPattern;
-
-- (void) dealloc;
-- (NSInteger) nextToken;
-- (void) consume;
-- (NSString *)toString;
-
-- (NSMutableData *)getSval;
-- (void) setSval:(NSMutableData *)aSval;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRTreePatternLexer.m b/runtime/ObjC/Framework/ANTLRTreePatternLexer.m
deleted file mode 100644
index cdf969f..0000000
--- a/runtime/ObjC/Framework/ANTLRTreePatternLexer.m
+++ /dev/null
@@ -1,191 +0,0 @@
-//
-//  ANTLRTreePatternLexer.m
-//  ANTLR
-//
-//  Created by Alan Condit on 6/18/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import "ANTLRTreePatternLexer.h"
-
-@implementation ANTLRTreePatternLexer
-
-@synthesize pattern;
-@synthesize p;
-@synthesize c;
-@synthesize n;
-@synthesize sval;
-@synthesize data;
-@synthesize error;
-
-+ (ANTLRTreePatternLexer *)newANTLRTreePatternLexer:(NSString *)aPattern
-{
-    return [[ANTLRTreePatternLexer alloc] initWithPattern:aPattern];
-}
-
-- (id) init
-{
-    if ((self = [super init]) != nil ) {
-        p = -1;
-        n = 0;
-        error = NO;
-        sval = [[NSMutableData dataWithLength:1000] retain];
-        data = [sval mutableBytes];
-        pattern = @"";
-        n = [pattern length];
-        if ( pattern ) [pattern retain];
-        [self consume];
-    }
-    return self;
-}
-
-- (id) initWithPattern:(NSString *)aPattern
-{
-    if ((self = [super init]) != nil ) {
-        p = -1;
-        n = 0;
-        error = NO;
-        sval = [[NSMutableData dataWithLength:1000] retain];
-        data = [sval mutableBytes];
-        pattern = [aPattern retain];
-        n = [pattern length];
-        [self consume];
-    }
-    return self;
-}
-
-- (void) dealloc
-{
-#ifdef DEBUG_DEALLOC
-    NSLog( @"called dealloc in ANTLRTreePatternLexer" );
-#endif
-	if ( pattern ) [pattern release];
-	if ( sval ) [sval release];
-	[super dealloc];
-}
-
-- (NSInteger) nextToken
-{
-    n = 0; // reset, but reuse buffer
-    while ( c != ANTLRLexerTokenTypeEOF ) {
-        if ( c==' ' || c=='\n' || c=='\r' || c=='\t' ) {
-            [self consume];
-            continue;
-        }
-        if ( (c>='a' && c<='z') || (c>='A' && c<='Z') || c=='_' ) {
-            data[n++] = (char)c;
-            [self consume];
-            while ( (c>='a' && c<='z') || (c>='A' && c<='Z') ||
-                   (c>='0' && c<='9') || c=='_' )
-            {
-                data[n++] = (char)c;
-                [self consume];
-            }
-            return ANTLRLexerTokenTypeID;
-        }
-        if ( c == '(' ) {
-            [self consume];
-            return ANTLRLexerTokenTypeBEGIN;
-        }
-        if ( c==')' ) {
-            [self consume];
-            return ANTLRLexerTokenTypeEND;
-        }
-        if ( c=='%' ) {
-            [self consume];
-            return ANTLRLexerTokenTypePERCENT;
-        }
-        if ( c==':' ) {
-            [self consume];
-            return ANTLRLexerTokenTypeCOLON;
-        }
-        if ( c=='.' ) {
-            [self consume];
-            return ANTLRLexerTokenTypeDOT;
-        }
-        if ( c=='[' ) { // grab [x] as a string, returning x
-            [self consume];
-            while ( c!=']' ) {
-                if ( c=='\\' ) {
-                    [self consume];
-                    if ( c!=']' ) {
-                        data[n++] = (char)'\\';
-                    }
-                    data[n++] = (char)c;
-                }
-                else {
-                    data[n++] = (char)c;
-                }
-                [self consume];
-            }
-            [self consume];
-            return ANTLRLexerTokenTypeARG;
-        }
-        [self consume];
-        error = true;
-        return ANTLRLexerTokenTypeEOF;
-    }
-    return ANTLRLexerTokenTypeEOF;
-}
-
-- (void) consume
-{
-    p++;
-    if ( p >= n ) {
-        c = ANTLRLexerTokenTypeEOF;
-    }
-    else {
-        c = [pattern characterAtIndex:p];
-    }
-}
-
-- (NSString *)toString
-{
-    char buf[100];
-
-    NSInteger idx = 0;
-    for( NSInteger i = p; i < n; i++ ){
-        buf[idx++] = data[i];
-    }
-    buf[idx] = '\0';
-    return [NSString stringWithFormat:@"%s", buf];
-}
-
-- (NSMutableData *)getSval
-{
-    return sval;
-}
-
-- (void)setSval:(NSMutableData *)aSval
-{
-    if ( sval != aSval ) {
-        if ( sval ) [sval release];
-        [aSval retain];
-    }
-    sval = aSval;
-}
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRTreePatternParser.h b/runtime/ObjC/Framework/ANTLRTreePatternParser.h
deleted file mode 100644
index 2051b5e..0000000
--- a/runtime/ObjC/Framework/ANTLRTreePatternParser.h
+++ /dev/null
@@ -1,63 +0,0 @@
-//
-//  ANTLRTreePatternParser.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/18/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTreePatternLexer.h"
-#import "ANTLRTreeWizard.h"
-#import "ANTLRTreeAdaptor.h"
-
-@interface ANTLRTreePatternParser : NSObject {
-
-ANTLRTreePatternLexer *tokenizer;
-NSInteger ttype;
-ANTLRTreeWizard *wizard;
-id<ANTLRTreeAdaptor> adaptor;
-    
-}
-
-+ (ANTLRTreePatternParser *)newANTLRTreePatternParser:(ANTLRTreePatternLexer *)aTokenizer
-                                               Wizard:(ANTLRTreeWizard *)aWizard
-                                              Adaptor:(id<ANTLRTreeAdaptor>)anAdaptor;
-- (id) init;
-- (id) initWithTokenizer:(ANTLRTreePatternLexer *)tokenizer
-                  Wizard:(ANTLRTreeWizard *)aWizard
-                 Adaptor:(id<ANTLRTreeAdaptor>)anAdaptor;
-
-- (void) dealloc;
-- (id<ANTLRBaseTree>) pattern;
-- (id<ANTLRBaseTree>) parseTree;
-- (id<ANTLRBaseTree>) parseNode;
-
-@property (retain) ANTLRTreePatternLexer *tokenizer;
-@property NSInteger ttype;
-@property (retain) ANTLRTreeWizard *wizard;
-@property (retain) id<ANTLRTreeAdaptor> adaptor;
-@end
diff --git a/runtime/ObjC/Framework/ANTLRTreePatternParser.m b/runtime/ObjC/Framework/ANTLRTreePatternParser.m
deleted file mode 100644
index c95d995..0000000
--- a/runtime/ObjC/Framework/ANTLRTreePatternParser.m
+++ /dev/null
@@ -1,197 +0,0 @@
-//
-//  ANTLRTreePatternParser.m
-//  ANTLR
-//
-//  Created by Alan Condit on 6/18/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import "ANTLRTreePatternParser.h"
-#import "ANTLRTreePatternLexer.h"
-
-@implementation ANTLRTreePatternParser
-
-+ (ANTLRTreePatternParser *)newANTLRTreePatternParser:(ANTLRTreePatternLexer *)aTokenizer
-                                               Wizard:(ANTLRTreeWizard *)aWizard
-                                              Adaptor:(id<ANTLRTreeAdaptor>)anAdaptor
-{
-    return [[ANTLRTreePatternParser alloc] initWithTokenizer:aTokenizer Wizard:aWizard Adaptor:anAdaptor];
-}
-
-- (id) init
-{
-    if ((self = [super init]) != nil) {
-        //tokenizer = aTokenizer;
-        //wizard = aWizard;
-        //adaptor = anAdaptor;
-        //ttype = [tokenizer nextToken]; // kickstart
-    }
-    return self;
-}
-
-- (id) initWithTokenizer:(ANTLRTreePatternLexer *)aTokenizer
-                  Wizard:(ANTLRTreeWizard *)aWizard
-                 Adaptor:(id<ANTLRTreeAdaptor>)anAdaptor
-{
-    if ((self = [super init]) != nil) {
-        adaptor = anAdaptor;
-        if ( adaptor ) [adaptor retain];
-        tokenizer = aTokenizer;
-        if ( tokenizer ) [tokenizer retain];
-        wizard = aWizard;
-        if ( wizard ) [wizard retain];
-        ttype = [aTokenizer nextToken]; // kickstart
-    }
-    return self;
-}
-
-- (void) dealloc
-{
-#ifdef DEBUG_DEALLOC
-    NSLog( @"called dealloc in ANTLRTreePatternParser" );
-#endif
-	if ( adaptor ) [adaptor release];
-	if ( tokenizer ) [tokenizer release];
-	if ( wizard ) [wizard release];
-	[super dealloc];
-}
-
-- (id<ANTLRBaseTree>)pattern
-{
-    if ( ttype==ANTLRLexerTokenTypeBEGIN ) {
-        return [self parseTree];
-    }
-    else if ( ttype==ANTLRLexerTokenTypeID ) {
-        id<ANTLRBaseTree> node = [self parseNode];
-        if ( ttype==ANTLRLexerTokenTypeEOF ) {
-            return node;
-        }
-        return nil; // extra junk on end
-    }
-    return nil;
-}
-
-- (id<ANTLRBaseTree>) parseTree
-{
-    if ( ttype != ANTLRLexerTokenTypeBEGIN ) {
-        @throw [ANTLRRuntimeException newException:@"no BEGIN"];
-    }
-    ttype = [tokenizer nextToken];
-    id<ANTLRBaseTree> root = [self parseNode];
-    if ( root==nil ) {
-        return nil;
-    }
-    while ( ttype==ANTLRLexerTokenTypeBEGIN  ||
-           ttype==ANTLRLexerTokenTypeID      ||
-           ttype==ANTLRLexerTokenTypePERCENT ||
-           ttype==ANTLRLexerTokenTypeDOT )
-    {
-        if ( ttype==ANTLRLexerTokenTypeBEGIN ) {
-            id<ANTLRBaseTree> subtree = [self parseTree];
-            [adaptor addChild:subtree toTree:root];
-        }
-        else {
-            id<ANTLRBaseTree> child = [self parseNode];
-            if ( child == nil ) {
-                return nil;
-            }
-            [adaptor addChild:child toTree:root];
-        }
-    }
-    if ( ttype != ANTLRLexerTokenTypeEND ) {
-        @throw [ANTLRRuntimeException newException:@"no END"];
-    }
-    ttype = [tokenizer nextToken];
-    return root;
-}
-
-- (id<ANTLRBaseTree>) parseNode
-{
-    // "%label:" prefix
-    NSString *label = nil;
-    ANTLRTreePattern *node;
-    if ( ttype == ANTLRLexerTokenTypePERCENT ) {
-        ttype = [tokenizer nextToken];
-        if ( ttype != ANTLRLexerTokenTypeID ) {
-            return nil;
-        }
-        label = [tokenizer toString];
-        ttype = [tokenizer nextToken];
-        if ( ttype != ANTLRLexerTokenTypeCOLON ) {
-            return nil;
-        }
-        ttype = [tokenizer nextToken]; // move to ID following colon
-    }
-    
-    // Wildcard?
-    if ( ttype == ANTLRLexerTokenTypeDOT ) {
-        ttype = [tokenizer nextToken];
-        id<ANTLRToken> wildcardPayload = [ANTLRCommonToken newToken:0 Text:@"."];
-        node = [ANTLRWildcardTreePattern newANTLRWildcardTreePattern:wildcardPayload];
-        if ( label != nil ) {
-            node.label = label;
-        }
-        return node;
-    }
-    
-    // "ID" or "ID[arg]"
-    if ( ttype != ANTLRLexerTokenTypeID ) {
-        return nil;
-    }
-    NSString *tokenName = [tokenizer toString];
-    ttype = [tokenizer nextToken];
-    if ( [tokenName isEqualToString:@"nil"] ) {
-        return [adaptor emptyNode];
-    }
-    NSString *text = tokenName;
-    // check for arg
-    NSString *arg = nil;
-    if ( ttype == ANTLRLexerTokenTypeARG ) {
-        arg = [tokenizer toString];
-        text = arg;
-        ttype = [tokenizer nextToken];
-    }
-    
-    // create node
-    int treeNodeType = [wizard getTokenType:tokenName];
-    if ( treeNodeType==ANTLRTokenTypeInvalid ) {
-        return nil;
-    }
-    node = [adaptor createTree:treeNodeType Text:text];
-    if ( label!=nil && [node class] == [ANTLRTreePattern class] ) {
-        ((ANTLRTreePattern *)node).label = label;
-    }
-    if ( arg!=nil && [node class] == [ANTLRTreePattern class] ) {
-        ((ANTLRTreePattern *)node).hasTextArg = YES;
-    }
-    return node;
-}
-
-@synthesize tokenizer;
-@synthesize ttype;
-@synthesize wizard;
-@synthesize adaptor;
-@end
diff --git a/runtime/ObjC/Framework/ANTLRTreeRewriter.h b/runtime/ObjC/Framework/ANTLRTreeRewriter.h
deleted file mode 100644
index 5ab5700..0000000
--- a/runtime/ObjC/Framework/ANTLRTreeRewriter.h
+++ /dev/null
@@ -1,78 +0,0 @@
-//
-//  ANTLRTreeRewriter.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/17/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTreeParser.h"
-
-@interface ANTLRfptr : NSObject {
-    id  actor;
-    SEL ruleSEL;
-}
-
-+ (ANTLRfptr *)newANTLRfptrWithRule:(SEL)aRuleAction withObject:(id)anObject;
--initWithRule:(SEL)ruleAction withObject:(id)anObject;
-
-- (id)rule;
-
-@property (retain) id  actor;
-@property SEL ruleSEL;
-@end
-
-@interface ANTLRTreeRewriter : ANTLRTreeParser {
-    BOOL showTransformations;
-    id<ANTLRTokenStream> originalTokenStream;
-    id<ANTLRTreeAdaptor> originalAdaptor;
-    ANTLRfptr *rule;
-    ANTLRfptr *topdown_fptr;
-    ANTLRfptr *bottomup_ftpr;
-}
-
-+ (ANTLRTreeRewriter *) newANTLRTreeRewriter:(id<ANTLRTreeNodeStream>)anInput;
-+ (ANTLRTreeRewriter *) newANTLRTreeRewriter:(id<ANTLRTreeNodeStream>)anInput State:(ANTLRRecognizerSharedState *)aState;
-- (id)initWithStream:(id<ANTLRTreeNodeStream>)anInput;
-- (id)initWithStream:(id<ANTLRTreeNodeStream>)anInput State:(ANTLRRecognizerSharedState *)aState;
-- (id) applyOnce:(ANTLRCommonTree *)t Rule:(ANTLRfptr *)whichRule;
-- (id) applyRepeatedly:(ANTLRCommonTree *)t Rule:(ANTLRfptr *)whichRule;
-- (id) downup:(ANTLRCommonTree *)t;
-- (id) pre:(ANTLRCommonTree *)t;
-- (id) post:(ANTLRCommonTree *)t;
-- (id) downup:(ANTLRCommonTree *)t XForm:(BOOL)aShowTransformations;
-- (void)reportTransformation:(ANTLRCommonTree *)oldTree Tree:(ANTLRCommonTree *)newTree;
-- (id) topdown_fptr;
-- (id) bottomup_ftpr;
-- (id) topdown;
-- (id) bottomup;
-
-@property BOOL showTransformations;
-@property (retain) id<ANTLRTokenStream> originalTokenStream;
-@property (retain) id<ANTLRTreeAdaptor> originalAdaptor;
-@property (retain) ANTLRfptr *rule;
-@end
diff --git a/runtime/ObjC/Framework/ANTLRTreeRewriter.m b/runtime/ObjC/Framework/ANTLRTreeRewriter.m
deleted file mode 100644
index 8495436..0000000
--- a/runtime/ObjC/Framework/ANTLRTreeRewriter.m
+++ /dev/null
@@ -1,250 +0,0 @@
-//
-//  ANTLRTreeRewriter.m
-//  ANTLR
-//
-//  Created by Alan Condit on 6/17/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import "ANTLRTreeRewriter.h"
-#import "ANTLRCommonTreeNodeStream.h"
-#import "ANTLRTreeRuleReturnScope.h"
-#import "ANTLRCommonTreeAdaptor.h"
-#import "ANTLRTreeVisitor.h"
-
-@implementation ANTLRfptr
-
-+ (ANTLRfptr *)newANTLRfptrWithRule:(SEL)aRuleAction withObject:(id)anObject
-{
-    return [[ANTLRfptr alloc] initWithRule:aRuleAction withObject:(id)anObject];
-}
-
--initWithRule:(SEL)aRuleAction withObject:(id)anObject
-{
-    if ((self = [super init]) != nil) {
-        actor = anObject;
-        ruleSEL = aRuleAction;
-    }
-    return self;
-}
-
-- (id)rule
-{
-	if ( [actor respondsToSelector:ruleSEL] )
-		return [actor performSelector:ruleSEL];
-    else
-        @throw [ANTLRRuntimeException newException:@"Unknown Rewrite exception"];
-    return nil;
-}
-
-@synthesize actor;
-@synthesize ruleSEL;
-@end
-
-@implementation ANTLRTreeRewriter
-
-+ (ANTLRTreeRewriter *) newANTLRTreeRewriter:(id<ANTLRTreeNodeStream>)anInput
-{
-    return [[ANTLRTreeRewriter alloc] initWithStream:anInput State:[ANTLRRecognizerSharedState newANTLRRecognizerSharedState]];
-}
-
-+ (ANTLRTreeRewriter *) newANTLRTreeRewriter:(id<ANTLRTreeNodeStream>)anInput State:(ANTLRRecognizerSharedState *)aState
-{
-    return [[ANTLRTreeRewriter alloc] initWithStream:anInput State:aState];
-}
-
-- (id)initWithStream:(id<ANTLRTreeNodeStream>)anInput
-{
-    SEL aRuleSel;
-
-    if ((self = [super initWithStream:anInput]) != nil) {
-        showTransformations = NO;
-        state = [[ANTLRRecognizerSharedState newANTLRRecognizerSharedState] retain];
-        originalAdaptor = [input getTreeAdaptor];
-        if ( originalAdaptor ) [originalAdaptor retain];
-        originalTokenStream = [input getTokenStream];        
-        if ( originalTokenStream ) [originalTokenStream retain];
-        aRuleSel = @selector(topdown);
-        topdown_fptr = [ANTLRfptr newANTLRfptrWithRule:(SEL)aRuleSel withObject:self];
-        aRuleSel = @selector(bottomup);
-        bottomup_ftpr = [ANTLRfptr newANTLRfptrWithRule:(SEL)aRuleSel withObject:self];        
-    }
-    return self;
-}
-
-- (id)initWithStream:(id<ANTLRTreeNodeStream>)anInput State:(ANTLRRecognizerSharedState *)aState
-{
-    SEL aRuleSel;
-    
-    if ((self = [super initWithStream:anInput]) != nil) {
-        showTransformations = NO;
-        state = aState;
-        if ( state ) [state retain];
-        originalAdaptor = [input getTreeAdaptor];
-        if ( originalAdaptor ) [originalAdaptor retain];
-        originalTokenStream = [input getTokenStream];        
-        if ( originalTokenStream ) [originalTokenStream retain];
-        aRuleSel = @selector(topdown);
-        topdown_fptr = [ANTLRfptr newANTLRfptrWithRule:(SEL)aRuleSel withObject:self];
-        aRuleSel = @selector(bottomup);
-        bottomup_ftpr = [ANTLRfptr newANTLRfptrWithRule:(SEL)aRuleSel withObject:self];        
-    }
-    return self;
-}
-
-- (void) dealloc
-{
-#ifdef DEBUG_DEALLOC
-    NSLog( @"called dealloc in ANTLRTreeRewriter" );
-#endif
-	if ( state ) [state release];
-	if ( originalAdaptor ) [originalAdaptor release];
-	if ( originalTokenStream ) [originalTokenStream release];
-	[super dealloc];
-}
-
-- (id) applyOnce:(ANTLRCommonTree *)t Rule:(ANTLRfptr *)whichRule
-{
-    if ( t == nil ) return nil;
-    @try {
-        // share TreeParser object but not parsing-related state
-        state = [ANTLRRecognizerSharedState newANTLRRecognizerSharedState];
-        input = [ANTLRCommonTreeNodeStream newANTLRCommonTreeNodeStream:(ANTLRCommonTreeAdaptor *)originalAdaptor Tree:t];
-        [(ANTLRCommonTreeNodeStream *)input setTokenStream:originalTokenStream];
-        [self setBacktrackingLevel:1];
-        ANTLRTreeRuleReturnScope *r = [(ANTLRfptr *)whichRule rule];
-        [self setBacktrackingLevel:0];
-        if ( [self getFailed] )
-            return t;
-        if ( showTransformations &&
-            r != nil && !(t == r.start) && r.start != nil ) {
-            [self reportTransformation:t Tree:r.start];
-        }
-        if ( r != nil && r.start != nil )
-            return r.start;
-        else
-            return t;
-    }
-    @catch (ANTLRRecognitionException *e) {
-        return t;
-    }
-    return t;
-}
-
-- (id) applyRepeatedly:(ANTLRCommonTree *)t Rule:(ANTLRfptr *)whichRule
-{
-    BOOL treeChanged = true;
-    while ( treeChanged ) {
-        ANTLRTreeRewriter *u = [self applyOnce:t Rule:whichRule];
-        treeChanged = !(t == u);
-        t = u;
-    }
-    return t;
-}
-
-- (id) downup:(ANTLRCommonTree *)t
-{
-    return [self downup:t XForm:NO];
-}
-
-- (id) pre:(ANTLRCommonTree *)t
-{
-    return [self applyOnce:t Rule:topdown_fptr];
-}
-
-- (id)post:(ANTLRCommonTree *)t
-{
-    return [self applyRepeatedly:t Rule:bottomup_ftpr];
-}
-
-#ifdef DONTUSENOMO
-public Object downup(Object t, boolean showTransformations) {
-    this.showTransformations = showTransformations;
-    TreeVisitor v = new TreeVisitor(new CommonTreeAdaptor());
-    TreeVisitorAction actions = new TreeVisitorAction() {
-        public Object pre(Object t)  { return applyOnce(t, topdown_fptr); }
-        public Object post(Object t) { return applyRepeatedly(t, bottomup_ftpr); }
-    };
-    t = v.visit(t, actions);
-    return t;
-}
-#endif
-
-- (id) downup:(ANTLRCommonTree *)t XForm:(BOOL)aShowTransformations
-{
-    showTransformations = aShowTransformations;
-    ANTLRTreeVisitor *v = [ANTLRTreeVisitor newANTLRTreeVisitor:[[originalAdaptor class] newTreeAdaptor]];
-    ANTLRTreeVisitorAction *actions = [ANTLRTreeVisitorAction newANTLRTreeVisitorAction];
-    {
-        //public Object pre(Object t)  { return applyOnce(t, topdown_fptr); }
-        [self pre:t];
-        //public Object post(Object t) { return applyRepeatedly(t, bottomup_ftpr); }
-        [self post:t];
-    };
-    t = [v visit:t Action:actions];
-    return t;
-}
-
-/** Override this if you need transformation tracing to go somewhere
- *  other than stdout or if you're not using Tree-derived trees.
- */
-- (void)reportTransformation:(ANTLRCommonTree *)oldTree Tree:(ANTLRCommonTree *)newTree
-{
-    //System.out.println(((Tree)oldTree).toStringTree()+" -> "+ ((Tree)newTree).toStringTree());
-}
-
-- (id)topdown_fptr
-{
-    return [self topdown];
-}
-
-- (id)bottomup_ftpr
-{
-    return [self bottomup];
-}
-
-// methods the downup strategy uses to do the up and down rules.
-// to override, just define tree grammar rule topdown and turn on
-// filter=true.
-- (id) topdown
-// @throws RecognitionException
-{
-    @throw [ANTLRRecognitionException newException:@"TopDown exception"];
-    return nil;
-}
-
-- (id) bottomup
-//@throws RecognitionException
-{
-    @throw [ANTLRRecognitionException newException:@"BottomUp exception"];
-    return nil;
-}
-
-@synthesize showTransformations;
-@synthesize originalTokenStream;
-@synthesize originalAdaptor;
-@synthesize rule;
-@end
diff --git a/runtime/ObjC/Framework/ANTLRTreeRuleReturnScope.h b/runtime/ObjC/Framework/ANTLRTreeRuleReturnScope.h
deleted file mode 100644
index 9937052..0000000
--- a/runtime/ObjC/Framework/ANTLRTreeRuleReturnScope.h
+++ /dev/null
@@ -1,52 +0,0 @@
-//
-//  ANTLRTreeRuleReturnScope.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/17/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRuleReturnScope.h"
-#import "ANTLRCommonTree.h"
-
-@interface ANTLRTreeRuleReturnScope : ANTLRRuleReturnScope {
-    ANTLRCommonTree *start;
-}
-
-@property (retain, getter=getStart, setter=setStart:) ANTLRCommonTree *start;
-
-/** First node or root node of tree matched for this rule. */
-
-+ (id) newReturnScope;
-- (id) init;
-- (void) dealloc;
-- (ANTLRCommonTree *)getStart;
-- (void)setStart:(ANTLRCommonTree *)aStart;
-
-- (id) copyWithZone:(NSZone *)theZone;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRTreeRuleReturnScope.m b/runtime/ObjC/Framework/ANTLRTreeRuleReturnScope.m
deleted file mode 100644
index 0043314..0000000
--- a/runtime/ObjC/Framework/ANTLRTreeRuleReturnScope.m
+++ /dev/null
@@ -1,81 +0,0 @@
-//
-//  ANTLRTreeRuleReturnScope.m
-//  ANTLR
-//
-//  Created by Alan Condit on 6/17/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import "ANTLRTreeRuleReturnScope.h"
-
-
-@implementation ANTLRTreeRuleReturnScope
-@synthesize start;
-
-+ (id) newReturnScope
-{
-    return [[ANTLRTreeRuleReturnScope alloc] init];
-}
-
-- (id) init
-{
-    self = [super init];
-    return self;
-}
-
-- (void) dealloc
-{
-#ifdef DEBUG_DEALLOC
-    NSLog( @"called dealloc in ANTLRTreeRuleReturnScope" );
-#endif
-	if ( start ) [start release];
-	[super dealloc];
-}
-
-- (ANTLRCommonTree *)getStart
-{
-    return start;
-}	
-
-- (void)setStart:(ANTLRCommonTree *)aStart
-{
-    if ( start != aStart ) {
-        if ( start ) [start release];
-        [aStart retain];
-    }
-    start = aStart;
-}	
-
-// create a copy, including the text if available
-// the input stream is *not* copied!
-- (id) copyWithZone:(NSZone *)theZone
-{
-    ANTLRTreeRuleReturnScope *copy = [super copyWithZone:theZone];
-    copy.start = start;
-    return copy;
-}
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRTreeVisitor.h b/runtime/ObjC/Framework/ANTLRTreeVisitor.h
deleted file mode 100644
index e8af0d0..0000000
--- a/runtime/ObjC/Framework/ANTLRTreeVisitor.h
+++ /dev/null
@@ -1,47 +0,0 @@
-//
-//  ANTLRTreeVisitor.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/18/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTreeAdaptor.h"
-#import "ANTLRTreeVisitorAction.h"
-
-@interface ANTLRTreeVisitor : NSObject {
-   id<ANTLRTreeAdaptor> adaptor;
-}
-+ (ANTLRTreeVisitor *)newANTLRTreeVisitor:(id<ANTLRTreeAdaptor>) anAdaptor;
-+ (ANTLRTreeVisitor *)newANTLRTreeVisitor;
-- (id)init;
-- (id)initWithAdaptor:(id<ANTLRTreeAdaptor>)anAdaptor;
-- (void) dealloc;
-- (ANTLRTreeVisitor *)visit:(id<ANTLRBaseTree>)t Action:(ANTLRTreeVisitorAction *)action;
-
-@property (retain) id<ANTLRTreeAdaptor> adaptor;
-@end
diff --git a/runtime/ObjC/Framework/ANTLRTreeVisitor.m b/runtime/ObjC/Framework/ANTLRTreeVisitor.m
deleted file mode 100644
index f500d6d..0000000
--- a/runtime/ObjC/Framework/ANTLRTreeVisitor.m
+++ /dev/null
@@ -1,103 +0,0 @@
-//
-//  ANTLRTreeVisitor.m
-//  ANTLR
-//
-//  Created by Alan Condit on 6/18/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import "ANTLRTreeVisitor.h"
-#import "ANTLRCommonTreeAdaptor.h"
-
-@implementation ANTLRTreeVisitor
-
-+ (ANTLRTreeVisitor *)newANTLRTreeVisitor:(id<ANTLRTreeAdaptor>)anAdaptor
-{
-    return [[ANTLRTreeVisitor alloc] initWithAdaptor:anAdaptor];
-}
-
-+ (ANTLRTreeVisitor *)newANTLRTreeVisitor
-{
-    return [[ANTLRTreeVisitor alloc] init];
-}
-
-
-- (id)init
-{
-    if ((self = [super init]) != nil) {
-        adaptor = [[ANTLRCommonTreeAdaptor newTreeAdaptor] retain];
-    }
-    return self;
-}
-
-- (id)initWithAdaptor:(id<ANTLRTreeAdaptor>)anAdaptor
-{
-    if ((self = [super init]) != nil) {
-        adaptor = [anAdaptor retain];
-    }
-    return self;
-}
-
-- (void) dealloc
-{
-#ifdef DEBUG_DEALLOC
-    NSLog( @"called dealloc in ANTLRTreeVisitor" );
-#endif
-    if ( adaptor ) [adaptor release];
-    [super dealloc];
-}
-
-/** Visit every node in tree t and trigger an action for each node
- *  before/after having visited all of its children.
- *  Execute both actions even if t has no children.
- *  If a child visit yields a new child, it can update its
- *  parent's child list or just return the new child.  The
- *  child update code works even if the child visit alters its parent
- *  and returns the new tree.
- *
- *  Return result of applying post action to this node.
- */
-- (ANTLRTreeVisitor *)visit:(ANTLRCommonTree *)t Action:(ANTLRTreeVisitorAction *)action
-{
-    // System.out.println("visit "+((Tree)t).toStringTree());
-    BOOL isNil = [adaptor isNil:t];
-    if ( action != nil && !isNil ) {
-        t = [action pre:(ANTLRTreeVisitorAction *)t]; // if rewritten, walk children of new t
-    }
-    for (int i=0; i < [adaptor getChildCount:t]; i++) {
-        ANTLRCommonTree *child = [adaptor getChild:t At:i];
-        ANTLRCommonTree *visitResult = [self visit:child Action:action];
-        ANTLRCommonTree *childAfterVisit = [adaptor getChild:t At:i];
-        if ( visitResult !=  childAfterVisit ) { // result & child differ?
-            [adaptor setChild:t At:i Child:visitResult];
-        }
-    }
-    if ( action != nil && !isNil ) t = [action post:(ANTLRTreeVisitorAction *)t];
-    return t;
-}
-
-@synthesize adaptor;
-@end
diff --git a/runtime/ObjC/Framework/ANTLRTreeVisitorAction.h b/runtime/ObjC/Framework/ANTLRTreeVisitorAction.h
deleted file mode 100644
index c9c0856..0000000
--- a/runtime/ObjC/Framework/ANTLRTreeVisitorAction.h
+++ /dev/null
@@ -1,56 +0,0 @@
-//
-//  ANTLRTreeVisitorAction.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/18/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-
-
-@interface ANTLRTreeVisitorAction : NSObject
-{
-
-}
-
-+ (ANTLRTreeVisitorAction *)newANTLRTreeVisitorAction;
-- (id) init;
-
-/** Execute an action before visiting children of t.  Return t or
- *  a rewritten t.  It is up to the visitor to decide what to do
- *  with the return value.  Children of returned value will be
- *  visited if using TreeVisitor.visit().
- */
-- (ANTLRTreeVisitorAction *)pre:(ANTLRTreeVisitorAction *) t;
-
-/** Execute an action after visiting children of t.  Return t or
- *  a rewritten t.  It is up to the visitor to decide what to do
- *  with the return value.
- */
-- (ANTLRTreeVisitorAction *)post:(ANTLRTreeVisitorAction *) t;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRTreeVisitorAction.m b/runtime/ObjC/Framework/ANTLRTreeVisitorAction.m
deleted file mode 100644
index 09a5920..0000000
--- a/runtime/ObjC/Framework/ANTLRTreeVisitorAction.m
+++ /dev/null
@@ -1,69 +0,0 @@
-//
-//  ANTLRTreeVisitorAction.m
-//  ANTLR
-//
-//  Created by Alan Condit on 6/18/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import "ANTLRTreeVisitorAction.h"
-
-
-@implementation ANTLRTreeVisitorAction
-
-+ (ANTLRTreeVisitorAction *)newANTLRTreeVisitorAction
-{
-    return [[ANTLRTreeVisitorAction alloc] init];
-}
-
-- (id) init
-{
-    if ((self = [super init]) != nil ) {
-    }
-    return self;
-}
-
-/** Execute an action before visiting children of t.  Return t or
- *  a rewritten t.  It is up to the visitor to decide what to do
- *  with the return value.  Children of returned value will be
- *  visited if using TreeVisitor.visit().
- */
-- (ANTLRTreeVisitorAction *)pre:(ANTLRTreeVisitorAction *) t
-{
-    return nil;
-}
-
-/** Execute an action after visiting children of t.  Return t or
- *  a rewritten t.  It is up to the visitor to decide what to do
- *  with the return value.
- */
-- (ANTLRTreeVisitorAction *)post:(ANTLRTreeVisitorAction *) t
-{
-    return nil;
-}
-
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRTreeWizard.h b/runtime/ObjC/Framework/ANTLRTreeWizard.h
deleted file mode 100644
index 7a57c1e..0000000
--- a/runtime/ObjC/Framework/ANTLRTreeWizard.h
+++ /dev/null
@@ -1,136 +0,0 @@
-//
-//  ANTLRTreeWizard.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/18/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRCommonTreeAdaptor.h"
-#import "ANTLRCommonTree.h"
-#import "ANTLRMapElement.h"
-#import "ANTLRMap.h"
-#import "AMutableArray.h"
-
-@class ANTLRVisitor;
-
-@protocol ANTLRContextVisitor <NSObject>
-// TODO: should this be called visit or something else?
-- (void) visit:(ANTLRCommonTree *)t Parent:(ANTLRCommonTree *)parent ChildIndex:(NSInteger)childIndex Map:(ANTLRMap *)labels;
-
-@end
-
-@interface ANTLRVisitor : NSObject <ANTLRContextVisitor> {
-    NSInteger action;
-    id actor;
-    id object1;
-    id object2;
-}
-+ (ANTLRVisitor *)newANTLRVisitor:(NSInteger)anAction Actor:(id)anActor Object:(id)anObject1 Object:(id)anObject2;
-- (id) initWithAction:(NSInteger)anAction Actor:(id)anActor Object:(id)anObject1 Object:(id)anObject2;
-
-- (void) visit:(ANTLRCommonTree *)t;
-- (void) visit:(ANTLRCommonTree *)t Parent:(ANTLRCommonTree *)parent ChildIndex:(NSInteger)childIndex Map:(ANTLRMap *)labels;
-
-@property NSInteger action;
-@property (retain) id actor;
-@property (retain) id object1;
-@property (retain) id object2;
-@end
-
-/** When using %label:TOKENNAME in a tree for parse(), we must
- *  track the label.
- */
-@interface ANTLRTreePattern : ANTLRCommonTree {
-    NSString *label;
-    BOOL      hasTextArg;
-}
-@property (retain, getter=getLabel, setter=setLabel:) NSString *label;
-@property (assign, getter=getHasTextArg, setter=setHasTextArg:) BOOL hasTextArg;
-
-+ (ANTLRCommonTree *)newANTLRTreePattern:(id<ANTLRToken>)payload;
-
-- (id) initWithToken:(id<ANTLRToken>)payload;
-- (NSString *)toString;
-@end
-
-@interface ANTLRWildcardTreePattern : ANTLRTreePattern {
-}
-
-+ (ANTLRWildcardTreePattern *)newANTLRWildcardTreePattern:(id<ANTLRToken>)payload;
-- (id) initWithToken:(id<ANTLRToken>)payload;
-@end
-
-/** This adaptor creates TreePattern objects for use during scan() */
-@interface ANTLRTreePatternTreeAdaptor : ANTLRCommonTreeAdaptor {
-}
-+ (ANTLRTreePatternTreeAdaptor *)newTreeAdaptor;
-- (id) init;
-- (ANTLRCommonTree *)createTreePattern:(id<ANTLRToken>)payload;
-
-@end
-
-@interface ANTLRTreeWizard : NSObject {
-	id<ANTLRTreeAdaptor> adaptor;
-	ANTLRMap *tokenNameToTypeMap;
-}
-+ (ANTLRTreeWizard *) newANTLRTreeWizard:(id<ANTLRTreeAdaptor>)anAdaptor;
-+ (ANTLRTreeWizard *)newANTLRTreeWizard:(id<ANTLRTreeAdaptor>)adaptor Map:(ANTLRMap *)aTokenNameToTypeMap;
-+ (ANTLRTreeWizard *)newANTLRTreeWizard:(id<ANTLRTreeAdaptor>)adaptor TokenNames:(NSArray *)theTokNams;
-+ (ANTLRTreeWizard *)newANTLRTreeWizardWithTokenNames:(NSArray *)theTokNams;
-- (id) init;
-- (id) initWithAdaptor:(id<ANTLRTreeAdaptor>)adaptor;
-- (id) initWithAdaptor:(id<ANTLRTreeAdaptor>)adaptor Map:(ANTLRMap *)tokenNameToTypeMap;
-- (id) initWithTokenNames:(NSArray *)theTokNams;
-- (id) initWithTokenNames:(id<ANTLRTreeAdaptor>)anAdaptor TokenNames:(NSArray *)theTokNams;
-- (void) dealloc;
-- (ANTLRMap *)computeTokenTypes:(NSArray *)theTokNams;
-- (NSInteger)getTokenType:(NSString *)tokenName;
-- (ANTLRMap *)index:(ANTLRCommonTree *)t;
-- (void) _index:(ANTLRCommonTree *)t Map:(ANTLRMap *)m;
-- (AMutableArray *)find:(ANTLRCommonTree *) t Pattern:(NSString *)pattern;
-- (ANTLRTreeWizard *)findFirst:(ANTLRCommonTree *) t Type:(NSInteger)ttype;
-- (ANTLRTreeWizard *)findFirst:(ANTLRCommonTree *) t Pattern:(NSString *)pattern;
-- (void) visit:(ANTLRCommonTree *)t Type:(NSInteger)ttype Visitor:(ANTLRVisitor *)visitor;
-- (void) _visit:(ANTLRCommonTree *)t
-         Parent:(ANTLRCommonTree *)parent
-     ChildIndex:(NSInteger)childIndex
-           Type:(NSInteger)ttype
-        Visitor:(ANTLRVisitor *)visitor;
-- (void)visit:(ANTLRCommonTree *)t Pattern:(NSString *)pattern Visitor:(ANTLRVisitor *)visitor;
-- (BOOL)parse:(ANTLRCommonTree *)t Pattern:(NSString *)pattern Map:(ANTLRMap *)labels;
-- (BOOL) parse:(ANTLRCommonTree *) t Pattern:(NSString *)pattern;
-- (BOOL) _parse:(ANTLRCommonTree *)t1 Pattern:(ANTLRCommonTree *)tpattern Map:(ANTLRMap *)labels;
-- (ANTLRCommonTree *) createTree:(NSString *)pattern;
-- (BOOL)equals:(id)t1 O2:(id)t2 Adaptor:(id<ANTLRTreeAdaptor>)anAdaptor;
-- (BOOL)equals:(id)t1 O2:(id)t2;
-- (BOOL) _equals:(id)t1 O2:(id)t2 Adaptor:(id<ANTLRTreeAdaptor>)anAdaptor;
-
-@property (retain) id<ANTLRTreeAdaptor> adaptor;
-@property (retain) ANTLRMap *tokenNameToTypeMap;
-@end
-
diff --git a/runtime/ObjC/Framework/ANTLRTreeWizard.m b/runtime/ObjC/Framework/ANTLRTreeWizard.m
deleted file mode 100644
index 78131a8..0000000
--- a/runtime/ObjC/Framework/ANTLRTreeWizard.m
+++ /dev/null
@@ -1,735 +0,0 @@
-//
-//  ANTLRTreeWizard.m
-//  ANTLR
-//
-//  Created by Alan Condit on 6/18/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import "ANTLRTreeWizard.h"
-#import "ANTLRTreePatternLexer.h"
-#import "ANTLRTreePatternParser.h"
-#import "ANTLRIntArray.h"
-
-@implementation ANTLRVisitor
-
-+ (ANTLRVisitor *)newANTLRVisitor:(NSInteger)anAction Actor:(id)anActor Object:(id)anObject1 Object:(id)anObject2
-{
-    return [[ANTLRVisitor alloc] initWithAction:anAction Actor:(id)anActor Object:(id)anObject1 Object:(id)anObject2];
-}
-
-- (id) initWithAction:(NSInteger)anAction Actor:(id)anActor Object:(id)anObject1 Object:(id)anObject2
-{
-    if ((self = [super init]) != nil) {
-        action = anAction;
-        actor = anActor;
-        if ( actor ) [actor retain];
-        object1 = anObject1;
-        if ( object1 ) [object1 retain];
-        object2 = anObject2;
-        if ( object2 ) [object2 retain];
-    }
-    return self;
-}
-
-- (void) dealloc
-{
-#ifdef DEBUG_DEALLOC
-    NSLog( @"called dealloc in ANTLRVisitor" );
-#endif
-    if ( actor ) [actor release];
-    if ( object1 ) [object1 release];
-    if ( object2 ) [object2 release];
-    [super dealloc];
-}
-
-- (void) visit:(ANTLRCommonTree *)t Parent:(ANTLRCommonTree *)parent ChildIndex:(NSInteger)childIndex Map:(ANTLRMap *)labels
-{
-    switch (action) {
-        case 0:
-            [(ANTLRMap *)object2 /* labels */ clear];
-            if ( [(ANTLRTreeWizard *)actor _parse:t Pattern:object1/* tpattern */ Map:object2 /* labels */] ) {
-                [self visit:t Parent:parent ChildIndex:childIndex Map:object2 /* labels */];
-            }
-            break;
-        case 1:
-            if ( [(ANTLRTreeWizard *)actor _parse:t Pattern:object1/* tpattern */ Map:nil] ) {
-                [(AMutableArray *)object2/* subtrees */ addObject:t];
-            }
-            break;
-    }
-    // [self visit:t];
-    return;
-}
-
-- (void) visit:(ANTLRCommonTree *)t
-{
-    [object1 addObject:t];
-    return;
-}
-
-@synthesize action;
-@synthesize actor;
-@synthesize object1;
-@synthesize object2;
-@end
-
-/** When using %label:TOKENNAME in a tree for parse(), we must
- *  track the label.
- */
-@implementation ANTLRTreePattern
-
-@synthesize label;
-@synthesize hasTextArg;
-
-+ (ANTLRCommonTree *)newANTLRTreePattern:(id<ANTLRToken>)payload
-{
-    return (ANTLRCommonTree *)[[ANTLRTreePattern alloc] initWithToken:payload];
-}
-
-- (id) initWithToken:(id<ANTLRToken>)payload
-{
-    self = [super initWithToken:payload];
-    if ( self != nil ) {
-    }
-    return (ANTLRCommonTree *)self;
-}
-
-- (void) dealloc
-{
-#ifdef DEBUG_DEALLOC
-    NSLog( @"called dealloc in ANTLRTreePattern" );
-#endif
-    if ( label ) [label release];
-    [super dealloc];
-}
-
-- (NSString *)toString
-{
-    if ( label != nil ) {
-        return [NSString stringWithFormat:@"\% %@ : %@", label, [super toString]];
-    }
-    else {
-        return [super toString];				
-    }
-}
-
-@end
-
-@implementation ANTLRWildcardTreePattern
-
-+ (ANTLRWildcardTreePattern *)newANTLRWildcardTreePattern:(id<ANTLRToken>)payload
-{
-    return(ANTLRWildcardTreePattern *)[[ANTLRWildcardTreePattern alloc] initWithToken:(id<ANTLRToken>)payload];
-}
-
-- (id) initWithToken:(id<ANTLRToken>)payload
-{
-    self = [super initWithToken:payload];
-    if ( self != nil ) {
-    }
-    return self;
-}
-
-@end
-
-/** This adaptor creates TreePattern objects for use during scan() */
-@implementation ANTLRTreePatternTreeAdaptor
-
-+ (ANTLRTreePatternTreeAdaptor *)newTreeAdaptor
-{
-    return [[ANTLRTreePatternTreeAdaptor alloc] init];
-}
-
-- (id) init
-{
-    self = [super init];
-    if ( self != nil ) {
-    }
-    return self;
-}
-
-- (ANTLRCommonTree *)createTreePattern:(id<ANTLRToken>)payload
-{
-    return (ANTLRCommonTree *)[super create:payload];
-}
-          
-@end
-
-@implementation ANTLRTreeWizard
-
-// TODO: build indexes for the wizard
-
-/** During fillBuffer(), we can make a reverse index from a set
- *  of token types of interest to the list of indexes into the
- *  node stream.  This lets us convert a node pointer to a
- *  stream index semi-efficiently for a list of interesting
- *  nodes such as function definition nodes (you'll want to seek
- *  to their bodies for an interpreter).  Also useful for doing
- *  dynamic searches; i.e., go find me all PLUS nodes.
- protected Map tokenTypeToStreamIndexesMap;
- 
- ** If tokenTypesToReverseIndex set to INDEX_ALL then indexing
- *  occurs for all token types.
- public static final Set INDEX_ALL = new HashSet();
- 
- ** A set of token types user would like to index for faster lookup.
- *  If this is INDEX_ALL, then all token types are tracked.  If nil,
- *  then none are indexed.
- protected Set tokenTypesToReverseIndex = nil;
- */
-
-+ (ANTLRTreeWizard *) newANTLRTreeWizard:(id<ANTLRTreeAdaptor>)anAdaptor
-{
-    return [[ANTLRTreeWizard alloc] initWithAdaptor:anAdaptor];
-}
-
-+ (ANTLRTreeWizard *)newANTLRTreeWizard:(id<ANTLRTreeAdaptor>)anAdaptor Map:(ANTLRMap *)aTokenNameToTypeMap
-{
-    return [[ANTLRTreeWizard alloc] initWithAdaptor:anAdaptor Map:aTokenNameToTypeMap];
-}
-
-+ (ANTLRTreeWizard *)newANTLRTreeWizard:(id<ANTLRTreeAdaptor>)anAdaptor TokenNames:(NSArray *)theTokNams
-{
-    return [[ANTLRTreeWizard alloc] initWithTokenNames:anAdaptor TokenNames:theTokNams];
-}
-
-+ (ANTLRTreeWizard *)newANTLRTreeWizardWithTokenNames:(NSArray *)theTokNams
-{
-    return [[ANTLRTreeWizard alloc] initWithTokenNames:theTokNams];
-}
-
-- (id) init
-{
-    if ((self = [super init]) != nil) {
-    }
-    return self;
-}
-
-- (id) initWithAdaptor:(id<ANTLRTreeAdaptor>)anAdaptor
-{
-    if ((self = [super init]) != nil) {
-        adaptor = anAdaptor;
-        if ( adaptor ) [adaptor retain];
-    }
-    return self;
-}
-            
-- (id) initWithAdaptor:(id<ANTLRTreeAdaptor>)anAdaptor Map:(ANTLRMap *)aTokenNameToTypeMap
-{
-    if ((self = [super init]) != nil) {
-        adaptor = anAdaptor;
-        if ( adaptor ) [adaptor retain];
-        tokenNameToTypeMap = aTokenNameToTypeMap;
-   }
-    return self;
-}
-
-- (id) initWithTokenNames:(NSArray *)theTokNams
-{
-    if ((self = [super init]) != nil) {
-#pragma warning Fix initWithTokenNames.
-        // adaptor = anAdaptor;
-        //tokenNameToTypeMap = aTokenNameToTypeMap;
-        tokenNameToTypeMap = [[self computeTokenTypes:theTokNams] retain];
-    }
-    return self;
-}
-             
-- (id) initWithTokenNames:(id<ANTLRTreeAdaptor>)anAdaptor TokenNames:(NSArray *)theTokNams
-{
-    if ((self = [super init]) != nil) {
-        adaptor = anAdaptor;
-        if ( adaptor ) [adaptor retain];
-        // tokenNameToTypeMap = aTokenNameToTypeMap;
-        tokenNameToTypeMap = [[self computeTokenTypes:theTokNams] retain];
-    }
-    return self;
-}
-            
-- (void) dealloc
-{
-#ifdef DEBUG_DEALLOC
-    NSLog( @"called dealloc in ANTLRTreePatternTreeAdaptor" );
-#endif
-    if ( adaptor ) [adaptor release];
-    if ( tokenNameToTypeMap ) [tokenNameToTypeMap release];
-    [super dealloc];
-}
-
-/** Compute a Map<String, Integer> that is an inverted index of
- *  tokenNames (which maps int token types to names).
- */
-- (ANTLRMap *)computeTokenTypes:(NSArray *)theTokNams
-{
-    ANTLRMap *m = [ANTLRMap newANTLRMap];
-    if ( theTokNams == nil ) {
-        return m;
-    }
-    for (int ttype = ANTLRTokenTypeMIN; ttype < [theTokNams count]; ttype++) {
-        NSString *name = (NSString *) [theTokNams objectAtIndex:ttype];
-        [m putName:name TType:ttype];
-    }
-    return m;
-}
-
-/** Using the map of token names to token types, return the type. */
-- (NSInteger)getTokenType:(NSString *)tokenName
-{
-    if ( tokenNameToTypeMap == nil ) {
-        return ANTLRTokenTypeInvalid;
-    }
-    NSInteger aTType = (NSInteger)[tokenNameToTypeMap getTType:tokenName];
-    if ( aTType != -1 ) {
-        return aTType;
-    }
-    return ANTLRTokenTypeInvalid;
-}
-
-/** Walk the entire tree and make a node name to nodes mapping.
- *  For now, use recursion but later nonrecursive version may be
- *  more efficient.  Returns Map<Integer, List> where the List is
- *  of your AST node type.  The Integer is the token type of the node.
- *
- *  TODO: save this index so that find and visit are faster
- */
-- (ANTLRMap *)index:(ANTLRCommonTree *)t
-{
-    ANTLRMap *m = [ANTLRMap newANTLRMap];
-    [self _index:t Map:m];
-    return m;
-}
-
-/** Do the work for index */
-- (void) _index:(ANTLRCommonTree *)t Map:(ANTLRMap *)m
-{
-    if ( t==nil ) {
-        return;
-    }
-#pragma warning Fix _index use of ANTLRMap.
-    NSInteger ttype = [adaptor getType:t];
-    ANTLRMap *elements = (ANTLRMap *)[m getName:ttype];
-    if ( elements == nil ) {
-        elements = [ANTLRMap newANTLRMapWithLen:100];
-        [m putNode:ttype Node:elements];
-    }
-    [elements addObject:t];
-    int n = [adaptor getChildCount:t];
-    for (int i=0; i<n; i++) {
-        ANTLRCommonTree * child = [adaptor getChild:t At:i];
-        [self _index:child Map:m];
-    }
-}
-
-/** Return a List of tree nodes with token type ttype */
-- (AMutableArray *)find:(ANTLRCommonTree *)t Type:(NSInteger)ttype
-{
-#ifdef DONTUSENOMO
-    final List nodes = new ArrayList();
-    visit(t, ttype, new TreeWizard.Visitor() {
-        public void visit(Object t) {
-            [nodes addObject t];
-        }
-    } );
-#endif
-    AMutableArray *nodes = [AMutableArray arrayWithCapacity:100];
-    ANTLRVisitor *contextVisitor = [ANTLRVisitor newANTLRVisitor:3 Actor:self Object:(id)nodes Object:nil];
-    [self visit:t Type:ttype Visitor:contextVisitor];
-    return nodes;
-}
-
-/** Return a List of subtrees matching pattern. */
-- (AMutableArray *)find:(ANTLRCommonTree *)t Pattern:(NSString *)pattern
-{
-    AMutableArray *subtrees = [AMutableArray arrayWithCapacity:100];
-    // Create a TreePattern from the pattern
-    ANTLRTreePatternLexer *tokenizer = [ANTLRTreePatternLexer newANTLRTreePatternLexer:pattern];
-    ANTLRTreePatternParser *parser = [ANTLRTreePatternParser newANTLRTreePatternParser:tokenizer
-                                                                                     Wizard:self
-                                                                                    Adaptor:[ANTLRTreePatternTreeAdaptor newTreeAdaptor]];
-    ANTLRCommonTree *tpattern = (ANTLRCommonTree *)[parser pattern];
-    // don't allow invalid patterns
-    if ( tpattern == nil ||
-        [tpattern isNil] ||
-        [tpattern class] == [ANTLRWildcardTreePattern class] )
-    {
-        return nil;
-    }
-    int rootTokenType = [tpattern type];
-#ifdef DONTUSENOMO
-    visit(t, rootTokenType, new TreeWizard.ContextVisitor() {
-        public void visit(Object t, Object parent, int childIndex, Map labels) {
-            if ( _parse(t, tpattern, null) ) {
-                subtrees.add(t);
-            }
-        }
-    } );
-#endif
-    ANTLRVisitor *contextVisitor = [ANTLRVisitor newANTLRVisitor:1 Actor:self Object:tpattern Object:subtrees];
-    [self visit:t Type:rootTokenType Visitor:contextVisitor];
-    return subtrees;
-}
-
-- (ANTLRTreeWizard *)findFirst:(ANTLRCommonTree *) t Type:(NSInteger)ttype
-{
-    return nil;
-}
-
-- (ANTLRTreeWizard *)findFirst:(ANTLRCommonTree *) t Pattern:(NSString *)pattern
-{
-    return nil;
-}
-
-/** Visit every ttype node in t, invoking the visitor.  This is a quicker
- *  version of the general visit(t, pattern) method.  The labels arg
- *  of the visitor action method is never set (it's nil) since using
- *  a token type rather than a pattern doesn't let us set a label.
- */
-- (void) visit:(ANTLRCommonTree *)t Type:(NSInteger)ttype Visitor:(ANTLRVisitor *)visitor
-{
-    [self _visit:t Parent:nil ChildIndex:0 Type:ttype Visitor:visitor];
-}
-
-/** Do the recursive work for visit */
-- (void) _visit:(ANTLRCommonTree *)t
-         Parent:(ANTLRCommonTree *)parent
-     ChildIndex:(NSInteger)childIndex
-           Type:(NSInteger)ttype
-        Visitor:(ANTLRVisitor *)visitor
-{
-    if ( t == nil ) {
-        return;
-    }
-    if ( [adaptor getType:t] == ttype ) {
-        [visitor visit:t Parent:parent ChildIndex:childIndex Map:nil];
-    }
-    int n = [adaptor getChildCount:t];
-    for (int i=0; i<n; i++) {
-        ANTLRCommonTree * child = [adaptor getChild:t At:i];
-        [self _visit:child Parent:t ChildIndex:i Type:ttype Visitor:visitor];
-    }
-}
-
-/** For all subtrees that match the pattern, execute the visit action.
- *  The implementation uses the root node of the pattern in combination
- *  with visit(t, ttype, visitor) so nil-rooted patterns are not allowed.
- *  Patterns with wildcard roots are also not allowed.
- */
-- (void)visit:(ANTLRCommonTree *)t Pattern:(NSString *)pattern Visitor:(ANTLRVisitor *)visitor
-{
-    // Create a TreePattern from the pattern
-    ANTLRTreePatternLexer *tokenizer = [ANTLRTreePatternLexer newANTLRTreePatternLexer:pattern];
-    ANTLRTreePatternParser *parser =
-    [ANTLRTreePatternParser newANTLRTreePatternParser:tokenizer Wizard:self Adaptor:[ANTLRTreePatternTreeAdaptor newTreeAdaptor]];
-    ANTLRCommonTree *tpattern = [parser pattern];
-    // don't allow invalid patterns
-    if ( tpattern == nil ||
-        [tpattern isNil] ||
-        [tpattern class] == [ANTLRWildcardTreePattern class] )
-    {
-        return;
-    }
-    ANTLRMapElement *labels = [ANTLRMap newANTLRMap]; // reused for each _parse
-    int rootTokenType = [tpattern type];
-#pragma warning This is another one of those screwy nested constructs that I have to figure out
-#ifdef DONTUSENOMO
-    visit(t, rootTokenType, new TreeWizard.ContextVisitor() {
-        public void visit(Object t, Object parent, int childIndex, Map unusedlabels) {
-            // the unusedlabels arg is null as visit on token type doesn't set.
-            labels.clear();
-            if ( _parse(t, tpattern, labels) ) {
-                visitor.visit(t, parent, childIndex, labels);
-            }
-        }
-    });
-#endif
-    ANTLRVisitor *contextVisitor = [ANTLRVisitor newANTLRVisitor:0 Actor:self Object:tpattern Object:labels];
-    [self visit:t Type:rootTokenType Visitor:contextVisitor];
-}
-
-/** Given a pattern like (ASSIGN %lhs:ID %rhs:.) with optional labels
- *  on the various nodes and '.' (dot) as the node/subtree wildcard,
- *  return true if the pattern matches and fill the labels Map with
- *  the labels pointing at the appropriate nodes.  Return false if
- *  the pattern is malformed or the tree does not match.
- *
- *  If a node specifies a text arg in pattern, then that must match
- *  for that node in t.
- *
- *  TODO: what's a better way to indicate bad pattern? Exceptions are a hassle 
- */
-- (BOOL)parse:(ANTLRCommonTree *)t Pattern:(NSString *)pattern Map:(ANTLRMap *)labels
-{
-#ifdef DONTUSENOMO
-    TreePatternLexer tokenizer = new TreePatternLexer(pattern);
-    TreePatternParser parser =
-    new TreePatternParser(tokenizer, this, new TreePatternTreeAdaptor());
-    TreePattern tpattern = (TreePattern)parser.pattern();
-    /*
-     System.out.println("t="+((Tree)t).toStringTree());
-     System.out.println("scant="+tpattern.toStringTree());
-     */
-    boolean matched = _parse(t, tpattern, labels);
-    return matched;
-#endif
-    ANTLRTreePatternLexer *tokenizer = [ANTLRTreePatternLexer newANTLRTreePatternLexer:pattern];
-    ANTLRTreePatternParser *parser = [ANTLRTreePatternParser newANTLRTreePatternParser:tokenizer
-                                                                                Wizard:self
-                                                                               Adaptor:[ANTLRTreePatternTreeAdaptor newTreeAdaptor]];
-    ANTLRCommonTree *tpattern = [parser pattern];
-    /*
-     System.out.println("t="+((Tree)t).toStringTree());
-     System.out.println("scant="+tpattern.toStringTree());
-     */
-    //BOOL matched = [self _parse:t Pattern:tpattern Map:labels];
-    //return matched;
-    return [self _parse:t Pattern:tpattern Map:labels];
-}
-
-- (BOOL) parse:(ANTLRCommonTree *)t Pattern:(NSString *)pattern
-{
-    return [self parse:t Pattern:pattern Map:nil];
-}
-
-/** Do the work for parse. Check to see if the t2 pattern fits the
- *  structure and token types in t1.  Check text if the pattern has
- *  text arguments on nodes.  Fill labels map with pointers to nodes
- *  in tree matched against nodes in pattern with labels.
- */
-- (BOOL) _parse:(ANTLRCommonTree *)t1 Pattern:(ANTLRCommonTree *)aTPattern Map:(ANTLRMap *)labels
-{
-    ANTLRTreePattern *tpattern;
-    // make sure both are non-nil
-    if ( t1 == nil || aTPattern == nil ) {
-        return NO;
-    }
-    if ( [aTPattern isKindOfClass:[ANTLRWildcardTreePattern class]] ) {
-        tpattern = (ANTLRTreePattern *)aTPattern;
-    }
-    // check roots (wildcard matches anything)
-    if ( [tpattern class] != [ANTLRWildcardTreePattern class] ) {
-        if ( [adaptor getType:t1] != [tpattern type] )
-            return NO;
-        // if pattern has text, check node text
-        if ( tpattern.hasTextArg && ![[adaptor getText:t1] isEqualToString:[tpattern text]] ) {
-            return NO;
-        }
-    }
-    if ( tpattern.label != nil && labels!=nil ) {
-        // map label in pattern to node in t1
-        [labels putName:tpattern.label Node:t1];
-    }
-    // check children
-    int n1 = [adaptor getChildCount:t1];
-    int n2 = [tpattern getChildCount];
-    if ( n1 != n2 ) {
-        return NO;
-    }
-    for (int i=0; i<n1; i++) {
-        ANTLRCommonTree * child1 = [adaptor getChild:t1 At:i];
-        ANTLRCommonTree *child2 = (ANTLRCommonTree *)[tpattern getChild:i];
-        if ( ![self _parse:child1 Pattern:child2 Map:labels] ) {
-            return NO;
-        }
-    }
-    return YES;
-}
-
-/** Create a tree or node from the indicated tree pattern that closely
- *  follows ANTLR tree grammar tree element syntax:
- *
- * 		(root child1 ... child2).
- *
- *  You can also just pass in a node: ID
- * 
- *  Any node can have a text argument: ID[foo]
- *  (notice there are no quotes around foo--it's clear it's a string).
- *
- *  nil is a special name meaning "give me a nil node".  Useful for
- *  making lists: (nil A B C) is a list of A B C.
- */
-- (ANTLRCommonTree *) createTree:(NSString *)pattern
-{
-    ANTLRTreePatternLexer *tokenizer = [ANTLRTreePatternLexer newANTLRTreePatternLexer:pattern];
-    ANTLRTreePatternParser *parser = [ANTLRTreePatternParser newANTLRTreePatternParser:tokenizer Wizard:self Adaptor:adaptor];
-    ANTLRCommonTree * t = [parser pattern];
-    return t;
-}
-
-/** Compare t1 and t2; return true if token types/text, structure match exactly.
- *  The trees are examined in their entirety so that (A B) does not match
- *  (A B C) nor (A (B C)). 
- // TODO: allow them to pass in a comparator
- *  TODO: have a version that is nonstatic so it can use instance adaptor
- *
- *  I cannot rely on the tree node's equals() implementation as I make
- *  no constraints at all on the node types nor interface etc... 
- */
-- (BOOL)equals:(id)t1 O2:(id)t2 Adaptor:(id<ANTLRTreeAdaptor>)anAdaptor
-{
-    return [self _equals:t1 O2:t2 Adaptor:anAdaptor];
-}
-
-/** Compare type, structure, and text of two trees, assuming adaptor in
- *  this instance of a TreeWizard.
- */
-- (BOOL)equals:(id)t1 O2:(id)t2
-{
-    return [self _equals:t1 O2:t2 Adaptor:adaptor];
-}
-
-- (BOOL) _equals:(id)t1 O2:(id)t2 Adaptor:(id<ANTLRTreeAdaptor>)anAdaptor
-{
-    // make sure both are non-nil
-    if ( t1==nil || t2==nil ) {
-        return NO;
-    }
-    // check roots
-    if ( [anAdaptor getType:t1] != [anAdaptor getType:t2] ) {
-        return NO;
-    }
-    if ( ![[anAdaptor getText:t1] isEqualTo:[anAdaptor getText:t2]] ) {
-        return NO;
-    }
-    // check children
-    NSInteger n1 = [anAdaptor getChildCount:t1];
-    NSInteger n2 = [anAdaptor getChildCount:t2];
-    if ( n1 != n2 ) {
-        return NO;
-    }
-    for (int i=0; i<n1; i++) {
-        ANTLRCommonTree * child1 = [anAdaptor getChild:t1 At:i];
-        ANTLRCommonTree * child2 = [anAdaptor getChild:t2 At:i];
-        if ( ![self _equals:child1 O2:child2 Adaptor:anAdaptor] ) {
-            return NO;
-        }
-    }
-    return YES;
-}
-
-// TODO: next stuff taken from CommonTreeNodeStream
-
-/** Given a node, add this to the reverse index tokenTypeToStreamIndexesMap.
- *  You can override this method to alter how indexing occurs.  The
- *  default is to create a
- *
- *    Map<Integer token type,ArrayList<Integer stream index>>
- *
- *  This data structure allows you to find all nodes with type INT in order.
- *
- *  If you really need to find a node of type, say, FUNC quickly then perhaps
- *
- *    Map<Integertoken type, Map<Object tree node, Integer stream index>>
- *
- *  would be better for you.  The interior maps map a tree node to
- *  the index so you don't have to search linearly for a specific node.
- *
- *  If you change this method, you will likely need to change
- *  getNodeIndex(), which extracts information.
-- (void)fillReverseIndex:(ANTLRCommonTree *)node Index:(NSInteger)streamIndex
-{
-    //System.out.println("revIndex "+node+"@"+streamIndex);
-    if ( tokenTypesToReverseIndex == nil ) {
-        return; // no indexing if this is empty (nothing of interest)
-    }
-    if ( tokenTypeToStreamIndexesMap == nil ) {
-        tokenTypeToStreamIndexesMap = [ANTLRMap newANTLRMap]; // first indexing op
-    }
-    int tokenType = [adaptor getType:node];
-    Integer tokenTypeI = new Integer(tokenType);
-    if ( !(tokenTypesToReverseIndex == INDEX_ALL ||
-            [tokenTypesToReverseIndex contains:tokenTypeI]) ) {
-        return; // tokenType not of interest
-    }
-    NSInteger streamIndexI = streamIndex;
-    AMutableArray *indexes = (AMutableArray *)[tokenTypeToStreamIndexesMap objectAtIndex:tokenTypeI];
-    if ( indexes==nil ) {
-        indexes = [AMutableArray arrayWithCapacity:100]; // no list yet for this token type
-        indexes.add(streamIndexI); // not there yet, add
-        [tokenTypeToStreamIndexesMap put:tokenTypeI Idexes:indexes];
-    }
-    else {
-        if ( ![indexes contains:streamIndexI] ) {
-            [indexes add:streamIndexI]; // not there yet, add
-        }
-    }
-}
- 
- ** Track the indicated token type in the reverse index.  Call this
- *  repeatedly for each type or use variant with Set argument to
- *  set all at once.
- * @param tokenType
-public void reverseIndex:(NSInteger)tokenType
-{
-    if ( tokenTypesToReverseIndex == nil ) {
-        tokenTypesToReverseIndex = [ANTLRMap newANTLRMap];
-    }
-    else if ( tokenTypesToReverseIndex == INDEX_ALL ) {
-        return;
-    }
-    tokenTypesToReverseIndex.add(new Integer(tokenType));
-}
- 
-** Track the indicated token types in the reverse index. Set
- *  to INDEX_ALL to track all token types.
-public void reverseIndex(Set tokenTypes) {
-    tokenTypesToReverseIndex = tokenTypes;
-}
- 
- ** Given a node pointer, return its index into the node stream.
- *  This is not its Token stream index.  If there is no reverse map
- *  from node to stream index or the map does not contain entries
- *  for node's token type, a linear search of entire stream is used.
- *
- *  Return -1 if exact node pointer not in stream.
-public int getNodeIndex(Object node) {
-    //System.out.println("get "+node);
-    if ( tokenTypeToStreamIndexesMap==nil ) {
-        return getNodeIndexLinearly(node);
-    }
-    int tokenType = adaptor.getType(node);
-    Integer tokenTypeI = new Integer(tokenType);
-    ArrayList indexes = (ArrayList)tokenTypeToStreamIndexesMap.get(tokenTypeI);
-    if ( indexes==nil ) {
-        //System.out.println("found linearly; stream index = "+getNodeIndexLinearly(node));
-        return getNodeIndexLinearly(node);
-    }
-    for (int i = 0; i < indexes.size(); i++) {
-        Integer streamIndexI = (Integer)indexes.get(i);
-        Object n = get(streamIndexI.intValue());
-        if ( n==node ) {
-            //System.out.println("found in index; stream index = "+streamIndexI);
-            return streamIndexI.intValue(); // found it!
-        }
-    }
-    return -1;
-}
- 
-*/
-
-@synthesize adaptor;
-@synthesize tokenNameToTypeMap;
-@end
diff --git a/runtime/ObjC/Framework/ANTLRUnbufferedCommonTreeNodeStream.h b/runtime/ObjC/Framework/ANTLRUnbufferedCommonTreeNodeStream.h
deleted file mode 100644
index aa1f9c6..0000000
--- a/runtime/ObjC/Framework/ANTLRUnbufferedCommonTreeNodeStream.h
+++ /dev/null
@@ -1,122 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRTreeNodeStream.h"
-#import "ANTLRCommonTokenStream.h"
-#import "ANTLRCommonTree.h"
-#import "ANTLRCommonTreeAdaptor.h"
-
-@interface ANTLRUnbufferedCommonTreeNodeStream : NSObject < ANTLRTreeNodeStream > {
-
-	BOOL shouldUseUniqueNavigationNodes;
-
-	ANTLRCommonTree *root;
-	ANTLRCommonTree *currentNode;
-	ANTLRCommonTree *previousNode;
-
-	id<ANTLRTreeAdaptor> treeAdaptor;
-	
-	id<ANTLRTokenStream> tokenStream;
-	
-	NSMutableArray *nodeStack;
-	NSMutableArray *indexStack;
-	ANTLRPtrBuffer *markers;
-	NSInteger lastMarker;
-	
-	NSInteger currentChildIndex;
-	NSInteger absoluteNodeIndex;
-	
-	NSMutableArray *lookahead;
-	NSUInteger head;
-	NSUInteger tail;
-}
-
-@property (retain, getter=getRoot, setter=setRoot:) ANTLRCommonTree *root;
-@property (retain, getter=getCurrentNode, setter=setCurrentNode:) ANTLRCommonTree *currentNode;
-@property (retain, getter=getPreviousNode, setter=setPreviousNode:) ANTLRCommonTree *previousNode;
-@property (retain, getter=getTreeAdaptor, setter=setTreeAdaptor:) id<ANTLRTreeAdaptor> treeAdaptor;
-@property (retain, getter=getTokenStream, setter=setTokenStream:) id<ANTLRTokenStream> tokenStream;
-@property (retain, getter=getNodeStack, setter=setNodeStack:) NSMutableArray *nodeStack;
-@property (retain, getter=getIndexStack, setter=setIndexStackStack:) NSMutableArray *indexStack;
-@property (retain, getter=getMarkers, setter=setMarkers:) ANTLRPtrBuffer *markers;
-@property (assign, getter=getLastMarker, setter=setLastMarker:) NSInteger lastMarker;
-@property (assign, getter=getCurrentChildIndex, setter=setCurrentChildIndex:) NSInteger currentChildIndex;
-@property (assign, getter=getAbsoluteNodeIndex, setter=setAbsoluteNodeIndex:) NSInteger absoluteNodeIndex;
-@property (retain, getter=getLookahead, setter=setLookahead:) NSMutableArray *lookahead;
-@property (assign, getter=getHead, setter=setHead:) NSUInteger head;
-@property (assign, getter=getTail, setter=setTail:) NSUInteger tail;
-
-- (id) initWithTree:(ANTLRCommonTree *)theTree;
-- (id) initWithTree:(ANTLRCommonTree *)theTree treeAdaptor:(ANTLRCommonTreeAdaptor *)theAdaptor;
-
-- (void) reset;
-
-#pragma mark ANTLRTreeNodeStream conformance
-
-- (id) LT:(NSInteger)k;
-- (id) treeSource;
-- (id<ANTLRTreeAdaptor>) getTreeAdaptor;
-- (void)setTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor;
-- (id<ANTLRTokenStream>) getTokenStream;
-- (void) setTokenStream:(id<ANTLRTokenStream>)aTokenStream;	///< Added by subclass, not in protocol
-- (void) setUsesUniqueNavigationNodes:(BOOL)flag;
-
-- (id) nodeAtIndex:(NSUInteger) idx;
-
-- (NSString *) toString;
-- (NSString *) toStringWithRange:(NSRange) aRange;
-- (NSString *) toStringFromNode:(id)startNode toNode:(id)stopNode;
-
-#pragma mark ANTLRIntStream conformance
-- (void) consume;
-- (NSInteger) LA:(NSUInteger) i;
-- (NSUInteger) mark;
-- (NSUInteger) getIndex;
-- (void) rewind:(NSUInteger) marker;
-- (void) rewind;
-- (void) release:(NSUInteger) marker;
-- (void) seek:(NSUInteger) index;
-- (NSUInteger) size;
-
-#pragma mark Lookahead Handling
-- (void) addLookahead:(id<ANTLRBaseTree>)aNode;
-- (NSUInteger) lookaheadSize;
-- (void) fillBufferWithLookahead:(NSInteger)k;
-- (id) nextObject;
-
-#pragma mark Node visiting
-- (ANTLRCommonTree *) handleRootNode;
-- (ANTLRCommonTree *) visitChild:(NSInteger)childNumber;
-- (void) walkBackToMostRecentNodeWithUnvisitedChildren;
-- (void) addNavigationNodeWithType:(NSInteger)tokenType;
-
-#pragma mark Accessors
-- (ANTLRCommonTree *) root;
-- (void) setRoot: (ANTLRCommonTree *) aRoot;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRUnbufferedCommonTreeNodeStream.m b/runtime/ObjC/Framework/ANTLRUnbufferedCommonTreeNodeStream.m
deleted file mode 100644
index 1ee1e4f..0000000
--- a/runtime/ObjC/Framework/ANTLRUnbufferedCommonTreeNodeStream.m
+++ /dev/null
@@ -1,432 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-
-#import "ANTLRUnbufferedCommonTreeNodeStream.h"
-#import "ANTLRUnbufferedCommonTreeNodeStreamState.h"
-#import "ANTLRBaseTree.h"
-#import "ANTLRToken.h"
-
-#define INITIAL_LOOKAHEAD_BUFFER_SIZE 5
-@implementation ANTLRUnbufferedCommonTreeNodeStream
-
-@synthesize root;
-@synthesize currentNode;
-@synthesize previousNode;
-@synthesize treeAdaptor;
-@synthesize tokenStream;
-@synthesize nodeStack;
-@synthesize indexStack;
-@synthesize markers;
-@synthesize lastMarker;
-@synthesize currentChildIndex;
-@synthesize absoluteNodeIndex;
-@synthesize lookahead;
-@synthesize head;
-@synthesize tail;
-
-- (id) initWithTree:(ANTLRCommonTree *)theTree
-{
-	return [self initWithTree:theTree treeAdaptor:nil];
-}
-
-- (id) initWithTree:(ANTLRCommonTree *)theTree treeAdaptor:(ANTLRCommonTreeAdaptor *)theAdaptor
-{
-	if ((self = [super init]) != nil) {
-		[self setRoot:theTree];
-		if ( theAdaptor == nil ) 
-			[self setTreeAdaptor:[ANTLRCommonTreeAdaptor newTreeAdaptor]];
-		else
-			[self setTreeAdaptor:theAdaptor];
-		nodeStack = [[NSMutableArray arrayWithCapacity:5] retain];
-		indexStack = [[NSMutableArray arrayWithCapacity:5] retain];
-		markers = [[ANTLRPtrBuffer newANTLRPtrBufferWithLen:100] retain];
-        // [markers insertObject:[NSNull null] atIndex:0];	// markers is one based - maybe fix this later
-		lookahead = [NSMutableArray arrayWithCapacity:INITIAL_LOOKAHEAD_BUFFER_SIZE];	// lookahead is filled with [NSNull null] in -reset
-        [lookahead retain];
-		[self reset];
-	}
-	return self;
-}
-
-- (void) dealloc
-{
-	[self setRoot:nil];
-	[self setTreeAdaptor:nil];
-	
-	[nodeStack release];	nodeStack = nil;
-	[indexStack release];	indexStack = nil;
-	[markers release];		markers = nil;
-	[lookahead release];	lookahead = nil;
-	
-	[super dealloc];
-}
-
-- (void) reset
-{
-	currentNode = root;
-	previousNode = nil;
-	currentChildIndex = -1;
-	absoluteNodeIndex = -1;
-	head = tail = 0;
-	[nodeStack removeAllObjects];
-	[indexStack removeAllObjects];
-	[markers removeAllObjects];
-    // [markers insertObject:[NSNull null] atIndex:0];	// markers is one based - maybe fix this later
-	[lookahead removeAllObjects];
-	// TODO: this is not ideal, but works for now. optimize later
-	int i;
-	for (i = 0; i < INITIAL_LOOKAHEAD_BUFFER_SIZE; i++)
-		[lookahead addObject:[NSNull null]];
-}
-
-
-#pragma mark ANTLRTreeNodeStream conformance
-
-- (id) LT:(NSInteger)k
-{
-	if (k == -1)
-		return previousNode;
-	if (k < 0)
-		@throw [NSException exceptionWithName:@"ANTLRTreeException" reason:@"-LT: looking back more than one node unsupported for unbuffered streams" userInfo:nil];
-	if (k == 0)
-		return ANTLRBaseTree.INVALID_NODE;
-	[self fillBufferWithLookahead:k];
-	return [lookahead objectAtIndex:(head+k-1) % [lookahead count]];
-}
-
-- (id) treeSource
-{
-	return [self root];
-}
-
-- (id<ANTLRTreeAdaptor>) getTreeAdaptor;
-{
-	return treeAdaptor;
-}
-
-- (void)setTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor
-{
-    if (treeAdaptor != aTreeAdaptor) {
-        [aTreeAdaptor retain];
-        [treeAdaptor release];
-        treeAdaptor = aTreeAdaptor;
-    }
-}
-
-- (id<ANTLRTokenStream>) getTokenStream
-{
-	return tokenStream;
-}
-
-- (void) setTokenStream:(id<ANTLRTokenStream>)aTokenStream
-{
-	if (tokenStream != aTokenStream) {
-		[tokenStream release];
-		[aTokenStream retain];
-		tokenStream = aTokenStream;
-	}
-}
-
-- (void) setUsesUniqueNavigationNodes:(BOOL)flag
-{
-	shouldUseUniqueNavigationNodes = flag;
-}
-
-- (id) nodeAtIndex:(NSUInteger) idx
-{
-	@throw [NSException exceptionWithName:@"ANTLRTreeException" reason:@"-nodeAtIndex: unsupported for unbuffered streams" userInfo:nil];
-}
-
-- (NSString *) toString
-{
-	@throw [NSException exceptionWithName:@"ANTLRTreeException" reason:@"-toString unsupported for unbuffered streams" userInfo:nil];
-}
-
-- (NSString *) toStringWithRange:(NSRange) aRange
-{
-	@throw [NSException exceptionWithName:@"ANTLRTreeException" reason:@"-toString: unsupported for unbuffered streams" userInfo:nil];
-}
-
-- (NSString *) toStringFromNode:(id)startNode ToNode:(id)stopNode
-{
-	@throw [NSException exceptionWithName:@"ANTLRTreeException" reason:@"-toStringFromNode:toNode: unsupported for unbuffered streams" userInfo:nil];
-}
-
-#pragma mark ANTLRIntStream conformance
-
-- (void) consume
-{
-	[self fillBufferWithLookahead:1];
-	absoluteNodeIndex++;
-	previousNode = [lookahead objectAtIndex:head];
-	head = (head+1) % [lookahead count];
-}
-
-- (NSInteger) LA:(NSUInteger) i
-{
-	ANTLRCommonTree *node = [self LT:i];
-	if (!node) 
-		return ANTLRTokenTypeInvalid;
-	int ttype = [node getType];
-	return ttype;
-}
-
-- (NSUInteger) mark
-{
-	ANTLRUnbufferedCommonTreeNodeStreamState *state = [[[ANTLRUnbufferedCommonTreeNodeStreamState alloc] init] retain];
-	[state setCurrentNode:currentNode];
-	[state setPreviousNode:previousNode];
-	[state setIndexStackSize:[indexStack count]];
-	[state setNodeStackSize:[nodeStack count]];
-	[state setCurrentChildIndex:currentChildIndex];
-	[state setAbsoluteNodeIndex:absoluteNodeIndex];
-	unsigned int lookaheadSize = [self lookaheadSize];
-	unsigned int k;
-	for ( k = 0; k < lookaheadSize; k++) {
-		[state addToLookahead:[self LT:k+1]];
-	}
-	[markers addObject:state];
-	//[state release];
-	return [markers count];
-}
-
-- (NSUInteger) getIndex
-{
-	return absoluteNodeIndex + 1;
-}
-
-- (void) rewind:(NSUInteger) marker
-{
-	if ( [markers count] < marker ) {
-		return;
-	}
-	ANTLRUnbufferedCommonTreeNodeStreamState *state = [markers objectAtIndex:marker];
-	[markers removeObjectAtIndex:marker];
-
-	absoluteNodeIndex = [state absoluteNodeIndex];
-	currentChildIndex = [state currentChildIndex];
-	currentNode = [state currentNode];
-	previousNode = [state previousNode];
-	// drop node and index stacks back to old size
-	[nodeStack removeObjectsInRange:NSMakeRange([state nodeStackSize], [nodeStack count]-[state nodeStackSize])];
-	[indexStack removeObjectsInRange:NSMakeRange([state indexStackSize], [indexStack count]-[state indexStackSize])];
-	
-	head = tail = 0; // wack lookahead buffer and then refill
-	[lookahead release];
-	lookahead = [[NSMutableArray alloc] initWithArray:[state lookahead]];
-	tail = [lookahead count];
-	// make some room after the restored lookahead, so that the above line is not a bug ;)
-	// this also ensures that a subsequent -addLookahead: will not immediately need to resize the buffer
-	[lookahead addObjectsFromArray:[NSArray arrayWithObjects:[NSNull null], [NSNull null], [NSNull null], [NSNull null], [NSNull null], nil]];
-}
-
-- (void) rewind
-{
-	[self rewind:[markers count]];
-}
-
-- (void) release:(NSUInteger) marker
-{
-	@throw [NSException exceptionWithName:@"ANTLRTreeException" reason:@"-release: unsupported for unbuffered streams" userInfo:nil];
-}
-
-- (void) seek:(NSUInteger) anIndex
-{
-	if ( anIndex < (NSUInteger) index )
-		@throw [NSException exceptionWithName:@"ANTLRTreeException" reason:@"-seek: backwards unsupported for unbuffered streams" userInfo:nil];
-	while ( (NSUInteger) index < anIndex ) {
-		[self consume];
-	}
-}
-
-- (NSUInteger) size;
-{
-	return absoluteNodeIndex + 1;	// not entirely correct, but cheap.
-}
-
-
-#pragma mark Lookahead Handling
-- (void) addLookahead:(id<ANTLRBaseTree>)aNode
-{
-	[lookahead replaceObjectAtIndex:tail withObject:aNode];
-	tail = (tail+1) % [lookahead count];
-	
-	if ( tail == head ) {
-		NSMutableArray *newLookahead = [[[NSMutableArray alloc] initWithCapacity:[lookahead count]*2] retain];
-		
-		NSRange headRange = NSMakeRange(head, [lookahead count]-head);
-		NSRange tailRange = NSMakeRange(0, tail);
-		
-		[newLookahead addObjectsFromArray:[lookahead objectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:headRange]]];
-		[newLookahead addObjectsFromArray:[lookahead objectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:tailRange]]];
-		
-		unsigned int i;
-		unsigned int lookaheadCount = [newLookahead count];
-		for (i = 0; i < lookaheadCount; i++)
-			[newLookahead addObject:[NSNull null]];
-		[lookahead release];
-		lookahead = newLookahead;
-		
-		head = 0;
-		tail = lookaheadCount;	// tail is the location the _next_ lookahead node will end up in, not the last element's idx itself!
-	}
-	
-}
-
-- (NSUInteger) lookaheadSize
-{
-	return tail < head
-		? ([lookahead count] - head + tail) 
-		: (tail - head);
-}
-
-- (void) fillBufferWithLookahead:(NSInteger)k
-{
-	unsigned int n = [self lookaheadSize];
-	unsigned int i;
-	id lookaheadObject = self; // any valid object would do.
-	for (i=1; i <= k-n && lookaheadObject != nil; i++) {
-		lookaheadObject = [self nextObject];
-	}
-}
-
-- (id) nextObject
-{
-	// NOTE: this could/should go into an NSEnumerator subclass for treenode streams.
-	if (currentNode == nil) {
-        if ( navigationNodeEOF == nil ) {
-            navigationNodeEOF = [[ANTLRTreeNavigationNodeEOF alloc] init];
-        }
-		[self addLookahead:navigationNodeEOF];
-		return nil;
-	}
-	if (currentChildIndex == -1) {
-		return [self handleRootNode];
-	}
-	if (currentChildIndex < (NSInteger)[currentNode getChildCount]) {
-		return [self visitChild:currentChildIndex];
-	}
-	[self walkBackToMostRecentNodeWithUnvisitedChildren];
-	if (currentNode != nil) {
-		return [self visitChild:currentChildIndex];
-	}
-	
-	return nil;
-}	
-
-#pragma mark Node visiting
-- (ANTLRCommonTree *) handleRootNode
-{
-	ANTLRCommonTree *node = currentNode;
-	currentChildIndex = 0;
-	if ([node isNil]) {
-		node = [self visitChild:currentChildIndex];
-	} else {
-		[self addLookahead:node];
-		if ([currentNode getChildCount] == 0) {
-			currentNode = nil;
-		}
-	}
-	return node;
-}
-
-- (ANTLRCommonTree *) visitChild:(NSInteger)childNumber
-{
-	ANTLRCommonTree *node = nil;
-	
-	[nodeStack addObject:currentNode];
-	[indexStack addObject:[NSNumber numberWithInt:childNumber]];
-	if (childNumber == 0 && ![currentNode isNil])
-		[self addNavigationNodeWithType:ANTLRTokenTypeDOWN];
-
-	currentNode = [currentNode getChild:childNumber];
-	currentChildIndex = 0;
-	node = currentNode;  // record node to return
-	[self addLookahead:node];
-	[self walkBackToMostRecentNodeWithUnvisitedChildren];
-	return node;
-}
-
-- (void) walkBackToMostRecentNodeWithUnvisitedChildren
-{
-	while (currentNode != nil && currentChildIndex >= (NSInteger)[currentNode getChildCount])
-	{
-		currentNode = (ANTLRCommonTree *)[nodeStack lastObject];
-		[nodeStack removeLastObject];
-		currentChildIndex = [(NSNumber *)[indexStack lastObject] intValue];
-		[indexStack removeLastObject];
-		currentChildIndex++; // move to next child
-		if (currentChildIndex >= (NSInteger)[currentNode getChildCount]) {
-			if (![currentNode isNil]) {
-				[self addNavigationNodeWithType:ANTLRTokenTypeUP];
-			}
-			if (currentNode == root) { // we done yet?
-				currentNode = nil;
-			}
-		}
-	}
-	
-}
-
-- (void) addNavigationNodeWithType:(NSInteger)tokenType
-{
-	// TODO: this currently ignores shouldUseUniqueNavigationNodes.
-	switch (tokenType) {
-		case ANTLRTokenTypeDOWN: {
-            if (navigationNodeDown == nil) {
-                navigationNodeDown = [[ANTLRTreeNavigationNodeDown alloc] init];
-            }
-			[self addLookahead:navigationNodeDown];
-			break;
-		}
-		case ANTLRTokenTypeUP: {
-            if (navigationNodeUp == nil) {
-                navigationNodeUp = [[ANTLRTreeNavigationNodeUp alloc] init];
-            }
-			[self addLookahead:navigationNodeUp];
-			break;
-		}
-	}
-}
-
-#pragma mark Accessors
-- (ANTLRCommonTree *) root
-{
-    return root; 
-}
-
-- (void) setRoot: (ANTLRCommonTree *) aRoot
-{
-    if (root != aRoot) {
-        [aRoot retain];
-        [root release];
-        root = aRoot;
-    }
-}
-
-@end
-
diff --git a/runtime/ObjC/Framework/ANTLRUnbufferedCommonTreeNodeStreamState.h b/runtime/ObjC/Framework/ANTLRUnbufferedCommonTreeNodeStreamState.h
deleted file mode 100644
index f728952..0000000
--- a/runtime/ObjC/Framework/ANTLRUnbufferedCommonTreeNodeStreamState.h
+++ /dev/null
@@ -1,66 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRCommonTree.h"
-
-@interface ANTLRUnbufferedCommonTreeNodeStreamState : NSObject {
-	ANTLRCommonTree *currentNode;
-	ANTLRCommonTree *previousNode;
-
-	int currentChildIndex;
-	int absoluteNodeIndex;
-	unsigned int nodeStackSize;
-	unsigned int indexStackSize;
-	
-	NSMutableArray *lookahead;
-}
-
-- (ANTLRCommonTree *) currentNode;
-- (void) setCurrentNode: (ANTLRCommonTree *) aCurrentNode;
-
-- (ANTLRCommonTree *) previousNode;
-- (void) setPreviousNode: (ANTLRCommonTree *) aPreviousNode;
-
-- (NSInteger) currentChildIndex;
-- (void) setCurrentChildIndex: (NSInteger) aCurrentChildIndex;
-
-- (NSInteger) absoluteNodeIndex;
-- (void) setAbsoluteNodeIndex: (NSInteger) anAbsoluteNodeIndex;
-
-- (NSUInteger) nodeStackSize;
-- (void) setNodeStackSize: (NSUInteger) aNodeStackSize;
-
-- (NSUInteger) indexStackSize;
-- (void) setIndexStackSize: (NSUInteger) anIndexStackSize;
-
-- (NSMutableArray *) lookahead;
-- (void) setLookahead: (NSMutableArray *) aLookahead;
-
-- (void) addToLookahead: (id)lookaheadObject;
-- (void) removeFromLookahead: (id)lookaheadObject;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRUnbufferedCommonTreeNodeStreamState.m b/runtime/ObjC/Framework/ANTLRUnbufferedCommonTreeNodeStreamState.m
deleted file mode 100644
index c46d28d..0000000
--- a/runtime/ObjC/Framework/ANTLRUnbufferedCommonTreeNodeStreamState.m
+++ /dev/null
@@ -1,140 +0,0 @@
-// [The "BSD licence"]
-// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
-// 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.
-
-#import "ANTLRUnbufferedCommonTreeNodeStreamState.h"
-
-
-@implementation ANTLRUnbufferedCommonTreeNodeStreamState
-
-- (id) init
-{
-	if ((self = [super init]) != nil) {
-		lookahead = [[NSMutableArray alloc] init];
-	}
-	return self;
-}
-
-- (void) dealloc
-{
-	[self setLookahead:nil];
-	[self setCurrentNode:nil];
-	[self setPreviousNode:nil];
-	[super dealloc];
-}
-
-- (ANTLRCommonTree *) currentNode
-{
-    return currentNode; 
-}
-
-- (void) setCurrentNode: (ANTLRCommonTree *) aCurrentNode
-{
-    if (currentNode != aCurrentNode) {
-        [aCurrentNode retain];
-        [currentNode release];
-        currentNode = aCurrentNode;
-    }
-}
-
-- (ANTLRCommonTree *) previousNode
-{
-    return previousNode; 
-}
-
-- (void) setPreviousNode: (ANTLRCommonTree *) aPreviousNode
-{
-    if (previousNode != aPreviousNode) {
-        [aPreviousNode retain];
-        [previousNode release];
-        previousNode = aPreviousNode;
-    }
-}
-
-- (NSInteger) currentChildIndex
-{
-    return currentChildIndex;
-}
-
-- (void) setCurrentChildIndex: (NSInteger) aCurrentChildIndex
-{
-    currentChildIndex = aCurrentChildIndex;
-}
-
-- (NSInteger) absoluteNodeIndex
-{
-    return absoluteNodeIndex;
-}
-
-- (void) setAbsoluteNodeIndex: (NSInteger) anAbsoluteNodeIndex
-{
-    absoluteNodeIndex = anAbsoluteNodeIndex;
-}
-
-- (NSUInteger) nodeStackSize
-{
-    return nodeStackSize;
-}
-
-- (void) setNodeStackSize: (NSUInteger) aNodeStackSize
-{
-    nodeStackSize = aNodeStackSize;
-}
-
-- (NSUInteger) indexStackSize
-{
-    return indexStackSize;
-}
-
-- (void) setIndexStackSize: (NSUInteger) anIndexStackSize
-{
-    indexStackSize = anIndexStackSize;
-}
-
-- (NSMutableArray *) lookahead
-{
-    return lookahead; 
-}
-
-- (void) setLookahead: (NSMutableArray *) aLookahead
-{
-    if (lookahead != aLookahead) {
-        [aLookahead retain];
-        [lookahead release];
-        lookahead = aLookahead;
-    }
-}
-
-- (void) addToLookahead: (id)lookaheadObject
-{
-    [[self lookahead] addObject: lookaheadObject];
-}
-- (void) removeFromLookahead: (id)lookaheadObject
-{
-    [[self lookahead] removeObject: lookaheadObject];
-}
-
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRUnbufferedTokenStream.h b/runtime/ObjC/Framework/ANTLRUnbufferedTokenStream.h
deleted file mode 100644
index 84d8f43..0000000
--- a/runtime/ObjC/Framework/ANTLRUnbufferedTokenStream.h
+++ /dev/null
@@ -1,62 +0,0 @@
-//
-//  ANTLRUnbufferedTokenStream.h
-//  ANTLR
-//
-//  Created by Alan Condit on 7/12/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRRuntimeException.h"
-#import "ANTLRTokenSource.h"
-#import "ANTLRLookaheadStream.h"
-#import "ANTLRToken.h"
-
-@interface ANTLRUnbufferedTokenStream : ANTLRLookaheadStream {
-	id<ANTLRTokenSource> tokenSource;
-    NSInteger tokenIndex; // simple counter to set token index in tokens
-    NSInteger channel;
-}
-
-@property (retain, getter=getTokenSource, setter=setTokenSource:) id<ANTLRTokenSource> tokenSource;
-@property (getter=getTokenIndex, setter=setTokenIndex:) NSInteger tokenIndex;
-@property (getter=channel, setter=setChannel:) NSInteger channel;
-
-+ (ANTLRUnbufferedTokenStream *)newANTLRUnbufferedTokenStream:(id<ANTLRTokenSource>)aTokenSource;
-- (id) init;
-- (id) initWithTokenSource:(id<ANTLRTokenSource>)aTokenSource;
-
-- (id<ANTLRToken>)nextElement;
-- (BOOL)isEOF:(id<ANTLRToken>) aToken;
-- (id<ANTLRTokenSource>)getTokenSource;
-- (NSString *)toStringFromStart:(NSInteger)aStart ToEnd:(NSInteger)aStop;
-- (NSString *)toStringFromToken:(id<ANTLRToken>)aStart ToEnd:(id<ANTLRToken>)aStop;
-- (NSInteger)LA:(NSInteger)anIdx;
-- (id<ANTLRToken>)objectAtIndex:(NSInteger)anIdx;
-- (NSString *)getSourceName;
-
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRUnbufferedTokenStream.m b/runtime/ObjC/Framework/ANTLRUnbufferedTokenStream.m
deleted file mode 100644
index 3b74e92..0000000
--- a/runtime/ObjC/Framework/ANTLRUnbufferedTokenStream.m
+++ /dev/null
@@ -1,118 +0,0 @@
-//
-//  ANTLRUnbufferedTokenStream.m
-//  ANTLR
-//
-//  Created by Alan Condit on 7/12/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import "ANTLRUnbufferedTokenStream.h"
-
-@implementation ANTLRUnbufferedTokenStream
-
-@synthesize tokenSource;
-@synthesize tokenIndex;
-@synthesize channel;
-
-+ (ANTLRUnbufferedTokenStream *)newANTLRUnbufferedTokenStream:(id<ANTLRTokenSource>)aTokenSource
-{
-    return [[ANTLRUnbufferedTokenStream alloc] initWithTokenSource:aTokenSource];
-}
-
-- (id) init
-{
-    if ((self = [super init]) != nil) {
-        tokenSource = nil;
-        tokenIndex = 0;
-        channel = ANTLRTokenChannelDefault;
-    }
-    return self;
-}
-
-- (id) initWithTokenSource:(id<ANTLRTokenSource>)aTokenSource
-{
-    if ((self = [super init]) != nil) {
-        tokenSource = aTokenSource;
-        if ( tokenSource ) [tokenSource retain];
-        tokenIndex = 0;
-        channel = ANTLRTokenChannelDefault;
-    }
-    return self;
-}
-
-- (void) dealloc
-{
-#ifdef DEBUG_DEALLOC
-    NSLog( @"called dealloc in ANTLRUnbufferedTokenStream" );
-#endif
-    if ( tokenSource ) [tokenSource release];
-    [super dealloc];
-}
-
-- (id<ANTLRToken>)nextElement
-{
-    id<ANTLRToken> t = [tokenSource nextToken];
-    [t setTokenIndex:tokenIndex++];
-    return t;
-}
-
-- (BOOL)isEOF:(id<ANTLRToken>)aToken
-{
-    return (aToken.type == ANTLRTokenTypeEOF);
-}    
-
-- (id<ANTLRTokenSource>)getTokenSource
-{
-    return tokenSource;
-}
-
-- (NSString *)toStringFromStart:(NSInteger)aStart ToEnd:(NSInteger)aStop
-{
-    return @"n/a";
-}
-
-- (NSString *)toStringFromToken:(id<ANTLRToken>)aStart ToEnd:(id<ANTLRToken>)aStop
-{
-    return @"n/a";
-}
-
-- (NSInteger)LA:(NSInteger)anIdx
-{
-    return [[self LT:anIdx] type];
-}
-
-- (id<ANTLRToken>)objectAtIndex:(NSInteger)anIdx
-{
-    @throw [ANTLRRuntimeException newException:@"Absolute token indexes are meaningless in an unbuffered stream"];
-}
-
-- (NSString *)getSourceName
-{
-    return [tokenSource getSourceName];
-}
-
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRUniqueIDMap.h b/runtime/ObjC/Framework/ANTLRUniqueIDMap.h
deleted file mode 100644
index 55c92d1..0000000
--- a/runtime/ObjC/Framework/ANTLRUniqueIDMap.h
+++ /dev/null
@@ -1,64 +0,0 @@
-//
-//  ANTLRUniqueIDMap.h
-//  ANTLR
-//
-//  Created by Alan Condit on 7/7/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRPtrBuffer.h"
-#import "ANTLRNodeMapElement.h"
-
-#define SUCCESS             0
-#define FAILURE             -1
-#define HASHSIZE            101
-#define HBUFSIZE            0x2000
-
-@interface ANTLRUniqueIDMap : ANTLRPtrBuffer {
-    NSInteger lastHash;
-}
-
-@property (getter=getLastHash, setter=setLastHash:) NSInteger lastHash;
-
-+ (id)newANTLRUniqueIDMap;
-+ (id)newANTLRUniqueIDMapWithLen:(NSInteger)aHashSize;
-
-- (id)init;
-- (id)initWithLen:(NSInteger)cnt;
-- (void)dealloc;
-// Instance Methods
-- (NSInteger)count;
-- (NSInteger)size;
-/* clear -- reinitialize the maplist array */
-- (void) clear;
-
-- (void)deleteANTLRUniqueIDMap:(ANTLRNodeMapElement *)np;
-- (void)delete_chain:(ANTLRNodeMapElement *)np;
-- (id)getNode:(id<ANTLRBaseTree>)aNode;
-- (void)putID:(id)anID Node:(id<ANTLRBaseTree>)aNode;
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRUniqueIDMap.m b/runtime/ObjC/Framework/ANTLRUniqueIDMap.m
deleted file mode 100644
index 0d52092..0000000
--- a/runtime/ObjC/Framework/ANTLRUniqueIDMap.m
+++ /dev/null
@@ -1,184 +0,0 @@
-//
-//  ANTLRUniqueIDMap.m
-//  ANTLR
-//
-//  Created by Alan Condit on 7/7/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import "ANTLRUniqueIDMap.h"
-#import "ANTLRTree.h"
-
-@implementation ANTLRUniqueIDMap
-@synthesize lastHash;
-
-+(id)newANTLRUniqueIDMap
-{
-    ANTLRUniqueIDMap *aNewANTLRUniqueIDMap;
-    
-    aNewANTLRUniqueIDMap = [[ANTLRUniqueIDMap alloc] init];
-	return( aNewANTLRUniqueIDMap );
-}
-
-+(id)newANTLRUniqueIDMapWithLen:(NSInteger)aBuffSize
-{
-    ANTLRUniqueIDMap *aNewANTLRUniqueIDMap;
-    
-    aNewANTLRUniqueIDMap = [[ANTLRUniqueIDMap alloc] initWithLen:aBuffSize];
-	return( aNewANTLRUniqueIDMap );
-}
-
--(id)init
-{
-    NSInteger idx;
-    
-	if ((self = [super initWithLen:HASHSIZE]) != nil) {
-		fNext = nil;
-        for( idx = 0; idx < HASHSIZE; idx++ ) {
-            ptrBuffer[idx] = nil;
-        }
-	}
-    return( self );
-}
-
--(id)initWithLen:(NSInteger)aBuffSize
-{
-	if ((self = [super initWithLen:aBuffSize]) != nil) {
-	}
-    return( self );
-}
-
--(void)dealloc
-{
-#ifdef DEBUG_DEALLOC
-    NSLog( @"called dealloc in ANTLRUniqueIDMap" );
-#endif
-    ANTLRNodeMapElement *tmp, *rtmp;
-    NSInteger idx;
-	
-    if ( self.fNext != nil ) {
-        for( idx = 0; idx < HASHSIZE; idx++ ) {
-            tmp = ptrBuffer[idx];
-            while ( tmp ) {
-                rtmp = tmp;
-                tmp = (ANTLRNodeMapElement *)tmp.fNext;
-                [rtmp release];
-            }
-        }
-    }
-	[super dealloc];
-}
-
--(void)deleteANTLRUniqueIDMap:(ANTLRNodeMapElement *)np
-{
-    ANTLRNodeMapElement *tmp, *rtmp;
-    NSInteger idx;
-    
-    if ( self.fNext != nil ) {
-        for( idx = 0; idx < HASHSIZE; idx++ ) {
-            tmp = ptrBuffer[idx];
-            while ( tmp ) {
-                rtmp = tmp;
-                tmp = tmp.fNext;
-                [rtmp release];
-            }
-        }
-    }
-}
-
-- (void)clear
-{
-    ANTLRNodeMapElement *tmp, *rtmp;
-    NSInteger idx;
-    
-    for( idx = 0; idx < HASHSIZE; idx++ ) {
-        tmp = ptrBuffer[idx];
-        while ( tmp ) {
-            rtmp = tmp;
-            tmp = [tmp getfNext];
-            [rtmp release];
-        }
-        ptrBuffer[idx] = nil;
-    }
-}
-
-- (NSInteger)count
-{
-    id anElement;
-    NSInteger aCnt = 0;
-    
-    for (int i = 0; i < BuffSize; i++) {
-        if ((anElement = ptrBuffer[i]) != nil) {
-            aCnt += (NSInteger)[anElement count];
-        }
-    }
-    return aCnt;
-}
-
-- (NSInteger)size
-{
-    return BuffSize;
-}
-
--(void)delete_chain:(ANTLRNodeMapElement *)np
-{
-    if ( np.fNext != nil )
-		[self delete_chain:np.fNext];
-	[np release];
-}
-
-- (id)getNode:(id<ANTLRBaseTree>)aNode
-{
-    ANTLRNodeMapElement *np;
-    NSInteger idx;
-    
-    idx = [(id<ANTLRBaseTree>)aNode type];
-    np = ptrBuffer[idx];
-    while ( np != nil ) {
-        if (np.node == aNode) {
-            return( np.index );
-        }
-        np = np.fNext;
-    }
-    return( nil );
-}
-
-- (void)putID:(id)anID Node:(id<ANTLRBaseTree>)aNode
-{
-    ANTLRNodeMapElement *np, *np1;
-    NSInteger idx;
-    
-    idx = [(id<ANTLRBaseTree>)aNode type];
-    idx %= HASHSIZE;
-    np = [[ANTLRNodeMapElement newANTLRNodeMapElementWithIndex:anID Node:aNode] retain];
-    np1 = ptrBuffer[idx];
-    np.fNext = np1;
-    ptrBuffer[idx] = np;
-    return;
-}
-
-
-@end
diff --git a/runtime/ObjC/Framework/ANTLRUnwantedTokenException.h b/runtime/ObjC/Framework/ANTLRUnwantedTokenException.h
deleted file mode 100644
index fbb60e3..0000000
--- a/runtime/ObjC/Framework/ANTLRUnwantedTokenException.h
+++ /dev/null
@@ -1,47 +0,0 @@
-//
-//  ANTLRUnwantedTokenException.h
-//  ANTLR
-//
-//  Created by Alan Condit on 6/8/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import <Cocoa/Cocoa.h>
-#import "ANTLRMismatchedTokenException.h"
-
-@interface ANTLRUnwantedTokenException : ANTLRMismatchedTokenException {
-
-}
-+ (ANTLRUnwantedTokenException *)newException;
-+ (ANTLRUnwantedTokenException *)newException:(NSInteger)expected Stream:(id<ANTLRIntStream>)anInput;
-
-- (id) init;
-- (id) initWithStream:(id<ANTLRIntStream>)anInput And:(NSInteger)expected;
-- (id<ANTLRToken>)getUnexpectedToken;
-- (NSString *)toString;
-                     
-    
-@end
diff --git a/runtime/ObjC/Framework/ANTLRUnwantedTokenException.m b/runtime/ObjC/Framework/ANTLRUnwantedTokenException.m
deleted file mode 100644
index b8b24f3..0000000
--- a/runtime/ObjC/Framework/ANTLRUnwantedTokenException.m
+++ /dev/null
@@ -1,80 +0,0 @@
-//
-//  ANTLRUnwantedTokenException.m
-//  ANTLR
-//
-//  Created by Alan Condit on 6/8/10.
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-// 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.
-
-#import "ANTLRUnwantedTokenException.h"
-
-@implementation ANTLRUnwantedTokenException : ANTLRMismatchedTokenException
-	/** Used for remote debugger deserialization */
-+ (ANTLRUnwantedTokenException *)newException
-{
-    return [[ANTLRUnwantedTokenException alloc] init];
-}
-    
-+ (ANTLRUnwantedTokenException *)newException:(NSInteger)expected Stream:(id<ANTLRIntStream>)anInput
-{
-    return [[ANTLRUnwantedTokenException alloc] initWithStream:anInput And:expected];
-}
-
-- (id) init
-{
-    self = [super initWithStream:input];
-    if (self) {
-    }
-    return self;
-}
-     
-- (id) initWithStream:(id<ANTLRIntStream>)anInput And:(NSInteger)expected
-{
-    self = [super initWithStream:anInput];
-    if (self) {
-        expecting = expected;
-    }
-    return self;
-}
-    
-- (id<ANTLRToken>)getUnexpectedToken
-{
-    return token;
-}
-    
-- (NSString *)toString
-{
-    NSString *exp1 = [NSString stringWithFormat:@", expected %d", expecting];
-    if ( expecting == ANTLRTokenTypeInvalid ) {
-        exp1 = @"";
-    }
-    if ( token==nil ) {
-        return [NSString stringWithFormat:@"UnwantedTokenException(found=%@)", exp1];
-    }
-    return [NSString stringWithFormat:@"UnwantedTokenException(found=%@ %@", token.text, exp1];
-}
-
-@end
diff --git a/runtime/ObjC/Framework/ArrayIterator.h b/runtime/ObjC/Framework/ArrayIterator.h
index 280f03f..3a0af07 100644
--- a/runtime/ObjC/Framework/ArrayIterator.h
+++ b/runtime/ObjC/Framework/ArrayIterator.h
@@ -25,7 +25,6 @@
  *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
-#import <Cocoa/Cocoa.h>
 #import <Foundation/Foundation.h>
 
 /**
diff --git a/runtime/ObjC/Framework/ArrayIterator.m b/runtime/ObjC/Framework/ArrayIterator.m
index 45d1e6a..42d3f7a 100644
--- a/runtime/ObjC/Framework/ArrayIterator.m
+++ b/runtime/ObjC/Framework/ArrayIterator.m
@@ -27,7 +27,7 @@
  */
 #import "AMutableArray.h"
 #import "ArrayIterator.h"
-#import "ANTLRRuntimeException.h"
+#import "RuntimeException.h"
 
 @class AMutableArray;
 
@@ -167,7 +167,7 @@
 
 - (void) removeObjectAtIndex:(NSInteger)idx
 {
-    @throw [ANTLRUnsupportedOperationException newException:@"Cant remove object from ArrayIterator"];
+    @throw [UnsupportedOperationException newException:@"Cant remove object from ArrayIterator"];
 }
 
 - (NSInteger) count
diff --git a/runtime/ObjC/Framework/BaseMapElement.h b/runtime/ObjC/Framework/BaseMapElement.h
new file mode 100644
index 0000000..defb659
--- /dev/null
+++ b/runtime/ObjC/Framework/BaseMapElement.h
@@ -0,0 +1,52 @@
+//
+//  BaseMapElement.h
+//  ANTLR
+//
+//  Created by Alan Condit on 6/16/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "LinkBase.h"
+#import "ACNumber.h"
+
+@interface BaseMapElement : LinkBase {
+    ACNumber *index;
+}
+
+@property (retain) ACNumber *index;
+
++ (id) newBaseMapElement;
++ (id) newBaseMapElementWithIndex:(ACNumber *)anIdx;
+- (id) init;
+- (id) initWithAnIndex:(ACNumber *)anIdx;
+
+- (id) copyWithZone:(NSZone *)aZone;
+
+- (NSInteger)count;
+- (NSInteger)size;
+
+@end
diff --git a/runtime/ObjC/Framework/BaseMapElement.m b/runtime/ObjC/Framework/BaseMapElement.m
new file mode 100644
index 0000000..2ff2172
--- /dev/null
+++ b/runtime/ObjC/Framework/BaseMapElement.m
@@ -0,0 +1,95 @@
+//
+//  BaseMapElement.h
+//  ANTLR
+//
+//  Created by Alan Condit on 6/16/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import "BaseMapElement.h"
+
+
+@implementation BaseMapElement
+
+@synthesize index;
+
++ (BaseMapElement *)newBaseMapElement
+{
+    return [[BaseMapElement alloc] init];
+}
+
++ (BaseMapElement *)newBaseMapElementWithIndex:(ACNumber *)aNumber
+{
+    return [[BaseMapElement alloc] initWithAnIndex:(ACNumber *)aNumber];
+}
+
+- (id) init
+{
+    if ((self = [super init]) != nil ) {
+        index = nil;
+    }
+    return (self);
+}
+
+- (id) initWithAnIndex:(ACNumber *)aNumber
+{
+    if ((self = [super init]) != nil ) {
+        index = aNumber;
+        if ( index ) [index retain];
+    }
+    return (self);
+}
+
+- (void) dealloc
+{
+#ifdef DEBUG_DEALLOC
+    NSLog( @"called dealloc in BaseMapElement" );
+#endif
+    if ( index ) [index release];
+    [super dealloc];
+}
+
+- (id) copyWithZone:(NSZone *)aZone
+{
+    BaseMapElement *copy;
+    
+    copy = [super copyWithZone:aZone];
+    copy.index = index;
+    return( copy );
+}
+
+- (NSInteger)count
+{
+    return 1;
+}
+                          
+                          
+- (NSInteger)size
+{
+    return(  sizeof(index) );
+}
+
+@end
diff --git a/runtime/ObjC/Framework/BaseRecognizer.h b/runtime/ObjC/Framework/BaseRecognizer.h
new file mode 100644
index 0000000..e398063
--- /dev/null
+++ b/runtime/ObjC/Framework/BaseRecognizer.h
@@ -0,0 +1,179 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+
+#import <Foundation/Foundation.h>
+
+#import "IntStream.h"
+#import "AMutableArray.h"
+
+// This is an abstract superclass for lexers and parsers.
+
+#define ANTLR_MEMO_RULE_FAILED -2
+#define ANTLR_MEMO_RULE_UNKNOWN -1
+#define ANTLR_INITIAL_FOLLOW_STACK_SIZE 100
+
+#import "MapElement.h"
+#import "ANTLRBitSet.h"
+#import "Token.h"
+#import "RecognizerSharedState.h"
+#import "RecognitionException.h"
+#import "MissingTokenException.h"
+#import "MismatchedTokenException.h"
+#import "MismatchedTreeNodeException.h"
+#import "UnwantedTokenException.h"
+#import "NoViableAltException.h"
+#import "EarlyExitException.h"
+#import "MismatchedSetException.h"
+#import "MismatchedNotSetException.h"
+#import "FailedPredicateException.h"
+
+@interface BaseRecognizer : NSObject {
+    __strong RecognizerSharedState *state;  // the state of this recognizer. Might be shared with other recognizers, e.g. in grammar import scenarios.
+    __strong NSString *grammarFileName;          // where did the grammar come from. filled in by codegeneration
+    __strong NSString *sourceName;
+    __strong AMutableArray *tokenNames;
+}
+
++ (void) initialize;
+
++ (BaseRecognizer *) newBaseRecognizer;
++ (BaseRecognizer *) newBaseRecognizerWithRuleLen:(NSInteger)aLen;
++ (BaseRecognizer *) newBaseRecognizer:(RecognizerSharedState *)aState;
+
++ (AMutableArray *)getTokenNames;
++ (void)setTokenNames:(NSArray *)aTokNamArray;
++ (void)setGrammarFileName:(NSString *)aFileName;
+
+- (id) init;
+- (id) initWithLen:(NSInteger)aLen;
+- (id) initWithState:(RecognizerSharedState *)aState;
+
+- (void) dealloc;
+
+// simple accessors
+- (NSInteger) getBacktrackingLevel;
+- (void) setBacktrackingLevel:(NSInteger) level;
+
+- (BOOL) getFailed;
+- (void) setFailed: (BOOL) flag;
+
+- (RecognizerSharedState *) getState;
+- (void) setState:(RecognizerSharedState *) theState;
+
+// reset this recognizer - might be extended by codegeneration/grammar
+- (void) reset;
+
+/** Match needs to return the current input symbol, which gets put
+ *  into the label for the associated token ref; e.g., x=ID.  Token
+ *  and tree parsers need to return different objects. Rather than test
+ *  for input stream type or change the IntStream interface, I use
+ *  a simple method to ask the recognizer to tell me what the current
+ *  input symbol is.
+ * 
+ *  This is ignored for lexers.
+ */
+- (id) input;
+
+- (void)skip;
+
+// do actual matching of tokens/characters
+- (id) match:(id<IntStream>)anInput TokenType:(NSInteger)ttype Follow:(ANTLRBitSet *)follow;
+- (void) matchAny:(id<IntStream>)anInput;
+- (BOOL) mismatchIsUnwantedToken:(id<IntStream>)anInput TokenType:(NSInteger) ttype;
+- (BOOL) mismatchIsMissingToken:(id<IntStream>)anInput Follow:(ANTLRBitSet *)follow;
+
+// error reporting and recovery
+- (void) reportError:(RecognitionException *)e;
+- (void) displayRecognitionError:(AMutableArray *)theTokNams Exception:(RecognitionException *)e;
+- (NSString *)getErrorMessage:(RecognitionException *)e TokenNames:(AMutableArray *)theTokNams;
+- (NSInteger) getNumberOfSyntaxErrors;
+- (NSString *)getErrorHeader:(RecognitionException *)e;
+- (NSString *)getTokenErrorDisplay:(id<Token>)t;
+- (void) emitErrorMessage:(NSString *)msg;
+- (void) recover:(id<IntStream>)anInput Exception:(RecognitionException *)e;
+
+// begin hooks for debugger
+- (void) beginResync;
+- (void) endResync;
+// end hooks for debugger
+
+// compute the bitsets necessary to do matching and recovery
+- (ANTLRBitSet *)computeErrorRecoverySet;
+- (ANTLRBitSet *)computeContextSensitiveRuleFOLLOW;
+- (ANTLRBitSet *)combineFollows:(BOOL) exact;
+
+- (id<Token>) recoverFromMismatchedToken:(id<IntStream>)anInput 
+                                    TokenType:(NSInteger)ttype 
+                                       Follow:(ANTLRBitSet *)follow;
+                                    
+- (id<Token>)recoverFromMismatchedSet:(id<IntStream>)anInput
+                                    Exception:(RecognitionException *)e
+                                    Follow:(ANTLRBitSet *)follow;
+
+- (id) getCurrentInputSymbol:(id<IntStream>)anInput;
+- (id) getMissingSymbol:(id<IntStream>)anInput
+              Exception:(RecognitionException *)e
+              TokenType:(NSInteger) expectedTokenType
+                Follow:(ANTLRBitSet *)follow;
+
+// helper methods for recovery. try to resync somewhere
+- (void) consumeUntilTType:(id<IntStream>)anInput TokenType:(NSInteger)ttype;
+- (void) consumeUntilFollow:(id<IntStream>)anInput Follow:(ANTLRBitSet *)bitSet;
+- (void) pushFollow:(ANTLRBitSet *)fset;
+- (ANTLRBitSet *)popFollow;
+
+// to be used by the debugger to do reporting. maybe hook in incremental stuff here, too.
+- (AMutableArray *) getRuleInvocationStack;
+- (AMutableArray *) getRuleInvocationStack:(RecognitionException *)exception
+                                 Recognizer:(NSString *)recognizerClassName;
+
+- (AMutableArray *) getTokenNames;
+- (NSString *)getGrammarFileName;
+- (NSString *)getSourceName;
+- (AMutableArray *) toStrings:(NSArray *)tokens;
+// support for memoization
+- (NSInteger) getRuleMemoization:(NSInteger)ruleIndex StartIndex:(NSInteger)ruleStartIndex;
+- (BOOL) alreadyParsedRule:(id<IntStream>)anInput RuleIndex:(NSInteger)ruleIndex;
+- (void) memoize:(id<IntStream>)anInput
+         RuleIndex:(NSInteger)ruleIndex
+        StartIndex:(NSInteger)ruleStartIndex;
+- (NSInteger) getRuleMemoizationCacheSize;
+- (void)traceIn:(NSString *)ruleName Index:(NSInteger)ruleIndex Object:(id)inputSymbol;
+- (void)traceOut:(NSString *)ruleName Index:(NSInteger)ruleIndex Object:(id)inputSymbol;
+
+
+// support for syntactic predicates. these are called indirectly to support funky stuff in grammars,
+// like supplying selectors instead of writing code directly into the actions of the grammar.
+- (BOOL) evaluateSyntacticPredicate:(SEL)synpredFragment;
+// stream:(id<IntStream>)anInput;
+
+@property (retain) RecognizerSharedState *state;
+@property (retain) NSString *grammarFileName;
+@property (retain) NSString *sourceName;
+@property (retain) AMutableArray *tokenNames;
+
+@end
diff --git a/runtime/ObjC/Framework/BaseRecognizer.m b/runtime/ObjC/Framework/BaseRecognizer.m
new file mode 100644
index 0000000..6caf795
--- /dev/null
+++ b/runtime/ObjC/Framework/BaseRecognizer.m
@@ -0,0 +1,1132 @@
+//
+//  BaseRecognizer.m
+//  ANTLR
+//
+//  Created by Alan Condit on 6/16/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import "ACNumber.h"
+#import "BaseRecognizer.h"
+#import "HashRule.h"
+#import "RuleMemo.h"
+#import "CommonToken.h"
+#import "Map.h"
+#import "NoViableAltException.h"
+
+extern NSInteger debug;
+
+@implementation BaseRecognizer
+
+static AMutableArray *_tokenNames;
+static NSString *_grammarFileName;
+static NSString *NEXT_TOKEN_RULE_NAME;
+
+@synthesize state;
+@synthesize grammarFileName;
+//@synthesize failed;
+@synthesize sourceName;
+//@synthesize numberOfSyntaxErrors;
+@synthesize tokenNames;
+
++ (void) initialize
+{
+    NEXT_TOKEN_RULE_NAME = [NSString stringWithString:@"nextToken"];
+    [NEXT_TOKEN_RULE_NAME retain];
+}
+
++ (BaseRecognizer *) newBaseRecognizer
+{
+    return [[BaseRecognizer alloc] init];
+}
+
++ (BaseRecognizer *) newBaseRecognizerWithRuleLen:(NSInteger)aLen
+{
+    return [[BaseRecognizer alloc] initWithLen:aLen];
+}
+
++ (BaseRecognizer *) newBaseRecognizer:(RecognizerSharedState *)aState
+{
+	return [[BaseRecognizer alloc] initWithState:aState];
+}
+
++ (AMutableArray *)getTokenNames
+{
+    return _tokenNames;
+}
+
++ (void)setTokenNames:(AMutableArray *)theTokNams
+{
+    if ( _tokenNames != theTokNams ) {
+        if ( _tokenNames ) [_tokenNames release];
+        [theTokNams retain];
+    }
+    _tokenNames = theTokNams;
+}
+
++ (void)setGrammarFileName:(NSString *)aFileName
+{
+    if ( _grammarFileName != aFileName ) {
+        if ( _grammarFileName ) [_grammarFileName release];
+        [aFileName retain];
+    }
+    [_grammarFileName retain];
+}
+
+- (id) init
+{
+	if ((self = [super init]) != nil) {
+        if (state == nil) {
+            state = [[RecognizerSharedState newRecognizerSharedState] retain];
+        }
+        tokenNames = _tokenNames;
+        if ( tokenNames ) [tokenNames retain];
+        grammarFileName = _grammarFileName;
+        if ( grammarFileName ) [grammarFileName retain];
+        state._fsp = -1;
+        state.errorRecovery = NO;		// are we recovering?
+        state.lastErrorIndex = -1;
+        state.failed = NO;				// indicate that some match failed
+        state.syntaxErrors = 0;
+        state.backtracking = 0;			// the level of backtracking
+        state.tokenStartCharIndex = -1;
+	}
+	return self;
+}
+
+- (id) initWithLen:(NSInteger)aLen
+{
+	if ((self = [super init]) != nil) {
+        if (state == nil) {
+            state = [[RecognizerSharedState newRecognizerSharedStateWithRuleLen:aLen] retain];
+        }
+        tokenNames = _tokenNames;
+        if ( tokenNames ) [tokenNames retain];
+        grammarFileName = _grammarFileName;
+        if ( grammarFileName ) [grammarFileName retain];
+        state._fsp = -1;
+        state.errorRecovery = NO;		// are we recovering?
+        state.lastErrorIndex = -1;
+        state.failed = NO;				// indicate that some match failed
+        state.syntaxErrors = 0;
+        state.backtracking = 0;			// the level of backtracking
+        state.tokenStartCharIndex = -1;
+	}
+	return self;
+}
+
+- (id) initWithState:(RecognizerSharedState *)aState
+{
+	if ((self = [super init]) != nil) {
+		state = aState;
+        if (state == nil) {
+            state = [RecognizerSharedState newRecognizerSharedState];
+        }
+        [state retain];
+        tokenNames = _tokenNames;
+        if ( tokenNames ) [tokenNames retain];
+        grammarFileName = _grammarFileName;
+        if ( grammarFileName ) [grammarFileName retain];
+        state._fsp = -1;
+        state.errorRecovery = NO;		// are we recovering?
+        state.lastErrorIndex = -1;
+        state.failed = NO;				// indicate that some match failed
+        state.syntaxErrors = 0;
+        state.backtracking = 0;			// the level of backtracking
+        state.tokenStartCharIndex = -1;
+	}
+	return self;
+}
+
+- (void)dealloc
+{
+#ifdef DEBUG_DEALLOC
+    NSLog( @"called dealloc in BaseRecognizer" );
+#endif
+	if ( grammarFileName ) [grammarFileName release];
+	if ( tokenNames ) [tokenNames release];
+	if ( state ) [state release];
+	[super dealloc];
+}
+
+// reset the recognizer to the initial state. does not touch the token source!
+// this can be extended by the grammar writer to reset custom ivars
+- (void) reset
+{
+    if ( state == nil )
+        return; 
+    if ( state.following != nil ) {
+        if ( [state.following count] )
+            [state.following removeAllObjects];
+    }
+    state._fsp = -1;
+    state.errorRecovery = NO;		// are we recovering?
+    state.lastErrorIndex = -1;
+    state.failed = NO;				// indicate that some match failed
+    state.syntaxErrors = 0;
+    state.backtracking = 0;			// the level of backtracking
+    state.tokenStartCharIndex = -1;
+    if ( state.ruleMemo != nil ) {
+        if ( [state.ruleMemo count] )
+            [state.ruleMemo removeAllObjects];
+    }
+}
+
+- (BOOL) getFailed
+{
+	return [state getFailed];
+}
+
+- (void) setFailed:(BOOL)flag
+{
+	[state setFailed:flag];
+}
+
+- (RecognizerSharedState *) getState
+{
+	return state;
+}
+
+- (void) setState:(RecognizerSharedState *) theState
+{
+	if (state != theState) {
+		if ( state ) [state release];
+		state = theState;
+		[state retain];
+	}
+}
+
+- (id)input
+{
+    return nil; // Must be overriden in inheriting class
+}
+
+- (void)skip // override in inheriting class
+{
+    return;
+}
+
+-(id) match:(id<IntStream>)anInput TokenType:(NSInteger)ttype Follow:(ANTLRBitSet *)follow
+{
+	id matchedSymbol = [self getCurrentInputSymbol:anInput];
+	if ([anInput LA:1] == ttype) {
+		[anInput consume];
+		state.errorRecovery = NO;
+		state.failed = NO;
+		return matchedSymbol;
+	}
+	if (state.backtracking > 0) {
+		state.failed = YES;
+		return matchedSymbol;
+	}
+	matchedSymbol = [self recoverFromMismatchedToken:anInput TokenType:ttype Follow:follow];
+	return matchedSymbol;
+}
+
+-(void) matchAny:(id<IntStream>)anInput
+{
+    state.errorRecovery = NO;
+    state.failed = NO;
+    [anInput consume];
+}
+
+-(BOOL) mismatchIsUnwantedToken:(id<IntStream>)anInput TokenType:(NSInteger)ttype
+{
+    return [anInput LA:2] == ttype;
+}
+
+-(BOOL) mismatchIsMissingToken:(id<IntStream>)anInput Follow:(ANTLRBitSet *) follow
+{
+    if ( follow == nil ) {
+        // we have no information about the follow; we can only consume
+        // a single token and hope for the best
+        return NO;
+    }
+    // compute what can follow this grammar element reference
+    if ( [follow member:TokenTypeEOR] ) {
+        ANTLRBitSet *viableTokensFollowingThisRule = [self computeContextSensitiveRuleFOLLOW];
+        follow = [follow or:viableTokensFollowingThisRule];
+        if ( state._fsp >= 0 ) { // remove EOR if we're not the start symbol
+            [follow remove:(TokenTypeEOR)];
+        }
+    }
+    // if current token is consistent with what could come after set
+    // then we know we're missing a token; error recovery is free to
+    // "insert" the missing token
+    
+    //System.out.println("viable tokens="+follow.toString(getTokenNames()));
+    //System.out.println("LT(1)="+((TokenStream)input).LT(1));
+    
+    // BitSet cannot handle negative numbers like -1 (EOF) so I leave EOR
+    // in follow set to indicate that the fall of the start symbol is
+    // in the set (EOF can follow).
+    if ( [follow member:[anInput LA:1]] || [follow member:TokenTypeEOR] ) {
+        //System.out.println("LT(1)=="+((TokenStream)input).LT(1)+" is consistent with what follows; inserting...");
+        return YES;
+    }
+    return NO;
+}
+
+/** Report a recognition problem.
+ *
+ *  This method sets errorRecovery to indicate the parser is recovering
+ *  not parsing.  Once in recovery mode, no errors are generated.
+ *  To get out of recovery mode, the parser must successfully match
+ *  a token (after a resync).  So it will go:
+ *
+ * 		1. error occurs
+ * 		2. enter recovery mode, report error
+ * 		3. consume until token found in resynch set
+ * 		4. try to resume parsing
+ * 		5. next match() will reset errorRecovery mode
+ *
+ *  If you override, make sure to update syntaxErrors if you care about that.
+ */
+-(void) reportError:(RecognitionException *) e
+{
+    // if we've already reported an error and have not matched a token
+    // yet successfully, don't report any errors.
+    if ( state.errorRecovery ) {
+        //System.err.print("[SPURIOUS] ");
+        return;
+    }
+    state.syntaxErrors++; // don't count spurious
+    state.errorRecovery = YES;
+    
+    [self displayRecognitionError:[self getTokenNames] Exception:e];
+}
+
+-(void) displayRecognitionError:(AMutableArray *)theTokNams Exception:(RecognitionException *)e
+{
+    NSString *hdr = [self getErrorHeader:e];
+    NSString *msg = [self getErrorMessage:e TokenNames:theTokNams];
+    [self emitErrorMessage:[NSString stringWithFormat:@" %@ %@", hdr, msg]];
+}
+
+/** What error message should be generated for the various
+ *  exception types?
+ *
+ *  Not very object-oriented code, but I like having all error message
+ *  generation within one method rather than spread among all of the
+ *  exception classes. This also makes it much easier for the exception
+ *  handling because the exception classes do not have to have pointers back
+ *  to this object to access utility routines and so on. Also, changing
+ *  the message for an exception type would be difficult because you
+ *  would have to subclassing exception, but then somehow get ANTLR
+ *  to make those kinds of exception objects instead of the default.
+ *  This looks weird, but trust me--it makes the most sense in terms
+ *  of flexibility.
+ *
+ *  For grammar debugging, you will want to override this to add
+ *  more information such as the stack frame with
+ *  getRuleInvocationStack(e, this.getClass().getName()) and,
+ *  for no viable alts, the decision description and state etc...
+ *
+ *  Override this to change the message generated for one or more
+ *  exception types.
+ */
+- (NSString *)getErrorMessage:(RecognitionException *)e TokenNames:(AMutableArray *)theTokNams
+{
+    // NSString *msg = [e getMessage];
+    NSString *msg;
+    if ( [e isKindOfClass:[UnwantedTokenException class]] ) {
+        UnwantedTokenException *ute = (UnwantedTokenException *)e;
+        NSString *tokenName=@"<unknown>";
+        if ( ute.expecting == TokenTypeEOF ) {
+            tokenName = @"EOF";
+        }
+        else {
+            tokenName = (NSString *)[theTokNams objectAtIndex:ute.expecting];
+        }
+        msg = [NSString stringWithFormat:@"extraneous input %@ expecting %@", [self getTokenErrorDisplay:[ute getUnexpectedToken]],
+               tokenName];
+    }
+    else if ( [e isKindOfClass:[MissingTokenException class] ] ) {
+        MissingTokenException *mte = (MissingTokenException *)e;
+        NSString *tokenName=@"<unknown>";
+        if ( mte.expecting== TokenTypeEOF ) {
+            tokenName = @"EOF";
+        }
+        else {
+            tokenName = [theTokNams objectAtIndex:mte.expecting];
+        }
+        msg = [NSString stringWithFormat:@"missing %@ at %@", tokenName, [self getTokenErrorDisplay:(e.token)] ];
+    }
+    else if ( [e isKindOfClass:[MismatchedTokenException class]] ) {
+        MismatchedTokenException *mte = (MismatchedTokenException *)e;
+        NSString *tokenName=@"<unknown>";
+        if ( mte.expecting== TokenTypeEOF ) {
+            tokenName = @"EOF";
+        }
+        else {
+            tokenName = [theTokNams objectAtIndex:mte.expecting];
+        }
+        msg = [NSString stringWithFormat:@"mismatched input %@ expecting %@",[self getTokenErrorDisplay:(e.token)], tokenName];
+    }
+    else if ( [e isKindOfClass:[MismatchedTreeNodeException class]] ) {
+        MismatchedTreeNodeException *mtne = (MismatchedTreeNodeException *)e;
+        NSString *tokenName=@"<unknown>";
+        if ( mtne.expecting==TokenTypeEOF ) {
+            tokenName = @"EOF";
+        }
+        else {
+            tokenName = [theTokNams objectAtIndex:mtne.expecting];
+        }
+        msg = [NSString stringWithFormat:@"mismatched tree node: %@ expecting %@", mtne.node, tokenName];
+    }
+    else if ( [e isKindOfClass:[NoViableAltException class]] ) {
+        //NoViableAltException *nvae = (NoViableAltException *)e;
+        // for development, can add "decision=<<"+nvae.grammarDecisionDescription+">>"
+        // and "(decision="+nvae.decisionNumber+") and
+        // "state "+nvae.stateNumber
+        //        msg = [NSString stringWithFormat:@"no viable alternative at input %@", [self getTokenErrorDisplay:e.token]];
+        msg = [NSString stringWithFormat:@"no viable alternative decision:%d state:%d at input %@", ((NoViableAltException *)e).stateNumber, ((NoViableAltException *)e).decisionNumber, [self getTokenErrorDisplay:e.token]];
+    }
+    else if ( [e isKindOfClass:[EarlyExitException class]] ) {
+        //EarlyExitException *eee = (EarlyExitException *)e;
+        // for development, can add "(decision="+eee.decisionNumber+")"
+        msg =[NSString stringWithFormat: @"required (...)+ loop did not match anything at input ", [self getTokenErrorDisplay:e.token]];
+    }
+    else if ( [e isKindOfClass:[MismatchedSetException class]] ) {
+        MismatchedSetException *mse = (MismatchedSetException *)e;
+        msg = [NSString stringWithFormat:@"mismatched input %@ expecting set %@",
+               [self getTokenErrorDisplay:(e.token)],
+               mse.expecting];
+    }
+#pragma warning NotSet not yet implemented.
+    else if ( [e isKindOfClass:[MismatchedNotSetException class] ] ) {
+        MismatchedNotSetException *mse = (MismatchedNotSetException *)e;
+        msg = [NSString stringWithFormat:@"mismatched input %@ expecting set %@",
+               [self getTokenErrorDisplay:(e.token)],
+               mse.expecting];
+    }
+    else if ( [e isKindOfClass:[FailedPredicateException class]] ) {
+        FailedPredicateException *fpe = (FailedPredicateException *)e;
+        msg = [NSString stringWithFormat:@"rule %@ failed predicate: { %@ }?", fpe.ruleName, fpe.predicate];
+    }
+    else {
+        msg = [NSString stringWithFormat:@"Exception= %@\n", e.name];
+    }
+    return msg;
+}
+
+/** Get number of recognition errors (lexer, parser, tree parser).  Each
+ *  recognizer tracks its own number.  So parser and lexer each have
+ *  separate count.  Does not count the spurious errors found between
+ *  an error and next valid token match
+ *
+ *  See also reportError()
+ */
+- (NSInteger) getNumberOfSyntaxErrors
+{
+    return state.syntaxErrors;
+}
+
+/** What is the error header, normally line/character position information? */
+- (NSString *)getErrorHeader:(RecognitionException *)e
+{
+    return [NSString stringWithFormat:@"line %d:%d", e.line, e.charPositionInLine];
+}
+
+/** How should a token be displayed in an error message? The default
+ *  is to display just the text, but during development you might
+ *  want to have a lot of information spit out.  Override in that case
+ *  to use t.toString() (which, for CommonToken, dumps everything about
+ *  the token). This is better than forcing you to override a method in
+ *  your token objects because you don't have to go modify your lexer
+ *  so that it creates a new Java type.
+ */
+- (NSString *)getTokenErrorDisplay:(id<Token>)t
+{
+    NSString *s = t.text;
+    if ( s == nil ) {
+        if ( t.type == TokenTypeEOF ) {
+            s = @"<EOF>";
+        }
+        else {
+            s = [NSString stringWithFormat:@"<%@>", t.type];
+        }
+    }
+    s = [s stringByReplacingOccurrencesOfString:@"\n" withString:@"\\\\n"];
+    s = [s stringByReplacingOccurrencesOfString:@"\r" withString:@"\\\\r"];
+    s = [s stringByReplacingOccurrencesOfString:@"\t" withString:@"\\\\t"];
+    return [NSString stringWithFormat:@"\'%@\'", s];
+}
+                                        
+/** Override this method to change where error messages go */
+- (void) emitErrorMessage:(NSString *) msg
+{
+//    System.err.println(msg);
+    NSLog(@"%@", msg);
+}
+
+/** Recover from an error found on the input stream.  This is
+ *  for NoViableAlt and mismatched symbol exceptions.  If you enable
+ *  single token insertion and deletion, this will usually not
+ *  handle mismatched symbol exceptions but there could be a mismatched
+ *  token that the match() routine could not recover from.
+ */
+- (void)recover:(id<IntStream>)anInput Exception:(RecognitionException *)re
+{
+    if ( state.lastErrorIndex == anInput.index ) {
+        // uh oh, another error at same token index; must be a case
+        // where LT(1) is in the recovery token set so nothing is
+        // consumed; consume a single token so at least to prevent
+        // an infinite loop; this is a failsafe.
+        [anInput consume];
+    }
+    state.lastErrorIndex = anInput.index;
+    ANTLRBitSet *followSet = [self computeErrorRecoverySet];
+    [self beginResync];
+    [self consumeUntilFollow:anInput Follow:followSet];
+    [self endResync];
+}
+
+- (void) beginResync
+{
+    
+}
+
+- (void) endResync
+{
+    
+}
+                            
+/*  Compute the error recovery set for the current rule.  During
+ *  rule invocation, the parser pushes the set of tokens that can
+ *  follow that rule reference on the stack; this amounts to
+ *  computing FIRST of what follows the rule reference in the
+ *  enclosing rule. This local follow set only includes tokens
+ *  from within the rule; i.e., the FIRST computation done by
+ *  ANTLR stops at the end of a rule.
+ *
+ *  EXAMPLE
+ *
+ *  When you find a "no viable alt exception", the input is not
+ *  consistent with any of the alternatives for rule r.  The best
+ *  thing to do is to consume tokens until you see something that
+ *  can legally follow a call to r *or* any rule that called r.
+ *  You don't want the exact set of viable next tokens because the
+ *  input might just be missing a token--you might consume the
+ *  rest of the input looking for one of the missing tokens.
+ *
+ *  Consider grammar:
+ *
+ *  a : '[' b ']'
+ *    | '(' b ')'
+ *    ;
+ *  b : c '^' INT ;
+ *  c : ID
+ *    | INT
+ *    ;
+ *
+ *  At each rule invocation, the set of tokens that could follow
+ *  that rule is pushed on a stack.  Here are the various "local"
+ *  follow sets:
+ *
+ *  FOLLOW(b1_in_a) = FIRST(']') = ']'
+ *  FOLLOW(b2_in_a) = FIRST(')') = ')'
+ *  FOLLOW(c_in_b) = FIRST('^') = '^'
+ *
+ *  Upon erroneous input "[]", the call chain is
+ *
+ *  a -> b -> c
+ *
+ *  and, hence, the follow context stack is:
+ *
+ *  depth  local follow set     after call to rule
+ *    0         <EOF>                    a (from main())
+ *    1          ']'                     b
+ *    3          '^'                     c
+ *
+ *  Notice that ')' is not included, because b would have to have
+ *  been called from a different context in rule a for ')' to be
+ *  included.
+ *
+ *  For error recovery, we cannot consider FOLLOW(c)
+ *  (context-sensitive or otherwise).  We need the combined set of
+ *  all context-sensitive FOLLOW sets--the set of all tokens that
+ *  could follow any reference in the call chain.  We need to
+ *  resync to one of those tokens.  Note that FOLLOW(c)='^' and if
+ *  we resync'd to that token, we'd consume until EOF.  We need to
+ *  sync to context-sensitive FOLLOWs for a, b, and c: {']','^'}.
+ *  In this case, for input "[]", LA(1) is in this set so we would
+ *  not consume anything and after printing an error rule c would
+ *  return normally.  It would not find the required '^' though.
+ *  At this point, it gets a mismatched token error and throws an
+ *  exception (since LA(1) is not in the viable following token
+ *  set).  The rule exception handler tries to recover, but finds
+ *  the same recovery set and doesn't consume anything.  Rule b
+ *  exits normally returning to rule a.  Now it finds the ']' (and
+ *  with the successful match exits errorRecovery mode).
+ *
+ *  So, you cna see that the parser walks up call chain looking
+ *  for the token that was a member of the recovery set.
+ *
+ *  Errors are not generated in errorRecovery mode.
+ *
+ *  ANTLR's error recovery mechanism is based upon original ideas:
+ *
+ *  "Algorithms + Data Structures = Programs" by Niklaus Wirth
+ *
+ *  and
+ *
+ *  "A note on error recovery in recursive descent parsers":
+ *  http://portal.acm.org/citation.cfm?id=947902.947905
+ *
+ *  Later, Josef Grosch had some good ideas:
+ *
+ *  "Efficient and Comfortable Error Recovery in Recursive Descent
+ *  Parsers":
+ *  ftp://www.cocolab.com/products/cocktail/doca4.ps/ell.ps.zip
+ *
+ *  Like Grosch I implemented local FOLLOW sets that are combined
+ *  at run-time upon error to avoid overhead during parsing.
+ */
+- (ANTLRBitSet *) computeErrorRecoverySet
+{
+    return [self combineFollows:NO];
+}
+
+/** Compute the context-sensitive FOLLOW set for current rule.
+ *  This is set of token types that can follow a specific rule
+ *  reference given a specific call chain.  You get the set of
+ *  viable tokens that can possibly come next (lookahead depth 1)
+ *  given the current call chain.  Contrast this with the
+ *  definition of plain FOLLOW for rule r:
+ *
+ *   FOLLOW(r)={x | S=>*alpha r beta in G and x in FIRST(beta)}
+ *
+ *  where x in T* and alpha, beta in V*; T is set of terminals and
+ *  V is the set of terminals and nonterminals.  In other words,
+ *  FOLLOW(r) is the set of all tokens that can possibly follow
+ *  references to r in *any* sentential form (context).  At
+ *  runtime, however, we know precisely which context applies as
+ *  we have the call chain.  We may compute the exact (rather
+ *  than covering superset) set of following tokens.
+ *
+ *  For example, consider grammar:
+ *
+ *  stat : ID '=' expr ';'      // FOLLOW(stat)=={EOF}
+ *       | "return" expr '.'
+ *       ;
+ *  expr : atom ('+' atom)* ;   // FOLLOW(expr)=={';','.',')'}
+ *  atom : INT                  // FOLLOW(atom)=={'+',')',';','.'}
+ *       | '(' expr ')'
+ *       ;
+ *
+ *  The FOLLOW sets are all inclusive whereas context-sensitive
+ *  FOLLOW sets are precisely what could follow a rule reference.
+ *  For input input "i=(3);", here is the derivation:
+ *
+ *  stat => ID '=' expr ';'
+ *       => ID '=' atom ('+' atom)* ';'
+ *       => ID '=' '(' expr ')' ('+' atom)* ';'
+ *       => ID '=' '(' atom ')' ('+' atom)* ';'
+ *       => ID '=' '(' INT ')' ('+' atom)* ';'
+ *       => ID '=' '(' INT ')' ';'
+ *
+ *  At the "3" token, you'd have a call chain of
+ *
+ *    stat -> expr -> atom -> expr -> atom
+ *
+ *  What can follow that specific nested ref to atom?  Exactly ')'
+ *  as you can see by looking at the derivation of this specific
+ *  input.  Contrast this with the FOLLOW(atom)={'+',')',';','.'}.
+ *
+ *  You want the exact viable token set when recovering from a
+ *  token mismatch.  Upon token mismatch, if LA(1) is member of
+ *  the viable next token set, then you know there is most likely
+ *  a missing token in the input stream.  "Insert" one by just not
+ *  throwing an exception.
+ */
+- (ANTLRBitSet *)computeContextSensitiveRuleFOLLOW
+{
+    return [self combineFollows:YES];
+}
+
+// what is exact? it seems to only add sets from above on stack
+// if EOR is in set i.  When it sees a set w/o EOR, it stops adding.
+// Why would we ever want them all?  Maybe no viable alt instead of
+// mismatched token?
+- (ANTLRBitSet *)combineFollows:(BOOL) exact
+{
+    NSInteger top = state._fsp;
+    ANTLRBitSet *followSet = [[ANTLRBitSet newBitSet] retain];
+    for (int i = top; i >= 0; i--) {
+        ANTLRBitSet *localFollowSet = (ANTLRBitSet *)[state.following objectAtIndex:i];
+        /*
+         System.out.println("local follow depth "+i+"="+
+         localFollowSet.toString(getTokenNames())+")");
+         */
+        [followSet orInPlace:localFollowSet];
+        if ( exact ) {
+            // can we see end of rule?
+            if ( [localFollowSet member:TokenTypeEOR] ) {
+                // Only leave EOR in set if at top (start rule); this lets
+                // us know if have to include follow(start rule); i.e., EOF
+                if ( i > 0 ) {
+                    [followSet remove:TokenTypeEOR];
+                }
+            }
+            else { // can't see end of rule, quit
+                break;
+            }
+        }
+    }
+    return followSet;
+}
+
+/** Attempt to recover from a single missing or extra token.
+ *
+ *  EXTRA TOKEN
+ *
+ *  LA(1) is not what we are looking for.  If LA(2) has the right token,
+ *  however, then assume LA(1) is some extra spurious token.  Delete it
+ *  and LA(2) as if we were doing a normal match(), which advances the
+ *  input.
+ *
+ *  MISSING TOKEN
+ *
+ *  If current token is consistent with what could come after
+ *  ttype then it is ok to "insert" the missing token, else throw
+ *  exception For example, Input "i=(3;" is clearly missing the
+ *  ')'.  When the parser returns from the nested call to expr, it
+ *  will have call chain:
+ *
+ *    stat -> expr -> atom
+ *
+ *  and it will be trying to match the ')' at this point in the
+ *  derivation:
+ *
+ *       => ID '=' '(' INT ')' ('+' atom)* ';'
+ *                          ^
+ *  match() will see that ';' doesn't match ')' and report a
+ *  mismatched token error.  To recover, it sees that LA(1)==';'
+ *  is in the set of tokens that can follow the ')' token
+ *  reference in rule atom.  It can assume that you forgot the ')'.
+ */
+- (id<Token>)recoverFromMismatchedToken:(id<IntStream>)anInput
+                       TokenType:(NSInteger)ttype
+                          Follow:(ANTLRBitSet *)follow
+{
+    RecognitionException *e = nil;
+    // if next token is what we are looking for then "delete" this token
+    if ( [self mismatchIsUnwantedToken:anInput TokenType:ttype] ) {
+        e = [UnwantedTokenException newException:ttype Stream:anInput];
+        /*
+         System.err.println("recoverFromMismatchedToken deleting "+
+         ((TokenStream)input).LT(1)+
+         " since "+((TokenStream)input).LT(2)+" is what we want");
+         */
+        [self beginResync];
+        [anInput consume]; // simply delete extra token
+        [self endResync];
+        [self reportError:e];  // report after consuming so AW sees the token in the exception
+                         // we want to return the token we're actually matching
+        id matchedSymbol = [self getCurrentInputSymbol:anInput];
+        [anInput consume]; // move past ttype token as if all were ok
+        return matchedSymbol;
+    }
+    // can't recover with single token deletion, try insertion
+    if ( [self mismatchIsMissingToken:anInput Follow:follow] ) {
+        id<Token> inserted = [self getMissingSymbol:anInput Exception:e TokenType:ttype Follow:follow];
+        e = [MissingTokenException newException:ttype Stream:anInput With:inserted];
+        [self reportError:e];  // report after inserting so AW sees the token in the exception
+        return inserted;
+    }
+    // even that didn't work; must throw the exception
+    e = [MismatchedTokenException newException:ttype Stream:anInput];
+    @throw e;
+}
+
+/** Not currently used */
+-(id) recoverFromMismatchedSet:(id<IntStream>)anInput
+                     Exception:(RecognitionException *)e
+                        Follow:(ANTLRBitSet *) follow
+{
+    if ( [self mismatchIsMissingToken:anInput Follow:follow] ) {
+        // System.out.println("missing token");
+        [self reportError:e];
+        // we don't know how to conjure up a token for sets yet
+        return [self getMissingSymbol:anInput Exception:e TokenType:TokenTypeInvalid Follow:follow];
+    }
+    // TODO do single token deletion like above for Token mismatch
+    @throw e;
+}
+
+/** Match needs to return the current input symbol, which gets put
+ *  into the label for the associated token ref; e.g., x=ID.  Token
+ *  and tree parsers need to return different objects. Rather than test
+ *  for input stream type or change the IntStream interface, I use
+ *  a simple method to ask the recognizer to tell me what the current
+ *  input symbol is.
+ * 
+ *  This is ignored for lexers.
+ */
+- (id) getCurrentInputSymbol:(id<IntStream>)anInput
+{
+    return nil;
+}
+
+/** Conjure up a missing token during error recovery.
+ *
+ *  The recognizer attempts to recover from single missing
+ *  symbols. But, actions might refer to that missing symbol.
+ *  For example, x=ID {f($x);}. The action clearly assumes
+ *  that there has been an identifier matched previously and that
+ *  $x points at that token. If that token is missing, but
+ *  the next token in the stream is what we want we assume that
+ *  this token is missing and we keep going. Because we
+ *  have to return some token to replace the missing token,
+ *  we have to conjure one up. This method gives the user control
+ *  over the tokens returned for missing tokens. Mostly,
+ *  you will want to create something special for identifier
+ *  tokens. For literals such as '{' and ',', the default
+ *  action in the parser or tree parser works. It simply creates
+ *  a CommonToken of the appropriate type. The text will be the token.
+ *  If you change what tokens must be created by the lexer,
+ *  override this method to create the appropriate tokens.
+ */
+- (id)getMissingSymbol:(id<IntStream>)anInput
+             Exception:(RecognitionException *)e
+             TokenType:(NSInteger)expectedTokenType
+                Follow:(ANTLRBitSet *)follow
+{
+    return nil;
+}
+
+
+-(void) consumeUntilTType:(id<IntStream>)anInput TokenType:(NSInteger)tokenType
+{
+    //System.out.println("consumeUntil "+tokenType);
+    int ttype = [anInput LA:1];
+    while (ttype != TokenTypeEOF && ttype != tokenType) {
+        [anInput consume];
+        ttype = [anInput LA:1];
+    }
+}
+
+/** Consume tokens until one matches the given token set */
+-(void) consumeUntilFollow:(id<IntStream>)anInput Follow:(ANTLRBitSet *)set
+{
+    //System.out.println("consumeUntil("+set.toString(getTokenNames())+")");
+    int ttype = [anInput LA:1];
+    while (ttype != TokenTypeEOF && ![set member:ttype] ) {
+        //System.out.println("consume during recover LA(1)="+getTokenNames()[input.LA(1)]);
+        [anInput consume];
+        ttype = [anInput LA:1];
+    }
+}
+
+/** Push a rule's follow set using our own hardcoded stack */
+- (void)pushFollow:(ANTLRBitSet *)fset
+{
+    if ( (state._fsp +1) >= [state.following count] ) {
+        //        AMutableArray *f = [AMutableArray arrayWithCapacity:[[state.following] count]*2];
+        //        System.arraycopy(state.following, 0, f, 0, state.following.length);
+        //        state.following = f;
+        [state.following addObject:fset];
+        [fset retain];
+        state._fsp++;
+    }
+    else {
+        [state.following replaceObjectAtIndex:++state._fsp withObject:fset];
+    }
+}
+
+- (ANTLRBitSet *)popFollow
+{
+    ANTLRBitSet *fset;
+
+    if ( state._fsp >= 0 && [state.following count] > 0 ) {
+        fset = [state.following objectAtIndex:state._fsp--];
+        [state.following removeLastObject];
+        return fset;
+    }
+    else {
+        NSLog( @"Attempted to pop a follow when none exists on the stack\n" );
+    }
+    return nil;
+}
+
+/** Return List<String> of the rules in your parser instance
+ *  leading up to a call to this method.  You could override if
+ *  you want more details such as the file/line info of where
+ *  in the parser java code a rule is invoked.
+ *
+ *  This is very useful for error messages and for context-sensitive
+ *  error recovery.
+ */
+- (AMutableArray *)getRuleInvocationStack
+{
+    NSString *parserClassName = [[self className] retain];
+    return [self getRuleInvocationStack:[RecognitionException newException] Recognizer:parserClassName];
+}
+
+/** A more general version of getRuleInvocationStack where you can
+ *  pass in, for example, a RecognitionException to get it's rule
+ *  stack trace.  This routine is shared with all recognizers, hence,
+ *  static.
+ *
+ *  TODO: move to a utility class or something; weird having lexer call this
+ */
+- (AMutableArray *)getRuleInvocationStack:(RecognitionException *)e
+                                Recognizer:(NSString *)recognizerClassName
+{
+    // char *name;
+    AMutableArray *rules = [[AMutableArray arrayWithCapacity:20] retain];
+    NSArray *stack = [e callStackSymbols];
+    int i = 0;
+    for (i = [stack count]-1; i >= 0; i--) {
+        NSString *t = [stack objectAtIndex:i];
+        // NSLog(@"stack %d = %@\n", i, t);
+        if ( [t commonPrefixWithString:@"org.antlr.runtime." options:NSLiteralSearch] ) {
+            // id aClass = objc_getClass( [t UTF8String] );
+            continue; // skip support code such as this method
+        }
+        if ( [t isEqualTo:NEXT_TOKEN_RULE_NAME] ) {
+            // name = sel_getName(method_getName(method));
+            // NSString *aMethod = [NSString stringWithFormat:@"%s", name];
+            continue;
+        }
+        if ( ![t isEqualTo:recognizerClassName] ) {
+            // name = class_getName( [t UTF8String] );
+            continue; // must not be part of this parser
+        }
+        [rules addObject:t];
+    }
+#ifdef DONTUSEYET
+    StackTraceElement[] stack = e.getStackTrace();
+    int i = 0;
+    for (i=stack.length-1; i>=0; i--) {
+        StackTraceElement t = stack[i];
+        if ( [t getClassName().startsWith("org.antlr.runtime.") ) {
+            continue; // skip support code such as this method
+        }
+              if ( [[t getMethodName] equals:NEXT_TOKEN_RULE_NAME] ) {
+            continue;
+        }
+              if ( ![[t getClassName] equals:recognizerClassName] ) {
+            continue; // must not be part of this parser
+        }
+              [rules addObject:[t getMethodName]];
+    }
+#endif
+    [stack release];
+    return rules;
+}
+
+- (NSInteger) getBacktrackingLevel
+{
+    return [state getBacktracking];
+}
+      
+- (void) setBacktrackingLevel:(NSInteger)level
+{
+    [state setBacktracking:level];
+}
+      
+        /** Used to print out token names like ID during debugging and
+ *  error reporting.  The generated parsers implement a method
+ *  that overrides this to point to their String[] tokenNames.
+ */
+- (NSArray *)getTokenNames
+{
+    return tokenNames;
+}
+
+/** For debugging and other purposes, might want the grammar name.
+ *  Have ANTLR generate an implementation for this method.
+ */
+- (NSString *)getGrammarFileName
+{
+    return grammarFileName;
+}
+
+- (NSString *)getSourceName
+{
+    return nil;
+}
+
+/** A convenience method for use most often with template rewrites.
+ *  Convert a List<Token> to List<String>
+ */
+- (AMutableArray *)toStrings:(AMutableArray *)tokens
+{
+    if ( tokens == nil )
+        return nil;
+    AMutableArray *strings = [AMutableArray arrayWithCapacity:[tokens count]];
+    id object;
+    NSInteger i = 0;
+    for (object in tokens) {
+        [strings addObject:[object text]];
+        i++;
+    }
+    return strings;
+}
+
+/** Given a rule number and a start token index number, return
+ *  ANTLR_MEMO_RULE_UNKNOWN if the rule has not parsed input starting from
+ *  start index.  If this rule has parsed input starting from the
+ *  start index before, then return where the rule stopped parsing.
+ *  It returns the index of the last token matched by the rule.
+ *
+ *  For now we use a hashtable and just the slow Object-based one.
+ *  Later, we can make a special one for ints and also one that
+ *  tosses out data after we commit past input position i.
+ */
+- (NSInteger)getRuleMemoization:(NSInteger)ruleIndex StartIndex:(NSInteger)ruleStartIndex
+{
+    ACNumber *stopIndexI;
+    HashRule *aHashRule;
+    if ( (aHashRule = [state.ruleMemo objectAtIndex:ruleIndex]) == nil ) {
+        aHashRule = [HashRule newHashRuleWithLen:17];
+        [state.ruleMemo insertObject:aHashRule atIndex:ruleIndex];
+    }
+    stopIndexI = [aHashRule getRuleMemoStopIndex:ruleStartIndex];
+    if ( stopIndexI == nil ) {
+        return ANTLR_MEMO_RULE_UNKNOWN;
+    }
+    return [stopIndexI integerValue];
+}
+
+/** Has this rule already parsed input at the current index in the
+ *  input stream?  Return the stop token index or MEMO_RULE_UNKNOWN.
+ *  If we attempted but failed to parse properly before, return
+ *  MEMO_RULE_FAILED.
+ *
+ *  This method has a side-effect: if we have seen this input for
+ *  this rule and successfully parsed before, then seek ahead to
+ *  1 past the stop token matched for this rule last time.
+ */
+- (BOOL)alreadyParsedRule:(id<IntStream>)anInput RuleIndex:(NSInteger)ruleIndex
+{
+    NSInteger aStopIndex = [self getRuleMemoization:ruleIndex StartIndex:anInput.index];
+    if ( aStopIndex == ANTLR_MEMO_RULE_UNKNOWN ) {
+        // NSLog(@"rule %d not yet encountered\n", ruleIndex);
+        return NO;
+    }
+    if ( aStopIndex == ANTLR_MEMO_RULE_FAILED ) {
+        if (debug) NSLog(@"rule %d will never succeed\n", ruleIndex);
+        state.failed = YES;
+    }
+    else {
+        if (debug) NSLog(@"seen rule %d before; skipping ahead to %d failed = %@\n", ruleIndex, aStopIndex+1, state.failed?@"YES":@"NO");
+        [anInput seek:(aStopIndex+1)]; // jump to one past stop token
+    }
+    return YES;
+}
+      
+/** Record whether or not this rule parsed the input at this position
+ *  successfully.  Use a standard java hashtable for now.
+ */
+- (void)memoize:(id<IntStream>)anInput
+      RuleIndex:(NSInteger)ruleIndex
+     StartIndex:(NSInteger)ruleStartIndex
+{
+    RuleStack *aRuleStack;
+    NSInteger stopTokenIndex;
+
+    aRuleStack = state.ruleMemo;
+    stopTokenIndex = (state.failed ? ANTLR_MEMO_RULE_FAILED : (anInput.index-1));
+    if ( aRuleStack == nil ) {
+        if (debug) NSLog(@"!!!!!!!!! memo array is nil for %@", [self getGrammarFileName]);
+        return;
+    }
+    if ( ruleIndex >= [aRuleStack length] ) {
+        if (debug) NSLog(@"!!!!!!!!! memo size is %d, but rule index is %d", [state.ruleMemo length], ruleIndex);
+        return;
+    }
+    if ( [aRuleStack objectAtIndex:ruleIndex] != nil ) {
+        [aRuleStack putHashRuleAtRuleIndex:ruleIndex StartIndex:ruleStartIndex StopIndex:stopTokenIndex];
+    }
+    return;
+}
+   
+/** return how many rule/input-index pairs there are in total.
+ *  TODO: this includes synpreds. :(
+ */
+- (NSInteger)getRuleMemoizationCacheSize
+{
+    RuleStack *aRuleStack;
+    HashRule *aHashRule;
+
+    int aCnt = 0;
+    aRuleStack = state.ruleMemo;
+    for (NSUInteger i = 0; aRuleStack != nil && i < [aRuleStack length]; i++) {
+        aHashRule = [aRuleStack objectAtIndex:i];
+        if ( aHashRule != nil ) {
+            aCnt += [aHashRule count]; // how many input indexes are recorded?
+        }
+    }
+    return aCnt;
+}
+
+#pragma warning Have to fix traceIn and traceOut.
+- (void)traceIn:(NSString *)ruleName Index:(NSInteger)ruleIndex Object:(id)inputSymbol
+{
+    NSLog(@"enter %@ %@", ruleName, inputSymbol);
+    if ( state.backtracking > 0 ) {
+        NSLog(@" backtracking=%s", ((state.backtracking==YES)?"YES":"NO"));
+    }
+    NSLog(@"\n");
+}
+
+- (void)traceOut:(NSString *)ruleName Index:(NSInteger)ruleIndex Object:(id)inputSymbol
+{
+    NSLog(@"exit %@ -- %@", ruleName, inputSymbol);
+    if ( state.backtracking > 0 ) {
+        NSLog(@" backtracking=%s %s", state.backtracking?"YES":"NO", state.failed ? "failed":"succeeded");
+    }
+    NSLog(@"\n");
+}
+
+
+// call a syntactic predicate methods using its selector. this way we can support arbitrary synpreds.
+- (BOOL) evaluateSyntacticPredicate:(SEL)synpredFragment // stream:(id<IntStream>)input
+{
+    id<IntStream> input;
+
+    state.backtracking++;
+    // input = state.token.input;
+    input = self.input;
+    int start = [input mark];
+    @try {
+        [self performSelector:synpredFragment];
+    }
+    @catch (RecognitionException *re) {
+        NSLog(@"impossible synpred: %@", re.name);
+    }
+    BOOL success = (state.failed == NO);
+    [input rewind:start];
+    state.backtracking--;
+    state.failed = NO;
+    return success;
+}
+              
+@end
+                               
diff --git a/runtime/ObjC/Framework/BaseStack.h b/runtime/ObjC/Framework/BaseStack.h
new file mode 100644
index 0000000..7c92536
--- /dev/null
+++ b/runtime/ObjC/Framework/BaseStack.h
@@ -0,0 +1,66 @@
+//
+//  BaseRecognizer.m
+//  ANTLR
+//
+//  Created by Alan Condit on 6/16/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "PtrBuffer.h"
+
+//#define GLOBAL_SCOPE       0
+//#define LOCAL_SCOPE        1
+#define HASHSIZE         101
+#define HBUFSIZE      0x2000
+
+@interface BaseStack : PtrBuffer {
+	//RuleStack *fNext;
+    // TStringPool *fPool;
+    NSInteger LastHash;
+}
+
+//@property (copy) RuleStack *fNext;
+@property (getter=getLastHash, setter=setLastHash:) NSInteger LastHash;
+
+// Contruction/Destruction
++ (BaseStack *)newBaseStack;
++ (BaseStack *)newBaseStackWithLen:(NSInteger)cnt;
+- (id)init;
+- (id)initWithLen:(NSInteger)cnt;
+- (void)dealloc;
+
+// Instance Methods
+- (id) copyWithZone:(NSZone *)aZone;
+
+- (NSUInteger)count;
+- (NSUInteger)size;
+/* clear -- reinitialize the maplist array */
+
+- (NSInteger)getLastHash;
+- (void)setLastHash:(NSInteger)aVal;
+
+@end
diff --git a/runtime/ObjC/Framework/BaseStack.m b/runtime/ObjC/Framework/BaseStack.m
new file mode 100644
index 0000000..c622060
--- /dev/null
+++ b/runtime/ObjC/Framework/BaseStack.m
@@ -0,0 +1,131 @@
+//
+//  BaseRecognizer.m
+//  ANTLR
+//
+//  Created by Alan Condit on 6/16/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#define SUCCESS (0)
+#define FAILURE (-1)
+
+#import "BaseStack.h"
+#import "Tree.h"
+
+/*
+ * Start of BaseStack
+ */
+@implementation BaseStack
+
+@synthesize LastHash;
+
++(BaseStack *)newBaseStack
+{
+    return [[BaseStack alloc] init];
+}
+
++(BaseStack *)newBaseStackWithLen:(NSInteger)cnt
+{
+    return [[BaseStack alloc] initWithLen:cnt];
+}
+
+-(id)init
+{
+	self = [super initWithLen:HASHSIZE];
+	if ( self != nil ) {
+	}
+    return( self );
+}
+
+-(id)initWithLen:(NSInteger)cnt
+{
+	self = [super initWithLen:cnt];
+    if ( self != nil ) {
+	}
+    return( self );
+}
+
+- (void)dealloc
+{
+#ifdef DEBUG_DEALLOC
+    NSLog( @"called dealloc in BaseStack" );
+#endif
+	[super dealloc];
+}
+
+- (id) copyWithZone:(NSZone *)aZone
+{
+    BaseStack *copy;
+    
+    copy = [super copyWithZone:aZone];
+    return copy;
+}
+
+- (NSUInteger)count
+{
+    NSUInteger aCnt = 0;
+    
+    for (int i = 0; i < BuffSize; i++) {
+        if (ptrBuffer[i] != nil) {
+            aCnt++;
+        }
+    }
+    return aCnt;
+}
+
+- (NSUInteger) size
+{
+    return BuffSize;
+}
+
+-(void)deleteBaseStack:(BaseStack *)np
+{
+    id tmp, rtmp;
+    NSInteger idx;
+    
+    if ( self.fNext != nil ) {
+        for( idx = 0; idx < BuffSize; idx++ ) {
+            tmp = (LinkBase *)ptrBuffer[idx];
+            while ( tmp ) {
+                rtmp = tmp;
+                tmp = [tmp getfNext];
+                [rtmp release];
+            }
+        }
+    }
+}
+
+- (NSInteger)getLastHash
+{
+    return LastHash;
+}
+
+- (void)setLastHash:(NSInteger)aVal
+{
+    LastHash = aVal;
+}
+
+@end
diff --git a/runtime/ObjC/Framework/BaseTree.h b/runtime/ObjC/Framework/BaseTree.h
new file mode 100755
index 0000000..07df439
--- /dev/null
+++ b/runtime/ObjC/Framework/BaseTree.h
@@ -0,0 +1,210 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+#import "Tree.h"
+#import "CommonToken.h"
+#import "AMutableArray.h"
+
+@protocol BaseTree <Tree>
+
++ (id<BaseTree>) INVALID_NODE;
+
++ (id<BaseTree>) newTree;
++ (id<BaseTree>) newTree:(id<BaseTree>)node;
+
+- (id<BaseTree>) init;
+- (id<BaseTree>) initWith:(id<BaseTree>)node;
+
+- (id<BaseTree>) getChild:(NSUInteger)i;
+- (AMutableArray *)children;
+- (void) setChildren:(AMutableArray *)anArray;
+- (id<BaseTree>)getFirstChildWithType:(NSInteger)type;
+- (NSUInteger) getChildCount;
+
+// Add t as a child to this node.  If t is null, do nothing.  If t
+//  is nil, add all children of t to this' children.
+
+- (void) addChild:(id<BaseTree>) tree;
+- (void) addChildren:(NSArray *) theChildren;
+//- (void) removeAllChildren;
+
+- (void) setChild:(NSInteger) i With:(id<BaseTree>)t;
+- (id) deleteChild:(NSInteger) i;
+- (AMutableArray *) createChildrenList;
+- (void) replaceChildrenFrom:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id) t;
+// Indicates the node is a nil node but may still have children, meaning
+// the tree is a flat list.
+
+- (BOOL) isNil;
+- (NSInteger) getTokenStartIndex;
+- (void) setTokenStartIndex:(NSInteger) index;
+- (NSInteger) getTokenStopIndex;
+- (void) setTokenStopIndex:(NSInteger) index;
+
+- (void) freshenParentAndChildIndexes;
+- (void) freshenParentAndChildIndexes:(NSInteger) offset;
+- (void) sanityCheckParentAndChildIndexes;
+- (void) sanityCheckParentAndChildIndexes:(id<BaseTree>) parent At:(NSInteger) i;
+
+- (NSInteger) getChildIndex;
+- (void) setChildIndex:(NSInteger)i;
+
+- (id<BaseTree>)getAncestor:(NSInteger)ttype;
+- (AMutableArray *)getAncestors;
+
+#pragma mark Copying
+- (id) copyWithZone:(NSZone *)aZone;	// the children themselves are not copied here!
+- (id) deepCopy;					// performs a deepCopyWithZone: with the default zone
+- (id) deepCopyWithZone:(NSZone *)aZone;
+
+#pragma mark Tree Parser support
+- (NSInteger)type;
+- (NSString *)text;
+// In case we don't have a token payload, what is the line for errors?
+- (NSUInteger)line;
+- (NSUInteger)charPositionInLine;
+
+
+#pragma mark Informational
+- (NSString *) treeDescription;
+- (NSString *) description;
+
+- (NSString *) toString;
+- (NSString *) toStringTree;
+
+@property (retain) AMutableArray *children;
+@property (retain) NSException *anException;
+
+@end
+
+@interface BaseTree : NSObject <BaseTree>
+{
+	__strong AMutableArray *children;
+    __strong NSException *anException;
+}
+
++ (id<BaseTree>) INVALID_NODE;
++ (id<BaseTree>) newTree;
++ (id<BaseTree>) newTree:(id<BaseTree>)node;
+         
+- (id<BaseTree>) init;
+- (id<BaseTree>) initWith:(id<BaseTree>)node;
+
+- (id<BaseTree>) getChild:(NSUInteger)i;
+- (AMutableArray *)children;
+- (void) setChildren:(AMutableArray *)anArray;
+- (id<BaseTree>)getFirstChildWithType:(NSInteger)type;
+- (NSUInteger) getChildCount;
+
+//- (void) removeAllChildren;
+
+// Add t as a child to this node.  If t is null, do nothing.  If t
+//  is nil, add all children of t to this' children.
+
+- (void) addChild:(id<BaseTree>) tree;
+- (void) addChildren:(NSArray *) theChildren;
+
+- (void) setChild:(NSUInteger) i With:(id<BaseTree>)t;
+- (id) deleteChild:(NSUInteger) idx;
+- (AMutableArray *) createChildrenList;
+- (void) replaceChildrenFrom:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id) t;
+// Indicates the node is a nil node but may still have children, meaning
+	// the tree is a flat list.
+
+- (BOOL) isNil;
+- (NSInteger) getTokenStartIndex;
+- (void) setTokenStartIndex:(NSInteger) index;
+- (NSInteger) getTokenStopIndex;
+- (void) setTokenStopIndex:(NSInteger) index;
+
+- (void) freshenParentAndChildIndexes;
+- (void) freshenParentAndChildIndexes:(NSInteger) offset;
+- (void) sanityCheckParentAndChildIndexes;
+- (void) sanityCheckParentAndChildIndexes:(id<BaseTree>)parent At:(NSInteger) i;
+
+- (NSInteger) getChildIndex;
+- (void) setChildIndex:(NSInteger)i;
+
+- (BOOL) hasAncestor:(NSInteger) ttype;
+- (id<BaseTree>)getAncestor:(NSInteger)ttype;
+- (AMutableArray *)getAncestors;
+
+- (id) copyWithZone:(NSZone *)aZone;
+- (id) deepCopy;					// performs a deepCopyWithZone: with the default zone
+- (id) deepCopyWithZone:(NSZone *)aZone;
+
+	// Return a token type; needed for tree parsing
+- (NSInteger)type;
+- (NSString *)text;
+
+	// In case we don't have a token payload, what is the line for errors?
+- (NSUInteger)line;
+- (NSUInteger)charPositionInLine;
+- (void) setCharPositionInLine:(NSUInteger)pos;
+
+- (NSString *) treeDescription;
+- (NSString *) description;
+- (NSString *) toString;
+- (NSString *) toStringTree;
+
+@property (retain) AMutableArray *children;
+@property (retain) NSException *anException;
+
+@end
+
+@interface TreeNavigationNode : BaseTree {
+}
+- (id) init;
+- (id) copyWithZone:(NSZone *)aZone;
+@end
+
+@interface TreeNavigationNodeDown : TreeNavigationNode {
+}
++ (TreeNavigationNodeDown *) getNavigationNodeDown;
+- (id) init;
+- (NSInteger) tokenType;
+- (NSString *) description;
+@end
+
+@interface TreeNavigationNodeUp : TreeNavigationNode {
+}
++ (TreeNavigationNodeUp *) getNavigationNodeUp;
+- (id) init;
+- (NSInteger) tokenType;
+- (NSString *) description;
+@end
+
+@interface TreeNavigationNodeEOF : TreeNavigationNode {
+}
++ (TreeNavigationNodeEOF *) getNavigationNodeEOF;
+- (id) init;
+- (NSInteger) tokenType;
+- (NSString *) description;
+@end
+
+extern TreeNavigationNodeDown *navigationNodeDown;
+extern TreeNavigationNodeUp *navigationNodeUp;
+extern TreeNavigationNodeEOF *navigationNodeEOF;
diff --git a/runtime/ObjC/Framework/BaseTree.m b/runtime/ObjC/Framework/BaseTree.m
new file mode 100755
index 0000000..2e8448f
--- /dev/null
+++ b/runtime/ObjC/Framework/BaseTree.m
@@ -0,0 +1,621 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+#import "BaseTree.h"
+#import "BaseTreeAdaptor.h"
+#import "Token.h"
+// TODO: this shouldn't be here...but needed for invalidNode
+#import "AMutableArray.h"
+#import "CommonTree.h"
+#import "RuntimeException.h"
+#import "ANTLRError.h"
+
+#pragma mark - Navigation Nodes
+TreeNavigationNodeDown *navigationNodeDown = nil;
+TreeNavigationNodeUp *navigationNodeUp = nil;
+TreeNavigationNodeEOF *navigationNodeEOF = nil;
+
+
+@implementation BaseTree
+
+static id<BaseTree> invalidNode = nil;
+
+#pragma mark Tree protocol conformance
+
++ (id<BaseTree>) INVALID_NODE
+{
+	if ( invalidNode == nil ) {
+		invalidNode = [[CommonTree alloc] initWithTokenType:TokenTypeInvalid];
+	}
+	return invalidNode;
+}
+
++ (id<BaseTree>) invalidNode
+{
+	if ( invalidNode == nil ) {
+		invalidNode = [[CommonTree alloc] initWithTokenType:TokenTypeInvalid];
+	}
+	return invalidNode;
+}
+
++ newTree
+{
+    return [[BaseTree alloc] init];
+}
+
+/** Create a new node from an existing node does nothing for BaseTree
+ *  as there are no fields other than the children list, which cannot
+ *  be copied as the children are not considered part of this node. 
+ */
++ newTree:(id<BaseTree>) node
+{
+    return [[BaseTree alloc] initWith:(id<BaseTree>) node];
+}
+
+- (id) init
+{
+    self = [super init];
+    if ( self != nil ) {
+        children = nil;
+        return self;
+    }
+    return nil;
+}
+
+- (id) initWith:(id<BaseTree>)node
+{
+    self = [super init];
+    if ( self != nil ) {
+        // children = [[AMutableArray arrayWithCapacity:5] retain];
+        // [children addObject:node];
+        [self addChild:node];
+        return self;
+    }
+    return nil;
+}
+
+- (void) dealloc
+{
+#ifdef DEBUG_DEALLOC
+    NSLog( @"called dealloc in BaseTree %x", (NSInteger)self );
+#endif
+	if ( children ) {
+#ifdef DEBUG_DEALLOC
+        NSLog( @"called dealloc children in BaseTree" );
+#endif
+        [children release];
+    }
+	[super dealloc];
+}
+
+- (id<BaseTree>) getChild:(NSUInteger)i
+{
+    if ( children == nil || i >= [children count] ) {
+        return nil;
+    }
+    return (id<BaseTree>)[children objectAtIndex:i];
+}
+
+/** Get the children internal List; note that if you directly mess with
+ *  the list, do so at your own risk.
+ */
+- (AMutableArray *) children
+{
+    return children;
+}
+
+- (void) setChildren:(AMutableArray *)anArray
+{
+    if ( children != anArray ) {
+        if ( children ) [children release];
+        if ( anArray ) [anArray retain];
+    }
+    children = anArray;
+}
+
+- (id<BaseTree>) getFirstChildWithType:(NSInteger) aType
+{
+    for (NSUInteger i = 0; children != nil && i < [children count]; i++) {
+        id<BaseTree> t = (id<BaseTree>) [children objectAtIndex:i];
+        if ( t.type == aType ) {
+            return t;
+        }
+    }	
+    return nil;
+}
+
+- (NSUInteger) getChildCount
+{
+    if ( children == nil ) {
+        return 0;
+    }
+    return [children count];
+}
+
+/** Add t as child of this node.
+ *
+ *  Warning: if t has no children, but child does
+ *  and child isNil then this routine moves children to t via
+ *  t.children = child.children; i.e., without copying the array.
+ */
+- (void) addChild:(id<BaseTree>) t
+{
+    //System.out.println("add child "+t.toStringTree()+" "+self.toStringTree());
+    //System.out.println("existing children: "+children);
+    if ( t == nil ) {
+        return; // do nothing upon addChild(nil)
+    }
+    if ( self == (BaseTree *)t )
+        @throw [IllegalArgumentException newException:@"BaseTree Can't add self to self as child"];        
+    id<BaseTree> childTree = (id<BaseTree>) t;
+    if ( [childTree isNil] ) { // t is an empty node possibly with children
+        if ( children != nil && children == childTree.children ) {
+            @throw [RuntimeException newException:@"BaseTree add child list to itself"];
+        }
+        // just add all of childTree's children to this
+        if ( childTree.children != nil ) {
+            if ( children != nil ) { // must copy, this has children already
+                int n = [childTree.children count];
+                for ( int i = 0; i < n; i++) {
+                    id<BaseTree> c = (id<BaseTree>)[childTree.children objectAtIndex:i];
+                    [children addObject:c];
+                    // handle double-link stuff for each child of nil root
+                    [c setParent:(id<BaseTree>)self];
+                    [c setChildIndex:[children count]-1];
+                }
+            }
+            else {
+                // no children for this but t has children; just set pointer
+                // call general freshener routine
+                children = childTree.children;
+                [self freshenParentAndChildIndexes];
+            }
+        }
+    }
+    else { // child is not nil (don't care about children)
+        if ( children == nil ) {
+            children = [[AMutableArray arrayWithCapacity:5] retain]; // create children list on demand
+        }
+        [children addObject:t];
+        [childTree setParent:(id<BaseTree>)self];
+        [childTree setChildIndex:[children count]-1];
+    }
+    // System.out.println("now children are: "+children);
+}
+
+/** Add all elements of kids list as children of this node */
+- (void) addChildren:(AMutableArray *) kids
+{
+    for (NSUInteger i = 0; i < [kids count]; i++) {
+        id<BaseTree> t = (id<BaseTree>) [kids objectAtIndex:i];
+        [self addChild:t];
+    }
+}
+
+- (void) setChild:(NSUInteger) i With:(id<BaseTree>)t
+{
+    if ( t == nil ) {
+        return;
+    }
+    if ( [t isNil] ) {
+        @throw [IllegalArgumentException newException:@"BaseTree Can't set single child to a list"];        
+    }
+    if ( children == nil ) {
+        children = [[AMutableArray arrayWithCapacity:5] retain];
+    }
+    if ([children count] > i ) {
+        [children replaceObjectAtIndex:i withObject:t];
+    }
+    else {
+        [children insertObject:t atIndex:i];
+    }
+    [t setParent:(id<BaseTree>)self];
+    [t setChildIndex:i];
+}
+
+- (id) deleteChild:(NSUInteger) idx
+{
+    if ( children == nil ) {
+        return nil;
+    }
+    id<BaseTree> killed = (id<BaseTree>)[children objectAtIndex:idx];
+    [children removeObjectAtIndex:idx];
+    // walk rest and decrement their child indexes
+    [self freshenParentAndChildIndexes:idx];
+    return killed;
+}
+
+/** Delete children from start to stop and replace with t even if t is
+ *  a list (nil-root Tree).  num of children can increase or decrease.
+ *  For huge child lists, inserting children can force walking rest of
+ *  children to set their childindex; could be slow.
+ */
+- (void) replaceChildrenFrom:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id) t
+{
+    /*
+     System.out.println("replaceChildren "+startChildIndex+", "+stopChildIndex+
+     " with "+((BaseTree)t).toStringTree());
+     System.out.println("in="+toStringTree());
+     */
+    if ( children == nil ) {
+        @throw [IllegalArgumentException newException:@"BaseTree Invalid Indexes; no children in list"];        
+    }
+    int replacingHowMany = stopChildIndex - startChildIndex + 1;
+    int replacingWithHowMany;
+    id<BaseTree> newTree = (id<BaseTree>) t;
+    AMutableArray *newChildren = nil;
+    // normalize to a list of children to add: newChildren
+    if ( [newTree isNil] ) {
+        newChildren = newTree.children;
+    }
+    else {
+        newChildren = [AMutableArray arrayWithCapacity:5];
+        [newChildren addObject:newTree];
+    }
+    replacingWithHowMany = [newChildren count];
+    int numNewChildren = [newChildren count];
+    int delta = replacingHowMany - replacingWithHowMany;
+    // if same number of nodes, do direct replace
+    if ( delta == 0 ) {
+        int j = 0; // index into new children
+        for (int i=startChildIndex; i <= stopChildIndex; i++) {
+            id<BaseTree> child = (id<BaseTree>)[newChildren objectAtIndex:j];
+            [children replaceObjectAtIndex:i withObject:(id)child];
+            [child setParent:(id<BaseTree>)self];
+            [child setChildIndex:i];
+            j++;
+        }
+    }
+    else if ( delta > 0 ) { // fewer new nodes than there were
+                            // set children and then delete extra
+        for (int j = 0; j < numNewChildren; j++) {
+            [children replaceObjectAtIndex:startChildIndex+j withObject:[newChildren objectAtIndex:j]];
+        }
+        int indexToDelete = startChildIndex+numNewChildren;
+        for (int c=indexToDelete; c<=stopChildIndex; c++) {
+            // delete same index, shifting everybody down each time
+            [children removeObjectAtIndex:indexToDelete];
+        }
+        [self freshenParentAndChildIndexes:startChildIndex];
+    }
+    else { // more new nodes than were there before
+           // fill in as many children as we can (replacingHowMany) w/o moving data
+        for (int j=0; j<replacingHowMany; j++) {
+            [children replaceObjectAtIndex:startChildIndex+j withObject:[newChildren objectAtIndex:j]];
+        }
+        //        int numToInsert = replacingWithHowMany-replacingHowMany;
+        for (int j=replacingHowMany; j<replacingWithHowMany; j++) {
+            [children insertObject:[newChildren objectAtIndex:j] atIndex:startChildIndex+j];
+        }
+        [self freshenParentAndChildIndexes:startChildIndex];
+    }
+    //System.out.println("out="+toStringTree());
+}
+
+/** Override in a subclass to change the impl of children list */
+- (AMutableArray *) createChildrenList
+{
+    return [AMutableArray arrayWithCapacity:5];
+}
+
+- (BOOL) isNil
+{
+    return NO;
+}
+
+/** Set the parent and child index values for all child of t */
+- (void) freshenParentAndChildIndexes
+{
+    [self freshenParentAndChildIndexes:0];
+}
+               
+- (void) freshenParentAndChildIndexes:(NSInteger) offset
+{
+    int n = [self getChildCount];
+    for (int i = offset; i < n; i++) {
+        id<BaseTree> child = (id<BaseTree>)[self getChild:i];
+        [child setChildIndex:i];
+        [child setParent:(id<BaseTree>)self];
+    }
+}
+               
+- (void) sanityCheckParentAndChildIndexes
+{
+    [self sanityCheckParentAndChildIndexes:nil At:-1];
+}
+               
+- (void) sanityCheckParentAndChildIndexes:(id<BaseTree>)aParent At:(NSInteger) i
+{
+    if ( aParent != [self getParent] ) {
+        @throw [IllegalStateException newException:[NSString stringWithFormat:@"parents don't match; expected %s found %s", aParent, [self getParent]]];
+    }
+    if ( i != [self getChildIndex] ) {
+        @throw [IllegalStateException newException:[NSString stringWithFormat:@"child indexes don't match; expected %d found %d", i, [self getChildIndex]]];
+    }
+    int n = [self getChildCount];
+    for (int c = 0; c < n; c++) {
+        id<BaseTree> child = (id<BaseTree>)[self getChild:c];
+        [child sanityCheckParentAndChildIndexes:(id<BaseTree>)self At:c];
+    }
+}
+               
+/**  What is the smallest token index (indexing from 0) for this node
+ *   and its children?
+ */
+- (NSInteger) getTokenStartIndex
+{
+    return 0;
+}
+
+- (void) setTokenStartIndex:(NSInteger) anIndex
+{
+}
+
+/**  What is the largest token index (indexing from 0) for this node
+ *   and its children?
+ */
+- (NSInteger) getTokenStopIndex
+{
+    return 0;
+}
+
+- (void) setTokenStopIndex:(NSInteger) anIndex
+{
+}
+
+- (id<BaseTree>) dupNode
+{
+    return nil;
+}
+
+
+/** BaseTree doesn't track child indexes. */
+- (NSInteger) getChildIndex
+{
+    return 0;
+}
+
+- (void) setChildIndex:(NSInteger) anIndex
+{
+}
+
+/** BaseTree doesn't track parent pointers. */
+- (id<BaseTree>) getParent
+{
+    return nil;
+}
+
+- (void) setParent:(id<BaseTree>) t
+{
+}
+
+/** Walk upwards looking for ancestor with this token type. */
+- (BOOL) hasAncestor:(NSInteger) ttype
+{
+    return([self getAncestor:ttype] != nil);
+}
+
+/** Walk upwards and get first ancestor with this token type. */
+- (id<BaseTree>) getAncestor:(NSInteger) ttype
+{
+    id<BaseTree> t = (id<BaseTree>)self;
+    t = (id<BaseTree>)[t getParent];
+    while ( t != nil ) {
+        if ( t.type == ttype )
+            return t;
+        t = (id<BaseTree>)[t getParent];
+    }
+    return nil;
+}
+
+/** Return a list of all ancestors of this node.  The first node of
+ *  list is the root and the last is the parent of this node.
+ */
+- (AMutableArray *)getAncestors
+{
+    if ( [self getParent] == nil )
+        return nil;
+    AMutableArray *ancestors = [AMutableArray arrayWithCapacity:5];
+    id<BaseTree> t = (id<BaseTree>)self;
+    t = (id<BaseTree>)[t getParent];
+    while ( t != nil ) {
+        [ancestors insertObject:t atIndex:0]; // insert at start
+        t = (id<BaseTree>)[t getParent];
+    }
+    return ancestors;
+}
+
+- (NSInteger)type
+{
+    return TokenTypeInvalid;
+}
+
+- (NSString *)text
+{
+    return nil;
+}
+
+- (NSUInteger)line
+{
+    return 0;
+}
+
+- (NSUInteger)charPositionInLine
+{
+    return 0;
+}
+
+- (void) setCharPositionInLine:(NSUInteger) pos
+{
+}
+
+#pragma mark Copying
+     
+     // the children themselves are not copied here!
+- (id) copyWithZone:(NSZone *)aZone
+{
+    id<BaseTree> theCopy = [[[self class] allocWithZone:aZone] init];
+    [theCopy addChildren:self.children];
+    return theCopy;
+}
+     
+- (id) deepCopy 					// performs a deepCopyWithZone: with the default zone
+{
+    return [self deepCopyWithZone:NULL];
+}
+     
+- (id) deepCopyWithZone:(NSZone *)aZone
+{
+    id<BaseTree> theCopy = [self copyWithZone:aZone];
+        
+    if ( [theCopy.children count] )
+        [theCopy.children removeAllObjects];
+    AMutableArray *childrenCopy = theCopy.children;
+    for (id loopItem in children) {
+        id<BaseTree> childCopy = [loopItem deepCopyWithZone:aZone];
+        [theCopy addChild:childCopy];
+    }
+    if ( childrenCopy ) [childrenCopy release];
+    return theCopy;
+}
+     
+- (NSString *) treeDescription
+{
+    if ( children == nil || [children count] == 0 ) {
+        return [self description];
+    }
+    NSMutableString *buf = [NSMutableString stringWithCapacity:[children count]];
+    if ( ![self isNil] ) {
+        [buf appendString:@"("];
+        [buf appendString:[self toString]];
+        [buf appendString:@" "];
+    }
+    for (int i = 0; children != nil && i < [children count]; i++) {
+        id<BaseTree> t = (id<BaseTree>)[children objectAtIndex:i];
+        if ( i > 0 ) {
+            [buf appendString:@" "];
+        }
+        [buf appendString:[(id<BaseTree>)t toStringTree]];
+    }
+    if ( ![self isNil] ) {
+        [buf appendString:@")"];
+    }
+    return buf;
+}
+
+/** Print out a whole tree not just a node */
+- (NSString *) toStringTree
+{
+    return [self treeDescription];
+}
+
+- (NSString *) description
+{
+    return nil;
+}
+
+/** Override to say how a node (not a tree) should look as text */
+- (NSString *) toString
+{
+    return nil;
+}
+
+@synthesize children;
+@synthesize anException;
+
+@end
+
+#pragma mark -
+
+@implementation TreeNavigationNode
+- (id)init
+{
+    self = (TreeNavigationNode *)[super init];
+    return self;
+}
+
+- (id) copyWithZone:(NSZone *)aZone
+{
+	return nil;
+}
+@end
+
+@implementation TreeNavigationNodeDown
++ (TreeNavigationNodeDown *) getNavigationNodeDown
+{
+    if ( navigationNodeDown == nil )
+        navigationNodeDown = [[TreeNavigationNodeDown alloc] init];
+    return navigationNodeDown;
+}
+
+- (id)init
+{
+    self = [super init];
+    return self;
+}
+
+- (NSInteger) tokenType { return TokenTypeDOWN; }
+- (NSString *) description { return @"DOWN"; }
+@end
+
+@implementation TreeNavigationNodeUp
++ (TreeNavigationNodeUp *) getNavigationNodeUp
+{
+    if ( navigationNodeUp == nil )
+        navigationNodeUp = [[TreeNavigationNodeUp alloc] init];
+    return navigationNodeUp;
+}
+
+
+- (id)init
+{
+    self = [super init];
+    return self;
+}
+
+- (NSInteger) tokenType { return TokenTypeUP; }
+- (NSString *) description { return @"UP"; }
+@end
+
+@implementation TreeNavigationNodeEOF
++ (TreeNavigationNodeEOF *) getNavigationNodeEOF
+{
+    if ( navigationNodeEOF == nil )
+        navigationNodeEOF = [[TreeNavigationNodeEOF alloc] init];
+    return navigationNodeEOF;
+}
+
+- (id)init
+{
+    self = [super init];
+    return self;
+}
+
+- (NSInteger) tokenType { return TokenTypeEOF; }
+- (NSString *) description { return @"EOF"; }
+
+@end
+
diff --git a/runtime/ObjC/Framework/BaseTreeAdaptor.h b/runtime/ObjC/Framework/BaseTreeAdaptor.h
new file mode 100644
index 0000000..c0d8442
--- /dev/null
+++ b/runtime/ObjC/Framework/BaseTreeAdaptor.h
@@ -0,0 +1,182 @@
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "TreeAdaptor.h"
+#import "CommonErrorNode.h"
+#import "UniqueIDMap.h"
+
+@interface BaseTreeAdaptor : NSObject <TreeAdaptor, NSCopying> {
+    UniqueIDMap *treeToUniqueIDMap;
+	NSInteger uniqueNodeID;
+}
+
+- (id) init;
+
+- (id) copyWithZone:(NSZone *)aZone;
+
+- (id) emptyNode;
+
+- (id) createNil;
+
+/** create tree node that holds the start and stop tokens associated
+ *  with an error.
+ *
+ *  If you specify your own kind of tree nodes, you will likely have to
+ *  override this method. CommonTree returns Token.INVALID_TOKEN_TYPE
+ *  if no token payload but you might have to set token type for diff
+ *  node type.
+ *
+ *  You don't have to subclass CommonErrorNode; you will likely need to
+ *  subclass your own tree node class to avoid class cast exception.
+ */
+- (id) errorNode:(id<TokenStream>)anInput
+            From:(id<Token>)startToken
+              To:(id<Token>)stopToken
+       Exception:(NSException *) e;
+
+- (BOOL) isNil:(id<BaseTree>) aTree;
+
+- (id<BaseTree>)dupTree:(id<BaseTree>)aTree;
+
+/** This is generic in the sense that it will work with any kind of
+ *  tree (not just Tree interface).  It invokes the adaptor routines
+ *  not the tree node routines to do the construction.  
+ */
+- (id<BaseTree>)dupTree:(id<BaseTree>)aTree Parent:(id<BaseTree>)parent;
+- (id<BaseTree>)dupNode:(id<BaseTree>)aNode;
+/** Add a child to the tree t.  If child is a flat tree (a list), make all
+ *  in list children of t.  Warning: if t has no children, but child does
+ *  and child isNil then you can decide it is ok to move children to t via
+ *  t.children = child.children; i.e., without copying the array.  Just
+ *  make sure that this is consistent with have the user will build
+ *  ASTs.
+ */
+- (void) addChild:(id<BaseTree>)aChild toTree:(id<BaseTree>)aTree;
+
+/** If oldRoot is a nil root, just copy or move the children to newRoot.
+ *  If not a nil root, make oldRoot a child of newRoot.
+ *
+ *    old=^(nil a b c), new=r yields ^(r a b c)
+ *    old=^(a b c), new=r yields ^(r ^(a b c))
+ *
+ *  If newRoot is a nil-rooted single child tree, use the single
+ *  child as the new root node.
+ *
+ *    old=^(nil a b c), new=^(nil r) yields ^(r a b c)
+ *    old=^(a b c), new=^(nil r) yields ^(r ^(a b c))
+ *
+ *  If oldRoot was null, it's ok, just return newRoot (even if isNil).
+ *
+ *    old=null, new=r yields r
+ *    old=null, new=^(nil r) yields ^(nil r)
+ *
+ *  Return newRoot.  Throw an exception if newRoot is not a
+ *  simple node or nil root with a single child node--it must be a root
+ *  node.  If newRoot is ^(nil x) return x as newRoot.
+ *
+ *  Be advised that it's ok for newRoot to point at oldRoot's
+ *  children; i.e., you don't have to copy the list.  We are
+ *  constructing these nodes so we should have this control for
+ *  efficiency.
+ */
+- (id<BaseTree>)becomeRoot:(id<BaseTree>)aNewRoot old:(id<BaseTree>)oldRoot;
+
+/** Transform ^(nil x) to x and nil to null */
+- (id<BaseTree>)rulePostProcessing:(id<BaseTree>)aRoot;
+
+- (id<BaseTree>)becomeRootfromToken:(id<Token>)aNewRoot old:(id<BaseTree>)oldRoot;
+
+- (id<BaseTree>) create:(id<Token>)payload;
+- (id<BaseTree>) createTree:(NSInteger)aTType FromToken:(id<Token>)aFromToken;
+- (id<BaseTree>) createTree:(NSInteger)aTType FromToken:(id<Token>)aFromToken Text:(NSString *)theText;
+- (id<BaseTree>) createTree:(NSInteger)aTType Text:(NSString *)theText;
+
+- (NSInteger) getType:(id<BaseTree>)aTree;
+
+- (void) setType:(id<BaseTree>)aTree Type:(NSInteger)type;
+
+- (id<Token>)getToken:(CommonTree *)t;
+
+- (NSString *)getText:(CommonTree *)aTree;
+
+- (void) setText:(id<BaseTree>)aTree Text:(NSString *)theText;
+
+- (id<BaseTree>) getChild:(id<BaseTree>)aTree At:(NSInteger)i;
+
+- (void) setChild:(id<BaseTree>)aTree At:(NSInteger)index Child:(id<BaseTree>)aChild;
+
+- (id<BaseTree>) deleteChild:(id<BaseTree>)aTree Index:(NSInteger)index;
+
+- (NSInteger) getChildCount:(id<BaseTree>)aTree;
+
+- (id<BaseTree>) getParent:(id<BaseTree>) t;
+
+- (void) setParent:(id<BaseTree>)t With:(id<BaseTree>) parent;
+
+/** What index is this node in the child list? Range: 0..n-1
+ *  If your node type doesn't handle this, it's ok but the tree rewrites
+ *  in tree parsers need this functionality.
+ */
+- (NSInteger) getChildIndex:(id)t;
+- (void) setChildIndex:(id)t With:(NSInteger)index;
+
+- (void) replaceChildren:(id)parent From:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id)t;
+
+- (NSInteger) getUniqueID:(id<BaseTree>)node;
+
+#ifdef DONTUSENOMO
+- (NSInteger) getUniqueID;
+
+- (void) setUniqueNodeID:(NSInteger)aUniqueNodeID;
+
+- (UniqueIDMap *)getTreeToUniqueIDMap;
+
+- (void) setTreeToUniqueIDMap:(UniqueIDMap *)aMapNode;
+#endif
+
+/** Tell me how to create a token for use with imaginary token nodes.
+ *  For example, there is probably no input symbol associated with imaginary
+ *  token DECL, but you need to create it as a payload or whatever for
+ *  the DECL node as in ^(DECL type ID).
+ *
+ *  This is a variant of createToken where the new token is derived from
+ *  an actual real input token.  Typically this is for converting '{'
+ *  tokens to BLOCK etc...  You'll see
+ *
+ *    r : lc='{' ID+ '}' -> ^(BLOCK[$lc] ID+) ;
+ *
+ *  If you care what the token payload objects' type is, you should
+ *  override this method and any other createToken variant.
+ */
+- (id<Token>)createToken:(NSInteger)aTType Text:(NSString *)theText;
+
+- (id<Token>)createToken:(id<Token>)aFromToken;
+
+@property (retain) UniqueIDMap *treeToUniqueIDMap;
+@property (assign) NSInteger uniqueNodeID;
+
+@end
diff --git a/runtime/ObjC/Framework/BaseTreeAdaptor.m b/runtime/ObjC/Framework/BaseTreeAdaptor.m
new file mode 100644
index 0000000..1a2a3c3
--- /dev/null
+++ b/runtime/ObjC/Framework/BaseTreeAdaptor.m
@@ -0,0 +1,429 @@
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import "BaseTreeAdaptor.h"
+#import "RuntimeException.h"
+#import "UniqueIDMap.h"
+#import "MapElement.h"
+#import "CommonTree.h"
+
+@implementation BaseTreeAdaptor
+
+@synthesize treeToUniqueIDMap;
+@synthesize uniqueNodeID;
+
++ (id<Tree>) newEmptyTree
+{
+    return [[CommonTree alloc] init];
+}
+
+- (id) init
+{
+    self = [super init];
+    if ( self != nil ) {
+    }
+    return self;
+}
+
+- (id) copyWithZone:(NSZone *)aZone
+{
+    BaseTreeAdaptor *copy;
+    
+    copy = [[[self class] alloc] init];
+    if (treeToUniqueIDMap)
+        copy.treeToUniqueIDMap = [treeToUniqueIDMap copyWithZone:aZone];
+    copy.uniqueNodeID = uniqueNodeID;
+    return copy;
+}
+    
+
+- (id) createNil
+{
+    return [CommonTree newTreeWithToken:nil];
+}
+
+- (id) emptyNode
+{
+    return [CommonTree newTreeWithToken:nil];
+}
+
+/** create tree node that holds the start and stop tokens associated
+ *  with an error.
+ *
+ *  If you specify your own kind of tree nodes, you will likely have to
+ *  override this method. CommonTree returns Token.INVALID_TOKEN_TYPE
+ *  if no token payload but you might have to set token type for diff
+ *  node type.
+ *
+ *  You don't have to subclass CommonErrorNode; you will likely need to
+ *  subclass your own tree node class to avoid class cast exception.
+ */
+- (id) errorNode:(id<TokenStream>)anInput
+            From:(id<Token>)startToken
+              To:(id<Token>)stopToken
+       Exception:(RecognitionException *) e;
+{
+    //System.out.println("returning error node '"+t+"' @index="+anInput.index());
+    return [CommonErrorNode newCommonErrorNode:anInput
+                                                    From:startToken
+                                                      To:stopToken
+                                               Exception:e];
+}
+
+- (BOOL) isNil:(id) tree
+{
+    return [(id)tree isNil];
+}
+
+- (id)dupTree:(id)tree
+{
+    return [self dupTree:(id)tree Parent:nil];
+}
+
+/** This is generic in the sense that it will work with any kind of
+ *  tree (not just Tree interface).  It invokes the adaptor routines
+ *  not the tree node routines to do the construction.  
+ */
+- (id)dupTree:(id)t Parent:(id)parent
+{
+    if ( t==nil ) {
+        return nil;
+    }
+    id newTree = [self dupNode:t];
+    // ensure new subtree root has parent/child index set
+    [self setChildIndex:newTree With:[self getChildIndex:t]]; // same index in new tree
+    [self setParent:newTree With:parent];
+    NSInteger n = [self getChildCount:t];
+    for (NSInteger i = 0; i < n; i++) {
+        id child = [self getChild:t At:i];
+        id newSubTree = [self dupTree:child Parent:t];
+        [self addChild:newSubTree toTree:newTree];
+    }
+    return newTree;
+}
+
+- (id)dupNode:(id)aNode
+{
+    return aNode; // override for better results :>)
+}
+/** Add a child to the tree t.  If child is a flat tree (a list), make all
+ *  in list children of t.  Warning: if t has no children, but child does
+ *  and child isNil then you can decide it is ok to move children to t via
+ *  t.children = child.children; i.e., without copying the array.  Just
+ *  make sure that this is consistent with have the user will build
+ *  ASTs.
+ */
+- (void) addChild:(id)child toTree:(id)t
+{
+    if ( t != nil && child != nil ) {
+        [(id)t addChild:child];
+    }
+}
+
+/** If oldRoot is a nil root, just copy or move the children to newRoot.
+ *  If not a nil root, make oldRoot a child of newRoot.
+ *
+ *    old=^(nil a b c), new=r yields ^(r a b c)
+ *    old=^(a b c), new=r yields ^(r ^(a b c))
+ *
+ *  If newRoot is a nil-rooted single child tree, use the single
+ *  child as the new root node.
+ *
+ *    old=^(nil a b c), new=^(nil r) yields ^(r a b c)
+ *    old=^(a b c), new=^(nil r) yields ^(r ^(a b c))
+ *
+ *  If oldRoot was null, it's ok, just return newRoot (even if isNil).
+ *
+ *    old=null, new=r yields r
+ *    old=null, new=^(nil r) yields ^(nil r)
+ *
+ *  Return newRoot.  Throw an exception if newRoot is not a
+ *  simple node or nil root with a single child node--it must be a root
+ *  node.  If newRoot is ^(nil x) return x as newRoot.
+ *
+ *  Be advised that it's ok for newRoot to point at oldRoot's
+ *  children; i.e., you don't have to copy the list.  We are
+ *  constructing these nodes so we should have this control for
+ *  efficiency.
+ */
+- (id)becomeRoot:(id)newRoot old:(id)oldRoot
+{
+    if ( oldRoot == nil ) {
+        return newRoot;
+    }
+    //System.out.println("becomeroot new "+newRoot.toString()+" old "+oldRoot);
+    id newRootTree = (id)newRoot;
+    id oldRootTree = (id)oldRoot;
+    // handle ^(nil real-node)
+    if ( [newRootTree isNil] ) {
+        NSInteger nc = [newRootTree getChildCount];
+        if ( nc == 1 ) newRootTree = [(id)newRootTree getChild:0];
+        else if ( nc > 1 ) {
+            // TODO: make tree run time exceptions hierarchy
+            @throw [RuntimeException newException:NSStringFromClass([self class]) reason:@"more than one node as root (TODO: make exception hierarchy)"];
+        }
+    }
+    // add oldRoot to newRoot; addChild takes care of case where oldRoot
+    // is a flat list (i.e., nil-rooted tree).  All children of oldRoot
+    // are added to newRoot.
+    [newRootTree addChild:oldRootTree];
+    return newRootTree;
+}
+
+/** Transform ^(nil x) to x and nil to null */
+- (id)rulePostProcessing:(id)root
+{
+    //System.out.println("rulePostProcessing: "+((Tree)root).toStringTree());
+    id r = (id)root;
+    if ( r != nil && [r isNil] ) {
+        if ( [r getChildCount] == 0 ) {
+            r = nil;
+        }
+        else if ( [r getChildCount] == 1 ) {
+            r = (id)[r getChild:0];
+            // whoever invokes rule will set parent and child index
+            [r setParent:nil];
+            [r setChildIndex:-1];
+        }
+    }
+    return r;
+}
+
+- (id)becomeRootfromToken:(id<Token>)newRoot old:(id)oldRoot
+{
+    return [self becomeRoot:(id)[self create:newRoot] old:oldRoot];
+}
+
+- (id) create:(id<Token>)aToken
+{
+    return [CommonTree newTreeWithToken:aToken];
+}
+
+- (id)createTree:(NSInteger)tokenType FromToken:(id<Token>)fromToken
+{
+    fromToken = [self createToken:fromToken];
+    //((ClassicToken)fromToken).setType(tokenType);
+    [fromToken setType:tokenType];
+    id t = [self create:fromToken];
+    return t;
+}
+
+- (id)createTree:(NSInteger)tokenType FromToken:(id<Token>)fromToken Text:(NSString *)text
+{
+    if (fromToken == nil)
+        return [self createTree:tokenType Text:text];
+    fromToken = [self createToken:fromToken];
+    [fromToken setType:tokenType];
+    [fromToken setText:text];
+    id t = [self create:fromToken];
+    return t;
+}
+
+- (id)createTree:(NSInteger)tokenType Text:(NSString *)text
+{
+    id<Token> fromToken = [self createToken:tokenType Text:text];
+    id t = (id)[self create:fromToken];
+    return t;
+}
+
+- (NSInteger) getType:(CommonTree *) t
+{
+    return [t type];
+}
+
+- (void) setType:(id)t Type:(NSInteger)type
+{
+    @throw [NoSuchElementException newException:@"don't know enough about Tree node"];
+}
+
+/** What is the Token associated with this node?  If
+ *  you are not using CommonTree, then you must
+ *  override this in your own adaptor.
+ */
+- (id<Token>) getToken:(CommonTree *) t
+{
+    if ( [t isKindOfClass:[CommonTree class]] ) {
+        return [t getToken];
+    }
+    return nil; // no idea what to do
+}
+
+- (NSString *)getText:(CommonTree *)t
+{
+    return [t text];
+}
+
+- (void) setText:(id)t Text:(NSString *)text
+{
+    @throw [NoSuchElementException newException:@"don't know enough about Tree node"];
+}
+
+- (id) getChild:(id)t At:(NSInteger)index
+{
+    return [(id)t getChild:index ];
+}
+
+- (void) setChild:(id)t At:(NSInteger)index Child:(id)child
+{
+    [(id)t setChild:index With:(id)child];
+}
+
+- (id) deleteChild:(id)t Index:(NSInteger)index
+{
+    return [(id)t deleteChild:index];
+}
+
+- (NSInteger) getChildCount:(id)t
+{
+    return [(id)t getChildCount];
+}
+
+- (id<BaseTree>) getParent:(id<BaseTree>) t
+{
+    if ( t == nil )
+        return nil;
+    return (id<BaseTree>)[t getParent];
+}
+
+- (void) setParent:(id<BaseTree>)t With:(id<BaseTree>) parent
+{
+    if ( t != nil )
+        [(id<BaseTree>) t setParent:(id<BaseTree>)parent];
+}
+
+/** What index is this node in the child list? Range: 0..n-1
+ *  If your node type doesn't handle this, it's ok but the tree rewrites
+ *  in tree parsers need this functionality.
+ */
+- (NSInteger) getChildIndex:(id)t
+{
+    return ((CommonTree *)t).childIndex;
+}
+
+- (void) setChildIndex:(id)t With:(NSInteger)index
+{
+    ((CommonTree *)t).childIndex = index;
+}
+
+- (void) replaceChildren:(id)parent From:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id)t
+{
+    return;
+}
+
+- (NSInteger) getUniqueID:(id)node
+{
+    if ( treeToUniqueIDMap == nil ) {
+        treeToUniqueIDMap = [UniqueIDMap newUniqueIDMap];
+    }
+    ACNumber *prevID = [treeToUniqueIDMap getNode:node];
+    if ( prevID != nil ) {
+        return [prevID integerValue];
+    }
+    NSInteger anID = uniqueNodeID;
+    // MapElement *aMapNode = [MapElement newMapElementWithObj1:[ACNumber numberWithInteger:anID] Obj2:node];
+    [treeToUniqueIDMap putID:[ACNumber numberWithInteger:anID] Node:node];
+    uniqueNodeID++;
+    return anID;
+    // GCC makes these nonunique:
+    // return System.identityHashCode(node);
+}
+
+/** Tell me how to create a token for use with imaginary token nodes.
+ *  For example, there is probably no input symbol associated with imaginary
+ *  token DECL, but you need to create it as a payload or whatever for
+ *  the DECL node as in ^(DECL type ID).
+ *
+ *  If you care what the token payload objects' type is, you should
+ *  override this method and any other createToken variant.
+ */
+- (id<Token>) createToken:(NSInteger)aTType Text:(NSString *)text
+{
+    return nil;
+}
+
+/** Tell me how to create a token for use with imaginary token nodes.
+ *  For example, there is probably no input symbol associated with imaginary
+ *  token DECL, but you need to create it as a payload or whatever for
+ *  the DECL node as in ^(DECL type ID).
+ *
+ *  This is a variant of createToken where the new token is derived from
+ *  an actual real input token.  Typically this is for converting '{'
+ *  tokens to BLOCK etc...  You'll see
+ *
+ *    r : lc='{' ID+ '}' -> ^(BLOCK[$lc] ID+) ;
+ *
+ *  If you care what the token payload objects' type is, you should
+ *  override this method and any other createToken variant.
+ */
+- (id<Token>) createToken:(id<Token>) fromToken
+{
+    return nil;
+}
+
+/** Track start/stop token for subtree root created for a rule.
+ *  Only works with Tree nodes.  For rules that match nothing,
+ *  seems like this will yield start=i and stop=i-1 in a nil node.
+ *  Might be useful info so I'll not force to be i..i.
+ */
+- (void) setTokenBoundaries:(id)aTree From:(id<Token>)startToken To:(id<Token>)stopToken
+{
+    return;
+}
+
+- (NSInteger) getTokenStartIndex:(id)aTree
+{
+    return -1;
+}
+
+- (NSInteger) getTokenStopIndex:(id)aTree
+{
+    return -1;
+}
+
+#ifdef DONTUSENOMO
+- (NSInteger)getUniqueID
+{
+    return uniqueNodeID;
+}
+
+- (void) setUniqueNodeID:(NSInteger)aUniqueNodeID
+{
+    uniqueNodeID = aUniqueNodeID;
+}
+
+- (UniqueIDMap *)getTreeToUniqueIDMap
+{
+    return treeToUniqueIDMap;
+}
+
+- (void) setTreeToUniqueIDMap:(UniqueIDMap *)aMapListNode
+{
+    treeToUniqueIDMap = aMapListNode;
+}
+
+#endif
+
+@end
diff --git a/runtime/ObjC/Framework/BufferedTokenStream.h b/runtime/ObjC/Framework/BufferedTokenStream.h
new file mode 100644
index 0000000..ca8c4fb
--- /dev/null
+++ b/runtime/ObjC/Framework/BufferedTokenStream.h
@@ -0,0 +1,102 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "TokenStream.h"
+#import "TokenSource.h"
+#import "ANTLRBitSet.h"
+#import "CommonToken.h"
+#import "AMutableArray.h"
+
+@interface BufferedTokenStream : NSObject <TokenStream> 
+{
+__strong id<TokenSource> tokenSource;
+    
+    /** Record every single token pulled from the source so we can reproduce
+     *  chunks of it later.  The buffer in LookaheadStream overlaps sometimes
+     *  as its moving window moves through the input.  This list captures
+     *  everything so we can access complete input text.
+     */
+__strong AMutableArray *tokens;
+    
+    /** Track the last mark() call result value for use in rewind(). */
+NSInteger lastMarker;
+    
+    /** The index into the tokens list of the current token (next token
+     *  to consume).  tokens[index] should be LT(1).  index=-1 indicates need
+     *  to initialize with first token.  The ctor doesn't get a token.
+     *  First call to LT(1) or whatever gets the first token and sets index=0;
+     */
+NSInteger index;
+    
+NSInteger range; // how deep have we gone?
+    
+}
+@property (retain, getter=getTokenSource,setter=setTokenSource:) id<TokenSource> tokenSource;
+@property (retain, getter=getTokens,setter=setTokens:) AMutableArray *tokens;
+@property (assign, getter=getLastMarker,setter=setLastMarker:) NSInteger lastMarker;
+@property (assign) NSInteger index;
+@property (assign, getter=getRange,setter=setRange:) NSInteger range;
+
++ (BufferedTokenStream *) newBufferedTokenStream;
++ (BufferedTokenStream *) newBufferedTokenStreamWith:(id<TokenSource>)aSource;
+- (id) initWithTokenSource:(id<TokenSource>)aSource;
+- (void)dealloc;
+- (id) copyWithZone:(NSZone *)aZone;
+- (NSUInteger)charPositionInLine;
+- (NSUInteger)line;
+- (NSInteger) getRange;
+- (void) setRange:(NSInteger)anInt;
+- (NSInteger) mark;
+- (void) release:(NSInteger) marker;
+- (void) rewind:(NSInteger) marker;
+- (void) rewind;
+- (void) reset;
+- (void) seek:(NSInteger) anIndex;
+- (NSInteger) size;
+- (void) consume;
+- (void) sync:(NSInteger) i;
+- (void) fetch:(NSInteger) n;
+- (id<Token>) getToken:(NSInteger) i;
+- (AMutableArray *)getFrom:(NSInteger)startIndex To:(NSInteger) stopIndex;
+- (NSInteger) LA:(NSInteger)i;
+- (id<Token>) LB:(NSInteger) k;
+- (id<Token>) LT:(NSInteger) k;
+- (void) setup;
+- (id<TokenSource>) getTokenSource;
+- (void) setTokenSource:(id<TokenSource>) aTokenSource;
+- (AMutableArray *)getTokens;
+- (NSString *) getSourceName;
+- (AMutableArray *)getTokensFrom:(NSInteger)startIndex To:(NSInteger)stopIndex;
+- (AMutableArray *)getTokensFrom:(NSInteger)startIndex To:(NSInteger)stopIndex With:(ANTLRBitSet *)types;
+- (AMutableArray *)getTokensFrom:(NSInteger)startIndex To:(NSInteger)stopIndex WithList:(AMutableArray *)types;
+- (AMutableArray *)getTokensFrom:(NSInteger)startIndex To:(NSInteger)stopIndex WithType:(NSInteger)ttype;
+- (NSString *) toString;
+- (NSString *) toStringFromStart:(NSInteger)startIndex ToEnd:(NSInteger)stopIndex;
+- (NSString *) toStringFromToken:(id<Token>)startIndex ToToken:(id<Token>)stopIndex;
+- (void) fill;
+
+@end
diff --git a/runtime/ObjC/Framework/BufferedTokenStream.m b/runtime/ObjC/Framework/BufferedTokenStream.m
new file mode 100644
index 0000000..17ed16e
--- /dev/null
+++ b/runtime/ObjC/Framework/BufferedTokenStream.m
@@ -0,0 +1,392 @@
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import "BufferedTokenStream.h"
+#import "TokenSource.h"
+#import "CommonTreeAdaptor.h"
+#import "RuntimeException.h"
+
+extern NSInteger debug;
+
+@implementation BufferedTokenStream
+
+@synthesize tokenSource;
+@synthesize tokens;
+@synthesize lastMarker;
+@synthesize index;
+@synthesize range;
+
++ (BufferedTokenStream *) newBufferedTokenStream
+{
+    return [[BufferedTokenStream alloc] init];
+}
+
++ (BufferedTokenStream *) newBufferedTokenStreamWith:(id<TokenSource>)aSource
+{
+    return [[BufferedTokenStream alloc] initWithTokenSource:aSource];
+}
+
+- (BufferedTokenStream *) init
+{
+	if ((self = [super init]) != nil)
+	{
+        tokenSource = nil;
+        tokens = [[AMutableArray arrayWithCapacity:1000] retain];
+        index = -1;
+        range = -1;
+	}
+	return self;
+}
+
+-(id) initWithTokenSource:(id<TokenSource>)aSource
+{
+	if ((self = [super init]) != nil)
+	{
+        tokenSource = [aSource retain];
+        tokens = [[AMutableArray arrayWithCapacity:1000] retain];
+        index = -1;
+        range = -1;
+	}
+	return self;
+}
+
+- (id) copyWithZone:(NSZone *)aZone
+{
+    BufferedTokenStream *copy;
+    
+    copy = [[[self class] allocWithZone:aZone] init];
+    copy.tokenSource = self.tokenSource;
+    if ( self.tokens )
+        copy.tokens = [tokens copyWithZone:aZone];
+    copy.lastMarker = self.lastMarker;
+    copy.index = self.index;
+    copy.range = self.range;
+    return copy;
+}
+
+- (void)dealloc
+{
+#ifdef DEBUG_DEALLOC
+    NSLog( @"called dealloc in BufferedTokenStream" );
+#endif
+    if ( tokens ) [tokens release];
+    if ( tokenSource ) [tokenSource release];
+	[super dealloc];
+}
+
+- (NSUInteger)line
+{
+    return ((CommonToken *)[tokens objectAtIndex:index]).line;
+}
+
+- (NSUInteger)charPositionInLine
+{
+    return ((CommonToken *)[tokens objectAtIndex:index]).charPositionInLine;
+}
+
+- (id<TokenSource>) getTokenSource
+{
+    return tokenSource;
+}
+
+- (NSInteger) getRange
+{
+    return range;
+}
+
+- (void) setRange:(NSInteger)anInt
+{
+    range = anInt;
+}
+
+- (NSInteger) mark
+{
+    if ( index == -1 ) {
+        [self setup];
+//        [self fill];
+    }
+    lastMarker = self.index;
+    return lastMarker;
+}
+
+- (void) release:(NSInteger) marker
+{
+    // no resources to release
+}
+
+- (void) rewind:(NSInteger) marker
+{
+    [self seek:marker];
+}
+
+- (void) rewind
+{
+    [self seek:lastMarker];
+}
+
+- (void) reset
+{
+    index = 0;
+    lastMarker = 0;
+}
+
+- (void) seek:(NSInteger) anIndex
+{
+    index = anIndex;
+}
+
+- (NSInteger) size
+{
+    return [tokens count];
+}
+
+/** Move the input pointer to the next incoming token.  The stream
+ *  must become active with LT(1) available.  consume() simply
+ *  moves the input pointer so that LT(1) points at the next
+ *  input symbol. Consume at least one token.
+ *
+ *  Walk past any token not on the channel the parser is listening to.
+ */
+- (void) consume
+{
+    if ( index == -1 ) {
+        [self setup];
+//        [self fill];
+    }
+    index++;
+    [self sync:index];
+}
+
+/** Make sure index i in tokens has a token. */
+- (void) sync:(NSInteger) i
+{
+    // how many more elements we need?
+    NSInteger n = (i - [tokens count]) + 1;
+    if (debug > 1) NSLog(@"[self sync:%d] needs %d\n", i, n);
+    if ( n > 0 )
+        [self fetch:n];
+}
+
+/** add n elements to buffer */
+- (void) fetch:(NSInteger)n
+{
+    for (NSInteger i=1; i <= n; i++) {
+        id<Token> t = [tokenSource nextToken];
+        [t setTokenIndex:[tokens count]];
+        if (debug > 1) NSLog(@"adding %@ at index %d\n", [t text], [tokens count]);
+        [tokens addObject:t];
+        if ( t.type == TokenTypeEOF )
+            break;
+    }
+}
+
+- (id<Token>) getToken:(NSInteger) i
+{
+    if ( i < 0 || i >= [tokens count] ) {
+        @throw [NoSuchElementException newException:[NSString stringWithFormat:@"token index %d out of range 0..%d", i, [tokens count]-1]];
+    }
+    return [tokens objectAtIndex:i];
+}
+
+/** Get all tokens from start..stop inclusively */
+- (AMutableArray *)getFrom:(NSInteger)startIndex To:(NSInteger)stopIndex
+{
+    if ( startIndex < 0 || stopIndex < 0 )
+        return nil;
+    if ( index == -1 ) {
+        [self setup];
+//        [self fill];
+    }
+    AMutableArray *subset = [AMutableArray arrayWithCapacity:5];
+    if ( stopIndex >= [tokens count] )
+        stopIndex = [tokens count]-1;
+    for (NSInteger i = startIndex; i <= stopIndex; i++) {
+        id<Token>t = [tokens objectAtIndex:i];
+        if ( t.type == TokenTypeEOF )
+            break;
+        [subset addObject:t];
+    }
+    return subset;
+}
+
+- (NSInteger) LA:(NSInteger)i
+{
+    return [[self LT:i] type];
+}
+
+- (id<Token>) LB:(NSInteger)k
+{
+    if ( (index - k) < 0 )
+        return nil;
+    return [tokens objectAtIndex:(index-k)];
+}
+
+- (id<Token>) LT:(NSInteger)k
+{
+    if ( index == -1 ) {
+        [self setup];
+//        [self fill];
+    }
+    if ( k == 0 )
+        return nil;
+    if ( k < 0 )
+        return [self LB:-k];
+    
+    NSInteger i = index + k - 1;
+    [self sync:i];
+    if ( i >= [tokens count] ) { // return EOF token
+                                // EOF must be last token
+        return [tokens objectAtIndex:([tokens count]-1)];
+    }
+    if ( i > range )
+        range = i; 		
+    return [tokens objectAtIndex:i];
+}
+
+- (void) setup
+{
+    [self sync:0];
+    index = 0;
+}
+
+/** Reset this token stream by setting its token source. */
+- (void) setTokenSource:(id<TokenSource>) aTokenSource
+{
+    tokenSource = aTokenSource;
+    if ( [tokens count] )
+        [tokens removeAllObjects];
+    index = -1;
+}
+
+- (AMutableArray *)getTokens
+{
+    return tokens;
+}
+
+- (AMutableArray *)getTokensFrom:(NSInteger) startIndex To:(NSInteger) stopIndex
+{
+    return [self getTokensFrom:startIndex To:stopIndex With:(ANTLRBitSet *)nil];
+}
+
+/** Given a start and stop index, return a List of all tokens in
+ *  the token type BitSet.  Return null if no tokens were found.  This
+ *  method looks at both on and off channel tokens.
+ */
+- (AMutableArray *)getTokensFrom:(NSInteger)startIndex To:(NSInteger)stopIndex With:(ANTLRBitSet *)types
+{
+    if ( index == -1 ) {
+        [self setup];
+//        [self fill];
+    }
+    if ( stopIndex >= [tokens count] )
+        stopIndex = [tokens count]-1;
+    if ( startIndex < 0 )
+        startIndex = 0;
+    if ( startIndex > stopIndex )
+        return nil;
+    
+    // list = tokens[start:stop]:{Token t, t.getType() in types}
+    AMutableArray *filteredTokens = [AMutableArray arrayWithCapacity:5];
+    for (NSInteger i = startIndex; i <= stopIndex; i++) {
+        id<Token>t = [tokens objectAtIndex:i];
+        if ( types == nil || [types member:t.type] ) {
+            [filteredTokens addObject:t];
+        }
+    }
+    if ( [filteredTokens count] == 0 ) {
+        filteredTokens = nil;
+    }
+    return filteredTokens;
+}
+
+- (AMutableArray *)getTokensFrom:(NSInteger)startIndex To:(NSInteger)stopIndex WithType:(NSInteger)ttype
+{
+    return [self getTokensFrom:startIndex To:stopIndex With:[ANTLRBitSet of:ttype]];
+}
+
+- (AMutableArray *)getTokensFrom:(NSInteger)startIndex To:(NSInteger)stopIndex WithList:(AMutableArray *)types
+{
+    return [self getTokensFrom:startIndex To:stopIndex With:[ANTLRBitSet newBitSetWithArray:types]];
+}
+            
+- (NSString *)getSourceName
+{
+    return [tokenSource getSourceName];
+}
+
+/** Grab *all* tokens from stream and return string */
+- (NSString *) toString
+{
+    if ( index == -1 ) {
+        [self setup];
+    }
+    [self fill];
+    return [self toStringFromStart:0 ToEnd:[tokens count]-1];
+}
+
+- (NSString *) toStringFromStart:(NSInteger)startIdx ToEnd:(NSInteger)stopIdx
+{
+    if ( startIdx < 0 || stopIdx < 0 )
+        return nil;
+    if ( index == -1 ) {
+        [self setup];
+    }
+    if ( stopIdx >= [tokens count] )
+        stopIdx = [tokens count]-1;
+    NSMutableString *buf = [NSMutableString stringWithCapacity:5];
+    for (NSInteger i = startIdx; i <= stopIdx; i++) {
+        id<Token>t = [tokens objectAtIndex:i];
+        if ( t.type == TokenTypeEOF )
+            break;
+        [buf appendString:[t text]];
+    }
+    return buf;
+}
+
+- (NSString *) toStringFromToken:(id<Token>)startToken ToToken:(id<Token>)stopToken
+{
+    if ( startToken != nil && stopToken != nil ) {
+        return [self toStringFromStart:[startToken getTokenIndex] ToEnd:[stopToken getTokenIndex]];
+    }
+    return nil;
+}
+
+/** Get all tokens from lexer until EOF */
+- (void) fill
+{
+    if ( index == -1 ) [self setup];
+    if ( [((CommonToken *)[tokens objectAtIndex:index]) type] == TokenTypeEOF )
+        return;
+    
+    NSInteger i = index+1;
+    [self sync:i];
+    while ( [((CommonToken *)[tokens objectAtIndex:i]) type] != TokenTypeEOF ) {
+        i++;
+        [self sync:i];
+    }
+}
+
+@end
diff --git a/runtime/ObjC/Framework/BufferedTreeNodeStream.h b/runtime/ObjC/Framework/BufferedTreeNodeStream.h
new file mode 100644
index 0000000..f2691f8
--- /dev/null
+++ b/runtime/ObjC/Framework/BufferedTreeNodeStream.h
@@ -0,0 +1,157 @@
+//
+//  BufferedTreeNodeStream.h
+//  ANTLR
+//
+// [The "BSD licence"]
+// Copyright (c) 2010 Ian Michell 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "Tree.h"
+#import "CommonTreeAdaptor.h"
+#import "TokenStream.h"
+#import "CommonTreeNodeStream.h"
+#import "LookaheadStream.h"
+#import "TreeIterator.h"
+#import "IntArray.h"
+#import "AMutableArray.h"
+
+#define DEFAULT_INITIAL_BUFFER_SIZE 100
+#define INITIAL_CALL_STACK_SIZE 10
+
+#ifdef DONTUSENOMO
+@interface StreamIterator : TreeIterator
+{
+    NSInteger idx;
+    __strong BufferedTreeNodeStream *input;
+    __strong AMutableArray *nodes;
+}
+
++ (id) newStreamIterator:(BufferedTreeNodeStream *) theStream;
+
+- (id) initWithStream:(BufferedTreeNodeStream *) theStream;
+
+- (BOOL) hasNext;
+- (id) next;
+- (void) remove;
+@end
+#endif
+
+@interface BufferedTreeNodeStream : NSObject <TreeNodeStream> 
+{
+	id up;
+	id down;
+	id eof;
+	
+	AMutableArray *nodes;
+	
+	id root; // root
+	
+	id<TokenStream> tokens;
+	CommonTreeAdaptor *adaptor;
+	
+	BOOL uniqueNavigationNodes;
+	NSInteger index;
+	NSInteger lastMarker;
+	IntArray *calls;
+	
+	NSEnumerator *e;
+    id currentSymbol;
+	
+}
+
+@property (retain, getter=getUp, setter=setUp:) id up;
+@property (retain, getter=getDown, setter=setDown:) id down;
+@property (retain, getter=eof, setter=setEof:) id eof;
+@property (retain, getter=getNodes, setter=setNodes:) AMutableArray *nodes;
+@property (retain, getter=getTreeSource, setter=setTreeSource:) id root;
+@property (retain, getter=getTokenStream, setter=setTokenStream:) id<TokenStream> tokens;
+@property (retain, getter=getAdaptor, setter=setAdaptor:) CommonTreeAdaptor *adaptor;
+@property (assign, getter=getUniqueNavigationNodes, setter=setUniqueNavigationNodes:) BOOL uniqueNavigationNodes;
+@property (assign) NSInteger index;
+@property (assign, getter=getLastMarker, setter=setLastMarker:) NSInteger lastMarker;
+@property (retain, getter=getCalls, setter=setCalls:) IntArray *calls;
+@property (retain, getter=getEnum, setter=setEnum:) NSEnumerator *e;
+@property (retain, getter=getCurrentSymbol, setter=setCurrentSymbol:) id currentSymbol;
+
++ (BufferedTreeNodeStream *) newBufferedTreeNodeStream:(CommonTree *)tree;
++ (BufferedTreeNodeStream *) newBufferedTreeNodeStream:(id<TreeAdaptor>)adaptor Tree:(CommonTree *)tree;
++ (BufferedTreeNodeStream *) newBufferedTreeNodeStream:(id<TreeAdaptor>)adaptor Tree:(CommonTree *)tree withBufferSize:(NSInteger)initialBufferSize;
+
+#pragma mark Constructor
+- (id) initWithTree:(CommonTree *)tree;
+- (id) initWithTreeAdaptor:(CommonTreeAdaptor *)anAdaptor Tree:(CommonTree *)tree;
+- (id) initWithTreeAdaptor:(CommonTreeAdaptor *)anAdaptor Tree:(CommonTree *)tree WithBufferSize:(NSInteger)bufferSize;
+
+- (void)dealloc;
+- (id) copyWithZone:(NSZone *)aZone;
+
+// protected methods. DO NOT USE
+#pragma mark Protected Methods
+- (void) fillBuffer;
+- (void) fillBufferWithTree:(CommonTree *) tree;
+- (NSInteger) getNodeIndex:(CommonTree *) node;
+- (void) addNavigationNode:(NSInteger) type;
+- (id) get:(NSUInteger) i;
+- (id) LT:(NSInteger) k;
+- (id) getCurrentSymbol;
+- (id) LB:(NSInteger) i;
+#pragma mark General Methods
+- (NSString *) getSourceName;
+
+- (id<TokenStream>) getTokenStream;
+- (void) setTokenStream:(id<TokenStream>) tokens;
+- (id<TreeAdaptor>) getTreeAdaptor;
+- (void) setTreeAdaptor:(id<TreeAdaptor>) anAdaptor;
+
+- (BOOL)getUniqueNavigationNodes;
+- (void) setUniqueNavigationNodes:(BOOL)aVal;
+
+- (void) consume;
+- (NSInteger) LA:(NSInteger) i;
+- (NSInteger) mark;
+- (void) release:(NSInteger) marker;
+- (void) rewind:(NSInteger) marker;
+- (void) rewind;
+- (void) seek:(NSInteger) idx;
+
+- (void) push:(NSInteger) i;
+- (NSInteger) pop;
+
+- (void) reset;
+- (NSUInteger) count;
+- (NSEnumerator *) objectEnumerator;
+- (void) replaceChildren:(id)parent From:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id) t;
+
+- (NSString *) toTokenTypeString;
+- (NSString *) toTokenString:(NSInteger)aStart ToEnd:(NSInteger)aStop;
+- (NSString *) toStringFromNode:(id)aStart ToNode:(id)aStop;
+
+// getters and setters
+- (AMutableArray *) getNodes;
+- (id) eof;
+- (void)setEof:(id)anEOF;
+
+@end
diff --git a/runtime/ObjC/Framework/BufferedTreeNodeStream.m b/runtime/ObjC/Framework/BufferedTreeNodeStream.m
new file mode 100644
index 0000000..bf41026
--- /dev/null
+++ b/runtime/ObjC/Framework/BufferedTreeNodeStream.m
@@ -0,0 +1,556 @@
+//
+//  BufferedTreeNodeStream.m
+//  ANTLR
+//
+// [The "BSD licence"]
+// Copyright (c) 2010 Ian Michell 2010 Alan Condit
+// 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.
+
+#import "BufferedTreeNodeStream.h"
+#import "StreamEnumerator.h"
+#import "CommonTreeAdaptor.h"
+
+extern NSInteger debug;
+
+#ifdef DONTUSENOMO
+@implementation TreeStreamIterator
++ newTreeStreamIteratorWithNodes:(BufferedTreeNodeStream *)theStream
+{
+    return[[TreeStreamIterator alloc] initWithStream:theStream];
+}
+
+- (id) initWithStream:(BufferedTreeNodeStream *)theStream
+{
+    if ((self = [super init]) != nil) {
+        idx = 0;
+        input = theStream;
+        nodes = [theStream getNodes];
+    }
+    return self;
+}
+
+- (BOOL) hasNext
+{
+    return idx < [nodes count];
+}
+
+- (id) next
+{
+    NSInteger current = idx;
+    idx++;
+    if (current < [nodes count]) {
+    }
+    return [nodes getEof];
+}
+
+- (void) remove
+{
+	@throw [RuntimeException newException:@"cannot remove nodes from stream"];
+}
+
+@end
+#endif
+
+@implementation BufferedTreeNodeStream
+
+@synthesize up;
+@synthesize down;
+@synthesize eof;
+@synthesize nodes;
+@synthesize root;
+@synthesize tokens;
+@synthesize adaptor;
+@synthesize uniqueNavigationNodes;
+@synthesize index;
+@synthesize lastMarker;
+@synthesize calls;
+@synthesize e;
+@synthesize currentSymbol;
+
++ (BufferedTreeNodeStream *) newBufferedTreeNodeStream:(CommonTree *) aTree
+{
+    return [((BufferedTreeNodeStream *)[BufferedTreeNodeStream alloc]) initWithTree:(CommonTree *)aTree];
+}
+
++ (BufferedTreeNodeStream *) newBufferedTreeNodeStream:(id<TreeAdaptor>)adaptor Tree:(CommonTree *)aTree
+{
+    return [[BufferedTreeNodeStream alloc] initWithTreeAdaptor:adaptor Tree:(CommonTree *)aTree];
+}
+
++ (BufferedTreeNodeStream *) newBufferedTreeNodeStream:(id<TreeAdaptor>)adaptor Tree:(CommonTree *)aTree withBufferSize:(NSInteger)initialBufferSize
+{
+    return [[BufferedTreeNodeStream alloc] initWithTreeAdaptor:adaptor Tree:(CommonTree *)aTree WithBufferSize:initialBufferSize];
+}
+
+-(BufferedTreeNodeStream *) init
+{
+	self = [super init];
+	if (self) {
+		index = -1;
+		uniqueNavigationNodes = NO;
+        root = [[CommonTree alloc] init];
+        //		tokens = tree;
+        adaptor = [[[CommonTreeAdaptor alloc] init] retain];
+        nodes = [[AMutableArray arrayWithCapacity:DEFAULT_INITIAL_BUFFER_SIZE] retain];
+        down = [[adaptor createTree:TokenTypeDOWN Text:@"DOWN"] retain];
+        up = [[adaptor createTree:TokenTypeUP Text:@"UP"] retain];
+        eof = [[adaptor createTree:TokenTypeEOF Text:@"EOF"] retain];
+    }
+	return self;
+}
+
+- (BufferedTreeNodeStream *)initWithTree:(CommonTree *) aTree
+{
+	self = [super init];
+	if (self) {
+		index = -1;
+		uniqueNavigationNodes = NO;
+        root = aTree;
+        //		tokens = aTree;
+        adaptor = [[[CommonTreeAdaptor alloc] init] retain];
+        nodes = [[AMutableArray arrayWithCapacity:DEFAULT_INITIAL_BUFFER_SIZE] retain];
+        down = [[adaptor createTree:TokenTypeDOWN Text:@"DOWN"] retain];
+        up = [[adaptor createTree:TokenTypeUP Text:@"UP"] retain];
+        eof = [[adaptor createTree:TokenTypeEOF Text:@"EOF"] retain];
+    }
+	return self;
+}
+
+-(BufferedTreeNodeStream *) initWithTreeAdaptor:(CommonTreeAdaptor *)anAdaptor Tree:(CommonTree *)aTree
+{
+	self = [super init];
+	if (self) {
+		index = -1;
+		uniqueNavigationNodes = NO;
+        root = aTree;
+        //		tokens = aTree;
+        adaptor = [anAdaptor retain];
+        nodes = [[AMutableArray arrayWithCapacity:DEFAULT_INITIAL_BUFFER_SIZE] retain];
+        down = [[adaptor createTree:TokenTypeDOWN Text:@"DOWN"] retain];
+        up = [[adaptor createTree:TokenTypeUP Text:@"UP"] retain];
+        eof = [[adaptor createTree:TokenTypeEOF Text:@"EOF"] retain];
+    }
+	return self;
+}
+
+-(BufferedTreeNodeStream *) initWithTreeAdaptor:(CommonTreeAdaptor *)anAdaptor Tree:(CommonTree *)aTree WithBufferSize:(NSInteger)bufferSize
+{
+	self = [super init];
+	if (self) {
+        //		down = [adaptor createToken:TokenTypeDOWN withText:@"DOWN"];
+        //		up = [adaptor createToken:TokenTypeDOWN withText:@"UP"];
+        //		eof = [adaptor createToken:TokenTypeDOWN withText:@"EOF"];
+		index = -1;
+		uniqueNavigationNodes = NO;
+        root = aTree;
+        //		tokens = aTree;
+        adaptor = [anAdaptor retain];
+        nodes = [[AMutableArray arrayWithCapacity:bufferSize] retain];
+        down = [[adaptor createTree:TokenTypeDOWN Text:@"DOWN"] retain];
+        up = [[adaptor createTree:TokenTypeUP Text:@"UP"] retain];
+        eof = [[adaptor createTree:TokenTypeEOF Text:@"EOF"] retain];
+	}
+	return self;
+}
+
+- (void)dealloc
+{
+#ifdef DEBUG_DEALLOC
+    NSLog( @"called dealloc in BufferedTreeNodeStream" );
+#endif
+    if ( adaptor ) [adaptor release];
+    if ( nodes ) [nodes release];
+    if ( root ) [root release];
+    if ( down ) [down release];
+    if ( up ) [up release];
+    if ( eof ) [eof release];
+	[super dealloc];
+}
+
+- (id) copyWithZone:(NSZone *)aZone
+{
+    BufferedTreeNodeStream *copy;
+    
+    copy = [[[self class] allocWithZone:aZone] init];
+    if ( up )
+        copy.up = [up copyWithZone:aZone];
+    if ( down )
+        copy.down = [down copyWithZone:aZone];
+    if ( eof )
+        copy.eof = [eof copyWithZone:aZone];
+    if ( nodes )
+        copy.nodes = [nodes copyWithZone:aZone];
+    if ( root )
+        copy.root = [root copyWithZone:aZone];
+    if ( tokens )
+        copy.tokens = [tokens copyWithZone:aZone];
+    if ( adaptor )
+        copy.adaptor = [adaptor copyWithZone:aZone];
+    copy.uniqueNavigationNodes = self.uniqueNavigationNodes;
+    copy.index = self.index;
+    copy.lastMarker = self.lastMarker;
+    if ( calls )
+        copy.calls = [calls copyWithZone:aZone];
+    return copy;
+}
+
+// protected methods. DO NOT USE
+#pragma mark Protected Methods
+-(void) fillBuffer
+{
+	[self fillBufferWithTree:root];
+	// if (debug > 1) NSLog("revIndex=%@", tokenTypeToStreamIndexesMap);
+	index = 0; // buffer of nodes intialized now
+}
+
+-(void) fillBufferWithTree:(CommonTree *) aTree
+{
+	BOOL empty = [adaptor isNil:(id<BaseTree>)aTree];
+	if (!empty) {
+		[nodes addObject:aTree];
+	}
+	NSInteger n = [adaptor getChildCount:aTree];
+	if (!empty && n > 0) {
+		[self addNavigationNode:TokenTypeDOWN];
+	}
+	for (NSInteger c = 0; c < n; c++) {
+		id child = [adaptor getChild:aTree At:c];
+		[self fillBufferWithTree:child];
+	}
+	if (!empty && n > 0) {
+		[self addNavigationNode:TokenTypeUP];
+	}
+}
+
+-(NSInteger) getNodeIndex:(CommonTree *) node
+{
+	if (index == -1) {
+		[self fillBuffer];
+	}
+	for (NSUInteger i = 0; i < [nodes count]; i++) {
+		id t = [nodes objectAtIndex:i];
+		if (t == node) {
+			return i;
+		}
+	}
+	return -1;
+}
+
+-(void) addNavigationNode:(NSInteger) type
+{
+	id navNode = nil;
+	if (type == TokenTypeDOWN) {
+		if (self.uniqueNavigationNodes) {
+			navNode = [adaptor createToken:TokenTypeDOWN Text:@"DOWN"];
+		}
+		else {
+			navNode = down;
+		}
+
+	}
+	else {
+		if (self.uniqueNavigationNodes) {
+			navNode = [adaptor createToken:TokenTypeUP Text:@"UP"];
+		}
+		else {
+			navNode = up;
+		}
+	}
+	[nodes addObject:navNode];
+}
+
+-(id) get:(NSUInteger) i
+{
+	if (index == -1) {
+		[self fillBuffer];
+	}
+	return [nodes objectAtIndex:i];
+}
+
+-(id) LT:(NSInteger) k
+{
+	if (index == -1) {
+		[self fillBuffer];
+	}
+	if (k == 0) {
+		return nil;
+	}
+	if (k < 0) {
+		return [self LB:-k];
+	}
+	if ((index + k - 1) >= [nodes count]) {
+		return eof;
+	}
+	return [nodes objectAtIndex:(index + k - 1)];
+}
+
+-(id) getCurrentSymbol
+{
+	return [self LT:1];
+}
+
+-(id) LB:(NSInteger) k
+{
+	if (k == 0) {
+		return nil;
+	}
+	if ((index - k) < 0) {
+		return nil;
+	}
+	return [nodes objectAtIndex:(index - k)];
+}
+
+- (CommonTree *)getTreeSource
+{
+    return root;
+}
+
+-(NSString *)getSourceName
+{
+	return [[self getTokenStream] getSourceName];
+}
+
+- (id<TokenStream>)getTokenStream
+{
+    return tokens;
+}
+
+- (void) setTokenStream:(id<TokenStream>)newtokens
+{
+    tokens = newtokens;
+}
+
+- (id<TreeAdaptor>)getTreeAdaptor
+{
+    return adaptor;
+}
+
+- (void) setTreeAdaptor:(id<TreeAdaptor>)anAdaptor
+{
+    adaptor = anAdaptor;
+}
+
+- (BOOL)getUniqueNavigationNodes
+{
+    return uniqueNavigationNodes;
+}
+
+- (void) setUniqueNavigationNodes:(BOOL)aVal
+{
+    uniqueNavigationNodes = aVal;
+}
+
+-(void) consume
+{
+	if (index == -1) {
+		[self fillBuffer];
+	}
+	index++;
+}
+
+-(NSInteger) LA:(NSInteger) i
+{
+	return [adaptor getType:[self LT:i]];
+}
+
+-(NSInteger) mark
+{
+	if (index == -1) {
+		[self fillBuffer];
+	}
+	lastMarker = self.index;
+	return lastMarker;
+}
+
+-(void) release:(NSInteger) marker
+{
+	// do nothing
+}
+
+-(void) rewind:(NSInteger) marker
+{
+	[self seek:marker];
+}
+
+-(void) rewind
+{
+	[self seek:lastMarker];
+}
+
+-(void) seek:(NSInteger) i
+{
+	if (index == -1) {
+		[self fillBuffer];
+	}
+	index = i;
+}
+
+-(void) push:(NSInteger) i
+{
+	if (calls == nil) {
+		calls = [IntArray newArrayWithLen:INITIAL_CALL_STACK_SIZE];
+	}
+	[calls push:index];
+	[self seek:i];
+}
+
+-(NSInteger) pop
+{
+	NSInteger ret = [calls pop];
+	[self seek:ret];
+	return ret;
+}
+
+-(void) reset
+{
+	index = 0;
+	lastMarker = 0;
+	if (calls != nil) {
+		[calls reset];
+	}
+}
+
+-(NSUInteger) count
+{
+	if (index == -1) {
+		[self fillBuffer];
+	}
+	return [nodes count];
+}
+
+-(NSUInteger) size
+{
+	return [self count];
+}
+
+-(NSEnumerator *) objectEnumerator
+{
+	if (e == nil) {
+		e = [[StreamEnumerator alloc] initWithNodes:nodes andEOF:eof];
+	}
+	return e;
+}
+
+-(void) replaceChildren:(CommonTree *) parent From:(NSInteger)startIdx To:(NSInteger)stopIdx With:(CommonTree *)aTree
+{
+	if (parent != nil) {
+		[adaptor replaceChildren:parent From:startIdx To:stopIdx With:aTree];
+	}
+}
+
+-(NSString *) toTokenTypeString
+{
+	if (index == -1)
+	{
+		[self fillBuffer];
+	}
+	NSMutableString *buf = [NSMutableString stringWithCapacity:10];
+	for (NSUInteger i= 0; i < [nodes count]; i++) {
+		CommonTree * aTree = (CommonTree *)[self get:i];
+		[buf appendFormat:@" %d", [adaptor getType:aTree]];
+	}
+	return buf;
+}
+
+-(NSString *) toTokenString:(NSInteger)aStart ToEnd:(NSInteger)aStop
+{
+	if (index == -1) {
+		[self fillBuffer];
+	}
+	NSMutableString *buf = [NSMutableString stringWithCapacity:10];
+	for (NSUInteger i = aStart; i < [nodes count] && i <= aStop; i++) {
+		CommonTree * t = (CommonTree *)[self get:i];
+		[buf appendFormat:@" %d", [adaptor getType:t]];
+	}
+	return buf;
+}
+
+-(NSString *) toStringFromNode:(id)aStart ToNode:(id)aStop
+{
+	if (aStart == nil || aStop == nil) {
+		return nil;
+	}
+	if (index == -1) {
+		[self fillBuffer];
+	}
+	
+	// if we have a token stream, use that to dump text in order
+	if ([self getTokenStream] != nil) {
+		NSInteger beginTokenIndex = [adaptor getTokenStartIndex:aStart];
+		NSInteger endTokenIndex = [adaptor getTokenStopIndex:aStop];
+		
+		if ([adaptor getType:aStop] == TokenTypeUP) {
+			endTokenIndex = [adaptor getTokenStopIndex:aStart];
+		}
+		else if ([adaptor getType:aStop] == TokenTypeEOF) {
+			endTokenIndex = [self count] - 2; //don't use EOF
+		}
+        [tokens toStringFromStart:beginTokenIndex ToEnd:endTokenIndex];
+	}
+	// walk nodes looking for aStart
+	CommonTree * aTree = nil;
+	NSUInteger i = 0;
+	for (; i < [nodes count]; i++) {
+		aTree = [nodes objectAtIndex:i];
+		if (aTree == aStart) {
+			break;
+		}
+	}
+	NSMutableString *buf = [NSMutableString stringWithCapacity:10];
+	aTree = [nodes objectAtIndex:i]; // why?
+	while (aTree != aStop) {
+		NSString *text = [adaptor getText:aTree];
+		if (text == nil) {
+			text = [NSString stringWithFormat:@" %d", [adaptor getType:aTree]];
+		}
+		[buf appendString:text];
+		i++;
+		aTree = [nodes objectAtIndex:i];
+	}
+	NSString *text = [adaptor getText:aStop];
+	if (text == nil) {
+		text = [NSString stringWithFormat:@" %d", [adaptor getType:aStop]];
+	}
+	[buf appendString:text];
+	return buf;
+}
+
+// getters and setters
+- (AMutableArray *) getNodes
+{
+    return nodes;
+}
+
+- (id) eof
+{
+    return eof;
+}
+
+- (void) setEof:(id)theEOF
+{
+    eof = theEOF;
+}
+
+@end
diff --git a/runtime/ObjC/Framework/CharStream.h b/runtime/ObjC/Framework/CharStream.h
new file mode 100644
index 0000000..7463160
--- /dev/null
+++ b/runtime/ObjC/Framework/CharStream.h
@@ -0,0 +1,58 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+#import "IntStream.h"
+
+#define	CharStreamEOF -1
+
+
+@protocol CharStream < IntStream >
+
+/** For infinite streams, you don't need this; primarily I'm providing
+ *  a useful interface for action code.  Just make sure actions don't
+ *  use this on streams that don't support it.
+ */
+- (NSString *) substringWithRange:(NSRange) theRange;
+
+/** Get the ith character of lookahead.  This is the same usually as
+ *  LA(i).  This will be used for labels in the generated
+ *  lexer code.  I'd prefer to return a char here type-wise, but it's
+ *  probably better to be 32-bit clean and be consistent with LA.
+ */
+- (NSInteger)LT:(NSInteger) i;
+
+// ANTLR tracks the line information automatically
+- (NSInteger)getLine;
+// Because this stream can rewind, we need to be able to reset the line
+- (void)setLine:(NSInteger)aLine;
+
+- (void)setCharPositionInLine:(NSInteger)pos;
+
+
+// The index of the character relative to the beginning of the line 0..n-1
+- (NSInteger)getCharPositionInLine;
+
+@end
diff --git a/runtime/ObjC/Framework/CharStreamState.h b/runtime/ObjC/Framework/CharStreamState.h
new file mode 100644
index 0000000..7e8ba17
--- /dev/null
+++ b/runtime/ObjC/Framework/CharStreamState.h
@@ -0,0 +1,49 @@
+//
+//  CharStreamState.h
+//  ANTLR
+//
+// [The "BSD licence"]
+// Copyright (c)  2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+
+
+@interface CharStreamState : NSObject
+{
+NSInteger index;
+NSUInteger line;
+NSUInteger charPositionInLine;
+}
+
+@property (assign) NSInteger index;
+@property (assign) NSUInteger line;
+@property (assign) NSUInteger charPositionInLine;
+
++ newCharStreamState;
+
+- (id) init;
+
+@end
diff --git a/runtime/ObjC/Framework/CharStreamState.m b/runtime/ObjC/Framework/CharStreamState.m
new file mode 100755
index 0000000..0776f32
--- /dev/null
+++ b/runtime/ObjC/Framework/CharStreamState.m
@@ -0,0 +1,52 @@
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+
+#import "CharStreamState.h"
+
+
+@implementation CharStreamState
+
+@synthesize index;
+@synthesize line;
+@synthesize charPositionInLine;
+
++ newCharStreamState
+{
+    return [[CharStreamState alloc] init];
+}
+
+- (id) init
+{
+    if ((self = [super init]) != nil) {
+        index = 0;
+        line = 1;
+        charPositionInLine = 0;
+    }
+    return self;
+}
+
+@end
diff --git a/runtime/ObjC/Framework/CommonErrorNode.h b/runtime/ObjC/Framework/CommonErrorNode.h
new file mode 100644
index 0000000..b36dba8
--- /dev/null
+++ b/runtime/ObjC/Framework/CommonErrorNode.h
@@ -0,0 +1,67 @@
+//
+//  CommonErrorNode.h
+//  ANTLR
+//
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "CommonTree.h"
+#import "TokenStream.h"
+//#import "IntStream.h"
+//#import "Token.h"
+#import "UnWantedTokenException.h"
+
+@interface CommonErrorNode : CommonTree
+{
+id<IntStream> input;
+id<Token> startToken;
+id<Token> stopToken;
+RecognitionException *trappedException;
+}
+
++ (id) newCommonErrorNode:(id<TokenStream>)anInput
+                  From:(id<Token>)startToken
+                    To:(id<Token>)stopToken
+                     Exception:(RecognitionException *) e;
+
+- (id) initWithInput:(id<TokenStream>)anInput
+                From:(id<Token>)startToken
+                  To:(id<Token>)stopToken
+           Exception:(RecognitionException *) e;
+
+- (void)dealloc;
+- (BOOL) isNil;
+
+- (NSInteger)type;
+- (NSString *)text;
+- (NSString *)toString;
+
+@property (retain) id<IntStream> input;
+@property (retain) id<Token> startToken;
+@property (retain) id<Token> stopToken;
+@property (retain) RecognitionException *trappedException;
+@end
diff --git a/runtime/ObjC/Framework/CommonErrorNode.m b/runtime/ObjC/Framework/CommonErrorNode.m
new file mode 100644
index 0000000..7979a9e
--- /dev/null
+++ b/runtime/ObjC/Framework/CommonErrorNode.m
@@ -0,0 +1,159 @@
+//
+//  CommonErrorNode.m
+//  ANTLR
+//
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import "CommonErrorNode.h"
+#import "MissingTokenException.h"
+#import "NoViableAltException.h"
+#import "TreeNodeStream.h"
+#import "UnwantedTokenException.h"
+
+@implementation CommonErrorNode
+
++ (id) newCommonErrorNode:(id<TokenStream>)anInput
+                          From:(id<Token>)aStartToken
+                            To:(id<Token>)aStopToken
+                     Exception:(RecognitionException *) e
+{
+    return [[CommonErrorNode alloc] initWithInput:anInput From:aStartToken To:aStopToken Exception:e];
+}
+
+- (id) init
+{
+    self = [super init];
+    if ( self != nil ) {
+    }
+    return self;
+}
+
+- (id) initWithInput:(id<TokenStream>)anInput
+                From:(id<Token>)aStartToken
+                  To:(id<Token>)aStopToken
+           Exception:(RecognitionException *) e
+{
+    self = [super init];
+    if ( self != nil ) {
+        //System.out.println("aStartToken: "+aStartToken+", aStopToken: "+aStopToken);
+        if ( aStopToken == nil ||
+            ([aStopToken getTokenIndex] < [aStartToken getTokenIndex] &&
+             aStopToken.type != TokenTypeEOF) )
+        {
+            // sometimes resync does not consume a token (when LT(1) is
+            // in follow set.  So, aStopToken will be 1 to left to aStartToken. adjust.
+            // Also handle case where aStartToken is the first token and no token
+            // is consumed during recovery; LT(-1) will return null.
+            aStopToken = aStartToken;
+        }
+        input = anInput;
+        if ( input ) [input retain];
+        startToken = aStartToken;
+        if ( startToken ) [startToken retain];
+        stopToken = aStopToken;
+        if ( stopToken ) [stopToken retain];
+        trappedException = e;
+        if ( trappedException ) [trappedException retain];
+    }
+    return self;
+}
+
+- (void)dealloc
+{
+#ifdef DEBUG_DEALLOC
+    NSLog( @"called dealloc in CommonErrorNode" );
+#endif
+    if ( input ) [input release];
+    if ( startToken ) [startToken release];
+    if ( stopToken ) [stopToken release];
+    if ( trappedException ) [trappedException release];
+	[super dealloc];
+}
+
+- (BOOL) isNil
+{
+    return NO;
+}
+
+- (NSInteger)type
+{
+    return TokenTypeInvalid;
+}
+
+- (NSString *)text
+{
+    NSString *badText = nil;
+    if ( [startToken isKindOfClass:[self class]] ) {
+        int i = [(id<Token>)startToken getTokenIndex];
+        int j = [(id<Token>)stopToken getTokenIndex];
+        if ( stopToken.type == TokenTypeEOF ) {
+            j = [(id<TokenStream>)input size];
+        }
+        badText = [(id<TokenStream>)input toStringFromStart:i ToEnd:j];
+    }
+    else if ( [startToken isKindOfClass:[self class]] ) {
+        badText = [(id<TreeNodeStream>)input toStringFromNode:startToken ToNode:stopToken];
+    }
+    else {
+        // people should subclass if they alter the tree type so this
+        // next one is for sure correct.
+        badText = @"<unknown>";
+    }
+    return badText;
+}
+
+- (NSString *)toString
+{
+    NSString *aString;
+    if ( [trappedException isKindOfClass:[MissingTokenException class]] ) {
+        aString = [NSString stringWithFormat:@"<missing type: %@ >",
+        [(MissingTokenException *)trappedException getMissingType]];
+        return aString;
+    }
+    else if ( [trappedException isKindOfClass:[UnwantedTokenException class]] ) {
+        aString = [NSString stringWithFormat:@"<extraneous: %@, resync=%@>",
+        [trappedException getUnexpectedToken],
+        [self text]];
+        return aString;
+    }
+    else if ( [trappedException isKindOfClass:[MismatchedTokenException class]] ) {
+        aString = [NSString stringWithFormat:@"<mismatched token: %@, resync=%@>", trappedException.token, [self text]];
+        return aString;
+    }
+    else if ( [trappedException isKindOfClass:[NoViableAltException class]] ) {
+        aString = [NSString stringWithFormat:@"<unexpected:  %@, resync=%@>", trappedException.token, [self text]];
+        return aString;
+    }
+    aString = [NSString stringWithFormat:@"<error: %@>",[self text]];
+    return aString;
+}
+
+@synthesize input;
+@synthesize startToken;
+@synthesize stopToken;
+@synthesize trappedException;
+@end
diff --git a/runtime/ObjC/Framework/CommonToken.h b/runtime/ObjC/Framework/CommonToken.h
new file mode 100644
index 0000000..16823da
--- /dev/null
+++ b/runtime/ObjC/Framework/CommonToken.h
@@ -0,0 +1,141 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+
+#import <Foundation/Foundation.h>
+#import "Token.h"
+#import "CharStream.h"
+
+@interface CommonToken : NSObject < Token > {
+	__strong NSString *text;
+	NSInteger type;
+	// information about the Token's position in the input stream
+	NSUInteger line;
+	NSUInteger charPositionInLine;
+	NSUInteger channel;
+	// this token's position in the TokenStream
+	NSInteger index;
+	
+	// indices into the CharStream to avoid copying the text
+	// can manually override the text by using -setText:
+	NSInteger startIndex;
+	NSInteger stopIndex;
+	// the actual input stream this token was found in
+	__strong id<CharStream> input;
+}
+
++ (void) initialize;
++ (NSInteger) DEFAULT_CHANNEL;
++ (id<Token>)INVALID_TOKEN;
++ (NSInteger) INVALID_TOKEN_TYPE;
++ (id<Token>) newToken;
++ (id<Token>) newToken:(id<CharStream>)anInput
+                       Type:(NSInteger)aTType
+                    Channel:(NSInteger)aChannel
+                      Start:(NSInteger)aStart
+                       Stop:(NSInteger)aStop;
++ (id<Token>) newToken:(TokenType)aType;
++ (id<Token>) newToken:(NSInteger)tokenType Text:(NSString *)tokenText;
++ (id<Token>) newTokenWithToken:(CommonToken *)fromToken;
++ (id<Token>) eofToken;
++ (id<Token>) skipToken;
++ (id<Token>) invalidToken;
++ (TokenChannel) defaultChannel;
+
+// designated initializer. This is used as the default way to initialize a Token in the generated code.
+- (id) init;
+- (id) initWithInput:(id<CharStream>)anInput
+                                Type:(NSInteger)aTType
+                             Channel:(NSInteger)aChannel
+                               Start:(NSInteger)theStart
+                                Stop:(NSInteger)theStop;
+- (id) initWithToken:(id<Token>)aToken;
+- (id) initWithType:(TokenType)aType;
+- (id) initWithType:(TokenType)aTType Text:(NSString *)tokenText;
+
+//---------------------------------------------------------- 
+//  text 
+//---------------------------------------------------------- 
+- (NSString *)text;
+- (void) setText:(NSString *)aText;
+
+//---------------------------------------------------------- 
+//  charPositionInLine 
+//---------------------------------------------------------- 
+- (NSUInteger) getCharPositionInLine;
+- (void) setCharPositionInLine:(NSUInteger)aCharPositionInLine;
+
+//---------------------------------------------------------- 
+//  line 
+//---------------------------------------------------------- 
+- (NSUInteger) getLine;
+- (void) setLine:(NSUInteger)aLine;
+
+//---------------------------------------------------------- 
+//  type 
+//---------------------------------------------------------- 
+- (NSInteger)type;
+- (void) setType:(NSInteger)aType;
+
+//---------------------------------------------------------- 
+//  channel 
+//---------------------------------------------------------- 
+- (NSUInteger)channel;
+- (void) setChannel:(NSUInteger)aChannel;
+
+//---------------------------------------------------------- 
+//  input 
+//---------------------------------------------------------- 
+- (id<CharStream>)input;
+- (void) setInput:(id<CharStream>)anInput;
+
+- (NSInteger)getStart;
+- (void) setStart: (NSInteger)aStart;
+
+- (NSInteger)getStop;
+- (void) setStop: (NSInteger) aStop;
+
+// the index of this Token into the TokenStream
+- (NSInteger)getTokenIndex;
+- (void) setTokenIndex:(NSInteger)aTokenIndex;
+
+// conform to NSCopying
+- (id) copyWithZone:(NSZone *)theZone;
+
+- (NSString *) description;
+- (NSString *) toString;
+
+@property (retain, getter = text, setter = setText:) NSString *text;
+@property (assign) NSInteger type;
+@property (assign, getter = line, setter = setLine:) NSUInteger line;
+@property (assign, getter=charPositionInLine, setter = setCharPositionInLine:) NSUInteger charPositionInLine;
+@property (assign) NSUInteger channel;
+@property (assign) NSInteger index;
+@property (assign, getter=getStart, setter=setStart:) NSInteger startIndex;
+@property (assign, getter=getStop, setter=setStop:) NSInteger stopIndex;
+@property (retain) id<CharStream> input;
+
+@end
diff --git a/runtime/ObjC/Framework/CommonToken.m b/runtime/ObjC/Framework/CommonToken.m
new file mode 100644
index 0000000..5b09acb
--- /dev/null
+++ b/runtime/ObjC/Framework/CommonToken.m
@@ -0,0 +1,403 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+
+#import "CommonToken.h"
+
+static CommonToken *SKIP_TOKEN;
+static CommonToken *EOF_TOKEN;
+static CommonToken *INVALID_TOKEN;
+
+@implementation CommonToken
+
+    static NSInteger DEFAULT_CHANNEL = TokenChannelDefault;
+    static NSInteger INVALID_TOKEN_TYPE = TokenTypeInvalid;
+
+
+@synthesize text;
+@synthesize type;
+@synthesize line;
+@synthesize charPositionInLine;
+@synthesize channel;
+@synthesize index;
+@synthesize startIndex;
+@synthesize stopIndex;
+@synthesize input;
+
++ (void) initialize
+{
+    EOF_TOKEN = [CommonToken newToken:TokenTypeEOF Text:@"EOF"];
+    SKIP_TOKEN = [CommonToken newToken:TokenTypeInvalid Text:@"Skip"];
+    INVALID_TOKEN = [CommonToken newToken:TokenTypeInvalid Text:@"Invalid"];
+    [EOF_TOKEN retain];
+    [SKIP_TOKEN retain];
+    [INVALID_TOKEN retain];
+}
+
++ (CommonToken *)INVALID_TOKEN
+{
+    return INVALID_TOKEN;
+}
+
++ (NSInteger) DEFAULT_CHANNEL
+{
+    return DEFAULT_CHANNEL;
+}
+
++ (NSInteger) INVALID_TOKEN_TYPE
+{
+    return INVALID_TOKEN_TYPE;
+}
+
++ (CommonToken *) newToken
+{
+    return [[CommonToken alloc] init];
+}
+
++ (CommonToken *) newToken:(id<CharStream>)anInput Type:(NSInteger)aTType Channel:(NSInteger)aChannel Start:(NSInteger)aStart Stop:(NSInteger)aStop
+{
+    return [[CommonToken alloc] initWithInput:(id<CharStream>)anInput Type:(NSInteger)aTType Channel:(NSInteger)aChannel Start:(NSInteger)aStart Stop:(NSInteger)aStop];
+}
+
++ (CommonToken *) newToken:(TokenType)tokenType
+{
+    return( [[CommonToken alloc] initWithType:tokenType] );
+}
+
++ (CommonToken *) newToken:(NSInteger)tokenType Text:(NSString *)tokenText
+{
+    return( [[CommonToken alloc] initWithType:tokenType Text:tokenText] );
+}
+
++ (CommonToken *) newTokenWithToken:(CommonToken *)fromToken
+{
+    return( [[CommonToken alloc] initWithToken:fromToken] );
+}
+
+// return the singleton EOF Token 
++ (id<Token>) eofToken
+{
+    if (EOF_TOKEN == nil) {
+        EOF_TOKEN = [[CommonToken newToken:TokenTypeEOF Text:@"EOF"] retain];
+    }
+    return EOF_TOKEN;
+}
+
+// return the singleton skip Token 
++ (id<Token>) skipToken
+{
+    if (SKIP_TOKEN == nil) {
+        SKIP_TOKEN = [[CommonToken newToken:TokenTypeInvalid Text:@"Skip"] retain];
+    }
+    return SKIP_TOKEN;
+}
+
+// return the singleton skip Token 
++ (id<Token>) invalidToken
+{
+    if (INVALID_TOKEN == nil) {
+        INVALID_TOKEN = [[CommonToken newToken:TokenTypeInvalid Text:@"Invalid"] retain];
+    }
+    return SKIP_TOKEN;
+}
+
+// the default channel for this class of Tokens
++ (TokenChannel) defaultChannel
+{
+    return TokenChannelDefault;
+}
+
+- (id) init
+{
+    if ((self = [super init]) != nil) {
+        input = nil;
+        type = TokenTypeInvalid;
+        channel = TokenChannelDefault;
+        startIndex = 0;
+        stopIndex = 0;
+    }
+    return self;
+}
+
+// designated initializer
+- (id) initWithInput:(id<CharStream>)anInput
+                Type:(NSInteger)aTType
+             Channel:(NSInteger)aChannel
+               Start:(NSInteger)aStart
+                Stop:(NSInteger)aStop
+{
+    if ((self = [super init]) != nil) {
+        input = anInput;
+        if ( input ) [input retain];
+        type = aTType;
+        channel = aChannel;
+        startIndex = aStart;
+        stopIndex = aStop;
+        if (type == TokenTypeEOF)
+            text = @"EOF";
+        else
+            text = [input substringWithRange:NSMakeRange(startIndex, (stopIndex-startIndex)+1)];
+        if ( text ) [text retain];
+    }
+    return self;
+}
+
+- (id) initWithToken:(CommonToken *)oldToken
+{
+    if ((self = [super init]) != nil) {
+        text = [NSString stringWithString:oldToken.text];
+        if ( text ) [text retain];
+        type = oldToken.type;
+        line = oldToken.line;
+        index = oldToken.index;
+        charPositionInLine = oldToken.charPositionInLine;
+        channel = oldToken.channel;
+        input = oldToken.input;
+        if ( input ) [input retain];
+        if ( [oldToken isKindOfClass:[CommonToken class]] ) {
+            startIndex = oldToken.startIndex;
+            stopIndex = oldToken.stopIndex;
+        }
+    }
+    return self;
+}
+
+- (id) initWithType:(TokenType)aTType
+{
+    if ((self = [super init]) != nil) {
+        self.type = aTType;
+    }
+    return self;
+}
+
+- (id) initWithType:(TokenType)aTType Text:(NSString *)tokenText
+{
+    if ((self = [super init]) != nil) {
+        self.type = aTType;
+        self.text = [NSString stringWithString:tokenText];
+        if ( text ) [text retain];
+    }
+    return self;
+}
+
+- (void)dealloc
+{
+#ifdef DEBUG_DEALLOC
+    NSLog( @"called dealloc in CommonToken" );
+#endif
+    if ( input ) [input release];
+    if ( text ) [text release];
+    [super dealloc];
+}
+
+// create a copy, including the text if available
+// the input stream is *not* copied!
+- (id) copyWithZone:(NSZone *)theZone
+{
+    CommonToken *copy = [[[self class] allocWithZone:theZone] init];
+    
+    if (text)
+        copy.text = [text copyWithZone:nil];
+    copy.type = type;
+    copy.line = line;
+    copy.charPositionInLine = charPositionInLine;
+    copy.channel = channel;
+    copy.index = index;
+    copy.startIndex = startIndex;
+    copy.stopIndex = stopIndex;
+    copy.input = input;
+    return copy;
+}
+
+
+//---------------------------------------------------------- 
+//  charPositionInLine 
+//---------------------------------------------------------- 
+- (NSUInteger) getCharPositionInLine
+{
+    return charPositionInLine;
+}
+
+- (void) setCharPositionInLine:(NSUInteger)aCharPositionInLine
+{
+    charPositionInLine = aCharPositionInLine;
+}
+
+//---------------------------------------------------------- 
+//  line 
+//---------------------------------------------------------- 
+- (NSUInteger) getLine
+{
+    return line;
+}
+
+- (void) setLine:(NSUInteger)aLine
+{
+    line = aLine;
+}
+
+//---------------------------------------------------------- 
+//  text 
+//---------------------------------------------------------- 
+- (NSString *) text
+{
+    if (text != nil) {
+        return text;
+    }
+    if (input == nil) {
+        return nil;
+    }
+    int n = [input size];
+    if ( startIndex < n && stopIndex < n) {
+        return [input substringWithRange:NSMakeRange(startIndex, (stopIndex-startIndex)+1)];
+    }
+    else {
+        return @"<EOF>";
+    }
+}
+
+- (void) setText:(NSString *)aText
+{
+    if (text != aText) {
+        if ( text ) [text release];
+        text = aText;
+        [text retain];
+    }
+}
+
+
+//---------------------------------------------------------- 
+//  type 
+//---------------------------------------------------------- 
+- (NSInteger)type
+{
+    return type;
+}
+
+- (void) setType:(NSInteger)aType
+{
+    type = aType;
+}
+
+//---------------------------------------------------------- 
+//  channel 
+//---------------------------------------------------------- 
+- (NSUInteger)channel
+{
+    return channel;
+}
+
+- (void) setChannel:(NSUInteger)aChannel
+{
+    channel = aChannel;
+}
+
+
+//---------------------------------------------------------- 
+//  input 
+//---------------------------------------------------------- 
+- (id<CharStream>) input
+{
+    return input; 
+}
+
+- (void) setInput: (id<CharStream>) anInput
+{
+    if (input != anInput) {
+        if ( input ) [input release];
+        [anInput retain];
+    }
+    input = anInput;
+}
+
+
+//---------------------------------------------------------- 
+//  start 
+//---------------------------------------------------------- 
+- (NSInteger) getStart
+{
+    return startIndex;
+}
+
+- (void) setStart: (NSInteger) aStart
+{
+    startIndex = aStart;
+}
+
+//---------------------------------------------------------- 
+//  stop 
+//---------------------------------------------------------- 
+- (NSInteger) getStop
+{
+    return stopIndex;
+}
+
+- (void) setStop: (NSInteger) aStop
+{
+    stopIndex = aStop;
+}
+
+//---------------------------------------------------------- 
+//  index 
+//---------------------------------------------------------- 
+- (NSInteger) getTokenIndex;
+{
+    return index;
+}
+
+- (void) setTokenIndex: (NSInteger) aTokenIndex;
+{
+    index = aTokenIndex;
+}
+
+
+// provide a textual representation for debugging
+- (NSString *) description
+{
+    NSString *channelStr;
+    NSMutableString *txtString;
+
+    channelStr = @"";
+    if ( channel > 0 ) {
+        channelStr = [NSString stringWithFormat:@",channel=%d\n", channel];
+    }
+    if ([self text] != nil) {
+        txtString = [NSMutableString stringWithString:[self text]];
+        [txtString replaceOccurrencesOfString:@"\n" withString:@"\\\\n" options:NSAnchoredSearch range:NSMakeRange(0, [txtString length])];
+        [txtString replaceOccurrencesOfString:@"\r" withString:@"\\\\r" options:NSAnchoredSearch range:NSMakeRange(0, [txtString length])];
+        [txtString replaceOccurrencesOfString:@"\t" withString:@"\\\\t" options:NSAnchoredSearch range:NSMakeRange(0, [txtString length])];
+    } else {
+        txtString = [NSMutableString stringWithString:@"<no text>"];
+    }
+    return [NSString stringWithFormat:@"[@%d, %d:%d='%@',<%d>%@,%d:%d]", index, startIndex, stopIndex, txtString, type, channelStr, line, charPositionInLine];
+}
+
+- (NSString *)toString
+{
+   return [self description];
+}
+
+@end
diff --git a/runtime/ObjC/Framework/CommonTokenStream.h b/runtime/ObjC/Framework/CommonTokenStream.h
new file mode 100644
index 0000000..80c580e
--- /dev/null
+++ b/runtime/ObjC/Framework/CommonTokenStream.h
@@ -0,0 +1,96 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "TokenStream.h"
+#import "Token.h"
+#import "CommonToken.h"
+#import "TokenSource.h"
+#import "ANTLRBitSet.h"
+#import "BufferedTokenStream.h"
+#import "AMutableDictionary.h"
+
+@interface CommonTokenStream : BufferedTokenStream < TokenStream >
+{
+	__strong AMutableDictionary *channelOverride;
+	NSUInteger channel;
+}
+
+@property (retain, getter=getChannelOverride,setter=setChannelOverride:) AMutableDictionary *channelOverride;
+@property (assign, getter=channel,setter=setChannel:) NSUInteger channel;
+
++ (CommonTokenStream *)newCommonTokenStream;
++ (CommonTokenStream *)newCommonTokenStreamWithTokenSource:(id<TokenSource>)theTokenSource;
++ (CommonTokenStream *)newCommonTokenStreamWithTokenSource:(id<TokenSource>)theTokenSource
+                                                               Channel:(NSUInteger)aChannel;
+
+- (id) init;
+- (id) initWithTokenSource:(id<TokenSource>)theTokenSource;
+- (id) initWithTokenSource:(id<TokenSource>)theTokenSource Channel:(NSUInteger)aChannel;
+
+- (void) consume;
+- (id<Token>) LB:(NSInteger)k;
+- (id<Token>) LT:(NSInteger)k;
+
+- (NSInteger) skipOffTokenChannels:(NSInteger) i;
+- (NSInteger) skipOffTokenChannelsReverse:(NSInteger) i;
+
+- (void)setup;
+- (void)reset;
+
+- (NSInteger) getNumberOfOnChannelTokens;
+
+// - (id<TokenSource>) getTokenSource;
+- (void) setTokenSource: (id<TokenSource>) aTokenSource;
+
+- (NSUInteger)channel;
+- (void)setChannel:(NSUInteger)aChannel;
+
+- (AMutableDictionary *)channelOverride;
+- (void)setChannelOverride:(AMutableDictionary *)anOverride;
+
+- (id) copyWithZone:(NSZone *)aZone;
+
+#ifdef DONTUSENOMO
+- (NSArray *) tokensInRange:(NSRange)aRange;
+- (NSArray *) tokensInRange:(NSRange)aRange inBitSet:(ANTLRBitSet *)aBitSet;
+- (NSArray *) tokensInRange:(NSRange)aRange withTypes:(NSArray *)tokenTypes;
+- (NSArray *) tokensInRange:(NSRange)aRange withType:(NSInteger)tokenType;
+
+- (id<Token>) getToken:(NSInteger)i;
+
+- (NSInteger) size;
+- (void) rewind;
+- (void) rewind:(NSInteger)marker;
+- (void) seek:(NSInteger)index;
+
+- (NSString *) toString;
+- (NSString *) toStringFromStart:(NSInteger)startIndex ToEnd:(NSInteger)stopIndex;
+- (NSString *) toStringFromToken:(id<Token>)startToken ToToken:(id<Token>)stopToken;
+
+#endif
+
+@end
diff --git a/runtime/ObjC/Framework/CommonTokenStream.m b/runtime/ObjC/Framework/CommonTokenStream.m
new file mode 100644
index 0000000..53aac0e
--- /dev/null
+++ b/runtime/ObjC/Framework/CommonTokenStream.m
@@ -0,0 +1,358 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+#import "Token.h"
+#import "CommonTokenStream.h"
+
+
+@implementation CommonTokenStream
+
+@synthesize channelOverride;
+@synthesize channel;
+
+#pragma mark Initialization
+
++ (CommonTokenStream *)newCommonTokenStream
+{
+    return [[CommonTokenStream alloc] init];
+}
+
++ (CommonTokenStream *)newCommonTokenStreamWithTokenSource:(id<TokenSource>)theTokenSource
+{
+    return [[CommonTokenStream alloc] initWithTokenSource:(id<TokenSource>)theTokenSource];
+}
+
++ (CommonTokenStream *)newCommonTokenStreamWithTokenSource:(id<TokenSource>)theTokenSource Channel:(NSUInteger)aChannel
+{
+    return [[CommonTokenStream alloc] initWithTokenSource:(id<TokenSource>)theTokenSource Channel:aChannel];
+}
+
+- (id) init
+{
+	if ((self = [super init]) != nil) {
+		channelOverride = [[AMutableDictionary dictionaryWithCapacity:100] retain];
+		channel = TokenChannelDefault;
+	}
+	return self;
+}
+
+- (id) initWithTokenSource:(id<TokenSource>)theTokenSource
+{
+	if ((self = [super initWithTokenSource:theTokenSource]) != nil) {
+		channelOverride = [[AMutableDictionary dictionaryWithCapacity:100] retain];
+		channel = TokenChannelDefault;
+	}
+	return self;
+}
+
+- (id) initWithTokenSource:(id<TokenSource>)theTokenSource Channel:(NSUInteger)aChannel
+{
+	if ((self = [super initWithTokenSource:theTokenSource]) != nil) {
+		channelOverride = [[AMutableDictionary dictionaryWithCapacity:100] retain];
+		channel = aChannel;
+	}
+	return self;
+}
+
+- (void) dealloc
+{
+#ifdef DEBUG_DEALLOC
+    NSLog( @"called dealloc in CommonTokenStream" );
+#endif
+	if ( channelOverride ) [channelOverride release];
+	if ( tokens ) [tokens release];
+	[self setTokenSource:nil];
+	[super dealloc];
+}
+
+/** Always leave index on an on-channel token. */
+- (void) consume
+{
+    if (index == -1) [self setup];
+    index++;
+    [self sync:index];
+    while ( ((CommonToken *)[tokens objectAtIndex:index]).channel != channel ) {
+		index++;
+		[self sync:index];
+	}
+}
+
+#pragma mark Lookahead
+
+- (id<Token>) LB:(NSInteger)k
+{
+	if ( k == 0 || (index-k) < 0 ) {
+		return nil;
+	}
+	int i = index;
+	int n = 1;
+    // find k good tokens looking backwards
+	while ( n <= k ) {
+		i = [self skipOffTokenChannelsReverse:i-1];
+		n++;
+	}
+	if ( i < 0 ) {
+		return nil;
+	}
+	return [tokens objectAtIndex:i];
+}
+
+- (id<Token>) LT:(NSInteger)k
+{
+	if ( index == -1 ) [self setup];
+	if ( k == 0 ) return nil;
+	if ( k < 0 ) return [self LB:-k];
+	int i = index;
+	int n = 1;
+	while ( n < k ) {
+		i = [self skipOffTokenChannels:i+1];
+		n++;
+	}
+//	if ( i >= (NSInteger)[tokens count] ) {
+//		return [CommonToken eofToken];
+//	}
+    if ( i > range ) range = i;
+	return [tokens objectAtIndex:i];
+}
+
+#pragma mark Channels & Skipping
+
+- (NSInteger) skipOffTokenChannels:(NSInteger) idx
+{
+    [self sync:idx];
+	while ( ((CommonToken *)[tokens objectAtIndex:idx]).channel != channel ) {
+		idx++;
+        [self sync:idx];
+	}
+	return idx;
+}
+
+- (NSInteger) skipOffTokenChannelsReverse:(NSInteger) i
+{
+	while ( i >= 0 && ((CommonToken *)[tokens objectAtIndex:i]).channel != channel ) {
+		i--;
+	}
+	return i;
+}
+
+- (void) reset
+{
+    [super reset];
+    index = [self skipOffTokenChannels:0];
+}
+
+- (void) setup
+{
+    index = 0;
+    [self sync:0];
+    int i = 0;
+    while ( ((CommonToken *)[tokens objectAtIndex:i]).channel != channel ) {
+        i++;
+        [self sync:i];
+    }
+	// leave index pointing at first token on channel
+    index = i;
+}
+
+- (NSInteger) getNumberOfOnChannelTokens
+{
+    NSInteger n = 0;
+    [self fill];
+    for( int i = 0; i < [tokens count]; i++ ) {
+        CommonToken *t = [tokens objectAtIndex:i];
+        if ( t.channel == channel )
+            n++;
+        if ( t.type == TokenTypeEOF )
+            break;
+    }
+    return n;
+}
+
+/** Reset this token stream by setting its token source. */
+- (void) setTokenSource:(id<TokenSource>)aTokenSource
+{
+    [super setTokenSource:aTokenSource];
+    channel = TokenChannelDefault;
+}
+
+- (id) copyWithZone:(NSZone *)aZone
+{
+    CommonTokenStream *copy;
+	
+    //    copy = [[[self class] allocWithZone:aZone] init];
+    copy = [super copyWithZone:aZone]; // allocation occurs in BaseTree
+    if ( self.channelOverride )
+        copy.channelOverride = [channelOverride copyWithZone:aZone];
+    copy.channel = channel;
+    return copy;
+}
+
+- (NSUInteger)channel
+{
+    return channel;
+}
+
+- (void)setChannel:(NSUInteger)aChannel
+{
+    channel = aChannel;
+}
+
+- (AMutableDictionary *)channelOverride
+{
+    return channelOverride;
+}
+
+- (void)setChannelOverride:(AMutableDictionary *)anOverride
+{
+    channelOverride = anOverride;
+}
+
+#ifdef DONTUSENOMO
+#pragma mark Token access
+
+- (NSArray *) tokensInRange:(NSRange)aRange
+{
+	return [tokens subarrayWithRange:aRange];
+}
+
+#pragma mark Accessors
+
+- (id<TokenSource>) getTokenSource
+{
+    return tokenSource; 
+}
+
+- (NSArray *) tokensInRange:(NSRange)aRange inBitSet:(ANTLRBitSet *)aBitSet
+{
+	unsigned int startIndex = aRange.location;
+	unsigned int stopIndex = aRange.location+aRange.length;
+	if ( index == -1 ) {
+		[self setup];
+	}
+	if (stopIndex >= [tokens count]) {
+		stopIndex = [tokens count] - 1;
+	}
+	AMutableArray *filteredTokens = [AMutableArray arrayWithCapacity:100];
+	unsigned int i=0;
+	for (i = startIndex; i<=stopIndex; i++) {
+		id<Token> token = [tokens objectAtIndex:i];
+		if (aBitSet == nil || [aBitSet member:token.type]) {
+			[filteredTokens addObject:token];
+		}
+	}
+	if ([filteredTokens count]) {
+		return filteredTokens;
+	} else {
+		[filteredTokens release];
+		return nil;
+	}
+}
+
+- (NSArray *) tokensInRange:(NSRange)aRange withTypes:(NSArray *)tokenTypes
+{
+	ANTLRBitSet *bits = [[ANTLRBitSet alloc] initWithArrayOfBits:tokenTypes];
+	NSArray *returnTokens = [[self tokensInRange:aRange inBitSet:bits] retain];
+	[bits release];
+	return returnTokens;
+}
+
+- (NSArray *) tokensInRange:(NSRange)aRange withType:(NSInteger)tokenType
+{
+	ANTLRBitSet *bits = [[ANTLRBitSet alloc] init];
+	[bits add:tokenType];
+	NSArray *returnTokens = [[self tokensInRange:aRange inBitSet:bits] retain];
+	[bits release];
+	return returnTokens;
+}
+
+- (id<Token>) getToken:(NSInteger)i
+{
+	return [tokens objectAtIndex:i];
+}
+
+- (NSInteger) size
+{
+	return [tokens count];
+}
+
+- (void) rewind
+{
+	[self seek:lastMarker];
+}
+
+- (void) rewind:(NSInteger)marker
+{
+	[self seek:marker];
+}
+
+- (void) seek:(NSInteger)anIndex
+{
+	index = anIndex;
+}
+#pragma mark toString routines
+
+- (NSString *) toString
+{
+	if ( index == -1 ) {
+		[self setup];
+	}
+	return [self toStringFromStart:0 ToEnd:[tokens count]];
+}
+
+- (NSString *) toStringFromStart:(NSInteger)startIdx ToEnd:(NSInteger) stopIdx
+{
+    NSMutableString *stringBuffer;
+    id<Token> t;
+
+    if ( startIdx < 0 || stopIdx < 0 ) {
+        return nil;
+    }
+    if ( index == -1 ) {
+        [self setup];
+    }
+    if ( stopIdx >= [tokens count] ) {
+        stopIdx = [tokens count]-1;
+    }
+    stringBuffer = [NSMutableString stringWithCapacity:30];
+    for (int i = startIdx; i <= stopIdx; i++) {
+        t = (id<Token>)[tokens objectAtIndex:i];
+        [stringBuffer appendString:[t text]];
+    }
+    return stringBuffer;
+}
+
+- (NSString *) toStringFromToken:(id<Token>)startToken ToToken:(id<Token>)stopToken
+{
+	if (startToken && stopToken) {
+		int startIdx = [startToken getTokenIndex];
+		int stopIdx = [stopToken getTokenIndex];
+		return [self toStringFromStart:startIdx ToEnd:stopIdx];
+	}
+	return nil;
+}
+#endif
+
+@end
diff --git a/runtime/ObjC/Framework/CommonTree.h b/runtime/ObjC/Framework/CommonTree.h
new file mode 100644
index 0000000..a5117d3
--- /dev/null
+++ b/runtime/ObjC/Framework/CommonTree.h
@@ -0,0 +1,92 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "CommonToken.h"
+#import "BaseTree.h"
+
+@interface CommonTree : BaseTree <Tree> {
+	__strong CommonToken *token;
+	NSInteger startIndex;
+	NSInteger stopIndex;
+    __strong CommonTree *parent;
+    NSInteger childIndex;
+}
+
++ (CommonTree *) invalidNode;
++ (CommonTree *) newTree;
++ (CommonTree *) newTreeWithTree:(CommonTree *)aTree;
++ (CommonTree *) newTreeWithToken:(CommonToken *)aToken;
++ (CommonTree *) newTreeWithTokenType:(NSInteger)tokenType;
++ (CommonTree *) newTreeWithTokenType:(NSInteger)aTType Text:(NSString *)theText;
+
+- (id) init;
+- (id) initWithTreeNode:(CommonTree *)aNode;
+- (id) initWithToken:(CommonToken *)aToken;
+- (id) initWithTokenType:(NSInteger)aTokenType;
+- (id) initWithTokenType:(NSInteger)aTokenType Text:(NSString *)theText;
+
+- (id<BaseTree>) copyWithZone:(NSZone *)aZone;
+
+- (BOOL) isNil;
+
+- (CommonToken *) getToken;
+- (void) setToken:(CommonToken *)aToken;
+- (CommonToken *) dupNode;
+- (NSInteger)type;
+- (NSString *)text;
+- (NSUInteger)line;
+- (void) setLine:(NSUInteger)aLine;
+- (NSUInteger)charPositionInLine;
+- (void) setCharPositionInLine:(NSUInteger)pos;
+- (CommonTree *) getParent;
+- (void) setParent:(CommonTree *) t;
+
+#ifdef DONTUSENOMO
+- (NSString *) treeDescription;
+#endif
+- (NSString *) description;
+- (void) setUnknownTokenBoundaries;
+- (NSInteger) getTokenStartIndex;
+- (void) setTokenStartIndex: (NSInteger) aStartIndex;
+- (NSInteger) getTokenStopIndex;
+- (void) setTokenStopIndex: (NSInteger) aStopIndex;
+
+/*
+ @property (retain, getter=getCommonToken, setter=setCommonToken:) CommonToken *token;
+ @property (assign, getter=getTokenStartIndex, setter=setTokenStartIndex:) NSInteger startIndex;
+ @property (assign, getter=getTokenStopIndex, setter=setTokenStopIndex:) NSInteger stopIndex;
+ @property (retain, getter=getParent, setter=setParent:) id<BaseTree> parentparent;
+ @property (assign, getter=getChildIndex, setter=setChildIndex:) NSInteger childIndex;
+ */
+
+@property (retain) CommonToken *token;
+@property (assign) NSInteger startIndex;
+@property (assign) NSInteger stopIndex;
+@property (retain) CommonTree *parent;
+@property (assign) NSInteger childIndex;
+
+@end
diff --git a/runtime/ObjC/Framework/CommonTree.m b/runtime/ObjC/Framework/CommonTree.m
new file mode 100644
index 0000000..062fa20
--- /dev/null
+++ b/runtime/ObjC/Framework/CommonTree.m
@@ -0,0 +1,345 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+#import "CommonTree.h"
+
+
+@implementation CommonTree
+
++ (CommonTree *)INVALID_NODE
+{
+	return [[CommonTree alloc] initWithToken:[CommonToken invalidToken]];
+}
+
++ (CommonTree *)invalidNode
+{
+    // Had to cast to CommonTree * here, because GCC is dumb.
+	return [[CommonTree alloc] initWithToken:CommonToken.INVALID_TOKEN];
+}
+
++ (CommonTree *)newTree
+{
+    return [[CommonTree alloc] init];
+}
+
++ (CommonTree *)newTreeWithTree:(CommonTree *)aTree
+{
+    return [[CommonTree alloc] initWithTreeNode:aTree];
+}
+
++ (CommonTree *)newTreeWithToken:(id<Token>)aToken
+{
+	return [[CommonTree alloc] initWithToken:aToken];
+}
+
++ (CommonTree *)newTreeWithTokenType:(NSInteger)aTType
+{
+	return [[CommonTree alloc] initWithTokenType:(NSInteger)aTType];
+}
+
++ (CommonTree *)newTreeWithTokenType:(NSInteger)aTType Text:(NSString *)theText
+{
+	return [[CommonTree alloc] initWithTokenType:(NSInteger)aTType Text:theText];
+}
+
+- (id)init
+{
+	self = (CommonTree *)[super init];
+	if ( self != nil ) {
+        token = nil;
+		startIndex = -1;
+		stopIndex = -1;
+        parent = nil;
+        childIndex = -1;
+	}
+	return (CommonTree *)self;
+}
+
+- (id)initWithTreeNode:(CommonTree *)aNode
+{
+	self = (CommonTree *)[super init];
+	if ( self != nil ) {
+		token = aNode.token;
+        if ( token ) [token retain];
+		startIndex = aNode.startIndex;
+		stopIndex = aNode.stopIndex;
+        parent = nil;
+        childIndex = -1;
+	}
+	return self;
+}
+
+- (id)initWithToken:(id<Token>)aToken
+{
+	self = (CommonTree *)[super init];
+	if ( self != nil ) {
+		token = aToken;
+        if ( token ) [token retain];
+		startIndex = -1;
+		stopIndex = -1;
+        parent = nil;
+        childIndex = -1;
+	}
+	return self;
+}
+
+- (id)initWithTokenType:(NSInteger)aTokenType
+{
+	self = (CommonTree *)[super init];
+	if ( self != nil ) {
+		token = [[CommonToken newToken:aTokenType] retain];
+//		startIndex = token.startIndex;
+		startIndex = -1;
+//		stopIndex = token.stopIndex;
+		stopIndex = -1;
+        parent = nil;
+        childIndex = -1;
+	}
+	return self;
+}
+
+- (id) initWithTokenType:(NSInteger)aTokenType Text:(NSString *)theText
+{
+	self = (CommonTree *)[super init];
+	if ( self != nil ) {
+		token = [[CommonToken newToken:aTokenType Text:theText] retain];
+//		startIndex = token.startIndex;
+		startIndex = -1;
+//		stopIndex = token.stopIndex;
+		stopIndex = -1;
+        parent = nil;
+        childIndex = -1;
+	}
+	return self;
+}
+
+- (void) dealloc
+{
+    if ( token ) {
+        [token release];
+        token = nil;
+    }
+    if ( parent ) {
+        [parent release];
+        parent = nil;
+    }
+	[super dealloc];
+}
+
+- (id) copyWithZone:(NSZone *)aZone
+{
+    CommonTree *copy;
+	
+    //    copy = [[[self class] allocWithZone:aZone] init];
+    copy = [super copyWithZone:aZone]; // allocation occurs in BaseTree
+    if ( self.token )
+        copy.token = [self.token copyWithZone:aZone];
+    copy.startIndex = startIndex;
+    copy.stopIndex = stopIndex;
+    copy.parent = (CommonTree *)[self.parent copyWithZone:aZone];
+    copy.childIndex = childIndex;
+    return copy;
+}
+
+- (BOOL) isNil
+{
+	return token == nil;
+}
+
+- (CommonToken *) getToken
+{
+	return token;
+}
+
+- (void) setToken:(CommonToken *) aToken
+{
+	if ( token != aToken ) {
+		if ( token ) [token release];
+		[aToken retain];
+		token = aToken;
+	}
+}
+
+- (CommonTree *) dupNode
+{
+    return [CommonTree newTreeWithTree:self ];
+}
+
+- (NSInteger)type
+{
+	if (token)
+		return token.type;
+	return TokenTypeInvalid;
+}
+
+- (NSString *)text
+{
+	if (token)
+		return token.text;
+	return nil;
+}
+
+- (NSUInteger)line
+{
+	if (token)
+		return token.line;
+	return 0;
+}
+
+- (void) setLine:(NSUInteger)aLine
+{
+    if (token)
+        token.line = aLine;
+}
+
+- (NSUInteger)charPositionInLine
+{
+	if (token)
+		return token.charPositionInLine;
+	return 0;
+}
+
+- (void) setCharPositionInLine:(NSUInteger)pos
+{
+    if (token)
+        token.charPositionInLine = pos;
+}
+
+- (NSInteger) getTokenStartIndex
+{
+	if ( startIndex == -1 && token != nil ) {
+		return [token getTokenIndex];
+	}
+    return startIndex;
+}
+
+- (void) setTokenStartIndex: (NSInteger) aStartIndex
+{
+    startIndex = aStartIndex;
+}
+
+- (NSInteger) getTokenStopIndex
+{
+	if ( stopIndex == -1 && token != nil ) {
+		return [token getTokenIndex];
+	}
+    return stopIndex;
+}
+
+- (void) setTokenStopIndex: (NSInteger) aStopIndex
+{
+    stopIndex = aStopIndex;
+}
+
+#ifdef DONTUSENOMO
+- (NSString *) treeDescription
+{
+	if (children) {
+		NSMutableString *desc = [NSMutableString stringWithString:@"(^"];
+		[desc appendString:[self description]];
+		unsigned int childIdx;
+		for (childIdx = 0; childIdx < [children count]; childIdx++) {
+			[desc appendFormat:@"%@", [[children objectAtIndex:childIdx] treeDescription]];
+		}
+		[desc appendString:@")"];
+		return desc;
+	} else {
+		return [self description];
+	}
+}
+#endif
+
+/** For every node in this subtree, make sure it's start/stop token's
+ *  are set.  Walk depth first, visit bottom up.  Only updates nodes
+ *  with at least one token index < 0.
+ */
+- (void) setUnknownTokenBoundaries
+{
+    if ( children == nil ) {
+        if ( startIndex < 0 || stopIndex < 0 ) {
+            startIndex = stopIndex = [token getTokenIndex];
+        }
+        return;
+    }
+    for (NSUInteger i=0; i < [children count]; i++) {
+        [[children objectAtIndex:i] setUnknownTokenBoundaries];
+    }
+    if ( startIndex >= 0 && stopIndex >= 0 )
+         return; // already set
+    if ( [children count] > 0 ) {
+        CommonTree *firstChild = (CommonTree *)[children objectAtIndex:0];
+        CommonTree *lastChild = (CommonTree *)[children objectAtIndex:[children count]-1];
+        startIndex = [firstChild getTokenStartIndex];
+        stopIndex = [lastChild getTokenStopIndex];
+    }
+}
+
+- (NSInteger) getChildIndex
+{
+    return childIndex;
+}
+
+- (CommonTree *) getParent
+{
+    return parent;
+}
+
+- (void) setParent:(CommonTree *) t
+{
+    parent = t;
+}
+
+- (void) setChildIndex:(NSInteger) anIndex
+{
+    childIndex = anIndex;
+}
+
+- (NSString *) description
+{
+    if ( [self isNil] ) {
+        return @"nil";
+    }
+    if ( [self type] == TokenTypeInvalid ) {
+        return @"<errornode>";
+    }
+    if ( token==nil ) {
+        return nil;
+    }
+    return token.text;
+}
+
+- (NSString *) toString
+{
+    return [self description];
+}
+
+@synthesize token;
+@synthesize startIndex;
+@synthesize stopIndex;
+@synthesize parent;
+@synthesize childIndex;
+
+@end
diff --git a/runtime/ObjC/Framework/CommonTreeAdaptor.h b/runtime/ObjC/Framework/CommonTreeAdaptor.h
new file mode 100644
index 0000000..8d775e8
--- /dev/null
+++ b/runtime/ObjC/Framework/CommonTreeAdaptor.h
@@ -0,0 +1,65 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+
+#import <Foundation/Foundation.h>
+#import "Tree.h"
+#import "CommonToken.h"
+#import "CommonTree.h"
+#import "BaseTreeAdaptor.h"
+
+@interface CommonTreeAdaptor : BaseTreeAdaptor {
+}
+
++ (CommonTree *) newEmptyTree;
++ (CommonTreeAdaptor *)newTreeAdaptor;
+- (id) init;
+- (CommonTree *)dupNode:(CommonTree *)t;   
+
+- (CommonTree *) create:(id<Token>) payload;
+//- (CommonTree *) createTree:(NSInteger)tokenType fromToken:(CommonToken *)aToken;
+//- (CommonTree *) createTree:(NSInteger)tokenType fromToken:(CommonToken *)aToken Text:(NSString *)text;
+- (id<Token>)createToken:(NSInteger)tokenType Text:(NSString *)text;
+- (id<Token>)createToken:(id<Token>)fromToken;
+- (void) setTokenBoundaries:(CommonTree *)t From:(id<Token>)startToken To:(id<Token>)stopToken;
+- (NSInteger)getTokenStartIndex:(CommonTree *)t;
+- (NSInteger)getTokenStopIndex:(CommonTree *)t;
+- (NSString *)getText:(CommonTree *)t;
+- (void)setText:(CommonTree *)t Text:(NSString *)text;
+- (NSInteger)getType:(CommonTree *)t;
+- (void) setType:(CommonTree *)t Type:(NSInteger)tokenType;
+- (id<Token>)getToken:(CommonTree *)t;
+- (CommonTree *)getChild:(CommonTree *)t At:(NSInteger)i;
+- (void) setChild:(CommonTree *)t At:(NSInteger)i Child:(CommonTree *)child;
+- (NSInteger)getChildCount:(CommonTree *)t;
+- (CommonTree *)getParent:(CommonTree *)t;
+- (void)setParent:(CommonTree *)t With:(CommonTree *)parent;
+- (NSInteger)getChildIndex:(CommonTree *)t;
+- (void)setChildIndex:(CommonTree *)t With:(NSInteger)index;
+- (void)replaceChildren:(CommonTree *)parent From:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(CommonTree *)t;
+- (id)copyWithZone:(NSZone *)zone;
+
+@end
diff --git a/runtime/ObjC/Framework/CommonTreeAdaptor.m b/runtime/ObjC/Framework/CommonTreeAdaptor.m
new file mode 100644
index 0000000..b88dbb0
--- /dev/null
+++ b/runtime/ObjC/Framework/CommonTreeAdaptor.m
@@ -0,0 +1,240 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+#import "CommonTreeAdaptor.h"
+
+@implementation CommonTreeAdaptor
+
++ (CommonTree *) newEmptyTree;
+{
+    return [CommonTree newTree];
+}
+
++ (CommonTreeAdaptor *)newTreeAdaptor
+{
+    return[[CommonTreeAdaptor alloc] init];
+}
+
+- (id) init
+{
+    self = [super init];
+    if (self) {
+    }
+    return self;
+}
+
+/** Duplicate a node.  This is part of the factory;
+ *	override if you want another kind of node to be built.
+ *
+ *  I could use reflection to prevent having to override this
+ *  but reflection is slow.
+ */
+- (id) dupNode:(id<BaseTree>)t
+{
+    if ( t==nil )
+        return nil;
+    return [CommonTree newTree:t];
+}
+
+/** Tell me how to create a token for use with imaginary token nodes.
+ *  For example, there is probably no input symbol associated with imaginary
+ *  token DECL, but you need to create it as a payload or whatever for
+ *  the DECL node as in ^(DECL type ID).
+ *
+ *  This is a variant of createToken where the new token is derived from
+ *  an actual real input token.  Typically this is for converting '{'
+ *  tokens to BLOCK etc...  You'll see
+ *
+ *    r : lc='{' ID+ '}' -> ^(BLOCK[$lc] ID+) ;
+ *
+ *  If you care what the token payload objects' type is, you should
+ *  override this method and any other createToken variant.
+ */
+- (CommonTree *) create:(CommonToken *)aToken
+{
+    return [CommonTree newTreeWithToken:aToken];
+}
+
+/** Tell me how to create a token for use with imaginary token nodes.
+ *  For example, there is probably no input symbol associated with imaginary
+ *  token DECL, but you need to create it as a payload or whatever for
+ *  the DECL node as in ^(DECL type ID).
+ *
+ *  If you care what the token payload objects' type is, you should
+ *  override this method and any other createToken variant.
+ */
+- (CommonTree *)createTree:(NSInteger)tokenType Text:(NSString *)text
+{
+    return [CommonTree newTreeWithTokenType:tokenType Text:text];
+}
+
+- (id<Token>)createToken:(NSInteger)tokenType Text:(NSString *)text
+{
+    id<Token> fromToken = [CommonToken newToken:tokenType Text:text];
+    return fromToken;
+}
+
+- (id<Token>)createToken:(id<Token>)fromToken
+{
+    return [CommonToken newTokenWithToken:(CommonToken *)fromToken];
+}
+
+/** Track start/stop token for subtree root created for a rule.
+ *  Only works with Tree nodes.  For rules that match nothing,
+ *  seems like this will yield start=i and stop=i-1 in a nil node.
+ *  Might be useful info so I'll not force to be i..i.
+ */
+- (void) setTokenBoundaries:(id<BaseTree>)aTree From:(id<Token>)startToken To:(id<Token>)stopToken
+{
+    if ( aTree == nil )
+        return;
+    int startTokIdx = 0;
+    int stopTokIdx = 0;
+    if ( startToken != nil )
+        startTokIdx = [startToken getTokenIndex];
+    if ( stopToken != nil )
+        stopTokIdx = [stopToken getTokenIndex];
+    [(id<BaseTree>)aTree setTokenStartIndex:startTokIdx];
+    [(id<BaseTree>)aTree setTokenStopIndex:stopTokIdx];
+}
+
+- (NSInteger)getTokenStartIndex:(id<BaseTree>) t
+{
+    if ( t == nil )
+        return -1;
+    return [(id<BaseTree>)t getTokenStartIndex];
+}
+
+- (NSInteger)getTokenStopIndex:(id<BaseTree>) t
+{
+    if ( t == nil )
+        return -1;
+    return [(id<BaseTree>)t getTokenStopIndex];
+}
+
+- (NSString *)getText:(CommonTree *)t
+{
+    if ( t == nil )
+        return nil;
+    return t.token.text;
+}
+
+- (void)setText:(id<BaseTree>)t Text:(NSString *)text
+{
+    if ( t == nil )
+        return;
+}
+
+- (NSInteger)getType:(CommonTree *)t
+{
+    if ( t==nil )
+        return TokenTypeInvalid;
+    return t.token.type;
+}
+
+- (void) setType:(id<BaseTree>)t Type:(NSInteger)tokenType
+{
+    if ( t==nil )
+        return;
+}
+
+/** What is the Token associated with this node?  If
+ *  you are not using CommonTree, then you must
+ *  override this in your own adaptor.
+ */
+- (id<Token>) getToken:(CommonTree *) t
+{
+    if ( [t isKindOfClass:[CommonTree class]] ) {
+        return t.token;
+    }
+    return nil; // no idea what to do
+}
+
+- (id<BaseTree>) getChild:(id<BaseTree>)t At:(NSInteger)i
+{
+    if ( t == nil )
+        return nil;
+    return [(id<BaseTree>)t getChild:i];
+}
+
+- (void) setChild:(id<BaseTree>)t At:(NSInteger)i Child:(id<BaseTree>)child
+{
+    if ( t == nil )
+        return;
+    [(id<BaseTree>)t setChild:i With:child];
+}
+
+- (id) deleteChild:(id<BaseTree>)t Index:(NSInteger)anIndex
+{
+    return [t deleteChild:anIndex];
+}
+
+- (NSInteger) getChildCount:(id<BaseTree>) t
+{
+    if ( t == nil )
+        return 0;
+    return [(id<BaseTree>) t getChildCount];
+}
+
+- (id<BaseTree>) getParent:(id<BaseTree>) t
+{
+    if ( t == nil )
+        return nil;
+    return (id<BaseTree>)[t getParent];
+}
+
+- (void) setParent:(id<BaseTree>)t With:(id<BaseTree>) parent
+{
+    if ( t != nil )
+        [(id<BaseTree>) t setParent:(id<BaseTree>)parent];
+}
+
+- (NSInteger) getChildIndex:(id<BaseTree>) t
+{
+    if ( t == nil )
+        return 0;
+    return [(id<BaseTree>) t getChildIndex];
+}
+
+- (void) setChildIndex:(id<BaseTree>)t With:(NSInteger)anIndex
+{
+    if ( t!=nil )
+        [(id<BaseTree>)t setChildIndex:anIndex];
+}
+
+- (void) replaceChildren:(id<BaseTree>)parent From:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id<BaseTree>)t
+{
+    if ( parent != nil ) {
+        [(id<BaseTree>)parent replaceChildrenFrom:startChildIndex To:stopChildIndex With:t];
+    }
+}
+
+- (id) copyWithZone:(NSZone *)aZone
+{
+    return [[[self class] allocWithZone:aZone] init];
+}
+
+@end
diff --git a/runtime/ObjC/Framework/CommonTreeNodeStream.h b/runtime/ObjC/Framework/CommonTreeNodeStream.h
new file mode 100644
index 0000000..be5371f
--- /dev/null
+++ b/runtime/ObjC/Framework/CommonTreeNodeStream.h
@@ -0,0 +1,120 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "CommonTree.h"
+#import "CommonTreeNodeStream.h"
+#import "LookaheadStream.h"
+#import "TreeNodeStream.h"
+#import "TreeIterator.h"
+#import "IntArray.h"
+
+@interface CommonTreeNodeStream : LookaheadStream <TreeNodeStream> {
+#define DEFAULT_INITIAL_BUFFER_SIZE 100
+#define INITIAL_CALL_STACK_SIZE 10
+    
+/** Pull nodes from which tree? */
+__strong id root;
+    
+/** If this tree (root) was created from a token stream, track it. */
+__strong id <TokenStream> tokens;
+    
+	/** What tree adaptor was used to build these trees */
+__strong CommonTreeAdaptor *adaptor;
+    
+/** The tree iterator we using */
+__strong TreeIterator *it;
+    
+/** Stack of indexes used for push/pop calls */
+__strong IntArray *calls;    
+    
+/** Tree (nil A B C) trees like flat A B C streams */
+BOOL hasNilRoot;
+    
+/** Tracks tree depth.  Level=0 means we're at root node level. */
+NSInteger level;
+}
+@property (retain, getter=getRoot, setter=setRoot:) CommonTree *root;
+@property (retain, getter=getTokens,setter=setTokens:) id<TokenStream> tokens;
+@property (retain, getter=getTreeAdaptor, setter=setTreeAdaptor:) CommonTreeAdaptor *adaptor;
+@property (assign, getter=getLevel, setter=setLevel:) NSInteger level;
+
++ (CommonTreeNodeStream *) newCommonTreeNodeStream:(CommonTree *)theTree;
++ (CommonTreeNodeStream *) newCommonTreeNodeStream:(id<TreeAdaptor>)anAdaptor Tree:(CommonTree *)theTree;
+
+- (id) initWithTree:(CommonTree *)theTree;
+
+- (id) initWithTreeAdaptor:(id<TreeAdaptor>)adaptor Tree:(CommonTree *)theTree;
+    
+- (void) reset;
+    
+    /** Pull elements from tree iterator.  Track tree level 0..max_level.
+     *  If nil rooted tree, don't give initial nil and DOWN nor final UP.
+     */
+- (id) nextElement;
+    
+- (BOOL) isEOF:(id<BaseTree>) obj;
+- (void) setUniqueNavigationNodes:(BOOL) uniqueNavigationNodes;
+    
+- (id) getTreeSource;
+    
+- (NSString *) getSourceName;
+    
+- (id<TokenStream>) getTokenStream;
+    
+- (void) setTokenStream:(id<TokenStream>) tokens;
+    
+- (CommonTreeAdaptor *) getTreeAdaptor;
+    
+- (void) setTreeAdaptor:(CommonTreeAdaptor *) adaptor;
+    
+- (CommonTree *)get:(NSInteger) i;
+
+- (NSInteger) LA:(NSInteger) i;
+    
+    /** Make stream jump to a new location, saving old location.
+     *  Switch back with pop().
+     */
+- (void) push:(NSInteger) index;
+    
+    /** Seek back to previous index saved during last push() call.
+     *  Return top of stack (return index).
+     */
+- (NSInteger) pop;
+    
+// TREE REWRITE INTERFACE
+    
+- (void) replaceChildren:(id)parent From:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id) t;
+    
+- (NSString *) toStringFromNode:(id<BaseTree>)startNode ToNode:(id<BaseTree>)stopNode;
+
+/** For debugging; destructive: moves tree iterator to end. */
+- (NSString *) toTokenTypeString;
+
+@property (retain) TreeIterator *it;
+@property (retain) IntArray *calls;
+@property BOOL hasNilRoot;
+@end
diff --git a/runtime/ObjC/Framework/CommonTreeNodeStream.m b/runtime/ObjC/Framework/CommonTreeNodeStream.m
new file mode 100644
index 0000000..b195f5d
--- /dev/null
+++ b/runtime/ObjC/Framework/CommonTreeNodeStream.m
@@ -0,0 +1,249 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+#import "CommonTreeNodeStream.h"
+#import "TokenStream.h"
+#import "IntStream.h"
+#import "CharStream.h"
+#import "AMutableArray.h"
+#import "CommonTreeAdaptor.h"
+
+#ifndef DEBUG_DEALLOC
+#define DEBUG_DEALLOC
+#endif
+
+@implementation CommonTreeNodeStream
+
+@synthesize root;
+@synthesize tokens;
+@synthesize adaptor;
+@synthesize level;
+
++ (CommonTreeNodeStream *) newCommonTreeNodeStream:(CommonTree *)theTree
+{
+    return [[CommonTreeNodeStream alloc] initWithTree:theTree];
+}
+
++ (CommonTreeNodeStream *) newCommonTreeNodeStream:(id<TreeAdaptor>)anAdaptor Tree:(CommonTree *)theTree
+{
+    return [[CommonTreeNodeStream alloc] initWithTreeAdaptor:anAdaptor Tree:theTree];
+}
+
+- (id) initWithTree:(CommonTree *)theTree
+{
+    if ((self = [super init]) != nil ) {
+        adaptor = [[CommonTreeAdaptor newTreeAdaptor] retain];
+        root = [theTree retain];
+        navigationNodeEOF = [[adaptor createTree:TokenTypeEOF Text:@"EOF"] retain]; // set EOF
+        it = [[TreeIterator newANTRLTreeIteratorWithAdaptor:adaptor andTree:root] retain];
+        calls = [[IntArray newArrayWithLen:INITIAL_CALL_STACK_SIZE] retain];
+        /** Tree (nil A B C) trees like flat A B C streams */
+        hasNilRoot = NO;
+        level = 0;
+    }
+    return self;
+}
+
+- (id) initWithTreeAdaptor:(id<TreeAdaptor>)anAdaptor Tree:(CommonTree *)theTree
+{
+    if ((self = [super init]) != nil ) {
+        adaptor = [anAdaptor retain];
+        root = [theTree retain];
+        navigationNodeEOF = [[adaptor createTree:TokenTypeEOF Text:@"EOF"] retain]; // set EOF
+        //    it = [root objectEnumerator];
+        it = [[TreeIterator newANTRLTreeIteratorWithAdaptor:adaptor andTree:root] retain];
+        calls = [[IntArray newArrayWithLen:INITIAL_CALL_STACK_SIZE] retain];
+        /** Tree (nil A B C) trees like flat A B C streams */
+        hasNilRoot = NO;
+        level = 0;
+    }
+    //    eof = [self isEOF]; // make sure tree iterator returns the EOF we want
+    return self;
+}
+
+- (void)dealloc
+{
+#ifdef DEBUG_DEALLOC
+    NSLog( @"called dealloc in CommonTreeNodeStream" );
+#endif
+    if ( root ) [root release];
+    if ( tokens ) [tokens release];
+    if ( adaptor ) [adaptor release];
+    if ( it ) [it release];
+    if ( calls ) [calls release];    
+    [super dealloc];
+}
+
+- (void) reset
+{
+    [super reset];
+    [it reset];
+    hasNilRoot = false;
+    level = 0;
+    if ( calls != nil )
+        [calls reset];  // [calls clear]; // in Java
+}
+
+/** Pull elements from tree iterator.  Track tree level 0..max_level.
+ *  If nil rooted tree, don't give initial nil and DOWN nor final UP.
+ */
+- (id) nextElement
+{
+    id t = [it nextObject];
+    //System.out.println("pulled "+adaptor.getType(t));
+    if ( t == [it up] ) {
+        level--;
+        if ( level==0 && hasNilRoot ) return [it nextObject]; // don't give last UP; get EOF
+    }
+    else if ( t == [it down] )
+        level++;
+    if ( level == 0 && [adaptor isNil:t] ) { // if nil root, scarf nil, DOWN
+        hasNilRoot = true;
+        t = [it nextObject]; // t is now DOWN, so get first real node next
+        level++;
+        t = [it nextObject];
+    }
+    return t;
+}
+
+- (BOOL) isEOF:(id<BaseTree>) aTree
+{
+    return [adaptor getType:(CommonTree *)aTree] == TokenTypeEOF;
+}
+
+- (void) setUniqueNavigationNodes:(BOOL) uniqueNavigationNodes
+{
+}
+
+- (id) getTreeSource
+{
+    return root;
+}
+
+- (NSString *) getSourceName
+{
+    return [[self getTokenStream] getSourceName];
+}
+
+- (id<TokenStream>) getTokenStream
+{
+    return tokens;
+}
+
+- (void) setTokenStream:(id<TokenStream>)theTokens
+{
+    if ( tokens != theTokens ) {
+        if ( tokens ) [tokens release];
+        [theTokens retain];
+    }
+    tokens = theTokens;
+}
+
+- (CommonTreeAdaptor *) getTreeAdaptor
+{
+    return adaptor;
+}
+
+- (void) setTreeAdaptor:(CommonTreeAdaptor *) anAdaptor
+{
+    if ( adaptor != anAdaptor ) {
+        if ( adaptor ) [adaptor release];
+        [anAdaptor retain];
+    }
+    adaptor = anAdaptor;
+}
+
+- (CommonTree *)getNode:(NSInteger) i
+{
+    @throw [RuntimeException newException:@"Absolute node indexes are meaningless in an unbuffered stream"];
+    return nil;
+}
+
+- (NSInteger) LA:(NSInteger) i
+{
+    return [adaptor getType:[self LT:i]];
+}
+
+/** Make stream jump to a new location, saving old location.
+ *  Switch back with pop().
+ */
+- (void) push:(NSInteger) anIndex
+{
+    if ( calls == nil ) {
+        calls = [[IntArray newArrayWithLen:INITIAL_CALL_STACK_SIZE] retain];
+    }
+    [calls push:p]; // save current anIndex
+    [self seek:anIndex];
+}
+
+/** Seek back to previous anIndex saved during last push() call.
+ *  Return top of stack (return anIndex).
+ */
+- (NSInteger) pop
+{
+    int ret = [calls pop];
+    [self seek:ret];
+    return ret;
+}    
+
+// TREE REWRITE INTERFACE
+
+- (void) replaceChildren:(id) parent From:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id) aTree
+{
+    if ( parent != nil ) {
+        [adaptor replaceChildren:parent From:startChildIndex To:stopChildIndex With:aTree];
+    }
+}
+
+- (NSString *) toStringFromNode:(id<BaseTree>)startNode ToNode:(id<BaseTree>)stopNode
+{
+    // we'll have to walk from start to stop in tree; we're not keeping
+    // a complete node stream buffer
+    return @"n/a";
+}
+
+/** For debugging; destructive: moves tree iterator to end. */
+- (NSString *) toTokenTypeString
+{
+    [self reset];
+    NSMutableString *buf = [NSMutableString stringWithCapacity:5];
+    id obj = [self LT:1];
+    NSInteger type = [adaptor getType:obj];
+    while ( type != TokenTypeEOF ) {
+        [buf appendString:@" "];
+        [buf appendString:[NSString stringWithFormat:@"%d", type]];
+        [self consume];
+        obj = [self LT:1];
+        type = [adaptor getType:obj];
+    }
+    return buf;
+}
+
+@synthesize it;
+@synthesize calls;
+@synthesize hasNilRoot;
+@end
+
diff --git a/runtime/ObjC/Framework/DFA.h b/runtime/ObjC/Framework/DFA.h
new file mode 100644
index 0000000..508e1ff
--- /dev/null
+++ b/runtime/ObjC/Framework/DFA.h
@@ -0,0 +1,84 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "BaseRecognizer.h"
+#import "CharStream.h"
+#import "NoViableAltException.h"
+
+@interface DFA : NSObject {
+	// the tables are set by subclasses to their own static versions.
+	const NSInteger *eot;
+	const NSInteger *eof;
+	const unichar *min;
+	const unichar *max;
+	const NSInteger *accept;
+	const NSInteger *special;
+	const NSInteger **transition;
+	
+	__strong BaseRecognizer *recognizer;
+	NSInteger decisionNumber;
+    NSInteger len;
+}
+
+- (id) initWithRecognizer:(id) theRecognizer;
+// simulate the DFA using the static tables and predict an alternative
+- (NSInteger) predict:(id<CharStream>)anInput;
+- (void) noViableAlt:(NSInteger)state Stream:(id<IntStream>)anInput;
+
+- (NSInteger) specialStateTransition:(NSInteger)state Stream:(id<IntStream>)anInput;
+// - (NSInteger) specialStateTransition:(NSInteger) state;
+//- (unichar) specialTransition:(unichar) state symbol:(NSInteger) symbol;
+
+// hook for debugger support
+- (void) error:(NoViableAltException *)nvae;
+
+- (NSString *) description;
+- (BOOL) evaluateSyntacticPredicate:(SEL)synpredFragment;
+
++ (void) setIsEmittingDebugInfo:(BOOL) shouldEmitDebugInfo;
+
+- (NSInteger *) unpackEncodedString:(NSString *)encodedString;
+- (short *) unpackEncodedStringToUnsignedChars:(NSString *)encodedString;
+- (NSInteger)getDecision;
+- (void)setDecision:(NSInteger)aDecison;
+
+- (BaseRecognizer *)getRecognizer;
+- (void)setRecognizer:(BaseRecognizer *)aRecognizer;
+- (NSInteger)length;
+
+@property const NSInteger *eot;
+@property const NSInteger *eof;
+@property const unichar *min;
+@property const unichar *max;
+@property const NSInteger *accept;
+@property const NSInteger *special;
+@property const NSInteger **transition;
+
+@property (retain, getter=getRecognizer,setter=setRecognizer:) BaseRecognizer *recognizer;
+@property (assign, getter=getDecision,setter=setDecision:) NSInteger decisionNumber;
+@property (assign, getter=getLen,setter=setLen:) NSInteger len;
+@end
diff --git a/runtime/ObjC/Framework/DFA.m b/runtime/ObjC/Framework/DFA.m
new file mode 100644
index 0000000..d0957e8
--- /dev/null
+++ b/runtime/ObjC/Framework/DFA.m
@@ -0,0 +1,262 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+#import "DFA.h"
+#import <Token.h>
+#import <NoViableAltException.h>
+
+NSInteger debug = 0;
+
+@implementation DFA
+@synthesize recognizer;
+@synthesize decisionNumber;
+@synthesize len;
+
+- (id) initWithRecognizer:(BaseRecognizer *) theRecognizer
+{
+	if ((self = [super init]) != nil) {
+		recognizer = theRecognizer;
+        [recognizer retain];
+        debug = 0;
+	}
+	return self;
+}
+
+// using the tables ANTLR generates for the DFA based prediction this method simulates the DFA
+// and returns the prediction of the alternative to be used.
+- (NSInteger) predict:(id<IntStream>)input
+{
+    if ( debug > 2 ) {
+        NSLog(@"Enter DFA.predict for decision %d", decisionNumber);
+    }
+	int aMark = [input mark];
+	int s = 0;
+	@try {
+		while (YES) {
+			if ( debug > 2 )
+                NSLog(@"DFA %d state %d LA(1)='%c'(%x)", decisionNumber, s, (unichar)[input LA:1], [input LA:1]);
+			NSInteger specialState = special[s];
+			if (specialState >= 0) {
+				// this state is special in that it has some code associated with it. we cannot do this in a pure DFA so
+				// we signal the caller accordingly.
+				if ( debug > 2 ) {
+                    NSLog(@"DFA %d state %d is special state %d", decisionNumber, s, specialState);
+                }
+				s = [self specialStateTransition:specialState Stream:input];
+                if ( debug > 2 ) {
+                    NSLog(@"DFA %d returns from special state %d to %d", decisionNumber, specialState, s);
+                }
+                if (s == -1 ) {
+                    [self noViableAlt:s Stream:input];
+                    return 0;
+                }
+				[input consume];
+				continue;
+			}
+			if (accept[s] >= 1) {  // if this is an accepting state return the prediction
+				if ( debug > 2 ) NSLog(@"accept; predict %d from state %d", accept[s], s);
+				return accept[s];
+			}
+			// based on the lookahead lookup the next transition, consume and do transition
+			// or signal that we have no viable alternative
+			NSInteger c = [input LA:1];
+			if ( (unichar)c >= min[s] && (unichar)c <= max[s]) {
+				int snext = transition[s][c-min[s]];
+				if (snext < 0) {
+                    // was in range but not a normal transition
+                    // must check EOT, which is like the else clause.
+                    // eot[s]>=0 indicates that an EOT edge goes to another
+                    // state.
+					if (eot[s] >= 0) {
+						if ( debug > 2 ) NSLog(@"EOT transition");
+						s = eot[s];
+						[input consume];
+                        // TODO: I had this as return accept[eot[s]]
+                        // which assumed here that the EOT edge always
+                        // went to an accept...faster to do this, but
+                        // what about predicated edges coming from EOT
+                        // target?
+						continue;
+					}
+					[self noViableAlt:s Stream:input];
+					return 0;
+				}
+				s = snext;
+				[input consume];
+				continue;
+			}
+			
+			if (eot[s] >= 0) {// EOT transition? we may still accept the input in the next state
+				if ( debug > 2 ) NSLog(@"EOT transition");
+				s = eot[s];
+				[input consume];
+				continue;
+			}
+			if ( c == TokenTypeEOF && eof[s] >= 0) {  // we are at EOF and may even accept the input.
+				if ( debug > 2 ) NSLog(@"accept via EOF; predict %d from %d", accept[eof[s]], eof[s]);
+				return accept[eof[s]];
+			}
+			if ( debug > 2 ) {
+                NSLog(@"no viable alt!\n");
+                NSLog(@"min[%d] = %d\n", s, min[s]);
+                NSLog(@"max[%d] = %d\n", s, min[s]);
+                NSLog(@"eot[%d] = %d\n", s, min[s]);
+                NSLog(@"eof[%d] = %d\n", s, min[s]);
+                for (NSInteger p = 0; p < self.len; p++) {
+                    NSLog(@"%d ", transition[s][p]);
+                }
+                NSLog(@"\n");
+            }
+			[self noViableAlt:s Stream:input];
+            return 0;
+		}
+	}
+	@finally {
+		[input rewind:aMark];
+	}
+	return 0; // silence warning
+}
+
+- (void) noViableAlt:(NSInteger)state Stream:(id<IntStream>)anInput
+{
+	if ([recognizer.state isBacktracking]) {
+		[recognizer.state setFailed:YES];
+		return;
+	}
+	NoViableAltException *nvae = [NoViableAltException newException:decisionNumber state:state stream:anInput];
+	[self error:nvae];
+	@throw nvae;
+}
+
+- (NSInteger) specialStateTransition:(NSInteger)state Stream:(id<IntStream>)anInput
+{
+    @throw [NoViableAltException newException:-1 state:state stream:anInput];
+	return -1;
+}
+
+- (void) error:(NoViableAltException *)nvae
+{
+	// empty, hook for debugger support
+}
+
+- (NSString *) description
+{
+	return @"subclass responsibility";
+}
+
+- (BOOL) evaluateSyntacticPredicate:(SEL)synpredFragment
+{
+	return [recognizer evaluateSyntacticPredicate:synpredFragment];
+}
+
++ (void) setIsEmittingDebugInfo:(BOOL) shouldEmitDebugInfo
+{
+	debug = shouldEmitDebugInfo;
+}
+
+/** Given a String that has a run-length-encoding of some unsigned shorts
+ *  like "\1\2\3\9", convert to short[] {2,9,9,9}.  We do this to avoid
+ *  static short[] which generates so much init code that the class won't
+ *  compile. :(
+ */
+- (NSInteger *) unpackEncodedString:(NSString *)encodedString
+{
+    // walk first to find how big it is.
+    int size = 0;
+    for (int i=0; i < [encodedString length]; i+=2) {
+        size += [encodedString characterAtIndex:i];
+    }
+    __strong NSInteger *data = (NSInteger *)calloc(size, sizeof(NSInteger));
+    int di = 0;
+    for (int i=0; i < [encodedString length]; i+=2) {
+        char n = [encodedString characterAtIndex:i];
+        char v = [encodedString characterAtIndex:i+1];
+        // add v n times to data
+        for (int j = 0; j < n; j++) {
+            data[di++] = v;
+        }
+    }
+    return data;
+}
+
+/** Hideous duplication of code, but I need different typed arrays out :( */
+- (short *) unpackEncodedStringToUnsignedChars:(NSString *)encodedString
+{
+    // walk first to find how big it is.
+    int size = 0;
+    for (int i=0; i < [encodedString length]; i+=2) {
+        size += [encodedString characterAtIndex:i];
+    }
+    __strong short *data = (short *)calloc(size, sizeof(short));
+    int di = 0;
+    for (int i=0; i < [encodedString length]; i+=2) {
+        char n = [encodedString characterAtIndex:i];
+        char v = [encodedString characterAtIndex:i+1];
+        // add v n times to data
+        for (int j = 0; j < n; j++) {
+            data[di++] = v;
+        }
+    }
+    return (short *)data;
+}
+
+- (NSInteger)getDecision
+{
+    return decisionNumber;
+}
+
+- (void)setDecision:(NSInteger)aDecison
+{
+    decisionNumber = aDecison;
+}
+
+- (BaseRecognizer *)getRecognizer
+{
+    return recognizer;
+}
+
+- (void)setRecognizer:(BaseRecognizer *)aRecognizer
+{
+    if ( recognizer != aRecognizer ) {
+        if ( recognizer ) [recognizer release];
+        [aRecognizer retain];
+    }
+    recognizer = aRecognizer;
+}
+
+- (NSInteger)length
+{
+    return len;
+}
+
+@synthesize eot;
+@synthesize eof;
+@synthesize min;
+@synthesize max;
+@synthesize accept;
+@synthesize special;
+@synthesize transition;
+@end
diff --git a/runtime/ObjC/Framework/Debug.h b/runtime/ObjC/Framework/Debug.h
new file mode 100644
index 0000000..9b3ccda
--- /dev/null
+++ b/runtime/ObjC/Framework/Debug.h
@@ -0,0 +1,33 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke
+// 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.
+
+#import "DebugEventListener.h"
+#import "DebugEventSocketProxy.h"
+#import "DebugParser.h"
+#import "DebugTokenStream.h"
+#import "DebugTreeParser.h"
+#import "DebugTreeNodeStream.h"
+#import "DebugTreeAdaptor.h"
diff --git a/runtime/ObjC/Framework/DebugEventListener.h b/runtime/ObjC/Framework/DebugEventListener.h
new file mode 100644
index 0000000..11f94a8
--- /dev/null
+++ b/runtime/ObjC/Framework/DebugEventListener.h
@@ -0,0 +1,275 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "Token.h"
+#import "RecognitionException.h"
+
+@protocol DebugEventListener 
+
+#define DebugProtocolVersion 1
+
+/** The parser has just entered a rule.  No decision has been made about
+*  which alt is predicted.  This is fired AFTER init actions have been
+*  executed.  Attributes are defined and available etc...
+*/
+- (void) enterRule:(NSString *)ruleName;
+
+/** Because rules can have lots of alternatives, it is very useful to
+*  know which alt you are entering.  This is 1..n for n alts.
+*/
+- (void) enterAlt:(NSInteger)alt;
+
+/** This is the last thing executed before leaving a rule.  It is
+*  executed even if an exception is thrown.  This is triggered after
+*  error reporting and recovery have occurred (unless the exception is
+											   *  not caught in this rule).  This implies an "exitAlt" event.
+*/
+- (void) exitRule:(NSString *)ruleName;
+
+/** Track entry into any (...) subrule other EBNF construct */
+- (void) enterSubRule:(NSInteger)decisionNumber;
+
+- (void) exitSubRule:(NSInteger)decisionNumber;
+
+/** Every decision, fixed k or arbitrary, has an enter/exit event
+*  so that a GUI can easily track what LT/consume events are
+*  associated with prediction.  You will see a single enter/exit
+*  subrule but multiple enter/exit decision events, one for each
+*  loop iteration.
+*/
+- (void) enterDecision:(NSInteger)decisionNumber;
+
+- (void) exitDecision:(NSInteger)decisionNumber;
+
+/** An input token was consumed; matched by any kind of element.
+*  Trigger after the token was matched by things like match(), matchAny().
+*/
+- (void) consumeToken:(id<Token>)t;
+
+/** An off-channel input token was consumed.
+*  Trigger after the token was matched by things like match(), matchAny().
+*  (unless of course the hidden token is first stuff in the input stream).
+*/
+- (void) consumeHiddenToken:(id<Token>)t;
+
+/** Somebody (anybody) looked ahead.  Note that this actually gets
+*  triggered by both LA and LT calls.  The debugger will want to know
+*  which Token object was examined.  Like consumeToken, this indicates
+*  what token was seen at that depth.  A remote debugger cannot look
+*  ahead into a file it doesn't have so LT events must pass the token
+*  even if the info is redundant.
+*/
+- (void) LT:(NSInteger)i foundToken:(id<Token>)t;
+
+/** The parser is going to look arbitrarily ahead; mark this location,
+*  the token stream's marker is sent in case you need it.
+*/
+- (void) mark:(NSInteger)marker;
+
+/** After an arbitrairly long lookahead as with a cyclic DFA (or with
+*  any backtrack), this informs the debugger that stream should be
+*  rewound to the position associated with marker.
+*/
+- (void) rewind:(NSInteger)marker;
+
+/** Rewind to the input position of the last marker.
+*  Used currently only after a cyclic DFA and just
+*  before starting a sem/syn predicate to get the
+*  input position back to the start of the decision.
+*  Do not "pop" the marker off the state.  mark(i)
+*  and rewind(i) should balance still.
+*/
+- (void) rewind;
+
+- (void) beginBacktrack:(NSInteger)level;
+
+- (void) endBacktrack:(NSInteger)level wasSuccessful:(BOOL)successful;
+
+/** To watch a parser move through the grammar, the parser needs to
+*  inform the debugger what line/charPos it is passing in the grammar.
+*  For now, this does not know how to switch from one grammar to the
+*  other and back for island grammars etc...
+*
+*  This should also allow breakpoints because the debugger can stop
+*  the parser whenever it hits this line/pos.
+*/
+- (void) locationLine:(NSInteger)line column:(NSInteger)pos;
+
+/** A recognition exception occurred such as NoViableAltException.  I made
+*  this a generic event so that I can alter the exception hierachy later
+*  without having to alter all the debug objects.
+*
+*  Upon error, the stack of enter rule/subrule must be properly unwound.
+*  If no viable alt occurs it is within an enter/exit decision, which
+*  also must be rewound.  Even the rewind for each mark must be unwount.
+*  In the Java target this is pretty easy using try/finally, if a bit
+*  ugly in the generated code.  The rewind is generated in DFA.predict()
+*  actually so no code needs to be generated for that.  For languages
+*  w/o this "finally" feature (C++?), the target implementor will have
+*  to build an event stack or something.
+*
+*  Across a socket for remote debugging, only the RecognitionException
+*  data fields are transmitted.  The token object or whatever that
+*  caused the problem was the last object referenced by LT.  The
+*  immediately preceding LT event should hold the unexpected Token or
+*  char.
+*
+*  Here is a sample event trace for grammar:
+*
+*  b : C ({;}A|B) // {;} is there to prevent A|B becoming a set
+*    | D
+*    ;
+*
+*  The sequence for this rule (with no viable alt in the subrule) for
+*  input 'c c' (there are 3 tokens) is:
+*
+*		commence
+*		LT(1)
+*		enterRule b
+*		location 7 1
+*		enter decision 3
+*		LT(1)
+*		exit decision 3
+*		enterAlt1
+*		location 7 5
+*		LT(1)
+*		consumeToken [c/<4>,1:0]
+*		location 7 7
+*		enterSubRule 2
+*		enter decision 2
+*		LT(1)
+*		LT(1)
+*		recognitionException NoViableAltException 2 1 2
+*		exit decision 2
+*		exitSubRule 2
+*		beginResync
+*		LT(1)
+*		consumeToken [c/<4>,1:1]
+*		LT(1)
+*		endResync
+*		LT(-1)
+*		exitRule b
+*		terminate
+*/
+- (void) recognitionException:(RecognitionException *)e;
+
+/** Indicates the recognizer is about to consume tokens to resynchronize
+*  the parser.  Any consume events from here until the recovered event
+*  are not part of the parse--they are dead tokens.
+*/
+- (void) beginResync;
+
+/** Indicates that the recognizer has finished consuming tokens in order
+*  to resychronize.  There may be multiple beginResync/endResync pairs
+*  before the recognizer comes out of errorRecovery mode (in which
+*  multiple errors are suppressed).  This will be useful
+*  in a gui where you want to probably grey out tokens that are consumed
+*  but not matched to anything in grammar.  Anything between
+*  a beginResync/endResync pair was tossed out by the parser.
+*/
+- (void) endResync;
+
+/** A semantic predicate was evaluate with this result and action text */
+- (void) semanticPredicate:(NSString *)predicate matched:(BOOL)result;
+
+/** Announce that parsing has begun.  Not technically useful except for
+*  sending events over a socket.  A GUI for example will launch a thread
+*  to connect and communicate with a remote parser.  The thread will want
+*  to notify the GUI when a connection is made.  ANTLR parsers
+*  trigger this upon entry to the first rule (the ruleLevel is used to
+*  figure this out).
+*/
+- (void) commence;
+
+/** Parsing is over; successfully or not.  Mostly useful for telling
+*  remote debugging listeners that it's time to quit.  When the rule
+*  invocation level goes to zero at the end of a rule, we are done
+*  parsing.
+*/
+- (void) terminate;
+
+
+// T r e e  P a r s i n g
+
+/** Input for a tree parser is an AST, but we know nothing for sure
+*  about a node except its type and text (obtained from the adaptor).
+*  This is the analog of the consumeToken method.  Again, the ID is
+*  the hashCode usually of the node so it only works if hashCode is
+*  not implemented.  If the type is UP or DOWN, then
+*  the ID is not really meaningful as it's fixed--there is
+*  just one UP node and one DOWN navigation node.
+*/
+- (void) consumeNode:(NSInteger)nodeHash ofType:(NSInteger)type text:(NSString *)text;
+
+/** The tree parser lookedahead.  If the type is UP or DOWN,
+*  then the ID is not really meaningful as it's fixed--there is
+*  just one UP node and one DOWN navigation node.
+*/
+- (void) LT:(NSInteger)i foundNode:(unsigned)nodeHash ofType:(NSInteger)type text:(NSString *)text;
+
+
+// A S T  E v e n t s
+
+/** A nil was created (even nil nodes have a unique ID...
+*  they are not "null" per se).  As of 4/28/2006, this
+*  seems to be uniquely triggered when starting a new subtree
+*  such as when entering a subrule in automatic mode and when
+*  building a tree in rewrite mode.
+*/
+- (void) createNilNode:(unsigned)hash;
+
+/** Announce a new node built from text */
+- (void) createNode:(unsigned)hash text:(NSString *)text type:(NSInteger)type;
+
+/** Announce a new node built from an existing token */
+- (void) createNode:(unsigned)hash fromTokenAtIndex:(NSInteger)tokenIndex;
+
+/** Make a node the new root of an existing root.  See
+*
+*  Note: the newRootID parameter is possibly different
+*  than the TreeAdaptor.becomeRoot() newRoot parameter.
+*  In our case, it will always be the result of calling
+*  TreeAdaptor.becomeRoot() and not root_n or whatever.
+*
+*  The listener should assume that this event occurs
+*  only when the current subrule (or rule) subtree is
+*  being reset to newRootID.
+*
+*/
+- (void) makeNode:(unsigned)newRootHash parentOf:(unsigned)oldRootHash;
+
+/** Make childID a child of rootID.
+*  @see org.antlr.runtime.tree.TreeAdaptor.addChild()
+*/
+- (void) addChild:(unsigned)childHash toTree:(unsigned)treeHash;
+
+/** Set the token start/stop token index for a subtree root or node */
+- (void) setTokenBoundariesForTree:(unsigned)nodeHash From:(NSUInteger)tokenStartIndex To:(NSUInteger)tokenStopIndex;
+
+- (void) waitForDebuggerConnection;
+
+@end
diff --git a/runtime/ObjC/Framework/DebugEventSocketProxy.h b/runtime/ObjC/Framework/DebugEventSocketProxy.h
new file mode 100644
index 0000000..c40b3b4
--- /dev/null
+++ b/runtime/ObjC/Framework/DebugEventSocketProxy.h
@@ -0,0 +1,112 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "Parser.h"
+#import "DebugEventListener.h"
+#import <sys/socket.h>
+#import <netinet/in.h>
+#import <netinet/tcp.h>
+#include <arpa/inet.h>
+
+// default port for ANTLRWorks
+#define DEFAULT_DEBUGGER_PORT 49001
+
+@interface DebugEventSocketProxy : NSObject <DebugEventListener> {
+	int serverSocket;
+	
+	struct sockaddr debugger_sockaddr;
+	socklen_t debugger_socklen;
+	int debuggerSocket;
+	NSFileHandle *debuggerFH;
+	
+	NSString *grammarName;
+	int debuggerPort;
+}
+
+- (id) init;
+- (id) initWithGrammarName:(NSString *)aGrammarName debuggerPort:(NSInteger)aPort;
+- (void) waitForDebuggerConnection;
+- (void) waitForAck;
+- (void) sendToDebugger:(NSString *)message;
+- (void) sendToDebugger:(NSString *)message waitForResponse:(BOOL)wait;
+
+- (NSInteger) serverSocket;
+- (void) setServerSocket: (NSInteger) aServerSocket;
+
+- (NSInteger) debuggerSocket;
+- (void) setDebuggerSocket: (NSInteger) aDebuggerSocket;
+
+- (NSString *) grammarName;
+- (void) setGrammarName: (NSString *) aGrammarName;
+
+- (NSInteger) debuggerPort;
+- (void) setDebuggerPort: (NSInteger) aDebuggerPort;
+
+- (NSString *) escapeNewlines:(NSString *)aString;
+
+#pragma mark -
+
+#pragma mark DebugEventListener Protocol
+- (void) enterRule:(NSString *)ruleName;
+- (void) enterAlt:(NSInteger)alt;
+- (void) exitRule:(NSString *)ruleName;
+- (void) enterSubRule:(NSInteger)decisionNumber;
+- (void) exitSubRule:(NSInteger)decisionNumber;
+- (void) enterDecision:(NSInteger)decisionNumber;
+- (void) exitDecision:(NSInteger)decisionNumber;
+- (void) consumeToken:(id<Token>)t;
+- (void) consumeHiddenToken:(id<Token>)t;
+- (void) LT:(NSInteger)i foundToken:(id<Token>)t;
+- (void) mark:(NSInteger)marker;
+- (void) rewind:(NSInteger)marker;
+- (void) rewind;
+- (void) beginBacktrack:(NSInteger)level;
+- (void) endBacktrack:(NSInteger)level wasSuccessful:(BOOL)successful;
+- (void) locationLine:(NSInteger)line column:(NSInteger)pos;
+- (void) recognitionException:(RecognitionException *)e;
+- (void) beginResync;
+- (void) endResync;
+- (void) semanticPredicate:(NSString *)predicate matched:(BOOL)result;
+- (void) commence;
+- (void) terminate;
+
+
+#pragma mark Tree Parsing
+- (void) consumeNode:(unsigned)nodeHash ofType:(NSInteger)type text:(NSString *)text;
+- (void) LT:(NSInteger)i foundNode:(unsigned)nodeHash ofType:(NSInteger)type text:(NSString *)text;
+
+
+#pragma mark AST Events
+
+- (void) createNilNode:(unsigned)hash;
+- (void) createNode:(unsigned)hash text:(NSString *)text type:(NSInteger)type;
+- (void) createNode:(unsigned)hash fromTokenAtIndex:(NSInteger)tokenIndex;
+- (void) makeNode:(unsigned)newRootHash parentOf:(unsigned)oldRootHash;
+- (void) addChild:(unsigned)childHash toTree:(unsigned)treeHash;
+- (void) setTokenBoundariesForTree:(unsigned)nodeHash From:(NSInteger)tokenStartIndex To:(NSInteger)tokenStopIndex;
+
+@end
diff --git a/runtime/ObjC/Framework/DebugEventSocketProxy.m b/runtime/ObjC/Framework/DebugEventSocketProxy.m
new file mode 100644
index 0000000..4155da2
--- /dev/null
+++ b/runtime/ObjC/Framework/DebugEventSocketProxy.m
@@ -0,0 +1,423 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke
+// 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.
+
+#import "DebugEventSocketProxy.h"
+#import "Token+DebuggerSupport.h"
+#include <string.h>
+
+static NSData *newlineData = nil;
+static unsigned lengthOfUTF8Ack = 0;
+
+@implementation DebugEventSocketProxy
+
++ (void) initialize
+{
+	if (!newlineData) newlineData = [@"\n" dataUsingEncoding:NSUTF8StringEncoding];
+	if (!lengthOfUTF8Ack) lengthOfUTF8Ack = [[@"ack\n" dataUsingEncoding:NSUTF8StringEncoding] length];
+}
+
+- (id) init
+{
+	return [self initWithGrammarName:nil debuggerPort:DEFAULT_DEBUGGER_PORT];
+}
+
+- (id) initWithGrammarName:(NSString *)aGrammarName debuggerPort:(NSInteger)aPort
+{
+	self = [super init];
+	if (self) {
+		serverSocket = -1;
+		[self setGrammarName:aGrammarName];
+		if (aPort == -1) aPort = DEFAULT_DEBUGGER_PORT;
+		[self setDebuggerPort:aPort];
+	}
+	return self;
+}
+
+- (void) dealloc
+{
+	if (serverSocket != -1) 
+		shutdown(serverSocket,SHUT_RDWR);
+	serverSocket = -1;
+	[debuggerFH release];
+    [self setGrammarName:nil];
+    [super dealloc];
+}
+
+/* Java stuff
+public void handshake() throws IOException {
+    if ( serverSocket==nil ) {
+        serverSocket = new ServerSocket(port);
+        socket = serverSocket.accept();
+        socket.setTcpNoDelay(true);
+        OutputStream os = socket.getOutputStream();
+        OutputStreamWriter osw = new OutputStreamWriter(os, "UTF8");
+        out = new PrintWriter(new BufferedWriter(osw));
+        InputStream is = socket.getInputStream();
+        InputStreamReader isr = new InputStreamReader(is, "UTF8");
+        in = new BufferedReader(isr);
+        out.println("ANTLR "+ DebugEventListener.PROTOCOL_VERSION);
+        out.println("grammar \""+ grammarFileName);
+        out.flush();
+        ack();
+    }
+}
+
+- (void) commence
+{
+    // don't bother sending event; listener will trigger upon connection
+}
+
+- (void) terminate
+{
+    [self transmit:@"terminate";
+    [out close];
+    try {
+        [socket close];
+    }
+    catch (IOException *ioe) {
+        ioe.printStackTrace(System.err);
+    }
+}
+
+- (void) ack
+{
+    try {
+        in.readLine();
+    }
+    catch (IOException ioe) {
+        ioe.printStackTrace(System.err);
+    }
+}
+
+protected void transmit(String event) {
+    out.println(event);
+    out.flush();
+    ack();
+}
+*/
+
+- (void) waitForDebuggerConnection
+{
+	if (serverSocket == -1) {
+		serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+		
+		NSAssert1(serverSocket != -1, @"Failed to create debugger socket. %s", strerror(errno));
+		
+		int yes = 1;
+		setsockopt(serverSocket, SOL_SOCKET, SO_KEEPALIVE|SO_REUSEPORT|SO_REUSEADDR|TCP_NODELAY, (void *)&yes, sizeof(NSInteger));
+
+		struct sockaddr_in server_addr;
+		bzero(&server_addr, sizeof(struct sockaddr_in));
+		server_addr.sin_family = AF_INET;
+		server_addr.sin_port = htons([self debuggerPort]);
+		server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
+		NSAssert1( bind(serverSocket, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) != -1, @"bind(2) failed. %s", strerror(errno));
+
+		NSAssert1(listen(serverSocket,50) == 0, @"listen(2) failed. %s", strerror(errno));
+		
+		NSLog(@"ANTLR waiting for debugger attach (grammar %@)", [self grammarName]);
+		
+		debuggerSocket = accept(serverSocket, &debugger_sockaddr, &debugger_socklen);
+		NSAssert1( debuggerSocket != -1, @"accept(2) failed. %s", strerror(errno));
+		
+		debuggerFH = [[NSFileHandle alloc] initWithFileDescriptor:debuggerSocket];
+		[self sendToDebugger:[NSString stringWithFormat:@"ANTLR %d", DebugProtocolVersion] waitForResponse:NO];
+		[self sendToDebugger:[NSString stringWithFormat:@"grammar \"%@", [self grammarName]] waitForResponse:NO];
+	}
+}
+
+- (void) waitForAck
+{
+	NSString *response;
+	@try {
+		NSData *newLine = [debuggerFH readDataOfLength:lengthOfUTF8Ack];
+		response = [[NSString alloc] initWithData:newLine encoding:NSUTF8StringEncoding];
+		if (![response isEqualToString:@"ack\n"]) @throw [NSException exceptionWithName:@"DebugEventSocketProxy" reason:@"illegal response from debugger" userInfo:nil];
+	}
+	@catch (NSException *e) {
+		NSLog(@"socket died or debugger misbehaved: %@ read <%@>", e, response);
+	}
+	@finally {
+		[response release];
+	}
+}
+
+- (void) sendToDebugger:(NSString *)message
+{
+	[self sendToDebugger:message waitForResponse:YES];
+}
+
+- (void) sendToDebugger:(NSString *)message waitForResponse:(BOOL)wait
+{
+	if (! debuggerFH ) return;
+	[debuggerFH writeData:[message dataUsingEncoding:NSUTF8StringEncoding]];
+	[debuggerFH writeData:newlineData];
+	if (wait) [self waitForAck];
+}
+
+- (NSInteger) serverSocket
+{
+    return serverSocket;
+}
+
+- (void) setServerSocket: (NSInteger) aServerSocket
+{
+    serverSocket = aServerSocket;
+}
+
+- (NSInteger) debuggerSocket
+{
+    return debuggerSocket;
+}
+
+- (void) setDebuggerSocket: (NSInteger) aDebuggerSocket
+{
+    debuggerSocket = aDebuggerSocket;
+}
+
+- (NSString *) grammarName
+{
+    return grammarName; 
+}
+
+- (void) setGrammarName: (NSString *) aGrammarName
+{
+    if (grammarName != aGrammarName) {
+        [aGrammarName retain];
+        [grammarName release];
+        grammarName = aGrammarName;
+    }
+}
+
+- (NSInteger) debuggerPort
+{
+    return debuggerPort;
+}
+
+- (void) setDebuggerPort: (NSInteger) aDebuggerPort
+{
+    debuggerPort = aDebuggerPort;
+}
+
+- (NSString *) escapeNewlines:(NSString *)aString
+{
+	NSMutableString *escapedText;
+	if (aString) {
+		escapedText = [NSMutableString stringWithString:aString];
+		NSRange wholeString = NSMakeRange(0,[escapedText length]);
+		[escapedText replaceOccurrencesOfString:@"%" withString:@"%25" options:0 range:wholeString];
+		[escapedText replaceOccurrencesOfString:@"\n" withString:@"%0A" options:0 range:wholeString];
+		[escapedText replaceOccurrencesOfString:@"\r" withString:@"%0D" options:0 range:wholeString];
+	} else {
+		escapedText = [NSMutableString stringWithString:@""];
+	}
+	return escapedText;
+}
+
+#pragma mark -
+
+#pragma mark DebugEventListener Protocol
+- (void) enterRule:(NSString *)ruleName
+{
+	[self sendToDebugger:[NSString stringWithFormat:@"enterRule %@", ruleName]];
+}
+
+- (void) enterAlt:(NSInteger)alt
+{
+	[self sendToDebugger:[NSString stringWithFormat:@"enterAlt %d", alt]]; 
+}
+
+- (void) exitRule:(NSString *)ruleName
+{
+	[self sendToDebugger:[NSString stringWithFormat:@"exitRule %@", ruleName]];
+}
+
+- (void) enterSubRule:(NSInteger)decisionNumber
+{
+	[self sendToDebugger:[NSString stringWithFormat:@"enterSubRule %d", decisionNumber]];
+}
+
+- (void) exitSubRule:(NSInteger)decisionNumber
+{
+	[self sendToDebugger:[NSString stringWithFormat:@"exitSubRule %d", decisionNumber]];
+}
+
+- (void) enterDecision:(NSInteger)decisionNumber
+{
+	[self sendToDebugger:[NSString stringWithFormat:@"enterDecision %d", decisionNumber]];
+}
+
+- (void) exitDecision:(NSInteger)decisionNumber
+{
+	[self sendToDebugger:[NSString stringWithFormat:@"exitDecision %d", decisionNumber]];
+}
+
+- (void) consumeToken:(id<Token>)t
+{
+	[self sendToDebugger:[NSString stringWithFormat:@"consumeToken %@", [self escapeNewlines:[t description]]]];
+}
+
+- (void) consumeHiddenToken:(id<Token>)t
+{
+	[self sendToDebugger:[NSString stringWithFormat:@"consumeHiddenToken %@", [self escapeNewlines:[t description]]]];
+}
+
+- (void) LT:(NSInteger)i foundToken:(id<Token>)t
+{
+	[self sendToDebugger:[NSString stringWithFormat:@"LT %d %@", i, [self escapeNewlines:[t description]]]];
+}
+
+- (void) mark:(NSInteger)marker
+{
+	[self sendToDebugger:[NSString stringWithFormat:@"mark %d", marker]];
+}
+- (void) rewind:(NSInteger)marker
+{
+	[self sendToDebugger:[NSString stringWithFormat:@"rewind %d", marker]];
+}
+
+- (void) rewind
+{
+	[self sendToDebugger:@"rewind"];
+}
+
+- (void) beginBacktrack:(NSInteger)level
+{
+	[self sendToDebugger:[NSString stringWithFormat:@"beginBacktrack %d", level]];
+}
+
+- (void) endBacktrack:(NSInteger)level wasSuccessful:(BOOL)successful
+{
+	[self sendToDebugger:[NSString stringWithFormat:@"endBacktrack %d %d", level, successful ? 1 : 0]];
+}
+
+- (void) locationLine:(NSInteger)line column:(NSInteger)pos
+{
+	[self sendToDebugger:[NSString stringWithFormat:@"location %d %d", line, pos]];
+}
+
+- (void) recognitionException:(RecognitionException *)e
+{
+#warning TODO: recognition exceptions
+	// these must use the names of the corresponding Java exception classes, because ANTLRWorks recreates the exception
+	// objects on the Java side.
+	// Write categories for Objective-C exceptions to provide those names
+}
+
+- (void) beginResync
+{
+	[self sendToDebugger:@"beginResync"];
+}
+	
+- (void) endResync
+{
+	[self sendToDebugger:@"endResync"];
+}
+
+- (void) semanticPredicate:(NSString *)predicate matched:(BOOL)result
+{
+	[self sendToDebugger:[NSString stringWithFormat:@"semanticPredicate %d %@", result?1:0, [self escapeNewlines:predicate]]];
+}
+
+- (void) commence
+{
+	// no need to send event
+}
+
+- (void) terminate
+{
+	[self sendToDebugger:@"terminate"];
+	@try {
+		[debuggerFH closeFile];
+	}
+	@finally {
+#warning TODO: make socket handling robust. too lazy now...
+		shutdown(serverSocket,SHUT_RDWR);
+		serverSocket = -1;
+	}
+}
+
+
+#pragma mark Tree Parsing
+- (void) consumeNode:(unsigned)nodeHash ofType:(NSInteger)type text:(NSString *)text
+{
+	[self sendToDebugger:[NSString stringWithFormat:@"consumeNode %u %d %@",
+		nodeHash,
+		type,
+		[self escapeNewlines:text]
+		]];
+}
+
+- (void) LT:(NSInteger)i foundNode:(unsigned)nodeHash ofType:(NSInteger)type text:(NSString *)text
+{
+	[self sendToDebugger:[NSString stringWithFormat:@"LN %d %u %d %@",
+		i,
+		nodeHash,
+		type,
+		[self escapeNewlines:text]
+		]];
+}
+
+
+#pragma mark AST Events
+
+- (void) createNilNode:(unsigned)hash
+{
+	[self sendToDebugger:[NSString stringWithFormat:@"nilNode %u", hash]];
+}
+
+- (void) createNode:(unsigned)hash text:(NSString *)text type:(NSInteger)type
+{
+	[self sendToDebugger:[NSString stringWithFormat:@"createNodeFromToken %u %d %@", 
+		hash,
+		type,
+		[self escapeNewlines:text]
+		]];
+}
+
+- (void) createNode:(unsigned)hash fromTokenAtIndex:(NSInteger)tokenIndex
+{
+	[self sendToDebugger:[NSString stringWithFormat:@"createNode %u %d", hash, tokenIndex]];
+}
+
+- (void) becomeRoot:(unsigned)newRootHash old:(unsigned)oldRootHash
+{
+	[self sendToDebugger:[NSString stringWithFormat:@"becomeRoot %u %u", newRootHash, oldRootHash]];
+}
+
+- (void) addChild:(unsigned)childHash toTree:(unsigned)treeHash
+{
+	[self sendToDebugger:[NSString stringWithFormat:@"addChild %u %u", treeHash, childHash]];
+}
+
+- (void) setTokenBoundariesForTree:(unsigned)nodeHash From:(NSInteger)tokenStartIndex To:(NSInteger)tokenStopIndex
+{
+	[self sendToDebugger:[NSString stringWithFormat:@"setTokenBoundaries %u %d %d", nodeHash, tokenStartIndex, tokenStopIndex]];
+}
+
+
+
+@end
diff --git a/runtime/ObjC/Framework/DebugParser.h b/runtime/ObjC/Framework/DebugParser.h
new file mode 100644
index 0000000..9f34d96
--- /dev/null
+++ b/runtime/ObjC/Framework/DebugParser.h
@@ -0,0 +1,57 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "Parser.h"
+#import "DebugEventSocketProxy.h"
+#import "DebugTokenStream.h"
+
+@interface DebugParser : Parser {
+	id<DebugEventListener> debugListener;
+}
+
++ (id) newDebugParser:(id<TokenStream>)theStream
+        debugListener:(id<DebugEventListener>)debugListener;
+
++ (id) newDebugParser:(id<TokenStream>)theStream
+                state:(RecognizerSharedState *)state;
+
++ (id) newDebugParser:(id<TokenStream>)theStream
+        debugListener:(id<DebugEventListener>)debugListener
+                state:(RecognizerSharedState *)state;
+
+- (id) initWithTokenStream:(id<TokenStream>)theStream;
+- (id) initWithTokenStream:(id<TokenStream>)theStream
+			  debuggerPort:(NSInteger)portNumber;
+// designated initializer
+- (id) initWithTokenStream:(id<TokenStream>)theStream
+			 debugListener:(id<DebugEventListener>)theDebugListener
+			  debuggerPort:(NSInteger)portNumber;
+
+- (id<DebugEventListener>) debugListener;
+- (void) setDebugListener: (id<DebugEventListener>) aDebugListener;
+
+@end
diff --git a/runtime/ObjC/Framework/DebugParser.m b/runtime/ObjC/Framework/DebugParser.m
new file mode 100644
index 0000000..d67e895
--- /dev/null
+++ b/runtime/ObjC/Framework/DebugParser.m
@@ -0,0 +1,113 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke
+// 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.
+
+#import "DebugParser.h"
+
+
+@implementation DebugParser
+
+- (id) initWithTokenStream:(id<TokenStream>)theStream
+{
+	return [self initWithTokenStream:theStream debugListener:nil debuggerPort:-1];
+}
+
+- (id) initWithTokenStream:(id<TokenStream>)theStream
+			  debuggerPort:(NSInteger)portNumber
+{
+	return [self initWithTokenStream:theStream debugListener:nil debuggerPort:portNumber];
+}
+
+- (id) initWithTokenStream:(id<TokenStream>)theStream
+			 debugListener:(id<DebugEventListener>)theDebugListener
+			  debuggerPort:(NSInteger)portNumber
+{
+	id<DebugEventListener,NSObject> debugger = nil;
+	id<TokenStream> tokenStream = nil;
+	if (theDebugListener) {
+		debugger = [(id<DebugEventListener,NSObject>)theDebugListener retain];
+		debugger = theDebugListener;
+	} else {
+		debugger = [[DebugEventSocketProxy alloc] initWithGrammarName:[self grammarFileName] debuggerPort:portNumber];
+	}
+	if (theStream && ![theStream isKindOfClass:[DebugTokenStream class]]) {
+		tokenStream = [[DebugTokenStream alloc] initWithTokenStream:theStream debugListener:debugger];
+	} else {
+		tokenStream = [theStream retain];
+		tokenStream = theStream;
+	}
+	self = [super initWithTokenStream:tokenStream];
+	if (self) {
+		[self setDebugListener:debugger];
+		[debugger release];
+		[tokenStream release];
+		[debugListener waitForDebuggerConnection];
+	}
+	return self;
+}
+
+- (void) dealloc
+{
+    [self setDebugListener: nil];
+    [super dealloc];
+}
+
+- (id<DebugEventListener>) debugListener
+{
+    return debugListener; 
+}
+
+- (void) setDebugListener: (id<DebugEventListener>) aDebugListener
+{
+    if (debugListener != aDebugListener) {
+        [(id<DebugEventListener,NSObject>)aDebugListener retain];
+        [(id<DebugEventListener,NSObject>)debugListener release];
+        debugListener = aDebugListener;
+    }
+}
+
+#pragma mark -
+#pragma mark Overrides
+
+- (void) beginResync
+{
+	[debugListener beginResync];
+}
+
+- (void) endResync
+{
+	[debugListener endResync];
+}
+- (void)beginBacktracking:(NSInteger)level
+{
+	[debugListener beginBacktrack:level];
+}
+
+- (void)endBacktracking:(NSInteger)level wasSuccessful:(BOOL)successful
+{
+	[debugListener endBacktrack:level wasSuccessful:successful];
+}
+
+@end
diff --git a/runtime/ObjC/Framework/DebugTokenStream.h b/runtime/ObjC/Framework/DebugTokenStream.h
new file mode 100644
index 0000000..6a30491
--- /dev/null
+++ b/runtime/ObjC/Framework/DebugTokenStream.h
@@ -0,0 +1,62 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "Parser.h"
+#import "TokenStream.h"
+#import "TokenSource.h"
+#import "DebugTokenStream.h"
+#import "DebugEventListener.h"
+
+@interface DebugTokenStream : NSObject <TokenStream>
+{
+	id<DebugEventListener> debugListener;
+	id<TokenStream> input;
+	BOOL initialStreamState;
+    NSInteger lastMarker;
+}
+
+- (id) initWithTokenStream:(id<TokenStream>)theStream debugListener:(id<DebugEventListener>)debugger;
+
+- (id<DebugEventListener>) debugListener;
+- (void) setDebugListener: (id<DebugEventListener>) aDebugListener;
+
+- (id<TokenStream>) input;
+- (void) setInput:(id<TokenStream>)aTokenStream;
+
+- (void) consume;
+- (id<Token>) getToken:(NSInteger)index;
+- (NSInteger) getIndex;
+- (void) release:(NSInteger)marker;
+- (void) seek:(NSInteger)index;
+- (NSInteger) size;
+- (id<TokenSource>) getTokenSource;
+- (NSString *) getSourceName;
+- (NSString *) toString;
+- (NSString *) toStringFromStart:(NSInteger)aStart ToEnd:(NSInteger)aStop;
+- (NSString *) toStringFromToken:(CommonToken *)startToken ToToken:(CommonToken *)stopToken;
+
+@end
diff --git a/runtime/ObjC/Framework/DebugTokenStream.m b/runtime/ObjC/Framework/DebugTokenStream.m
new file mode 100644
index 0000000..27790a1
--- /dev/null
+++ b/runtime/ObjC/Framework/DebugTokenStream.m
@@ -0,0 +1,204 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke
+// 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.
+
+#import "DebugTokenStream.h"
+
+
+@implementation DebugTokenStream
+
+
+- (id) initWithTokenStream:(id<TokenStream>)theStream debugListener:(id<DebugEventListener>)debugger
+{
+	self = [super init];
+	if (self) {
+		[self setDebugListener:debugger];
+		[self setInput:theStream];
+		[self.input LT:1];	// force reading first on-channel token
+		initialStreamState = YES;
+	}
+	return self;
+}
+
+- (void) dealloc
+{
+    [self setDebugListener:nil];
+    self.input = nil;
+    [super dealloc];
+}
+
+
+- (id<DebugEventListener>) debugListener
+{
+    return debugListener; 
+}
+
+- (void) setDebugListener: (id<DebugEventListener>) aDebugListener
+{
+    if (debugListener != aDebugListener) {
+        [(id<DebugEventListener,NSObject>)aDebugListener retain];
+        [(id<DebugEventListener,NSObject>)debugListener release];
+        debugListener = aDebugListener;
+    }
+}
+
+- (id<TokenStream>) input
+{
+    return input; 
+}
+
+- (void) setInput: (id<TokenStream>) aTokenStream
+{
+    if (input != aTokenStream) {
+        if ( input ) [input release];
+        input = aTokenStream;
+        [input retain];
+    }
+}
+
+- (void) consumeInitialHiddenTokens
+{
+	int firstIdx = input.index;
+	for (int i = 0; i<firstIdx; i++)
+		[debugListener consumeHiddenToken:[input getToken:i]];
+	initialStreamState = NO;
+}
+
+#pragma mark -
+#pragma mark Proxy implementation
+
+// anything else that hasn't some debugger event assicioated with it, is simply
+// forwarded to the actual token stream
+- (void) forwardInvocation:(NSInvocation *)anInvocation
+{
+	[anInvocation invokeWithTarget:self.input];
+}
+
+- (void) consume
+{
+	if ( initialStreamState )
+		[self consumeInitialHiddenTokens];
+	int a = input.index;
+	id<Token> token = [input LT:1];
+	[input consume];
+	int b = input.index;
+	[debugListener consumeToken:token];
+	if (b > a+1) // must have consumed hidden tokens
+		for (int i = a+1; i < b; i++)
+			[debugListener consumeHiddenToken:[input getToken:i]];
+}
+
+- (NSInteger) mark
+{
+	lastMarker = [input mark];
+	[debugListener mark:lastMarker];
+	return lastMarker;
+}
+
+- (void) rewind
+{
+	[debugListener rewind];
+	[input rewind];
+}
+
+- (void) rewind:(NSInteger)marker
+{
+	[debugListener rewind:marker];
+	[input rewind:marker];
+}
+
+- (id<Token>) LT:(NSInteger)k
+{
+	if ( initialStreamState )
+		[self consumeInitialHiddenTokens];
+	[debugListener LT:k foundToken:[input LT:k]];
+	return [input LT:k];
+}
+
+- (NSInteger) LA:(NSInteger)k
+{
+	if ( initialStreamState )
+		[self consumeInitialHiddenTokens];
+	[debugListener LT:k foundToken:[input LT:k]];
+	return [input LA:k];
+}
+
+- (id<Token>) getToken:(NSInteger)i
+{
+    return [input getToken:i];
+}
+
+- (NSInteger) getIndex
+{
+    return input.index;
+}
+
+- (void) release:(NSInteger) marker
+{
+}
+
+- (void) seek:(NSInteger)index
+{
+    // TODO: implement seek in dbg interface
+    // db.seek(index);
+    [input seek:index];
+}
+
+- (NSInteger) size
+{
+    return [input size];
+}
+
+- (id<TokenSource>) getTokenSource
+{
+    return [input getTokenSource];
+}
+
+- (NSString *) getSourceName
+{
+    return [[input getTokenSource] getSourceName];
+}
+
+- (NSString *) description
+{
+    return [input toString];
+}
+
+- (NSString *) toString
+{
+    return [input toString];
+}
+
+- (NSString *) toStringFromStart:(NSInteger)startIndex ToEnd:(NSInteger)stopIndex
+{
+    return [input toStringFromStart:startIndex ToEnd:stopIndex];
+}
+
+- (NSString *) toStringFromToken:(CommonToken *)startToken ToToken:(CommonToken *)stopToken
+{
+    return [input toStringFromStart:startToken.startIndex ToEnd:stopToken.stopIndex];
+}
+
+@end
diff --git a/runtime/ObjC/Framework/DebugTreeAdaptor.h b/runtime/ObjC/Framework/DebugTreeAdaptor.h
new file mode 100644
index 0000000..ae1a0d6
--- /dev/null
+++ b/runtime/ObjC/Framework/DebugTreeAdaptor.h
@@ -0,0 +1,45 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "Parser.h"
+#import "CommonTreeAdaptor.h"
+#import "DebugEventListener.h"
+
+@interface DebugTreeAdaptor : BaseTreeAdaptor {
+	id<DebugEventListener> debugListener;
+	CommonTreeAdaptor *treeAdaptor;
+}
+
+- (id) initWithTreeAdaptor:(CommonTreeAdaptor *)aTreeAdaptor debugListener:(id<DebugEventListener>)aDebugListener;
+
+- (id<DebugEventListener>)debugListener;
+- (void) setDebugListener:(id<DebugEventListener>)aDebugListener;
+
+- (CommonTreeAdaptor *) getTreeAdaptor;
+- (void) setTreeAdaptor:(CommonTreeAdaptor *)aTreeAdaptor;
+
+@end
diff --git a/runtime/ObjC/Framework/DebugTreeAdaptor.m b/runtime/ObjC/Framework/DebugTreeAdaptor.m
new file mode 100644
index 0000000..5ca8df1
--- /dev/null
+++ b/runtime/ObjC/Framework/DebugTreeAdaptor.m
@@ -0,0 +1,229 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke
+// 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.
+
+#import "DebugTreeAdaptor.h"
+
+
+@implementation DebugTreeAdaptor
+
+
+- (id) initWithTreeAdaptor:(CommonTreeAdaptor *)aTreeAdaptor debugListener:(id<DebugEventListener>)aDebugListener
+{
+	self = [super init];
+	if (self) {
+		[self setDebugListener:aDebugListener];
+		[self setTreeAdaptor:aTreeAdaptor];
+	}
+	return self;
+}
+
+- (void) dealloc
+{
+    [self setDebugListener: nil];
+    [self setTreeAdaptor: nil];
+    [super dealloc];
+}
+
+- (id<DebugEventListener>) debugListener
+{
+    return debugListener; 
+}
+
+- (void) setDebugListener: (id<DebugEventListener>) aDebugListener
+{
+    if (debugListener != aDebugListener) {
+        [(id<TreeAdaptor,NSObject>)aDebugListener retain];
+        [(id<TreeAdaptor,NSObject>)debugListener release];
+        debugListener = aDebugListener;
+    }
+}
+
+- (CommonTreeAdaptor *) getTreeAdaptor
+{
+    return treeAdaptor; 
+}
+
+- (void) setTreeAdaptor: (CommonTreeAdaptor *) aTreeAdaptor
+{
+    if (treeAdaptor != aTreeAdaptor) {
+        [aTreeAdaptor retain];
+        [treeAdaptor release];
+        treeAdaptor = aTreeAdaptor;
+    }
+}
+
+#pragma mark -
+#pragma mark Proxy implementation
+
+// anything else that hasn't some debugger event assicioated with it, is simply
+// forwarded to the actual token stream
+- (void) forwardInvocation:(NSInvocation *)anInvocation
+{
+	[anInvocation invokeWithTarget:[self getTreeAdaptor]];
+}
+
+#pragma mark -
+
+#pragma mark Construction
+
+- (id<BaseTree>) newTreeWithToken:(id<Token>) payload
+{
+	id<BaseTree> newTree = [CommonTree newTreeWithToken:payload];
+	[debugListener createNode:[treeAdaptor uniqueIdForTree:newTree] fromTokenAtIndex:[payload getTokenIndex]];
+	return newTree;
+}
+
+- (id<BaseTree>) emptyTree
+{
+	id<BaseTree> newTree = [treeAdaptor newEmptyTree];
+	[debugListener createNilNode:[treeAdaptor uniqueIdForTree:newTree]];
+	return newTree;
+}
+
+/*	We don't have debug events for those:
+ - (id) copyNode:(id<BaseTree>)aNode
+{
+}
+- (id) copyTree:(id<BaseTree>)aTree
+{
+}
+*/
+
+- (void) addChild:(id<BaseTree>)child toTree:(id<BaseTree>)aTree
+{
+	[treeAdaptor addChild:child toTree:aTree];
+	[debugListener addChild:[treeAdaptor uniqueIdForTree:child] toTree:[self uniqueIdForTree:aTree]];
+}
+
+- (id<BaseTree>) becomeRoot:(id<BaseTree>)newRoot old:(id<BaseTree>)oldRoot
+{
+	id<BaseTree> newTree = [treeAdaptor becomeRoot:newRoot old:oldRoot];
+	[debugListener becomeRoot:[treeAdaptor uniqueIdForTree:newTree] old:[self uniqueIdForTree:oldRoot]];
+	return newTree;
+}
+
+/* handle by forwardInvocation: 
+- (NSUInteger) uniqueIdForTree:(id<BaseTree>)aNode
+{
+}
+*/
+
+#pragma mark Rewrite Rules
+
+ - (void) addTokenAsChild:(id<Token>)child toTree:(id<BaseTree>)aTree
+{
+	id<BaseTree> newChild = [self newTreeWithToken:child];
+	[self addChild:newChild toTree:aTree];
+}
+
+- (id<BaseTree>) makeToken:(id<Token>)newRoot parentOf:(id<BaseTree>)oldRoot
+{
+	id<BaseTree> newNode = [self newTreeWithToken:newRoot];
+	return [self becomeRoot:newNode old:oldRoot];
+}
+
+- (id<BaseTree>) newTreeWithTokenType:(NSInteger)tokenType
+{
+	id<BaseTree> newTree = [treeAdaptor newTreeWithTokenType:tokenType];
+	[debugListener createNode:[treeAdaptor uniqueIdForTree:newTree] text:nil type:tokenType];
+	return newTree;
+}
+
+- (id<BaseTree>) newTreeWithTokenType:(NSInteger)tokenType text:(NSString *)tokenText
+{
+	id<BaseTree> newTree = [treeAdaptor newTreeWithTokenType:tokenType text:tokenText];
+	[debugListener createNode:[treeAdaptor uniqueIdForTree:newTree] text:tokenText type:tokenType];
+	return newTree;
+}
+- (id<BaseTree>) newTreeWithToken:(id<Token>)fromToken tokenType:(NSInteger)tokenType
+{
+	id<BaseTree> newTree = [treeAdaptor newTreeWithToken:fromToken tokenType:tokenType];
+	[debugListener createNode:[treeAdaptor uniqueIdForTree:newTree] text:fromToken.text type:tokenType];
+	return newTree;
+}
+
+- (id<BaseTree>) newTreeWithToken:(id<Token>)fromToken tokenType:(NSInteger)tokenType text:(NSString *)tokenText
+{
+	id<BaseTree> newTree = [treeAdaptor newTreeWithToken:fromToken tokenType:tokenType text:tokenText];
+	[debugListener createNode:[treeAdaptor uniqueIdForTree:newTree] text:tokenText type:tokenType];
+	return newTree;
+}
+
+- (id<BaseTree>) newTreeWithToken:(id<Token>)fromToken text:(NSString *)tokenText
+{
+	id<BaseTree> newTree = [treeAdaptor newTreeWithToken:fromToken text:tokenText];
+	[debugListener createNode:[treeAdaptor uniqueIdForTree:newTree] text:tokenText type:fromToken.type];
+	return newTree;
+}
+
+#pragma mark Content
+
+/* handled by forwardInvocation:
+- (NSInteger) tokenTypeForNode:(id<BaseTree>)aNode
+{
+}
+ 
+- (void) setTokenType:(NSInteger)tokenType forNode:(id)aNode
+{
+}
+
+- (NSString *) textForNode:(id<BaseTree>)aNode
+{
+}
+ 
+- (void) setText:(NSString *)tokenText forNode:(id<BaseTree>)aNode
+{
+}
+*/
+- (void) setBoundariesForTree:(id<BaseTree>)aTree fromToken:(id<Token>)startToken toToken:(id<Token>)stopToken
+{
+	[treeAdaptor setBoundariesForTree:aTree fromToken:startToken toToken:stopToken];
+	if (aTree && startToken && stopToken) {
+		[debugListener setTokenBoundariesForTree:[aTree hash] From:[startToken getTokenIndex] To:[stopToken getTokenIndex]];
+	}
+}
+/* handled by forwardInvocation:
+- (NSInteger) tokenStartIndexForTree:(id<BaseTree>)aTree
+{
+}
+ 
+- (NSInteger) tokenStopIndexForTree:(id<BaseTree>)aTree
+{
+}
+*/
+
+#pragma mark Navigation / Tree Parsing
+/* handled by forwardInvocation:
+- (id<BaseTree>) childForNode:(id<BaseTree>) aNode atIndex:(NSInteger) i
+{
+}
+ 
+- (NSInteger) childCountForTree:(id<BaseTree>) aTree
+{
+}
+*/
+
+@end
diff --git a/runtime/ObjC/Framework/DebugTreeNodeStream.h b/runtime/ObjC/Framework/DebugTreeNodeStream.h
new file mode 100644
index 0000000..4262505
--- /dev/null
+++ b/runtime/ObjC/Framework/DebugTreeNodeStream.h
@@ -0,0 +1,67 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "DebugEventListener.h"
+#import "TreeAdaptor.h"
+#import "TreeNodeStream.h"
+
+@interface DebugTreeNodeStream : NSObject <TreeNodeStream> {
+	id<DebugEventListener> debugListener;
+	id<TreeAdaptor> treeAdaptor;
+	id<TreeNodeStream> input;
+	BOOL initialStreamState;
+}
+
+- (id) initWithTreeNodeStream:(id<TreeNodeStream>)theStream debugListener:(id<DebugEventListener>)debugger;
+
+- (id<DebugEventListener>) debugListener;
+- (void) setDebugListener: (id<DebugEventListener>) aDebugListener;
+
+- (id<TreeNodeStream>) input;
+- (void) setInput: (id<TreeNodeStream>) aTreeNodeStream;
+
+- (id<TreeAdaptor>) getTreeAdaptor;
+- (void) setTreeAdaptor: (id<TreeAdaptor>) aTreeAdaptor;
+
+#pragma mark TreeNodeStream conformance
+
+- (id) LT:(NSInteger)k;
+- (id<TreeAdaptor>) getTreeAdaptor;
+- (void) setUniqueNavigationNodes:(BOOL)flag;
+
+#pragma mark IntStream conformance
+- (void) consume;
+- (NSInteger) LA:(NSUInteger) i;
+- (NSUInteger) mark;
+- (NSUInteger) getIndex;
+- (void) rewind:(NSUInteger) marker;
+- (void) rewind;
+- (void) release:(NSUInteger) marker;
+- (void) seek:(NSUInteger) index;
+- (NSUInteger) size;
+
+@end
diff --git a/runtime/ObjC/Framework/DebugTreeNodeStream.m b/runtime/ObjC/Framework/DebugTreeNodeStream.m
new file mode 100644
index 0000000..c923f45
--- /dev/null
+++ b/runtime/ObjC/Framework/DebugTreeNodeStream.m
@@ -0,0 +1,175 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke
+// 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.
+
+#import "DebugTreeNodeStream.h"
+
+
+@implementation DebugTreeNodeStream
+
+- (id) initWithTreeNodeStream:(id<TreeNodeStream>)theStream debugListener:(id<DebugEventListener>)debugger
+{
+	self = [super init];
+	if (self) {
+		[self setDebugListener:debugger];
+		[self setTreeAdaptor:[theStream treeAdaptor]];
+		[self setInput:theStream];
+	}
+	return self;
+}
+
+- (void) dealloc
+{
+    [self setDebugListener: nil];
+    [self setTreeAdaptor: nil];
+    input = nil;
+    [super dealloc];
+}
+
+- (id<DebugEventListener>) debugListener
+{
+    return debugListener; 
+}
+
+- (void) setDebugListener: (id<DebugEventListener>) aDebugListener
+{
+    if (debugListener != aDebugListener) {
+        [(id<DebugEventListener,NSObject>)aDebugListener retain];
+        [(id<DebugEventListener,NSObject>)debugListener release];
+        debugListener = aDebugListener;
+    }
+}
+
+
+- (id<TreeAdaptor>) getTreeAdaptor
+{
+    return treeAdaptor; 
+}
+
+- (void) setTreeAdaptor: (id<TreeAdaptor>) aTreeAdaptor
+{
+    if (treeAdaptor != aTreeAdaptor) {
+        [(id<TreeAdaptor,NSObject>)aTreeAdaptor retain];
+        [(id<TreeAdaptor,NSObject>)treeAdaptor release];
+        treeAdaptor = aTreeAdaptor;
+    }
+}
+
+
+- (id<TreeNodeStream>) input
+{
+    return input; 
+}
+
+- (void) setInput:(id<TreeNodeStream>) aTreeNodeStream
+{
+    if (input != aTreeNodeStream) {
+        [input release];
+        [(id<TreeNodeStream,NSObject>)aTreeNodeStream retain];
+    }
+    input = aTreeNodeStream;
+}
+
+
+#pragma mark TreeNodeStream conformance
+
+- (id) LT:(NSInteger)k
+{
+	id node = [input LT:k];
+	unsigned hash = [treeAdaptor uniqueIdForTree:node];
+	NSString *text = [treeAdaptor textForNode:node];
+	int type = [treeAdaptor tokenTypeForNode:node];
+	[debugListener LT:k foundNode:hash ofType:type text:text];
+	return node;
+}
+
+- (void) setUniqueNavigationNodes:(BOOL)flag
+{
+	[input setUniqueNavigationNodes:flag];
+}
+
+#pragma mark IntStream conformance
+- (void) consume
+{
+	id node = [input LT:1];
+	[input consume];
+	unsigned hash = [treeAdaptor uniqueIdForTree:node];
+	NSString *theText = [treeAdaptor textForNode:node];
+	int aType = [treeAdaptor tokenTypeForNode:node];
+	[debugListener consumeNode:hash ofType:aType text:theText];
+}
+
+- (NSInteger) LA:(NSUInteger) i
+{
+	id<BaseTree> node = [self LT:1];
+	return node.type;
+}
+
+- (NSUInteger) mark
+{
+	unsigned lastMarker = [input mark];
+	[debugListener mark:lastMarker];
+	return lastMarker;
+}
+
+- (NSUInteger) getIndex
+{
+	return input.index;
+}
+
+- (void) rewind:(NSUInteger) marker
+{
+	[input rewind:marker];
+	[debugListener rewind:marker];
+}
+
+- (void) rewind
+{
+	[input rewind];
+	[debugListener rewind];
+}
+
+- (void) release:(NSUInteger) marker
+{
+	[input release:marker];
+}
+
+- (void) seek:(NSUInteger) index
+{
+	[input seek:index];
+	// todo: seek missing in debug protocol
+}
+
+- (NSUInteger) size
+{
+	return [input size];
+}
+
+- (NSString *) toStringFromToken:(id)startNode ToToken:(id)stopNode
+{
+    return [input toStringFromToken:(id<Token>)startNode ToToken:(id<Token>)stopNode];
+}
+
+@end
diff --git a/runtime/ObjC/Framework/DebugTreeParser.h b/runtime/ObjC/Framework/DebugTreeParser.h
new file mode 100644
index 0000000..0c6a186
--- /dev/null
+++ b/runtime/ObjC/Framework/DebugTreeParser.h
@@ -0,0 +1,52 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "TreeParser.h"
+#import "DebugEventSocketProxy.h"
+#import "DebugTreeNodeStream.h"
+
+@interface DebugTreeParser : TreeParser {
+	id<DebugEventListener> debugListener;
+}
+
+- (id) initWithTreeNodeStream:(id<TreeNodeStream>)theStream;
+- (id) initWithTreeNodeStream:(id<TreeNodeStream>)theStream
+				 debuggerPort:(NSInteger)portNumber;
+	// designated initializer
+- (id) initWithTreeNodeStream:(id<TreeNodeStream>)theStream
+				debugListener:(id<DebugEventListener>)theDebugListener
+				 debuggerPort:(NSInteger)portNumber;
+
+- (id<DebugEventListener>) debugListener;
+- (void) setDebugListener: (id<DebugEventListener>) aDebugListener;
+
+- (void) recoverFromMismatchedToken:(id<IntStream>)inputStream 
+						  exception:(NSException *)e 
+						  tokenType:(TokenType)ttype 
+							 follow:(ANTLRBitSet *)follow;
+
+@end
diff --git a/runtime/ObjC/Framework/DebugTreeParser.m b/runtime/ObjC/Framework/DebugTreeParser.m
new file mode 100644
index 0000000..70b8ac1
--- /dev/null
+++ b/runtime/ObjC/Framework/DebugTreeParser.m
@@ -0,0 +1,128 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke
+// 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.
+
+#import "DebugTreeParser.h"
+
+
+@implementation DebugTreeParser
+
+- (id) initWithTreeNodeStream:(id<TreeNodeStream>)theStream
+{
+	return [self initWithTreeNodeStream:theStream debugListener:nil debuggerPort:-1];
+}
+
+- (id) initWithTreeNodeStream:(id<TreeNodeStream>)theStream
+				 debuggerPort:(NSInteger)portNumber
+{
+	return [self initWithTreeNodeStream:theStream debugListener:nil debuggerPort:portNumber];
+}
+
+- (id) initWithTreeNodeStream:(id<TreeNodeStream>)theStream
+				debugListener:(id<DebugEventListener>)theDebugListener
+				 debuggerPort:(NSInteger)portNumber
+{
+	id<DebugEventListener,NSObject> debugger = nil;
+	id<TreeNodeStream> treeNodeStream = nil;
+	if (theDebugListener) {
+		debugger = (id<DebugEventListener>)theDebugListener;
+	} else {
+		debugger = [[DebugEventSocketProxy alloc] initWithGrammarName:[self grammarFileName] debuggerPort:portNumber];
+	}
+	if (theStream && ![theStream isKindOfClass:[DebugTreeNodeStream class]]) {
+		treeNodeStream = [[DebugTreeNodeStream alloc] initWithTreeNodeStream:theStream debugListener:debugger];
+	} else {
+		treeNodeStream = theStream;
+	}
+	self = [super initWithStream:treeNodeStream];
+	if ( self ) {
+		[self setDebugListener:debugger];
+		//[debugger release];
+		//[treeNodeStream release];
+		[debugListener waitForDebuggerConnection];
+	}
+	return self;
+}
+
+- (void) dealloc
+{
+    [self setDebugListener: nil];
+    [super dealloc];
+}
+
+- (id<DebugEventListener>) debugListener
+{
+    return debugListener; 
+}
+
+- (void) setDebugListener: (id<DebugEventListener>) aDebugListener
+{
+    if (debugListener != aDebugListener) {
+        [(id<DebugEventListener,NSObject>)aDebugListener retain];
+        [(id<DebugEventListener,NSObject>)debugListener release];
+        debugListener = aDebugListener;
+    }
+}
+
+#pragma mark -
+#pragma mark Overrides
+
+- (void) beginResync
+{
+	[debugListener beginResync];
+}
+
+- (void) endResync
+{
+	[debugListener endResync];
+}
+- (void)beginBacktracking:(NSInteger)level
+{
+	[debugListener beginBacktrack:level];
+}
+
+- (void)endBacktracking:(NSInteger)level wasSuccessful:(BOOL)successful
+{
+	[debugListener endBacktrack:level wasSuccessful:successful];
+}
+
+- (void) recoverFromMismatchedToken:(id<IntStream>)inputStream 
+						  exception:(NSException *)e 
+						  tokenType:(TokenType)ttype 
+							 follow:(ANTLRBitSet *)follow
+{
+#warning TODO: recoverFromMismatchedToken in debugger
+	[self recoverFromMismatchedToken:inputStream exception:e follow:follow];
+}
+
+- (void) recoverFromMismatchedSet:(id<IntStream>)inputStream
+						exception:(NSException *)e
+						   follow:(ANTLRBitSet *)follow
+{
+#warning TODO: recoverFromMismatchedSet in debugger
+	[super recoverFromMismatchedSet:inputStream];
+}
+
+@end
diff --git a/runtime/ObjC/Framework/DoubleKeyMap.h b/runtime/ObjC/Framework/DoubleKeyMap.h
new file mode 100644
index 0000000..bbaa351
--- /dev/null
+++ b/runtime/ObjC/Framework/DoubleKeyMap.h
@@ -0,0 +1,28 @@
+
+#import "AMutableArray.h"
+#import "AMutableDictionary.h"
+#import "LinkBase.h"
+/**
+ * Sometimes we need to map a key to a value but key is two pieces of data.
+ * This nested hash table saves creating a single key each time we access
+ * map; avoids mem creation.
+ */
+
+@class AMutableArray;
+
+@interface DoubleKeyMap : LinkBase {
+    AMutableDictionary *data;
+}
+
+- (id) init;
+- (id) setObject:(id)v forKey1:(id)k1 forKey2:(NSString *)k2;
+- (id) objectForKey1:(id)k1 forKey2:(id)k2;
+- (AMutableDictionary *) objectForKey:(id)k1;
+- (NSArray *) valuesForKey:(id)k1;
+- (NSArray *) allKeys1;
+- (AMutableArray *) allKeys2:(id)k1;
+- (NSArray *) values;
+
+@property (retain) AMutableDictionary *data;
+
+@end
diff --git a/runtime/ObjC/Framework/DoubleKeyMap.m b/runtime/ObjC/Framework/DoubleKeyMap.m
new file mode 100644
index 0000000..5d01f6f
--- /dev/null
+++ b/runtime/ObjC/Framework/DoubleKeyMap.m
@@ -0,0 +1,101 @@
+#import "DoubleKeyMap.h"
+
+@implementation DoubleKeyMap
+
+- (id) init
+{
+    self = [super init];
+    if ( self  != nil ) {
+        data = [[AMutableDictionary dictionaryWithCapacity:30] retain];
+    }
+    return self;
+}
+
+- (id) setObject:(id)v forKey1:(id)k1 forKey2:(id)k2
+{
+    AMutableDictionary *data2 = [data objectForKey:k1];
+    id prev = nil;
+    if ( data2 == nil ) {
+        data2 = [AMutableDictionary dictionaryWithCapacity:30];
+        [data setObject:data2 forKey:k1];
+    }
+    else {
+        prev = [data2 objectForKey:k2];
+    }
+    [data2 setObject:v forKey:k2];
+    return prev;
+}
+
+- (id) objectForKey1:(id)k1 forKey2:(id)k2
+{
+    AMutableDictionary *data2 = [data objectForKey:k1];
+    if ( data2 == nil )
+        return nil;
+    return [data2 objectForKey:k2];
+}
+
+- (AMutableDictionary *) objectForKey:(id)k1
+{
+    return [data objectForKey:k1];
+}
+
+
+/**
+ * Get all values associated with primary key
+ */
+- (NSArray *) valuesForKey:(id)k1
+{
+    AMutableDictionary *data2 = [data objectForKey:k1];
+    if ( data2 == nil )
+        return nil;
+    return [data2 allValues];
+}
+
+
+/**
+ * get all primary keys
+ */
+- (NSArray *) allKeys1
+{
+    return [data allKeys];
+}
+
+
+/**
+ * get all secondary keys associated with a primary key
+ */
+- (NSArray *) allKeys2:(id)k1
+{
+    AMutableDictionary * data2 = [data objectForKey:k1];
+    if ( data2 == nil )
+        return nil;
+    return [data2 allKeys];
+}
+
+- (AMutableArray *) values
+{
+//    HashMap *s = [[HashMap newHashMapWithLen:30];
+    AMutableArray *s = [AMutableArray arrayWithCapacity:30];
+    
+    for (AMutableDictionary *k2 in [data allValues]) {
+        
+        for ( NSString *v in [k2 allValues]) {
+            [s addObject:v];
+        }
+        
+    }
+    
+    return s;
+}
+
+- (void) dealloc
+{
+#ifdef DEBUG_DEALLOC
+    NSLog( @"called dealloc in CommonToken" );
+#endif
+    [data release];
+    [super dealloc];
+}
+
+@synthesize data;
+@end
diff --git a/runtime/ObjC/Framework/EarlyExitException.h b/runtime/ObjC/Framework/EarlyExitException.h
new file mode 100644
index 0000000..0849f13
--- /dev/null
+++ b/runtime/ObjC/Framework/EarlyExitException.h
@@ -0,0 +1,39 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "RecognitionException.h"
+
+@interface EarlyExitException : RecognitionException {
+	int decisionNumber;
+}
+
++ (EarlyExitException *) newException:(id<IntStream>)anInputStream decisionNumber:(NSInteger)aDecisionNumber;
+- (id) initWithStream:(id<IntStream>)anInputStream decisionNumber:(NSInteger) aDecisionNumber;
+
+@property int decisionNumber;
+@end
+
diff --git a/runtime/ObjC/Framework/EarlyExitException.m b/runtime/ObjC/Framework/EarlyExitException.m
new file mode 100644
index 0000000..bf6fc1b
--- /dev/null
+++ b/runtime/ObjC/Framework/EarlyExitException.m
@@ -0,0 +1,54 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke
+// 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.
+
+#import "EarlyExitException.h"
+
+
+@implementation EarlyExitException
+
++ (EarlyExitException *) newException:(id<IntStream>) anInputStream decisionNumber:(NSInteger) aDecisionNumber
+{
+	return [[self alloc] initWithStream:anInputStream decisionNumber:aDecisionNumber];
+}
+
+- (id) initWithStream:(id<IntStream>)anInputStream decisionNumber:(NSInteger) aDecisionNumber
+{
+	if ((self = [super initWithStream:anInputStream]) != nil) {
+		decisionNumber = aDecisionNumber;
+	}
+	return self;
+}
+
+- (NSString *) description
+{
+	NSMutableString *desc = (NSMutableString *)[super description];
+	[desc appendFormat:@" decision:%d", decisionNumber];
+	return desc;
+}
+
+@synthesize decisionNumber;
+@end
+
diff --git a/runtime/ObjC/Framework/Entry.h b/runtime/ObjC/Framework/Entry.h
new file mode 100644
index 0000000..eabbba2
--- /dev/null
+++ b/runtime/ObjC/Framework/Entry.h
@@ -0,0 +1,46 @@
+
+@class HashTable;
+
+/**
+ * HashTable entry.
+ */
+
+@interface HTEntry : NSObject {
+    HTEntry *next;
+    NSInteger hash;
+    NSString *key;
+    id value;
+}
+
+@property(nonatomic, retain) HTEntry  *next;
+@property(assign)           NSInteger  hash;
+@property(nonatomic, retain) NSString *key;
+@property(nonatomic, retain)        id value;
+
++ (HTEntry *)newEntry:(NSInteger)h key:(NSString *)k value:(id)v next:(HTEntry *) n;
+- (id) init:(NSInteger)h key:(NSString *)k value:(id)v next:(HTEntry *)n;
+- (id) copyWithZone:(NSZone *)zone;
+- (void) setValue:(id)newValue;
+- (BOOL) isEqualTo:(id)o;
+- (NSInteger) hash;
+- (NSString *) description;
+@end
+
+/**
+ * LinkedMap entry.
+ */
+
+@interface LMNode : NSObject {
+    LMNode *next;
+    LMNode *prev;
+    id item;
+}
+
+@property(nonatomic, retain) LMNode *next;
+@property(nonatomic, retain) LMNode *prev;
+@property(nonatomic, retain)      id item;
+
++ (LMNode *) newNode:(LMNode *)aPrev element:(id)anElement next:(LMNode *)aNext;
+- (id) init:(LMNode *)aPrev element:(id)anElement next:(LMNode *)aNext;
+@end
+
diff --git a/runtime/ObjC/Framework/Entry.m b/runtime/ObjC/Framework/Entry.m
new file mode 100644
index 0000000..f42190e
--- /dev/null
+++ b/runtime/ObjC/Framework/Entry.m
@@ -0,0 +1,110 @@
+#import "Entry.h"
+#import <Foundation/Foundation.h>
+#import "RuntimeException.h"
+
+@implementation HTEntry
+
+@synthesize next;
+@synthesize hash;
+@synthesize key;
+@synthesize value;
+
++ (id) newEntry:(int)aHash key:(NSString *)aKey value:(id)aValue next:(HTEntry *)aNext
+{
+    return [[HTEntry alloc] init:aHash key:aKey value:aValue next:aNext];
+}
+
+- (id) init:(int)aHash key:(NSString *)aKey value:(id)aValue next:(HTEntry *)aNext
+{
+    if ( (self = [super init]) != nil) {
+        next  = aNext;
+        hash  = aHash;
+        key   = aKey;
+        value = aValue;
+    }
+    return self;
+}
+
+- (void) dealloc
+{
+    [next release];
+    [key release];
+    [value release];
+    [super dealloc];
+}
+
+
+- (id) copyWithZone:(NSZone *)zone
+{
+    HTEntry *copy = [[HTEntry allocWithZone:zone] init:hash key:key value:value next:next];
+    copy.next  = next;
+    copy.hash  = hash;
+    copy.key   = key;
+    copy.value = value;
+    //    return [[[HTEntry allocWithZone:zone] init:hash key:key value:value next:(next == nil ? nil : (HTEntry *)[next copyWithZone])] autorelease];
+    return copy;
+}
+
+- (void) setValue:(id)aValue
+{
+    if (aValue == nil)
+        @throw [[[NullPointerException alloc] init] autorelease];
+    //    id oldValue = value;
+    value = aValue;
+    //    return oldValue;
+}
+
+- (BOOL) isEqualTo:(id)o
+{
+/*
+    if (!([o conformsToProtocol:@protocol(HTEntry)]))
+        return NO;
+ */
+    HTEntry *e = (HTEntry *)o;
+    return (key == nil ? e.key == nil : [key isEqualTo:e.key]) && (value == nil ? e.value == nil : [value isEqualTo:e.value]);
+}
+
+- (int) hash
+{
+    return hash ^ (value == nil ? 0 : [value hash]);
+}
+
+- (NSString *) description
+{
+    return [NSString stringWithFormat:@"%@ = %@",[key description], [value description]];
+}
+
+@end
+
+@implementation LMNode
+
+@synthesize next;
+@synthesize prev;
+@synthesize item;
+
++ (LMNode *) newNode:(LMNode *)aPrev element:(id)anElement next:(LMNode *)aNext
+{
+    return [[LMNode alloc] init:aPrev element:anElement next:aNext];
+}
+
+- (id) init:(LMNode *)aPrev element:(id)anElement next:(LMNode *)aNext
+{
+    self = [super init];
+    if (self) {
+        item = anElement;
+        next = aNext;
+        prev = aPrev;
+    }
+    return self;
+}
+
+- (void) dealloc
+{
+    [item release];
+    [next release];
+    [prev release];
+    [super dealloc];
+}
+
+@end
+
diff --git a/runtime/ObjC/Framework/FailedPredicateException.h b/runtime/ObjC/Framework/FailedPredicateException.h
new file mode 100644
index 0000000..05184bc
--- /dev/null
+++ b/runtime/ObjC/Framework/FailedPredicateException.h
@@ -0,0 +1,50 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "RecognitionException.h"
+
+
+@interface FailedPredicateException : RecognitionException
+{
+	NSString *predicate;
+	NSString *ruleName;
+}
+
+@property (retain) NSString *predicate;
+@property (retain) NSString *ruleName;
+
++ (FailedPredicateException *) newException:(NSString *)theRuleName predicate:(NSString *)thePredicate stream:(id<IntStream>)theStream;
+- (FailedPredicateException *) initWithRuleName:(NSString *)theRuleName predicate:(NSString *)thePredicate stream:(id<IntStream>)theStream;
+
+#ifdef DONTUSEYET
+- (NSString *) getPredicate;
+- (void) setPredicate:(NSString *)thePredicate;
+- (NSString *) getRuleName;
+- (void) setRuleName:(NSString *)theRuleName;
+#endif
+
+@end
diff --git a/runtime/ObjC/Framework/FailedPredicateException.m b/runtime/ObjC/Framework/FailedPredicateException.m
new file mode 100644
index 0000000..02f9f42
--- /dev/null
+++ b/runtime/ObjC/Framework/FailedPredicateException.m
@@ -0,0 +1,96 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 20110 Alan Condit
+// 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.
+
+#import "FailedPredicateException.h"
+
+
+@implementation FailedPredicateException
+
+@synthesize predicate;
+@synthesize ruleName;
+
++ (FailedPredicateException *) newException:(NSString *)theRuleName predicate:(NSString *)thePredicate stream:(id<IntStream>)theStream
+{
+	return [[FailedPredicateException alloc] initWithRuleName:theRuleName predicate:thePredicate stream:theStream];
+}
+
+- (FailedPredicateException *) initWithRuleName:(NSString *)theRuleName predicate:(NSString *)thePredicate stream:(id<IntStream>)theStream
+{
+	if ((self = [super initWithStream:theStream])) {
+		[self setPredicate:thePredicate];
+		[self setRuleName:theRuleName];
+	}
+	return self;
+}
+
+- (void) dealloc
+{
+#ifdef DEBUG_DEALLOC
+    NSLog( @"called dealloc in FailedPredicateException" );
+#endif
+	[self setPredicate:nil];
+	[self setRuleName:nil];
+	[super dealloc];
+}
+
+- (NSString *) description
+{
+	NSMutableString *desc = (NSMutableString *)[super description];
+	[desc appendFormat:@" rule: %@ predicate failed: %@", ruleName, predicate];
+	return desc;
+}
+
+#ifdef DONTUSEYET
+- (NSString *) getPredicate
+{
+	return predicate;
+}
+
+- (void) setPredicate:(NSString *)thePredicate
+{
+	if (thePredicate != predicate) {
+		[thePredicate retain];
+		if ( predicate ) [predicate release];
+		predicate = thePredicate;
+	}
+}
+
+- (NSString *) getRuleName
+{
+	return ruleName;
+}
+
+- (void) setRuleName:(NSString *)theRuleName
+{
+	if (theRuleName != ruleName) {
+		[theRuleName retain];
+		if ( ruleName ) [ruleName release];
+		ruleName = theRuleName;
+	}
+}
+#endif
+
+@end
diff --git a/runtime/ObjC/Framework/FastQueue.h b/runtime/ObjC/Framework/FastQueue.h
index 25f34d6..1ac6d1a 100644
--- a/runtime/ObjC/Framework/FastQueue.h
+++ b/runtime/ObjC/Framework/FastQueue.h
@@ -1,93 +1,64 @@
-/*
-[The "BSD licence"]
-Copyright (c) 2005-2008 Terence Parr
-All rights reserved.
+//
+//  FastQueue.h
+//  ANTLR
+//
+//  Created by Ian Michell on 26/04/2010.
+// [The "BSD licence"]
+// Copyright (c) 2010 Ian Michell 2010 Alan Condit
+// 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.
 
-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.
+#import <Foundation/Foundation.h>
+#import "AMutableArray.h"
 
-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.
-*/
-package org.antlr.runtime.misc;
+@interface FastQueue : NSObject <NSCopying>
+{
+    __strong AMutableArray *data;
+    NSUInteger p;
+    NSUInteger range;
+}
 
-import java.util.List;
-import java.util.ArrayList;
-import java.util.NoSuchElementException;
+@property (retain) AMutableArray *data;
+@property (assign) NSUInteger p;
+@property (assign) NSUInteger range;
 
-/** A queue that can dequeue and get(i) in O(1) and grow arbitrarily large.
- *  A linked list is fast at dequeue but slow at get(i).  An array is
- *  the reverse.  This is O(1) for both operations.
- *
- *  List grows until you dequeue last element at end of buffer. Then
- *  it resets to start filling at 0 again.  If adds/removes are balanced, the
- *  buffer will not grow too large.
- *
- *  No iterator stuff as that's not how we'll use it.
- */
-public class FastQueue<T> {
-    /** dynamically-sized buffer of elements */
-    protected List<T> data = new ArrayList<T>();
-    /** index of next element to fill */
-    protected int p = 0;
++ (id) newFastQueue;
 
-    public void reset() { p = 0; data.clear(); }
+- (id) init;
 
-    /** Get and remove first element in queue */
-    public T remove() {
-        T o = get(0);
-        p++;
-        // have we hit end of buffer?
-        if ( p == data.size() ) {
-            // if so, it's an opportunity to start filling at index 0 again
-            clear(); // size goes to 0, but retains memory
-        }
-        return o;
-    }
+- (id) copyWithZone:(NSZone *)aZone;
 
-    public void add(T o) { data.add(o); }
+- (void) reset;
+- (id) remove;
+- (void) addObject:(id) obj;
+- (NSUInteger) count;
+- (NSUInteger) size;
+- (NSUInteger) range;
+- (id) head;
+- (id) objectAtIndex:(NSInteger) i;
+- (void) clear;
+- (NSString *) toString;
+- (NSString *) description;
 
-    public int size() { return data.size() - p; }
-
-    public T head() { return get(0); }
-
-    /** Return element i elements ahead of current element.  i==0 gets
-     *  current element.  This is not an absolute index into the data list
-     *  since p defines the start of the real list.
-     */
-    public T get(int i) {
-        if ( p+i >= data.size() ) {
-            throw new NoSuchElementException("queue index "+(p+i)+" > size "+data.size());
-        }
-        return data.get(p+i);
-    }
-
-    public void clear() { p = 0; data.clear(); }
-
-    /** Return string of current buffer contents; non-destructive */
-    public String toString() {
-        StringBuffer buf = new StringBuffer();
-        int n = size();
-        for (int i=0; i<n; i++) {
-            buf.append(get(i));
-            if ( (i+1)<n ) buf.append(" ");
-        }
-        return buf.toString();
-    }
-}
\ No newline at end of file
+@end
diff --git a/runtime/ObjC/Framework/FastQueue.m b/runtime/ObjC/Framework/FastQueue.m
index 25f34d6..c4c3dd7 100644
--- a/runtime/ObjC/Framework/FastQueue.m
+++ b/runtime/ObjC/Framework/FastQueue.m
@@ -1,93 +1,174 @@
-/*
-[The "BSD licence"]
-Copyright (c) 2005-2008 Terence Parr
-All rights reserved.
+//
+//  FastQueue.m
+//  ANTLR
+//
+//  Created by Ian Michell on 26/04/2010.
+// [The "BSD licence"]
+// Copyright (c) 2010 Ian Michell 2010 Alan Condit
+// 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.
 
-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.
+#import "FastQueue.h"
+#import "ANTLRError.h"
+#import "RuntimeException.h"
 
-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.
-*/
-package org.antlr.runtime.misc;
+@implementation FastQueue
 
-import java.util.List;
-import java.util.ArrayList;
-import java.util.NoSuchElementException;
+//@synthesize pool;
+@synthesize data;
+@synthesize p;
+@synthesize range;
 
-/** A queue that can dequeue and get(i) in O(1) and grow arbitrarily large.
- *  A linked list is fast at dequeue but slow at get(i).  An array is
- *  the reverse.  This is O(1) for both operations.
- *
- *  List grows until you dequeue last element at end of buffer. Then
- *  it resets to start filling at 0 again.  If adds/removes are balanced, the
- *  buffer will not grow too large.
- *
- *  No iterator stuff as that's not how we'll use it.
- */
-public class FastQueue<T> {
-    /** dynamically-sized buffer of elements */
-    protected List<T> data = new ArrayList<T>();
-    /** index of next element to fill */
-    protected int p = 0;
++ (id) newFastQueue
+{
+    return [[FastQueue alloc] init];
+}
 
-    public void reset() { p = 0; data.clear(); }
+- (id) init
+{
+	self = [super init];
+	if ( self != nil ) {
+		data = [[AMutableArray arrayWithCapacity:100] retain];
+		p = 0;
+		range = -1;
+	}
+	return self;
+}
 
-    /** Get and remove first element in queue */
-    public T remove() {
-        T o = get(0);
-        p++;
-        // have we hit end of buffer?
-        if ( p == data.size() ) {
-            // if so, it's an opportunity to start filling at index 0 again
-            clear(); // size goes to 0, but retains memory
-        }
-        return o;
-    }
+- (void) dealloc
+{
+#ifdef DEBUG_DEALLOC
+    NSLog( @"called dealloc in FastQueue" );
+#endif
+	if ( data ) [data release];
+	[super dealloc];
+}
 
-    public void add(T o) { data.add(o); }
+- (id) copyWithZone:(NSZone *)aZone
+{
+    FastQueue *copy;
+    
+    copy = [[[self class] allocWithZone:aZone] init];
+    copy.data = [data copyWithZone:nil];
+    copy.p = p;
+    copy.range = range;
+    return copy;
+}
 
-    public int size() { return data.size() - p; }
+// FIXME: Java code has this, it doesn't seem like it needs to be there... Then again a lot of the code in the java runtime is not great...
+- (void) reset
+{
+	[self clear];
+}
 
-    public T head() { return get(0); }
+- (void) clear
+{
+	p = 0;
+    if ( [data count] )
+        [data removeAllObjects];
+}
 
-    /** Return element i elements ahead of current element.  i==0 gets
-     *  current element.  This is not an absolute index into the data list
-     *  since p defines the start of the real list.
-     */
-    public T get(int i) {
-        if ( p+i >= data.size() ) {
-            throw new NoSuchElementException("queue index "+(p+i)+" > size "+data.size());
-        }
-        return data.get(p+i);
-    }
+- (id) remove
+{
+	id obj = [self objectAtIndex:0];
+	p++;
+	// check to see if we have hit the end of the buffer
+	if ( p == [data count] ) {
+		// if we have, then we need to clear it out
+		[self clear];
+	}
+	return obj;
+}
 
-    public void clear() { p = 0; data.clear(); }
+- (void) addObject:(id) obj
+{
+    [data addObject:obj];
+}
 
-    /** Return string of current buffer contents; non-destructive */
-    public String toString() {
-        StringBuffer buf = new StringBuffer();
-        int n = size();
-        for (int i=0; i<n; i++) {
-            buf.append(get(i));
-            if ( (i+1)<n ) buf.append(" ");
-        }
-        return buf.toString();
-    }
-}
\ No newline at end of file
+- (NSUInteger) count
+{
+	return [data count];
+}
+
+- (NSUInteger) size
+{
+	return [data count] - p;
+}
+
+- (NSUInteger) range
+{
+    return range;
+}
+
+- (id) head
+{
+	return [self objectAtIndex:0];
+}
+
+- (id) objectAtIndex:(NSInteger) i
+{
+    NSInteger absIndex;
+
+    absIndex = p + i;
+	if ( absIndex >= [data count] ) {
+		@throw [NoSuchElementException newException:[NSString stringWithFormat:@"queue index %d > last index %d", absIndex, [data count]-1]];
+	}
+	if ( absIndex < 0 ) {
+	    @throw [NoSuchElementException newException:[NSString stringWithFormat:@"queue index %d < 0", absIndex]];
+	}
+	if ( absIndex > range ) range = absIndex;
+	return [data objectAtIndex:absIndex];
+}
+
+- (NSString *) toString
+{
+    return [self description];
+}
+
+- (NSString *) description
+{
+	NSMutableString *buf = [NSMutableString stringWithCapacity:30];
+	NSInteger n = [self size];
+	for (NSInteger i = 0; i < n; i++) {
+		[buf appendString:[[self objectAtIndex:i] description]];
+		if ((i + 1) < n) {
+			[buf appendString:@" "];
+		}
+	}
+	return buf;
+}
+
+#ifdef DONTUSENOMO
+- (NSAutoreleasePool *)getPool
+{
+    return pool;
+}
+
+- (void)setPool:(NSAutoreleasePool *)aPool
+{
+    pool = aPool;
+}
+#endif
+
+@end
diff --git a/runtime/ObjC/Framework/HashMap.h b/runtime/ObjC/Framework/HashMap.h
new file mode 100644
index 0000000..eb9ae55
--- /dev/null
+++ b/runtime/ObjC/Framework/HashMap.h
@@ -0,0 +1,326 @@
+//
+//  HashMap.h
+//  ANTLR
+//
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "AMutableArray.h"
+#import "AMutableDictionary.h"
+#import "ArrayIterator.h"
+#import "LinkBase.h"
+#import "MapElement.h"
+#import "PtrBuffer.h"
+
+#define GLOBAL_SCOPE       0
+#define LOCAL_SCOPE        1
+#define HASHSIZE         101
+#define HBUFSIZE      0x2000
+
+@class HashMap;
+
+/**
+ * HashMap entry.
+ */
+
+@interface HMEntry : NSObject {
+    HMEntry  *next;
+    NSInteger hash;
+    NSString *key;
+    id value;
+}
+
+@property(nonatomic, retain) HMEntry  *next;
+@property(assign)            NSInteger  hash;
+@property(nonatomic, retain) NSString *key;
+@property(nonatomic, retain) id value;
+
++ (HMEntry *)newEntry:(NSInteger)h key:(NSString *)k value:(id)v next:(HMEntry *) n;
+- (id) init:(NSInteger)h key:(NSString *)k value:(id)v next:(HMEntry *)n;
+- (void) setValue:(id)newValue;
+- (BOOL) isEqualTo:(id)o;
+- (NSInteger) hashCode;
+- (NSString *) description;
+- (void) recordAccess:(HashMap *)m;
+- (void) recordRemoval:(HashMap *)m;
+@end
+
+@interface HashIterator : ArrayIterator {
+    HMEntry  *next;
+    NSInteger expectedModCount;
+    NSInteger idx;
+    HMEntry  *current;
+    HashMap  *hm;
+}
+
++ (HashIterator *) newIterator:(HashMap *)aHM;
+
+- (id) init:(HashMap *)aHM;
+- (BOOL) hasNext;
+- (HMEntry *) next;
+- (void) remove;
+@end
+
+@interface HMEntryIterator : HashIterator
+{
+}
+
++ (HMEntryIterator *)newIterator:(HashMap *)aHM;
+
+- (id) init:(HashMap *)aHM;
+- (HMEntry *) next;
+@end
+
+@interface HMValueIterator : HashIterator
+{
+}
+
++ (HMValueIterator *)newIterator:(HashMap *)aHM;
+
+- (id) init:(HashMap *)aHM;
+- (id) next;
+@end
+
+@interface HMKeyIterator : HashIterator
+{
+}
+
++ (HMKeyIterator *)newIterator:(HashMap *)aHM;
+
+- (id) init:(HashMap *)aHM;
+- (NSString *) next;
+@end
+
+@interface HMKeySet : NSSet
+{
+    HashMap *hm;
+    AMutableArray *anArray;
+}
+
+@property (retain) HashMap *hm;
+@property (retain) AMutableArray *anArray;
+
++ (HMKeySet *)newKeySet:(HashMap *)aHM;
+
+- (id) init:(HashMap *)aHM;
+- (HashIterator *) iterator;
+- (NSUInteger) count;
+- (BOOL) contains:(id)o;
+- (BOOL) remove:(id)o;
+- (void) clear;
+- (AMutableArray *)toArray;
+@end
+
+@interface Values : PtrBuffer
+{
+    HashMap *hm;
+    AMutableArray *anArray;
+}
+
+@property (retain) HashMap *hm;
+@property (retain) AMutableArray *anArray;
+
++ (Values *)newValueSet:(HashMap *)aHM;
+
+- (id) init:(HashMap *)aHM;
+- (HashIterator *) iterator;
+- (NSUInteger) count;
+- (BOOL) contains:(id)o;
+- (void) clear;
+- (AMutableArray *)toArray;
+@end
+
+@interface HMEntrySet : NSSet
+{
+    HashMap *hm;
+    AMutableArray *anArray;
+}
+
+@property (retain) HashMap *hm;
+@property (retain) AMutableArray *anArray;
+
++ (HMEntrySet *)newEntrySet:(HashMap *)aHM;
+
+- (id) init:(HashMap *)aHM;
+- (HashIterator *) iterator;
+- (BOOL) contains:(id)o;
+- (BOOL) remove:(id)o;
+- (NSUInteger) count;
+- (void) clear;
+- (NSArray *)toArray;
+@end
+
+@interface HashMap : LinkBase {
+    //    TStringPool *fPool;
+    NSInteger Scope;
+    NSInteger LastHash;
+    NSInteger BuffSize;
+    NSInteger Capacity;
+    /**
+     * The number of key-value mappings contained in this map.
+     */
+    NSUInteger count;
+    NSUInteger ptr;
+    __strong NSMutableData *buffer;
+    __strong MapElement **ptrBuffer;
+    NSInteger mode;
+    /**
+     * The table, resized as necessary. Length MUST Always be a power of two.
+     */
+//    AMutableArray *table;
+    
+    /**
+     * The next size value at which to resize (capacity * load factor).
+     * @serial
+     */
+    NSInteger threshold;
+    
+    /**
+     * The load factor for the hash table.
+     * 
+     * @serial
+     */
+    float loadFactor;
+    /**
+     * The number of times this HashMap has been structurally modified
+     * Structural modifications are those that change the number of mappings in
+     * the HashMap or otherwise modify its internal structure (e.g.,
+     * rehash).  This field is used to make iterators on Collection-views of
+     * the HashMap fail-fast.  (See ConcurrentModificationException).
+     */
+    NSInteger modCount;
+    HMEntrySet *entrySet;
+    BOOL empty;
+    HMKeySet *keySet;
+    Values *values;
+}
+
+//@property (copy) TStringPool *fPool;
+@property (getter=getScope, setter=setScope:) NSInteger Scope;
+@property (getter=getLastHash, setter=setLastHash:) NSInteger LastHash;
+
+@property (getter=getMode,setter=setMode:) NSInteger mode;
+@property (assign) NSInteger BuffSize;
+@property (assign) NSInteger Capacity;
+@property (getter=getCount, setter=setCount:) NSUInteger count;
+@property (assign) NSUInteger ptr;
+@property (retain, getter=getBuffer, setter=setBuffer:) NSMutableData *buffer;
+@property (assign, getter=getPtrBuffer, setter=setPtrBuffer:) MapElement **ptrBuffer;
+@property (assign) NSInteger threshold;
+@property (assign) float loadFactor;
+@property (assign) NSInteger modCount;
+@property (retain) HMEntrySet *entrySet;
+@property (nonatomic, readonly) BOOL empty;
+@property (retain) HMKeySet *keySet;
+@property (retain) Values *values;
+
+// Contruction/Destruction
++ (id) newHashMap;
++ (id) newHashMap:(NSInteger)anInitialCapacity loadFactor:(float)loadFactor;
++ (id) newHashMap:(NSInteger)anInitialCapacity;
++ (id) newHashMapWithLen:(NSInteger)aBuffSize;
+- (id) init;
+- (id) initWithLen:(NSInteger)aBuffSize;
+- (id) init:(NSInteger)anInitialCapacity;
+- (id) init:(NSInteger)anInitialCapacity loadFactor:(float)loadFactor;
+- (id) initWithM:(HashMap *)m;
+- (void)dealloc;
+- (HashMap *)PushScope:( HashMap **)map;
+- (HashMap *)PopScope:( HashMap **)map;
+
+- (NSUInteger)count;
+- (NSInteger)size;
+
+// Instance Methods
+/*    form hash value for string s */
+- (NSInteger)hash:(NSString *)s;
+- (NSInteger)hashInt:(NSInteger)anInt;
+- (NSInteger) indexFor:(NSInteger)h length:(NSInteger)length;
+/*   look for s in ptrBuffer  */
+- (HashMap *)findscope:(NSInteger)level;
+/*   look for s in ptrBuffer  */
+- (id)lookup:(NSString *)s Scope:(NSInteger)scope;
+/*   look for s in ptrBuffer  */
+- (id)install:(MapElement *)sym Scope:(NSInteger)scope;
+/*   look for s in ptrBuffer  */
+- (void)deleteHashMap:(MapElement *)np;
+- (NSInteger)RemoveSym:(NSString *)s;
+- (void)delete_chain:(MapElement *)np;
+#ifdef DONTUSEYET
+- (int)bld_symtab:(KW_TABLE *)toknams;
+#endif
+- (MapElement **)getptrBuffer;
+- (MapElement *)getptrBufferEntry:(NSInteger)idx;
+- (void)setptrBuffer:(MapElement *)np Index:(NSInteger)idx;
+- (NSInteger)getScope;
+- (void)setScope:(NSInteger)i;
+- (MapElement *)getTType:(NSString *)name;
+- (MapElement *)getNameInList:(NSInteger)ttype;
+- (void)putNode:(NSString *)name TokenType:(NSInteger)ttype;
+- (NSInteger)getMode;
+- (void)setMode:(NSInteger)aMode;
+- (void) insertObject:(id)aRule atIndex:(NSInteger)idx;
+- (id) objectAtIndex:(NSInteger)idx;
+- (void) setObject:(id)aRule atIndex:(NSInteger)idx;
+- (void)addObject:(id)anObject;
+- (MapElement *) getName:(NSString *)aName;
+- (void) putName:(NSString *)name Node:(id)aNode;
+
+- (NSEnumerator *)objectEnumerator;
+- (BOOL) hasNext;
+- (MapElement *)nextObject;
+
+- (NSUInteger) count;
+- (id) get:(NSString *)key;
+- (id) getForNullKey;
+- (BOOL) containsKey:(NSString *)key;
+- (HMEntry *) getEntry:(NSString *)key;
+- (id) put:(NSString *)key value:(id)value;
+- (id) putForNullKey:(id)value;
+- (void) putForCreate:(NSString *)key value:(id)value;
+- (void) putAllForCreate:(HashMap *)m;
+- (void) resize:(NSInteger)newCapacity;
+- (void) transfer:(NSArray *)newTable;
+- (void) putAll:(HashMap *)m;
+- (id) remove:(NSString *)key;
+- (HMEntry *) removeEntryForKey:(NSString *)key;
+- (HMEntry *) removeMapping:(id)o;
+- (void) clear;
+- (BOOL) containsValue:(id)value;
+- (id) copyWithZone:(NSZone *)zone;
+- (NSString *) description;
+- (void) addEntry:(NSInteger)hash key:(NSString *)key value:(id)value bucketIndex:(NSInteger)bucketIndex;
+- (void) createEntry:(NSInteger)hash key:(NSString *)key value:(id)value bucketIndex:(NSInteger)bucketIndex;
+- (HMKeyIterator *) newKeyIterator;
+- (HMValueIterator *) newValueIterator;
+- (HMEntryIterator *) newEntryIterator;
+- (HMKeySet *) keySet;
+- (Values *) values;
+- (HMEntrySet *) entrySet;
+- (NSInteger) capacity;
+- (float) loadFactor;
+
+@end
diff --git a/runtime/ObjC/Framework/HashMap.m b/runtime/ObjC/Framework/HashMap.m
new file mode 100644
index 0000000..2755953
--- /dev/null
+++ b/runtime/ObjC/Framework/HashMap.m
@@ -0,0 +1,1786 @@
+//
+//  HashMap.m
+//  ANTLR
+//
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#define SUCCESS (0)
+#define FAILURE (-1)
+
+#import "HashMap.h"
+#import "AMutableArray.h"
+#import "RuntimeException.h"
+
+extern NSInteger max(NSInteger a, NSInteger b);
+
+static NSInteger itIndex;
+
+@implementation HMEntry
+
+@synthesize next;
+@synthesize hash;
+@synthesize key;
+@synthesize value;
+
+/**
+ * Creates new entry.
+ */
++ (HMEntry *)newEntry:(NSInteger)h key:(NSString *)k value:(id)v next:(HMEntry *) n
+{
+    return [[HMEntry alloc] init:h key:k value:v next:n];
+}
+
+- (id) init:(NSInteger)h key:(NSString *)k value:(id)v next:(HMEntry *)n
+{
+    self = [super init];
+    if ( self ) {
+        value = v;
+        next = n;
+        key = k;
+        hash = h;
+    }
+    return self;
+}
+
+- (void) setValue:(id)newValue
+{
+    value = newValue;
+    //    return oldValue;
+}
+
+- (BOOL) isEqualTo:(id)o
+{
+    /*
+     if (!([o conformsToProtocol:@protocol(HMEntry)]))
+     return NO;
+     */
+    HMEntry *e = (HMEntry *)o;
+    NSString *k1 = [self key];
+    NSString *k2 = [e key];
+    if (k1 == k2 || (k1 != nil && [k1 isEqualTo:k2])) {
+        id v1 = [self value];
+        id v2 = [e value];
+        if (v1 == v2 || (v1 != nil && [v1 isEqualTo:v2]))
+            return YES;
+    }
+    return NO;
+}
+
+- (NSInteger) hashCode
+{
+    return (key == nil ? 0 : [key hash]) ^ (value == nil ? 0 : [value hash]);
+}
+
+- (NSString *) description
+{
+    return [NSString stringWithFormat:@"%@ = %@",[key description], [value description]];
+}
+
+
+/**
+ * This method is invoked whenever the value in an entry is
+ * overwritten by an invocation of put(k,v) for a key k that's already
+ * in the HashMap.
+ */
+- (void) recordAccess:(HashMap *)m
+{
+}
+
+
+/**
+ * This method is invoked whenever the entry is
+ * removed from the table.
+ */
+- (void) recordRemoval:(HashMap *)m
+{
+}
+
+- (void) dealloc
+{
+    [key release];
+    [value release];
+    [next release];
+    [super dealloc];
+}
+
+@end
+
+@implementation HashIterator
+
++ (HashIterator *)newIterator:(HashMap *)aHM
+{
+    return [[HashIterator alloc] init:aHM];
+}
+
+- (id) init:(HashMap *)aHM
+{
+    self = [super init];
+    if ( self ) {
+        hm = aHM;
+        expectedModCount = hm.modCount;
+        if (count > 0) {
+            while ( idx < [hm.buffer length] ) {
+                next = (HMEntry *)hm.ptrBuffer[idx++];
+                if ( next == nil )
+                    break;
+            }
+        }
+    }
+    return self;
+}
+
+- (BOOL) hasNext
+{
+    return next != nil;
+}
+
+- (HMEntry *) next
+{
+//    if (hm.modCount != expectedModCount)
+//        @throw [[ConcurrentModificationException alloc] init];
+    HMEntry *e = next;
+    if (e == nil)
+        @throw [[NoSuchElementException alloc] init];
+    if ((next = e.next) == nil) {
+        while ( idx < [hm.buffer length] ) {
+            next = [anArray objectAtIndex:idx++];
+            if ( next == nil )
+                break;
+        }
+    }
+    current = e;
+    return e;
+}
+
+- (void) remove
+{
+    if (current == nil)
+        @throw [[IllegalStateException alloc] init];
+//    if (modCount != expectedModCount)
+//        @throw [[ConcurrentModificationException alloc] init];
+    NSString *k = current.key;
+    current = nil;
+    [hm removeEntryForKey:k];
+    expectedModCount = hm.modCount;
+}
+
+- (void) dealloc
+{
+    [next release];
+    [current release];
+    [super dealloc];
+}
+
+@end
+
+@implementation HMValueIterator
+
++ (HMValueIterator *)newIterator:(HashMap *)aHM
+{
+    return [[HMValueIterator alloc] init:aHM];
+}
+
+- (id) init:(HashMap *)aHM
+{
+    self = [super init:aHM];
+    if ( self ) {
+    }
+    return self;
+}
+
+- (id) next
+{
+    return [super next].value;
+}
+
+@end
+
+@implementation HMKeyIterator
+
++ (HMKeyIterator *)newIterator:(HashMap *)aHM
+{
+    return [[HMKeyIterator alloc] init:aHM];
+}
+
+- (id) init:(HashMap *)aHM
+{
+    self = [super init:aHM];
+    if ( self ) {
+    }
+    return self;
+}
+
+- (NSString *) next
+{
+    return [super next].key;
+}
+
+@end
+
+@implementation HMEntryIterator
+
++ (HMEntryIterator *)newIterator:(HashMap *)aHM
+{
+    return [[HMEntryIterator alloc] init:aHM];
+}
+
+- (id) init:(HashMap *)aHM
+{
+    self = [super init:aHM];
+    if ( self ) {
+    }
+    return self;
+}
+
+- (HMEntry *) next
+{
+    return [super next];
+}
+
+@end
+
+@implementation HMKeySet
+
+@synthesize hm;
+@synthesize anArray;
+
++ (HMKeySet *)newKeySet:(HashMap *)aHM
+{
+    return [[HMKeySet alloc] init:(HashMap *)aHM];
+}
+
+- (id) init:(HashMap *)aHM
+{
+    self = [super init];
+    if ( self ) {
+        hm = aHM;
+        anArray = [[AMutableArray arrayWithCapacity:16] retain];
+        HMKeyIterator *it = [hm newKeyIterator];
+        while ( [it hasNext] ) {
+            NSString *aKey = [it next];
+            [anArray addObject:aKey];
+        }
+    }
+    return self;
+}
+
+- (HashIterator *) iterator
+{
+    return [HMKeyIterator newIterator:hm];
+}
+
+- (NSUInteger) count
+{
+    return hm.count;
+}
+
+- (BOOL) contains:(id)o
+{
+    return [hm containsKey:o];
+}
+
+- (BOOL) remove:(id)o
+{
+    return [hm removeEntryForKey:o] != nil;
+}
+
+- (void) clear {
+    [hm clear];
+}
+
+- (AMutableArray *)toArray
+{
+    return anArray;
+}
+
+@end
+
+@implementation Values
+
+@synthesize hm;
+@synthesize anArray;
+
++ (Values *)newValueSet:(HashMap *)aHM
+{
+    return [[Values alloc] init:aHM];
+}
+
+- (id) init:(HashMap *)aHM
+{
+    self = [super init];
+    if ( self ) {
+        hm = aHM;
+        anArray = [[AMutableArray arrayWithCapacity:16] retain];
+        HMValueIterator *it = [hm newValueIterator];
+        while ( [it hasNext] ) {
+            id aValue = [it next];
+            [anArray addObject:aValue];
+        }
+    }
+    return self;    
+}
+
+- (ArrayIterator *) iterator
+{
+    return [HMValueIterator newIterator:hm];
+}
+
+- (NSUInteger) count
+{
+    return hm.count;
+}
+
+- (BOOL) contains:(id)o
+{
+    return [hm containsValue:o];
+}
+
+- (void) clear {
+    [hm clear];
+}
+
+- (AMutableArray *)toArray
+{
+    return anArray;
+}
+
+@end
+
+@implementation HMEntrySet
+
+@synthesize hm;
+@synthesize anArray;
+
++ (HMEntrySet *)newEntrySet:(HashMap *)aHM
+{
+    return [[HMEntrySet alloc] init:aHM];
+}
+
+- (id) init:(HashMap *)aHM
+{
+    self = [super init];
+    if ( self ) {
+        hm = aHM;
+        anArray = [[AMutableArray arrayWithCapacity:16] retain];
+        HMEntryIterator *it = [hm newEntryIterator];
+        while ( [it hasNext] ) {
+            HMEntry *entry = [it next];
+            [anArray addObject:entry];
+        }
+    }
+    return self;
+}
+
+- (HashIterator *) iterator
+{
+    return [HMEntryIterator newIterator:hm];
+}
+
+- (BOOL) contains:(id)o
+{
+/*
+    if (!([o conformsToProtocol:@protocol(HMEntry)]))
+        return NO;
+ */
+    HMEntry *e = (HMEntry *)o;
+    HMEntry *candidate = [hm getEntry:e.key];
+    return candidate != nil && [candidate isEqualTo:e];
+}
+
+- (BOOL) remove:(id)o
+{
+    return [hm removeMapping:o] != nil;
+}
+
+- (NSUInteger) count
+{
+    return hm.count;
+}
+
+- (void) clear
+{
+    [hm clear];
+}
+
+- (NSArray *)toArray
+{
+    return anArray;
+}
+
+@end
+
+/**
+ * The default initial capacity - MUST be a power of two.
+ */
+NSInteger const DEFAULT_INITIAL_CAPACITY = 16;
+
+/**
+ * The maximum capacity, used if a higher value is implicitly specified
+ * by either of the constructors with arguments.
+ * MUST be a power of two <= 1<<30.
+ */
+NSInteger const MAXIMUM_CAPACITY = 1 << 30;
+
+/**
+ * The load factor used when none specified in constructor.
+ */
+float const DEFAULT_LOAD_FACTOR = 0.75f;
+//long const serialVersionUID = 362498820763181265L;
+
+/*
+ * Start of HashMap
+ */
+@implementation HashMap
+
+@synthesize Scope;
+@synthesize LastHash;
+@synthesize BuffSize;
+@synthesize Capacity;
+@synthesize count;
+@synthesize ptr;
+@synthesize ptrBuffer;
+@synthesize buffer;
+@synthesize threshold;
+@synthesize loadFactor;
+@synthesize modCount;
+@synthesize entrySet;
+@synthesize empty;
+@synthesize keySet;
+@synthesize values;
+
++(id)newHashMap
+{
+    return [[HashMap alloc] init];
+}
+
++(id)newHashMapWithLen:(NSInteger)aBuffSize
+{
+    return [[HashMap alloc] initWithLen:aBuffSize];
+}
+
++ (id) newHashMap:(NSInteger)initialCapacity
+{
+    return [[HashMap alloc] init:initialCapacity loadFactor:DEFAULT_LOAD_FACTOR];
+}
+
++ (id) newHashMap:(NSInteger)initialCapacity loadFactor:(float)aLoadFactor
+{
+    return [[HashMap alloc] init:initialCapacity loadFactor:aLoadFactor];
+}
+
+/**
+ * Constructs an empty <tt>HashMap</tt> with the default initial capacity
+ * (16) and the default load factor (0.75).
+ */
+- (id) init
+{
+    NSInteger idx;
+
+    self = [super init];
+    if ( self ) {
+        entrySet = nil;
+        loadFactor = DEFAULT_LOAD_FACTOR;
+        threshold = (NSInteger)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR);
+        count = 0;
+        BuffSize = HASHSIZE;
+        NSInteger capacity = 1;
+        
+        while (capacity < BuffSize)
+            capacity <<= 1;
+        
+        BuffSize = capacity;
+        fNext = nil;
+        Scope = 0;
+        ptr = 0;
+        buffer = [[NSMutableData dataWithLength:(NSUInteger)BuffSize * sizeof(id)] retain];
+        ptrBuffer = (MapElement **) [buffer mutableBytes];
+        if ( fNext != nil ) {
+            Scope = ((HashMap *)fNext)->Scope+1;
+            for( idx = 0; idx < BuffSize; idx++ ) {
+                ptrBuffer[idx] = ((HashMap *)fNext)->ptrBuffer[idx];
+            }
+        }
+        mode = 0;
+        keySet = nil;
+        values = nil;
+   }
+    return self;
+}
+
+-(id)initWithLen:(NSInteger)aBuffSize
+{
+    NSInteger idx;
+    
+    self = [super init];
+    if ( self ) {
+        fNext = nil;
+        entrySet = nil;
+        loadFactor = DEFAULT_LOAD_FACTOR;
+        threshold = (NSInteger)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR);
+        count = 0;
+        BuffSize = aBuffSize;
+        NSInteger capacity = 1;
+        
+        while (capacity < BuffSize)
+            capacity <<= 1;
+        
+        BuffSize = capacity * sizeof(id);
+        Capacity = capacity;
+        Scope = 0;
+        ptr = 0;
+        buffer = [[NSMutableData dataWithLength:(NSUInteger)BuffSize] retain];
+        ptrBuffer = (MapElement **) [buffer mutableBytes];
+        if ( fNext != nil ) {
+            Scope = ((HashMap *)fNext)->Scope+1;
+            for( idx = 0; idx < Capacity; idx++ ) {
+                ptrBuffer[idx] = ((HashMap *)fNext)->ptrBuffer[idx];
+            }
+        }
+        mode = 0;
+        keySet = nil;
+        values = nil;
+    }
+    return( self );
+}
+
+/**
+ * Constructs an empty <tt>HashMap</tt> with the specified initial
+ * capacity and load factor.
+ * 
+ * @param  initialCapacity the initial capacity
+ * @param  loadFactor      the load factor
+ * @throws IllegalArgumentException if the initial capacity is negative
+ * or the load factor is nonpositive
+ */
+- (id) init:(NSInteger)initialCapacity loadFactor:(float)aLoadFactor
+{
+    self = [super init];
+    if ( self ) {
+        entrySet = nil;
+        if (initialCapacity < 0)
+            @throw [[IllegalArgumentException alloc] init:[NSString stringWithFormat:@"Illegal initial capacity: %d", initialCapacity]];
+        if (initialCapacity > MAXIMUM_CAPACITY)
+            initialCapacity = MAXIMUM_CAPACITY;
+        if (aLoadFactor <= 0 /* || [Float isNaN:loadFactor] */)
+            @throw [[IllegalArgumentException alloc] init:[NSString stringWithFormat:@"Illegal load factor:%d ", aLoadFactor]];
+        NSInteger capacity = 1;
+        
+        while (capacity < initialCapacity)
+            capacity <<= 1;
+        
+        count = 0;
+        BuffSize = capacity * sizeof(id);
+        Capacity = capacity;
+        loadFactor = aLoadFactor;
+        threshold = (NSInteger)(capacity * loadFactor);
+//        ptrBuffer = [AMutableArray arrayWithCapacity:initialCapacity];
+//        [self init];
+        keySet = nil;
+        values = nil;
+        Scope = 0;
+        ptr = 0;
+        buffer = [[NSMutableData dataWithLength:(NSUInteger)BuffSize] retain];
+        ptrBuffer = (MapElement **) [buffer mutableBytes];
+    }
+    return self;
+}
+
+
+/**
+ * Constructs an empty <tt>HashMap</tt> with the specified initial
+ * capacity and the default load factor (0.75).
+ * 
+ * @param  initialCapacity the initial capacity.
+ * @throws IllegalArgumentException if the initial capacity is negative.
+ */
+- (id) init:(NSInteger)anInitialCapacity
+{
+    self = [super init];
+    if ( self ) {
+        entrySet = nil;
+        NSInteger initialCapacity = anInitialCapacity;
+        if (initialCapacity > MAXIMUM_CAPACITY)
+            initialCapacity = MAXIMUM_CAPACITY;
+        NSInteger capacity = 1;
+        while (capacity < initialCapacity)
+            capacity <<= 1;
+        count = 0;
+        BuffSize = capacity;
+        loadFactor = DEFAULT_LOAD_FACTOR;
+        threshold = (NSInteger)(capacity * loadFactor);
+        keySet = nil;
+        values = nil;
+        Scope = 0;
+        ptr = 0;
+        buffer = [[NSMutableData dataWithLength:(NSUInteger)BuffSize] retain];
+        ptrBuffer = (MapElement **) [buffer mutableBytes];
+    }
+    return self;
+}
+
+/**
+ * Constructs a new <tt>HashMap</tt> with the same mappings as the
+ * specified <tt>Map</tt>.  The <tt>HashMap</tt> is created with
+ * default load factor (0.75) and an initial capacity sufficient to
+ * hold the mappings in the specified <tt>Map</tt>.
+ * 
+ * @param   m the map whose mappings are to be placed in this map
+ * @throws  NullPointerException if the specified map is null
+ */
+- (id) initWithM:(HashMap *)m
+{
+    self = [super init];
+    self = [self init:(NSInteger)max((([m count] / DEFAULT_LOAD_FACTOR) + 1), DEFAULT_INITIAL_CAPACITY) loadFactor:DEFAULT_LOAD_FACTOR];
+    if ( self ) {
+        entrySet = nil;
+        NSInteger initialCapacity = max((([m count] / DEFAULT_LOAD_FACTOR) + 1), DEFAULT_INITIAL_CAPACITY);
+        if (initialCapacity > MAXIMUM_CAPACITY)
+            initialCapacity = MAXIMUM_CAPACITY;
+        NSInteger capacity = 1;
+        while (capacity < initialCapacity)
+            capacity <<= 1;
+        count = 0;
+        BuffSize = capacity * sizeof(id);
+        Capacity = capacity;
+        loadFactor = DEFAULT_LOAD_FACTOR;
+        threshold = (NSInteger)(capacity * loadFactor);
+        keySet = nil;
+        values = nil;
+        Scope = 0;
+        ptr = 0;
+        buffer = [[NSMutableData dataWithLength:(NSUInteger)BuffSize] retain];
+        ptrBuffer = (MapElement **) [buffer mutableBytes];
+        [self putAllForCreate:m];
+    }
+    return self;
+}
+
+-(void)dealloc
+{
+#ifdef DEBUG_DEALLOC
+    NSLog( @"called dealloc in HashMap" );
+#endif
+    MapElement *tmp, *rtmp;
+    NSInteger idx;
+
+    if ( self.fNext != nil ) {
+        for( idx = 0; idx < Capacity; idx++ ) {
+            tmp = ptrBuffer[idx];
+            while ( tmp && tmp != [((HashMap *)fNext) getptrBufferEntry:idx] ) {
+                rtmp = tmp;
+                // tmp = [tmp getfNext];
+                tmp = (MapElement *)tmp.fNext;
+                [rtmp release];
+            }
+        }
+    }
+    if ( buffer ) [buffer release];
+#ifdef DONTUSEYET
+    [ptrBuffer release];
+    [entrySet release];
+#endif
+    if ( keySet ) [keySet release];
+    if ( values ) [values release];
+    [super dealloc];
+}
+
+- (NSUInteger)count
+{
+/*
+    NSUInteger aCnt = 0;
+    
+    for (NSUInteger i = 0; i < Capacity; i++) {
+        if ( ptrBuffer[i] != nil ) {
+            aCnt++;
+        }
+    }
+    return aCnt;
+ */
+    return count;
+}
+                          
+- (NSInteger) size
+{
+    NSInteger aSize = 0;
+    
+    for (NSInteger i = 0; i < Capacity; i++) {
+        if ( ptrBuffer[i] != nil ) {
+            aSize += sizeof(id);
+        }
+    }
+    return aSize;
+}
+                                  
+                                  
+-(void)deleteHashMap:(MapElement *)np
+{
+    MapElement *tmp, *rtmp;
+    NSInteger idx;
+    
+    if ( self.fNext != nil ) {
+        for( idx = 0; idx < Capacity; idx++ ) {
+            tmp = ptrBuffer[idx];
+            while ( tmp && tmp != (LinkBase *)[((HashMap *)fNext) getptrBufferEntry:idx] ) {
+                rtmp = tmp;
+                tmp = [tmp getfNext];
+                [rtmp release];
+            }
+        }
+    }
+}
+
+-(HashMap *)PushScope:(HashMap **)map
+{
+    NSInteger idx;
+    HashMap *htmp;
+    
+    htmp = [HashMap newHashMap];
+    if ( *map != nil ) {
+        ((HashMap *)htmp)->fNext = *map;
+        [htmp setScope:[((HashMap *)htmp->fNext) getScope]+1];
+        for( idx = 0; idx < Capacity; idx++ ) {
+            htmp->ptrBuffer[idx] = ((HashMap *)htmp->fNext)->ptrBuffer[idx];
+        }
+    }
+    //    gScopeLevel++;
+    *map = htmp;
+    return( htmp );
+}
+
+-(HashMap *)PopScope:(HashMap **)map
+{
+    NSInteger idx;
+    MapElement *tmp;
+    HashMap *htmp;
+    
+    htmp = *map;
+    if ( (*map)->fNext != nil ) {
+        *map = (HashMap *)htmp->fNext;
+        for( idx = 0; idx < Capacity; idx++ ) {
+            if ( htmp->ptrBuffer[idx] == nil ||
+                htmp->ptrBuffer[idx] == (*map)->ptrBuffer[idx] ) {
+                break;
+            }
+            tmp = htmp->ptrBuffer[idx];
+            /*
+             * must deal with parms, locals and labels at some point
+             * can not forget the debuggers
+             */
+            htmp->ptrBuffer[idx] = [tmp getfNext];
+            [tmp release];
+        }
+        *map = (HashMap *)htmp->fNext;
+        //        gScopeLevel--;
+    }
+    return( htmp );
+}
+
+#ifdef USERDOC
+/*
+ *  HASH        hash entry to get idx to table
+ *  NSInteger hash( HashMap *self, char *s );
+ *
+ *     Inputs:  char *s             string to find
+ *
+ *     Returns: NSInteger                 hashed value
+ *
+ *  Last Revision 9/03/90
+ */
+#endif
+-(NSInteger)hash:(NSString *)s       /*    form hash value for string s */
+{
+    NSInteger hashval;
+    const char *tmp;
+    
+    tmp = [s cStringUsingEncoding:NSASCIIStringEncoding];
+    for( hashval = 0; *tmp != '\0'; )
+        hashval += *tmp++;
+    self->LastHash = hashval % Capacity;
+    return( self->LastHash );
+}
+
+/**
+ * Applies a supplemental hash function to a given hashCode, which
+ * defends against poor quality hash functions.  This is critical
+ * because HashMap uses power-of-two length hash tables, that
+ * otherwise encounter collisions for hashCodes that do not differ
+ * in lower bits. Note: Null keys always map to hash 0, thus idx 0.
+ */
+- (NSInteger) hashInt:(NSInteger) h
+{
+    // This function ensures that hashCodes that differ only by
+    // constant multiples at each bit position have a bounded
+    // number of collisions (approximately 8 at default load factor).
+    h ^= (h >> 20) ^ (h >> 12);
+    return h ^ (h >> 7) ^ (h >> 4);
+}
+
+/**
+ * Returns idx for hash code h.
+ */
+- (NSInteger) indexFor:(NSInteger)h length:(NSInteger)length
+{
+    return h & (length - 1);
+}
+
+#ifdef USERDOC
+/*
+ *  FINDSCOPE  search hashed list for entry
+ *  HashMap *findscope( HashMap *self, NSInteger scope );
+ *
+ *     Inputs:  NSInteger       scope -- scope level to find
+ *
+ *     Returns: HashMap   pointer to ptrBuffer of proper scope level
+ *
+ *  Last Revision 9/03/90
+ */
+#endif
+-(HashMap *)findscope:(NSInteger)scope
+{
+    if ( self->Scope == scope ) {
+        return( self );
+    }
+    else if ( fNext ) {
+        return( [((HashMap *)fNext) findscope:scope] );
+    }
+    return( nil );              /*   not found      */
+}
+
+#ifdef USERDOC
+/*
+ *  LOOKUP  search hashed list for entry
+ *  MapElement *lookup( HashMap *self, char *s, NSInteger scope );
+ *
+ *     Inputs:  char     *s          string to find
+ *
+ *     Returns: MapElement  *           pointer to entry
+ *
+ *  Last Revision 9/03/90
+ */
+#endif
+-(id)lookup:(NSString *)s Scope:(NSInteger)scope
+{
+    MapElement *np;
+    
+    for( np = self->ptrBuffer[[self hash:s]]; np != nil; np = [np getfNext] ) {
+        if ( [s isEqualToString:[np getName]] ) {
+            return( np );        /*   found it       */
+        }
+    }
+    return( nil );              /*   not found      */
+}
+
+#ifdef USERDOC
+/*
+ *  INSTALL search hashed list for entry
+ *  NSInteger install( HashMap *self, MapElement *sym, NSInteger scope );
+ *
+ *     Inputs:  MapElement    *sym   -- symbol ptr to install
+ *              NSInteger         scope -- level to find
+ *
+ *     Returns: Boolean     TRUE   if installed
+ *                          FALSE  if already in table
+ *
+ *  Last Revision 9/03/90
+ */
+#endif
+-(MapElement *)install:(MapElement *)sym Scope:(NSInteger)scope
+{
+    MapElement *np;
+    
+    np = [self lookup:[sym getName] Scope:scope ];
+    if ( np == nil ) {
+        [sym retain];
+        [sym setFNext:self->ptrBuffer[ self->LastHash ]];
+        self->ptrBuffer[ self->LastHash ] = sym;
+        return( self->ptrBuffer[ self->LastHash ] );
+    }
+    return( nil );            /*   not found      */
+}
+
+#ifdef USERDOC
+/*
+ *  RemoveSym  search hashed list for entry
+ *  NSInteger RemoveSym( HashMap *self, char *s );
+ *
+ *     Inputs:  char     *s          string to find
+ *
+ *     Returns: NSInteger      indicator of SUCCESS OR FAILURE
+ *
+ *  Last Revision 9/03/90
+ */
+#endif
+-(NSInteger)RemoveSym:(NSString *)s
+{
+    MapElement *np, *tmp;
+    NSInteger idx;
+    
+    idx = [self hash:s];
+    for ( tmp = self->ptrBuffer[idx], np = self->ptrBuffer[idx]; np != nil; np = [np getfNext] ) {
+        if ( [s isEqualToString:[np getName]] ) {
+            tmp = [np getfNext];             /* get the next link  */
+            [np release];
+            return( SUCCESS );            /* report SUCCESS     */
+        }
+        tmp = [np getfNext];              //  BAD!!!!!!
+    }
+    return( FAILURE );                    /*   not found      */
+}
+
+-(void)delete_chain:(MapElement *)np
+{
+    if ( [np getfNext] != nil )
+        [self delete_chain:[np getfNext]];
+    [np dealloc];
+}
+
+#ifdef DONTUSEYET
+-(NSInteger)bld_symtab:(KW_TABLE *)toknams
+{
+    NSInteger i;
+    MapElement *np;
+    
+    for( i = 0; *(toknams[i].name) != '\0'; i++ ) {
+        // install symbol in ptrBuffer
+        np = [MapElement newMapElement:[NSString stringWithFormat:@"%s", toknams[i].name]];
+        //        np->fType = toknams[i].toknum;
+        [self install:np Scope:0];
+    }
+    return( SUCCESS );
+}
+#endif
+
+-(MapElement *)getptrBufferEntry:(NSInteger)idx
+{
+    return( ptrBuffer[idx] );
+}
+
+-(MapElement **)getptrBuffer
+{
+    return( ptrBuffer );
+}
+
+-(void)setptrBuffer:(MapElement *)np Index:(NSInteger)idx
+{
+    if ( idx < Capacity ) {
+        [np retain];
+        ptrBuffer[idx] = np;
+    }
+}
+
+-(NSInteger)getScope
+{
+    return( Scope );
+}
+
+-(void)setScopeScope:(NSInteger)i
+{
+    Scope = i;
+}
+
+- (MapElement *)getTType:(NSString *)name
+{
+    return [self lookup:name Scope:0];
+}
+
+/*
+ * works only for maplist indexed not by name but by TokenNumber
+ */
+- (MapElement *)getNameInList:(NSInteger)ttype
+{
+    MapElement *np;
+    NSInteger aTType;
+
+    aTType = ttype % Capacity;
+    for( np = self->ptrBuffer[aTType]; np != nil; np = [np getfNext] ) {
+        if ( [(ACNumber *)np.node integerValue] == ttype ) {
+            return( np );        /*   found it       */
+        }
+    }
+    return( nil );              /*   not found      */
+}
+
+- (LinkBase *)getName:(NSString *)name
+{
+    return [self lookup:name Scope:0]; /*  nil if not found      */    
+}
+
+- (void)putNode:(NSString *)name TokenType:(NSInteger)ttype
+{
+    MapElement *np;
+    
+    // install symbol in ptrBuffer
+    np = [MapElement newMapElementWithName:[NSString stringWithString:name] Type:ttype];
+    //        np->fType = toknams[i].toknum;
+    [self install:np Scope:0];
+}
+
+- (NSInteger)getMode
+{
+    return mode;
+}
+
+- (void)setMode:(NSInteger)aMode
+{
+    mode = aMode;
+}
+
+- (void) addObject:(id)aRule
+{
+    NSInteger idx;
+
+    idx = [self count];
+    if ( idx >= Capacity ) {
+        idx %= Capacity;
+    }
+    ptrBuffer[idx] = aRule;
+}
+
+/* this may have to handle linking into the chain
+ */
+- (void) insertObject:(id)aRule atIndex:(NSInteger)idx
+{
+    if ( idx >= Capacity ) {
+        idx %= Capacity;
+    }
+    if ( aRule != ptrBuffer[idx] ) {
+        if ( ptrBuffer[idx] ) [ptrBuffer[idx] release];
+        [aRule retain];
+    }
+    ptrBuffer[idx] = aRule;
+}
+
+- (id)objectAtIndex:(NSInteger)idx
+{
+    if ( idx >= Capacity ) {
+        idx %= Capacity;
+    }
+    return ptrBuffer[idx];
+}
+
+/**
+ * Returns <tt>true</tt> if this map contains no key-value mappings.
+ * 
+ * @return <tt>true</tt> if this map contains no key-value mappings
+ */
+- (BOOL) empty
+{
+    return count == 0;
+}
+
+/**
+ * Offloaded version of get() to look up null keys.  Null keys map
+ * to idx 0.  This null case is split out into separate methods
+ * for the sake of performance in the two most commonly used
+ * operations (get and put), but incorporated with conditionals in
+ * others.
+ */
+- (id) getForNullKey
+{
+    
+    for (HMEntry *e = (HMEntry *)ptrBuffer[0]; e != nil; e = e.next) {
+        if (e.key == nil)
+            return e.value;
+    }
+    
+    return nil;
+}
+
+/**
+ * Returns the value to which the specified key is mapped,
+ * or {@code null} if this map contains no mapping for the key.
+ * 
+ * <p>More formally, if this map contains a mapping from a key
+ * {@code k} to a value {@code v} such that {@code (key==null ? k==null :
+ * key.equals(k))}, then this method returns {@code v}; otherwise
+ * it returns {@code null}.  (There can be at most one such mapping.)
+ * 
+ * <p>A return value of {@code null} does not <i>necessarily</i>
+ * indicate that the map contains no mapping for the key; it's also
+ * possible that the map explicitly maps the key to {@code null}.
+ * The {@link #containsKey containsKey} operation may be used to
+ * distinguish these two cases.
+ * 
+ * @see #put(Object, Object)
+ */
+- (id) get:(NSString *)key
+{
+    if (key == nil)
+        return [self getForNullKey];
+    //    NSInteger hash = [self hashInt:[self hash:key]];
+    NSInteger hash = [self hashInt:[key hash]];
+    
+    for (HMEntry *e = (HMEntry *)ptrBuffer[[self indexFor:hash length:[self capacity]]]; e != nil; e = e.next) {
+        NSString *k;
+        if (e.hash == hash && ((k = e.key) == key || [key isEqualTo:k]))
+            return e.value;
+    }
+    
+    return nil;
+}
+
+
+/**
+ * Returns <tt>true</tt> if this map contains a mapping for the
+ * specified key.
+ * 
+ * @param   key   The key whose presence in this map is to be tested
+ * @return <tt>true</tt> if this map contains a mapping for the specified
+ * key.
+ */
+- (BOOL) containsKey:(NSString *)key
+{
+    return [self getEntry:key] != nil;
+}
+
+/**
+ * Returns the entry associated with the specified key in the
+ * HashMap.  Returns null if the HashMap contains no mapping
+ * for the key.
+ */
+- (HMEntry *) getEntry:(NSString *)key
+{
+    //    NSInteger hash = (key == nil) ? 0 : [self hashInt:[self hash:key]];
+    NSInteger hash = (key == nil) ? 0 : [self hashInt:[key hash]];
+    
+    for (HMEntry *e = (HMEntry *)ptrBuffer[[self indexFor:hash length:Capacity]]; e != nil; e = e.next) {
+        NSString *k;
+        if (e.hash == hash && ((k = e.key) == key || (key != nil && [key isEqualTo:k])))
+            return e;
+    }
+    
+    return nil;
+}
+
+
+/**
+ * Associates the specified value with the specified key in this map.
+ * If the map previously contained a mapping for the key, the old
+ * value is replaced.
+ * 
+ * @param key key with which the specified value is to be associated
+ * @param value value to be associated with the specified key
+ * @return the previous value associated with <tt>key</tt>, or
+ * <tt>null</tt> if there was no mapping for <tt>key</tt>.
+ * (A <tt>null</tt> return can also indicate that the map
+ * previously associated <tt>null</tt> with <tt>key</tt>.)
+ */
+- (id) put:(NSString *)key value:(id)value
+{
+    if (key == nil)
+        return [self putForNullKey:value];
+//    NSInteger hash = [self hashInt:[self hash:key]];
+    NSInteger hash = [self hashInt:[key hash]];
+    NSInteger i = [self indexFor:hash length:[self capacity]];
+    
+    for (HMEntry *e = (HMEntry *)ptrBuffer[i]; e != nil; e = e.next) {
+        NSString *k;
+        if (e.hash == hash && ((k = e.key) == key || [key isEqualTo:k])) {
+            id oldValue = e.value;
+            e.value = value;
+            [e recordAccess:self];
+            return oldValue;
+        }
+    }
+    
+    modCount++;
+    [self addEntry:hash key:key value:value bucketIndex:i];
+    return nil;
+}
+
+
+/**
+ * Offloaded version of put for null keys
+ */
+- (id) putForNullKey:(id)value
+{
+    
+    for (HMEntry *e = (HMEntry *)ptrBuffer[0]; e != nil; e = e.next) {
+        if (e.key == nil) {
+            id oldValue = e.value;
+            e.value = value;
+            [e recordAccess:self];
+            return oldValue;
+        }
+    }
+    
+    modCount++;
+    [self addEntry:0 key:nil value:value bucketIndex:0];
+    return nil;
+}
+
+/**
+ * This method is used instead of put by constructors and
+ * pseudoconstructors (clone, readObject).  It does not resize the table,
+ * check for comodification, etc.  It calls createEntry rather than
+ * addEntry.
+ */
+- (void) putForCreate:(NSString *)key value:(id)value
+{
+    NSInteger hash = (key == nil) ? 0 : [self hashInt:[self hash:key]];
+    NSInteger i = [self indexFor:hash length:[self capacity]];
+    
+    for (HMEntry *e = (HMEntry *)ptrBuffer[i]; e != nil; e = e.next) {
+        NSString *k;
+        if (e.hash == hash && ((k = e.key) == key || (key != nil && [key isEqualTo:k]))) {
+            e.value = value;
+            return;
+        }
+    }
+    
+    [self createEntry:hash key:key value:value bucketIndex:i];
+}
+
+- (void) putAllForCreate:(HashMap *)m
+{
+    
+    for (HMEntry *e in [m entrySet])
+        [self putForCreate:[e key] value:[e value]];
+    
+}
+
+/**
+ * Rehashes the contents of this map into a new array with a
+ * larger capacity.  This method is called automatically when the
+ * number of keys in this map reaches its threshold.
+ * 
+ * If current capacity is MAXIMUM_CAPACITY, this method does not
+ * resize the map, but sets threshold to Integer.MAX_VALUE.
+ * This has the effect of preventing future calls.
+ * 
+ * @param newCapacity the new capacity, MUST be a power of two;
+ * must be greater than current capacity unless current
+ * capacity is MAXIMUM_CAPACITY (in which case value
+ * is irrelevant).
+ */
+- (void) resize:(NSInteger)newCapacity
+{
+//    NSArray * oldTable = ptrBuffer;
+    NSInteger oldCapacity = Capacity;
+    if (oldCapacity == MAXIMUM_CAPACITY) {
+        threshold = NSIntegerMax;
+        return;
+    }
+//    NSArray * newTable = [NSArray array];
+//    [self transfer:newTable];
+    BuffSize = newCapacity * sizeof(id);
+    Capacity = newCapacity;
+    [buffer setLength:BuffSize];
+    ptrBuffer = [buffer mutableBytes];
+    threshold = (NSInteger)(newCapacity * loadFactor);
+}
+
+
+/**
+ * Transfers all entries from current table to newTable.
+ */
+- (void) transfer:(AMutableArray *)newTable
+{
+    NSInteger newCapacity = [newTable count];
+    
+    for (NSInteger j = 0; j < [self capacity]; j++) {
+        HMEntry *e = (HMEntry *)ptrBuffer[j];
+        if (e != nil) {
+            ptrBuffer[j] = nil;
+            
+            do {
+                HMEntry *next = e.next;
+                NSInteger i = [self indexFor:e.hash length:newCapacity];
+                e.next = [newTable objectAtIndex:i];
+                [newTable replaceObjectAtIndex:i withObject:e];
+                e = next;
+            }
+            while (e != nil);
+        }
+    }
+    
+}
+
+
+/**
+ * Copies all of the mappings from the specified map to this map.
+ * These mappings will replace any mappings that this map had for
+ * any of the keys currently in the specified map.
+ * 
+ * @param m mappings to be stored in this map
+ * @throws NullPointerException if the specified map is null
+ */
+- (void) putAll:(HashMap *)m
+{
+    NSInteger numKeysToBeAdded = [m count];
+    if (numKeysToBeAdded == 0)
+        return;
+    if (numKeysToBeAdded > threshold) {
+        NSInteger targetCapacity = (NSInteger)(numKeysToBeAdded / loadFactor + 1);
+        if (targetCapacity > MAXIMUM_CAPACITY)
+            targetCapacity = MAXIMUM_CAPACITY;
+        NSInteger newCapacity = Capacity;
+        
+        while (newCapacity < targetCapacity)
+            newCapacity <<= 1;
+        
+        if (newCapacity > Capacity)
+            [self resize:newCapacity];
+    }
+    
+    for (HMEntry *e in [m entrySet])
+        [self put:[e key] value:[e value]];
+    
+}
+
+/**
+ * Removes the mapping for the specified key from this map if present.
+ * 
+ * @param  key key whose mapping is to be removed from the map
+ * @return the previous value associated with <tt>key</tt>, or
+ * <tt>null</tt> if there was no mapping for <tt>key</tt>.
+ * (A <tt>null</tt> return can also indicate that the map
+ * previously associated <tt>null</tt> with <tt>key</tt>.)
+ */
+- (id) remove:(NSString *)key
+{
+    HMEntry *e = [self removeEntryForKey:key];
+    return (e == nil ? nil : e.value);
+}
+
+
+/**
+ * Removes and returns the entry associated with the specified key
+ * in the HashMap.  Returns null if the HashMap contains no mapping
+ * for this key.
+ */
+- (HMEntry *) removeEntryForKey:(NSString *)key
+{
+    NSInteger hash = (key == nil) ? 0 : [self hashInt:[self hash:key]];
+    NSInteger i = [self indexFor:hash length:Capacity];
+    HMEntry *prev = (HMEntry *)ptrBuffer[i];
+    HMEntry *e = prev;
+    
+    while (e != nil) {
+        HMEntry *next = e.next;
+        NSString *k;
+        if (e.hash == hash && ((k = e.key) == key || (key != nil && [key isEqualTo:k]))) {
+            modCount++;
+            count--;
+            if (prev == e)
+                ptrBuffer[i] = (id) next;
+            else
+                prev.next = next;
+            [e recordRemoval:self];
+            return e;
+        }
+        prev = e;
+        e = next;
+    }
+    
+    return e;
+}
+
+/**
+ * Special version of remove for EntrySet.
+ */
+- (HMEntry *) removeMapping:(id)o
+{
+//    if (!([o conformsToProtocol:@protocol(HMEntry)]))
+//        return nil;
+    HMEntry *entry = (HMEntry *)o;
+    NSString *key = entry.key;
+    NSInteger hash = (key == nil) ? 0 : [self hashInt:[self hash:key]];
+    NSInteger i = [self indexFor:hash length:Capacity];
+    HMEntry *prev = (HMEntry *)ptrBuffer[i];
+    HMEntry *e = prev;
+    
+    while (e != nil) {
+        HMEntry *next = e.next;
+        if (e.hash == hash && [e isEqualTo:entry]) {
+            modCount++;
+            count--;
+            if (prev == e)
+                ptrBuffer[i] = (id)next;
+            else
+                prev.next = next;
+            [e recordRemoval:self];
+            return e;
+        }
+        prev = e;
+        e = next;
+    }
+    
+    return e;
+}
+
+/**
+ * Removes all of the mappings from this map.
+ * The map will be empty after this call returns.
+ */
+- (void) clear
+{
+    modCount++;
+    id tmp;
+    
+    for (NSInteger i = 0; i < Capacity; i++) {
+        tmp = ptrBuffer[i];
+        if ( tmp ) {
+            [tmp release];
+        }
+        ptrBuffer[i] = nil;
+    }
+    count = 0;
+}
+
+
+/**
+ * Special-case code for containsValue with null argument
+ */
+- (BOOL) containsNullValue
+{
+    for (NSInteger i = 0; i < Capacity; i++)
+        
+        for (HMEntry *e = (HMEntry *)ptrBuffer[i]; e != nil; e = e.next)
+            if (e.value == nil)
+                return YES;
+    return NO;
+}
+
+/**
+ * Returns <tt>true</tt> if this map maps one or more keys to the
+ * specified value.
+ * 
+ * @param value value whose presence in this map is to be tested
+ * @return <tt>true</tt> if this map maps one or more keys to the
+ * specified value
+ */
+- (BOOL) containsValue:(id)value
+{
+    if (value == nil)
+        return [self containsNullValue];
+    
+    for (NSInteger i = 0; i < Capacity; i++)
+        
+        for (HMEntry *e = (HMEntry *)ptrBuffer[i]; e != nil; e = e.next)
+            if ([value isEqualTo:e.value])
+                return YES;
+    
+    
+    return NO;
+}
+
+/**
+ * Returns a shallow copy of this <tt>HashMap</tt> instance: the keys and
+ * values themselves are not cloned.
+ * 
+ * @return a shallow copy of this map
+ */
+- (id) copyWithZone:(NSZone *)zone
+{
+    HashMap *result = nil;
+    
+    //    @try {
+    result = [HashMap allocWithZone:zone];
+//        result = (HashMap *)[super copyWithZone:zone];
+//    }
+//    @catch (CloneNotSupportedException * e) {
+//    }
+    result.ptrBuffer = ptrBuffer;
+    result.entrySet = nil;
+    //    result.modCount = 0;
+    //    result.count = 0;
+    //    [result init];
+    [result putAllForCreate:self];
+    result.count = count;
+    result.threshold = threshold;
+    result.loadFactor = loadFactor;
+    result.modCount = modCount;
+    result.entrySet = entrySet;
+    return result;
+}
+
+
+/**
+ * Returns a string representation of this map.  The string representation
+ * consists of a list of key-value mappings in the order returned by the
+ * map's <tt>entrySet</tt> view's iterator, enclosed in braces
+ * (<tt>"{}"</tt>).  Adjacent mappings are separated by the characters
+ * <tt>", "</tt> (comma and space).  Each key-value mapping is rendered as
+ * the key followed by an equals sign (<tt>"="</tt>) followed by the
+ * associated value.  Keys and values are converted to strings as by
+ * {@link String#valueOf(Object)}.
+ *
+ * @return a string representation of this map
+ */
+- (NSString *)description
+{
+    HashIterator *it = [[self entrySet] iterator];
+    if (![it hasNext])
+        return @"{}";
+    
+    NSMutableString *sb = [NSMutableString stringWithCapacity:40];
+    [sb appendString:@"{"];
+    while ( YES ) {
+        HMEntry *e = [it next];
+        NSString *key = e.key;
+        id value = e.value;
+        [sb appendFormat:@"%@=%@", (key == self ? @"[self Map]" : key), (value == self ? @"[self Map]" : value)];
+        if ( ![it hasNext] ) {
+            [sb appendString:@"}"];
+            return sb;
+        }
+        [sb appendString:@", "];
+    }
+}
+
+/**
+ * Adds a new entry with the specified key, value and hash code to
+ * the specified bucket.  It is the responsibility of this
+ * method to resize the table if appropriate.
+ * 
+ * Subclass overrides this to alter the behavior of put method.
+ */
+- (void) addEntry:(NSInteger)hash key:(NSString *)key value:(id)value bucketIndex:(NSInteger)bucketIndex
+{
+    HMEntry *e = (HMEntry *)ptrBuffer[bucketIndex];
+    ptrBuffer[bucketIndex] = [[HMEntry alloc] init:hash key:key value:value next:e];
+    if (count++ >= threshold)
+        [self resize:2 * BuffSize];
+}
+
+/**
+ * Like addEntry except that this version is used when creating entries
+ * as part of Map construction or "pseudo-construction" (cloning,
+ * deserialization).  This version needn't worry about resizing the table.
+ * 
+ * Subclass overrides this to alter the behavior of HashMap(Map),
+ * clone, and readObject.
+ */
+- (void) createEntry:(NSInteger)hash key:(NSString *)key value:(id)value bucketIndex:(NSInteger)bucketIndex
+{
+    HMEntry *e = (HMEntry *)ptrBuffer[bucketIndex];
+    ptrBuffer[bucketIndex] = [[HMEntry alloc] init:hash key:key value:value next:e];
+    count++;
+}
+
+- (HMKeyIterator *) newKeyIterator
+{
+    return [HMKeyIterator newIterator:self];
+}
+
+- (HMValueIterator *) newValueIterator
+{
+    return [HMValueIterator newIterator:self];
+}
+
+- (HMEntryIterator *) newEntryIterator
+{
+    return [HMEntryIterator newIterator:self];
+}
+
+
+/**
+ * Returns a {@link Set} view of the keys contained in this map.
+ * The set is backed by the map, so changes to the map are
+ * reflected in the set, and vice-versa.  If the map is modified
+ * while an iteration over the set is in progress (except through
+ * the iterator's own <tt>remove</tt> operation), the results of
+ * the iteration are undefined.  The set supports element removal,
+ * which removes the corresponding mapping from the map, via the
+ * <tt>Iterator.remove</tt>, <tt>Set.remove</tt>,
+ * <tt>removeAll</tt>, <tt>retainAll</tt>, and <tt>clear</tt>
+ * operations.  It does not support the <tt>add</tt> or <tt>addAll</tt>
+ * operations.
+ */
+- (HMKeySet *) keySet
+{
+    HMKeySet *ks = keySet;
+    return (ks != nil ? ks : (keySet = [HMKeySet newKeySet:self]));
+}
+
+
+/**
+ * Returns a {@link Collection} view of the values contained in this map.
+ * The collection is backed by the map, so changes to the map are
+ * reflected in the collection, and vice-versa.  If the map is
+ * modified while an iteration over the collection is in progress
+ * (except through the iterator's own <tt>remove</tt> operation),
+ * the results of the iteration are undefined.  The collection
+ * supports element removal, which removes the corresponding
+ * mapping from the map, via the <tt>Iterator.remove</tt>,
+ * <tt>Collection.remove</tt>, <tt>removeAll</tt>,
+ * <tt>retainAll</tt> and <tt>clear</tt> operations.  It does not
+ * support the <tt>add</tt> or <tt>addAll</tt> operations.
+ */
+- (Values *) values
+{
+    Values *vs = values;
+    return (vs != nil ? vs : (values = [Values newValueSet:self]));
+}
+
+
+/**
+ * Returns a {@link Set} view of the mappings contained in this map.
+ * The set is backed by the map, so changes to the map are
+ * reflected in the set, and vice-versa.  If the map is modified
+ * while an iteration over the set is in progress (except through
+ * the iterator's own <tt>remove</tt> operation, or through the
+ * <tt>setValue</tt> operation on a map entry returned by the
+ * iterator) the results of the iteration are undefined.  The set
+ * supports element removal, which removes the corresponding
+ * mapping from the map, via the <tt>Iterator.remove</tt>,
+ * <tt>Set.remove</tt>, <tt>removeAll</tt>, <tt>retainAll</tt> and
+ * <tt>clear</tt> operations.  It does not support the
+ * <tt>add</tt> or <tt>addAll</tt> operations.
+ * 
+ * @return a set view of the mappings contained in this map
+ */
+- (HMEntrySet *) entrySet0
+{
+    HMEntrySet *es = entrySet;
+    return es != nil ? es : (entrySet = [HMEntrySet newEntrySet:self]);
+}
+
+- (HMEntrySet *) entrySet
+{
+    return [self entrySet0];
+}
+
+
+/**
+ * Save the state of the <tt>HashMap</tt> instance to a stream (i.e.,
+ * serialize it).
+ * 
+ * @serialData The <i>capacity</i> of the HashMap (the length of the
+ * bucket array) is emitted (NSInteger), followed by the
+ * <i>count</i> (an NSInteger, the number of key-value
+ * mappings), followed by the key (Object) and value (Object)
+ * for each key-value mapping.  The key-value mappings are
+ * emitted in no particular order.
+ */
+- (void) writeObject:(NSOutputStream *)s
+{
+/*
+    NSEnumerator * i = (count > 0) ? [[self entrySet0] iterator] : nil;
+    [s defaultWriteObject];
+    [s writeInt:[buffer length]];
+    [s writeInt:count];
+    if (i != nil) {
+        while ([i hasNext]) {
+            HMEntry *e = [i nextObject];
+            [s writeObject:[e key]];
+            [s writeObject:[e value]];
+        }
+        
+    }
+ */
+}
+
+
+/**
+ * Reconstitute the <tt>HashMap</tt> instance from a stream (i.e.,
+ * deserialize it).
+ */
+- (void) readObject:(NSInputStream *)s
+{
+/*
+    [s defaultReadObject];
+    NSInteger numBuckets = [s readInt];
+    ptrBuffer = [NSArray array];
+    [self init];
+    NSInteger count = [s readInt];
+    
+    for (NSInteger i = 0; i < count; i++) {
+        NSString * key = (NSString *)[s readObject];
+        id value = (id)[s readObject];
+        [self putForCreate:key value:value];
+    }
+ */
+}
+
+- (NSInteger) capacity
+{
+    return Capacity;
+}
+
+- (float) loadFactor
+{
+    return loadFactor;
+}
+
+/* this will never link into the chain
+ */
+- (void) setObject:(id)aRule atIndex:(NSInteger)idx
+{
+    if ( idx >= Capacity ) {
+        idx %= Capacity;
+    }
+    if ( aRule != ptrBuffer[idx] ) {
+        if ( ptrBuffer[idx] ) [ptrBuffer[idx] release];
+        [aRule retain];
+    }
+    ptrBuffer[idx] = aRule;
+}
+
+- (void)putName:(NSString *)name Node:(id)aNode
+{
+    MapElement *np;
+    
+    np = [self lookup:name Scope:0 ];
+    if ( np == nil ) {
+        np = [MapElement newMapElementWithName:name Node:aNode];
+        if ( ptrBuffer[LastHash] )
+            [ptrBuffer[LastHash] release];
+        [np retain];
+        np.fNext = ptrBuffer[ LastHash ];
+        ptrBuffer[ LastHash ] = np;
+    }
+    return;    
+}
+
+- (NSEnumerator *)objectEnumerator
+{
+#pragma mark fix this its broken
+    NSEnumerator *anEnumerator;
+
+    itIndex = 0;
+    return anEnumerator;
+}
+
+- (BOOL)hasNext
+{
+    if (self && [self count] < Capacity-1) {
+        return YES;
+    }
+    return NO;
+}
+
+- (MapElement *)nextObject
+{
+    if (self && itIndex < Capacity-1) {
+        return ptrBuffer[itIndex];
+    }
+    return nil;
+}
+
+@end
+
diff --git a/runtime/ObjC/Framework/HashRule.h b/runtime/ObjC/Framework/HashRule.h
new file mode 100644
index 0000000..94b0abd
--- /dev/null
+++ b/runtime/ObjC/Framework/HashRule.h
@@ -0,0 +1,71 @@
+//
+//  HashRule.h
+//  ANTLR
+//
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "ACNumber.h"
+#import "RuleMemo.h"
+#import "PtrBuffer.h"
+
+#define GLOBAL_SCOPE       0
+#define LOCAL_SCOPE        1
+#define HASHSIZE         101
+#define HBUFSIZE      0x2000
+
+@interface HashRule : PtrBuffer {
+    //    TStringPool *fPool;
+    NSInteger LastHash;
+    NSInteger mode;
+}
+
+// Contruction/Destruction
++ (id)newHashRule;
++ (id)newHashRuleWithLen:(NSInteger)aBuffSize;
+- (id)init;
+- (id)initWithLen:(NSInteger)aBuffSize;
+- (void)dealloc;
+
+- (NSInteger)count;
+- (NSInteger)length;
+- (NSInteger)size;
+
+// Instance Methods
+- (void)deleteHashRule:(RuleMemo *)np;
+- (void)delete_chain:(RuleMemo *)np;
+- (RuleMemo **)getPtrBuffer;
+- (void)setPtrBuffer:(RuleMemo **)np;
+- (ACNumber *)getRuleMemoStopIndex:(NSInteger)aStartIndex;
+- (void)putRuleMemoAtStartIndex:(NSInteger)aStartIndex StopIndex:(NSInteger)aStopIndex;
+- (NSInteger)getMode;
+- (void)setMode:(NSInteger)aMode;
+- (void) insertObject:(RuleMemo *)aRule atIndex:(NSInteger)Index;
+- (RuleMemo *) objectAtIndex:(NSInteger)Index;
+
+@property (getter=getLastHash, setter=setLastHash:) NSInteger LastHash;
+@property (getter=getMode,setter=setMode:) NSInteger mode;
+@end
diff --git a/runtime/ObjC/Framework/HashRule.m b/runtime/ObjC/Framework/HashRule.m
new file mode 100644
index 0000000..e453ba1
--- /dev/null
+++ b/runtime/ObjC/Framework/HashRule.m
@@ -0,0 +1,279 @@
+//
+//  HashRule.m
+//  ANTLR
+//
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#define SUCCESS (0)
+#define FAILURE (-1)
+#define ANTLR_MEMO_RULE_UNKNOWN -1
+
+#import "HashRule.h"
+
+/*
+ * Start of HashRule
+ */
+@implementation HashRule
+
+@synthesize LastHash;
+
++(id)newHashRule
+{
+    return [[HashRule alloc] init];
+}
+
++(id)newHashRuleWithLen:(NSInteger)aBuffSize
+{
+    return [[HashRule alloc] initWithLen:aBuffSize];
+}
+
+-(id)init
+{
+    self = [super initWithLen:HASHSIZE];
+    if ( self != nil ) {
+    }
+    return( self );
+}
+
+-(id)initWithLen:(NSInteger)aBuffSize
+{
+    self = [super initWithLen:aBuffSize];
+    if ( self != nil ) {
+        mode = 0;
+    }
+    return( self );
+}
+
+-(void)dealloc
+{
+#ifdef DEBUG_DEALLOC
+    NSLog( @"called dealloc in HashRule" );
+#endif
+    RuleMemo *tmp, *rtmp;
+    int Index;
+    
+    if ( self.fNext != nil ) {
+        for( Index = 0; Index < BuffSize; Index++ ) {
+            tmp = ptrBuffer[Index];
+            while ( tmp && tmp != ptrBuffer[Index] ) {
+                rtmp = tmp;
+                if ([tmp isKindOfClass:[LinkBase class]])
+                    tmp = (RuleMemo *)tmp.fNext;
+                else
+                    tmp = nil;
+                [rtmp release];
+            }
+        }
+    }
+    [super dealloc];
+}
+
+- (NSInteger)count
+{
+    NSInteger aCnt = 0;
+    
+    for (int i = 0; i < BuffSize; i++) {
+        if ( ptrBuffer[i] != nil ) {
+            aCnt++;
+        }
+    }
+    return aCnt;
+}
+                          
+- (NSInteger) length
+{
+    return BuffSize;
+}
+
+- (NSInteger) size
+{
+    NSInteger aSize = 0;
+    
+    for (int i = 0; i < BuffSize; i++) {
+        if ( ptrBuffer[i] != nil ) {
+            aSize += sizeof(id);
+        }
+    }
+    return aSize;
+}
+                                  
+                                  
+-(void)deleteHashRule:(RuleMemo *)np
+{
+    RuleMemo *tmp, *rtmp;
+    int Index;
+    
+    if ( self.fNext != nil ) {
+        for( Index = 0; Index < BuffSize; Index++ ) {
+            tmp = ptrBuffer[Index];
+            while ( tmp && tmp != ptrBuffer[Index ] ) {
+                rtmp = tmp;
+                if ([tmp isKindOfClass:[LinkBase class]])
+                    tmp = (RuleMemo *)tmp.fNext;
+                else
+                    tmp = nil;
+                [rtmp release];
+            }
+        }
+    }
+}
+
+-(void)delete_chain:(RuleMemo *)np
+{
+    if ( np.fNext != nil )
+        [self delete_chain:np.fNext];
+    [np release];
+}
+
+-(RuleMemo **)getPtrBuffer
+{
+    return( ptrBuffer );
+}
+
+-(void)setPtrBuffer:(RuleMemo **)np
+{
+    ptrBuffer = np;
+}
+
+- (ACNumber *)getRuleMemoStopIndex:(NSInteger)aStartIndex
+{
+    RuleMemo *aRule;
+    ACNumber *stopIndex;
+    NSInteger anIndex;
+    
+    anIndex = ( aStartIndex >= BuffSize ) ? aStartIndex % BuffSize : aStartIndex;
+    if ((aRule = ptrBuffer[anIndex]) == nil) {
+        return nil;
+    }
+    stopIndex = [aRule getStopIndex:aStartIndex];
+    return stopIndex;
+}
+
+- (void)putRuleMemo:(RuleMemo *)aRule AtStartIndex:(NSInteger)aStartIndex
+{
+    NSInteger anIndex;
+    
+    anIndex = (aStartIndex >= BuffSize) ? aStartIndex %= BuffSize : aStartIndex;
+    if ( ptrBuffer[anIndex] == nil ) {
+        ptrBuffer[anIndex] = aRule;
+        [aRule retain];
+    }
+    else {
+        do {
+            if ( [aRule.startIndex integerValue] == aStartIndex ) {
+                [aRule setStartIndex:aRule.stopIndex];
+                return;
+            }
+            aRule = aRule.fNext;
+        } while ( aRule != nil );
+    }
+}
+
+- (void)putRuleMemoAtStartIndex:(NSInteger)aStartIndex StopIndex:(NSInteger)aStopIndex
+{
+    RuleMemo *aRule, *newRule;
+    NSInteger anIndex;
+    NSInteger aMatchIndex;
+
+    anIndex = (aStartIndex >= BuffSize) ? aStartIndex % BuffSize : aStartIndex;
+    aRule = ptrBuffer[anIndex];
+    if ( aRule == nil ) {
+        aRule = [RuleMemo newRuleMemoWithStartIndex:[ACNumber numberWithInteger:aStartIndex]
+                                                    StopIndex:[ACNumber numberWithInteger:aStopIndex]];
+        [aRule retain];
+        ptrBuffer[anIndex] = aRule;
+    }
+    else {
+        aMatchIndex = [aRule.startIndex integerValue];
+        if ( aStartIndex > aMatchIndex ) {
+            if ( aRule != ptrBuffer[anIndex] ) {
+                [aRule retain];
+            }
+            aRule.fNext = ptrBuffer[anIndex];
+            ptrBuffer[anIndex] = aRule;
+            return;
+        }
+        while (aRule.fNext != nil) {
+            aMatchIndex = [((RuleMemo *)aRule.fNext).startIndex integerValue];
+            if ( aStartIndex > aMatchIndex ) {
+                newRule = [RuleMemo newRuleMemoWithStartIndex:[ACNumber numberWithInteger:aStartIndex]
+                                                              StopIndex:[ACNumber numberWithInteger:aStopIndex]];
+                [newRule retain];
+                newRule.fNext = aRule.fNext;
+                aRule.fNext = newRule;
+                return;
+            }
+            if ( aMatchIndex == aStartIndex ) {
+                [aRule setStartIndex:aRule.stopIndex];
+                return;
+            }
+            aRule = aRule.fNext;
+        }
+    }
+}
+
+- (NSInteger)getLastHash
+{
+    return LastHash;
+}
+
+- (void)setLastHash:(NSInteger)aHash
+{
+    LastHash = aHash;
+}
+
+- (NSInteger)getMode
+{
+    return mode;
+}
+
+- (void)setMode:(NSInteger)aMode
+{
+    mode = aMode;
+}
+
+- (void) insertObject:(RuleMemo *)aRule atIndex:(NSInteger)anIndex
+{
+    NSInteger Index;
+    
+    Index = ( anIndex >= BuffSize ) ? anIndex % BuffSize : anIndex;
+    if (aRule != ptrBuffer[Index]) {
+        if ( ptrBuffer[Index] ) [ptrBuffer[Index] release];
+        [aRule retain];
+    }
+    ptrBuffer[Index] = aRule;
+}
+
+- (RuleMemo *)objectAtIndex:(NSInteger)anIndex
+{
+    NSInteger anIdx;
+
+    anIdx = ( anIndex >= BuffSize ) ? anIndex % BuffSize : anIndex;
+    return ptrBuffer[anIdx];
+}
+
+
+@end
diff --git a/runtime/ObjC/Framework/IntArray.h b/runtime/ObjC/Framework/IntArray.h
index a075770..72e29f2 100644
--- a/runtime/ObjC/Framework/IntArray.h
+++ b/runtime/ObjC/Framework/IntArray.h
@@ -1,87 +1,74 @@
-/*
- [The "BSD licence"]
- Copyright (c) 2005-2008 Terence Parr
- All rights reserved.
+//
+//  IntArray.h
+//  ANTLR
+//
+// Copyright (c) 2010 Ian Michell 2010 Alan Condit
+// 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.
 
- 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.
+#import <Foundation/Foundation.h>
 
- 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.
-*/
-package org.antlr.runtime.misc;
+#define ANTLR_INT_ARRAY_INITIAL_SIZE 10
 
-/** A dynamic array that uses int not Integer objects. In principle this
- *  is more efficient in time, but certainly in space.
- *
- *  This is simple enough that you can access the data array directly,
- *  but make sure that you append elements only with add() so that you
- *  get dynamic sizing.  Make sure to call ensureCapacity() when you are
- *  manually adding new elements.
- *
- *  Doesn't impl List because it doesn't return objects and I mean this
- *  really as just an array not a List per se.  Manipulate the elements
- *  at will.  This has stack methods too.
- *
- *  When runtime can be 1.5, I'll make this generic.
- */
-public class IntArray {
-	public static final int INITIAL_SIZE = 10;
-	public int[] data;
-	protected int p = -1;
-
-	public void add(int v) {
-		ensureCapacity(p+1);
-		data[++p] = v;
-	}
-
-	public void push(int v) {
-		add(v);
-	}
-
-	public int pop() {
-		int v = data[p];
-		p--;
-		return v;
-	}
-
-	/** This only tracks elements added via push/add. */
-	public int size() {
-		return p;
-	}
-
-    public void clear() {
-        p = -1;
-    }
-
-    public void ensureCapacity(int index) {
-		if ( data==null ) {
-			data = new int[INITIAL_SIZE];
-		}
-		else if ( (index+1)>=data.length ) {
-			int newSize = data.length*2;
-			if ( index>newSize ) {
-				newSize = index+1;
-			}
-			int[] newData = new int[newSize];
-			System.arraycopy(data, 0, newData, 0, data.length);
-			data = newData;
-		}
-	}
+@interface IntArray : NSObject 
+{
+    NSUInteger BuffSize;
+    NSUInteger count;
+    NSInteger idx;
+    NSMutableData *buffer;
+    __strong NSInteger *intBuffer;
+    BOOL SPARSE;
 }
+
++ (IntArray *)newArray;
++ (IntArray *)newArrayWithLen:(NSUInteger)aLen;
+
+- (id) init;
+- (id) initWithLen:(NSUInteger)aLen;
+
+- (void) dealloc;
+
+- (id) copyWithZone:(NSZone *)aZone;
+
+- (void) addInteger:(NSInteger) value;
+- (NSInteger) pop;
+- (void) push:(NSInteger) value;
+- (NSInteger) integerAtIndex:(NSUInteger) index;
+- (void) insertInteger:(NSInteger)anInteger AtIndex:(NSUInteger) anIndex;
+- (NSInteger)removeIntegerAtIndex:(NSUInteger) anIndex;
+- (void)replaceInteger:(NSInteger)aValue AtIndex:(NSUInteger)anIndex;
+- (void) reset;
+
+- (NSUInteger) count;
+- (NSUInteger) size;
+- (void) ensureCapacity:(NSUInteger) anIndex;
+
+@property (assign) NSUInteger BuffSize;
+@property (assign) NSUInteger count;
+@property (assign) NSInteger idx;
+@property (retain) NSMutableData *buffer;
+@property (assign) NSInteger *intBuffer;
+@property (assign) BOOL SPARSE;
+
+@end
diff --git a/runtime/ObjC/Framework/IntArray.m b/runtime/ObjC/Framework/IntArray.m
index a075770..0c01d1f 100644
--- a/runtime/ObjC/Framework/IntArray.m
+++ b/runtime/ObjC/Framework/IntArray.m
@@ -1,87 +1,199 @@
-/*
- [The "BSD licence"]
- Copyright (c) 2005-2008 Terence Parr
- All rights reserved.
+//
+//  IntArray.m
+//  ANTLR
+//
+//  Created by Ian Michell on 27/04/2010.
+// Copyright (c) 2010 Ian Michell 2010 Alan Condit
+// 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.
 
- 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.
+#import "IntArray.h"
+#import "RuntimeException.h"
 
- 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.
-*/
-package org.antlr.runtime.misc;
+@implementation IntArray
 
-/** A dynamic array that uses int not Integer objects. In principle this
- *  is more efficient in time, but certainly in space.
- *
- *  This is simple enough that you can access the data array directly,
- *  but make sure that you append elements only with add() so that you
- *  get dynamic sizing.  Make sure to call ensureCapacity() when you are
- *  manually adding new elements.
- *
- *  Doesn't impl List because it doesn't return objects and I mean this
- *  really as just an array not a List per se.  Manipulate the elements
- *  at will.  This has stack methods too.
- *
- *  When runtime can be 1.5, I'll make this generic.
- */
-public class IntArray {
-	public static final int INITIAL_SIZE = 10;
-	public int[] data;
-	protected int p = -1;
+@synthesize BuffSize;
+@synthesize count;
+@synthesize idx;
+@synthesize buffer;
+@synthesize intBuffer;
+@synthesize SPARSE;
 
-	public void add(int v) {
-		ensureCapacity(p+1);
-		data[++p] = v;
-	}
-
-	public void push(int v) {
-		add(v);
-	}
-
-	public int pop() {
-		int v = data[p];
-		p--;
-		return v;
-	}
-
-	/** This only tracks elements added via push/add. */
-	public int size() {
-		return p;
-	}
-
-    public void clear() {
-        p = -1;
-    }
-
-    public void ensureCapacity(int index) {
-		if ( data==null ) {
-			data = new int[INITIAL_SIZE];
-		}
-		else if ( (index+1)>=data.length ) {
-			int newSize = data.length*2;
-			if ( index>newSize ) {
-				newSize = index+1;
-			}
-			int[] newData = new int[newSize];
-			System.arraycopy(data, 0, newData, 0, data.length);
-			data = newData;
-		}
-	}
++ (IntArray *)newArray
+{
+    return [[IntArray alloc] init];
 }
+
++ (IntArray *)newArrayWithLen:(NSUInteger)aLen
+{
+    return [[IntArray alloc] initWithLen:aLen];
+}
+
+- (id)init
+{
+    self = [super init];
+    if ( self != nil ) {
+        BuffSize  = (ANTLR_INT_ARRAY_INITIAL_SIZE * (sizeof(NSInteger)/sizeof(id)));
+        count = 0;
+        idx = -1;
+        buffer = [[NSMutableData dataWithLength:(NSUInteger)BuffSize * sizeof(id)] retain];
+        intBuffer = (NSInteger *)[buffer mutableBytes];
+        SPARSE = NO;
+    }
+    return self;
+}
+
+- (id)initWithLen:(NSUInteger)aLen
+{
+    self = [super init];
+    if ( self != nil ) {
+        BuffSize  = (ANTLR_INT_ARRAY_INITIAL_SIZE * (sizeof(NSInteger)/sizeof(id)));
+        count = 0;
+        idx = -1;
+        buffer = [[NSMutableData dataWithLength:(NSUInteger)BuffSize * sizeof(id)] retain];
+        intBuffer = (NSInteger *)[buffer mutableBytes];
+        SPARSE = NO;
+    }
+    return self;
+}
+
+- (void)dealloc
+{
+#ifdef DEBUG_DEALLOC
+    NSLog( @"called dealloc in IntArray" );
+#endif
+    if ( buffer ) [buffer release];
+    [super dealloc];
+}
+
+- (id)copyWithZone:(NSZone *)aZone
+{
+    IntArray *copy;
+    
+    copy = [[[self class] alloc] initWithLen:BuffSize];
+    copy.idx = self.idx;
+    NSInteger anIndex;
+    for ( anIndex = 0; anIndex < BuffSize; anIndex++ ) {
+        [copy addInteger:intBuffer[anIndex]];
+    }
+    return copy;
+}
+
+- (NSUInteger)count
+{
+    return count;
+}
+
+// FIXME: Java runtime returns p, I'm not so sure it's right so have added p + 1 to show true size!
+- (NSUInteger)size
+{
+    if ( count > 0 )
+        return ( count * sizeof(NSInteger));
+    return 0;
+}
+
+- (void)addInteger:(NSInteger) value
+{
+    [self ensureCapacity:idx+1];
+    intBuffer[++idx] = (NSInteger) value;
+    count++;
+}
+
+- (NSInteger)pop
+{
+    if ( idx < 0 ) {
+        @throw [IllegalArgumentException newException:[NSString stringWithFormat:@"Nothing to pop, count = %d", count]];
+    }
+    NSInteger value = (NSInteger) intBuffer[idx--];
+    count--;
+    return value;
+}
+
+- (void)push:(NSInteger)aValue
+{
+    [self addInteger:aValue];
+}
+
+- (NSInteger)integerAtIndex:(NSUInteger) anIndex
+{
+    if ( SPARSE==NO  && anIndex > idx ) {
+        @throw [IllegalArgumentException newException:[NSString stringWithFormat:@"Index %d must be less than count %d", anIndex, count]];
+    }
+    else if ( SPARSE == YES && anIndex >= BuffSize ) {
+        @throw [IllegalArgumentException newException:[NSString stringWithFormat:@"Index %d must be less than BuffSize %d", anIndex, BuffSize]];
+    }
+    return intBuffer[anIndex];
+}
+
+- (void)insertInteger:(NSInteger)aValue AtIndex:(NSUInteger)anIndex
+{
+    [self replaceInteger:aValue AtIndex:anIndex];
+    count++;
+}
+
+- (NSInteger)removeIntegerAtIndex:(NSUInteger) anIndex
+{
+    if ( SPARSE==NO && anIndex > idx ) {
+        @throw [IllegalArgumentException newException:[NSString stringWithFormat:@"Index %d must be less than count %d", anIndex, count]];
+        return (NSInteger)-1;
+    } else if ( SPARSE==YES && anIndex >= BuffSize ) {
+        @throw [IllegalArgumentException newException:[NSString stringWithFormat:@"Index %d must be less than BuffSize %d", anIndex, BuffSize]];
+    }
+    count--;
+    return intBuffer[anIndex];
+}
+
+- (void)replaceInteger:(NSInteger)aValue AtIndex:(NSUInteger)anIndex
+{
+    if ( SPARSE == NO && anIndex > idx ) {
+        @throw [IllegalArgumentException newException:[NSString stringWithFormat:@"Index %d must be less than count %d", anIndex, count]];
+    }
+    else if ( SPARSE == YES && anIndex >= BuffSize ) {
+        @throw [IllegalArgumentException newException:[NSString stringWithFormat:@"Index %d must be less than BuffSize %d", anIndex, BuffSize]];
+    }
+    intBuffer[anIndex] = aValue;
+}
+
+-(void) reset
+{
+    count = 0;
+    idx = -1;
+}
+
+- (void) ensureCapacity:(NSUInteger) anIndex
+{
+    if ( (anIndex * sizeof(NSUInteger)) >= [buffer length] )
+    {
+        NSUInteger newSize = ([buffer length] / sizeof(NSInteger)) * 2;
+        if (anIndex > newSize) {
+            newSize = anIndex + 1;
+        }
+        BuffSize = newSize;
+        [buffer setLength:(BuffSize * sizeof(NSUInteger))];
+        intBuffer = (NSInteger *)[buffer mutableBytes];
+    }
+}
+
+@end
+
diff --git a/runtime/ObjC/Framework/IntStream.h b/runtime/ObjC/Framework/IntStream.h
new file mode 100644
index 0000000..08444a7
--- /dev/null
+++ b/runtime/ObjC/Framework/IntStream.h
@@ -0,0 +1,102 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+#ifndef DEBUG_DEALLOC
+#define DEBUG_DEALLOC
+#endif
+
+@protocol IntStream < NSObject, NSCopying >
+
+- (void) consume;
+
+// Get unichar at current input pointer + i ahead where i=1 is next character as int for including CharStreamEOF (-1) in the data range
+- (NSInteger) LA:(NSInteger) i;
+
+// Tell the stream to start buffering if it hasn't already.  Return
+// current input position, index(), or some other marker so that
+// when passed to rewind() you get back to the same spot.
+// rewind(mark()) should not affect the input cursor.
+// TODO: problem in that lexer stream returns not index but some marker 
+
+- (NSInteger) mark;
+
+// Return the current input symbol index 0..n where n indicates the
+// last symbol has been read.
+
+- (NSInteger) index;
+
+// Reset the stream so that next call to index would return marker.
+// The marker will usually be -index but it doesn't have to be.  It's
+// just a marker to indicate what state the stream was in.  This is
+// essentially calling -release: and -seek:.  If there are markers
+// created after this marker argument, this routine must unroll them
+// like a stack.  Assume the state the stream was in when this marker
+// was created.
+
+- (void) rewind;
+- (void) rewind:(NSInteger) marker;
+
+// You may want to commit to a backtrack but don't want to force the
+// stream to keep bookkeeping objects around for a marker that is
+// no longer necessary.  This will have the same behavior as
+// rewind() except it releases resources without the backward seek.
+
+- (void) release:(NSInteger) marker;
+
+// Set the input cursor to the position indicated by index.  This is
+// normally used to seek ahead in the input stream.  No buffering is
+// required to do this unless you know your stream will use seek to
+// move backwards such as when backtracking.
+// This is different from rewind in its multi-directional
+// requirement and in that its argument is strictly an input cursor (index).
+//
+// For char streams, seeking forward must update the stream state such
+// as line number.  For seeking backwards, you will be presumably
+// backtracking using the mark/rewind mechanism that restores state and
+// so this method does not need to update state when seeking backwards.
+//
+// Currently, this method is only used for efficient backtracking, but
+// in the future it may be used for incremental parsing.
+
+- (void) seek:(NSInteger) anIndex;
+
+/** Only makes sense for streams that buffer everything up probably, but
+ *  might be useful to display the entire stream or for testing.  This
+ *  value includes a single EOF.
+ */
+- (NSUInteger) size;
+/** Where are you getting symbols from?  Normally, implementations will
+ *  pass the buck all the way to the lexer who can ask its input stream
+ *  for the file name or whatever.
+ */
+- (NSString *)getSourceName;
+
+//@property (assign) NSInteger index;
+//@property (assign) NSUInteger line;
+//@property (assign) NSUInteger charPositionInLine;
+
+
+@end
diff --git a/runtime/ObjC/Framework/Lexer.h b/runtime/ObjC/Framework/Lexer.h
new file mode 100644
index 0000000..9fa13c8
--- /dev/null
+++ b/runtime/ObjC/Framework/Lexer.h
@@ -0,0 +1,90 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+
+#import <Foundation/Foundation.h>
+#import "TokenSource.h"
+#import "BaseRecognizer.h"
+#import "RecognizerSharedState.h"
+#import "CharStream.h"
+#import "Token.h"
+#import "CommonToken.h"
+#import "RecognitionException.h"
+#import "MismatchedTokenException.h"
+#import "MismatchedRangeException.h"
+
+@interface Lexer : BaseRecognizer <TokenSource> {
+	id<CharStream> input;      ///< The character stream we pull tokens out of.
+	NSUInteger ruleNestingLevel;
+}
+
+@property (retain, getter=input, setter=setInput:) id<CharStream> input;
+@property (getter=getRuleNestingLevel, setter=setRuleNestingLevel:) NSUInteger ruleNestingLevel;
+
+#pragma mark Initializer
+- (id) initWithCharStream:(id<CharStream>) anInput;
+- (id) initWithCharStream:(id<CharStream>)anInput State:(RecognizerSharedState *)state;
+
+- (id) copyWithZone:(NSZone *)zone;
+
+- (void) reset;
+
+// - (RecognizerSharedState *) state;
+
+#pragma mark Tokens
+- (id<Token>)getToken;
+- (void) setToken: (id<Token>) aToken;
+- (id<Token>) nextToken;
+- (void) mTokens;		// abstract, defined in generated sources
+- (void) skip;
+- (id<CharStream>) input;
+- (void) setInput:(id<CharStream>)aCharStream;
+
+- (void) emit;
+- (void) emit:(id<Token>)aToken;
+
+#pragma mark Matching
+- (void) matchString:(NSString *)aString;
+- (void) matchAny;
+- (void) matchChar:(unichar) aChar;
+- (void) matchRangeFromChar:(unichar)fromChar to:(unichar)toChar;
+
+#pragma mark Informational
+- (NSUInteger) line;
+- (NSUInteger) charPositionInLine;
+- (NSInteger) index;
+- (NSString *) text;
+- (void) setText:(NSString *) theText;
+
+// error handling
+- (void) reportError:(RecognitionException *)e;
+- (NSString *)getErrorMessage:(RecognitionException *)e TokenNames:(AMutableArray *)tokenNames;
+- (NSString *)getCharErrorDisplay:(NSInteger)c;
+- (void) recover:(RecognitionException *)e;
+- (void)traceIn:(NSString *)ruleName Index:(NSInteger)ruleIndex;
+- (void)traceOut:(NSString *)ruleName Index:(NSInteger)ruleIndex;
+
+@end
diff --git a/runtime/ObjC/Framework/Lexer.m b/runtime/ObjC/Framework/Lexer.m
new file mode 100644
index 0000000..4b5e440
--- /dev/null
+++ b/runtime/ObjC/Framework/Lexer.m
@@ -0,0 +1,437 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+#import <ANTLR/antlr.h>
+#import "Lexer.h"
+
+@implementation Lexer
+
+@synthesize input;
+@synthesize ruleNestingLevel;
+#pragma mark Initializer
+
+- (id) initWithCharStream:(id<CharStream>)anInput
+{
+    self = [super initWithState:[[RecognizerSharedState alloc] init]];
+    if ( self != nil ) {
+        input = [anInput retain];
+        if (state.token != nil)
+            [((CommonToken *)state.token) setInput:anInput];
+        ruleNestingLevel = 0;
+    }
+    return self;
+}
+
+- (id) initWithCharStream:(id<CharStream>)anInput State:(RecognizerSharedState *)aState
+{
+    self = [super initWithState:aState];
+    if ( self != nil ) {
+        input = [anInput retain];
+        if (state.token != nil)
+            [((CommonToken *)state.token) setInput:anInput];
+        ruleNestingLevel = 0;
+    }
+    return self;
+}
+
+- (void) dealloc
+{
+    if ( input ) [input release];
+    [super dealloc];
+}
+
+- (id) copyWithZone:(NSZone *)aZone
+{
+    Lexer *copy;
+    
+    copy = [[[self class] allocWithZone:aZone] init];
+    //    copy = [super copyWithZone:aZone]; // allocation occurs here
+    if ( input != nil )
+        copy.input = input;
+    copy.ruleNestingLevel = ruleNestingLevel;
+    return copy;
+}
+
+- (void) reset
+{
+    [super reset]; // reset all recognizer state variables
+                   // wack Lexer state variables
+    if ( input != nil ) {
+        [input seek:0]; // rewind the input
+    }
+    if ( state == nil ) {
+        return; // no shared state work to do
+    }
+    state.token = nil;
+    state.type = CommonToken.INVALID_TOKEN_TYPE;
+    state.channel = CommonToken.DEFAULT_CHANNEL;
+    state.tokenStartCharIndex = -1;
+    state.tokenStartCharPositionInLine = -1;
+    state.tokenStartLine = -1;
+    state.text = nil;
+}
+
+// token stuff
+#pragma mark Tokens
+
+- (id<Token>)getToken
+{
+    return [state getToken]; 
+}
+
+- (void) setToken: (id<Token>) aToken
+{
+    if (state.token != aToken) {
+        [aToken retain];
+        state.token = aToken;
+    }
+}
+
+
+// this method may be overridden in the generated lexer if we generate a filtering lexer.
+- (id<Token>) nextToken
+{
+    while (YES) {
+        [self setToken:nil];
+        state.channel = CommonToken.DEFAULT_CHANNEL;
+        state.tokenStartCharIndex = input.index;
+        state.tokenStartCharPositionInLine = input.getCharPositionInLine;
+        state.tokenStartLine = input.getLine;
+        state.text = nil;
+        
+        // [self setText:[self text]];
+        if ([input LA:1] == CharStreamEOF) {
+            CommonToken *eof = [CommonToken newToken:input
+                                                          Type:TokenTypeEOF
+                                                       Channel:CommonToken.DEFAULT_CHANNEL
+                                                         Start:input.index
+                                                          Stop:input.index];
+            [eof setLine:input.getLine];
+            [eof setCharPositionInLine:input.getCharPositionInLine];
+            return eof;
+        }
+        @try {
+            [self mTokens];
+            // SEL aMethod = @selector(mTokens);
+            // [[self class] instancesRespondToSelector:aMethod];
+            if ( state.token == nil)
+                [self emit];
+            else if ( state.token == [CommonToken skipToken] ) {
+                continue;
+            }
+            return state.token;
+        }
+        @catch (MismatchedRangeException *re) {
+            [self reportError:re];
+            // [self recover:re];
+        }
+        @catch (MismatchedTokenException *re) {
+            [self reportError:re];
+            // [self recover:re];
+        }
+        @catch (RecognitionException *re) {
+            [self reportError:re];
+            [self recover:re];
+        }
+    }
+}
+
+- (void) mTokens
+{   // abstract, defined in generated source as a starting point for matching
+    [self doesNotRecognizeSelector:_cmd];
+}
+
+- (void) skip
+{
+    state.token = [CommonToken skipToken];
+}
+
+- (id<CharStream>) input
+{
+    return input; 
+}
+
+- (void) setInput:(id<CharStream>) anInput
+{
+    if ( anInput != input ) {
+        if ( input ) [input release];
+    }
+    input = nil;
+    [self reset];
+    input = anInput;
+    [input retain];
+}
+
+/** Currently does not support multiple emits per nextToken invocation
+ *  for efficiency reasons.  Subclass and override this method and
+ *  nextToken (to push tokens into a list and pull from that list rather
+ *  than a single variable as this implementation does).
+ */
+- (void) emit:(id<Token>)aToken
+{
+    state.token = aToken;
+}
+
+/** The standard method called to automatically emit a token at the
+ *  outermost lexical rule.  The token object should point into the
+ *  char buffer start..stop.  If there is a text override in 'text',
+ *  use that to set the token's text.  Override this method to emit
+ *  custom Token objects.
+ *
+ *  If you are building trees, then you should also override
+ *  Parser or TreeParser.getMissingSymbol().
+ */
+- (void) emit
+{
+    id<Token> aToken = [CommonToken newToken:input
+                                                  Type:state.type
+                                               Channel:state.channel
+                                                 Start:state.tokenStartCharIndex
+                                                  Stop:input.index-1];
+    aToken.text = [self text];
+    [aToken setCharPositionInLine:state.tokenStartCharPositionInLine];
+    [aToken setLine:state.tokenStartLine];
+    [aToken retain];
+    [self emit:aToken];
+    // [aToken release];
+}
+
+// matching
+#pragma mark Matching
+- (void) matchString:(NSString *)aString
+{
+    unichar c;
+    unsigned int i = 0;
+    unsigned int stringLength = [aString length];
+    while ( i < stringLength ) {
+        c = [input LA:1];
+        if ( c != [aString characterAtIndex:i] ) {
+            if ([state getBacktracking] > 0) {
+                state.failed = YES;
+                return;
+            }
+            MismatchedTokenException *mte = [MismatchedTokenException newExceptionChar:[aString characterAtIndex:i] Stream:input];
+            mte.c = c;
+            [self recover:mte];
+            @throw mte;
+        }
+        i++;
+        [input consume];
+        state.failed = NO;
+    }
+}
+
+- (void) matchAny
+{
+    [input consume];
+}
+
+- (void) matchChar:(unichar) aChar
+{
+    // TODO: -LA: is returning an int because it sometimes is used in the generated parser to compare lookahead with a tokentype.
+    //       try to change all those occurrences to -LT: if possible (i.e. if ANTLR can be made to generate LA only for lexer code)
+    unichar charLA;
+    charLA = [input LA:1];
+    if ( charLA != aChar) {
+        if ([state getBacktracking] > 0) {
+            state.failed = YES;
+            return;
+        }
+        MismatchedTokenException  *mte = [MismatchedTokenException newExceptionChar:aChar Stream:input];
+        mte.c = charLA;
+        [self recover:mte];
+        @throw mte;
+    }
+    [input consume];
+    state.failed = NO;
+}
+
+- (void) matchRangeFromChar:(unichar)fromChar to:(unichar)toChar
+{
+    unichar charLA = (unichar)[input LA:1];
+    if ( charLA < fromChar || charLA > toChar ) {
+        if ([state getBacktracking] > 0) {
+            state.failed = YES;
+            return;
+        }
+        MismatchedRangeException  *mre = [MismatchedRangeException
+                    newException:NSMakeRange((NSUInteger)fromChar,(NSUInteger)toChar)
+                               stream:input];
+        mre.c = charLA;
+        [self recover:mre];
+        @throw mre;
+    }       
+    [input consume];
+    state.failed = NO;
+}
+
+    // info
+#pragma mark Informational
+
+- (NSUInteger) line
+{
+    return input.getLine;
+}
+
+- (NSUInteger) charPositionInLine
+{
+    return input.getCharPositionInLine;
+}
+
+- (NSInteger) index
+{
+    return 0;
+}
+
+- (NSString *) text
+{
+    if (state.text != nil) {
+        return state.text;
+    }
+    return [input substringWithRange:NSMakeRange(state.tokenStartCharIndex, input.index-state.tokenStartCharIndex)];
+}
+
+- (void) setText:(NSString *) theText
+{
+    state.text = theText;
+}
+
+    // error handling
+- (void) reportError:(RecognitionException *)e
+{
+    /** TODO: not thought about recovery in lexer yet.
+     *
+     // if we've already reported an error and have not matched a token
+     // yet successfully, don't report any errors.
+     if ( errorRecovery ) {
+     //System.err.print("[SPURIOUS] ");
+     return;
+     }
+     errorRecovery = true;
+     */
+    
+    [self displayRecognitionError:[self getTokenNames] Exception:e];
+}
+
+- (NSString *)getErrorMessage:(RecognitionException *)e TokenNames:(AMutableArray *)tokenNames
+{
+/*    NSString *msg = [NSString stringWithFormat:@"Gotta fix getErrorMessage in Lexer.m--%@\n",
+                     e.name];
+ */
+    NSString *msg = nil;
+    if ( [e isKindOfClass:[MismatchedTokenException class]] ) {
+        MismatchedTokenException *mte = (MismatchedTokenException *)e;
+        msg = [NSString stringWithFormat:@"mismatched character \"%@\" expecting \"%@\"",
+            [self getCharErrorDisplay:mte.c], [self getCharErrorDisplay:mte.expectingChar]];
+    }
+    else if ( [e isKindOfClass:[NoViableAltException class]] ) {
+        NoViableAltException *nvae = (NoViableAltException *)e;
+        // for development, can add "decision=<<"+nvae.grammarDecisionDescription+">>"
+        // and "(decision="+nvae.decisionNumber+") and
+        // "state "+nvae.stateNumber
+        msg = [NSString stringWithFormat:@"no viable alternative decision:%d state:%d at character \"%@\"",
+               nvae.decisionNumber, nvae.stateNumber, [self getCharErrorDisplay:(nvae.c)]];
+    }
+    else if ( [e isKindOfClass:[EarlyExitException class]] ) {
+        EarlyExitException *eee = (EarlyExitException *)e;
+        // for development, can add "(decision="+eee.decisionNumber+")"
+        msg = [NSString stringWithFormat:@"required (...)+ loop did not match anything at character \"%@\"",
+               [self getCharErrorDisplay:(eee.c)]];
+    }
+    else if ( [e isKindOfClass:[MismatchedNotSetException class]] ) {
+        MismatchedNotSetException *mse = (MismatchedNotSetException *)e;
+        msg = [NSString stringWithFormat:@"mismatched character \"%@\"  expecting set \"%@\"",
+               [self getCharErrorDisplay:(mse.c)], mse.expecting];
+    }
+    else if ( [e isKindOfClass:[MismatchedSetException class]] ) {
+        MismatchedSetException *mse = (MismatchedSetException *)e;
+        msg = [NSString stringWithFormat:@"mismatched character \"%@\" expecting set \"%@\"",
+               [self getCharErrorDisplay:(mse.c)], mse.expecting];
+    }
+    else if ( [e isKindOfClass:[MismatchedRangeException class]] ) {
+        MismatchedRangeException *mre = (MismatchedRangeException *)e;
+        msg = [NSString stringWithFormat:@"mismatched character \"%@\" \"%@..%@\"",
+               [self getCharErrorDisplay:(mre.c)], [self getCharErrorDisplay:(mre.range.location)],
+               [self getCharErrorDisplay:(mre.range.location+mre.range.length-1)]];
+    }
+    else {
+        msg = [super getErrorMessage:e TokenNames:[self getTokenNames]];
+    }
+    return msg;
+}
+
+- (NSString *)getCharErrorDisplay:(NSInteger)c
+{
+    NSString *s;
+    switch ( c ) {
+        case 0:
+            s = @"char=<nil>";
+            break;
+        case TokenTypeEOF :
+        case 65535:
+            s = @"<EOF>";
+            break;
+        case '\n' :
+            s = @"\\n";
+            break;
+        case '\t' :
+            s = @"\\t";
+            break;
+        case '\r' :
+            s = @"\\r";
+            break;
+        default:
+            s = [NSString stringWithFormat:@"%c", (char)c];
+            break;
+    }
+    return s;
+}
+
+/** Lexers can normally match any char in it's vocabulary after matching
+ *  a token, so do the easy thing and just kill a character and hope
+ *  it all works out.  You can instead use the rule invocation stack
+ *  to do sophisticated error recovery if you are in a fragment rule.
+ */
+- (void)recover:(RecognitionException *)re
+{
+    //System.out.println("consuming char "+(char)input.LA(1)+" during recovery");
+    //re.printStackTrace();
+    [input consume];
+}
+
+- (void)traceIn:(NSString *)ruleName Index:(NSInteger)ruleIndex
+{
+    NSString *inputSymbol = [NSString stringWithFormat:@"%c line=%d:%d\n", [input LT:1], input.getLine, input.getCharPositionInLine];
+    [super traceIn:ruleName Index:ruleIndex Object:inputSymbol];
+}
+
+- (void)traceOut:(NSString *)ruleName Index:(NSInteger)ruleIndex
+{
+    NSString *inputSymbol = [NSString stringWithFormat:@"%c line=%d:%d\n", [input LT:1], input.getLine, input.getCharPositionInLine];
+    [super traceOut:ruleName Index:ruleIndex Object:inputSymbol];
+}
+
+@end
diff --git a/runtime/ObjC/Framework/LexerRuleReturnScope.h b/runtime/ObjC/Framework/LexerRuleReturnScope.h
new file mode 100644
index 0000000..08f7eef
--- /dev/null
+++ b/runtime/ObjC/Framework/LexerRuleReturnScope.h
@@ -0,0 +1,43 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+
+@interface LexerRuleReturnScope : NSObject {
+	NSInteger start;
+	NSInteger stopToken;
+}
+
+- (NSInteger) getStart;
+- (void) setStart: (NSInteger) aStart;
+
+- (NSInteger) getStop;
+- (void) setStop: (NSInteger) aStop;
+
+@property (assign, getter=getStart, setter=setStart:) NSInteger start;
+@property (getter=getStop,setter=setStop:) NSInteger stopToken;
+
+@end
diff --git a/runtime/ObjC/Framework/LexerRuleReturnScope.m b/runtime/ObjC/Framework/LexerRuleReturnScope.m
new file mode 100644
index 0000000..9bb4226
--- /dev/null
+++ b/runtime/ObjC/Framework/LexerRuleReturnScope.m
@@ -0,0 +1,62 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+#import "LexerRuleReturnScope.h"
+
+
+@implementation LexerRuleReturnScope
+
+@synthesize start;
+
+//---------------------------------------------------------- 
+//  start 
+//---------------------------------------------------------- 
+- (NSInteger) getStart
+{
+    return start;
+}
+
+- (void) setStart: (NSInteger) aStart
+{
+    start = aStart;
+}
+
+//---------------------------------------------------------- 
+//  stop 
+//---------------------------------------------------------- 
+- (NSInteger) getStop
+{
+    return stopToken;
+}
+
+- (void) setStop: (NSInteger) aStop
+{
+    stopToken = aStop;
+}
+
+
+
+@end
diff --git a/runtime/ObjC/Framework/LexerState.h b/runtime/ObjC/Framework/LexerState.h
new file mode 100644
index 0000000..7399502
--- /dev/null
+++ b/runtime/ObjC/Framework/LexerState.h
@@ -0,0 +1,57 @@
+// [The "BSD licence"]
+// Copyright (c) 2007 Kay Roepke
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "Token.h"
+#import "RecognizerSharedState.h"
+
+@interface LexerState : RecognizerSharedState {
+}
+
+- (void) reset;
+
+- (id<Token>) getToken;
+- (void) setToken:(id<Token>) theToken;
+
+- (NSUInteger) getTokenType;
+- (void) setTokenType:(unsigned int) theTokenType;
+
+- (NSUInteger) channel;
+- (void) setChannel:(unsigned int) theChannel;
+
+- (NSUInteger) getTokenStartLine;
+- (void) setTokenStartLine:(unsigned int) theTokenStartLine;
+
+- (NSUInteger) getTokenCharPositionInLine;
+- (void) setTokenCharPositionInLine:(unsigned int) theCharPosition;
+
+- (NSInteger) getTokenStartCharIndex;
+- (void) setTokenStartCharIndex:(int) theTokenStartCharIndex;
+
+- (NSString *) text;
+- (void) setText:(NSString *) theText;
+
+@end
diff --git a/runtime/ObjC/Framework/LexerState.m b/runtime/ObjC/Framework/LexerState.m
new file mode 100644
index 0000000..84ac36f
--- /dev/null
+++ b/runtime/ObjC/Framework/LexerState.m
@@ -0,0 +1,139 @@
+// [The "BSD licence"]
+// Copyright (c) 2007 Kay Roepke
+// 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.
+
+#import "LexerState.h"
+
+
+@implementation LexerState
+
+- (id) init
+{
+	self = [super init];
+	if (self) {
+		[self reset];
+	}
+	return self;
+}
+
+- (void) reset
+{
+	[self setToken:nil];
+	type = 0;				
+	channel = 0;				
+	tokenStartLine = 0;		
+	tokenStartCharPositionInLine = 0;
+	tokenStartCharIndex = -1;    
+	[self setText:nil];
+}
+
+- (void) dealloc
+{
+#ifdef DEBUG_DEALLOC
+    NSLog( @"called dealloc in LexerState" );
+#endif
+	[self setText:nil];
+	[self setToken:nil];
+	[super dealloc];
+}
+
+- (id<Token>) getToken
+{
+	return token;
+}
+
+- (void) setToken:(id<Token>) theToken
+{
+	if (theToken != token) {
+		if ( token ) [token release];
+		token = [theToken retain];
+	}
+}
+
+
+- (NSUInteger) getTokenType
+{
+	return type;
+}
+
+- (void) setTokenType:(NSUInteger) theTokenType
+{
+	type = theTokenType;
+}
+
+- (NSUInteger)channel
+{
+	return channel;
+}
+
+- (void) setChannel:(NSUInteger) theChannel
+{
+	channel = theChannel;
+}
+
+- (NSUInteger) getTokenStartLine
+{
+	return tokenStartLine;
+}
+
+- (void) setTokenStartLine:(NSUInteger) theTokenStartLine
+{
+	tokenStartLine = theTokenStartLine;
+}
+
+- (unsigned int) getTokenCharPositionInLine
+{
+	return tokenStartCharPositionInLine;
+}
+
+- (void) setTokenCharPositionInLine:(unsigned int) theCharPosition
+{
+	tokenStartCharPositionInLine = theCharPosition;
+}
+
+- (int) getTokenStartCharIndex
+{
+	return tokenStartCharIndex;
+}
+
+- (void) setTokenStartCharIndex:(int) theTokenStartCharIndex
+{
+	tokenStartCharIndex = theTokenStartCharIndex;
+}
+
+- (NSString *) text
+{
+	return text;
+}
+
+- (void) setText:(NSString *) theText
+{
+	if (text != theText) {
+		if ( text ) [text release];
+		text = [theText retain];
+	}
+}
+
+@end
diff --git a/runtime/ObjC/Framework/LinkBase.h b/runtime/ObjC/Framework/LinkBase.h
new file mode 100644
index 0000000..760a493
--- /dev/null
+++ b/runtime/ObjC/Framework/LinkBase.h
@@ -0,0 +1,80 @@
+//
+//  LinkBase.h
+//  ANTLR
+//
+//  Created by Alan Condit on 6/14/10.
+//  [The "BSD licence"]
+//  Copyright (c) 2010 Alan Condit
+//  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.
+
+#import <Foundation/Foundation.h>
+
+#ifndef DEBUG_DEALLOC
+#define DEBUG_DEALLOC
+#endif
+
+@protocol LinkList <NSObject>
+
++ (id<LinkList>)newLinkBase;
++ (id<LinkList>)newLinkBase:(id<LinkList>)np Prev:(id<LinkList>)pp;
+
+- (void) dealloc;
+
+- (id<LinkList>) append:(id<LinkList>)node;
+- (id<LinkList>) insert:(id<LinkList>)node;
+
+- (id<LinkList>) getfNext;
+- (void) setFNext:(id<LinkList>)np;
+- (id<LinkList>)getfPrev;
+- (void) setFPrev:(id<LinkList>)pp;
+
+@property (retain) id<LinkList> fPrev;
+@property (retain) id<LinkList> fNext;
+@end
+
+@interface LinkBase : NSObject <LinkList> {
+	id<LinkList> fPrev;
+	id<LinkList> fNext;
+}
+
+@property (retain) id<LinkList> fPrev;
+@property (retain) id<LinkList> fNext;
+
++ (id<LinkList>)newLinkBase;
++ (id<LinkList>)newLinkBase:(id<LinkList>)np Prev:(id<LinkList>)pp;
+- (id<LinkList>)init;
+- (id<LinkList>)initWithPtr:(id)np Prev:(id)pp;
+- (void)dealloc;
+
+- (id) copyWithZone:(NSZone *)aZone;
+
+- (id<LinkList>)append:(id<LinkList>)node;
+- (id<LinkList>)insert:(id<LinkList>)node;
+
+- (id<LinkList>)getfNext;
+- (void)setfNext:(id<LinkList>) np;
+- (id<LinkList>)getfPrev;
+- (void)setfPrev:(id<LinkList>) pp;
+@end
diff --git a/runtime/ObjC/Framework/LinkBase.m b/runtime/ObjC/Framework/LinkBase.m
new file mode 100644
index 0000000..ded5169
--- /dev/null
+++ b/runtime/ObjC/Framework/LinkBase.m
@@ -0,0 +1,127 @@
+//
+//  LinkBase.m
+//  ANTLR
+//
+//  Created by Alan Condit on 6/14/10.
+//  [The "BSD licence"]
+//  Copyright (c) 2010 Alan Condit
+//  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.
+
+#import "LinkBase.h"
+
+@implementation LinkBase
+
+@synthesize fPrev;
+@synthesize fNext;
+
++(id<LinkList>)newLinkBase
+{
+	return [[LinkBase alloc] init];
+}
+
++(id<LinkList>)newLinkBase:(id<LinkList>)np Prev:(id<LinkList>)pp
+{
+	return [[LinkBase alloc] initWithPtr:np Prev:pp];
+}
+
+-(id<LinkList>)init
+{
+	if ((self = [super init]) != nil) {
+		fNext = nil;
+		fPrev = nil;
+	}
+	return(self);
+}
+
+-(id<LinkList>)initWithPtr:(id<LinkList>)np Prev:(id<LinkList>)pp
+{
+	if ((self = [super init]) != nil) {
+		fNext = np;
+		fPrev = pp;
+	}
+	return(self);
+}
+
+-(void)dealloc
+{
+#ifdef DEBUG_DEALLOC
+    NSLog( @"called dealloc in LinkBase" );
+#endif
+	if (fNext) [fNext release];
+	if (fPrev) [fPrev release];
+	[super dealloc];
+}
+
+- (id) copyWithZone:(NSZone *)aZone
+{
+    LinkBase *copy;
+    
+    copy = [[self class] allocWithZone:aZone];
+    copy.fPrev = fPrev;
+    copy.fNext = fNext;
+    return( copy );
+}
+
+-(id<LinkList>)append:(id<LinkList>)node
+{
+	node.fPrev = (id<LinkList>)self;
+	node.fNext = (id<LinkList>)self.fNext;
+	if (node.fNext != nil)
+        node.fNext.fPrev = node;
+    self.fNext = node;
+    return( node );
+}
+
+-(id<LinkList>)insert:(id<LinkList>)node
+{
+	node.fNext = self;
+	node.fPrev = self.fPrev;
+    if (node.fPrev != nil) 
+        node.fPrev.fNext = node;
+	self.fPrev = node;
+	return( node );
+}
+
+-(id<LinkList>)getfNext
+{
+	return(fNext);
+}
+
+-(void)setfNext:(id<LinkList>)np
+{
+	fNext = np;
+}
+
+-(id<LinkList>)getfPrev
+{
+	return(fPrev);
+}
+
+-(void)setfPrev:(id<LinkList>)pp
+{
+	fPrev = pp;
+}
+
+@end
diff --git a/runtime/ObjC/Framework/LinkedHashMap.h b/runtime/ObjC/Framework/LinkedHashMap.h
new file mode 100644
index 0000000..224ea0c
--- /dev/null
+++ b/runtime/ObjC/Framework/LinkedHashMap.h
@@ -0,0 +1,240 @@
+#import "HashMap.h"
+/**
+ * <p>Hash table and linked list implementation of the <tt>Map</tt> interface,
+ * with predictable iteration order.  This implementation differs from
+ * <tt>HashMap</tt> in that it maintains a doubly-linked list running through
+ * all of its entries.  This linked list defines the iteration ordering,
+ * which is normally the order in which keys were inserted into the map
+ * (<i>insertion-order</i>).  Note that insertion order is not affected
+ * if a key is <i>re-inserted</i> into the map.  (A key <tt>k</tt> is
+ * reinserted into a map <tt>m</tt> if <tt>m.put(k, v)</tt> is invoked when
+ * <tt>m.containsKey(k)</tt> would return <tt>true</tt> immediately prior to
+ * the invocation.)
+ * 
+ * <p>This implementation spares its clients from the unspecified, generally
+ * chaotic ordering provided by {@link HashMap} (and {@link Hashtable}),
+ * without incurring the increased cost associated with {@link TreeMap}.  It
+ * can be used to produce a copy of a map that has the same order as the
+ * original, regardless of the original map's implementation:
+ * <pre>
+ * void foo(Map m) {
+ * Map copy = new LinkedHashMap(m);
+ * ...
+ * }
+ * </pre>
+ * This technique is particularly useful if a module takes a map on input,
+ * copies it, and later returns results whose order is determined by that of
+ * the copy.  (Clients generally appreciate having things returned in the same
+ * order they were presented.)
+ * 
+ * <p>A special {@link #LinkedHashMap(NSInteger,float,boolean) constructor} is
+ * provided to create a linked hash map whose order of iteration is the order
+ * in which its entries were last accessed, from least-recently accessed to
+ * most-recently (<i>access-order</i>).  This kind of map is well-suited to
+ * building LRU caches.  Invoking the <tt>put</tt> or <tt>get</tt> method
+ * results in an access to the corresponding entry (assuming it exists after
+ * the invocation completes).  The <tt>putAll</tt> method generates one entry
+ * access for each mapping in the specified map, in the order that key-value
+ * mappings are provided by the specified map's entry set iterator.  <i>No
+ * other methods generate entry accesses.</i> In particular, operations on
+ * collection-views do <i>not</i> affect the order of iteration of the backing
+ * map.
+ * 
+ * <p>The {@link #removeEldestEntry(Map.Entry)} method may be overridden to
+ * impose a policy for removing stale mappings automatically when new mappings
+ * are added to the map.
+ * 
+ * <p>This class provides all of the optional <tt>Map</tt> operations, and
+ * permits null elements.  Like <tt>HashMap</tt>, it provides constant-time
+ * performance for the basic operations (<tt>add</tt>, <tt>contains</tt> and
+ * <tt>remove</tt>), assuming the hash function disperses elements
+ * properly among the buckets.  Performance is likely to be just slightly
+ * below that of <tt>HashMap</tt>, due to the added expense of maintaining the
+ * linked list, with one exception: Iteration over the collection-views
+ * of a <tt>LinkedHashMap</tt> requires time proportional to the <i>size</i>
+ * of the map, regardless of its capacity.  Iteration over a <tt>HashMap</tt>
+ * is likely to be more expensive, requiring time proportional to its
+ * <i>capacity</i>.
+ * 
+ * <p>A linked hash map has two parameters that affect its performance:
+ * <i>initial capacity</i> and <i>load factor</i>.  They are defined precisely
+ * as for <tt>HashMap</tt>.  Note, however, that the penalty for choosing an
+ * excessively high value for initial capacity is less severe for this class
+ * than for <tt>HashMap</tt>, as iteration times for this class are unaffected
+ * by capacity.
+ * 
+ * <p><strong>Note that this implementation is not synchronized.</strong>
+ * If multiple threads access a linked hash map concurrently, and at least
+ * one of the threads modifies the map structurally, it <em>must</em> be
+ * synchronized externally.  This is typically accomplished by
+ * synchronizing on some object that naturally encapsulates the map.
+ * 
+ * If no such object exists, the map should be "wrapped" using the
+ * {@link Collections#synchronizedMap Collections.synchronizedMap}
+ * method.  This is best done at creation time, to prevent accidental
+ * unsynchronized access to the map:<pre>
+ * Map m = Collections.synchronizedMap(new LinkedHashMap(...));</pre>
+ * 
+ * A structural modification is any operation that adds or deletes one or more
+ * mappings or, in the case of access-ordered linked hash maps, affects
+ * iteration order.  In insertion-ordered linked hash maps, merely changing
+ * the value associated with a key that is already contained in the map is not
+ * a structural modification.  <strong>In access-ordered linked hash maps,
+ * merely querying the map with <tt>get</tt> is a structural
+ * modification.</strong>)
+ * 
+ * <p>The iterators returned by the <tt>iterator</tt> method of the collections
+ * returned by all of this class's collection view methods are
+ * <em>fail-fast</em>: if the map is structurally modified at any time after
+ * the iterator is created, in any way except through the iterator's own
+ * <tt>remove</tt> method, the iterator will throw a {@link
+ * ConcurrentModificationException}.  Thus, in the face of concurrent
+ * modification, the iterator fails quickly and cleanly, rather than risking
+ * arbitrary, non-deterministic behavior at an undetermined time in the future.
+ * 
+ * <p>Note that the fail-fast behavior of an iterator cannot be guaranteed
+ * as it is, generally speaking, impossible to make any hard guarantees in the
+ * presence of unsynchronized concurrent modification.  Fail-fast iterators
+ * throw <tt>ConcurrentModificationException</tt> on a best-effort basis.
+ * Therefore, it would be wrong to write a program that depended on this
+ * exception for its correctness:   <i>the fail-fast behavior of iterators
+ * should be used only to detect bugs.</i>
+ * 
+ * <p>This class is a member of the
+ * <a href="{@docRoot}/../technotes/guides/collections/index.html">
+ * Java Collections Framework</a>.
+ * 
+ * @param <K> the type of keys maintained by this map
+ * @param <V> the type of mapped values
+ * 
+ * @author  Josh Bloch
+ * @see     Object#hashCode()
+ * @see     Collection
+ * @see     Map
+ * @see     HashMap
+ * @see     TreeMap
+ * @see     Hashtable
+ * @since   1.4
+ */
+@class LinkedHashMap;
+
+/**
+ * LinkedHashMap entry.
+ */
+
+@interface LHMEntry : HMEntry
+{
+    LHMEntry *before;
+    LHMEntry *after;
+    BOOL accessOrder;
+}
+
+@property (retain) LHMEntry *before;
+@property (retain) LHMEntry *after;
+@property (assign) BOOL accessOrder;
+
+- (id) newEntry:(NSInteger)aHash key:(NSString *)aKey value:(id)aValue next:(LHMEntry *)aNext;
+
+- (id) init:(NSInteger)hash key:(NSString *)key value:(id)value next:(LHMEntry *)next;
+- (void) recordAccess:(LinkedHashMap *)m;
+- (void) recordRemoval:(LinkedHashMap *)m;
+
+@end
+
+/**
+ * LinkedHashMapIterator.
+ */
+
+@interface LinkedHashIterator : HashIterator
+{
+    LHMEntry *nextEntry;
+    LHMEntry *lastReturned;
+    LinkedHashMap *lhm;
+}
+
+@property (retain) LHMEntry *nextEntry;
+@property (retain) LHMEntry *lastReturned;
+@property (retain) LinkedHashMap *lhm;
+
++ (LinkedHashIterator *) newIterator:(LinkedHashMap *)aLHM;
+
+- (id) init:(LinkedHashMap *)aLHM;
+- (BOOL) hasNext;
+- (void) remove;
+- (LHMEntry *) nextEntry;
+@end
+
+@interface LHMEntryIterator : LinkedHashIterator
+{
+}
+
++ (LHMEntryIterator *)newIterator:(LinkedHashMap *)aHM;
+
+- (id) init:(LinkedHashMap *)aHM;
+- (LHMEntry *) next;
+@end
+
+@interface LHMKeyIterator : LinkedHashIterator
+{
+}
+
++ (LHMKeyIterator *)newIterator:(LinkedHashMap *)aHM;
+
+- (id) init:(LinkedHashMap *)aHM;
+- (NSString *) next;
+@end
+
+@interface LHMValueIterator : LinkedHashIterator
+{
+}
+
++ (LHMValueIterator *)newIterator:(LinkedHashMap *)aHM;
+
+- (id) init:(LinkedHashMap *)aHM;
+- (id) next;
+@end
+
+
+@interface LinkedHashMap : HashMap
+{
+    
+    /**
+     * The head of the doubly linked list.
+     */
+    LHMEntry *header;
+    /**
+     * The iteration ordering method for this linked hash map: <tt>true</tt>
+     * for access-order, <tt>false</tt> for insertion-order.
+     * 
+     * @serial
+     */
+    BOOL accessOrder;
+    
+}
+
+@property (retain) LHMEntry *header;
+@property (assign) BOOL accessOrder;
+
++ (id) newLinkedHashMap:(NSInteger)anInitialCapacity;
++ (id) newLinkedHashMap:(NSInteger)anInitialCapacity
+             loadFactor:(float)loadFactor;
++ (id) newLinkedHashMap:(NSInteger)anInitialCapacity
+             loadFactor:(float)loadFactor
+            accessOrder:(BOOL)anAccessOrder;
+
+- (id) init:(NSInteger)initialCapacity loadFactor:(float)loadFactor accessOrder:(BOOL)accessOrder;
+- (id) init:(NSInteger)initialCapacity loadFactor:(float)loadFactor;
+- (id) init:(NSInteger)initialCapacity;
+- (id) init;
+- (id) initWithM:(AMutableDictionary *)m;
+- (void) transfer:(NSArray *)newTable;
+- (BOOL) containsValue:(NSObject *)value;
+- (id) get:(NSString *)key;
+- (void) clear;
+- (LHMEntryIterator *) newEntryIterator;
+- (LHMKeyIterator *) newKeyIterator;
+- (LHMValueIterator *) newValueIterator;
+- (void) addEntry:(NSInteger)hash key:(NSString *)key value:(id)value bucketIndex:(NSInteger)bucketIndex;
+- (void) createEntry:(NSInteger)hash key:(NSString *)key value:(id)value bucketIndex:(NSInteger)bucketIndex;
+- (BOOL) removeEldestEntry:(LHMEntry *)eldest;
+@end
diff --git a/runtime/ObjC/Framework/LinkedHashMap.m b/runtime/ObjC/Framework/LinkedHashMap.m
new file mode 100644
index 0000000..b0d5f6f
--- /dev/null
+++ b/runtime/ObjC/Framework/LinkedHashMap.m
@@ -0,0 +1,513 @@
+#import <Foundation/Foundation.h>
+#import "AMutableArray.h"
+#import "LinkedHashMap.h"
+#import "RuntimeException.h"
+
+extern NSInteger const DEFAULT_INITIAL_CAPACITY;
+extern float const DEFAULT_LOAD_FACTOR;
+
+@implementation LHMEntry
+
+@synthesize before;
+@synthesize after;
+@synthesize accessOrder;
+
+- (id) newEntry:(NSInteger)aHash key:(NSString *)aKey value:(id)aValue next:(LHMEntry *)aNext
+{
+    return [[LHMEntry alloc] init:aHash key:aKey value:aValue next:aNext];
+}
+
+- (id) init:(NSInteger)aHash key:(NSString *)aKey value:(id)aValue next:(LHMEntry *)aNext
+{
+    self = [super init:aHash key:aKey value:aValue next:aNext];
+    if (self) {
+    }
+    return self;
+}
+
+
+- (void) dealloc
+{
+    [before release];
+    [after release];
+    [super dealloc];
+}
+
+/**
+ * Removes this entry from the linked list.
+ */
+- (void) removeEntry
+{
+    before.after = after;
+    after.before = before;
+}
+
+
+/**
+ * Inserts this entry before the specified existing entry in the list.
+ */
+- (void) addBefore:(LHMEntry *)existingEntry
+{
+    after = [existingEntry retain];
+    before = [existingEntry.before retain];
+    before.after = [self retain];
+    after.before = [self retain];
+}
+
+
+/**
+ * This method is invoked by the superclass whenever the value
+ * of a pre-existing entry is read by Map.get or modified by Map.set.
+ * If the enclosing Map is access-ordered, it moves the entry
+ * to the end of the list; otherwise, it does nothing.
+ */
+- (void) recordAccess:(LinkedHashMap *)m
+{
+    LinkedHashMap *lhm = (LinkedHashMap *)m;
+    if (lhm.accessOrder) {
+        lhm.modCount++;
+        [self removeEntry];
+        [self addBefore:lhm.header];
+    }
+}
+
+- (void) recordRemoval:(LinkedHashMap *)m
+{
+    [self removeEntry];
+}
+
+@end
+
+@implementation LinkedHashIterator
+
+@synthesize nextEntry;
+@synthesize lastReturned;
+@synthesize lhm;
+
++ (LinkedHashIterator *) newIterator:(LinkedHashMap *)aLHM
+{
+    return [[LinkedHashIterator alloc] init:aLHM];
+}
+
+- (id) init:(LinkedHashMap *)aLHM
+{
+    self = [super init];
+    if ( self ) {
+        lhm = aLHM;
+        nextEntry = lhm.header.after;
+        lastReturned = nil;
+        expectedModCount = lhm.modCount;
+/*
+        AMutableArray *a = [AMutableArray arrayWithCapacity:lhm.Capacity];
+        LHMEntry *tmp = lhm.header.after;
+        while ( tmp != lhm.header ) {
+            [a addObject:tmp];
+            tmp = tmp.after;
+        }
+        anArray = [NSArray arrayWithArray:a];
+ */
+    }
+    return self;
+}
+
+- (BOOL) hasNext
+{
+    return nextEntry != lhm.header;
+}
+
+- (void) remove
+{
+    if (lastReturned == nil)
+        @throw [[IllegalStateException newException] autorelease];
+    if (lhm.modCount != expectedModCount)
+        @throw [[ConcurrentModificationException newException:@"Unexpected modCount"] autorelease];
+    [lhm remove:(NSString *)(lastReturned.key)];
+    lastReturned = nil;
+    expectedModCount = lhm.modCount;
+}
+
+- (LHMEntry *) nextEntry
+{
+    if (lhm.modCount != expectedModCount)
+        @throw [[ConcurrentModificationException newException:@"Unexpected modCount"] autorelease];
+    if (nextEntry == lhm.header)
+        @throw [[[NoSuchElementException alloc] init] autorelease];
+    LHMEntry * e = lastReturned = nextEntry;
+    nextEntry = e.after;
+    return e;
+}
+
+- (void) dealloc
+{
+    [nextEntry release];
+    [lastReturned release];
+    [super dealloc];
+}
+
+@end
+
+@implementation LHMKeyIterator
++ (LHMKeyIterator *)newIterator:(LinkedHashMap *)aLHM
+{
+    return [[LHMKeyIterator alloc] init:aLHM];
+}
+
+- (id) init:(LinkedHashMap *)aLHM
+{
+    self = [super init:aLHM];
+    if ( self ) {
+    }
+    return self;
+}
+
+- (NSString *) next
+{
+    return [self nextEntry].key;
+}
+
+@end
+
+@implementation LHMValueIterator
++ (LHMValueIterator *)newIterator:(LinkedHashMap *)aLHM
+{
+    return [[LHMValueIterator alloc] init:aLHM];
+}
+
+- (id) init:(LinkedHashMap *)aLHM
+{
+    self = [super init:aLHM];
+    if ( self ) {
+    }
+    return self;
+}
+
+- (id) next
+{
+    return [self nextEntry].value;
+}
+
+@end
+
+@implementation LHMEntryIterator
++ (LHMEntryIterator *)newIterator:(LinkedHashMap *)aLHM
+{
+    return [[LHMEntryIterator alloc] init:aLHM];
+}
+
+- (id) init:(LinkedHashMap *)aLHM
+{
+    self = [super init:aLHM];
+    if ( self ) {
+    }
+    return self;
+}
+
+- (LHMEntry *) next
+{
+    return [self nextEntry];
+}
+
+@end
+
+//long const serialVersionUID = 3801124242820219131L;
+
+@implementation LinkedHashMap
+
+@synthesize header;
+@synthesize accessOrder;
+
+/**
+ * Constructs an empty insertion-ordered <tt>LinkedHashMap</tt> instance
+ * with the specified initial capacity and load factor.
+ * 
+ * @param  initialCapacity the initial capacity
+ * @param  loadFactor      the load factor
+ * @throws IllegalArgumentException if the initial capacity is negative
+ * or the load factor is nonpositive
+ */
++ (id) newLinkedHashMap:(NSInteger)anInitialCapacity
+             loadFactor:(float)loadFactor
+            accessOrder:(BOOL)anAccessOrder
+{
+    return [[LinkedHashMap alloc] init:anInitialCapacity
+                            loadFactor:loadFactor
+                           accessOrder:(BOOL)anAccessOrder];
+}
+
++ (id) newLinkedHashMap:(NSInteger)anInitialCapacity loadFactor:(float)loadFactor
+{
+    return [[LinkedHashMap alloc] init:anInitialCapacity loadFactor:loadFactor];
+}
+
++ (id) newLinkedHashMap:(NSInteger)anInitialCapacity
+{
+    return [[LinkedHashMap alloc] init:anInitialCapacity loadFactor:DEFAULT_LOAD_FACTOR];
+}
+
+/**
+ * Constructs an empty <tt>LinkedHashMap</tt> instance with the
+ * specified initial capacity, load factor and ordering mode.
+ * 
+ * @param  initialCapacity the initial capacity
+ * @param  loadFactor      the load factor
+ * @param  accessOrder     the ordering mode - <tt>true</tt> for
+ * access-order, <tt>false</tt> for insertion-order
+ * @throws IllegalArgumentException if the initial capacity is negative
+ * or the load factor is nonpositive
+ */
+- (id) init:(NSInteger)anInitialCapacity loadFactor:(float)aLoadFactor accessOrder:(BOOL)anAccessOrder
+{
+    self = [super init:anInitialCapacity loadFactor:aLoadFactor];
+    if ( self ) {
+        accessOrder = anAccessOrder;
+        header = [[[LHMEntry alloc] init:-1 key:nil value:nil next:nil] retain];
+        header.before = header.after = header;
+    }
+    return self;
+}
+
+- (id) init:(NSInteger)anInitialCapacity loadFactor:(float)aLoadFactor
+{
+    self = [super init:anInitialCapacity loadFactor:aLoadFactor];
+    if ( self ) {
+        accessOrder = NO;
+        header = [[[LHMEntry alloc] init:-1 key:nil value:nil next:nil] retain];
+        header.before = header.after = header;
+    }
+    return self;
+}
+
+/**
+ * Constructs an empty insertion-ordered <tt>LinkedHashMap</tt> instance
+ * with the specified initial capacity and a default load factor (0.75).
+ * 
+ * @param  initialCapacity the initial capacity
+ * @throws IllegalArgumentException if the initial capacity is negative
+ */
+- (id) init:(NSInteger)initialCapacity
+{
+    self = [super init:initialCapacity loadFactor:DEFAULT_LOAD_FACTOR];
+    if ( self ) {
+        accessOrder = NO;
+        header = [[[LHMEntry alloc] init:-1 key:nil value:nil next:nil] retain];
+        header.before = header.after = header;
+    }
+    return self;
+}
+
+/**
+ * Constructs an insertion-ordered <tt>LinkedHashMap</tt> instance with
+ * the same mappings as the specified map.  The <tt>LinkedHashMap</tt>
+ * instance is created with a default load factor (0.75) and an initial
+ * capacity sufficient to hold the mappings in the specified map.
+ * 
+ * @param  m the map whose mappings are to be placed in this map
+ * @throws NullPointerException if the specified map is null
+ */
+- (id) initWithM:(LinkedHashMap *)m
+{
+    self = [super initWithM:m];
+    if ( self ) {
+        accessOrder = NO;
+        header = [[[LHMEntry alloc] init:-1 key:nil value:nil next:nil] retain];
+        header.before = header.after = header;
+    }
+    return self;
+}
+
+/**
+ * Constructs an empty insertion-ordered <tt>LinkedHashMap</tt> instance
+ * with the default initial capacity (16) and load factor (0.75).
+ */
+- (id) init
+{
+    self = [super init];
+    if ( self ) {
+        accessOrder = NO;
+        header = [[[LHMEntry alloc] init:-1 key:nil value:nil next:nil] retain];
+        header.before = header.after = header;
+    }
+    return self;
+}
+
+
+/**
+ * Transfers all entries to new table array.  This method is called
+ * by superclass resize.  It is overridden for performance, as it is
+ * faster to iterate using our linked list.
+ */
+- (void) transfer:(AMutableArray *)newTable
+{
+    NSInteger newCapacity = [newTable count];
+    
+    for (LHMEntry * e = header.after; e != header; e = e.after) {
+        NSInteger index = [self indexFor:e.hash length:newCapacity];
+        e.next = [newTable objectAtIndex:index];
+        [newTable replaceObjectAtIndex:index withObject:e];
+    }
+    
+}
+
+/**
+ * Returns <tt>true</tt> if this map maps one or more keys to the
+ * specified value.
+ * 
+ * @param value value whose presence in this map is to be tested
+ * @return <tt>true</tt> if this map maps one or more keys to the
+ * specified value
+ */
+- (BOOL) containsValue:(id)value
+{
+    if (value == nil) {
+        
+        for (LHMEntry * e = header.after; e != header; e = e.after)
+            if (e.value == nil)
+                return YES;
+        
+    }
+    else {
+        
+        for (LHMEntry * e = header.after; e != header; e = e.after)
+            if ([value isEqualTo:e.value])
+                return YES;
+        
+    }
+    return NO;
+}
+
+/**
+ * Returns the value to which the specified key is mapped,
+ * or {@code null} if this map contains no mapping for the key.
+ * 
+ * <p>More formally, if this map contains a mapping from a key
+ * {@code k} to a value {@code v} such that {@code (key==null ? k==null :
+ * key.equals(k))}, then this method returns {@code v}; otherwise
+ * it returns {@code null}.  (There can be at most one such mapping.)
+ * 
+ * <p>A return value of {@code null} does not <i>necessarily</i>
+ * indicate that the map contains no mapping for the key; it's also
+ * possible that the map explicitly maps the key to {@code null}.
+ * The {@link #containsKey containsKey} operation may be used to
+ * distinguish these two cases.
+ */
+- (id) get:(NSString *)aKey
+{
+    LHMEntry * e = (LHMEntry *)[self getEntry:aKey];
+    if (e == nil)
+        return nil;
+    [e recordAccess:self];
+    return e.value;
+}
+
+
+/**
+ * Removes all of the mappings from this map.
+ * The map will be empty after this call returns.
+ */
+- (void) clear
+{
+    [super clear];
+    header.before = header.after = header;
+}
+
+- (void) dealloc {
+    [header release];
+    [super dealloc];
+}
+
+- (LHMEntryIterator *) newEntryIterator
+{
+    return [LHMEntryIterator newIterator:self];
+}
+
+- (LHMKeyIterator *) newKeyIterator
+{
+    return [LHMKeyIterator newIterator:self];
+}
+
+- (LHMValueIterator *) newValueIterator
+{
+    return [LHMValueIterator newIterator:self];
+}
+
+
+/**
+ * This override alters behavior of superclass put method. It causes newly
+ * allocated entry to get inserted at the end of the linked list and
+ * removes the eldest entry if appropriate.
+ */
+- (void) addEntry:(NSInteger)aHash key:(NSString *)aKey value:(id)aValue bucketIndex:(NSInteger)aBucketIndex
+{
+    [self createEntry:aHash key:aKey value:aValue bucketIndex:aBucketIndex];
+    LHMEntry * eldest = header.after;
+    if ([self removeEldestEntry:eldest]) {
+        [self removeEntryForKey:eldest.key];
+    }
+    else {
+        if (count >= threshold)
+            [self resize:2 * [buffer length]];
+    }
+}
+
+
+/**
+ * This override differs from addEntry in that it doesn't resize the
+ * table or remove the eldest entry.
+ */
+- (void) createEntry:(NSInteger)aHash key:(NSString *)aKey value:(id)aValue bucketIndex:(NSInteger)bucketIndex
+{
+    LHMEntry *old = (LHMEntry *)ptrBuffer[bucketIndex];
+    LHMEntry *e = [[[LHMEntry alloc] init:aHash key:aKey value:aValue next:old] retain];
+    ptrBuffer[bucketIndex] = (id)e;
+    [e addBefore:header];
+    count++;
+}
+
+
+/**
+ * Returns <tt>true</tt> if this map should remove its eldest entry.
+ * This method is invoked by <tt>put</tt> and <tt>putAll</tt> after
+ * inserting a new entry into the map.  It provides the implementor
+ * with the opportunity to remove the eldest entry each time a new one
+ * is added.  This is useful if the map represents a cache: it allows
+ * the map to reduce memory consumption by deleting stale entries.
+ * 
+ * <p>Sample use: this override will allow the map to grow up to 100
+ * entries and then delete the eldest entry each time a new entry is
+ * added, maintaining a steady state of 100 entries.
+ * <pre>
+ * private static final NSInteger MAX_ENTRIES = 100;
+ * 
+ * protected boolean removeEldestEntry(Map.LHMEntry eldest) {
+ * return count() > MAX_ENTRIES;
+ * }
+ * </pre>
+ * 
+ * <p>This method typically does not modify the map in any way,
+ * instead allowing the map to modify itself as directed by its
+ * return value.  It <i>is</i> permitted for this method to modify
+ * the map directly, but if it does so, it <i>must</i> return
+ * <tt>false</tt> (indicating that the map should not attempt any
+ * further modification).  The effects of returning <tt>true</tt>
+ * after modifying the map from within this method are unspecified.
+ * 
+ * <p>This implementation merely returns <tt>false</tt> (so that this
+ * map acts like a normal map - the eldest element is never removed).
+ * 
+ * @param    eldest The least recently inserted entry in the map, or if
+ * this is an access-ordered map, the least recently accessed
+ * entry.  This is the entry that will be removed it this
+ * method returns <tt>true</tt>.  If the map was empty prior
+ * to the <tt>put</tt> or <tt>putAll</tt> invocation resulting
+ * in this invocation, this will be the entry that was just
+ * inserted; in other words, if the map contains a single
+ * entry, the eldest entry is also the newest.
+ * @return   <tt>true</tt> if the eldest entry should be removed
+ * from the map; <tt>false</tt> if it should be retained.
+ */
+- (BOOL) removeEldestEntry:(LHMEntry *)eldest
+{
+    return NO;
+}
+
+@end
diff --git a/runtime/ObjC/Framework/LinkedList.h b/runtime/ObjC/Framework/LinkedList.h
new file mode 100644
index 0000000..65de874
--- /dev/null
+++ b/runtime/ObjC/Framework/LinkedList.h
@@ -0,0 +1,189 @@
+#import "ArrayIterator.h"
+
+@class LinkedList;
+
+/**
+ * LinkedList entry.
+ */
+
+@interface LLNode : NSObject
+{
+    LLNode *next;
+    LLNode *prev;
+    id item;
+}
+
+@property(retain) LLNode *next;
+@property(retain) LLNode *prev;
+@property(retain)      id item;
+
++ (LLNode *) newNode:(LLNode *)aPrev element:(id)anElement next:(LLNode *)aNext;
+
+- (id) init:(LLNode *)aPrev element:(id)anElement next:(LLNode *)aNext;
+- (void) dealloc;
+@end
+
+@interface ListIterator : ArrayIterator {
+    LLNode * lastReturned;
+    LLNode * next;
+    NSInteger nextIndex;
+    NSInteger expectedModCount;
+    LinkedList *ll;
+}
+
++ (ListIterator *) newIterator:(LinkedList *)anLL;
++ (ListIterator *) newIterator:(LinkedList *)anLL withIndex:(NSInteger)anIndex;
+
+- (id) init:(LinkedList *)anLL withIndex:(NSInteger)anIndex;
+- (BOOL) hasNext;
+- (LLNode *) next;
+- (BOOL) hasPrevious;
+- (LLNode *) previous;
+- (NSInteger) nextIndex;
+- (NSInteger) previousIndex;
+- (void) remove;
+- (void) set:(LLNode *)e;
+- (void) add:(LLNode *)e;
+- (void) checkForComodification;
+@end
+
+/**
+ * Adapter to provide descending iterators via ListItr.previous
+ */
+
+@interface DescendingIterator : ListIterator {
+}
+
++ (DescendingIterator *) newIterator:(LinkedList *)anLL;
+- (id) init:(LinkedList *)anLL;
+- (BOOL) hasNext;
+- (LLNode *) next;
+- (void) remove;
+- (void) dealloc;
+@end
+
+/**
+ * Doubly-linked list implementation of the {@code List} and {@code Deque}
+ * interfaces.  Implements all optional list operations, and permits all
+ * elements (including {@code null}).
+ * 
+ * <p>All of the operations perform as could be expected for a doubly-linked
+ * list.  Operations that index into the list will traverse the list from
+ * the beginning or the end, whichever is closer to the specified index.
+ * 
+ * <p><strong>Note that this implementation is not synchronized.</strong>
+ * If multiple threads access a linked list concurrently, and at least
+ * one of the threads modifies the list structurally, it <i>must</i> be
+ * synchronized externally.  (A structural modification is any operation
+ * that adds or deletes one or more elements; merely setting the value of
+ * an element is not a structural modification.)  This is typically
+ * accomplished by synchronizing on some object that naturally
+ * encapsulates the list.
+ * 
+ * If no such object exists, the list should be "wrapped" using the
+ * {@link Collections#synchronizedList Collections.synchronizedList}
+ * method.  This is best done at creation time, to prevent accidental
+ * unsynchronized access to the list:<pre>
+ * List list = Collections.synchronizedList(new LinkedList(...));</pre>
+ * 
+ * <p>The iterators returned by this class's {@code iterator} and
+ * {@code listIterator} methods are <i>fail-fast</i>: if the list is
+ * structurally modified at any time after the iterator is created, in
+ * any way except through the Iterator's own {@code remove} or
+ * {@code add} methods, the iterator will throw a {@link
+ * ConcurrentModificationException}.  Thus, in the face of concurrent
+ * modification, the iterator fails quickly and cleanly, rather than
+ * risking arbitrary, non-deterministic behavior at an undetermined
+ * time in the future.
+ * 
+ * <p>Note that the fail-fast behavior of an iterator cannot be guaranteed
+ * as it is, generally speaking, impossible to make any hard guarantees in the
+ * presence of unsynchronized concurrent modification.  Fail-fast iterators
+ * throw {@code ConcurrentModificationException} on a best-effort basis.
+ * Therefore, it would be wrong to write a program that depended on this
+ * exception for its correctness:   <i>the fail-fast behavior of iterators
+ * should be used only to detect bugs.</i>
+ * 
+ * <p>This class is a member of the
+ * <a href="{@docRoot}/../technotes/guides/collections/index.html">
+ * Java Collections Framework</a>.
+ * 
+ * @author  Josh Bloch
+ * @see     List
+ * @see     ArrayList
+ * @since 1.2
+ * @param <E> the type of elements held in this collection
+ */
+
+@interface LinkedList : NSObject {
+    /**
+     * Pointer to first node.
+     * Invariant: (first == null && last == null) ||
+     * (first.prev == null && first.item != null)
+     */
+    LLNode *first;
+    
+    /**
+     * Pointer to last node.
+     * Invariant: (first == null && last == null) ||
+     * (last.next == null && last.item != null)
+     */
+    LLNode *last;
+    NSInteger count;
+    NSInteger modCount;
+}
+
+@property(nonatomic, retain) LLNode *first;
+@property(nonatomic, retain) LLNode *last;
+@property(assign) NSInteger count;
+@property(assign) NSInteger modCount;
+
++ (LinkedList *)newLinkedList;
++ (LinkedList *)newLinkedList:(NSArray *)c;
+
+- (id) init;
+- (id) initWithC:(NSArray *)c;
+- (void) linkLast:(LLNode *)e;
+- (void) linkBefore:(LLNode *)e succ:(LLNode *)succ;
+- (LLNode *) unlink:(LLNode *)x;
+- (LLNode *) removeFirst;
+- (LLNode *) removeLast;
+- (void) addFirst:(LLNode *)e;
+- (void) addLast:(LLNode *)e;
+- (BOOL) contains:(id)o;
+- (NSInteger) count;
+- (BOOL) add:(LLNode *)e;
+- (BOOL) remove:(id)o;
+- (BOOL) addAll:(NSArray *)c;
+- (BOOL) addAll:(NSInteger)index c:(NSArray *)c;
+- (void) clear;
+- (LLNode *) get:(NSInteger)index;
+- (LLNode *) set:(NSInteger)index element:(LLNode *)element;
+- (void) add:(NSInteger)index element:(LLNode *)element;
+- (LLNode *) removeIdx:(NSInteger)index;
+- (void) checkElementIndex:(NSInteger)index;
+- (void) checkPositionIndex:(NSInteger)index;
+- (LLNode *) node:(NSInteger)index;
+- (NSInteger) indexOf:(id)o;
+- (NSInteger) lastIndexOf:(id)o;
+- (LLNode *) peek;
+- (LLNode *) element;
+- (LLNode *) poll;
+- (LLNode *) remove;
+- (BOOL) offer:(LLNode *)e;
+- (BOOL) offerFirst:(LLNode *)e;
+- (BOOL) offerLast:(LLNode *)e;
+- (LLNode *) peekFirst;
+- (LLNode *) peekLast;
+- (LLNode *) pollFirst;
+- (LLNode *) pollLast;
+- (void) push:(LLNode *)e;
+- (LLNode *) pop;
+- (BOOL) removeFirstOccurrence:(id)o;
+- (BOOL) removeLastOccurrence:(id)o;
+- (ListIterator *) listIterator:(NSInteger)index;
+- (NSEnumerator *) descendingIterator;
+- (id) copyWithZone:(NSZone *)zone;
+- (NSArray *) toArray;
+- (NSArray *) toArray:(NSArray *)a;
+@end
diff --git a/runtime/ObjC/Framework/LinkedList.m b/runtime/ObjC/Framework/LinkedList.m
new file mode 100644
index 0000000..8a8d39d
--- /dev/null
+++ b/runtime/ObjC/Framework/LinkedList.m
@@ -0,0 +1,1256 @@
+#import "LinkedList.h"
+#import <Foundation/Foundation.h>
+#import "AMutableArray.h"
+#import "RuntimeException.h"
+
+@implementation LLNode
+
+@synthesize next;
+@synthesize prev;
+@synthesize item;
+
++ (LLNode *) newNode:(LLNode *)aPrev element:(id)anElement next:(LLNode *)aNext
+{
+    return [[LLNode alloc] init:aPrev element:anElement next:aNext];
+}
+
+- (id) init:(LLNode *)aPrev element:(id)anElement next:(LLNode *)aNext
+{
+    self = [super init];
+    if (self) {
+        item = anElement;
+        next = aNext;
+        prev = aPrev;
+    }
+    return self;
+}
+
+- (void) dealloc
+{
+    [item release];
+    [next release];
+    [prev release];
+    [super dealloc];
+}
+
+@end
+
+@implementation ListIterator
+
++ (ListIterator *) newIterator:(LinkedList *)anLL
+{
+    return [[ListIterator alloc] init:anLL withIndex:0];
+}
+
++ (ListIterator *) newIterator:(LinkedList *)anLL withIndex:(NSInteger)anIndex
+{
+    return [[ListIterator alloc] init:anLL withIndex:anIndex];
+}
+
+- (id) init:(LinkedList *)anLL withIndex:(NSInteger)anIndex
+{
+    self = [super init];
+    if ( self ) {
+        ll = anLL;
+        index = anIndex;
+        lastReturned = nil;
+        expectedModCount = ll.modCount;
+        next = (index == count) ? nil : [ll node:anIndex];
+        nextIndex = index;
+    }
+    return self;
+}
+
+- (BOOL) hasNext
+{
+    return nextIndex < count;
+}
+
+- (id) next
+{
+    [self checkForComodification];
+    if (![self hasNext])
+        @throw [[[NoSuchElementException alloc] init] autorelease];
+    lastReturned = next;
+    next = next.next;
+    nextIndex++;
+    return lastReturned.item;
+}
+
+- (BOOL) hasPrevious
+{
+    return nextIndex > 0;
+}
+
+- (id) previous
+{
+    [self checkForComodification];
+    if (![self hasPrevious])
+        @throw [[[NoSuchElementException alloc] init] autorelease];
+    lastReturned = next = (next == nil) ? ll.last : next.prev;
+    nextIndex--;
+    return lastReturned.item;
+}
+
+- (NSInteger) nextIndex
+{
+    return nextIndex;
+}
+
+- (NSInteger) previousIndex
+{
+    return nextIndex - 1;
+}
+
+- (void) remove
+{
+    [self checkForComodification];
+    if (lastReturned == nil)
+        @throw [[[IllegalStateException alloc] init] autorelease];
+    LLNode *lastNext = lastReturned.next;
+    [ll unlink:lastReturned];
+    if (next == lastReturned)
+        next = lastNext;
+    else
+        nextIndex--;
+    lastReturned = nil;
+    expectedModCount++;
+}
+
+- (void) set:(id)e
+{
+    if (lastReturned == nil)
+        @throw [[[IllegalStateException alloc] init] autorelease];
+    [self checkForComodification];
+    lastReturned.item = e;
+}
+
+- (void) add:(id)e
+{
+    [self checkForComodification];
+    lastReturned = nil;
+    if (next == nil)
+        [ll linkLast:e];
+    else
+        [ll linkBefore:e succ:next];
+    nextIndex++;
+    expectedModCount++;
+}
+
+- (void) checkForComodification
+{
+    if (ll.modCount != expectedModCount)
+        @throw [[[ConcurrentModificationException alloc] init] autorelease];
+}
+
+- (void) dealloc
+{
+    [lastReturned release];
+    [next release];
+    [super dealloc];
+}
+
+@end
+
+@implementation DescendingIterator
+
++ (DescendingIterator *)newIterator:(LinkedList *)anLL
+{
+    return [[DescendingIterator alloc] init:anLL];
+}
+
+- (id) init:(LinkedList *)anLL
+{
+    self = [super init:anLL withIndex:[anLL count]];
+    if ( self ) {
+        
+    }
+    return self;
+}
+
+- (BOOL) hasNext
+{
+    return [self hasPrevious];
+}
+
+- (id) next
+{
+    return [self previous];
+}
+
+- (void) remove
+{
+    [self remove];
+}
+
+- (void) dealloc
+{
+    [super dealloc];
+}
+
+@end
+
+//long const serialVersionUID = 876323262645176354L;
+
+@implementation LinkedList
+
+@synthesize first;
+@synthesize last;
+@synthesize count;
+@synthesize modCount;
+
++ (LinkedList *)newLinkedList
+{
+    return [[LinkedList alloc] init];
+}
+
++ (LinkedList *)newLinkedList:(NSArray *)c
+{
+    return [[LinkedList alloc] initWithC:c];
+}
+
+/**
+ * Constructs an empty list.
+ */
+- (id) init
+{
+    self = [super init];
+    if ( self ) {
+        count = 0;
+    }
+    return self;
+}
+
+
+/**
+ * Constructs a list containing the elements of the specified
+ * collection, in the order they are returned by the collection's
+ * iterator.
+ * 
+ * @param  c the collection whose elements are to be placed into this list
+ * @throws NullPointerException if the specified collection is null
+ */
+- (id) initWithC:(NSArray *)c
+{
+    self = [super init];
+    if ( self ) {
+        count = 0;
+        [self addAll:c];
+    }
+    return self;
+}
+
+
+- (void) dealloc
+{
+    [first release];
+    [last release];
+    [super dealloc];
+}
+
+/**
+ * Links e as first element.
+ */
+- (void) linkFirst:(id)e
+{
+    LLNode *f = first;
+    LLNode *newNode = [[LLNode newNode:nil element:e next:f] autorelease];
+    first = newNode;
+    if (f == nil)
+        last = newNode;
+    else
+        f.prev = newNode;
+    count++;
+    modCount++;
+}
+
+
+/**
+ * Links e as last element.
+ */
+- (void) linkLast:(id)e
+{
+    LLNode *l = last;
+    LLNode *newNode = [[LLNode newNode:l element:e next:nil] autorelease];
+    last = newNode;
+    if (l == nil)
+        first = newNode;
+    else
+        l.next = newNode;
+    count++;
+    modCount++;
+}
+
+
+/**
+ * Inserts element e before non-null LLNode succ.
+ */
+- (void) linkBefore:(id)e succ:(LLNode *)succ
+{
+    LLNode *pred = succ.prev;
+    LLNode *newNode = [[LLNode newNode:pred element:e next:succ] autorelease];
+    succ.prev = newNode;
+    if (pred == nil)
+        first = newNode;
+    else
+        pred.next = newNode;
+    count++;
+    modCount++;
+}
+
+
+/**
+ * Unlinks non-null first node f.
+ */
+- (id) unlinkFirst:(LLNode *)f
+{
+    id element = f.item;
+    LLNode *next = f.next;
+    f.item = nil;
+    f.next = nil;
+    first = next;
+    if (next == nil)
+        last = nil;
+    else
+        next.prev = nil;
+    count--;
+    modCount++;
+    return element;
+}
+
+
+/**
+ * Unlinks non-null last node l.
+ */
+- (id) unlinkLast:(LLNode *)l
+{
+    id element = l.item;
+    LLNode *prev = l.prev;
+    l.item = nil;
+    l.prev = nil;
+    last = prev;
+    if (prev == nil)
+        first = nil;
+    else
+        prev.next = nil;
+    count--;
+    modCount++;
+    return element;
+}
+
+
+/**
+ * Unlinks non-null node x.
+ */
+- (LLNode *) unlink:(LLNode *)x
+{
+    id element = x.item;
+    LLNode *next = x.next;
+    LLNode *prev = x.prev;
+    if (prev == nil) {
+        first = next;
+    }
+    else {
+        prev.next = next;
+        x.prev = nil;
+    }
+    if (next == nil) {
+        last = prev;
+    }
+    else {
+        next.prev = prev;
+        x.next = nil;
+    }
+    x.item = nil;
+    count--;
+    modCount++;
+    return element;
+}
+
+
+/**
+ * Returns the first element in this list.
+ * 
+ * @return the first element in this list
+ * @throws NoSuchElementException if this list is empty
+ */
+- (LLNode *) first
+{
+    LLNode *f = first;
+    if (f == nil)
+        @throw [[[NoSuchElementException alloc] init] autorelease];
+    return f.item;
+}
+
+
+/**
+ * Returns the last element in this list.
+ * 
+ * @return the last element in this list
+ * @throws NoSuchElementException if this list is empty
+ */
+- (LLNode *) last
+{
+    LLNode *l = last;
+    if (l == nil)
+        @throw [[[NoSuchElementException alloc] init] autorelease];
+    return l.item;
+}
+
+
+/**
+ * Removes and returns the first element from this list.
+ * 
+ * @return the first element from this list
+ * @throws NoSuchElementException if this list is empty
+ */
+- (LLNode *) removeFirst
+{
+    LLNode *f = first;
+    if (f == nil)
+        @throw [[[NoSuchElementException alloc] init] autorelease];
+    return [self unlinkFirst:f];
+}
+
+
+/**
+ * Removes and returns the last element from this list.
+ * 
+ * @return the last element from this list
+ * @throws NoSuchElementException if this list is empty
+ */
+- (LLNode *) removeLast
+{
+    LLNode *l = last;
+    if (l == nil)
+        @throw [[[NoSuchElementException alloc] init] autorelease];
+    return [self unlinkLast:l];
+}
+
+
+/**
+ * Inserts the specified element at the beginning of this list.
+ * 
+ * @param e the element to add
+ */
+- (void) addFirst:(LLNode *)e
+{
+    [self linkFirst:e];
+}
+
+
+/**
+ * Appends the specified element to the end of this list.
+ * 
+ * <p>This method is equivalent to {@link #add}.
+ * 
+ * @param e the element to add
+ */
+- (void) addLast:(LLNode *)e
+{
+    [self linkLast:e];
+}
+
+
+/**
+ * Returns {@code true} if this list contains the specified element.
+ * More formally, returns {@code true} if and only if this list contains
+ * at least one element {@code e} such that
+ * <tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt>.
+ * 
+ * @param o element whose presence in this list is to be tested
+ * @return {@code true} if this list contains the specified element
+ */
+- (BOOL) contains:(id)o
+{
+    return [self indexOf:o] != -1;
+}
+
+
+/**
+ * Returns the number of elements in this list.
+ * 
+ * @return the number of elements in this list
+ */
+- (NSInteger) count
+{
+    return count;
+}
+
+
+/**
+ * Appends the specified element to the end of this list.
+ * 
+ * <p>This method is equivalent to {@link #addLast}.
+ * 
+ * @param e element to be appended to this list
+ * @return {@code true} (as specified by {@link Collection#add})
+ */
+- (BOOL) add:(LLNode *)e
+{
+    [self linkLast:e];
+    return YES;
+}
+
+
+/**
+ * Removes the first occurrence of the specified element from this list,
+ * if it is present.  If this list does not contain the element, it is
+ * unchanged.  More formally, removes the element with the lowest index
+ * {@code i} such that
+ * <tt>(o==null&nbsp;?&nbsp;get(i)==null&nbsp;:&nbsp;o.equals(get(i)))</tt>
+ * (if such an element exists).  Returns {@code true} if this list
+ * contained the specified element (or equivalently, if this list
+ * changed as a result of the call).
+ * 
+ * @param o element to be removed from this list, if present
+ * @return {@code true} if this list contained the specified element
+ */
+- (BOOL) remove:(id)o
+{
+    if (o == nil) {
+        
+        for (LLNode *x = first; x != nil; x = x.next) {
+            if (x.item == nil) {
+                [self unlink:x];
+                return YES;
+            }
+        }
+        
+    }
+    else {
+        
+        for (LLNode *x = first; x != nil; x = x.next) {
+            if ([o isEqualTo:x.item]) {
+                [self unlink:x];
+                return YES;
+            }
+        }
+        
+    }
+    return NO;
+}
+
+
+/**
+ * Appends all of the elements in the specified collection to the end of
+ * this list, in the order that they are returned by the specified
+ * collection's iterator.  The behavior of this operation is undefined if
+ * the specified collection is modified while the operation is in
+ * progress.  (Note that this will occur if the specified collection is
+ * this list, and it's nonempty.)
+ * 
+ * @param c collection containing elements to be added to this list
+ * @return {@code true} if this list changed as a result of the call
+ * @throws NullPointerException if the specified collection is null
+ */
+- (BOOL) addAll:(NSArray *)c
+{
+    return [self addAll:count c:c];
+}
+
+
+/**
+ * Inserts all of the elements in the specified collection into this
+ * list, starting at the specified position.  Shifts the element
+ * currently at that position (if any) and any subsequent elements to
+ * the right (increases their indices).  The new elements will appear
+ * in the list in the order that they are returned by the
+ * specified collection's iterator.
+ * 
+ * @param index index at which to insert the first element
+ * from the specified collection
+ * @param c collection containing elements to be added to this list
+ * @return {@code true} if this list changed as a result of the call
+ * @throws IndexOutOfBoundsException {@inheritDoc}
+ * @throws NullPointerException if the specified collection is null
+ */
+- (BOOL) addAll:(NSInteger)index c:(NSArray *)c
+{
+    [self checkPositionIndex:index];
+    AMutableArray *a = [AMutableArray arrayWithArray:c];
+    NSInteger numNew = [a count];
+    if (numNew == 0)
+        return NO;
+    LLNode *pred, *succ;
+    if (index == count) {
+        succ = nil;
+        pred = last;
+    }
+    else {
+        succ = [self node:index];
+        pred = succ.prev;
+    }
+    
+    for (id o in a) {
+        id e = (id)o;
+        LLNode *newNode = [[LLNode newNode:pred element:e next:nil] autorelease];
+        if (pred == nil)
+            first = newNode;
+        else
+            pred.next = newNode;
+        pred = newNode;
+    }
+    
+    if (succ == nil) {
+        last = pred;
+    }
+    else {
+        pred.next = succ;
+        succ.prev = pred;
+    }
+    count += numNew;
+    modCount++;
+    return YES;
+}
+
+
+/**
+ * Removes all of the elements from this list.
+ * The list will be empty after this call returns.
+ */
+- (void) clear
+{
+    
+    for (LLNode *x = first; x != nil; ) {
+        LLNode *next = x.next;
+        x.item = nil;
+        x.next = nil;
+        x.prev = nil;
+        x = next;
+    }
+    
+    first = last = nil;
+    count = 0;
+    modCount++;
+}
+
+
+/**
+ * Returns the element at the specified position in this list.
+ * 
+ * @param index index of the element to return
+ * @return the element at the specified position in this list
+ * @throws IndexOutOfBoundsException {@inheritDoc}
+ */
+- (id) get:(NSInteger)index
+{
+    [self checkElementIndex:index];
+    return [self node:index].item;
+}
+
+
+/**
+ * Replaces the element at the specified position in this list with the
+ * specified element.
+ * 
+ * @param index index of the element to replace
+ * @param element element to be stored at the specified position
+ * @return the element previously at the specified position
+ * @throws IndexOutOfBoundsException {@inheritDoc}
+ */
+- (id) set:(NSInteger)index element:(id)element
+{
+    [self checkElementIndex:index];
+    LLNode *x = [self node:index];
+    id oldVal = x.item;
+    x.item = element;
+    return oldVal;
+}
+
+
+/**
+ * Inserts the specified element at the specified position in this list.
+ * Shifts the element currently at that position (if any) and any
+ * subsequent elements to the right (adds one to their indices).
+ * 
+ * @param index index at which the specified element is to be inserted
+ * @param element element to be inserted
+ * @throws IndexOutOfBoundsException {@inheritDoc}
+ */
+- (void) add:(NSInteger)index element:(LLNode *)element
+{
+    [self checkPositionIndex:index];
+    if (index == count)
+        [self linkLast:element];
+    else
+        [self linkBefore:element succ:[self node:index]];
+}
+
+
+/**
+ * Removes the element at the specified position in this list.  Shifts any
+ * subsequent elements to the left (subtracts one from their indices).
+ * Returns the element that was removed from the list.
+ * 
+ * @param index the index of the element to be removed
+ * @return the element previously at the specified position
+ * @throws IndexOutOfBoundsException {@inheritDoc}
+ */
+- (LLNode *) removeIdx:(NSInteger)index
+{
+    [self checkElementIndex:index];
+    return [self unlink:[self node:index]];
+}
+
+
+/**
+ * Tells if the argument is the index of an existing element.
+ */
+- (BOOL) isElementIndex:(NSInteger)index
+{
+    return index >= 0 && index < count;
+}
+
+
+/**
+ * Tells if the argument is the index of a valid position for an
+ * iterator or an add operation.
+ */
+- (BOOL) isPositionIndex:(NSInteger)index
+{
+    return index >= 0 && index <= count;
+}
+
+
+/**
+ * Constructs an IndexOutOfBoundsException detail message.
+ * Of the many possible refactorings of the error handling code,
+ * this "outlining" performs best with both server and client VMs.
+ */
+- (NSString *) outOfBoundsMsg:(NSInteger)index
+{
+    return [NSString stringWithFormat:@"Index: %d, Size: %d", index, count];
+}
+
+- (void) checkElementIndex:(NSInteger)index
+{
+    if (![self isElementIndex:index])
+        @throw [[IndexOutOfBoundsException newException:[self outOfBoundsMsg:index]] autorelease];
+}
+
+- (void) checkPositionIndex:(NSInteger)index
+{
+    if (![self isPositionIndex:index])
+        @throw [[IndexOutOfBoundsException newException:[self outOfBoundsMsg:index]] autorelease];
+}
+
+
+/**
+ * Returns the (non-null) LLNode at the specified element index.
+ */
+- (LLNode *) node:(NSInteger)index
+{
+    if (index < (count >> 1)) {
+        LLNode *x = first;
+        
+        for (NSInteger i = 0; i < index; i++)
+            x = x.next;
+        
+        return x;
+    }
+    else {
+        LLNode *x = last;
+        
+        for (NSInteger i = count - 1; i > index; i--)
+            x = x.prev;
+        
+        return x;
+    }
+}
+
+
+/**
+ * Returns the index of the first occurrence of the specified element
+ * in this list, or -1 if this list does not contain the element.
+ * More formally, returns the lowest index {@code i} such that
+ * <tt>(o==null&nbsp;?&nbsp;get(i)==null&nbsp;:&nbsp;o.equals(get(i)))</tt>,
+ * or -1 if there is no such index.
+ * 
+ * @param o element to search for
+ * @return the index of the first occurrence of the specified element in
+ * this list, or -1 if this list does not contain the element
+ */
+- (NSInteger) indexOf:(id)o
+{
+    NSInteger index = 0;
+    if (o == nil) {
+        
+        for (LLNode *x = first; x != nil; x = x.next) {
+            if (x.item == nil)
+                return index;
+            index++;
+        }
+        
+    }
+    else {
+        
+        for (LLNode *x = first; x != nil; x = x.next) {
+            if ([o isEqualTo:x.item])
+                return index;
+            index++;
+        }
+        
+    }
+    return -1;
+}
+
+
+/**
+ * Returns the index of the last occurrence of the specified element
+ * in this list, or -1 if this list does not contain the element.
+ * More formally, returns the highest index {@code i} such that
+ * <tt>(o==null&nbsp;?&nbsp;get(i)==null&nbsp;:&nbsp;o.equals(get(i)))</tt>,
+ * or -1 if there is no such index.
+ * 
+ * @param o element to search for
+ * @return the index of the last occurrence of the specified element in
+ * this list, or -1 if this list does not contain the element
+ */
+- (NSInteger) lastIndexOf:(id)o
+{
+    NSInteger index = count;
+    if (o == nil) {
+        
+        for (LLNode *x = last; x != nil; x = x.prev) {
+            index--;
+            if (x.item == nil)
+                return index;
+        }
+        
+    }
+    else {
+        
+        for (LLNode *x = last; x != nil; x = x.prev) {
+            index--;
+            if ([o isEqualTo:x.item])
+                return index;
+        }
+        
+    }
+    return -1;
+}
+
+
+/**
+ * Retrieves, but does not remove, the head (first element) of this list.
+ * 
+ * @return the head of this list, or {@code null} if this list is empty
+ * @since 1.5
+ */
+- (LLNode *) peek
+{
+    LLNode *f = first;
+    return (f == nil) ? nil : f.item;
+}
+
+
+/**
+ * Retrieves, but does not remove, the head (first element) of this list.
+ * 
+ * @return the head of this list
+ * @throws NoSuchElementException if this list is empty
+ * @since 1.5
+ */
+- (LLNode *) element
+{
+    return [self first];
+}
+
+
+/**
+ * Retrieves and removes the head (first element) of this list.
+ * 
+ * @return the head of this list, or {@code null} if this list is empty
+ * @since 1.5
+ */
+- (LLNode *) poll
+{
+    LLNode *f = first;
+    return (f == nil) ? nil : [self unlinkFirst:f];
+}
+
+
+/**
+ * Retrieves and removes the head (first element) of this list.
+ * 
+ * @return the head of this list
+ * @throws NoSuchElementException if this list is empty
+ * @since 1.5
+ */
+- (LLNode *) remove
+{
+    return [self removeFirst];
+}
+
+
+/**
+ * Adds the specified element as the tail (last element) of this list.
+ * 
+ * @param e the element to add
+ * @return {@code true} (as specified by {@link Queue#offer})
+ * @since 1.5
+ */
+- (BOOL) offer:(LLNode *)e
+{
+    return [self add:e];
+}
+
+
+/**
+ * Inserts the specified element at the front of this list.
+ * 
+ * @param e the element to insert
+ * @return {@code true} (as specified by {@link Deque#offerFirst})
+ * @since 1.6
+ */
+- (BOOL) offerFirst:(LLNode *)e
+{
+    [self addFirst:e];
+    return YES;
+}
+
+
+/**
+ * Inserts the specified element at the end of this list.
+ * 
+ * @param e the element to insert
+ * @return {@code true} (as specified by {@link Deque#offerLast})
+ * @since 1.6
+ */
+- (BOOL) offerLast:(LLNode *)e
+{
+    [self addLast:e];
+    return YES;
+}
+
+
+/**
+ * Retrieves, but does not remove, the first element of this list,
+ * or returns {@code null} if this list is empty.
+ * 
+ * @return the first element of this list, or {@code null}
+ * if this list is empty
+ * @since 1.6
+ */
+- (LLNode *) peekFirst
+{
+    LLNode *f = first;
+    return (f == nil) ? nil : f.item;
+}
+
+
+/**
+ * Retrieves, but does not remove, the last element of this list,
+ * or returns {@code null} if this list is empty.
+ * 
+ * @return the last element of this list, or {@code null}
+ * if this list is empty
+ * @since 1.6
+ */
+- (LLNode *) peekLast
+{
+    LLNode *l = last;
+    return (l == nil) ? nil : l.item;
+}
+
+
+/**
+ * Retrieves and removes the first element of this list,
+ * or returns {@code null} if this list is empty.
+ * 
+ * @return the first element of this list, or {@code null} if
+ * this list is empty
+ * @since 1.6
+ */
+- (LLNode *) pollFirst
+{
+    LLNode *f = first;
+    return (f == nil) ? nil : [self unlinkFirst:f];
+}
+
+
+/**
+ * Retrieves and removes the last element of this list,
+ * or returns {@code null} if this list is empty.
+ * 
+ * @return the last element of this list, or {@code null} if
+ * this list is empty
+ * @since 1.6
+ */
+- (LLNode *) pollLast
+{
+    LLNode *l = last;
+    return (l == nil) ? nil : [self unlinkLast:l];
+}
+
+
+/**
+ * Pushes an element onto the stack represented by this list.  In other
+ * words, inserts the element at the front of this list.
+ * 
+ * <p>This method is equivalent to {@link #addFirst}.
+ * 
+ * @param e the element to push
+ * @since 1.6
+ */
+- (void) push:(LLNode *)e
+{
+    [self addFirst:e];
+}
+
+
+/**
+ * Pops an element from the stack represented by this list.  In other
+ * words, removes and returns the first element of this list.
+ * 
+ * <p>This method is equivalent to {@link #removeFirst()}.
+ * 
+ * @return the element at the front of this list (which is the top
+ * of the stack represented by this list)
+ * @throws NoSuchElementException if this list is empty
+ * @since 1.6
+ */
+- (LLNode *) pop
+{
+    return [self removeFirst];
+}
+
+
+/**
+ * Removes the first occurrence of the specified element in this
+ * list (when traversing the list from head to tail).  If the list
+ * does not contain the element, it is unchanged.
+ * 
+ * @param o element to be removed from this list, if present
+ * @return {@code true} if the list contained the specified element
+ * @since 1.6
+ */
+- (BOOL) removeFirstOccurrence:(id)o
+{
+    return [self remove:o];
+}
+
+
+/**
+ * Removes the last occurrence of the specified element in this
+ * list (when traversing the list from head to tail).  If the list
+ * does not contain the element, it is unchanged.
+ * 
+ * @param o element to be removed from this list, if present
+ * @return {@code true} if the list contained the specified element
+ * @since 1.6
+ */
+- (BOOL) removeLastOccurrence:(id)o
+{
+    if (o == nil) {
+        
+        for (LLNode *x = last; x != nil; x = x.prev) {
+            if (x.item == nil) {
+                [self unlink:x];
+                return YES;
+            }
+        }
+        
+    }
+    else {
+        
+        for (LLNode *x = last; x != nil; x = x.prev) {
+            if ([o isEqualTo:x.item]) {
+                [self unlink:x];
+                return YES;
+            }
+        }
+        
+    }
+    return NO;
+}
+
+
+/**
+ * Returns a list-iterator of the elements in this list (in proper
+ * sequence), starting at the specified position in the list.
+ * Obeys the general contract of {@code List.listIterator(NSInteger)}.<p>
+ * 
+ * The list-iterator is <i>fail-fast</i>: if the list is structurally
+ * modified at any time after the Iterator is created, in any way except
+ * through the list-iterator's own {@code remove} or {@code add}
+ * methods, the list-iterator will throw a
+ * {@code ConcurrentModificationException}.  Thus, in the face of
+ * concurrent modification, the iterator fails quickly and cleanly, rather
+ * than risking arbitrary, non-deterministic behavior at an undetermined
+ * time in the future.
+ * 
+ * @param index index of the first element to be returned from the
+ * list-iterator (by a call to {@code next})
+ * @return a ListIterator of the elements in this list (in proper
+ * sequence), starting at the specified position in the list
+ * @throws IndexOutOfBoundsException {@inheritDoc}
+ * @see List#listIterator(NSInteger)
+ */
+- (ListIterator *) listIterator:(NSInteger)index
+{
+    [self checkPositionIndex:index];
+    return [[ListIterator newIterator:self withIndex:index] autorelease];
+}
+
+
+/**
+ * @since 1.6
+ */
+- (NSEnumerator *) descendingIterator
+{
+    return [[[DescendingIterator alloc] init] autorelease];
+}
+
+/*
+- (LinkedList *) superClone:(NSZone *)zone
+{
+    
+    @try {
+        return (LinkedList *)[super copyWithZone:zone];
+    }
+    @catch (CloneNotSupportedException * e) {
+        @throw [[[NSException exceptionWithName:@"InternalException" reason:@"Attempted to Clone non-cloneable List" userInfo:nil] autorelease];
+    }
+}
+*/
+
+/**
+ * Returns a shallow copy of this {@code LinkedList}. (The elements
+ * themselves are not cloned.)
+ * 
+ * @return a shallow copy of this {@code LinkedList} instance
+ */
+- (id) copyWithZone:(NSZone *)zone
+{
+    LinkedList *clone = [LinkedList allocWithZone:zone];
+    clone.first = nil;
+    clone.last = nil;
+    clone.count = 0;
+    clone.modCount = 0;
+    
+    for (LLNode *x = first; x != nil; x = x.next)
+        [clone add:x.item];
+    
+    clone.count = count;
+    clone.first = first;
+    clone.last = last;
+    return clone;
+}
+
+
+/**
+ * Returns an array containing all of the elements in this list
+ * in proper sequence (from first to last element).
+ * 
+ * <p>The returned array will be "safe" in that no references to it are
+ * maintained by this list.  (In other words, this method must allocate
+ * a new array).  The caller is thus free to modify the returned array.
+ * 
+ * <p>This method acts as bridge between array-based and collection-based
+ * APIs.
+ * 
+ * @return an array containing all of the elements in this list
+ * in proper sequence
+ */
+- (NSArray *) toArray
+{
+    AMutableArray *result = [AMutableArray arrayWithCapacity:10];
+    
+    for (LLNode *x = first; x != nil; x = x.next)
+        [result addObject:x.item];
+    
+    return result;
+}
+
+
+/**
+ * Returns an array containing all of the elements in this list in
+ * proper sequence (from first to last element); the runtime type of
+ * the returned array is that of the specified array.  If the list fits
+ * in the specified array, it is returned therein.  Otherwise, a new
+ * array is allocated with the runtime type of the specified array and
+ * the size of this list.
+ * 
+ * <p>If the list fits in the specified array with room to spare (i.e.,
+ * the array has more elements than the list), the element in the array
+ * immediately following the end of the list is set to {@code null}.
+ * (This is useful in determining the length of the list <i>only</i> if
+ * the caller knows that the list does not contain any null elements.)
+ * 
+ * <p>Like the {@link #toArray()} method, this method acts as bridge between
+ * array-based and collection-based APIs.  Further, this method allows
+ * precise control over the runtime type of the output array, and may,
+ * under certain circumstances, be used to save allocation costs.
+ * 
+ * <p>Suppose {@code x} is a list known to contain only strings.
+ * The following code can be used to dump the list into a newly
+ * allocated array of {@code String}:
+ * 
+ * <pre>
+ * String[] y = x.toArray(new String[0]);</pre>
+ * 
+ * Note that {@code toArray(new Object[0])} is identical in function to
+ * {@code toArray()}.
+ * 
+ * @param a the array into which the elements of the list are to
+ * be stored, if it is big enough; otherwise, a new array of the
+ * same runtime type is allocated for this purpose.
+ * @return an array containing the elements of the list
+ * @throws ArrayStoreException if the runtime type of the specified array
+ * is not a supertype of the runtime type of every element in
+ * this list
+ * @throws NullPointerException if the specified array is null
+ */
+- (NSArray *) toArray:(AMutableArray *)a
+{
+    if ( [a count] < count )
+        a = (AMutableArray *)[AMutableArray arrayWithArray:a];
+    AMutableArray *result = a;
+    
+    for (LLNode *x = first; x != nil; x = x.next)
+        [result addObject:x.item];
+    
+    if ([a count] > count)
+        [a replaceObjectAtIndex:count withObject:nil];
+    return a;
+}
+
+
+/**
+ * Saves the state of this {@code LinkedList} instance to a stream
+ * (that is, serializes it).
+ * 
+ * @serialData The size of the list (the number of elements it
+ * contains) is emitted (NSInteger), followed by all of its
+ * elements (each an Object) in the proper order.
+ */
+- (void) writeObject:(NSOutputStream *)s
+{
+/*
+    [s defaultWriteObject];
+    [s writeInt:count];
+    
+    for (LLNode *x = first; x != nil; x = x.next)
+        [s writeObject:x.item];
+ */
+}
+
+
+/**
+ * Reconstitutes this {@code LinkedList} instance from a stream
+ * (that is, deserializes it).
+ */
+- (void) readObject:(NSInputStream *)s
+{
+/*
+    [s defaultReadObject];
+    NSInteger len = [s readInt];
+    
+    for (NSInteger i = 0; i < len; i++)
+        [self linkLast:(id)[s readObject]];
+ */
+}
+
+@end
diff --git a/runtime/ObjC/Framework/LookaheadStream.h b/runtime/ObjC/Framework/LookaheadStream.h
index 097d7a9..b600996 100644
--- a/runtime/ObjC/Framework/LookaheadStream.h
+++ b/runtime/ObjC/Framework/LookaheadStream.h
@@ -1,163 +1,77 @@
-/*
-[The "BSD licence"]
-Copyright (c) 2005-2008 Terence Parr
-All rights reserved.
+//
+//  LookaheadStream.h
+//  ANTLR
+//
+//  Created by Ian Michell on 26/04/2010.
+//  [The "BSD licence"]
+//  Copyright (c) 2010 Ian Michell 2010 Alan Condit
+//  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.
 
-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.
+#import <Foundation/Foundation.h>
+#import "FastQueue.h"
 
-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.
-*/
-package org.antlr.runtime.misc;
+#define UNITIALIZED_EOF_ELEMENT_INDEX NSIntegerMax
 
-import java.util.List;
-import java.util.ArrayList;
+@interface LookaheadStream : FastQueue
+{
+    NSInteger index;
+	NSInteger eofElementIndex;
+	NSInteger lastMarker;
+	NSInteger markDepth;
+	id prevElement;
+	id eof;
+}
 
-/** A lookahead queue that knows how to mark/release locations
- *  in the buffer for backtracking purposes. Any markers force the FastQueue
- *  superclass to keep all tokens until no more markers; then can reset
- *  to avoid growing a huge buffer.
- */
-public abstract class LookaheadStream<T> extends FastQueue<T> {
-    public static final int UNINITIALIZED_EOF_ELEMENT_INDEX = Integer.MAX_VALUE;
+@property (readwrite, retain, getter=getEof, setter=setEof:) id eof;
+@property (assign) NSInteger index;
+@property (assign, getter=getEofElementIndex, setter=setEofElementIndex:) NSInteger eofElementIndex;
+@property (assign, getter=getLastMarker, setter=setLastMarker:) NSInteger lastMarker;
+@property (assign, getter=getMarkDepth, setter=setMarkDepth:) NSInteger markDepth;
+@property (retain) id prevElement;
 
-    /** Set to buffer index of eof when nextElement returns eof */
-    protected int eofElementIndex = UNINITIALIZED_EOF_ELEMENT_INDEX;
+- (id) initWithEOF:(id) obj;
+- (id) nextElement;
+- (id) remove;
+- (void) consume;
+- (void) sync:(NSInteger) need;
+- (void) fill:(NSInteger) n;
+- (id) LT:(NSInteger) i;
+- (id) LB:(NSInteger) i;
+- (id) getCurrentSymbol;
+- (NSInteger) mark;
+- (void) release:(NSInteger) marker;
+- (void) rewind:(NSInteger) marker;
+- (void) rewind;
+- (void) seek:(NSInteger) i;
+- (id) getEof;
+- (void) setEof:(id) anID;
+- (NSInteger) getEofElementIndex;
+- (void) setEofElementIndex:(NSInteger) anInt;
+- (NSInteger) getLastMarker;
+- (void) setLastMarker:(NSInteger) anInt;
+- (NSInteger) getMarkDepth;
+- (void) setMarkDepth:(NSInteger) anInt;
 
-    /** Returned by nextElement upon end of stream; we add to buffer also */
-    public T eof = null;
-
-    /** Track the last mark() call result value for use in rewind(). */
-    protected int lastMarker;
-
-    /** tracks how deep mark() calls are nested */
-    protected int markDepth = 0;    
-
-    public LookaheadStream(T eof) {
-        this.eof = eof;
-    }
-
-    public void reset() {
-        eofElementIndex = UNINITIALIZED_EOF_ELEMENT_INDEX;
-        super.reset();
-    }
-    
-    /** Implement nextElement to supply a stream of elements to this
-     *  lookahead buffer.  Return eof upon end of the stream we're pulling from.
-     */
-    public abstract T nextElement();
-
-    /** Get and remove first element in queue; override FastQueue.remove() */
-    public T remove() {
-        T o = get(0);
-        p++;
-        // have we hit end of buffer and not backtracking?
-        if ( p == data.size() && markDepth==0 ) {
-            // if so, it's an opportunity to start filling at index 0 again
-            clear(); // size goes to 0, but retains memory
-        }
-        return o;
-    }
-
-    /** Make sure we have at least one element to remove, even if EOF */
-    public void consume() { sync(1); remove(); }
-
-    /** Make sure we have 'need' elements from current position p. Last valid
-     *  p index is data.size()-1.  p+need-1 is the data index 'need' elements
-     *  ahead.  If we need 1 element, (p+1-1)==p must be < data.size().
-     */
-    public void sync(int need) {
-        int n = (p+need-1) - data.size() + 1; // how many more elements we need?
-        if ( n > 0 ) fill(n);                 // out of elements?
-    }
-
-    /** add n elements to buffer */
-    public void fill(int n) {
-        for (int i=1; i<=n; i++) {
-            T o = nextElement();
-            if ( o==eof ) {
-                data.add(eof);
-                eofElementIndex = data.size()-1;
-            }
-            else data.add(o);
-        }
-    }
-
-    //public boolean hasNext() { return eofElementIndex!=UNINITIALIZED_EOF_ELEMENT_INDEX; }
-    
-    /** Size of entire stream is unknown; we only know buffer size from FastQueue */
-    public int size() { throw new UnsupportedOperationException("streams are of unknown size"); }
-
-    public Object LT(int k) {
-		if ( k==0 ) {
-			return null;
-		}
-		if ( k<0 ) {
-			return LB(-k);
-		}
-		//System.out.print("LT(p="+p+","+k+")=");
-		if ( (p+k-1) >= eofElementIndex ) { // move to super.LT
-			return eof;
-		}
-        sync(k);
-        return get(k-1);
-	}
-
-	/** Look backwards k nodes */
-	protected Object LB(int k) {
-		if ( k==0 ) {
-			return null;
-		}
-		if ( (p-k)<0 ) {
-			return null;
-		}
-		return get(-k);
-	}
-
-    public Object getCurrentSymbol() { return LT(1); }
-
-    public int index() { return p; }
-
-	public int mark() {
-        markDepth++;
-        lastMarker = index();
-        return lastMarker;
-	}
-
-	public void release(int marker) {
-		// no resources to release
-	}
-
-	public void rewind(int marker) {
-        markDepth--;
-        seek(marker); // assume marker is top
-        // release(marker); // waste of call; it does nothing in this class
-    }
-
-	public void rewind() {
-        seek(lastMarker); // rewind but do not release marker
-    }
-
-    /** Seek to a 0-indexed position within data buffer.  Can't handle
-     *  case where you seek beyond end of existing buffer.  Normally used
-     *  to seek backwards in the buffer. Does not force loading of nodes.
-     */
-    public void seek(int index) { p = index; }
-}
\ No newline at end of file
+@end
diff --git a/runtime/ObjC/Framework/LookaheadStream.m b/runtime/ObjC/Framework/LookaheadStream.m
index 097d7a9..a0f6314 100644
--- a/runtime/ObjC/Framework/LookaheadStream.m
+++ b/runtime/ObjC/Framework/LookaheadStream.m
@@ -1,163 +1,229 @@
-/*
-[The "BSD licence"]
-Copyright (c) 2005-2008 Terence Parr
-All rights reserved.
+//
+//  LookaheadStream.m
+//  ANTLR
+//
+//  Created by Ian Michell on 26/04/2010.
+// [The "BSD licence"]
+// Copyright (c) 2010 Ian Michell 2010 Alan Condit
+// 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.
 
-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.
+#import "LookaheadStream.h"
+#import "ANTLRError.h"
+#import "RecognitionException.h"
+#import "CommonToken.h"
+#import "RuntimeException.h"
 
-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.
-*/
-package org.antlr.runtime.misc;
+@implementation LookaheadStream
 
-import java.util.List;
-import java.util.ArrayList;
+@synthesize eof;
+@synthesize index;
+@synthesize eofElementIndex;
+@synthesize lastMarker;
+@synthesize markDepth;
+@synthesize prevElement;
 
-/** A lookahead queue that knows how to mark/release locations
- *  in the buffer for backtracking purposes. Any markers force the FastQueue
- *  superclass to keep all tokens until no more markers; then can reset
- *  to avoid growing a huge buffer.
- */
-public abstract class LookaheadStream<T> extends FastQueue<T> {
-    public static final int UNINITIALIZED_EOF_ELEMENT_INDEX = Integer.MAX_VALUE;
-
-    /** Set to buffer index of eof when nextElement returns eof */
-    protected int eofElementIndex = UNINITIALIZED_EOF_ELEMENT_INDEX;
-
-    /** Returned by nextElement upon end of stream; we add to buffer also */
-    public T eof = null;
-
-    /** Track the last mark() call result value for use in rewind(). */
-    protected int lastMarker;
-
-    /** tracks how deep mark() calls are nested */
-    protected int markDepth = 0;    
-
-    public LookaheadStream(T eof) {
-        this.eof = eof;
-    }
-
-    public void reset() {
-        eofElementIndex = UNINITIALIZED_EOF_ELEMENT_INDEX;
-        super.reset();
-    }
-    
-    /** Implement nextElement to supply a stream of elements to this
-     *  lookahead buffer.  Return eof upon end of the stream we're pulling from.
-     */
-    public abstract T nextElement();
-
-    /** Get and remove first element in queue; override FastQueue.remove() */
-    public T remove() {
-        T o = get(0);
-        p++;
-        // have we hit end of buffer and not backtracking?
-        if ( p == data.size() && markDepth==0 ) {
-            // if so, it's an opportunity to start filling at index 0 again
-            clear(); // size goes to 0, but retains memory
-        }
-        return o;
-    }
-
-    /** Make sure we have at least one element to remove, even if EOF */
-    public void consume() { sync(1); remove(); }
-
-    /** Make sure we have 'need' elements from current position p. Last valid
-     *  p index is data.size()-1.  p+need-1 is the data index 'need' elements
-     *  ahead.  If we need 1 element, (p+1-1)==p must be < data.size().
-     */
-    public void sync(int need) {
-        int n = (p+need-1) - data.size() + 1; // how many more elements we need?
-        if ( n > 0 ) fill(n);                 // out of elements?
-    }
-
-    /** add n elements to buffer */
-    public void fill(int n) {
-        for (int i=1; i<=n; i++) {
-            T o = nextElement();
-            if ( o==eof ) {
-                data.add(eof);
-                eofElementIndex = data.size()-1;
-            }
-            else data.add(o);
-        }
-    }
-
-    //public boolean hasNext() { return eofElementIndex!=UNINITIALIZED_EOF_ELEMENT_INDEX; }
-    
-    /** Size of entire stream is unknown; we only know buffer size from FastQueue */
-    public int size() { throw new UnsupportedOperationException("streams are of unknown size"); }
-
-    public Object LT(int k) {
-		if ( k==0 ) {
-			return null;
-		}
-		if ( k<0 ) {
-			return LB(-k);
-		}
-		//System.out.print("LT(p="+p+","+k+")=");
-		if ( (p+k-1) >= eofElementIndex ) { // move to super.LT
-			return eof;
-		}
-        sync(k);
-        return get(k-1);
+-(id) init
+{
+	self = [super init];
+	if ( self != nil ) {
+        eof = [[CommonToken eofToken] retain];
+		eofElementIndex = UNITIALIZED_EOF_ELEMENT_INDEX;
+		markDepth = 0;
+        index = 0;
 	}
+	return self;
+}
 
-	/** Look backwards k nodes */
-	protected Object LB(int k) {
-		if ( k==0 ) {
-			return null;
-		}
-		if ( (p-k)<0 ) {
-			return null;
-		}
-		return get(-k);
+-(id) initWithEOF:(id)obj
+{
+	if ((self = [super init]) != nil) {
+		self.eof = obj;
+        if ( self.eof ) [self.eof retain];
 	}
+	return self;
+}
 
-    public Object getCurrentSymbol() { return LT(1); }
+- (void) reset
+{
+	[super reset];
+    index = 0;
+    p = 0;
+    prevElement = nil;
+	eofElementIndex = UNITIALIZED_EOF_ELEMENT_INDEX;
+}
 
-    public int index() { return p; }
+-(id) nextElement
+{
+//	[self doesNotRecognizeSelector:_cmd];
+	return nil;
+}
 
-	public int mark() {
-        markDepth++;
-        lastMarker = index();
-        return lastMarker;
-	}
-
-	public void release(int marker) {
-		// no resources to release
-	}
-
-	public void rewind(int marker) {
-        markDepth--;
-        seek(marker); // assume marker is top
-        // release(marker); // waste of call; it does nothing in this class
+- (id) remove
+{
+    id obj = [self objectAtIndex:0];
+    p++;
+    // have we hit end of buffer and not backtracking?
+    if ( p == [data count] && markDepth==0 ) {
+        // if so, it's an opportunity to start filling at index 0 again
+        [self clear]; // size goes to 0, but retains memory
     }
+    [obj release];
+    return obj;
+}
 
-	public void rewind() {
-        seek(lastMarker); // rewind but do not release marker
-    }
+-(void) consume
+{
+	[self sync:1];
+	prevElement = [self remove];
+    index++;
+}
 
-    /** Seek to a 0-indexed position within data buffer.  Can't handle
-     *  case where you seek beyond end of existing buffer.  Normally used
-     *  to seek backwards in the buffer. Does not force loading of nodes.
-     */
-    public void seek(int index) { p = index; }
-}
\ No newline at end of file
+-(void) sync:(NSInteger) need
+{
+	NSInteger n = (p + need - 1) - [data count] + 1;
+	if ( n > 0 ) {
+		[self fill:n];
+	}
+}
+
+-(void) fill:(NSInteger) n
+{
+    id obj;
+	for (NSInteger i = 1; i <= n; i++) {
+		obj = [self nextElement];
+		if ( obj == eof ) {
+			[data addObject:self.eof];
+			eofElementIndex = [data count] - 1;
+		}
+		else {
+			[data addObject:obj];
+		}
+	}
+}
+
+-(NSUInteger) count
+{
+	@throw [NSException exceptionWithName:@"UnsupportedOperationException" reason:@"Streams have no defined size" userInfo:nil];
+}
+
+-(id) LT:(NSInteger) k
+{
+	if (k == 0) {
+		return nil;
+	}
+	if (k < 0) {
+		return [self LB:-k];
+	}
+	if ((p + k - 1) >= eofElementIndex) {
+		return self.eof;
+	}
+	[self sync:k];
+	return [self objectAtIndex:(k - 1)];
+}
+
+-(id) LB:(NSInteger) k
+{
+	if (k == 1) {
+		return prevElement;
+	}
+	@throw [NoSuchElementException newException:@"can't look backwards more than one token in this stream"];
+}
+
+-(id) getCurrentSymbol
+{
+	return [self LT:1];
+}
+
+-(NSInteger) mark
+{
+	markDepth++;
+	lastMarker = p;
+	return lastMarker;
+}
+
+-(void) release:(NSInteger) marker
+{
+	// no resources to release
+}
+
+-(void) rewind:(NSInteger) marker
+{
+	markDepth--;
+	[self seek:marker];
+//    if (marker == 0) [self reset];
+}
+
+-(void) rewind
+{
+	[self seek:lastMarker];
+//    if (lastMarker == 0) [self reset];
+}
+
+-(void) seek:(NSInteger) anIndex
+{
+	p = anIndex;
+}
+
+- (id) getEof
+{
+    return eof;
+}
+
+- (void) setEof:(id) anID
+{
+    eof = anID;
+}
+
+- (NSInteger) getEofElementIndex
+{
+    return eofElementIndex;
+}
+
+- (void) setEofElementIndex:(NSInteger) anInt
+{
+    eofElementIndex = anInt;
+}
+
+- (NSInteger) getLastMarker
+{
+    return lastMarker;
+}
+
+- (void) setLastMarker:(NSInteger) anInt
+{
+    lastMarker = anInt;
+}
+
+- (NSInteger) getMarkDepthlastMarker
+{
+    return markDepth;
+}
+
+- (void) setMarkDepth:(NSInteger) anInt
+{
+    markDepth = anInt;
+}
+
+@end
diff --git a/runtime/ObjC/Framework/Map.h b/runtime/ObjC/Framework/Map.h
new file mode 100644
index 0000000..1356814
--- /dev/null
+++ b/runtime/ObjC/Framework/Map.h
@@ -0,0 +1,82 @@
+//
+//  Map.h
+//  ANTLR
+//
+//  Created by Alan Condit on 6/9/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "PtrBuffer.h"
+#import "MapElement.h"
+
+//#define GLOBAL_SCOPE      0
+//#define LOCAL_SCOPE       1
+#define HASHSIZE            101
+#define HBUFSIZE            0x2000
+
+@interface Map : PtrBuffer {
+	//Map *fNext; // found in superclass
+    // TStringPool *fPool;
+    NSInteger lastHash;
+}
+
+//@property (copy) Map *fNext;
+@property (getter=getLastHash, setter=setLastHash:) NSInteger lastHash;
+
+// Contruction/Destruction
++ (id)newMap;
++ (id)newMapWithLen:(NSInteger)aHashSize;
+
+- (id)init;
+- (id)initWithLen:(NSInteger)cnt;
+- (void)dealloc;
+// Instance Methods
+- (NSInteger)count;
+- (NSInteger)length;
+- (NSInteger)size;
+/* clear -- reinitialize the maplist array */
+- (void) clear;
+/* form hash value for string s */
+-(NSInteger)hash:(NSString *)s;
+/*   look for s in ptrBuffer  */
+-(id)lookup:(NSString *)s;
+/* look for s in ptrBuffer  */
+-(id)install:(MapElement *)sym;
+/*
+ * delete entry from list
+ */
+- (void)deleteMap:(MapElement *)np;
+- (NSInteger)RemoveSym:(NSString *)s;
+- (void)delete_chain:(MapElement *)np;
+- (MapElement *)getTType:(NSString *)name;
+- (MapElement *)getName:(NSInteger)ttype;
+- (NSInteger)getNode:(MapElement *)aNode;
+- (void)putNode:(NSInteger)aTType Node:(id)aNode;
+- (void)putName:(NSString *)name TType:(NSInteger)ttype;
+- (void)putName:(NSString *)name Node:(id)aNode;
+
+@end
diff --git a/runtime/ObjC/Framework/Map.m b/runtime/ObjC/Framework/Map.m
new file mode 100644
index 0000000..a9dc88f
--- /dev/null
+++ b/runtime/ObjC/Framework/Map.m
@@ -0,0 +1,362 @@
+//
+//  Map.m
+//  ANTLR
+//
+//  Created by Alan Condit on 6/9/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#define SUCCESS (0)
+#define FAILURE (-1)
+
+#import "Map.h"
+#import "BaseTree.h"
+
+/*
+ * Start of Map
+ */
+@implementation Map
+
+@synthesize lastHash;
+
++(id)newMap
+{
+    return [[Map alloc] init];
+}
+
++(id)newMapWithLen:(NSInteger)aBuffSize
+{
+    return [[Map alloc] initWithLen:aBuffSize];
+}
+
+-(id)init
+{
+    NSInteger idx;
+    
+	self = [super initWithLen:HASHSIZE];
+    if ( self != nil ) {
+		fNext = nil;
+        for( idx = 0; idx < HASHSIZE; idx++ ) {
+            ptrBuffer[idx] = nil;
+        }
+	}
+    return( self );
+}
+
+-(id)initWithLen:(NSInteger)aBuffSize
+{
+	self = [super initWithLen:aBuffSize];
+    if ( self != nil ) {
+	}
+    return( self );
+}
+
+-(void)dealloc
+{
+#ifdef DEBUG_DEALLOC
+    NSLog( @"called dealloc in MMap" );
+#endif
+    MapElement *tmp, *rtmp;
+    NSInteger idx;
+	
+    if ( self.fNext != nil ) {
+        for( idx = 0; idx < BuffSize; idx++ ) {
+            tmp = ptrBuffer[idx];
+            while ( tmp ) {
+                rtmp = tmp;
+                tmp = (MapElement *)tmp.fNext;
+                [rtmp release];
+            }
+        }
+    }
+	[super dealloc];
+}
+
+-(void)deleteMap:(MapElement *)np
+{
+    MapElement *tmp, *rtmp;
+    NSInteger idx;
+    
+    if ( self.fNext != nil ) {
+        for( idx = 0; idx < BuffSize; idx++ ) {
+            tmp = ptrBuffer[idx];
+            while ( tmp ) {
+                rtmp = tmp;
+                tmp = [tmp getfNext];
+                [rtmp release];
+            }
+        }
+    }
+}
+
+- (void)clear
+{
+    MapElement *tmp, *rtmp;
+    NSInteger idx;
+
+    for( idx = 0; idx < BuffSize; idx++ ) {
+        tmp = ptrBuffer[idx];
+        while ( tmp ) {
+            rtmp = tmp;
+            tmp = [tmp getfNext];
+            [rtmp dealloc];
+        }
+        ptrBuffer[idx] = nil;
+    }
+}
+
+- (NSInteger)count
+{
+    NSInteger aCnt = 0;
+    
+    for (int i = 0; i < BuffSize; i++) {
+        if (ptrBuffer[i] != nil) {
+            aCnt++;
+        }
+    }
+    return aCnt;
+}
+
+- (NSInteger)length
+{
+    return BuffSize;
+}
+
+- (NSInteger)size
+{
+    MapElement *anElement;
+    NSInteger aSize = 0;
+    
+    for (int i = 0; i < BuffSize; i++) {
+        if ((anElement = ptrBuffer[i]) != nil) {
+            aSize += (NSInteger)[anElement size];
+        }
+    }
+    return aSize;
+}
+                          
+#ifdef USERDOC
+/*
+ *  HASH        hash entry to get index to table
+ *  NSInteger hash( Map *self, char *s );
+ *
+ *     Inputs:  NSString *s         string to find
+ *
+ *     Returns: NSInteger                 hashed value
+ *
+ *  Last Revision 9/03/90
+ */
+#endif
+-(NSInteger)hash:(NSString *)s       /*    form hash value for string s */
+{
+	NSInteger hashval;
+	const char *tmp;
+    
+	tmp = [s cStringUsingEncoding:NSASCIIStringEncoding];
+	for( hashval = 0; *tmp != '\0'; )
+        hashval += *tmp++;
+	self->lastHash = hashval % HASHSIZE;
+	return( self->lastHash );
+}
+
+#ifdef USERDOC
+/*
+ *  LOOKUP  search hashed list for entry
+ *  MapElement *lookup:(NSString *)s;
+ *
+ *     Inputs:  NSString  *s       string to find
+ *
+ *     Returns: MapElement  *        pointer to entry
+ *
+ *  Last Revision 9/03/90
+ */
+#endif
+-(id)lookup:(NSString *)s
+{
+    MapElement *np;
+    
+    for( np = self->ptrBuffer[[self hash:s]]; np != nil; np = [np getfNext] ) {
+        if ( [s isEqualToString:[np getName]] ) {
+            return( np );        /*   found it       */
+        }
+    }
+    return( nil );              /*   not found      */
+}
+
+#ifdef USERDOC
+/*
+ *  INSTALL search hashed list for entry
+ *  NSInteger install( Map *self, MapElement *sym );
+ *
+ *     Inputs:  MapElement    *sym   -- symbol ptr to install
+ *              NSInteger         scope -- level to find
+ *
+ *     Returns: Boolean     TRUE   if installed
+ *                          FALSE  if already in table
+ *
+ *  Last Revision 9/03/90
+ */
+#endif
+-(MapElement *)install:(MapElement *)sym
+{
+    MapElement *np;
+    
+    np = [self lookup:[sym getName]];
+    if ( np == nil ) {
+        [sym setFNext:ptrBuffer[ lastHash ]];
+        ptrBuffer[ lastHash ] = sym;
+        [sym retain];
+        return( ptrBuffer[ lastHash ] );
+    }
+    return( nil );            /*   not found      */
+}
+
+#ifdef USERDOC
+/*
+ *  RemoveSym  search hashed list for entry
+ *  NSInteger RemoveSym( Map *self, char *s );
+ *
+ *     Inputs:  char     *s          string to find
+ *
+ *     Returns: NSInteger      indicator of SUCCESS OR FAILURE
+ *
+ *  Last Revision 9/03/90
+ */
+#endif
+-(NSInteger)RemoveSym:(NSString *)s
+{
+    MapElement *np, *tmp;
+    NSInteger idx;
+    
+    idx = [self hash:s];
+    for ( tmp = self->ptrBuffer[idx], np = self->ptrBuffer[idx]; np != nil; np = [np getfNext] ) {
+        if ( [s isEqualToString:[np getName]] ) {
+            tmp = [np getfNext];             /* get the next link  */
+            [np release];
+            return( SUCCESS );            /* report SUCCESS     */
+        }
+        tmp = [np getfNext];              //  BAD!!!!!!
+    }
+    return( FAILURE );                    /*   not found      */
+}
+
+-(void)delete_chain:(MapElement *)np
+{
+    if ( [np getfNext] != nil )
+		[self delete_chain:[np getfNext]];
+	[np release];
+}
+
+#ifdef DONTUSEYET
+-(NSInteger)bld_symtab:(KW_TABLE *)toknams
+{
+    NSInteger i;
+    MapElement *np;
+    
+    for( i = 0; *(toknams[i].name) != '\0'; i++ ) {
+        // install symbol in ptrBuffer
+        np = [MapElement newMapElement:[NSString stringWithFormat:@"%s", toknams[i].name]];
+        //        np->fType = toknams[i].toknum;
+        [self install:np Scope:0];
+    }
+    return( SUCCESS );
+}
+#endif
+
+/*
+ * works only for maplist indexed not by name but by TokenNumber
+ */
+- (MapElement *)getName:(NSInteger)ttype
+{
+    MapElement *np;
+    NSInteger aTType;
+
+    aTType = ttype % HASHSIZE;
+    for( np = self->ptrBuffer[ttype]; np != nil; np = [np getfNext] ) {
+        if ( [(ACNumber *)np.node integerValue] == ttype ) {
+            return( np );        /*   found it       */
+        }
+    }
+    return( nil );              /*   not found      */
+}
+
+- (NSInteger)getNode:(id<BaseTree>)aNode
+{
+    MapElement *np;
+    NSInteger idx;
+
+    idx = [(id<BaseTree>)aNode type];
+    idx %= HASHSIZE;
+    np = ptrBuffer[idx];
+    return( [(ACNumber *)np.node integerValue] );
+}
+
+- (MapElement *)getTType:(NSString *)name
+{
+    return [self lookup:name];
+}
+
+// create node and install node in ptrBuffer
+- (void)putName:(NSString *)name TType:(NSInteger)ttype
+{
+    MapElement *np;
+    
+    np = [MapElement newMapElementWithName:[NSString stringWithString:name] Type:ttype];
+    [self install:np];
+}
+
+// create node and install node in ptrBuffer
+- (void)putName:(NSString *)name Node:(id)aNode
+{
+    MapElement *np, *np1;
+    NSInteger idx;
+    
+    idx = [self hash:name];
+    np1 = [MapElement newMapElementWithName:[NSString stringWithString:name] Type:idx];
+    np = [self lookup:name];
+    if ( np == nil ) {
+        [np1 setFNext:self->ptrBuffer[ self->lastHash ]];
+        self->ptrBuffer[ self->lastHash ] = np1;
+        [np1 retain];
+    }
+    else {
+        // ptrBuffer[idx] = np;
+    }
+    return;
+}
+
+// create node and install node in ptrBuffer
+- (void)putNode:(NSInteger)aTType Node:(id)aNode
+{
+    MapElement *np;
+    NSInteger ttype;
+    
+    ttype = aTType % HASHSIZE;
+    np = [MapElement newMapElementWithNode:ttype Node:(id)aNode];
+    ptrBuffer[ttype] = np;
+}
+
+@end
diff --git a/runtime/ObjC/Framework/MapElement.h b/runtime/ObjC/Framework/MapElement.h
new file mode 100644
index 0000000..fe8d0a3
--- /dev/null
+++ b/runtime/ObjC/Framework/MapElement.h
@@ -0,0 +1,66 @@
+//
+//  MapElement.h
+//  ANTLR
+//
+//  Created by Alan Condit on 6/8/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "ACNumber.h"
+#import "BaseMapElement.h"
+
+@interface MapElement : BaseMapElement {
+    NSString *name;
+    id        node;
+}
+@property (retain, getter=getName, setter=setName:) NSString *name;
+@property (retain, getter=getNode, setter=setNode:) id node;
+
++ (id) newMapElement;
++ (id) newMapElementWithName:(NSString *)aName Type:(NSInteger)aTType;
++ (id) newMapElementWithNode:(NSInteger)aTType Node:(id)aNode;
++ (id) newMapElementWithName:(NSString *)aName Node:(id)aNode;
++ (id) newMapElementWithObj1:(id)anObj1 Obj2:(id)anObj2;
+- (id) init;
+- (id) initWithName:(NSString *)aName Type:(NSInteger)aTType;
+- (id) initWithNode:(NSInteger)aTType Node:(id)aNode;
+- (id) initWithName:(NSString *)aName Node:(id)aNode;
+- (id) initWithObj1:(id)anObj1 Obj2:(id)anObj2;
+
+- (id) copyWithZone:(NSZone *)aZone;
+
+- (NSInteger) count;
+- (NSInteger) size;
+- (NSString *)getName;
+- (void)setName:(NSString *)aName;
+- (id)getNode;
+- (void)setNode:(id)aNode;
+- (void)putNode:(id)aNode;
+- (void)putNode:(id)aNode With:(NSInteger)uniqueID;
+//- (void)setObject:(id)aNode atIndex:anIndex;
+
+@end
diff --git a/runtime/ObjC/Framework/MapElement.m b/runtime/ObjC/Framework/MapElement.m
new file mode 100644
index 0000000..2b05224
--- /dev/null
+++ b/runtime/ObjC/Framework/MapElement.m
@@ -0,0 +1,207 @@
+//
+//  MapElement.m
+//  ANTLR
+//
+//  Created by Alan Condit on 6/8/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "MapElement.h"
+
+
+@implementation MapElement
+
+@synthesize name;
+@synthesize node;
+
++ (id) newMapElement
+{
+    return [[MapElement alloc] init];
+}
+
++ (id) newMapElementWithName:(NSString *)aName Type:(NSInteger)aTType
+{
+    return [[MapElement alloc] initWithName:aName Type:aTType];
+}
+
++ (id) newMapElementWithNode:(NSInteger)aTType Node:(id)aNode
+{
+    return [[MapElement alloc] initWithNode:aTType Node:aNode];
+}
+
++ (id) newMapElementWithName:(NSString *)aName Node:(id)aNode
+{
+    return [[MapElement alloc] initWithName:aName Node:aNode];
+}
+
++ (id) newMapElementWithObj1:(id)anObj1 Obj2:(id)anObj2
+{
+    return [[MapElement alloc] initWithObj1:anObj1 Obj2:anObj2];
+}
+
+- (id) init
+{
+    self = [super init];
+    if ( self != nil ) {
+        index = nil;
+        name  = nil;
+    }
+    return self;
+}
+
+- (id) initWithName:(NSString *)aName Type:(NSInteger)aTType
+{
+    self = [super init];
+    if ( self != nil ) {
+        index = [[ACNumber numberWithInteger: aTType] retain];
+        name  = [[NSString stringWithString:aName] retain];
+    }
+    return self;
+}
+
+- (id) initWithNode:(NSInteger)aTType Node:(id)aNode
+{
+    self = [super initWithAnIndex:[ACNumber numberWithInteger:aTType]];
+    if ( self != nil ) {
+        node  = aNode;
+        if ( node ) [node retain];
+    }
+    return self;
+}
+
+- (id) initWithName:(NSString *)aName Node:(id)aNode
+{
+    self = [super init];
+    if ( self != nil ) {
+        name  = [[NSString stringWithString:aName] retain];
+        node = aNode;
+        if ( node ) [node retain];
+    }
+    return self;
+}
+
+- (id) initWithObj1:(id)anIndex Obj2:(id)aNode
+{
+    self = [super initWithAnIndex:anIndex];
+    if ( self != nil ) {
+        node = aNode;
+        if ( node ) [node retain];
+    }
+    return self;
+}
+
+- (void) dealloc
+{
+#ifdef DEBUG_DEALLOC
+    NSLog( @"called dealloc in MapElement" );
+#endif
+    if ( name ) [name release];
+    if ( node ) [node release];
+    [super dealloc];
+}
+
+- (id) copyWithZone:(NSZone *)aZone
+{
+    MapElement *copy;
+
+    copy = [super copyWithZone:aZone];
+    if (name) copy.name = name;
+    if (node) copy.node = node;
+    return( copy );
+}
+
+- (NSInteger) count
+{
+    NSInteger aCnt = 0;
+    if (name != nil) aCnt++;;
+    if (node != nil) aCnt++;;
+    return aCnt;
+}
+
+- (NSInteger)size
+{
+    NSInteger aSize = 0;
+    if ( name ) aSize += sizeof(id);
+    if ( node ) aSize += sizeof(id);
+    return aSize;
+}
+
+
+- (NSString *)getName
+{
+    return name;
+}
+
+- (void)setName:(NSString *)aName
+{
+    if ( aName != name ) {
+        if ( name ) [name release];
+        [aName retain];
+    }
+    name = aName;
+}
+
+- (id)getNode
+{
+    return node;
+}
+
+- (void)setNode:(id)aNode
+{   if ( aNode != node ) {
+        if ( node ) [node release];
+        [aNode retain];
+    }
+    node = aNode;
+}
+
+- (void)putNode:(id)aNode
+{
+    index = ((MapElement *)aNode).index;
+    if (((MapElement *)aNode).name) {
+        name = [((MapElement *)aNode).name retain];
+        node = nil;
+    }
+    if (((MapElement *)aNode).node) {
+        name = nil;
+        node = [((MapElement *)aNode).node retain];
+    }
+}
+
+- (void)putNode:(id)aNode With:(NSInteger)uniqueID
+{
+    index = ((MapElement *)aNode).index;
+    if (((MapElement *)aNode).name) {
+        name = [((MapElement *)aNode).name retain];
+        node = nil;
+    }
+    if (((MapElement *)aNode).node) {
+        name = nil;
+        node = [((MapElement *)aNode).node retain];
+    }
+}
+
+@end
diff --git a/runtime/ObjC/Framework/MismatchedNotSetException.h b/runtime/ObjC/Framework/MismatchedNotSetException.h
new file mode 100644
index 0000000..84453b4
--- /dev/null
+++ b/runtime/ObjC/Framework/MismatchedNotSetException.h
@@ -0,0 +1,51 @@
+//
+//  MismatchedNotSetException.h
+//  ANTLR
+//
+//  Created by Alan Condit on 6/13/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "RecognitionException.h"
+#import "ANTLRBitSet.h"
+
+@interface MismatchedNotSetException : RecognitionException
+{
+    NSString *expecting;
+}
+@property (retain, getter=getExpecting, setter=setExpecting:) NSString *expecting;
+
+- (MismatchedNotSetException *)newException;
+- (MismatchedNotSetException *)newException:(id<IntStream>)anInput
+                                                               Follow:(NSString *)expecting;
+
+- (id) init;
+- (id) initWithStream:(id<IntStream>)anInput Follow:(NSString *)expecting;
+
+- (NSString *)toString;
+
+@end
diff --git a/runtime/ObjC/Framework/MismatchedNotSetException.m b/runtime/ObjC/Framework/MismatchedNotSetException.m
new file mode 100644
index 0000000..069c0f6
--- /dev/null
+++ b/runtime/ObjC/Framework/MismatchedNotSetException.m
@@ -0,0 +1,69 @@
+//
+//  MismatchedNotSetException.m
+//  ANTLR
+//
+//  Created by Alan Condit on 6/13/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import "MismatchedNotSetException.h"
+
+@implementation MismatchedNotSetException
+
+@synthesize expecting;
+
+- (MismatchedNotSetException *)newException
+{
+    return [[MismatchedNotSetException alloc] init];
+}
+
+- (MismatchedNotSetException *)newException:(id<IntStream>)anInput
+                                                               Follow:(NSString *)expected
+{
+    return [[MismatchedNotSetException alloc] initWithStream:anInput Follow:(NSString *)expected];
+}
+
+- (id) init
+{
+    if ((self = [super init]) != nil ) {
+    }
+    return(self);
+}
+
+- (id) initWithStream:(id<IntStream>)anInput Follow:(NSString *)expected
+{
+    if ((self = [super initWithStream:anInput]) != nil ) {
+        expecting = expected;
+    }
+    return(self);
+}
+
+- (NSString *)toString
+{
+    return [NSString stringWithFormat:@"MismatchedNotSetException( %d != %@ )", [self unexpectedType], expecting];
+}
+
+@end
diff --git a/runtime/ObjC/Framework/MismatchedRangeException.h b/runtime/ObjC/Framework/MismatchedRangeException.h
new file mode 100644
index 0000000..dc3425d
--- /dev/null
+++ b/runtime/ObjC/Framework/MismatchedRangeException.h
@@ -0,0 +1,42 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "RecognitionException.h"
+
+@protocol IntStream;
+
+
+@interface MismatchedRangeException : RecognitionException {
+	NSRange range;
+}
+
+@property (assign) NSRange range;
+
++ (id) newException:(NSRange) aRange stream:(id<IntStream>) theInput;
+- (id) initWithRange:(NSRange) aRange stream:(id<IntStream>) theInput;
+
+@end
diff --git a/runtime/ObjC/Framework/MismatchedRangeException.m b/runtime/ObjC/Framework/MismatchedRangeException.m
new file mode 100644
index 0000000..2fbad2b
--- /dev/null
+++ b/runtime/ObjC/Framework/MismatchedRangeException.m
@@ -0,0 +1,55 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+
+#import "MismatchedRangeException.h"
+
+
+@implementation MismatchedRangeException
+
+@synthesize range;
+
++ (id) newException:(NSRange) aRange stream:(id<IntStream>) theInput
+{
+	return [[MismatchedRangeException alloc] initWithRange:aRange stream:theInput];
+}
+
+- (id) initWithRange:(NSRange) aRange stream:(id<IntStream>) theInput
+{
+	if ((self = [super initWithStream:theInput]) != nil) {
+		range = aRange;
+	}
+	return self;
+}
+
+- (NSString *) description
+{
+	NSMutableString *desc = (NSMutableString *)[super description];
+	[desc appendFormat:@" range:%@", NSStringFromRange(range)];
+	return desc;
+}
+
+@end
diff --git a/runtime/ObjC/Framework/MismatchedSetException.h b/runtime/ObjC/Framework/MismatchedSetException.h
new file mode 100644
index 0000000..980717b
--- /dev/null
+++ b/runtime/ObjC/Framework/MismatchedSetException.h
@@ -0,0 +1,44 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+
+#import <Foundation/Foundation.h>
+#import "RecognitionException.h"
+
+@interface MismatchedSetException : RecognitionException {
+	NSString *expecting;
+}
+
+@property (retain, getter=getExpecting, setter=setExpecting:) NSString *expecting;
+
++ (id) newException:(NSString *) theExpectedSet stream:(id<IntStream>) theStream;
+- (id) initWithSet:(NSString *) theExpectedSet stream:(id<IntStream>) theStream;
+
+- (NSString *) getExpecting;
+- (void) setExpecting: (NSString *) anExpectedSet;
+
+
+@end
diff --git a/runtime/ObjC/Framework/MismatchedSetException.m b/runtime/ObjC/Framework/MismatchedSetException.m
new file mode 100644
index 0000000..243aaaa
--- /dev/null
+++ b/runtime/ObjC/Framework/MismatchedSetException.m
@@ -0,0 +1,79 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+#import "MismatchedSetException.h"
+
+
+@implementation MismatchedSetException
+
+@synthesize expecting;
+
++ (id) newException:(NSString *) theExpectedSet stream:(id<IntStream>) theStream
+{
+	return [[MismatchedSetException alloc] initWithSet:theExpectedSet stream:theStream];
+}
+
+- (id) initWithSet:(NSString *) theExpectedSet stream:(id<IntStream>) theStream
+{
+	if ((self = [super initWithStream:theStream]) != nil) {
+		[self setExpecting:theExpectedSet];
+	}
+	return self;
+}
+
+- (void) dealloc
+{
+	[self setExpecting:nil];
+	[super dealloc];
+}
+
+- (NSString *) description
+{
+	NSMutableString *desc =(NSMutableString *)[super description];
+	[desc appendFormat:@" set:%@", expecting];
+	return desc;
+}
+
+
+//---------------------------------------------------------- 
+//  expectedSet 
+//---------------------------------------------------------- 
+- (NSString *) getExpecting
+{
+    return expecting; 
+}
+
+- (void) setExpecting: (NSString *) anExpectedSet
+{
+    if ( expecting != anExpectedSet ) {
+        if ( expecting ) [expecting release];
+        [anExpectedSet retain];
+        expecting = anExpectedSet;
+    }
+}
+
+
+@end
diff --git a/runtime/ObjC/Framework/MismatchedTokenException.h b/runtime/ObjC/Framework/MismatchedTokenException.h
new file mode 100644
index 0000000..792aa4d
--- /dev/null
+++ b/runtime/ObjC/Framework/MismatchedTokenException.h
@@ -0,0 +1,58 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+
+#import <Foundation/Foundation.h>
+#import "RecognitionException.h"
+#import "ANTLRBitSet.h"
+
+@protocol IntStream;
+
+@interface MismatchedTokenException : RecognitionException {
+	NSInteger expecting;
+	unichar expectingChar;
+	BOOL isTokenType;
+}
+
+@property (assign, getter=getExpecting, setter=setExpecting:) NSInteger expecting;
+@property (assign, getter=getExpectingChar, setter=setExpectingChar:) unichar expectingChar;
+@property (assign, getter=getIsTokenType, setter=setIsTokenType:) BOOL isTokenType;
+
++ (id) newException:(NSInteger)expectedTokenType Stream:(id<IntStream>)anInput;
++ (id) newExceptionMissing:(NSInteger)expectedTokenType
+                                        Stream:(id<IntStream>)anInput
+                                         Token:(id<Token>)inserted;
++ (id) newExceptionChar:(unichar)expectedCharacter Stream:(id<IntStream>)anInput;
++ (id) newExceptionStream:(id<IntStream>)anInput
+                                    Exception:(NSException *)e
+                                       Follow:(ANTLRBitSet *)follow;
+- (id) initWithTokenType:(NSInteger)expectedTokenType Stream:(id<IntStream>)anInput;
+-(id) initWithTokenType:(NSInteger)expectedTokenType
+                 Stream:(id<IntStream>)anInput
+                  Token:(id<Token>)inserted;
+- (id) initWithCharacter:(unichar)expectedCharacter Stream:(id<IntStream>)anInput;
+
+@end
diff --git a/runtime/ObjC/Framework/MismatchedTokenException.m b/runtime/ObjC/Framework/MismatchedTokenException.m
new file mode 100644
index 0000000..716ea73
--- /dev/null
+++ b/runtime/ObjC/Framework/MismatchedTokenException.m
@@ -0,0 +1,99 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+#import "MismatchedTokenException.h"
+
+
+@implementation MismatchedTokenException
+
+@synthesize expecting;
+@synthesize expectingChar;
+@synthesize isTokenType;
+
+
++ (id) newException:(NSInteger)expectedTokenType Stream:(id<IntStream>)anInput
+{
+	return [[MismatchedTokenException alloc] initWithTokenType:expectedTokenType Stream:anInput];
+}
+
++ (id) newExceptionMissing:(NSInteger)expectedTokenType
+                                        Stream:(id<IntStream>)anInput
+                                         Token:(id<Token>)inserted
+{
+	return [[MismatchedTokenException alloc] initWithTokenType:expectedTokenType Stream:anInput Token:inserted];
+}
+
++ (id) newExceptionChar:(unichar) expectedCharacter Stream:(id<IntStream>)anInput
+{
+	return [[MismatchedTokenException alloc] initWithCharacter:expectedCharacter Stream:anInput];
+}
+
++ (id) newExceptionStream:(id<IntStream>)anInput Exception:(NSException *)e Follow:(ANTLRBitSet *) follow
+{
+	return [[MismatchedTokenException alloc] initWithStream:anInput];
+}
+
+-(id) initWithTokenType:(NSInteger)expectedTokenType Stream:(id<IntStream>)anInput
+{
+	if ((self = [super initWithStream:anInput]) != nil) {
+		expecting = expectedTokenType;
+		isTokenType = YES;
+	}
+	return self;
+}
+
+-(id) initWithTokenType:(NSInteger)expectedTokenType
+                 Stream:(id<IntStream>)anInput
+                  Token:(id<Token>)inserted
+{
+	if ((self = [super initWithStream:anInput]) != nil) {
+		expecting = expectedTokenType;
+		isTokenType = YES;
+	}
+	return self;
+}
+
+- (id) initWithCharacter:(unichar) expectedCharacter Stream:(id<IntStream>)anInput
+{
+	if ((self = [super initWithStream:anInput]) != nil) {
+		expectingChar = expectedCharacter;
+		isTokenType = NO;
+	}
+	return self;
+}
+
+- (NSString *) description
+{
+	NSMutableString *desc = (NSMutableString *)[super description];
+	if (isTokenType) {
+		[desc appendFormat:@" expected:%d got:%d", expecting, [self unexpectedType]];
+	} else {
+		[desc appendFormat:@" expected:%C got:%c", self.c, (unichar)expectingChar];
+	}
+	return desc;
+}
+
+@end
diff --git a/runtime/ObjC/Framework/MismatchedTreeNodeException.h b/runtime/ObjC/Framework/MismatchedTreeNodeException.h
new file mode 100644
index 0000000..4cb1c91
--- /dev/null
+++ b/runtime/ObjC/Framework/MismatchedTreeNodeException.h
@@ -0,0 +1,42 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "RecognitionException.h"
+
+@protocol IntStream;
+
+@interface MismatchedTreeNodeException : RecognitionException {
+	NSInteger expecting;
+}
+
+@property (getter=getExpecting, setter=setExpecting:) NSInteger expecting;
+
++ (id) newException:(NSInteger)expectedTokenType Stream:(id<IntStream>)anInput;
+- (id) initWithTokenType:(NSInteger) expectedTokenType Stream:(id<IntStream>)anInput;
+
+
+@end
diff --git a/runtime/ObjC/Framework/MismatchedTreeNodeException.m b/runtime/ObjC/Framework/MismatchedTreeNodeException.m
new file mode 100644
index 0000000..55addc3
--- /dev/null
+++ b/runtime/ObjC/Framework/MismatchedTreeNodeException.m
@@ -0,0 +1,54 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+#import "MismatchedTreeNodeException.h"
+
+
+@implementation MismatchedTreeNodeException
+
+@synthesize expecting;
+
++ (id) newException:(NSInteger)expectedTokenType Stream:(id<IntStream>)anInput
+{
+	return [[MismatchedTreeNodeException alloc] initWithTokenType:expectedTokenType Stream:anInput];
+}
+
+-(id) initWithTokenType:(NSInteger)expectedTokenType Stream:(id<IntStream>)anInput
+{
+	if ((self = [super initWithStream:anInput]) != nil) {
+		expecting = expectedTokenType;
+	}
+	return self;
+}
+
+- (NSString *) description
+{
+	NSMutableString *desc = (NSMutableString *)[super description];
+	[desc appendFormat:@" expected:%d got:%d", expecting, [self unexpectedType]];
+	return desc;
+}
+
+@end
diff --git a/runtime/ObjC/Framework/MissingTokenException.h b/runtime/ObjC/Framework/MissingTokenException.h
new file mode 100644
index 0000000..1f94005
--- /dev/null
+++ b/runtime/ObjC/Framework/MissingTokenException.h
@@ -0,0 +1,52 @@
+//
+//  MissingTokenException.h
+//  ANTLR
+//
+//  Created by Alan Condit on 6/8/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "MismatchedTokenException.h"
+#import "Token.h"
+
+@interface MissingTokenException : MismatchedTokenException {
+    id<Token> inserted;
+}
+/** Used for remote debugger deserialization */
++ (id) newException;
++ (id) newException:(NSInteger)expected
+             Stream:(id<IntStream>)anInput
+               With:(id<Token>)insertedToken;
+- (id) init;
+- (id) init:(NSInteger)expected Stream:(id<IntStream>)anInput With:(id<Token>)insertedToken;
+
+- (NSInteger) getMissingType;
+
+- (NSString *)toString;
+
+@property (retain) id<Token> inserted;
+@end
diff --git a/runtime/ObjC/Framework/MissingTokenException.m b/runtime/ObjC/Framework/MissingTokenException.m
new file mode 100644
index 0000000..d2a7878
--- /dev/null
+++ b/runtime/ObjC/Framework/MissingTokenException.m
@@ -0,0 +1,83 @@
+//
+//  MissingTokenException.m
+//  ANTLR
+//
+//  Created by Alan Condit on 6/8/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import "MissingTokenException.h"
+
+
+@implementation MissingTokenException
+/** Used for remote debugger deserialization */
++ (id) newException
+{
+    return [[MissingTokenException alloc] init];
+}
+
++ (id) newException:(NSInteger)expected
+             Stream:(id<IntStream>)anInput
+               With:(id<Token>)insertedToken
+{
+    return [[MissingTokenException alloc] init:expected Stream:anInput With:insertedToken];
+}
+
+- (id) init
+{
+    if ((self = [super init]) != nil) {
+    }
+    return self;
+}
+
+- (id) init:(NSInteger)expected Stream:(id<IntStream>)anInput With:(id<Token>)insertedToken
+{
+    if ((self = [super initWithStream:anInput]) != nil) {
+        expecting = expected;
+        input = anInput;
+        inserted = insertedToken;
+    }
+    return self;
+}
+
+- (NSInteger) getMissingType
+{
+    return expecting;
+}
+
+- (NSString *)toString
+{
+    if ( inserted != nil && token != nil ) {
+        return [NSString stringWithFormat:@"MissingTokenException(inserted %@ at %@)", inserted, token.text];
+    }
+    if ( token!=nil ) {
+        return [NSString stringWithFormat:@"MissingTokenException(at %@)", token.text ];
+    }
+    return @"MissingTokenException";
+}
+
+@synthesize inserted;
+@end
diff --git a/runtime/ObjC/Framework/NoViableAltException.h b/runtime/ObjC/Framework/NoViableAltException.h
new file mode 100644
index 0000000..47fb1c9
--- /dev/null
+++ b/runtime/ObjC/Framework/NoViableAltException.h
@@ -0,0 +1,45 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "RecognitionException.h"
+#import "IntStream.h"
+
+@interface NoViableAltException : RecognitionException {
+	int decisionNumber;
+	int stateNumber;
+}
+
++ (NoViableAltException *) newException:(NSInteger)theDecisionNumber state:(NSInteger)theStateNumber stream:(id<IntStream>)theStream;
+- (NoViableAltException *) initWithDecision:(NSInteger)theDecisionNumber state:(NSInteger)theStateNumber stream:(id<IntStream>)theStream;
+
+- (void)setDecisionNumber:(NSInteger)decisionNumber;
+- (void)setStateNumber:(NSInteger)stateNumber;
+
+
+@property (getter=decisionNumber,setter=setDecisionNumber:) NSInteger decisionNumber;
+@property (getter=stateNumber,setter=setStateNumber:) NSInteger stateNumber;
+@end
diff --git a/runtime/ObjC/Framework/NoViableAltException.m b/runtime/ObjC/Framework/NoViableAltException.m
new file mode 100644
index 0000000..5f64b0b
--- /dev/null
+++ b/runtime/ObjC/Framework/NoViableAltException.m
@@ -0,0 +1,83 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+
+#import "NoViableAltException.h"
+
+
+@implementation NoViableAltException
+
+
++ (NoViableAltException *) newException:(NSInteger)theDecisionNumber state:(NSInteger)theStateNumber stream:(id<IntStream>)theStream
+{
+	return [[self alloc] initWithDecision:theDecisionNumber state:theStateNumber stream:theStream];
+}
+
+
+- (NoViableAltException *) initWithDecision:(NSInteger)theDecisionNumber state:(NSInteger)theStateNumber stream:(id<IntStream>)theStream
+{
+	if ((self = [super initWithStream:theStream]) != nil) {
+		decisionNumber = theDecisionNumber;
+		stateNumber = theStateNumber;
+	}
+	return self;
+}
+
+- (NSString *) description
+{
+	NSMutableString *desc = (NSMutableString *)[super description];
+	[desc appendFormat:@" decision:%d state:%d", decisionNumber, stateNumber];
+	return desc;
+}
+
+//---------------------------------------------------------- 
+//  decisionNumber 
+//---------------------------------------------------------- 
+- (NSInteger) decisionNumber
+{
+    return decisionNumber;
+}
+
+- (void) setDecisionNumber: (NSInteger) aDecisionNumber
+{
+    decisionNumber = aDecisionNumber;
+}
+
+//---------------------------------------------------------- 
+//  stateNumber 
+//---------------------------------------------------------- 
+- (NSInteger) stateNumber
+{
+    return stateNumber;
+}
+
+- (void) setStateNumber: (NSInteger) aStateNumber
+{
+    stateNumber = aStateNumber;
+}
+
+
+@end
diff --git a/runtime/ObjC/Framework/NodeMapElement.h b/runtime/ObjC/Framework/NodeMapElement.h
new file mode 100644
index 0000000..523e457
--- /dev/null
+++ b/runtime/ObjC/Framework/NodeMapElement.h
@@ -0,0 +1,56 @@
+//
+//  RuleMapElement.h
+//  ANTLR
+//
+//  Created by Alan Condit on 6/16/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "BaseMapElement.h"
+#import "BaseTree.h"
+
+@interface NodeMapElement : BaseMapElement {
+    id<BaseTree> node;
+}
+
+@property (retain, getter=getNode, setter=setNode:) id<BaseTree> node;
+
++ (void)initialize;
+
++ (id) newNodeMapElement;
++ (id) newNodeMapElementWithIndex:(id)anIndex Node:(id<BaseTree>)aNode;
+- (id) init;
+- (id) initWithAnIndex:(id)anIndex Node:(id)aNode;
+
+- (id) copyWithZone:(NSZone *)aZone;
+
+- (id<BaseTree>)getNode;
+- (void)setNode:(id<BaseTree>)aNode;
+
+- (NSInteger)size;
+
+@end
diff --git a/runtime/ObjC/Framework/NodeMapElement.m b/runtime/ObjC/Framework/NodeMapElement.m
new file mode 100644
index 0000000..64c9fc0
--- /dev/null
+++ b/runtime/ObjC/Framework/NodeMapElement.m
@@ -0,0 +1,108 @@
+//
+//  NodeMapElement.m
+//  ANTLR
+//
+//  Created by Alan Condit on 6/16/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import "NodeMapElement.h"
+
+static NSInteger _aUniqueID;
+
+@implementation NodeMapElement
+
+@synthesize node;
+
++ (void)initialize
+{
+    _aUniqueID = 0;
+}
+
++ (NodeMapElement *)newNodeMapElement
+{
+    return [[NodeMapElement alloc] init];
+}
+
++ (NodeMapElement *)newNodeMapElementWithIndex:(id)anIndex Node:(id<BaseTree>)aNode
+{
+    return [[NodeMapElement alloc] initWithAnIndex:anIndex Node:aNode];
+}
+
+- (id) init
+{
+    if ((self = [super init]) != nil ) {
+        index = nil;
+        node = nil;
+    }
+    return (self);
+}
+
+- (id) initWithAnIndex:(id)anIndex Node:(id)aNode
+{
+    self = [super initWithAnIndex:anIndex];
+    if ( self ) {
+        if ( aNode != node ) {
+            if ( node ) [node release];
+            [aNode retain];
+        }
+        node = aNode;
+    }
+    return (self);
+}
+
+- (id) copyWithZone:(NSZone *)aZone
+{
+    NodeMapElement *copy;
+    
+    copy = [super copyWithZone:aZone];
+    copy.node = node;
+    return( copy );
+}
+
+- (id<BaseTree>)getNode
+{
+    return node;
+}
+
+- (void)setNode:(id<BaseTree>)aNode
+{
+    if ( aNode != node ) {
+        if ( node ) [node release];
+        [aNode retain];
+    }
+    node = aNode;
+}
+
+- (NSInteger)size
+{
+    NSInteger aSize = 0;
+    if (node != nil) aSize += sizeof(id);
+    if (index != nil) aSize += sizeof(id);
+    return( aSize );
+}
+
+@end
diff --git a/runtime/ObjC/Framework/ParseTree.h b/runtime/ObjC/Framework/ParseTree.h
new file mode 100644
index 0000000..3f23287
--- /dev/null
+++ b/runtime/ObjC/Framework/ParseTree.h
@@ -0,0 +1,64 @@
+//
+//  ParseTree.h
+//  ANTLR
+//
+//  Created by Alan Condit on 7/12/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "BaseTree.h"
+#import "CommonToken.h"
+#import "AMutableArray.h"
+
+@interface ParseTree : BaseTree <BaseTree> {
+	__strong id<Token> payload;
+	__strong AMutableArray *hiddenTokens;
+}
+/** A record of the rules used to match a token sequence.  The tokens
+ *  end up as the leaves of this tree and rule nodes are the interior nodes.
+ *  This really adds no functionality, it is just an alias for CommonTree
+ *  that is more meaningful (specific) and holds a String to display for a node.
+ */
++ (id<BaseTree>)newParseTree:(id<Token>)label;
+- (id)initWithLabel:(id<Token>)label;
+
+- (id<BaseTree>)dupNode;
+- (NSInteger)type;
+- (NSString *)text;
+- (NSInteger)getTokenStartIndex;
+- (void)setTokenStartIndex:(NSInteger)index;
+- (NSInteger)getTokenStopIndex;
+- (void)setTokenStopIndex:(NSInteger)index;
+- (NSString *)description;
+- (NSString *)toString;
+- (NSString *)toStringWithHiddenTokens;
+- (NSString *)toInputString;
+- (void)_toStringLeaves:(NSMutableString *)buf;
+
+@property (retain) id<Token> payload;
+@property (retain) AMutableArray *hiddenTokens;
+@end
diff --git a/runtime/ObjC/Framework/ParseTree.m b/runtime/ObjC/Framework/ParseTree.m
new file mode 100644
index 0000000..8a33972
--- /dev/null
+++ b/runtime/ObjC/Framework/ParseTree.m
@@ -0,0 +1,149 @@
+//
+//  ParseTree.m
+//  ANTLR
+//
+//  Created by Alan Condit on 7/12/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import "ParseTree.h"
+
+/** A record of the rules used to match a token sequence.  The tokens
+ *  end up as the leaves of this tree and rule nodes are the interior nodes.
+ *  This really adds no functionality, it is just an alias for CommonTree
+ *  that is more meaningful (specific) and holds a String to display for a node.
+ */
+@implementation ParseTree
++ (ParseTree *)newParseTree:(id<Token>)label
+{
+    return [[ParseTree alloc] initWithLabel:label];
+}
+    
+- (id)initWithLabel:(id<Token>)label
+{
+    self = [super init];
+    if ( self != nil) {
+        payload = [label retain];
+    }
+    return self;
+}
+
+- (id<BaseTree>)dupNode
+{
+    return nil;
+}
+    
+- (NSInteger)type
+{
+    return 0;
+}
+    
+- (NSString *)text
+{
+    return [self toString];
+}
+    
+- (NSInteger)getTokenStartIndex
+{
+    return 0;
+}
+    
+- (void)setTokenStartIndex:(NSInteger)anIndex
+{
+}
+    
+- (NSInteger)getTokenStopIndex
+{
+    return 0;
+}
+    
+- (void)setTokenStopIndex:(NSInteger)anIndex
+{
+}
+
+- (NSString *)description
+{
+    if ( [payload isKindOfClass:[CommonToken class]] ) {
+        id<Token> t = (id<Token>)payload;
+        if ( t.type == TokenTypeEOF ) {
+            return @"<EOF>";
+        }
+        return [t text];
+    }
+    return [payload description];
+}
+    
+- (NSString *)toString
+{
+    return [self description];
+}
+    
+/** Emit a token and all hidden nodes before.  EOF node holds all
+ *  hidden tokens after last real token.
+ */
+- (NSString *)toStringWithHiddenTokens
+{
+    NSMutableString *buf = [NSMutableString stringWithCapacity:25];
+    if ( hiddenTokens!=nil ) {
+        for (NSUInteger i = 0; i < [hiddenTokens count]; i++) {
+            id<Token>  hidden = (id<Token> ) [hiddenTokens objectAtIndex:i];
+            [buf appendString:[hidden text]];
+        }
+    }
+    NSString *nodeText = [self toString];
+    if ( ![nodeText isEqualTo:@"<EOF>"] )
+        [buf appendString:nodeText];
+    return buf;
+}
+    
+/** Print out the leaves of this tree, which means printing original
+ *  input back out.
+ */
+- (NSString *)toInputString
+{
+    NSMutableString *buf = [NSMutableString stringWithCapacity:25];
+    [self _toStringLeaves:buf];
+    return buf;
+}
+    
+- (void)_toStringLeaves:(NSMutableString *)buf
+{
+    if ( [payload isKindOfClass:[CommonToken class]] ) { // leaf node token?
+        [buf appendString:[self toStringWithHiddenTokens]];
+        return;
+    }
+    for (int i = 0; children!=nil && i < [children count]; i++) {
+        ParseTree *t = (ParseTree *) [children objectAtIndex:i];
+        [t _toStringLeaves:buf];
+    }
+}
+    
+@synthesize payload;
+@synthesize hiddenTokens;
+//@synthesize children;
+//@synthesize anException;
+
+@end
diff --git a/runtime/ObjC/Framework/Parser.h b/runtime/ObjC/Framework/Parser.h
new file mode 100644
index 0000000..38723d9
--- /dev/null
+++ b/runtime/ObjC/Framework/Parser.h
@@ -0,0 +1,59 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+
+#import <Foundation/Foundation.h>
+#import "BaseRecognizer.h"
+#import "CommonToken.h"
+#import "TokenStream.h"
+
+@interface Parser : BaseRecognizer {
+	id<TokenStream> input;
+}
++ (Parser *)newParser:(id<TokenStream>)anInput;
++ (Parser *)newParser:(id<TokenStream>)anInput State:(RecognizerSharedState *)aState;
+
+- (id) initWithTokenStream:(id<TokenStream>)theStream;
+- (id) initWithTokenStream:(id<TokenStream>)theStream State:(RecognizerSharedState *)aState;
+
+- (id<TokenStream>) input;
+- (void) setInput: (id<TokenStream>) anInput;
+
+- (void) reset;
+
+- (id) getCurrentInputSymbol:(id<TokenStream>)anInput;
+- (CommonToken *)getMissingSymbol:(id<TokenStream>)input
+                             Exception:(RecognitionException *)e
+                                 TType:(NSInteger)expectedTokenType
+                                BitSet:(ANTLRBitSet *)follow;
+- (void) setTokenStream:(id<TokenStream>)anInput;
+- (id<TokenStream>)getTokenStream;
+- (NSString *)getSourceName;
+
+- (void) traceIn:(NSString *)ruleName Index:(int)ruleIndex;
+- (void) traceOut:(NSString *)ruleName Index:(NSInteger) ruleIndex;
+
+@end
diff --git a/runtime/ObjC/Framework/Parser.m b/runtime/ObjC/Framework/Parser.m
new file mode 100644
index 0000000..baa214c
--- /dev/null
+++ b/runtime/ObjC/Framework/Parser.m
@@ -0,0 +1,148 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+#import "Parser.h"
+
+
+@implementation Parser
+
++ (Parser *)newParser:(id<TokenStream>)anInput
+{
+    return [[Parser alloc] initWithTokenStream:anInput];
+}
+
++ (Parser *)newParser:(id<TokenStream>)anInput State:(RecognizerSharedState *)aState
+{
+    return [[Parser alloc] initWithTokenStream:anInput State:aState];
+}
+
+- (id) initWithTokenStream:(id<TokenStream>)theStream
+{
+    if ((self = [super init]) != nil) {
+        [self setInput:theStream];
+    }
+    return self;
+}
+
+- (id) initWithTokenStream:(id<TokenStream>)theStream State:(RecognizerSharedState *)aState
+{
+    if ((self = [super initWithState:aState]) != nil) {
+        [self setInput:theStream];
+    }
+    return self;
+}
+
+- (void) reset
+{
+    [super reset]; // reset all recognizer state variables
+    if ( input!=nil ) {
+        [input seek:0]; // rewind the input
+    }
+}
+
+- (void) dealloc
+{
+#ifdef DEBUG_DEALLOC
+    NSLog( @"called dealloc in Parser" );
+#endif
+    [input release];
+	[super dealloc];
+}
+
+//---------------------------------------------------------- 
+//  input 
+//---------------------------------------------------------- 
+- (id<TokenStream>) input
+{
+    return input; 
+}
+
+- (void) setInput: (id<TokenStream>) anInput
+{
+    if (input != anInput) {
+        if ( input ) [input release];
+        [anInput retain];
+    }
+    input = anInput;
+}
+
+- (id) getCurrentInputSymbol:(id<TokenStream>)anInput
+{
+    state.token = [input LT:1];
+    return state.token;
+}
+
+- (CommonToken *)getMissingSymbol:(id<TokenStream>)anInput
+                             Exception:(RecognitionException *)e
+                                 TType:(NSInteger)expectedTokenType
+                                BitSet:(ANTLRBitSet *)follow
+{
+    NSString *tokenText = nil;
+    if ( expectedTokenType == TokenTypeEOF )
+        tokenText = @"<missing EOF>";
+    else
+        tokenText = [NSString stringWithFormat:@"<missing %@>\n",[[BaseRecognizer getTokenNames] objectAtIndex:expectedTokenType]];
+    CommonToken *t = [[CommonToken newToken:expectedTokenType Text:tokenText] retain];
+    CommonToken *current = [anInput LT:1];
+    if ( current.type == TokenTypeEOF ) {
+        current = [anInput LT:-1];
+    }
+    t.line = current.line;
+    t.charPositionInLine = current.charPositionInLine;
+    t.channel = TokenChannelDefault;
+    t.input = current.input;
+    return t;
+}
+
+/** Set the token stream and reset the parser */
+- (void) setTokenStream:(id<TokenStream>)anInput
+{
+    input = nil;
+    [self reset];
+    input = anInput;
+}
+
+- (id<TokenStream>)getTokenStream
+{
+    return input;
+}
+
+- (NSString *)getSourceName
+{
+    return [input getSourceName];
+}
+
+- (void) traceIn:(NSString *)ruleName Index:(int)ruleIndex
+{
+    [super traceIn:ruleName Index:ruleIndex Object:[input LT:1]];
+}
+
+- (void) traceOut:(NSString *)ruleName Index:(NSInteger) ruleIndex
+{
+    [super traceOut:ruleName Index:ruleIndex Object:[input LT:1]];
+}
+
+@end
diff --git a/runtime/ObjC/Framework/ParserRuleReturnScope.h b/runtime/ObjC/Framework/ParserRuleReturnScope.h
new file mode 100644
index 0000000..4691074
--- /dev/null
+++ b/runtime/ObjC/Framework/ParserRuleReturnScope.h
@@ -0,0 +1,46 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "Token.h"
+#import "RuleReturnScope.h"
+
+@interface ParserRuleReturnScope : RuleReturnScope {
+	id<Token> start;
+	id<Token> stopToken;
+}
+@property (retain, getter=getStart, setter=setStart:) id<Token> start;
+@property (retain, getter=getStop, setter=setStop:)   id<Token> stopToken;
+
+- (id<Token>) getStart;
+- (void) setStart: (id<Token>) aStart;
+
+- (id<Token>) getStop;
+- (void) setStop: (id<Token>) aStop;
+
+- (id) copyWithZone:(NSZone *)theZone;
+
+@end
diff --git a/runtime/ObjC/Framework/ParserRuleReturnScope.m b/runtime/ObjC/Framework/ParserRuleReturnScope.m
new file mode 100644
index 0000000..de71a81
--- /dev/null
+++ b/runtime/ObjC/Framework/ParserRuleReturnScope.m
@@ -0,0 +1,80 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+#import "ParserRuleReturnScope.h"
+
+
+@implementation ParserRuleReturnScope
+
+@synthesize start;
+@synthesize stopToken;
+
+- (void) dealloc
+{
+    [self setStart:nil];
+    [self setStop:nil];
+    [super dealloc];
+}
+
+- (id<Token>) getStart
+{
+    return start; 
+}
+
+- (void) setStart: (id<Token>) aStart
+{
+    if (start != aStart) {
+        [aStart retain];
+        if ( start ) [start release];
+        start = aStart;
+    }
+}
+
+- (id<Token>) getStop
+{
+    return stopToken; 
+}
+
+- (void) setStop: (id<Token>) aStop
+{
+    if (stopToken != aStop) {
+        [aStop retain];
+        if ( stopToken ) [stopToken release];
+        stopToken = aStop;
+    }
+}
+
+// create a copy, including the text if available
+// the input stream is *not* copied!
+- (id) copyWithZone:(NSZone *)theZone
+{
+    ParserRuleReturnScope *copy = [super copyWithZone:theZone];
+    copy.start = start;
+    copy.stopToken = stopToken;
+    return copy;
+}
+
+@end
diff --git a/runtime/ObjC/Framework/PtrBuffer.h b/runtime/ObjC/Framework/PtrBuffer.h
new file mode 100644
index 0000000..bc49e88
--- /dev/null
+++ b/runtime/ObjC/Framework/PtrBuffer.h
@@ -0,0 +1,93 @@
+//
+//  PtrBuffer.h
+//  ANTLR
+//
+//  Created by Alan Condit on 6/9/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "LinkBase.h"
+
+//#define GLOBAL_SCOPE       0
+//#define LOCAL_SCOPE        1
+#define BUFFSIZE         101
+
+@interface PtrBuffer : LinkBase {
+    NSUInteger BuffSize;
+    NSUInteger count;
+    NSUInteger ptr;
+    __strong NSMutableData *buffer;
+    __strong id *ptrBuffer;
+}
+
+@property (getter=getBuffSize, setter=setBuffSize:) NSUInteger BuffSize;
+@property (getter=getCount, setter=setCount:) NSUInteger count;
+@property (getter=getPtr, setter=setPtr:) NSUInteger ptr;
+@property (retain, getter=getBuffer, setter=setBuffer:) NSMutableData *buffer;
+@property (assign, getter=getPtrBuffer, setter=setPtrBuffer:) id *ptrBuffer;
+
+// Contruction/Destruction
++(PtrBuffer *)newPtrBuffer;
++(PtrBuffer *)newPtrBufferWithLen:(NSInteger)cnt;
+-(id)init;
+-(id)initWithLen:(NSUInteger)cnt;
+-(void)dealloc;
+
+// Instance Methods
+- (id) copyWithZone:(NSZone *)aZone;
+/* clear -- reinitialize the maplist array */
+- (void) clear;
+
+- (NSUInteger)count;
+- (NSUInteger)length;
+- (NSUInteger)size;
+
+- (NSMutableData *)getBuffer;
+- (void)setBuffer:(NSMutableData *)np;
+- (NSUInteger)getCount;
+- (void)setCount:(NSUInteger)aCount;
+- (id *)getPtrBuffer;
+- (void)setPtrBuffer:(id *)np;
+- (NSUInteger)getPtr;
+- (void)setPtr:(NSUInteger)np;
+
+- (void) push:(id) v;
+- (id) pop;
+- (id) peek;
+
+- (void) addObject:(id) v;
+- (void) addObjectsFromArray:(PtrBuffer *)anArray;
+- (void) insertObject:(id)aRule atIndex:(NSUInteger)idx;
+- (id)   objectAtIndex:(NSUInteger)idx;
+- (void) removeAllObjects;
+- (void)removeObjectAtIndex:(NSInteger)idx;
+
+- (void) ensureCapacity:(NSUInteger) index;
+- (NSString *) description;
+- (NSString *) toString;
+
+@end
diff --git a/runtime/ObjC/Framework/PtrBuffer.m b/runtime/ObjC/Framework/PtrBuffer.m
new file mode 100644
index 0000000..c1fc4cb
--- /dev/null
+++ b/runtime/ObjC/Framework/PtrBuffer.m
@@ -0,0 +1,353 @@
+//
+//  PtrBuffer.m
+//  ANTLR
+//
+//  Created by Alan Condit on 6/9/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#define SUCCESS (0)
+#define FAILURE (-1)
+
+#import "PtrBuffer.h"
+#import "Tree.h"
+
+/*
+ * Start of PtrBuffer
+ */
+@implementation PtrBuffer
+
+@synthesize BuffSize;
+@synthesize buffer;
+@synthesize ptrBuffer;
+@synthesize count;
+@synthesize ptr;
+
++(PtrBuffer *)newPtrBuffer
+{
+    return [[PtrBuffer alloc] init];
+}
+
++(PtrBuffer *)newPtrBufferWithLen:(NSInteger)cnt
+{
+    return [[PtrBuffer alloc] initWithLen:cnt];
+}
+
+-(id)init
+{
+    NSUInteger idx;
+    
+    self = [super init];
+    if ( self != nil ) {
+        BuffSize  = BUFFSIZE;
+        ptr = 0;
+        buffer = [[NSMutableData dataWithLength:(NSUInteger)BuffSize * sizeof(id)] retain];
+        ptrBuffer = (id *) [buffer mutableBytes];
+        for( idx = 0; idx < BuffSize; idx++ ) {
+            ptrBuffer[idx] = nil;
+        }
+        count = 0;
+    }
+    return( self );
+}
+
+-(id)initWithLen:(NSUInteger)cnt
+{
+    NSUInteger idx;
+    
+    self = [super init];
+    if ( self != nil ) {
+        BuffSize  = cnt;
+        ptr = 0;
+        buffer = [[NSMutableData dataWithLength:(NSUInteger)BuffSize * sizeof(id)] retain];
+        ptrBuffer = (id *)[buffer mutableBytes];
+        for( idx = 0; idx < BuffSize; idx++ ) {
+            ptrBuffer[idx] = nil;
+        }
+        count = 0;
+    }
+    return( self );
+}
+
+-(void)dealloc
+{
+#ifdef DEBUG_DEALLOC
+    NSLog( @"called dealloc in PtrBuffer" );
+#endif
+    LinkBase *tmp, *rtmp;
+    NSInteger idx;
+    
+    if ( self.fNext != nil ) {
+        for( idx = 0; idx < BuffSize; idx++ ) {
+            tmp = ptrBuffer[idx];
+            while ( tmp ) {
+                rtmp = tmp;
+                if ([tmp isKindOfClass:[LinkBase class]])
+                    tmp = (id)tmp.fNext;
+                else
+                    tmp = nil;
+                [rtmp release];
+            }
+        }
+    }
+    [buffer release];
+    [super dealloc];
+}
+
+- (id) copyWithZone:(NSZone *)aZone
+{
+    PtrBuffer *copy;
+    
+    copy = [[[self class] allocWithZone:aZone] init];
+    if ( buffer )
+        copy.buffer = [buffer copyWithZone:aZone];
+    copy.ptrBuffer = ptrBuffer;
+    copy.ptr = ptr;
+    return copy;
+}
+
+- (void)clear
+{
+    LinkBase *tmp, *rtmp;
+    NSInteger idx;
+
+    for( idx = 0; idx < BuffSize; idx++ ) {
+        tmp = ptrBuffer[idx];
+        while ( tmp ) {
+            rtmp = tmp;
+            if ([tmp isKindOfClass:[LinkBase class]])
+                tmp = (id)tmp.fNext;
+            else
+                tmp = nil;
+            [rtmp dealloc];
+        }
+        ptrBuffer[idx] = nil;
+    }
+    count = 0;
+}
+
+- (NSMutableData *)getBuffer
+{
+    return( buffer );
+}
+
+- (void)setBuffer:(NSMutableData *)np
+{
+    buffer = np;
+}
+
+- (NSUInteger)getCount
+{
+    return( count );
+}
+
+- (void)setCount:(NSUInteger)aCount
+{
+    count = aCount;
+}
+
+- (id *)getPtrBuffer
+{
+    return( ptrBuffer );
+}
+
+- (void)setPtrBuffer:(id *)np
+{
+    ptrBuffer = np;
+}
+
+- (NSUInteger)getPtr
+{
+    return( ptr );
+}
+
+- (void)setPtr:(NSUInteger)aPtr
+{
+    ptr = aPtr;
+}
+
+- (void) addObject:(id) v
+{
+    [self ensureCapacity:ptr];
+    if ( v ) [v retain];
+    ptrBuffer[ptr++] = v;
+    count++;
+}
+
+- (void) push:(id) v
+{
+    if ( ptr >= BuffSize - 1 ) {
+        [self ensureCapacity:ptr];
+    }
+    if ( v ) [v retain];
+    ptrBuffer[ptr++] = v;
+    count++;
+}
+
+- (id) pop
+{
+    id v = nil;
+    if ( ptr > 0 ) {
+        v = ptrBuffer[--ptr];
+        ptrBuffer[ptr] = nil;
+    }
+    count--;
+    if ( v ) [v release];
+    return v;
+}
+
+- (id) peek
+{
+    id v = nil;
+    if ( ptr > 0 ) {
+        v = ptrBuffer[ptr-1];
+    }
+    return v;
+}
+
+- (NSUInteger)count
+{
+#ifdef DONTUSENOMO
+    int cnt = 0;
+    
+    for (NSInteger i = 0; i < BuffSize; i++ ) {
+        if ( ptrBuffer[i] != nil ) {
+            cnt++;
+        }
+    }
+    if ( cnt != count ) count = cnt;
+#endif
+    return count;
+}
+
+- (NSUInteger)length
+{
+    return BuffSize;
+}
+
+- (NSUInteger)size
+{
+    NSUInteger aSize = 0;
+    for (int i = 0; i < BuffSize; i++ ) {
+        if (ptrBuffer[i] != nil) {
+            aSize += sizeof(id);
+        }
+    }
+    return aSize;
+}
+
+- (void) insertObject:(id)aRule atIndex:(NSUInteger)idx
+{
+    if ( idx >= BuffSize ) {
+        [self ensureCapacity:idx];
+    }
+    if ( aRule != ptrBuffer[idx] ) {
+        if ( ptrBuffer[idx] ) [ptrBuffer[idx] release];
+        if ( aRule ) [aRule retain];
+    }
+    ptrBuffer[idx] = aRule;
+    count++;
+}
+
+- (id)objectAtIndex:(NSUInteger)idx
+{
+    if ( idx < BuffSize ) {
+        return ptrBuffer[idx];
+    }
+    return nil;
+}
+
+- (void)addObjectsFromArray:(PtrBuffer *)anArray
+{
+    NSInteger cnt, i;
+    cnt = [anArray count];
+    for( i = 0; i < cnt; i++) {
+        id tmp = [anArray objectAtIndex:i];
+        if ( tmp ) [tmp retain];
+        [self insertObject:tmp atIndex:i];
+    }
+    count += cnt;
+    return;
+}
+
+- (void)removeAllObjects
+{
+    int i;
+    for ( i = 0; i < BuffSize; i++ ) {
+        if ( ptrBuffer[i] ) [ptrBuffer[i] release];
+        ptrBuffer[i] = nil;
+    }
+    count = 0;
+    ptr = 0;
+}
+
+- (void)removeObjectAtIndex:(NSInteger)idx
+{
+    int i;
+    if ( idx >= 0 && idx < count ) {
+        if ( ptrBuffer[idx] ) [ptrBuffer[idx] release];
+        for ( i = idx; i < count-1; i++ ) {
+            ptrBuffer[i] = ptrBuffer[i+1];
+        }
+        ptrBuffer[i] = nil;
+        count--;
+    }
+}
+
+- (void) ensureCapacity:(NSUInteger) anIndex
+{
+    if ((anIndex * sizeof(id)) >= [buffer length])
+    {
+        NSInteger newSize = ([buffer length] / sizeof(id)) * 2;
+        if (anIndex > newSize) {
+            newSize = anIndex + 1;
+        }
+        BuffSize = newSize;
+        [buffer setLength:(BuffSize * sizeof(id))];
+        ptrBuffer = [buffer mutableBytes];
+    }
+}
+
+- (NSString *) description
+{
+    NSMutableString *str;
+    NSInteger idx, cnt;
+    cnt = [self count];
+    str = [NSMutableString stringWithCapacity:30];
+    [str appendString:@"["];
+    for (idx = 0; idx < cnt; idx++ ) {
+        [str appendString:[[self objectAtIndex:idx] description]];
+    }
+    [str appendString:@"]"];
+    return str;
+}
+
+- (NSString *) toString
+{
+    return [self description];
+}
+
+@end
diff --git a/runtime/ObjC/Framework/PtrStack.h b/runtime/ObjC/Framework/PtrStack.h
new file mode 100644
index 0000000..cb4e7e3
--- /dev/null
+++ b/runtime/ObjC/Framework/PtrStack.h
@@ -0,0 +1,52 @@
+//
+//  PtrStack.h
+//  ANTLR
+//
+//  Created by Alan Condit on 6/9/10.
+//  Copyright 2010 Alan's MachineWorks. All rights reserved.
+//ptrBuffer
+
+#import <Foundation/Foundation.h>
+#import "ACNumber.h"
+#import "BaseStack.h"
+#import "RuleMemo.h"
+
+//#define GLOBAL_SCOPE       0
+//#define LOCAL_SCOPE        1
+#define HASHSIZE         101
+#define HBUFSIZE      0x2000
+
+@interface PtrStack : BaseStack {
+	//PtrStack *fNext;
+    // TStringPool *fPool;
+}
+
+//@property (copy) PtrStack *fNext;
+//@property (copy) TStringPool *fPool;
+
+// Contruction/Destruction
++ (PtrStack *)newPtrStack;
++ (PtrStack *)newPtrStack:(NSInteger)cnt;
+- (id)init;
+- (id)initWithLen:(NSInteger)aLen;
+- (void)dealloc;
+
+// Instance Methods
+- (id) copyWithZone:(NSZone *)aZone;
+/* clear -- reinitialize the maplist array */
+
+#ifdef DONTUSENOMO
+/* form hash value for string s */
+- (NSInteger)hash:(NSString *)s;
+/*   look for s in ptrBuffer  */
+- (id)lookup:(NSString *)s;
+/* look for s in ptrBuffer  */
+- (id)install:(id)sym;
+#endif
+
+#ifdef DONTUSENOMO
+- (id)getTType:(NSString *)name;
+- (id)getName:(NSInteger)ttype;
+#endif
+
+@end
diff --git a/runtime/ObjC/Framework/PtrStack.m b/runtime/ObjC/Framework/PtrStack.m
new file mode 100644
index 0000000..260e5c6
--- /dev/null
+++ b/runtime/ObjC/Framework/PtrStack.m
@@ -0,0 +1,191 @@
+//
+//  PtrStack.m
+//  ANTLR
+//
+//  Created by Alan Condit on 6/9/10.
+//  Copyright 2010 Alan's MachineWorks. All rights reserved.
+//
+#define SUCCESS (0)
+#define FAILURE (-1)
+
+#import "PtrStack.h"
+#import "Tree.h"
+
+/*
+ * Start of PtrStack
+ */
+@implementation PtrStack
+
++(PtrStack *)newPtrStack
+{
+    return [[PtrStack alloc] init];
+}
+
++(PtrStack *)newPtrStack:(NSInteger)cnt
+{
+    return [[PtrStack alloc] initWithLen:cnt];
+}
+
+-(id)init
+{
+	self = [super initWithLen:HASHSIZE];
+	if ( self != nil ) {
+	}
+    return( self );
+}
+
+-(id)initWithLen:(NSInteger)cnt
+{
+	self = [super initWithLen:cnt];
+	if ( self != nil ) {
+	}
+    return( self );
+}
+
+-(void)dealloc
+{
+#ifdef DEBUG_DEALLOC
+    NSLog( @"called dealloc in PtrStack" );
+#endif
+	[super dealloc];
+}
+
+-(void)deletePtrStack:(PtrStack *)np
+{
+    LinkBase *tmp, *rtmp;
+    NSInteger idx;
+    
+    if ( self.fNext != nil ) {
+        for( idx = 0; idx < BuffSize; idx++ ) {
+            tmp = ptrBuffer[idx];
+            while ( tmp ) {
+                rtmp = tmp;
+                tmp = [tmp getfNext];
+                [rtmp release];
+            }
+        }
+    }
+}
+
+#ifdef DONTUSENOMO
+#ifdef USERDOC
+/*
+ *  HASH        hash entry to get index to table
+ *  NSInteger hash( PtrStack *self, char *s );
+ *
+ *     Inputs:  NSString *s         string to find
+ *
+ *     Returns: NSInteger                 hashed value
+ *
+ *  Last Revision 9/03/90
+ */
+#endif
+-(NSInteger)hash:(NSString *)s       /*    form hash value for string s */
+{
+	NSInteger hashval;
+	const char *tmp;
+    
+	tmp = [s cStringUsingEncoding:NSASCIIStringEncoding];
+	for( hashval = 0; *tmp != '\0'; )
+        hashval += *tmp++;
+	LastHash = hashval % HashSize;
+	return( LastHash );
+}
+
+#ifdef USERDOC
+/*
+ *  LOOKUP  search hashed list for entry
+ *  id lookup:(NSString *)s;
+ *
+ *     Inputs:  NSString  *s       string to find
+ *
+ *     Returns: RuleMemo  *        pointer to entry
+ *
+ *  Last Revision 9/03/90
+ */
+#endif
+-(id)lookup:(NSString *)s
+{
+    LinkBase *np;
+    
+    for( np = ptrBuffer[[self hash:s]]; np != nil; np = [np getfNext] ) {
+        if ( [s isEqualToString:[np getName]] ) {
+            return( np );        /*   found it       */
+        }
+    }
+    return( nil );              /*   not found      */
+}
+
+#ifdef USERDOC
+/*
+ *  INSTALL search hashed list for entry
+ *  NSInteger install( PtrStack *self, id sym );
+ *
+ *     Inputs:  RuleMemo    *sym   -- symbol ptr to install
+ *              NSInteger         scope -- level to find
+ *
+ *     Returns: Boolean     TRUE   if installed
+ *                          FALSE  if already in table
+ *
+ *  Last Revision 9/03/90
+ */
+#endif
+-(id)install:(id)sym
+{
+    LinkBase *np;
+    
+    np = [self lookup:[sym getName]];
+    if ( np == nil ) {
+        [sym setFNext:ptrBuffer[ LastHash ]];
+        ptrBuffer[ LastHash ] = [sym retain];
+        return( ptrBuffer[ LastHash ] );
+    }
+    return( nil );            /*   not found      */
+}
+#endif
+
+-(id)getptrBufferEntry:(NSInteger)idx
+{
+	return( ptrBuffer[idx] );
+}
+
+-(id *)getptrBuffer
+{
+	return( ptrBuffer );
+}
+
+-(void)setptrBuffer:(id *)np
+{
+    ptrBuffer = np;
+}
+
+#ifdef DONTUSENOMO
+/*
+ * works only for maplist indexed not by name but by TokenNumber
+ */
+- (id)getName:(NSInteger)ttype
+{
+    id np;
+    NSInteger aTType;
+
+    aTType = ttype % HashSize;
+    for( np = ptrBuffer[ttype]; np != nil; np = [np getfNext] ) {
+        if ( np.index == ttype ) {
+            return( np );        /*   found it       */
+        }
+    }
+    return( nil );              /*   not found      */
+}
+
+- (id)getTType:(NSString *)name
+{
+    return [self lookup:name];
+}
+#endif
+
+- (id) copyWithZone:(NSZone *)aZone
+{
+    return [super copyWithZone:aZone];
+}
+
+@end
diff --git a/runtime/ObjC/Framework/RecognitionException.h b/runtime/ObjC/Framework/RecognitionException.h
new file mode 100644
index 0000000..8919812
--- /dev/null
+++ b/runtime/ObjC/Framework/RecognitionException.h
@@ -0,0 +1,78 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+
+#import <Foundation/Foundation.h>
+#import "RuntimeException.h"
+#import "Token.h"
+#import "IntStream.h"
+#import "BaseTree.h"
+
+@interface RecognitionException : RuntimeException {
+	id<IntStream> input;
+	NSInteger index;
+	id<Token> token;
+	id<BaseTree> node;
+	unichar c;
+	NSUInteger line;
+	NSUInteger charPositionInLine;
+	BOOL approximateLineInfo;
+}
+
+@property (retain, getter=getStream, setter=setStream:) id<IntStream> input;
+@property (assign) NSInteger index;
+@property (retain, getter=getToken, setter=setToken:) id<Token>token;
+@property (retain, getter=getNode, setter=setNode:) id<BaseTree>node;
+@property (assign) unichar c;
+@property (assign) NSUInteger line;
+@property (assign) NSUInteger charPositionInLine;
+@property (assign) BOOL approximateLineInfo;
+
++ (id) newException;
++ (id) newException:(id<IntStream>) anInputStream; 
+- (id) init;
+- (id) initWithStream:(id<IntStream>)anInputStream;
+- (id) initWithStream:(id<IntStream>)anInputStream reason:(NSString *)aReason;
+- (id) initWithName:(NSString *)aName reason:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo;
+
+- (void) extractInformationFromTreeNodeStream:(id<IntStream>)input;
+
+- (NSInteger) unexpectedType;
+- (id<Token>)getUnexpectedToken;
+
+- (id<IntStream>) getStream;
+- (void) setStream: (id<IntStream>) aStream;
+
+- (id<Token>) getToken;
+- (void) setToken: (id<Token>) aToken;
+
+- (id<BaseTree>) getNode;
+- (void) setNode: (id<BaseTree>) aNode;
+
+- (NSString *)getMessage;
+
+
+@end
diff --git a/runtime/ObjC/Framework/RecognitionException.m b/runtime/ObjC/Framework/RecognitionException.m
new file mode 100644
index 0000000..d6430b7
--- /dev/null
+++ b/runtime/ObjC/Framework/RecognitionException.m
@@ -0,0 +1,282 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+#import "Foundation/NSObjCRuntime.h"
+#import "RecognitionException.h"
+#import "TokenStream.h"
+#import "TreeNodeStream.h"
+#import "BufferedTokenStream.h"
+
+@implementation RecognitionException
+
+@synthesize input;
+@synthesize index;
+@synthesize token;
+@synthesize node;
+@synthesize c;
+@synthesize line;
+@synthesize charPositionInLine;
+@synthesize approximateLineInfo;
+
++ (id) newException
+{
+	return [[RecognitionException alloc] init];
+}
+
++ (id) newException:(id<IntStream>) anInputStream
+{
+	return [[RecognitionException alloc] initWithStream:anInputStream];
+}
+
++ (id) newException:(id<IntStream>) anInputStream reason:(NSString *)aReason
+{
+	return [[RecognitionException alloc] initWithStream:anInputStream reason:aReason];
+}
+
+- (id) init
+{
+	self = [super initWithName:@"Recognition Exception" reason:@"Recognition Exception" userInfo:nil];
+	if ( self != nil ) {
+	}
+	return self;
+}
+
+- (id) initWithStream:(id<IntStream>)anInputStream reason:(NSString *)aReason
+{
+	self = [super initWithName:NSStringFromClass([self class]) reason:aReason userInfo:nil];
+	if ( self != nil ) {
+		[self setStream:anInputStream];
+		index = input.index;
+		
+		Class inputClass = [input class];
+		if ([inputClass conformsToProtocol:@protocol(TokenStream)]) {
+			[self setToken:[(id<TokenStream>)input LT:1]];
+			line = token.line;
+			charPositionInLine = token.charPositionInLine;
+		} else if ([inputClass conformsToProtocol:@protocol(CharStream)]) {
+			c = (unichar)[input LA:1];
+			line = ((id<CharStream>)input).getLine;
+			charPositionInLine = ((id<CharStream>)input).getCharPositionInLine;
+		} else if ([inputClass conformsToProtocol:@protocol(TreeNodeStream)]) {
+			[self setNode:[(id<TreeNodeStream>)input LT:1]];
+			line = [node line];
+			charPositionInLine = [node charPositionInLine];
+		} else {
+			c = (unichar)[input LA:1];
+		}
+	}
+	return self;
+}
+
+- (id) initWithStream:(id<IntStream>)anInputStream
+{
+	self = [super initWithName:NSStringFromClass([self class]) reason:@"Runtime Exception" userInfo:nil];
+	if ( self != nil ) {
+        self.input = anInputStream;
+        self.index = input.index;
+        if ( [anInputStream isKindOfClass:[BufferedTokenStream class]] ) {
+            self.token = [(id<TokenStream>)anInputStream LT:1];
+            self.line = [token line];
+            self.charPositionInLine = [token charPositionInLine];
+           if ( [input conformsToProtocol:objc_getProtocol("TreeNodeStream")] ) {
+               [self extractInformationFromTreeNodeStream:anInputStream];
+           }
+           else if ( [[anInputStream class] instancesRespondToSelector:@selector(LA1:)] ) {
+               c = [anInputStream LA:1];
+               if ( [[anInputStream class] instancesRespondToSelector:@selector(getLine)] )
+                   line = [anInputStream getLine];
+               if ( [[anInputStream class] instancesRespondToSelector:@selector(getCharPositionInLine)] )
+                   charPositionInLine = [anInputStream getCharPositionInLine];
+           }
+           else {
+               c = [anInputStream LA:1];
+           }
+        }
+	}
+	return self;
+}
+
+- (id) initWithName:(NSString *)aName reason:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo
+{
+	self = [super initWithName:aName reason:aReason userInfo:aUserInfo];
+	if ( self != nil ) {
+    }
+    return self;
+}
+
+- (void) dealloc
+{
+#ifdef DEBUG_DEALLOC
+    NSLog( @"called dealloc in RecognitionException" );
+#endif
+	if ( input ) [input release];
+	if ( token ) [token release];
+	if ( node ) [node release];
+	[super dealloc];
+}
+
+- (void) extractInformationFromTreeNodeStream:(id<TreeNodeStream>)anInput
+{
+    id<TreeNodeStream> nodes = anInput;
+    node = [nodes LT:1];
+    id<TreeAdaptor> adaptor = [nodes getTreeAdaptor];
+    id<Token> payload = [adaptor getToken:node];
+    if ( payload != nil ) {
+        token = payload;
+        if ( payload.line <= 0 ) {
+            // imaginary node; no line/pos info; scan backwards
+            int i = -1;
+            id priorNode = [nodes LT:i];
+            while ( priorNode != nil ) {
+                id<Token> priorPayload = [adaptor getToken:priorNode];
+                if ( priorPayload!=nil && priorPayload.line > 0 ) {
+                    // we found the most recent real line / pos info
+                    line = priorPayload.line;
+                    charPositionInLine = priorPayload.charPositionInLine;
+                    approximateLineInfo = YES;
+                    break;
+                }
+                --i;
+                priorNode = [nodes LT:i];
+            }
+        }
+        else { // node created from real token
+            line = payload.line;
+            charPositionInLine = payload.charPositionInLine;
+        }
+    }
+    else if ( [self.node isKindOfClass:[CommonTree class]] ) {
+        line = ((id<Tree>)node).line;
+        charPositionInLine = ((id<Tree>)node).charPositionInLine;
+        if ( [node isMemberOfClass:[CommonTree class]]) {
+            token = ((CommonTree *)node).token;
+        }
+    }
+    else {
+        NSInteger type = [adaptor getType:node];
+        NSString *text = [adaptor getText:node];
+        self.token = [CommonToken newToken:type Text:text];
+    }
+}
+
+- (NSInteger) unexpectedType
+{
+	if (token) {
+		return token.type;
+    } else if (node) {
+        return [node type];
+	} else {
+		return c;
+	}
+}
+
+- (id<Token>)getUnexpectedToken
+{
+    return token;
+}
+
+- (NSString *) description
+{
+	//NSMutableString *desc = [[NSMutableString alloc] initWithString:NSStringFromClass([self class])];
+	NSMutableString *desc = [NSMutableString stringWithString:[self className]];
+	if (token) {
+		[desc appendFormat:@" token:%@", token];
+	} else if (node) {
+		[desc appendFormat:@" node:%@", node];
+	} else {
+		[desc appendFormat:@" char:%c", c];
+	}
+	[desc appendFormat:@" line:%d position:%d", line, charPositionInLine];
+	return desc;
+}
+
+//---------------------------------------------------------- 
+//  input 
+//---------------------------------------------------------- 
+- (id<IntStream>) getStream
+{
+    return input; 
+}
+
+- (void) setStream: (id<IntStream>) aStream
+{
+    if ( input != aStream ) {
+        if ( input ) [input release];
+        if ( aStream ) [aStream retain];
+        input = aStream;
+    }
+}
+
+//---------------------------------------------------------- 
+//  token 
+//---------------------------------------------------------- 
+- (id<Token>) getToken
+{
+    return token; 
+}
+
+- (void) setToken: (id<Token>) aToken
+{
+    if (token != aToken) {
+        if ( token ) [token release];
+        if ( aToken ) [aToken retain];
+        token = aToken;
+    }
+}
+
+//---------------------------------------------------------- 
+//  node 
+//---------------------------------------------------------- 
+- (id<BaseTree>) getNode
+{
+    return node; 
+}
+
+- (void) setNode: (id<BaseTree>) aNode
+{
+    if (node != aNode) {
+        if ( node ) [node release];
+        if ( aNode ) [aNode retain];
+        node = aNode;
+    }
+}
+
+- (NSString *)getMessage
+{
+    return @"Fix getMessage in RecognitionException";
+}
+
+- (NSUInteger)charPositionInLine
+{
+    return charPositionInLine;
+}
+
+- (void)setCharPositionInLine:(NSUInteger)aPos
+{
+    charPositionInLine = aPos;
+}
+
+@end
diff --git a/runtime/ObjC/Framework/RecognizerSharedState.h b/runtime/ObjC/Framework/RecognizerSharedState.h
new file mode 100755
index 0000000..72af752
--- /dev/null
+++ b/runtime/ObjC/Framework/RecognizerSharedState.h
@@ -0,0 +1,117 @@
+// [The "BSD licence"]
+// Copyright (c) 2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "Token.h"
+#import "ANTLRBitSet.h"
+#import "RuleStack.h"
+#import "AMutableArray.h"
+
+@interface RecognizerSharedState : NSObject {
+	__strong AMutableArray *following;  // a stack of FOLLOW bitsets used for context sensitive prediction and recovery
+    NSInteger _fsp;                     // Follow stack pointer
+	BOOL errorRecovery;                 // are we recovering?
+	NSInteger lastErrorIndex;
+	BOOL failed;                        // indicate that some match failed
+    NSInteger syntaxErrors;
+	NSInteger backtracking;             // the level of backtracking
+	__strong RuleStack *ruleMemo;	// store previous results of matching rules so we don't have to do it again. Hook in incremental stuff here, too.
+
+	__strong id<Token> token;
+	NSInteger  tokenStartCharIndex;
+	NSUInteger tokenStartLine;
+	NSUInteger tokenStartCharPositionInLine;
+	NSUInteger channel;
+	NSUInteger type;
+	NSString   *text;
+}
+
+@property (retain, getter=getFollowing, setter=setFollowing:) AMutableArray *following;
+@property (assign) NSInteger _fsp;
+@property (assign) BOOL errorRecovery;
+@property (assign) NSInteger lastErrorIndex;
+@property (assign, getter=getFailed, setter=setFailed:) BOOL failed;
+@property (assign) NSInteger syntaxErrors;
+@property (assign, getter=getBacktracking, setter=setBacktracking:) NSInteger backtracking;
+@property (retain, getter=getRuleMemo, setter=setRuleMemo:) RuleStack *ruleMemo;
+@property (copy, getter=getToken, setter=setToken:) id<Token> token;
+@property (getter=type,setter=setType:) NSUInteger type;
+@property (getter=channel,setter=setChannel:) NSUInteger channel;
+@property (getter=getTokenStartLine,setter=setTokenStartLine:) NSUInteger tokenStartLine;
+@property (getter=charPositionInLine,setter=setCharPositionInLine:) NSUInteger tokenStartCharPositionInLine;
+@property (getter=getTokenStartCharIndex,setter=setTokenStartCharIndex:) NSInteger tokenStartCharIndex;
+@property (retain, getter=text, setter=setText:) NSString *text;
+
++ (RecognizerSharedState *) newRecognizerSharedState;
++ (RecognizerSharedState *) newRecognizerSharedStateWithRuleLen:(NSInteger)aLen;
++ (RecognizerSharedState *) newRecognizerSharedState:(RecognizerSharedState *)aState;
+
+- (id) init;
+- (id) initWithRuleLen:(NSInteger)aLen;
+- (id) initWithState:(RecognizerSharedState *)state;
+
+- (id<Token>) getToken;
+- (void) setToken:(id<Token>) theToken;
+
+- (NSUInteger)type;
+- (void) setType:(NSUInteger) theTokenType;
+
+- (NSUInteger)channel;
+- (void) setChannel:(NSUInteger) theChannel;
+
+- (NSUInteger) getTokenStartLine;
+- (void) setTokenStartLine:(NSUInteger) theTokenStartLine;
+
+- (NSUInteger) charPositionInLine;
+- (void) setCharPositionInLine:(NSUInteger) theCharPosition;
+
+- (NSInteger) getTokenStartCharIndex;
+- (void) setTokenStartCharIndex:(NSInteger) theTokenStartCharIndex;
+
+- (NSString *)text;
+- (void) setText:(NSString *) theText;
+
+
+- (AMutableArray *) getFollowing;
+- (void)setFollowing:(AMutableArray *)aFollow;
+- (RuleStack *) getRuleMemo;
+- (void)setRuleMemo:(RuleStack *)aRuleMemo;
+- (BOOL) isErrorRecovery;
+- (void) setIsErrorRecovery: (BOOL) flag;
+
+- (BOOL) getFailed;
+- (void) setFailed: (BOOL) flag;
+
+- (NSInteger)  getBacktracking;
+- (void) setBacktracking:(NSInteger) value;
+- (void) increaseBacktracking;
+- (void) decreaseBacktracking;
+- (BOOL) isBacktracking;
+
+- (NSInteger) lastErrorIndex;
+- (void) setLastErrorIndex:(NSInteger) value;
+
+@end
diff --git a/runtime/ObjC/Framework/RecognizerSharedState.m b/runtime/ObjC/Framework/RecognizerSharedState.m
new file mode 100755
index 0000000..f964668
--- /dev/null
+++ b/runtime/ObjC/Framework/RecognizerSharedState.m
@@ -0,0 +1,331 @@
+// [The "BSD licence"]
+// Copyright (c) 2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+#import "RecognizerSharedState.h"
+#import "CharStream.h"
+#import "CommonToken.h"
+#import "MismatchedTokenException.h"
+#import "MismatchedRangeException.h"
+
+@implementation RecognizerSharedState
+
+@synthesize following;
+@synthesize _fsp;
+@synthesize errorRecovery;
+@synthesize lastErrorIndex;
+@synthesize failed;
+@synthesize syntaxErrors;
+@synthesize backtracking;
+@synthesize ruleMemo;
+@synthesize token;
+@synthesize type;
+@synthesize channel;
+@synthesize tokenStartLine;
+@synthesize tokenStartCharPositionInLine;
+@synthesize tokenStartCharIndex;
+@synthesize text;
+
++ (RecognizerSharedState *) newRecognizerSharedState
+{
+    return [[[RecognizerSharedState alloc] init] retain];
+}
+
++ (RecognizerSharedState *) newRecognizerSharedStateWithRuleLen:(NSInteger)aLen
+{
+    return [[[RecognizerSharedState alloc] initWithRuleLen:aLen] retain];
+}
+
++ (RecognizerSharedState *) newRecognizerSharedState:(RecognizerSharedState *)aState
+{
+    return [[[RecognizerSharedState alloc] initWithState:aState] retain];
+}
+
+- (id) init
+{
+    HashRule *aHashRule;
+	if ((self = [super init]) != nil ) {
+        following = [[AMutableArray arrayWithCapacity:10] retain];
+        _fsp = -1;
+        errorRecovery = NO;			// are we recovering?
+        lastErrorIndex = -1;
+        failed = NO;				// indicate that some match failed
+        syntaxErrors = 0;
+        backtracking = 0;			// the level of backtracking
+        tokenStartCharIndex = -1;
+        tokenStartLine = 0;
+        int cnt = 200;
+		ruleMemo = [[RuleStack newRuleStack:cnt] retain];
+        for (int i = 0; i < cnt; i++ ) {
+            aHashRule = [[HashRule newHashRuleWithLen:17] retain];
+            [ruleMemo addObject:aHashRule];
+        }
+#ifdef DONTUSEYET
+        token = state.token;
+        tokenStartCharIndex = state.tokenStartCharIndex;
+        tokenStartCharPositionInLine = state.tokenStartCharPositionInLine;
+        channel = state.channel;
+        type = state.type;
+        text = state.text;
+#endif
+	}
+	return self;
+}
+
+- (id) initWithRuleLen:(NSInteger)aLen
+{
+    HashRule *aHashRule;
+	if ((self = [super init]) != nil ) {
+        following = [[AMutableArray arrayWithCapacity:10] retain];
+        _fsp = -1;
+        errorRecovery = NO;			// are we recovering?
+        lastErrorIndex = -1;
+        failed = NO;				// indicate that some match failed
+        syntaxErrors = 0;
+        backtracking = 0;			// the level of backtracking
+        tokenStartCharIndex = -1;
+        tokenStartLine = 0;
+		ruleMemo = [[RuleStack newRuleStack:aLen] retain];
+        for (int i = 0; i < aLen; i++ ) {
+            aHashRule = [[HashRule newHashRuleWithLen:17] retain];
+            [ruleMemo addObject:aHashRule];
+        }
+#ifdef DONTUSEYET
+        token = state.token;
+        tokenStartCharIndex = state.tokenStartCharIndex;
+        tokenStartCharPositionInLine = state.tokenStartCharPositionInLine;
+        channel = state.channel;
+        type = state.type;
+        text = state.text;
+#endif
+	}
+	return self;
+}
+
+- (id) initWithState:(RecognizerSharedState *)aState
+{
+    HashRule *aHashRule;
+    if ( [following count] < [aState.following count] ) {
+        //        following = new BitSet[state.following.size];
+    }
+    [following setArray:aState.following];
+    _fsp = aState._fsp;
+    errorRecovery = aState.errorRecovery;
+    lastErrorIndex = aState.lastErrorIndex;
+    failed = aState.failed;
+    syntaxErrors = aState.syntaxErrors;
+    backtracking = aState.backtracking;
+    if ( aState.ruleMemo == nil ) {
+        int cnt = 200;
+        ruleMemo = [[RuleStack newRuleStack:cnt] retain];
+        for (int i = 0; i < cnt; i++ ) {
+            aHashRule = [[HashRule newHashRuleWithLen:17] retain];
+            [ruleMemo addObject:aHashRule];
+        }
+    }
+    else {
+        ruleMemo = aState.ruleMemo;
+        if ( [ruleMemo count] == 0 ) {
+            int cnt = [ruleMemo length];
+            for (int i = 0; i < cnt; i++ ) {
+                [ruleMemo addObject:[[HashRule newHashRuleWithLen:17] retain]];
+            }
+        }
+        else {
+            [ruleMemo addObjectsFromArray:aState.ruleMemo];
+        }
+    }
+    token = aState.token;
+    tokenStartCharIndex = aState.tokenStartCharIndex;
+    tokenStartCharPositionInLine = aState.tokenStartCharPositionInLine;
+    tokenStartLine = aState.tokenStartLine;
+    channel = aState.channel;
+    type = aState.type;
+    text = aState.text;
+    return( self );
+}
+
+- (void) dealloc
+{
+#ifdef DEBUG_DEALLOC
+    NSLog( @"called dealloc in RecognizerSharedState" );
+#endif
+    if ( token ) [token release];
+	if ( following ) [following release];
+	if ( ruleMemo ) [ruleMemo release];
+	[super dealloc];
+}
+
+// token stuff
+#pragma mark Tokens
+
+- (id<Token>)getToken
+{
+    return token; 
+}
+
+- (void) setToken: (id<Token>) aToken
+{
+    if (token != aToken) {
+        [aToken retain];
+        if ( token ) [token release];
+        token = aToken;
+    }
+}
+
+- (NSUInteger)channel
+{
+    return channel;
+}
+
+- (void) setChannel:(NSUInteger) theChannel
+{
+    channel = theChannel;
+}
+
+- (NSUInteger) getTokenStartLine
+{
+    return tokenStartLine;
+}
+
+- (void) setTokenStartLine:(NSUInteger) theTokenStartLine
+{
+    tokenStartLine = theTokenStartLine;
+}
+
+- (NSUInteger) charPositionInLine
+{
+    return tokenStartCharPositionInLine;
+}
+
+- (void) setCharPositionInLine:(NSUInteger) theCharPosition
+{
+    tokenStartCharPositionInLine = theCharPosition;
+}
+
+- (NSInteger) getTokenStartCharIndex;
+{
+    return tokenStartCharIndex;
+}
+
+- (void) setTokenStartCharIndex:(NSInteger) theTokenStartCharIndex
+{
+    tokenStartCharIndex = theTokenStartCharIndex;
+}
+
+// error handling
+- (void) reportError:(RecognitionException *)e
+{
+	NSLog(@"%@", e.name);
+}
+
+- (AMutableArray *) getFollowing
+{
+	return following;
+}
+
+- (void)setFollowing:(AMutableArray *)aFollow
+{
+    if ( following != aFollow ) {
+        if ( following ) [following release];
+        [aFollow retain];
+    }
+    following = aFollow;
+}
+
+- (RuleStack *) getRuleMemo
+{
+	return ruleMemo;
+}
+
+- (void)setRuleMemo:(RuleStack *)aRuleMemo
+{
+    if ( ruleMemo != aRuleMemo ) {
+        if ( ruleMemo ) [ruleMemo release];
+        [aRuleMemo retain];
+    }
+    ruleMemo = aRuleMemo;
+}
+
+- (BOOL) isErrorRecovery
+{
+	return errorRecovery;
+}
+
+- (void) setIsErrorRecovery: (BOOL) flag
+{
+	errorRecovery = flag;
+}
+
+
+- (BOOL) getFailed
+{
+	return failed;
+}
+
+- (void) setFailed:(BOOL)flag
+{
+	failed = flag;
+}
+
+
+- (NSInteger) backtracking
+{
+	return backtracking;
+}
+
+- (void) setBacktracking:(NSInteger) value
+{
+	backtracking = value;
+}
+
+- (void) increaseBacktracking
+{
+	backtracking++;
+}
+
+- (void) decreaseBacktracking
+{
+	backtracking--;
+}
+
+- (BOOL) isBacktracking
+{
+	return backtracking > 0;
+}
+
+
+- (NSInteger) lastErrorIndex
+{
+    return lastErrorIndex;
+}
+
+- (void) setLastErrorIndex:(NSInteger) value
+{
+	lastErrorIndex = value;
+}
+
+
+@end
diff --git a/runtime/ObjC/Framework/RewriteRuleElementStream.h b/runtime/ObjC/Framework/RewriteRuleElementStream.h
new file mode 100644
index 0000000..367b4c0
--- /dev/null
+++ b/runtime/ObjC/Framework/RewriteRuleElementStream.h
@@ -0,0 +1,82 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "TreeAdaptor.h"
+
+// TODO: this should be separated into stream and enumerator classes
+@interface RewriteRuleElementStream : NSObject {
+    NSInteger cursor;
+    BOOL dirty;        ///< indicates whether the stream should return copies of its elements, set to true after a call to -reset
+    BOOL isSingleElement;
+    id singleElement;
+    __strong AMutableArray *elements;
+    
+    __strong NSString *elementDescription;
+    __strong id<TreeAdaptor> treeAdaptor;
+}
+
+@property (assign) NSInteger cursor;
+@property (assign) BOOL dirty;
+@property (assign) BOOL isSingleElement;
+@property (assign) id singleElement;
+@property (assign) AMutableArray *elements;
+@property (assign) NSString *elementDescription;
+@property (retain) id<TreeAdaptor> treeAdaptor;
+
++ (RewriteRuleElementStream*) newRewriteRuleElementStream:(id<TreeAdaptor>)aTreeAdaptor
+                                                        description:(NSString *)anElementDescription;
++ (RewriteRuleElementStream*) newRewriteRuleElementStream:(id<TreeAdaptor>)aTreeAdaptor
+                                                        description:(NSString *)anElementDescription
+                                                            element:(id)anElement;
++ (RewriteRuleElementStream*) newRewriteRuleElementStream:(id<TreeAdaptor>)aTreeAdaptor
+                                                        description:(NSString *)anElementDescription
+                                                           elements:(NSArray *)theElements;
+
+- (id) initWithTreeAdaptor:(id<TreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription;
+- (id) initWithTreeAdaptor:(id<TreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription element:(id)anElement;
+- (id) initWithTreeAdaptor:(id<TreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription elements:(NSArray *)theElements;
+
+- (void)reset;
+
+- (id<TreeAdaptor>) getTreeAdaptor;
+- (void) setTreeAdaptor:(id<TreeAdaptor>)aTreeAdaptor;
+
+- (void) addElement:(id)anElement;
+- (NSInteger) size;
+ 
+- (BOOL) hasNext;
+- (id<BaseTree>) nextTree;
+- (id<BaseTree>) _next;       // internal: TODO: redesign if necessary. maybe delegate
+
+- (id) copyElement:(id)element;
+- (id) toTree:(id)element;
+
+- (NSString *) getDescription;
+- (void) setDescription:(NSString *)description;
+
+@end
+
diff --git a/runtime/ObjC/Framework/RewriteRuleElementStream.m b/runtime/ObjC/Framework/RewriteRuleElementStream.m
new file mode 100644
index 0000000..66a4004
--- /dev/null
+++ b/runtime/ObjC/Framework/RewriteRuleElementStream.m
@@ -0,0 +1,258 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+#import "RewriteRuleElementStream.h"
+
+@implementation RewriteRuleElementStream
+
+@synthesize cursor;
+@synthesize dirty;
+@synthesize isSingleElement;
+@synthesize singleElement;
+@synthesize elements;
+@synthesize elementDescription;
+@synthesize treeAdaptor;
+
++ (RewriteRuleElementStream *) newRewriteRuleElementStream:(id<TreeAdaptor>)aTreeAdaptor
+                                                         description:(NSString *)anElementDescription
+{
+    return [[RewriteRuleElementStream alloc] initWithTreeAdaptor:aTreeAdaptor
+                                                          description:anElementDescription];
+}
+
++ (RewriteRuleElementStream *) newRewriteRuleElementStream:(id<TreeAdaptor>)aTreeAdaptor
+                                                         description:(NSString *)anElementDescription
+                                                             element:(id)anElement
+{
+    return [[RewriteRuleElementStream alloc] initWithTreeAdaptor:aTreeAdaptor
+                                                          description:anElementDescription
+                                                              element:anElement];
+}
+
++ (RewriteRuleElementStream *) newRewriteRuleElementStream:(id<TreeAdaptor>)aTreeAdaptor
+                                                         description:(NSString *)anElementDescription
+                                                            elements:(NSArray *)theElements;
+{
+    return [[RewriteRuleElementStream alloc] initWithTreeAdaptor:aTreeAdaptor
+                                                          description:anElementDescription
+                                                             elements:theElements];
+}
+
+- (id) initWithTreeAdaptor:(id<TreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription
+{
+    if ((self = [super init]) != nil) {
+        cursor = 0;
+        dirty = NO;
+        [self setDescription:anElementDescription];
+        [self setTreeAdaptor:aTreeAdaptor];
+        dirty = NO;
+        isSingleElement = YES;
+        singleElement = nil;
+        elements = nil;
+    }
+    return self;
+}
+
+- (id) initWithTreeAdaptor:(id<TreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription element:(id)anElement
+{
+    if ((self = [super init]) != nil) {
+        cursor = 0;
+        dirty = NO;
+        [self setDescription:anElementDescription];
+        [self setTreeAdaptor:aTreeAdaptor];
+        dirty = NO;
+        isSingleElement = YES;
+        singleElement = nil;
+        elements = nil;
+        [self addElement:anElement];
+    }
+    return self;
+}
+
+- (id) initWithTreeAdaptor:(id<TreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription elements:(NSArray *)theElements
+{
+    self = [super init];
+    if (self) {
+        cursor = 0;
+        dirty = NO;
+        [self setDescription:anElementDescription];
+        [self setTreeAdaptor:aTreeAdaptor];
+        dirty = NO;
+        singleElement = nil;
+        isSingleElement = NO;
+        elements = [[AMutableArray arrayWithArray:theElements] retain];
+    }
+    return self;
+}
+
+- (void) dealloc
+{
+#ifdef DEBUG_DEALLOC
+    NSLog( @"called dealloc in RewriteRuleElementStream" );
+#endif
+    if ( singleElement && isSingleElement ) [singleElement release];
+    else if ( elements && !isSingleElement ) [elements release];
+    [self setDescription:nil];
+    [self setTreeAdaptor:nil];
+    [super dealloc];
+}
+
+- (void)reset
+{
+    cursor = 0;
+    dirty = YES;
+}
+
+- (id<TreeAdaptor>) getTreeAdaptor
+{
+    return treeAdaptor;
+}
+
+- (void) setTreeAdaptor:(id<TreeAdaptor>)aTreeAdaptor
+{
+    if (treeAdaptor != aTreeAdaptor) {
+        if ( treeAdaptor ) [treeAdaptor release];
+        treeAdaptor = aTreeAdaptor;
+        [treeAdaptor retain];
+    }
+}
+
+- (void) addElement: (id)anElement
+{
+    if (anElement == nil)
+        return;
+    if (elements != nil) {
+        [elements addObject:anElement];
+        return;
+        }
+    if (singleElement == nil) {
+        singleElement = anElement;
+        singleElement = [anElement retain];
+        return;
+    }
+    isSingleElement = NO;
+    elements = [[AMutableArray arrayWithCapacity:5] retain];
+    [elements addObject:singleElement];
+    singleElement = nil;  // balance previous retain in initializer/addElement
+    [elements addObject:anElement];
+}
+
+- (void) setElement: (id)anElement
+{
+    if (anElement == nil)
+        return;
+    if (elements != nil) {
+        [elements addObject:anElement];
+        return;
+        }
+    if (singleElement == nil) {
+        singleElement = anElement;
+        singleElement = [anElement retain];
+        return;
+    }
+    isSingleElement = NO;
+    elements = [[AMutableArray arrayWithCapacity:5] retain];
+    [elements addObject:singleElement];
+    singleElement = nil;  // balance previous retain in initializer/addElement
+    [elements addObject:anElement];
+}
+
+- (id<BaseTree>) nextTree
+{
+    NSInteger n = [self size];
+    if ( dirty && (cursor >= 0 && n == 1)) {
+        // if out of elements and size is 1, dup
+        id element = [self _next];
+        return [self copyElement:element];
+    }
+    // test size above then fetch
+    id element = [self _next];
+    return element;
+}
+
+- (id) _next       // internal: TODO: redesign if necessary. maybe delegate
+{
+    NSInteger n = [self size];
+    if (n == 0) {
+        @throw [NSException exceptionWithName:@"RewriteEmptyStreamException" reason:nil userInfo:nil];// TODO: fill in real exception
+    }
+    if ( cursor >= n ) {
+        if ( n == 1 ) {
+            return [self toTree:singleElement]; // will be dup'ed in -next
+        }
+        @throw [NSException exceptionWithName:@"RewriteCardinalityException" reason:nil userInfo:nil];// TODO: fill in real exception
+    }
+    if (singleElement != nil) {
+        cursor++;
+        return [self toTree:singleElement];
+    }
+    id el = [elements objectAtIndex:cursor];
+    cursor++;
+    return [self toTree:el];
+}
+
+- (BOOL) hasNext
+{
+    return (singleElement != nil && cursor < 1) ||
+            (elements != nil && cursor < [elements count]);
+}
+
+- (NSInteger) size
+{
+    NSInteger n = 0;
+    if (singleElement != nil)
+        n = 1;
+    if (elements != nil)
+        return [elements count];
+    return n;
+}
+
+- (id) copyElement:(id)element
+{
+    [self doesNotRecognizeSelector:_cmd];   // subclass responsibility
+    return nil;
+}
+
+- (id<BaseTree>) toTree:(id)element
+{
+    return element;
+}
+
+- (NSString *) getDescription
+{
+    return elementDescription;
+}
+
+- (void) setDescription:(NSString *) description
+{
+    if ( description != nil && description != elementDescription ) {
+        if (elementDescription != nil) [elementDescription release];
+        elementDescription = [NSString stringWithString:description];
+        [elementDescription retain];
+    }
+}
+
+@end
diff --git a/runtime/ObjC/Framework/RewriteRuleNodeStream.h b/runtime/ObjC/Framework/RewriteRuleNodeStream.h
new file mode 100755
index 0000000..5792530
--- /dev/null
+++ b/runtime/ObjC/Framework/RewriteRuleNodeStream.h
@@ -0,0 +1,46 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "RewriteRuleElementStream.h"
+
+@interface RewriteRuleNodeStream : RewriteRuleElementStream {
+
+}
+
++ (RewriteRuleNodeStream *) newRewriteRuleNodeStream:(id<TreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription;
++ (RewriteRuleNodeStream *) newRewriteRuleNodeStream:(id<TreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription element:(id)anElement;
++ (RewriteRuleNodeStream *) newRewriteRuleNode:(id<TreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription elements:(NSArray *)theElements;
+
+- (id) initWithTreeAdaptor:(id<TreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription;
+- (id) initWithTreeAdaptor:(id<TreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription element:(id)anElement;
+- (id) initWithTreeAdaptor:(id<TreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription elements:(NSArray *)theElements;
+
+- (id) nextNode;
+- (id) toTree:(id<BaseTree>)element;
+- (id) dup:(id)element;
+
+@end
diff --git a/runtime/ObjC/Framework/RewriteRuleNodeStream.m b/runtime/ObjC/Framework/RewriteRuleNodeStream.m
new file mode 100755
index 0000000..9db28ee
--- /dev/null
+++ b/runtime/ObjC/Framework/RewriteRuleNodeStream.m
@@ -0,0 +1,74 @@
+//
+//  RewriteRuleNodeStream.m
+//  ANTLR
+//
+//  Created by Kay Röpke on 7/16/07.
+//  Copyright 2007 classDump. All rights reserved.
+//
+
+#import "RewriteRuleNodeStream.h"
+#import "RuntimeException.h"
+
+@implementation RewriteRuleNodeStream
+
++ (RewriteRuleNodeStream*) newRewriteRuleNodeStream:(id<TreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription;
+{
+    return [[RewriteRuleNodeStream alloc] initWithTreeAdaptor:aTreeAdaptor description:anElementDescription];
+}
+
++ (RewriteRuleNodeStream*) newRewriteRuleNodeStream:(id<TreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription element:(id)anElement;
+{
+    return [[RewriteRuleNodeStream alloc] initWithTreeAdaptor:aTreeAdaptor description:anElementDescription element:anElement];
+}
+
++ (RewriteRuleNodeStream*) newRewriteRuleNode:(id<TreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription elements:(NSArray *)theElements;
+{
+    return [[RewriteRuleNodeStream alloc] initWithTreeAdaptor:aTreeAdaptor description:anElementDescription elements:theElements];
+}
+
+- (id) initWithTreeAdaptor:(id<TreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription
+{
+    if ((self = [super initWithTreeAdaptor:aTreeAdaptor description:anElementDescription]) != nil) {
+        dirty = NO;
+        isSingleElement = YES;
+    }
+    return self;
+}
+
+- (id) initWithTreeAdaptor:(id<TreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription element:(id)anElement
+{
+    if ((self = [super initWithTreeAdaptor:aTreeAdaptor description:anElementDescription element:anElement]) != nil) {
+        dirty = NO;
+    }
+    return self;
+}
+
+- (id) initWithTreeAdaptor:(id<TreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription elements:(NSArray *)theElements
+{
+    if ((self = [super init]) != nil) {
+        dirty = NO;
+    }
+    return self;
+}
+
+
+- (id) nextNode
+{
+    if (dirty || (cursor >= [self size] && [self size] == 1))
+        return [treeAdaptor dupNode:[self _next]];
+    else 
+        return [self _next];
+}
+
+- (id<BaseTree>) toTree:(id<BaseTree>)element
+{
+    return [treeAdaptor dupNode:element];
+}
+
+- (id) dup:(id)element
+{
+    return [treeAdaptor dupTree:element];
+    @throw [RuntimeException newException:@"UnsupportedOperationException" reason:@"dup can't be called for a node stream."];
+}
+
+@end
diff --git a/runtime/ObjC/Framework/RewriteRuleSubtreeStream.h b/runtime/ObjC/Framework/RewriteRuleSubtreeStream.h
new file mode 100644
index 0000000..81ccd07
--- /dev/null
+++ b/runtime/ObjC/Framework/RewriteRuleSubtreeStream.h
@@ -0,0 +1,50 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "RewriteRuleElementStream.h"
+
+@interface RewriteRuleSubtreeStream : RewriteRuleElementStream {
+
+}
+
++ (RewriteRuleSubtreeStream *) newRewriteRuleSubtreeStream:(id<TreeAdaptor>)aTreeAdaptor
+                                                         description:(NSString *)anElementDescription;
++ (RewriteRuleSubtreeStream *) newRewriteRuleSubtreeStream:(id<TreeAdaptor>)aTreeAdaptor
+                                                         description:(NSString *)anElementDescription
+                                                             element:(id)anElement;
++ (RewriteRuleSubtreeStream *) newRewriteRuleSubtreeStream:(id<TreeAdaptor>)aTreeAdaptor
+                                                         description:(NSString *)anElementDescription
+                                                            elements:(NSArray *)theElements;
+
+- (id) initWithTreeAdaptor:(id<TreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription;
+- (id) initWithTreeAdaptor:(id<TreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription element:(id)anElement;
+- (id) initWithTreeAdaptor:(id<TreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription elements:(NSArray *)theElements;
+
+- (id) nextNode;
+- (id) dup:(id)element;
+
+@end
diff --git a/runtime/ObjC/Framework/RewriteRuleSubtreeStream.m b/runtime/ObjC/Framework/RewriteRuleSubtreeStream.m
new file mode 100644
index 0000000..6100b91
--- /dev/null
+++ b/runtime/ObjC/Framework/RewriteRuleSubtreeStream.m
@@ -0,0 +1,101 @@
+//
+//  RewriteRuleSubtreeStream.m
+//  ANTLR
+//
+//  Created by Kay Röpke on 7/16/07.
+// [The "BSD licence"]
+// Copyright (c) 2007 Kay Röpke 2010 Alan Condit
+// 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.
+
+#import "RewriteRuleSubtreeStream.h"
+
+
+@implementation RewriteRuleSubtreeStream
+
++ (RewriteRuleSubtreeStream*) newRewriteRuleSubtreeStream:(id<TreeAdaptor>)aTreeAdaptor
+                                                        description:(NSString *)anElementDescription;
+{
+    return [[RewriteRuleSubtreeStream alloc] initWithTreeAdaptor:aTreeAdaptor
+                                                          description:anElementDescription];
+}
+
++ (RewriteRuleSubtreeStream*) newRewriteRuleSubtreeStream:(id<TreeAdaptor>)aTreeAdaptor
+                                                        description:(NSString *)anElementDescription
+                                                            element:(id)anElement;
+{
+    return [[RewriteRuleSubtreeStream alloc] initWithTreeAdaptor:aTreeAdaptor
+                                                          description:anElementDescription
+                                                              element:anElement];
+}
+
++ (RewriteRuleSubtreeStream*) newRewriteRuleSubtreeStream:(id<TreeAdaptor>)aTreeAdaptor
+                                                        description:(NSString *)anElementDescription
+                                                           elements:(NSArray *)theElements;
+{
+    return [[RewriteRuleSubtreeStream alloc] initWithTreeAdaptor:aTreeAdaptor
+                                                          description:anElementDescription
+                                                             elements:theElements];
+}
+
+- (id) initWithTreeAdaptor:(id<TreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription
+{
+    if ((self = [super initWithTreeAdaptor:aTreeAdaptor description:anElementDescription]) != nil) {
+        dirty = NO;
+        isSingleElement = YES;
+    }
+    return self;
+}
+
+- (id) initWithTreeAdaptor:(id<TreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription element:(id)anElement
+{
+    if ((self = [super initWithTreeAdaptor:aTreeAdaptor description:anElementDescription element:anElement]) != nil) {
+        dirty = NO;
+    }
+    return self;
+}
+
+- (id) initWithTreeAdaptor:(id<TreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription elements:(NSArray *)theElements
+{
+    if ((self = [super initWithTreeAdaptor:aTreeAdaptor description:anElementDescription elements:theElements]) != nil) {
+        dirty = NO;
+    }
+    return self;
+}
+
+
+- (id) nextNode
+{
+    if (dirty || (cursor >= [self size] && [self size] == 1))
+        return [treeAdaptor dupNode:[self _next]];
+    else 
+        return [self _next];
+}
+
+- (id) dup:(id)element
+{
+    return [treeAdaptor dupTree:element];
+}
+
+@end
diff --git a/runtime/ObjC/Framework/RewriteRuleTokenStream.h b/runtime/ObjC/Framework/RewriteRuleTokenStream.h
new file mode 100644
index 0000000..320b792
--- /dev/null
+++ b/runtime/ObjC/Framework/RewriteRuleTokenStream.h
@@ -0,0 +1,66 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "RewriteRuleElementStream.h"
+
+
+@interface RewriteRuleTokenStream : RewriteRuleElementStream {
+
+}
+
++ (id) newRewriteRuleTokenStream:(id<TreeAdaptor>)anAdaptor
+                          description:(NSString *)elementDescription;
+/** Create a stream with one element */
++ (id) newRewriteRuleTokenStream:(id<TreeAdaptor>)adaptor
+                          description:(NSString *)elementDescription
+                              element:(id) oneElement;
+/** Create a stream, but feed off an existing list */
++ (id) newRewriteRuleTokenStream:(id<TreeAdaptor>)adaptor
+                          description:(NSString *)elementDescription
+                             elements:(AMutableArray *)elements;
+
+- (id) init;
+- (id) initWithTreeAdaptor:(id<TreeAdaptor>)anAdaptor
+               description:(NSString *)aDescription;
+- (id) initWithTreeAdaptor:(id<TreeAdaptor>)anAdaptor 
+               description:(NSString *)aDescription
+                   element:(id)element;
+- (id) initWithTreeAdaptor:(id<TreeAdaptor>)anAdaptor
+               description:(NSString *)aDescription
+                  elements:(AMutableArray *)elements;
+                               
+/** Get next token from stream and make a node for it */
+- (id) nextNode;
+
+- (id) nextToken;
+
+/** Don't convert to a tree unless they explicitly call nextTree.
+ *  This way we can do hetero tree nodes in rewrite.
+ */
+- (id<BaseTree>) toTree:(id<Token>)element;
+
+@end
diff --git a/runtime/ObjC/Framework/RewriteRuleTokenStream.m b/runtime/ObjC/Framework/RewriteRuleTokenStream.m
new file mode 100644
index 0000000..137b457
--- /dev/null
+++ b/runtime/ObjC/Framework/RewriteRuleTokenStream.m
@@ -0,0 +1,128 @@
+//
+//  RewriteRuleTokenStream.m
+//  ANTLR
+//
+//  Created by Kay Röpke on 7/16/07.
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+#import "RewriteRuleTokenStream.h"
+#import "RuntimeException.h"
+#import "HashMap.h"
+#import "MapElement.h"
+
+@implementation RewriteRuleTokenStream
+
++ (id) newRewriteRuleTokenStream:(id<TreeAdaptor>)anAdaptor
+                          description:(NSString *)elementDescription
+{
+    return [[RewriteRuleTokenStream alloc] initWithTreeAdaptor:anAdaptor
+                                                        description:elementDescription];
+}
+
+/** Create a stream with one element */
++ (id) newRewriteRuleTokenStream:(id<TreeAdaptor>)adaptor
+                          description:(NSString *)elementDescription
+                              element:(id) oneElement
+{
+    return [[RewriteRuleTokenStream alloc] initWithTreeAdaptor:adaptor
+                                                        description:elementDescription
+                                                            element:oneElement];
+}
+
+/** Create a stream, but feed off an existing list */
++ (id) newRewriteRuleTokenStream:(id<TreeAdaptor>)adaptor
+                          description:(NSString *)elementDescription
+                             elements:(AMutableArray *)elements
+{
+    return [[RewriteRuleTokenStream alloc] initWithTreeAdaptor:adaptor
+                                                        description:elementDescription
+                                                           elements:elements];
+}
+
+- (id) init
+{
+    if ((self = [super init]) != nil ) {
+    }
+    return self;
+}
+
+- (id) initWithTreeAdaptor:(id<TreeAdaptor>)anAdaptor
+               description:(NSString *)aDescription
+{
+    if ((self = [super initWithTreeAdaptor:anAdaptor
+                               description:aDescription]) != nil ) {
+    }
+    return self;
+}
+
+- (id) initWithTreeAdaptor:(id<TreeAdaptor>)anAdaptor
+               description:(NSString *)aDescription
+                   element:(id)anElement
+{
+    if ((self = [super initWithTreeAdaptor:anAdaptor
+                               description:aDescription
+                                   element:anElement]) != nil ) {
+    }
+    return self;
+}
+
+- (id) initWithTreeAdaptor:(id<TreeAdaptor>)anAdaptor
+               description:(NSString *)aDescription
+                  elements:(AMutableArray *)elementList
+{
+    if ((self = [super initWithTreeAdaptor:anAdaptor
+                               description:aDescription
+                                  elements:elementList]) != nil ) {
+    }
+    return self;
+}
+
+- (id<BaseTree>) nextNode
+{
+    id<Token> t = (id<Token>)[self _next];
+    return [treeAdaptor create:t];
+}
+
+- (id) nextToken
+{
+    return [self _next];
+}
+
+/** Don't convert to a tree unless they explicitly call nextTree.
+ *  This way we can do hetero tree nodes in rewrite.
+ */
+- (id<BaseTree>) toTree:(id<Token>)element
+{
+    return (id<BaseTree>)element;
+}
+
+- (id) copyElement:(id)element
+{
+    @throw [RuntimeException newException:@"copy can't be called for a token stream."];
+}
+
+@end
diff --git a/runtime/ObjC/Framework/RuleMapElement.h b/runtime/ObjC/Framework/RuleMapElement.h
new file mode 100644
index 0000000..415d711
--- /dev/null
+++ b/runtime/ObjC/Framework/RuleMapElement.h
@@ -0,0 +1,55 @@
+//
+//  RuleMapElement.h
+//  ANTLR
+//
+//  Created by Alan Condit on 6/16/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "BaseMapElement.h"
+
+@interface RuleMapElement : BaseMapElement {
+    ACNumber *ruleNum;
+}
+
+@property (retain, getter=getRuleNum, setter=setRuleNum:) ACNumber *ruleNum;
+
++ (RuleMapElement *) newRuleMapElement;
++ (RuleMapElement *) newRuleMapElementWithIndex:(ACNumber *)anIdx;
++ (RuleMapElement *) newRuleMapElementWithIndex:(ACNumber *)anIdx RuleNum:(ACNumber *)aRuleNum;
+- (id) init;
+- (id) initWithAnIndex:(ACNumber *)anIdx;
+- (id) initWithAnIndex:(ACNumber *)anIdx RuleNum:(ACNumber *)aRuleNum;
+
+- (id) copyWithZone:(NSZone *)aZone;
+
+- (ACNumber *)getRuleNum;
+- (void)setRuleNum:(ACNumber *)aRuleNum;
+
+- (NSInteger)size;
+
+@end
diff --git a/runtime/ObjC/Framework/RuleMapElement.m b/runtime/ObjC/Framework/RuleMapElement.m
new file mode 100644
index 0000000..aedb996
--- /dev/null
+++ b/runtime/ObjC/Framework/RuleMapElement.m
@@ -0,0 +1,112 @@
+//
+//  RuleMapElement.m
+//  ANTLR
+//
+//  Created by Alan Condit on 6/16/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import "ACNumber.h"
+#import "RuleMapElement.h"
+
+
+@implementation RuleMapElement
+
+@synthesize ruleNum;
+
++ (RuleMapElement *)newRuleMapElement
+{
+    return [[RuleMapElement alloc] init];
+}
+
++ (RuleMapElement *)newRuleMapElementWithIndex:(ACNumber *)aNumber
+{
+    return [[RuleMapElement alloc] initWithAnIndex:(ACNumber *)aNumber];
+}
+
++ (RuleMapElement *)newRuleMapElementWithIndex:(ACNumber *)aNumber RuleNum:(ACNumber *)aRuleNum
+{
+    return [[RuleMapElement alloc] initWithAnIndex:aNumber RuleNum:aRuleNum];
+}
+
+- (id) init
+{
+    if ((self = [super init]) != nil ) {
+        index = nil;
+        ruleNum = nil;
+    }
+    return (self);
+}
+
+- (id) initWithAnIndex:(ACNumber *)aNumber
+{
+    if ((self = [super initWithAnIndex:aNumber]) != nil ) {
+        ruleNum = nil;
+    }
+    return (self);
+}
+
+- (id) initWithAnIndex:(ACNumber *)aNumber RuleNum:(ACNumber *)aRuleNum
+{
+    if ((self = [super initWithAnIndex:aNumber]) != nil ) {
+        [aRuleNum retain];
+        ruleNum = aRuleNum;
+    }
+    return (self);
+}
+
+- (id) copyWithZone:(NSZone *)aZone
+{
+    RuleMapElement *copy;
+    
+    copy = [super copyWithZone:aZone];
+    copy.ruleNum = ruleNum;
+    return( copy );
+}
+
+- (id)getRuleNum
+{
+    return ruleNum;
+}
+
+- (void)setRuleNum:(id)aRuleNum
+{
+    if ( aRuleNum != ruleNum ) {
+        if ( ruleNum ) [ruleNum release];
+        [aRuleNum retain];
+    }
+    ruleNum = aRuleNum;
+}
+
+- (NSInteger)size
+{
+    NSInteger aSize = 0;
+    if (ruleNum != nil) aSize++;
+    if (index != nil) aSize++;
+    return( aSize );
+}
+
+@end
diff --git a/runtime/ObjC/Framework/RuleMemo.h b/runtime/ObjC/Framework/RuleMemo.h
new file mode 100644
index 0000000..40e6efc
--- /dev/null
+++ b/runtime/ObjC/Framework/RuleMemo.h
@@ -0,0 +1,61 @@
+//
+//  RuleMemo.h
+//  ANTLR
+//
+//  Created by Alan Condit on 6/16/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "ACNumber.h"
+#import "LinkBase.h"
+
+@interface RuleMemo : LinkBase {
+    ACNumber *startIndex;
+    ACNumber *stopIndex;
+}
+
+@property (retain, getter=getStartIndex, setter=setStartIndex:) ACNumber *startIndex;
+@property (retain, getter=getStopIndex, setter=setStopIndex:) ACNumber *stopIndex;
+
++ (RuleMemo *)newRuleMemo;
++ (RuleMemo *)newRuleMemoWithStartIndex:(ACNumber *)aStartIndex StopIndex:(ACNumber *)aStopIndex;
+
+- (id) init;
+- (id) initWithStartIndex:(ACNumber *)aStartIndex StopIndex:(ACNumber *)aStopIndex;
+
+- (NSInteger)count;
+- (NSInteger)size;
+
+- (RuleMemo *)getRuleWithStartIndex:(NSInteger)aStartIndex;
+- (ACNumber *)getStartIndex:(NSInteger)aStartIndex;
+- (ACNumber *)getStopIndex:(NSInteger)aStartIndex;
+- (ACNumber *)getStartIndex;
+- (void)setStartIndex:(ACNumber *)aStartIndex;
+- (ACNumber *)getStopIndex;
+- (void)setStopIndex:(ACNumber *)aStopIndex;
+
+@end
diff --git a/runtime/ObjC/Framework/RuleMemo.m b/runtime/ObjC/Framework/RuleMemo.m
new file mode 100644
index 0000000..7665158
--- /dev/null
+++ b/runtime/ObjC/Framework/RuleMemo.m
@@ -0,0 +1,158 @@
+//
+//  RuleMemo.m
+//  ANTLR
+//
+//  Created by Alan Condit on 6/16/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import "RuleMemo.h"
+
+
+@implementation RuleMemo
+
+@synthesize startIndex;
+@synthesize stopIndex;
+
++ (RuleMemo *)newRuleMemo
+{
+    return [[RuleMemo alloc] init];
+}
+
++ (RuleMemo *)newRuleMemoWithStartIndex:(ACNumber *)anIndex StopIndex:(ACNumber *)aStopIndex
+{
+    return [[RuleMemo alloc] initWithStartIndex:anIndex StopIndex:aStopIndex];
+}
+
+- (id) init
+{
+    if ((self = [super init]) != nil ) {
+        startIndex = nil;
+        stopIndex = nil;
+    }
+    return (self);
+}
+
+- (id) initWithStartIndex:(ACNumber *)aStartIndex StopIndex:(ACNumber *)aStopIndex
+{
+    if ((self = [super init]) != nil ) {
+        [aStartIndex retain];
+        startIndex = aStartIndex;
+        [aStopIndex retain];
+        stopIndex = aStopIndex;
+    }
+    return (self);
+}
+
+- (id) copyWithZone:(NSZone *)aZone
+{
+    RuleMemo *copy;
+    
+    copy = [super copyWithZone:aZone];
+    copy.startIndex = startIndex;
+    copy.stopIndex = stopIndex;
+    return( copy );
+}
+
+- (NSInteger)count
+{
+    NSInteger aCnt = 0;
+    
+    if (startIndex != nil) aCnt++;
+    if (stopIndex != nil) aCnt++;
+    return aCnt;
+}
+
+- (NSInteger) size
+{
+    return (2 * sizeof(id));
+}
+
+- (RuleMemo *)getRuleWithStartIndex:(NSInteger)aStartIndex
+{
+    RuleMemo *aMatchMemo = self;
+    do {
+        if (aStartIndex == [aMatchMemo.startIndex integerValue] ) {
+            return aMatchMemo;
+        }
+        aMatchMemo = aMatchMemo.fNext;
+    } while ( aMatchMemo != nil );
+    return nil;
+}
+
+- (ACNumber *)getStartIndex:(NSInteger)aStartIndex
+{
+    RuleMemo *aMatchMemo = self;
+    do {
+        if (aStartIndex == [aMatchMemo.startIndex integerValue] ) {
+            return aMatchMemo.stopIndex;
+        }
+        aMatchMemo = aMatchMemo.fNext;
+    } while ( aMatchMemo != nil );
+    return nil;
+}
+
+- (ACNumber *)getStopIndex:(NSInteger)aStartIndex
+{
+    RuleMemo *aMatchMemo = self;
+    do {
+        if (aStartIndex == [aMatchMemo.startIndex integerValue] ) {
+            return aMatchMemo.stopIndex;
+        }
+        aMatchMemo = aMatchMemo.fNext;
+    } while ( aMatchMemo != nil );
+    return nil;
+}
+
+- (ACNumber *)getStartIndex;
+{
+    return startIndex;
+}
+
+- (void)setStartIndex:(ACNumber *)aStartIndex
+{
+    if ( aStartIndex != startIndex ) {
+        if ( startIndex ) [startIndex release];
+        [aStartIndex retain];
+    }
+    startIndex = aStartIndex;
+}
+
+- (ACNumber *)getStopIndex;
+{
+    return stopIndex;
+}
+
+- (void)setStopIndex:(ACNumber *)aStopIndex
+{
+    if ( aStopIndex != stopIndex ) {
+        if ( stopIndex ) [stopIndex release];
+        [aStopIndex retain];
+    }
+    stopIndex = aStopIndex;
+}
+
+@end
diff --git a/runtime/ObjC/Framework/RuleReturnScope.h b/runtime/ObjC/Framework/RuleReturnScope.h
new file mode 100644
index 0000000..163107d
--- /dev/null
+++ b/runtime/ObjC/Framework/RuleReturnScope.h
@@ -0,0 +1,55 @@
+//
+//  RuleReturnScope.h
+//  ANTLR
+//
+//  Created by Alan Condit on 6/17/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "Token.h"
+
+@interface RuleReturnScope : NSObject <NSCopying> {
+
+}
+
+/** Return the start token or tree */
+- (id<Token>) getStart;
+
+/** Return the stop token or tree */
+- (id<Token>) getStop;
+
+/** Has a value potentially if output=AST; */
+- (id) getTree;
+
+/** Has a value potentially if output=template; Don't use StringTemplate
+ *  type as it then causes a dependency with ST lib.
+ */
+- (id) getTemplate;
+
+- (id) copyWithZone:(NSZone *)theZone;
+
+@end
diff --git a/runtime/ObjC/Framework/RuleReturnScope.m b/runtime/ObjC/Framework/RuleReturnScope.m
new file mode 100644
index 0000000..1271bc1
--- /dev/null
+++ b/runtime/ObjC/Framework/RuleReturnScope.m
@@ -0,0 +1,71 @@
+//
+//  RuleReturnScope.m
+//  ANTLR
+//
+//  Created by Alan Condit on 6/17/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import "RuleReturnScope.h"
+
+
+@implementation RuleReturnScope
+
+/** Return the start token or tree */
+- (id) getStart
+{
+    return nil;
+}
+
+/** Return the stop token or tree */
+- (id) getStop
+{
+    return nil;
+}
+
+/** Has a value potentially if output=AST; */
+- (id) getTree
+{
+    return nil;
+}
+
+/** Has a value potentially if output=template; Don't use StringTemplate
+ *  type as it then causes a dependency with ST lib.
+ */
+- (id) getTemplate
+{
+    return nil;
+}
+
+// create a copy, including the text if available
+// the input stream is *not* copied!
+- (id) copyWithZone:(NSZone *)theZone
+{
+    RuleReturnScope *copy = [[[self class] allocWithZone:theZone] init];
+    return copy;
+}
+
+@end
diff --git a/runtime/ObjC/Framework/RuleStack.h b/runtime/ObjC/Framework/RuleStack.h
new file mode 100644
index 0000000..a0f6235
--- /dev/null
+++ b/runtime/ObjC/Framework/RuleStack.h
@@ -0,0 +1,63 @@
+//
+//  RuleStack.h
+//  ANTLR
+//
+//  Created by Alan Condit on 6/9/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "BaseStack.h"
+#import "HashRule.h"
+
+//#define GLOBAL_SCOPE       0
+//#define LOCAL_SCOPE        1
+#define HASHSIZE         101
+#define HBUFSIZE      0x2000
+
+@interface RuleStack : BaseStack {
+}
+
+// Contruction/Destruction
++(RuleStack *)newRuleStack;
++(RuleStack *)newRuleStack:(NSInteger)cnt;
+-(id)init;
+-(id)initWithLen:(NSInteger)cnt;
+-(void)dealloc;
+
+// Instance Methods
+- (id) copyWithZone:(NSZone *)aZone;
+/* clear -- reinitialize the maplist array */
+
+- (NSInteger)count;
+- (NSInteger)size;
+
+- (HashRule *) pop;
+
+- (void) insertObject:(HashRule *)aHashRule atIndex:(NSInteger)idx;
+- (HashRule *)objectAtIndex:(NSInteger)idx;
+- (void)putHashRuleAtRuleIndex:(NSInteger)aRuleIndex StartIndex:(NSInteger)aStartIndex StopIndex:(NSInteger)aStopIndex;
+@end
diff --git a/runtime/ObjC/Framework/RuleStack.m b/runtime/ObjC/Framework/RuleStack.m
new file mode 100644
index 0000000..52c3889
--- /dev/null
+++ b/runtime/ObjC/Framework/RuleStack.m
@@ -0,0 +1,152 @@
+//
+//  RuleStack.m
+//  ANTLR
+//
+//  Created by Alan Condit on 6/9/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#define SUCCESS (0)
+#define FAILURE (-1)
+
+extern NSInteger debug;
+
+#import "RuleStack.h"
+#import "Tree.h"
+
+/*
+ * Start of RuleStack
+ */
+@implementation RuleStack
+
++ (RuleStack *)newRuleStack
+{
+    return [[RuleStack alloc] init];
+}
+
++ (RuleStack *)newRuleStack:(NSInteger)cnt
+{
+    return [[RuleStack alloc] initWithLen:cnt];
+}
+
+- (id)init
+{
+	if ((self = [super init]) != nil) {
+	}
+    return( self );
+}
+
+- (id)initWithLen:(NSInteger)cnt
+{
+	if ((self = [super initWithLen:cnt]) != nil) {
+	}
+    return( self );
+}
+
+- (void)dealloc
+{
+#ifdef DEBUG_DEALLOC
+    NSLog( @"called dealloc in RuleStack" );
+#endif
+	[super dealloc];
+}
+
+- (id) copyWithZone:(NSZone *)aZone
+{
+    return [super copyWithZone:aZone];
+}
+
+- (NSInteger)count
+{
+    RuleMemo *anElement;
+    NSInteger aCnt = 0;
+    for( int i = 0; i < BuffSize; i++ ) {
+        if ((anElement = ptrBuffer[i]) != nil)
+            aCnt++;
+    }
+    return aCnt;
+}
+
+- (NSInteger)size
+{
+    RuleMemo *anElement;
+    NSInteger aSize = 0;
+    for( int i = 0; i < BuffSize; i++ ) {
+        if ((anElement = ptrBuffer[i]) != nil) {
+            aSize++;
+        }
+    }
+    return aSize;
+}
+
+- (HashRule *)pop
+{
+    return (HashRule *)[super pop];
+}
+
+- (void) insertObject:(HashRule *)aRule atIndex:(NSInteger)idx
+{
+    if ( idx >= BuffSize ) {
+        if ( debug > 2 ) NSLog( @"In RuleStack attempting to insert aRule at Index %d, but Buffer is only %d long\n", idx, BuffSize );
+        [self ensureCapacity:idx];
+    }
+    if ( aRule != ptrBuffer[idx] ) {
+        if ( ptrBuffer[idx] ) [ptrBuffer[idx] release];
+        [aRule retain];
+    }
+    ptrBuffer[idx] = aRule;
+}
+
+- (HashRule *)objectAtIndex:(NSInteger)idx
+{
+    if (idx < BuffSize) {
+        return ptrBuffer[idx];
+    }
+    return nil;
+}
+
+- (void)putHashRuleAtRuleIndex:(NSInteger)aRuleIndex StartIndex:(NSInteger)aStartIndex StopIndex:(NSInteger)aStopIndex
+{
+    HashRule *aHashRule;
+    RuleMemo *aRuleMemo;
+
+    if (aRuleIndex >= BuffSize) {
+        if ( debug) NSLog( @"putHashRuleAtRuleIndex attempting to insert aRule at Index %d, but Buffer is only %d long\n", aRuleIndex, BuffSize );
+        [self ensureCapacity:aRuleIndex];
+    }
+    if ((aHashRule = ptrBuffer[aRuleIndex]) == nil) {
+        aHashRule = [[HashRule newHashRuleWithLen:17] retain];
+        ptrBuffer[aRuleIndex] = aHashRule;
+    }
+    if (( aRuleMemo = [aHashRule objectAtIndex:aStartIndex] ) == nil ) {
+        aRuleMemo = [[RuleMemo newRuleMemo] retain];
+        [aHashRule insertObject:aRuleMemo atIndex:aStartIndex];
+    }
+    [aRuleMemo setStartIndex:[ACNumber numberWithInteger:aStartIndex]];
+    [aRuleMemo setStopIndex:[ACNumber numberWithInteger:aStopIndex]];
+}
+
+@end
diff --git a/runtime/ObjC/Framework/RuntimeException.h b/runtime/ObjC/Framework/RuntimeException.h
new file mode 100644
index 0000000..1a26e0a
--- /dev/null
+++ b/runtime/ObjC/Framework/RuntimeException.h
@@ -0,0 +1,160 @@
+//
+//  RuntimeException.h
+//  ANTLR
+//
+//  Created by Alan Condit on 6/5/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+
+@interface RuntimeException : NSException {
+}
+
++ (RuntimeException *) newException;
++ (RuntimeException *) newException:(NSString *)aReason;
++ (RuntimeException *) newException:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo;
+
++ (RuntimeException *) newException:(NSString *)aName reason:(NSString *)aReason;
++ (RuntimeException *) newException:(NSString *)aName reason:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo;
+
+- (id) init;
+- (id) init:(NSString *)aReason;
+- (id) init:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo;
+- (id) initWithName:(NSString *)aName reason:(NSString *)aReason;
+- (id) initWithName:(NSString *)aName reason:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo;
+
+- (NSString *) Description;
+- (id) stackTrace:(NSException *)e;
+
+@end
+
+@interface CloneNotSupportedException : RuntimeException {
+}
+
++ (id) newException;
++ (id) newException:(NSString *)aReason;
++ (id) newException:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo;
+
+- (id) init;
+- (id) init:(NSString *)aReason;
+- (id) init:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo;
+
+@end
+
+@interface ConcurrentModificationException : RuntimeException {
+}
+
++ (id) newException:(NSString *)aReason;
+
+- (id) init;
+- (id) init:(NSString *)aReason;
+- (id) init:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo;
+@end
+
+@interface IllegalArgumentException : RuntimeException {
+}
+
++ (id) newException;
++ (id) newException:(NSString *)aReason;
++ (id) newException:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo;
+
+- (id) init;
+- (id) init:(NSString *)aReason;
+- (id) init:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo;
+
+@end
+
+@interface IllegalStateException : RuntimeException {
+}
+
++ (id) newException;
++ (id) newException:(NSString *)aReason;
++ (id) newException:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo;
+
+- (id) init;
+- (id)init:(NSString *)aReason;
+- (id)init:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo;
+
+@end
+
+@interface IndexOutOfBoundsException : RuntimeException {
+}
+
++ (id) newException;
++ (id) newException:(NSString *)aReason;
++ (id) newException:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo;
+
+- (id) init;
+- (id)init:(NSString *)aReason;
+- (id)init:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo;
+
+@end
+
+@interface NoSuchElementException : RuntimeException {
+}
+
++ (id) newException;
++ (id) newException:(NSString *)aReason;
++ (id) newException:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo;
+
+- (id) init;
+- (id) init:(NSString *)aReason;
+- (id) init:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo;
+
+@end
+
+@interface NullPointerException : RuntimeException {
+}
+
++ (id) newException;
++ (id) newException:(NSString *)aReason;
++ (id) newException:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo;
+
+- (id) init;
+- (id) init:(NSString *)aReason;
+- (id) init:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo;
+
+@end
+
+@interface RewriteEarlyExitException : RuntimeException {
+}
+
++ (id) newException;
+- (id) initWithName:(NSString *)aName reason:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo;
+
+@end
+
+@interface UnsupportedOperationException : RuntimeException {
+}
+
++ (id) newException:(NSString *)aReason;
+
+- (id) initWithName:(NSString *)aName reason:(NSString *)aReason;
+- (id) initWithName:(NSString *)aMsg reason:(NSString *)aCause userInfo:(NSDictionary *)userInfo;
+
+@end
+
diff --git a/runtime/ObjC/Framework/RuntimeException.m b/runtime/ObjC/Framework/RuntimeException.m
new file mode 100644
index 0000000..25e17d6
--- /dev/null
+++ b/runtime/ObjC/Framework/RuntimeException.m
@@ -0,0 +1,427 @@
+//
+//  RuntimeException.m
+//  ANTLR
+//
+//  Created by Alan Condit on 6/5/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import "RuntimeException.h"
+
+
+@implementation RuntimeException
+
++ (id) newException
+{
+    return [[RuntimeException alloc] init];
+}
+
++ (id) newException:(NSString *)aReason
+{
+    return [[RuntimeException alloc] init:aReason];
+}
+
++ (id) newException:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo
+{
+    return [[RuntimeException alloc] init:aReason userInfo:aUserInfo];
+}
+
++ (id) newException:(NSString *)aName reason:(NSString *)aReason;
+{
+    return [[RuntimeException alloc] initWithName:aName reason:aReason];
+}
+
++ (id) newException:(NSString *)aName reason:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo;
+{
+    return [[RuntimeException alloc] initWithName:aName reason:aReason userInfo:aUserInfo];
+}
+
+
+- (id) init
+{
+    self = [super initWithName:@"RuntimeException" reason:@"UnknownException" userInfo:nil];
+    return(self);
+}
+
+- (id) init:(NSString *)aReason
+{
+    self = [super initWithName:(NSString *)@"RuntimeException" reason:(NSString *)aReason userInfo:(NSDictionary *)nil];
+    return(self);
+}
+
+- (id) init:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo
+{
+    self = [super initWithName:@"RuntimeException" reason:aReason userInfo:aUserInfo];
+    return(self);
+}
+
+- (id) initWithName:(NSString *)aName reason:(NSString *)aReason
+{
+    self = [super initWithName:(NSString *)aName reason:(NSString *)aReason userInfo:(NSDictionary *)nil];
+    return(self);
+}
+
+- (id) initWithName:(NSString *)aName reason:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo
+{
+    self = [super initWithName:(NSString *)aName reason:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo];
+    return(self);
+}
+
+- (NSString *) Description
+{
+    return [super reason];
+}
+
+- (id) stackTrace:(NSException *)e
+{
+    NSArray *addrs = [e callStackReturnAddresses];
+    NSArray *trace = [e callStackSymbols];
+    
+    for (NSString *traceStr in trace) {
+        NSLog( @"%@", traceStr);
+        // TODO: remove special after testing
+        if ([traceStr hasPrefix:@"main("] > 0)
+            return traceStr;
+        if (![traceStr hasPrefix:@"org.stringtemplate"])
+            return traceStr;
+    }
+    return trace;    
+}
+
+@end
+
+@implementation CloneNotSupportedException
+
++ (id) newException
+{
+    return [[CloneNotSupportedException alloc] init];
+}
+
++ (id) newException:(NSString *)aReason
+{
+    return [[CloneNotSupportedException alloc] init:aReason];
+}
+
++ (id) newException:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo
+{
+    return [[CloneNotSupportedException alloc] init:aReason userInfo:aUserInfo];
+}
+
+- (id) init
+{
+    self = [super initWithName:@"CloneNotSupportedException" reason:@"Attempted to clone non-cloneable object" userInfo:nil];
+    return(self);
+}
+
+- (id) init:(NSString *)aReason
+{
+    self = [super initWithName:@"CloneNotSupportedException" reason:(NSString *)aReason userInfo:nil];
+    return(self);
+}
+
+- (id) init:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo
+{
+    self = [super initWithName:@"CloneNotSupportedException" reason:aReason userInfo:aUserInfo];
+    return(self);
+}
+
+@end
+
+@implementation ConcurrentModificationException
+
++ (id) newException
+{
+    return [[ConcurrentModificationException alloc] init];
+}
+
++ (id) newException:(NSString *)aReason
+{
+    return [[ConcurrentModificationException alloc] init:aReason];
+}
+
++ (id) newException:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo
+{
+    return [[ConcurrentModificationException alloc] init:aReason userInfo:aUserInfo];
+}
+
+- (id) init
+{
+    self = [super initWithName:@"ConcurrentModificationException" reason:@"UnknownException" userInfo:nil];
+    return(self);
+}
+
+- (id) init:(NSString *)aReason
+{
+    self = [super initWithName:@"ConcurrentModificationException" reason:(NSString *)aReason userInfo:nil];
+    return(self);
+}
+
+- (id) init:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo
+{
+    self = [super initWithName:@"ConcurrentModificationException" reason:aReason userInfo:aUserInfo];
+    return(self);
+}
+
+@end
+
+@implementation IllegalArgumentException
+
++ (id) newException
+{
+    return [[IllegalArgumentException alloc] init];
+}
+
++ (id) newException:(NSString *)aReason
+{
+    return [[IllegalArgumentException alloc] init:aReason];
+}
+
++ (id) newException:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo
+{
+    return [[IllegalArgumentException alloc] init:aReason userInfo:aUserInfo];
+}
+
+- (id) init
+{
+    self = [super initWithName:@"IllegalArgumentException" reason:@"IllegalStateException" userInfo:nil];
+    return(self);
+}
+
+- (id) init:(NSString *)aReason
+{
+    self = [super initWithName:@"IllegalArgumentException" reason:(NSString *)aReason userInfo:nil];
+    return(self);
+}
+
+- (id) init:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo
+{
+    self = [super initWithName:@"IllegalArgumentException" reason:aReason userInfo:aUserInfo];
+    return(self);
+}
+
+@end
+
+@implementation IllegalStateException
+
++ (id) newException
+{
+    return [[IllegalStateException alloc] init];
+}
+
++ (id) newException:(NSString *)aReason
+{
+    return [[IllegalStateException alloc] init:aReason];
+}
+
++ (id) newException:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo
+{
+    return [[IllegalStateException alloc] init:aReason userInfo:aUserInfo];
+}
+
+- (id) init
+{
+    self = [super initWithName:@"IllegalStateException" reason:@"IllegalStateException" userInfo:nil];
+    return(self);
+}
+
+- (id) init:(NSString *)aReason
+{
+    self = [super initWithName:@"IllegalStateException" reason:(NSString *)aReason userInfo:nil];
+    return(self);
+}
+
+- (id) init:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo
+{
+    self = [super initWithName:@"IllegalStateException" reason:aReason userInfo:aUserInfo];
+    return(self);
+}
+
+@end
+
+@implementation IndexOutOfBoundsException
+
++ (id) newException
+{
+    return [[IndexOutOfBoundsException alloc] init];
+}
+
++ (id) newException:(NSString *)aReason
+{
+    return [[IndexOutOfBoundsException alloc] init:aReason];
+}
+
++ (id) newException:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo
+{
+    return [[IndexOutOfBoundsException alloc] init:aReason userInfo:aUserInfo];
+}
+
+- (id) init
+{
+    self = [super initWithName:@"IndexOutOfBoundsException" reason:@"IndexOutOfBoundsException" userInfo:nil];
+    return(self);
+}
+
+- (id) init:(NSString *)aReason
+{
+    self = [super initWithName:@"IndexOutOfBoundsException" reason:(NSString *)aReason userInfo:nil];
+    return(self);
+}
+
+- (id) init:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo
+{
+    self = [super initWithName:@"IndexOutOfBoundsException" reason:aReason userInfo:aUserInfo];
+    return(self);
+}
+
+@end
+
+@implementation NoSuchElementException
+
++ (id) newException
+{
+    return [[NoSuchElementException alloc] init];
+}
+
++ (id) newException:(NSString *)aReason
+{
+    return [[NoSuchElementException alloc] init:aReason];
+}
+
++ (id) newException:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo
+{
+    return [[NoSuchElementException alloc] init:aReason userInfo:(NSDictionary *)aUserInfo];
+}
+
+- (id) init
+{
+    self = [super initWithName:@"NoSuchElementException" reason:@"UnknownException" userInfo:nil];
+    return(self);
+}
+
+- (id) init:(NSString *)aReason
+{
+    self = [super initWithName:@"NoSuchElementException" reason:(NSString *)aReason userInfo:(NSDictionary *)nil];
+    return(self);
+}
+
+- (id) init:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo
+{
+    self = [super initWithName:@"NoSuchElementException" reason:aReason userInfo:aUserInfo];
+    return(self);
+}
+
+- (id) initWithName:(NSString *)aName reason:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo
+{
+    self = [super initWithName:aName reason:aReason userInfo:aUserInfo];
+    return(self);
+}
+
+@end
+
+@implementation NullPointerException
+
++ (id) newException
+{
+    return [[NullPointerException alloc] init];
+}
+
++ (id) newException:(NSString *)aReason
+{
+    return [[NullPointerException alloc] init:aReason];
+}
+
++ (id) newException:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo
+{
+    return [[NullPointerException alloc] init:aReason userInfo:(NSDictionary *)aUserInfo];
+}
+
+- (id) init
+{
+    self = [super initWithName:@"NullPointerException" reason:@"UnknownException" userInfo:nil];
+    return(self);
+}
+
+- (id) init:(NSString *)aReason
+{
+    self = [super initWithName:@"NullPointerException" reason:(NSString *)aReason userInfo:(NSDictionary *)nil];
+    return(self);
+}
+
+- (id) init:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo
+{
+    self = [super initWithName:@"NullPointerException" reason:aReason userInfo:aUserInfo];
+    return(self);
+}
+
+@end
+
+@implementation RewriteEarlyExitException
+
++ (id) newException
+{
+	return [[self alloc] init];
+}
+
+- (id) init
+{
+	self = [super initWithName:@"RewriteEarlyExitException" reason:nil userInfo:nil];
+	return self;
+}
+
+- (id) initWithName:(NSString *)aName reason:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo
+{
+    self = [super initWithName:aName reason:aReason userInfo:aUserInfo];
+    return(self);
+}
+
+- (NSString *) description
+{
+	return [self name];
+}
+
+@end
+
+@implementation UnsupportedOperationException
+
++ (id) newException:(NSString *)aReason
+{
+    return [[RuntimeException alloc] initWithName:@"Unsupported Operation Exception" reason:aReason userInfo:nil];
+}
+
+- (id) initWithName:(NSString *)aName reason:(NSString *)aReason
+{
+    self=[super initWithName:aName reason:aReason userInfo:nil];
+    return self;
+}
+
+- (id) initWithName:(NSString *)aName reason:(NSString *)aReason userInfo:(NSDictionary *)userInfo
+{
+    self=[super initWithName:aName reason:aReason userInfo:userInfo];
+    return self;
+}
+
+@end
+
diff --git a/runtime/ObjC/Framework/StreamEnumerator.h b/runtime/ObjC/Framework/StreamEnumerator.h
new file mode 100644
index 0000000..9461cb3
--- /dev/null
+++ b/runtime/ObjC/Framework/StreamEnumerator.h
@@ -0,0 +1,48 @@
+//
+//  StreamEnumertor.h
+//  ANTLR
+//
+//  Created by Ian Michell on 29/04/2010.
+// [The "BSD licence"]
+// Copyright (c) 2010 Ian Michell 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "AMutableArray.h"
+
+@interface StreamEnumerator : NSEnumerator 
+{
+	NSInteger i;
+	id eof;
+	AMutableArray *nodes;
+}
+
+-(id) initWithNodes:(AMutableArray *) n andEOF:(id) obj;
+-(BOOL) hasNext;
+
+@property NSInteger i;
+@property (retain) id eof;
+@property (retain) AMutableArray *nodes;
+@end
diff --git a/runtime/ObjC/Framework/StreamEnumerator.m b/runtime/ObjC/Framework/StreamEnumerator.m
new file mode 100644
index 0000000..eac54b5
--- /dev/null
+++ b/runtime/ObjC/Framework/StreamEnumerator.m
@@ -0,0 +1,77 @@
+//
+//  StreamEnumertor.m
+//  ANTLR
+//
+//  Created by Ian Michell on 29/04/2010.
+// [The "BSD licence"]
+// Copyright (c) 2010 Ian Michell 2010 Alan Condit
+// 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.
+
+#import "StreamEnumerator.h"
+
+
+@implementation StreamEnumerator
+
+-(id) init
+{
+	self = [super init];
+	if (self)
+	{
+		i = 0;
+	}
+	return self;
+}
+
+-(id) initWithNodes:(AMutableArray *) n andEOF:(id) obj
+{
+	self = [self init];
+	if (self)
+	{
+		nodes = n;
+		eof = obj;
+	}
+	return self;
+}
+
+-(BOOL) hasNext
+{
+	return i < [nodes count];
+}
+
+-(id) nextObject
+{
+	NSUInteger current = i;
+	i++;
+	if (current < [nodes count])
+	{
+		return [nodes objectAtIndex:current];
+	}
+	return eof;
+}
+
+@synthesize i;
+@synthesize eof;
+@synthesize nodes;
+@end
diff --git a/runtime/ObjC/Framework/ANTLRStringStreamState.h b/runtime/ObjC/Framework/StringStreamState.h
similarity index 100%
rename from runtime/ObjC/Framework/ANTLRStringStreamState.h
rename to runtime/ObjC/Framework/StringStreamState.h
diff --git a/runtime/ObjC/Framework/SymbolStack.h b/runtime/ObjC/Framework/SymbolStack.h
new file mode 100644
index 0000000..77a6959
--- /dev/null
+++ b/runtime/ObjC/Framework/SymbolStack.h
@@ -0,0 +1,75 @@
+//
+//  SymbolStack.h
+//  ANTLR
+//
+//  Created by Alan Condit on 6/9/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "BaseStack.h"
+// #import "SymbolScope.h"
+
+//#define GLOBAL_SCOPE       0
+//#define LOCAL_SCOPE        1
+#define HASHSIZE         101
+#define HBUFSIZE      0x2000
+
+@interface SymbolsScope : NSObject
+{
+    
+}
+
++ (SymbolsScope *)newSymbolsScope;
+
+- (id)init;
+@end
+
+
+@interface SymbolStack : BaseStack {
+}
+
+// Contruction/Destruction
++(SymbolStack *)newSymbolStack;
++(SymbolStack *)newSymbolStackWithLen:(NSInteger)cnt;
+-(id)init;
+-(id)initWithLen:(NSInteger)cnt;
+-(void)dealloc;
+
+// Instance Methods
+- (id) copyWithZone:(NSZone *)aZone;
+/* clear -- reinitialize the maplist array */
+
+-(SymbolsScope *)getHashMapEntry:(NSInteger)idx;
+
+-(SymbolsScope **)getHashMap;
+
+-(SymbolsScope *) pop;
+
+- (void) insertObject:(SymbolsScope *)aScope atIndex:(NSInteger)idx;
+- (SymbolsScope *)objectAtIndex:(NSInteger)idx;
+
+@end
diff --git a/runtime/ObjC/Framework/SymbolStack.m b/runtime/ObjC/Framework/SymbolStack.m
new file mode 100644
index 0000000..f1a7f6e
--- /dev/null
+++ b/runtime/ObjC/Framework/SymbolStack.m
@@ -0,0 +1,126 @@
+//
+//  SymbolStack.m
+//  ANTLR
+//
+//  Created by Alan Condit on 6/9/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#define SUCCESS (0)
+#define FAILURE (-1)
+
+#import "SymbolStack.h"
+#import "Tree.h"
+
+
+@implementation SymbolsScope
+
++ (SymbolsScope *)newSymbolsScope
+{
+    return( [[SymbolsScope alloc] init] );
+}
+
+- (id)init
+{
+    if ((self = [super init]) != nil) {
+    }
+    return (self);
+}
+
+@end
+
+/*
+ * Start of SymbolStack
+ */
+@implementation SymbolStack
+
++(SymbolStack *)newSymbolStack
+{
+    return [[SymbolStack alloc] initWithLen:30];
+}
+
++(SymbolStack *)newSymbolStackWithLen:(NSInteger)cnt
+{
+    return [[SymbolStack alloc] initWithLen:cnt];
+}
+
+-(id)init
+{
+	if ((self = [super init]) != nil) {
+	}
+    return( self );
+}
+
+-(id)initWithLen:(NSInteger)cnt
+{
+	if ((self = [super initWithLen:cnt]) != nil) {
+	}
+    return( self );
+}
+
+-(void)dealloc
+{
+#ifdef DEBUG_DEALLOC
+    NSLog( @"called dealloc in SymbolStack" );
+#endif
+	[super dealloc];
+}
+
+- (id) copyWithZone:(NSZone *)aZone
+{
+    return [super copyWithZone:aZone];
+}
+
+-(SymbolsScope *)getHashMapEntry:(NSInteger)idx
+{
+	return( (SymbolsScope *)[super objectAtIndex:idx] );
+}
+
+-(SymbolsScope **)getHashMap
+{
+	return( (SymbolsScope **)ptrBuffer );
+}
+
+-(SymbolsScope *) pop
+{
+    return (SymbolsScope *)[super pop];
+}
+
+- (void) insertObject:(SymbolsScope *)aRule atIndex:(NSInteger)idx
+{
+    if ( aRule != ptrBuffer[idx] ) {
+        if ( ptrBuffer[idx] ) [ptrBuffer[idx] release];
+        [aRule retain];
+    }
+    ptrBuffer[idx] = aRule;
+}
+
+- (SymbolsScope *)objectAtIndex:(NSInteger)idx
+{
+    return (SymbolsScope *)[super objectAtIndex:idx];
+}
+
+@end
diff --git a/runtime/ObjC/Framework/Token+DebuggerSupport.h b/runtime/ObjC/Framework/Token+DebuggerSupport.h
new file mode 100644
index 0000000..c8aa28a
--- /dev/null
+++ b/runtime/ObjC/Framework/Token+DebuggerSupport.h
@@ -0,0 +1,41 @@
+//
+//  Token+DebuggerSupport.h
+//  ANTLR
+//
+//  Created by Kay Röpke on 03.12.2006.
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke
+// 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.
+//
+
+#import <Foundation/Foundation.h>
+#import "Token.h"
+#import "CommonToken.h"
+
+@interface CommonToken(DebuggerSupport)
+
+- (NSString *)debuggerDescription;
+
+@end
diff --git a/runtime/ObjC/Framework/Token+DebuggerSupport.m b/runtime/ObjC/Framework/Token+DebuggerSupport.m
new file mode 100644
index 0000000..8178fb8
--- /dev/null
+++ b/runtime/ObjC/Framework/Token+DebuggerSupport.m
@@ -0,0 +1,61 @@
+//
+//  Token+DebuggerSupport.m
+//  ANTLR
+//
+//  Created by Kay Röpke on 03.12.2006.
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke
+// 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.
+
+#import "Token+DebuggerSupport.h"
+
+
+@implementation CommonToken(DebuggerSupport)
+
+- (NSString *)debuggerDescription
+{
+	NSString *_text = self.text;
+	NSMutableString *escapedText;
+	if (_text) {
+		escapedText = [_text copyWithZone:nil];
+		NSRange wholeString = NSMakeRange(0,[escapedText length]);
+		[escapedText replaceOccurrencesOfString:@"%" withString:@"%25" options:0 range:wholeString];
+		[escapedText replaceOccurrencesOfString:@"\n" withString:@"%0A" options:0 range:wholeString];
+		[escapedText replaceOccurrencesOfString:@"\r" withString:@"%0D" options:0 range:wholeString];
+	} else {
+		escapedText = [NSMutableString stringWithString:@""];
+	}
+	// format is tokenIndex, type, channel, line, col, (escaped)text
+	return [NSString stringWithFormat:@"%u %d %u %u %u \"%@", 
+		[self getTokenIndex],
+		self.type,
+		self.channel,
+		self.line,
+		self.charPositionInLine,
+		escapedText
+		];
+}
+
+@end
diff --git a/runtime/ObjC/Framework/Token.h b/runtime/ObjC/Framework/Token.h
new file mode 100644
index 0000000..ea1e523
--- /dev/null
+++ b/runtime/ObjC/Framework/Token.h
@@ -0,0 +1,89 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+
+#import <Foundation/Foundation.h>
+
+#ifndef DEBUG_DEALLOC
+#define DEBUG_DEALLOC
+#endif
+
+typedef enum {
+    TokenTypeEOF = -1,
+    TokenTypeInvalid,
+    TokenTypeEOR,
+    TokenTypeDOWN,
+    TokenTypeUP,
+    TokenTypeMIN
+} TokenType;
+
+typedef enum {
+    TokenChannelDefault = 0,
+    TokenChannelHidden = 99
+} TokenChannel;
+
+#define HIDDEN 99
+
+@protocol Token < NSObject, NSCopying >
+
+@property (retain, getter = text, setter = setText:) NSString *text;
+@property (assign) NSInteger type;
+@property (assign) NSUInteger line;
+@property (assign) NSUInteger charPositionInLine;
+
+// The singleton eofToken instance.
++ (id<Token>) eofToken;
+// The default channel for this class of Tokens
++ (TokenChannel) defaultChannel;
+
+// provide hooks to explicitely set the text as opposed to use the indices into the CharStream
+- (NSString *) text;
+- (void) setText:(NSString *)theText;
+
+- (NSInteger)type;
+- (void) setType: (NSInteger) aType;
+
+// ANTLR v3 provides automatic line and position tracking. Subclasses do not need to
+// override these, if they do not want to store line/pos tracking information
+- (NSUInteger)line;
+- (void) setLine: (NSUInteger) aLine;
+
+- (NSUInteger)charPositionInLine;
+- (void) setCharPositionInLine:(NSUInteger)aCharPositionInLine;
+
+// explicitely change the channel this Token is on. The default parser implementation
+// just sees the defaultChannel
+// Common idiom is to put whitespace tokens on channel 99.
+- (NSUInteger)channel;
+- (void) setChannel: (NSUInteger) aChannel;
+
+// the index of this Token into the TokenStream
+- (NSInteger) getTokenIndex;
+- (void) setTokenIndex: (NSInteger) aTokenIndex;
+- (NSString *)toString;
+
+@end
+
diff --git a/runtime/ObjC/Framework/TokenRewriteStream.h b/runtime/ObjC/Framework/TokenRewriteStream.h
new file mode 100644
index 0000000..846e4a2
--- /dev/null
+++ b/runtime/ObjC/Framework/TokenRewriteStream.h
@@ -0,0 +1,170 @@
+//
+//  TokenRewriteStream.h
+//  ANTLR
+//
+//  Created by Alan Condit on 6/19/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "CommonTokenStream.h"
+#import "LinkBase.h"
+#import "HashMap.h"
+#import "MapElement.h"
+#import "TokenSource.h"
+
+// Define the rewrite operation hierarchy
+
+@interface RewriteOperation : CommonTokenStream
+{
+/** What rwIndex into rewrites List are we? */
+NSInteger instructionIndex;
+/** Token buffer rwIndex. */
+NSInteger rwIndex;
+NSString *text;
+}
+
+@property (getter=getInstructionIndex, setter=setInstructionIndex:) NSInteger instructionIndex;
+@property (assign) NSInteger rwIndex;
+@property (retain, getter=text, setter=setText:) NSString *text;
+
++ (RewriteOperation *) newRewriteOperation:(NSInteger)anIndex Text:(NSString *)text;
+
+- (id) initWithIndex:(NSInteger)anIndex Text:(NSString *)theText;
+
+/** Execute the rewrite operation by possibly adding to the buffer.
+ *  Return the rwIndex of the next token to operate on.
+ */
+- (NSInteger) execute:(NSString *)buf;
+
+- (NSString *)toString;
+- (NSInteger) indexOf:(char)aChar inString:(NSString *)aString;
+@end
+
+@interface ANTLRInsertBeforeOp : RewriteOperation {
+}
+
++ (ANTLRInsertBeforeOp *) newANTLRInsertBeforeOp:(NSInteger)anIndex Text:(NSString *)theText;
+- (id) initWithIndex:(NSInteger)anIndex Text:(NSString *)theText;
+
+@end
+
+/** I'm going to try replacing range from x..y with (y-x)+1 ReplaceOp
+ *  instructions.
+ */
+@interface ANTLRReplaceOp : RewriteOperation {
+    NSInteger lastIndex;
+}
+
+@property (assign) NSInteger lastIndex;
+
++ (ANTLRReplaceOp *) newANTLRReplaceOp:(NSInteger)from ToIndex:(NSInteger)to Text:(NSString*)theText;
+- (id) initWithIndex:(NSInteger)from ToIndex:(NSInteger)to Text:(NSString *)theText;
+
+- (NSInteger) execute:(NSString *)buf;
+- (NSString *)toString;
+
+@end
+
+@interface ANTLRDeleteOp : ANTLRReplaceOp {
+}
++ (ANTLRDeleteOp *) newANTLRDeleteOp:(NSInteger)from ToIndex:(NSInteger)to;
+
+- (id) initWithIndex:(NSInteger)from ToIndex:(NSInteger)to;
+
+- (NSString *)toString;
+
+@end
+
+
+@interface TokenRewriteStream : CommonTokenStream {
+/** You may have multiple, named streams of rewrite operations.
+ *  I'm calling these things "programs."
+ *  Maps String (name) -> rewrite (List)
+ */
+HashMap *programs;
+
+/** Map String (program name) -> Integer rwIndex */
+HashMap *lastRewriteTokenIndexes;
+}
+
+@property (retain, getter=getPrograms, setter=setPrograms:) HashMap *programs;
+@property (retain, getter=getLastRewriteTokenIndexes, setter=setLastRewriteTokenIndexes:) HashMap *lastRewriteTokenIndexes;
+
++ (TokenRewriteStream *)newTokenRewriteStream;
++ (TokenRewriteStream *)newTokenRewriteStream:(id<TokenSource>) aTokenSource;
++ (TokenRewriteStream *)newTokenRewriteStream:(id<TokenSource>) aTokenSource Channel:(NSInteger)aChannel;
+
+- (id) init;
+- (id)initWithTokenSource:(id<TokenSource>)aTokenSource;
+- (id)initWithTokenSource:(id<TokenSource>)aTokenSource Channel:(NSInteger)aChannel;
+
+- (HashMap *)getPrograms;
+- (void)setPrograms:(HashMap *)aProgList;
+
+- (void) rollback:(NSInteger)instructionIndex;
+- (void) rollback:(NSString *)programName Index:(NSInteger)anInstructionIndex;
+- (void) deleteProgram;
+- (void) deleteProgram:(NSString *)programName;
+- (void) insertAfterToken:(id<Token>)t Text:(NSString *)theText;
+- (void) insertAfterIndex:(NSInteger)anIndex Text:(NSString *)theText;
+- (void) insertAfterProgNam:(NSString *)programName Index:(NSInteger)anIndex Text:(NSString *)theText;
+
+
+- (void) insertBeforeToken:(id<Token>)t Text:(NSString *)theText;
+- (void) insertBeforeIndex:(NSInteger)anIndex Text:(NSString *)theText;
+- (void) insertBeforeProgName:(NSString *)programName Index:(NSInteger)anIndex Text:(NSString *)theText;
+- (void) replaceFromIndex:(NSInteger)anIndex Text:(NSString *)theText;
+- (void) replaceFromIndex:(NSInteger)from ToIndex:(NSInteger)to Text:(NSString *)theText;
+- (void) replaceFromToken:(id<Token>)indexT Text:(NSString *)theText;
+- (void) replaceFromToken:(id<Token>)from ToToken:(id<Token>)to Text:(NSString *)theText;
+- (void) replaceProgNam:(NSString *)programName Token:(id<Token>)from Token:(id<Token>)to Text:(NSString *)theText;
+- (void) replaceProgNam:(NSString *)programName FromIndex:(NSInteger)from ToIndex:(NSInteger)to Text:(NSString *)theText;
+- (void) delete:(NSInteger)anIndex;
+- (void) delete:(NSInteger)from ToIndex:(NSInteger)to;
+- (void) deleteToken:(id<Token>)indexT;
+- (void) deleteFromToken:(id<Token>)from ToToken:(id<Token>)to;
+- (void) delete:(NSString *)programName FromToken:(id<Token>)from ToToken:(id<Token>)to;
+- (void) delete:(NSString *)programName FromIndex:(NSInteger)from ToIndex:(NSInteger)to;
+- (NSInteger)getLastRewriteTokenIndex;
+- (NSInteger)getLastRewriteTokenIndex:(NSString *)programName;
+- (void)setLastRewriteTokenIndex:(NSString *)programName Index:(NSInteger)anInt;
+- (HashMap *) getProgram:(NSString *)name;
+- (HashMap *) initializeProgram:(NSString *)name;
+- (NSString *)toOriginalString;
+- (NSString *)toOriginalString:(NSInteger)start End:(NSInteger)end;
+- (NSString *)toString;
+- (NSString *)toString:(NSString *)programName;
+- (NSString *)toStringFromStart:(NSInteger)start ToEnd:(NSInteger)end;
+- (NSString *)toString:(NSString *)programName FromStart:(NSInteger)start ToEnd:(NSInteger)end;
+- (HashMap *)reduceToSingleOperationPerIndex:(HashMap *)rewrites;
+- (HashMap *)getKindOfOps:(HashMap *)rewrites KindOfClass:(Class)kind;
+- (HashMap *)getKindOfOps:(HashMap *)rewrites KindOfClass:(Class)kind Index:(NSInteger)before;
+- (NSString *)catOpText:(id)a PrevText:(id)b;
+- (NSMutableString *)toDebugString;
+- (NSMutableString *)toDebugStringFromStart:(NSInteger)start ToEnd:(NSInteger)end;
+                    
+@end
diff --git a/runtime/ObjC/Framework/TokenRewriteStream.m b/runtime/ObjC/Framework/TokenRewriteStream.m
new file mode 100644
index 0000000..7a77bfa
--- /dev/null
+++ b/runtime/ObjC/Framework/TokenRewriteStream.m
@@ -0,0 +1,692 @@
+//
+//  TokenRewriteStream.m
+//  ANTLR
+//
+//  Created by Alan Condit on 6/19/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import "TokenRewriteStream.h"
+#import "RuntimeException.h"
+
+static NSString *DEFAULT_PROGRAM_NAME = @"default";
+static NSInteger PROGRAM_INIT_SIZE = 100;
+static NSInteger MIN_TOKEN_INDEX = 0;
+
+extern NSInteger debug;
+
+// Define the rewrite operation hierarchy
+
+@implementation RewriteOperation
+
+@synthesize instructionIndex;
+@synthesize rwIndex;
+@synthesize text;
+
++ (RewriteOperation *) newRewriteOperation:(NSInteger)anIndex Text:(NSString *)theText
+{
+    return [[RewriteOperation alloc] initWithIndex:anIndex Text:theText];
+}
+    
+- (id) initWithIndex:(NSInteger)anIndex Text:(NSString *)theText
+{
+    if ((self = [super init]) != nil) {
+        rwIndex = anIndex;
+        text = theText;
+    }
+    return self;
+}
+
+/** Execute the rewrite operation by possibly adding to the buffer.
+ *  Return the rwIndex of the next token to operate on.
+ */
+- (NSInteger) execute:(NSString *)buf
+{
+    return rwIndex;
+}
+    
+- (NSString *)toString
+{
+    NSString *opName = [self className];
+    int $index = [self indexOf:'$' inString:opName];
+    opName = [opName substringWithRange:NSMakeRange($index+1, [opName length])];
+    return [NSString stringWithFormat:@"<%@%d:\"%@\">", opName, rwIndex, opName];			
+}
+
+- (NSInteger) indexOf:(char)aChar inString:(NSString *)aString
+{
+    char indexedChar;
+
+    for( int i = 0; i < [aString length]; i++ ) {
+        indexedChar = [aString characterAtIndex:i];
+        if (indexedChar == aChar) {
+            return i;
+        }
+    }
+    return -1;
+}
+                                                    
+@end
+
+@implementation ANTLRInsertBeforeOp
+
++ (ANTLRInsertBeforeOp *) newANTLRInsertBeforeOp:(NSInteger) anIndex Text:(NSString *)theText
+{
+    return [[ANTLRInsertBeforeOp alloc] initWithIndex:anIndex Text:theText];
+}
+
+- (id) initWithIndex:(NSInteger)anIndex Text:(NSString *)theText
+{
+    if ((self = [super initWithIndex:anIndex Text:theText]) != nil) {
+        rwIndex = anIndex;
+        text = theText;
+    }
+    return self;
+}
+
+
+- (NSInteger) execute:(NSMutableString *)buf
+{
+    [buf appendString:text];
+    if ( ((CommonToken *)[tokens objectAtIndex:rwIndex]).type != TokenTypeEOF ) {
+        [buf appendString:[[tokens objectAtIndex:rwIndex] text]];
+    }
+    return rwIndex+1;
+}
+
+@end
+     
+/** I'm going to try replacing range from x..y with (y-x)+1 ANTLRReplaceOp
+ *  instructions.
+ */
+@implementation ANTLRReplaceOp
+
+@synthesize lastIndex;
+
++ (ANTLRReplaceOp *) newANTLRReplaceOp:(NSInteger)from ToIndex:(NSInteger)to Text:(NSString*)theText
+{
+    return [[ANTLRReplaceOp alloc] initWithIndex:from ToIndex:to Text:theText];
+}
+
+- (id) initWithIndex:(NSInteger)from ToIndex:(NSInteger)to Text:(NSString *)theText
+{
+    if ((self = [super initWithIndex:from Text:theText]) != nil) {
+        lastIndex = to;
+    }
+    return self;
+}
+ 
+ 
+- (NSInteger) execute:(NSMutableString *)buf
+{
+    if ( text!=nil ) {
+        [buf appendString:text];
+    }
+        return lastIndex+1;
+}
+
+- (NSString *)toString
+{
+    return [NSString stringWithFormat:@"<ANTLRReplaceOp@ %d..%d :>%@\n", rwIndex, lastIndex, text];
+}
+
+@end
+
+@implementation ANTLRDeleteOp
+
++ (ANTLRDeleteOp *) newANTLRDeleteOp:(NSInteger)from ToIndex:(NSInteger)to
+{
+    // super(from To:to, null);
+    return [[ANTLRDeleteOp alloc] initWithIndex:from ToIndex:to];
+}
+
+ - (id) initWithIndex:(NSInteger)from ToIndex:(NSInteger)to
+{
+    if ((self = [super initWithIndex:from ToIndex:to Text:nil]) != nil) {
+        lastIndex = to;
+    }
+    return self;
+}
+     
+- (NSString *)toString
+{
+    return [NSString stringWithFormat:@"<DeleteOp@ %d..%d\n",  rwIndex, lastIndex];
+}
+
+@end
+
+
+@implementation TokenRewriteStream
+
+@synthesize programs;
+@synthesize lastRewriteTokenIndexes;
+
++ (TokenRewriteStream *)newTokenRewriteStream
+{
+    return [[TokenRewriteStream alloc] init];
+}
+
++ (TokenRewriteStream *)newTokenRewriteStream:(id<TokenSource>) aTokenSource
+{
+    return [[TokenRewriteStream alloc] initWithTokenSource:aTokenSource];
+}
+
++ (TokenRewriteStream *)newTokenRewriteStream:(id<TokenSource>) aTokenSource Channel:(NSInteger)aChannel
+{
+    return [[TokenRewriteStream alloc] initWithTokenSource:aTokenSource Channel:aChannel];
+}
+ 
+- (id) init
+{
+    if ((self = [super init]) != nil) {
+        programs = [HashMap newHashMap];
+        [programs addObject:[MapElement newMapElementWithName:DEFAULT_PROGRAM_NAME Node:[HashMap newHashMapWithLen:PROGRAM_INIT_SIZE]]];
+        lastRewriteTokenIndexes = [HashMap newHashMap];
+    }
+    return self;
+}
+ 
+- (id)initWithTokenSource:(id<TokenSource>)aTokenSource
+{
+    if ((self = [super init]) != nil) {
+        programs = [HashMap newHashMap];
+        [programs addObject:[MapElement newMapElementWithName:DEFAULT_PROGRAM_NAME Node:[HashMap newHashMapWithLen:PROGRAM_INIT_SIZE]]];
+        lastRewriteTokenIndexes = [HashMap newHashMap];
+        tokenSource = aTokenSource;
+    }
+    return self;
+}
+
+- (id)initWithTokenSource:(id<TokenSource>)aTokenSource Channel:(NSInteger)aChannel
+{
+    if ((self = [super init]) != nil) {
+        programs = [HashMap newHashMap];
+        [programs addObject:[MapElement newMapElementWithName:DEFAULT_PROGRAM_NAME Node:[HashMap newHashMapWithLen:PROGRAM_INIT_SIZE]]];
+        lastRewriteTokenIndexes = [HashMap newHashMap];
+        tokenSource = aTokenSource;
+        channel = aChannel;
+    }
+    return self;
+}
+ 
+- (HashMap *)getPrograms
+{
+    return programs;
+}
+ 
+- (void)setPrograms:(HashMap *)aProgList
+{
+    programs = aProgList;
+}
+
+- (void) rollback:(NSInteger)instructionIndex
+{
+    [self rollback:DEFAULT_PROGRAM_NAME Index:instructionIndex];
+}
+
+/** Rollback the instruction stream for a program so that
+ *  the indicated instruction (via instructionIndex) is no
+ *  longer in the stream.  UNTESTED!
+ */
+- (void) rollback:(NSString *)programName Index:(NSInteger)anInstructionIndex
+{
+    id object;
+    HashMap *is;
+
+    //    AMutableArray *is = [programs get(programName)];
+    is = [self getPrograms];
+    object = [is getName:programName];
+    if ( is != nil ) {
+#pragma warning this has to be fixed
+        [programs insertObject:programName  atIndex:anInstructionIndex];
+    }
+}
+
+- (void) deleteProgram
+{
+    [self deleteProgram:DEFAULT_PROGRAM_NAME];
+}
+
+/** Reset the program so that no instructions exist */
+- (void) deleteProgram:(NSString *)programName
+{
+    [self rollback:programName Index:MIN_TOKEN_INDEX];
+}
+
+- (void) insertAfterToken:(id<Token>)t Text:(NSString *)theText
+{
+    [self insertAfterProgNam:DEFAULT_PROGRAM_NAME Index:[t getTokenIndex] Text:theText];
+}
+
+- (void) insertAfterIndex:(NSInteger)anIndex Text:(NSString *)theText
+{
+    [self insertAfterProgNam:DEFAULT_PROGRAM_NAME Index:(NSInteger)anIndex Text:(NSString *)theText];
+}
+
+- (void) insertAfterProgNam:(NSString *)programName Index:(NSInteger)anIndex Text:(NSString *)theText
+{
+    // to insert after, just insert before next rwIndex (even if past end)
+    [self insertBeforeProgName:programName Index:anIndex+1 Text:theText];
+    //addToSortedRewriteList(programName, new InsertAfterOp(rwIndex,text));
+}
+
+
+
+
+
+
+
+
+
+- (void) insertBeforeToken:(id<Token>)t Text:(NSString *)theText
+{
+    [self insertBeforeProgName:DEFAULT_PROGRAM_NAME Index:[t getTokenIndex] Text:theText];
+}
+
+- (void) insertBeforeIndex:(NSInteger)anIndex Text:(NSString *)theText
+{
+    [self insertBeforeProgName:DEFAULT_PROGRAM_NAME Index:anIndex Text:theText];
+}
+
+- (void) insertBeforeProgName:(NSString *)programName Index:(NSInteger)rwIndex Text:(NSString *)theText
+{
+    //addToSortedRewriteList(programName, new ANTLRInsertBeforeOp(rwIndex,text));
+    RewriteOperation *op = [ANTLRInsertBeforeOp newANTLRInsertBeforeOp:rwIndex Text:theText];
+    HashMap *rewrites = [self getProgram:programName];
+    op.instructionIndex = [rewrites count];
+    [rewrites addObject:op];		
+}
+
+- (void) replaceFromIndex:(NSInteger)anIndex Text:(NSString *)theText
+{
+    [self replaceProgNam:DEFAULT_PROGRAM_NAME FromIndex:anIndex ToIndex:anIndex Text:theText];
+}
+
+- (void) replaceFromIndex:(NSInteger)from ToIndex:(NSInteger)to Text:(NSString *)theText
+{
+    [self replaceProgNam:DEFAULT_PROGRAM_NAME FromIndex:from ToIndex:to Text:theText];
+}
+
+- (void) replaceFromToken:(id<Token>)anIndexT Text:(NSString *)theText
+{
+    [self replaceProgNam:DEFAULT_PROGRAM_NAME FromIndex:[anIndexT getTokenIndex] ToIndex:[anIndexT getTokenIndex] Text:theText];
+}
+
+- (void) replaceFromToken:(id<Token>)from ToToken:(id<Token>)to Text:(NSString *)theText
+{
+    [self replaceProgNam:DEFAULT_PROGRAM_NAME FromIndex:[from getTokenIndex] ToIndex:[to getTokenIndex] Text:theText];
+}
+
+- (void) replaceProgNam:(NSString *)programName Token:(id<Token>)from Token:(id<Token>)to Text:(NSString *)theText
+{
+    [self replaceProgNam:programName FromIndex:[from getTokenIndex] ToIndex:[to getTokenIndex] Text:theText];
+}
+                         
+- (void) replaceProgNam:(NSString *)programName FromIndex:(NSInteger)from ToIndex:(NSInteger)to Text:(NSString *)theText
+{
+    if ( from > to || from < 0 || to < 0 || to >= [tokens count] ) {
+        @throw [IllegalArgumentException newException:[NSString stringWithFormat:@"replace: range invalid: %d..%d size=%d\n", from, to, [tokens count]]];
+    }
+    RewriteOperation *op = [ANTLRReplaceOp newANTLRReplaceOp:from ToIndex:to Text:theText];
+    HashMap *rewrites = (HashMap *)[lastRewriteTokenIndexes getName:programName];
+    op.instructionIndex = [rewrites count];
+    [rewrites addObject:op];
+}
+
+- (void) delete:(NSInteger)anIndex
+{
+    [self delete:DEFAULT_PROGRAM_NAME  FromIndex:(NSInteger)anIndex  ToIndex:(NSInteger)anIndex];
+}
+
+- (void) delete:(NSInteger)from ToIndex:(NSInteger)to
+{
+    [self delete:DEFAULT_PROGRAM_NAME FromIndex:from ToIndex:to];
+}
+
+- (void) deleteToken:(id<Token>)anIndexT
+{
+    [self delete:DEFAULT_PROGRAM_NAME FromIndex:[anIndexT getTokenIndex] ToIndex:[anIndexT getTokenIndex]];
+}
+
+- (void) deleteFromToken:(id<Token>)from ToToken:(id<Token>)to
+{
+    [self delete:DEFAULT_PROGRAM_NAME FromIndex:[from getTokenIndex] ToIndex:[to getTokenIndex]];
+}
+
+- (void) delete:(NSString *)programName FromToken:(id<Token>)from ToToken:(id<Token>)to
+{
+    [self replaceProgNam:programName FromIndex:[from getTokenIndex] ToIndex:[to getTokenIndex] Text:nil];
+}
+
+- (void) delete:(NSString *)programName FromIndex:(NSInteger)from ToIndex:(NSInteger)to
+{
+    [self replaceProgNam:programName FromIndex:from ToIndex:to Text:nil];
+}
+
+- (NSInteger)getLastRewriteTokenIndex
+{
+    return [self getLastRewriteTokenIndex:DEFAULT_PROGRAM_NAME];
+}
+
+- (NSInteger)getLastRewriteTokenIndex:(NSString *)programName
+{
+#pragma warning fix this to look up the hashed name
+    NSInteger anInt = -1;
+    MapElement *node = [lastRewriteTokenIndexes lookup:programName Scope:0];
+    if ( node != nil ) {
+        anInt = [lastRewriteTokenIndexes hash:programName];
+    }
+    return anInt;
+}
+
+- (void)setLastRewriteTokenIndex:(NSString *)programName Index:(NSInteger)anInt
+{
+    [lastRewriteTokenIndexes insertObject:programName atIndex:anInt];
+}
+
+-(HashMap *) getProgram:(NSString *)name
+{
+   HashMap *is = (HashMap *)[programs getName:name];
+    if ( is == nil ) {
+        is = [self initializeProgram:name];
+    }
+    return is;
+}
+
+-(HashMap *) initializeProgram:(NSString *)name
+{
+    HashMap *is = [HashMap newHashMapWithLen:PROGRAM_INIT_SIZE];
+    [is putName:name Node:nil];
+    return is;
+}
+
+- (NSString *)toOriginalString
+{
+    [super fill];
+    return [self toOriginalString:MIN_TOKEN_INDEX End:[tokens count]-1];
+}
+
+- (NSString *)toOriginalString:(NSInteger)start End:(NSInteger)end
+{
+    NSMutableString *buf = [NSMutableString stringWithCapacity:100];
+    for (int i = start; i >= MIN_TOKEN_INDEX && i <= end && i< [tokens count]; i++) {
+        if ( [((CommonToken *)[lastRewriteTokenIndexes objectAtIndex:i]) type] != TokenTypeEOF )
+            [buf appendString:[[tokens objectAtIndex:i] text]];
+    }
+    return [NSString stringWithString:buf];
+}
+
+- (NSString *)toString
+{
+    [super fill];
+    return [self toStringFromStart:MIN_TOKEN_INDEX ToEnd:[tokens count]-1];
+}
+
+- (NSString *)toString:(NSString *)programName
+{
+    [super fill];
+    return [self toString:programName FromStart:MIN_TOKEN_INDEX ToEnd:[[programs objectAtIndex:MIN_TOKEN_INDEX] count]-1];
+}
+
+- (NSString *)toStringFromStart:(NSInteger)start ToEnd:(NSInteger)end
+{
+    return [self toString:DEFAULT_PROGRAM_NAME FromStart:start ToEnd:end];
+}
+
+- (NSString *)toString:(NSString *)programName FromStart:(NSInteger)start ToEnd:(NSInteger)end
+{
+    HashMap *rewrites = (HashMap *)[programs getName:programName];
+    
+    // ensure start/end are in range
+    if ( end > [tokens count]-1 ) end = [tokens count]-1;
+    if ( start < 0 )
+        start = 0;
+    
+    if ( rewrites == nil || [rewrites count] == 0 ) {
+        return [self toOriginalString:start End:end]; // no instructions to execute
+    }
+    NSMutableString *buf = [NSMutableString stringWithCapacity:100];
+    
+    // First, optimize instruction stream
+    HashMap *indexToOp = [self reduceToSingleOperationPerIndex:rewrites];
+    
+    // Walk buffer, executing instructions and emitting tokens
+    int i = start;
+    while ( i <= end && i < [tokens count] ) {
+        RewriteOperation *op = (RewriteOperation *)[indexToOp objectAtIndex:i];
+        [indexToOp setObject:nil atIndex:i]; // remove so any left have rwIndex size-1
+        id<Token>t = (id<Token>) [tokens objectAtIndex:i];
+        if ( op == nil ) {
+            // no operation at that rwIndex, just dump token
+            if ( t.type != TokenTypeEOF )
+                [buf appendString:t.text];
+            i++; // move to next token
+        }
+        else {
+            i = [op execute:buf]; // execute operation and skip
+        }
+    }
+    
+    // include stuff after end if it's last rwIndex in buffer
+    // So, if they did an insertAfter(lastValidIndex, "foo"), include
+    // foo if end==lastValidIndex.
+    //if ( end == [tokens size]-1 ) {
+    if ( end == [tokens count]-1 ) {
+        // Scan any remaining operations after last token
+        // should be included (they will be inserts).
+        int i2 = 0;
+        while ( i2 < [indexToOp count] - 1 ) {
+            RewriteOperation *op = [indexToOp objectAtIndex:i2];
+            if ( op.rwIndex >= [tokens count]-1 ) {
+                [buf appendString:op.text];
+            }
+        }
+    }
+    return [NSString stringWithString:buf];
+}
+
+/** We need to combine operations and report invalid operations (like
+ *  overlapping replaces that are not completed nested).  Inserts to
+ *  same rwIndex need to be combined etc...   Here are the cases:
+ *
+ *  I.i.u I.j.v								leave alone, nonoverlapping
+ *  I.i.u I.i.v								combine: Iivu
+ *
+ *  R.i-j.u R.x-y.v	| i-j in x-y			delete first R
+ *  R.i-j.u R.i-j.v							delete first R
+ *  R.i-j.u R.x-y.v	| x-y in i-j			ERROR
+ *  R.i-j.u R.x-y.v	| boundaries overlap	ERROR
+ *
+ *  I.i.u R.x-y.v | i in x-y				delete I
+ *  I.i.u R.x-y.v | i not in x-y			leave alone, nonoverlapping
+ *  R.x-y.v I.i.u | i in x-y				ERROR
+ *  R.x-y.v I.x.u 							R.x-y.uv (combine, delete I)
+ *  R.x-y.v I.i.u | i not in x-y			leave alone, nonoverlapping
+ *
+ *  I.i.u = insert u before op @ rwIndex i
+ *  R.x-y.u = replace x-y indexed tokens with u
+ *
+ *  First we need to examine replaces.  For any replace op:
+ *
+ * 		1. wipe out any insertions before op within that range.
+ *		2. Drop any replace op before that is contained completely within
+ *         that range.
+ *		3. Throw exception upon boundary overlap with any previous replace.
+ *
+ *  Then we can deal with inserts:
+ *
+ * 		1. for any inserts to same rwIndex, combine even if not adjacent.
+ * 		2. for any prior replace with same left boundary, combine this
+ *         insert with replace and delete this replace.
+ * 		3. throw exception if rwIndex in same range as previous replace
+ *
+ *  Don't actually delete; make op null in list. Easier to walk list.
+ *  Later we can throw as we add to rwIndex -> op map.
+ *
+ *  Note that I.2 R.2-2 will wipe out I.2 even though, technically, the
+ *  inserted stuff would be before the replace range.  But, if you
+ *  add tokens in front of a method body '{' and then delete the method
+ *  body, I think the stuff before the '{' you added should disappear too.
+ *
+ *  Return a map from token rwIndex to operation.
+ */
+- (HashMap *)reduceToSingleOperationPerIndex:(HashMap *)rewrites
+{
+    //System.out.println("rewrites="+rewrites);
+    if (debug > 1) NSLog(@"rewrites=%@\n", [rewrites getName:DEFAULT_PROGRAM_NAME]);
+    // WALK REPLACES
+    for (int i = 0; i < [rewrites count]; i++) {
+        RewriteOperation *op = (RewriteOperation *)[rewrites objectAtIndex:i];
+        if ( op==nil )
+            continue;
+        if ( !([[op class] isKindOfClass:[ANTLRReplaceOp class]]) )
+            continue;
+        ANTLRReplaceOp *rop = (ANTLRReplaceOp *)[rewrites objectAtIndex:i];
+        // Wipe prior inserts within range
+        //List inserts = getKindOfOps(rewrites, ANTLRInsertBeforeOp.class, i);
+        HashMap *inserts = [self getKindOfOps:rewrites KindOfClass:[ANTLRInsertBeforeOp class] Index:i];
+        for (int j = 0; j < [inserts size]; j++) {
+            ANTLRInsertBeforeOp *iop = (ANTLRInsertBeforeOp *)[inserts objectAtIndex:j];
+            if ( iop.rwIndex >= rop.rwIndex && iop.rwIndex <= rop.lastIndex ) {
+                // delete insert as it's a no-op.
+                [rewrites insertObject:nil atIndex:iop.instructionIndex];
+            }
+        }
+        // Drop any prior replaces contained within
+        HashMap *prevReplaces = [self getKindOfOps:rewrites KindOfClass:[ANTLRReplaceOp class] Index:i];
+        for (int j = 0; j < [prevReplaces count]; j++) {
+            ANTLRReplaceOp *prevRop = (ANTLRReplaceOp *) [prevReplaces objectAtIndex:j];
+            if ( prevRop.rwIndex>=rop.rwIndex && prevRop.lastIndex <= rop.lastIndex ) {
+                // delete replace as it's a no-op.
+                [rewrites setObject:nil atIndex:prevRop.instructionIndex];
+                continue;
+            }
+            // throw exception unless disjoint or identical
+            BOOL disjoint = prevRop.lastIndex<rop.rwIndex || prevRop.rwIndex > rop.lastIndex;
+            BOOL same = prevRop.rwIndex==rop.rwIndex && prevRop.lastIndex==rop.lastIndex;
+            if ( !disjoint && !same ) {
+                @throw [IllegalArgumentException newException:
+                        [NSString stringWithFormat:@"replace op boundaries of %@, overlap with previous %@\n", rop, prevRop]];
+            }
+        }
+    }
+    
+    // WALK INSERTS
+    for (int i = 0; i < [rewrites count]; i++) {
+        RewriteOperation *op = (RewriteOperation *)[rewrites objectAtIndex:i];
+        if ( op == nil )
+            continue;
+        if ( !([[op class] isKindOfClass:[ANTLRInsertBeforeOp class]]) )
+            continue;
+        ANTLRInsertBeforeOp *iop = (ANTLRInsertBeforeOp *)[rewrites objectAtIndex:i];
+        // combine current insert with prior if any at same rwIndex
+        HashMap *prevInserts = (HashMap *)[self getKindOfOps:rewrites KindOfClass:[ANTLRInsertBeforeOp class] Index:i];
+        for (int j = 0; j < [prevInserts count]; j++) {
+            ANTLRInsertBeforeOp *prevIop = (ANTLRInsertBeforeOp *) [prevInserts objectAtIndex:j];
+            if ( prevIop.rwIndex == iop.rwIndex ) { // combine objects
+                                                // convert to strings...we're in process of toString'ing
+                                                // whole token buffer so no lazy eval issue with any templates
+                iop.text = [self catOpText:iop.text PrevText:prevIop.text];
+                // delete redundant prior insert
+                [rewrites setObject:nil atIndex:prevIop.instructionIndex];
+            }
+        }
+        // look for replaces where iop.rwIndex is in range; error
+        HashMap *prevReplaces = (HashMap *)[self getKindOfOps:rewrites KindOfClass:[ANTLRReplaceOp class] Index:i];
+        for (int j = 0; j < [prevReplaces count]; j++) {
+            ANTLRReplaceOp *rop = (ANTLRReplaceOp *) [prevReplaces objectAtIndex:j];
+            if ( iop.rwIndex == rop.rwIndex ) {
+                rop.text = [self catOpText:iop.text PrevText:rop.text];
+                [rewrites setObject:nil atIndex:i];  // delete current insert
+                continue;
+            }
+            if ( iop.rwIndex >= rop.rwIndex && iop.rwIndex <= rop.lastIndex ) {
+                @throw [IllegalArgumentException newException:[NSString stringWithFormat:@"insert op %d within boundaries of previous %d", iop, rop]];
+            }
+        }
+    }
+    // System.out.println("rewrites after="+rewrites);
+    HashMap *m = [HashMap newHashMapWithLen:15];
+    for (int i = 0; i < [rewrites count]; i++) {
+        RewriteOperation *op = (RewriteOperation *)[rewrites objectAtIndex:i];
+        if ( op == nil )
+            continue; // ignore deleted ops
+        if ( [m objectAtIndex:op.rwIndex] != nil ) {
+            @throw [RuntimeException newException:@"should only be one op per rwIndex\n"];
+        }
+        //[m put(new Integer(op.rwIndex), op);
+        [m setObject:op atIndex:op.rwIndex];
+    }
+    //System.out.println("rwIndex to op: "+m);
+    if (debug > 1) NSLog(@"rwIndex to  op %d\n", (NSInteger)m);
+    return m;
+}
+
+- (NSString *)catOpText:(id)a PrevText:(id)b
+{
+    NSString *x = @"";
+    NSString *y = @"";
+    if ( a != nil )
+        x = [a toString];
+    if ( b != nil )
+        y = [b toString];
+    return [NSString stringWithFormat:@"%@%@",x, y];
+}
+
+- (HashMap *)getKindOfOps:(HashMap *)rewrites KindOfClass:(Class)kind
+{
+    return [self getKindOfOps:rewrites KindOfClass:kind Index:[rewrites count]];
+}
+
+/** Get all operations before an rwIndex of a particular kind */
+- (HashMap *)getKindOfOps:(HashMap *)rewrites KindOfClass:(Class)kind Index:(NSInteger)before
+{
+    HashMap *ops = [HashMap newHashMapWithLen:15];
+    for (int i = 0; i < before && i < [rewrites count]; i++) {
+        RewriteOperation *op = (RewriteOperation *)[rewrites objectAtIndex:i];
+        if ( op == nil )
+            continue; // ignore deleted
+        if ( [op isKindOfClass:(Class)kind] )
+            [ops addObject:op];
+    }		
+    return ops;
+}
+
+- (NSMutableString *)toDebugString
+{
+    return [self toDebugStringFromStart:MIN_TOKEN_INDEX ToEnd:[tokens count]-1];
+}
+
+- (NSMutableString *)toDebugStringFromStart:(NSInteger)start ToEnd:(NSInteger)end
+{
+    NSMutableString *buf = [NSMutableString stringWithCapacity:100];
+    for (int i = start; i >= MIN_TOKEN_INDEX && i <= end && i < [tokens count]; i++) {
+        [buf appendString:[[tokens objectAtIndex:i] text]];
+    }
+    return [NSString stringWithString:buf];
+}
+
+@end
diff --git a/runtime/ObjC/Framework/TokenSource.h b/runtime/ObjC/Framework/TokenSource.h
new file mode 100644
index 0000000..ff46d4c
--- /dev/null
+++ b/runtime/ObjC/Framework/TokenSource.h
@@ -0,0 +1,38 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+
+#import "Token.h"
+
+// Anything that responds to -nextToken can be treated as a lexer.
+// For instance this can be a flex lexer or a handwritten one or even
+// a proxy for a remotely running token source (database, lexer, whatever).
+@protocol TokenSource <NSObject, NSCopying>
+
+- (id<Token>) nextToken;
+- (NSString *)getSourceName;
+
+@end
diff --git a/runtime/ObjC/Framework/TokenStream.h b/runtime/ObjC/Framework/TokenStream.h
new file mode 100644
index 0000000..a8c9cf1
--- /dev/null
+++ b/runtime/ObjC/Framework/TokenStream.h
@@ -0,0 +1,62 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+
+#import "IntStream.h"
+#import "Token.h"
+
+@protocol TokenStream < IntStream >
+
+// Get Token at current input pointer + i ahead where i=1 is next Token.
+// i<0 indicates tokens in the past.  So -1 is previous token and -2 is
+// two tokens ago. LT:0 is undefined.  For i>=n, return Token.EOFToken.
+// Return null for LT:0 and any index that results in an absolute address
+// that is negative.
+
+- (id<Token>) LT:(NSInteger) i;
+
+- (id<Token>) getToken:(NSUInteger) i;
+
+- (id) getTokenSource;
+
+- (NSString *) toString;
+/** Return the text of all tokens from start to stop, inclusive.
+ *  If the stream does not buffer all the tokens then it can just
+ *  return "" or null;  Users should not access $ruleLabel.text in
+ *  an action of course in that case.
+ */
+- (NSString *)toStringFromStart:(NSInteger)startIdx ToEnd:(NSInteger)stopIdx;
+
+/** Because the user is not required to use a token with an index stored
+ *  in it, we must provide a means for two token objects themselves to
+ *  indicate the start/end location.  Most often this will just delegate
+ *  to the other toString(int,int).  This is also parallel with
+ *  the TreeNodeStream.toString(Object,Object).
+ */
+- (NSString *) toStringFromToken:(id<Token>)startToken ToToken:(id<Token>)stopToken;
+
+
+@end
diff --git a/runtime/ObjC/Framework/Tree.h b/runtime/ObjC/Framework/Tree.h
new file mode 100644
index 0000000..c398b22
--- /dev/null
+++ b/runtime/ObjC/Framework/Tree.h
@@ -0,0 +1,129 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+#ifndef DEBUG_DEALLOC
+#define DEBUG_DEALLOC
+#endif
+
+#import "AMutableArray.h"
+
+@protocol Tree < NSObject, NSCopying >
+
+//+ (id<Tree>) invalidNode;
+
+- (id<Tree>) getChild:(NSUInteger)index;
+- (NSUInteger) getChildCount;
+
+// Tree tracks parent and child index now > 3.0
+
+- (id<Tree>)getParent;
+
+- (void) setParent:(id<Tree>)t;
+
+/** Is there is a node above with token type ttype? */
+- (BOOL) hasAncestor:(NSInteger)ttype;
+
+/** Walk upwards and get first ancestor with this token type. */
+- (id<Tree>) getAncestor:(NSInteger) ttype;
+
+/** Return a list of all ancestors of this node.  The first node of
+ *  list is the root and the last is the parent of this node.
+ */
+- (AMutableArray *) getAncestors;
+
+/** This node is what child index? 0..n-1 */
+- (NSInteger) getChildIndex;
+
+- (void) setChildIndex:(NSInteger) index;
+
+/** Set the parent and child index values for all children */
+- (void) freshenParentAndChildIndexes;
+
+/** Add t as a child to this node.  If t is null, do nothing.  If t
+ *  is nil, add all children of t to this' children.
+ */
+- (void) addChild:(id<Tree>) t;
+
+/** Set ith child (0..n-1) to t; t must be non-null and non-nil node */
+- (void) setChild:(NSInteger)i With:(id<Tree>) t;
+
+- (id) deleteChild:(NSInteger) i;
+
+/** Delete children from start to stop and replace with t even if t is
+ *  a list (nil-root tree).  num of children can increase or decrease.
+ *  For huge child lists, inserting children can force walking rest of
+ *  children to set their childindex; could be slow.
+ */
+- (void) replaceChildrenFrom:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id)t;	
+
+- (NSArray *) children;
+// Add t as a child to this node.  If t is null, do nothing.  If t
+//  is nil, add all children of t to this' children.
+
+- (void) addChildren:(NSArray *) theChildren;
+//- (void) removeAllChildren;
+
+// Indicates the node is a nil node but may still have children, meaning
+// the tree is a flat list.
+
+- (BOOL) isNil;
+
+/**  What is the smallest token index (indexing from 0) for this node
+ *   and its children?
+ */
+- (NSInteger) getTokenStartIndex;
+
+- (void) setTokenStartIndex:(NSInteger) index;
+
+/**  What is the largest token index (indexing from 0) for this node
+ *   and its children?
+ */
+- (NSInteger) getTokenStopIndex;
+- (void) setTokenStopIndex:(NSInteger) index;
+
+- (id<Tree>) dupNode;
+
+- (NSString *) toString;
+
+#pragma mark Copying
+- (id) copyWithZone:(NSZone *)aZone;	// the children themselves are not copied here!
+- (id) deepCopy;					// performs a deepCopyWithZone: with the default zone
+- (id) deepCopyWithZone:(NSZone *)aZone;
+
+#pragma mark Tree Parser support
+- (NSInteger)type;
+- (NSString *)text;
+// In case we don't have a token payload, what is the line for errors?
+- (NSUInteger)line;
+- (NSUInteger)charPositionInLine;
+- (void) setCharPositionInLine:(NSUInteger)pos;
+
+#pragma mark Informational
+- (NSString *) treeDescription;
+- (NSString *) description;
+
+@end
+
diff --git a/runtime/ObjC/Framework/Tree.m b/runtime/ObjC/Framework/Tree.m
new file mode 100644
index 0000000..25c02dd
--- /dev/null
+++ b/runtime/ObjC/Framework/Tree.m
@@ -0,0 +1,149 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke
+// 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.
+
+#import "Tree.h"
+#import "Token.h"
+// TODO: this shouldn't be here...but needed for invalidNode
+#import "CommonTree.h"
+
+@implementation Tree
+
+@synthesize isEmpty;
+@synthesize isEmptyNode;
+@synthesize invalidNode;
+@synthesize children;
+
+#pragma mark Tree protocol conformance
+
++ (id<Tree>) invalidNode
+{
+	static id<Tree> invalidNode = nil;
+	if (!invalidNode) {
+		invalidNode = [[CommonTree alloc] initWithTokenType:TokenTypeInvalid];
+	}
+	return invalidNode;
+}
+
+- (id<Tree>) init
+{
+	self = [super init];
+	if ( self != nil ) {
+		isEmptyNode = NO;
+	}
+	return self;
+}
+
+- (void) dealloc
+{
+	[super dealloc];
+}
+
+- (id<Tree>) getChild:(NSUInteger) index
+{
+	return nil;
+}
+
+- (NSUInteger) getChildCount
+{
+	return 0;
+}
+
+- (NSArray *) getChildren
+{
+	return nil;
+}
+
+	// Add tree as a child to this node.  If tree is nil, do nothing.  If tree
+	// is an empty node, add all children of tree to our children.
+
+- (void) addChild:(id<Tree>) tree
+{
+}
+
+- (void) addChildren:(NSArray *) theChildren
+{
+}
+
+- (void) removeAllChildren
+{
+}
+
+	// Indicates the node is an empty node but may still have children, meaning
+	// the tree is a flat list.
+
+- (BOOL) isEmpty
+{
+	return isEmptyNode;
+}
+
+- (void) setIsEmpty:(BOOL)emptyFlag
+{
+	isEmptyNode = emptyFlag;
+}
+
+#pragma mark Tree abstract base class
+
+	// Return a token type; needed for tree parsing
+- (NSInteger) getType
+{
+	return 0;
+}
+
+- (NSString *) getText
+{
+	return [self description];
+}
+
+	// In case we don't have a token payload, what is the line for errors?
+- (NSInteger) getLine
+{
+	return 0;
+}
+
+- (NSInteger) getCharPositionInLine
+{
+	return 0;
+}
+
+- (NSString *) treeDescription
+{
+	return @"";
+}
+
+- (NSString *) description
+{
+	return @"";
+}
+
+- (void) _createChildrenList
+{
+	if ( children == nil )
+		children = [[NSMutableArray alloc] init];
+}
+
+@end
+
+@end
\ No newline at end of file
diff --git a/runtime/ObjC/Framework/TreeAdaptor.h b/runtime/ObjC/Framework/TreeAdaptor.h
new file mode 100644
index 0000000..fd4b792
--- /dev/null
+++ b/runtime/ObjC/Framework/TreeAdaptor.h
@@ -0,0 +1,157 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+#import "Token.h"
+#import "BaseTree.h"
+#import "TokenStream.h"
+
+#pragma warning tree/node diction is broken.
+
+@protocol TreeAdaptor <NSObject, NSCopying>
+
+#pragma mark Construction
+
+#pragma mark TreeAdaptor implementation
+- (id)dupNode:(id)aNode;	// copies just the node
+- (id)dupTree:(id)aTree;	// copies the entire subtree, recursively
+
+/** Return a nil node (an empty but non-null node) that can hold
+ *  a list of element as the children.  If you want a flat tree (a list)
+ *  use "t=adaptor.nil(); t.addChild(x); t.addChild(y);"
+ */
+- (id) emptyNode;
+
+/** Return a tree node representing an error.  This node records the
+ *  tokens consumed during error recovery.  The start token indicates the
+ *  input symbol at which the error was detected.  The stop token indicates
+ *  the last symbol consumed during recovery.
+ *
+ *  You must specify the input stream so that the erroneous text can
+ *  be packaged up in the error node.  The exception could be useful
+ *  to some applications; default implementation stores ptr to it in
+ *  the CommonErrorNode.
+ *
+ *  This only makes sense during token parsing, not tree parsing.
+ *  Tree parsing should happen only when parsing and tree construction
+ *  succeed.
+ */
+- (id) errorNode:(id<TokenStream>)anInput
+            From:(id<Token>)aStartToken
+              To:(id<Token>)aStopToken
+       Exception:(NSException *) e;
+
+/** Is tree considered a nil node used to make lists of child nodes? */
+- (BOOL) isNil:(id)aTree;
+
+
+- (void) addChild:(id)child toTree:(id)aTree;
+
+/** If oldRoot is a nil root, just copy or move the children to newRoot.
+ *  If not a nil root, make oldRoot a child of newRoot.
+ *
+ *    old=^(nil a b c), new=r yields ^(r a b c)
+ *    old=^(a b c), new=r yields ^(r ^(a b c))
+ *
+ *  If newRoot is a nil-rooted single child tree, use the single
+ *  child as the new root node.
+ *
+ *    old=^(nil a b c), new=^(nil r) yields ^(r a b c)
+ *    old=^(a b c), new=^(nil r) yields ^(r ^(a b c))
+ *
+ *  If oldRoot was null, it's ok, just return newRoot (even if isNil).
+ *
+ *    old=null, new=r yields r
+ *    old=null, new=^(nil r) yields ^(nil r)
+ *
+ *  Return newRoot.  Throw an exception if newRoot is not a
+ *  simple node or nil root with a single child node--it must be a root
+ *  node.  If newRoot is ^(nil x) return x as newRoot.
+ *
+ *  Be advised that it's ok for newRoot to point at oldRoot's
+ *  children; i.e., you don't have to copy the list.  We are
+ *  constructing these nodes so we should have this control for
+ *  efficiency.
+ */
+- (id) becomeRoot:(id)newRoot old:(id)oldRoot;
+
+- (id) rulePostProcessing:(id)root;
+
+#pragma mark Rewrite Rules
+                           
+- (NSUInteger) getUniqueID:(id)aNode;
+
+- (id) create:(id<Token>)payload;
+- (id) createTree:(NSInteger)tokenType FromToken:(id<Token>)fromToken;
+- (id) createTree:(NSInteger)tokenType FromToken:(id<Token>)fromToken Text:(NSString *)text;
+- (id) createTree:(NSInteger)tokenType Text:(NSString *)text;
+
+#pragma mark Content
+
+- (id)dupNode:(id)aNode;
+- (id)dupTree:(id)aTree;
+
+- (NSInteger) getType:(id)aNode;
+- (void) setType:(id)aNode Type:(NSInteger)tokenType;
+
+- (NSString *) getText:(id)aNode;
+- (void) setText:(id)aNode Text:(NSString *)tokenText;
+
+- (id<Token>) getToken:(id)t;
+
+- (void) setTokenBoundaries:(id)aTree From:(id<Token>)startToken To:(id<Token>)stopToken;
+- (NSInteger) getTokenStartIndex:(id)aTree;
+- (NSInteger) getTokenStopIndex:(id)aTree;
+
+#pragma mark Navigation / Tree Parsing
+
+/** Get a child 0..n-1 node */
+- (id) getChild:(id)aNode At:(NSInteger) i;
+/** Set ith child (0..n-1) to t; t must be non-null and non-nil node */
+- (void) setChild:(id)aTree At:(NSInteger)index Child:(id)child;
+/** Remove ith child and shift children down from right. */
+- (id) deleteChild:(id)t Index:(NSInteger)index;
+
+/** How many children?  If 0, then this is a leaf node */
+- (NSInteger) getChildCount:(id) aTree;
+
+/** Who is the parent node of this node; if null, implies node is root.
+ *  If your node type doesn't handle this, it's ok but the tree rewrites
+ *  in tree parsers need this functionality.
+ */
+- (id)getParent:(id)t;
+- (void) setParent:(id)t With:(id)parent;
+
+/** What index is this node in the child list? Range: 0..n-1
+ *  If your node type doesn't handle this, it's ok but the tree rewrites
+ *  in tree parsers need this functionality.
+ */
+- (NSInteger) getChildIndex:(id)t;
+- (void) setChildIndex:(id)t With:(NSInteger)index;
+
+- (void) replaceChildren:(id)parent From:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id)t;
+
+@end
+
diff --git a/runtime/ObjC/Framework/TreeAdaptor.m b/runtime/ObjC/Framework/TreeAdaptor.m
new file mode 100644
index 0000000..fe837ee
--- /dev/null
+++ b/runtime/ObjC/Framework/TreeAdaptor.m
@@ -0,0 +1,238 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke
+// 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.
+
+#import "TreeAdaptor.h"
+#import "TreeException.h"
+#import "BaseTree.h"
+
+@implementation TreeAdaptor
+
+
++ (id) newEmptyTree
+{
+	return [TreeAdaptor newTreeWithToken:nil];
+}
+
++ (id) newAdaptor
+{
+    return [[TreeAdaptor alloc] init];
+}
+
+- (id) init
+{
+    self = [super init];
+    return self;
+}
+
+- (id) initWithPayload:(id<Token>)payload
+{
+    self = [super init];
+    return self;
+}
+
+#pragma mark Rewrite Rules
+
+/** Create a tree node from Token object; for CommonTree type trees,
+ *  then the token just becomes the payload.  This is the most
+ *  common create call.
+ *
+ *  Override if you want another kind of node to be built.
+ */
+- (id) create:(id<Token>) payload
+{
+    return nil;
+}
+
+/** Create a new node derived from a token, with a new token type.
+ *  This is invoked from an imaginary node ref on right side of a
+ *  rewrite rule as IMAG[$tokenLabel].
+ *
+ *  This should invoke createToken(Token).
+ */
+- (id) createTree:(NSInteger)tokenType fromToken:(id<Token>)fromToken
+{
+	id<Token> newToken = [self createToken:fromToken];
+	[newToken setType:tokenType];
+    
+	id newTree = [self create:newToken];
+	[newToken release];
+	return newTree;
+}
+
+/** Create a new node derived from a token, with a new token type.
+ *  This is invoked from an imaginary node ref on right side of a
+ *  rewrite rule as IMAG[$tokenLabel].
+ *
+ *  This should invoke createToken(Token).
+ */
+- (id) createTree:(NSInteger)tokenType fromToken:(id<Token>)fromToken text:(NSString *)tokenText
+{
+	id<Token> newToken = [self createToken:fromToken];
+	[newToken setText:tokenText];
+	
+	id newTree = [self create:newToken];
+	[newToken release];
+	return newTree;
+}
+
+/** Create a new node derived from a token, with a new token type.
+ *  This is invoked from an imaginary node ref on right side of a
+ *  rewrite rule as IMAG["IMAG"].
+ *
+ *  This should invoke createToken(int,String).
+ */
+- (id) createTree:(NSInteger)tokenType text:(NSString *)tokenText
+{
+	id<Token> newToken = [self createToken:tokenType text:tokenText];
+	
+	id newTree = [self create:newToken];
+	[newToken release];
+	return newTree;
+}
+
+- (id) copyNode:(id)aNode
+{
+	return [aNode copyWithZone:nil];	// not -copy: to silence warnings
+}
+
+- (id) copyTree:(id)aTree
+{
+	return [aTree deepCopy];
+}
+
+
+- (void) addChild:(id)child toTree:(id)aTree
+{
+	[aTree addChild:child];
+}
+
+- (id) makeNode:(id)newRoot parentOf:(id)oldRoot
+{
+	id newRootNode = newRoot;
+
+	if (oldRoot == nil)
+		return newRootNode;
+    // handles ^(nil real-node) case
+	if ([newRootNode isNil]) {
+		if ([newRootNode getChildCount] > 1) {
+#warning TODO: Find a way to the current input stream here!
+			@throw [TreeException exceptionWithOldRoot:oldRoot newRoot:newRootNode stream:nil];
+		}
+#warning TODO: double check memory management with respect to code generation
+		// remove the empty node, placing its sole child in its role.
+		id tmpRootNode = [[newRootNode childAtIndex:0] retain];
+		[newRootNode release];
+		newRootNode = tmpRootNode;		
+	}
+	// the handling of an empty node at the root of oldRoot happens in addChild:
+	[newRootNode addChild:oldRoot];
+    // this release relies on the fact that the ANTLR code generator always assigns the return value of this method
+    // to the variable originally holding oldRoot. If we don't release we leak the reference.
+    // FIXME: this is totally non-obvious. maybe do it in calling code by comparing pointers and conditionally releasing
+    // the old object
+    [oldRoot release];
+    
+    // what happens to newRootNode's retain count? Should we be autoreleasing this one? Probably.
+	return [newRootNode retain];
+}
+
+
+- (id) postProcessTree:(id)aTree
+{
+	id processedNode = aTree;
+	if (aTree != nil && [aTree isNil] != NO && [aTree getChildCount] == 1) {
+		processedNode = [aTree childAtIndex:0];
+	}
+	return processedNode;
+}
+
+
+- (NSUInteger) uniqueIdForTree:(id)aNode
+{
+	// TODO: is hash appropriate here?
+	return [aNode hash];
+}
+
+
+#pragma mark Content
+
+- (NSInteger) tokenTypeForNode:(id)aNode
+{
+	return [aNode getType];
+}
+
+- (void) setTokenType:(NSInteger)tokenType forNode:(id)aNode
+{
+	// currently unimplemented
+}
+
+
+- (NSString *) textForNode:(id)aNode
+{
+	return [aNode getText];
+}
+
+- (void) setText:(NSString *)tokenText forNode:(id)aNode
+{
+	// currently unimplemented
+}
+
+
+#pragma mark Navigation / Tree Parsing
+
+- (id) childForNode:(id) aNode atIndex:(NSInteger) i
+{
+	// currently unimplemented
+	return nil;
+}
+
+- (NSInteger) childCountForTree:(id) aTree
+{
+	// currently unimplemented
+	return 0;
+}
+
+#pragma mark Subclass Responsibilties
+
+- (void) setBoundariesForTree:(id)aTree fromToken:(id<Token>)startToken toToken:(id<Token>)stopToken
+{
+	// subclass responsibility
+}
+
+- (NSInteger) tokenStartIndexForTree:(id)aTree
+{
+	// subclass responsibility
+	return 0;
+}
+
+- (NSInteger) tokenStopIndexForTree:(id)aTree
+{
+	// subclass responsibility
+	return 0;
+}
+
+
+@end
diff --git a/runtime/ObjC/Framework/TreeException.h b/runtime/ObjC/Framework/TreeException.h
new file mode 100644
index 0000000..739e205
--- /dev/null
+++ b/runtime/ObjC/Framework/TreeException.h
@@ -0,0 +1,42 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "Tree.h"
+#import "RecognitionException.h"
+
+@interface TreeException : RecognitionException {
+	id<BaseTree> oldRoot;
+	id<BaseTree> newRoot;
+}
+
++ (id) newException:(id<BaseTree>)theOldRoot newRoot:(id<BaseTree>)theNewRoot stream:(id<IntStream>)aStream;
+- (id) initWithOldRoot:(id<BaseTree>)theOldRoot newRoot:(id<BaseTree>)theNewRoot stream:(id<IntStream>)aStream;
+
+- (void) setOldRoot:(id<BaseTree>)aTree;
+- (void) setNewRoot:(id<BaseTree>)aTree;
+
+@end
diff --git a/runtime/ObjC/Framework/TreeException.m b/runtime/ObjC/Framework/TreeException.m
new file mode 100644
index 0000000..3188f85
--- /dev/null
+++ b/runtime/ObjC/Framework/TreeException.m
@@ -0,0 +1,85 @@
+//
+//  TreeException.m
+//  ANTLR
+//
+//  Created by Kay Röpke on 24.10.2006.
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+
+#import "TreeException.h"
+
+
+@implementation TreeException
+
++ (id) newException:(id<BaseTree>)theOldRoot newRoot:(id<BaseTree>)theNewRoot stream:(id<IntStream>)aStream;
+{
+	return [[TreeException alloc] initWithOldRoot:theOldRoot newRoot:theNewRoot stream:aStream];
+}
+
+- (id) initWithOldRoot:(id<BaseTree>)theOldRoot newRoot:(id<BaseTree>)theNewRoot stream:(id<IntStream>)aStream;
+{
+	if ((self = [super initWithStream:aStream reason:@"The new root has more than one child. Cannot make it the root node."]) != nil ) {
+		[self setOldRoot:theOldRoot];
+		[self setNewRoot:theNewRoot];
+	}
+	return self;
+}
+
+- (void) dealloc
+{
+#ifdef DEBUG_DEALLOC
+    NSLog( @"called dealloc in TreeException" );
+#endif
+	[self setOldRoot:nil];
+	[self setNewRoot:nil];
+	[super dealloc];
+}
+
+- (void) setNewRoot:(id<BaseTree>)aTree
+{
+	if (newRoot != aTree) {
+		[aTree retain];
+		if ( newRoot ) [newRoot release];
+		newRoot = aTree;
+	}
+}
+
+- (void) setOldRoot:(id<BaseTree>)aTree
+{
+	if (oldRoot != aTree) {
+		[aTree retain];
+		if ( oldRoot ) [oldRoot release];
+		oldRoot = aTree;
+	}
+}
+
+- (NSString *) description
+{
+	 return [NSMutableString stringWithFormat:@"%@ old root: <%@> new root: <%@>", [super description], [oldRoot treeDescription], [newRoot treeDescription]];
+}
+
+@end
diff --git a/runtime/ObjC/Framework/TreeFilter.h b/runtime/ObjC/Framework/TreeFilter.h
new file mode 100644
index 0000000..950e573
--- /dev/null
+++ b/runtime/ObjC/Framework/TreeFilter.h
@@ -0,0 +1,203 @@
+/*
+ [The "BSD license"]
+ Copyright (c) 2005-2009 Terence Parr
+ 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.
+ */
+
+/* Java Stuff
+package org.antlr.runtime.tree;
+
+import org.antlr.runtime.RecognizerSharedState;
+import org.antlr.runtime.RecognitionException;
+import org.antlr.runtime.TokenStream;
+*/
+
+/**
+ Cut-n-paste from material I'm not using in the book anymore (edit later
+ to make sense):
+
+ Now, how are we going to test these tree patterns against every
+subtree in our original tree?  In what order should we visit nodes?
+For this application, it turns out we need a simple ``apply once''
+rule application strategy and a ``down then up'' tree traversal
+strategy.  Let's look at rule application first.
+
+As we visit each node, we need to see if any of our patterns match. If
+a pattern matches, we execute the associated tree rewrite and move on
+to the next node. In other words, we only look for a single rule
+application opportunity (we'll see below that we sometimes need to
+repeatedly apply rules). The following method applies a rule in a @cl
+TreeParser (derived from a tree grammar) to a tree:
+
+here is where weReferenced code/walking/patterns/TreePatternMatcher.java
+
+It uses reflection to lookup the appropriate rule within the generated
+tree parser class (@cl Simplify in this case). Most of the time, the
+rule will not match the tree.  To avoid issuing syntax errors and
+attempting error recovery, it bumps up the backtracking level.  Upon
+failure, the invoked rule immediately returns. If you don't plan on
+using this technique in your own ANTLR-based application, don't sweat
+the details. This method boils down to ``call a rule to match a tree,
+executing any embedded actions and rewrite rules.''
+
+At this point, we know how to define tree grammar rules and how to
+apply them to a particular subtree. The final piece of the tree
+pattern matcher is the actual tree traversal. We have to get the
+correct node visitation order.  In particular, we need to perform the
+scalar-vector multiply transformation on the way down (preorder) and
+we need to reduce multiply-by-zero subtrees on the way up (postorder).
+
+To implement a top-down visitor, we do a depth first walk of the tree,
+executing an action in the preorder position. To get a bottom-up
+visitor, we execute an action in the postorder position.  ANTLR
+provides a standard @cl TreeVisitor class with a depth first search @v
+visit method. That method executes either a @m pre or @m post method
+or both. In our case, we need to call @m applyOnce in both. On the way
+down, we'll look for @r vmult patterns. On the way up,
+we'll look for @r mult0 patterns.
+ */
+
+/*  Java Stuff
+public class TreeFilter extends TreeParser {
+    public interface fptr {
+        public void rule() throws RecognitionException;
+    }
+
+    protected TokenStream originalTokenStream;
+    protected TreeAdaptor originalAdaptor;
+
+    public TreeFilter(TreeNodeStream input) {
+        this(input, new RecognizerSharedState());
+    }
+    public TreeFilter(TreeNodeStream input, RecognizerSharedState state) {
+        super(input, state);
+        originalAdaptor = input.getTreeAdaptor();
+        originalTokenStream = input.getTokenStream();
+    }
+
+    public void applyOnce(Object t, fptr whichRule) {
+        if ( t==null ) return;
+        try {
+            // share TreeParser object but not parsing-related state
+            state = new RecognizerSharedState();
+            input = new CommonTreeNodeStream(originalAdaptor, t);
+            ((CommonTreeNodeStream)input).setTokenStream(originalTokenStream);
+            setBacktrackingLevel(1);
+            whichRule.rule();
+            setBacktrackingLevel(0);
+        }
+        catch (RecognitionException e) { ; }
+    }
+
+    public void downup(Object t) {
+        TreeVisitor v = new TreeVisitor(new CommonTreeAdaptor());
+        TreeVisitorAction actions = new TreeVisitorAction() {
+            public Object pre(Object t)  { applyOnce(t, topdown_fptr); return t; }
+            public Object post(Object t) { applyOnce(t, bottomup_fptr); return t; }
+        };
+        v.visit(t, actions);
+    }
+        
+    fptr topdown_fptr = new fptr() {
+        public void rule() throws RecognitionException {
+            topdown();
+        }
+    };
+
+    fptr bottomup_fptr = new fptr() {
+        public void rule() throws RecognitionException {
+            bottomup();
+        }
+    };
+
+    // methods the downup strategy uses to do the up and down rules.
+    // to override, just define tree grammar rule topdown and turn on
+    // filter=true.
+    public void topdown() throws RecognitionException {;}
+    public void bottomup() throws RecognitionException {;}
+}
+*/
+
+#import "RecognizerSharedState.h"
+#import "TokenStream.h"
+#import "TreeAdaptor.h"
+#import "TreeNodeStream.h"
+#import "TreeParser.h"
+#import "TreeVisitor.h"
+#import "TreeVisitorAction.h"
+
+@class TreeFilter;
+
+@interface fptr : NSObject {
+    SEL whichRule;
+    TreeFilter *treeFilter;
+}
+
+@property (assign) SEL whichRule;
+@property (assign) TreeFilter *treeFilter;
+
++ (fptr *) newfptr:(TreeFilter *)aTreeFilter Rule:(SEL) aRule;
+
+- (fptr *) init:(TreeFilter *)aTreeFilter Rule:(SEL)aRule;
+
+- (void) rule;
+
+@end
+
+@interface TreeFilter : TreeParser {
+    
+id<TokenStream> originalTokenStream;
+id<TreeAdaptor> originalAdaptor;
+fptr *topdown_fptr;
+fptr *bottomup_fptr;
+
+}
+
++ (id) newTreeFilter:(id<TreeNodeStream>)input;
+
++ (id) newTreeFilter:(id<TreeNodeStream>)input State:(RecognizerSharedState *)state;
+    
+- (id) initWithStream:(id<TreeNodeStream>)anInput State:(RecognizerSharedState *)aState;
+
+- (void) applyOnce:(id<BaseTree>)t rule:(fptr *)whichRule;
+    
+- (void) downup:(id<BaseTree>)t;
+
+- (void) settopdown_fptr;
+- (void) setbottomdown_fptr;
+    
+    // methods the downup strategy uses to do the up and down rules.
+    // to override, just define tree grammar rule topdown and turn on
+    // filter=true.
+- (void) topdown;
+- (void) bottomup;
+
+@property (retain) id<TokenStream> originalTokenStream;
+@property (retain) id<TreeAdaptor> originalAdaptor;
+@property (retain, setter=settopdown_fptr:) fptr *topdown_fptr;
+@property (retain, setter=setbottomdown_fptr:) fptr *bottomup_fptr;
+
+@end
+// end TreeFilter.h
diff --git a/runtime/ObjC/Framework/TreeFilter.m b/runtime/ObjC/Framework/TreeFilter.m
new file mode 100644
index 0000000..9730ad0
--- /dev/null
+++ b/runtime/ObjC/Framework/TreeFilter.m
@@ -0,0 +1,258 @@
+/*
+ [The "BSD license"]
+ Copyright (c) 2005-2009 Terence Parr
+ 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.
+ */
+
+/* Java Stuff
+package org.antlr.runtime.tree;
+
+import org.antlr.runtime.RecognizerSharedState;
+import org.antlr.runtime.RecognitionException;
+import org.antlr.runtime.TokenStream;
+*/
+
+/**
+ Cut-n-paste from material I'm not using in the book anymore (edit later
+ to make sense):
+
+ Now, how are we going to test these tree patterns against every
+subtree in our original tree?  In what order should we visit nodes?
+For this application, it turns out we need a simple ``apply once''
+rule application strategy and a ``down then up'' tree traversal
+strategy.  Let's look at rule application first.
+
+As we visit each node, we need to see if any of our patterns match. If
+a pattern matches, we execute the associated tree rewrite and move on
+to the next node. In other words, we only look for a single rule
+application opportunity (we'll see below that we sometimes need to
+repeatedly apply rules). The following method applies a rule in a @cl
+TreeParser (derived from a tree grammar) to a tree:
+
+here is where weReferenced code/walking/patterns/TreePatternMatcher.java
+
+It uses reflection to lookup the appropriate rule within the generated
+tree parser class (@cl Simplify in this case). Most of the time, the
+rule will not match the tree.  To avoid issuing syntax errors and
+attempting error recovery, it bumps up the backtracking level.  Upon
+failure, the invoked rule immediately returns. If you don't plan on
+using this technique in your own ANTLR-based application, don't sweat
+the details. This method boils down to ``call a rule to match a tree,
+executing any embedded actions and rewrite rules.''
+
+At this point, we know how to define tree grammar rules and how to
+apply them to a particular subtree. The final piece of the tree
+pattern matcher is the actual tree traversal. We have to get the
+correct node visitation order.  In particular, we need to perform the
+scalar-vector multiply transformation on the way down (preorder) and
+we need to reduce multiply-by-zero subtrees on the way up (postorder).
+
+To implement a top-down visitor, we do a depth first walk of the tree,
+executing an action in the preorder position. To get a bottom-up
+visitor, we execute an action in the postorder position.  ANTLR
+provides a standard @cl TreeVisitor class with a depth first search @v
+visit method. That method executes either a @m pre or @m post method
+or both. In our case, we need to call @m applyOnce in both. On the way
+down, we'll look for @r vmult patterns. On the way up,
+we'll look for @r mult0 patterns.
+ */
+
+/*  Java Stuff
+public class TreeFilter extends TreeParser {
+    public interface fptr {
+        public void rule() throws RecognitionException;
+    }
+
+    protected TokenStream originalTokenStream;
+    protected TreeAdaptor originalAdaptor;
+
+    public TreeFilter(TreeNodeStream input) {
+        this(input, new RecognizerSharedState());
+    }
+    public TreeFilter(TreeNodeStream input, RecognizerSharedState state) {
+        super(input, state);
+        originalAdaptor = input.getTreeAdaptor();
+        originalTokenStream = input.getTokenStream();
+    }
+
+    public void applyOnce(Object t, fptr whichRule) {
+        if ( t==null ) return;
+        try {
+            // share TreeParser object but not parsing-related state
+            state = new RecognizerSharedState();
+            input = new CommonTreeNodeStream(originalAdaptor, t);
+            ((CommonTreeNodeStream)input).setTokenStream(originalTokenStream);
+            setBacktrackingLevel(1);
+            whichRule.rule();
+            setBacktrackingLevel(0);
+        }
+        catch (RecognitionException e) { ; }
+    }
+
+    public void downup(Object t) {
+        TreeVisitor v = new TreeVisitor(new CommonTreeAdaptor());
+        TreeVisitorAction actions = new TreeVisitorAction() {
+            public Object pre(Object t)  { applyOnce(t, topdown_fptr); return t; }
+            public Object post(Object t) { applyOnce(t, bottomup_fptr); return t; }
+        };
+        v.visit(t, actions);
+    }
+        
+    fptr topdown_fptr = new fptr() {
+        public void rule() throws RecognitionException {
+            topdown();
+        }
+    };
+
+    fptr bottomup_fptr = new fptr() {
+        public void rule() throws RecognitionException {
+            bottomup();
+        }
+    };
+
+    // methods the downup strategy uses to do the up and down rules.
+    // to override, just define tree grammar rule topdown and turn on
+    // filter=true.
+    public void topdown() throws RecognitionException {;}
+    public void bottomup() throws RecognitionException {;}
+}
+
+*/
+
+#import "CommonTreeNodeStream.h"
+#import "TreeFilter.h"
+
+@class TreeFilter;
+
+@implementation fptr
+
++ (fptr *) newfptr:(TreeFilter *)aTreeFilter Rule:(SEL) aRule
+{
+    return [[fptr alloc] init];
+}
+
+- (fptr *) init:(TreeFilter *)aTreeFilter Rule:(SEL)aRule
+{
+    if ( (self = [super init]) != nil ) {
+        whichRule = aRule;
+        treeFilter = aTreeFilter;
+    }
+    return self;
+}
+
+- (void) rule
+{
+    if ( [treeFilter respondsToSelector:whichRule] ) {
+        [treeFilter performSelector:whichRule];
+    }
+    return;
+}
+
+@synthesize whichRule;
+@synthesize treeFilter;
+
+@end
+
+@implementation TreeFilter
+
++ (TreeFilter *) newTreeFilter:(id<TreeNodeStream>)anInput
+{
+        
+    return [[TreeFilter alloc] initWithStream:anInput State:[RecognizerSharedState newRecognizerSharedState]];
+}
+
++ (TreeFilter *) newTreeFilter:(id<TreeNodeStream>)anInput State:(RecognizerSharedState *) aState
+{
+    return [[TreeFilter alloc] initWithStream:anInput State:aState];
+}
+
+- (id) initWithStream:(id<TreeNodeStream>)anInput State:(RecognizerSharedState *)aState
+{
+    if (( self = [super initWithStream:input State:aState]) != nil ) {
+        originalAdaptor = [anInput getTreeAdaptor];
+        originalTokenStream = [anInput getTokenStream];
+        topdown_fptr = nil;
+        bottomup_fptr = nil;
+    }
+    return self;
+}
+    
+- (void) applyOnce:(id<BaseTree>)t rule:(fptr *)whichRule
+{
+        if ( t==nil ) return;
+        @try {
+            // share TreeParser object but not parsing-related state
+            state = [RecognizerSharedState newRecognizerSharedState];
+            input = [CommonTreeNodeStream newCommonTreeNodeStream:originalAdaptor Tree:(CommonTree *)t];
+            [(CommonTreeNodeStream *)input setTokenStream:originalTokenStream];
+            [self setBacktrackingLevel:1];
+            [whichRule rule];
+            [self setBacktrackingLevel:0];
+        }
+        @catch (RecognitionException *e) { ; }
+    }
+    
+- (void) downup:(id<BaseTree>) t
+{
+    TreeVisitor *v = [TreeVisitor newTreeVisitor:[CommonTreeAdaptor newTreeAdaptor]];
+    TreeVisitorAction *actions = [TreeVisitorActionFiltered newTreeVisitorActionFiltered:self 
+                                                                                   RuleD:topdown_fptr
+                                                                                   RuleU:bottomup_fptr];
+    [v visit:t Action:actions];
+}
+    
+- (void) settopdown_fptr
+{
+    SEL aRule = @selector(topdown);
+    topdown_fptr =  [fptr newfptr:self Rule:aRule];
+}
+- (void) setbottomdown_fptr
+{
+    SEL aRule = @selector(bottomup);
+    bottomup_fptr =  [fptr newfptr:self Rule:aRule];
+}
+
+    // methods the downup strategy uses to do the up and down rules.
+    // to override, just define tree grammar rule topdown and turn on
+    // filter=true.
+- (void) topdown
+{
+    return;
+}
+    
+- (void) bottomup
+{
+    return;
+}
+
+@synthesize originalTokenStream;
+@synthesize originalAdaptor;
+@synthesize topdown_fptr;
+@synthesize bottomup_fptr;
+
+@end
+
+// end TreeFilter.h
+
diff --git a/runtime/ObjC/Framework/TreeIterator.h b/runtime/ObjC/Framework/TreeIterator.h
new file mode 100644
index 0000000..36976fc
--- /dev/null
+++ b/runtime/ObjC/Framework/TreeIterator.h
@@ -0,0 +1,72 @@
+//
+//  TreeIterator.h
+//  ANTLR
+//
+//  Created by Ian Michell on 26/04/2010.
+// [The "BSD licence"]
+// Copyright (c) 2010 Ian Michell 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "CommonTreeAdaptor.h"
+#import "FastQueue.h"
+#import "TreeAdaptor.h"
+#import "Tree.h"
+
+@interface TreeIterator : NSObject 
+{
+	BOOL firstTime;
+	__strong id<TreeAdaptor> adaptor;
+	__strong id<BaseTree> root;
+	__strong id<BaseTree> tree;
+	
+	__strong FastQueue *nodes;
+	__strong id<BaseTree> up;
+	__strong id<BaseTree> down;
+	__strong id<BaseTree> eof;
+}
+
+@property BOOL firstTime;
+@property(retain) id<TreeAdaptor> adaptor;
+@property(retain) id<BaseTree> root;
+@property(retain) id<BaseTree> tree;
+@property(retain) FastQueue *nodes;
+@property(retain, readwrite) id<BaseTree> up;
+@property(retain, readwrite) id<BaseTree> down;
+@property(retain, readwrite) id<BaseTree> eof;
+
++ newANTRLTreeIterator;
++ (TreeIterator *) newANTRLTreeIteratorWithAdaptor:(CommonTreeAdaptor *)adaptor
+                                                andTree:(id<BaseTree>)tree;
+- (id) init;
+- (id) initWithTree:(id<BaseTree>) t;
+- (id) initWithTreeAdaptor:(id<TreeAdaptor>) a andTree:(id<BaseTree>) t;
+
+- (void) reset;
+- (BOOL) hasNext;
+- (id) nextObject;
+- (NSArray *) allObjects;
+
+@end
diff --git a/runtime/ObjC/Framework/TreeIterator.m b/runtime/ObjC/Framework/TreeIterator.m
new file mode 100644
index 0000000..a79f97f
--- /dev/null
+++ b/runtime/ObjC/Framework/TreeIterator.m
@@ -0,0 +1,202 @@
+//
+//  TreeIterator.m
+//  ANTLR
+//
+//  Created by Ian Michell on 26/04/2010.
+// Copyright (c) 2010 Ian Michell 2010 Alan Condit
+// 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.
+
+
+#import "TreeIterator.h"
+#import "CommonTreeAdaptor.h"
+
+@implementation TreeIterator
+
++ (TreeIterator *) newANTRLTreeIterator
+{
+    return [[TreeIterator alloc] init];
+}
+
++ (TreeIterator *) newANTRLTreeIteratorWithAdaptor:(CommonTreeAdaptor *)adaptor
+                                                andTree:(id<BaseTree>)tree
+{
+    return [[TreeIterator alloc] initWithTreeAdaptor:adaptor andTree:tree];
+}
+
+- (id) init
+{
+    self = [super init];
+    if ( self != nil ) {
+        firstTime = YES;
+        nodes = [[FastQueue newFastQueue] retain];
+        down = [[adaptor createTree:TokenTypeDOWN Text:@"DOWN"] retain];
+        up = [[adaptor createTree:TokenTypeUP Text:@"UP"] retain];
+        eof = [[adaptor createTree:TokenTypeEOF Text:@"EOF"] retain];
+        tree = eof;
+        root = eof;
+    }
+    return self;
+}
+
+-(id) initWithTree:(id<BaseTree>) t
+{
+    self = [super init];
+    if ( self != nil ) {
+        firstTime = YES;
+        adaptor = [[CommonTreeAdaptor newTreeAdaptor] retain];
+        tree = [t retain];
+        root = t;
+        nodes = [[FastQueue newFastQueue] retain];
+        down = [[adaptor createTree:TokenTypeDOWN Text:@"DOWN"] retain];
+        up = [[adaptor createTree:TokenTypeUP Text:@"UP"] retain];
+        eof = [[adaptor createTree:TokenTypeEOF Text:@"EOF"] retain];
+    }
+    return self;
+}
+
+-(id) initWithTreeAdaptor:(id<TreeAdaptor>)a andTree:(id<BaseTree>)t
+{
+    self = [super init];
+    if ( self != nil ) {
+        firstTime = YES;
+        adaptor = [a retain];
+        tree = [t retain];
+        root = t;
+        nodes = [[FastQueue newFastQueue] retain];
+        down = [[adaptor createTree:TokenTypeDOWN Text:@"DOWN"] retain];
+        up = [[adaptor createTree:TokenTypeUP Text:@"UP"] retain];
+        eof = [[adaptor createTree:TokenTypeEOF Text:@"EOF"] retain];
+    }
+    return self;
+}
+
+- (void)dealloc
+{
+#ifdef DEBUG_DEALLOC
+    NSLog( @"called dealloc in TreeIterator" );
+#endif
+    if ( adaptor ) [adaptor release];
+    if ( nodes ) [nodes release];
+    if ( tree && tree != eof ) [tree release];
+    if ( root && root != eof && root != tree ) [root release];
+    if ( down ) [down release];    
+    if ( up ) [up release];    
+    if ( eof ) [eof release];    
+    [super dealloc];
+}
+
+- (void)reset
+{
+    firstTime = YES;
+    tree = root;
+    [nodes clear];
+}
+
+-(BOOL) hasNext
+{
+    if ( firstTime ) {
+        return root != nil;
+    }
+    if ( nodes && [nodes size] > 0) {
+        return YES;
+    }
+    if ( tree == nil ) {
+        return NO;
+    }
+    if ( [adaptor getChildCount:tree] > 0 ) {
+        return YES;
+    }
+    return [adaptor getParent:tree] != nil;
+}
+
+-(id) nextObject
+{
+    // is this the first time we are using this method?
+    if ( firstTime ) {
+        firstTime = NO;
+        if ( [adaptor getChildCount:tree] == 0 ) {
+            [nodes addObject:eof];
+            return tree;
+        }
+        return tree;
+    }
+    // do we have any objects queued up?
+    if ( nodes && [nodes size] > 0 ) {
+        return [nodes remove];
+    }
+    // no nodes left?
+    if ( tree == nil ) {
+        return eof;
+    }
+    if ( [adaptor getChildCount:tree] > 0 ) {
+        tree = [adaptor getChild:tree At:0];
+        [nodes addObject:tree]; // real node is next after down
+        return self.down;
+    }
+    // if no children, look for next sibling of ancestor
+    id<BaseTree> parent = [adaptor getParent:tree];
+    while (parent != nil && ([adaptor getChildIndex:tree] + 1) >= [adaptor getChildCount:parent]) {
+        [nodes addObject:up];
+        tree = parent;
+        parent = [adaptor getParent:tree];
+    }
+    if ( parent == nil ) {
+        tree = nil;
+        [nodes addObject:self.eof];
+        return [nodes remove];
+    }
+    // must have found a node with an unvisited sibling
+    // move to it and return it
+    NSInteger nextSiblingIndex = [adaptor getChildIndex:tree] + 1;
+    tree = [adaptor getChild:parent At:nextSiblingIndex];
+    [nodes addObject:tree];
+    return [nodes remove];
+}
+
+-(NSArray *) allObjects
+{
+    AMutableArray *array = [AMutableArray arrayWithCapacity:10];
+    while ( [self hasNext] ) {
+        [array addObject:[self nextObject]];
+    }
+    return array;
+}
+
+- (void)remove
+{
+    @throw [RuntimeException newException:@"UnsupportedOperationException"];
+}
+
+@synthesize firstTime;
+@synthesize adaptor;
+@synthesize root;
+@synthesize tree;
+@synthesize nodes;
+
+@synthesize up;
+@synthesize down;
+@synthesize eof;
+
+@end
diff --git a/runtime/ObjC/Framework/TreeNodeStream.h b/runtime/ObjC/Framework/TreeNodeStream.h
new file mode 100644
index 0000000..944a5e0
--- /dev/null
+++ b/runtime/ObjC/Framework/TreeNodeStream.h
@@ -0,0 +1,103 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke
+// 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.
+
+
+#import <Foundation/Foundation.h>
+#import "IntStream.h"
+#import "CharStream.h"
+#import "TokenStream.h"
+#import "CommonTree.h"
+#import "CommonTreeAdaptor.h"
+
+@protocol TreeNodeStream < IntStream > 
+
+- (id) initWithTree:(CommonTree *)theTree;
+
+/** Get a tree node at an absolute index i; 0..n-1.
+ *  If you don't want to buffer up nodes, then this method makes no
+ *  sense for you.
+ */
+- (id) get:(NSInteger) idx;
+/** Get tree node at current input pointer + i ahead where i=1 is next node.
+ *  i<0 indicates nodes in the past.  So LT(-1) is previous node, but
+ *  implementations are not required to provide results for k < -1.
+ *  LT(0) is undefined.  For i>=n, return null.
+ *  Return null for LT(0) and any index that results in an absolute address
+ *  that is negative.
+ *
+ *  This is analogus to the LT() method of the TokenStream, but this
+ *  returns a tree node instead of a token.  Makes code gen identical
+ *  for both parser and tree grammars. :)
+ */
+- (id) LT:(NSInteger)k;
+/** Where is this stream pulling nodes from?  This is not the name, but
+ *  the object that provides node objects.
+ */
+- (id) getTreeSource;
+/** If the tree associated with this stream was created from a TokenStream,
+ *  you can specify it here.  Used to do rule $text attribute in tree
+ *  parser.  Optional unless you use tree parser rule text attribute
+ *  or output=template and rewrite=true options.
+ */
+- (id<TokenStream>) getTokenStream; 
+/** What adaptor can tell me how to interpret/navigate nodes and
+ *  trees.  E.g., get text of a node.
+ */
+- (id<TreeAdaptor>) getTreeAdaptor;
+/** As we flatten the tree, we use UP, DOWN nodes to represent
+ *  the tree structure.  When debugging we need unique nodes
+ *  so we have to instantiate new ones.  When doing normal tree
+ *  parsing, it's slow and a waste of memory to create unique
+ *  navigation nodes.  Default should be false;
+ */
+- (void) setUniqueNavigationNodes:(BOOL)flag;
+/** Reset the tree node stream in such a way that it acts like
+ *  a freshly constructed stream.
+ */
+- (void) reset;
+
+/** Return the text of all nodes from start to stop, inclusive.
+ *  If the stream does not buffer all the nodes then it can still
+ *  walk recursively from start until stop.  You can always return
+ *  null or "" too, but users should not access $ruleLabel.text in
+ *  an action of course in that case.
+ */
+- (NSString *) toStringFromNode:(id)startNode ToNode:(id)stopNode;
+
+/** Replace from start to stop child index of parent with t, which might
+ *  be a list.  Number of children may be different
+ *  after this call.  The stream is notified because it is walking the
+ *  tree and might need to know you are monkeying with the underlying
+ *  tree.  Also, it might be able to modify the node stream to avoid
+ *  restreaming for future phases.
+ *
+ *  If parent is null, don't do anything; must be at root of overall tree.
+ *  Can't replace whatever points to the parent externally.  Do nothing.
+ */
+- (void) replaceChildren:(id)parent From:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id) t;
+    
+
+@end
diff --git a/runtime/ObjC/Framework/TreeParser.h b/runtime/ObjC/Framework/TreeParser.h
new file mode 100644
index 0000000..0f98fd6
--- /dev/null
+++ b/runtime/ObjC/Framework/TreeParser.h
@@ -0,0 +1,87 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "BaseRecognizer.h"
+#import "TreeNodeStream.h"
+#import "CommonTreeAdaptor.h"
+#import "MismatchedTreeNodeException.h"
+
+@interface TreeParser : BaseRecognizer {
+	id<TreeNodeStream> input;
+}
+
+@property (retain, getter=input, setter=setInput:) id<TreeNodeStream> input;
+
++ (id) newTreeParser:(id<TreeNodeStream>)anInput;
++ (id) newTreeParser:(id<TreeNodeStream>)anInput State:(RecognizerSharedState *)state;
+
+- (id) initWithStream:(id<TreeNodeStream>)theInput;
+- (id) initWithStream:(id<TreeNodeStream>)theInput
+                State:(RecognizerSharedState *)state;
+
+
+- (id<TreeNodeStream>)input;
+- (void) setInput:(id<TreeNodeStream>)anInput;
+
+- (void) setTreeNodeStream:(id<TreeNodeStream>) anInput;
+- (id<TreeNodeStream>) getTreeNodeStream;
+
+- (NSString *)getSourceName;
+
+- (id) getCurrentInputSymbol:(id<IntStream>) anInput;
+
+- (id) getMissingSymbol:(id<IntStream>)input
+              Exception:(RecognitionException *) e
+          ExpectedToken:(NSInteger) expectedTokenType
+                 BitSet:(ANTLRBitSet *)follow;
+
+/** Match '.' in tree parser has special meaning.  Skip node or
+ *  entire tree if node has children.  If children, scan until
+ *  corresponding UP node.
+ */
+- (void) matchAny:(id<IntStream>)ignore;
+
+/** We have DOWN/UP nodes in the stream that have no line info; override.
+ *  plus we want to alter the exception type.  Don't try to recover
+ *  from tree parser errors inline...
+ */
+- (id) recoverFromMismatchedToken:(id<IntStream>)anInput
+                             Type:(NSInteger)ttype
+                           Follow:(ANTLRBitSet *)follow;
+
+/** Prefix error message with the grammar name because message is
+ *  always intended for the programmer because the parser built
+ *  the input tree not the user.
+ */
+- (NSString *)getErrorHeader:(RecognitionException *)e;
+
+- (NSString *)getErrorMessage:(RecognitionException *)e TokenNames:(AMutableArray *) tokenNames;
+
+- (void) traceIn:(NSString *)ruleName Index:(NSInteger)ruleIndex;
+- (void) traceOut:(NSString *)ruleName Index:(NSInteger)ruleIndex;
+
+@end
diff --git a/runtime/ObjC/Framework/TreeParser.m b/runtime/ObjC/Framework/TreeParser.m
new file mode 100644
index 0000000..949771f
--- /dev/null
+++ b/runtime/ObjC/Framework/TreeParser.m
@@ -0,0 +1,192 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+#import "TreeParser.h"
+
+@implementation TreeParser
+
+@synthesize input;
+
++ (id) newTreeParser:(id<TreeNodeStream>)anInput
+{
+    return [[TreeParser alloc] initWithStream:anInput];
+}
+
++ (id) newTreeParser:(id<TreeNodeStream>)anInput State:(RecognizerSharedState *)theState
+{
+    return [[TreeParser alloc] initWithStream:anInput State:theState];
+}
+
+- (id) initWithStream:(id<TreeNodeStream>)theInput
+{
+	if ((self = [super init]) != nil) {
+		[self setInput:theInput];
+	}
+	return self;
+}
+
+- (id) initWithStream:(id<TreeNodeStream>)theInput State:(RecognizerSharedState *)theState
+{
+	if ((self = [super init]) != nil) {
+		[self setInput:theInput];
+        state = theState;
+	}
+	return self;
+}
+
+- (void) dealloc
+{
+#ifdef DEBUG_DEALLOC
+    NSLog( @"called dealloc in TreeParser" );
+#endif
+	if ( input ) [input release];
+	[super dealloc];
+}
+
+- (void) reset
+{
+    [super reset]; // reset all recognizer state variables
+    if ( input != nil ) {
+        [input seek:0]; // rewind the input
+    }
+}
+
+- (void) mismatch:(id<IntStream>)aStream tokenType:(TokenType)aTType follow:(ANTLRBitSet *)aBitset
+{
+	MismatchedTreeNodeException *mte = [MismatchedTreeNodeException newException:aTType Stream:aStream];
+    [mte setNode:[((id<TreeNodeStream>)aStream) LT:1]];
+	[self recoverFromMismatchedToken:aStream Type:aTType Follow:aBitset];
+}
+
+- (void) setTreeNodeStream:(id<TreeNodeStream>) anInput
+{
+    input = anInput;
+}
+
+- (id<TreeNodeStream>) getTreeNodeStream
+{
+    return input;
+}
+
+- (NSString *)getSourceName
+{
+    return [input getSourceName];
+}
+
+- (id) getCurrentInputSymbol:(id<IntStream>) anInput
+{
+    return [(id<TreeNodeStream>)anInput LT:1];
+}
+
+- (id) getMissingSymbol:(id<IntStream>)anInput
+              Exception:(RecognitionException *)e
+          ExpectedToken:(NSInteger)expectedTokenType
+                 BitSet:(ANTLRBitSet *)follow
+{
+    NSString *tokenText =[NSString stringWithFormat:@"<missing %@ %d>", [self getTokenNames], expectedTokenType];
+    //id<TreeAdaptor> anAdaptor = (id<TreeAdaptor>)[((id<TreeNodeStream>)e.input) getTreeAdaptor];
+    //return [anAdaptor createToken:expectedTokenType Text:tokenText];
+    return [CommonToken newToken:expectedTokenType Text:tokenText];
+}
+
+/** Match '.' in tree parser has special meaning.  Skip node or
+ *  entire tree if node has children.  If children, scan until
+ *  corresponding UP node.
+ */
+- (void) matchAny:(id<IntStream>)ignore
+{ // ignore stream, copy of input
+    state.errorRecovery = NO;
+    state.failed = NO;
+    id look = [input LT:1];
+    if ( [((CommonTreeAdaptor *)[input getTreeAdaptor]) getChildCount:look] == 0) {
+        [input consume]; // not subtree, consume 1 node and return
+        return;
+    }
+    // current node is a subtree, skip to corresponding UP.
+    // must count nesting level to get right UP
+    int level=0;
+    int tokenType = [((id<TreeAdaptor>)[input getTreeAdaptor]) getType:look];
+    while ( tokenType != TokenTypeEOF && !( tokenType == TokenTypeUP && level == 0) ) {
+        [input consume];
+        look = [input LT:1];
+        tokenType = [((id<TreeAdaptor>)[input getTreeAdaptor]) getType:look];
+        if ( tokenType == TokenTypeDOWN ) {
+            level++;
+        }
+        else if ( tokenType == TokenTypeUP ) {
+            level--;
+        }
+    }
+    [input consume]; // consume UP
+}
+
+/** We have DOWN/UP nodes in the stream that have no line info; override.
+ *  plus we want to alter the exception type.  Don't try to recover
+ *  from tree parser errors inline...
+ */
+- (id) recoverFromMismatchedToken:(id<IntStream>)anInput Type:(NSInteger)ttype Follow:(ANTLRBitSet *)follow
+{
+    @throw [MismatchedTreeNodeException newException:ttype Stream:anInput];
+}
+
+/** Prefix error message with the grammar name because message is
+ *  always intended for the programmer because the parser built
+ *  the input tree not the user.
+ */
+- (NSString *)getErrorHeader:(RecognitionException *)e
+{
+     return [NSString stringWithFormat:@"%@: node after line %@:%@",
+            [self getGrammarFileName], e.line, e.charPositionInLine];
+}
+
+/** Tree parsers parse nodes they usually have a token object as
+ *  payload. Set the exception token and do the default behavior.
+ */
+- (NSString *)getErrorMessage:(RecognitionException *)e  TokenNames:(AMutableArray *) theTokNams
+{
+    if ( [self isKindOfClass:[TreeParser class]] ) {
+        CommonTreeAdaptor *adaptor = (CommonTreeAdaptor *)[((id<TreeNodeStream>)e.input) getTreeAdaptor];
+        e.token = [adaptor getToken:((CommonTree *)e.node)];
+        if ( e.token == nil ) { // could be an UP/DOWN node
+            e.token = [CommonToken newToken:[adaptor getType:(CommonTree *)e.node]
+                                                        Text:[adaptor getText:(CommonTree *)e.node]];
+        }
+    }
+    return [super getErrorMessage:e TokenNames:theTokNams];
+}
+
+- (void) traceIn:(NSString *)ruleName Index:(NSInteger)ruleIndex
+{
+    [super traceIn:ruleName Index:ruleIndex Object:[input LT:1]];
+}
+
+- (void) traceOut:(NSString *)ruleName Index:(NSInteger)ruleIndex
+{
+    [super traceOut:ruleName Index:ruleIndex  Object:[input LT:1]];
+}
+
+
+@end
diff --git a/runtime/ObjC/Framework/TreePatternLexer.h b/runtime/ObjC/Framework/TreePatternLexer.h
new file mode 100644
index 0000000..e5b4754
--- /dev/null
+++ b/runtime/ObjC/Framework/TreePatternLexer.h
@@ -0,0 +1,89 @@
+//
+//  TreePatternLexer.h
+//  ANTLR
+//
+//  Created by Alan Condit on 6/18/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+
+typedef enum {
+	LexerTokenTypeEOF = -1,
+	LexerTokenTypeInvalid,
+	LexerTokenTypeBEGIN,
+	LexerTokenTypeEND,
+	LexerTokenTypeID,
+	LexerTokenTypeARG,
+	LexerTokenTypePERCENT,
+	LexerTokenTypeCOLON,
+	LexerTokenTypeDOT,
+} LexerTokenType;
+
+
+@interface TreePatternLexer : NSObject {
+
+/** The tree pattern to lex like "(A B C)" */
+NSString *pattern;
+    
+/** Index into input string */
+NSInteger p;
+    
+/** Current char */
+NSInteger c;
+    
+/** How long is the pattern in char? */
+NSInteger n;
+    
+/** Set when token type is ID or ARG (name mimics Java's StreamTokenizer) */
+NSMutableData *sval;
+__strong char *data;
+    
+BOOL error;
+
+}
+
+@property (retain) NSString *pattern;
+@property (assign) NSInteger p;
+@property (assign) NSInteger c;
+@property (assign) NSInteger n;
+@property (retain, getter=getSval, setter=setSval:) NSMutableData *sval;
+@property (assign) char *data;
+@property (assign) BOOL error;
+
++ (TreePatternLexer *)newTreePatternLexer:(NSString *)aPattern;
+- (id) init;
+- (id) initWithPattern:(NSString *)aPattern;
+
+- (void) dealloc;
+- (NSInteger) nextToken;
+- (void) consume;
+- (NSString *)toString;
+
+- (NSMutableData *)getSval;
+- (void) setSval:(NSMutableData *)aSval;
+
+@end
diff --git a/runtime/ObjC/Framework/TreePatternLexer.m b/runtime/ObjC/Framework/TreePatternLexer.m
new file mode 100644
index 0000000..2eafae3
--- /dev/null
+++ b/runtime/ObjC/Framework/TreePatternLexer.m
@@ -0,0 +1,191 @@
+//
+//  TreePatternLexer.m
+//  ANTLR
+//
+//  Created by Alan Condit on 6/18/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import "TreePatternLexer.h"
+
+@implementation TreePatternLexer
+
+@synthesize pattern;
+@synthesize p;
+@synthesize c;
+@synthesize n;
+@synthesize sval;
+@synthesize data;
+@synthesize error;
+
++ (TreePatternLexer *)newTreePatternLexer:(NSString *)aPattern
+{
+    return [[TreePatternLexer alloc] initWithPattern:aPattern];
+}
+
+- (id) init
+{
+    if ((self = [super init]) != nil ) {
+        p = -1;
+        n = 0;
+        error = NO;
+        sval = [[NSMutableData dataWithLength:1000] retain];
+        data = [sval mutableBytes];
+        pattern = @"";
+        n = [pattern length];
+        if ( pattern ) [pattern retain];
+        [self consume];
+    }
+    return self;
+}
+
+- (id) initWithPattern:(NSString *)aPattern
+{
+    if ((self = [super init]) != nil ) {
+        p = -1;
+        n = 0;
+        error = NO;
+        sval = [[NSMutableData dataWithLength:1000] retain];
+        data = [sval mutableBytes];
+        pattern = [aPattern retain];
+        n = [pattern length];
+        [self consume];
+    }
+    return self;
+}
+
+- (void) dealloc
+{
+#ifdef DEBUG_DEALLOC
+    NSLog( @"called dealloc in TreePatternLexer" );
+#endif
+	if ( pattern ) [pattern release];
+	if ( sval ) [sval release];
+	[super dealloc];
+}
+
+- (NSInteger) nextToken
+{
+    n = 0; // reset, but reuse buffer
+    while ( c != LexerTokenTypeEOF ) {
+        if ( c==' ' || c=='\n' || c=='\r' || c=='\t' ) {
+            [self consume];
+            continue;
+        }
+        if ( (c>='a' && c<='z') || (c>='A' && c<='Z') || c=='_' ) {
+            data[n++] = (char)c;
+            [self consume];
+            while ( (c>='a' && c<='z') || (c>='A' && c<='Z') ||
+                   (c>='0' && c<='9') || c=='_' )
+            {
+                data[n++] = (char)c;
+                [self consume];
+            }
+            return LexerTokenTypeID;
+        }
+        if ( c == '(' ) {
+            [self consume];
+            return LexerTokenTypeBEGIN;
+        }
+        if ( c==')' ) {
+            [self consume];
+            return LexerTokenTypeEND;
+        }
+        if ( c=='%' ) {
+            [self consume];
+            return LexerTokenTypePERCENT;
+        }
+        if ( c==':' ) {
+            [self consume];
+            return LexerTokenTypeCOLON;
+        }
+        if ( c=='.' ) {
+            [self consume];
+            return LexerTokenTypeDOT;
+        }
+        if ( c=='[' ) { // grab [x] as a string, returning x
+            [self consume];
+            while ( c!=']' ) {
+                if ( c=='\\' ) {
+                    [self consume];
+                    if ( c!=']' ) {
+                        data[n++] = (char)'\\';
+                    }
+                    data[n++] = (char)c;
+                }
+                else {
+                    data[n++] = (char)c;
+                }
+                [self consume];
+            }
+            [self consume];
+            return LexerTokenTypeARG;
+        }
+        [self consume];
+        error = true;
+        return LexerTokenTypeEOF;
+    }
+    return LexerTokenTypeEOF;
+}
+
+- (void) consume
+{
+    p++;
+    if ( p >= n ) {
+        c = LexerTokenTypeEOF;
+    }
+    else {
+        c = [pattern characterAtIndex:p];
+    }
+}
+
+- (NSString *)toString
+{
+    char buf[100];
+
+    NSInteger idx = 0;
+    for( NSInteger i = p; i < n; i++ ){
+        buf[idx++] = data[i];
+    }
+    buf[idx] = '\0';
+    return [NSString stringWithFormat:@"%s", buf];
+}
+
+- (NSMutableData *)getSval
+{
+    return sval;
+}
+
+- (void)setSval:(NSMutableData *)aSval
+{
+    if ( sval != aSval ) {
+        if ( sval ) [sval release];
+        [aSval retain];
+    }
+    sval = aSval;
+}
+
+@end
diff --git a/runtime/ObjC/Framework/TreePatternParser.h b/runtime/ObjC/Framework/TreePatternParser.h
new file mode 100644
index 0000000..0b7b90b
--- /dev/null
+++ b/runtime/ObjC/Framework/TreePatternParser.h
@@ -0,0 +1,63 @@
+//
+//  TreePatternParser.h
+//  ANTLR
+//
+//  Created by Alan Condit on 6/18/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "TreePatternLexer.h"
+#import "TreeWizard.h"
+#import "TreeAdaptor.h"
+
+@interface TreePatternParser : NSObject {
+
+TreePatternLexer *tokenizer;
+NSInteger ttype;
+TreeWizard *wizard;
+id<TreeAdaptor> adaptor;
+    
+}
+
++ (TreePatternParser *)newTreePatternParser:(TreePatternLexer *)aTokenizer
+                                               Wizard:(TreeWizard *)aWizard
+                                              Adaptor:(id<TreeAdaptor>)anAdaptor;
+- (id) init;
+- (id) initWithTokenizer:(TreePatternLexer *)tokenizer
+                  Wizard:(TreeWizard *)aWizard
+                 Adaptor:(id<TreeAdaptor>)anAdaptor;
+
+- (void) dealloc;
+- (id<BaseTree>) pattern;
+- (id<BaseTree>) parseTree;
+- (id<BaseTree>) parseNode;
+
+@property (retain) TreePatternLexer *tokenizer;
+@property NSInteger ttype;
+@property (retain) TreeWizard *wizard;
+@property (retain) id<TreeAdaptor> adaptor;
+@end
diff --git a/runtime/ObjC/Framework/TreePatternParser.m b/runtime/ObjC/Framework/TreePatternParser.m
new file mode 100644
index 0000000..2afbd5f
--- /dev/null
+++ b/runtime/ObjC/Framework/TreePatternParser.m
@@ -0,0 +1,197 @@
+//
+//  TreePatternParser.m
+//  ANTLR
+//
+//  Created by Alan Condit on 6/18/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import "TreePatternParser.h"
+#import "TreePatternLexer.h"
+
+@implementation TreePatternParser
+
++ (TreePatternParser *)newTreePatternParser:(TreePatternLexer *)aTokenizer
+                                               Wizard:(TreeWizard *)aWizard
+                                              Adaptor:(id<TreeAdaptor>)anAdaptor
+{
+    return [[TreePatternParser alloc] initWithTokenizer:aTokenizer Wizard:aWizard Adaptor:anAdaptor];
+}
+
+- (id) init
+{
+    if ((self = [super init]) != nil) {
+        //tokenizer = aTokenizer;
+        //wizard = aWizard;
+        //adaptor = anAdaptor;
+        //ttype = [tokenizer nextToken]; // kickstart
+    }
+    return self;
+}
+
+- (id) initWithTokenizer:(TreePatternLexer *)aTokenizer
+                  Wizard:(TreeWizard *)aWizard
+                 Adaptor:(id<TreeAdaptor>)anAdaptor
+{
+    if ((self = [super init]) != nil) {
+        adaptor = anAdaptor;
+        if ( adaptor ) [adaptor retain];
+        tokenizer = aTokenizer;
+        if ( tokenizer ) [tokenizer retain];
+        wizard = aWizard;
+        if ( wizard ) [wizard retain];
+        ttype = [aTokenizer nextToken]; // kickstart
+    }
+    return self;
+}
+
+- (void) dealloc
+{
+#ifdef DEBUG_DEALLOC
+    NSLog( @"called dealloc in TreePatternParser" );
+#endif
+	if ( adaptor ) [adaptor release];
+	if ( tokenizer ) [tokenizer release];
+	if ( wizard ) [wizard release];
+	[super dealloc];
+}
+
+- (id<BaseTree>)pattern
+{
+    if ( ttype==LexerTokenTypeBEGIN ) {
+        return [self parseTree];
+    }
+    else if ( ttype==LexerTokenTypeID ) {
+        id<BaseTree> node = [self parseNode];
+        if ( ttype==LexerTokenTypeEOF ) {
+            return node;
+        }
+        return nil; // extra junk on end
+    }
+    return nil;
+}
+
+- (id<BaseTree>) parseTree
+{
+    if ( ttype != LexerTokenTypeBEGIN ) {
+        @throw [RuntimeException newException:@"no BEGIN"];
+    }
+    ttype = [tokenizer nextToken];
+    id<BaseTree> root = [self parseNode];
+    if ( root==nil ) {
+        return nil;
+    }
+    while ( ttype==LexerTokenTypeBEGIN  ||
+           ttype==LexerTokenTypeID      ||
+           ttype==LexerTokenTypePERCENT ||
+           ttype==LexerTokenTypeDOT )
+    {
+        if ( ttype==LexerTokenTypeBEGIN ) {
+            id<BaseTree> subtree = [self parseTree];
+            [adaptor addChild:subtree toTree:root];
+        }
+        else {
+            id<BaseTree> child = [self parseNode];
+            if ( child == nil ) {
+                return nil;
+            }
+            [adaptor addChild:child toTree:root];
+        }
+    }
+    if ( ttype != LexerTokenTypeEND ) {
+        @throw [RuntimeException newException:@"no END"];
+    }
+    ttype = [tokenizer nextToken];
+    return root;
+}
+
+- (id<BaseTree>) parseNode
+{
+    // "%label:" prefix
+    NSString *label = nil;
+    TreePattern *node;
+    if ( ttype == LexerTokenTypePERCENT ) {
+        ttype = [tokenizer nextToken];
+        if ( ttype != LexerTokenTypeID ) {
+            return nil;
+        }
+        label = [tokenizer toString];
+        ttype = [tokenizer nextToken];
+        if ( ttype != LexerTokenTypeCOLON ) {
+            return nil;
+        }
+        ttype = [tokenizer nextToken]; // move to ID following colon
+    }
+    
+    // Wildcard?
+    if ( ttype == LexerTokenTypeDOT ) {
+        ttype = [tokenizer nextToken];
+        id<Token> wildcardPayload = [CommonToken newToken:0 Text:@"."];
+        node = [ANTLRWildcardTreePattern newANTLRWildcardTreePattern:wildcardPayload];
+        if ( label != nil ) {
+            node.label = label;
+        }
+        return node;
+    }
+    
+    // "ID" or "ID[arg]"
+    if ( ttype != LexerTokenTypeID ) {
+        return nil;
+    }
+    NSString *tokenName = [tokenizer toString];
+    ttype = [tokenizer nextToken];
+    if ( [tokenName isEqualToString:@"nil"] ) {
+        return [adaptor emptyNode];
+    }
+    NSString *text = tokenName;
+    // check for arg
+    NSString *arg = nil;
+    if ( ttype == LexerTokenTypeARG ) {
+        arg = [tokenizer toString];
+        text = arg;
+        ttype = [tokenizer nextToken];
+    }
+    
+    // create node
+    int treeNodeType = [wizard getTokenType:tokenName];
+    if ( treeNodeType==TokenTypeInvalid ) {
+        return nil;
+    }
+    node = [adaptor createTree:treeNodeType Text:text];
+    if ( label!=nil && [node class] == [TreePattern class] ) {
+        ((TreePattern *)node).label = label;
+    }
+    if ( arg!=nil && [node class] == [TreePattern class] ) {
+        ((TreePattern *)node).hasTextArg = YES;
+    }
+    return node;
+}
+
+@synthesize tokenizer;
+@synthesize ttype;
+@synthesize wizard;
+@synthesize adaptor;
+@end
diff --git a/runtime/ObjC/Framework/TreeRewriter.h b/runtime/ObjC/Framework/TreeRewriter.h
new file mode 100644
index 0000000..fa3a884
--- /dev/null
+++ b/runtime/ObjC/Framework/TreeRewriter.h
@@ -0,0 +1,78 @@
+//
+//  TreeRewriter.h
+//  ANTLR
+//
+//  Created by Alan Condit on 6/17/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "TreeParser.h"
+
+@interface ANTLRfptr : NSObject {
+    id  actor;
+    SEL ruleSEL;
+}
+
++ (ANTLRfptr *)newANTLRfptrWithRule:(SEL)aRuleAction withObject:(id)anObject;
+-initWithRule:(SEL)ruleAction withObject:(id)anObject;
+
+- (id)rule;
+
+@property (retain) id  actor;
+@property SEL ruleSEL;
+@end
+
+@interface TreeRewriter : TreeParser {
+    BOOL showTransformations;
+    id<TokenStream> originalTokenStream;
+    id<TreeAdaptor> originalAdaptor;
+    ANTLRfptr *rule;
+    ANTLRfptr *topdown_fptr;
+    ANTLRfptr *bottomup_ftpr;
+}
+
++ (TreeRewriter *) newTreeRewriter:(id<TreeNodeStream>)anInput;
++ (TreeRewriter *) newTreeRewriter:(id<TreeNodeStream>)anInput State:(RecognizerSharedState *)aState;
+- (id)initWithStream:(id<TreeNodeStream>)anInput;
+- (id)initWithStream:(id<TreeNodeStream>)anInput State:(RecognizerSharedState *)aState;
+- (id) applyOnce:(CommonTree *)t Rule:(ANTLRfptr *)whichRule;
+- (id) applyRepeatedly:(CommonTree *)t Rule:(ANTLRfptr *)whichRule;
+- (id) downup:(CommonTree *)t;
+- (id) pre:(CommonTree *)t;
+- (id) post:(CommonTree *)t;
+- (id) downup:(CommonTree *)t XForm:(BOOL)aShowTransformations;
+- (void)reportTransformation:(CommonTree *)oldTree Tree:(CommonTree *)newTree;
+- (id) topdown_fptr;
+- (id) bottomup_ftpr;
+- (id) topdown;
+- (id) bottomup;
+
+@property BOOL showTransformations;
+@property (retain) id<TokenStream> originalTokenStream;
+@property (retain) id<TreeAdaptor> originalAdaptor;
+@property (retain) ANTLRfptr *rule;
+@end
diff --git a/runtime/ObjC/Framework/TreeRewriter.m b/runtime/ObjC/Framework/TreeRewriter.m
new file mode 100644
index 0000000..c5ea12f
--- /dev/null
+++ b/runtime/ObjC/Framework/TreeRewriter.m
@@ -0,0 +1,250 @@
+//
+//  TreeRewriter.m
+//  ANTLR
+//
+//  Created by Alan Condit on 6/17/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import "TreeRewriter.h"
+#import "CommonTreeNodeStream.h"
+#import "TreeRuleReturnScope.h"
+#import "CommonTreeAdaptor.h"
+#import "TreeVisitor.h"
+
+@implementation ANTLRfptr
+
++ (ANTLRfptr *)newANTLRfptrWithRule:(SEL)aRuleAction withObject:(id)anObject
+{
+    return [[ANTLRfptr alloc] initWithRule:aRuleAction withObject:(id)anObject];
+}
+
+-initWithRule:(SEL)aRuleAction withObject:(id)anObject
+{
+    if ((self = [super init]) != nil) {
+        actor = anObject;
+        ruleSEL = aRuleAction;
+    }
+    return self;
+}
+
+- (id)rule
+{
+	if ( [actor respondsToSelector:ruleSEL] )
+		return [actor performSelector:ruleSEL];
+    else
+        @throw [RuntimeException newException:@"Unknown Rewrite exception"];
+    return nil;
+}
+
+@synthesize actor;
+@synthesize ruleSEL;
+@end
+
+@implementation TreeRewriter
+
++ (TreeRewriter *) newTreeRewriter:(id<TreeNodeStream>)anInput
+{
+    return [[TreeRewriter alloc] initWithStream:anInput State:[RecognizerSharedState newRecognizerSharedState]];
+}
+
++ (TreeRewriter *) newTreeRewriter:(id<TreeNodeStream>)anInput State:(RecognizerSharedState *)aState
+{
+    return [[TreeRewriter alloc] initWithStream:anInput State:aState];
+}
+
+- (id)initWithStream:(id<TreeNodeStream>)anInput
+{
+    SEL aRuleSel;
+
+    if ((self = [super initWithStream:anInput]) != nil) {
+        showTransformations = NO;
+        state = [[RecognizerSharedState newRecognizerSharedState] retain];
+        originalAdaptor = [input getTreeAdaptor];
+        if ( originalAdaptor ) [originalAdaptor retain];
+        originalTokenStream = [input getTokenStream];        
+        if ( originalTokenStream ) [originalTokenStream retain];
+        aRuleSel = @selector(topdown);
+        topdown_fptr = [ANTLRfptr newANTLRfptrWithRule:(SEL)aRuleSel withObject:self];
+        aRuleSel = @selector(bottomup);
+        bottomup_ftpr = [ANTLRfptr newANTLRfptrWithRule:(SEL)aRuleSel withObject:self];        
+    }
+    return self;
+}
+
+- (id)initWithStream:(id<TreeNodeStream>)anInput State:(RecognizerSharedState *)aState
+{
+    SEL aRuleSel;
+    
+    if ((self = [super initWithStream:anInput]) != nil) {
+        showTransformations = NO;
+        state = aState;
+        if ( state ) [state retain];
+        originalAdaptor = [input getTreeAdaptor];
+        if ( originalAdaptor ) [originalAdaptor retain];
+        originalTokenStream = [input getTokenStream];        
+        if ( originalTokenStream ) [originalTokenStream retain];
+        aRuleSel = @selector(topdown);
+        topdown_fptr = [ANTLRfptr newANTLRfptrWithRule:(SEL)aRuleSel withObject:self];
+        aRuleSel = @selector(bottomup);
+        bottomup_ftpr = [ANTLRfptr newANTLRfptrWithRule:(SEL)aRuleSel withObject:self];        
+    }
+    return self;
+}
+
+- (void) dealloc
+{
+#ifdef DEBUG_DEALLOC
+    NSLog( @"called dealloc in TreeRewriter" );
+#endif
+	if ( state ) [state release];
+	if ( originalAdaptor ) [originalAdaptor release];
+	if ( originalTokenStream ) [originalTokenStream release];
+	[super dealloc];
+}
+
+- (id) applyOnce:(CommonTree *)t Rule:(ANTLRfptr *)whichRule
+{
+    if ( t == nil ) return nil;
+    @try {
+        // share TreeParser object but not parsing-related state
+        state = [RecognizerSharedState newRecognizerSharedState];
+        input = [CommonTreeNodeStream newCommonTreeNodeStream:(CommonTreeAdaptor *)originalAdaptor Tree:t];
+        [(CommonTreeNodeStream *)input setTokenStream:originalTokenStream];
+        [self setBacktrackingLevel:1];
+        TreeRuleReturnScope *r = [(ANTLRfptr *)whichRule rule];
+        [self setBacktrackingLevel:0];
+        if ( [self getFailed] )
+            return t;
+        if ( showTransformations &&
+            r != nil && !(t == r.start) && r.start != nil ) {
+            [self reportTransformation:t Tree:r.start];
+        }
+        if ( r != nil && r.start != nil )
+            return r.start;
+        else
+            return t;
+    }
+    @catch (RecognitionException *e) {
+        return t;
+    }
+    return t;
+}
+
+- (id) applyRepeatedly:(CommonTree *)t Rule:(ANTLRfptr *)whichRule
+{
+    BOOL treeChanged = true;
+    while ( treeChanged ) {
+        TreeRewriter *u = [self applyOnce:t Rule:whichRule];
+        treeChanged = !(t == u);
+        t = u;
+    }
+    return t;
+}
+
+- (id) downup:(CommonTree *)t
+{
+    return [self downup:t XForm:NO];
+}
+
+- (id) pre:(CommonTree *)t
+{
+    return [self applyOnce:t Rule:topdown_fptr];
+}
+
+- (id)post:(CommonTree *)t
+{
+    return [self applyRepeatedly:t Rule:bottomup_ftpr];
+}
+
+#ifdef DONTUSENOMO
+public Object downup(Object t, boolean showTransformations) {
+    this.showTransformations = showTransformations;
+    TreeVisitor v = new TreeVisitor(new CommonTreeAdaptor());
+    TreeVisitorAction actions = new TreeVisitorAction() {
+        public Object pre(Object t)  { return applyOnce(t, topdown_fptr); }
+        public Object post(Object t) { return applyRepeatedly(t, bottomup_ftpr); }
+    };
+    t = v.visit(t, actions);
+    return t;
+}
+#endif
+
+- (id) downup:(CommonTree *)t XForm:(BOOL)aShowTransformations
+{
+    showTransformations = aShowTransformations;
+    TreeVisitor *v = [TreeVisitor newTreeVisitor:[[originalAdaptor class] newTreeAdaptor]];
+    TreeVisitorAction *actions = [TreeVisitorAction newTreeVisitorAction];
+    {
+        //public Object pre(Object t)  { return applyOnce(t, topdown_fptr); }
+        [self pre:t];
+        //public Object post(Object t) { return applyRepeatedly(t, bottomup_ftpr); }
+        [self post:t];
+    };
+    t = [v visit:t Action:actions];
+    return t;
+}
+
+/** Override this if you need transformation tracing to go somewhere
+ *  other than stdout or if you're not using Tree-derived trees.
+ */
+- (void)reportTransformation:(CommonTree *)oldTree Tree:(CommonTree *)newTree
+{
+    //System.out.println(((Tree)oldTree).toStringTree()+" -> "+ ((Tree)newTree).toStringTree());
+}
+
+- (id)topdown_fptr
+{
+    return [self topdown];
+}
+
+- (id)bottomup_ftpr
+{
+    return [self bottomup];
+}
+
+// methods the downup strategy uses to do the up and down rules.
+// to override, just define tree grammar rule topdown and turn on
+// filter=true.
+- (id) topdown
+// @throws RecognitionException
+{
+    @throw [RecognitionException newException:@"TopDown exception"];
+    return nil;
+}
+
+- (id) bottomup
+//@throws RecognitionException
+{
+    @throw [RecognitionException newException:@"BottomUp exception"];
+    return nil;
+}
+
+@synthesize showTransformations;
+@synthesize originalTokenStream;
+@synthesize originalAdaptor;
+@synthesize rule;
+@end
diff --git a/runtime/ObjC/Framework/TreeRuleReturnScope.h b/runtime/ObjC/Framework/TreeRuleReturnScope.h
new file mode 100644
index 0000000..88e8a0e
--- /dev/null
+++ b/runtime/ObjC/Framework/TreeRuleReturnScope.h
@@ -0,0 +1,52 @@
+//
+//  TreeRuleReturnScope.h
+//  ANTLR
+//
+//  Created by Alan Condit on 6/17/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "RuleReturnScope.h"
+#import "CommonTree.h"
+
+@interface TreeRuleReturnScope : RuleReturnScope {
+    CommonTree *start;
+}
+
+@property (retain, getter=getStart, setter=setStart:) CommonTree *start;
+
+/** First node or root node of tree matched for this rule. */
+
++ (id) newReturnScope;
+- (id) init;
+- (void) dealloc;
+- (CommonTree *)getStart;
+- (void)setStart:(CommonTree *)aStart;
+
+- (id) copyWithZone:(NSZone *)theZone;
+
+@end
diff --git a/runtime/ObjC/Framework/TreeRuleReturnScope.m b/runtime/ObjC/Framework/TreeRuleReturnScope.m
new file mode 100644
index 0000000..8539d81
--- /dev/null
+++ b/runtime/ObjC/Framework/TreeRuleReturnScope.m
@@ -0,0 +1,81 @@
+//
+//  TreeRuleReturnScope.m
+//  ANTLR
+//
+//  Created by Alan Condit on 6/17/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import "TreeRuleReturnScope.h"
+
+
+@implementation TreeRuleReturnScope
+@synthesize start;
+
++ (id) newReturnScope
+{
+    return [[TreeRuleReturnScope alloc] init];
+}
+
+- (id) init
+{
+    self = [super init];
+    return self;
+}
+
+- (void) dealloc
+{
+#ifdef DEBUG_DEALLOC
+    NSLog( @"called dealloc in TreeRuleReturnScope" );
+#endif
+	if ( start ) [start release];
+	[super dealloc];
+}
+
+- (CommonTree *)getStart
+{
+    return start;
+}	
+
+- (void)setStart:(CommonTree *)aStart
+{
+    if ( start != aStart ) {
+        if ( start ) [start release];
+        [aStart retain];
+    }
+    start = aStart;
+}	
+
+// create a copy, including the text if available
+// the input stream is *not* copied!
+- (id) copyWithZone:(NSZone *)theZone
+{
+    TreeRuleReturnScope *copy = [super copyWithZone:theZone];
+    copy.start = start;
+    return copy;
+}
+
+@end
diff --git a/runtime/ObjC/Framework/TreeVisitor.h b/runtime/ObjC/Framework/TreeVisitor.h
new file mode 100644
index 0000000..7516a08
--- /dev/null
+++ b/runtime/ObjC/Framework/TreeVisitor.h
@@ -0,0 +1,47 @@
+//
+//  TreeVisitor.h
+//  ANTLR
+//
+//  Created by Alan Condit on 6/18/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "TreeAdaptor.h"
+#import "TreeVisitorAction.h"
+
+@interface TreeVisitor : NSObject {
+   id<TreeAdaptor> adaptor;
+}
++ (TreeVisitor *)newTreeVisitor:(id<TreeAdaptor>) anAdaptor;
++ (TreeVisitor *)newTreeVisitor;
+- (id)init;
+- (id)initWithAdaptor:(id<TreeAdaptor>)anAdaptor;
+- (void) dealloc;
+- (id<BaseTree>)visit:(id<BaseTree>)t Action:(TreeVisitorAction *)action;
+
+@property (retain) id<TreeAdaptor> adaptor;
+@end
diff --git a/runtime/ObjC/Framework/TreeVisitor.m b/runtime/ObjC/Framework/TreeVisitor.m
new file mode 100644
index 0000000..fea76c7
--- /dev/null
+++ b/runtime/ObjC/Framework/TreeVisitor.m
@@ -0,0 +1,103 @@
+//
+//  TreeVisitor.m
+//  ANTLR
+//
+//  Created by Alan Condit on 6/18/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import "TreeVisitor.h"
+#import "CommonTreeAdaptor.h"
+
+@implementation TreeVisitor
+
++ (TreeVisitor *)newTreeVisitor:(id<TreeAdaptor>)anAdaptor
+{
+    return [[TreeVisitor alloc] initWithAdaptor:anAdaptor];
+}
+
++ (TreeVisitor *)newTreeVisitor
+{
+    return [[TreeVisitor alloc] init];
+}
+
+
+- (id)init
+{
+    if ((self = [super init]) != nil) {
+        adaptor = [[CommonTreeAdaptor newTreeAdaptor] retain];
+    }
+    return self;
+}
+
+- (id)initWithAdaptor:(id<TreeAdaptor>)anAdaptor
+{
+    if ((self = [super init]) != nil) {
+        adaptor = [anAdaptor retain];
+    }
+    return self;
+}
+
+- (void) dealloc
+{
+#ifdef DEBUG_DEALLOC
+    NSLog( @"called dealloc in TreeVisitor" );
+#endif
+    if ( adaptor ) [adaptor release];
+    [super dealloc];
+}
+
+/** Visit every node in tree t and trigger an action for each node
+ *  before/after having visited all of its children.
+ *  Execute both actions even if t has no children.
+ *  If a child visit yields a new child, it can update its
+ *  parent's child list or just return the new child.  The
+ *  child update code works even if the child visit alters its parent
+ *  and returns the new tree.
+ *
+ *  Return result of applying post action to this node.
+ */
+- (id<BaseTree>)visit:(id<BaseTree>)t Action:(TreeVisitorAction *)action
+{
+    // System.out.println("visit "+((Tree)t).toStringTree());
+    BOOL isNil = [adaptor isNil:t];
+    if ( action != nil && !isNil ) {
+        t = [action pre:(id<BaseTree>)t]; // if rewritten, walk children of new t
+    }
+    for (int i=0; i < [adaptor getChildCount:t]; i++) {
+        id<BaseTree> child = [adaptor getChild:t At:i];
+        id<BaseTree> visitResult = [self visit:child Action:action];
+        id<BaseTree> childAfterVisit = [adaptor getChild:t At:i];
+        if ( visitResult !=  childAfterVisit ) { // result & child differ?
+            [adaptor setChild:t At:i Child:visitResult];
+        }
+    }
+    if ( action != nil && !isNil ) t = [action post:(id<BaseTree>)t];
+    return t;
+}
+
+@synthesize adaptor;
+@end
diff --git a/runtime/ObjC/Framework/TreeVisitorAction.h b/runtime/ObjC/Framework/TreeVisitorAction.h
new file mode 100644
index 0000000..9c72dad
--- /dev/null
+++ b/runtime/ObjC/Framework/TreeVisitorAction.h
@@ -0,0 +1,94 @@
+//
+//  TreeVisitorAction.h
+//  ANTLR
+//
+//  Created by Alan Condit on 6/18/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "BaseTree.h"
+
+@interface TreeVisitorAction : NSObject
+{
+    SEL preAction;
+    SEL postAction;
+
+}
+
+@property (assign, setter=setPreAction:) SEL preAction;
+@property (assign, setter=setPostAction:) SEL postAction;
+
++ (TreeVisitorAction *)newTreeVisitorAction;
+- (id) init;
+
+- (void)setPreAction:(SEL)anAction;
+- (void)setPostAction:(SEL)anAction;
+
+/** Execute an action before visiting children of t.  Return t or
+ *  a rewritten t.  It is up to the visitor to decide what to do
+ *  with the return value.  Children of returned value will be
+ *  visited if using TreeVisitor.visit().
+ */
+- (id<BaseTree>)pre:(id<BaseTree>) t;
+
+/** Execute an action after visiting children of t.  Return t or
+ *  a rewritten t.  It is up to the visitor to decide what to do
+ *  with the return value.
+ */
+- (id<BaseTree>)post:(id<BaseTree>) t;
+
+@end
+
+@class TreeFilter;
+@class fptr;
+
+@interface TreeVisitorActionFiltered : TreeVisitorAction
+{
+    TreeFilter *aTFilter;
+    fptr *TDRule;
+    fptr *BURule;
+}
+
+@property (assign, setter=setATFilter:) TreeFilter *aTFilter;
+
++ (TreeVisitorAction *)newTreeVisitorActionFiltered:(TreeFilter *)aFilter RuleD:(fptr *)aTDRule RuleU:(fptr *)aBURule;
+- (id) initWithFilter:(TreeFilter *)aFilter RuleD:(fptr *)aTDRule RuleU:(fptr *)aBURule;
+
+/** Execute an action before visiting children of t.  Return t or
+ *  a rewritten t.  It is up to the visitor to decide what to do
+ *  with the return value.  Children of returned value will be
+ *  visited if using TreeVisitor.visit().
+ */
+- (id<BaseTree>)pre:(id<BaseTree>) t;
+
+/** Execute an action after visiting children of t.  Return t or
+ *  a rewritten t.  It is up to the visitor to decide what to do
+ *  with the return value.
+ */
+- (id<BaseTree>)post:(id<BaseTree>) t;
+
+@end
diff --git a/runtime/ObjC/Framework/TreeVisitorAction.m b/runtime/ObjC/Framework/TreeVisitorAction.m
new file mode 100644
index 0000000..33c1bc7
--- /dev/null
+++ b/runtime/ObjC/Framework/TreeVisitorAction.m
@@ -0,0 +1,140 @@
+//
+//  TreeVisitorAction.m
+//  ANTLR
+//
+//  Created by Alan Condit on 6/18/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import "TreeVisitorAction.h"
+
+
+@implementation TreeVisitorAction
+
++ (TreeVisitorAction *)newTreeVisitorAction
+{
+    return [[TreeVisitorAction alloc] init];
+}
+
+- (id) init
+{
+    if ((self = [super init]) != nil ) {
+        preAction = nil;
+        postAction = nil;
+    }
+    return self;
+}
+
+- (void)setPreAction:(SEL)anAction
+{
+    preAction = anAction;
+}
+
+- (void)setPostAction:(SEL)anAction
+{
+    postAction = anAction;
+}
+
+/** Execute an action before visiting children of t.  Return t or
+ *  a rewritten t.  It is up to the visitor to decide what to do
+ *  with the return value.  Children of returned value will be
+ *  visited if using TreeVisitor.visit().
+ */
+- (id<BaseTree>)pre:(id<BaseTree>) t
+{
+    if ( (preAction != nil ) && ( [self respondsToSelector:preAction] )) {
+        [self performSelector:preAction];
+        return t;
+    }
+    return nil;
+}
+
+/** Execute an action after visiting children of t.  Return t or
+ *  a rewritten t.  It is up to the visitor to decide what to do
+ *  with the return value.
+ */
+- (id<BaseTree>)post:(id<BaseTree>) t
+{
+    if ( (postAction != nil ) && ( [self respondsToSelector:postAction] )) {
+        [self performSelector:postAction];
+        return t;
+    }
+    return nil;
+}
+
+@synthesize preAction;
+@synthesize postAction;
+
+@end
+
+@implementation TreeVisitorActionFiltered
+
++ (TreeVisitorAction *)newTreeVisitorActionFiltered:(TreeFilter *)aFilter
+                                              RuleD:(fptr *)aTDRule
+                                              RuleU:(fptr *)aBURule
+{
+    return [[TreeVisitorActionFiltered alloc] initWithFilter:aFilter RuleD:aTDRule RuleU:aBURule];
+}
+
+- (id) initWithFilter:(TreeFilter *)aFilter
+                RuleD:(fptr *)aTDRule
+                RuleU:(fptr *)aBURule
+{
+    if (( self = [super init] ) != nil ) {
+        aTFilter = aFilter;
+        TDRule = aTDRule;
+        BURule = aBURule;
+    }
+    return self;
+}
+
+/** Execute an action before visiting children of t.  Return t or
+ *  a rewritten t.  It is up to the visitor to decide what to do
+ *  with the return value.  Children of returned value will be
+ *  visited if using TreeVisitor.visit().
+ */
+- (id<BaseTree>)pre:(id<BaseTree>) t
+{
+    [aTFilter applyOnce:t rule:(fptr *)TDRule];
+    return t;
+}
+
+/** Execute an action after visiting children of t.  Return t or
+ *  a rewritten t.  It is up to the visitor to decide what to do
+ *  with the return value.
+ */
+- (id<BaseTree>)post:(id<BaseTree>) t
+{
+    [aTFilter applyOnce:t rule:(fptr *)BURule];
+    return t;
+}
+
+
+
+@synthesize aTFilter;
+
+@end
+
diff --git a/runtime/ObjC/Framework/TreeWizard.h b/runtime/ObjC/Framework/TreeWizard.h
new file mode 100644
index 0000000..2965ed4
--- /dev/null
+++ b/runtime/ObjC/Framework/TreeWizard.h
@@ -0,0 +1,136 @@
+//
+//  TreeWizard.h
+//  ANTLR
+//
+//  Created by Alan Condit on 6/18/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "CommonTreeAdaptor.h"
+#import "CommonTree.h"
+#import "MapElement.h"
+#import "Map.h"
+#import "AMutableArray.h"
+
+@class ANTLRVisitor;
+
+@protocol ANTLRContextVisitor <NSObject>
+// TODO: should this be called visit or something else?
+- (void) visit:(CommonTree *)t Parent:(CommonTree *)parent ChildIndex:(NSInteger)childIndex Map:(Map *)labels;
+
+@end
+
+@interface ANTLRVisitor : NSObject <ANTLRContextVisitor> {
+    NSInteger action;
+    id actor;
+    id object1;
+    id object2;
+}
++ (ANTLRVisitor *)newANTLRVisitor:(NSInteger)anAction Actor:(id)anActor Object:(id)anObject1 Object:(id)anObject2;
+- (id) initWithAction:(NSInteger)anAction Actor:(id)anActor Object:(id)anObject1 Object:(id)anObject2;
+
+- (void) visit:(CommonTree *)t;
+- (void) visit:(CommonTree *)t Parent:(CommonTree *)parent ChildIndex:(NSInteger)childIndex Map:(Map *)labels;
+
+@property NSInteger action;
+@property (retain) id actor;
+@property (retain) id object1;
+@property (retain) id object2;
+@end
+
+/** When using %label:TOKENNAME in a tree for parse(), we must
+ *  track the label.
+ */
+@interface TreePattern : CommonTree {
+    NSString *label;
+    BOOL      hasTextArg;
+}
+@property (retain, getter=getLabel, setter=setLabel:) NSString *label;
+@property (assign, getter=getHasTextArg, setter=setHasTextArg:) BOOL hasTextArg;
+
++ (CommonTree *)newTreePattern:(id<Token>)payload;
+
+- (id) initWithToken:(id<Token>)payload;
+- (NSString *)toString;
+@end
+
+@interface ANTLRWildcardTreePattern : TreePattern {
+}
+
++ (ANTLRWildcardTreePattern *)newANTLRWildcardTreePattern:(id<Token>)payload;
+- (id) initWithToken:(id<Token>)payload;
+@end
+
+/** This adaptor creates TreePattern objects for use during scan() */
+@interface TreePatternTreeAdaptor : CommonTreeAdaptor {
+}
++ (TreePatternTreeAdaptor *)newTreeAdaptor;
+- (id) init;
+- (CommonTree *)createTreePattern:(id<Token>)payload;
+
+@end
+
+@interface TreeWizard : NSObject {
+	id<TreeAdaptor> adaptor;
+	Map *tokenNameToTypeMap;
+}
++ (TreeWizard *) newTreeWizard:(id<TreeAdaptor>)anAdaptor;
++ (TreeWizard *)newTreeWizard:(id<TreeAdaptor>)adaptor Map:(Map *)aTokenNameToTypeMap;
++ (TreeWizard *)newTreeWizard:(id<TreeAdaptor>)adaptor TokenNames:(NSArray *)theTokNams;
++ (TreeWizard *)newTreeWizardWithTokenNames:(NSArray *)theTokNams;
+- (id) init;
+- (id) initWithAdaptor:(id<TreeAdaptor>)adaptor;
+- (id) initWithAdaptor:(id<TreeAdaptor>)adaptor Map:(Map *)tokenNameToTypeMap;
+- (id) initWithTokenNames:(NSArray *)theTokNams;
+- (id) initWithTokenNames:(id<TreeAdaptor>)anAdaptor TokenNames:(NSArray *)theTokNams;
+- (void) dealloc;
+- (Map *)computeTokenTypes:(NSArray *)theTokNams;
+- (NSInteger)getTokenType:(NSString *)tokenName;
+- (Map *)index:(CommonTree *)t;
+- (void) _index:(CommonTree *)t Map:(Map *)m;
+- (AMutableArray *)find:(CommonTree *) t Pattern:(NSString *)pattern;
+- (TreeWizard *)findFirst:(CommonTree *) t Type:(NSInteger)ttype;
+- (TreeWizard *)findFirst:(CommonTree *) t Pattern:(NSString *)pattern;
+- (void) visit:(CommonTree *)t Type:(NSInteger)ttype Visitor:(ANTLRVisitor *)visitor;
+- (void) _visit:(CommonTree *)t
+         Parent:(CommonTree *)parent
+     ChildIndex:(NSInteger)childIndex
+           Type:(NSInteger)ttype
+        Visitor:(ANTLRVisitor *)visitor;
+- (void)visit:(CommonTree *)t Pattern:(NSString *)pattern Visitor:(ANTLRVisitor *)visitor;
+- (BOOL)parse:(CommonTree *)t Pattern:(NSString *)pattern Map:(Map *)labels;
+- (BOOL) parse:(CommonTree *) t Pattern:(NSString *)pattern;
+- (BOOL) _parse:(CommonTree *)t1 Pattern:(CommonTree *)tpattern Map:(Map *)labels;
+- (CommonTree *) createTree:(NSString *)pattern;
+- (BOOL)equals:(id)t1 O2:(id)t2 Adaptor:(id<TreeAdaptor>)anAdaptor;
+- (BOOL)equals:(id)t1 O2:(id)t2;
+- (BOOL) _equals:(id)t1 O2:(id)t2 Adaptor:(id<TreeAdaptor>)anAdaptor;
+
+@property (retain) id<TreeAdaptor> adaptor;
+@property (retain) Map *tokenNameToTypeMap;
+@end
+
diff --git a/runtime/ObjC/Framework/TreeWizard.m b/runtime/ObjC/Framework/TreeWizard.m
new file mode 100644
index 0000000..e796e5c
--- /dev/null
+++ b/runtime/ObjC/Framework/TreeWizard.m
@@ -0,0 +1,735 @@
+//
+//  TreeWizard.m
+//  ANTLR
+//
+//  Created by Alan Condit on 6/18/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import "TreeWizard.h"
+#import "TreePatternLexer.h"
+#import "TreePatternParser.h"
+#import "IntArray.h"
+
+@implementation ANTLRVisitor
+
++ (ANTLRVisitor *)newANTLRVisitor:(NSInteger)anAction Actor:(id)anActor Object:(id)anObject1 Object:(id)anObject2
+{
+    return [[ANTLRVisitor alloc] initWithAction:anAction Actor:(id)anActor Object:(id)anObject1 Object:(id)anObject2];
+}
+
+- (id) initWithAction:(NSInteger)anAction Actor:(id)anActor Object:(id)anObject1 Object:(id)anObject2
+{
+    if ((self = [super init]) != nil) {
+        action = anAction;
+        actor = anActor;
+        if ( actor ) [actor retain];
+        object1 = anObject1;
+        if ( object1 ) [object1 retain];
+        object2 = anObject2;
+        if ( object2 ) [object2 retain];
+    }
+    return self;
+}
+
+- (void) dealloc
+{
+#ifdef DEBUG_DEALLOC
+    NSLog( @"called dealloc in ANTLRVisitor" );
+#endif
+    if ( actor ) [actor release];
+    if ( object1 ) [object1 release];
+    if ( object2 ) [object2 release];
+    [super dealloc];
+}
+
+- (void) visit:(CommonTree *)t Parent:(CommonTree *)parent ChildIndex:(NSInteger)childIndex Map:(Map *)labels
+{
+    switch (action) {
+        case 0:
+            [(Map *)object2 /* labels */ clear];
+            if ( [(TreeWizard *)actor _parse:t Pattern:object1/* tpattern */ Map:object2 /* labels */] ) {
+                [self visit:t Parent:parent ChildIndex:childIndex Map:object2 /* labels */];
+            }
+            break;
+        case 1:
+            if ( [(TreeWizard *)actor _parse:t Pattern:object1/* tpattern */ Map:nil] ) {
+                [(AMutableArray *)object2/* subtrees */ addObject:t];
+            }
+            break;
+    }
+    // [self visit:t];
+    return;
+}
+
+- (void) visit:(CommonTree *)t
+{
+    [object1 addObject:t];
+    return;
+}
+
+@synthesize action;
+@synthesize actor;
+@synthesize object1;
+@synthesize object2;
+@end
+
+/** When using %label:TOKENNAME in a tree for parse(), we must
+ *  track the label.
+ */
+@implementation TreePattern
+
+@synthesize label;
+@synthesize hasTextArg;
+
++ (CommonTree *)newTreePattern:(id<Token>)payload
+{
+    return (CommonTree *)[[TreePattern alloc] initWithToken:payload];
+}
+
+- (id) initWithToken:(id<Token>)payload
+{
+    self = [super initWithToken:payload];
+    if ( self != nil ) {
+    }
+    return (CommonTree *)self;
+}
+
+- (void) dealloc
+{
+#ifdef DEBUG_DEALLOC
+    NSLog( @"called dealloc in TreePattern" );
+#endif
+    if ( label ) [label release];
+    [super dealloc];
+}
+
+- (NSString *)toString
+{
+    if ( label != nil ) {
+        return [NSString stringWithFormat:@"\% %@ : %@", label, [super toString]];
+    }
+    else {
+        return [super toString];				
+    }
+}
+
+@end
+
+@implementation ANTLRWildcardTreePattern
+
++ (ANTLRWildcardTreePattern *)newANTLRWildcardTreePattern:(id<Token>)payload
+{
+    return(ANTLRWildcardTreePattern *)[[ANTLRWildcardTreePattern alloc] initWithToken:(id<Token>)payload];
+}
+
+- (id) initWithToken:(id<Token>)payload
+{
+    self = [super initWithToken:payload];
+    if ( self != nil ) {
+    }
+    return self;
+}
+
+@end
+
+/** This adaptor creates TreePattern objects for use during scan() */
+@implementation TreePatternTreeAdaptor
+
++ (TreePatternTreeAdaptor *)newTreeAdaptor
+{
+    return [[TreePatternTreeAdaptor alloc] init];
+}
+
+- (id) init
+{
+    self = [super init];
+    if ( self != nil ) {
+    }
+    return self;
+}
+
+- (CommonTree *)createTreePattern:(id<Token>)payload
+{
+    return (CommonTree *)[super create:payload];
+}
+          
+@end
+
+@implementation TreeWizard
+
+// TODO: build indexes for the wizard
+
+/** During fillBuffer(), we can make a reverse index from a set
+ *  of token types of interest to the list of indexes into the
+ *  node stream.  This lets us convert a node pointer to a
+ *  stream index semi-efficiently for a list of interesting
+ *  nodes such as function definition nodes (you'll want to seek
+ *  to their bodies for an interpreter).  Also useful for doing
+ *  dynamic searches; i.e., go find me all PLUS nodes.
+ protected Map tokenTypeToStreamIndexesMap;
+ 
+ ** If tokenTypesToReverseIndex set to INDEX_ALL then indexing
+ *  occurs for all token types.
+ public static final Set INDEX_ALL = new HashSet();
+ 
+ ** A set of token types user would like to index for faster lookup.
+ *  If this is INDEX_ALL, then all token types are tracked.  If nil,
+ *  then none are indexed.
+ protected Set tokenTypesToReverseIndex = nil;
+ */
+
++ (TreeWizard *) newTreeWizard:(id<TreeAdaptor>)anAdaptor
+{
+    return [[TreeWizard alloc] initWithAdaptor:anAdaptor];
+}
+
++ (TreeWizard *)newTreeWizard:(id<TreeAdaptor>)anAdaptor Map:(Map *)aTokenNameToTypeMap
+{
+    return [[TreeWizard alloc] initWithAdaptor:anAdaptor Map:aTokenNameToTypeMap];
+}
+
++ (TreeWizard *)newTreeWizard:(id<TreeAdaptor>)anAdaptor TokenNames:(NSArray *)theTokNams
+{
+    return [[TreeWizard alloc] initWithTokenNames:anAdaptor TokenNames:theTokNams];
+}
+
++ (TreeWizard *)newTreeWizardWithTokenNames:(NSArray *)theTokNams
+{
+    return [[TreeWizard alloc] initWithTokenNames:theTokNams];
+}
+
+- (id) init
+{
+    if ((self = [super init]) != nil) {
+    }
+    return self;
+}
+
+- (id) initWithAdaptor:(id<TreeAdaptor>)anAdaptor
+{
+    if ((self = [super init]) != nil) {
+        adaptor = anAdaptor;
+        if ( adaptor ) [adaptor retain];
+    }
+    return self;
+}
+            
+- (id) initWithAdaptor:(id<TreeAdaptor>)anAdaptor Map:(Map *)aTokenNameToTypeMap
+{
+    if ((self = [super init]) != nil) {
+        adaptor = anAdaptor;
+        if ( adaptor ) [adaptor retain];
+        tokenNameToTypeMap = aTokenNameToTypeMap;
+   }
+    return self;
+}
+
+- (id) initWithTokenNames:(NSArray *)theTokNams
+{
+    if ((self = [super init]) != nil) {
+#pragma warning Fix initWithTokenNames.
+        // adaptor = anAdaptor;
+        //tokenNameToTypeMap = aTokenNameToTypeMap;
+        tokenNameToTypeMap = [[self computeTokenTypes:theTokNams] retain];
+    }
+    return self;
+}
+             
+- (id) initWithTokenNames:(id<TreeAdaptor>)anAdaptor TokenNames:(NSArray *)theTokNams
+{
+    if ((self = [super init]) != nil) {
+        adaptor = anAdaptor;
+        if ( adaptor ) [adaptor retain];
+        // tokenNameToTypeMap = aTokenNameToTypeMap;
+        tokenNameToTypeMap = [[self computeTokenTypes:theTokNams] retain];
+    }
+    return self;
+}
+            
+- (void) dealloc
+{
+#ifdef DEBUG_DEALLOC
+    NSLog( @"called dealloc in TreePatternTreeAdaptor" );
+#endif
+    if ( adaptor ) [adaptor release];
+    if ( tokenNameToTypeMap ) [tokenNameToTypeMap release];
+    [super dealloc];
+}
+
+/** Compute a Map<String, Integer> that is an inverted index of
+ *  tokenNames (which maps int token types to names).
+ */
+- (Map *)computeTokenTypes:(NSArray *)theTokNams
+{
+    Map *m = [Map newMap];
+    if ( theTokNams == nil ) {
+        return m;
+    }
+    for (int ttype = TokenTypeMIN; ttype < [theTokNams count]; ttype++) {
+        NSString *name = (NSString *) [theTokNams objectAtIndex:ttype];
+        [m putName:name TType:ttype];
+    }
+    return m;
+}
+
+/** Using the map of token names to token types, return the type. */
+- (NSInteger)getTokenType:(NSString *)tokenName
+{
+    if ( tokenNameToTypeMap == nil ) {
+        return TokenTypeInvalid;
+    }
+    NSInteger aTType = (NSInteger)[tokenNameToTypeMap getTType:tokenName];
+    if ( aTType != -1 ) {
+        return aTType;
+    }
+    return TokenTypeInvalid;
+}
+
+/** Walk the entire tree and make a node name to nodes mapping.
+ *  For now, use recursion but later nonrecursive version may be
+ *  more efficient.  Returns Map<Integer, List> where the List is
+ *  of your AST node type.  The Integer is the token type of the node.
+ *
+ *  TODO: save this index so that find and visit are faster
+ */
+- (Map *)index:(CommonTree *)t
+{
+    Map *m = [Map newMap];
+    [self _index:t Map:m];
+    return m;
+}
+
+/** Do the work for index */
+- (void) _index:(CommonTree *)t Map:(Map *)m
+{
+    if ( t==nil ) {
+        return;
+    }
+#pragma warning Fix _index use of Map.
+    NSInteger ttype = [adaptor getType:t];
+    Map *elements = (Map *)[m getName:ttype];
+    if ( elements == nil ) {
+        elements = [Map newMapWithLen:100];
+        [m putNode:ttype Node:elements];
+    }
+    [elements addObject:t];
+    int n = [adaptor getChildCount:t];
+    for (int i=0; i<n; i++) {
+        CommonTree * child = [adaptor getChild:t At:i];
+        [self _index:child Map:m];
+    }
+}
+
+/** Return a List of tree nodes with token type ttype */
+- (AMutableArray *)find:(CommonTree *)t Type:(NSInteger)ttype
+{
+#ifdef DONTUSENOMO
+    final List nodes = new ArrayList();
+    visit(t, ttype, new TreeWizard.Visitor() {
+        public void visit(Object t) {
+            [nodes addObject t];
+        }
+    } );
+#endif
+    AMutableArray *nodes = [AMutableArray arrayWithCapacity:100];
+    ANTLRVisitor *contextVisitor = [ANTLRVisitor newANTLRVisitor:3 Actor:self Object:(id)nodes Object:nil];
+    [self visit:t Type:ttype Visitor:contextVisitor];
+    return nodes;
+}
+
+/** Return a List of subtrees matching pattern. */
+- (AMutableArray *)find:(CommonTree *)t Pattern:(NSString *)pattern
+{
+    AMutableArray *subtrees = [AMutableArray arrayWithCapacity:100];
+    // Create a TreePattern from the pattern
+    TreePatternLexer *tokenizer = [TreePatternLexer newTreePatternLexer:pattern];
+    TreePatternParser *parser = [TreePatternParser newTreePatternParser:tokenizer
+                                                                                     Wizard:self
+                                                                                    Adaptor:[TreePatternTreeAdaptor newTreeAdaptor]];
+    CommonTree *tpattern = (CommonTree *)[parser pattern];
+    // don't allow invalid patterns
+    if ( tpattern == nil ||
+        [tpattern isNil] ||
+        [tpattern class] == [ANTLRWildcardTreePattern class] )
+    {
+        return nil;
+    }
+    int rootTokenType = [tpattern type];
+#ifdef DONTUSENOMO
+    visit(t, rootTokenType, new TreeWizard.ContextVisitor() {
+        public void visit(Object t, Object parent, int childIndex, Map labels) {
+            if ( _parse(t, tpattern, null) ) {
+                subtrees.add(t);
+            }
+        }
+    } );
+#endif
+    ANTLRVisitor *contextVisitor = [ANTLRVisitor newANTLRVisitor:1 Actor:self Object:tpattern Object:subtrees];
+    [self visit:t Type:rootTokenType Visitor:contextVisitor];
+    return subtrees;
+}
+
+- (TreeWizard *)findFirst:(CommonTree *) t Type:(NSInteger)ttype
+{
+    return nil;
+}
+
+- (TreeWizard *)findFirst:(CommonTree *) t Pattern:(NSString *)pattern
+{
+    return nil;
+}
+
+/** Visit every ttype node in t, invoking the visitor.  This is a quicker
+ *  version of the general visit(t, pattern) method.  The labels arg
+ *  of the visitor action method is never set (it's nil) since using
+ *  a token type rather than a pattern doesn't let us set a label.
+ */
+- (void) visit:(CommonTree *)t Type:(NSInteger)ttype Visitor:(ANTLRVisitor *)visitor
+{
+    [self _visit:t Parent:nil ChildIndex:0 Type:ttype Visitor:visitor];
+}
+
+/** Do the recursive work for visit */
+- (void) _visit:(CommonTree *)t
+         Parent:(CommonTree *)parent
+     ChildIndex:(NSInteger)childIndex
+           Type:(NSInteger)ttype
+        Visitor:(ANTLRVisitor *)visitor
+{
+    if ( t == nil ) {
+        return;
+    }
+    if ( [adaptor getType:t] == ttype ) {
+        [visitor visit:t Parent:parent ChildIndex:childIndex Map:nil];
+    }
+    int n = [adaptor getChildCount:t];
+    for (int i=0; i<n; i++) {
+        CommonTree * child = [adaptor getChild:t At:i];
+        [self _visit:child Parent:t ChildIndex:i Type:ttype Visitor:visitor];
+    }
+}
+
+/** For all subtrees that match the pattern, execute the visit action.
+ *  The implementation uses the root node of the pattern in combination
+ *  with visit(t, ttype, visitor) so nil-rooted patterns are not allowed.
+ *  Patterns with wildcard roots are also not allowed.
+ */
+- (void)visit:(CommonTree *)t Pattern:(NSString *)pattern Visitor:(ANTLRVisitor *)visitor
+{
+    // Create a TreePattern from the pattern
+    TreePatternLexer *tokenizer = [TreePatternLexer newTreePatternLexer:pattern];
+    TreePatternParser *parser =
+    [TreePatternParser newTreePatternParser:tokenizer Wizard:self Adaptor:[TreePatternTreeAdaptor newTreeAdaptor]];
+    CommonTree *tpattern = [parser pattern];
+    // don't allow invalid patterns
+    if ( tpattern == nil ||
+        [tpattern isNil] ||
+        [tpattern class] == [ANTLRWildcardTreePattern class] )
+    {
+        return;
+    }
+    MapElement *labels = [Map newMap]; // reused for each _parse
+    int rootTokenType = [tpattern type];
+#pragma warning This is another one of those screwy nested constructs that I have to figure out
+#ifdef DONTUSENOMO
+    visit(t, rootTokenType, new TreeWizard.ContextVisitor() {
+        public void visit(Object t, Object parent, int childIndex, Map unusedlabels) {
+            // the unusedlabels arg is null as visit on token type doesn't set.
+            labels.clear();
+            if ( _parse(t, tpattern, labels) ) {
+                visitor.visit(t, parent, childIndex, labels);
+            }
+        }
+    });
+#endif
+    ANTLRVisitor *contextVisitor = [ANTLRVisitor newANTLRVisitor:0 Actor:self Object:tpattern Object:labels];
+    [self visit:t Type:rootTokenType Visitor:contextVisitor];
+}
+
+/** Given a pattern like (ASSIGN %lhs:ID %rhs:.) with optional labels
+ *  on the various nodes and '.' (dot) as the node/subtree wildcard,
+ *  return true if the pattern matches and fill the labels Map with
+ *  the labels pointing at the appropriate nodes.  Return false if
+ *  the pattern is malformed or the tree does not match.
+ *
+ *  If a node specifies a text arg in pattern, then that must match
+ *  for that node in t.
+ *
+ *  TODO: what's a better way to indicate bad pattern? Exceptions are a hassle 
+ */
+- (BOOL)parse:(CommonTree *)t Pattern:(NSString *)pattern Map:(Map *)labels
+{
+#ifdef DONTUSENOMO
+    TreePatternLexer tokenizer = new TreePatternLexer(pattern);
+    TreePatternParser parser =
+    new TreePatternParser(tokenizer, this, new TreePatternTreeAdaptor());
+    TreePattern tpattern = (TreePattern)parser.pattern();
+    /*
+     System.out.println("t="+((Tree)t).toStringTree());
+     System.out.println("scant="+tpattern.toStringTree());
+     */
+    boolean matched = _parse(t, tpattern, labels);
+    return matched;
+#endif
+    TreePatternLexer *tokenizer = [TreePatternLexer newTreePatternLexer:pattern];
+    TreePatternParser *parser = [TreePatternParser newTreePatternParser:tokenizer
+                                                                                Wizard:self
+                                                                               Adaptor:[TreePatternTreeAdaptor newTreeAdaptor]];
+    CommonTree *tpattern = [parser pattern];
+    /*
+     System.out.println("t="+((Tree)t).toStringTree());
+     System.out.println("scant="+tpattern.toStringTree());
+     */
+    //BOOL matched = [self _parse:t Pattern:tpattern Map:labels];
+    //return matched;
+    return [self _parse:t Pattern:tpattern Map:labels];
+}
+
+- (BOOL) parse:(CommonTree *)t Pattern:(NSString *)pattern
+{
+    return [self parse:t Pattern:pattern Map:nil];
+}
+
+/** Do the work for parse. Check to see if the t2 pattern fits the
+ *  structure and token types in t1.  Check text if the pattern has
+ *  text arguments on nodes.  Fill labels map with pointers to nodes
+ *  in tree matched against nodes in pattern with labels.
+ */
+- (BOOL) _parse:(CommonTree *)t1 Pattern:(CommonTree *)aTPattern Map:(Map *)labels
+{
+    TreePattern *tpattern;
+    // make sure both are non-nil
+    if ( t1 == nil || aTPattern == nil ) {
+        return NO;
+    }
+    if ( [aTPattern isKindOfClass:[ANTLRWildcardTreePattern class]] ) {
+        tpattern = (TreePattern *)aTPattern;
+    }
+    // check roots (wildcard matches anything)
+    if ( [tpattern class] != [ANTLRWildcardTreePattern class] ) {
+        if ( [adaptor getType:t1] != [tpattern type] )
+            return NO;
+        // if pattern has text, check node text
+        if ( tpattern.hasTextArg && ![[adaptor getText:t1] isEqualToString:[tpattern text]] ) {
+            return NO;
+        }
+    }
+    if ( tpattern.label != nil && labels!=nil ) {
+        // map label in pattern to node in t1
+        [labels putName:tpattern.label Node:t1];
+    }
+    // check children
+    int n1 = [adaptor getChildCount:t1];
+    int n2 = [tpattern getChildCount];
+    if ( n1 != n2 ) {
+        return NO;
+    }
+    for (int i=0; i<n1; i++) {
+        CommonTree * child1 = [adaptor getChild:t1 At:i];
+        CommonTree *child2 = (CommonTree *)[tpattern getChild:i];
+        if ( ![self _parse:child1 Pattern:child2 Map:labels] ) {
+            return NO;
+        }
+    }
+    return YES;
+}
+
+/** Create a tree or node from the indicated tree pattern that closely
+ *  follows ANTLR tree grammar tree element syntax:
+ *
+ * 		(root child1 ... child2).
+ *
+ *  You can also just pass in a node: ID
+ * 
+ *  Any node can have a text argument: ID[foo]
+ *  (notice there are no quotes around foo--it's clear it's a string).
+ *
+ *  nil is a special name meaning "give me a nil node".  Useful for
+ *  making lists: (nil A B C) is a list of A B C.
+ */
+- (CommonTree *) createTree:(NSString *)pattern
+{
+    TreePatternLexer *tokenizer = [TreePatternLexer newTreePatternLexer:pattern];
+    TreePatternParser *parser = [TreePatternParser newTreePatternParser:tokenizer Wizard:self Adaptor:adaptor];
+    CommonTree * t = [parser pattern];
+    return t;
+}
+
+/** Compare t1 and t2; return true if token types/text, structure match exactly.
+ *  The trees are examined in their entirety so that (A B) does not match
+ *  (A B C) nor (A (B C)). 
+ // TODO: allow them to pass in a comparator
+ *  TODO: have a version that is nonstatic so it can use instance adaptor
+ *
+ *  I cannot rely on the tree node's equals() implementation as I make
+ *  no constraints at all on the node types nor interface etc... 
+ */
+- (BOOL)equals:(id)t1 O2:(id)t2 Adaptor:(id<TreeAdaptor>)anAdaptor
+{
+    return [self _equals:t1 O2:t2 Adaptor:anAdaptor];
+}
+
+/** Compare type, structure, and text of two trees, assuming adaptor in
+ *  this instance of a TreeWizard.
+ */
+- (BOOL)equals:(id)t1 O2:(id)t2
+{
+    return [self _equals:t1 O2:t2 Adaptor:adaptor];
+}
+
+- (BOOL) _equals:(id)t1 O2:(id)t2 Adaptor:(id<TreeAdaptor>)anAdaptor
+{
+    // make sure both are non-nil
+    if ( t1==nil || t2==nil ) {
+        return NO;
+    }
+    // check roots
+    if ( [anAdaptor getType:t1] != [anAdaptor getType:t2] ) {
+        return NO;
+    }
+    if ( ![[anAdaptor getText:t1] isEqualTo:[anAdaptor getText:t2]] ) {
+        return NO;
+    }
+    // check children
+    NSInteger n1 = [anAdaptor getChildCount:t1];
+    NSInteger n2 = [anAdaptor getChildCount:t2];
+    if ( n1 != n2 ) {
+        return NO;
+    }
+    for (int i=0; i<n1; i++) {
+        CommonTree * child1 = [anAdaptor getChild:t1 At:i];
+        CommonTree * child2 = [anAdaptor getChild:t2 At:i];
+        if ( ![self _equals:child1 O2:child2 Adaptor:anAdaptor] ) {
+            return NO;
+        }
+    }
+    return YES;
+}
+
+// TODO: next stuff taken from CommonTreeNodeStream
+
+/** Given a node, add this to the reverse index tokenTypeToStreamIndexesMap.
+ *  You can override this method to alter how indexing occurs.  The
+ *  default is to create a
+ *
+ *    Map<Integer token type,ArrayList<Integer stream index>>
+ *
+ *  This data structure allows you to find all nodes with type INT in order.
+ *
+ *  If you really need to find a node of type, say, FUNC quickly then perhaps
+ *
+ *    Map<Integertoken type, Map<Object tree node, Integer stream index>>
+ *
+ *  would be better for you.  The interior maps map a tree node to
+ *  the index so you don't have to search linearly for a specific node.
+ *
+ *  If you change this method, you will likely need to change
+ *  getNodeIndex(), which extracts information.
+- (void)fillReverseIndex:(CommonTree *)node Index:(NSInteger)streamIndex
+{
+    //System.out.println("revIndex "+node+"@"+streamIndex);
+    if ( tokenTypesToReverseIndex == nil ) {
+        return; // no indexing if this is empty (nothing of interest)
+    }
+    if ( tokenTypeToStreamIndexesMap == nil ) {
+        tokenTypeToStreamIndexesMap = [Map newMap]; // first indexing op
+    }
+    int tokenType = [adaptor getType:node];
+    Integer tokenTypeI = new Integer(tokenType);
+    if ( !(tokenTypesToReverseIndex == INDEX_ALL ||
+            [tokenTypesToReverseIndex contains:tokenTypeI]) ) {
+        return; // tokenType not of interest
+    }
+    NSInteger streamIndexI = streamIndex;
+    AMutableArray *indexes = (AMutableArray *)[tokenTypeToStreamIndexesMap objectAtIndex:tokenTypeI];
+    if ( indexes==nil ) {
+        indexes = [AMutableArray arrayWithCapacity:100]; // no list yet for this token type
+        indexes.add(streamIndexI); // not there yet, add
+        [tokenTypeToStreamIndexesMap put:tokenTypeI Idexes:indexes];
+    }
+    else {
+        if ( ![indexes contains:streamIndexI] ) {
+            [indexes add:streamIndexI]; // not there yet, add
+        }
+    }
+}
+ 
+ ** Track the indicated token type in the reverse index.  Call this
+ *  repeatedly for each type or use variant with Set argument to
+ *  set all at once.
+ * @param tokenType
+public void reverseIndex:(NSInteger)tokenType
+{
+    if ( tokenTypesToReverseIndex == nil ) {
+        tokenTypesToReverseIndex = [Map newMap];
+    }
+    else if ( tokenTypesToReverseIndex == INDEX_ALL ) {
+        return;
+    }
+    tokenTypesToReverseIndex.add(new Integer(tokenType));
+}
+ 
+** Track the indicated token types in the reverse index. Set
+ *  to INDEX_ALL to track all token types.
+public void reverseIndex(Set tokenTypes) {
+    tokenTypesToReverseIndex = tokenTypes;
+}
+ 
+ ** Given a node pointer, return its index into the node stream.
+ *  This is not its Token stream index.  If there is no reverse map
+ *  from node to stream index or the map does not contain entries
+ *  for node's token type, a linear search of entire stream is used.
+ *
+ *  Return -1 if exact node pointer not in stream.
+public int getNodeIndex(Object node) {
+    //System.out.println("get "+node);
+    if ( tokenTypeToStreamIndexesMap==nil ) {
+        return getNodeIndexLinearly(node);
+    }
+    int tokenType = adaptor.getType(node);
+    Integer tokenTypeI = new Integer(tokenType);
+    ArrayList indexes = (ArrayList)tokenTypeToStreamIndexesMap.get(tokenTypeI);
+    if ( indexes==nil ) {
+        //System.out.println("found linearly; stream index = "+getNodeIndexLinearly(node));
+        return getNodeIndexLinearly(node);
+    }
+    for (int i = 0; i < indexes.size(); i++) {
+        Integer streamIndexI = (Integer)indexes.get(i);
+        Object n = get(streamIndexI.intValue());
+        if ( n==node ) {
+            //System.out.println("found in index; stream index = "+streamIndexI);
+            return streamIndexI.intValue(); // found it!
+        }
+    }
+    return -1;
+}
+ 
+*/
+
+@synthesize adaptor;
+@synthesize tokenNameToTypeMap;
+@end
diff --git a/runtime/ObjC/Framework/UnbufferedCommonTreeNodeStream.h b/runtime/ObjC/Framework/UnbufferedCommonTreeNodeStream.h
new file mode 100644
index 0000000..fd66ac7
--- /dev/null
+++ b/runtime/ObjC/Framework/UnbufferedCommonTreeNodeStream.h
@@ -0,0 +1,122 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+
+#import <Cocoa/Cocoa.h>
+#import "TreeNodeStream.h"
+#import "CommonTokenStream.h"
+#import "CommonTree.h"
+#import "CommonTreeAdaptor.h"
+
+@interface ANTLRUnbufferedCommonTreeNodeStream : NSObject < TreeNodeStream > {
+
+	BOOL shouldUseUniqueNavigationNodes;
+
+	CommonTree *root;
+	CommonTree *currentNode;
+	CommonTree *previousNode;
+
+	id<TreeAdaptor> treeAdaptor;
+	
+	id<TokenStream> tokenStream;
+	
+	NSMutableArray *nodeStack;
+	NSMutableArray *indexStack;
+	PtrBuffer *markers;
+	NSInteger lastMarker;
+	
+	NSInteger currentChildIndex;
+	NSInteger absoluteNodeIndex;
+	
+	NSMutableArray *lookahead;
+	NSUInteger head;
+	NSUInteger tail;
+}
+
+@property (retain, getter=getRoot, setter=setRoot:) CommonTree *root;
+@property (retain, getter=getCurrentNode, setter=setCurrentNode:) CommonTree *currentNode;
+@property (retain, getter=getPreviousNode, setter=setPreviousNode:) CommonTree *previousNode;
+@property (retain, getter=getTreeAdaptor, setter=setTreeAdaptor:) id<TreeAdaptor> treeAdaptor;
+@property (retain, getter=getTokenStream, setter=setTokenStream:) id<TokenStream> tokenStream;
+@property (retain, getter=getNodeStack, setter=setNodeStack:) NSMutableArray *nodeStack;
+@property (retain, getter=getIndexStack, setter=setIndexStackStack:) NSMutableArray *indexStack;
+@property (retain, getter=getMarkers, setter=setMarkers:) PtrBuffer *markers;
+@property (assign, getter=getLastMarker, setter=setLastMarker:) NSInteger lastMarker;
+@property (assign, getter=getCurrentChildIndex, setter=setCurrentChildIndex:) NSInteger currentChildIndex;
+@property (assign, getter=getAbsoluteNodeIndex, setter=setAbsoluteNodeIndex:) NSInteger absoluteNodeIndex;
+@property (retain, getter=getLookahead, setter=setLookahead:) NSMutableArray *lookahead;
+@property (assign, getter=getHead, setter=setHead:) NSUInteger head;
+@property (assign, getter=getTail, setter=setTail:) NSUInteger tail;
+
+- (id) initWithTree:(CommonTree *)theTree;
+- (id) initWithTree:(CommonTree *)theTree treeAdaptor:(CommonTreeAdaptor *)theAdaptor;
+
+- (void) reset;
+
+#pragma mark ANTLRTreeNodeStream conformance
+
+- (id) LT:(NSInteger)k;
+- (id) treeSource;
+- (id<TreeAdaptor>) getTreeAdaptor;
+- (void)setTreeAdaptor:(id<TreeAdaptor>)aTreeAdaptor;
+- (id<TokenStream>) getTokenStream;
+- (void) setTokenStream:(id<TokenStream>)aTokenStream;	///< Added by subclass, not in protocol
+- (void) setUsesUniqueNavigationNodes:(BOOL)flag;
+
+- (id) nodeAtIndex:(NSUInteger) idx;
+
+- (NSString *) toString;
+- (NSString *) toStringWithRange:(NSRange) aRange;
+- (NSString *) toStringFromNode:(id)startNode toNode:(id)stopNode;
+
+#pragma mark ANTLRIntStream conformance
+- (void) consume;
+- (NSInteger) LA:(NSUInteger) i;
+- (NSUInteger) mark;
+- (NSUInteger) getIndex;
+- (void) rewind:(NSUInteger) marker;
+- (void) rewind;
+- (void) release:(NSUInteger) marker;
+- (void) seek:(NSUInteger) index;
+- (NSUInteger) size;
+
+#pragma mark Lookahead Handling
+- (void) addLookahead:(id<BaseTree>)aNode;
+- (NSUInteger) lookaheadSize;
+- (void) fillBufferWithLookahead:(NSInteger)k;
+- (id) nextObject;
+
+#pragma mark Node visiting
+- (CommonTree *) handleRootNode;
+- (CommonTree *) visitChild:(NSInteger)childNumber;
+- (void) walkBackToMostRecentNodeWithUnvisitedChildren;
+- (void) addNavigationNodeWithType:(NSInteger)tokenType;
+
+#pragma mark Accessors
+- (CommonTree *) root;
+- (void) setRoot: (CommonTree *) aRoot;
+
+@end
diff --git a/runtime/ObjC/Framework/UnbufferedCommonTreeNodeStream.m b/runtime/ObjC/Framework/UnbufferedCommonTreeNodeStream.m
new file mode 100644
index 0000000..8c76966
--- /dev/null
+++ b/runtime/ObjC/Framework/UnbufferedCommonTreeNodeStream.m
@@ -0,0 +1,432 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+
+#import "UnbufferedCommonTreeNodeStream.h"
+#import "UnbufferedCommonTreeNodeStreamState.h"
+#import "BaseTree.h"
+#import "Token.h"
+
+#define INITIAL_LOOKAHEAD_BUFFER_SIZE 5
+@implementation ANTLRUnbufferedCommonTreeNodeStream
+
+@synthesize root;
+@synthesize currentNode;
+@synthesize previousNode;
+@synthesize treeAdaptor;
+@synthesize tokenStream;
+@synthesize nodeStack;
+@synthesize indexStack;
+@synthesize markers;
+@synthesize lastMarker;
+@synthesize currentChildIndex;
+@synthesize absoluteNodeIndex;
+@synthesize lookahead;
+@synthesize head;
+@synthesize tail;
+
+- (id) initWithTree:(CommonTree *)theTree
+{
+	return [self initWithTree:theTree treeAdaptor:nil];
+}
+
+- (id) initWithTree:(CommonTree *)theTree treeAdaptor:(CommonTreeAdaptor *)theAdaptor
+{
+	if ((self = [super init]) != nil) {
+		[self setRoot:theTree];
+		if ( theAdaptor == nil ) 
+			[self setTreeAdaptor:[CommonTreeAdaptor newTreeAdaptor]];
+		else
+			[self setTreeAdaptor:theAdaptor];
+		nodeStack = [[NSMutableArray arrayWithCapacity:5] retain];
+		indexStack = [[NSMutableArray arrayWithCapacity:5] retain];
+		markers = [[PtrBuffer newPtrBufferWithLen:100] retain];
+        // [markers insertObject:[NSNull null] atIndex:0];	// markers is one based - maybe fix this later
+		lookahead = [NSMutableArray arrayWithCapacity:INITIAL_LOOKAHEAD_BUFFER_SIZE];	// lookahead is filled with [NSNull null] in -reset
+        [lookahead retain];
+		[self reset];
+	}
+	return self;
+}
+
+- (void) dealloc
+{
+	[self setRoot:nil];
+	[self setTreeAdaptor:nil];
+	
+	[nodeStack release];	nodeStack = nil;
+	[indexStack release];	indexStack = nil;
+	[markers release];		markers = nil;
+	[lookahead release];	lookahead = nil;
+	
+	[super dealloc];
+}
+
+- (void) reset
+{
+	currentNode = root;
+	previousNode = nil;
+	currentChildIndex = -1;
+	absoluteNodeIndex = -1;
+	head = tail = 0;
+	[nodeStack removeAllObjects];
+	[indexStack removeAllObjects];
+	[markers removeAllObjects];
+    // [markers insertObject:[NSNull null] atIndex:0];	// markers is one based - maybe fix this later
+	[lookahead removeAllObjects];
+	// TODO: this is not ideal, but works for now. optimize later
+	int i;
+	for (i = 0; i < INITIAL_LOOKAHEAD_BUFFER_SIZE; i++)
+		[lookahead addObject:[NSNull null]];
+}
+
+
+#pragma mark ANTLRTreeNodeStream conformance
+
+- (id) LT:(NSInteger)k
+{
+	if (k == -1)
+		return previousNode;
+	if (k < 0)
+		@throw [NSException exceptionWithName:@"ANTLRTreeException" reason:@"-LT: looking back more than one node unsupported for unbuffered streams" userInfo:nil];
+	if (k == 0)
+		return BaseTree.INVALID_NODE;
+	[self fillBufferWithLookahead:k];
+	return [lookahead objectAtIndex:(head+k-1) % [lookahead count]];
+}
+
+- (id) treeSource
+{
+	return [self root];
+}
+
+- (id<TreeAdaptor>) getTreeAdaptor;
+{
+	return treeAdaptor;
+}
+
+- (void)setTreeAdaptor:(id<TreeAdaptor>)aTreeAdaptor
+{
+    if (treeAdaptor != aTreeAdaptor) {
+        [aTreeAdaptor retain];
+        [treeAdaptor release];
+        treeAdaptor = aTreeAdaptor;
+    }
+}
+
+- (id<TokenStream>) getTokenStream
+{
+	return tokenStream;
+}
+
+- (void) setTokenStream:(id<TokenStream>)aTokenStream
+{
+	if (tokenStream != aTokenStream) {
+		[tokenStream release];
+		[aTokenStream retain];
+		tokenStream = aTokenStream;
+	}
+}
+
+- (void) setUsesUniqueNavigationNodes:(BOOL)flag
+{
+	shouldUseUniqueNavigationNodes = flag;
+}
+
+- (id) nodeAtIndex:(NSUInteger) idx
+{
+	@throw [NSException exceptionWithName:@"ANTLRTreeException" reason:@"-nodeAtIndex: unsupported for unbuffered streams" userInfo:nil];
+}
+
+- (NSString *) toString
+{
+	@throw [NSException exceptionWithName:@"ANTLRTreeException" reason:@"-toString unsupported for unbuffered streams" userInfo:nil];
+}
+
+- (NSString *) toStringWithRange:(NSRange) aRange
+{
+	@throw [NSException exceptionWithName:@"ANTLRTreeException" reason:@"-toString: unsupported for unbuffered streams" userInfo:nil];
+}
+
+- (NSString *) toStringFromNode:(id)startNode ToNode:(id)stopNode
+{
+	@throw [NSException exceptionWithName:@"ANTLRTreeException" reason:@"-toStringFromNode:toNode: unsupported for unbuffered streams" userInfo:nil];
+}
+
+#pragma mark ANTLRIntStream conformance
+
+- (void) consume
+{
+	[self fillBufferWithLookahead:1];
+	absoluteNodeIndex++;
+	previousNode = [lookahead objectAtIndex:head];
+	head = (head+1) % [lookahead count];
+}
+
+- (NSInteger) LA:(NSUInteger) i
+{
+	CommonTree *node = [self LT:i];
+	if (!node) 
+		return TokenTypeInvalid;
+	int ttype = [node getType];
+	return ttype;
+}
+
+- (NSUInteger) mark
+{
+	ANTLRUnbufferedCommonTreeNodeStreamState *state = [[[ANTLRUnbufferedCommonTreeNodeStreamState alloc] init] retain];
+	[state setCurrentNode:currentNode];
+	[state setPreviousNode:previousNode];
+	[state setIndexStackSize:[indexStack count]];
+	[state setNodeStackSize:[nodeStack count]];
+	[state setCurrentChildIndex:currentChildIndex];
+	[state setAbsoluteNodeIndex:absoluteNodeIndex];
+	unsigned int lookaheadSize = [self lookaheadSize];
+	unsigned int k;
+	for ( k = 0; k < lookaheadSize; k++) {
+		[state addToLookahead:[self LT:k+1]];
+	}
+	[markers addObject:state];
+	//[state release];
+	return [markers count];
+}
+
+- (NSUInteger) getIndex
+{
+	return absoluteNodeIndex + 1;
+}
+
+- (void) rewind:(NSUInteger) marker
+{
+	if ( [markers count] < marker ) {
+		return;
+	}
+	ANTLRUnbufferedCommonTreeNodeStreamState *state = [markers objectAtIndex:marker];
+	[markers removeObjectAtIndex:marker];
+
+	absoluteNodeIndex = [state absoluteNodeIndex];
+	currentChildIndex = [state currentChildIndex];
+	currentNode = [state currentNode];
+	previousNode = [state previousNode];
+	// drop node and index stacks back to old size
+	[nodeStack removeObjectsInRange:NSMakeRange([state nodeStackSize], [nodeStack count]-[state nodeStackSize])];
+	[indexStack removeObjectsInRange:NSMakeRange([state indexStackSize], [indexStack count]-[state indexStackSize])];
+	
+	head = tail = 0; // wack lookahead buffer and then refill
+	[lookahead release];
+	lookahead = [[NSMutableArray alloc] initWithArray:[state lookahead]];
+	tail = [lookahead count];
+	// make some room after the restored lookahead, so that the above line is not a bug ;)
+	// this also ensures that a subsequent -addLookahead: will not immediately need to resize the buffer
+	[lookahead addObjectsFromArray:[NSArray arrayWithObjects:[NSNull null], [NSNull null], [NSNull null], [NSNull null], [NSNull null], nil]];
+}
+
+- (void) rewind
+{
+	[self rewind:[markers count]];
+}
+
+- (void) release:(NSUInteger) marker
+{
+	@throw [NSException exceptionWithName:@"ANTLRTreeException" reason:@"-release: unsupported for unbuffered streams" userInfo:nil];
+}
+
+- (void) seek:(NSUInteger) anIndex
+{
+	if ( anIndex < (NSUInteger) index )
+		@throw [NSException exceptionWithName:@"ANTLRTreeException" reason:@"-seek: backwards unsupported for unbuffered streams" userInfo:nil];
+	while ( (NSUInteger) index < anIndex ) {
+		[self consume];
+	}
+}
+
+- (NSUInteger) size;
+{
+	return absoluteNodeIndex + 1;	// not entirely correct, but cheap.
+}
+
+
+#pragma mark Lookahead Handling
+- (void) addLookahead:(id<BaseTree>)aNode
+{
+	[lookahead replaceObjectAtIndex:tail withObject:aNode];
+	tail = (tail+1) % [lookahead count];
+	
+	if ( tail == head ) {
+		NSMutableArray *newLookahead = [[[NSMutableArray alloc] initWithCapacity:[lookahead count]*2] retain];
+		
+		NSRange headRange = NSMakeRange(head, [lookahead count]-head);
+		NSRange tailRange = NSMakeRange(0, tail);
+		
+		[newLookahead addObjectsFromArray:[lookahead objectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:headRange]]];
+		[newLookahead addObjectsFromArray:[lookahead objectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:tailRange]]];
+		
+		unsigned int i;
+		unsigned int lookaheadCount = [newLookahead count];
+		for (i = 0; i < lookaheadCount; i++)
+			[newLookahead addObject:[NSNull null]];
+		[lookahead release];
+		lookahead = newLookahead;
+		
+		head = 0;
+		tail = lookaheadCount;	// tail is the location the _next_ lookahead node will end up in, not the last element's idx itself!
+	}
+	
+}
+
+- (NSUInteger) lookaheadSize
+{
+	return tail < head
+		? ([lookahead count] - head + tail) 
+		: (tail - head);
+}
+
+- (void) fillBufferWithLookahead:(NSInteger)k
+{
+	unsigned int n = [self lookaheadSize];
+	unsigned int i;
+	id lookaheadObject = self; // any valid object would do.
+	for (i=1; i <= k-n && lookaheadObject != nil; i++) {
+		lookaheadObject = [self nextObject];
+	}
+}
+
+- (id) nextObject
+{
+	// NOTE: this could/should go into an NSEnumerator subclass for treenode streams.
+	if (currentNode == nil) {
+        if ( navigationNodeEOF == nil ) {
+            navigationNodeEOF = [[TreeNavigationNodeEOF alloc] init];
+        }
+		[self addLookahead:navigationNodeEOF];
+		return nil;
+	}
+	if (currentChildIndex == -1) {
+		return [self handleRootNode];
+	}
+	if (currentChildIndex < (NSInteger)[currentNode getChildCount]) {
+		return [self visitChild:currentChildIndex];
+	}
+	[self walkBackToMostRecentNodeWithUnvisitedChildren];
+	if (currentNode != nil) {
+		return [self visitChild:currentChildIndex];
+	}
+	
+	return nil;
+}	
+
+#pragma mark Node visiting
+- (CommonTree *) handleRootNode
+{
+	CommonTree *node = currentNode;
+	currentChildIndex = 0;
+	if ([node isNil]) {
+		node = [self visitChild:currentChildIndex];
+	} else {
+		[self addLookahead:node];
+		if ([currentNode getChildCount] == 0) {
+			currentNode = nil;
+		}
+	}
+	return node;
+}
+
+- (CommonTree *) visitChild:(NSInteger)childNumber
+{
+	CommonTree *node = nil;
+	
+	[nodeStack addObject:currentNode];
+	[indexStack addObject:[NSNumber numberWithInt:childNumber]];
+	if (childNumber == 0 && ![currentNode isNil])
+		[self addNavigationNodeWithType:TokenTypeDOWN];
+
+	currentNode = [currentNode getChild:childNumber];
+	currentChildIndex = 0;
+	node = currentNode;  // record node to return
+	[self addLookahead:node];
+	[self walkBackToMostRecentNodeWithUnvisitedChildren];
+	return node;
+}
+
+- (void) walkBackToMostRecentNodeWithUnvisitedChildren
+{
+	while (currentNode != nil && currentChildIndex >= (NSInteger)[currentNode getChildCount])
+	{
+		currentNode = (CommonTree *)[nodeStack lastObject];
+		[nodeStack removeLastObject];
+		currentChildIndex = [(NSNumber *)[indexStack lastObject] intValue];
+		[indexStack removeLastObject];
+		currentChildIndex++; // move to next child
+		if (currentChildIndex >= (NSInteger)[currentNode getChildCount]) {
+			if (![currentNode isNil]) {
+				[self addNavigationNodeWithType:TokenTypeUP];
+			}
+			if (currentNode == root) { // we done yet?
+				currentNode = nil;
+			}
+		}
+	}
+	
+}
+
+- (void) addNavigationNodeWithType:(NSInteger)tokenType
+{
+	// TODO: this currently ignores shouldUseUniqueNavigationNodes.
+	switch (tokenType) {
+		case TokenTypeDOWN: {
+            if (navigationNodeDown == nil) {
+                navigationNodeDown = [[TreeNavigationNodeDown alloc] init];
+            }
+			[self addLookahead:navigationNodeDown];
+			break;
+		}
+		case TokenTypeUP: {
+            if (navigationNodeUp == nil) {
+                navigationNodeUp = [[TreeNavigationNodeUp alloc] init];
+            }
+			[self addLookahead:navigationNodeUp];
+			break;
+		}
+	}
+}
+
+#pragma mark Accessors
+- (CommonTree *) root
+{
+    return root; 
+}
+
+- (void) setRoot: (CommonTree *) aRoot
+{
+    if (root != aRoot) {
+        [aRoot retain];
+        [root release];
+        root = aRoot;
+    }
+}
+
+@end
+
diff --git a/runtime/ObjC/Framework/UnbufferedCommonTreeNodeStreamState.h b/runtime/ObjC/Framework/UnbufferedCommonTreeNodeStreamState.h
new file mode 100644
index 0000000..280242b
--- /dev/null
+++ b/runtime/ObjC/Framework/UnbufferedCommonTreeNodeStreamState.h
@@ -0,0 +1,66 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+#import <Cocoa/Cocoa.h>
+#import "CommonTree.h"
+
+@interface ANTLRUnbufferedCommonTreeNodeStreamState : NSObject {
+	CommonTree *currentNode;
+	CommonTree *previousNode;
+
+	int currentChildIndex;
+	int absoluteNodeIndex;
+	unsigned int nodeStackSize;
+	unsigned int indexStackSize;
+	
+	NSMutableArray *lookahead;
+}
+
+- (CommonTree *) currentNode;
+- (void) setCurrentNode: (CommonTree *) aCurrentNode;
+
+- (CommonTree *) previousNode;
+- (void) setPreviousNode: (CommonTree *) aPreviousNode;
+
+- (NSInteger) currentChildIndex;
+- (void) setCurrentChildIndex: (NSInteger) aCurrentChildIndex;
+
+- (NSInteger) absoluteNodeIndex;
+- (void) setAbsoluteNodeIndex: (NSInteger) anAbsoluteNodeIndex;
+
+- (NSUInteger) nodeStackSize;
+- (void) setNodeStackSize: (NSUInteger) aNodeStackSize;
+
+- (NSUInteger) indexStackSize;
+- (void) setIndexStackSize: (NSUInteger) anIndexStackSize;
+
+- (NSMutableArray *) lookahead;
+- (void) setLookahead: (NSMutableArray *) aLookahead;
+
+- (void) addToLookahead: (id)lookaheadObject;
+- (void) removeFromLookahead: (id)lookaheadObject;
+
+@end
diff --git a/runtime/ObjC/Framework/UnbufferedCommonTreeNodeStreamState.m b/runtime/ObjC/Framework/UnbufferedCommonTreeNodeStreamState.m
new file mode 100644
index 0000000..e5fa5ad
--- /dev/null
+++ b/runtime/ObjC/Framework/UnbufferedCommonTreeNodeStreamState.m
@@ -0,0 +1,140 @@
+// [The "BSD licence"]
+// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
+// 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.
+
+#import "UnbufferedCommonTreeNodeStreamState.h"
+
+
+@implementation ANTLRUnbufferedCommonTreeNodeStreamState
+
+- (id) init
+{
+	if ((self = [super init]) != nil) {
+		lookahead = [[NSMutableArray alloc] init];
+	}
+	return self;
+}
+
+- (void) dealloc
+{
+	[self setLookahead:nil];
+	[self setCurrentNode:nil];
+	[self setPreviousNode:nil];
+	[super dealloc];
+}
+
+- (CommonTree *) currentNode
+{
+    return currentNode; 
+}
+
+- (void) setCurrentNode: (CommonTree *) aCurrentNode
+{
+    if (currentNode != aCurrentNode) {
+        [aCurrentNode retain];
+        [currentNode release];
+        currentNode = aCurrentNode;
+    }
+}
+
+- (CommonTree *) previousNode
+{
+    return previousNode; 
+}
+
+- (void) setPreviousNode: (CommonTree *) aPreviousNode
+{
+    if (previousNode != aPreviousNode) {
+        [aPreviousNode retain];
+        [previousNode release];
+        previousNode = aPreviousNode;
+    }
+}
+
+- (NSInteger) currentChildIndex
+{
+    return currentChildIndex;
+}
+
+- (void) setCurrentChildIndex: (NSInteger) aCurrentChildIndex
+{
+    currentChildIndex = aCurrentChildIndex;
+}
+
+- (NSInteger) absoluteNodeIndex
+{
+    return absoluteNodeIndex;
+}
+
+- (void) setAbsoluteNodeIndex: (NSInteger) anAbsoluteNodeIndex
+{
+    absoluteNodeIndex = anAbsoluteNodeIndex;
+}
+
+- (NSUInteger) nodeStackSize
+{
+    return nodeStackSize;
+}
+
+- (void) setNodeStackSize: (NSUInteger) aNodeStackSize
+{
+    nodeStackSize = aNodeStackSize;
+}
+
+- (NSUInteger) indexStackSize
+{
+    return indexStackSize;
+}
+
+- (void) setIndexStackSize: (NSUInteger) anIndexStackSize
+{
+    indexStackSize = anIndexStackSize;
+}
+
+- (NSMutableArray *) lookahead
+{
+    return lookahead; 
+}
+
+- (void) setLookahead: (NSMutableArray *) aLookahead
+{
+    if (lookahead != aLookahead) {
+        [aLookahead retain];
+        [lookahead release];
+        lookahead = aLookahead;
+    }
+}
+
+- (void) addToLookahead: (id)lookaheadObject
+{
+    [[self lookahead] addObject: lookaheadObject];
+}
+- (void) removeFromLookahead: (id)lookaheadObject
+{
+    [[self lookahead] removeObject: lookaheadObject];
+}
+
+
+@end
diff --git a/runtime/ObjC/Framework/UnbufferedTokenStream.h b/runtime/ObjC/Framework/UnbufferedTokenStream.h
new file mode 100644
index 0000000..755c8bd
--- /dev/null
+++ b/runtime/ObjC/Framework/UnbufferedTokenStream.h
@@ -0,0 +1,62 @@
+//
+//  UnbufferedTokenStream.h
+//  ANTLR
+//
+//  Created by Alan Condit on 7/12/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "RuntimeException.h"
+#import "TokenSource.h"
+#import "LookaheadStream.h"
+#import "Token.h"
+
+@interface UnbufferedTokenStream : LookaheadStream {
+	id<TokenSource> tokenSource;
+    NSInteger tokenIndex; // simple counter to set token index in tokens
+    NSInteger channel;
+}
+
+@property (retain, getter=getTokenSource, setter=setTokenSource:) id<TokenSource> tokenSource;
+@property (getter=getTokenIndex, setter=setTokenIndex:) NSInteger tokenIndex;
+@property (getter=channel, setter=setChannel:) NSInteger channel;
+
++ (UnbufferedTokenStream *)newUnbufferedTokenStream:(id<TokenSource>)aTokenSource;
+- (id) init;
+- (id) initWithTokenSource:(id<TokenSource>)aTokenSource;
+
+- (id<Token>)nextElement;
+- (BOOL)isEOF:(id<Token>) aToken;
+- (id<TokenSource>)getTokenSource;
+- (NSString *)toStringFromStart:(NSInteger)aStart ToEnd:(NSInteger)aStop;
+- (NSString *)toStringFromToken:(id<Token>)aStart ToEnd:(id<Token>)aStop;
+- (NSInteger)LA:(NSInteger)anIdx;
+- (id<Token>)objectAtIndex:(NSInteger)anIdx;
+- (NSString *)getSourceName;
+
+
+@end
diff --git a/runtime/ObjC/Framework/UnbufferedTokenStream.m b/runtime/ObjC/Framework/UnbufferedTokenStream.m
new file mode 100644
index 0000000..8f755d4
--- /dev/null
+++ b/runtime/ObjC/Framework/UnbufferedTokenStream.m
@@ -0,0 +1,118 @@
+//
+//  UnbufferedTokenStream.m
+//  ANTLR
+//
+//  Created by Alan Condit on 7/12/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import "UnbufferedTokenStream.h"
+
+@implementation UnbufferedTokenStream
+
+@synthesize tokenSource;
+@synthesize tokenIndex;
+@synthesize channel;
+
++ (UnbufferedTokenStream *)newUnbufferedTokenStream:(id<TokenSource>)aTokenSource
+{
+    return [[UnbufferedTokenStream alloc] initWithTokenSource:aTokenSource];
+}
+
+- (id) init
+{
+    if ((self = [super init]) != nil) {
+        tokenSource = nil;
+        tokenIndex = 0;
+        channel = TokenChannelDefault;
+    }
+    return self;
+}
+
+- (id) initWithTokenSource:(id<TokenSource>)aTokenSource
+{
+    if ((self = [super init]) != nil) {
+        tokenSource = aTokenSource;
+        if ( tokenSource ) [tokenSource retain];
+        tokenIndex = 0;
+        channel = TokenChannelDefault;
+    }
+    return self;
+}
+
+- (void) dealloc
+{
+#ifdef DEBUG_DEALLOC
+    NSLog( @"called dealloc in UnbufferedTokenStream" );
+#endif
+    if ( tokenSource ) [tokenSource release];
+    [super dealloc];
+}
+
+- (id<Token>)nextElement
+{
+    id<Token> t = [tokenSource nextToken];
+    [t setTokenIndex:tokenIndex++];
+    return t;
+}
+
+- (BOOL)isEOF:(id<Token>)aToken
+{
+    return (aToken.type == TokenTypeEOF);
+}    
+
+- (id<TokenSource>)getTokenSource
+{
+    return tokenSource;
+}
+
+- (NSString *)toStringFromStart:(NSInteger)aStart ToEnd:(NSInteger)aStop
+{
+    return @"n/a";
+}
+
+- (NSString *)toStringFromToken:(id<Token>)aStart ToEnd:(id<Token>)aStop
+{
+    return @"n/a";
+}
+
+- (NSInteger)LA:(NSInteger)anIdx
+{
+    return [[self LT:anIdx] type];
+}
+
+- (id<Token>)objectAtIndex:(NSInteger)anIdx
+{
+    @throw [RuntimeException newException:@"Absolute token indexes are meaningless in an unbuffered stream"];
+}
+
+- (NSString *)getSourceName
+{
+    return [tokenSource getSourceName];
+}
+
+
+@end
diff --git a/runtime/ObjC/Framework/UniqueIDMap.h b/runtime/ObjC/Framework/UniqueIDMap.h
new file mode 100644
index 0000000..3efc0fd
--- /dev/null
+++ b/runtime/ObjC/Framework/UniqueIDMap.h
@@ -0,0 +1,64 @@
+//
+//  UniqueIDMap.h
+//  ANTLR
+//
+//  Created by Alan Condit on 7/7/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "PtrBuffer.h"
+#import "NodeMapElement.h"
+
+#define SUCCESS             0
+#define FAILURE             -1
+#define HASHSIZE            101
+#define HBUFSIZE            0x2000
+
+@interface UniqueIDMap : PtrBuffer {
+    NSInteger lastHash;
+}
+
+@property (getter=getLastHash, setter=setLastHash:) NSInteger lastHash;
+
++ (id)newUniqueIDMap;
++ (id)newUniqueIDMapWithLen:(NSInteger)aHashSize;
+
+- (id)init;
+- (id)initWithLen:(NSInteger)cnt;
+- (void)dealloc;
+// Instance Methods
+- (NSInteger)count;
+- (NSInteger)size;
+/* clear -- reinitialize the maplist array */
+- (void) clear;
+
+- (void)deleteUniqueIDMap:(NodeMapElement *)np;
+- (void)delete_chain:(NodeMapElement *)np;
+- (id)getNode:(id<BaseTree>)aNode;
+- (void)putID:(id)anID Node:(id<BaseTree>)aNode;
+
+@end
diff --git a/runtime/ObjC/Framework/UniqueIDMap.m b/runtime/ObjC/Framework/UniqueIDMap.m
new file mode 100644
index 0000000..daafbd0
--- /dev/null
+++ b/runtime/ObjC/Framework/UniqueIDMap.m
@@ -0,0 +1,184 @@
+//
+//  UniqueIDMap.m
+//  ANTLR
+//
+//  Created by Alan Condit on 7/7/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import "UniqueIDMap.h"
+#import "Tree.h"
+
+@implementation UniqueIDMap
+@synthesize lastHash;
+
++(id)newUniqueIDMap
+{
+    UniqueIDMap *aNewUniqueIDMap;
+    
+    aNewUniqueIDMap = [[UniqueIDMap alloc] init];
+	return( aNewUniqueIDMap );
+}
+
++(id)newUniqueIDMapWithLen:(NSInteger)aBuffSize
+{
+    UniqueIDMap *aNewUniqueIDMap;
+    
+    aNewUniqueIDMap = [[UniqueIDMap alloc] initWithLen:aBuffSize];
+	return( aNewUniqueIDMap );
+}
+
+-(id)init
+{
+    NSInteger idx;
+    
+	if ((self = [super initWithLen:HASHSIZE]) != nil) {
+		fNext = nil;
+        for( idx = 0; idx < HASHSIZE; idx++ ) {
+            ptrBuffer[idx] = nil;
+        }
+	}
+    return( self );
+}
+
+-(id)initWithLen:(NSInteger)aBuffSize
+{
+	if ((self = [super initWithLen:aBuffSize]) != nil) {
+	}
+    return( self );
+}
+
+-(void)dealloc
+{
+#ifdef DEBUG_DEALLOC
+    NSLog( @"called dealloc in UniqueIDMap" );
+#endif
+    NodeMapElement *tmp, *rtmp;
+    NSInteger idx;
+	
+    if ( self.fNext != nil ) {
+        for( idx = 0; idx < HASHSIZE; idx++ ) {
+            tmp = ptrBuffer[idx];
+            while ( tmp ) {
+                rtmp = tmp;
+                tmp = (NodeMapElement *)tmp.fNext;
+                [rtmp release];
+            }
+        }
+    }
+	[super dealloc];
+}
+
+-(void)deleteUniqueIDMap:(NodeMapElement *)np
+{
+    NodeMapElement *tmp, *rtmp;
+    NSInteger idx;
+    
+    if ( self.fNext != nil ) {
+        for( idx = 0; idx < HASHSIZE; idx++ ) {
+            tmp = ptrBuffer[idx];
+            while ( tmp ) {
+                rtmp = tmp;
+                tmp = tmp.fNext;
+                [rtmp release];
+            }
+        }
+    }
+}
+
+- (void)clear
+{
+    NodeMapElement *tmp, *rtmp;
+    NSInteger idx;
+    
+    for( idx = 0; idx < HASHSIZE; idx++ ) {
+        tmp = ptrBuffer[idx];
+        while ( tmp ) {
+            rtmp = tmp;
+            tmp = [tmp getfNext];
+            [rtmp release];
+        }
+        ptrBuffer[idx] = nil;
+    }
+}
+
+- (NSInteger)count
+{
+    id anElement;
+    NSInteger aCnt = 0;
+    
+    for (int i = 0; i < BuffSize; i++) {
+        if ((anElement = ptrBuffer[i]) != nil) {
+            aCnt += (NSInteger)[anElement count];
+        }
+    }
+    return aCnt;
+}
+
+- (NSInteger)size
+{
+    return BuffSize;
+}
+
+-(void)delete_chain:(NodeMapElement *)np
+{
+    if ( np.fNext != nil )
+		[self delete_chain:np.fNext];
+	[np release];
+}
+
+- (id)getNode:(id<BaseTree>)aNode
+{
+    NodeMapElement *np;
+    NSInteger idx;
+    
+    idx = [(id<BaseTree>)aNode type];
+    np = ptrBuffer[idx];
+    while ( np != nil ) {
+        if (np.node == aNode) {
+            return( np.index );
+        }
+        np = np.fNext;
+    }
+    return( nil );
+}
+
+- (void)putID:(id)anID Node:(id<BaseTree>)aNode
+{
+    NodeMapElement *np, *np1;
+    NSInteger idx;
+    
+    idx = [(id<BaseTree>)aNode type];
+    idx %= HASHSIZE;
+    np = [[NodeMapElement newNodeMapElementWithIndex:anID Node:aNode] retain];
+    np1 = ptrBuffer[idx];
+    np.fNext = np1;
+    ptrBuffer[idx] = np;
+    return;
+}
+
+
+@end
diff --git a/runtime/ObjC/Framework/UnwantedTokenException.h b/runtime/ObjC/Framework/UnwantedTokenException.h
new file mode 100644
index 0000000..202b28c
--- /dev/null
+++ b/runtime/ObjC/Framework/UnwantedTokenException.h
@@ -0,0 +1,47 @@
+//
+//  UnwantedTokenException.h
+//  ANTLR
+//
+//  Created by Alan Condit on 6/8/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import <Foundation/Foundation.h>
+#import "MismatchedTokenException.h"
+
+@interface UnwantedTokenException : MismatchedTokenException {
+
+}
++ (UnwantedTokenException *)newException;
++ (UnwantedTokenException *)newException:(NSInteger)expected Stream:(id<IntStream>)anInput;
+
+- (id) init;
+- (id) initWithStream:(id<IntStream>)anInput And:(NSInteger)expected;
+- (id<Token>)getUnexpectedToken;
+- (NSString *)toString;
+                     
+    
+@end
diff --git a/runtime/ObjC/Framework/UnwantedTokenException.m b/runtime/ObjC/Framework/UnwantedTokenException.m
new file mode 100644
index 0000000..8a9f50d
--- /dev/null
+++ b/runtime/ObjC/Framework/UnwantedTokenException.m
@@ -0,0 +1,80 @@
+//
+//  UnwantedTokenException.m
+//  ANTLR
+//
+//  Created by Alan Condit on 6/8/10.
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+// 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.
+
+#import "UnwantedTokenException.h"
+
+@implementation UnwantedTokenException : MismatchedTokenException
+	/** Used for remote debugger deserialization */
++ (UnwantedTokenException *)newException
+{
+    return [[UnwantedTokenException alloc] init];
+}
+    
++ (UnwantedTokenException *)newException:(NSInteger)expected Stream:(id<IntStream>)anInput
+{
+    return [[UnwantedTokenException alloc] initWithStream:anInput And:expected];
+}
+
+- (id) init
+{
+    self = [super initWithStream:input];
+    if (self) {
+    }
+    return self;
+}
+     
+- (id) initWithStream:(id<IntStream>)anInput And:(NSInteger)expected
+{
+    self = [super initWithStream:anInput];
+    if (self) {
+        expecting = expected;
+    }
+    return self;
+}
+    
+- (id<Token>)getUnexpectedToken
+{
+    return token;
+}
+    
+- (NSString *)toString
+{
+    NSString *exp1 = [NSString stringWithFormat:@", expected %d", expecting];
+    if ( expecting == TokenTypeInvalid ) {
+        exp1 = @"";
+    }
+    if ( token==nil ) {
+        return [NSString stringWithFormat:@"UnwantedTokenException(found=%@)", exp1];
+    }
+    return [NSString stringWithFormat:@"UnwantedTokenException(found=%@ %@", token.text, exp1];
+}
+
+@end
diff --git a/runtime/ObjC/Framework/antlr3.h b/runtime/ObjC/Framework/antlr3.h
index 9c941dc..80bc08b 100644
--- a/runtime/ObjC/Framework/antlr3.h
+++ b/runtime/ObjC/Framework/antlr3.h
@@ -24,91 +24,95 @@
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 // THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+#import <ANTLR/ACNumber.h>
 #import <ANTLR/ACBTree.h>
 #import <ANTLR/AMutableArray.h>
 #import <ANTLR/AMutableDictionary.h>
-#import <ANTLR/ANTLRBaseMapElement.h>
-#import <ANTLR/ANTLRBaseRecognizer.h>
-#import <ANTLR/ANTLRBaseStack.h>
-#import <ANTLR/ANTLRBaseTree.h>
-#import <ANTLR/ANTLRBaseTreeAdaptor.h>
 #import <ANTLR/ANTLRBitSet.h>
-#import <ANTLR/ANTLRBufferedTokenStream.h>
-#import <ANTLR/ANTLRBufferedTreeNodeStream.h>
-#import <ANTLR/ANTLRCharStream.h>
-#import <ANTLR/ANTLRCharStreamState.h>
-#import <ANTLR/ANTLRCommonErrorNode.h>
-#import <ANTLR/ANTLRCommonToken.h>
-#import <ANTLR/ANTLRCommonTokenStream.h>
-#import <ANTLR/ANTLRCommonTree.h>
-#import <ANTLR/ANTLRCommonTreeAdaptor.h>
-#import <ANTLR/ANTLRCommonTreeNodeStream.h>
-#import <ANTLR/ANTLRDFA.h>
-#import <ANTLR/ANTLRDebug.h>
-#import <ANTLR/ANTLRDebugEventProxy.h>
-#import <ANTLR/ANTLRDebugEventListener.h>
-#import <ANTLR/ANTLRDebugParser.h>
-#import <ANTLR/ANTLRDebugTokenStream.h>
-#import <ANTLR/ANTLRDebugTreeAdaptor.h>
-#import <ANTLR/ANTLRDebugTreeNodeStream.h>
-#import <ANTLR/ANTLRDebugTreeParser.h>
-#import <ANTLR/ANTLRDoubleKeyMap.h>
-#import <ANTLR/ANTLREarlyExitException.h>
 #import <ANTLR/ANTLRError.h>
-#import <ANTLR/ANTLRFailedPredicateException.h>
-#import <ANTLR/ANTLRFastQueue.h>
 #import <ANTLR/ANTLRFileStream.h>
-#import <ANTLR/ANTLRHashMap.h>
-#import <ANTLR/ANTLRHashRule.h>
 #import <ANTLR/ANTLRInputStream.h>
-#import <ANTLR/ANTLRIntArray.h>
-#import <ANTLR/ANTLRIntStream.h>
-#import <ANTLR/ANTLRLexer.h>
-#import <ANTLR/ANTLRLexerRuleReturnScope.h>
-#import <ANTLR/ANTLRLinkBase.h>
-#import <ANTLR/ANTLRLookaheadStream.h>
-#import <ANTLR/ANTLRMapElement.h>
-#import <ANTLR/ANTLRMap.h>
-#import <ANTLR/ANTLRMismatchedNotSetException.h>
-#import <ANTLR/ANTLRMismatchedRangeException.h>
-#import <ANTLR/ANTLRMismatchedSetException.h>
-#import <ANTLR/ANTLRMismatchedTokenException.h>
-#import <ANTLR/ANTLRMismatchedTreeNodeException.h>
-#import <ANTLR/ANTLRMissingTokenException.h>
-#import <ANTLR/ANTLRNodeMapElement.h>
-#import <ANTLR/ANTLRNoViableAltException.h>
-#import <ANTLR/ANTLRParser.h>
-#import <ANTLR/ANTLRParserRuleReturnScope.h>
-#import <ANTLR/ANTLRPtrBuffer.h>
 #import <ANTLR/ANTLRReaderStream.h>
-#import <ANTLR/ANTLRRecognitionException.h>
-#import <ANTLR/ANTLRRecognizerSharedState.h>
-#import <ANTLR/ANTLRRewriteRuleElementStream.h>
-#import <ANTLR/ANTLRRewriteRuleNodeStream.h>
-#import <ANTLR/ANTLRRewriteRuleSubtreeStream.h>
-#import <ANTLR/ANTLRRewriteRuleTokenStream.h>
-#import <ANTLR/ANTLRRuleMemo.h>
-#import <ANTLR/ANTLRRuleStack.h>
-#import <ANTLR/ANTLRRuleReturnScope.h>
-#import <ANTLR/ANTLRRuntimeException.h>
-#import <ANTLR/ANTLRStreamEnumerator.h>
 #import <ANTLR/ANTLRStringStream.h>
-#import <ANTLR/ANTLRSymbolStack.h>
-#import <ANTLR/ANTLRToken+DebuggerSupport.h>
-#import <ANTLR/ANTLRToken.h>
-#import <ANTLR/ANTLRTokenRewriteStream.h>
-#import <ANTLR/ANTLRTokenSource.h>
-#import <ANTLR/ANTLRTokenStream.h>
-#import <ANTLR/ANTLRTree.h>
-#import <ANTLR/ANTLRTreeAdaptor.h>
-#import <ANTLR/ANTLRTreeException.h>
-#import <ANTLR/ANTLRTreeIterator.h>
-#import <ANTLR/ANTLRTreeNodeStream.h>
-#import <ANTLR/ANTLRTreeParser.h>
-#import <ANTLR/ANTLRTreeRuleReturnScope.h>
-#import <ANTLR/ANTLRUnbufferedTokenStream.h>
-//#import <ANTLR/ANTLRUnbufferedCommonTreeNodeStream.h>
-//#import <ANTLR/ANTLRUnbufferedCommonTreeNodeStreamState.h>
-#import <ANTLR/ANTLRUniqueIDMap.h>
-#import <ANTLR/ANTLRUnwantedTokenException.h>
 #import <ANTLR/ArrayIterator.h>
+#import <ANTLR/BaseMapElement.h>
+#import <ANTLR/BaseRecognizer.h>
+#import <ANTLR/BaseStack.h>
+#import <ANTLR/BaseTree.h>
+#import <ANTLR/BaseTreeAdaptor.h>
+#import <ANTLR/BufferedTokenStream.h>
+#import <ANTLR/BufferedTreeNodeStream.h>
+#import <ANTLR/CharStream.h>
+#import <ANTLR/CharStreamState.h>
+#import <ANTLR/CommonErrorNode.h>
+#import <ANTLR/CommonToken.h>
+#import <ANTLR/CommonTokenStream.h>
+#import <ANTLR/CommonTree.h>
+#import <ANTLR/CommonTreeAdaptor.h>
+#import <ANTLR/CommonTreeNodeStream.h>
+#import <ANTLR/DFA.h>
+#import <ANTLR/Debug.h>
+#import <ANTLR/DebugEventSocketProxy.h>
+#import <ANTLR/DebugEventListener.h>
+#import <ANTLR/DebugParser.h>
+#import <ANTLR/DebugTokenStream.h>
+#import <ANTLR/DebugTreeAdaptor.h>
+#import <ANTLR/DebugTreeNodeStream.h>
+#import <ANTLR/DebugTreeParser.h>
+#import <ANTLR/DoubleKeyMap.h>
+#import <ANTLR/EarlyExitException.h>
+#import <ANTLR/Entry.h>
+#import <ANTLR/FailedPredicateException.h>
+#import <ANTLR/FastQueue.h>
+#import <ANTLR/HashMap.h>
+#import <ANTLR/HashRule.h>
+#import <ANTLR/IntArray.h>
+#import <ANTLR/IntStream.h>
+#import <ANTLR/Lexer.h>
+#import <ANTLR/LexerRuleReturnScope.h>
+#import <ANTLR/LinkBase.h>
+#import <ANTLR/LinkedHashMap.h>
+#import <ANTLR/LinkedList.h>
+#import <ANTLR/LookaheadStream.h>
+#import <ANTLR/MapElement.h>
+#import <ANTLR/Map.h>
+#import <ANTLR/MismatchedNotSetException.h>
+#import <ANTLR/MismatchedRangeException.h>
+#import <ANTLR/MismatchedSetException.h>
+#import <ANTLR/MismatchedTokenException.h>
+#import <ANTLR/MismatchedTreeNodeException.h>
+#import <ANTLR/MissingTokenException.h>
+#import <ANTLR/NodeMapElement.h>
+#import <ANTLR/NoViableAltException.h>
+#import <ANTLR/Parser.h>
+#import <ANTLR/ParserRuleReturnScope.h>
+#import <ANTLR/PtrBuffer.h>
+#import <ANTLR/RecognitionException.h>
+#import <ANTLR/RecognizerSharedState.h>
+#import <ANTLR/RewriteRuleElementStream.h>
+#import <ANTLR/RewriteRuleNodeStream.h>
+#import <ANTLR/RewriteRuleSubtreeStream.h>
+#import <ANTLR/RewriteRuleTokenStream.h>
+#import <ANTLR/RuleMemo.h>
+#import <ANTLR/RuleStack.h>
+#import <ANTLR/RuleReturnScope.h>
+#import <ANTLR/RuntimeException.h>
+#import <ANTLR/StreamEnumerator.h>
+#import <ANTLR/SymbolStack.h>
+#import <ANTLR/Token+DebuggerSupport.h>
+#import <ANTLR/Token.h>
+#import <ANTLR/TokenRewriteStream.h>
+#import <ANTLR/TokenSource.h>
+#import <ANTLR/TokenStream.h>
+#import <ANTLR/Tree.h>
+#import <ANTLR/TreeAdaptor.h>
+#import <ANTLR/TreeException.h>
+#import <ANTLR/TreeIterator.h>
+#import <ANTLR/TreeNodeStream.h>
+#import <ANTLR/TreeParser.h>
+#import <ANTLR/TreeRuleReturnScope.h>
+#import <ANTLR/UnbufferedTokenStream.h>
+//#import <ANTLR/UnbufferedCommonTreeNodeStream.h>
+//#import <ANTLR/UnbufferedCommonTreeNodeStreamState.h>
+#import <ANTLR/UniqueIDMap.h>
+#import <ANTLR/UnwantedTokenException.h>
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRBaseMapElement.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRBaseMapElement.o
deleted file mode 100644
index c03b784..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRBaseMapElement.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRBaseRecognizer.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRBaseRecognizer.o
deleted file mode 100644
index cc80307..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRBaseRecognizer.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRBaseStack.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRBaseStack.o
deleted file mode 100644
index ad357ae..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRBaseStack.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRBaseTree.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRBaseTree.o
deleted file mode 100644
index fe78152..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRBaseTree.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRBaseTreeAdaptor.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRBaseTreeAdaptor.o
deleted file mode 100644
index 323f2df..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRBaseTreeAdaptor.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRBitSet.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRBitSet.o
deleted file mode 100644
index 9c6d822..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRBitSet.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRBufferedTokenStream.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRBufferedTokenStream.o
deleted file mode 100644
index 1283058..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRBufferedTokenStream.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRBufferedTreeNodeStream.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRBufferedTreeNodeStream.o
deleted file mode 100644
index d09dfa9..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRBufferedTreeNodeStream.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRCharStreamState.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRCharStreamState.o
deleted file mode 100644
index 4880df9..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRCharStreamState.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRCommonErrorNode.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRCommonErrorNode.o
deleted file mode 100644
index 0ed5fc6..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRCommonErrorNode.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRCommonToken.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRCommonToken.o
deleted file mode 100644
index 674805b..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRCommonToken.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRCommonTokenStream.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRCommonTokenStream.o
deleted file mode 100644
index 493eee9..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRCommonTokenStream.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRCommonTree.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRCommonTree.o
deleted file mode 100644
index f9c1630..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRCommonTree.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRCommonTreeAdaptor.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRCommonTreeAdaptor.o
deleted file mode 100644
index 9f47f11..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRCommonTreeAdaptor.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRCommonTreeNodeStream.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRCommonTreeNodeStream.o
deleted file mode 100644
index 716eb02..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRCommonTreeNodeStream.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLREarlyExitException.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLREarlyExitException.o
deleted file mode 100644
index 8f4970d..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLREarlyExitException.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRFailedPredicateException.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRFailedPredicateException.o
deleted file mode 100644
index 1633312..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRFailedPredicateException.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRFastQueue.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRFastQueue.o
deleted file mode 100644
index af58b4f..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRFastQueue.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRHashMap.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRHashMap.o
deleted file mode 100644
index 7cf9eea..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRHashMap.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRHashRule.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRHashRule.o
deleted file mode 100644
index 19618bf..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRHashRule.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRIntArray.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRIntArray.o
deleted file mode 100644
index cf02b84..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRIntArray.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRLexer.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRLexer.o
deleted file mode 100644
index e242a4f..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRLexer.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRLexerRuleReturnScope.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRLexerRuleReturnScope.o
deleted file mode 100644
index aa72475..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRLexerRuleReturnScope.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRLinkBase.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRLinkBase.o
deleted file mode 100644
index bae3968..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRLinkBase.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRLookaheadStream.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRLookaheadStream.o
deleted file mode 100644
index 5b815d6..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRLookaheadStream.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRMap.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRMap.o
deleted file mode 100644
index 0e4a1e8..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRMap.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRMapElement.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRMapElement.o
deleted file mode 100644
index 9ea4761..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRMapElement.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRMismatchedNotSetException.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRMismatchedNotSetException.o
deleted file mode 100644
index 4e5033a..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRMismatchedNotSetException.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRMismatchedRangeException.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRMismatchedRangeException.o
deleted file mode 100644
index 9816a80..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRMismatchedRangeException.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRMismatchedSetException.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRMismatchedSetException.o
deleted file mode 100644
index c649efb..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRMismatchedSetException.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRMismatchedTokenException.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRMismatchedTokenException.o
deleted file mode 100644
index 2639a95..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRMismatchedTokenException.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRMismatchedTreeNodeException.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRMismatchedTreeNodeException.o
deleted file mode 100644
index b29985d..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRMismatchedTreeNodeException.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRMissingTokenException.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRMissingTokenException.o
deleted file mode 100644
index e096cc2..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRMissingTokenException.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRNoViableAltException.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRNoViableAltException.o
deleted file mode 100644
index d5c20d1..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRNoViableAltException.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRNodeMapElement.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRNodeMapElement.o
deleted file mode 100644
index 1b43a3b..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRNodeMapElement.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRParseTree.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRParseTree.o
deleted file mode 100644
index f1eb79e..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRParseTree.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRParser.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRParser.o
deleted file mode 100644
index 21fa14e..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRParser.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRParserRuleReturnScope.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRParserRuleReturnScope.o
deleted file mode 100644
index 89c6559..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRParserRuleReturnScope.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRPtrBuffer.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRPtrBuffer.o
deleted file mode 100644
index 4ed966e..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRPtrBuffer.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRRecognitionException.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRRecognitionException.o
deleted file mode 100644
index 9b32869..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRRecognitionException.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRRecognizerSharedState.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRRecognizerSharedState.o
deleted file mode 100644
index cc5343a..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRRecognizerSharedState.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRRewriteRuleElementStream.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRRewriteRuleElementStream.o
deleted file mode 100644
index c80a790..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRRewriteRuleElementStream.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRRewriteRuleSubtreeStream.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRRewriteRuleSubtreeStream.o
deleted file mode 100644
index 44d2d0c..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRRewriteRuleSubtreeStream.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRRewriteRuleTokenStream.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRRewriteRuleTokenStream.o
deleted file mode 100644
index 49bf099..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRRewriteRuleTokenStream.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRRuleMapElement.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRRuleMapElement.o
deleted file mode 100644
index 8a29d9e..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRRuleMapElement.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRRuleMemo.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRRuleMemo.o
deleted file mode 100644
index 6a40982..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRRuleMemo.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRRuleReturnScope.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRRuleReturnScope.o
deleted file mode 100644
index 38da9bc..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRRuleReturnScope.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRRuleStack.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRRuleStack.o
deleted file mode 100644
index b3a121f..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRRuleStack.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRRuntimeException.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRRuntimeException.o
deleted file mode 100644
index 16d065f..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRRuntimeException.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRStreamEnumerator.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRStreamEnumerator.o
deleted file mode 100644
index 9178e6b..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRStreamEnumerator.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRStringStream.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRStringStream.o
deleted file mode 100644
index 666898d..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRStringStream.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRSymbolStack.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRSymbolStack.o
deleted file mode 100644
index d6588de..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRSymbolStack.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRToken+DebuggerSupport.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRToken+DebuggerSupport.o
deleted file mode 100644
index 8e07fc1..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRToken+DebuggerSupport.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRTokenRewriteStream.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRTokenRewriteStream.o
deleted file mode 100644
index b37d4e4..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRTokenRewriteStream.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRTreeException.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRTreeException.o
deleted file mode 100644
index 9b82ada..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRTreeException.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRTreeIterator.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRTreeIterator.o
deleted file mode 100644
index c8425c8..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRTreeIterator.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRTreeParser.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRTreeParser.o
deleted file mode 100644
index 35d196e..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRTreeParser.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRTreePatternLexer.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRTreePatternLexer.o
deleted file mode 100644
index 30a3c96..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRTreePatternLexer.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRTreePatternParser.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRTreePatternParser.o
deleted file mode 100644
index e5856c3..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRTreePatternParser.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRTreeRewriter.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRTreeRewriter.o
deleted file mode 100644
index f8c5129..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRTreeRewriter.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRTreeRuleReturnScope.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRTreeRuleReturnScope.o
deleted file mode 100644
index 14048bc..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRTreeRuleReturnScope.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRTreeVisitor.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRTreeVisitor.o
deleted file mode 100644
index 3ca88eb..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRTreeVisitor.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRTreeVisitorAction.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRTreeVisitorAction.o
deleted file mode 100644
index 1846b5a..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRTreeVisitorAction.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRTreeWizard.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRTreeWizard.o
deleted file mode 100644
index 189f26e..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRTreeWizard.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRUnbufferedTokenStream.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRUnbufferedTokenStream.o
deleted file mode 100644
index 77d7c65..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRUnbufferedTokenStream.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRUniqueIDMap.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRUniqueIDMap.o
deleted file mode 100644
index b191f3d..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRUniqueIDMap.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRUnwantedTokenException.o b/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRUnwantedTokenException.o
deleted file mode 100644
index 1942134..0000000
--- a/runtime/ObjC/Framework/build/ANTLR.build/Debug/ANTLR.build/Objects-normal/i386/ANTLRUnwantedTokenException.o
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/examples/LL-star/SimpleC.tokens b/runtime/ObjC/Framework/examples/LL-star/SimpleC.tokens
index 635b4e1..1d3555d 100644
--- a/runtime/ObjC/Framework/examples/LL-star/SimpleC.tokens
+++ b/runtime/ObjC/Framework/examples/LL-star/SimpleC.tokens
@@ -1,31 +1,31 @@
-T__20=20
-INT=5
-ID=4
-T__9=9
-T__8=8
 T__7=7
-T__19=19
-WS=6
-T__16=16
-T__15=15
-T__18=18
-T__17=17
-T__12=12
-T__11=11
-T__14=14
-T__13=13
+T__8=8
+T__9=9
 T__10=10
-'char'=12
-'}'=15
-'=='=18
-'{'=14
-'void'=13
-';'=7
-'='=17
-'int'=11
-'<'=19
-'('=8
+T__11=11
+T__12=12
+T__13=13
+T__14=14
+T__15=15
+T__16=16
+T__17=17
+T__18=18
+T__19=19
+T__20=20
+ID=4
+INT=5
+WS=6
+'('=7
+')'=8
+'+'=9
+','=10
+';'=11
+'<'=12
+'='=13
+'=='=14
+'char'=15
 'for'=16
-'+'=20
-','=9
-')'=10
+'int'=17
+'void'=18
+'{'=19
+'}'=20
diff --git a/runtime/ObjC/Framework/examples/LL-star/SimpleCLexer.h b/runtime/ObjC/Framework/examples/LL-star/SimpleCLexer.h
index b640542..832311d 100644
--- a/runtime/ObjC/Framework/examples/LL-star/SimpleCLexer.h
+++ b/runtime/ObjC/Framework/examples/LL-star/SimpleCLexer.h
@@ -1,9 +1,9 @@
-// $ANTLR ${project.version} ${buildNumber} SimpleC.g 2011-05-06 13:53:12
+// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g 2012-02-16 17:39:19
 
 /* =============================================================================
- * Standard antlr3 OBJC runtime definitions
+ * Standard antlr OBJC runtime definitions
  */
-#import <Cocoa/Cocoa.h>
+#import <Foundation/Foundation.h>
 #import <ANTLR/ANTLR.h>
 /* End of standard antlr3 runtime definitions
  * =============================================================================
@@ -11,8 +11,8 @@
 
 /* Start cyclicDFAInterface */
 
-#pragma mark Rule return scopes start
-#pragma mark Rule return scopes end
+#pragma mark Rule return scopes Interface start
+#pragma mark Rule return scopes Interface end
 #pragma mark Tokens
 #ifdef EOF
 #undef EOF
@@ -36,12 +36,12 @@
 #define INT 5
 #define WS 6
 /* interface lexer class */
-@interface SimpleCLexer : ANTLRLexer { // line 283
+@interface SimpleCLexer : Lexer { // line 283
 /* ObjC start of actions.lexer.memVars */
 /* ObjC end of actions.lexer.memVars */
 }
 + (void) initialize;
-+ (SimpleCLexer *)newSimpleCLexerWithCharStream:(id<ANTLRCharStream>)anInput;
++ (SimpleCLexer *)newSimpleCLexerWithCharStream:(id<CharStream>)anInput;
 /* ObjC start actions.lexer.methodsDecl */
 /* ObjC end actions.lexer.methodsDecl */
 - (void) mT__7 ; 
diff --git a/runtime/ObjC/Framework/examples/LL-star/SimpleCLexer.m b/runtime/ObjC/Framework/examples/LL-star/SimpleCLexer.m
index b4e53ae..47a7f5a 100644
--- a/runtime/ObjC/Framework/examples/LL-star/SimpleCLexer.m
+++ b/runtime/ObjC/Framework/examples/LL-star/SimpleCLexer.m
@@ -1,8 +1,8 @@
 /** \file
- *  This OBJC source file was generated by $ANTLR version ${project.version} ${buildNumber}
+ *  This OBJC source file was generated by $ANTLR version 3.4
  *
- *     -  From the grammar source file : SimpleC.g
- *     -                            On : 2011-05-06 13:53:12
+ *     -  From the grammar source file : /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g
+ *     -                            On : 2012-02-16 17:39:19
  *     -                 for the lexer : SimpleCLexerLexer
  *
  * Editing it, at least manually, is not wise.
@@ -11,7 +11,7 @@
  *
  *
 */
-// $ANTLR ${project.version} ${buildNumber} SimpleC.g 2011-05-06 13:53:12
+// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g 2012-02-16 17:39:19
 
 
 /* -----------------------------------------
@@ -31,7 +31,7 @@
 
 + (void) initialize
 {
-    [ANTLRBaseRecognizer setGrammarFileName:@"SimpleC.g"];
+    [BaseRecognizer setGrammarFileName:@"/Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g"];
 }
 
 + (NSString *) tokenNameForType:(NSInteger)aTokenType
@@ -39,14 +39,14 @@
     return [[self getTokenNames] objectAtIndex:aTokenType];
 }
 
-+ (SimpleCLexer *)newSimpleCLexerWithCharStream:(id<ANTLRCharStream>)anInput
++ (SimpleCLexer *)newSimpleCLexerWithCharStream:(id<CharStream>)anInput
 {
     return [[SimpleCLexer alloc] initWithCharStream:anInput];
 }
 
-- (id) initWithCharStream:(id<ANTLRCharStream>)anInput
+- (id) initWithCharStream:(id<CharStream>)anInput
 {
-    self = [super initWithCharStream:anInput State:[[ANTLRRecognizerSharedState newANTLRRecognizerSharedStateWithRuleLen:18+1] retain]];
+    self = [super initWithCharStream:anInput State:[RecognizerSharedState newRecognizerSharedStateWithRuleLen:18+1]];
     if ( self != nil ) {
     }
     return self;
@@ -67,490 +67,507 @@
 - (void) mT__7
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = T__7;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // SimpleC.g:7:6: ( '(' ) // ruleBlockSingleAlt
-        // SimpleC.g:7:8: '(' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:7:6: ( '(' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:7:8: '(' // alt
         {
+
+
         [self matchChar:'(']; 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "T__7" */
-
 // $ANTLR start "T__8"
 - (void) mT__8
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = T__8;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // SimpleC.g:8:6: ( ')' ) // ruleBlockSingleAlt
-        // SimpleC.g:8:8: ')' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:8:6: ( ')' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:8:8: ')' // alt
         {
+
+
         [self matchChar:')']; 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "T__8" */
-
 // $ANTLR start "T__9"
 - (void) mT__9
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = T__9;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // SimpleC.g:9:6: ( '+' ) // ruleBlockSingleAlt
-        // SimpleC.g:9:8: '+' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:9:6: ( '+' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:9:8: '+' // alt
         {
+
+
         [self matchChar:'+']; 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "T__9" */
-
 // $ANTLR start "T__10"
 - (void) mT__10
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = T__10;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // SimpleC.g:10:7: ( ',' ) // ruleBlockSingleAlt
-        // SimpleC.g:10:9: ',' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:10:7: ( ',' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:10:9: ',' // alt
         {
+
+
         [self matchChar:',']; 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "T__10" */
-
 // $ANTLR start "T__11"
 - (void) mT__11
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = T__11;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // SimpleC.g:11:7: ( ';' ) // ruleBlockSingleAlt
-        // SimpleC.g:11:9: ';' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:11:7: ( ';' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:11:9: ';' // alt
         {
+
+
         [self matchChar:';']; 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "T__11" */
-
 // $ANTLR start "T__12"
 - (void) mT__12
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = T__12;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // SimpleC.g:12:7: ( '<' ) // ruleBlockSingleAlt
-        // SimpleC.g:12:9: '<' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:12:7: ( '<' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:12:9: '<' // alt
         {
+
+
         [self matchChar:'<']; 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "T__12" */
-
 // $ANTLR start "T__13"
 - (void) mT__13
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = T__13;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // SimpleC.g:13:7: ( '=' ) // ruleBlockSingleAlt
-        // SimpleC.g:13:9: '=' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:13:7: ( '=' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:13:9: '=' // alt
         {
+
+
         [self matchChar:'=']; 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "T__13" */
-
 // $ANTLR start "T__14"
 - (void) mT__14
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = T__14;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // SimpleC.g:14:7: ( '==' ) // ruleBlockSingleAlt
-        // SimpleC.g:14:9: '==' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:14:7: ( '==' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:14:9: '==' // alt
         {
+
+
         [self matchString:@"=="]; 
 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "T__14" */
-
 // $ANTLR start "T__15"
 - (void) mT__15
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = T__15;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // SimpleC.g:15:7: ( 'char' ) // ruleBlockSingleAlt
-        // SimpleC.g:15:9: 'char' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:15:7: ( 'char' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:15:9: 'char' // alt
         {
+
+
         [self matchString:@"char"]; 
 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "T__15" */
-
 // $ANTLR start "T__16"
 - (void) mT__16
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = T__16;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // SimpleC.g:16:7: ( 'for' ) // ruleBlockSingleAlt
-        // SimpleC.g:16:9: 'for' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:16:7: ( 'for' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:16:9: 'for' // alt
         {
+
+
         [self matchString:@"for"]; 
 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "T__16" */
-
 // $ANTLR start "T__17"
 - (void) mT__17
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = T__17;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // SimpleC.g:17:7: ( 'int' ) // ruleBlockSingleAlt
-        // SimpleC.g:17:9: 'int' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:17:7: ( 'int' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:17:9: 'int' // alt
         {
+
+
         [self matchString:@"int"]; 
 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "T__17" */
-
 // $ANTLR start "T__18"
 - (void) mT__18
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = T__18;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // SimpleC.g:18:7: ( 'void' ) // ruleBlockSingleAlt
-        // SimpleC.g:18:9: 'void' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:18:7: ( 'void' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:18:9: 'void' // alt
         {
+
+
         [self matchString:@"void"]; 
 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "T__18" */
-
 // $ANTLR start "T__19"
 - (void) mT__19
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = T__19;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // SimpleC.g:19:7: ( '{' ) // ruleBlockSingleAlt
-        // SimpleC.g:19:9: '{' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:19:7: ( '{' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:19:9: '{' // alt
         {
+
+
         [self matchChar:'{']; 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "T__19" */
-
 // $ANTLR start "T__20"
 - (void) mT__20
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = T__20;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // SimpleC.g:20:7: ( '}' ) // ruleBlockSingleAlt
-        // SimpleC.g:20:9: '}' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:20:7: ( '}' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:20:9: '}' // alt
         {
+
+
         [self matchChar:'}']; 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "T__20" */
-
 // $ANTLR start "ID"
 - (void) mID
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = ID;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // SimpleC.g:94:5: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' )* ) // ruleBlockSingleAlt
-        // SimpleC.g:94:9: ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' )* // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:94:5: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' )* ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:94:9: ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' )* // alt
         {
+
         if ((([input LA:1] >= 'A') && ([input LA:1] <= 'Z'))||[input LA:1] == '_'||(([input LA:1] >= 'a') && ([input LA:1] <= 'z'))) {
             [input consume];
         } else {
-            ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException newException:nil stream:input];
+            MismatchedSetException *mse = [MismatchedSetException newException:nil stream:input];
             [self recover:mse];
             @throw mse;
         }
 
+         
 
         do {
             NSInteger alt1=2;
@@ -562,17 +579,18 @@
 
             switch (alt1) {
                 case 1 : ;
-                    // SimpleC.g: // alt
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g: // alt
                     {
+
                     if ((([input LA:1] >= '0') && ([input LA:1] <= '9'))||(([input LA:1] >= 'A') && ([input LA:1] <= 'Z'))||[input LA:1] == '_'||(([input LA:1] >= 'a') && ([input LA:1] <= 'z'))) {
                         [input consume];
                     } else {
-                        ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException newException:nil stream:input];
+                        MismatchedSetException *mse = [MismatchedSetException newException:nil stream:input];
                         [self recover:mse];
                         @throw mse;
                     }
 
-
+                     
                     }
                     break;
 
@@ -582,38 +600,38 @@
         } while (YES);
         loop1: ;
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "ID" */
-
 // $ANTLR start "INT"
 - (void) mINT
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = INT;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // SimpleC.g:97:5: ( ( '0' .. '9' )+ ) // ruleBlockSingleAlt
-        // SimpleC.g:97:7: ( '0' .. '9' )+ // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:97:5: ( ( '0' .. '9' )+ ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:97:7: ( '0' .. '9' )+ // alt
         {
-        // SimpleC.g:97:7: ( '0' .. '9' )+ // positiveClosureBlock
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:97:7: ( '0' .. '9' )+ // positiveClosureBlock
         NSInteger cnt2 = 0;
         do {
             NSInteger alt2 = 2;
@@ -625,63 +643,64 @@
 
             switch (alt2) {
                 case 1 : ;
-                    // SimpleC.g: // alt
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g: // alt
                     {
+
                     if ((([input LA:1] >= '0') && ([input LA:1] <= '9'))) {
                         [input consume];
                     } else {
-                        ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException newException:nil stream:input];
+                        MismatchedSetException *mse = [MismatchedSetException newException:nil stream:input];
                         [self recover:mse];
                         @throw mse;
                     }
 
-
+                     
                     }
                     break;
 
                 default :
                     if ( cnt2 >= 1 )
                         goto loop2;
-                    ANTLREarlyExitException *eee =
-                        [ANTLREarlyExitException newException:input decisionNumber:2];
+                    EarlyExitException *eee =
+                        [EarlyExitException newException:input decisionNumber:2];
                     @throw eee;
             }
             cnt2++;
         } while (YES);
         loop2: ;
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "INT" */
-
 // $ANTLR start "WS"
 - (void) mWS
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = WS;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // SimpleC.g:100:5: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ ) // ruleBlockSingleAlt
-        // SimpleC.g:100:9: ( ' ' | '\\t' | '\\r' | '\\n' )+ // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:100:5: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:100:9: ( ' ' | '\\t' | '\\r' | '\\n' )+ // alt
         {
-        // SimpleC.g:100:9: ( ' ' | '\\t' | '\\r' | '\\n' )+ // positiveClosureBlock
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:100:9: ( ' ' | '\\t' | '\\r' | '\\n' )+ // positiveClosureBlock
         NSInteger cnt3 = 0;
         do {
             NSInteger alt3 = 2;
@@ -693,55 +712,55 @@
 
             switch (alt3) {
                 case 1 : ;
-                    // SimpleC.g: // alt
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g: // alt
                     {
+
                     if ((([input LA:1] >= '\t') && ([input LA:1] <= '\n'))||[input LA:1] == '\r'||[input LA:1] == ' ') {
                         [input consume];
                     } else {
-                        ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException newException:nil stream:input];
+                        MismatchedSetException *mse = [MismatchedSetException newException:nil stream:input];
                         [self recover:mse];
                         @throw mse;
                     }
 
-
+                     
                     }
                     break;
 
                 default :
                     if ( cnt3 >= 1 )
                         goto loop3;
-                    ANTLREarlyExitException *eee =
-                        [ANTLREarlyExitException newException:input decisionNumber:3];
+                    EarlyExitException *eee =
+                        [EarlyExitException newException:input decisionNumber:3];
                     @throw eee;
             }
             cnt3++;
         } while (YES);
         loop3: ;
 
+         
 
          _channel=HIDDEN; 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "WS" */
-
 - (void) mTokens
 {
-    // SimpleC.g:1:8: ( T__7 | T__8 | T__9 | T__10 | T__11 | T__12 | T__13 | T__14 | T__15 | T__16 | T__17 | T__18 | T__19 | T__20 | ID | INT | WS ) //ruleblock
+    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:1:8: ( T__7 | T__8 | T__9 | T__10 | T__11 | T__12 | T__13 | T__14 | T__15 | T__16 | T__17 | T__18 | T__19 | T__20 | ID | INT | WS ) //ruleblock
     NSInteger alt4=17;
     unichar charLA4 = [input LA:1];
     switch (charLA4) {
@@ -992,7 +1011,7 @@
             break;
 
     default: ;
-        ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newException:4 state:0 stream:input];
+        NoViableAltException *nvae = [NoViableAltException newException:4 state:0 stream:input];
         nvae.c = charLA4;
         @throw nvae;
 
@@ -1000,156 +1019,190 @@
 
     switch (alt4) {
         case 1 : ;
-            // SimpleC.g:1:10: T__7 // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:1:10: T__7 // alt
             {
+
+
             [self mT__7]; 
 
 
-
+             
             }
             break;
         case 2 : ;
-            // SimpleC.g:1:15: T__8 // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:1:15: T__8 // alt
             {
+
+
             [self mT__8]; 
 
 
-
+             
             }
             break;
         case 3 : ;
-            // SimpleC.g:1:20: T__9 // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:1:20: T__9 // alt
             {
+
+
             [self mT__9]; 
 
 
-
+             
             }
             break;
         case 4 : ;
-            // SimpleC.g:1:25: T__10 // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:1:25: T__10 // alt
             {
+
+
             [self mT__10]; 
 
 
-
+             
             }
             break;
         case 5 : ;
-            // SimpleC.g:1:31: T__11 // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:1:31: T__11 // alt
             {
+
+
             [self mT__11]; 
 
 
-
+             
             }
             break;
         case 6 : ;
-            // SimpleC.g:1:37: T__12 // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:1:37: T__12 // alt
             {
+
+
             [self mT__12]; 
 
 
-
+             
             }
             break;
         case 7 : ;
-            // SimpleC.g:1:43: T__13 // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:1:43: T__13 // alt
             {
+
+
             [self mT__13]; 
 
 
-
+             
             }
             break;
         case 8 : ;
-            // SimpleC.g:1:49: T__14 // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:1:49: T__14 // alt
             {
+
+
             [self mT__14]; 
 
 
-
+             
             }
             break;
         case 9 : ;
-            // SimpleC.g:1:55: T__15 // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:1:55: T__15 // alt
             {
+
+
             [self mT__15]; 
 
 
-
+             
             }
             break;
         case 10 : ;
-            // SimpleC.g:1:61: T__16 // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:1:61: T__16 // alt
             {
+
+
             [self mT__16]; 
 
 
-
+             
             }
             break;
         case 11 : ;
-            // SimpleC.g:1:67: T__17 // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:1:67: T__17 // alt
             {
+
+
             [self mT__17]; 
 
 
-
+             
             }
             break;
         case 12 : ;
-            // SimpleC.g:1:73: T__18 // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:1:73: T__18 // alt
             {
+
+
             [self mT__18]; 
 
 
-
+             
             }
             break;
         case 13 : ;
-            // SimpleC.g:1:79: T__19 // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:1:79: T__19 // alt
             {
+
+
             [self mT__19]; 
 
 
-
+             
             }
             break;
         case 14 : ;
-            // SimpleC.g:1:85: T__20 // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:1:85: T__20 // alt
             {
+
+
             [self mT__20]; 
 
 
-
+             
             }
             break;
         case 15 : ;
-            // SimpleC.g:1:91: ID // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:1:91: ID // alt
             {
+
+
             [self mID]; 
 
 
-
+             
             }
             break;
         case 16 : ;
-            // SimpleC.g:1:94: INT // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:1:94: INT // alt
             {
+
+
             [self mINT]; 
 
 
-
+             
             }
             break;
         case 17 : ;
-            // SimpleC.g:1:98: WS // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:1:98: WS // alt
             {
+
+
             [self mWS]; 
 
 
-
+             
             }
             break;
 
diff --git a/runtime/ObjC/Framework/examples/LL-star/SimpleCParser.h b/runtime/ObjC/Framework/examples/LL-star/SimpleCParser.h
index 6e3b2af..108113c 100644
--- a/runtime/ObjC/Framework/examples/LL-star/SimpleCParser.h
+++ b/runtime/ObjC/Framework/examples/LL-star/SimpleCParser.h
@@ -1,9 +1,9 @@
-// $ANTLR ${project.version} ${buildNumber} SimpleC.g 2011-05-06 13:53:12
+// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g 2012-02-16 17:39:18
 
 /* =============================================================================
- * Standard antlr3 OBJC runtime definitions
+ * Standard antlr OBJC runtime definitions
  */
-#import <Cocoa/Cocoa.h>
+#import <Foundation/Foundation.h>
 #import <ANTLR/ANTLR.h>
 /* End of standard antlr3 runtime definitions
  * =============================================================================
@@ -23,10 +23,10 @@
 #endif
 
 #pragma mark Cyclic DFA interface start DFA2
-@interface DFA2 : ANTLRDFA {
+@interface DFA2 : DFA {
 }
-+ newDFA2WithRecognizer:(ANTLRBaseRecognizer *)theRecognizer;
-- initWithRecognizer:(ANTLRBaseRecognizer *)recognizer;
++ (DFA2 *) newDFA2WithRecognizer:(BaseRecognizer *)theRecognizer;
+- initWithRecognizer:(BaseRecognizer *)recognizer;
 @end /* end of DFA2 interface  */
 
 #pragma mark Cyclic DFA interface end DFA2
@@ -53,20 +53,16 @@
 #define ID 4
 #define INT 5
 #define WS 6
-#pragma mark Dynamic Global Scopes
-#pragma mark Dynamic Rule Scopes
-#pragma mark Rule Return Scopes start
+#pragma mark Dynamic Global Scopes globalAttributeScopeInterface
+#pragma mark Dynamic Rule Scopes ruleAttributeScopeInterface
+#pragma mark Rule Return Scopes returnScopeInterface
 
 /* Interface grammar class */
-@interface SimpleCParser : ANTLRParser { /* line 572 */
-/* ObjC start of ruleAttributeScopeMemVar */
+@interface SimpleCParser  : Parser { /* line 572 */
+#pragma mark Dynamic Rule Scopes ruleAttributeScopeDecl
+#pragma mark Dynamic Global Rule Scopes globalAttributeScopeMemVar
 
 
-/* ObjC end of ruleAttributeScopeMemVar */
-/* ObjC start of globalAttributeScopeMemVar */
-
-
-/* ObjC end of globalAttributeScopeMemVar */
 /* ObjC start of actions.(actionScope).memVars */
 /* ObjC end of actions.(actionScope).memVars */
 /* ObjC start of memVars */
@@ -81,7 +77,7 @@
 /* ObjC end of properties */
 
 + (void) initialize;
-+ (id) newSimpleCParser:(id<ANTLRTokenStream>)aStream;
++ (id) newSimpleCParser:(id<TokenStream>)aStream;
 /* ObjC start of actions.(actionScope).methodsDecl */
 /* ObjC end of actions.(actionScope).methodsDecl */
 
diff --git a/runtime/ObjC/Framework/examples/LL-star/SimpleCParser.m b/runtime/ObjC/Framework/examples/LL-star/SimpleCParser.m
index e65a149..da605a8 100644
--- a/runtime/ObjC/Framework/examples/LL-star/SimpleCParser.m
+++ b/runtime/ObjC/Framework/examples/LL-star/SimpleCParser.m
@@ -1,8 +1,8 @@
 /** \file
- *  This OBJC source file was generated by $ANTLR version ${project.version} ${buildNumber}
+ *  This OBJC source file was generated by $ANTLR version 3.4
  *
- *     -  From the grammar source file : SimpleC.g
- *     -                            On : 2011-05-06 13:53:12
+ *     -  From the grammar source file : /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g
+ *     -                            On : 2012-02-16 17:39:18
  *     -                for the parser : SimpleCParserParser
  *
  * Editing it, at least manually, is not wise.
@@ -11,7 +11,7 @@
  *
  *
 */
-// $ANTLR ${project.version} ${buildNumber} SimpleC.g 2011-05-06 13:53:12
+// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g 2012-02-16 17:39:18
 
 
 /* -----------------------------------------
@@ -26,41 +26,76 @@
  * Start of recognizer
  */
 #pragma mark Cyclic DFA implementation start DFA2
+
 @implementation DFA2
 const static NSInteger dfa2_eot[13] =
     {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
 const static NSInteger dfa2_eof[13] =
     {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
 const static unichar dfa2_min[13] =
-    {4,4,7,4,0,4,11,8,0,0,4,4,8};
+    {4,4,7,4,-1,4,11,8,-1,-1,4,4,8};
 const static unichar dfa2_max[13] =
-    {18,4,11,18,0,4,19,10,0,0,18,4,10};
+    {18,4,11,18,-1,4,19,10,-1,-1,18,4,10};
 const static NSInteger dfa2_accept[13] =
     {-1,-1,-1,-1,1,-1,-1,-1,2,3,-1,-1,-1};
 const static NSInteger dfa2_special[13] =
     {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
-const static NSInteger dfa2_transition[] = {};
-const static NSInteger dfa2_transition0[] = {3, -1, -1, -1, 4};
-const static NSInteger dfa2_transition1[] = {6, -1, 10};
-const static NSInteger dfa2_transition2[] = {8, -1, -1, -1, -1, -1, -1, 
- -1, 9};
-const static NSInteger dfa2_transition3[] = {2};
-const static NSInteger dfa2_transition4[] = {1, -1, -1, -1, -1, -1, -1, 
- -1, -1, -1, -1, 1, -1, 1, 1};
-const static NSInteger dfa2_transition5[] = {7};
-const static NSInteger dfa2_transition6[] = {11, -1, -1, -1, -1, -1, -1, 
- -1, -1, -1, -1, 11, -1, 11, 11};
-const static NSInteger dfa2_transition7[] = {12};
-const static NSInteger dfa2_transition8[] = {5, -1, -1, -1, 6, -1, -1, -1, 
- -1, -1, -1, 5, -1, 5, 5};
+
+/** Used when there is no transition table entry for a particular state */
+#define dfa2_T_empty	    nil
+
+const static NSInteger dfa2_T0[] =
+{
+     3, -1, -1, -1, 4
+};
+const static NSInteger dfa2_T1[] =
+{
+     6, -1, 10
+};
+const static NSInteger dfa2_T2[] =
+{
+     8, -1, -1, -1, -1, -1, -1, -1, 9
+};
+const static NSInteger dfa2_T3[] =
+{
+     2
+};
+const static NSInteger dfa2_T4[] =
+{
+     1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, 1, 1
+};
+const static NSInteger dfa2_T5[] =
+{
+     7
+};
+const static NSInteger dfa2_T6[] =
+{
+     11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 11, -1, 11, 11
+};
+const static NSInteger dfa2_T7[] =
+{
+     12
+};
+const static NSInteger dfa2_T8[] =
+{
+     5, -1, -1, -1, 6, -1, -1, -1, -1, -1, -1, 5, -1, 5, 5
+};
 
 
-+ (id) newDFA2WithRecognizer:(ANTLRBaseRecognizer *)aRecognizer
+const static NSInteger *dfa2_transition[] =
+{
+    dfa2_T4, dfa2_T3, dfa2_T0, dfa2_T8, nil, dfa2_T5, dfa2_T2, dfa2_T1, 
+    nil, nil, dfa2_T6, dfa2_T7, dfa2_T1
+};
+
+//const static NSInteger dfa2_transition[] = {};
+
++ (DFA2 *) newDFA2WithRecognizer:(BaseRecognizer *)aRecognizer
 {
     return [[[DFA2 alloc] initWithRecognizer:aRecognizer] retain];
 }
 
-- (id) initWithRecognizer:(ANTLRBaseRecognizer *) theRecognizer
+- (id) initWithRecognizer:(BaseRecognizer *) theRecognizer
 {
     self = [super initWithRecognizer:theRecognizer];
     if ( self != nil ) {
@@ -71,6 +106,8 @@
         max = dfa2_max;
         accept = dfa2_accept;
         special = dfa2_special;
+        transition = dfa2_transition;
+/*
         if (!(transition = calloc(13, sizeof(void*)))) {
             [self release];
             return nil;
@@ -89,6 +126,7 @@
         transition[7] = dfa2_transition6;
         transition[8] = dfa2_transition7;
         transition[9] = dfa2_transition1;
+ */
     }
     return self;
 }
@@ -222,106 +260,96 @@
 static const unsigned long long FOLLOW_8_in_atom579_data[] = { 0x0000000000000002LL};
 
 
-#pragma mark Dynamic Global Scopes
+#pragma mark Dynamic Global globalAttributeScopeImplementation
 
-#pragma mark Dynamic Rule Scopes
+#pragma mark Dynamic Rule Scopes ruleAttributeScopeImplementation
 
-#pragma mark Rule Return Scopes start
-//#pragma mark Rule return scopes start
-//
-
-#pragma mark Rule return scopes start
+#pragma mark Rule Return Scopes returnScopeImplementation
 
 @implementation SimpleCParser  // line 637
 
 /* ObjC start of ruleAttributeScope */
-#pragma mark Dynamic Rule Scopes
+#pragma mark Dynamic Rule Scopes ruleAttributeScope
 /* ObjC end of ruleAttributeScope */
-#pragma mark global Attribute Scopes
+#pragma mark global Attribute Scopes globalAttributeScope
 /* ObjC start globalAttributeScope */
 /* ObjC end globalAttributeScope */
 /* ObjC start actions.(actionScope).synthesize */
-/* ObjC end actions.(actionScope).synthesize */
 /* ObjC start synthesize() */
-/* ObjC end synthesize() */
 
 + (void) initialize
 {
     #pragma mark Bitsets
-    FOLLOW_declaration_in_program28 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_declaration_in_program28_data Count:(NSUInteger)1] retain];
-    FOLLOW_variable_in_declaration50 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_variable_in_declaration50_data Count:(NSUInteger)1] retain];
-    FOLLOW_functionHeader_in_declaration60 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_functionHeader_in_declaration60_data Count:(NSUInteger)1] retain];
-    FOLLOW_11_in_declaration62 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_11_in_declaration62_data Count:(NSUInteger)1] retain];
-    FOLLOW_functionHeader_in_declaration75 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_functionHeader_in_declaration75_data Count:(NSUInteger)1] retain];
-    FOLLOW_block_in_declaration77 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_block_in_declaration77_data Count:(NSUInteger)1] retain];
-    FOLLOW_type_in_variable99 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_type_in_variable99_data Count:(NSUInteger)1] retain];
-    FOLLOW_declarator_in_variable101 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_declarator_in_variable101_data Count:(NSUInteger)1] retain];
-    FOLLOW_11_in_variable103 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_11_in_variable103_data Count:(NSUInteger)1] retain];
-    FOLLOW_ID_in_declarator122 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_ID_in_declarator122_data Count:(NSUInteger)1] retain];
-    FOLLOW_type_in_functionHeader151 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_type_in_functionHeader151_data Count:(NSUInteger)1] retain];
-    FOLLOW_ID_in_functionHeader153 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_ID_in_functionHeader153_data Count:(NSUInteger)1] retain];
-    FOLLOW_7_in_functionHeader155 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_7_in_functionHeader155_data Count:(NSUInteger)1] retain];
-    FOLLOW_formalParameter_in_functionHeader159 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_formalParameter_in_functionHeader159_data Count:(NSUInteger)1] retain];
-    FOLLOW_10_in_functionHeader163 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_10_in_functionHeader163_data Count:(NSUInteger)1] retain];
-    FOLLOW_formalParameter_in_functionHeader165 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_formalParameter_in_functionHeader165_data Count:(NSUInteger)1] retain];
-    FOLLOW_8_in_functionHeader173 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_8_in_functionHeader173_data Count:(NSUInteger)1] retain];
-    FOLLOW_type_in_formalParameter195 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_type_in_formalParameter195_data Count:(NSUInteger)1] retain];
-    FOLLOW_declarator_in_formalParameter197 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_declarator_in_formalParameter197_data Count:(NSUInteger)1] retain];
-    FOLLOW_19_in_block286 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_19_in_block286_data Count:(NSUInteger)1] retain];
-    FOLLOW_variable_in_block300 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_variable_in_block300_data Count:(NSUInteger)1] retain];
-    FOLLOW_stat_in_block315 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_stat_in_block315_data Count:(NSUInteger)1] retain];
-    FOLLOW_20_in_block326 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_20_in_block326_data Count:(NSUInteger)1] retain];
-    FOLLOW_forStat_in_stat338 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_forStat_in_stat338_data Count:(NSUInteger)1] retain];
-    FOLLOW_expr_in_stat346 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_stat346_data Count:(NSUInteger)1] retain];
-    FOLLOW_11_in_stat348 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_11_in_stat348_data Count:(NSUInteger)1] retain];
-    FOLLOW_block_in_stat362 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_block_in_stat362_data Count:(NSUInteger)1] retain];
-    FOLLOW_assignStat_in_stat370 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_assignStat_in_stat370_data Count:(NSUInteger)1] retain];
-    FOLLOW_11_in_stat372 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_11_in_stat372_data Count:(NSUInteger)1] retain];
-    FOLLOW_11_in_stat380 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_11_in_stat380_data Count:(NSUInteger)1] retain];
-    FOLLOW_16_in_forStat399 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_16_in_forStat399_data Count:(NSUInteger)1] retain];
-    FOLLOW_7_in_forStat401 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_7_in_forStat401_data Count:(NSUInteger)1] retain];
-    FOLLOW_assignStat_in_forStat403 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_assignStat_in_forStat403_data Count:(NSUInteger)1] retain];
-    FOLLOW_11_in_forStat405 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_11_in_forStat405_data Count:(NSUInteger)1] retain];
-    FOLLOW_expr_in_forStat407 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_forStat407_data Count:(NSUInteger)1] retain];
-    FOLLOW_11_in_forStat409 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_11_in_forStat409_data Count:(NSUInteger)1] retain];
-    FOLLOW_assignStat_in_forStat411 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_assignStat_in_forStat411_data Count:(NSUInteger)1] retain];
-    FOLLOW_8_in_forStat413 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_8_in_forStat413_data Count:(NSUInteger)1] retain];
-    FOLLOW_block_in_forStat415 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_block_in_forStat415_data Count:(NSUInteger)1] retain];
-    FOLLOW_ID_in_assignStat442 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_ID_in_assignStat442_data Count:(NSUInteger)1] retain];
-    FOLLOW_13_in_assignStat444 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_13_in_assignStat444_data Count:(NSUInteger)1] retain];
-    FOLLOW_expr_in_assignStat446 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_assignStat446_data Count:(NSUInteger)1] retain];
-    FOLLOW_condExpr_in_expr468 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_condExpr_in_expr468_data Count:(NSUInteger)1] retain];
-    FOLLOW_aexpr_in_condExpr487 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_aexpr_in_condExpr487_data Count:(NSUInteger)1] retain];
-    FOLLOW_set_in_condExpr491 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_set_in_condExpr491_data Count:(NSUInteger)1] retain];
-    FOLLOW_aexpr_in_condExpr499 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_aexpr_in_condExpr499_data Count:(NSUInteger)1] retain];
-    FOLLOW_atom_in_aexpr521 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_atom_in_aexpr521_data Count:(NSUInteger)1] retain];
-    FOLLOW_9_in_aexpr525 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_9_in_aexpr525_data Count:(NSUInteger)1] retain];
-    FOLLOW_atom_in_aexpr527 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_atom_in_aexpr527_data Count:(NSUInteger)1] retain];
-    FOLLOW_ID_in_atom547 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_ID_in_atom547_data Count:(NSUInteger)1] retain];
-    FOLLOW_INT_in_atom561 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_INT_in_atom561_data Count:(NSUInteger)1] retain];
-    FOLLOW_7_in_atom575 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_7_in_atom575_data Count:(NSUInteger)1] retain];
-    FOLLOW_expr_in_atom577 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_atom577_data Count:(NSUInteger)1] retain];
-    FOLLOW_8_in_atom579 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_8_in_atom579_data Count:(NSUInteger)1] retain];
+    FOLLOW_declaration_in_program28 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_declaration_in_program28_data Count:(NSUInteger)1] retain];
+    FOLLOW_variable_in_declaration50 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_variable_in_declaration50_data Count:(NSUInteger)1] retain];
+    FOLLOW_functionHeader_in_declaration60 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_functionHeader_in_declaration60_data Count:(NSUInteger)1] retain];
+    FOLLOW_11_in_declaration62 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_11_in_declaration62_data Count:(NSUInteger)1] retain];
+    FOLLOW_functionHeader_in_declaration75 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_functionHeader_in_declaration75_data Count:(NSUInteger)1] retain];
+    FOLLOW_block_in_declaration77 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_block_in_declaration77_data Count:(NSUInteger)1] retain];
+    FOLLOW_type_in_variable99 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_type_in_variable99_data Count:(NSUInteger)1] retain];
+    FOLLOW_declarator_in_variable101 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_declarator_in_variable101_data Count:(NSUInteger)1] retain];
+    FOLLOW_11_in_variable103 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_11_in_variable103_data Count:(NSUInteger)1] retain];
+    FOLLOW_ID_in_declarator122 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_ID_in_declarator122_data Count:(NSUInteger)1] retain];
+    FOLLOW_type_in_functionHeader151 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_type_in_functionHeader151_data Count:(NSUInteger)1] retain];
+    FOLLOW_ID_in_functionHeader153 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_ID_in_functionHeader153_data Count:(NSUInteger)1] retain];
+    FOLLOW_7_in_functionHeader155 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_7_in_functionHeader155_data Count:(NSUInteger)1] retain];
+    FOLLOW_formalParameter_in_functionHeader159 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_formalParameter_in_functionHeader159_data Count:(NSUInteger)1] retain];
+    FOLLOW_10_in_functionHeader163 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_10_in_functionHeader163_data Count:(NSUInteger)1] retain];
+    FOLLOW_formalParameter_in_functionHeader165 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_formalParameter_in_functionHeader165_data Count:(NSUInteger)1] retain];
+    FOLLOW_8_in_functionHeader173 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_8_in_functionHeader173_data Count:(NSUInteger)1] retain];
+    FOLLOW_type_in_formalParameter195 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_type_in_formalParameter195_data Count:(NSUInteger)1] retain];
+    FOLLOW_declarator_in_formalParameter197 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_declarator_in_formalParameter197_data Count:(NSUInteger)1] retain];
+    FOLLOW_19_in_block286 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_19_in_block286_data Count:(NSUInteger)1] retain];
+    FOLLOW_variable_in_block300 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_variable_in_block300_data Count:(NSUInteger)1] retain];
+    FOLLOW_stat_in_block315 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_stat_in_block315_data Count:(NSUInteger)1] retain];
+    FOLLOW_20_in_block326 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_20_in_block326_data Count:(NSUInteger)1] retain];
+    FOLLOW_forStat_in_stat338 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_forStat_in_stat338_data Count:(NSUInteger)1] retain];
+    FOLLOW_expr_in_stat346 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_stat346_data Count:(NSUInteger)1] retain];
+    FOLLOW_11_in_stat348 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_11_in_stat348_data Count:(NSUInteger)1] retain];
+    FOLLOW_block_in_stat362 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_block_in_stat362_data Count:(NSUInteger)1] retain];
+    FOLLOW_assignStat_in_stat370 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_assignStat_in_stat370_data Count:(NSUInteger)1] retain];
+    FOLLOW_11_in_stat372 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_11_in_stat372_data Count:(NSUInteger)1] retain];
+    FOLLOW_11_in_stat380 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_11_in_stat380_data Count:(NSUInteger)1] retain];
+    FOLLOW_16_in_forStat399 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_16_in_forStat399_data Count:(NSUInteger)1] retain];
+    FOLLOW_7_in_forStat401 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_7_in_forStat401_data Count:(NSUInteger)1] retain];
+    FOLLOW_assignStat_in_forStat403 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_assignStat_in_forStat403_data Count:(NSUInteger)1] retain];
+    FOLLOW_11_in_forStat405 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_11_in_forStat405_data Count:(NSUInteger)1] retain];
+    FOLLOW_expr_in_forStat407 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_forStat407_data Count:(NSUInteger)1] retain];
+    FOLLOW_11_in_forStat409 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_11_in_forStat409_data Count:(NSUInteger)1] retain];
+    FOLLOW_assignStat_in_forStat411 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_assignStat_in_forStat411_data Count:(NSUInteger)1] retain];
+    FOLLOW_8_in_forStat413 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_8_in_forStat413_data Count:(NSUInteger)1] retain];
+    FOLLOW_block_in_forStat415 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_block_in_forStat415_data Count:(NSUInteger)1] retain];
+    FOLLOW_ID_in_assignStat442 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_ID_in_assignStat442_data Count:(NSUInteger)1] retain];
+    FOLLOW_13_in_assignStat444 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_13_in_assignStat444_data Count:(NSUInteger)1] retain];
+    FOLLOW_expr_in_assignStat446 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_assignStat446_data Count:(NSUInteger)1] retain];
+    FOLLOW_condExpr_in_expr468 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_condExpr_in_expr468_data Count:(NSUInteger)1] retain];
+    FOLLOW_aexpr_in_condExpr487 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_aexpr_in_condExpr487_data Count:(NSUInteger)1] retain];
+    FOLLOW_set_in_condExpr491 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_set_in_condExpr491_data Count:(NSUInteger)1] retain];
+    FOLLOW_aexpr_in_condExpr499 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_aexpr_in_condExpr499_data Count:(NSUInteger)1] retain];
+    FOLLOW_atom_in_aexpr521 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_atom_in_aexpr521_data Count:(NSUInteger)1] retain];
+    FOLLOW_9_in_aexpr525 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_9_in_aexpr525_data Count:(NSUInteger)1] retain];
+    FOLLOW_atom_in_aexpr527 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_atom_in_aexpr527_data Count:(NSUInteger)1] retain];
+    FOLLOW_ID_in_atom547 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_ID_in_atom547_data Count:(NSUInteger)1] retain];
+    FOLLOW_INT_in_atom561 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_INT_in_atom561_data Count:(NSUInteger)1] retain];
+    FOLLOW_7_in_atom575 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_7_in_atom575_data Count:(NSUInteger)1] retain];
+    FOLLOW_expr_in_atom577 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_atom577_data Count:(NSUInteger)1] retain];
+    FOLLOW_8_in_atom579 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_8_in_atom579_data Count:(NSUInteger)1] retain];
 
-    [ANTLRBaseRecognizer setTokenNames:[[AMutableArray arrayWithObjects:@"<invalid>", @"<EOR>", @"<DOWN>", @"<UP>", 
+    [BaseRecognizer setTokenNames:[[AMutableArray arrayWithObjects:@"<invalid>", @"<EOR>", @"<DOWN>", @"<UP>", 
  @"ID", @"INT", @"WS", @"'('", @"')'", @"'+'", @"','", @"';'", @"'<'", @"'='", 
  @"'=='", @"'char'", @"'for'", @"'int'", @"'void'", @"'{'", @"'}'", nil] retain]];
-    [ANTLRBaseRecognizer setGrammarFileName:@"SimpleC.g"];
+    [BaseRecognizer setGrammarFileName:@"/Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g"];
 }
 
-+ (SimpleCParser *)newSimpleCParser:(id<ANTLRTokenStream>)aStream
++ (SimpleCParser *)newSimpleCParser:(id<TokenStream>)aStream
 {
     return [[SimpleCParser alloc] initWithTokenStream:aStream];
-
-
 }
 
-- (id) initWithTokenStream:(id<ANTLRTokenStream>)aStream
+- (id) initWithTokenStream:(id<TokenStream>)aStream
 {
-    self = [super initWithTokenStream:aStream State:[[ANTLRRecognizerSharedState newANTLRRecognizerSharedStateWithRuleLen:15+1] retain]];
+    self = [super initWithTokenStream:aStream State:[[RecognizerSharedState newRecognizerSharedStateWithRuleLen:15+1] retain]];
     if ( self != nil ) {
-
-
         dfa2 = [DFA2 newDFA2WithRecognizer:self];
         /* start of actions-actionScope-init */
         /* start of init */
@@ -335,8 +363,6 @@
     [super dealloc];
 }
 
-/* ObjC start members */
-/* ObjC end members */
 /* ObjC start actions.(actionScope).methods */
 /* ObjC end actions.(actionScope).methods */
 /* ObjC start methods() */
@@ -344,18 +370,23 @@
 /* ObjC start rules */
 /*
  * $ANTLR start program
- * SimpleC.g:7:1: program : ( declaration )+ ;
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:7:1: program : ( declaration )+ ;
  */
 - (void) program
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
-        // SimpleC.g:8:5: ( ( declaration )+ ) // ruleBlockSingleAlt
-        // SimpleC.g:8:9: ( declaration )+ // alt
+        /* ruleLabelDefs entry */
+
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:8:5: ( ( declaration )+ ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:8:9: ( declaration )+ // alt
         {
-        // SimpleC.g:8:9: ( declaration )+ // positiveClosureBlock
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:8:9: ( declaration )+ // positiveClosureBlock
         NSInteger cnt1 = 0;
         do {
             NSInteger alt1 = 2;
@@ -367,8 +398,9 @@
 
             switch (alt1) {
                 case 1 : ;
-                    // SimpleC.g:8:9: declaration // alt
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:8:9: declaration // alt
                     {
+
                     /* ruleRef */
                     [self pushFollow:FOLLOW_declaration_in_program28];
                     [self declaration];
@@ -376,35 +408,34 @@
                     [self popFollow];
 
 
-
+                     
                     }
                     break;
 
                 default :
                     if ( cnt1 >= 1 )
                         goto loop1;
-                    ANTLREarlyExitException *eee =
-                        [ANTLREarlyExitException newException:input decisionNumber:1];
+                    EarlyExitException *eee =
+                        [EarlyExitException newException:input decisionNumber:1];
                     @throw eee;
             }
             cnt1++;
         } while (YES);
         loop1: ;
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
     }
 
     @finally {
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return ;
@@ -413,26 +444,29 @@
 
 /*
  * $ANTLR start declaration
- * SimpleC.g:20:1: declaration : ( variable | functionHeader ';' | functionHeader block );
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:20:1: declaration : ( variable | functionHeader ';' | functionHeader block );
  */
 - (void) declaration
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
-         NSString * functionHeader1 = nil ;
-         
-         NSString * functionHeader2 = nil ;
-         
+        /* ruleLabelDefs entry */
+        NSString * functionHeader1 = nil ;
 
-        // SimpleC.g:21:5: ( variable | functionHeader ';' | functionHeader block ) //ruleblock
+        NSString * functionHeader2 = nil ;
+
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:21:5: ( variable | functionHeader ';' | functionHeader block ) //ruleblock
         NSInteger alt2=3;
         alt2 = [dfa2 predict:input];
         switch (alt2) {
             case 1 : ;
-                // SimpleC.g:21:9: variable // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:21:9: variable // alt
                 {
+
                 /* ruleRef */
                 [self pushFollow:FOLLOW_variable_in_declaration50];
                 [self variable];
@@ -440,12 +474,13 @@
                 [self popFollow];
 
 
-
+                 
                 }
                 break;
             case 2 : ;
-                // SimpleC.g:22:9: functionHeader ';' // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:22:9: functionHeader ';' // alt
                 {
+
                 /* ruleRef */
                 [self pushFollow:FOLLOW_functionHeader_in_declaration60];
                 functionHeader1 = [self functionHeader];
@@ -453,18 +488,20 @@
                 [self popFollow];
 
 
-
+                 
                 [self match:input TokenType:11 Follow:FOLLOW_11_in_declaration62]; 
+                 
 
                  NSLog(@"%@ is a declaration\n", functionHeader1
                 ); 
 
-
+                 
                 }
                 break;
             case 3 : ;
-                // SimpleC.g:24:9: functionHeader block // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:24:9: functionHeader block // alt
                 {
+
                 /* ruleRef */
                 [self pushFollow:FOLLOW_functionHeader_in_declaration75];
                 functionHeader2 = [self functionHeader];
@@ -472,7 +509,7 @@
                 [self popFollow];
 
 
-
+                 
                 /* ruleRef */
                 [self pushFollow:FOLLOW_block_in_declaration77];
                 [self block];
@@ -480,26 +517,26 @@
                 [self popFollow];
 
 
+                 
 
                  NSLog(@"%@ is a definition\n", functionHeader2
                 ); 
 
-
+                 
                 }
                 break;
 
         }
-        // token+rule list labels
+        /* token+rule list labels */
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
     }
 
     @finally {
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return ;
@@ -508,17 +545,22 @@
 
 /*
  * $ANTLR start variable
- * SimpleC.g:28:1: variable : type declarator ';' ;
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:28:1: variable : type declarator ';' ;
  */
 - (void) variable
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
-        // SimpleC.g:29:5: ( type declarator ';' ) // ruleBlockSingleAlt
-        // SimpleC.g:29:9: type declarator ';' // alt
+        /* ruleLabelDefs entry */
+
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:29:5: ( type declarator ';' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:29:9: type declarator ';' // alt
         {
+
         /* ruleRef */
         [self pushFollow:FOLLOW_type_in_variable99];
         [self type];
@@ -526,7 +568,7 @@
         [self popFollow];
 
 
-
+         
         /* ruleRef */
         [self pushFollow:FOLLOW_declarator_in_variable101];
         [self declarator];
@@ -534,22 +576,21 @@
         [self popFollow];
 
 
-
+         
         [self match:input TokenType:11 Follow:FOLLOW_11_in_variable103]; 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
     }
 
     @finally {
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return ;
@@ -558,32 +599,36 @@
 
 /*
  * $ANTLR start declarator
- * SimpleC.g:32:1: declarator : ID ;
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:32:1: declarator : ID ;
  */
 - (void) declarator
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
-        // SimpleC.g:33:5: ( ID ) // ruleBlockSingleAlt
-        // SimpleC.g:33:9: ID // alt
-        {
-        [self match:input TokenType:ID Follow:FOLLOW_ID_in_declarator122]; 
+        /* ruleLabelDefs entry */
 
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:33:5: ( ID ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:33:9: ID // alt
+        {
+
+        [self match:input TokenType:ID Follow:FOLLOW_ID_in_declarator122]; 
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
     }
 
     @finally {
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return ;
@@ -592,13 +637,13 @@
 
 /*
  * $ANTLR start functionHeader
- * SimpleC.g:36:1: functionHeader returns [NSString *name] : type ID '(' ( formalParameter ( ',' formalParameter )* )? ')' ;
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:36:1: functionHeader returns [NSString *name] : type ID '(' ( formalParameter ( ',' formalParameter )* )? ')' ;
  */
 - (NSString *) functionHeader
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
 
+    /* ruleDeclarations */
     NSString * name = nil ;
 
 
@@ -606,11 +651,13 @@
         name=nil; // for now you must init here rather than in 'returns'
 
     @try {
-        ANTLRCommonToken *ID3 = nil;
+        /* ruleLabelDefs entry */
+        CommonToken *ID3 = nil;
 
-        // SimpleC.g:40:5: ( type ID '(' ( formalParameter ( ',' formalParameter )* )? ')' ) // ruleBlockSingleAlt
-        // SimpleC.g:40:9: type ID '(' ( formalParameter ( ',' formalParameter )* )? ')' // alt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:40:5: ( type ID '(' ( formalParameter ( ',' formalParameter )* )? ')' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:40:9: type ID '(' ( formalParameter ( ',' formalParameter )* )? ')' // alt
         {
+
         /* ruleRef */
         [self pushFollow:FOLLOW_type_in_functionHeader151];
         [self type];
@@ -618,12 +665,12 @@
         [self popFollow];
 
 
-
-        ID3=(ANTLRCommonToken *)[self match:input TokenType:ID Follow:FOLLOW_ID_in_functionHeader153]; 
-
+         
+        ID3=(CommonToken *)[self match:input TokenType:ID Follow:FOLLOW_ID_in_functionHeader153]; 
+         
         [self match:input TokenType:7 Follow:FOLLOW_7_in_functionHeader155]; 
-
-        // SimpleC.g:40:21: ( formalParameter ( ',' formalParameter )* )? // block
+         
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:40:21: ( formalParameter ( ',' formalParameter )* )? // block
         NSInteger alt4=2;
         NSInteger LA4_0 = [input LA:1];
 
@@ -632,8 +679,9 @@
         }
         switch (alt4) {
             case 1 : ;
-                // SimpleC.g:40:23: formalParameter ( ',' formalParameter )* // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:40:23: formalParameter ( ',' formalParameter )* // alt
                 {
+
                 /* ruleRef */
                 [self pushFollow:FOLLOW_formalParameter_in_functionHeader159];
                 [self formalParameter];
@@ -641,6 +689,7 @@
                 [self popFollow];
 
 
+                 
 
                 do {
                     NSInteger alt3=2;
@@ -652,10 +701,11 @@
 
                     switch (alt3) {
                         case 1 : ;
-                            // SimpleC.g:40:41: ',' formalParameter // alt
+                            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:40:41: ',' formalParameter // alt
                             {
-                            [self match:input TokenType:10 Follow:FOLLOW_10_in_functionHeader163]; 
 
+                            [self match:input TokenType:10 Follow:FOLLOW_10_in_functionHeader163]; 
+                             
                             /* ruleRef */
                             [self pushFollow:FOLLOW_formalParameter_in_functionHeader165];
                             [self formalParameter];
@@ -663,7 +713,7 @@
                             [self popFollow];
 
 
-
+                             
                             }
                             break;
 
@@ -673,32 +723,32 @@
                 } while (YES);
                 loop3: ;
 
-
+                 
                 }
                 break;
 
         }
 
-
+         
         [self match:input TokenType:8 Follow:FOLLOW_8_in_functionHeader173]; 
+         
 
         name =  (ID3!=nil?ID3.text:nil);
 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
     }
 
     @finally {
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return name;
@@ -707,17 +757,22 @@
 
 /*
  * $ANTLR start formalParameter
- * SimpleC.g:44:1: formalParameter : type declarator ;
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:44:1: formalParameter : type declarator ;
  */
 - (void) formalParameter
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
-        // SimpleC.g:45:5: ( type declarator ) // ruleBlockSingleAlt
-        // SimpleC.g:45:9: type declarator // alt
+        /* ruleLabelDefs entry */
+
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:45:5: ( type declarator ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:45:9: type declarator // alt
         {
+
         /* ruleRef */
         [self pushFollow:FOLLOW_type_in_formalParameter195];
         [self type];
@@ -725,7 +780,7 @@
         [self popFollow];
 
 
-
+         
         /* ruleRef */
         [self pushFollow:FOLLOW_declarator_in_formalParameter197];
         [self declarator];
@@ -733,20 +788,19 @@
         [self popFollow];
 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
     }
 
     @finally {
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return ;
@@ -755,39 +809,43 @@
 
 /*
  * $ANTLR start type
- * SimpleC.g:48:1: type : ( 'int' | 'char' | 'void' | ID );
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:48:1: type : ( 'int' | 'char' | 'void' | ID );
  */
 - (void) type
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
-        // SimpleC.g:49:5: ( 'int' | 'char' | 'void' | ID ) // ruleBlockSingleAlt
-        // SimpleC.g: // alt
+        /* ruleLabelDefs entry */
+
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:49:5: ( 'int' | 'char' | 'void' | ID ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g: // alt
         {
+
         if ([input LA:1] == ID||[input LA:1] == 15||(([input LA:1] >= 17) && ([input LA:1] <= 18))) {
             [input consume];
             [state setIsErrorRecovery:NO];
         } else {
-            ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException newException:nil stream:input];
+            MismatchedSetException *mse = [MismatchedSetException newException:nil stream:input];
             @throw mse;
         }
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
     }
 
     @finally {
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return ;
@@ -796,18 +854,24 @@
 
 /*
  * $ANTLR start block
- * SimpleC.g:55:1: block : '{' ( variable )* ( stat )* '}' ;
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:55:1: block : '{' ( variable )* ( stat )* '}' ;
  */
 - (void) block
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
-        // SimpleC.g:56:5: ( '{' ( variable )* ( stat )* '}' ) // ruleBlockSingleAlt
-        // SimpleC.g:56:9: '{' ( variable )* ( stat )* '}' // alt
+        /* ruleLabelDefs entry */
+
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:56:5: ( '{' ( variable )* ( stat )* '}' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:56:9: '{' ( variable )* ( stat )* '}' // alt
         {
+
         [self match:input TokenType:19 Follow:FOLLOW_19_in_block286]; 
+         
 
         do {
             NSInteger alt5=2;
@@ -827,8 +891,9 @@
 
             switch (alt5) {
                 case 1 : ;
-                    // SimpleC.g:57:13: variable // alt
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:57:13: variable // alt
                     {
+
                     /* ruleRef */
                     [self pushFollow:FOLLOW_variable_in_block300];
                     [self variable];
@@ -836,7 +901,7 @@
                     [self popFollow];
 
 
-
+                     
                     }
                     break;
 
@@ -846,6 +911,7 @@
         } while (YES);
         loop5: ;
 
+         
 
         do {
             NSInteger alt6=2;
@@ -857,8 +923,9 @@
 
             switch (alt6) {
                 case 1 : ;
-                    // SimpleC.g:58:13: stat // alt
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:58:13: stat // alt
                     {
+
                     /* ruleRef */
                     [self pushFollow:FOLLOW_stat_in_block315];
                     [self stat];
@@ -866,7 +933,7 @@
                     [self popFollow];
 
 
-
+                     
                     }
                     break;
 
@@ -876,22 +943,21 @@
         } while (YES);
         loop6: ;
 
-
+         
         [self match:input TokenType:20 Follow:FOLLOW_20_in_block326]; 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
     }
 
     @finally {
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return ;
@@ -900,15 +966,19 @@
 
 /*
  * $ANTLR start stat
- * SimpleC.g:62:1: stat : ( forStat | expr ';' | block | assignStat ';' | ';' );
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:62:1: stat : ( forStat | expr ';' | block | assignStat ';' | ';' );
  */
 - (void) stat
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
-        // SimpleC.g:62:5: ( forStat | expr ';' | block | assignStat ';' | ';' ) //ruleblock
+        /* ruleLabelDefs entry */
+
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:62:5: ( forStat | expr ';' | block | assignStat ';' | ';' ) //ruleblock
         NSInteger alt7=5;
         unichar charLA7 = [input LA:1];
         switch (charLA7) {
@@ -928,7 +998,7 @@
                     alt7=2;
                 }
                 else {
-                    ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newException:7 state:2 stream:input];
+                    NoViableAltException *nvae = [NoViableAltException newException:7 state:2 stream:input];
                     nvae.c = LA7_2;
                     @throw nvae;
 
@@ -953,7 +1023,7 @@
                 break;
 
         default: ;
-            ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newException:7 state:0 stream:input];
+            NoViableAltException *nvae = [NoViableAltException newException:7 state:0 stream:input];
             nvae.c = charLA7;
             @throw nvae;
 
@@ -961,8 +1031,9 @@
 
         switch (alt7) {
             case 1 : ;
-                // SimpleC.g:62:7: forStat // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:62:7: forStat // alt
                 {
+
                 /* ruleRef */
                 [self pushFollow:FOLLOW_forStat_in_stat338];
                 [self forStat];
@@ -970,12 +1041,13 @@
                 [self popFollow];
 
 
-
+                 
                 }
                 break;
             case 2 : ;
-                // SimpleC.g:63:7: expr ';' // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:63:7: expr ';' // alt
                 {
+
                 /* ruleRef */
                 [self pushFollow:FOLLOW_expr_in_stat346];
                 [self expr];
@@ -983,14 +1055,15 @@
                 [self popFollow];
 
 
-
+                 
                 [self match:input TokenType:11 Follow:FOLLOW_11_in_stat348]; 
-
+                 
                 }
                 break;
             case 3 : ;
-                // SimpleC.g:64:7: block // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:64:7: block // alt
                 {
+
                 /* ruleRef */
                 [self pushFollow:FOLLOW_block_in_stat362];
                 [self block];
@@ -998,12 +1071,13 @@
                 [self popFollow];
 
 
-
+                 
                 }
                 break;
             case 4 : ;
-                // SimpleC.g:65:7: assignStat ';' // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:65:7: assignStat ';' // alt
                 {
+
                 /* ruleRef */
                 [self pushFollow:FOLLOW_assignStat_in_stat370];
                 [self assignStat];
@@ -1011,31 +1085,31 @@
                 [self popFollow];
 
 
-
+                 
                 [self match:input TokenType:11 Follow:FOLLOW_11_in_stat372]; 
-
+                 
                 }
                 break;
             case 5 : ;
-                // SimpleC.g:66:7: ';' // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:66:7: ';' // alt
                 {
-                [self match:input TokenType:11 Follow:FOLLOW_11_in_stat380]; 
 
+                [self match:input TokenType:11 Follow:FOLLOW_11_in_stat380]; 
+                 
                 }
                 break;
 
         }
-        // token+rule list labels
+        /* token+rule list labels */
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
     }
 
     @finally {
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return ;
@@ -1044,21 +1118,26 @@
 
 /*
  * $ANTLR start forStat
- * SimpleC.g:69:1: forStat : 'for' '(' assignStat ';' expr ';' assignStat ')' block ;
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:69:1: forStat : 'for' '(' assignStat ';' expr ';' assignStat ')' block ;
  */
 - (void) forStat
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
-        // SimpleC.g:70:5: ( 'for' '(' assignStat ';' expr ';' assignStat ')' block ) // ruleBlockSingleAlt
-        // SimpleC.g:70:9: 'for' '(' assignStat ';' expr ';' assignStat ')' block // alt
+        /* ruleLabelDefs entry */
+
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:70:5: ( 'for' '(' assignStat ';' expr ';' assignStat ')' block ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:70:9: 'for' '(' assignStat ';' expr ';' assignStat ')' block // alt
         {
+
         [self match:input TokenType:16 Follow:FOLLOW_16_in_forStat399]; 
-
+         
         [self match:input TokenType:7 Follow:FOLLOW_7_in_forStat401]; 
-
+         
         /* ruleRef */
         [self pushFollow:FOLLOW_assignStat_in_forStat403];
         [self assignStat];
@@ -1066,9 +1145,9 @@
         [self popFollow];
 
 
-
+         
         [self match:input TokenType:11 Follow:FOLLOW_11_in_forStat405]; 
-
+         
         /* ruleRef */
         [self pushFollow:FOLLOW_expr_in_forStat407];
         [self expr];
@@ -1076,9 +1155,9 @@
         [self popFollow];
 
 
-
+         
         [self match:input TokenType:11 Follow:FOLLOW_11_in_forStat409]; 
-
+         
         /* ruleRef */
         [self pushFollow:FOLLOW_assignStat_in_forStat411];
         [self assignStat];
@@ -1086,9 +1165,9 @@
         [self popFollow];
 
 
-
+         
         [self match:input TokenType:8 Follow:FOLLOW_8_in_forStat413]; 
-
+         
         /* ruleRef */
         [self pushFollow:FOLLOW_block_in_forStat415];
         [self block];
@@ -1096,20 +1175,19 @@
         [self popFollow];
 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
     }
 
     @finally {
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return ;
@@ -1118,21 +1196,26 @@
 
 /*
  * $ANTLR start assignStat
- * SimpleC.g:73:1: assignStat : ID '=' expr ;
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:73:1: assignStat : ID '=' expr ;
  */
 - (void) assignStat
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
-        // SimpleC.g:74:5: ( ID '=' expr ) // ruleBlockSingleAlt
-        // SimpleC.g:74:9: ID '=' expr // alt
+        /* ruleLabelDefs entry */
+
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:74:5: ( ID '=' expr ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:74:9: ID '=' expr // alt
         {
+
         [self match:input TokenType:ID Follow:FOLLOW_ID_in_assignStat442]; 
-
+         
         [self match:input TokenType:13 Follow:FOLLOW_13_in_assignStat444]; 
-
+         
         /* ruleRef */
         [self pushFollow:FOLLOW_expr_in_assignStat446];
         [self expr];
@@ -1140,20 +1223,19 @@
         [self popFollow];
 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
     }
 
     @finally {
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return ;
@@ -1162,17 +1244,22 @@
 
 /*
  * $ANTLR start expr
- * SimpleC.g:77:1: expr : condExpr ;
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:77:1: expr : condExpr ;
  */
 - (void) expr
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
-        // SimpleC.g:77:5: ( condExpr ) // ruleBlockSingleAlt
-        // SimpleC.g:77:9: condExpr // alt
+        /* ruleLabelDefs entry */
+
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:77:5: ( condExpr ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:77:9: condExpr // alt
         {
+
         /* ruleRef */
         [self pushFollow:FOLLOW_condExpr_in_expr468];
         [self condExpr];
@@ -1180,20 +1267,19 @@
         [self popFollow];
 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
     }
 
     @finally {
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return ;
@@ -1202,17 +1288,22 @@
 
 /*
  * $ANTLR start condExpr
- * SimpleC.g:80:1: condExpr : aexpr ( ( '==' | '<' ) aexpr )? ;
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:80:1: condExpr : aexpr ( ( '==' | '<' ) aexpr )? ;
  */
 - (void) condExpr
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
-        // SimpleC.g:81:5: ( aexpr ( ( '==' | '<' ) aexpr )? ) // ruleBlockSingleAlt
-        // SimpleC.g:81:9: aexpr ( ( '==' | '<' ) aexpr )? // alt
+        /* ruleLabelDefs entry */
+
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:81:5: ( aexpr ( ( '==' | '<' ) aexpr )? ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:81:9: aexpr ( ( '==' | '<' ) aexpr )? // alt
         {
+
         /* ruleRef */
         [self pushFollow:FOLLOW_aexpr_in_condExpr487];
         [self aexpr];
@@ -1220,8 +1311,8 @@
         [self popFollow];
 
 
-
-        // SimpleC.g:81:15: ( ( '==' | '<' ) aexpr )? // block
+         
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:81:15: ( ( '==' | '<' ) aexpr )? // block
         NSInteger alt8=2;
         NSInteger LA8_0 = [input LA:1];
 
@@ -1230,17 +1321,18 @@
         }
         switch (alt8) {
             case 1 : ;
-                // SimpleC.g:81:17: ( '==' | '<' ) aexpr // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:81:17: ( '==' | '<' ) aexpr // alt
                 {
+
                 if ([input LA:1] == 12||[input LA:1] == 14) {
                     [input consume];
                     [state setIsErrorRecovery:NO];
                 } else {
-                    ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException newException:nil stream:input];
+                    MismatchedSetException *mse = [MismatchedSetException newException:nil stream:input];
                     @throw mse;
                 }
 
-
+                 
                 /* ruleRef */
                 [self pushFollow:FOLLOW_aexpr_in_condExpr499];
                 [self aexpr];
@@ -1248,26 +1340,25 @@
                 [self popFollow];
 
 
-
+                 
                 }
                 break;
 
         }
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
     }
 
     @finally {
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return ;
@@ -1276,17 +1367,22 @@
 
 /*
  * $ANTLR start aexpr
- * SimpleC.g:84:1: aexpr : atom ( '+' atom )* ;
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:84:1: aexpr : atom ( '+' atom )* ;
  */
 - (void) aexpr
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
-        // SimpleC.g:85:5: ( atom ( '+' atom )* ) // ruleBlockSingleAlt
-        // SimpleC.g:85:9: atom ( '+' atom )* // alt
+        /* ruleLabelDefs entry */
+
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:85:5: ( atom ( '+' atom )* ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:85:9: atom ( '+' atom )* // alt
         {
+
         /* ruleRef */
         [self pushFollow:FOLLOW_atom_in_aexpr521];
         [self atom];
@@ -1294,6 +1390,7 @@
         [self popFollow];
 
 
+         
 
         do {
             NSInteger alt9=2;
@@ -1305,10 +1402,11 @@
 
             switch (alt9) {
                 case 1 : ;
-                    // SimpleC.g:85:16: '+' atom // alt
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:85:16: '+' atom // alt
                     {
-                    [self match:input TokenType:9 Follow:FOLLOW_9_in_aexpr525]; 
 
+                    [self match:input TokenType:9 Follow:FOLLOW_9_in_aexpr525]; 
+                     
                     /* ruleRef */
                     [self pushFollow:FOLLOW_atom_in_aexpr527];
                     [self atom];
@@ -1316,7 +1414,7 @@
                     [self popFollow];
 
 
-
+                     
                     }
                     break;
 
@@ -1326,20 +1424,19 @@
         } while (YES);
         loop9: ;
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
     }
 
     @finally {
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return ;
@@ -1348,15 +1445,19 @@
 
 /*
  * $ANTLR start atom
- * SimpleC.g:88:1: atom : ( ID | INT | '(' expr ')' );
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:88:1: atom : ( ID | INT | '(' expr ')' );
  */
 - (void) atom
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
-        // SimpleC.g:89:5: ( ID | INT | '(' expr ')' ) //ruleblock
+        /* ruleLabelDefs entry */
+
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:89:5: ( ID | INT | '(' expr ')' ) //ruleblock
         NSInteger alt10=3;
         unichar charLA10 = [input LA:1];
         switch (charLA10) {
@@ -1377,7 +1478,7 @@
                 break;
 
         default: ;
-            ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newException:10 state:0 stream:input];
+            NoViableAltException *nvae = [NoViableAltException newException:10 state:0 stream:input];
             nvae.c = charLA10;
             @throw nvae;
 
@@ -1385,24 +1486,27 @@
 
         switch (alt10) {
             case 1 : ;
-                // SimpleC.g:89:7: ID // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:89:7: ID // alt
                 {
-                [self match:input TokenType:ID Follow:FOLLOW_ID_in_atom547]; 
 
+                [self match:input TokenType:ID Follow:FOLLOW_ID_in_atom547]; 
+                 
                 }
                 break;
             case 2 : ;
-                // SimpleC.g:90:7: INT // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:90:7: INT // alt
                 {
-                [self match:input TokenType:INT Follow:FOLLOW_INT_in_atom561]; 
 
+                [self match:input TokenType:INT Follow:FOLLOW_INT_in_atom561]; 
+                 
                 }
                 break;
             case 3 : ;
-                // SimpleC.g:91:7: '(' expr ')' // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:91:7: '(' expr ')' // alt
                 {
-                [self match:input TokenType:7 Follow:FOLLOW_7_in_atom575]; 
 
+                [self match:input TokenType:7 Follow:FOLLOW_7_in_atom575]; 
+                 
                 /* ruleRef */
                 [self pushFollow:FOLLOW_expr_in_atom577];
                 [self expr];
@@ -1410,24 +1514,23 @@
                 [self popFollow];
 
 
-
+                 
                 [self match:input TokenType:8 Follow:FOLLOW_8_in_atom579]; 
-
+                 
                 }
                 break;
 
         }
-        // token+rule list labels
+        /* token+rule list labels */
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
     }
 
     @finally {
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return ;
diff --git a/runtime/ObjC/Framework/examples/LL-star/antlr3.h b/runtime/ObjC/Framework/examples/LL-star/antlr3.h
deleted file mode 100644
index 4f16279..0000000
--- a/runtime/ObjC/Framework/examples/LL-star/antlr3.h
+++ /dev/null
@@ -1,79 +0,0 @@
-#import <ANTLR/ANTLRBaseMapElement.h>
-#import <ANTLR/ANTLRBaseRecognizer.h>
-#import <ANTLR/ANTLRBaseStack.h>
-#import <ANTLR/ANTLRBaseTree.h>
-#import <ANTLR/ANTLRBaseTreeAdaptor.h>
-#import <ANTLR/ANTLRBitSet.h>
-#import <ANTLR/ANTLRBufferedTokenStream.h>
-#import <ANTLR/ANTLRBufferedTreeNodeStream.h>
-#import <ANTLR/ANTLRCharStream.h>
-#import <ANTLR/ANTLRCharStreamState.h>
-#import <ANTLR/ANTLRCommonErrorNode.h>
-#import <ANTLR/ANTLRCommonToken.h>
-#import <ANTLR/ANTLRCommonTokenStream.h>
-#import <ANTLR/ANTLRCommonTree.h>
-#import <ANTLR/ANTLRCommonTreeAdaptor.h>
-#import <ANTLR/ANTLRCommonTreeNodeStream.h>
-#import <ANTLR/ANTLRDFA.h>
-#import <ANTLR/ANTLRDebug.h>
-#import <ANTLR/ANTLRDebugEventProxy.h>
-#import <ANTLR/ANTLRDebugEventListener.h>
-#import <ANTLR/ANTLRDebugParser.h>
-#import <ANTLR/ANTLRDebugTokenStream.h>
-#import <ANTLR/ANTLRDebugTreeAdaptor.h>
-#import <ANTLR/ANTLRDebugTreeNodeStream.h>
-#import <ANTLR/ANTLRDebugTreeParser.h>
-#import <ANTLR/ANTLREarlyExitException.h>
-#import <ANTLR/ANTLRError.h>
-#import <ANTLR/ANTLRFailedPredicateException.h>
-#import <ANTLR/ANTLRFastQueue.h>
-#import <ANTLR/ANTLRHashMap.h>
-#import <ANTLR/ANTLRHashRule.h>
-#import <ANTLR/ANTLRIntArray.h>
-#import <ANTLR/ANTLRIntStream.h>
-#import <ANTLR/ANTLRLexer.h>
-#import <ANTLR/ANTLRLexerRuleReturnScope.h>
-#import <ANTLR/ANTLRLinkBase.h>
-#import <ANTLR/ANTLRLookaheadStream.h>
-#import <ANTLR/ANTLRMapElement.h>
-#import <ANTLR/ANTLRMap.h>
-#import <ANTLR/ANTLRMismatchedNotSetException.h>
-#import <ANTLR/ANTLRMismatchedRangeException.h>
-#import <ANTLR/ANTLRMismatchedSetException.h>
-#import <ANTLR/ANTLRMismatchedTokenException.h>
-#import <ANTLR/ANTLRMismatchedTreeNodeException.h>
-#import <ANTLR/ANTLRMissingTokenException.h>
-#import <ANTLR/ANTLRNodeMapElement.h>
-#import <ANTLR/ANTLRNoViableAltException.h>
-#import <ANTLR/ANTLRParser.h>
-#import <ANTLR/ANTLRParserRuleReturnScope.h>
-#import <ANTLR/ANTLRPtrBuffer.h>
-#import <ANTLR/ANTLRRecognitionException.h>
-#import <ANTLR/ANTLRRecognizerSharedState.h>
-#import <ANTLR/ANTLRRewriteRuleElementStream.h>
-#import <ANTLR/ANTLRRewriteRuleSubtreeStream.h>
-#import <ANTLR/ANTLRRewriteRuleTokenStream.h>
-#import <ANTLR/ANTLRRuleMemo.h>
-#import <ANTLR/ANTLRRuleStack.h>
-#import <ANTLR/ANTLRRuleReturnScope.h>
-#import <ANTLR/ANTLRRuntimeException.h>
-#import <ANTLR/ANTLRStreamEnumerator.h>
-#import <ANTLR/ANTLRStringStream.h>
-#import <ANTLR/ANTLRSymbolStack.h>
-#import <ANTLR/ANTLRToken+DebuggerSupport.h>
-#import <ANTLR/ANTLRToken.h>
-#import <ANTLR/ANTLRTokenRewriteStream.h>
-#import <ANTLR/ANTLRTokenSource.h>
-#import <ANTLR/ANTLRTokenStream.h>
-#import <ANTLR/ANTLRTree.h>
-#import <ANTLR/ANTLRTreeAdaptor.h>
-#import <ANTLR/ANTLRTreeException.h>
-#import <ANTLR/ANTLRTreeIterator.h>
-#import <ANTLR/ANTLRTreeNodeStream.h>
-#import <ANTLR/ANTLRTreeParser.h>
-#import <ANTLR/ANTLRTreeRuleReturnScope.h>
-#import <ANTLR/ANTLRUnbufferedTokenStream.h>
-//#import <ANTLR/ANTLRUnbufferedCommonTreeNodeStream.h>
-//#import <ANTLR/ANTLRUnbufferedCommonTreeNodeStreamState.h>
-#import <ANTLR/ANTLRUniqueIDMap.h>
-#import <ANTLR/ANTLRUnwantedTokenException.h>
diff --git a/runtime/ObjC/Framework/examples/LL-star/main.m b/runtime/ObjC/Framework/examples/LL-star/main.m
index 0a645be..2ab47d3 100644
--- a/runtime/ObjC/Framework/examples/LL-star/main.m
+++ b/runtime/ObjC/Framework/examples/LL-star/main.m
@@ -1,22 +1,24 @@
-#import <Cocoa/Cocoa.h>
-#import <antlr3.h>
+#import <Foundation/Foundation.h>
+#import <ANTLR/ANTLR.h>
 #import "SimpleCLexer.h"
 #import "SimpleCParser.h"
 
-int main() {
+int main()
+{
+    NSError *error;
 	NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
 
-	NSString *string = [NSString stringWithContentsOfFile:@"/Users/acondit/source/antlr3/acondit_localhost/code/antlr/antlr3-main/runtime/ObjC/Framework/examples/LL-star/input"];
+	NSString *string = [NSString stringWithContentsOfFile:@"/Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/input" encoding:NSASCIIStringEncoding error:&error];
 	NSLog(@"input is: %@", string);
 	ANTLRStringStream *stream = [[ANTLRStringStream alloc] initWithStringNoCopy:string];
 	SimpleCLexer *lexer = [[SimpleCLexer alloc] initWithCharStream:stream];
 
-//	ANTLRCommonToken *currentToken;
-//	while ((currentToken = [lexer nextToken]) && [currentToken getType] != ANTLRTokenTypeEOF) {
+//	CommonToken *currentToken;
+//	while ((currentToken = [lexer nextToken]) && currentToken.type != TokenTypeEOF) {
 //		NSLog(@"%@", [currentToken toString]);
 //	}
 	
-	ANTLRCommonTokenStream *tokens = [[ANTLRCommonTokenStream alloc] initWithTokenSource:lexer];
+	CommonTokenStream *tokens = [[CommonTokenStream alloc] initWithTokenSource:lexer];
 	SimpleCParser *parser = [[SimpleCParser alloc] initWithTokenStream:tokens];
 	[parser program];
 
diff --git a/runtime/ObjC/Framework/examples/combined/Combined.tokens b/runtime/ObjC/Framework/examples/combined/Combined.tokens
index b22f459..343392f 100644
--- a/runtime/ObjC/Framework/examples/combined/Combined.tokens
+++ b/runtime/ObjC/Framework/examples/combined/Combined.tokens
@@ -1,3 +1,3 @@
-WS=6
-INT=5
 ID=4
+INT=5
+WS=6
diff --git a/runtime/ObjC/Framework/examples/combined/CombinedLexer.h b/runtime/ObjC/Framework/examples/combined/CombinedLexer.h
index b7faf3e..6c2b67a 100644
--- a/runtime/ObjC/Framework/examples/combined/CombinedLexer.h
+++ b/runtime/ObjC/Framework/examples/combined/CombinedLexer.h
@@ -1,32 +1,39 @@
-// $ANTLR 3.2 Aug 24, 2010 10:45:57 Combined.g 2010-08-24 13:53:42
+// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/combined/Combined.g 2012-02-16 17:33:49
 
 /* =============================================================================
- * Standard antlr3 OBJC runtime definitions
+ * Standard antlr OBJC runtime definitions
  */
-#import <Cocoa/Cocoa.h>
-#import "antlr3.h"
+#import <Foundation/Foundation.h>
+#import <ANTLR/ANTLR.h>
 /* End of standard antlr3 runtime definitions
  * =============================================================================
  */
 
 /* Start cyclicDFAInterface */
 
-#pragma mark Rule return scopes start
-#pragma mark Rule return scopes end
+#pragma mark Rule return scopes Interface start
+#pragma mark Rule return scopes Interface end
 #pragma mark Tokens
+#ifdef EOF
+#undef EOF
+#endif
+#define EOF -1
+#define ID 4
 #define INT 5
 #define WS 6
-#define ID 4
-#define EOF -1
-@interface CombinedLexer : ANTLRLexer { // line 283
-// start of actions.lexer.memVars
-// start of action-actionScope-memVars
+/* interface lexer class */
+@interface CombinedLexer : Lexer { // line 283
+/* ObjC start of actions.lexer.memVars */
+/* ObjC end of actions.lexer.memVars */
 }
-+ (CombinedLexer *)newCombinedLexerWithCharStream:(id<ANTLRCharStream>)anInput;
-
-- (void)mID; 
-- (void)mINT; 
-- (void)mWS; 
-- (void)mTokens; 
++ (void) initialize;
++ (CombinedLexer *)newCombinedLexerWithCharStream:(id<CharStream>)anInput;
+/* ObjC start actions.lexer.methodsDecl */
+/* ObjC end actions.lexer.methodsDecl */
+- (void) mID ; 
+- (void) mINT ; 
+- (void) mWS ; 
+- (void) mTokens ; 
 
 @end /* end of CombinedLexer interface */
+
diff --git a/runtime/ObjC/Framework/examples/combined/CombinedLexer.m b/runtime/ObjC/Framework/examples/combined/CombinedLexer.m
index 44be164..473e077 100644
--- a/runtime/ObjC/Framework/examples/combined/CombinedLexer.m
+++ b/runtime/ObjC/Framework/examples/combined/CombinedLexer.m
@@ -1,43 +1,18 @@
 /** \file
- *  This OBJC source file was generated by $ANTLR version 3.2 Aug 24, 2010 10:45:57
+ *  This OBJC source file was generated by $ANTLR version 3.4
  *
- *     -  From the grammar source file : Combined.g
- *     -                            On : 2010-08-24 13:53:42
- *     -                 for the lexer : CombinedLexerLexer *
- * Editing it, at least manually, is not wise. 
+ *     -  From the grammar source file : /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/combined/Combined.g
+ *     -                            On : 2012-02-16 17:33:49
+ *     -                 for the lexer : CombinedLexerLexer
+ *
+ * Editing it, at least manually, is not wise.
  *
  * ObjC language generator and runtime by Alan Condit, acondit|hereisanat|ipns|dotgoeshere|com.
  *
  *
 */
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-//
-// 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.
+// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/combined/Combined.g 2012-02-16 17:33:49
 
-// $ANTLR 3.2 Aug 24, 2010 10:45:57 Combined.g 2010-08-24 13:53:42
 
 /* -----------------------------------------
  * Include the ANTLR3 generated header file.
@@ -47,18 +22,16 @@
 
 
 /* ============================================================================= */
-
 /* =============================================================================
  * Start of recognizer
  */
 
-
 /** As per Terence: No returns for lexer rules! */
 @implementation CombinedLexer // line 330
 
 + (void) initialize
 {
-    [ANTLRBaseRecognizer setGrammarFileName:@"Combined.g"];
+    [BaseRecognizer setGrammarFileName:@"/Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/combined/Combined.g"];
 }
 
 + (NSString *) tokenNameForType:(NSInteger)aTokenType
@@ -66,15 +39,15 @@
     return [[self getTokenNames] objectAtIndex:aTokenType];
 }
 
-+ (CombinedLexer *)newCombinedLexerWithCharStream:(id<ANTLRCharStream>)anInput
++ (CombinedLexer *)newCombinedLexerWithCharStream:(id<CharStream>)anInput
 {
     return [[CombinedLexer alloc] initWithCharStream:anInput];
 }
 
-- (id) initWithCharStream:(id<ANTLRCharStream>)anInput
+- (id) initWithCharStream:(id<CharStream>)anInput
 {
-    if ((self = [super initWithCharStream:anInput State:[ANTLRRecognizerSharedState newANTLRRecognizerSharedStateWithRuleLen:4+1]]) != nil) {
-
+    self = [super initWithCharStream:anInput State:[RecognizerSharedState newRecognizerSharedStateWithRuleLen:4+1]];
+    if ( self != nil ) {
     }
     return self;
 }
@@ -84,8 +57,10 @@
     [super dealloc];
 }
 
-/* Start of actions.lexer.methods */
-/* start methods() */
+/* ObjC Start of actions.lexer.methods */
+/* ObjC end of actions.lexer.methods */
+/* ObjC start methods() */
+/* ObjC end methods() */
 
 /* Start of Rules */
 // $ANTLR start "ID"
@@ -94,41 +69,47 @@
     //
     /* ruleScopeSetUp */
 
+    /* ruleDeclarations */
+
     @try {
         NSInteger _type = ID;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // Combined.g:14:5: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' )* ) // ruleBlockSingleAlt
-        // Combined.g:14:9: ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' )* // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/combined/Combined.g:14:5: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' )* ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/combined/Combined.g:14:9: ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' )* // alt
         {
+
         if ((([input LA:1] >= 'A') && ([input LA:1] <= 'Z'))||[input LA:1] == '_'||(([input LA:1] >= 'a') && ([input LA:1] <= 'z'))) {
             [input consume];
-
         } else {
-            ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException exceptionWithSet:nil stream:input];
+            MismatchedSetException *mse = [MismatchedSetException newException:nil stream:input];
             [self recover:mse];
-            @throw mse;}
-          /* element() */
+            @throw mse;
+        }
+
+         
+
         do {
             NSInteger alt1=2;
             NSInteger LA1_0 = [input LA:1];
-            if ( ((LA1_0>='0' && LA1_0<='9')||(LA1_0>='A' && LA1_0<='Z')||LA1_0=='_'||(LA1_0>='a' && LA1_0<='z')) ) {
+            if ( ((LA1_0 >= '0' && LA1_0 <= '9')||(LA1_0 >= 'A' && LA1_0 <= 'Z')||LA1_0=='_'||(LA1_0 >= 'a' && LA1_0 <= 'z')) ) {
                 alt1=1;
             }
 
 
             switch (alt1) {
                 case 1 : ;
-                    // Combined.g: // alt
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/combined/Combined.g: // alt
                     {
+
                     if ((([input LA:1] >= '0') && ([input LA:1] <= '9'))||(([input LA:1] >= 'A') && ([input LA:1] <= 'Z'))||[input LA:1] == '_'||(([input LA:1] >= 'a') && ([input LA:1] <= 'z'))) {
                         [input consume];
-
                     } else {
-                        ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException exceptionWithSet:nil stream:input];
+                        MismatchedSetException *mse = [MismatchedSetException newException:nil stream:input];
                         [self recover:mse];
-                        @throw mse;}
-                      /* element() */
-                     /* elements */
+                        @throw mse;
+                    }
+
+                     
                     }
                     break;
 
@@ -137,150 +118,171 @@
             }
         } while (YES);
         loop1: ;
-          /* element() */
-         /* elements */
+
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
-        [state setType:_type];
-
+        state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
+        /* ruleScopeCleanUp */
+
     }
     return;
 }
-// $ANTLR end "ID"
-
+/* $ANTLR end "ID" */
 // $ANTLR start "INT"
 - (void) mINT
 {
     //
     /* ruleScopeSetUp */
 
+    /* ruleDeclarations */
+
     @try {
         NSInteger _type = INT;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // Combined.g:17:5: ( ( '0' .. '9' )+ ) // ruleBlockSingleAlt
-        // Combined.g:17:9: ( '0' .. '9' )+ // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/combined/Combined.g:17:5: ( ( '0' .. '9' )+ ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/combined/Combined.g:17:9: ( '0' .. '9' )+ // alt
         {
-        // Combined.g:17:9: ( '0' .. '9' )+ // positiveClosureBlock
-        NSInteger cnt2=0;
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/combined/Combined.g:17:9: ( '0' .. '9' )+ // positiveClosureBlock
+        NSInteger cnt2 = 0;
         do {
-            NSInteger alt2=2;
+            NSInteger alt2 = 2;
             NSInteger LA2_0 = [input LA:1];
-            if ( ((LA2_0>='0' && LA2_0<='9')) ) {
+            if ( ((LA2_0 >= '0' && LA2_0 <= '9')) ) {
                 alt2=1;
             }
 
 
             switch (alt2) {
                 case 1 : ;
-                    // Combined.g:17:10: '0' .. '9' // alt
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/combined/Combined.g: // alt
                     {
-                    [self matchRangeFromChar:'0' to:'9'];   /* element() */
-                     /* elements */
+
+                    if ((([input LA:1] >= '0') && ([input LA:1] <= '9'))) {
+                        [input consume];
+                    } else {
+                        MismatchedSetException *mse = [MismatchedSetException newException:nil stream:input];
+                        [self recover:mse];
+                        @throw mse;
+                    }
+
+                     
                     }
                     break;
 
                 default :
                     if ( cnt2 >= 1 )
                         goto loop2;
-                    ANTLREarlyExitException *eee = [ANTLREarlyExitException exceptionWithStream:input decisionNumber:2];
+                    EarlyExitException *eee =
+                        [EarlyExitException newException:input decisionNumber:2];
                     @throw eee;
             }
             cnt2++;
         } while (YES);
         loop2: ;
-          /* element() */
-         /* elements */
+
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
-        [state setType:_type];
-
+        state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
+        /* ruleScopeCleanUp */
+
     }
     return;
 }
-// $ANTLR end "INT"
-
+/* $ANTLR end "INT" */
 // $ANTLR start "WS"
 - (void) mWS
 {
     //
     /* ruleScopeSetUp */
 
+    /* ruleDeclarations */
+
     @try {
         NSInteger _type = WS;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // Combined.g:20:5: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ ) // ruleBlockSingleAlt
-        // Combined.g:20:9: ( ' ' | '\\t' | '\\r' | '\\n' )+ // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/combined/Combined.g:20:5: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/combined/Combined.g:20:9: ( ' ' | '\\t' | '\\r' | '\\n' )+ // alt
         {
-        // Combined.g:20:9: ( ' ' | '\\t' | '\\r' | '\\n' )+ // positiveClosureBlock
-        NSInteger cnt3=0;
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/combined/Combined.g:20:9: ( ' ' | '\\t' | '\\r' | '\\n' )+ // positiveClosureBlock
+        NSInteger cnt3 = 0;
         do {
-            NSInteger alt3=2;
+            NSInteger alt3 = 2;
             NSInteger LA3_0 = [input LA:1];
-            if ( ((LA3_0>='\t' && LA3_0<='\n')||LA3_0=='\r'||LA3_0==' ') ) {
+            if ( ((LA3_0 >= '\t' && LA3_0 <= '\n')||LA3_0=='\r'||LA3_0==' ') ) {
                 alt3=1;
             }
 
 
             switch (alt3) {
                 case 1 : ;
-                    // Combined.g: // alt
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/combined/Combined.g: // alt
                     {
+
                     if ((([input LA:1] >= '\t') && ([input LA:1] <= '\n'))||[input LA:1] == '\r'||[input LA:1] == ' ') {
                         [input consume];
-
                     } else {
-                        ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException exceptionWithSet:nil stream:input];
+                        MismatchedSetException *mse = [MismatchedSetException newException:nil stream:input];
                         [self recover:mse];
-                        @throw mse;}
-                      /* element() */
-                     /* elements */
+                        @throw mse;
+                    }
+
+                     
                     }
                     break;
 
                 default :
                     if ( cnt3 >= 1 )
                         goto loop3;
-                    ANTLREarlyExitException *eee = [ANTLREarlyExitException exceptionWithStream:input decisionNumber:3];
+                    EarlyExitException *eee =
+                        [EarlyExitException newException:input decisionNumber:3];
                     @throw eee;
             }
             cnt3++;
         } while (YES);
         loop3: ;
-          /* element() */
-         _channel=99;   /* element() */
-         /* elements */
+
+         
+
+         _channel=99; 
+
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
-        [state setType:_type];
-
+        state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
+        /* ruleScopeCleanUp */
+
     }
     return;
 }
-// $ANTLR end "WS"
-
+/* $ANTLR end "WS" */
 - (void) mTokens
 {
-    // Combined.g:1:8: ( ID | INT | WS ) //ruleblock
+    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/combined/Combined.g:1:8: ( ID | INT | WS ) //ruleblock
     NSInteger alt4=3;
-    switch ([input LA:1]) {
+    unichar charLA4 = [input LA:1];
+    switch (charLA4) {
         case 'A': ;
         case 'B': ;
         case 'C': ;
@@ -362,33 +364,44 @@
             break;
 
     default: ;
-        ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newANTLRNoViableAltException:4 state:0 stream:input];
+        NoViableAltException *nvae = [NoViableAltException newException:4 state:0 stream:input];
+        nvae.c = charLA4;
         @throw nvae;
+
     }
 
     switch (alt4) {
         case 1 : ;
-            // Combined.g:1:10: ID // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/combined/Combined.g:1:10: ID // alt
             {
-                [self mID]; 
-              /* element() */
-             /* elements */
+
+
+            [self mID]; 
+
+
+             
             }
             break;
         case 2 : ;
-            // Combined.g:1:13: INT // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/combined/Combined.g:1:13: INT // alt
             {
-                [self mINT]; 
-              /* element() */
-             /* elements */
+
+
+            [self mINT]; 
+
+
+             
             }
             break;
         case 3 : ;
-            // Combined.g:1:17: WS // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/combined/Combined.g:1:17: WS // alt
             {
-                [self mWS]; 
-              /* element() */
-             /* elements */
+
+
+            [self mWS]; 
+
+
+             
             }
             break;
 
@@ -396,8 +409,4 @@
 
 }
 
-@end /* end of CombinedLexer implementation line 397 */
-
-/* End of code
- * =============================================================================
- */
+@end /* end of CombinedLexer implementation line 397 */
\ No newline at end of file
diff --git a/runtime/ObjC/Framework/examples/combined/CombinedParser.h b/runtime/ObjC/Framework/examples/combined/CombinedParser.h
index 2d48ff4..6627eed 100644
--- a/runtime/ObjC/Framework/examples/combined/CombinedParser.h
+++ b/runtime/ObjC/Framework/examples/combined/CombinedParser.h
@@ -1,41 +1,68 @@
-// $ANTLR 3.2 Aug 24, 2010 10:45:57 Combined.g 2010-08-24 13:53:42
+// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/combined/Combined.g 2012-02-16 17:33:49
 
 /* =============================================================================
- * Standard antlr3 OBJC runtime definitions
+ * Standard antlr OBJC runtime definitions
  */
-#import <Cocoa/Cocoa.h>
-#import "antlr3.h"
+#import <Foundation/Foundation.h>
+#import <ANTLR/ANTLR.h>
 /* End of standard antlr3 runtime definitions
  * =============================================================================
  */
 
 /* parserHeaderFile */
+#ifndef ANTLR3TokenTypeAlreadyDefined
+#define ANTLR3TokenTypeAlreadyDefined
+typedef enum {
+    ANTLR_EOF = -1,
+    INVALID,
+    EOR,
+    DOWN,
+    UP,
+    MIN
+} ANTLR3TokenType;
+#endif
+
 #pragma mark Tokens
-#define WS 6
-#define INT 5
-#define ID 4
+#ifdef EOF
+#undef EOF
+#endif
 #define EOF -1
-#pragma mark Dynamic Global Scopes
-#pragma mark Dynamic Rule Scopes
-#pragma mark Rule Return Scopes start
-#pragma mark Rule return scopes end
-@interface CombinedParser : ANTLRParser { /* line 572 */
-// start of globalAttributeScopeMemVar
+#define ID 4
+#define INT 5
+#define WS 6
+#pragma mark Dynamic Global Scopes globalAttributeScopeInterface
+#pragma mark Dynamic Rule Scopes ruleAttributeScopeInterface
+#pragma mark Rule Return Scopes returnScopeInterface
+
+/* Interface grammar class */
+@interface CombinedParser  : Parser { /* line 572 */
+#pragma mark Dynamic Rule Scopes ruleAttributeScopeDecl
+#pragma mark Dynamic Global Rule Scopes globalAttributeScopeMemVar
 
 
-// start of action-actionScope-memVars
-// start of ruleAttributeScopeMemVar
-
-
-// Start of memVars
+/* ObjC start of actions.(actionScope).memVars */
+/* ObjC end of actions.(actionScope).memVars */
+/* ObjC start of memVars */
+/* ObjC end of memVars */
 
  }
 
-// start of action-actionScope-methodsDecl
+/* ObjC start of actions.(actionScope).properties */
+/* ObjC end of actions.(actionScope).properties */
+/* ObjC start of properties */
+/* ObjC end of properties */
 
++ (void) initialize;
++ (id) newCombinedParser:(id<TokenStream>)aStream;
+/* ObjC start of actions.(actionScope).methodsDecl */
+/* ObjC end of actions.(actionScope).methodsDecl */
+
+/* ObjC start of methodsDecl */
+/* ObjC end of methodsDecl */
 
 - (void)stat; 
 - (void)identifier; 
 
 
 @end /* end of CombinedParser interface */
+
diff --git a/runtime/ObjC/Framework/examples/combined/CombinedParser.m b/runtime/ObjC/Framework/examples/combined/CombinedParser.m
index cb5d6f0..355a7e7 100644
--- a/runtime/ObjC/Framework/examples/combined/CombinedParser.m
+++ b/runtime/ObjC/Framework/examples/combined/CombinedParser.m
@@ -1,43 +1,18 @@
 /** \file
- *  This OBJC source file was generated by $ANTLR version 3.2 Aug 24, 2010 10:45:57
+ *  This OBJC source file was generated by $ANTLR version 3.4
  *
- *     -  From the grammar source file : Combined.g
- *     -                            On : 2010-08-24 13:53:42
- *     -                for the parser : CombinedParserParser *
- * Editing it, at least manually, is not wise. 
+ *     -  From the grammar source file : /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/combined/Combined.g
+ *     -                            On : 2012-02-16 17:33:49
+ *     -                for the parser : CombinedParserParser
+ *
+ * Editing it, at least manually, is not wise.
  *
  * ObjC language generator and runtime by Alan Condit, acondit|hereisanat|ipns|dotgoeshere|com.
  *
  *
 */
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-//
-// 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.
+// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/combined/Combined.g 2012-02-16 17:33:49
 
-// $ANTLR 3.2 Aug 24, 2010 10:45:57 Combined.g 2010-08-24 13:53:42
 
 /* -----------------------------------------
  * Include the ANTLR3 generated header file.
@@ -47,13 +22,10 @@
 
 
 /* ============================================================================= */
-
 /* =============================================================================
  * Start of recognizer
  */
 
-
-
 #pragma mark Bitsets
 static ANTLRBitSet *FOLLOW_identifier_in_stat20;
 static const unsigned long long FOLLOW_identifier_in_stat20_data[] = { 0x0000000000000012LL};
@@ -61,41 +33,43 @@
 static const unsigned long long FOLLOW_ID_in_identifier35_data[] = { 0x0000000000000002LL};
 
 
-#pragma mark Dynamic Global Scopes
+#pragma mark Dynamic Global globalAttributeScopeImplementation
 
-#pragma mark Dynamic Rule Scopes
+#pragma mark Dynamic Rule Scopes ruleAttributeScopeImplementation
 
-#pragma mark Rule return scopes start
-/* returnScope */
-
-/* returnScope */
-
-
+#pragma mark Rule Return Scopes returnScopeImplementation
 
 @implementation CombinedParser  // line 637
 
+/* ObjC start of ruleAttributeScope */
+#pragma mark Dynamic Rule Scopes ruleAttributeScope
+/* ObjC end of ruleAttributeScope */
+#pragma mark global Attribute Scopes globalAttributeScope
+/* ObjC start globalAttributeScope */
+/* ObjC end globalAttributeScope */
+/* ObjC start actions.(actionScope).synthesize */
+/* ObjC start synthesize() */
+
 + (void) initialize
 {
     #pragma mark Bitsets
-    FOLLOW_identifier_in_stat20 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_identifier_in_stat20_data Count:(NSUInteger)1] retain];
-    FOLLOW_ID_in_identifier35 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_ID_in_identifier35_data Count:(NSUInteger)1] retain];
+    FOLLOW_identifier_in_stat20 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_identifier_in_stat20_data Count:(NSUInteger)1] retain];
+    FOLLOW_ID_in_identifier35 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_ID_in_identifier35_data Count:(NSUInteger)1] retain];
 
-    [ANTLRBaseRecognizer setTokenNames:[[[NSArray alloc] initWithObjects:@"<invalid>", @"<EOR>", @"<DOWN>", @"<UP>", 
+    [BaseRecognizer setTokenNames:[[AMutableArray arrayWithObjects:@"<invalid>", @"<EOR>", @"<DOWN>", @"<UP>", 
  @"ID", @"INT", @"WS", nil] retain]];
+    [BaseRecognizer setGrammarFileName:@"/Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/combined/Combined.g"];
 }
 
-+ (CombinedParser *)newCombinedParser:(id<ANTLRTokenStream>)aStream
++ (CombinedParser *)newCombinedParser:(id<TokenStream>)aStream
 {
     return [[CombinedParser alloc] initWithTokenStream:aStream];
-
 }
 
-- (id) initWithTokenStream:(id<ANTLRTokenStream>)aStream
+- (id) initWithTokenStream:(id<TokenStream>)aStream
 {
-    if ((self = [super initWithTokenStream:aStream State:[[ANTLRRecognizerSharedState newANTLRRecognizerSharedStateWithRuleLen:2+1] retain]]) != nil) {
-
-
-
+    self = [super initWithTokenStream:aStream State:[[RecognizerSharedState newRecognizerSharedStateWithRuleLen:2+1] retain]];
+    if ( self != nil ) {
         /* start of actions-actionScope-init */
         /* start of init */
     }
@@ -106,25 +80,34 @@
 {
     [super dealloc];
 }
-// start actions.actionScope.methods
-// start methods()
-// start rules
+
+/* ObjC start actions.(actionScope).methods */
+/* ObjC end actions.(actionScope).methods */
+/* ObjC start methods() */
+/* ObjC end methods() */
+/* ObjC start rules */
 /*
  * $ANTLR start stat
- * Combined.g:7:1: stat : ( identifier )+ ;
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/combined/Combined.g:7:1: stat : ( identifier )+ ;
  */
 - (void) stat
 {
     /* ruleScopeSetUp */
 
+    /* ruleDeclarations */
+
     @try {
-        // Combined.g:7:5: ( ( identifier )+ ) // ruleBlockSingleAlt
-        // Combined.g:7:7: ( identifier )+ // alt
+        /* ruleLabelDefs entry */
+
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/combined/Combined.g:7:5: ( ( identifier )+ ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/combined/Combined.g:7:7: ( identifier )+ // alt
         {
-        // Combined.g:7:7: ( identifier )+ // positiveClosureBlock
-        NSInteger cnt1=0;
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/combined/Combined.g:7:7: ( identifier )+ // positiveClosureBlock
+        NSInteger cnt1 = 0;
         do {
-            NSInteger alt1=2;
+            NSInteger alt1 = 2;
             NSInteger LA1_0 = [input LA:1];
             if ( (LA1_0==ID) ) {
                 alt1=1;
@@ -133,72 +116,87 @@
 
             switch (alt1) {
                 case 1 : ;
-                    // Combined.g:7:7: identifier // alt
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/combined/Combined.g:7:7: identifier // alt
                     {
+
+                    /* ruleRef */
                     [self pushFollow:FOLLOW_identifier_in_stat20];
                     [self identifier];
+
                     [self popFollow];
 
-                      /* element() */
-                     /* elements */
+
+                     
                     }
                     break;
 
                 default :
                     if ( cnt1 >= 1 )
                         goto loop1;
-                    ANTLREarlyExitException *eee = [ANTLREarlyExitException exceptionWithStream:input decisionNumber:1];
+                    EarlyExitException *eee =
+                        [EarlyExitException newException:input decisionNumber:1];
                     @throw eee;
             }
             cnt1++;
         } while (YES);
         loop1: ;
-          /* element() */
-         /* elements */
+
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
-    }    @finally {
+    }
+
+    @finally {
+        /* ruleScopeCleanUp */
+
     }
     return ;
 }
 /* $ANTLR end stat */
+
 /*
  * $ANTLR start identifier
- * Combined.g:9:1: identifier : ID ;
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/combined/Combined.g:9:1: identifier : ID ;
  */
 - (void) identifier
 {
     /* ruleScopeSetUp */
 
+    /* ruleDeclarations */
+
     @try {
-        // Combined.g:10:5: ( ID ) // ruleBlockSingleAlt
-        // Combined.g:10:7: ID // alt
+        /* ruleLabelDefs entry */
+
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/combined/Combined.g:10:5: ( ID ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/combined/Combined.g:10:7: ID // alt
         {
-        [self match:input TokenType:ID Follow:FOLLOW_ID_in_identifier35];   /* element() */
-         /* elements */
+
+        [self match:input TokenType:ID Follow:FOLLOW_ID_in_identifier35]; 
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
-    }    @finally {
+    }
+
+    @finally {
+        /* ruleScopeCleanUp */
+
     }
     return ;
 }
 /* $ANTLR end identifier */
+/* ObjC end rules */
 
 @end /* end of CombinedParser implementation line 692 */
-
-
-/* End of code
- * =============================================================================
- */
diff --git a/runtime/ObjC/Framework/examples/combined/antlr3.h b/runtime/ObjC/Framework/examples/combined/antlr3.h
deleted file mode 100644
index 4f16279..0000000
--- a/runtime/ObjC/Framework/examples/combined/antlr3.h
+++ /dev/null
@@ -1,79 +0,0 @@
-#import <ANTLR/ANTLRBaseMapElement.h>
-#import <ANTLR/ANTLRBaseRecognizer.h>
-#import <ANTLR/ANTLRBaseStack.h>
-#import <ANTLR/ANTLRBaseTree.h>
-#import <ANTLR/ANTLRBaseTreeAdaptor.h>
-#import <ANTLR/ANTLRBitSet.h>
-#import <ANTLR/ANTLRBufferedTokenStream.h>
-#import <ANTLR/ANTLRBufferedTreeNodeStream.h>
-#import <ANTLR/ANTLRCharStream.h>
-#import <ANTLR/ANTLRCharStreamState.h>
-#import <ANTLR/ANTLRCommonErrorNode.h>
-#import <ANTLR/ANTLRCommonToken.h>
-#import <ANTLR/ANTLRCommonTokenStream.h>
-#import <ANTLR/ANTLRCommonTree.h>
-#import <ANTLR/ANTLRCommonTreeAdaptor.h>
-#import <ANTLR/ANTLRCommonTreeNodeStream.h>
-#import <ANTLR/ANTLRDFA.h>
-#import <ANTLR/ANTLRDebug.h>
-#import <ANTLR/ANTLRDebugEventProxy.h>
-#import <ANTLR/ANTLRDebugEventListener.h>
-#import <ANTLR/ANTLRDebugParser.h>
-#import <ANTLR/ANTLRDebugTokenStream.h>
-#import <ANTLR/ANTLRDebugTreeAdaptor.h>
-#import <ANTLR/ANTLRDebugTreeNodeStream.h>
-#import <ANTLR/ANTLRDebugTreeParser.h>
-#import <ANTLR/ANTLREarlyExitException.h>
-#import <ANTLR/ANTLRError.h>
-#import <ANTLR/ANTLRFailedPredicateException.h>
-#import <ANTLR/ANTLRFastQueue.h>
-#import <ANTLR/ANTLRHashMap.h>
-#import <ANTLR/ANTLRHashRule.h>
-#import <ANTLR/ANTLRIntArray.h>
-#import <ANTLR/ANTLRIntStream.h>
-#import <ANTLR/ANTLRLexer.h>
-#import <ANTLR/ANTLRLexerRuleReturnScope.h>
-#import <ANTLR/ANTLRLinkBase.h>
-#import <ANTLR/ANTLRLookaheadStream.h>
-#import <ANTLR/ANTLRMapElement.h>
-#import <ANTLR/ANTLRMap.h>
-#import <ANTLR/ANTLRMismatchedNotSetException.h>
-#import <ANTLR/ANTLRMismatchedRangeException.h>
-#import <ANTLR/ANTLRMismatchedSetException.h>
-#import <ANTLR/ANTLRMismatchedTokenException.h>
-#import <ANTLR/ANTLRMismatchedTreeNodeException.h>
-#import <ANTLR/ANTLRMissingTokenException.h>
-#import <ANTLR/ANTLRNodeMapElement.h>
-#import <ANTLR/ANTLRNoViableAltException.h>
-#import <ANTLR/ANTLRParser.h>
-#import <ANTLR/ANTLRParserRuleReturnScope.h>
-#import <ANTLR/ANTLRPtrBuffer.h>
-#import <ANTLR/ANTLRRecognitionException.h>
-#import <ANTLR/ANTLRRecognizerSharedState.h>
-#import <ANTLR/ANTLRRewriteRuleElementStream.h>
-#import <ANTLR/ANTLRRewriteRuleSubtreeStream.h>
-#import <ANTLR/ANTLRRewriteRuleTokenStream.h>
-#import <ANTLR/ANTLRRuleMemo.h>
-#import <ANTLR/ANTLRRuleStack.h>
-#import <ANTLR/ANTLRRuleReturnScope.h>
-#import <ANTLR/ANTLRRuntimeException.h>
-#import <ANTLR/ANTLRStreamEnumerator.h>
-#import <ANTLR/ANTLRStringStream.h>
-#import <ANTLR/ANTLRSymbolStack.h>
-#import <ANTLR/ANTLRToken+DebuggerSupport.h>
-#import <ANTLR/ANTLRToken.h>
-#import <ANTLR/ANTLRTokenRewriteStream.h>
-#import <ANTLR/ANTLRTokenSource.h>
-#import <ANTLR/ANTLRTokenStream.h>
-#import <ANTLR/ANTLRTree.h>
-#import <ANTLR/ANTLRTreeAdaptor.h>
-#import <ANTLR/ANTLRTreeException.h>
-#import <ANTLR/ANTLRTreeIterator.h>
-#import <ANTLR/ANTLRTreeNodeStream.h>
-#import <ANTLR/ANTLRTreeParser.h>
-#import <ANTLR/ANTLRTreeRuleReturnScope.h>
-#import <ANTLR/ANTLRUnbufferedTokenStream.h>
-//#import <ANTLR/ANTLRUnbufferedCommonTreeNodeStream.h>
-//#import <ANTLR/ANTLRUnbufferedCommonTreeNodeStreamState.h>
-#import <ANTLR/ANTLRUniqueIDMap.h>
-#import <ANTLR/ANTLRUnwantedTokenException.h>
diff --git a/runtime/ObjC/Framework/examples/combined/main.m b/runtime/ObjC/Framework/examples/combined/main.m
index 7fb5bd2..fc48224 100644
--- a/runtime/ObjC/Framework/examples/combined/main.m
+++ b/runtime/ObjC/Framework/examples/combined/main.m
@@ -1,6 +1,6 @@
-#import <Cocoa/Cocoa.h>
+#import <Foundation/Foundation.h>
 #import "CombinedLexer.h"
-#import "antlr3.h"
+#import <ANTLR/ANTLR.h>
 
 int main(int argc, const char * argv[])
 {
@@ -10,8 +10,8 @@
 	NSLog(@"%@", string);
 	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:string];
 	CombinedLexer *lexer = [CombinedLexer newCombinedLexerWithCharStream:stream];
-	id<ANTLRToken> currentToken;
-	while ((currentToken = [lexer nextToken]) && [currentToken getType] != ANTLRTokenTypeEOF) {
+	id<Token> currentToken;
+	while ((currentToken = [lexer nextToken]) && currentToken.type != TokenTypeEOF) {
 		NSLog(@"%@", currentToken);
 	}
 	[lexer release];
diff --git a/runtime/ObjC/Framework/examples/combined/output1/Combined.tokens b/runtime/ObjC/Framework/examples/combined/output1/Combined.tokens
deleted file mode 100644
index b22f459..0000000
--- a/runtime/ObjC/Framework/examples/combined/output1/Combined.tokens
+++ /dev/null
@@ -1,3 +0,0 @@
-WS=6
-INT=5
-ID=4
diff --git a/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.h b/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.h
index 2b255a6..cfb8eae 100644
--- a/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.h
+++ b/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.h
@@ -1,9 +1,9 @@
-// $ANTLR ${project.version} ${buildNumber} /Users/acondit/source/antlr3/acondit_localhost/code/antlr/antlr3-main/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g 2011-05-05 22:05:01
+// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g 2012-02-16 17:34:08
 
 /* =============================================================================
- * Standard antlr3 OBJC runtime definitions
+ * Standard antlr OBJC runtime definitions
  */
-#import <Cocoa/Cocoa.h>
+#import <Foundation/Foundation.h>
 #import <ANTLR/ANTLR.h>
 /* End of standard antlr3 runtime definitions
  * =============================================================================
@@ -11,8 +11,8 @@
 
 /* Start cyclicDFAInterface */
 
-#pragma mark Rule return scopes start
-#pragma mark Rule return scopes end
+#pragma mark Rule return scopes Interface start
+#pragma mark Rule return scopes Interface end
 #pragma mark Tokens
 #ifdef EOF
 #undef EOF
@@ -37,7 +37,7 @@
 #define TYPE 20
 #define WS 21
 /* interface lexer class */
-@interface Fuzzy : ANTLRLexer { // line 283
+@interface Fuzzy : Lexer { // line 283
 SEL synpred9_FuzzySelector;
 SEL synpred2_FuzzySelector;
 SEL synpred7_FuzzySelector;
@@ -51,7 +51,7 @@
 /* ObjC end of actions.lexer.memVars */
 }
 + (void) initialize;
-+ (Fuzzy *)newFuzzyWithCharStream:(id<ANTLRCharStream>)anInput;
++ (Fuzzy *)newFuzzyWithCharStream:(id<CharStream>)anInput;
 /* ObjC start actions.lexer.methodsDecl */
 /* ObjC end actions.lexer.methodsDecl */
 - (void) mIMPORT ; 
diff --git a/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.m b/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.m
index 665f412..151974c 100644
--- a/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.m
+++ b/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.m
@@ -1,8 +1,8 @@
 /** \file
- *  This OBJC source file was generated by $ANTLR version ${project.version} ${buildNumber}
+ *  This OBJC source file was generated by $ANTLR version 3.4
  *
- *     -  From the grammar source file : Fuzzy.g
- *     -                            On : 2011-05-06 11:47:46
+ *     -  From the grammar source file : /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g
+ *     -                            On : 2012-02-16 17:34:08
  *     -                 for the lexer : FuzzyLexer
  *
  * Editing it, at least manually, is not wise.
@@ -11,7 +11,7 @@
  *
  *
 */
-// $ANTLR ${project.version} ${buildNumber} Fuzzy.g 2011-05-06 11:47:46
+// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g 2012-02-16 17:34:08
 
 
 /* -----------------------------------------
@@ -31,7 +31,7 @@
 
 + (void) initialize
 {
-    [ANTLRBaseRecognizer setGrammarFileName:@"Fuzzy.g"];
+    [BaseRecognizer setGrammarFileName:@"/Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g"];
 }
 
 + (NSString *) tokenNameForType:(NSInteger)aTokenType
@@ -39,14 +39,14 @@
     return [[self getTokenNames] objectAtIndex:aTokenType];
 }
 
-+ (Fuzzy *)newFuzzyWithCharStream:(id<ANTLRCharStream>)anInput
++ (Fuzzy *)newFuzzyWithCharStream:(id<CharStream>)anInput
 {
     return [[Fuzzy alloc] initWithCharStream:anInput];
 }
 
-- (id) initWithCharStream:(id<ANTLRCharStream>)anInput
+- (id) initWithCharStream:(id<CharStream>)anInput
 {
-    self = [super initWithCharStream:anInput State:[[ANTLRRecognizerSharedState newANTLRRecognizerSharedStateWithRuleLen:30+1] retain]];
+    self = [super initWithCharStream:anInput State:[RecognizerSharedState newRecognizerSharedStateWithRuleLen:30+1]];
     if ( self != nil ) {
         SEL synpred9_FuzzySelector = @selector(synpred9_Fuzzy_fragment);
 
@@ -80,17 +80,17 @@
 /* ObjC start methods() */
 /* ObjC end methods() */
 
-- (id<ANTLRToken>) nextToken
+- (id<Token>) nextToken
 {
     while (YES) {
-        if ( [input LA:1] == ANTLRCharStreamEOF ) {
-            return [ANTLRCommonToken eofToken];
+        if ( [input LA:1] == CharStreamEOF ) {
+            return [CommonToken eofToken];
         }
         state.token = nil;
-        state.channel = ANTLRTokenChannelDefault;
+        state.channel = TokenChannelDefault;
         state.tokenStartCharIndex = input.index;
-        state.tokenStartCharPositionInLine = input.charPositionInLine;
-        state.tokenStartLine = input.line;
+        state.tokenStartCharPositionInLine = [input getCharPositionInLine];
+        state.tokenStartLine = [input getLine];
         state.text = nil;
         @try {
             NSInteger m = [input mark];
@@ -108,7 +108,7 @@
                 return state.token;
             }
         }
-        @catch (ANTLRRecognitionException *re) {
+        @catch (RecognitionException *re) {
             // shouldn't happen in backtracking mode, but...
             [self reportError:re];
             [self recover:re];
@@ -116,14 +116,14 @@
     }
 }
 
-- (void)memoize:(id<ANTLRIntStream>)anInput
+- (void)memoize:(id<IntStream>)anInput
       RuleIndex:(NSInteger)ruleIndex
      StartIndex:(NSInteger)ruleStartIndex
 {
     if ( state.backtracking > 1 ) [super memoize:anInput RuleIndex:ruleIndex StartIndex:ruleStartIndex];
 }
 
-- (BOOL)alreadyParsedRule:(id<ANTLRIntStream>)anInput RuleIndex:(NSInteger)ruleIndex
+- (BOOL)alreadyParsedRule:(id<IntStream>)anInput RuleIndex:(NSInteger)ruleIndex
 {
     if ( state.backtracking > 1 ) return [super alreadyParsedRule:anInput RuleIndex:ruleIndex];
     return NO;
@@ -133,33 +133,38 @@
 - (void) mIMPORT
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = IMPORT;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        ANTLRCommonToken *name=nil;
+        NSInteger _channel = TokenChannelDefault;
+        CommonToken *name=nil;
 
-        // Fuzzy.g:5:2: ( 'import' WS name= QIDStar ( WS )? ';' ) // ruleBlockSingleAlt
-        // Fuzzy.g:5:4: 'import' WS name= QIDStar ( WS )? ';' // alt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:5:2: ( 'import' WS name= QIDStar ( WS )? ';' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:5:4: 'import' WS name= QIDStar ( WS )? ';' // alt
         {
+
+
         [self matchString:@"import"]; if ( state.failed ) return ;
 
 
+         
 
         [self mWS]; if ( state.failed ) return ;
 
 
+         
 
         NSInteger nameStart31 = input.index;
         [self mQIDStar]; if ( state.failed ) return ;
 
-        name = [[ANTLRCommonToken newToken:input Type:ANTLRTokenTypeInvalid Channel:ANTLRTokenChannelDefault Start:nameStart31 Stop:input.index-1] retain];
+        name = [[CommonToken newToken:input Type:TokenTypeInvalid Channel:TokenChannelDefault Start:nameStart31 Stop:input.index-1] retain];
         name.line = self.line;
 
-
-        // Fuzzy.g:5:29: ( WS )? // block
+         
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:5:29: ( WS )? // block
         NSInteger alt1=2;
         NSInteger LA1_0 = [input LA:1];
 
@@ -168,54 +173,59 @@
         }
         switch (alt1) {
             case 1 : ;
-                // Fuzzy.g:5:29: WS // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:5:29: WS // alt
                 {
+
+
                 [self mWS]; if ( state.failed ) return ;
 
 
-
+                 
                 }
                 break;
 
         }
 
+         
 
         [self matchChar:';']; if ( state.failed ) return ;
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "IMPORT" */
-
 // $ANTLR start "RETURN"
 - (void) mRETURN
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = RETURN;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // Fuzzy.g:10:2: ( 'return' ( options {greedy=false; } : . )* ';' ) // ruleBlockSingleAlt
-        // Fuzzy.g:10:4: 'return' ( options {greedy=false; } : . )* ';' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:10:2: ( 'return' ( options {greedy=false; } : . )* ';' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:10:4: 'return' ( options {greedy=false; } : . )* ';' // alt
         {
+
+
         [self matchString:@"return"]; if ( state.failed ) return ;
 
 
+         
 
         do {
             NSInteger alt2=2;
@@ -230,11 +240,12 @@
 
             switch (alt2) {
                 case 1 : ;
-                    // Fuzzy.g:10:38: . // alt
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:10:38: . // alt
                     {
+
                     [self matchAny]; if ( state.failed ) return ;
 
-
+                     
                     }
                     break;
 
@@ -244,58 +255,62 @@
         } while (YES);
         loop2: ;
 
+         
 
         [self matchChar:';']; if ( state.failed ) return ;
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "RETURN" */
-
 // $ANTLR start "CLASS"
 - (void) mCLASS
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = CLASS;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        ANTLRCommonToken *name=nil;
+        NSInteger _channel = TokenChannelDefault;
+        CommonToken *name=nil;
 
-        // Fuzzy.g:14:2: ( 'class' WS name= ID ( WS )? ( 'extends' WS QID ( WS )? )? ( 'implements' WS QID ( WS )? ( ',' ( WS )? QID ( WS )? )* )? '{' ) // ruleBlockSingleAlt
-        // Fuzzy.g:14:4: 'class' WS name= ID ( WS )? ( 'extends' WS QID ( WS )? )? ( 'implements' WS QID ( WS )? ( ',' ( WS )? QID ( WS )? )* )? '{' // alt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:14:2: ( 'class' WS name= ID ( WS )? ( 'extends' WS QID ( WS )? )? ( 'implements' WS QID ( WS )? ( ',' ( WS )? QID ( WS )? )* )? '{' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:14:4: 'class' WS name= ID ( WS )? ( 'extends' WS QID ( WS )? )? ( 'implements' WS QID ( WS )? ( ',' ( WS )? QID ( WS )? )* )? '{' // alt
         {
+
+
         [self matchString:@"class"]; if ( state.failed ) return ;
 
 
+         
 
         [self mWS]; if ( state.failed ) return ;
 
 
+         
 
         NSInteger nameStart81 = input.index;
         [self mID]; if ( state.failed ) return ;
 
-        name = [[ANTLRCommonToken newToken:input Type:ANTLRTokenTypeInvalid Channel:ANTLRTokenChannelDefault Start:nameStart81 Stop:input.index-1] retain];
+        name = [[CommonToken newToken:input Type:TokenTypeInvalid Channel:TokenChannelDefault Start:nameStart81 Stop:input.index-1] retain];
         name.line = self.line;
 
-
-        // Fuzzy.g:14:23: ( WS )? // block
+         
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:14:23: ( WS )? // block
         NSInteger alt3=2;
         NSInteger LA3_0 = [input LA:1];
 
@@ -304,19 +319,21 @@
         }
         switch (alt3) {
             case 1 : ;
-                // Fuzzy.g:14:23: WS // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:14:23: WS // alt
                 {
+
+
                 [self mWS]; if ( state.failed ) return ;
 
 
-
+                 
                 }
                 break;
 
         }
 
-
-        // Fuzzy.g:14:27: ( 'extends' WS QID ( WS )? )? // block
+         
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:14:27: ( 'extends' WS QID ( WS )? )? // block
         NSInteger alt5=2;
         NSInteger LA5_0 = [input LA:1];
 
@@ -325,21 +342,25 @@
         }
         switch (alt5) {
             case 1 : ;
-                // Fuzzy.g:14:28: 'extends' WS QID ( WS )? // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:14:28: 'extends' WS QID ( WS )? // alt
                 {
+
+
                 [self matchString:@"extends"]; if ( state.failed ) return ;
 
 
+                 
 
                 [self mWS]; if ( state.failed ) return ;
 
 
+                 
 
                 [self mQID]; if ( state.failed ) return ;
 
 
-
-                // Fuzzy.g:14:45: ( WS )? // block
+                 
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:14:45: ( WS )? // block
                 NSInteger alt4=2;
                 NSInteger LA4_0 = [input LA:1];
 
@@ -348,25 +369,27 @@
                 }
                 switch (alt4) {
                     case 1 : ;
-                        // Fuzzy.g:14:45: WS // alt
+                        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:14:45: WS // alt
                         {
+
+
                         [self mWS]; if ( state.failed ) return ;
 
 
-
+                         
                         }
                         break;
 
                 }
 
-
+                 
                 }
                 break;
 
         }
 
-
-        // Fuzzy.g:15:3: ( 'implements' WS QID ( WS )? ( ',' ( WS )? QID ( WS )? )* )? // block
+         
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:15:3: ( 'implements' WS QID ( WS )? ( ',' ( WS )? QID ( WS )? )* )? // block
         NSInteger alt10=2;
         NSInteger LA10_0 = [input LA:1];
 
@@ -375,21 +398,25 @@
         }
         switch (alt10) {
             case 1 : ;
-                // Fuzzy.g:15:4: 'implements' WS QID ( WS )? ( ',' ( WS )? QID ( WS )? )* // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:15:4: 'implements' WS QID ( WS )? ( ',' ( WS )? QID ( WS )? )* // alt
                 {
+
+
                 [self matchString:@"implements"]; if ( state.failed ) return ;
 
 
+                 
 
                 [self mWS]; if ( state.failed ) return ;
 
 
+                 
 
                 [self mQID]; if ( state.failed ) return ;
 
 
-
-                // Fuzzy.g:15:24: ( WS )? // block
+                 
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:15:24: ( WS )? // block
                 NSInteger alt6=2;
                 NSInteger LA6_0 = [input LA:1];
 
@@ -398,17 +425,20 @@
                 }
                 switch (alt6) {
                     case 1 : ;
-                        // Fuzzy.g:15:24: WS // alt
+                        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:15:24: WS // alt
                         {
+
+
                         [self mWS]; if ( state.failed ) return ;
 
 
-
+                         
                         }
                         break;
 
                 }
 
+                 
 
                 do {
                     NSInteger alt9=2;
@@ -420,12 +450,14 @@
 
                     switch (alt9) {
                         case 1 : ;
-                            // Fuzzy.g:15:29: ',' ( WS )? QID ( WS )? // alt
+                            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:15:29: ',' ( WS )? QID ( WS )? // alt
                             {
+
+
                             [self matchChar:',']; if ( state.failed ) return ;
 
-
-                            // Fuzzy.g:15:33: ( WS )? // block
+                             
+                            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:15:33: ( WS )? // block
                             NSInteger alt7=2;
                             NSInteger LA7_0 = [input LA:1];
 
@@ -434,23 +466,26 @@
                             }
                             switch (alt7) {
                                 case 1 : ;
-                                    // Fuzzy.g:15:33: WS // alt
+                                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:15:33: WS // alt
                                     {
+
+
                                     [self mWS]; if ( state.failed ) return ;
 
 
-
+                                     
                                     }
                                     break;
 
                             }
 
+                             
 
                             [self mQID]; if ( state.failed ) return ;
 
 
-
-                            // Fuzzy.g:15:41: ( WS )? // block
+                             
+                            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:15:41: ( WS )? // block
                             NSInteger alt8=2;
                             NSInteger LA8_0 = [input LA:1];
 
@@ -459,18 +494,20 @@
                             }
                             switch (alt8) {
                                 case 1 : ;
-                                    // Fuzzy.g:15:41: WS // alt
+                                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:15:41: WS // alt
                                     {
+
+
                                     [self mWS]; if ( state.failed ) return ;
 
 
-
+                                     
                                     }
                                     break;
 
                             }
 
-
+                             
                             }
                             break;
 
@@ -480,69 +517,74 @@
                 } while (YES);
                 loop9: ;
 
-
+                 
                 }
                 break;
 
         }
 
+         
 
         [self matchChar:'{']; if ( state.failed ) return ;
 
+         
 
         if ( state.backtracking == 1 ) {
             NSLog(@"found class %@", (name!=nil?name.text:nil));
         }
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "CLASS" */
-
 // $ANTLR start "METHOD"
 - (void) mMETHOD
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = METHOD;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        ANTLRCommonToken *name=nil;
+        NSInteger _channel = TokenChannelDefault;
+        CommonToken *name=nil;
 
-        // Fuzzy.g:20:5: ( TYPE WS name= ID ( WS )? '(' ( ARG ( WS )? ( ',' ( WS )? ARG ( WS )? )* )? ')' ( WS )? ( 'throws' WS QID ( WS )? ( ',' ( WS )? QID ( WS )? )* )? '{' ) // ruleBlockSingleAlt
-        // Fuzzy.g:20:9: TYPE WS name= ID ( WS )? '(' ( ARG ( WS )? ( ',' ( WS )? ARG ( WS )? )* )? ')' ( WS )? ( 'throws' WS QID ( WS )? ( ',' ( WS )? QID ( WS )? )* )? '{' // alt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:20:5: ( TYPE WS name= ID ( WS )? '(' ( ARG ( WS )? ( ',' ( WS )? ARG ( WS )? )* )? ')' ( WS )? ( 'throws' WS QID ( WS )? ( ',' ( WS )? QID ( WS )? )* )? '{' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:20:9: TYPE WS name= ID ( WS )? '(' ( ARG ( WS )? ( ',' ( WS )? ARG ( WS )? )* )? ')' ( WS )? ( 'throws' WS QID ( WS )? ( ',' ( WS )? QID ( WS )? )* )? '{' // alt
         {
+
+
         [self mTYPE]; if ( state.failed ) return ;
 
 
+         
 
         [self mWS]; if ( state.failed ) return ;
 
 
+         
 
         NSInteger nameStart158 = input.index;
         [self mID]; if ( state.failed ) return ;
 
-        name = [[ANTLRCommonToken newToken:input Type:ANTLRTokenTypeInvalid Channel:ANTLRTokenChannelDefault Start:nameStart158 Stop:input.index-1] retain];
+        name = [[CommonToken newToken:input Type:TokenTypeInvalid Channel:TokenChannelDefault Start:nameStart158 Stop:input.index-1] retain];
         name.line = self.line;
 
-
-        // Fuzzy.g:20:25: ( WS )? // block
+         
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:20:25: ( WS )? // block
         NSInteger alt11=2;
         NSInteger LA11_0 = [input LA:1];
 
@@ -551,22 +593,25 @@
         }
         switch (alt11) {
             case 1 : ;
-                // Fuzzy.g:20:25: WS // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:20:25: WS // alt
                 {
+
+
                 [self mWS]; if ( state.failed ) return ;
 
 
-
+                 
                 }
                 break;
 
         }
 
+         
 
         [self matchChar:'(']; if ( state.failed ) return ;
 
-
-        // Fuzzy.g:20:33: ( ARG ( WS )? ( ',' ( WS )? ARG ( WS )? )* )? // block
+         
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:20:33: ( ARG ( WS )? ( ',' ( WS )? ARG ( WS )? )* )? // block
         NSInteger alt16=2;
         NSInteger LA16_0 = [input LA:1];
 
@@ -575,13 +620,15 @@
         }
         switch (alt16) {
             case 1 : ;
-                // Fuzzy.g:20:35: ARG ( WS )? ( ',' ( WS )? ARG ( WS )? )* // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:20:35: ARG ( WS )? ( ',' ( WS )? ARG ( WS )? )* // alt
                 {
+
+
                 [self mARG]; if ( state.failed ) return ;
 
 
-
-                // Fuzzy.g:20:39: ( WS )? // block
+                 
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:20:39: ( WS )? // block
                 NSInteger alt12=2;
                 NSInteger LA12_0 = [input LA:1];
 
@@ -590,17 +637,20 @@
                 }
                 switch (alt12) {
                     case 1 : ;
-                        // Fuzzy.g:20:39: WS // alt
+                        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:20:39: WS // alt
                         {
+
+
                         [self mWS]; if ( state.failed ) return ;
 
 
-
+                         
                         }
                         break;
 
                 }
 
+                 
 
                 do {
                     NSInteger alt15=2;
@@ -612,12 +662,14 @@
 
                     switch (alt15) {
                         case 1 : ;
-                            // Fuzzy.g:20:44: ',' ( WS )? ARG ( WS )? // alt
+                            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:20:44: ',' ( WS )? ARG ( WS )? // alt
                             {
+
+
                             [self matchChar:',']; if ( state.failed ) return ;
 
-
-                            // Fuzzy.g:20:48: ( WS )? // block
+                             
+                            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:20:48: ( WS )? // block
                             NSInteger alt13=2;
                             NSInteger LA13_0 = [input LA:1];
 
@@ -626,23 +678,26 @@
                             }
                             switch (alt13) {
                                 case 1 : ;
-                                    // Fuzzy.g:20:48: WS // alt
+                                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:20:48: WS // alt
                                     {
+
+
                                     [self mWS]; if ( state.failed ) return ;
 
 
-
+                                     
                                     }
                                     break;
 
                             }
 
+                             
 
                             [self mARG]; if ( state.failed ) return ;
 
 
-
-                            // Fuzzy.g:20:56: ( WS )? // block
+                             
+                            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:20:56: ( WS )? // block
                             NSInteger alt14=2;
                             NSInteger LA14_0 = [input LA:1];
 
@@ -651,18 +706,20 @@
                             }
                             switch (alt14) {
                                 case 1 : ;
-                                    // Fuzzy.g:20:56: WS // alt
+                                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:20:56: WS // alt
                                     {
+
+
                                     [self mWS]; if ( state.failed ) return ;
 
 
-
+                                     
                                     }
                                     break;
 
                             }
 
-
+                             
                             }
                             break;
 
@@ -672,17 +729,18 @@
                 } while (YES);
                 loop15: ;
 
-
+                 
                 }
                 break;
 
         }
 
+         
 
         [self matchChar:')']; if ( state.failed ) return ;
 
-
-        // Fuzzy.g:20:69: ( WS )? // block
+         
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:20:69: ( WS )? // block
         NSInteger alt17=2;
         NSInteger LA17_0 = [input LA:1];
 
@@ -691,19 +749,21 @@
         }
         switch (alt17) {
             case 1 : ;
-                // Fuzzy.g:20:69: WS // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:20:69: WS // alt
                 {
+
+
                 [self mWS]; if ( state.failed ) return ;
 
 
-
+                 
                 }
                 break;
 
         }
 
-
-        // Fuzzy.g:21:8: ( 'throws' WS QID ( WS )? ( ',' ( WS )? QID ( WS )? )* )? // block
+         
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:21:8: ( 'throws' WS QID ( WS )? ( ',' ( WS )? QID ( WS )? )* )? // block
         NSInteger alt22=2;
         NSInteger LA22_0 = [input LA:1];
 
@@ -712,21 +772,25 @@
         }
         switch (alt22) {
             case 1 : ;
-                // Fuzzy.g:21:9: 'throws' WS QID ( WS )? ( ',' ( WS )? QID ( WS )? )* // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:21:9: 'throws' WS QID ( WS )? ( ',' ( WS )? QID ( WS )? )* // alt
                 {
+
+
                 [self matchString:@"throws"]; if ( state.failed ) return ;
 
 
+                 
 
                 [self mWS]; if ( state.failed ) return ;
 
 
+                 
 
                 [self mQID]; if ( state.failed ) return ;
 
 
-
-                // Fuzzy.g:21:25: ( WS )? // block
+                 
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:21:25: ( WS )? // block
                 NSInteger alt18=2;
                 NSInteger LA18_0 = [input LA:1];
 
@@ -735,17 +799,20 @@
                 }
                 switch (alt18) {
                     case 1 : ;
-                        // Fuzzy.g:21:25: WS // alt
+                        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:21:25: WS // alt
                         {
+
+
                         [self mWS]; if ( state.failed ) return ;
 
 
-
+                         
                         }
                         break;
 
                 }
 
+                 
 
                 do {
                     NSInteger alt21=2;
@@ -757,12 +824,14 @@
 
                     switch (alt21) {
                         case 1 : ;
-                            // Fuzzy.g:21:30: ',' ( WS )? QID ( WS )? // alt
+                            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:21:30: ',' ( WS )? QID ( WS )? // alt
                             {
+
+
                             [self matchChar:',']; if ( state.failed ) return ;
 
-
-                            // Fuzzy.g:21:34: ( WS )? // block
+                             
+                            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:21:34: ( WS )? // block
                             NSInteger alt19=2;
                             NSInteger LA19_0 = [input LA:1];
 
@@ -771,23 +840,26 @@
                             }
                             switch (alt19) {
                                 case 1 : ;
-                                    // Fuzzy.g:21:34: WS // alt
+                                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:21:34: WS // alt
                                     {
+
+
                                     [self mWS]; if ( state.failed ) return ;
 
 
-
+                                     
                                     }
                                     break;
 
                             }
 
+                             
 
                             [self mQID]; if ( state.failed ) return ;
 
 
-
-                            // Fuzzy.g:21:42: ( WS )? // block
+                             
+                            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:21:42: ( WS )? // block
                             NSInteger alt20=2;
                             NSInteger LA20_0 = [input LA:1];
 
@@ -796,18 +868,20 @@
                             }
                             switch (alt20) {
                                 case 1 : ;
-                                    // Fuzzy.g:21:42: WS // alt
+                                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:21:42: WS // alt
                                     {
+
+
                                     [self mWS]; if ( state.failed ) return ;
 
 
-
+                                     
                                     }
                                     break;
 
                             }
 
-
+                             
                             }
                             break;
 
@@ -817,69 +891,74 @@
                 } while (YES);
                 loop21: ;
 
-
+                 
                 }
                 break;
 
         }
 
+         
 
         [self matchChar:'{']; if ( state.failed ) return ;
 
+         
 
         if ( state.backtracking == 1 ) {
             NSLog(@"found method %@", (name!=nil?name.text:nil));
         }
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "METHOD" */
-
 // $ANTLR start "FIELD"
 - (void) mFIELD
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = FIELD;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        ANTLRCommonToken *name=nil;
+        NSInteger _channel = TokenChannelDefault;
+        CommonToken *name=nil;
 
-        // Fuzzy.g:26:5: ( TYPE WS name= ID ( '[]' )? ( WS )? ( ';' | '=' ) ) // ruleBlockSingleAlt
-        // Fuzzy.g:26:9: TYPE WS name= ID ( '[]' )? ( WS )? ( ';' | '=' ) // alt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:26:5: ( TYPE WS name= ID ( '[]' )? ( WS )? ( ';' | '=' ) ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:26:9: TYPE WS name= ID ( '[]' )? ( WS )? ( ';' | '=' ) // alt
         {
+
+
         [self mTYPE]; if ( state.failed ) return ;
 
 
+         
 
         [self mWS]; if ( state.failed ) return ;
 
 
+         
 
         NSInteger nameStart261 = input.index;
         [self mID]; if ( state.failed ) return ;
 
-        name = [[ANTLRCommonToken newToken:input Type:ANTLRTokenTypeInvalid Channel:ANTLRTokenChannelDefault Start:nameStart261 Stop:input.index-1] retain];
+        name = [[CommonToken newToken:input Type:TokenTypeInvalid Channel:TokenChannelDefault Start:nameStart261 Stop:input.index-1] retain];
         name.line = self.line;
 
-
-        // Fuzzy.g:26:25: ( '[]' )? // block
+         
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:26:25: ( '[]' )? // block
         NSInteger alt23=2;
         NSInteger LA23_0 = [input LA:1];
 
@@ -888,19 +967,21 @@
         }
         switch (alt23) {
             case 1 : ;
-                // Fuzzy.g:26:25: '[]' // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:26:25: '[]' // alt
                 {
+
+
                 [self matchString:@"[]"]; if ( state.failed ) return ;
 
 
-
+                 
                 }
                 break;
 
         }
 
-
-        // Fuzzy.g:26:31: ( WS )? // block
+         
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:26:31: ( WS )? // block
         NSInteger alt24=2;
         NSInteger LA24_0 = [input LA:1];
 
@@ -909,18 +990,20 @@
         }
         switch (alt24) {
             case 1 : ;
-                // Fuzzy.g:26:31: WS // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:26:31: WS // alt
                 {
+
+
                 [self mWS]; if ( state.failed ) return ;
 
 
-
+                 
                 }
                 break;
 
         }
 
-
+         
         if ([input LA:1] == ';'||[input LA:1] == '=') {
             [input consume];
             state.failed = NO;
@@ -928,48 +1011,49 @@
         } else {
             if ( state.backtracking > 0 ) { state.failed = YES; return ; }
 
-            ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException newException:nil stream:input];
+            MismatchedSetException *mse = [MismatchedSetException newException:nil stream:input];
             [self recover:mse];
             @throw mse;
         }
 
+         
 
         if ( state.backtracking == 1 ) {
             NSLog(@"found var %@", (name!=nil?name.text:nil));
         }
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "FIELD" */
-
 // $ANTLR start "STAT"
 - (void) mSTAT
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = STAT;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // Fuzzy.g:30:5: ( ( 'if' | 'while' | 'switch' | 'for' ) ( WS )? '(' ) // ruleBlockSingleAlt
-        // Fuzzy.g:30:7: ( 'if' | 'while' | 'switch' | 'for' ) ( WS )? '(' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:30:5: ( ( 'if' | 'while' | 'switch' | 'for' ) ( WS )? '(' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:30:7: ( 'if' | 'while' | 'switch' | 'for' ) ( WS )? '(' // alt
         {
-        // Fuzzy.g:30:7: ( 'if' | 'while' | 'switch' | 'for' ) // block
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:30:7: ( 'if' | 'while' | 'switch' | 'for' ) // block
         NSInteger alt25=4;
         unichar charLA25 = [input LA:1];
         switch (charLA25) {
@@ -997,7 +1081,7 @@
         default: ;
             if ( state.backtracking > 0 ) { state.failed = YES; return ; }
 
-            ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newException:25 state:0 stream:input];
+            NoViableAltException *nvae = [NoViableAltException newException:25 state:0 stream:input];
             nvae.c = charLA25;
             @throw nvae;
 
@@ -1005,46 +1089,54 @@
 
         switch (alt25) {
             case 1 : ;
-                // Fuzzy.g:30:8: 'if' // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:30:8: 'if' // alt
                 {
+
+
                 [self matchString:@"if"]; if ( state.failed ) return ;
 
 
-
+                 
                 }
                 break;
             case 2 : ;
-                // Fuzzy.g:30:13: 'while' // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:30:13: 'while' // alt
                 {
+
+
                 [self matchString:@"while"]; if ( state.failed ) return ;
 
 
-
+                 
                 }
                 break;
             case 3 : ;
-                // Fuzzy.g:30:21: 'switch' // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:30:21: 'switch' // alt
                 {
+
+
                 [self matchString:@"switch"]; if ( state.failed ) return ;
 
 
-
+                 
                 }
                 break;
             case 4 : ;
-                // Fuzzy.g:30:30: 'for' // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:30:30: 'for' // alt
                 {
+
+
                 [self matchString:@"for"]; if ( state.failed ) return ;
 
 
-
+                 
                 }
                 break;
 
         }
 
-
-        // Fuzzy.g:30:37: ( WS )? // block
+         
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:30:37: ( WS )? // block
         NSInteger alt26=2;
         NSInteger LA26_0 = [input LA:1];
 
@@ -1053,61 +1145,65 @@
         }
         switch (alt26) {
             case 1 : ;
-                // Fuzzy.g:30:37: WS // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:30:37: WS // alt
                 {
+
+
                 [self mWS]; if ( state.failed ) return ;
 
 
-
+                 
                 }
                 break;
 
         }
 
+         
 
         [self matchChar:'(']; if ( state.failed ) return ;
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "STAT" */
-
 // $ANTLR start "CALL"
 - (void) mCALL
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = CALL;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        ANTLRCommonToken *name=nil;
+        NSInteger _channel = TokenChannelDefault;
+        CommonToken *name=nil;
 
-        // Fuzzy.g:33:5: (name= QID ( WS )? '(' ) // ruleBlockSingleAlt
-        // Fuzzy.g:33:9: name= QID ( WS )? '(' // alt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:33:5: (name= QID ( WS )? '(' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:33:9: name= QID ( WS )? '(' // alt
         {
+
+
         NSInteger nameStart326 = input.index;
         [self mQID]; if ( state.failed ) return ;
 
-        name = [[ANTLRCommonToken newToken:input Type:ANTLRTokenTypeInvalid Channel:ANTLRTokenChannelDefault Start:nameStart326 Stop:input.index-1] retain];
+        name = [[CommonToken newToken:input Type:TokenTypeInvalid Channel:TokenChannelDefault Start:nameStart326 Stop:input.index-1] retain];
         name.line = self.line;
 
-
-        // Fuzzy.g:33:18: ( WS )? // block
+         
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:33:18: ( WS )? // block
         NSInteger alt27=2;
         NSInteger LA27_0 = [input LA:1];
 
@@ -1116,59 +1212,65 @@
         }
         switch (alt27) {
             case 1 : ;
-                // Fuzzy.g:33:18: WS // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:33:18: WS // alt
                 {
+
+
                 [self mWS]; if ( state.failed ) return ;
 
 
-
+                 
                 }
                 break;
 
         }
 
+         
 
         [self matchChar:'(']; if ( state.failed ) return ;
 
+         
 
         if ( state.backtracking == 1 ) {
             /*ignore if this/super */ NSLog(@"found call %@",(name!=nil?name.text:nil));
         }
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "CALL" */
-
 // $ANTLR start "COMMENT"
 - (void) mCOMMENT
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = COMMENT;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // Fuzzy.g:38:5: ( '/*' ( options {greedy=false; } : . )* '*/' ) // ruleBlockSingleAlt
-        // Fuzzy.g:38:9: '/*' ( options {greedy=false; } : . )* '*/' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:38:5: ( '/*' ( options {greedy=false; } : . )* '*/' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:38:9: '/*' ( options {greedy=false; } : . )* '*/' // alt
         {
+
+
         [self matchString:@"/*"]; if ( state.failed ) return ;
 
 
+         
 
         do {
             NSInteger alt28=2;
@@ -1191,11 +1293,12 @@
 
             switch (alt28) {
                 case 1 : ;
-                    // Fuzzy.g:38:41: . // alt
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:38:41: . // alt
                     {
+
                     [self matchAny]; if ( state.failed ) return ;
 
-
+                     
                     }
                     break;
 
@@ -1205,49 +1308,53 @@
         } while (YES);
         loop28: ;
 
+         
 
         [self matchString:@"*/"]; if ( state.failed ) return ;
 
 
+         
 
         if ( state.backtracking == 1 ) {
             NSLog(@"found comment %@", [self text]);
         }
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "COMMENT" */
-
 // $ANTLR start "SL_COMMENT"
 - (void) mSL_COMMENT
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = SL_COMMENT;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // Fuzzy.g:43:5: ( '//' ( options {greedy=false; } : . )* '\\n' ) // ruleBlockSingleAlt
-        // Fuzzy.g:43:9: '//' ( options {greedy=false; } : . )* '\\n' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:43:5: ( '//' ( options {greedy=false; } : . )* '\\n' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:43:9: '//' ( options {greedy=false; } : . )* '\\n' // alt
         {
+
+
         [self matchString:@"//"]; if ( state.failed ) return ;
 
 
+         
 
         do {
             NSInteger alt29=2;
@@ -1262,11 +1369,12 @@
 
             switch (alt29) {
                 case 1 : ;
-                    // Fuzzy.g:43:41: . // alt
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:43:41: . // alt
                     {
+
                     [self matchAny]; if ( state.failed ) return ;
 
-
+                     
                     }
                     break;
 
@@ -1276,47 +1384,51 @@
         } while (YES);
         loop29: ;
 
+         
 
         [self matchChar:'\n']; if ( state.failed ) return ;
 
+         
 
         if ( state.backtracking == 1 ) {
             NSLog(@"found // comment %@", [self text]);
         }
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "SL_COMMENT" */
-
 // $ANTLR start "STRING"
 - (void) mSTRING
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = STRING;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // Fuzzy.g:48:2: ( '\"' ( options {greedy=false; } : ESC | . )* '\"' ) // ruleBlockSingleAlt
-        // Fuzzy.g:48:4: '\"' ( options {greedy=false; } : ESC | . )* '\"' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:48:2: ( '\"' ( options {greedy=false; } : ESC | . )* '\"' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:48:4: '\"' ( options {greedy=false; } : ESC | . )* '\"' // alt
         {
+
+
         [self matchChar:'"']; if ( state.failed ) return ;
 
+         
 
         do {
             NSInteger alt30=3;
@@ -1348,20 +1460,23 @@
 
             switch (alt30) {
                 case 1 : ;
-                    // Fuzzy.g:48:34: ESC // alt
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:48:34: ESC // alt
                     {
+
+
                     [self mESC]; if ( state.failed ) return ;
 
 
-
+                     
                     }
                     break;
                 case 2 : ;
-                    // Fuzzy.g:48:40: . // alt
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:48:40: . // alt
                     {
+
                     [self matchAny]; if ( state.failed ) return ;
 
-
+                     
                     }
                     break;
 
@@ -1371,42 +1486,45 @@
         } while (YES);
         loop30: ;
 
+         
 
         [self matchChar:'"']; if ( state.failed ) return ;
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "STRING" */
-
 // $ANTLR start "CHAR"
 - (void) mCHAR
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = CHAR;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // Fuzzy.g:52:2: ( '\\'' ( options {greedy=false; } : ESC | . )* '\\'' ) // ruleBlockSingleAlt
-        // Fuzzy.g:52:4: '\\'' ( options {greedy=false; } : ESC | . )* '\\'' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:52:2: ( '\\'' ( options {greedy=false; } : ESC | . )* '\\'' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:52:4: '\\'' ( options {greedy=false; } : ESC | . )* '\\'' // alt
         {
+
+
         [self matchChar:'\'']; if ( state.failed ) return ;
 
+         
 
         do {
             NSInteger alt31=3;
@@ -1438,20 +1556,23 @@
 
             switch (alt31) {
                 case 1 : ;
-                    // Fuzzy.g:52:35: ESC // alt
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:52:35: ESC // alt
                     {
+
+
                     [self mESC]; if ( state.failed ) return ;
 
 
-
+                     
                     }
                     break;
                 case 2 : ;
-                    // Fuzzy.g:52:41: . // alt
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:52:41: . // alt
                     {
+
                     [self matchAny]; if ( state.failed ) return ;
 
-
+                     
                     }
                     break;
 
@@ -1461,41 +1582,42 @@
         } while (YES);
         loop31: ;
 
+         
 
         [self matchChar:'\'']; if ( state.failed ) return ;
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "CHAR" */
-
 // $ANTLR start "WS"
 - (void) mWS
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = WS;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // Fuzzy.g:55:5: ( ( ' ' | '\\t' | '\\n' )+ ) // ruleBlockSingleAlt
-        // Fuzzy.g:55:9: ( ' ' | '\\t' | '\\n' )+ // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:55:5: ( ( ' ' | '\\t' | '\\n' )+ ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:55:9: ( ' ' | '\\t' | '\\n' )+ // alt
         {
-        // Fuzzy.g:55:9: ( ' ' | '\\t' | '\\n' )+ // positiveClosureBlock
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:55:9: ( ' ' | '\\t' | '\\n' )+ // positiveClosureBlock
         NSInteger cnt32 = 0;
         do {
             NSInteger alt32 = 2;
@@ -1507,8 +1629,9 @@
 
             switch (alt32) {
                 case 1 : ;
-                    // Fuzzy.g: // alt
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g: // alt
                     {
+
                     if ((([input LA:1] >= '\t') && ([input LA:1] <= '\n'))||[input LA:1] == ' ') {
                         [input consume];
                         state.failed = NO;
@@ -1516,12 +1639,12 @@
                     } else {
                         if ( state.backtracking > 0 ) { state.failed = YES; return ; }
 
-                        ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException newException:nil stream:input];
+                        MismatchedSetException *mse = [MismatchedSetException newException:nil stream:input];
                         [self recover:mse];
                         @throw mse;
                     }
 
-
+                     
                     }
                     break;
 
@@ -1530,46 +1653,48 @@
                         goto loop32;
                     if ( state.backtracking > 0 ) { state.failed = YES; return ; }
 
-                    ANTLREarlyExitException *eee =
-                        [ANTLREarlyExitException newException:input decisionNumber:32];
+                    EarlyExitException *eee =
+                        [EarlyExitException newException:input decisionNumber:32];
                     @throw eee;
             }
             cnt32++;
         } while (YES);
         loop32: ;
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "WS" */
-
 // $ANTLR start "QID"
 - (void) mQID
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
-        // Fuzzy.g:59:5: ( ID ( '.' ID )* ) // ruleBlockSingleAlt
-        // Fuzzy.g:59:7: ID ( '.' ID )* // alt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:59:5: ( ID ( '.' ID )* ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:59:7: ID ( '.' ID )* // alt
         {
+
+
         [self mID]; if ( state.failed ) return ;
 
 
+         
 
         do {
             NSInteger alt33=2;
@@ -1581,15 +1706,18 @@
 
             switch (alt33) {
                 case 1 : ;
-                    // Fuzzy.g:59:11: '.' ID // alt
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:59:11: '.' ID // alt
                     {
+
+
                     [self matchChar:'.']; if ( state.failed ) return ;
 
+                     
 
                     [self mID]; if ( state.failed ) return ;
 
 
-
+                     
                     }
                     break;
 
@@ -1599,35 +1727,37 @@
         } while (YES);
         loop33: ;
 
-
+         
         }
 
 
     }
     @finally {
         //
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "QID" */
-
 // $ANTLR start "QIDStar"
 - (void) mQIDStar
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
-        // Fuzzy.g:68:2: ( ID ( '.' ID )* ( '.*' )? ) // ruleBlockSingleAlt
-        // Fuzzy.g:68:4: ID ( '.' ID )* ( '.*' )? // alt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:68:2: ( ID ( '.' ID )* ( '.*' )? ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:68:4: ID ( '.' ID )* ( '.*' )? // alt
         {
+
+
         [self mID]; if ( state.failed ) return ;
 
 
+         
 
         do {
             NSInteger alt34=2;
@@ -1644,15 +1774,18 @@
 
             switch (alt34) {
                 case 1 : ;
-                    // Fuzzy.g:68:8: '.' ID // alt
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:68:8: '.' ID // alt
                     {
+
+
                     [self matchChar:'.']; if ( state.failed ) return ;
 
+                     
 
                     [self mID]; if ( state.failed ) return ;
 
 
-
+                     
                     }
                     break;
 
@@ -1662,8 +1795,8 @@
         } while (YES);
         loop34: ;
 
-
-        // Fuzzy.g:68:17: ( '.*' )? // block
+         
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:68:17: ( '.*' )? // block
         NSInteger alt35=2;
         NSInteger LA35_0 = [input LA:1];
 
@@ -1672,48 +1805,51 @@
         }
         switch (alt35) {
             case 1 : ;
-                // Fuzzy.g:68:17: '.*' // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:68:17: '.*' // alt
                 {
+
+
                 [self matchString:@".*"]; if ( state.failed ) return ;
 
 
-
+                 
                 }
                 break;
 
         }
 
-
+         
         }
 
 
     }
     @finally {
         //
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "QIDStar" */
-
 // $ANTLR start "TYPE"
 - (void) mTYPE
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
-        // Fuzzy.g:72:5: ( QID ( '[]' )? ) // ruleBlockSingleAlt
-        // Fuzzy.g:72:9: QID ( '[]' )? // alt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:72:5: ( QID ( '[]' )? ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:72:9: QID ( '[]' )? // alt
         {
+
+
         [self mQID]; if ( state.failed ) return ;
 
 
-
-        // Fuzzy.g:72:13: ( '[]' )? // block
+         
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:72:13: ( '[]' )? // block
         NSInteger alt36=2;
         NSInteger LA36_0 = [input LA:1];
 
@@ -1722,80 +1858,85 @@
         }
         switch (alt36) {
             case 1 : ;
-                // Fuzzy.g:72:13: '[]' // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:72:13: '[]' // alt
                 {
+
+
                 [self matchString:@"[]"]; if ( state.failed ) return ;
 
 
-
+                 
                 }
                 break;
 
         }
 
-
+         
         }
 
 
     }
     @finally {
         //
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "TYPE" */
-
 // $ANTLR start "ARG"
 - (void) mARG
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
-        // Fuzzy.g:76:5: ( TYPE WS ID ) // ruleBlockSingleAlt
-        // Fuzzy.g:76:9: TYPE WS ID // alt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:76:5: ( TYPE WS ID ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:76:9: TYPE WS ID // alt
         {
+
+
         [self mTYPE]; if ( state.failed ) return ;
 
 
+         
 
         [self mWS]; if ( state.failed ) return ;
 
 
+         
 
         [self mID]; if ( state.failed ) return ;
 
 
-
+         
         }
 
 
     }
     @finally {
         //
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "ARG" */
-
 // $ANTLR start "ID"
 - (void) mID
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
-        // Fuzzy.g:80:5: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' )* ) // ruleBlockSingleAlt
-        // Fuzzy.g:80:9: ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' )* // alt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:80:5: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' )* ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:80:9: ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' )* // alt
         {
+
         if ((([input LA:1] >= 'A') && ([input LA:1] <= 'Z'))||[input LA:1] == '_'||(([input LA:1] >= 'a') && ([input LA:1] <= 'z'))) {
             [input consume];
             state.failed = NO;
@@ -1803,11 +1944,12 @@
         } else {
             if ( state.backtracking > 0 ) { state.failed = YES; return ; }
 
-            ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException newException:nil stream:input];
+            MismatchedSetException *mse = [MismatchedSetException newException:nil stream:input];
             [self recover:mse];
             @throw mse;
         }
 
+         
 
         do {
             NSInteger alt37=2;
@@ -1819,8 +1961,9 @@
 
             switch (alt37) {
                 case 1 : ;
-                    // Fuzzy.g: // alt
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g: // alt
                     {
+
                     if ((([input LA:1] >= '0') && ([input LA:1] <= '9'))||(([input LA:1] >= 'A') && ([input LA:1] <= 'Z'))||[input LA:1] == '_'||(([input LA:1] >= 'a') && ([input LA:1] <= 'z'))) {
                         [input consume];
                         state.failed = NO;
@@ -1828,12 +1971,12 @@
                     } else {
                         if ( state.backtracking > 0 ) { state.failed = YES; return ; }
 
-                        ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException newException:nil stream:input];
+                        MismatchedSetException *mse = [MismatchedSetException newException:nil stream:input];
                         [self recover:mse];
                         @throw mse;
                     }
 
-
+                     
                     }
                     break;
 
@@ -1843,35 +1986,36 @@
         } while (YES);
         loop37: ;
 
-
+         
         }
 
 
     }
     @finally {
         //
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "ID" */
-
 // $ANTLR start "ESC"
 - (void) mESC
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
-        // Fuzzy.g:84:5: ( '\\\\' ( '\"' | '\\'' | '\\\\' ) ) // ruleBlockSingleAlt
-        // Fuzzy.g:84:7: '\\\\' ( '\"' | '\\'' | '\\\\' ) // alt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:84:5: ( '\\\\' ( '\"' | '\\'' | '\\\\' ) ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:84:7: '\\\\' ( '\"' | '\\'' | '\\\\' ) // alt
         {
+
+
         [self matchChar:'\\']; if ( state.failed ) return ;
 
-
+         
         if ([input LA:1] == '"'||[input LA:1] == '\''||[input LA:1] == '\\') {
             [input consume];
             state.failed = NO;
@@ -1879,29 +2023,27 @@
         } else {
             if ( state.backtracking > 0 ) { state.failed = YES; return ; }
 
-            ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException newException:nil stream:input];
+            MismatchedSetException *mse = [MismatchedSetException newException:nil stream:input];
             [self recover:mse];
             @throw mse;
         }
 
-
+         
         }
 
 
     }
     @finally {
         //
-        /* my stuff */
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "ESC" */
-
 - (void) mTokens
 {
-    // Fuzzy.g:1:39: ( IMPORT | RETURN | CLASS | METHOD | FIELD | STAT | CALL | COMMENT | SL_COMMENT | STRING | CHAR | WS ) //ruleblock
+    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:1:39: ( IMPORT | RETURN | CLASS | METHOD | FIELD | STAT | CALL | COMMENT | SL_COMMENT | STRING | CHAR | WS ) //ruleblock
     NSInteger alt38=12;
     unichar charLA38 = [input LA:1];
     switch (charLA38) {
@@ -1927,7 +2069,7 @@
             else {
                 if ( state.backtracking > 0 ) { state.failed = YES; return ; }
 
-                ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newException:38 state:1 stream:input];
+                NoViableAltException *nvae = [NoViableAltException newException:38 state:1 stream:input];
                 nvae.c = LA38_1;
                 @throw nvae;
 
@@ -1953,7 +2095,7 @@
             else {
                 if ( state.backtracking > 0 ) { state.failed = YES; return ; }
 
-                ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newException:38 state:7 stream:input];
+                NoViableAltException *nvae = [NoViableAltException newException:38 state:7 stream:input];
                 nvae.c = LA38_7;
                 @throw nvae;
 
@@ -1979,7 +2121,7 @@
             else {
                 if ( state.backtracking > 0 ) { state.failed = YES; return ; }
 
-                ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newException:38 state:9 stream:input];
+                NoViableAltException *nvae = [NoViableAltException newException:38 state:9 stream:input];
                 nvae.c = LA38_9;
                 @throw nvae;
 
@@ -2007,7 +2149,7 @@
             else {
                 if ( state.backtracking > 0 ) { state.failed = YES; return ; }
 
-                ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newException:38 state:11 stream:input];
+                NoViableAltException *nvae = [NoViableAltException newException:38 state:11 stream:input];
                 nvae.c = LA38_11;
                 @throw nvae;
 
@@ -2076,7 +2218,7 @@
             else {
                 if ( state.backtracking > 0 ) { state.failed = YES; return ; }
 
-                ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newException:38 state:12 stream:input];
+                NoViableAltException *nvae = [NoViableAltException newException:38 state:12 stream:input];
                 nvae.c = LA38_12;
                 @throw nvae;
 
@@ -2096,7 +2238,7 @@
             else {
                 if ( state.backtracking > 0 ) { state.failed = YES; return ; }
 
-                ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newException:38 state:13 stream:input];
+                NoViableAltException *nvae = [NoViableAltException newException:38 state:13 stream:input];
                 nvae.c = LA38_13;
                 @throw nvae;
 
@@ -2124,7 +2266,7 @@
     default: ;
         if ( state.backtracking > 0 ) { state.failed = YES; return ; }
 
-        ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newException:38 state:0 stream:input];
+        NoViableAltException *nvae = [NoViableAltException newException:38 state:0 stream:input];
         nvae.c = charLA38;
         @throw nvae;
 
@@ -2132,240 +2274,300 @@
 
     switch (alt38) {
         case 1 : ;
-            // Fuzzy.g:1:41: IMPORT // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:1:41: IMPORT // alt
             {
+
+
             [self mIMPORT]; if ( state.failed ) return ;
 
 
-
+             
             }
             break;
         case 2 : ;
-            // Fuzzy.g:1:48: RETURN // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:1:48: RETURN // alt
             {
+
+
             [self mRETURN]; if ( state.failed ) return ;
 
 
-
+             
             }
             break;
         case 3 : ;
-            // Fuzzy.g:1:55: CLASS // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:1:55: CLASS // alt
             {
+
+
             [self mCLASS]; if ( state.failed ) return ;
 
 
-
+             
             }
             break;
         case 4 : ;
-            // Fuzzy.g:1:61: METHOD // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:1:61: METHOD // alt
             {
+
+
             [self mMETHOD]; if ( state.failed ) return ;
 
 
-
+             
             }
             break;
         case 5 : ;
-            // Fuzzy.g:1:68: FIELD // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:1:68: FIELD // alt
             {
+
+
             [self mFIELD]; if ( state.failed ) return ;
 
 
-
+             
             }
             break;
         case 6 : ;
-            // Fuzzy.g:1:74: STAT // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:1:74: STAT // alt
             {
+
+
             [self mSTAT]; if ( state.failed ) return ;
 
 
-
+             
             }
             break;
         case 7 : ;
-            // Fuzzy.g:1:79: CALL // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:1:79: CALL // alt
             {
+
+
             [self mCALL]; if ( state.failed ) return ;
 
 
-
+             
             }
             break;
         case 8 : ;
-            // Fuzzy.g:1:84: COMMENT // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:1:84: COMMENT // alt
             {
+
+
             [self mCOMMENT]; if ( state.failed ) return ;
 
 
-
+             
             }
             break;
         case 9 : ;
-            // Fuzzy.g:1:92: SL_COMMENT // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:1:92: SL_COMMENT // alt
             {
+
+
             [self mSL_COMMENT]; if ( state.failed ) return ;
 
 
-
+             
             }
             break;
         case 10 : ;
-            // Fuzzy.g:1:103: STRING // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:1:103: STRING // alt
             {
+
+
             [self mSTRING]; if ( state.failed ) return ;
 
 
-
+             
             }
             break;
         case 11 : ;
-            // Fuzzy.g:1:110: CHAR // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:1:110: CHAR // alt
             {
+
+
             [self mCHAR]; if ( state.failed ) return ;
 
 
-
+             
             }
             break;
         case 12 : ;
-            // Fuzzy.g:1:115: WS // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:1:115: WS // alt
             {
+
+
             [self mWS]; if ( state.failed ) return ;
 
 
-
+             
             }
             break;
 
     }
 
 }
-
 // $ANTLR start synpred1_Fuzzy_fragment
 - (void) synpred1_Fuzzy_fragment
 {
-    // Fuzzy.g:1:41: ( IMPORT ) // ruleBlockSingleAlt
-    // Fuzzy.g:1:41: IMPORT // alt
+    /* ruleLabelDefs entry */
+
+
+    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:1:41: ( IMPORT ) // ruleBlockSingleAlt
+    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:1:41: IMPORT // alt
     {
+
+
     [self mIMPORT]; if ( state.failed ) return ;
 
 
-
+     
     }
 
 } // $ANTLR end synpred1_Fuzzy_fragment
-
 // $ANTLR start synpred2_Fuzzy_fragment
 - (void) synpred2_Fuzzy_fragment
 {
-    // Fuzzy.g:1:48: ( RETURN ) // ruleBlockSingleAlt
-    // Fuzzy.g:1:48: RETURN // alt
+    /* ruleLabelDefs entry */
+
+
+    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:1:48: ( RETURN ) // ruleBlockSingleAlt
+    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:1:48: RETURN // alt
     {
+
+
     [self mRETURN]; if ( state.failed ) return ;
 
 
-
+     
     }
 
 } // $ANTLR end synpred2_Fuzzy_fragment
-
 // $ANTLR start synpred3_Fuzzy_fragment
 - (void) synpred3_Fuzzy_fragment
 {
-    // Fuzzy.g:1:55: ( CLASS ) // ruleBlockSingleAlt
-    // Fuzzy.g:1:55: CLASS // alt
+    /* ruleLabelDefs entry */
+
+
+    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:1:55: ( CLASS ) // ruleBlockSingleAlt
+    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:1:55: CLASS // alt
     {
+
+
     [self mCLASS]; if ( state.failed ) return ;
 
 
-
+     
     }
 
 } // $ANTLR end synpred3_Fuzzy_fragment
-
 // $ANTLR start synpred4_Fuzzy_fragment
 - (void) synpred4_Fuzzy_fragment
 {
-    // Fuzzy.g:1:61: ( METHOD ) // ruleBlockSingleAlt
-    // Fuzzy.g:1:61: METHOD // alt
+    /* ruleLabelDefs entry */
+
+
+    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:1:61: ( METHOD ) // ruleBlockSingleAlt
+    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:1:61: METHOD // alt
     {
+
+
     [self mMETHOD]; if ( state.failed ) return ;
 
 
-
+     
     }
 
 } // $ANTLR end synpred4_Fuzzy_fragment
-
 // $ANTLR start synpred5_Fuzzy_fragment
 - (void) synpred5_Fuzzy_fragment
 {
-    // Fuzzy.g:1:68: ( FIELD ) // ruleBlockSingleAlt
-    // Fuzzy.g:1:68: FIELD // alt
+    /* ruleLabelDefs entry */
+
+
+    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:1:68: ( FIELD ) // ruleBlockSingleAlt
+    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:1:68: FIELD // alt
     {
+
+
     [self mFIELD]; if ( state.failed ) return ;
 
 
-
+     
     }
 
 } // $ANTLR end synpred5_Fuzzy_fragment
-
 // $ANTLR start synpred6_Fuzzy_fragment
 - (void) synpred6_Fuzzy_fragment
 {
-    // Fuzzy.g:1:74: ( STAT ) // ruleBlockSingleAlt
-    // Fuzzy.g:1:74: STAT // alt
+    /* ruleLabelDefs entry */
+
+
+    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:1:74: ( STAT ) // ruleBlockSingleAlt
+    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:1:74: STAT // alt
     {
+
+
     [self mSTAT]; if ( state.failed ) return ;
 
 
-
+     
     }
 
 } // $ANTLR end synpred6_Fuzzy_fragment
-
 // $ANTLR start synpred7_Fuzzy_fragment
 - (void) synpred7_Fuzzy_fragment
 {
-    // Fuzzy.g:1:79: ( CALL ) // ruleBlockSingleAlt
-    // Fuzzy.g:1:79: CALL // alt
+    /* ruleLabelDefs entry */
+
+
+    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:1:79: ( CALL ) // ruleBlockSingleAlt
+    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:1:79: CALL // alt
     {
+
+
     [self mCALL]; if ( state.failed ) return ;
 
 
-
+     
     }
 
 } // $ANTLR end synpred7_Fuzzy_fragment
-
 // $ANTLR start synpred8_Fuzzy_fragment
 - (void) synpred8_Fuzzy_fragment
 {
-    // Fuzzy.g:1:84: ( COMMENT ) // ruleBlockSingleAlt
-    // Fuzzy.g:1:84: COMMENT // alt
+    /* ruleLabelDefs entry */
+
+
+    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:1:84: ( COMMENT ) // ruleBlockSingleAlt
+    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:1:84: COMMENT // alt
     {
+
+
     [self mCOMMENT]; if ( state.failed ) return ;
 
 
-
+     
     }
 
 } // $ANTLR end synpred8_Fuzzy_fragment
-
 // $ANTLR start synpred9_Fuzzy_fragment
 - (void) synpred9_Fuzzy_fragment
 {
-    // Fuzzy.g:1:92: ( SL_COMMENT ) // ruleBlockSingleAlt
-    // Fuzzy.g:1:92: SL_COMMENT // alt
+    /* ruleLabelDefs entry */
+
+
+    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:1:92: ( SL_COMMENT ) // ruleBlockSingleAlt
+    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/Fuzzy.g:1:92: SL_COMMENT // alt
     {
+
+
     [self mSL_COMMENT]; if ( state.failed ) return ;
 
 
-
+     
     }
 
 } // $ANTLR end synpred9_Fuzzy_fragment
diff --git a/runtime/ObjC/Framework/examples/fuzzy/antlr3.h b/runtime/ObjC/Framework/examples/fuzzy/antlr3.h
deleted file mode 100644
index 4f16279..0000000
--- a/runtime/ObjC/Framework/examples/fuzzy/antlr3.h
+++ /dev/null
@@ -1,79 +0,0 @@
-#import <ANTLR/ANTLRBaseMapElement.h>
-#import <ANTLR/ANTLRBaseRecognizer.h>
-#import <ANTLR/ANTLRBaseStack.h>
-#import <ANTLR/ANTLRBaseTree.h>
-#import <ANTLR/ANTLRBaseTreeAdaptor.h>
-#import <ANTLR/ANTLRBitSet.h>
-#import <ANTLR/ANTLRBufferedTokenStream.h>
-#import <ANTLR/ANTLRBufferedTreeNodeStream.h>
-#import <ANTLR/ANTLRCharStream.h>
-#import <ANTLR/ANTLRCharStreamState.h>
-#import <ANTLR/ANTLRCommonErrorNode.h>
-#import <ANTLR/ANTLRCommonToken.h>
-#import <ANTLR/ANTLRCommonTokenStream.h>
-#import <ANTLR/ANTLRCommonTree.h>
-#import <ANTLR/ANTLRCommonTreeAdaptor.h>
-#import <ANTLR/ANTLRCommonTreeNodeStream.h>
-#import <ANTLR/ANTLRDFA.h>
-#import <ANTLR/ANTLRDebug.h>
-#import <ANTLR/ANTLRDebugEventProxy.h>
-#import <ANTLR/ANTLRDebugEventListener.h>
-#import <ANTLR/ANTLRDebugParser.h>
-#import <ANTLR/ANTLRDebugTokenStream.h>
-#import <ANTLR/ANTLRDebugTreeAdaptor.h>
-#import <ANTLR/ANTLRDebugTreeNodeStream.h>
-#import <ANTLR/ANTLRDebugTreeParser.h>
-#import <ANTLR/ANTLREarlyExitException.h>
-#import <ANTLR/ANTLRError.h>
-#import <ANTLR/ANTLRFailedPredicateException.h>
-#import <ANTLR/ANTLRFastQueue.h>
-#import <ANTLR/ANTLRHashMap.h>
-#import <ANTLR/ANTLRHashRule.h>
-#import <ANTLR/ANTLRIntArray.h>
-#import <ANTLR/ANTLRIntStream.h>
-#import <ANTLR/ANTLRLexer.h>
-#import <ANTLR/ANTLRLexerRuleReturnScope.h>
-#import <ANTLR/ANTLRLinkBase.h>
-#import <ANTLR/ANTLRLookaheadStream.h>
-#import <ANTLR/ANTLRMapElement.h>
-#import <ANTLR/ANTLRMap.h>
-#import <ANTLR/ANTLRMismatchedNotSetException.h>
-#import <ANTLR/ANTLRMismatchedRangeException.h>
-#import <ANTLR/ANTLRMismatchedSetException.h>
-#import <ANTLR/ANTLRMismatchedTokenException.h>
-#import <ANTLR/ANTLRMismatchedTreeNodeException.h>
-#import <ANTLR/ANTLRMissingTokenException.h>
-#import <ANTLR/ANTLRNodeMapElement.h>
-#import <ANTLR/ANTLRNoViableAltException.h>
-#import <ANTLR/ANTLRParser.h>
-#import <ANTLR/ANTLRParserRuleReturnScope.h>
-#import <ANTLR/ANTLRPtrBuffer.h>
-#import <ANTLR/ANTLRRecognitionException.h>
-#import <ANTLR/ANTLRRecognizerSharedState.h>
-#import <ANTLR/ANTLRRewriteRuleElementStream.h>
-#import <ANTLR/ANTLRRewriteRuleSubtreeStream.h>
-#import <ANTLR/ANTLRRewriteRuleTokenStream.h>
-#import <ANTLR/ANTLRRuleMemo.h>
-#import <ANTLR/ANTLRRuleStack.h>
-#import <ANTLR/ANTLRRuleReturnScope.h>
-#import <ANTLR/ANTLRRuntimeException.h>
-#import <ANTLR/ANTLRStreamEnumerator.h>
-#import <ANTLR/ANTLRStringStream.h>
-#import <ANTLR/ANTLRSymbolStack.h>
-#import <ANTLR/ANTLRToken+DebuggerSupport.h>
-#import <ANTLR/ANTLRToken.h>
-#import <ANTLR/ANTLRTokenRewriteStream.h>
-#import <ANTLR/ANTLRTokenSource.h>
-#import <ANTLR/ANTLRTokenStream.h>
-#import <ANTLR/ANTLRTree.h>
-#import <ANTLR/ANTLRTreeAdaptor.h>
-#import <ANTLR/ANTLRTreeException.h>
-#import <ANTLR/ANTLRTreeIterator.h>
-#import <ANTLR/ANTLRTreeNodeStream.h>
-#import <ANTLR/ANTLRTreeParser.h>
-#import <ANTLR/ANTLRTreeRuleReturnScope.h>
-#import <ANTLR/ANTLRUnbufferedTokenStream.h>
-//#import <ANTLR/ANTLRUnbufferedCommonTreeNodeStream.h>
-//#import <ANTLR/ANTLRUnbufferedCommonTreeNodeStreamState.h>
-#import <ANTLR/ANTLRUniqueIDMap.h>
-#import <ANTLR/ANTLRUnwantedTokenException.h>
diff --git a/runtime/ObjC/Framework/examples/fuzzy/main.m b/runtime/ObjC/Framework/examples/fuzzy/main.m
index 379a519..aff7fc1 100644
--- a/runtime/ObjC/Framework/examples/fuzzy/main.m
+++ b/runtime/ObjC/Framework/examples/fuzzy/main.m
@@ -1,20 +1,20 @@
-#import <Cocoa/Cocoa.h>
+#import <Foundation/Foundation.h>
 #import "Fuzzy.h"
-#import "antlr3.h"
+#import <ANTLR/ANTLR.h>
 
 int main(int argc, const char * argv[])
 {
     NSError *error;
 	NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
-	NSString *input = [NSString stringWithContentsOfFile:@"/Users/acondit/source/antlr3/acondit_localhost/code/antlr/antlr3-main/runtime/ObjC/Framework/examples/fuzzy/input"  encoding:NSASCIIStringEncoding error:&error];
+	NSString *input = [NSString stringWithContentsOfFile:@"/Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/fuzzy/input"  encoding:NSASCIIStringEncoding error:&error];
 	NSLog(@"%@", input);
 	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:input];
 	Fuzzy *lex = [Fuzzy newFuzzyWithCharStream:stream];
-	ANTLRCommonTokenStream *tokens = [ANTLRCommonTokenStream newANTLRCommonTokenStreamWithTokenSource:lex];
+	CommonTokenStream *tokens = [CommonTokenStream newCommonTokenStreamWithTokenSource:lex];
 	NSLog( [tokens toString] );
 
-	id<ANTLRToken> currentToken;
-	while ((currentToken = [lex nextToken]) && [currentToken getType] != ANTLRTokenTypeEOF) {
+	id<Token> currentToken;
+	while ((currentToken = [lex nextToken]) && currentToken.type != TokenTypeEOF) {
 		NSLog(@"### %@", [currentToken toString]);
 	}
 
diff --git a/runtime/ObjC/Framework/examples/fuzzy/output1/Fuzzy.m b/runtime/ObjC/Framework/examples/fuzzy/output1/Fuzzy.m
deleted file mode 100644
index 908a214..0000000
--- a/runtime/ObjC/Framework/examples/fuzzy/output1/Fuzzy.m
+++ /dev/null
@@ -1,2162 +0,0 @@
-/** \file
- *  This OBJC source file was generated by $ANTLR version 3.2 Aug 20, 2010 13:39:32
- *
- *     -  From the grammar source file : /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g
- *     -                            On : 2010-08-20 13:40:15
- *     -                 for the lexer : FuzzyLexer *
- * Editing it, at least manually, is not wise. 
- *
- * C language generator and runtime by Jim Idle, jimi|hereisanat|idle|dotgoeshere|ws.
- *
- *
-*/
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-//
-// 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.
-
-// $ANTLR 3.2 Aug 20, 2010 13:39:32 /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g 2010-08-20 13:40:15
-
-/* -----------------------------------------
- * Include the ANTLR3 generated header file.
- */
-#import "Fuzzy.h"
-/* ----------------------------------------- */
-
-
-/* ============================================================================= */
-
-/* =============================================================================
- * Start of recognizer
- */
-
-#pragma mark Cyclic DFA implementation start DFA38
-@implementation DFA38
-const static NSInteger dfa38_eot[19] =
-    {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
-const static NSInteger dfa38_eof[19] =
-    {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
-const static unichar dfa38_min[19] =
-    {9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
-const static unichar dfa38_max[19] =
-    {122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
-const static NSInteger dfa38_accept[19] =
-    {-1,-1,4,5,7,-1,2,-1,8,9,-1,3,-1,1,6,10,-1,12,11};
-const static NSInteger dfa38_special[19] =
-    {-1,0,-1,-1,-1,1,-1,2,-1,-1,3,-1,4,-1,-1,-1,5,-1,-1};
-const static NSInteger dfa38_transition[] = {};
-const static NSInteger dfa38_transition0[] = {17, 17, -1, -1, -1, -1, -1, 
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 17, -1, 
- 15, -1, -1, -1, -1, 18, -1, -1, -1, -1, -1, -1, -1, 7, -1, -1, -1, -1, 
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, 
- 1, -1, 1, 1, 10, 1, 1, 16, 1, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 5, 16, 1, 
- 1, 1, 16, 1, 1, 1};
-const static NSInteger dfa38_transition1[] = {-1};
-
-
-+ () newDFA38WithRecognizer:(ANTLRBaseRecognizer *)aRecognizer
-{
-    return [[[DFA38 alloc] initWithRecognizer:aRecognizer] retain];
-}
-
-- (id) initWithRecognizer:(ANTLRBaseRecognizer *) theRecognizer
-{
-    if ((self = [super initWithRecognizer:theRecognizer]) != nil) {
-        decisionNumber = 38;
-        eot = dfa38_eot;
-        eof = dfa38_eof;
-        min = dfa38_min;
-        max = dfa38_max;
-        accept = dfa38_accept;
-        special = dfa38_special;
-        if (!(transition = calloc(19, sizeof(void*)))) {
-            [self release];
-            return nil;
-        }
-        len = 19;
-        transition[0] = dfa38_transition0;
-        transition[1] = dfa38_transition1;
-        transition[2] = dfa38_transition;
-        transition[3] = dfa38_transition;
-        transition[4] = dfa38_transition;
-        transition[5] = dfa38_transition1;
-        transition[6] = dfa38_transition;
-        transition[7] = dfa38_transition1;
-        transition[8] = dfa38_transition;
-        transition[9] = dfa38_transition;
-        transition[10] = dfa38_transition1;
-        transition[11] = dfa38_transition;
-        transition[12] = dfa38_transition1;
-        transition[13] = dfa38_transition;
-        transition[14] = dfa38_transition;
-        transition[15] = dfa38_transition;
-        transition[16] = dfa38_transition1;
-        transition[17] = dfa38_transition;
-        transition[18] = dfa38_transition;
-    }
-    return self;
-}
-
-/* start dfa.specialStateSTs */
-- (NSInteger) specialStateTransition:(NSInteger)s Stream:(id<ANTLRIntStream>)anInput
-{
-    id<ANTLRIntStream> input = anInput;
-    switch (s) {
-                case 0 : ;
-                    /* cyclicDFAState */
-                    NSInteger LA38_1 = [input LA:1];
-
-                     
-                    NSInteger index38_1 = [input getIndex];
-                    [input rewind];
-                    s = -1;
-                    /* cyclicDFAEdge */
-                    if ([self evaluateSyntacticPredicate:@selector(synpred4_Fuzzy_fragment)]) { s = 2;}
-
-                    else /* cyclicDFAEdge */
-                    if ([self evaluateSyntacticPredicate:@selector(synpred5_Fuzzy_fragment)]) { s = 3;}
-
-                    else /* cyclicDFAEdge */
-                    if ([self evaluateSyntacticPredicate:@selector(synpred7_Fuzzy_fragment)]) { s = 4;}
-
-                     
-                    [input seek:index38_1];
-                    if ( s >= 0 )
-                        return s;
-                     break;
-                case 1 : ;
-                    /* cyclicDFAState */
-                    NSInteger LA38_5 = [input LA:1];
-
-                     
-                    NSInteger index38_5 = [input getIndex];
-                    [input rewind];
-                    s = -1;
-                    /* cyclicDFAEdge */
-                    if ([self evaluateSyntacticPredicate:@selector(synpred2_Fuzzy_fragment)]) { s = 6;}
-
-                    else /* cyclicDFAEdge */
-                    if ([self evaluateSyntacticPredicate:@selector(synpred4_Fuzzy_fragment)]) { s = 2;}
-
-                    else /* cyclicDFAEdge */
-                    if ([self evaluateSyntacticPredicate:@selector(synpred5_Fuzzy_fragment)]) { s = 3;}
-
-                    else /* cyclicDFAEdge */
-                    if ([self evaluateSyntacticPredicate:@selector(synpred7_Fuzzy_fragment)]) { s = 4;}
-
-                     
-                    [input seek:index38_5];
-                    if ( s >= 0 )
-                        return s;
-                     break;
-                case 2 : ;
-                    /* cyclicDFAState */
-                    NSInteger LA38_7 = [input LA:1];
-
-                     
-                    NSInteger index38_7 = [input getIndex];
-                    [input rewind];
-                    s = -1;
-                    /* cyclicDFAEdge */
-                    if ([self evaluateSyntacticPredicate:@selector(synpred8_Fuzzy_fragment)]) { s = 8;}
-
-                    else /* cyclicDFAEdge */
-                    if ([self evaluateSyntacticPredicate:@selector(synpred9_Fuzzy_fragment)]) { s = 9;}
-
-                     
-                    [input seek:index38_7];
-                    if ( s >= 0 )
-                        return s;
-                     break;
-                case 3 : ;
-                    /* cyclicDFAState */
-                    NSInteger LA38_10 = [input LA:1];
-
-                     
-                    NSInteger index38_10 = [input getIndex];
-                    [input rewind];
-                    s = -1;
-                    /* cyclicDFAEdge */
-                    if ([self evaluateSyntacticPredicate:@selector(synpred3_Fuzzy_fragment)]) { s = 11;}
-
-                    else /* cyclicDFAEdge */
-                    if ([self evaluateSyntacticPredicate:@selector(synpred4_Fuzzy_fragment)]) { s = 2;}
-
-                    else /* cyclicDFAEdge */
-                    if ([self evaluateSyntacticPredicate:@selector(synpred5_Fuzzy_fragment)]) { s = 3;}
-
-                    else /* cyclicDFAEdge */
-                    if ([self evaluateSyntacticPredicate:@selector(synpred7_Fuzzy_fragment)]) { s = 4;}
-
-                     
-                    [input seek:index38_10];
-                    if ( s >= 0 )
-                        return s;
-                     break;
-                case 4 : ;
-                    /* cyclicDFAState */
-                    NSInteger LA38_12 = [input LA:1];
-
-                     
-                    NSInteger index38_12 = [input getIndex];
-                    [input rewind];
-                    s = -1;
-                    /* cyclicDFAEdge */
-                    if ([self evaluateSyntacticPredicate:@selector(synpred1_Fuzzy_fragment)]) { s = 13;}
-
-                    else /* cyclicDFAEdge */
-                    if ([self evaluateSyntacticPredicate:@selector(synpred4_Fuzzy_fragment)]) { s = 2;}
-
-                    else /* cyclicDFAEdge */
-                    if ([self evaluateSyntacticPredicate:@selector(synpred5_Fuzzy_fragment)]) { s = 3;}
-
-                    else /* cyclicDFAEdge */
-                    if ([self evaluateSyntacticPredicate:@selector(synpred6_Fuzzy_fragment)]) { s = 14;}
-
-                    else /* cyclicDFAEdge */
-                    if ([self evaluateSyntacticPredicate:@selector(synpred7_Fuzzy_fragment)]) { s = 4;}
-
-                     
-                    [input seek:index38_12];
-                    if ( s >= 0 )
-                        return s;
-                     break;
-                case 5 : ;
-                    /* cyclicDFAState */
-                    NSInteger LA38_16 = [input LA:1];
-
-                     
-                    NSInteger index38_16 = [input getIndex];
-                    [input rewind];
-                    s = -1;
-                    /* cyclicDFAEdge */
-                    if ([self evaluateSyntacticPredicate:@selector(synpred4_Fuzzy_fragment)]) { s = 2;}
-
-                    else /* cyclicDFAEdge */
-                    if ([self evaluateSyntacticPredicate:@selector(synpred5_Fuzzy_fragment)]) { s = 3;}
-
-                    else /* cyclicDFAEdge */
-                    if ([self evaluateSyntacticPredicate:@selector(synpred6_Fuzzy_fragment)]) { s = 14;}
-
-                    else /* cyclicDFAEdge */
-                    if ([self evaluateSyntacticPredicate:@selector(synpred7_Fuzzy_fragment)]) { s = 4;}
-
-                     
-                    [input seek:index38_16];
-                    if ( s >= 0 )
-                        return s;
-                     break;
-    }
-    if ( [recognizer getBacktrackingLevel] > 0 ) { [recognizer setFailed:YES]; return -1; }
-    ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newANTLRNoViableAltException:38 state:s stream:[recognizer getInput]];
-    /* [self error:nvae]; */ 
-    @throw nvae;
-}
-
-/* end dfa.specialStateSTs */
-- (void) dealloc
-{
-    free(transition);
-    [super dealloc];
-}
-
-- (NSString *) description
-{
-    return @"1:1: Tokens options {k=1; backtrack=true; } : ( IMPORT | RETURN | CLASS | METHOD | FIELD | STAT | CALL | COMMENT | SL_COMMENT | STRING | CHAR | WS );";
-}
-
-
-@end
-#pragma mark Cyclic DFA implementation end DFA38
-
-
-
-/** As per Terence: No returns for lexer rules!
-#pragma mark Rule return scopes start
-#pragma mark Rule return scopes end
-*/
-@implementation Fuzzy // line 330
-
-+ (void) initialize
-{
-    [ANTLRBaseRecognizer setGrammarFileName:@"/usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g"];
-}
-
-+ (NSString *) tokenNameForType:(NSInteger)aTokenType
-{
-    return [[self getTokenNames] objectAtIndex:aTokenType];
-}
-
-+ (Fuzzy *)newFuzzy:(id<ANTLRCharStream>)anInput
-{
-    return [[Fuzzy alloc] initWithCharStream:anInput];
-}
-
-- (id) initWithCharStream:(id<ANTLRCharStream>)anInput
-{
-    if ((self = [super initWithCharStream:anInput State:[ANTLRRecognizerSharedState newANTLRRecognizerSharedStateWithRuleLen:30+1]]) != nil) {
-        SEL synpred9_FuzzySelector = @selector(synpred9_Fuzzy_fragment);
-
-        SEL synpred2_FuzzySelector = @selector(synpred2_Fuzzy_fragment);
-
-        SEL synpred7_FuzzySelector = @selector(synpred7_Fuzzy_fragment);
-
-        SEL synpred4_FuzzySelector = @selector(synpred4_Fuzzy_fragment);
-
-        SEL synpred8_FuzzySelector = @selector(synpred8_Fuzzy_fragment);
-
-        SEL synpred6_FuzzySelector = @selector(synpred6_Fuzzy_fragment);
-
-        SEL synpred5_FuzzySelector = @selector(synpred5_Fuzzy_fragment);
-
-        SEL synpred3_FuzzySelector = @selector(synpred3_Fuzzy_fragment);
-
-        SEL synpred1_FuzzySelector = @selector(synpred1_Fuzzy_fragment);
-
-        dfa38 = [DFA38 newDFA38WithRecognizer:self];
-    }
-    return self;
-}
-
-- (void) dealloc
-{
-    [dfa38 release];
-    [super dealloc];
-}
-
-// Start of actions.lexer.methods
-// start methods()
-
-- (id<ANTLRToken>) nextToken
-{
-    while (YES) {
-        if ( [input LA:1] == ANTLRCharStreamEOF ) {
-            return [ANTLRCommonToken eofToken]; // should really be a +eofToken call here -> go figure
-        }
-        state.token = nil;
-        state.channel = ANTLRTokenChannelDefault;
-        state.tokenStartCharIndex = [input getIndex];
-        state.tokenStartCharPositionInLine = [input getCharPositionInLine];
-        state.tokenStartLine = [input getLine];
-        state.text = nil;
-        @try {
-            NSInteger m = [input mark];
-            state.backtracking = 1; /* means we won't throw slow exception */
-            state.failed = NO;
-            [self mTokens];
-            state.backtracking = 0;
-            /* mTokens backtracks with synpred at backtracking==2
-               and we set the synpredgate to allow actions at level 1. */
-            if ( state.failed == YES ) {
-                [input rewind:m];
-                [input consume]; /* advance one char and try again */
-            } else {
-                [self emit];
-                return state.token;
-            }
-        }
-        @catch (ANTLRRecognitionException *re) {
-            // shouldn't happen in backtracking mode, but...
-            [self reportError:re];
-            [self recover:re];
-        }
-    }
-}
-
-- (void)memoize:(id<ANTLRIntStream>)anInput
-      RuleIndex:(NSInteger)ruleIndex
-     StartIndex:(NSInteger)ruleStartIndex
-{
-    if ( state.backtracking > 1 ) [super memoize:anInput RuleIndex:ruleIndex StartIndex:ruleStartIndex];
-}
-
-- (BOOL)alreadyParsedRule:(id<ANTLRIntStream>)anInput RuleIndex:(NSInteger)ruleIndex
-{
-    if ( state.backtracking > 1 ) return [super alreadyParsedRule:anInput RuleIndex:ruleIndex];
-    return NO;
-}
-// Start of Rules
-// $ANTLR start "IMPORT"
-- (void) mIMPORT
-{
-    //
-    // ruleScopeSetUp
-
-    @try {
-        NSInteger _type = IMPORT;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        id<ANTLRToken> name=nil;
-
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:5:2: ( 'import' WS name= QIDStar ( WS )? ';' ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:5:4: 'import' WS name= QIDStar ( WS )? ';' // alt
-        {
-        [self matchString:@"import"]; if ( state.failed == YES ) return ;
-          /* element() */
-            [self mWS]; if ( state.failed == YES ) return ;
-          /* element() */
-        NSInteger nameStart31 = [self getIndex];
-        [self mQIDStar]; if ( state.failed == YES ) return ;
-
-        name = [[ANTLRCommonToken newANTLRCommonToken:input Type:ANTLRTokenTypeInvalid Channel:ANTLRTokenChannelDefault Start:nameStart31 Stop:[self getIndex]-1] retain];
-        [name setLine:[self getLine]];  /* element() */
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:5:29: ( WS )? // block
-        NSInteger alt1=2;
-        NSInteger LA1_0 = [input LA:1];
-
-        if ( ((LA1_0>='\t' && LA1_0<='\n')||LA1_0==' ') ) {
-            alt1=1;
-        }
-        switch (alt1) {
-            case 1 : ;
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:5:29: WS // alt
-                {
-                    [self mWS]; if ( state.failed == YES ) return ;
-                  /* element() */
-                 /* elements */
-                }
-                break;
-
-        }
-          /* element() */
-        [self matchChar:';']; if ( state.failed == YES ) return ;
-          /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-        [state setType:_type];
-
-        state.channel = _channel;
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "IMPORT"
-
-// $ANTLR start "RETURN"
-- (void) mRETURN
-{
-    //
-    // ruleScopeSetUp
-
-    @try {
-        NSInteger _type = RETURN;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:10:2: ( 'return' ( options {greedy=false; } : . )* ';' ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:10:4: 'return' ( options {greedy=false; } : . )* ';' // alt
-        {
-        [self matchString:@"return"]; if ( state.failed == YES ) return ;
-          /* element() */
-        do {
-            NSInteger alt2=2;
-            NSInteger LA2_0 = [input LA:1];
-            if ( (LA2_0==';') ) {
-                alt2=2;
-            }
-            else if ( ((LA2_0>=0x0000 && LA2_0<=':')||(LA2_0>='<' && LA2_0<=0xFFFF)) ) {
-                alt2=1;
-            }
-
-
-            switch (alt2) {
-                case 1 : ;
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:10:38: . // alt
-                    {
-                    [self matchAny]; if ( state.failed == YES ) return ;
-                      /* element() */
-                     /* elements */
-                    }
-                    break;
-
-                default :
-                    goto loop2;
-            }
-        } while (YES);
-        loop2: ;
-          /* element() */
-        [self matchChar:';']; if ( state.failed == YES ) return ;
-          /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-        [state setType:_type];
-
-        state.channel = _channel;
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "RETURN"
-
-// $ANTLR start "CLASS"
-- (void) mCLASS
-{
-    //
-    // ruleScopeSetUp
-
-    @try {
-        NSInteger _type = CLASS;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        id<ANTLRToken> name=nil;
-
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:14:2: ( 'class' WS name= ID ( WS )? ( 'extends' WS QID ( WS )? )? ( 'implements' WS QID ( WS )? ( ',' ( WS )? QID ( WS )? )* )? '{' ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:14:4: 'class' WS name= ID ( WS )? ( 'extends' WS QID ( WS )? )? ( 'implements' WS QID ( WS )? ( ',' ( WS )? QID ( WS )? )* )? '{' // alt
-        {
-        [self matchString:@"class"]; if ( state.failed == YES ) return ;
-          /* element() */
-            [self mWS]; if ( state.failed == YES ) return ;
-          /* element() */
-        NSInteger nameStart81 = [self getIndex];
-        [self mID]; if ( state.failed == YES ) return ;
-
-        name = [[ANTLRCommonToken newANTLRCommonToken:input Type:ANTLRTokenTypeInvalid Channel:ANTLRTokenChannelDefault Start:nameStart81 Stop:[self getIndex]-1] retain];
-        [name setLine:[self getLine]];  /* element() */
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:14:23: ( WS )? // block
-        NSInteger alt3=2;
-        NSInteger LA3_0 = [input LA:1];
-
-        if ( ((LA3_0>='\t' && LA3_0<='\n')||LA3_0==' ') ) {
-            alt3=1;
-        }
-        switch (alt3) {
-            case 1 : ;
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:14:23: WS // alt
-                {
-                    [self mWS]; if ( state.failed == YES ) return ;
-                  /* element() */
-                 /* elements */
-                }
-                break;
-
-        }
-          /* element() */
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:14:27: ( 'extends' WS QID ( WS )? )? // block
-        NSInteger alt5=2;
-        NSInteger LA5_0 = [input LA:1];
-
-        if ( (LA5_0=='e') ) {
-            alt5=1;
-        }
-        switch (alt5) {
-            case 1 : ;
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:14:28: 'extends' WS QID ( WS )? // alt
-                {
-                [self matchString:@"extends"]; if ( state.failed == YES ) return ;
-                  /* element() */
-                    [self mWS]; if ( state.failed == YES ) return ;
-                  /* element() */
-                    [self mQID]; if ( state.failed == YES ) return ;
-                  /* element() */
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:14:45: ( WS )? // block
-                NSInteger alt4=2;
-                NSInteger LA4_0 = [input LA:1];
-
-                if ( ((LA4_0>='\t' && LA4_0<='\n')||LA4_0==' ') ) {
-                    alt4=1;
-                }
-                switch (alt4) {
-                    case 1 : ;
-                        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:14:45: WS // alt
-                        {
-                            [self mWS]; if ( state.failed == YES ) return ;
-                          /* element() */
-                         /* elements */
-                        }
-                        break;
-
-                }
-                  /* element() */
-                 /* elements */
-                }
-                break;
-
-        }
-          /* element() */
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:15:3: ( 'implements' WS QID ( WS )? ( ',' ( WS )? QID ( WS )? )* )? // block
-        NSInteger alt10=2;
-        NSInteger LA10_0 = [input LA:1];
-
-        if ( (LA10_0=='i') ) {
-            alt10=1;
-        }
-        switch (alt10) {
-            case 1 : ;
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:15:4: 'implements' WS QID ( WS )? ( ',' ( WS )? QID ( WS )? )* // alt
-                {
-                [self matchString:@"implements"]; if ( state.failed == YES ) return ;
-                  /* element() */
-                    [self mWS]; if ( state.failed == YES ) return ;
-                  /* element() */
-                    [self mQID]; if ( state.failed == YES ) return ;
-                  /* element() */
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:15:24: ( WS )? // block
-                NSInteger alt6=2;
-                NSInteger LA6_0 = [input LA:1];
-
-                if ( ((LA6_0>='\t' && LA6_0<='\n')||LA6_0==' ') ) {
-                    alt6=1;
-                }
-                switch (alt6) {
-                    case 1 : ;
-                        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:15:24: WS // alt
-                        {
-                            [self mWS]; if ( state.failed == YES ) return ;
-                          /* element() */
-                         /* elements */
-                        }
-                        break;
-
-                }
-                  /* element() */
-                do {
-                    NSInteger alt9=2;
-                    NSInteger LA9_0 = [input LA:1];
-                    if ( (LA9_0==',') ) {
-                        alt9=1;
-                    }
-
-
-                    switch (alt9) {
-                        case 1 : ;
-                            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:15:29: ',' ( WS )? QID ( WS )? // alt
-                            {
-                            [self matchChar:',']; if ( state.failed == YES ) return ;
-                              /* element() */
-                            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:15:33: ( WS )? // block
-                            NSInteger alt7=2;
-                            NSInteger LA7_0 = [input LA:1];
-
-                            if ( ((LA7_0>='\t' && LA7_0<='\n')||LA7_0==' ') ) {
-                                alt7=1;
-                            }
-                            switch (alt7) {
-                                case 1 : ;
-                                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:15:33: WS // alt
-                                    {
-                                        [self mWS]; if ( state.failed == YES ) return ;
-                                      /* element() */
-                                     /* elements */
-                                    }
-                                    break;
-
-                            }
-                              /* element() */
-                                [self mQID]; if ( state.failed == YES ) return ;
-                              /* element() */
-                            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:15:41: ( WS )? // block
-                            NSInteger alt8=2;
-                            NSInteger LA8_0 = [input LA:1];
-
-                            if ( ((LA8_0>='\t' && LA8_0<='\n')||LA8_0==' ') ) {
-                                alt8=1;
-                            }
-                            switch (alt8) {
-                                case 1 : ;
-                                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:15:41: WS // alt
-                                    {
-                                        [self mWS]; if ( state.failed == YES ) return ;
-                                      /* element() */
-                                     /* elements */
-                                    }
-                                    break;
-
-                            }
-                              /* element() */
-                             /* elements */
-                            }
-                            break;
-
-                        default :
-                            goto loop9;
-                    }
-                } while (YES);
-                loop9: ;
-                  /* element() */
-                 /* elements */
-                }
-                break;
-
-        }
-          /* element() */
-        [self matchChar:'{']; if ( state.failed == YES ) return ;
-          /* element() */
-        if ( state.backtracking == 1 ) {
-            NSLog(@"found class %@", (name!=nil?[name getText]:0));
-        }  /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-        [state setType:_type];
-
-        state.channel = _channel;
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "CLASS"
-
-// $ANTLR start "METHOD"
-- (void) mMETHOD
-{
-    //
-    // ruleScopeSetUp
-
-    @try {
-        NSInteger _type = METHOD;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        id<ANTLRToken> name=nil;
-
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:20:5: ( TYPE WS name= ID ( WS )? '(' ( ARG ( WS )? ( ',' ( WS )? ARG ( WS )? )* )? ')' ( WS )? ( 'throws' WS QID ( WS )? ( ',' ( WS )? QID ( WS )? )* )? '{' ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:20:9: TYPE WS name= ID ( WS )? '(' ( ARG ( WS )? ( ',' ( WS )? ARG ( WS )? )* )? ')' ( WS )? ( 'throws' WS QID ( WS )? ( ',' ( WS )? QID ( WS )? )* )? '{' // alt
-        {
-            [self mTYPE]; if ( state.failed == YES ) return ;
-          /* element() */
-            [self mWS]; if ( state.failed == YES ) return ;
-          /* element() */
-        NSInteger nameStart158 = [self getIndex];
-        [self mID]; if ( state.failed == YES ) return ;
-
-        name = [[ANTLRCommonToken newANTLRCommonToken:input Type:ANTLRTokenTypeInvalid Channel:ANTLRTokenChannelDefault Start:nameStart158 Stop:[self getIndex]-1] retain];
-        [name setLine:[self getLine]];  /* element() */
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:20:25: ( WS )? // block
-        NSInteger alt11=2;
-        NSInteger LA11_0 = [input LA:1];
-
-        if ( ((LA11_0>='\t' && LA11_0<='\n')||LA11_0==' ') ) {
-            alt11=1;
-        }
-        switch (alt11) {
-            case 1 : ;
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:20:25: WS // alt
-                {
-                    [self mWS]; if ( state.failed == YES ) return ;
-                  /* element() */
-                 /* elements */
-                }
-                break;
-
-        }
-          /* element() */
-        [self matchChar:'(']; if ( state.failed == YES ) return ;
-          /* element() */
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:20:33: ( ARG ( WS )? ( ',' ( WS )? ARG ( WS )? )* )? // block
-        NSInteger alt16=2;
-        NSInteger LA16_0 = [input LA:1];
-
-        if ( ((LA16_0>='A' && LA16_0<='Z')||LA16_0=='_'||(LA16_0>='a' && LA16_0<='z')) ) {
-            alt16=1;
-        }
-        switch (alt16) {
-            case 1 : ;
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:20:35: ARG ( WS )? ( ',' ( WS )? ARG ( WS )? )* // alt
-                {
-                    [self mARG]; if ( state.failed == YES ) return ;
-                  /* element() */
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:20:39: ( WS )? // block
-                NSInteger alt12=2;
-                NSInteger LA12_0 = [input LA:1];
-
-                if ( ((LA12_0>='\t' && LA12_0<='\n')||LA12_0==' ') ) {
-                    alt12=1;
-                }
-                switch (alt12) {
-                    case 1 : ;
-                        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:20:39: WS // alt
-                        {
-                            [self mWS]; if ( state.failed == YES ) return ;
-                          /* element() */
-                         /* elements */
-                        }
-                        break;
-
-                }
-                  /* element() */
-                do {
-                    NSInteger alt15=2;
-                    NSInteger LA15_0 = [input LA:1];
-                    if ( (LA15_0==',') ) {
-                        alt15=1;
-                    }
-
-
-                    switch (alt15) {
-                        case 1 : ;
-                            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:20:44: ',' ( WS )? ARG ( WS )? // alt
-                            {
-                            [self matchChar:',']; if ( state.failed == YES ) return ;
-                              /* element() */
-                            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:20:48: ( WS )? // block
-                            NSInteger alt13=2;
-                            NSInteger LA13_0 = [input LA:1];
-
-                            if ( ((LA13_0>='\t' && LA13_0<='\n')||LA13_0==' ') ) {
-                                alt13=1;
-                            }
-                            switch (alt13) {
-                                case 1 : ;
-                                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:20:48: WS // alt
-                                    {
-                                        [self mWS]; if ( state.failed == YES ) return ;
-                                      /* element() */
-                                     /* elements */
-                                    }
-                                    break;
-
-                            }
-                              /* element() */
-                                [self mARG]; if ( state.failed == YES ) return ;
-                              /* element() */
-                            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:20:56: ( WS )? // block
-                            NSInteger alt14=2;
-                            NSInteger LA14_0 = [input LA:1];
-
-                            if ( ((LA14_0>='\t' && LA14_0<='\n')||LA14_0==' ') ) {
-                                alt14=1;
-                            }
-                            switch (alt14) {
-                                case 1 : ;
-                                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:20:56: WS // alt
-                                    {
-                                        [self mWS]; if ( state.failed == YES ) return ;
-                                      /* element() */
-                                     /* elements */
-                                    }
-                                    break;
-
-                            }
-                              /* element() */
-                             /* elements */
-                            }
-                            break;
-
-                        default :
-                            goto loop15;
-                    }
-                } while (YES);
-                loop15: ;
-                  /* element() */
-                 /* elements */
-                }
-                break;
-
-        }
-          /* element() */
-        [self matchChar:')']; if ( state.failed == YES ) return ;
-          /* element() */
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:20:69: ( WS )? // block
-        NSInteger alt17=2;
-        NSInteger LA17_0 = [input LA:1];
-
-        if ( ((LA17_0>='\t' && LA17_0<='\n')||LA17_0==' ') ) {
-            alt17=1;
-        }
-        switch (alt17) {
-            case 1 : ;
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:20:69: WS // alt
-                {
-                    [self mWS]; if ( state.failed == YES ) return ;
-                  /* element() */
-                 /* elements */
-                }
-                break;
-
-        }
-          /* element() */
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:21:8: ( 'throws' WS QID ( WS )? ( ',' ( WS )? QID ( WS )? )* )? // block
-        NSInteger alt22=2;
-        NSInteger LA22_0 = [input LA:1];
-
-        if ( (LA22_0=='t') ) {
-            alt22=1;
-        }
-        switch (alt22) {
-            case 1 : ;
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:21:9: 'throws' WS QID ( WS )? ( ',' ( WS )? QID ( WS )? )* // alt
-                {
-                [self matchString:@"throws"]; if ( state.failed == YES ) return ;
-                  /* element() */
-                    [self mWS]; if ( state.failed == YES ) return ;
-                  /* element() */
-                    [self mQID]; if ( state.failed == YES ) return ;
-                  /* element() */
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:21:25: ( WS )? // block
-                NSInteger alt18=2;
-                NSInteger LA18_0 = [input LA:1];
-
-                if ( ((LA18_0>='\t' && LA18_0<='\n')||LA18_0==' ') ) {
-                    alt18=1;
-                }
-                switch (alt18) {
-                    case 1 : ;
-                        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:21:25: WS // alt
-                        {
-                            [self mWS]; if ( state.failed == YES ) return ;
-                          /* element() */
-                         /* elements */
-                        }
-                        break;
-
-                }
-                  /* element() */
-                do {
-                    NSInteger alt21=2;
-                    NSInteger LA21_0 = [input LA:1];
-                    if ( (LA21_0==',') ) {
-                        alt21=1;
-                    }
-
-
-                    switch (alt21) {
-                        case 1 : ;
-                            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:21:30: ',' ( WS )? QID ( WS )? // alt
-                            {
-                            [self matchChar:',']; if ( state.failed == YES ) return ;
-                              /* element() */
-                            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:21:34: ( WS )? // block
-                            NSInteger alt19=2;
-                            NSInteger LA19_0 = [input LA:1];
-
-                            if ( ((LA19_0>='\t' && LA19_0<='\n')||LA19_0==' ') ) {
-                                alt19=1;
-                            }
-                            switch (alt19) {
-                                case 1 : ;
-                                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:21:34: WS // alt
-                                    {
-                                        [self mWS]; if ( state.failed == YES ) return ;
-                                      /* element() */
-                                     /* elements */
-                                    }
-                                    break;
-
-                            }
-                              /* element() */
-                                [self mQID]; if ( state.failed == YES ) return ;
-                              /* element() */
-                            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:21:42: ( WS )? // block
-                            NSInteger alt20=2;
-                            NSInteger LA20_0 = [input LA:1];
-
-                            if ( ((LA20_0>='\t' && LA20_0<='\n')||LA20_0==' ') ) {
-                                alt20=1;
-                            }
-                            switch (alt20) {
-                                case 1 : ;
-                                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:21:42: WS // alt
-                                    {
-                                        [self mWS]; if ( state.failed == YES ) return ;
-                                      /* element() */
-                                     /* elements */
-                                    }
-                                    break;
-
-                            }
-                              /* element() */
-                             /* elements */
-                            }
-                            break;
-
-                        default :
-                            goto loop21;
-                    }
-                } while (YES);
-                loop21: ;
-                  /* element() */
-                 /* elements */
-                }
-                break;
-
-        }
-          /* element() */
-        [self matchChar:'{']; if ( state.failed == YES ) return ;
-          /* element() */
-        if ( state.backtracking == 1 ) {
-            NSLog(@"found method %@", (name!=nil?[name getText]:0));
-        }  /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-        [state setType:_type];
-
-        state.channel = _channel;
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "METHOD"
-
-// $ANTLR start "FIELD"
-- (void) mFIELD
-{
-    //
-    // ruleScopeSetUp
-
-    @try {
-        NSInteger _type = FIELD;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        id<ANTLRToken> name=nil;
-
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:26:5: ( TYPE WS name= ID ( '[]' )? ( WS )? ( ';' | '=' ) ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:26:9: TYPE WS name= ID ( '[]' )? ( WS )? ( ';' | '=' ) // alt
-        {
-            [self mTYPE]; if ( state.failed == YES ) return ;
-          /* element() */
-            [self mWS]; if ( state.failed == YES ) return ;
-          /* element() */
-        NSInteger nameStart261 = [self getIndex];
-        [self mID]; if ( state.failed == YES ) return ;
-
-        name = [[ANTLRCommonToken newANTLRCommonToken:input Type:ANTLRTokenTypeInvalid Channel:ANTLRTokenChannelDefault Start:nameStart261 Stop:[self getIndex]-1] retain];
-        [name setLine:[self getLine]];  /* element() */
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:26:25: ( '[]' )? // block
-        NSInteger alt23=2;
-        NSInteger LA23_0 = [input LA:1];
-
-        if ( (LA23_0=='[') ) {
-            alt23=1;
-        }
-        switch (alt23) {
-            case 1 : ;
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:26:25: '[]' // alt
-                {
-                [self matchString:@"[]"]; if ( state.failed == YES ) return ;
-                  /* element() */
-                 /* elements */
-                }
-                break;
-
-        }
-          /* element() */
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:26:31: ( WS )? // block
-        NSInteger alt24=2;
-        NSInteger LA24_0 = [input LA:1];
-
-        if ( ((LA24_0>='\t' && LA24_0<='\n')||LA24_0==' ') ) {
-            alt24=1;
-        }
-        switch (alt24) {
-            case 1 : ;
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:26:31: WS // alt
-                {
-                    [self mWS]; if ( state.failed == YES ) return ;
-                  /* element() */
-                 /* elements */
-                }
-                break;
-
-        }
-          /* element() */
-        if ([input LA:1] == ';'||[input LA:1] == '=') {
-            [input consume];
-        state.failed = NO;
-
-        } else {
-            if ( state.backtracking > 0 ) { state.failed = YES; return ; }
-            ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException exceptionWithSet:nil stream:input];
-            [self recover:mse];
-            @throw mse;}
-          /* element() */
-        if ( state.backtracking == 1 ) {
-            NSLog(@"found var %@", (name!=nil?[name getText]:0));
-        }  /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-        [state setType:_type];
-
-        state.channel = _channel;
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "FIELD"
-
-// $ANTLR start "STAT"
-- (void) mSTAT
-{
-    //
-    // ruleScopeSetUp
-
-    @try {
-        NSInteger _type = STAT;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:30:5: ( ( 'if' | 'while' | 'switch' | 'for' ) ( WS )? '(' ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:30:7: ( 'if' | 'while' | 'switch' | 'for' ) ( WS )? '(' // alt
-        {
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:30:7: ( 'if' | 'while' | 'switch' | 'for' ) // block
-        NSInteger alt25=4;
-        switch ([input LA:1]) {
-            case 'i': ;
-                {
-                alt25=1;
-                }
-                break;
-            case 'w': ;
-                {
-                alt25=2;
-                }
-                break;
-            case 's': ;
-                {
-                alt25=3;
-                }
-                break;
-            case 'f': ;
-                {
-                alt25=4;
-                }
-                break;
-
-        default: ;
-            if ( state.backtracking > 0 ) { state.failed = YES; return ; }
-            ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newANTLRNoViableAltException:25 state:0 stream:input];
-            @throw nvae;
-        }
-
-        switch (alt25) {
-            case 1 : ;
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:30:8: 'if' // alt
-                {
-                [self matchString:@"if"]; if ( state.failed == YES ) return ;
-                  /* element() */
-                 /* elements */
-                }
-                break;
-            case 2 : ;
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:30:13: 'while' // alt
-                {
-                [self matchString:@"while"]; if ( state.failed == YES ) return ;
-                  /* element() */
-                 /* elements */
-                }
-                break;
-            case 3 : ;
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:30:21: 'switch' // alt
-                {
-                [self matchString:@"switch"]; if ( state.failed == YES ) return ;
-                  /* element() */
-                 /* elements */
-                }
-                break;
-            case 4 : ;
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:30:30: 'for' // alt
-                {
-                [self matchString:@"for"]; if ( state.failed == YES ) return ;
-                  /* element() */
-                 /* elements */
-                }
-                break;
-
-        }
-          /* element() */
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:30:37: ( WS )? // block
-        NSInteger alt26=2;
-        NSInteger LA26_0 = [input LA:1];
-
-        if ( ((LA26_0>='\t' && LA26_0<='\n')||LA26_0==' ') ) {
-            alt26=1;
-        }
-        switch (alt26) {
-            case 1 : ;
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:30:37: WS // alt
-                {
-                    [self mWS]; if ( state.failed == YES ) return ;
-                  /* element() */
-                 /* elements */
-                }
-                break;
-
-        }
-          /* element() */
-        [self matchChar:'(']; if ( state.failed == YES ) return ;
-          /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-        [state setType:_type];
-
-        state.channel = _channel;
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "STAT"
-
-// $ANTLR start "CALL"
-- (void) mCALL
-{
-    //
-    // ruleScopeSetUp
-
-    @try {
-        NSInteger _type = CALL;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        id<ANTLRToken> name=nil;
-
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:33:5: (name= QID ( WS )? '(' ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:33:9: name= QID ( WS )? '(' // alt
-        {
-        NSInteger nameStart326 = [self getIndex];
-        [self mQID]; if ( state.failed == YES ) return ;
-
-        name = [[ANTLRCommonToken newANTLRCommonToken:input Type:ANTLRTokenTypeInvalid Channel:ANTLRTokenChannelDefault Start:nameStart326 Stop:[self getIndex]-1] retain];
-        [name setLine:[self getLine]];  /* element() */
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:33:18: ( WS )? // block
-        NSInteger alt27=2;
-        NSInteger LA27_0 = [input LA:1];
-
-        if ( ((LA27_0>='\t' && LA27_0<='\n')||LA27_0==' ') ) {
-            alt27=1;
-        }
-        switch (alt27) {
-            case 1 : ;
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:33:18: WS // alt
-                {
-                    [self mWS]; if ( state.failed == YES ) return ;
-                  /* element() */
-                 /* elements */
-                }
-                break;
-
-        }
-          /* element() */
-        [self matchChar:'(']; if ( state.failed == YES ) return ;
-          /* element() */
-        if ( state.backtracking == 1 ) {
-            /*ignore if this/super */ NSLog(@"found call %@",(name!=nil?[name getText]:0));
-        }  /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-        [state setType:_type];
-
-        state.channel = _channel;
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "CALL"
-
-// $ANTLR start "COMMENT"
-- (void) mCOMMENT
-{
-    //
-    // ruleScopeSetUp
-
-    @try {
-        NSInteger _type = COMMENT;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:38:5: ( '/*' ( options {greedy=false; } : . )* '*/' ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:38:9: '/*' ( options {greedy=false; } : . )* '*/' // alt
-        {
-        [self matchString:@"/*"]; if ( state.failed == YES ) return ;
-          /* element() */
-        do {
-            NSInteger alt28=2;
-            NSInteger LA28_0 = [input LA:1];
-            if ( (LA28_0=='*') ) {
-                NSInteger LA28_1 = [input LA:2];
-                if ( (LA28_1=='/') ) {
-                    alt28=2;
-                }
-                else if ( ((LA28_1>=0x0000 && LA28_1<='.')||(LA28_1>='0' && LA28_1<=0xFFFF)) ) {
-                    alt28=1;
-                }
-
-
-            }
-            else if ( ((LA28_0>=0x0000 && LA28_0<=')')||(LA28_0>='+' && LA28_0<=0xFFFF)) ) {
-                alt28=1;
-            }
-
-
-            switch (alt28) {
-                case 1 : ;
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:38:41: . // alt
-                    {
-                    [self matchAny]; if ( state.failed == YES ) return ;
-                      /* element() */
-                     /* elements */
-                    }
-                    break;
-
-                default :
-                    goto loop28;
-            }
-        } while (YES);
-        loop28: ;
-          /* element() */
-        [self matchString:@"*/"]; if ( state.failed == YES ) return ;
-          /* element() */
-        if ( state.backtracking == 1 ) {
-            NSLog(@"found comment %@", [self getText]);
-        }  /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-        [state setType:_type];
-
-        state.channel = _channel;
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "COMMENT"
-
-// $ANTLR start "SL_COMMENT"
-- (void) mSL_COMMENT
-{
-    //
-    // ruleScopeSetUp
-
-    @try {
-        NSInteger _type = SL_COMMENT;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:43:5: ( '//' ( options {greedy=false; } : . )* '\\n' ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:43:9: '//' ( options {greedy=false; } : . )* '\\n' // alt
-        {
-        [self matchString:@"//"]; if ( state.failed == YES ) return ;
-          /* element() */
-        do {
-            NSInteger alt29=2;
-            NSInteger LA29_0 = [input LA:1];
-            if ( (LA29_0=='\n') ) {
-                alt29=2;
-            }
-            else if ( ((LA29_0>=0x0000 && LA29_0<='\t')||(LA29_0>=0x000B && LA29_0<=0xFFFF)) ) {
-                alt29=1;
-            }
-
-
-            switch (alt29) {
-                case 1 : ;
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:43:41: . // alt
-                    {
-                    [self matchAny]; if ( state.failed == YES ) return ;
-                      /* element() */
-                     /* elements */
-                    }
-                    break;
-
-                default :
-                    goto loop29;
-            }
-        } while (YES);
-        loop29: ;
-          /* element() */
-        [self matchChar:'\n']; if ( state.failed == YES ) return ;
-          /* element() */
-        if ( state.backtracking == 1 ) {
-            NSLog(@"found // comment %@", [self getText]);
-        }  /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-        [state setType:_type];
-
-        state.channel = _channel;
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "SL_COMMENT"
-
-// $ANTLR start "STRING"
-- (void) mSTRING
-{
-    //
-    // ruleScopeSetUp
-
-    @try {
-        NSInteger _type = STRING;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:48:2: ( '\"' ( options {greedy=false; } : ESC | . )* '\"' ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:48:4: '\"' ( options {greedy=false; } : ESC | . )* '\"' // alt
-        {
-        [self matchChar:'"']; if ( state.failed == YES ) return ;
-          /* element() */
-        do {
-            NSInteger alt30=3;
-            NSInteger LA30_0 = [input LA:1];
-            if ( (LA30_0=='"') ) {
-                alt30=3;
-            }
-            else if ( (LA30_0=='\\') ) {
-                NSInteger LA30_2 = [input LA:2];
-                if ( (LA30_2=='"') ) {
-                    alt30=1;
-                }
-                else if ( (LA30_2=='\\') ) {
-                    alt30=1;
-                }
-                else if ( (LA30_2=='\'') ) {
-                    alt30=1;
-                }
-                else if ( ((LA30_2>=0x0000 && LA30_2<='!')||(LA30_2>='#' && LA30_2<='&')||(LA30_2>='(' && LA30_2<='[')||(LA30_2>=']' && LA30_2<=0xFFFF)) ) {
-                    alt30=2;
-                }
-
-
-            }
-            else if ( ((LA30_0>=0x0000 && LA30_0<='!')||(LA30_0>='#' && LA30_0<='[')||(LA30_0>=']' && LA30_0<=0xFFFF)) ) {
-                alt30=2;
-            }
-
-
-            switch (alt30) {
-                case 1 : ;
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:48:34: ESC // alt
-                    {
-                        [self mESC]; if ( state.failed == YES ) return ;
-                      /* element() */
-                     /* elements */
-                    }
-                    break;
-                case 2 : ;
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:48:40: . // alt
-                    {
-                    [self matchAny]; if ( state.failed == YES ) return ;
-                      /* element() */
-                     /* elements */
-                    }
-                    break;
-
-                default :
-                    goto loop30;
-            }
-        } while (YES);
-        loop30: ;
-          /* element() */
-        [self matchChar:'"']; if ( state.failed == YES ) return ;
-          /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-        [state setType:_type];
-
-        state.channel = _channel;
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "STRING"
-
-// $ANTLR start "CHAR"
-- (void) mCHAR
-{
-    //
-    // ruleScopeSetUp
-
-    @try {
-        NSInteger _type = CHAR;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:52:2: ( '\\'' ( options {greedy=false; } : ESC | . )* '\\'' ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:52:4: '\\'' ( options {greedy=false; } : ESC | . )* '\\'' // alt
-        {
-        [self matchChar:'\'']; if ( state.failed == YES ) return ;
-          /* element() */
-        do {
-            NSInteger alt31=3;
-            NSInteger LA31_0 = [input LA:1];
-            if ( (LA31_0=='\'') ) {
-                alt31=3;
-            }
-            else if ( (LA31_0=='\\') ) {
-                NSInteger LA31_2 = [input LA:2];
-                if ( (LA31_2=='\'') ) {
-                    alt31=1;
-                }
-                else if ( (LA31_2=='\\') ) {
-                    alt31=1;
-                }
-                else if ( (LA31_2=='"') ) {
-                    alt31=1;
-                }
-                else if ( ((LA31_2>=0x0000 && LA31_2<='!')||(LA31_2>='#' && LA31_2<='&')||(LA31_2>='(' && LA31_2<='[')||(LA31_2>=']' && LA31_2<=0xFFFF)) ) {
-                    alt31=2;
-                }
-
-
-            }
-            else if ( ((LA31_0>=0x0000 && LA31_0<='&')||(LA31_0>='(' && LA31_0<='[')||(LA31_0>=']' && LA31_0<=0xFFFF)) ) {
-                alt31=2;
-            }
-
-
-            switch (alt31) {
-                case 1 : ;
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:52:35: ESC // alt
-                    {
-                        [self mESC]; if ( state.failed == YES ) return ;
-                      /* element() */
-                     /* elements */
-                    }
-                    break;
-                case 2 : ;
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:52:41: . // alt
-                    {
-                    [self matchAny]; if ( state.failed == YES ) return ;
-                      /* element() */
-                     /* elements */
-                    }
-                    break;
-
-                default :
-                    goto loop31;
-            }
-        } while (YES);
-        loop31: ;
-          /* element() */
-        [self matchChar:'\'']; if ( state.failed == YES ) return ;
-          /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-        [state setType:_type];
-
-        state.channel = _channel;
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "CHAR"
-
-// $ANTLR start "WS"
-- (void) mWS
-{
-    //
-    // ruleScopeSetUp
-
-    @try {
-        NSInteger _type = WS;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:55:5: ( ( ' ' | '\\t' | '\\n' )+ ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:55:9: ( ' ' | '\\t' | '\\n' )+ // alt
-        {
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:55:9: ( ' ' | '\\t' | '\\n' )+ // positiveClosureBlock
-        NSInteger cnt32=0;
-        do {
-            NSInteger alt32=2;
-            NSInteger LA32_0 = [input LA:1];
-            if ( ((LA32_0>='\t' && LA32_0<='\n')||LA32_0==' ') ) {
-                alt32=1;
-            }
-
-
-            switch (alt32) {
-                case 1 : ;
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g: // alt
-                    {
-                    if ((([input LA:1] >= '\t') && ([input LA:1] <= '\n'))||[input LA:1] == ' ') {
-                        [input consume];
-                    state.failed = NO;
-
-                    } else {
-                        if ( state.backtracking > 0 ) { state.failed = YES; return ; }
-                        ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException exceptionWithSet:nil stream:input];
-                        [self recover:mse];
-                        @throw mse;}
-                      /* element() */
-                     /* elements */
-                    }
-                    break;
-
-                default :
-                    if ( cnt32 >= 1 )
-                        goto loop32;
-                    if ( state.backtracking > 0 ) { state.failed = YES; return ; }            ANTLREarlyExitException *eee = [ANTLREarlyExitException exceptionWithStream:input decisionNumber:32];
-                    @throw eee;
-            }
-            cnt32++;
-        } while (YES);
-        loop32: ;
-          /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-        [state setType:_type];
-
-        state.channel = _channel;
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "WS"
-
-// $ANTLR start "QID"
-- (void) mQID
-{
-    //
-    // ruleScopeSetUp
-
-    @try {
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:59:5: ( ID ( '.' ID )* ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:59:7: ID ( '.' ID )* // alt
-        {
-            [self mID]; if ( state.failed == YES ) return ;
-          /* element() */
-        do {
-            NSInteger alt33=2;
-            NSInteger LA33_0 = [input LA:1];
-            if ( (LA33_0=='.') ) {
-                alt33=1;
-            }
-
-
-            switch (alt33) {
-                case 1 : ;
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:59:11: '.' ID // alt
-                    {
-                    [self matchChar:'.']; if ( state.failed == YES ) return ;
-                      /* element() */
-                        [self mID]; if ( state.failed == YES ) return ;
-                      /* element() */
-                     /* elements */
-                    }
-                    break;
-
-                default :
-                    goto loop33;
-            }
-        } while (YES);
-        loop33: ;
-          /* element() */
-         /* elements */
-        }
-
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "QID"
-
-// $ANTLR start "QIDStar"
-- (void) mQIDStar
-{
-    //
-    // ruleScopeSetUp
-
-    @try {
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:68:2: ( ID ( '.' ID )* ( '.*' )? ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:68:4: ID ( '.' ID )* ( '.*' )? // alt
-        {
-            [self mID]; if ( state.failed == YES ) return ;
-          /* element() */
-        do {
-            NSInteger alt34=2;
-            NSInteger LA34_0 = [input LA:1];
-            if ( (LA34_0=='.') ) {
-                NSInteger LA34_1 = [input LA:2];
-                if ( ((LA34_1>='A' && LA34_1<='Z')||LA34_1=='_'||(LA34_1>='a' && LA34_1<='z')) ) {
-                    alt34=1;
-                }
-
-
-            }
-
-
-            switch (alt34) {
-                case 1 : ;
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:68:8: '.' ID // alt
-                    {
-                    [self matchChar:'.']; if ( state.failed == YES ) return ;
-                      /* element() */
-                        [self mID]; if ( state.failed == YES ) return ;
-                      /* element() */
-                     /* elements */
-                    }
-                    break;
-
-                default :
-                    goto loop34;
-            }
-        } while (YES);
-        loop34: ;
-          /* element() */
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:68:17: ( '.*' )? // block
-        NSInteger alt35=2;
-        NSInteger LA35_0 = [input LA:1];
-
-        if ( (LA35_0=='.') ) {
-            alt35=1;
-        }
-        switch (alt35) {
-            case 1 : ;
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:68:17: '.*' // alt
-                {
-                [self matchString:@".*"]; if ( state.failed == YES ) return ;
-                  /* element() */
-                 /* elements */
-                }
-                break;
-
-        }
-          /* element() */
-         /* elements */
-        }
-
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "QIDStar"
-
-// $ANTLR start "TYPE"
-- (void) mTYPE
-{
-    //
-    // ruleScopeSetUp
-
-    @try {
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:72:5: ( QID ( '[]' )? ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:72:9: QID ( '[]' )? // alt
-        {
-            [self mQID]; if ( state.failed == YES ) return ;
-          /* element() */
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:72:13: ( '[]' )? // block
-        NSInteger alt36=2;
-        NSInteger LA36_0 = [input LA:1];
-
-        if ( (LA36_0=='[') ) {
-            alt36=1;
-        }
-        switch (alt36) {
-            case 1 : ;
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:72:13: '[]' // alt
-                {
-                [self matchString:@"[]"]; if ( state.failed == YES ) return ;
-                  /* element() */
-                 /* elements */
-                }
-                break;
-
-        }
-          /* element() */
-         /* elements */
-        }
-
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "TYPE"
-
-// $ANTLR start "ARG"
-- (void) mARG
-{
-    //
-    // ruleScopeSetUp
-
-    @try {
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:76:5: ( TYPE WS ID ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:76:9: TYPE WS ID // alt
-        {
-            [self mTYPE]; if ( state.failed == YES ) return ;
-          /* element() */
-            [self mWS]; if ( state.failed == YES ) return ;
-          /* element() */
-            [self mID]; if ( state.failed == YES ) return ;
-          /* element() */
-         /* elements */
-        }
-
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "ARG"
-
-// $ANTLR start "ID"
-- (void) mID
-{
-    //
-    // ruleScopeSetUp
-
-    @try {
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:80:5: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' )* ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:80:9: ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' )* // alt
-        {
-        if ((([input LA:1] >= 'A') && ([input LA:1] <= 'Z'))||[input LA:1] == '_'||(([input LA:1] >= 'a') && ([input LA:1] <= 'z'))) {
-            [input consume];
-        state.failed = NO;
-
-        } else {
-            if ( state.backtracking > 0 ) { state.failed = YES; return ; }
-            ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException exceptionWithSet:nil stream:input];
-            [self recover:mse];
-            @throw mse;}
-          /* element() */
-        do {
-            NSInteger alt37=2;
-            NSInteger LA37_0 = [input LA:1];
-            if ( ((LA37_0>='0' && LA37_0<='9')||(LA37_0>='A' && LA37_0<='Z')||LA37_0=='_'||(LA37_0>='a' && LA37_0<='z')) ) {
-                alt37=1;
-            }
-
-
-            switch (alt37) {
-                case 1 : ;
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g: // alt
-                    {
-                    if ((([input LA:1] >= '0') && ([input LA:1] <= '9'))||(([input LA:1] >= 'A') && ([input LA:1] <= 'Z'))||[input LA:1] == '_'||(([input LA:1] >= 'a') && ([input LA:1] <= 'z'))) {
-                        [input consume];
-                    state.failed = NO;
-
-                    } else {
-                        if ( state.backtracking > 0 ) { state.failed = YES; return ; }
-                        ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException exceptionWithSet:nil stream:input];
-                        [self recover:mse];
-                        @throw mse;}
-                      /* element() */
-                     /* elements */
-                    }
-                    break;
-
-                default :
-                    goto loop37;
-            }
-        } while (YES);
-        loop37: ;
-          /* element() */
-         /* elements */
-        }
-
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "ID"
-
-// $ANTLR start "ESC"
-- (void) mESC
-{
-    //
-    // ruleScopeSetUp
-
-    @try {
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:84:5: ( '\\\\' ( '\"' | '\\'' | '\\\\' ) ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:84:7: '\\\\' ( '\"' | '\\'' | '\\\\' ) // alt
-        {
-        [self matchChar:'\\']; if ( state.failed == YES ) return ;
-          /* element() */
-        if ([input LA:1] == '"'||[input LA:1] == '\''||[input LA:1] == '\\') {
-            [input consume];
-        state.failed = NO;
-
-        } else {
-            if ( state.backtracking > 0 ) { state.failed = YES; return ; }
-            ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException exceptionWithSet:nil stream:input];
-            [self recover:mse];
-            @throw mse;}
-          /* element() */
-         /* elements */
-        }
-
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "ESC"
-
-- (void) mTokens
-{
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:1:39: ( IMPORT | RETURN | CLASS | METHOD | FIELD | STAT | CALL | COMMENT | SL_COMMENT | STRING | CHAR | WS ) //ruleblock
-    NSInteger alt38=12;
-    alt38 = [dfa38 predict:input];
-    switch (alt38) {
-        case 1 : ;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:1:41: IMPORT // alt
-            {
-                [self mIMPORT]; if ( state.failed == YES ) return ;
-              /* element() */
-             /* elements */
-            }
-            break;
-        case 2 : ;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:1:48: RETURN // alt
-            {
-                [self mRETURN]; if ( state.failed == YES ) return ;
-              /* element() */
-             /* elements */
-            }
-            break;
-        case 3 : ;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:1:55: CLASS // alt
-            {
-                [self mCLASS]; if ( state.failed == YES ) return ;
-              /* element() */
-             /* elements */
-            }
-            break;
-        case 4 : ;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:1:61: METHOD // alt
-            {
-                [self mMETHOD]; if ( state.failed == YES ) return ;
-              /* element() */
-             /* elements */
-            }
-            break;
-        case 5 : ;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:1:68: FIELD // alt
-            {
-                [self mFIELD]; if ( state.failed == YES ) return ;
-              /* element() */
-             /* elements */
-            }
-            break;
-        case 6 : ;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:1:74: STAT // alt
-            {
-                [self mSTAT]; if ( state.failed == YES ) return ;
-              /* element() */
-             /* elements */
-            }
-            break;
-        case 7 : ;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:1:79: CALL // alt
-            {
-                [self mCALL]; if ( state.failed == YES ) return ;
-              /* element() */
-             /* elements */
-            }
-            break;
-        case 8 : ;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:1:84: COMMENT // alt
-            {
-                [self mCOMMENT]; if ( state.failed == YES ) return ;
-              /* element() */
-             /* elements */
-            }
-            break;
-        case 9 : ;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:1:92: SL_COMMENT // alt
-            {
-                [self mSL_COMMENT]; if ( state.failed == YES ) return ;
-              /* element() */
-             /* elements */
-            }
-            break;
-        case 10 : ;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:1:103: STRING // alt
-            {
-                [self mSTRING]; if ( state.failed == YES ) return ;
-              /* element() */
-             /* elements */
-            }
-            break;
-        case 11 : ;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:1:110: CHAR // alt
-            {
-                [self mCHAR]; if ( state.failed == YES ) return ;
-              /* element() */
-             /* elements */
-            }
-            break;
-        case 12 : ;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:1:115: WS // alt
-            {
-                [self mWS]; if ( state.failed == YES ) return ;
-              /* element() */
-             /* elements */
-            }
-            break;
-
-    }
-
-}
-
-// $ANTLR start synpred1_Fuzzy_fragment
-- (void) synpred1_Fuzzy_fragment
-{
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:1:41: ( IMPORT ) // ruleBlockSingleAlt
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:1:41: IMPORT // alt
-    {
-        [self mIMPORT]; if ( state.failed == YES ) return ;
-      /* element() */
-     /* elements */
-    }
-} // $ANTLR end synpred1_Fuzzy_fragment
-
-// $ANTLR start synpred2_Fuzzy_fragment
-- (void) synpred2_Fuzzy_fragment
-{
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:1:48: ( RETURN ) // ruleBlockSingleAlt
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:1:48: RETURN // alt
-    {
-        [self mRETURN]; if ( state.failed == YES ) return ;
-      /* element() */
-     /* elements */
-    }
-} // $ANTLR end synpred2_Fuzzy_fragment
-
-// $ANTLR start synpred3_Fuzzy_fragment
-- (void) synpred3_Fuzzy_fragment
-{
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:1:55: ( CLASS ) // ruleBlockSingleAlt
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:1:55: CLASS // alt
-    {
-        [self mCLASS]; if ( state.failed == YES ) return ;
-      /* element() */
-     /* elements */
-    }
-} // $ANTLR end synpred3_Fuzzy_fragment
-
-// $ANTLR start synpred4_Fuzzy_fragment
-- (void) synpred4_Fuzzy_fragment
-{
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:1:61: ( METHOD ) // ruleBlockSingleAlt
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:1:61: METHOD // alt
-    {
-        [self mMETHOD]; if ( state.failed == YES ) return ;
-      /* element() */
-     /* elements */
-    }
-} // $ANTLR end synpred4_Fuzzy_fragment
-
-// $ANTLR start synpred5_Fuzzy_fragment
-- (void) synpred5_Fuzzy_fragment
-{
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:1:68: ( FIELD ) // ruleBlockSingleAlt
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:1:68: FIELD // alt
-    {
-        [self mFIELD]; if ( state.failed == YES ) return ;
-      /* element() */
-     /* elements */
-    }
-} // $ANTLR end synpred5_Fuzzy_fragment
-
-// $ANTLR start synpred6_Fuzzy_fragment
-- (void) synpred6_Fuzzy_fragment
-{
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:1:74: ( STAT ) // ruleBlockSingleAlt
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:1:74: STAT // alt
-    {
-        [self mSTAT]; if ( state.failed == YES ) return ;
-      /* element() */
-     /* elements */
-    }
-} // $ANTLR end synpred6_Fuzzy_fragment
-
-// $ANTLR start synpred7_Fuzzy_fragment
-- (void) synpred7_Fuzzy_fragment
-{
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:1:79: ( CALL ) // ruleBlockSingleAlt
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:1:79: CALL // alt
-    {
-        [self mCALL]; if ( state.failed == YES ) return ;
-      /* element() */
-     /* elements */
-    }
-} // $ANTLR end synpred7_Fuzzy_fragment
-
-// $ANTLR start synpred8_Fuzzy_fragment
-- (void) synpred8_Fuzzy_fragment
-{
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:1:84: ( COMMENT ) // ruleBlockSingleAlt
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:1:84: COMMENT // alt
-    {
-        [self mCOMMENT]; if ( state.failed == YES ) return ;
-      /* element() */
-     /* elements */
-    }
-} // $ANTLR end synpred8_Fuzzy_fragment
-
-// $ANTLR start synpred9_Fuzzy_fragment
-- (void) synpred9_Fuzzy_fragment
-{
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:1:92: ( SL_COMMENT ) // ruleBlockSingleAlt
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g:1:92: SL_COMMENT // alt
-    {
-        [self mSL_COMMENT]; if ( state.failed == YES ) return ;
-      /* element() */
-     /* elements */
-    }
-} // $ANTLR end synpred9_Fuzzy_fragment
-
-@end // end of Fuzzy implementation // line 397
-
-/* End of code
- * =============================================================================
- */
diff --git a/runtime/ObjC/Framework/examples/fuzzy/output1/Fuzzy.tokens b/runtime/ObjC/Framework/examples/fuzzy/output1/Fuzzy.tokens
deleted file mode 100644
index 3a7034c..0000000
--- a/runtime/ObjC/Framework/examples/fuzzy/output1/Fuzzy.tokens
+++ /dev/null
@@ -1,18 +0,0 @@
-STAT=15
-CLASS=10
-ESC=19
-CHAR=21
-ID=8
-QID=9
-TYPE=11
-IMPORT=6
-WS=4
-ARG=12
-QIDStar=5
-SL_COMMENT=18
-RETURN=7
-FIELD=14
-CALL=16
-COMMENT=17
-METHOD=13
-STRING=20
diff --git a/runtime/ObjC/Framework/examples/fuzzy/output1/FuzzyLexer.h b/runtime/ObjC/Framework/examples/fuzzy/output1/FuzzyLexer.h
deleted file mode 100644
index 9a4b194..0000000
--- a/runtime/ObjC/Framework/examples/fuzzy/output1/FuzzyLexer.h
+++ /dev/null
@@ -1,87 +0,0 @@
-// $ANTLR 3.2 Aug 20, 2010 13:39:32 /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/fuzzy/Fuzzy.g 2010-08-20 13:40:15
-
-/* =============================================================================
- * Standard antlr3 OBJC runtime definitions
- */
-#import <Cocoa/Cocoa.h>
-#import "antlr3.h"
-/* End of standard antlr3 runtime definitions
- * =============================================================================
- */
-
-/* Start cyclicDFAInterface */
-#pragma mark Cyclic DFA interface start DFA38
-@interface DFA38 : ANTLRDFA {
-}
-+ newDFA38WithRecognizer:(ANTLRBaseRecognizer *)theRecognizer;
-- initWithRecognizer:(ANTLRBaseRecognizer *)recognizer;
-@end
-
-#pragma mark Cyclic DFA interface end DFA38
-
-#pragma mark Rule return scopes start
-#pragma mark Rule return scopes end
-#pragma mark Tokens
-#define STAT 15
-#define CLASS 10
-#define ESC 19
-#define CHAR 21
-#define ID 8
-#define EOF -1
-#define QID 9
-#define TYPE 11
-#define IMPORT 6
-#define WS 4
-#define ARG 12
-#define QIDStar 5
-#define SL_COMMENT 18
-#define RETURN 7
-#define FIELD 14
-#define CALL 16
-#define COMMENT 17
-#define METHOD 13
-#define STRING 20
-@interface Fuzzy : ANTLRLexer { // line 283
-    DFA38 *dfa38;
-    SEL synpred9_FuzzySelector;
-    SEL synpred2_FuzzySelector;
-    SEL synpred7_FuzzySelector;
-    SEL synpred4_FuzzySelector;
-    SEL synpred8_FuzzySelector;
-    SEL synpred6_FuzzySelector;
-    SEL synpred5_FuzzySelector;
-    SEL synpred3_FuzzySelector;
-    SEL synpred1_FuzzySelector;
-}
-+ (Fuzzy *)newFuzzy:(id<ANTLRCharStream>)anInput;
-
-- (void)mIMPORT; 
-- (void)mRETURN; 
-- (void)mCLASS; 
-- (void)mMETHOD; 
-- (void)mFIELD; 
-- (void)mSTAT; 
-- (void)mCALL; 
-- (void)mCOMMENT; 
-- (void)mSL_COMMENT; 
-- (void)mSTRING; 
-- (void)mCHAR; 
-- (void)mWS; 
-- (void)mQID; 
-- (void)mQIDStar; 
-- (void)mTYPE; 
-- (void)mARG; 
-- (void)mID; 
-- (void)mESC; 
-- (void)mTokens; 
-- (void)synpred1_Fuzzy_fragment; 
-- (void)synpred2_Fuzzy_fragment; 
-- (void)synpred3_Fuzzy_fragment; 
-- (void)synpred4_Fuzzy_fragment; 
-- (void)synpred5_Fuzzy_fragment; 
-- (void)synpred6_Fuzzy_fragment; 
-- (void)synpred7_Fuzzy_fragment; 
-- (void)synpred8_Fuzzy_fragment; 
-- (void)synpred9_Fuzzy_fragment; 
-
-@end // end of Fuzzy interface
\ No newline at end of file
diff --git a/runtime/ObjC/Framework/examples/hoistedPredicates/TLexer.h b/runtime/ObjC/Framework/examples/hoistedPredicates/TLexer.h
index 9f5067d..5b93d1d 100644
--- a/runtime/ObjC/Framework/examples/hoistedPredicates/TLexer.h
+++ b/runtime/ObjC/Framework/examples/hoistedPredicates/TLexer.h
@@ -1,9 +1,9 @@
-// $ANTLR ${project.version} ${buildNumber} T.g 2011-05-06 19:14:23
+// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/hoistedPredicates/T.g 2012-02-16 17:34:26
 
 /* =============================================================================
- * Standard antlr3 OBJC runtime definitions
+ * Standard antlr OBJC runtime definitions
  */
-#import <Cocoa/Cocoa.h>
+#import <Foundation/Foundation.h>
 #import <ANTLR/ANTLR.h>
 /* End of standard antlr3 runtime definitions
  * =============================================================================
@@ -11,8 +11,8 @@
 
 /* Start cyclicDFAInterface */
 
-#pragma mark Rule return scopes start
-#pragma mark Rule return scopes end
+#pragma mark Rule return scopes Interface start
+#pragma mark Rule return scopes Interface end
 #pragma mark Tokens
 #ifdef EOF
 #undef EOF
@@ -23,12 +23,12 @@
 #define INT 5
 #define WS 6
 /* interface lexer class */
-@interface TLexer : ANTLRLexer { // line 283
+@interface TLexer : Lexer { // line 283
 /* ObjC start of actions.lexer.memVars */
 /* ObjC end of actions.lexer.memVars */
 }
 + (void) initialize;
-+ (TLexer *)newTLexerWithCharStream:(id<ANTLRCharStream>)anInput;
++ (TLexer *)newTLexerWithCharStream:(id<CharStream>)anInput;
 /* ObjC start actions.lexer.methodsDecl */
 /* ObjC end actions.lexer.methodsDecl */
 - (void) mT__7 ; 
diff --git a/runtime/ObjC/Framework/examples/hoistedPredicates/TLexer.m b/runtime/ObjC/Framework/examples/hoistedPredicates/TLexer.m
index b55e539..a19b3df 100644
--- a/runtime/ObjC/Framework/examples/hoistedPredicates/TLexer.m
+++ b/runtime/ObjC/Framework/examples/hoistedPredicates/TLexer.m
@@ -1,8 +1,8 @@
 /** \file
- *  This OBJC source file was generated by $ANTLR version ${project.version} ${buildNumber}
+ *  This OBJC source file was generated by $ANTLR version 3.4
  *
- *     -  From the grammar source file : T.g
- *     -                            On : 2011-05-06 19:14:23
+ *     -  From the grammar source file : /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/hoistedPredicates/T.g
+ *     -                            On : 2012-02-16 17:34:26
  *     -                 for the lexer : TLexerLexer
  *
  * Editing it, at least manually, is not wise.
@@ -11,7 +11,7 @@
  *
  *
 */
-// $ANTLR ${project.version} ${buildNumber} T.g 2011-05-06 19:14:23
+// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/hoistedPredicates/T.g 2012-02-16 17:34:26
 
 
 /* -----------------------------------------
@@ -31,7 +31,7 @@
 
 + (void) initialize
 {
-    [ANTLRBaseRecognizer setGrammarFileName:@"T.g"];
+    [BaseRecognizer setGrammarFileName:@"/Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/hoistedPredicates/T.g"];
 }
 
 + (NSString *) tokenNameForType:(NSInteger)aTokenType
@@ -39,14 +39,14 @@
     return [[self getTokenNames] objectAtIndex:aTokenType];
 }
 
-+ (TLexer *)newTLexerWithCharStream:(id<ANTLRCharStream>)anInput
++ (TLexer *)newTLexerWithCharStream:(id<CharStream>)anInput
 {
     return [[TLexer alloc] initWithCharStream:anInput];
 }
 
-- (id) initWithCharStream:(id<ANTLRCharStream>)anInput
+- (id) initWithCharStream:(id<CharStream>)anInput
 {
-    self = [super initWithCharStream:anInput State:[[ANTLRRecognizerSharedState newANTLRRecognizerSharedStateWithRuleLen:5+1] retain]];
+    self = [super initWithCharStream:anInput State:[RecognizerSharedState newRecognizerSharedStateWithRuleLen:5+1]];
     if ( self != nil ) {
     }
     return self;
@@ -67,56 +67,61 @@
 - (void) mT__7
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = T__7;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // T.g:7:6: ( 'enum' ) // ruleBlockSingleAlt
-        // T.g:7:8: 'enum' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/hoistedPredicates/T.g:7:6: ( 'enum' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/hoistedPredicates/T.g:7:8: 'enum' // alt
         {
+
+
         [self matchString:@"enum"]; 
 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "T__7" */
-
 // $ANTLR start "ID"
 - (void) mID
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = ID;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // T.g:37:5: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' )* ) // ruleBlockSingleAlt
-        // T.g:37:9: ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' )* // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/hoistedPredicates/T.g:37:5: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' )* ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/hoistedPredicates/T.g:37:9: ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' )* // alt
         {
+
         if ((([input LA:1] >= 'A') && ([input LA:1] <= 'Z'))||[input LA:1] == '_'||(([input LA:1] >= 'a') && ([input LA:1] <= 'z'))) {
             [input consume];
         } else {
-            ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException newException:nil stream:input];
+            MismatchedSetException *mse = [MismatchedSetException newException:nil stream:input];
             [self recover:mse];
             @throw mse;
         }
 
+         
 
         do {
             NSInteger alt1=2;
@@ -128,17 +133,18 @@
 
             switch (alt1) {
                 case 1 : ;
-                    // T.g: // alt
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/hoistedPredicates/T.g: // alt
                     {
+
                     if ((([input LA:1] >= '0') && ([input LA:1] <= '9'))||(([input LA:1] >= 'A') && ([input LA:1] <= 'Z'))||[input LA:1] == '_'||(([input LA:1] >= 'a') && ([input LA:1] <= 'z'))) {
                         [input consume];
                     } else {
-                        ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException newException:nil stream:input];
+                        MismatchedSetException *mse = [MismatchedSetException newException:nil stream:input];
                         [self recover:mse];
                         @throw mse;
                     }
 
-
+                     
                     }
                     break;
 
@@ -148,37 +154,38 @@
         } while (YES);
         loop1: ;
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "ID" */
-
 // $ANTLR start "INT"
 - (void) mINT
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = INT;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // T.g:40:5: ( ( '0' .. '9' )+ ) // ruleBlockSingleAlt
-        // T.g:40:7: ( '0' .. '9' )+ // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/hoistedPredicates/T.g:40:5: ( ( '0' .. '9' )+ ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/hoistedPredicates/T.g:40:7: ( '0' .. '9' )+ // alt
         {
-        // T.g:40:7: ( '0' .. '9' )+ // positiveClosureBlock
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/hoistedPredicates/T.g:40:7: ( '0' .. '9' )+ // positiveClosureBlock
         NSInteger cnt2 = 0;
         do {
             NSInteger alt2 = 2;
@@ -190,62 +197,64 @@
 
             switch (alt2) {
                 case 1 : ;
-                    // T.g: // alt
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/hoistedPredicates/T.g: // alt
                     {
+
                     if ((([input LA:1] >= '0') && ([input LA:1] <= '9'))) {
                         [input consume];
                     } else {
-                        ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException newException:nil stream:input];
+                        MismatchedSetException *mse = [MismatchedSetException newException:nil stream:input];
                         [self recover:mse];
                         @throw mse;
                     }
 
-
+                     
                     }
                     break;
 
                 default :
                     if ( cnt2 >= 1 )
                         goto loop2;
-                    ANTLREarlyExitException *eee =
-                        [ANTLREarlyExitException newException:input decisionNumber:2];
+                    EarlyExitException *eee =
+                        [EarlyExitException newException:input decisionNumber:2];
                     @throw eee;
             }
             cnt2++;
         } while (YES);
         loop2: ;
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "INT" */
-
 // $ANTLR start "WS"
 - (void) mWS
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = WS;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // T.g:43:5: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ ) // ruleBlockSingleAlt
-        // T.g:43:9: ( ' ' | '\\t' | '\\r' | '\\n' )+ // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/hoistedPredicates/T.g:43:5: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/hoistedPredicates/T.g:43:9: ( ' ' | '\\t' | '\\r' | '\\n' )+ // alt
         {
-        // T.g:43:9: ( ' ' | '\\t' | '\\r' | '\\n' )+ // positiveClosureBlock
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/hoistedPredicates/T.g:43:9: ( ' ' | '\\t' | '\\r' | '\\n' )+ // positiveClosureBlock
         NSInteger cnt3 = 0;
         do {
             NSInteger alt3 = 2;
@@ -257,54 +266,55 @@
 
             switch (alt3) {
                 case 1 : ;
-                    // T.g: // alt
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/hoistedPredicates/T.g: // alt
                     {
+
                     if ((([input LA:1] >= '\t') && ([input LA:1] <= '\n'))||[input LA:1] == '\r'||[input LA:1] == ' ') {
                         [input consume];
                     } else {
-                        ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException newException:nil stream:input];
+                        MismatchedSetException *mse = [MismatchedSetException newException:nil stream:input];
                         [self recover:mse];
                         @throw mse;
                     }
 
-
+                     
                     }
                     break;
 
                 default :
                     if ( cnt3 >= 1 )
                         goto loop3;
-                    ANTLREarlyExitException *eee =
-                        [ANTLREarlyExitException newException:input decisionNumber:3];
+                    EarlyExitException *eee =
+                        [EarlyExitException newException:input decisionNumber:3];
                     @throw eee;
             }
             cnt3++;
         } while (YES);
         loop3: ;
 
+         
 
          _channel=99; 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "WS" */
-
 - (void) mTokens
 {
-    // T.g:1:8: ( T__7 | ID | INT | WS ) //ruleblock
+    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/hoistedPredicates/T.g:1:8: ( T__7 | ID | INT | WS ) //ruleblock
     NSInteger alt4=4;
     unichar charLA4 = [input LA:1];
     switch (charLA4) {
@@ -421,7 +431,7 @@
             break;
 
     default: ;
-        ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newException:4 state:0 stream:input];
+        NoViableAltException *nvae = [NoViableAltException newException:4 state:0 stream:input];
         nvae.c = charLA4;
         @throw nvae;
 
@@ -429,39 +439,47 @@
 
     switch (alt4) {
         case 1 : ;
-            // T.g:1:10: T__7 // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/hoistedPredicates/T.g:1:10: T__7 // alt
             {
+
+
             [self mT__7]; 
 
 
-
+             
             }
             break;
         case 2 : ;
-            // T.g:1:15: ID // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/hoistedPredicates/T.g:1:15: ID // alt
             {
+
+
             [self mID]; 
 
 
-
+             
             }
             break;
         case 3 : ;
-            // T.g:1:18: INT // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/hoistedPredicates/T.g:1:18: INT // alt
             {
+
+
             [self mINT]; 
 
 
-
+             
             }
             break;
         case 4 : ;
-            // T.g:1:22: WS // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/hoistedPredicates/T.g:1:22: WS // alt
             {
+
+
             [self mWS]; 
 
 
-
+             
             }
             break;
 
diff --git a/runtime/ObjC/Framework/examples/hoistedPredicates/TParser.h b/runtime/ObjC/Framework/examples/hoistedPredicates/TParser.h
index 898d0de..ddc2b48 100644
--- a/runtime/ObjC/Framework/examples/hoistedPredicates/TParser.h
+++ b/runtime/ObjC/Framework/examples/hoistedPredicates/TParser.h
@@ -1,9 +1,9 @@
-// $ANTLR ${project.version} ${buildNumber} T.g 2011-05-06 19:14:23
+// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/hoistedPredicates/T.g 2012-02-16 17:34:26
 
 /* =============================================================================
- * Standard antlr3 OBJC runtime definitions
+ * Standard antlr OBJC runtime definitions
  */
-#import <Cocoa/Cocoa.h>
+#import <Foundation/Foundation.h>
 #import <ANTLR/ANTLR.h>
 /* End of standard antlr3 runtime definitions
  * =============================================================================
@@ -31,20 +31,16 @@
 #define ID 4
 #define INT 5
 #define WS 6
-#pragma mark Dynamic Global Scopes
-#pragma mark Dynamic Rule Scopes
-#pragma mark Rule Return Scopes start
+#pragma mark Dynamic Global Scopes globalAttributeScopeInterface
+#pragma mark Dynamic Rule Scopes ruleAttributeScopeInterface
+#pragma mark Rule Return Scopes returnScopeInterface
 
 /* Interface grammar class */
-@interface TParser : ANTLRParser { /* line 572 */
-/* ObjC start of ruleAttributeScopeMemVar */
+@interface TParser  : Parser { /* line 572 */
+#pragma mark Dynamic Rule Scopes ruleAttributeScopeDecl
+#pragma mark Dynamic Global Rule Scopes globalAttributeScopeMemVar
 
 
-/* ObjC end of ruleAttributeScopeMemVar */
-/* ObjC start of globalAttributeScopeMemVar */
-
-
-/* ObjC end of globalAttributeScopeMemVar */
 /* ObjC start of actions.(actionScope).memVars */
 
 /* With this true, enum is seen as a keyword.  False, it's an identifier */
@@ -62,7 +58,7 @@
 /* ObjC end of properties */
 
 + (void) initialize;
-+ (id) newTParser:(id<ANTLRTokenStream>)aStream;
++ (id) newTParser:(id<TokenStream>)aStream;
 /* ObjC start of actions.(actionScope).methodsDecl */
 /* ObjC end of actions.(actionScope).methodsDecl */
 
diff --git a/runtime/ObjC/Framework/examples/hoistedPredicates/TParser.m b/runtime/ObjC/Framework/examples/hoistedPredicates/TParser.m
index e440290..2aae318 100644
--- a/runtime/ObjC/Framework/examples/hoistedPredicates/TParser.m
+++ b/runtime/ObjC/Framework/examples/hoistedPredicates/TParser.m
@@ -1,8 +1,8 @@
 /** \file
- *  This OBJC source file was generated by $ANTLR version ${project.version} ${buildNumber}
+ *  This OBJC source file was generated by $ANTLR version 3.4
  *
- *     -  From the grammar source file : T.g
- *     -                            On : 2011-05-06 19:14:23
+ *     -  From the grammar source file : /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/hoistedPredicates/T.g
+ *     -                            On : 2012-02-16 17:34:26
  *     -                for the parser : TParserParser
  *
  * Editing it, at least manually, is not wise.
@@ -11,7 +11,7 @@
  *
  *
 */
-// $ANTLR ${project.version} ${buildNumber} T.g 2011-05-06 19:14:23
+// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/hoistedPredicates/T.g 2012-02-16 17:34:26
 
 
 /* -----------------------------------------
@@ -49,57 +49,47 @@
 static const unsigned long long FOLLOW_7_in_enumAsID100_data[] = { 0x0000000000000002LL};
 
 
-#pragma mark Dynamic Global Scopes
+#pragma mark Dynamic Global globalAttributeScopeImplementation
 
-#pragma mark Dynamic Rule Scopes
+#pragma mark Dynamic Rule Scopes ruleAttributeScopeImplementation
 
-#pragma mark Rule Return Scopes start
-//#pragma mark Rule return scopes start
-//
-
-#pragma mark Rule return scopes start
+#pragma mark Rule Return Scopes returnScopeImplementation
 
 @implementation TParser  // line 637
 
 /* ObjC start of ruleAttributeScope */
-#pragma mark Dynamic Rule Scopes
+#pragma mark Dynamic Rule Scopes ruleAttributeScope
 /* ObjC end of ruleAttributeScope */
-#pragma mark global Attribute Scopes
+#pragma mark global Attribute Scopes globalAttributeScope
 /* ObjC start globalAttributeScope */
 /* ObjC end globalAttributeScope */
 /* ObjC start actions.(actionScope).synthesize */
-/* ObjC end actions.(actionScope).synthesize */
 /* ObjC start synthesize() */
-/* ObjC end synthesize() */
 
 + (void) initialize
 {
     #pragma mark Bitsets
-    FOLLOW_identifier_in_stat34 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_identifier_in_stat34_data Count:(NSUInteger)1] retain];
-    FOLLOW_enumAsKeyword_in_stat47 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_enumAsKeyword_in_stat47_data Count:(NSUInteger)1] retain];
-    FOLLOW_ID_in_identifier66 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_ID_in_identifier66_data Count:(NSUInteger)1] retain];
-    FOLLOW_enumAsID_in_identifier74 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_enumAsID_in_identifier74_data Count:(NSUInteger)1] retain];
-    FOLLOW_7_in_enumAsKeyword89 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_7_in_enumAsKeyword89_data Count:(NSUInteger)1] retain];
-    FOLLOW_7_in_enumAsID100 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_7_in_enumAsID100_data Count:(NSUInteger)1] retain];
+    FOLLOW_identifier_in_stat34 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_identifier_in_stat34_data Count:(NSUInteger)1] retain];
+    FOLLOW_enumAsKeyword_in_stat47 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_enumAsKeyword_in_stat47_data Count:(NSUInteger)1] retain];
+    FOLLOW_ID_in_identifier66 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_ID_in_identifier66_data Count:(NSUInteger)1] retain];
+    FOLLOW_enumAsID_in_identifier74 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_enumAsID_in_identifier74_data Count:(NSUInteger)1] retain];
+    FOLLOW_7_in_enumAsKeyword89 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_7_in_enumAsKeyword89_data Count:(NSUInteger)1] retain];
+    FOLLOW_7_in_enumAsID100 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_7_in_enumAsID100_data Count:(NSUInteger)1] retain];
 
-    [ANTLRBaseRecognizer setTokenNames:[[AMutableArray arrayWithObjects:@"<invalid>", @"<EOR>", @"<DOWN>", @"<UP>", 
+    [BaseRecognizer setTokenNames:[[AMutableArray arrayWithObjects:@"<invalid>", @"<EOR>", @"<DOWN>", @"<UP>", 
  @"ID", @"INT", @"WS", @"'enum'", nil] retain]];
-    [ANTLRBaseRecognizer setGrammarFileName:@"T.g"];
+    [BaseRecognizer setGrammarFileName:@"/Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/hoistedPredicates/T.g"];
 }
 
-+ (TParser *)newTParser:(id<ANTLRTokenStream>)aStream
++ (TParser *)newTParser:(id<TokenStream>)aStream
 {
     return [[TParser alloc] initWithTokenStream:aStream];
-
-
 }
 
-- (id) initWithTokenStream:(id<ANTLRTokenStream>)aStream
+- (id) initWithTokenStream:(id<TokenStream>)aStream
 {
-    self = [super initWithTokenStream:aStream State:[[ANTLRRecognizerSharedState newANTLRRecognizerSharedStateWithRuleLen:4+1] retain]];
+    self = [super initWithTokenStream:aStream State:[[RecognizerSharedState newRecognizerSharedStateWithRuleLen:4+1] retain]];
     if ( self != nil ) {
-
-
         /* start of actions-actionScope-init */
 
         enableEnum = NO;
@@ -114,8 +104,6 @@
     [super dealloc];
 }
 
-/* ObjC start members */
-/* ObjC end members */
 /* ObjC start actions.(actionScope).methods */
 /* ObjC end actions.(actionScope).methods */
 /* ObjC start methods() */
@@ -123,15 +111,19 @@
 /* ObjC start rules */
 /*
  * $ANTLR start stat
- * T.g:24:1: stat : ( identifier | enumAsKeyword );
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/hoistedPredicates/T.g:24:1: stat : ( identifier | enumAsKeyword );
  */
 - (void) stat
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
-        // T.g:24:5: ( identifier | enumAsKeyword ) //ruleblock
+        /* ruleLabelDefs entry */
+
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/hoistedPredicates/T.g:24:5: ( identifier | enumAsKeyword ) //ruleblock
         NSInteger alt1=2;
         NSInteger LA1_0 = [input LA:1];
 
@@ -148,22 +140,23 @@
                 alt1=2;
             }
             else {
-                ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newException:1 state:2 stream:input];
+                NoViableAltException *nvae = [NoViableAltException newException:1 state:2 stream:input];
                 nvae.c = LA1_2;
                 @throw nvae;
 
             }
         }
         else {
-            ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newException:1 state:0 stream:input];
+            NoViableAltException *nvae = [NoViableAltException newException:1 state:0 stream:input];
             nvae.c = LA1_0;
             @throw nvae;
 
         }
         switch (alt1) {
             case 1 : ;
-                // T.g:24:7: identifier // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/hoistedPredicates/T.g:24:7: identifier // alt
                 {
+
                 /* ruleRef */
                 [self pushFollow:FOLLOW_identifier_in_stat34];
                 [self identifier];
@@ -171,15 +164,17 @@
                 [self popFollow];
 
 
+                 
 
                 NSLog(@"enum is an ID");
 
-
+                 
                 }
                 break;
             case 2 : ;
-                // T.g:25:7: enumAsKeyword // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/hoistedPredicates/T.g:25:7: enumAsKeyword // alt
                 {
+
                 /* ruleRef */
                 [self pushFollow:FOLLOW_enumAsKeyword_in_stat47];
                 [self enumAsKeyword];
@@ -187,24 +182,25 @@
                 [self popFollow];
 
 
+                 
 
                 NSLog(@"enum is a keyword");
 
-
+                 
                 }
                 break;
 
         }
-        // token+rule list labels
+        /* token+rule list labels */
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
     }
 
     @finally {
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return ;
@@ -213,15 +209,19 @@
 
 /*
  * $ANTLR start identifier
- * T.g:28:1: identifier : ( ID | enumAsID );
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/hoistedPredicates/T.g:28:1: identifier : ( ID | enumAsID );
  */
 - (void) identifier
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
-        // T.g:29:5: ( ID | enumAsID ) //ruleblock
+        /* ruleLabelDefs entry */
+
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/hoistedPredicates/T.g:29:5: ( ID | enumAsID ) //ruleblock
         NSInteger alt2=2;
         NSInteger LA2_0 = [input LA:1];
 
@@ -232,22 +232,24 @@
             alt2=2;
         }
         else {
-            ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newException:2 state:0 stream:input];
+            NoViableAltException *nvae = [NoViableAltException newException:2 state:0 stream:input];
             nvae.c = LA2_0;
             @throw nvae;
 
         }
         switch (alt2) {
             case 1 : ;
-                // T.g:29:7: ID // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/hoistedPredicates/T.g:29:7: ID // alt
                 {
-                [self match:input TokenType:ID Follow:FOLLOW_ID_in_identifier66]; 
 
+                [self match:input TokenType:ID Follow:FOLLOW_ID_in_identifier66]; 
+                 
                 }
                 break;
             case 2 : ;
-                // T.g:30:7: enumAsID // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/hoistedPredicates/T.g:30:7: enumAsID // alt
                 {
+
                 /* ruleRef */
                 [self pushFollow:FOLLOW_enumAsID_in_identifier74];
                 [self enumAsID];
@@ -255,21 +257,21 @@
                 [self popFollow];
 
 
-
+                 
                 }
                 break;
 
         }
-        // token+rule list labels
+        /* token+rule list labels */
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
     }
 
     @finally {
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return ;
@@ -278,35 +280,40 @@
 
 /*
  * $ANTLR start enumAsKeyword
- * T.g:33:1: enumAsKeyword :{...}? 'enum' ;
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/hoistedPredicates/T.g:33:1: enumAsKeyword :{...}? 'enum' ;
  */
 - (void) enumAsKeyword
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
-        // T.g:33:15: ({...}? 'enum' ) // ruleBlockSingleAlt
-        // T.g:33:17: {...}? 'enum' // alt
+        /* ruleLabelDefs entry */
+
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/hoistedPredicates/T.g:33:15: ({...}? 'enum' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/hoistedPredicates/T.g:33:17: {...}? 'enum' // alt
         {
+
         if ( !((enableEnum)) ) {
-            @throw [ANTLRFailedPredicateException newException:@"enumAsKeyword" predicate:@"enableEnum" stream:input];
+            @throw [FailedPredicateException newException:@"enumAsKeyword" predicate:@"enableEnum" stream:input];
         }
-
+         
         [self match:input TokenType:7 Follow:FOLLOW_7_in_enumAsKeyword89]; 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
     }
 
     @finally {
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return ;
@@ -315,35 +322,40 @@
 
 /*
  * $ANTLR start enumAsID
- * T.g:35:1: enumAsID :{...}? 'enum' ;
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/hoistedPredicates/T.g:35:1: enumAsID :{...}? 'enum' ;
  */
 - (void) enumAsID
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
-        // T.g:35:10: ({...}? 'enum' ) // ruleBlockSingleAlt
-        // T.g:35:12: {...}? 'enum' // alt
+        /* ruleLabelDefs entry */
+
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/hoistedPredicates/T.g:35:10: ({...}? 'enum' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/hoistedPredicates/T.g:35:12: {...}? 'enum' // alt
         {
+
         if ( !((!enableEnum)) ) {
-            @throw [ANTLRFailedPredicateException newException:@"enumAsID" predicate:@"!enableEnum" stream:input];
+            @throw [FailedPredicateException newException:@"enumAsID" predicate:@"!enableEnum" stream:input];
         }
-
+         
         [self match:input TokenType:7 Follow:FOLLOW_7_in_enumAsID100]; 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
     }
 
     @finally {
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return ;
diff --git a/runtime/ObjC/Framework/examples/hoistedPredicates/antlr3.h b/runtime/ObjC/Framework/examples/hoistedPredicates/antlr3.h
deleted file mode 100644
index 4f16279..0000000
--- a/runtime/ObjC/Framework/examples/hoistedPredicates/antlr3.h
+++ /dev/null
@@ -1,79 +0,0 @@
-#import <ANTLR/ANTLRBaseMapElement.h>
-#import <ANTLR/ANTLRBaseRecognizer.h>
-#import <ANTLR/ANTLRBaseStack.h>
-#import <ANTLR/ANTLRBaseTree.h>
-#import <ANTLR/ANTLRBaseTreeAdaptor.h>
-#import <ANTLR/ANTLRBitSet.h>
-#import <ANTLR/ANTLRBufferedTokenStream.h>
-#import <ANTLR/ANTLRBufferedTreeNodeStream.h>
-#import <ANTLR/ANTLRCharStream.h>
-#import <ANTLR/ANTLRCharStreamState.h>
-#import <ANTLR/ANTLRCommonErrorNode.h>
-#import <ANTLR/ANTLRCommonToken.h>
-#import <ANTLR/ANTLRCommonTokenStream.h>
-#import <ANTLR/ANTLRCommonTree.h>
-#import <ANTLR/ANTLRCommonTreeAdaptor.h>
-#import <ANTLR/ANTLRCommonTreeNodeStream.h>
-#import <ANTLR/ANTLRDFA.h>
-#import <ANTLR/ANTLRDebug.h>
-#import <ANTLR/ANTLRDebugEventProxy.h>
-#import <ANTLR/ANTLRDebugEventListener.h>
-#import <ANTLR/ANTLRDebugParser.h>
-#import <ANTLR/ANTLRDebugTokenStream.h>
-#import <ANTLR/ANTLRDebugTreeAdaptor.h>
-#import <ANTLR/ANTLRDebugTreeNodeStream.h>
-#import <ANTLR/ANTLRDebugTreeParser.h>
-#import <ANTLR/ANTLREarlyExitException.h>
-#import <ANTLR/ANTLRError.h>
-#import <ANTLR/ANTLRFailedPredicateException.h>
-#import <ANTLR/ANTLRFastQueue.h>
-#import <ANTLR/ANTLRHashMap.h>
-#import <ANTLR/ANTLRHashRule.h>
-#import <ANTLR/ANTLRIntArray.h>
-#import <ANTLR/ANTLRIntStream.h>
-#import <ANTLR/ANTLRLexer.h>
-#import <ANTLR/ANTLRLexerRuleReturnScope.h>
-#import <ANTLR/ANTLRLinkBase.h>
-#import <ANTLR/ANTLRLookaheadStream.h>
-#import <ANTLR/ANTLRMapElement.h>
-#import <ANTLR/ANTLRMap.h>
-#import <ANTLR/ANTLRMismatchedNotSetException.h>
-#import <ANTLR/ANTLRMismatchedRangeException.h>
-#import <ANTLR/ANTLRMismatchedSetException.h>
-#import <ANTLR/ANTLRMismatchedTokenException.h>
-#import <ANTLR/ANTLRMismatchedTreeNodeException.h>
-#import <ANTLR/ANTLRMissingTokenException.h>
-#import <ANTLR/ANTLRNodeMapElement.h>
-#import <ANTLR/ANTLRNoViableAltException.h>
-#import <ANTLR/ANTLRParser.h>
-#import <ANTLR/ANTLRParserRuleReturnScope.h>
-#import <ANTLR/ANTLRPtrBuffer.h>
-#import <ANTLR/ANTLRRecognitionException.h>
-#import <ANTLR/ANTLRRecognizerSharedState.h>
-#import <ANTLR/ANTLRRewriteRuleElementStream.h>
-#import <ANTLR/ANTLRRewriteRuleSubtreeStream.h>
-#import <ANTLR/ANTLRRewriteRuleTokenStream.h>
-#import <ANTLR/ANTLRRuleMemo.h>
-#import <ANTLR/ANTLRRuleStack.h>
-#import <ANTLR/ANTLRRuleReturnScope.h>
-#import <ANTLR/ANTLRRuntimeException.h>
-#import <ANTLR/ANTLRStreamEnumerator.h>
-#import <ANTLR/ANTLRStringStream.h>
-#import <ANTLR/ANTLRSymbolStack.h>
-#import <ANTLR/ANTLRToken+DebuggerSupport.h>
-#import <ANTLR/ANTLRToken.h>
-#import <ANTLR/ANTLRTokenRewriteStream.h>
-#import <ANTLR/ANTLRTokenSource.h>
-#import <ANTLR/ANTLRTokenStream.h>
-#import <ANTLR/ANTLRTree.h>
-#import <ANTLR/ANTLRTreeAdaptor.h>
-#import <ANTLR/ANTLRTreeException.h>
-#import <ANTLR/ANTLRTreeIterator.h>
-#import <ANTLR/ANTLRTreeNodeStream.h>
-#import <ANTLR/ANTLRTreeParser.h>
-#import <ANTLR/ANTLRTreeRuleReturnScope.h>
-#import <ANTLR/ANTLRUnbufferedTokenStream.h>
-//#import <ANTLR/ANTLRUnbufferedCommonTreeNodeStream.h>
-//#import <ANTLR/ANTLRUnbufferedCommonTreeNodeStreamState.h>
-#import <ANTLR/ANTLRUniqueIDMap.h>
-#import <ANTLR/ANTLRUnwantedTokenException.h>
diff --git a/runtime/ObjC/Framework/examples/hoistedPredicates/main.m b/runtime/ObjC/Framework/examples/hoistedPredicates/main.m
index 747bdb8..f71be5f 100644
--- a/runtime/ObjC/Framework/examples/hoistedPredicates/main.m
+++ b/runtime/ObjC/Framework/examples/hoistedPredicates/main.m
@@ -1,4 +1,4 @@
-#import <Cocoa/Cocoa.h>
+#import <Foundation/Foundation.h>
 #import <ANTLR/ANTLR.h>
 #import "TLexer.h"
 #import "TParser.h"
@@ -7,17 +7,17 @@
     NSError *error;
 	NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
 	
-	NSString *string = [NSString stringWithContentsOfFile:@"/Users/acondit/source/antlr3/acondit_localhost/code/antlr/antlr3-main/runtime/ObjC/Framework/examples/hoistedPredicates/input" encoding:NSASCIIStringEncoding error:&error];
+	NSString *string = [NSString stringWithContentsOfFile:@"/Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/hoistedPredicates/input" encoding:NSASCIIStringEncoding error:&error];
 	NSLog(@"input is : %@", string);
 	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:string];
 	TLexer *lexer = [TLexer newTLexerWithCharStream:stream];
 	
-	//	ANTLRToken *currentToken;
-	//	while ((currentToken = [lexer nextToken]) && [currentToken type] != ANTLRTokenTypeEOF) {
+	//	Token *currentToken;
+	//	while ((currentToken = [lexer nextToken]) && [currentToken type] != TokenTypeEOF) {
 	//		NSLog(@"%@", currentToken);
 	//	}
 	
-	ANTLRCommonTokenStream *tokenStream = [ANTLRCommonTokenStream newANTLRCommonTokenStreamWithTokenSource:lexer];
+	CommonTokenStream *tokenStream = [CommonTokenStream newCommonTokenStreamWithTokenSource:lexer];
 	TParser *parser = [[TParser alloc] initWithTokenStream:tokenStream];
 	[parser stat];
 	[lexer release];
diff --git a/runtime/ObjC/Framework/examples/lexertest-simple/TestLexer.h b/runtime/ObjC/Framework/examples/lexertest-simple/TestLexer.h
index 40c0fde..ab4ce16 100644
--- a/runtime/ObjC/Framework/examples/lexertest-simple/TestLexer.h
+++ b/runtime/ObjC/Framework/examples/lexertest-simple/TestLexer.h
@@ -1,26 +1,39 @@
-// $ANTLR 3.2 Aug 07, 2010 22:08:38 /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/lexertest-simple/Test.g 2010-08-11 13:24:39
+// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/lexertest-simple/TestLexer.g 2012-02-16 17:36:38
 
 /* =============================================================================
- * Standard antlr3 OBJC runtime definitions
+ * Standard antlr OBJC runtime definitions
  */
-#import <Cocoa/Cocoa.h>
-#import "antlr3.h"
+#import <Foundation/Foundation.h>
+#import <ANTLR/ANTLR.h>
 /* End of standard antlr3 runtime definitions
  * =============================================================================
  */
 
+/* Start cyclicDFAInterface */
 
-#pragma mark Rule return scopes start
-#pragma mark Rule return scopes end
+#pragma mark Rule return scopes Interface start
+#pragma mark Rule return scopes Interface end
 #pragma mark Tokens
-#define DIGIT 5
-#define ID 6
+#ifdef EOF
+#undef EOF
+#endif
 #define EOF -1
-#define LETTER 4
-@interface TestLexer : ANTLRLexer {
+#define DIGIT 4
+#define ID 5
+#define LETTER 6
+/* interface lexer class */
+@interface TestLexer : Lexer { // line 283
+/* ObjC start of actions.lexer.memVars */
+/* ObjC end of actions.lexer.memVars */
 }
-- (void) mID; 
-- (void) mDIGIT; 
-- (void) mLETTER; 
-- (void) mTokens; 
-@end // end of Test interface
\ No newline at end of file
++ (void) initialize;
++ (TestLexer *)newTestLexerWithCharStream:(id<CharStream>)anInput;
+/* ObjC start actions.lexer.methodsDecl */
+/* ObjC end actions.lexer.methodsDecl */
+- (void) mID ; 
+- (void) mDIGIT ; 
+- (void) mLETTER ; 
+- (void) mTokens ; 
+
+@end /* end of TestLexer interface */
+
diff --git a/runtime/ObjC/Framework/examples/lexertest-simple/TestLexer.h.old b/runtime/ObjC/Framework/examples/lexertest-simple/TestLexer.h.old
deleted file mode 100755
index f8252ca..0000000
--- a/runtime/ObjC/Framework/examples/lexertest-simple/TestLexer.h.old
+++ /dev/null
@@ -1,29 +0,0 @@
-// $ANTLR 3.0 Test.gl 2007-08-04 15:59:43
-
-#import <Cocoa/Cocoa.h>
-#import <ANTLR/ANTLR.h>
-
-
-#pragma mark Rule return scopes start
-#pragma mark Rule return scopes end
-
-#pragma mark Tokens
-#define TestLexer_LETTER	4
-#define TestLexer_EOF	-1
-#define TestLexer_Tokens	7
-#define TestLexer_DIGIT	5
-#define TestLexer_ID	6
-
-@interface TestLexer : ANTLRLexer {
-    NSInteger _tokenType;
-}
-
-
-- (void) mID;
-- (void) mDIGIT;
-- (void) mLETTER;
-- (void) mTokens;
-
-
-
-@end
\ No newline at end of file
diff --git a/runtime/ObjC/Framework/examples/lexertest-simple/TestLexer.m b/runtime/ObjC/Framework/examples/lexertest-simple/TestLexer.m
index bb95f66..8ef23fe 100644
--- a/runtime/ObjC/Framework/examples/lexertest-simple/TestLexer.m
+++ b/runtime/ObjC/Framework/examples/lexertest-simple/TestLexer.m
@@ -1,8 +1,8 @@
 /** \file
- *  This OBJC source file was generated by $ANTLR version ${project.version} ${buildNumber}
+ *  This OBJC source file was generated by $ANTLR version 3.4
  *
- *     -  From the grammar source file : TestLexer.g
- *     -                            On : 2011-05-06 19:16:22
+ *     -  From the grammar source file : /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/lexertest-simple/TestLexer.g
+ *     -                            On : 2012-02-16 17:36:38
  *     -                 for the lexer : TestLexerLexer
  *
  * Editing it, at least manually, is not wise.
@@ -11,7 +11,7 @@
  *
  *
 */
-// $ANTLR ${project.version} ${buildNumber} TestLexer.g 2011-05-06 19:16:22
+// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/lexertest-simple/TestLexer.g 2012-02-16 17:36:38
 
 
 /* -----------------------------------------
@@ -31,7 +31,7 @@
 
 + (void) initialize
 {
-    [ANTLRBaseRecognizer setGrammarFileName:@"TestLexer.g"];
+    [BaseRecognizer setGrammarFileName:@"/Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/lexertest-simple/TestLexer.g"];
 }
 
 + (NSString *) tokenNameForType:(NSInteger)aTokenType
@@ -39,14 +39,14 @@
     return [[self getTokenNames] objectAtIndex:aTokenType];
 }
 
-+ (TestLexer *)newTestLexerWithCharStream:(id<ANTLRCharStream>)anInput
++ (TestLexer *)newTestLexerWithCharStream:(id<CharStream>)anInput
 {
     return [[TestLexer alloc] initWithCharStream:anInput];
 }
 
-- (id) initWithCharStream:(id<ANTLRCharStream>)anInput
+- (id) initWithCharStream:(id<CharStream>)anInput
 {
-    self = [super initWithCharStream:anInput State:[[ANTLRRecognizerSharedState newANTLRRecognizerSharedStateWithRuleLen:4+1] retain]];
+    self = [super initWithCharStream:anInput State:[RecognizerSharedState newRecognizerSharedStateWithRuleLen:4+1]];
     if ( self != nil ) {
     }
     return self;
@@ -67,18 +67,22 @@
 - (void) mID
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = ID;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // TestLexer.g:8:4: ( LETTER ( LETTER | DIGIT )* ) // ruleBlockSingleAlt
-        // TestLexer.g:8:6: LETTER ( LETTER | DIGIT )* // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/lexertest-simple/TestLexer.g:8:4: ( LETTER ( LETTER | DIGIT )* ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/lexertest-simple/TestLexer.g:8:6: LETTER ( LETTER | DIGIT )* // alt
         {
+
+
         [self mLETTER]; 
 
 
+         
 
         do {
             NSInteger alt1=2;
@@ -90,17 +94,18 @@
 
             switch (alt1) {
                 case 1 : ;
-                    // TestLexer.g: // alt
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/lexertest-simple/TestLexer.g: // alt
                     {
+
                     if ((([input LA:1] >= '0') && ([input LA:1] <= '9'))||(([input LA:1] >= 'A') && ([input LA:1] <= 'Z'))||(([input LA:1] >= 'a') && ([input LA:1] <= 'z'))) {
                         [input consume];
                     } else {
-                        ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException newException:nil stream:input];
+                        MismatchedSetException *mse = [MismatchedSetException newException:nil stream:input];
                         [self recover:mse];
                         @throw mse;
                     }
 
-
+                     
                     }
                     break;
 
@@ -110,98 +115,101 @@
         } while (YES);
         loop1: ;
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "ID" */
-
 // $ANTLR start "DIGIT"
 - (void) mDIGIT
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
-        // TestLexer.g:11:16: ( '0' .. '9' ) // ruleBlockSingleAlt
-        // TestLexer.g: // alt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/lexertest-simple/TestLexer.g:11:16: ( '0' .. '9' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/lexertest-simple/TestLexer.g: // alt
         {
+
         if ((([input LA:1] >= '0') && ([input LA:1] <= '9'))) {
             [input consume];
         } else {
-            ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException newException:nil stream:input];
+            MismatchedSetException *mse = [MismatchedSetException newException:nil stream:input];
             [self recover:mse];
             @throw mse;
         }
 
-
+         
         }
 
 
     }
     @finally {
         //
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "DIGIT" */
-
 // $ANTLR start "LETTER"
 - (void) mLETTER
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
-        // TestLexer.g:15:2: ( 'a' .. 'z' | 'A' .. 'Z' ) // ruleBlockSingleAlt
-        // TestLexer.g: // alt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/lexertest-simple/TestLexer.g:15:2: ( 'a' .. 'z' | 'A' .. 'Z' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/lexertest-simple/TestLexer.g: // alt
         {
+
         if ((([input LA:1] >= 'A') && ([input LA:1] <= 'Z'))||(([input LA:1] >= 'a') && ([input LA:1] <= 'z'))) {
             [input consume];
         } else {
-            ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException newException:nil stream:input];
+            MismatchedSetException *mse = [MismatchedSetException newException:nil stream:input];
             [self recover:mse];
             @throw mse;
         }
 
-
+         
         }
 
 
     }
     @finally {
         //
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "LETTER" */
-
 - (void) mTokens
 {
-    // TestLexer.g:1:8: ( ID ) // ruleBlockSingleAlt
-    // TestLexer.g:1:10: ID // alt
+    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/lexertest-simple/TestLexer.g:1:8: ( ID ) // ruleBlockSingleAlt
+    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/lexertest-simple/TestLexer.g:1:10: ID // alt
     {
+
+
     [self mID]; 
 
 
-
+     
     }
 
 
diff --git a/runtime/ObjC/Framework/examples/lexertest-simple/TestLexer.m.old b/runtime/ObjC/Framework/examples/lexertest-simple/TestLexer.m.old
deleted file mode 100755
index a48de92..0000000
--- a/runtime/ObjC/Framework/examples/lexertest-simple/TestLexer.m.old
+++ /dev/null
@@ -1,157 +0,0 @@
-// $ANTLR 3.0 Test.gl 2007-08-04 15:59:43
-
-#import "TestLexer.h"
-
-/** As per Terence: No returns for lexer rules!
-#pragma mark Rule return scopes start
-#pragma mark Rule return scopes end
-*/
-@implementation TestLexer
-
-- (id) initWithCharStream:(id<ANTLRCharStream>)anInput
-{
-	if ((self = [super initWithCharStream:anInput]) != nil) {
-	}
-	return self;
-}
-
-- (void) dealloc
-{
-	[super dealloc];
-}
-
-+ (NSString *) tokenNameForType:(NSInteger)aTokenType
-{
-    return nil;
-}
-
-- (NSString *) grammarFileName
-{
-	return @"Test.gl";
-}
-
-
-- (void) mID
-{
-    @try {
-        ruleNestingLevel++;
-        int _type = TestLexer_ID;
-        // Test.gl:8:6: ( LETTER ( LETTER | DIGIT )* ) // ruleBlockSingleAlt
-        // Test.gl:8:6: LETTER ( LETTER | DIGIT )* // alt
-        {
-        [self mLETTER];
-
-
-        do {
-            int alt1=2;
-            {
-            	int LA1_0 = [input LA:1];
-            	if ( (LA1_0>='0' && LA1_0<='9')||(LA1_0>='A' && LA1_0<='Z')||(LA1_0>='a' && LA1_0<='z') ) {
-            		alt1 = 1;
-            	}
-
-            }
-            switch (alt1) {
-        	case 1 :
-        	    // Test.gl: // alt
-        	    {
-        	    if (([input LA:1]>='0' && [input LA:1]<='9')||([input LA:1]>='A' && [input LA:1]<='Z')||([input LA:1]>='a' && [input LA:1]<='z')) {
-        	    	[input consume];
-
-        	    } else {
-        	    	ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException exceptionWithSet:nil stream:input];
-        	    	[self recover:mse];	@throw mse;
-        	    }
-
-
-        	    }
-        	    break;
-
-        	default :
-        	    goto loop1;
-            }
-        } while (YES); loop1: ;
-
-
-        }
-
-        self->_tokenType = _type;
-    }
-    @finally {
-        ruleNestingLevel--;
-        // rule cleanup
-        // token+rule list labels
-
-    }
-    return;
-}
-// $ANTLR end ID
-
-
-- (void) mDIGIT
-{
-    @try {
-        ruleNestingLevel++;
-        // Test.gl:11:18: ( '0' .. '9' ) // ruleBlockSingleAlt
-        // Test.gl:11:18: '0' .. '9' // alt
-        {
-        [self matchRangeFromChar:'0' to:'9'];
-
-        }
-
-    }
-    @finally {
-        ruleNestingLevel--;
-        // rule cleanup
-        // token+rule list labels
-
-    }
-    return;
-}
-// $ANTLR end DIGIT
-
-
-- (void) mLETTER
-{
-    @try {
-        ruleNestingLevel++;
-        // Test.gl:15:4: ( 'a' .. 'z' | 'A' .. 'Z' ) // ruleBlockSingleAlt
-        // Test.gl: // alt
-        {
-        if (([input LA:1]>='A' && [input LA:1]<='Z')||([input LA:1]>='a' && [input LA:1]<='z')) {
-        	[input consume];
-
-        } else {
-        	ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException exceptionWithSet:nil stream:input];
-        	[self recover:mse];	@throw mse;
-        }
-
-
-        }
-
-    }
-    @finally {
-        ruleNestingLevel--;
-        // rule cleanup
-        // token+rule list labels
-
-    }
-    return;
-}
-// $ANTLR end LETTER
-
-- (void) mTokens
-{
-    // Test.gl:1:10: ( ID ) // ruleBlockSingleAlt
-    // Test.gl:1:10: ID // alt
-    {
-    [self mID];
-
-
-
-    }
-
-
-}
-
-@end
\ No newline at end of file
diff --git a/runtime/ObjC/Framework/examples/lexertest-simple/TestLexerLexer.h b/runtime/ObjC/Framework/examples/lexertest-simple/TestLexerLexer.h
deleted file mode 100644
index cdd1cee..0000000
--- a/runtime/ObjC/Framework/examples/lexertest-simple/TestLexerLexer.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// $ANTLR ${project.version} ${buildNumber} TestLexer.g 2011-05-06 19:16:22
-
-/* =============================================================================
- * Standard antlr3 OBJC runtime definitions
- */
-#import <Cocoa/Cocoa.h>
-#import <ANTLR/ANTLR.h>
-/* End of standard antlr3 runtime definitions
- * =============================================================================
- */
-
-/* Start cyclicDFAInterface */
-
-#pragma mark Rule return scopes start
-#pragma mark Rule return scopes end
-#pragma mark Tokens
-#ifdef EOF
-#undef EOF
-#endif
-#define EOF -1
-#define DIGIT 4
-#define ID 5
-#define LETTER 6
-/* interface lexer class */
-@interface TestLexer : ANTLRLexer { // line 283
-/* ObjC start of actions.lexer.memVars */
-/* ObjC end of actions.lexer.memVars */
-}
-+ (void) initialize;
-+ (TestLexer *)newTestLexerWithCharStream:(id<ANTLRCharStream>)anInput;
-/* ObjC start actions.lexer.methodsDecl */
-/* ObjC end actions.lexer.methodsDecl */
-- (void) mID ; 
-- (void) mDIGIT ; 
-- (void) mLETTER ; 
-- (void) mTokens ; 
-
-@end /* end of TestLexer interface */
-
diff --git a/runtime/ObjC/Framework/examples/lexertest-simple/antlr3.h b/runtime/ObjC/Framework/examples/lexertest-simple/antlr3.h
deleted file mode 100644
index 4f16279..0000000
--- a/runtime/ObjC/Framework/examples/lexertest-simple/antlr3.h
+++ /dev/null
@@ -1,79 +0,0 @@
-#import <ANTLR/ANTLRBaseMapElement.h>
-#import <ANTLR/ANTLRBaseRecognizer.h>
-#import <ANTLR/ANTLRBaseStack.h>
-#import <ANTLR/ANTLRBaseTree.h>
-#import <ANTLR/ANTLRBaseTreeAdaptor.h>
-#import <ANTLR/ANTLRBitSet.h>
-#import <ANTLR/ANTLRBufferedTokenStream.h>
-#import <ANTLR/ANTLRBufferedTreeNodeStream.h>
-#import <ANTLR/ANTLRCharStream.h>
-#import <ANTLR/ANTLRCharStreamState.h>
-#import <ANTLR/ANTLRCommonErrorNode.h>
-#import <ANTLR/ANTLRCommonToken.h>
-#import <ANTLR/ANTLRCommonTokenStream.h>
-#import <ANTLR/ANTLRCommonTree.h>
-#import <ANTLR/ANTLRCommonTreeAdaptor.h>
-#import <ANTLR/ANTLRCommonTreeNodeStream.h>
-#import <ANTLR/ANTLRDFA.h>
-#import <ANTLR/ANTLRDebug.h>
-#import <ANTLR/ANTLRDebugEventProxy.h>
-#import <ANTLR/ANTLRDebugEventListener.h>
-#import <ANTLR/ANTLRDebugParser.h>
-#import <ANTLR/ANTLRDebugTokenStream.h>
-#import <ANTLR/ANTLRDebugTreeAdaptor.h>
-#import <ANTLR/ANTLRDebugTreeNodeStream.h>
-#import <ANTLR/ANTLRDebugTreeParser.h>
-#import <ANTLR/ANTLREarlyExitException.h>
-#import <ANTLR/ANTLRError.h>
-#import <ANTLR/ANTLRFailedPredicateException.h>
-#import <ANTLR/ANTLRFastQueue.h>
-#import <ANTLR/ANTLRHashMap.h>
-#import <ANTLR/ANTLRHashRule.h>
-#import <ANTLR/ANTLRIntArray.h>
-#import <ANTLR/ANTLRIntStream.h>
-#import <ANTLR/ANTLRLexer.h>
-#import <ANTLR/ANTLRLexerRuleReturnScope.h>
-#import <ANTLR/ANTLRLinkBase.h>
-#import <ANTLR/ANTLRLookaheadStream.h>
-#import <ANTLR/ANTLRMapElement.h>
-#import <ANTLR/ANTLRMap.h>
-#import <ANTLR/ANTLRMismatchedNotSetException.h>
-#import <ANTLR/ANTLRMismatchedRangeException.h>
-#import <ANTLR/ANTLRMismatchedSetException.h>
-#import <ANTLR/ANTLRMismatchedTokenException.h>
-#import <ANTLR/ANTLRMismatchedTreeNodeException.h>
-#import <ANTLR/ANTLRMissingTokenException.h>
-#import <ANTLR/ANTLRNodeMapElement.h>
-#import <ANTLR/ANTLRNoViableAltException.h>
-#import <ANTLR/ANTLRParser.h>
-#import <ANTLR/ANTLRParserRuleReturnScope.h>
-#import <ANTLR/ANTLRPtrBuffer.h>
-#import <ANTLR/ANTLRRecognitionException.h>
-#import <ANTLR/ANTLRRecognizerSharedState.h>
-#import <ANTLR/ANTLRRewriteRuleElementStream.h>
-#import <ANTLR/ANTLRRewriteRuleSubtreeStream.h>
-#import <ANTLR/ANTLRRewriteRuleTokenStream.h>
-#import <ANTLR/ANTLRRuleMemo.h>
-#import <ANTLR/ANTLRRuleStack.h>
-#import <ANTLR/ANTLRRuleReturnScope.h>
-#import <ANTLR/ANTLRRuntimeException.h>
-#import <ANTLR/ANTLRStreamEnumerator.h>
-#import <ANTLR/ANTLRStringStream.h>
-#import <ANTLR/ANTLRSymbolStack.h>
-#import <ANTLR/ANTLRToken+DebuggerSupport.h>
-#import <ANTLR/ANTLRToken.h>
-#import <ANTLR/ANTLRTokenRewriteStream.h>
-#import <ANTLR/ANTLRTokenSource.h>
-#import <ANTLR/ANTLRTokenStream.h>
-#import <ANTLR/ANTLRTree.h>
-#import <ANTLR/ANTLRTreeAdaptor.h>
-#import <ANTLR/ANTLRTreeException.h>
-#import <ANTLR/ANTLRTreeIterator.h>
-#import <ANTLR/ANTLRTreeNodeStream.h>
-#import <ANTLR/ANTLRTreeParser.h>
-#import <ANTLR/ANTLRTreeRuleReturnScope.h>
-#import <ANTLR/ANTLRUnbufferedTokenStream.h>
-//#import <ANTLR/ANTLRUnbufferedCommonTreeNodeStream.h>
-//#import <ANTLR/ANTLRUnbufferedCommonTreeNodeStreamState.h>
-#import <ANTLR/ANTLRUniqueIDMap.h>
-#import <ANTLR/ANTLRUnwantedTokenException.h>
diff --git a/runtime/ObjC/Framework/examples/lexertest-simple/main.m b/runtime/ObjC/Framework/examples/lexertest-simple/main.m
index 464c319..709f440 100644
--- a/runtime/ObjC/Framework/examples/lexertest-simple/main.m
+++ b/runtime/ObjC/Framework/examples/lexertest-simple/main.m
@@ -1,6 +1,6 @@
-#import <Cocoa/Cocoa.h>
+#import <Foundation/Foundation.h>
 #import "TestLexer.h"
-#import "antlr3.h"
+#import <ANTLR/ANTLR.h>
 #import <unistd.h>
 
 int main(int argc, const char * argv[])
@@ -9,8 +9,8 @@
 	
 	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:@"abB9Cdd44"];
 	TestLexer *lexer = [[TestLexer alloc] initWithCharStream:stream];
-	id<ANTLRToken> currentToken;
-	while ((currentToken = [[lexer nextToken] retain]) && [currentToken getType] != ANTLRTokenTypeEOF) {
+	id<Token> currentToken;
+	while ((currentToken = [[lexer nextToken] retain]) && currentToken.type != TokenTypeEOF) {
 		NSLog(@"%@", currentToken);
 	}
 	[lexer release];
diff --git a/runtime/ObjC/Framework/examples/lexertest-simple/output1/Test.tokens b/runtime/ObjC/Framework/examples/lexertest-simple/output1/Test.tokens
deleted file mode 100644
index 2100fc5..0000000
--- a/runtime/ObjC/Framework/examples/lexertest-simple/output1/Test.tokens
+++ /dev/null
@@ -1,3 +0,0 @@
-DIGIT=5
-ID=6
-LETTER=4
diff --git a/runtime/ObjC/Framework/examples/lexertest-simple/output1/TestLexer.h b/runtime/ObjC/Framework/examples/lexertest-simple/output1/TestLexer.h
deleted file mode 100644
index 61f1691..0000000
--- a/runtime/ObjC/Framework/examples/lexertest-simple/output1/TestLexer.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// $ANTLR 3.2 Aug 07, 2010 22:08:38 /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/lexertest-simple/Test.g 2010-08-11 13:24:39
-
-/* =============================================================================
- * Standard antlr3 OBJC runtime definitions
- */
-#import <Cocoa/Cocoa.h>
-#import "antlr3.h"
-/* End of standard antlr3 runtime definitions
- * =============================================================================
- */
-
-
-#pragma mark Rule return scopes start
-#pragma mark Rule return scopes end
-#pragma mark Tokens
-#define DIGIT 5
-#define ID 6
-#define EOF -1
-#define LETTER 4
-@interface Test : ANTLRLexer {
-}
-- (void) mID; 
-- (void) mDIGIT; 
-- (void) mLETTER; 
-- (void) mTokens; 
-@end // end of Test interface
\ No newline at end of file
diff --git a/runtime/ObjC/Framework/examples/lexertest-simple/output1/TestLexer.tokens b/runtime/ObjC/Framework/examples/lexertest-simple/output1/TestLexer.tokens
deleted file mode 100644
index 2100fc5..0000000
--- a/runtime/ObjC/Framework/examples/lexertest-simple/output1/TestLexer.tokens
+++ /dev/null
@@ -1,3 +0,0 @@
-DIGIT=5
-ID=6
-LETTER=4
diff --git a/runtime/ObjC/Framework/examples/lexertest-simple/output1/TestLexerLexer.h b/runtime/ObjC/Framework/examples/lexertest-simple/output1/TestLexerLexer.h
deleted file mode 100644
index 1170ab3..0000000
--- a/runtime/ObjC/Framework/examples/lexertest-simple/output1/TestLexerLexer.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// $ANTLR 3.2 Aug 07, 2010 22:08:38 /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/lexertest-simple/TestLexer.g 2010-08-11 13:41:44
-
-/* =============================================================================
- * Standard antlr3 OBJC runtime definitions
- */
-#import <Cocoa/Cocoa.h>
-#import "antlr3.h"
-/* End of standard antlr3 runtime definitions
- * =============================================================================
- */
-
-
-#pragma mark Rule return scopes start
-#pragma mark Rule return scopes end
-#pragma mark Tokens
-#define DIGIT 5
-#define ID 6
-#define EOF -1
-#define LETTER 4
-@interface TestLexer : ANTLRLexer {
-}
-- (void) mID; 
-- (void) mDIGIT; 
-- (void) mLETTER; 
-- (void) mTokens; 
-@end // end of TestLexer interface
\ No newline at end of file
diff --git a/runtime/ObjC/Framework/examples/lexertest-simple/output1/Testlexer.m b/runtime/ObjC/Framework/examples/lexertest-simple/output1/Testlexer.m
deleted file mode 100644
index 3bb398b..0000000
--- a/runtime/ObjC/Framework/examples/lexertest-simple/output1/Testlexer.m
+++ /dev/null
@@ -1,216 +0,0 @@
-/** \file
- *  This OBJC source file was generated by $ANTLR version 3.2 Aug 07, 2010 22:08:38
- *
- *     -  From the grammar source file : /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/lexertest-simple/TestLexer.g
- *     -                            On : 2010-08-11 13:41:44
- *     -                 for the lexer : TestLexerLexer *
- * Editing it, at least manually, is not wise. 
- *
- * C language generator and runtime by Jim Idle, jimi|hereisanat|idle|dotgoeshere|ws.
- *
- *
-*/
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-//
-// 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.
-
-// $ANTLR 3.2 Aug 07, 2010 22:08:38 /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/lexertest-simple/TestLexer.g 2010-08-11 13:41:44
-
-/* -----------------------------------------
- * Include the ANTLR3 generated header file.
- */
-#import "TestLexer.h"
-/* ----------------------------------------- */
-
-
-/* ============================================================================= */
-
-/* =============================================================================
- * Start of recognizer
- */
-
-
-/** As per Terence: No returns for lexer rules!
-#pragma mark Rule return scopes start
-#pragma mark Rule return scopes end
-*/
-@implementation TestLexer
-
-
-+ (void) initialize
-{
-    [ANTLRBaseRecognizer setGrammarFileName:@"/usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/lexertest-simple/TestLexer.g"];
-}
-
-- (id) initWithCharStream:(id<ANTLRCharStream>)anInput
-{
-    if ((self = [super initWithCharStream:anInput State:[ANTLRRecognizerSharedState newANTLRRecognizerSharedStateWithRuleLen:4+1]]) != nil) {
-    }
-    return self;
-}
-
-- (void) dealloc
-{
-    [super dealloc];
-}
-
-+ (NSString *) tokenNameForType:(NSInteger)aTokenType
-{
-    return [[self getTokenNames] objectAtIndex:aTokenType];
-}
-
-// $ANTLR start "ID"
-- (void) mID
-{
-    //
-    // This is not in the Java.stg
-
-    @try {
-        NSInteger _type = ID;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/lexertest-simple/TestLexer.g:8:4: ( LETTER ( LETTER | DIGIT )* ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/lexertest-simple/TestLexer.g:8:6: LETTER ( LETTER | DIGIT )* // alt
-        {
-            [self mLETTER];
-
-          /* element() */
-        do {
-            NSInteger alt1=2;
-            {
-                NSInteger LA1_0 = [input LA:1];
-                if ( (LA1_0>='0' && LA1_0<='9')||(LA1_0>='A' && LA1_0<='Z')||(LA1_0>='a' && LA1_0<='z') ) {
-                    alt1=1;
-                }
-
-            }
-            switch (alt1) {
-                case 1 :
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/lexertest-simple/TestLexer.g: // alt
-                    {
-                    if (([input LA:1]>='0' && [input LA:1]<='9')||([input LA:1]>='A' && [input LA:1]<='Z')||([input LA:1]>='a' && [input LA:1]<='z')) {
-                        [input consume];
-
-                    } else {
-                        ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException exceptionWithSet:nil stream:input];
-                        [self recover:mse];
-                        @throw mse;}
-                      /* element() */
-                     /* elements */
-                    }
-                    break;
-
-                default :
-                    goto loop1;
-            }
-        } while (YES);
-        loop1: ;
-          /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-        [state setType:_type];
-
-        state.channel = _channel;
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end ID
-
-// $ANTLR start "DIGIT"
-- (void) mDIGIT
-{
-    //
-    // This is not in the Java.stg
-
-    @try {
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/lexertest-simple/TestLexer.g:11:16: ( '0' .. '9' ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/lexertest-simple/TestLexer.g:11:18: '0' .. '9' // alt
-        {
-        [self matchRangeFromChar:'0' to:'9'];   /* element() */
-         /* elements */
-        }
-
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end DIGIT
-
-// $ANTLR start "LETTER"
-- (void) mLETTER
-{
-    //
-    // This is not in the Java.stg
-
-    @try {
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/lexertest-simple/TestLexer.g:15:2: ( 'a' .. 'z' | 'A' .. 'Z' ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/lexertest-simple/TestLexer.g: // alt
-        {
-        if (([input LA:1]>='A' && [input LA:1]<='Z')||([input LA:1]>='a' && [input LA:1]<='z')) {
-            [input consume];
-
-        } else {
-            ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException exceptionWithSet:nil stream:input];
-            [self recover:mse];
-            @throw mse;}
-          /* element() */
-         /* elements */
-        }
-
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end LETTER
-
-- (void) mTokens
-{
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/lexertest-simple/TestLexer.g:1:8: ( ID ) // ruleBlockSingleAlt
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/lexertest-simple/TestLexer.g:1:10: ID // alt
-    {
-        [self mID];
-
-      /* element() */
-     /* elements */
-    }
-
-
-}
-
-@end // end of TestLexer implementation
-
-/* End of code
- * =============================================================================
- */
diff --git a/runtime/ObjC/Framework/examples/polydiff/Poly.g b/runtime/ObjC/Framework/examples/polydiff/Poly.g
new file mode 100644
index 0000000..30ad7c3
--- /dev/null
+++ b/runtime/ObjC/Framework/examples/polydiff/Poly.g
@@ -0,0 +1,27 @@
+grammar Poly;
+options {
+    output=AST;
+    language=ObjC;
+    }
+tokens { MULT; } // imaginary token
+
+poly: term ('+'^ term)*
+    ;
+
+term: INT ID  -> ^(MULT[@"*"] INT ID)
+    | INT exp -> ^(MULT[@"*"] INT exp)
+    | exp
+    | INT
+	| ID
+    ;
+
+exp : ID '^'^ INT
+    ;
+    
+ID  returns [NSString *value]
+    : 'a'..'z'+ ;
+
+INT  returns [NSString *value]
+    : '0'..'9'+ ;
+
+WS	: (' '|'\t'|'\r'|'\n')+ { $channel=HIDDEN; } ;
diff --git a/runtime/ObjC/Framework/examples/polydiff/Poly.tokens b/runtime/ObjC/Framework/examples/polydiff/Poly.tokens
new file mode 100644
index 0000000..c711b35
--- /dev/null
+++ b/runtime/ObjC/Framework/examples/polydiff/Poly.tokens
@@ -0,0 +1,8 @@
+T__8=8
+T__9=9
+ID=4
+INT=5
+MULT=6
+WS=7
+'+'=8
+'^'=9
diff --git a/runtime/ObjC/Framework/examples/polydiff/PolyDifferentiator.g b/runtime/ObjC/Framework/examples/polydiff/PolyDifferentiator.g
new file mode 100644
index 0000000..642c511
--- /dev/null
+++ b/runtime/ObjC/Framework/examples/polydiff/PolyDifferentiator.g
@@ -0,0 +1,26 @@
+tree grammar PolyDifferentiator;
+options {
+	tokenVocab=Poly;
+    language=ObjC;
+	ASTLabelType=CommonTree;
+	output=AST;
+//	rewrite=true; // works either in rewrite or normal mode
+}
+
+poly:	^('+' poly poly)
+	|	^(MULT INT ID)		-> INT
+	|	^(MULT c=INT ^('^' ID e=INT))
+		{
+		NSString *c2 = [NSString stringWithFormat:@"\%d", $c.int*$e.int];
+		NSString *e2 = [NSString stringWithFormat:@"\%d", $e.int-1];
+		}
+							-> ^(MULT[@"*"] INT[c2] ^('^' ID INT[e2]))
+	|	^('^' ID e=INT)
+		{
+		NSString *c2 = [NSString stringWithFormat:@"\%d", $e.int];
+		NSString *e2 = [NSString stringWithFormat:@"\%d", $e.int-1];
+		}
+							-> ^(MULT[@"*"] INT[c2] ^('^' ID INT[e2]))
+	|	INT					-> INT[@"0"]
+	|	ID					-> INT[@"1"]
+	;
diff --git a/runtime/ObjC/Framework/examples/polydiff/PolyDifferentiator.h b/runtime/ObjC/Framework/examples/polydiff/PolyDifferentiator.h
new file mode 100644
index 0000000..68949c3
--- /dev/null
+++ b/runtime/ObjC/Framework/examples/polydiff/PolyDifferentiator.h
@@ -0,0 +1,107 @@
+// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/PolyDifferentiator.g 2012-02-16 18:10:53
+
+/* =============================================================================
+ * Standard antlr OBJC runtime definitions
+ */
+#import <Foundation/Foundation.h>
+#import <ANTLR/ANTLR.h>
+/* End of standard antlr3 runtime definitions
+ * =============================================================================
+ */
+
+/* treeParserHeaderFile */
+#ifndef ANTLR3TokenTypeAlreadyDefined
+#define ANTLR3TokenTypeAlreadyDefined
+typedef enum {
+    ANTLR_EOF = -1,
+    INVALID,
+    EOR,
+    DOWN,
+    UP,
+    MIN
+} ANTLR3TokenType;
+#endif
+
+#pragma mark Tokens
+#ifdef EOF
+#undef EOF
+#endif
+#define EOF -1
+#define T__8 8
+#define T__9 9
+#define ID 4
+#define INT 5
+#define MULT 6
+#define WS 7
+#pragma mark Dynamic Global Scopes globalAttributeScopeInterface
+#pragma mark Dynamic Rule Scopes ruleAttributeScopeInterface
+#pragma mark Rule Return Scopes returnScopeInterface
+/* returnScopeInterface PolyDifferentiator_poly_return */
+@interface PolyDifferentiator_poly_return : TreeRuleReturnScope { /* returnScopeInterface line 1838 */
+/* ASTTreeParser returnScopeInterface.memVars */
+CommonTree *tree; /* ObjC start of memVars() */
+
+}
+/* start property declarations */
+/* AST returnScopeInterface.properties */
+@property (retain, getter=getTree, setter=setTree:) CommonTree *tree;
+
+/* start of method declarations */
+
++ (PolyDifferentiator_poly_return *)newPolyDifferentiator_poly_return;
+/* this is start of set and get methods */
+/* ASTTreeParser returnScopeInterface.methodsDecl */
+- (CommonTree *)getTree;
+- (void) setTree:(CommonTree *)aTree;
+  /* methodsDecl */
+
+@end /* end of returnScopeInterface interface */
+
+
+
+/* Interface grammar class */
+@interface PolyDifferentiator  : TreeParser { /* line 572 */
+#pragma mark Dynamic Rule Scopes ruleAttributeScopeDecl
+#pragma mark Dynamic Global Rule Scopes globalAttributeScopeMemVar
+
+
+/* ObjC start of actions.(actionScope).memVars */
+/* ObjC end of actions.(actionScope).memVars */
+/* ObjC start of memVars */
+/* AST parserHeaderFile.memVars */
+NSInteger ruleLevel;
+NSArray *ruleNames;
+  /* AST super.memVars */
+/* AST parserMemVars */
+id<TreeAdaptor> treeAdaptor;   /* AST parserMemVars */
+/* ObjC end of memVars */
+
+ }
+
+/* ObjC start of actions.(actionScope).properties */
+/* ObjC end of actions.(actionScope).properties */
+/* ObjC start of properties */
+/* AST parserHeaderFile.properties */
+  /* AST super.properties */
+/* AST parserProperties */
+@property (retain, getter=getTreeAdaptor, setter=setTreeAdaptor:) id<TreeAdaptor> treeAdaptor;   /* AST parserproperties */
+/* ObjC end of properties */
+
++ (void) initialize;
++ (id) newPolyDifferentiator:(id<TreeNodeStream>)aStream;
+/* ObjC start of actions.(actionScope).methodsDecl */
+/* ObjC end of actions.(actionScope).methodsDecl */
+
+/* ObjC start of methodsDecl */
+/* AST parserHeaderFile.methodsDecl */
+  /* AST super.methodsDecl */
+/* AST parserMethodsDecl */
+- (id<TreeAdaptor>) getTreeAdaptor;
+- (void) setTreeAdaptor:(id<TreeAdaptor>)theTreeAdaptor;   /* AST parsermethodsDecl */
+/* ObjC end of methodsDecl */
+
+- (PolyDifferentiator_poly_return *)poly; 
+
+
+@end /* end of PolyDifferentiator interface */
+
diff --git a/runtime/ObjC/Framework/examples/polydiff/PolyDifferentiator.m b/runtime/ObjC/Framework/examples/polydiff/PolyDifferentiator.m
new file mode 100644
index 0000000..7b90e62
--- /dev/null
+++ b/runtime/ObjC/Framework/examples/polydiff/PolyDifferentiator.m
@@ -0,0 +1,791 @@
+/** \file
+ *  This OBJC source file was generated by $ANTLR version 3.4
+ *
+ *     -  From the grammar source file : /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/PolyDifferentiator.g
+ *     -                            On : 2012-02-16 18:10:53
+ *     -           for the tree parser : PolyDifferentiatorTreeParser
+ *
+ * Editing it, at least manually, is not wise.
+ *
+ * ObjC language generator and runtime by Alan Condit, acondit|hereisanat|ipns|dotgoeshere|com.
+ *
+ *
+*/
+// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/PolyDifferentiator.g 2012-02-16 18:10:53
+
+
+/* -----------------------------------------
+ * Include the ANTLR3 generated header file.
+ */
+#import "PolyDifferentiator.h"
+/* ----------------------------------------- */
+
+
+/* ============================================================================= */
+/* =============================================================================
+ * Start of recognizer
+ */
+
+#pragma mark Bitsets
+static ANTLRBitSet *FOLLOW_8_in_poly44;
+static const unsigned long long FOLLOW_8_in_poly44_data[] = { 0x0000000000000004LL};
+static ANTLRBitSet *FOLLOW_poly_in_poly46;
+static const unsigned long long FOLLOW_poly_in_poly46_data[] = { 0x0000000000000370LL};
+static ANTLRBitSet *FOLLOW_poly_in_poly48;
+static const unsigned long long FOLLOW_poly_in_poly48_data[] = { 0x0000000000000008LL};
+static ANTLRBitSet *FOLLOW_MULT_in_poly55;
+static const unsigned long long FOLLOW_MULT_in_poly55_data[] = { 0x0000000000000004LL};
+static ANTLRBitSet *FOLLOW_INT_in_poly57;
+static const unsigned long long FOLLOW_INT_in_poly57_data[] = { 0x0000000000000010LL};
+static ANTLRBitSet *FOLLOW_ID_in_poly59;
+static const unsigned long long FOLLOW_ID_in_poly59_data[] = { 0x0000000000000008LL};
+static ANTLRBitSet *FOLLOW_MULT_in_poly71;
+static const unsigned long long FOLLOW_MULT_in_poly71_data[] = { 0x0000000000000004LL};
+static ANTLRBitSet *FOLLOW_INT_in_poly75;
+static const unsigned long long FOLLOW_INT_in_poly75_data[] = { 0x0000000000000200LL};
+static ANTLRBitSet *FOLLOW_9_in_poly78;
+static const unsigned long long FOLLOW_9_in_poly78_data[] = { 0x0000000000000004LL};
+static ANTLRBitSet *FOLLOW_ID_in_poly80;
+static const unsigned long long FOLLOW_ID_in_poly80_data[] = { 0x0000000000000020LL};
+static ANTLRBitSet *FOLLOW_INT_in_poly84;
+static const unsigned long long FOLLOW_INT_in_poly84_data[] = { 0x0000000000000008LL};
+static ANTLRBitSet *FOLLOW_9_in_poly122;
+static const unsigned long long FOLLOW_9_in_poly122_data[] = { 0x0000000000000004LL};
+static ANTLRBitSet *FOLLOW_ID_in_poly124;
+static const unsigned long long FOLLOW_ID_in_poly124_data[] = { 0x0000000000000020LL};
+static ANTLRBitSet *FOLLOW_INT_in_poly128;
+static const unsigned long long FOLLOW_INT_in_poly128_data[] = { 0x0000000000000008LL};
+static ANTLRBitSet *FOLLOW_INT_in_poly164;
+static const unsigned long long FOLLOW_INT_in_poly164_data[] = { 0x0000000000000002LL};
+static ANTLRBitSet *FOLLOW_ID_in_poly178;
+static const unsigned long long FOLLOW_ID_in_poly178_data[] = { 0x0000000000000002LL};
+
+
+#pragma mark Dynamic Global globalAttributeScopeImplementation
+
+#pragma mark Dynamic Rule Scopes ruleAttributeScopeImplementation
+
+#pragma mark Rule Return Scopes returnScopeImplementation
+@implementation PolyDifferentiator_poly_return /* returnScopeImplementation */
+/* AST returnScope.synthesize */
+@synthesize tree; /* start of synthesize -- OBJC-Line 1837 */
++ (PolyDifferentiator_poly_return *)newPolyDifferentiator_poly_return
+{
+return [[[PolyDifferentiator_poly_return alloc] init] retain];
+}
+
+- (id) init
+{
+self = [super init];
+return self;
+}
+
+/* AST returnScope.methods */
+- (CommonTree *)getTree
+{
+    return tree;
+}
+
+- (void) setTree:(CommonTree *)aTree
+{
+    if (tree != aTree) {
+        if (tree != nil) [tree release];
+        if (aTree != nil) [aTree retain];
+        tree = aTree;
+    }
+}
+
+- (void) dealloc
+{
+    self.tree = nil;
+    [super dealloc];
+}
+
+
+@end /* end of returnScope implementation */
+
+
+
+@implementation PolyDifferentiator  // line 637
+
+/* ObjC start of ruleAttributeScope */
+#pragma mark Dynamic Rule Scopes ruleAttributeScope
+/* ObjC end of ruleAttributeScope */
+#pragma mark global Attribute Scopes globalAttributeScope
+/* ObjC start globalAttributeScope */
+/* ObjC end globalAttributeScope */
+/* ObjC start actions.(actionScope).synthesize */
+/* ObjC start synthesize() */
+/* AST genericParser.synthesize */
+/* AST parserProperties */
+@synthesize treeAdaptor;
+
++ (void) initialize
+{
+    #pragma mark Bitsets
+    FOLLOW_8_in_poly44 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_8_in_poly44_data Count:(NSUInteger)1] retain];
+    FOLLOW_poly_in_poly46 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_poly_in_poly46_data Count:(NSUInteger)1] retain];
+    FOLLOW_poly_in_poly48 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_poly_in_poly48_data Count:(NSUInteger)1] retain];
+    FOLLOW_MULT_in_poly55 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_MULT_in_poly55_data Count:(NSUInteger)1] retain];
+    FOLLOW_INT_in_poly57 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_INT_in_poly57_data Count:(NSUInteger)1] retain];
+    FOLLOW_ID_in_poly59 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_ID_in_poly59_data Count:(NSUInteger)1] retain];
+    FOLLOW_MULT_in_poly71 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_MULT_in_poly71_data Count:(NSUInteger)1] retain];
+    FOLLOW_INT_in_poly75 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_INT_in_poly75_data Count:(NSUInteger)1] retain];
+    FOLLOW_9_in_poly78 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_9_in_poly78_data Count:(NSUInteger)1] retain];
+    FOLLOW_ID_in_poly80 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_ID_in_poly80_data Count:(NSUInteger)1] retain];
+    FOLLOW_INT_in_poly84 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_INT_in_poly84_data Count:(NSUInteger)1] retain];
+    FOLLOW_9_in_poly122 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_9_in_poly122_data Count:(NSUInteger)1] retain];
+    FOLLOW_ID_in_poly124 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_ID_in_poly124_data Count:(NSUInteger)1] retain];
+    FOLLOW_INT_in_poly128 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_INT_in_poly128_data Count:(NSUInteger)1] retain];
+    FOLLOW_INT_in_poly164 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_INT_in_poly164_data Count:(NSUInteger)1] retain];
+    FOLLOW_ID_in_poly178 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_ID_in_poly178_data Count:(NSUInteger)1] retain];
+
+    [BaseRecognizer setTokenNames:[[AMutableArray arrayWithObjects:@"<invalid>", @"<EOR>", @"<DOWN>", @"<UP>", 
+ @"ID", @"INT", @"MULT", @"WS", @"'+'", @"'^'", nil] retain]];
+    [BaseRecognizer setGrammarFileName:@"/Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/PolyDifferentiator.g"];
+}
+
++ (PolyDifferentiator *)newPolyDifferentiator:(id<TreeNodeStream>)aStream
+{
+    return [[PolyDifferentiator alloc] initWithStream:aStream];
+}
+
+- (id) initWithStream:(id<TreeNodeStream>)aStream
+{
+    self = [super initWithStream:aStream State:[[RecognizerSharedState newRecognizerSharedStateWithRuleLen:1+1] retain]];
+    if ( self != nil ) {
+        /* start of actions-actionScope-init */
+        /* start of init */
+        /* AST genericParser.init */
+        [self setTreeAdaptor:[[CommonTreeAdaptor newTreeAdaptor] retain]];
+    }
+    return self;
+}
+
+- (void) dealloc
+{
+    /* AST genericParser.dealloc */
+    [self setTreeAdaptor:nil];
+
+    [super dealloc];
+}
+
+/* ObjC start actions.(actionScope).methods */
+/* ObjC end actions.(actionScope).methods */
+/* ObjC start methods() */
+/* AST genericParser.methods */
+/* AST parserMethods */
+- (id<TreeAdaptor>) getTreeAdaptor
+{
+	return treeAdaptor;
+}
+
+- (void) setTreeAdaptor:(id<TreeAdaptor>)aTreeAdaptor
+{
+	if (aTreeAdaptor != treeAdaptor) {
+		treeAdaptor = aTreeAdaptor;
+	}
+}
+/* ObjC end methods() */
+/* ObjC start rules */
+/*
+ * $ANTLR start poly
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/PolyDifferentiator.g:10:1: poly : ( ^( '+' poly poly ) | ^( MULT INT ID ) -> INT | ^( MULT c= INT ^( '^' ID e= INT ) ) -> ^( MULT[@\"*\"] INT[c2] ^( '^' ID INT[e2] ) ) | ^( '^' ID e= INT ) -> ^( MULT[@\"*\"] INT[c2] ^( '^' ID INT[e2] ) ) | INT -> INT[@\"0\"] | ID -> INT[@\"1\"] );
+ */
+- (PolyDifferentiator_poly_return *) poly
+{
+    /* ruleScopeSetUp */
+
+    /* ASTTreeParser ruleDeclarations */
+    /* AST ruleDeclarations */
+    /* ruleDeclarations */
+    PolyDifferentiator_poly_return * retval = [PolyDifferentiator_poly_return newPolyDifferentiator_poly_return];
+    [retval setStart:[input LT:1]];
+
+
+    CommonTree *root_0 = nil;
+
+    CommonTree *_first_0 = nil;
+    CommonTree *_last = nil;
+
+    @try {
+        /* AST ruleLabelDefs */
+        /* ruleLabelDefs entry */
+        CommonTree *c = nil;
+        CommonTree *e = nil;
+        CommonTree *char_literal1 = nil;
+        CommonTree *MULT4 = nil;
+        CommonTree *INT5 = nil;
+        CommonTree *ID6 = nil;
+        CommonTree *MULT7 = nil;
+        CommonTree *char_literal8 = nil;
+        CommonTree *ID9 = nil;
+        CommonTree *char_literal10 = nil;
+        CommonTree *ID11 = nil;
+        CommonTree *INT12 = nil;
+        CommonTree *ID13 = nil;PolyDifferentiator_poly_return * poly2 = nil ;
+
+        PolyDifferentiator_poly_return * poly3 = nil ;
+
+
+        CommonTree *c_tree=nil;
+        CommonTree *e_tree=nil;
+        CommonTree *char_literal1_tree=nil;
+        CommonTree *MULT4_tree=nil;
+        CommonTree *INT5_tree=nil;
+        CommonTree *ID6_tree=nil;
+        CommonTree *MULT7_tree=nil;
+        CommonTree *char_literal8_tree=nil;
+        CommonTree *ID9_tree=nil;
+        CommonTree *char_literal10_tree=nil;
+        CommonTree *ID11_tree=nil;
+        CommonTree *INT12_tree=nil;
+        CommonTree *ID13_tree=nil;
+        RewriteRuleTokenStream *stream_INT =
+            [[RewriteRuleNodeStream newRewriteRuleNodeStream:treeAdaptor
+                                                             description:@"token INT"] retain];
+        RewriteRuleTokenStream *stream_MULT =
+            [[RewriteRuleNodeStream newRewriteRuleNodeStream:treeAdaptor
+                                                             description:@"token MULT"] retain];
+        RewriteRuleTokenStream *stream_ID =
+            [[RewriteRuleNodeStream newRewriteRuleNodeStream:treeAdaptor
+                                                             description:@"token ID"] retain];
+        RewriteRuleTokenStream *stream_9 =
+            [[RewriteRuleNodeStream newRewriteRuleNodeStream:treeAdaptor
+                                                             description:@"token 9"] retain];
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/PolyDifferentiator.g:10:5: ( ^( '+' poly poly ) | ^( MULT INT ID ) -> INT | ^( MULT c= INT ^( '^' ID e= INT ) ) -> ^( MULT[@\"*\"] INT[c2] ^( '^' ID INT[e2] ) ) | ^( '^' ID e= INT ) -> ^( MULT[@\"*\"] INT[c2] ^( '^' ID INT[e2] ) ) | INT -> INT[@\"0\"] | ID -> INT[@\"1\"] ) //ruleblock
+        NSInteger alt1=6;
+        unichar charLA1 = [input LA:1];
+        switch (charLA1) {
+            case 8: ;
+                {
+                alt1=1;
+                }
+                break;
+            case MULT: ;
+                {
+                NSInteger LA1_2 = [input LA:2];
+
+                if ( (LA1_2==DOWN) ) {
+                    NSInteger LA1_6 = [input LA:3];
+
+                    if ( (LA1_6==INT) ) {
+                        NSInteger LA1_7 = [input LA:4];
+
+                        if ( (LA1_7==ID) ) {
+                            alt1=2;
+                        }
+                        else if ( (LA1_7==9) ) {
+                            alt1=3;
+                        }
+                        else {
+                            NoViableAltException *nvae = [NoViableAltException newException:1 state:7 stream:input];
+                            nvae.c = LA1_7;
+                            @throw nvae;
+
+                        }
+                    }
+                    else {
+                        NoViableAltException *nvae = [NoViableAltException newException:1 state:6 stream:input];
+                        nvae.c = LA1_6;
+                        @throw nvae;
+
+                    }
+                }
+                else {
+                    NoViableAltException *nvae = [NoViableAltException newException:1 state:2 stream:input];
+                    nvae.c = LA1_2;
+                    @throw nvae;
+
+                }
+                }
+                break;
+            case 9: ;
+                {
+                alt1=4;
+                }
+                break;
+            case INT: ;
+                {
+                alt1=5;
+                }
+                break;
+            case ID: ;
+                {
+                alt1=6;
+                }
+                break;
+
+        default: ;
+            NoViableAltException *nvae = [NoViableAltException newException:1 state:0 stream:input];
+            nvae.c = charLA1;
+            @throw nvae;
+
+        }
+
+        switch (alt1) {
+            case 1 : ;
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/PolyDifferentiator.g:10:7: ^( '+' poly poly ) // alt
+                {
+                root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+
+
+
+                /* ASTTreeParser tree */
+                _last = (CommonTree *)[input LT:1];
+                {
+                CommonTree *_save_last_1 = _last;
+                CommonTree *_first_1 = nil;
+                CommonTree *root_1 = [[[treeAdaptor class] newEmptyTree] retain];
+
+                /* ASTTreeParser tokenRefRuleRoot */
+                _last = (CommonTree *)[input LT:1];
+                char_literal1=(CommonTree *)[self match:input TokenType:8 Follow:FOLLOW_8_in_poly44]; 
+                char_literal1_tree = (CommonTree *)[treeAdaptor dupNode:char_literal1];
+
+
+                root_1 = (CommonTree *)[treeAdaptor becomeRoot:char_literal1_tree old:root_1];
+
+                 
+                [self match:input TokenType:TokenTypeDOWN Follow:nil]; 
+
+                /* ASTTreeParser ruleRef */
+                _last = (CommonTree *)[input LT:1];
+                /* ruleRef */
+                [self pushFollow:FOLLOW_poly_in_poly46];
+                poly2 = [self poly];
+
+                [self popFollow];
+
+
+                    [treeAdaptor addChild:poly2.tree toTree:root_1];
+
+                 
+                /* ASTTreeParser ruleRef */
+                _last = (CommonTree *)[input LT:1];
+                /* ruleRef */
+                [self pushFollow:FOLLOW_poly_in_poly48];
+                poly3 = [self poly];
+
+                [self popFollow];
+
+
+                    [treeAdaptor addChild:poly3.tree toTree:root_1];
+
+                 
+                [self match:input TokenType:TokenTypeUP Follow:nil]; 
+                [treeAdaptor addChild:root_1 toTree:root_0];
+                _last = _save_last_1;
+                }
+
+                 
+                /* ASTTreeParser noRewrite */
+
+                }
+                break;
+            case 2 : ;
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/PolyDifferentiator.g:11:4: ^( MULT INT ID ) // alt
+                {
+
+                /* ASTTreeParser tree */
+                _last = (CommonTree *)[input LT:1];
+                {
+                CommonTree *_save_last_1 = _last;
+                CommonTree *_first_1 = nil;
+                CommonTree *root_1 = [[[treeAdaptor class] newEmptyTree] retain];
+
+                /* ASTTreeParser tokenRefBang */
+                _last = (CommonTree *)[input LT:1];
+                MULT4=(CommonTree *)[self match:input TokenType:MULT Follow:FOLLOW_MULT_in_poly55];  
+                    [stream_MULT addElement:MULT4];
+
+                 
+                [self match:input TokenType:TokenTypeDOWN Follow:nil]; 
+
+                /* ASTTreeParser tokenRefBang */
+                _last = (CommonTree *)[input LT:1];
+                INT5=(CommonTree *)[self match:input TokenType:INT Follow:FOLLOW_INT_in_poly57];  
+                    [stream_INT addElement:INT5];
+
+                 
+                /* ASTTreeParser tokenRefBang */
+                _last = (CommonTree *)[input LT:1];
+                ID6=(CommonTree *)[self match:input TokenType:ID Follow:FOLLOW_ID_in_poly59];  
+                    [stream_ID addElement:ID6];
+
+                 
+                [self match:input TokenType:TokenTypeUP Follow:nil]; 
+                [treeAdaptor addChild:root_1 toTree:root_0];
+                _last = _save_last_1;
+                }
+
+                 
+                // AST REWRITE
+                // elements: INT
+                // token labels: 
+                // rule labels: retval
+                // token list labels: 
+                // rule list labels: 
+                // wildcard labels: 
+                retval.tree = root_0;
+
+                RewriteRuleSubtreeStream *stream_retval =
+                    [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
+                        description:@"token retval" element:retval!=nil?[retval getTree]:nil] retain];
+
+                root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+
+                // 11:20: -> INT
+                {
+                     // TODO: args: 
+                    [treeAdaptor addChild:/* ASTTreeParser createRewriteNodeFromElement */
+                    [stream_INT nextNode]
+                     toTree:root_0];
+
+                }
+
+
+                retval.tree = root_0;
+
+
+                }
+                break;
+            case 3 : ;
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/PolyDifferentiator.g:12:4: ^( MULT c= INT ^( '^' ID e= INT ) ) // alt
+                {
+
+                /* ASTTreeParser tree */
+                _last = (CommonTree *)[input LT:1];
+                {
+                CommonTree *_save_last_1 = _last;
+                CommonTree *_first_1 = nil;
+                CommonTree *root_1 = [[[treeAdaptor class] newEmptyTree] retain];
+
+                /* ASTTreeParser tokenRefBang */
+                _last = (CommonTree *)[input LT:1];
+                MULT7=(CommonTree *)[self match:input TokenType:MULT Follow:FOLLOW_MULT_in_poly71];  
+                    [stream_MULT addElement:MULT7];
+
+                 
+                [self match:input TokenType:TokenTypeDOWN Follow:nil]; 
+
+                /* ASTTreeParser tokenRefBang */
+                _last = (CommonTree *)[input LT:1];
+                c=(CommonTree *)[self match:input TokenType:INT Follow:FOLLOW_INT_in_poly75];  
+                    [stream_INT addElement:c];
+
+                 
+                /* ASTTreeParser tree */
+                _last = (CommonTree *)[input LT:1];
+                {
+                CommonTree *_save_last_2 = _last;
+                CommonTree *_first_2 = nil;
+                CommonTree *root_2 = [[[treeAdaptor class] newEmptyTree] retain];
+
+                /* ASTTreeParser tokenRefBang */
+                _last = (CommonTree *)[input LT:1];
+                char_literal8=(CommonTree *)[self match:input TokenType:9 Follow:FOLLOW_9_in_poly78];  
+                    [stream_9 addElement:char_literal8];
+
+                 
+                [self match:input TokenType:TokenTypeDOWN Follow:nil]; 
+
+                /* ASTTreeParser tokenRefBang */
+                _last = (CommonTree *)[input LT:1];
+                ID9=(CommonTree *)[self match:input TokenType:ID Follow:FOLLOW_ID_in_poly80];  
+                    [stream_ID addElement:ID9];
+
+                 
+                /* ASTTreeParser tokenRefBang */
+                _last = (CommonTree *)[input LT:1];
+                e=(CommonTree *)[self match:input TokenType:INT Follow:FOLLOW_INT_in_poly84];  
+                    [stream_INT addElement:e];
+
+                 
+                [self match:input TokenType:TokenTypeUP Follow:nil]; 
+                [treeAdaptor addChild:root_2 toTree:root_1];
+                _last = _save_last_2;
+                }
+
+                 
+                [self match:input TokenType:TokenTypeUP Follow:nil]; 
+                [treeAdaptor addChild:root_1 toTree:root_0];
+                _last = _save_last_1;
+                }
+
+                 
+
+
+                		NSString *c2 = [NSString stringWithFormat:@"%d", (c!=nil?[c.text integerValue]:0)*(e!=nil?[e.text integerValue]:0)];
+                		NSString *e2 = [NSString stringWithFormat:@"%d", (e!=nil?[e.text integerValue]:0)-1];
+                		
+
+                 
+                // AST REWRITE
+                // elements: INT, 9, INT, ID, MULT
+                // token labels: 
+                // rule labels: retval
+                // token list labels: 
+                // rule list labels: 
+                // wildcard labels: 
+                retval.tree = root_0;
+
+                RewriteRuleSubtreeStream *stream_retval =
+                    [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
+                        description:@"token retval" element:retval!=nil?[retval getTree]:nil] retain];
+
+                root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+
+                // 17:8: -> ^( MULT[@\"*\"] INT[c2] ^( '^' ID INT[e2] ) )
+                {
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/PolyDifferentiator.g:17:11: ^( MULT[@\"*\"] INT[c2] ^( '^' ID INT[e2] ) )
+                    {
+                        CommonTree *root_1 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+                        root_1 = (CommonTree *)[treeAdaptor becomeRoot:
+                                [[treeAdaptor createTree:MULT FromToken:@"*" Text:@"MULT"] retain]
+                         old:root_1];
+
+                        [treeAdaptor addChild:
+                                [[treeAdaptor createTree:INT FromToken:c2 Text:@"INT"] retain]
+                         toTree:root_1];
+
+                        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/PolyDifferentiator.g:17:32: ^( '^' ID INT[e2] )
+                        {
+                            CommonTree *root_2 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+                            root_2 = (CommonTree *)[treeAdaptor becomeRoot:/* ASTTreeParser createRewriteNodeFromElement */
+                            [stream_9 nextNode]
+                             old:root_2];
+
+                             // TODO: args: 
+                            [treeAdaptor addChild:/* ASTTreeParser createRewriteNodeFromElement */
+                            [stream_ID nextNode]
+                             toTree:root_2];
+
+                            [treeAdaptor addChild:
+                                    [[treeAdaptor createTree:INT FromToken:e2 Text:@"INT"] retain]
+                             toTree:root_2];
+
+                            [treeAdaptor addChild:root_2 toTree:root_1];
+                        }
+
+                        [treeAdaptor addChild:root_1 toTree:root_0];
+                    }
+
+                }
+
+
+                retval.tree = root_0;
+
+
+                }
+                break;
+            case 4 : ;
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/PolyDifferentiator.g:18:4: ^( '^' ID e= INT ) // alt
+                {
+
+                /* ASTTreeParser tree */
+                _last = (CommonTree *)[input LT:1];
+                {
+                CommonTree *_save_last_1 = _last;
+                CommonTree *_first_1 = nil;
+                CommonTree *root_1 = [[[treeAdaptor class] newEmptyTree] retain];
+
+                /* ASTTreeParser tokenRefBang */
+                _last = (CommonTree *)[input LT:1];
+                char_literal10=(CommonTree *)[self match:input TokenType:9 Follow:FOLLOW_9_in_poly122];  
+                    [stream_9 addElement:char_literal10];
+
+                 
+                [self match:input TokenType:TokenTypeDOWN Follow:nil]; 
+
+                /* ASTTreeParser tokenRefBang */
+                _last = (CommonTree *)[input LT:1];
+                ID11=(CommonTree *)[self match:input TokenType:ID Follow:FOLLOW_ID_in_poly124];  
+                    [stream_ID addElement:ID11];
+
+                 
+                /* ASTTreeParser tokenRefBang */
+                _last = (CommonTree *)[input LT:1];
+                e=(CommonTree *)[self match:input TokenType:INT Follow:FOLLOW_INT_in_poly128];  
+                    [stream_INT addElement:e];
+
+                 
+                [self match:input TokenType:TokenTypeUP Follow:nil]; 
+                [treeAdaptor addChild:root_1 toTree:root_0];
+                _last = _save_last_1;
+                }
+
+                 
+
+
+                		NSString *c2 = [NSString stringWithFormat:@"%d", (e!=nil?[e.text integerValue]:0)];
+                		NSString *e2 = [NSString stringWithFormat:@"%d", (e!=nil?[e.text integerValue]:0)-1];
+                		
+
+                 
+                // AST REWRITE
+                // elements: INT, 9, INT, ID
+                // token labels: 
+                // rule labels: retval
+                // token list labels: 
+                // rule list labels: 
+                // wildcard labels: 
+                retval.tree = root_0;
+
+                RewriteRuleSubtreeStream *stream_retval =
+                    [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
+                        description:@"token retval" element:retval!=nil?[retval getTree]:nil] retain];
+
+                root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+
+                // 23:8: -> ^( MULT[@\"*\"] INT[c2] ^( '^' ID INT[e2] ) )
+                {
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/PolyDifferentiator.g:23:11: ^( MULT[@\"*\"] INT[c2] ^( '^' ID INT[e2] ) )
+                    {
+                        CommonTree *root_1 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+                        root_1 = (CommonTree *)[treeAdaptor becomeRoot:
+                                [[treeAdaptor createTree:MULT FromToken:@"*" Text:@"MULT"] retain]
+                         old:root_1];
+
+                        [treeAdaptor addChild:
+                                [[treeAdaptor createTree:INT FromToken:c2 Text:@"INT"] retain]
+                         toTree:root_1];
+
+                        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/PolyDifferentiator.g:23:32: ^( '^' ID INT[e2] )
+                        {
+                            CommonTree *root_2 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+                            root_2 = (CommonTree *)[treeAdaptor becomeRoot:/* ASTTreeParser createRewriteNodeFromElement */
+                            [stream_9 nextNode]
+                             old:root_2];
+
+                             // TODO: args: 
+                            [treeAdaptor addChild:/* ASTTreeParser createRewriteNodeFromElement */
+                            [stream_ID nextNode]
+                             toTree:root_2];
+
+                            [treeAdaptor addChild:
+                                    [[treeAdaptor createTree:INT FromToken:e2 Text:@"INT"] retain]
+                             toTree:root_2];
+
+                            [treeAdaptor addChild:root_2 toTree:root_1];
+                        }
+
+                        [treeAdaptor addChild:root_1 toTree:root_0];
+                    }
+
+                }
+
+
+                retval.tree = root_0;
+
+
+                }
+                break;
+            case 5 : ;
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/PolyDifferentiator.g:24:4: INT // alt
+                {
+
+                /* ASTTreeParser tokenRefBang */
+                _last = (CommonTree *)[input LT:1];
+                INT12=(CommonTree *)[self match:input TokenType:INT Follow:FOLLOW_INT_in_poly164];  
+                    [stream_INT addElement:INT12];
+
+                 
+                // AST REWRITE
+                // elements: INT
+                // token labels: 
+                // rule labels: retval
+                // token list labels: 
+                // rule list labels: 
+                // wildcard labels: 
+                retval.tree = root_0;
+
+                RewriteRuleSubtreeStream *stream_retval =
+                    [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
+                        description:@"token retval" element:retval!=nil?[retval getTree]:nil] retain];
+
+                root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+
+                // 24:12: -> INT[@\"0\"]
+                {
+                    [treeAdaptor addChild:
+                            [[treeAdaptor createTree:INT FromToken:@"0" Text:@"INT"] retain]
+                     toTree:root_0];
+
+                }
+
+
+                retval.tree = root_0;
+
+
+                }
+                break;
+            case 6 : ;
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/PolyDifferentiator.g:25:4: ID // alt
+                {
+
+                /* ASTTreeParser tokenRefBang */
+                _last = (CommonTree *)[input LT:1];
+                ID13=(CommonTree *)[self match:input TokenType:ID Follow:FOLLOW_ID_in_poly178];  
+                    [stream_ID addElement:ID13];
+
+                 
+                // AST REWRITE
+                // elements: 
+                // token labels: 
+                // rule labels: retval
+                // token list labels: 
+                // rule list labels: 
+                // wildcard labels: 
+                retval.tree = root_0;
+
+                RewriteRuleSubtreeStream *stream_retval =
+                    [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
+                        description:@"token retval" element:retval!=nil?[retval getTree]:nil] retain];
+
+                root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+
+                // 25:11: -> INT[@\"1\"]
+                {
+                    [treeAdaptor addChild:
+                            [[treeAdaptor createTree:INT FromToken:@"1" Text:@"INT"] retain]
+                     toTree:root_0];
+
+                }
+
+
+                retval.tree = root_0;
+
+
+                }
+                break;
+
+        }
+        /* ASTTreeParser ruleCleanUp */
+        /* AST ruleCleanUp */
+        /* token+rule list labels */
+
+        [stream_INT release];
+        [stream_MULT release];
+        [stream_ID release];
+        [stream_9 release];
+
+        retval.tree = (CommonTree *)[treeAdaptor rulePostProcessing:root_0];
+
+    }
+    @catch (RecognitionException *re) {
+        [self reportError:re];
+        [self recover:input Exception:re];
+    }
+
+    @finally {
+        /* ruleScopeCleanUp */
+
+    }
+    return retval;
+}
+/* $ANTLR end poly */
+/* ObjC end rules */
+
+@end /* end of PolyDifferentiator implementation line 692 */
diff --git a/runtime/ObjC/Framework/examples/polydiff/PolyDifferentiator.tokens b/runtime/ObjC/Framework/examples/polydiff/PolyDifferentiator.tokens
new file mode 100644
index 0000000..c711b35
--- /dev/null
+++ b/runtime/ObjC/Framework/examples/polydiff/PolyDifferentiator.tokens
@@ -0,0 +1,8 @@
+T__8=8
+T__9=9
+ID=4
+INT=5
+MULT=6
+WS=7
+'+'=8
+'^'=9
diff --git a/runtime/ObjC/Framework/examples/polydiff/PolyLexer.h b/runtime/ObjC/Framework/examples/polydiff/PolyLexer.h
new file mode 100644
index 0000000..9eb1d64
--- /dev/null
+++ b/runtime/ObjC/Framework/examples/polydiff/PolyLexer.h
@@ -0,0 +1,44 @@
+// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Poly.g 2012-02-16 18:10:11
+
+/* =============================================================================
+ * Standard antlr OBJC runtime definitions
+ */
+#import <Foundation/Foundation.h>
+#import <ANTLR/ANTLR.h>
+/* End of standard antlr3 runtime definitions
+ * =============================================================================
+ */
+
+/* Start cyclicDFAInterface */
+
+#pragma mark Rule return scopes Interface start
+#pragma mark Rule return scopes Interface end
+#pragma mark Tokens
+#ifdef EOF
+#undef EOF
+#endif
+#define EOF -1
+#define T__8 8
+#define T__9 9
+#define ID 4
+#define INT 5
+#define MULT 6
+#define WS 7
+/* interface lexer class */
+@interface PolyLexer : Lexer { // line 283
+/* ObjC start of actions.lexer.memVars */
+/* ObjC end of actions.lexer.memVars */
+}
++ (void) initialize;
++ (PolyLexer *)newPolyLexerWithCharStream:(id<CharStream>)anInput;
+/* ObjC start actions.lexer.methodsDecl */
+/* ObjC end actions.lexer.methodsDecl */
+- (void) mT__8 ; 
+- (void) mT__9 ; 
+- (NSString *) mID ; 
+- (NSString *) mINT ; 
+- (void) mWS ; 
+- (void) mTokens ; 
+
+@end /* end of PolyLexer interface */
+
diff --git a/runtime/ObjC/Framework/examples/polydiff/PolyLexer.m b/runtime/ObjC/Framework/examples/polydiff/PolyLexer.m
new file mode 100644
index 0000000..1be0324
--- /dev/null
+++ b/runtime/ObjC/Framework/examples/polydiff/PolyLexer.m
@@ -0,0 +1,486 @@
+/** \file
+ *  This OBJC source file was generated by $ANTLR version 3.4
+ *
+ *     -  From the grammar source file : /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Poly.g
+ *     -                            On : 2012-02-16 18:10:11
+ *     -                 for the lexer : PolyLexerLexer
+ *
+ * Editing it, at least manually, is not wise.
+ *
+ * ObjC language generator and runtime by Alan Condit, acondit|hereisanat|ipns|dotgoeshere|com.
+ *
+ *
+*/
+// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Poly.g 2012-02-16 18:10:11
+
+
+/* -----------------------------------------
+ * Include the ANTLR3 generated header file.
+ */
+#import "PolyLexer.h"
+/* ----------------------------------------- */
+
+
+/* ============================================================================= */
+/* =============================================================================
+ * Start of recognizer
+ */
+
+/** As per Terence: No returns for lexer rules! */
+@implementation PolyLexer // line 330
+
++ (void) initialize
+{
+    [BaseRecognizer setGrammarFileName:@"/Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Poly.g"];
+}
+
++ (NSString *) tokenNameForType:(NSInteger)aTokenType
+{
+    return [[self getTokenNames] objectAtIndex:aTokenType];
+}
+
++ (PolyLexer *)newPolyLexerWithCharStream:(id<CharStream>)anInput
+{
+    return [[PolyLexer alloc] initWithCharStream:anInput];
+}
+
+- (id) initWithCharStream:(id<CharStream>)anInput
+{
+    self = [super initWithCharStream:anInput State:[RecognizerSharedState newRecognizerSharedStateWithRuleLen:6+1]];
+    if ( self != nil ) {
+    }
+    return self;
+}
+
+- (void) dealloc
+{
+    [super dealloc];
+}
+
+/* ObjC Start of actions.lexer.methods */
+/* ObjC end of actions.lexer.methods */
+/* ObjC start methods() */
+/* ObjC end methods() */
+
+/* Start of Rules */
+// $ANTLR start "T__8"
+- (void) mT__8
+{
+    //
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
+
+    @try {
+        NSInteger _type = T__8;
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Poly.g:7:6: ( '+' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Poly.g:7:8: '+' // alt
+        {
+
+
+        [self matchChar:'+']; 
+
+         
+        }
+
+        /* token+rule list labels */
+
+        state.type = _type;
+        state.channel = _channel;
+    }
+    @finally {
+        //
+        /* ruleScopeCleanUp */
+
+    }
+    return;
+}
+/* $ANTLR end "T__8" */
+// $ANTLR start "T__9"
+- (void) mT__9
+{
+    //
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
+
+    @try {
+        NSInteger _type = T__9;
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Poly.g:8:6: ( '^' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Poly.g:8:8: '^' // alt
+        {
+
+
+        [self matchChar:'^']; 
+
+         
+        }
+
+        /* token+rule list labels */
+
+        state.type = _type;
+        state.channel = _channel;
+    }
+    @finally {
+        //
+        /* ruleScopeCleanUp */
+
+    }
+    return;
+}
+/* $ANTLR end "T__9" */
+// $ANTLR start "ID"
+- (void) mID
+{
+    //
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
+    NSString * value = nil ;
+
+
+    @try {
+        NSInteger _type = ID;
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Poly.g:22:5: ( ( 'a' .. 'z' )+ ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Poly.g:22:7: ( 'a' .. 'z' )+ // alt
+        {
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Poly.g:22:7: ( 'a' .. 'z' )+ // positiveClosureBlock
+        NSInteger cnt1 = 0;
+        do {
+            NSInteger alt1 = 2;
+            NSInteger LA1_0 = [input LA:1];
+            if ( ((LA1_0 >= 'a' && LA1_0 <= 'z')) ) {
+                alt1=1;
+            }
+
+
+            switch (alt1) {
+                case 1 : ;
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Poly.g: // alt
+                    {
+
+                    if ((([input LA:1] >= 'a') && ([input LA:1] <= 'z'))) {
+                        [input consume];
+                    } else {
+                        MismatchedSetException *mse = [MismatchedSetException newException:nil stream:input];
+                        [self recover:mse];
+                        @throw mse;
+                    }
+
+                     
+                    }
+                    break;
+
+                default :
+                    if ( cnt1 >= 1 )
+                        goto loop1;
+                    EarlyExitException *eee =
+                        [EarlyExitException newException:input decisionNumber:1];
+                    @throw eee;
+            }
+            cnt1++;
+        } while (YES);
+        loop1: ;
+
+         
+        }
+
+        /* token+rule list labels */
+
+        state.type = _type;
+        state.channel = _channel;
+    }
+    @finally {
+        //
+        /* ruleScopeCleanUp */
+
+    }
+    return;
+}
+/* $ANTLR end "ID" */
+// $ANTLR start "INT"
+- (void) mINT
+{
+    //
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
+    NSString * value = nil ;
+
+
+    @try {
+        NSInteger _type = INT;
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Poly.g:25:5: ( ( '0' .. '9' )+ ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Poly.g:25:7: ( '0' .. '9' )+ // alt
+        {
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Poly.g:25:7: ( '0' .. '9' )+ // positiveClosureBlock
+        NSInteger cnt2 = 0;
+        do {
+            NSInteger alt2 = 2;
+            NSInteger LA2_0 = [input LA:1];
+            if ( ((LA2_0 >= '0' && LA2_0 <= '9')) ) {
+                alt2=1;
+            }
+
+
+            switch (alt2) {
+                case 1 : ;
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Poly.g: // alt
+                    {
+
+                    if ((([input LA:1] >= '0') && ([input LA:1] <= '9'))) {
+                        [input consume];
+                    } else {
+                        MismatchedSetException *mse = [MismatchedSetException newException:nil stream:input];
+                        [self recover:mse];
+                        @throw mse;
+                    }
+
+                     
+                    }
+                    break;
+
+                default :
+                    if ( cnt2 >= 1 )
+                        goto loop2;
+                    EarlyExitException *eee =
+                        [EarlyExitException newException:input decisionNumber:2];
+                    @throw eee;
+            }
+            cnt2++;
+        } while (YES);
+        loop2: ;
+
+         
+        }
+
+        /* token+rule list labels */
+
+        state.type = _type;
+        state.channel = _channel;
+    }
+    @finally {
+        //
+        /* ruleScopeCleanUp */
+
+    }
+    return;
+}
+/* $ANTLR end "INT" */
+// $ANTLR start "WS"
+- (void) mWS
+{
+    //
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
+
+    @try {
+        NSInteger _type = WS;
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Poly.g:27:4: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Poly.g:27:6: ( ' ' | '\\t' | '\\r' | '\\n' )+ // alt
+        {
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Poly.g:27:6: ( ' ' | '\\t' | '\\r' | '\\n' )+ // positiveClosureBlock
+        NSInteger cnt3 = 0;
+        do {
+            NSInteger alt3 = 2;
+            NSInteger LA3_0 = [input LA:1];
+            if ( ((LA3_0 >= '\t' && LA3_0 <= '\n')||LA3_0=='\r'||LA3_0==' ') ) {
+                alt3=1;
+            }
+
+
+            switch (alt3) {
+                case 1 : ;
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Poly.g: // alt
+                    {
+
+                    if ((([input LA:1] >= '\t') && ([input LA:1] <= '\n'))||[input LA:1] == '\r'||[input LA:1] == ' ') {
+                        [input consume];
+                    } else {
+                        MismatchedSetException *mse = [MismatchedSetException newException:nil stream:input];
+                        [self recover:mse];
+                        @throw mse;
+                    }
+
+                     
+                    }
+                    break;
+
+                default :
+                    if ( cnt3 >= 1 )
+                        goto loop3;
+                    EarlyExitException *eee =
+                        [EarlyExitException newException:input decisionNumber:3];
+                    @throw eee;
+            }
+            cnt3++;
+        } while (YES);
+        loop3: ;
+
+         
+
+         _channel=HIDDEN; 
+
+         
+        }
+
+        /* token+rule list labels */
+
+        state.type = _type;
+        state.channel = _channel;
+    }
+    @finally {
+        //
+        /* ruleScopeCleanUp */
+
+    }
+    return;
+}
+/* $ANTLR end "WS" */
+- (void) mTokens
+{
+    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Poly.g:1:8: ( T__8 | T__9 | ID | INT | WS ) //ruleblock
+    NSInteger alt4=5;
+    unichar charLA4 = [input LA:1];
+    switch (charLA4) {
+        case '+': ;
+            {
+            alt4=1;
+            }
+            break;
+        case '^': ;
+            {
+            alt4=2;
+            }
+            break;
+        case 'a': ;
+        case 'b': ;
+        case 'c': ;
+        case 'd': ;
+        case 'e': ;
+        case 'f': ;
+        case 'g': ;
+        case 'h': ;
+        case 'i': ;
+        case 'j': ;
+        case 'k': ;
+        case 'l': ;
+        case 'm': ;
+        case 'n': ;
+        case 'o': ;
+        case 'p': ;
+        case 'q': ;
+        case 'r': ;
+        case 's': ;
+        case 't': ;
+        case 'u': ;
+        case 'v': ;
+        case 'w': ;
+        case 'x': ;
+        case 'y': ;
+        case 'z': ;
+            {
+            alt4=3;
+            }
+            break;
+        case '0': ;
+        case '1': ;
+        case '2': ;
+        case '3': ;
+        case '4': ;
+        case '5': ;
+        case '6': ;
+        case '7': ;
+        case '8': ;
+        case '9': ;
+            {
+            alt4=4;
+            }
+            break;
+        case '\t': ;
+        case '\n': ;
+        case '\r': ;
+        case ' ': ;
+            {
+            alt4=5;
+            }
+            break;
+
+    default: ;
+        NoViableAltException *nvae = [NoViableAltException newException:4 state:0 stream:input];
+        nvae.c = charLA4;
+        @throw nvae;
+
+    }
+
+    switch (alt4) {
+        case 1 : ;
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Poly.g:1:10: T__8 // alt
+            {
+
+
+            [self mT__8]; 
+
+
+             
+            }
+            break;
+        case 2 : ;
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Poly.g:1:15: T__9 // alt
+            {
+
+
+            [self mT__9]; 
+
+
+             
+            }
+            break;
+        case 3 : ;
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Poly.g:1:20: ID // alt
+            {
+
+
+            [self mID]; 
+
+
+             
+            }
+            break;
+        case 4 : ;
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Poly.g:1:23: INT // alt
+            {
+
+
+            [self mINT]; 
+
+
+             
+            }
+            break;
+        case 5 : ;
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Poly.g:1:27: WS // alt
+            {
+
+
+            [self mWS]; 
+
+
+             
+            }
+            break;
+
+    }
+
+}
+
+@end /* end of PolyLexer implementation line 397 */
\ No newline at end of file
diff --git a/runtime/ObjC/Framework/examples/polydiff/PolyParser.h b/runtime/ObjC/Framework/examples/polydiff/PolyParser.h
new file mode 100644
index 0000000..9fed63a
--- /dev/null
+++ b/runtime/ObjC/Framework/examples/polydiff/PolyParser.h
@@ -0,0 +1,156 @@
+// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Poly.g 2012-02-16 18:10:10
+
+/* =============================================================================
+ * Standard antlr OBJC runtime definitions
+ */
+#import <Foundation/Foundation.h>
+#import <ANTLR/ANTLR.h>
+/* End of standard antlr3 runtime definitions
+ * =============================================================================
+ */
+
+/* parserHeaderFile */
+#ifndef ANTLR3TokenTypeAlreadyDefined
+#define ANTLR3TokenTypeAlreadyDefined
+typedef enum {
+    ANTLR_EOF = -1,
+    INVALID,
+    EOR,
+    DOWN,
+    UP,
+    MIN
+} ANTLR3TokenType;
+#endif
+
+#pragma mark Tokens
+#ifdef EOF
+#undef EOF
+#endif
+#define EOF -1
+#define T__8 8
+#define T__9 9
+#define ID 4
+#define INT 5
+#define MULT 6
+#define WS 7
+#pragma mark Dynamic Global Scopes globalAttributeScopeInterface
+#pragma mark Dynamic Rule Scopes ruleAttributeScopeInterface
+#pragma mark Rule Return Scopes returnScopeInterface
+/* returnScopeInterface PolyParser_poly_return */
+@interface PolyParser_poly_return : ParserRuleReturnScope { /* returnScopeInterface line 1838 */
+/* AST returnScopeInterface.memVars */
+CommonTree *tree; /* ObjC start of memVars() */
+
+}
+/* start property declarations */
+/* AST returnScopeInterface.properties */
+@property (retain, getter=getTree, setter=setTree:) CommonTree *tree;
+
+/* start of method declarations */
+
++ (PolyParser_poly_return *)newPolyParser_poly_return;
+/* this is start of set and get methods */
+/* AST returnScopeInterface.methodsDecl */
+- (CommonTree *)getTree;
+
+- (void) setTree:(CommonTree *)aTree;
+  /* methodsDecl */
+
+@end /* end of returnScopeInterface interface */
+
+
+/* returnScopeInterface PolyParser_term_return */
+@interface PolyParser_term_return : ParserRuleReturnScope { /* returnScopeInterface line 1838 */
+/* AST returnScopeInterface.memVars */
+CommonTree *tree; /* ObjC start of memVars() */
+
+}
+/* start property declarations */
+/* AST returnScopeInterface.properties */
+@property (retain, getter=getTree, setter=setTree:) CommonTree *tree;
+
+/* start of method declarations */
+
++ (PolyParser_term_return *)newPolyParser_term_return;
+/* this is start of set and get methods */
+/* AST returnScopeInterface.methodsDecl */
+- (CommonTree *)getTree;
+
+- (void) setTree:(CommonTree *)aTree;
+  /* methodsDecl */
+
+@end /* end of returnScopeInterface interface */
+
+
+/* returnScopeInterface PolyParser_exp_return */
+@interface PolyParser_exp_return : ParserRuleReturnScope { /* returnScopeInterface line 1838 */
+/* AST returnScopeInterface.memVars */
+CommonTree *tree; /* ObjC start of memVars() */
+
+}
+/* start property declarations */
+/* AST returnScopeInterface.properties */
+@property (retain, getter=getTree, setter=setTree:) CommonTree *tree;
+
+/* start of method declarations */
+
++ (PolyParser_exp_return *)newPolyParser_exp_return;
+/* this is start of set and get methods */
+/* AST returnScopeInterface.methodsDecl */
+- (CommonTree *)getTree;
+
+- (void) setTree:(CommonTree *)aTree;
+  /* methodsDecl */
+
+@end /* end of returnScopeInterface interface */
+
+
+
+/* Interface grammar class */
+@interface PolyParser  : Parser { /* line 572 */
+#pragma mark Dynamic Rule Scopes ruleAttributeScopeDecl
+#pragma mark Dynamic Global Rule Scopes globalAttributeScopeMemVar
+
+
+/* ObjC start of actions.(actionScope).memVars */
+/* ObjC end of actions.(actionScope).memVars */
+/* ObjC start of memVars */
+/* AST parserHeaderFile.memVars */
+NSInteger ruleLevel;
+NSArray *ruleNames;
+  /* AST super.memVars */
+/* AST parserMemVars */
+id<TreeAdaptor> treeAdaptor;   /* AST parserMemVars */
+/* ObjC end of memVars */
+
+ }
+
+/* ObjC start of actions.(actionScope).properties */
+/* ObjC end of actions.(actionScope).properties */
+/* ObjC start of properties */
+/* AST parserHeaderFile.properties */
+  /* AST super.properties */
+/* AST parserProperties */
+@property (retain, getter=getTreeAdaptor, setter=setTreeAdaptor:) id<TreeAdaptor> treeAdaptor;   /* AST parserproperties */
+/* ObjC end of properties */
+
++ (void) initialize;
++ (id) newPolyParser:(id<TokenStream>)aStream;
+/* ObjC start of actions.(actionScope).methodsDecl */
+/* ObjC end of actions.(actionScope).methodsDecl */
+
+/* ObjC start of methodsDecl */
+/* AST parserHeaderFile.methodsDecl */
+  /* AST super.methodsDecl */
+/* AST parserMethodsDecl */
+- (id<TreeAdaptor>) getTreeAdaptor;
+- (void) setTreeAdaptor:(id<TreeAdaptor>)theTreeAdaptor;   /* AST parsermethodsDecl */
+/* ObjC end of methodsDecl */
+
+- (PolyParser_poly_return *)poly; 
+- (PolyParser_term_return *)term; 
+- (PolyParser_exp_return *)exp; 
+
+
+@end /* end of PolyParser interface */
+
diff --git a/runtime/ObjC/Framework/examples/polydiff/PolyParser.m b/runtime/ObjC/Framework/examples/polydiff/PolyParser.m
new file mode 100644
index 0000000..4b80147
--- /dev/null
+++ b/runtime/ObjC/Framework/examples/polydiff/PolyParser.m
@@ -0,0 +1,757 @@
+/** \file
+ *  This OBJC source file was generated by $ANTLR version 3.4
+ *
+ *     -  From the grammar source file : /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Poly.g
+ *     -                            On : 2012-02-16 18:10:10
+ *     -                for the parser : PolyParserParser
+ *
+ * Editing it, at least manually, is not wise.
+ *
+ * ObjC language generator and runtime by Alan Condit, acondit|hereisanat|ipns|dotgoeshere|com.
+ *
+ *
+*/
+// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Poly.g 2012-02-16 18:10:10
+
+
+/* -----------------------------------------
+ * Include the ANTLR3 generated header file.
+ */
+#import "PolyParser.h"
+/* ----------------------------------------- */
+
+
+/* ============================================================================= */
+/* =============================================================================
+ * Start of recognizer
+ */
+
+#pragma mark Bitsets
+static ANTLRBitSet *FOLLOW_term_in_poly43;
+static const unsigned long long FOLLOW_term_in_poly43_data[] = { 0x0000000000000102LL};
+static ANTLRBitSet *FOLLOW_8_in_poly46;
+static const unsigned long long FOLLOW_8_in_poly46_data[] = { 0x0000000000000030LL};
+static ANTLRBitSet *FOLLOW_term_in_poly49;
+static const unsigned long long FOLLOW_term_in_poly49_data[] = { 0x0000000000000102LL};
+static ANTLRBitSet *FOLLOW_INT_in_term63;
+static const unsigned long long FOLLOW_INT_in_term63_data[] = { 0x0000000000000010LL};
+static ANTLRBitSet *FOLLOW_ID_in_term65;
+static const unsigned long long FOLLOW_ID_in_term65_data[] = { 0x0000000000000002LL};
+static ANTLRBitSet *FOLLOW_INT_in_term85;
+static const unsigned long long FOLLOW_INT_in_term85_data[] = { 0x0000000000000010LL};
+static ANTLRBitSet *FOLLOW_exp_in_term87;
+static const unsigned long long FOLLOW_exp_in_term87_data[] = { 0x0000000000000002LL};
+static ANTLRBitSet *FOLLOW_exp_in_term106;
+static const unsigned long long FOLLOW_exp_in_term106_data[] = { 0x0000000000000002LL};
+static ANTLRBitSet *FOLLOW_INT_in_term114;
+static const unsigned long long FOLLOW_INT_in_term114_data[] = { 0x0000000000000002LL};
+static ANTLRBitSet *FOLLOW_ID_in_term119;
+static const unsigned long long FOLLOW_ID_in_term119_data[] = { 0x0000000000000002LL};
+static ANTLRBitSet *FOLLOW_ID_in_exp132;
+static const unsigned long long FOLLOW_ID_in_exp132_data[] = { 0x0000000000000200LL};
+static ANTLRBitSet *FOLLOW_9_in_exp134;
+static const unsigned long long FOLLOW_9_in_exp134_data[] = { 0x0000000000000020LL};
+static ANTLRBitSet *FOLLOW_INT_in_exp137;
+static const unsigned long long FOLLOW_INT_in_exp137_data[] = { 0x0000000000000002LL};
+
+
+#pragma mark Dynamic Global globalAttributeScopeImplementation
+
+#pragma mark Dynamic Rule Scopes ruleAttributeScopeImplementation
+
+#pragma mark Rule Return Scopes returnScopeImplementation
+@implementation PolyParser_poly_return /* returnScopeImplementation */
+/* AST returnScope.synthesize */
+@synthesize tree; /* start of synthesize -- OBJC-Line 1837 */
++ (PolyParser_poly_return *)newPolyParser_poly_return
+{
+return [[[PolyParser_poly_return alloc] init] retain];
+}
+
+- (id) init
+{
+self = [super init];
+return self;
+}
+
+/* AST returnScope.methods */
+- (CommonTree *)getTree
+{
+    return tree;
+}
+
+- (void) setTree:(CommonTree *)aTree
+{
+    if (tree != aTree) {
+        if (tree != nil) [tree release];
+        if (aTree != nil) [aTree retain];
+        tree = aTree;
+    }
+}
+
+- (void) dealloc
+{
+    self.tree = nil;
+    [super dealloc];
+}
+
+
+@end /* end of returnScope implementation */
+
+@implementation PolyParser_term_return /* returnScopeImplementation */
+/* AST returnScope.synthesize */
+@synthesize tree; /* start of synthesize -- OBJC-Line 1837 */
++ (PolyParser_term_return *)newPolyParser_term_return
+{
+return [[[PolyParser_term_return alloc] init] retain];
+}
+
+- (id) init
+{
+self = [super init];
+return self;
+}
+
+/* AST returnScope.methods */
+- (CommonTree *)getTree
+{
+    return tree;
+}
+
+- (void) setTree:(CommonTree *)aTree
+{
+    if (tree != aTree) {
+        if (tree != nil) [tree release];
+        if (aTree != nil) [aTree retain];
+        tree = aTree;
+    }
+}
+
+- (void) dealloc
+{
+    self.tree = nil;
+    [super dealloc];
+}
+
+
+@end /* end of returnScope implementation */
+
+@implementation PolyParser_exp_return /* returnScopeImplementation */
+/* AST returnScope.synthesize */
+@synthesize tree; /* start of synthesize -- OBJC-Line 1837 */
++ (PolyParser_exp_return *)newPolyParser_exp_return
+{
+return [[[PolyParser_exp_return alloc] init] retain];
+}
+
+- (id) init
+{
+self = [super init];
+return self;
+}
+
+/* AST returnScope.methods */
+- (CommonTree *)getTree
+{
+    return tree;
+}
+
+- (void) setTree:(CommonTree *)aTree
+{
+    if (tree != aTree) {
+        if (tree != nil) [tree release];
+        if (aTree != nil) [aTree retain];
+        tree = aTree;
+    }
+}
+
+- (void) dealloc
+{
+    self.tree = nil;
+    [super dealloc];
+}
+
+
+@end /* end of returnScope implementation */
+
+
+
+@implementation PolyParser  // line 637
+
+/* ObjC start of ruleAttributeScope */
+#pragma mark Dynamic Rule Scopes ruleAttributeScope
+/* ObjC end of ruleAttributeScope */
+#pragma mark global Attribute Scopes globalAttributeScope
+/* ObjC start globalAttributeScope */
+/* ObjC end globalAttributeScope */
+/* ObjC start actions.(actionScope).synthesize */
+/* ObjC start synthesize() */
+/* AST genericParser.synthesize */
+/* AST parserProperties */
+@synthesize treeAdaptor;
+
++ (void) initialize
+{
+    #pragma mark Bitsets
+    FOLLOW_term_in_poly43 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_term_in_poly43_data Count:(NSUInteger)1] retain];
+    FOLLOW_8_in_poly46 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_8_in_poly46_data Count:(NSUInteger)1] retain];
+    FOLLOW_term_in_poly49 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_term_in_poly49_data Count:(NSUInteger)1] retain];
+    FOLLOW_INT_in_term63 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_INT_in_term63_data Count:(NSUInteger)1] retain];
+    FOLLOW_ID_in_term65 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_ID_in_term65_data Count:(NSUInteger)1] retain];
+    FOLLOW_INT_in_term85 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_INT_in_term85_data Count:(NSUInteger)1] retain];
+    FOLLOW_exp_in_term87 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_exp_in_term87_data Count:(NSUInteger)1] retain];
+    FOLLOW_exp_in_term106 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_exp_in_term106_data Count:(NSUInteger)1] retain];
+    FOLLOW_INT_in_term114 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_INT_in_term114_data Count:(NSUInteger)1] retain];
+    FOLLOW_ID_in_term119 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_ID_in_term119_data Count:(NSUInteger)1] retain];
+    FOLLOW_ID_in_exp132 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_ID_in_exp132_data Count:(NSUInteger)1] retain];
+    FOLLOW_9_in_exp134 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_9_in_exp134_data Count:(NSUInteger)1] retain];
+    FOLLOW_INT_in_exp137 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_INT_in_exp137_data Count:(NSUInteger)1] retain];
+
+    [BaseRecognizer setTokenNames:[[AMutableArray arrayWithObjects:@"<invalid>", @"<EOR>", @"<DOWN>", @"<UP>", 
+ @"ID", @"INT", @"MULT", @"WS", @"'+'", @"'^'", nil] retain]];
+    [BaseRecognizer setGrammarFileName:@"/Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Poly.g"];
+}
+
++ (PolyParser *)newPolyParser:(id<TokenStream>)aStream
+{
+    return [[PolyParser alloc] initWithTokenStream:aStream];
+}
+
+- (id) initWithTokenStream:(id<TokenStream>)aStream
+{
+    self = [super initWithTokenStream:aStream State:[[RecognizerSharedState newRecognizerSharedStateWithRuleLen:3+1] retain]];
+    if ( self != nil ) {
+        /* start of actions-actionScope-init */
+        /* start of init */
+        /* AST genericParser.init */
+        [self setTreeAdaptor:[[CommonTreeAdaptor newTreeAdaptor] retain]];
+    }
+    return self;
+}
+
+- (void) dealloc
+{
+    /* AST genericParser.dealloc */
+    [self setTreeAdaptor:nil];
+
+    [super dealloc];
+}
+
+/* ObjC start actions.(actionScope).methods */
+/* ObjC end actions.(actionScope).methods */
+/* ObjC start methods() */
+/* AST genericParser.methods */
+/* AST parserMethods */
+- (id<TreeAdaptor>) getTreeAdaptor
+{
+	return treeAdaptor;
+}
+
+- (void) setTreeAdaptor:(id<TreeAdaptor>)aTreeAdaptor
+{
+	if (aTreeAdaptor != treeAdaptor) {
+		treeAdaptor = aTreeAdaptor;
+	}
+}
+/* ObjC end methods() */
+/* ObjC start rules */
+/*
+ * $ANTLR start poly
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Poly.g:8:1: poly : term ( '+' ^ term )* ;
+ */
+- (PolyParser_poly_return *) poly
+{
+    /* ruleScopeSetUp */
+
+    /* AST ruleDeclarations */
+    /* ruleDeclarations */
+    PolyParser_poly_return * retval = [PolyParser_poly_return newPolyParser_poly_return];
+    [retval setStart:[input LT:1]];
+
+
+    CommonTree *root_0 = nil;
+
+    @try {
+        /* AST ruleLabelDefs */
+        /* ruleLabelDefs entry */
+        CommonToken *char_literal2 = nil;PolyParser_term_return * term1 = nil ;
+
+        PolyParser_term_return * term3 = nil ;
+
+
+        CommonTree *char_literal2_tree=nil;
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Poly.g:8:5: ( term ( '+' ^ term )* ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Poly.g:8:7: term ( '+' ^ term )* // alt
+        {
+        root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+
+
+
+        /* ASTParser ruleRef */
+        /* ruleRef */
+        [self pushFollow:FOLLOW_term_in_poly43];
+        term1 = [self term];
+
+        [self popFollow];
+
+
+        [treeAdaptor addChild:[term1 getTree] toTree:root_0];
+         
+
+        do {
+            NSInteger alt1=2;
+            NSInteger LA1_0 = [input LA:1];
+            if ( (LA1_0==8) ) {
+                alt1=1;
+            }
+
+
+            switch (alt1) {
+                case 1 : ;
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Poly.g:8:13: '+' ^ term // alt
+                    {
+
+                    char_literal2=(CommonToken *)[self match:input TokenType:8 Follow:FOLLOW_8_in_poly46]; 
+                    char_literal2_tree = /* ASTParser createNodeFromToken */
+                    (CommonTree *)[[treeAdaptor create:char_literal2] retain]
+                    ;
+                    root_0 = (CommonTree *)[treeAdaptor becomeRoot:char_literal2_tree old:root_0];
+
+                     
+                    /* ASTParser ruleRef */
+                    /* ruleRef */
+                    [self pushFollow:FOLLOW_term_in_poly49];
+                    term3 = [self term];
+
+                    [self popFollow];
+
+
+                    [treeAdaptor addChild:[term3 getTree] toTree:root_0];
+                     
+                    }
+                    break;
+
+                default :
+                    goto loop1;
+            }
+        } while (YES);
+        loop1: ;
+
+         
+        }
+
+        /* ASTParser ruleCleanUp */
+        /* AST ruleCleanUp */
+        /* token+rule list labels */
+        [retval setStop:[input LT:-1]];
+
+
+
+            retval.tree = (CommonTree *)[treeAdaptor rulePostProcessing:root_0];
+            [treeAdaptor setTokenBoundaries:retval.tree From:retval.start To:retval.stopToken];
+
+    }
+    @catch (RecognitionException *re) {
+        [self reportError:re];
+        [self recover:input Exception:re];
+        /* ASTParser rule.setErrorReturnValue */
+        retval.tree = (CommonTree *)[treeAdaptor errorNode:input From:retval.start To:[input LT:-1] Exception:re];
+
+    }
+
+    @finally {
+        /* ruleScopeCleanUp */
+
+    }
+    return retval;
+}
+/* $ANTLR end poly */
+
+/*
+ * $ANTLR start term
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Poly.g:11:1: term : ( INT ID -> ^( MULT[@\"*\"] INT ID ) | INT exp -> ^( MULT[@\"*\"] INT exp ) | exp | INT | ID );
+ */
+- (PolyParser_term_return *) term
+{
+    /* ruleScopeSetUp */
+
+    /* AST ruleDeclarations */
+    /* ruleDeclarations */
+    PolyParser_term_return * retval = [PolyParser_term_return newPolyParser_term_return];
+    [retval setStart:[input LT:1]];
+
+
+    CommonTree *root_0 = nil;
+
+    @try {
+        /* AST ruleLabelDefs */
+        /* ruleLabelDefs entry */
+        CommonToken *INT4 = nil;
+        CommonToken *ID5 = nil;
+        CommonToken *INT6 = nil;
+        CommonToken *INT9 = nil;
+        CommonToken *ID10 = nil;PolyParser_exp_return * exp7 = nil ;
+
+        PolyParser_exp_return * exp8 = nil ;
+
+
+        CommonTree *INT4_tree=nil;
+        CommonTree *ID5_tree=nil;
+        CommonTree *INT6_tree=nil;
+        CommonTree *INT9_tree=nil;
+        CommonTree *ID10_tree=nil;
+        RewriteRuleTokenStream *stream_INT =
+            [[RewriteRuleTokenStream newRewriteRuleTokenStream:treeAdaptor
+                                                             description:@"token INT"] retain];
+        RewriteRuleTokenStream *stream_ID =
+            [[RewriteRuleTokenStream newRewriteRuleTokenStream:treeAdaptor
+                                                             description:@"token ID"] retain];
+        RewriteRuleSubtreeStream *stream_exp =
+            [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
+                                                                description:@"rule exp"] retain];
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Poly.g:11:5: ( INT ID -> ^( MULT[@\"*\"] INT ID ) | INT exp -> ^( MULT[@\"*\"] INT exp ) | exp | INT | ID ) //ruleblock
+        NSInteger alt2=5;
+        NSInteger LA2_0 = [input LA:1];
+
+        if ( (LA2_0==INT) ) {
+            NSInteger LA2_1 = [input LA:2];
+
+            if ( (LA2_1==ID) ) {
+                NSInteger LA2_3 = [input LA:3];
+
+                if ( (LA2_3==9) ) {
+                    alt2=2;
+                }
+                else if ( (LA2_3==EOF||LA2_3==8) ) {
+                    alt2=1;
+                }
+                else {
+                    NoViableAltException *nvae = [NoViableAltException newException:2 state:3 stream:input];
+                    nvae.c = LA2_3;
+                    @throw nvae;
+
+                }
+            }
+            else if ( (LA2_1==EOF||LA2_1==8) ) {
+                alt2=4;
+            }
+            else {
+                NoViableAltException *nvae = [NoViableAltException newException:2 state:1 stream:input];
+                nvae.c = LA2_1;
+                @throw nvae;
+
+            }
+        }
+        else if ( (LA2_0==ID) ) {
+            NSInteger LA2_2 = [input LA:2];
+
+            if ( (LA2_2==9) ) {
+                alt2=3;
+            }
+            else if ( (LA2_2==EOF||LA2_2==8) ) {
+                alt2=5;
+            }
+            else {
+                NoViableAltException *nvae = [NoViableAltException newException:2 state:2 stream:input];
+                nvae.c = LA2_2;
+                @throw nvae;
+
+            }
+        }
+        else {
+            NoViableAltException *nvae = [NoViableAltException newException:2 state:0 stream:input];
+            nvae.c = LA2_0;
+            @throw nvae;
+
+        }
+        switch (alt2) {
+            case 1 : ;
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Poly.g:11:7: INT ID // alt
+                {
+
+                INT4=(CommonToken *)[self match:input TokenType:INT Follow:FOLLOW_INT_in_term63];  
+                    [stream_INT addElement:INT4];
+
+                 
+                ID5=(CommonToken *)[self match:input TokenType:ID Follow:FOLLOW_ID_in_term65];  
+                    [stream_ID addElement:ID5];
+
+                 
+                // AST REWRITE
+                // elements: ID, INT
+                // token labels: 
+                // rule labels: retval
+                // token list labels: 
+                // rule list labels: 
+                // wildcard labels: 
+                retval.tree = root_0;
+
+                RewriteRuleSubtreeStream *stream_retval =
+                    [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
+                        description:@"token retval" element:retval!=nil?[retval getTree]:nil] retain];
+
+                root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+
+                // 11:15: -> ^( MULT[@\"*\"] INT ID )
+                {
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Poly.g:11:18: ^( MULT[@\"*\"] INT ID )
+                    {
+                        CommonTree *root_1 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+                        root_1 = (CommonTree *)[treeAdaptor becomeRoot:
+                                [[treeAdaptor createTree:MULT FromToken:@"*" Text:@"MULT"] retain]
+                         old:root_1];
+
+                         // TODO: args: 
+                        [treeAdaptor addChild:
+                                    [stream_INT nextNode]
+                         toTree:root_1];
+
+                         // TODO: args: 
+                        [treeAdaptor addChild:
+                                    [stream_ID nextNode]
+                         toTree:root_1];
+
+                        [treeAdaptor addChild:root_1 toTree:root_0];
+                    }
+
+                }
+
+
+                retval.tree = root_0;
+
+
+                }
+                break;
+            case 2 : ;
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Poly.g:12:7: INT exp // alt
+                {
+
+                INT6=(CommonToken *)[self match:input TokenType:INT Follow:FOLLOW_INT_in_term85];  
+                    [stream_INT addElement:INT6];
+
+                 
+                /* ruleRef */
+                [self pushFollow:FOLLOW_exp_in_term87];
+                exp7 = [self exp];
+
+                [self popFollow];
+
+
+                [stream_exp addElement:[exp7 getTree]];
+                 
+                // AST REWRITE
+                // elements: exp, INT
+                // token labels: 
+                // rule labels: retval
+                // token list labels: 
+                // rule list labels: 
+                // wildcard labels: 
+                retval.tree = root_0;
+
+                RewriteRuleSubtreeStream *stream_retval =
+                    [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
+                        description:@"token retval" element:retval!=nil?[retval getTree]:nil] retain];
+
+                root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+
+                // 12:15: -> ^( MULT[@\"*\"] INT exp )
+                {
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Poly.g:12:18: ^( MULT[@\"*\"] INT exp )
+                    {
+                        CommonTree *root_1 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+                        root_1 = (CommonTree *)[treeAdaptor becomeRoot:
+                                [[treeAdaptor createTree:MULT FromToken:@"*" Text:@"MULT"] retain]
+                         old:root_1];
+
+                         // TODO: args: 
+                        [treeAdaptor addChild:
+                                    [stream_INT nextNode]
+                         toTree:root_1];
+
+                        [treeAdaptor addChild:[stream_exp nextTree] toTree:root_1];
+
+                        [treeAdaptor addChild:root_1 toTree:root_0];
+                    }
+
+                }
+
+
+                retval.tree = root_0;
+
+
+                }
+                break;
+            case 3 : ;
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Poly.g:13:7: exp // alt
+                {
+                root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+
+
+
+                /* ASTParser ruleRef */
+                /* ruleRef */
+                [self pushFollow:FOLLOW_exp_in_term106];
+                exp8 = [self exp];
+
+                [self popFollow];
+
+
+                [treeAdaptor addChild:[exp8 getTree] toTree:root_0];
+                 
+                }
+                break;
+            case 4 : ;
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Poly.g:14:7: INT // alt
+                {
+                root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+
+
+
+                /* ASTParser tokenRef */
+                INT9=(CommonToken *)[self match:input TokenType:INT Follow:FOLLOW_INT_in_term114]; 
+                INT9_tree = /* ASTParser createNodeFromToken */
+                (CommonTree *)[[treeAdaptor create:INT9] retain]
+                ;
+                [treeAdaptor addChild:INT9_tree  toTree:root_0];
+
+                 
+                }
+                break;
+            case 5 : ;
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Poly.g:15:4: ID // alt
+                {
+                root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+
+
+
+                /* ASTParser tokenRef */
+                ID10=(CommonToken *)[self match:input TokenType:ID Follow:FOLLOW_ID_in_term119]; 
+                ID10_tree = /* ASTParser createNodeFromToken */
+                (CommonTree *)[[treeAdaptor create:ID10] retain]
+                ;
+                [treeAdaptor addChild:ID10_tree  toTree:root_0];
+
+                 
+                }
+                break;
+
+        }
+        /* ASTParser ruleCleanUp */
+        /* AST ruleCleanUp */
+        /* token+rule list labels */
+        [retval setStop:[input LT:-1]];
+
+
+        [stream_INT release];
+        [stream_ID release];
+        [stream_exp release];
+
+            retval.tree = (CommonTree *)[treeAdaptor rulePostProcessing:root_0];
+            [treeAdaptor setTokenBoundaries:retval.tree From:retval.start To:retval.stopToken];
+
+    }
+    @catch (RecognitionException *re) {
+        [self reportError:re];
+        [self recover:input Exception:re];
+        /* ASTParser rule.setErrorReturnValue */
+        retval.tree = (CommonTree *)[treeAdaptor errorNode:input From:retval.start To:[input LT:-1] Exception:re];
+
+    }
+
+    @finally {
+        /* ruleScopeCleanUp */
+
+    }
+    return retval;
+}
+/* $ANTLR end term */
+
+/*
+ * $ANTLR start exp
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Poly.g:18:1: exp : ID '^' ^ INT ;
+ */
+- (PolyParser_exp_return *) exp
+{
+    /* ruleScopeSetUp */
+
+    /* AST ruleDeclarations */
+    /* ruleDeclarations */
+    PolyParser_exp_return * retval = [PolyParser_exp_return newPolyParser_exp_return];
+    [retval setStart:[input LT:1]];
+
+
+    CommonTree *root_0 = nil;
+
+    @try {
+        /* AST ruleLabelDefs */
+        /* ruleLabelDefs entry */
+        CommonToken *ID11 = nil;
+        CommonToken *char_literal12 = nil;
+        CommonToken *INT13 = nil;
+
+        CommonTree *ID11_tree=nil;
+        CommonTree *char_literal12_tree=nil;
+        CommonTree *INT13_tree=nil;
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Poly.g:18:5: ( ID '^' ^ INT ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Poly.g:18:7: ID '^' ^ INT // alt
+        {
+        root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+
+
+
+        /* ASTParser tokenRef */
+        ID11=(CommonToken *)[self match:input TokenType:ID Follow:FOLLOW_ID_in_exp132]; 
+        ID11_tree = /* ASTParser createNodeFromToken */
+        (CommonTree *)[[treeAdaptor create:ID11] retain]
+        ;
+        [treeAdaptor addChild:ID11_tree  toTree:root_0];
+
+         
+        char_literal12=(CommonToken *)[self match:input TokenType:9 Follow:FOLLOW_9_in_exp134]; 
+        char_literal12_tree = /* ASTParser createNodeFromToken */
+        (CommonTree *)[[treeAdaptor create:char_literal12] retain]
+        ;
+        root_0 = (CommonTree *)[treeAdaptor becomeRoot:char_literal12_tree old:root_0];
+
+         
+        /* ASTParser tokenRef */
+        INT13=(CommonToken *)[self match:input TokenType:INT Follow:FOLLOW_INT_in_exp137]; 
+        INT13_tree = /* ASTParser createNodeFromToken */
+        (CommonTree *)[[treeAdaptor create:INT13] retain]
+        ;
+        [treeAdaptor addChild:INT13_tree  toTree:root_0];
+
+         
+        }
+
+        /* ASTParser ruleCleanUp */
+        /* AST ruleCleanUp */
+        /* token+rule list labels */
+        [retval setStop:[input LT:-1]];
+
+
+
+            retval.tree = (CommonTree *)[treeAdaptor rulePostProcessing:root_0];
+            [treeAdaptor setTokenBoundaries:retval.tree From:retval.start To:retval.stopToken];
+
+    }
+    @catch (RecognitionException *re) {
+        [self reportError:re];
+        [self recover:input Exception:re];
+        /* ASTParser rule.setErrorReturnValue */
+        retval.tree = (CommonTree *)[treeAdaptor errorNode:input From:retval.start To:[input LT:-1] Exception:re];
+
+    }
+
+    @finally {
+        /* ruleScopeCleanUp */
+
+    }
+    return retval;
+}
+/* $ANTLR end exp */
+/* ObjC end rules */
+
+@end /* end of PolyParser implementation line 692 */
diff --git a/runtime/ObjC/Framework/examples/polydiff/PolyPrinter.g b/runtime/ObjC/Framework/examples/polydiff/PolyPrinter.g
new file mode 100644
index 0000000..cdb3168
--- /dev/null
+++ b/runtime/ObjC/Framework/examples/polydiff/PolyPrinter.g
@@ -0,0 +1,14 @@
+tree grammar PolyPrinter;
+options {
+	tokenVocab=Poly;
+    language=ObjC;
+	ASTLabelType=CommonTree;
+	output=template;
+}
+
+poly:	^('+'  a=poly b=poly)	-> template(a={$a.st} b:b={$b.st}) "<a>+<b>"
+	|	^(MULT a=poly b=poly)	-> template(a={$a.st} b:b={$b.st}) "<a><b>"
+	|	^('^'  a=poly b=poly)	-> template(a={$a.st} b:b={$b.st}) "<a>^<b>"
+	|	INT						-> {%{$INT.text}}
+	|	ID						-> {%{$ID.text}}
+	;
diff --git a/runtime/ObjC/Framework/examples/polydiff/PolyPrinter.h b/runtime/ObjC/Framework/examples/polydiff/PolyPrinter.h
new file mode 100644
index 0000000..3e59f89
--- /dev/null
+++ b/runtime/ObjC/Framework/examples/polydiff/PolyPrinter.h
@@ -0,0 +1,74 @@
+// $ANTLR 3.3.1-SNAPSHOT Jan 30, 2011 08:28:24 PolyPrinter.g 2011-01-30 08:45:32
+
+/* =============================================================================
+ * Standard antlr3 OBJC runtime definitions
+ */
+#import <Foundation/Foundation.h>
+#import <ANTLR/ANTLR.h>
+#import <ST4/ST.h>
+
+/* End of standard antlr3 runtime definitions
+ * =============================================================================
+ */
+
+/* treeParserHeaderFile */
+
+#ifndef ANTLR3TokenTypeAlreadyDefined
+#define ANTLR3TokenTypeAlreadyDefined
+typedef enum {
+    ANTLR_EOF = -1,
+    INVALID,
+    EOR,
+    DOWN,
+    UP,
+    MIN
+} ANTLR3TokenType;
+#endif
+
+#pragma mark Tokens
+#ifdef EOF
+#undef EOF
+#endif
+#define EOF -1
+#define T__8 8
+#define T__9 9
+#define MULT 4
+#define INT 5
+#define ID 6
+#define WS 7
+#pragma mark Dynamic Global Scopes
+#pragma mark Dynamic Rule Scopes
+#pragma mark Rule Return Scopes start
+/* returnScopeInterface */
+@interface PolyPrinter_poly_return :TreeRuleReturnScope { /* returnScopeInterface line 1838 */
+ST *st; /* start of memVars() */
+}
+ /* start properties */
++ (PolyPrinter_poly_return *)newPolyPrinter_poly_return;
+/* this is start of set and get methods */
+/* AST returnScopeInterface.methodsdecl */
+- (id) getTemplate;  /* methodsDecl */
+@end /* end of returnScopeInterface interface */
+
+#pragma mark Rule return scopes end
+@interface PolyPrinter : TreeParser { /* line 572 */
+// start of globalAttributeScopeMemVar
+
+
+// start of action-actionScope-memVars
+// start of ruleAttributeScopeMemVar
+
+
+// Start of memVars
+
+ }
+
+// start of action-actionScope-methodsDecl
++ (id) newPolyPrinter:(id<TreeNodeStream>)aStream;
+
+
+
+- (PolyPrinter_poly_return *)poly; 
+
+
+@end /* end of PolyPrinter interface */
diff --git a/runtime/ObjC/Framework/examples/polydiff/PolyPrinter.m b/runtime/ObjC/Framework/examples/polydiff/PolyPrinter.m
new file mode 100644
index 0000000..f0af6ef
--- /dev/null
+++ b/runtime/ObjC/Framework/examples/polydiff/PolyPrinter.m
@@ -0,0 +1,390 @@
+/** \file
+ *  This OBJC source file was generated by $ANTLR version 3.3.1-SNAPSHOT Jan 30, 2011 08:28:24
+ *
+ *     -  From the grammar source file : PolyPrinter.g
+ *     -                            On : 2011-01-30 08:45:32
+ *     -           for the tree parser : PolyPrinterTreeParser *
+ * Editing it, at least manually, is not wise. 
+ *
+ * ObjC language generator and runtime by Alan Condit, acondit|hereisanat|ipns|dotgoeshere|com.
+ *
+ *
+*/
+// [The "BSD licence"]
+// Copyright (c) 2010 Alan Condit
+//
+// 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.
+
+// $ANTLR 3.3.1-SNAPSHOT Jan 30, 2011 08:28:24 PolyPrinter.g 2011-01-30 08:45:32
+
+/* -----------------------------------------
+ * Include the ANTLR3 generated header file.
+ */
+#import <ST4/ST.h>
+#import <ST4/STGroup.h>
+#import "PolyPrinter.h"
+/* ----------------------------------------- */
+
+
+/* ============================================================================= */
+
+/* =============================================================================
+ * Start of recognizer
+ */
+
+
+
+#pragma mark Bitsets
+static ANTLRBitSet *FOLLOW_8_in_poly43;
+static const unsigned long long FOLLOW_8_in_poly43_data[] = { 0x0000000000000004LL};
+static ANTLRBitSet *FOLLOW_poly_in_poly48;
+static const unsigned long long FOLLOW_poly_in_poly48_data[] = { 0x0000000000000370LL};
+static ANTLRBitSet *FOLLOW_poly_in_poly52;
+static const unsigned long long FOLLOW_poly_in_poly52_data[] = { 0x0000000000000008LL};
+static ANTLRBitSet *FOLLOW_MULT_in_poly74;
+static const unsigned long long FOLLOW_MULT_in_poly74_data[] = { 0x0000000000000004LL};
+static ANTLRBitSet *FOLLOW_poly_in_poly78;
+static const unsigned long long FOLLOW_poly_in_poly78_data[] = { 0x0000000000000370LL};
+static ANTLRBitSet *FOLLOW_poly_in_poly82;
+static const unsigned long long FOLLOW_poly_in_poly82_data[] = { 0x0000000000000008LL};
+static ANTLRBitSet *FOLLOW_9_in_poly104;
+static const unsigned long long FOLLOW_9_in_poly104_data[] = { 0x0000000000000004LL};
+static ANTLRBitSet *FOLLOW_poly_in_poly109;
+static const unsigned long long FOLLOW_poly_in_poly109_data[] = { 0x0000000000000370LL};
+static ANTLRBitSet *FOLLOW_poly_in_poly113;
+static const unsigned long long FOLLOW_poly_in_poly113_data[] = { 0x0000000000000008LL};
+static ANTLRBitSet *FOLLOW_INT_in_poly134;
+static const unsigned long long FOLLOW_INT_in_poly134_data[] = { 0x0000000000000002LL};
+static ANTLRBitSet *FOLLOW_ID_in_poly148;
+static const unsigned long long FOLLOW_ID_in_poly148_data[] = { 0x0000000000000002LL};
+
+
+#pragma mark Dynamic Global Scopes
+
+#pragma mark Dynamic Rule Scopes
+
+#pragma mark Rule return scopes start
+@implementation PolyPrinter_poly_return /* returnScope */
+ /* start of synthesize -- OBJC-Line 1837 */
++ (PolyPrinter_poly_return *)newPolyPrinter_poly_return
+{
+    return [[[PolyPrinter_poly_return alloc] init] retain];
+}
+
+- (id) getTemplate { return st; }
+
+//public StringTemplate st;
+//public Object getTemplate() { return st; }
+//public String toString() { return st==null?null:st.toString(); }
+
+@end /* end of returnScope implementation */
+
+
+
+@implementation PolyPrinter  // line 637
+
++ (void) initialize
+{
+    #pragma mark Bitsets
+    FOLLOW_8_in_poly43 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_8_in_poly43_data Count:(NSUInteger)1] retain];
+    FOLLOW_poly_in_poly48 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_poly_in_poly48_data Count:(NSUInteger)1] retain];
+    FOLLOW_poly_in_poly52 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_poly_in_poly52_data Count:(NSUInteger)1] retain];
+    FOLLOW_MULT_in_poly74 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_MULT_in_poly74_data Count:(NSUInteger)1] retain];
+    FOLLOW_poly_in_poly78 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_poly_in_poly78_data Count:(NSUInteger)1] retain];
+    FOLLOW_poly_in_poly82 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_poly_in_poly82_data Count:(NSUInteger)1] retain];
+    FOLLOW_9_in_poly104 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_9_in_poly104_data Count:(NSUInteger)1] retain];
+    FOLLOW_poly_in_poly109 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_poly_in_poly109_data Count:(NSUInteger)1] retain];
+    FOLLOW_poly_in_poly113 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_poly_in_poly113_data Count:(NSUInteger)1] retain];
+    FOLLOW_INT_in_poly134 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_INT_in_poly134_data Count:(NSUInteger)1] retain];
+    FOLLOW_ID_in_poly148 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_ID_in_poly148_data Count:(NSUInteger)1] retain];
+
+    [BaseRecognizer setTokenNames:[[NSArray arrayWithObjects:@"<invalid>", @"<EOR>", @"<DOWN>", @"<UP>", 
+ @"MULT", @"INT", @"ID", @"WS", @"'+'", @"'^'", nil] retain]];
+    [BaseRecognizer setGrammarFileName:@"PolyPrinter.g"];
+}
+
++ (PolyPrinter *)newPolyPrinter:(id<TreeNodeStream>)aStream
+{
+
+    return [[PolyPrinter alloc] initWithStream:aStream];
+
+}
+
+
+- (id) initWithStream:(id<TreeNodeStream>)aStream
+{
+    if ((self = [super initWithStream:aStream State:[[RecognizerSharedState newRecognizerSharedStateWithRuleLen:1+1] retain]]) != nil) {
+
+
+        /* start of actions-actionScope-init */
+        /* start of init */
+    }
+    return self;
+}
+
+- (void) dealloc
+{
+    [super dealloc];
+}
+
+/* members */
+ 
+
+/* start actions.actionScope.methods */
+/* start methods() */
+/*protected StringTemplateGroup templateLib = new StringTemplateGroup("PolyPrinterTemplates", AngleBracketTemplateLexer.class); */
+STGroup *templateLib = [STGroup newSTGroup];
+
+//public void setTemplateLib(StringTemplateGroup templateLib) {
+//  this.templateLib = templateLib;
+//}
+//public StringTemplateGroup getTemplateLib() {
+//  return templateLib;
+//}
+- (void) setTemplateLib:(STGroup *)aTemplateLib { templateLib = aTemplateLib; } 
+- (STGroup *)getTemplateLib { return templateLib; } 
+/** allows convenient multi-value initialization:
+ *  "new STAttrMap().put(...).put(...)"
+ */
+/*
+public static class STAttrMap extends HashMap {
+  public STAttrMap put(String attrName, Object value) {
+    super.put(attrName, value);
+    return this;
+  }
+  public STAttrMap put(String attrName, int value) {
+    super.put(attrName, new Integer(value));
+    return this;
+  }
+}
+ */
+// start rules
+/*
+ * $ANTLR start poly
+ * PolyPrinter.g:9:1: poly : ( ^( '+' a= poly b= poly ) -> template(a=$a.stb=$b.st) \"<a>+<b>\" | ^( MULT a= poly b= poly ) -> template(a=$a.stb=$b.st) \"<a><b>\" | ^( '^' a= poly b= poly ) -> template(a=$a.stb=$b.st) \"<a>^<b>\" | INT -> {%{$INT.text}} | ID -> {%{$ID.text}});
+ */
+- (PolyPrinter_poly_return *) poly
+{
+    /* ruleScopeSetUp */
+
+    PolyPrinter_poly_return * retval = [PolyPrinter_poly_return newPolyPrinter_poly_return];
+    [retval setStart:[input LT:1]];
+
+    @try {
+        CommonTree *INT1 = nil;
+        CommonTree *ID2 = nil;
+        PolyPrinter_poly_return * a = nil;
+
+        PolyPrinter_poly_return * b = nil;
+
+
+        // PolyPrinter.g:9:5: ( ^( '+' a= poly b= poly ) -> template(a=$a.stb=$b.st) \"<a>+<b>\" | ^( MULT a= poly b= poly ) -> template(a=$a.stb=$b.st) \"<a><b>\" | ^( '^' a= poly b= poly ) -> template(a=$a.stb=$b.st) \"<a>^<b>\" | INT -> {%{$INT.text}} | ID -> {%{$ID.text}}) //ruleblock
+        NSInteger alt1=5;
+        switch ([input LA:1]) {
+            case 8: ;
+                {
+                alt1=1;
+                }
+                break;
+            case MULT: ;
+                {
+                alt1=2;
+                }
+                break;
+            case 9: ;
+                {
+                alt1=3;
+                }
+                break;
+            case INT: ;
+                {
+                alt1=4;
+                }
+                break;
+            case ID: ;
+                {
+                alt1=5;
+                }
+                break;
+
+        default: ;
+            NoViableAltException *nvae = [NoViableAltException newException:1 state:0 stream:input];
+            @throw nvae;
+        }
+
+        switch (alt1) {
+            case 1 : ;
+                // PolyPrinter.g:9:7: ^( '+' a= poly b= poly ) // alt
+                {
+                [self match:input TokenType:8 Follow:FOLLOW_8_in_poly43]; 
+
+                    [self match:input TokenType:DOWN Follow:nil]; 
+                    /* ruleRef */
+                    [self pushFollow:FOLLOW_poly_in_poly48];
+                    a = [self poly];
+
+                    [self popFollow];
+
+
+                    /* ruleRef */
+                    [self pushFollow:FOLLOW_poly_in_poly52];
+                    b = [self poly];
+
+                    [self popFollow];
+
+
+
+                    [self match:input TokenType:UP Follow:nil]; 
+
+
+                // TEMPLATE REWRITE
+                // 9:29: -> template(a=$a.stb=$b.st) \"<a>+<b>\"
+                {
+                    retval.st = new StringTemplate(templateLib, "<a>+<b>",
+                  new STAttrMap().put("a", (a!=nil?[a st]:nil)).put("b", (b!=nil?[b st]:nil)));
+                }
+
+
+                }
+                break;
+            case 2 : ;
+                // PolyPrinter.g:10:4: ^( MULT a= poly b= poly ) // alt
+                {
+                [self match:input TokenType:MULT Follow:FOLLOW_MULT_in_poly74]; 
+
+                    [self match:input TokenType:DOWN Follow:nil]; 
+                    /* ruleRef */
+                    [self pushFollow:FOLLOW_poly_in_poly78];
+                    a = [self poly];
+
+                    [self popFollow];
+
+
+                    /* ruleRef */
+                    [self pushFollow:FOLLOW_poly_in_poly82];
+                    b = [self poly];
+
+                    [self popFollow];
+
+
+
+                    [self match:input TokenType:UP Follow:nil]; 
+
+
+                // TEMPLATE REWRITE
+                // 10:26: -> template(a=$a.stb=$b.st) \"<a><b>\"
+                {
+                    retval.st = new StringTemplate(templateLib, "<a><b>",
+                  new STAttrMap().put("a", (a!=nil?[a st]:nil)).put("b", (b!=nil?[b st]:nil)));
+                }
+
+
+                }
+                break;
+            case 3 : ;
+                // PolyPrinter.g:11:4: ^( '^' a= poly b= poly ) // alt
+                {
+                [self match:input TokenType:9 Follow:FOLLOW_9_in_poly104]; 
+
+                    [self match:input TokenType:DOWN Follow:nil]; 
+                    /* ruleRef */
+                    [self pushFollow:FOLLOW_poly_in_poly109];
+                    a = [self poly];
+
+                    [self popFollow];
+
+
+                    /* ruleRef */
+                    [self pushFollow:FOLLOW_poly_in_poly113];
+                    b = [self poly];
+
+                    [self popFollow];
+
+
+
+                    [self match:input TokenType:UP Follow:nil]; 
+
+
+                // TEMPLATE REWRITE
+                // 11:26: -> template(a=$a.stb=$b.st) \"<a>^<b>\"
+                {
+                    retval.st = [ST newST:@"<a>^<b>"];
+                    [retval.st add:@"a" value:@"b"];
+                }
+
+
+                }
+                break;
+            case 4 : ;
+                // PolyPrinter.g:12:4: INT // alt
+                {
+                INT1=(CommonTree *)[self match:input TokenType:INT Follow:FOLLOW_INT_in_poly134]; 
+
+
+                // TEMPLATE REWRITE
+                // 12:13: -> {%{$INT.text}}
+                {
+                    retval.st = [ST newST:(INT1!=nil?INT1.text:nil)];
+                }
+
+
+                }
+                break;
+            case 5 : ;
+                // PolyPrinter.g:13:4: ID // alt
+                {
+                ID2=(CommonTree *)[self match:input TokenType:ID Follow:FOLLOW_ID_in_poly148]; 
+
+
+                // TEMPLATE REWRITE
+                // 13:12: -> {%{$ID.text}}
+                {
+                    retval.st = [ST newST:ID2!=nil?[ID2.text]:nil];
+                }
+
+
+                }
+                break;
+
+        }
+        // token+rule list labels
+
+    }
+    @catch (RecognitionException *re) {
+        [self reportError:re];
+        [self recover:input Exception:re];
+    }
+    @finally {
+    }
+    return retval;
+}
+/* $ANTLR end poly */
+
+@end /* end of PolyPrinter implementation line 692 */
+
+
+/* End of code
+ * =============================================================================
+ */
diff --git a/runtime/ObjC/Framework/examples/polydiff/PolyPrinter.tokens b/runtime/ObjC/Framework/examples/polydiff/PolyPrinter.tokens
new file mode 100644
index 0000000..6b157bd
--- /dev/null
+++ b/runtime/ObjC/Framework/examples/polydiff/PolyPrinter.tokens
@@ -0,0 +1,8 @@
+T__8=8
+T__9=9
+MULT=4
+INT=5
+ID=6
+WS=7
+'+'=8
+'^'=9
diff --git a/runtime/ObjC/Framework/examples/polydiff/Simplifier.g b/runtime/ObjC/Framework/examples/polydiff/Simplifier.g
new file mode 100644
index 0000000..e927e90
--- /dev/null
+++ b/runtime/ObjC/Framework/examples/polydiff/Simplifier.g
@@ -0,0 +1,37 @@
+tree grammar Simplifier;
+options {
+	tokenVocab=Poly;
+    language=ObjC;
+	ASTLabelType=CommonTree;
+	output=AST;
+	backtrack=true;
+//	rewrite=true; // works either in rewrite or normal mode
+}
+
+/** Match some common patterns that we can reduce via identity
+ *  definitions.  Since this is only run once, it will not be
+ *  perfect.  We'd need to run the tree into this until nothing
+ *  changed to make it correct.
+ */
+poly:	^('+' a=INT b=INT)	-> INT[[NSString stringWithFormat:@"\%d", ($a.int+$b.int)\]]
+
+	|	^('+' ^('+' a=INT p=poly) b=INT)
+							-> ^('+' $p INT[[NSString stringWithFormat:@"\%d", ($a.int+$b.int)\]])
+	
+	|	^('+' ^('+' p=poly a=INT) b=INT)
+							-> ^('+' $p INT[[NSString stringWithFormat:@"\%d", ($a.int+$b.int)\]])
+	
+	|	^('+' p=poly q=poly)-> { [[$p.tree toStringTree] isEqualToString:@"0"] }? $q
+							-> { [[$q.tree toStringTree] isEqualToString:@"0"] }? $p
+							-> ^('+' $p $q)
+
+	|	^(MULT INT poly)	-> {$INT.int==1}? poly
+							-> ^(MULT INT poly)
+
+	|	^('^' ID e=INT)		-> {$e.int==1}? ID
+							-> {$e.int==0}? INT[@"1"]
+							-> ^('^' ID INT)
+
+	|	INT
+	|	ID
+	;
diff --git a/runtime/ObjC/Framework/examples/polydiff/Simplifier.h b/runtime/ObjC/Framework/examples/polydiff/Simplifier.h
new file mode 100644
index 0000000..b3fc9df
--- /dev/null
+++ b/runtime/ObjC/Framework/examples/polydiff/Simplifier.h
@@ -0,0 +1,203 @@
+// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Simplifier.g 2012-02-16 18:11:30
+
+/* =============================================================================
+ * Standard antlr OBJC runtime definitions
+ */
+#import <Foundation/Foundation.h>
+#import <ANTLR/ANTLR.h>
+/* End of standard antlr3 runtime definitions
+ * =============================================================================
+ */
+
+/* treeParserHeaderFile */
+#ifndef ANTLR3TokenTypeAlreadyDefined
+#define ANTLR3TokenTypeAlreadyDefined
+typedef enum {
+    ANTLR_EOF = -1,
+    INVALID,
+    EOR,
+    DOWN,
+    UP,
+    MIN
+} ANTLR3TokenType;
+#endif
+
+#pragma mark Tokens
+#ifdef EOF
+#undef EOF
+#endif
+#define EOF -1
+#define T__8 8
+#define T__9 9
+#define ID 4
+#define INT 5
+#define MULT 6
+#define WS 7
+#pragma mark Dynamic Global Scopes globalAttributeScopeInterface
+#pragma mark Dynamic Rule Scopes ruleAttributeScopeInterface
+#pragma mark Rule Return Scopes returnScopeInterface
+/* returnScopeInterface Simplifier_poly_return */
+@interface Simplifier_poly_return : TreeRuleReturnScope { /* returnScopeInterface line 1838 */
+/* ASTTreeParser returnScopeInterface.memVars */
+CommonTree *tree; /* ObjC start of memVars() */
+
+}
+/* start property declarations */
+/* AST returnScopeInterface.properties */
+@property (retain, getter=getTree, setter=setTree:) CommonTree *tree;
+
+/* start of method declarations */
+
++ (Simplifier_poly_return *)newSimplifier_poly_return;
+/* this is start of set and get methods */
+/* ASTTreeParser returnScopeInterface.methodsDecl */
+- (CommonTree *)getTree;
+- (void) setTree:(CommonTree *)aTree;
+  /* methodsDecl */
+
+@end /* end of returnScopeInterface interface */
+
+
+/* returnScopeInterface Simplifier_synpred1_Simplifier_return */
+@interface Simplifier_synpred1_Simplifier_return : TreeRuleReturnScope { /* returnScopeInterface line 1838 */
+/* ASTTreeParser returnScopeInterface.memVars */
+CommonTree *tree; /* ObjC start of memVars() */
+
+}
+/* start property declarations */
+/* AST returnScopeInterface.properties */
+@property (retain, getter=getTree, setter=setTree:) CommonTree *tree;
+
+/* start of method declarations */
+
++ (Simplifier_synpred1_Simplifier_return *)newSimplifier_synpred1_Simplifier_return;
+/* this is start of set and get methods */
+/* ASTTreeParser returnScopeInterface.methodsDecl */
+- (CommonTree *)getTree;
+- (void) setTree:(CommonTree *)aTree;
+  /* methodsDecl */
+
+@end /* end of returnScopeInterface interface */
+
+
+/* returnScopeInterface Simplifier_synpred2_Simplifier_return */
+@interface Simplifier_synpred2_Simplifier_return : TreeRuleReturnScope { /* returnScopeInterface line 1838 */
+/* ASTTreeParser returnScopeInterface.memVars */
+CommonTree *tree; /* ObjC start of memVars() */
+
+}
+/* start property declarations */
+/* AST returnScopeInterface.properties */
+@property (retain, getter=getTree, setter=setTree:) CommonTree *tree;
+
+/* start of method declarations */
+
++ (Simplifier_synpred2_Simplifier_return *)newSimplifier_synpred2_Simplifier_return;
+/* this is start of set and get methods */
+/* ASTTreeParser returnScopeInterface.methodsDecl */
+- (CommonTree *)getTree;
+- (void) setTree:(CommonTree *)aTree;
+  /* methodsDecl */
+
+@end /* end of returnScopeInterface interface */
+
+
+/* returnScopeInterface Simplifier_synpred3_Simplifier_return */
+@interface Simplifier_synpred3_Simplifier_return : TreeRuleReturnScope { /* returnScopeInterface line 1838 */
+/* ASTTreeParser returnScopeInterface.memVars */
+CommonTree *tree; /* ObjC start of memVars() */
+
+}
+/* start property declarations */
+/* AST returnScopeInterface.properties */
+@property (retain, getter=getTree, setter=setTree:) CommonTree *tree;
+
+/* start of method declarations */
+
++ (Simplifier_synpred3_Simplifier_return *)newSimplifier_synpred3_Simplifier_return;
+/* this is start of set and get methods */
+/* ASTTreeParser returnScopeInterface.methodsDecl */
+- (CommonTree *)getTree;
+- (void) setTree:(CommonTree *)aTree;
+  /* methodsDecl */
+
+@end /* end of returnScopeInterface interface */
+
+
+/* returnScopeInterface Simplifier_synpred4_Simplifier_return */
+@interface Simplifier_synpred4_Simplifier_return : TreeRuleReturnScope { /* returnScopeInterface line 1838 */
+/* ASTTreeParser returnScopeInterface.memVars */
+CommonTree *tree; /* ObjC start of memVars() */
+
+}
+/* start property declarations */
+/* AST returnScopeInterface.properties */
+@property (retain, getter=getTree, setter=setTree:) CommonTree *tree;
+
+/* start of method declarations */
+
++ (Simplifier_synpred4_Simplifier_return *)newSimplifier_synpred4_Simplifier_return;
+/* this is start of set and get methods */
+/* ASTTreeParser returnScopeInterface.methodsDecl */
+- (CommonTree *)getTree;
+- (void) setTree:(CommonTree *)aTree;
+  /* methodsDecl */
+
+@end /* end of returnScopeInterface interface */
+
+
+
+/* Interface grammar class */
+@interface Simplifier  : TreeParser { /* line 572 */
+#pragma mark Dynamic Rule Scopes ruleAttributeScopeDecl
+#pragma mark Dynamic Global Rule Scopes globalAttributeScopeMemVar
+
+
+/* ObjC start of actions.(actionScope).memVars */
+/* ObjC end of actions.(actionScope).memVars */
+/* ObjC start of memVars */
+/* AST parserHeaderFile.memVars */
+NSInteger ruleLevel;
+NSArray *ruleNames;
+  /* AST super.memVars */
+/* AST parserMemVars */
+id<TreeAdaptor> treeAdaptor;   /* AST parserMemVars */
+/* ObjC end of memVars */
+
+SEL synpred2_SimplifierSelector;
+SEL synpred1_SimplifierSelector;
+SEL synpred4_SimplifierSelector;
+SEL synpred3_SimplifierSelector;
+ }
+
+/* ObjC start of actions.(actionScope).properties */
+/* ObjC end of actions.(actionScope).properties */
+/* ObjC start of properties */
+/* AST parserHeaderFile.properties */
+  /* AST super.properties */
+/* AST parserProperties */
+@property (retain, getter=getTreeAdaptor, setter=setTreeAdaptor:) id<TreeAdaptor> treeAdaptor;   /* AST parserproperties */
+/* ObjC end of properties */
+
++ (void) initialize;
++ (id) newSimplifier:(id<TreeNodeStream>)aStream;
+/* ObjC start of actions.(actionScope).methodsDecl */
+/* ObjC end of actions.(actionScope).methodsDecl */
+
+/* ObjC start of methodsDecl */
+/* AST parserHeaderFile.methodsDecl */
+  /* AST super.methodsDecl */
+/* AST parserMethodsDecl */
+- (id<TreeAdaptor>) getTreeAdaptor;
+- (void) setTreeAdaptor:(id<TreeAdaptor>)theTreeAdaptor;   /* AST parsermethodsDecl */
+/* ObjC end of methodsDecl */
+
+- (Simplifier_poly_return *)poly; 
+- (void)synpred1_Simplifier_fragment; 
+- (void)synpred2_Simplifier_fragment; 
+- (void)synpred3_Simplifier_fragment; 
+- (void)synpred4_Simplifier_fragment; 
+
+
+@end /* end of Simplifier interface */
+
diff --git a/runtime/ObjC/Framework/examples/polydiff/Simplifier.m b/runtime/ObjC/Framework/examples/polydiff/Simplifier.m
new file mode 100644
index 0000000..9474c94
--- /dev/null
+++ b/runtime/ObjC/Framework/examples/polydiff/Simplifier.m
@@ -0,0 +1,1397 @@
+/** \file
+ *  This OBJC source file was generated by $ANTLR version 3.4
+ *
+ *     -  From the grammar source file : /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Simplifier.g
+ *     -                            On : 2012-02-16 18:11:30
+ *     -           for the tree parser : SimplifierTreeParser
+ *
+ * Editing it, at least manually, is not wise.
+ *
+ * ObjC language generator and runtime by Alan Condit, acondit|hereisanat|ipns|dotgoeshere|com.
+ *
+ *
+*/
+// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Simplifier.g 2012-02-16 18:11:30
+
+
+/* -----------------------------------------
+ * Include the ANTLR3 generated header file.
+ */
+#import "Simplifier.h"
+/* ----------------------------------------- */
+
+
+/* ============================================================================= */
+/* =============================================================================
+ * Start of recognizer
+ */
+
+#pragma mark Bitsets
+static ANTLRBitSet *FOLLOW_8_in_poly52;
+static const unsigned long long FOLLOW_8_in_poly52_data[] = { 0x0000000000000004LL};
+static ANTLRBitSet *FOLLOW_INT_in_poly56;
+static const unsigned long long FOLLOW_INT_in_poly56_data[] = { 0x0000000000000020LL};
+static ANTLRBitSet *FOLLOW_INT_in_poly60;
+static const unsigned long long FOLLOW_INT_in_poly60_data[] = { 0x0000000000000008LL};
+static ANTLRBitSet *FOLLOW_8_in_poly73;
+static const unsigned long long FOLLOW_8_in_poly73_data[] = { 0x0000000000000004LL};
+static ANTLRBitSet *FOLLOW_8_in_poly76;
+static const unsigned long long FOLLOW_8_in_poly76_data[] = { 0x0000000000000004LL};
+static ANTLRBitSet *FOLLOW_INT_in_poly80;
+static const unsigned long long FOLLOW_INT_in_poly80_data[] = { 0x0000000000000370LL};
+static ANTLRBitSet *FOLLOW_poly_in_poly84;
+static const unsigned long long FOLLOW_poly_in_poly84_data[] = { 0x0000000000000008LL};
+static ANTLRBitSet *FOLLOW_INT_in_poly89;
+static const unsigned long long FOLLOW_INT_in_poly89_data[] = { 0x0000000000000008LL};
+static ANTLRBitSet *FOLLOW_8_in_poly117;
+static const unsigned long long FOLLOW_8_in_poly117_data[] = { 0x0000000000000004LL};
+static ANTLRBitSet *FOLLOW_8_in_poly120;
+static const unsigned long long FOLLOW_8_in_poly120_data[] = { 0x0000000000000004LL};
+static ANTLRBitSet *FOLLOW_poly_in_poly124;
+static const unsigned long long FOLLOW_poly_in_poly124_data[] = { 0x0000000000000020LL};
+static ANTLRBitSet *FOLLOW_INT_in_poly128;
+static const unsigned long long FOLLOW_INT_in_poly128_data[] = { 0x0000000000000008LL};
+static ANTLRBitSet *FOLLOW_INT_in_poly133;
+static const unsigned long long FOLLOW_INT_in_poly133_data[] = { 0x0000000000000008LL};
+static ANTLRBitSet *FOLLOW_8_in_poly161;
+static const unsigned long long FOLLOW_8_in_poly161_data[] = { 0x0000000000000004LL};
+static ANTLRBitSet *FOLLOW_poly_in_poly165;
+static const unsigned long long FOLLOW_poly_in_poly165_data[] = { 0x0000000000000370LL};
+static ANTLRBitSet *FOLLOW_poly_in_poly169;
+static const unsigned long long FOLLOW_poly_in_poly169_data[] = { 0x0000000000000008LL};
+static ANTLRBitSet *FOLLOW_MULT_in_poly216;
+static const unsigned long long FOLLOW_MULT_in_poly216_data[] = { 0x0000000000000004LL};
+static ANTLRBitSet *FOLLOW_INT_in_poly218;
+static const unsigned long long FOLLOW_INT_in_poly218_data[] = { 0x0000000000000370LL};
+static ANTLRBitSet *FOLLOW_poly_in_poly220;
+static const unsigned long long FOLLOW_poly_in_poly220_data[] = { 0x0000000000000008LL};
+static ANTLRBitSet *FOLLOW_9_in_poly251;
+static const unsigned long long FOLLOW_9_in_poly251_data[] = { 0x0000000000000004LL};
+static ANTLRBitSet *FOLLOW_ID_in_poly253;
+static const unsigned long long FOLLOW_ID_in_poly253_data[] = { 0x0000000000000020LL};
+static ANTLRBitSet *FOLLOW_INT_in_poly257;
+static const unsigned long long FOLLOW_INT_in_poly257_data[] = { 0x0000000000000008LL};
+static ANTLRBitSet *FOLLOW_INT_in_poly302;
+static const unsigned long long FOLLOW_INT_in_poly302_data[] = { 0x0000000000000002LL};
+static ANTLRBitSet *FOLLOW_ID_in_poly307;
+static const unsigned long long FOLLOW_ID_in_poly307_data[] = { 0x0000000000000002LL};
+static ANTLRBitSet *FOLLOW_8_in_synpred1_Simplifier52;
+static const unsigned long long FOLLOW_8_in_synpred1_Simplifier52_data[] = { 0x0000000000000004LL};
+static ANTLRBitSet *FOLLOW_INT_in_synpred1_Simplifier56;
+static const unsigned long long FOLLOW_INT_in_synpred1_Simplifier56_data[] = { 0x0000000000000020LL};
+static ANTLRBitSet *FOLLOW_INT_in_synpred1_Simplifier60;
+static const unsigned long long FOLLOW_INT_in_synpred1_Simplifier60_data[] = { 0x0000000000000008LL};
+static ANTLRBitSet *FOLLOW_8_in_synpred2_Simplifier73;
+static const unsigned long long FOLLOW_8_in_synpred2_Simplifier73_data[] = { 0x0000000000000004LL};
+static ANTLRBitSet *FOLLOW_8_in_synpred2_Simplifier76;
+static const unsigned long long FOLLOW_8_in_synpred2_Simplifier76_data[] = { 0x0000000000000004LL};
+static ANTLRBitSet *FOLLOW_INT_in_synpred2_Simplifier80;
+static const unsigned long long FOLLOW_INT_in_synpred2_Simplifier80_data[] = { 0x0000000000000370LL};
+static ANTLRBitSet *FOLLOW_poly_in_synpred2_Simplifier84;
+static const unsigned long long FOLLOW_poly_in_synpred2_Simplifier84_data[] = { 0x0000000000000008LL};
+static ANTLRBitSet *FOLLOW_INT_in_synpred2_Simplifier89;
+static const unsigned long long FOLLOW_INT_in_synpred2_Simplifier89_data[] = { 0x0000000000000008LL};
+static ANTLRBitSet *FOLLOW_8_in_synpred3_Simplifier117;
+static const unsigned long long FOLLOW_8_in_synpred3_Simplifier117_data[] = { 0x0000000000000004LL};
+static ANTLRBitSet *FOLLOW_8_in_synpred3_Simplifier120;
+static const unsigned long long FOLLOW_8_in_synpred3_Simplifier120_data[] = { 0x0000000000000004LL};
+static ANTLRBitSet *FOLLOW_poly_in_synpred3_Simplifier124;
+static const unsigned long long FOLLOW_poly_in_synpred3_Simplifier124_data[] = { 0x0000000000000020LL};
+static ANTLRBitSet *FOLLOW_INT_in_synpred3_Simplifier128;
+static const unsigned long long FOLLOW_INT_in_synpred3_Simplifier128_data[] = { 0x0000000000000008LL};
+static ANTLRBitSet *FOLLOW_INT_in_synpred3_Simplifier133;
+static const unsigned long long FOLLOW_INT_in_synpred3_Simplifier133_data[] = { 0x0000000000000008LL};
+static ANTLRBitSet *FOLLOW_8_in_synpred4_Simplifier161;
+static const unsigned long long FOLLOW_8_in_synpred4_Simplifier161_data[] = { 0x0000000000000004LL};
+static ANTLRBitSet *FOLLOW_poly_in_synpred4_Simplifier165;
+static const unsigned long long FOLLOW_poly_in_synpred4_Simplifier165_data[] = { 0x0000000000000370LL};
+static ANTLRBitSet *FOLLOW_poly_in_synpred4_Simplifier169;
+static const unsigned long long FOLLOW_poly_in_synpred4_Simplifier169_data[] = { 0x0000000000000008LL};
+
+
+#pragma mark Dynamic Global globalAttributeScopeImplementation
+
+#pragma mark Dynamic Rule Scopes ruleAttributeScopeImplementation
+
+#pragma mark Rule Return Scopes returnScopeImplementation
+@implementation Simplifier_poly_return /* returnScopeImplementation */
+/* AST returnScope.synthesize */
+@synthesize tree; /* start of synthesize -- OBJC-Line 1837 */
++ (Simplifier_poly_return *)newSimplifier_poly_return
+{
+return [[[Simplifier_poly_return alloc] init] retain];
+}
+
+- (id) init
+{
+self = [super init];
+return self;
+}
+
+/* AST returnScope.methods */
+- (CommonTree *)getTree
+{
+    return tree;
+}
+
+- (void) setTree:(CommonTree *)aTree
+{
+    if (tree != aTree) {
+        if (tree != nil) [tree release];
+        if (aTree != nil) [aTree retain];
+        tree = aTree;
+    }
+}
+
+- (void) dealloc
+{
+    self.tree = nil;
+    [super dealloc];
+}
+
+
+@end /* end of returnScope implementation */
+
+@implementation Simplifier_synpred1_Simplifier_return /* returnScopeImplementation */
+/* AST returnScope.synthesize */
+@synthesize tree; /* start of synthesize -- OBJC-Line 1837 */
++ (Simplifier_synpred1_Simplifier_return *)newSimplifier_synpred1_Simplifier_return
+{
+return [[[Simplifier_synpred1_Simplifier_return alloc] init] retain];
+}
+
+- (id) init
+{
+self = [super init];
+return self;
+}
+
+/* AST returnScope.methods */
+- (CommonTree *)getTree
+{
+    return tree;
+}
+
+- (void) setTree:(CommonTree *)aTree
+{
+    if (tree != aTree) {
+        if (tree != nil) [tree release];
+        if (aTree != nil) [aTree retain];
+        tree = aTree;
+    }
+}
+
+- (void) dealloc
+{
+    self.tree = nil;
+    [super dealloc];
+}
+
+
+@end /* end of returnScope implementation */
+
+@implementation Simplifier_synpred2_Simplifier_return /* returnScopeImplementation */
+/* AST returnScope.synthesize */
+@synthesize tree; /* start of synthesize -- OBJC-Line 1837 */
++ (Simplifier_synpred2_Simplifier_return *)newSimplifier_synpred2_Simplifier_return
+{
+return [[[Simplifier_synpred2_Simplifier_return alloc] init] retain];
+}
+
+- (id) init
+{
+self = [super init];
+return self;
+}
+
+/* AST returnScope.methods */
+- (CommonTree *)getTree
+{
+    return tree;
+}
+
+- (void) setTree:(CommonTree *)aTree
+{
+    if (tree != aTree) {
+        if (tree != nil) [tree release];
+        if (aTree != nil) [aTree retain];
+        tree = aTree;
+    }
+}
+
+- (void) dealloc
+{
+    self.tree = nil;
+    [super dealloc];
+}
+
+
+@end /* end of returnScope implementation */
+
+@implementation Simplifier_synpred3_Simplifier_return /* returnScopeImplementation */
+/* AST returnScope.synthesize */
+@synthesize tree; /* start of synthesize -- OBJC-Line 1837 */
++ (Simplifier_synpred3_Simplifier_return *)newSimplifier_synpred3_Simplifier_return
+{
+return [[[Simplifier_synpred3_Simplifier_return alloc] init] retain];
+}
+
+- (id) init
+{
+self = [super init];
+return self;
+}
+
+/* AST returnScope.methods */
+- (CommonTree *)getTree
+{
+    return tree;
+}
+
+- (void) setTree:(CommonTree *)aTree
+{
+    if (tree != aTree) {
+        if (tree != nil) [tree release];
+        if (aTree != nil) [aTree retain];
+        tree = aTree;
+    }
+}
+
+- (void) dealloc
+{
+    self.tree = nil;
+    [super dealloc];
+}
+
+
+@end /* end of returnScope implementation */
+
+@implementation Simplifier_synpred4_Simplifier_return /* returnScopeImplementation */
+/* AST returnScope.synthesize */
+@synthesize tree; /* start of synthesize -- OBJC-Line 1837 */
++ (Simplifier_synpred4_Simplifier_return *)newSimplifier_synpred4_Simplifier_return
+{
+return [[[Simplifier_synpred4_Simplifier_return alloc] init] retain];
+}
+
+- (id) init
+{
+self = [super init];
+return self;
+}
+
+/* AST returnScope.methods */
+- (CommonTree *)getTree
+{
+    return tree;
+}
+
+- (void) setTree:(CommonTree *)aTree
+{
+    if (tree != aTree) {
+        if (tree != nil) [tree release];
+        if (aTree != nil) [aTree retain];
+        tree = aTree;
+    }
+}
+
+- (void) dealloc
+{
+    self.tree = nil;
+    [super dealloc];
+}
+
+
+@end /* end of returnScope implementation */
+
+
+
+@implementation Simplifier  // line 637
+
+/* ObjC start of ruleAttributeScope */
+#pragma mark Dynamic Rule Scopes ruleAttributeScope
+/* ObjC end of ruleAttributeScope */
+#pragma mark global Attribute Scopes globalAttributeScope
+/* ObjC start globalAttributeScope */
+/* ObjC end globalAttributeScope */
+/* ObjC start actions.(actionScope).synthesize */
+/* ObjC start synthesize() */
+/* AST genericParser.synthesize */
+/* AST parserProperties */
+@synthesize treeAdaptor;
+
++ (void) initialize
+{
+    #pragma mark Bitsets
+    FOLLOW_8_in_poly52 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_8_in_poly52_data Count:(NSUInteger)1] retain];
+    FOLLOW_INT_in_poly56 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_INT_in_poly56_data Count:(NSUInteger)1] retain];
+    FOLLOW_INT_in_poly60 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_INT_in_poly60_data Count:(NSUInteger)1] retain];
+    FOLLOW_8_in_poly73 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_8_in_poly73_data Count:(NSUInteger)1] retain];
+    FOLLOW_8_in_poly76 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_8_in_poly76_data Count:(NSUInteger)1] retain];
+    FOLLOW_INT_in_poly80 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_INT_in_poly80_data Count:(NSUInteger)1] retain];
+    FOLLOW_poly_in_poly84 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_poly_in_poly84_data Count:(NSUInteger)1] retain];
+    FOLLOW_INT_in_poly89 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_INT_in_poly89_data Count:(NSUInteger)1] retain];
+    FOLLOW_8_in_poly117 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_8_in_poly117_data Count:(NSUInteger)1] retain];
+    FOLLOW_8_in_poly120 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_8_in_poly120_data Count:(NSUInteger)1] retain];
+    FOLLOW_poly_in_poly124 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_poly_in_poly124_data Count:(NSUInteger)1] retain];
+    FOLLOW_INT_in_poly128 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_INT_in_poly128_data Count:(NSUInteger)1] retain];
+    FOLLOW_INT_in_poly133 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_INT_in_poly133_data Count:(NSUInteger)1] retain];
+    FOLLOW_8_in_poly161 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_8_in_poly161_data Count:(NSUInteger)1] retain];
+    FOLLOW_poly_in_poly165 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_poly_in_poly165_data Count:(NSUInteger)1] retain];
+    FOLLOW_poly_in_poly169 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_poly_in_poly169_data Count:(NSUInteger)1] retain];
+    FOLLOW_MULT_in_poly216 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_MULT_in_poly216_data Count:(NSUInteger)1] retain];
+    FOLLOW_INT_in_poly218 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_INT_in_poly218_data Count:(NSUInteger)1] retain];
+    FOLLOW_poly_in_poly220 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_poly_in_poly220_data Count:(NSUInteger)1] retain];
+    FOLLOW_9_in_poly251 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_9_in_poly251_data Count:(NSUInteger)1] retain];
+    FOLLOW_ID_in_poly253 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_ID_in_poly253_data Count:(NSUInteger)1] retain];
+    FOLLOW_INT_in_poly257 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_INT_in_poly257_data Count:(NSUInteger)1] retain];
+    FOLLOW_INT_in_poly302 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_INT_in_poly302_data Count:(NSUInteger)1] retain];
+    FOLLOW_ID_in_poly307 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_ID_in_poly307_data Count:(NSUInteger)1] retain];
+    FOLLOW_8_in_synpred1_Simplifier52 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_8_in_synpred1_Simplifier52_data Count:(NSUInteger)1] retain];
+    FOLLOW_INT_in_synpred1_Simplifier56 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_INT_in_synpred1_Simplifier56_data Count:(NSUInteger)1] retain];
+    FOLLOW_INT_in_synpred1_Simplifier60 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_INT_in_synpred1_Simplifier60_data Count:(NSUInteger)1] retain];
+    FOLLOW_8_in_synpred2_Simplifier73 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_8_in_synpred2_Simplifier73_data Count:(NSUInteger)1] retain];
+    FOLLOW_8_in_synpred2_Simplifier76 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_8_in_synpred2_Simplifier76_data Count:(NSUInteger)1] retain];
+    FOLLOW_INT_in_synpred2_Simplifier80 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_INT_in_synpred2_Simplifier80_data Count:(NSUInteger)1] retain];
+    FOLLOW_poly_in_synpred2_Simplifier84 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_poly_in_synpred2_Simplifier84_data Count:(NSUInteger)1] retain];
+    FOLLOW_INT_in_synpred2_Simplifier89 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_INT_in_synpred2_Simplifier89_data Count:(NSUInteger)1] retain];
+    FOLLOW_8_in_synpred3_Simplifier117 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_8_in_synpred3_Simplifier117_data Count:(NSUInteger)1] retain];
+    FOLLOW_8_in_synpred3_Simplifier120 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_8_in_synpred3_Simplifier120_data Count:(NSUInteger)1] retain];
+    FOLLOW_poly_in_synpred3_Simplifier124 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_poly_in_synpred3_Simplifier124_data Count:(NSUInteger)1] retain];
+    FOLLOW_INT_in_synpred3_Simplifier128 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_INT_in_synpred3_Simplifier128_data Count:(NSUInteger)1] retain];
+    FOLLOW_INT_in_synpred3_Simplifier133 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_INT_in_synpred3_Simplifier133_data Count:(NSUInteger)1] retain];
+    FOLLOW_8_in_synpred4_Simplifier161 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_8_in_synpred4_Simplifier161_data Count:(NSUInteger)1] retain];
+    FOLLOW_poly_in_synpred4_Simplifier165 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_poly_in_synpred4_Simplifier165_data Count:(NSUInteger)1] retain];
+    FOLLOW_poly_in_synpred4_Simplifier169 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_poly_in_synpred4_Simplifier169_data Count:(NSUInteger)1] retain];
+
+    [BaseRecognizer setTokenNames:[[AMutableArray arrayWithObjects:@"<invalid>", @"<EOR>", @"<DOWN>", @"<UP>", 
+ @"ID", @"INT", @"MULT", @"WS", @"'+'", @"'^'", nil] retain]];
+    [BaseRecognizer setGrammarFileName:@"/Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Simplifier.g"];
+    SEL synpred2_SimplifierSelector = @selector(synpred2_Simplifier_fragment);
+    SEL synpred1_SimplifierSelector = @selector(synpred1_Simplifier_fragment);
+    SEL synpred4_SimplifierSelector = @selector(synpred4_Simplifier_fragment);
+    SEL synpred3_SimplifierSelector = @selector(synpred3_Simplifier_fragment);
+
+}
+
++ (Simplifier *)newSimplifier:(id<TreeNodeStream>)aStream
+{
+    return [[Simplifier alloc] initWithStream:aStream];
+}
+
+- (id) initWithStream:(id<TreeNodeStream>)aStream
+{
+    self = [super initWithStream:aStream State:[[RecognizerSharedState newRecognizerSharedStateWithRuleLen:8+1] retain]];
+    if ( self != nil ) {
+        /* start of actions-actionScope-init */
+        /* start of init */
+        /* AST genericParser.init */
+        [self setTreeAdaptor:[[CommonTreeAdaptor newTreeAdaptor] retain]];
+    }
+    return self;
+}
+
+- (void) dealloc
+{
+    /* AST genericParser.dealloc */
+    [self setTreeAdaptor:nil];
+
+    [super dealloc];
+}
+
+/* ObjC start actions.(actionScope).methods */
+/* ObjC end actions.(actionScope).methods */
+/* ObjC start methods() */
+/* AST genericParser.methods */
+/* AST parserMethods */
+- (id<TreeAdaptor>) getTreeAdaptor
+{
+	return treeAdaptor;
+}
+
+- (void) setTreeAdaptor:(id<TreeAdaptor>)aTreeAdaptor
+{
+	if (aTreeAdaptor != treeAdaptor) {
+		treeAdaptor = aTreeAdaptor;
+	}
+}
+/* ObjC end methods() */
+/* ObjC start rules */
+/*
+ * $ANTLR start poly
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Simplifier.g:16:1: poly : ( ^( '+' a= INT b= INT ) -> INT[[NSString stringWithFormat:@\"\\%d\", ($a.int+$b.int)]] | ^( '+' ^( '+' a= INT p= poly ) b= INT ) -> ^( '+' $p INT[[NSString stringWithFormat:@\"\\%d\", ($a.int+$b.int)]] ) | ^( '+' ^( '+' p= poly a= INT ) b= INT ) -> ^( '+' $p INT[[NSString stringWithFormat:@\"\\%d\", ($a.int+$b.int)]] ) | ^( '+' p= poly q= poly ) -> { [[$p.tree toStringTree] isEqualToString:@\"0\"] }? $q -> { [[$q.tree toStringTree] isEqualToString:@\"0\"] }? $p -> ^( '+' $p $q) | ^( MULT INT poly ) -> {$INT.int==1}? poly -> ^( MULT INT poly ) | ^( '^' ID e= INT ) -> {$e.int==1}? ID -> {$e.int==0}? INT[@\"1\"] -> ^( '^' ID INT ) | INT | ID );
+ */
+- (Simplifier_poly_return *) poly
+{
+    /* ruleScopeSetUp */
+
+    /* ASTTreeParser ruleDeclarations */
+    /* AST ruleDeclarations */
+    /* ruleDeclarations */
+    Simplifier_poly_return * retval = [Simplifier_poly_return newSimplifier_poly_return];
+    [retval setStart:[input LT:1]];
+
+
+    CommonTree *root_0 = nil;
+
+    CommonTree *_first_0 = nil;
+    CommonTree *_last = nil;
+
+    @try {
+        /* AST ruleLabelDefs */
+        /* ruleLabelDefs entry */
+        CommonTree *a = nil;
+        CommonTree *b = nil;
+        CommonTree *e = nil;
+        CommonTree *char_literal1 = nil;
+        CommonTree *char_literal2 = nil;
+        CommonTree *char_literal3 = nil;
+        CommonTree *char_literal4 = nil;
+        CommonTree *char_literal5 = nil;
+        CommonTree *char_literal6 = nil;
+        CommonTree *MULT7 = nil;
+        CommonTree *INT8 = nil;
+        CommonTree *char_literal10 = nil;
+        CommonTree *ID11 = nil;
+        CommonTree *INT12 = nil;
+        CommonTree *ID13 = nil;Simplifier_poly_return * p = nil ;
+
+        Simplifier_poly_return * q = nil ;
+
+        Simplifier_poly_return * poly9 = nil ;
+
+
+        CommonTree *a_tree=nil;
+        CommonTree *b_tree=nil;
+        CommonTree *e_tree=nil;
+        CommonTree *char_literal1_tree=nil;
+        CommonTree *char_literal2_tree=nil;
+        CommonTree *char_literal3_tree=nil;
+        CommonTree *char_literal4_tree=nil;
+        CommonTree *char_literal5_tree=nil;
+        CommonTree *char_literal6_tree=nil;
+        CommonTree *MULT7_tree=nil;
+        CommonTree *INT8_tree=nil;
+        CommonTree *char_literal10_tree=nil;
+        CommonTree *ID11_tree=nil;
+        CommonTree *INT12_tree=nil;
+        CommonTree *ID13_tree=nil;
+        RewriteRuleTokenStream *stream_INT =
+            [[RewriteRuleNodeStream newRewriteRuleNodeStream:treeAdaptor
+                                                             description:@"token INT"] retain];
+        RewriteRuleTokenStream *stream_MULT =
+            [[RewriteRuleNodeStream newRewriteRuleNodeStream:treeAdaptor
+                                                             description:@"token MULT"] retain];
+        RewriteRuleTokenStream *stream_ID =
+            [[RewriteRuleNodeStream newRewriteRuleNodeStream:treeAdaptor
+                                                             description:@"token ID"] retain];
+        RewriteRuleTokenStream *stream_9 =
+            [[RewriteRuleNodeStream newRewriteRuleNodeStream:treeAdaptor
+                                                             description:@"token 9"] retain];
+        RewriteRuleTokenStream *stream_8 =
+            [[RewriteRuleNodeStream newRewriteRuleNodeStream:treeAdaptor
+                                                             description:@"token 8"] retain];
+        RewriteRuleSubtreeStream *stream_poly =
+            [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
+                                                                description:@"rule poly"] retain];
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Simplifier.g:16:5: ( ^( '+' a= INT b= INT ) -> INT[[NSString stringWithFormat:@\"\\%d\", ($a.int+$b.int)]] | ^( '+' ^( '+' a= INT p= poly ) b= INT ) -> ^( '+' $p INT[[NSString stringWithFormat:@\"\\%d\", ($a.int+$b.int)]] ) | ^( '+' ^( '+' p= poly a= INT ) b= INT ) -> ^( '+' $p INT[[NSString stringWithFormat:@\"\\%d\", ($a.int+$b.int)]] ) | ^( '+' p= poly q= poly ) -> { [[$p.tree toStringTree] isEqualToString:@\"0\"] }? $q -> { [[$q.tree toStringTree] isEqualToString:@\"0\"] }? $p -> ^( '+' $p $q) | ^( MULT INT poly ) -> {$INT.int==1}? poly -> ^( MULT INT poly ) | ^( '^' ID e= INT ) -> {$e.int==1}? ID -> {$e.int==0}? INT[@\"1\"] -> ^( '^' ID INT ) | INT | ID ) //ruleblock
+        NSInteger alt1=8;
+        unichar charLA1 = [input LA:1];
+        switch (charLA1) {
+            case 8: ;
+                {
+                NSInteger LA1_1 = [input LA:2];
+
+                if ( ([self evaluateSyntacticPredicate:@selector(synpred1_Simplifier_fragment)]) ) {
+                    alt1=1;
+                }
+                else if ( ([self evaluateSyntacticPredicate:@selector(synpred2_Simplifier_fragment)]) ) {
+                    alt1=2;
+                }
+                else if ( ([self evaluateSyntacticPredicate:@selector(synpred3_Simplifier_fragment)]) ) {
+                    alt1=3;
+                }
+                else if ( ([self evaluateSyntacticPredicate:@selector(synpred4_Simplifier_fragment)]) ) {
+                    alt1=4;
+                }
+                else {
+                    if ( state.backtracking > 0 ) { state.failed = YES; return retval; }
+
+                    NoViableAltException *nvae = [NoViableAltException newException:1 state:1 stream:input];
+                    nvae.c = LA1_1;
+                    @throw nvae;
+
+                }
+                }
+                break;
+            case MULT: ;
+                {
+                alt1=5;
+                }
+                break;
+            case 9: ;
+                {
+                alt1=6;
+                }
+                break;
+            case INT: ;
+                {
+                alt1=7;
+                }
+                break;
+            case ID: ;
+                {
+                alt1=8;
+                }
+                break;
+
+        default: ;
+            if ( state.backtracking > 0 ) { state.failed = YES; return retval; }
+
+            NoViableAltException *nvae = [NoViableAltException newException:1 state:0 stream:input];
+            nvae.c = charLA1;
+            @throw nvae;
+
+        }
+
+        switch (alt1) {
+            case 1 : ;
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Simplifier.g:16:7: ^( '+' a= INT b= INT ) // alt
+                {
+
+                /* ASTTreeParser tree */
+                _last = (CommonTree *)[input LT:1];
+                {
+                CommonTree *_save_last_1 = _last;
+                CommonTree *_first_1 = nil;
+                CommonTree *root_1 = [[[treeAdaptor class] newEmptyTree] retain];
+
+                /* ASTTreeParser tokenRefBang */
+                _last = (CommonTree *)[input LT:1];
+                char_literal1=(CommonTree *)[self match:input TokenType:8 Follow:FOLLOW_8_in_poly52]; if ( state.failed ) return retval; 
+                if ( state.backtracking == 0 ) [stream_8 addElement:char_literal1];
+
+                 
+                [self match:input TokenType:TokenTypeDOWN Follow:nil]; if ( state.failed ) return retval;
+
+                /* ASTTreeParser tokenRefBang */
+                _last = (CommonTree *)[input LT:1];
+                a=(CommonTree *)[self match:input TokenType:INT Follow:FOLLOW_INT_in_poly56]; if ( state.failed ) return retval; 
+                if ( state.backtracking == 0 ) [stream_INT addElement:a];
+
+                 
+                /* ASTTreeParser tokenRefBang */
+                _last = (CommonTree *)[input LT:1];
+                b=(CommonTree *)[self match:input TokenType:INT Follow:FOLLOW_INT_in_poly60]; if ( state.failed ) return retval; 
+                if ( state.backtracking == 0 ) [stream_INT addElement:b];
+
+                 
+                [self match:input TokenType:TokenTypeUP Follow:nil]; if ( state.failed ) return retval;
+                [treeAdaptor addChild:root_1 toTree:root_0];
+                _last = _save_last_1;
+                }
+
+                 
+                // AST REWRITE
+                // elements: INT
+                // token labels: 
+                // rule labels: retval
+                // token list labels: 
+                // rule list labels: 
+                // wildcard labels: 
+                if ( state.backtracking == 0 ) {
+
+                retval.tree = root_0;
+
+                RewriteRuleSubtreeStream *stream_retval =
+                    [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
+                        description:@"token retval" element:retval!=nil?[retval getTree]:nil] retain];
+
+                root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+
+                // 16:26: -> INT[[NSString stringWithFormat:@\"\\%d\", ($a.int+$b.int)]]
+                {
+                    [treeAdaptor addChild:
+                            [[treeAdaptor createTree:INT FromToken:[NSString stringWithFormat:@"%d", ((a!=nil?[a.text integerValue]:0)+(b!=nil?[b.text integerValue]:0))] Text:@"INT"] retain]
+                     toTree:root_0];
+
+                }
+
+
+                retval.tree = root_0;
+
+                }
+
+                }
+                break;
+            case 2 : ;
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Simplifier.g:18:4: ^( '+' ^( '+' a= INT p= poly ) b= INT ) // alt
+                {
+
+                /* ASTTreeParser tree */
+                _last = (CommonTree *)[input LT:1];
+                {
+                CommonTree *_save_last_1 = _last;
+                CommonTree *_first_1 = nil;
+                CommonTree *root_1 = [[[treeAdaptor class] newEmptyTree] retain];
+
+                /* ASTTreeParser tokenRefBang */
+                _last = (CommonTree *)[input LT:1];
+                char_literal2=(CommonTree *)[self match:input TokenType:8 Follow:FOLLOW_8_in_poly73]; if ( state.failed ) return retval; 
+                if ( state.backtracking == 0 ) [stream_8 addElement:char_literal2];
+
+                 
+                [self match:input TokenType:TokenTypeDOWN Follow:nil]; if ( state.failed ) return retval;
+
+                /* ASTTreeParser tree */
+                _last = (CommonTree *)[input LT:1];
+                {
+                CommonTree *_save_last_2 = _last;
+                CommonTree *_first_2 = nil;
+                CommonTree *root_2 = [[[treeAdaptor class] newEmptyTree] retain];
+
+                /* ASTTreeParser tokenRefBang */
+                _last = (CommonTree *)[input LT:1];
+                char_literal3=(CommonTree *)[self match:input TokenType:8 Follow:FOLLOW_8_in_poly76]; if ( state.failed ) return retval; 
+                if ( state.backtracking == 0 ) [stream_8 addElement:char_literal3];
+
+                 
+                [self match:input TokenType:TokenTypeDOWN Follow:nil]; if ( state.failed ) return retval;
+
+                /* ASTTreeParser tokenRefBang */
+                _last = (CommonTree *)[input LT:1];
+                a=(CommonTree *)[self match:input TokenType:INT Follow:FOLLOW_INT_in_poly80]; if ( state.failed ) return retval; 
+                if ( state.backtracking == 0 ) [stream_INT addElement:a];
+
+                 
+                /* ASTTreeParser ruleRefTrack */
+                _last = (CommonTree *)[input LT:1];
+                /* ruleRef */
+                [self pushFollow:FOLLOW_poly_in_poly84];
+                p = [self poly];
+
+                [self popFollow];
+                if ( state.failed ) return retval;
+
+                if ( state.backtracking == 0 ) 
+                [stream_poly addElement:[p getTree]];
+                 
+                [self match:input TokenType:TokenTypeUP Follow:nil]; if ( state.failed ) return retval;
+                [treeAdaptor addChild:root_2 toTree:root_1];
+                _last = _save_last_2;
+                }
+
+                 
+                /* ASTTreeParser tokenRefBang */
+                _last = (CommonTree *)[input LT:1];
+                b=(CommonTree *)[self match:input TokenType:INT Follow:FOLLOW_INT_in_poly89]; if ( state.failed ) return retval; 
+                if ( state.backtracking == 0 ) [stream_INT addElement:b];
+
+                 
+                [self match:input TokenType:TokenTypeUP Follow:nil]; if ( state.failed ) return retval;
+                [treeAdaptor addChild:root_1 toTree:root_0];
+                _last = _save_last_1;
+                }
+
+                 
+                // AST REWRITE
+                // elements: INT, p, 8
+                // token labels: 
+                // rule labels: retval, p
+                // token list labels: 
+                // rule list labels: 
+                // wildcard labels: 
+                if ( state.backtracking == 0 ) {
+
+                retval.tree = root_0;
+
+                RewriteRuleSubtreeStream *stream_retval =
+                    [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
+                        description:@"token retval" element:retval!=nil?[retval getTree]:nil] retain];
+                RewriteRuleSubtreeStream *stream_p =
+                    [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
+                        description:@"token p" element:p!=nil?[p getTree]:nil] retain];
+
+                root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+
+                // 19:8: -> ^( '+' $p INT[[NSString stringWithFormat:@\"\\%d\", ($a.int+$b.int)]] )
+                {
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Simplifier.g:19:11: ^( '+' $p INT[[NSString stringWithFormat:@\"\\%d\", ($a.int+$b.int)]] )
+                    {
+                        CommonTree *root_1 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+                        root_1 = (CommonTree *)[treeAdaptor becomeRoot:/* ASTTreeParser createRewriteNodeFromElement */
+                        [stream_8 nextNode]
+                         old:root_1];
+
+                        [treeAdaptor addChild:[stream_p nextTree] toTree:root_1];
+
+                        [treeAdaptor addChild:
+                                [[treeAdaptor createTree:INT FromToken:[NSString stringWithFormat:@"%d", ((a!=nil?[a.text integerValue]:0)+(b!=nil?[b.text integerValue]:0))] Text:@"INT"] retain]
+                         toTree:root_1];
+
+                        [treeAdaptor addChild:root_1 toTree:root_0];
+                    }
+
+                }
+
+
+                retval.tree = root_0;
+
+                }
+
+                }
+                break;
+            case 3 : ;
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Simplifier.g:21:4: ^( '+' ^( '+' p= poly a= INT ) b= INT ) // alt
+                {
+
+                /* ASTTreeParser tree */
+                _last = (CommonTree *)[input LT:1];
+                {
+                CommonTree *_save_last_1 = _last;
+                CommonTree *_first_1 = nil;
+                CommonTree *root_1 = [[[treeAdaptor class] newEmptyTree] retain];
+
+                /* ASTTreeParser tokenRefBang */
+                _last = (CommonTree *)[input LT:1];
+                char_literal4=(CommonTree *)[self match:input TokenType:8 Follow:FOLLOW_8_in_poly117]; if ( state.failed ) return retval; 
+                if ( state.backtracking == 0 ) [stream_8 addElement:char_literal4];
+
+                 
+                [self match:input TokenType:TokenTypeDOWN Follow:nil]; if ( state.failed ) return retval;
+
+                /* ASTTreeParser tree */
+                _last = (CommonTree *)[input LT:1];
+                {
+                CommonTree *_save_last_2 = _last;
+                CommonTree *_first_2 = nil;
+                CommonTree *root_2 = [[[treeAdaptor class] newEmptyTree] retain];
+
+                /* ASTTreeParser tokenRefBang */
+                _last = (CommonTree *)[input LT:1];
+                char_literal5=(CommonTree *)[self match:input TokenType:8 Follow:FOLLOW_8_in_poly120]; if ( state.failed ) return retval; 
+                if ( state.backtracking == 0 ) [stream_8 addElement:char_literal5];
+
+                 
+                [self match:input TokenType:TokenTypeDOWN Follow:nil]; if ( state.failed ) return retval;
+
+                /* ASTTreeParser ruleRefTrack */
+                _last = (CommonTree *)[input LT:1];
+                /* ruleRef */
+                [self pushFollow:FOLLOW_poly_in_poly124];
+                p = [self poly];
+
+                [self popFollow];
+                if ( state.failed ) return retval;
+
+                if ( state.backtracking == 0 ) 
+                [stream_poly addElement:[p getTree]];
+                 
+                /* ASTTreeParser tokenRefBang */
+                _last = (CommonTree *)[input LT:1];
+                a=(CommonTree *)[self match:input TokenType:INT Follow:FOLLOW_INT_in_poly128]; if ( state.failed ) return retval; 
+                if ( state.backtracking == 0 ) [stream_INT addElement:a];
+
+                 
+                [self match:input TokenType:TokenTypeUP Follow:nil]; if ( state.failed ) return retval;
+                [treeAdaptor addChild:root_2 toTree:root_1];
+                _last = _save_last_2;
+                }
+
+                 
+                /* ASTTreeParser tokenRefBang */
+                _last = (CommonTree *)[input LT:1];
+                b=(CommonTree *)[self match:input TokenType:INT Follow:FOLLOW_INT_in_poly133]; if ( state.failed ) return retval; 
+                if ( state.backtracking == 0 ) [stream_INT addElement:b];
+
+                 
+                [self match:input TokenType:TokenTypeUP Follow:nil]; if ( state.failed ) return retval;
+                [treeAdaptor addChild:root_1 toTree:root_0];
+                _last = _save_last_1;
+                }
+
+                 
+                // AST REWRITE
+                // elements: INT, 8, p
+                // token labels: 
+                // rule labels: retval, p
+                // token list labels: 
+                // rule list labels: 
+                // wildcard labels: 
+                if ( state.backtracking == 0 ) {
+
+                retval.tree = root_0;
+
+                RewriteRuleSubtreeStream *stream_retval =
+                    [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
+                        description:@"token retval" element:retval!=nil?[retval getTree]:nil] retain];
+                RewriteRuleSubtreeStream *stream_p =
+                    [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
+                        description:@"token p" element:p!=nil?[p getTree]:nil] retain];
+
+                root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+
+                // 22:8: -> ^( '+' $p INT[[NSString stringWithFormat:@\"\\%d\", ($a.int+$b.int)]] )
+                {
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Simplifier.g:22:11: ^( '+' $p INT[[NSString stringWithFormat:@\"\\%d\", ($a.int+$b.int)]] )
+                    {
+                        CommonTree *root_1 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+                        root_1 = (CommonTree *)[treeAdaptor becomeRoot:/* ASTTreeParser createRewriteNodeFromElement */
+                        [stream_8 nextNode]
+                         old:root_1];
+
+                        [treeAdaptor addChild:[stream_p nextTree] toTree:root_1];
+
+                        [treeAdaptor addChild:
+                                [[treeAdaptor createTree:INT FromToken:[NSString stringWithFormat:@"%d", ((a!=nil?[a.text integerValue]:0)+(b!=nil?[b.text integerValue]:0))] Text:@"INT"] retain]
+                         toTree:root_1];
+
+                        [treeAdaptor addChild:root_1 toTree:root_0];
+                    }
+
+                }
+
+
+                retval.tree = root_0;
+
+                }
+
+                }
+                break;
+            case 4 : ;
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Simplifier.g:24:4: ^( '+' p= poly q= poly ) // alt
+                {
+
+                /* ASTTreeParser tree */
+                _last = (CommonTree *)[input LT:1];
+                {
+                CommonTree *_save_last_1 = _last;
+                CommonTree *_first_1 = nil;
+                CommonTree *root_1 = [[[treeAdaptor class] newEmptyTree] retain];
+
+                /* ASTTreeParser tokenRefBang */
+                _last = (CommonTree *)[input LT:1];
+                char_literal6=(CommonTree *)[self match:input TokenType:8 Follow:FOLLOW_8_in_poly161]; if ( state.failed ) return retval; 
+                if ( state.backtracking == 0 ) [stream_8 addElement:char_literal6];
+
+                 
+                [self match:input TokenType:TokenTypeDOWN Follow:nil]; if ( state.failed ) return retval;
+
+                /* ASTTreeParser ruleRefTrack */
+                _last = (CommonTree *)[input LT:1];
+                /* ruleRef */
+                [self pushFollow:FOLLOW_poly_in_poly165];
+                p = [self poly];
+
+                [self popFollow];
+                if ( state.failed ) return retval;
+
+                if ( state.backtracking == 0 ) 
+                [stream_poly addElement:[p getTree]];
+                 
+                /* ASTTreeParser ruleRefTrack */
+                _last = (CommonTree *)[input LT:1];
+                /* ruleRef */
+                [self pushFollow:FOLLOW_poly_in_poly169];
+                q = [self poly];
+
+                [self popFollow];
+                if ( state.failed ) return retval;
+
+                if ( state.backtracking == 0 ) 
+                [stream_poly addElement:[q getTree]];
+                 
+                [self match:input TokenType:TokenTypeUP Follow:nil]; if ( state.failed ) return retval;
+                [treeAdaptor addChild:root_1 toTree:root_0];
+                _last = _save_last_1;
+                }
+
+                 
+                // AST REWRITE
+                // elements: 8, p, q, p, q
+                // token labels: 
+                // rule labels: retval, q, p
+                // token list labels: 
+                // rule list labels: 
+                // wildcard labels: 
+                if ( state.backtracking == 0 ) {
+
+                retval.tree = root_0;
+
+                RewriteRuleSubtreeStream *stream_retval =
+                    [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
+                        description:@"token retval" element:retval!=nil?[retval getTree]:nil] retain];
+                RewriteRuleSubtreeStream *stream_q =
+                    [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
+                        description:@"token q" element:q!=nil?[q getTree]:nil] retain];
+                RewriteRuleSubtreeStream *stream_p =
+                    [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
+                        description:@"token p" element:p!=nil?[p getTree]:nil] retain];
+
+                root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+
+                // 24:24: -> { [[$p.tree toStringTree] isEqualToString:@\"0\"] }? $q
+                if ( [[(p!=nil?((CommonTree *)p.tree):nil) toStringTree] isEqualToString:@"0"] ) {
+                    [treeAdaptor addChild:[stream_q nextTree] toTree:root_0];
+
+                }
+
+                else // 25:8: -> { [[$q.tree toStringTree] isEqualToString:@\"0\"] }? $p
+                if ( [[(q!=nil?((CommonTree *)q.tree):nil) toStringTree] isEqualToString:@"0"] ) {
+                    [treeAdaptor addChild:[stream_p nextTree] toTree:root_0];
+
+                }
+
+                else // 26:8: -> ^( '+' $p $q)
+                {
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Simplifier.g:26:11: ^( '+' $p $q)
+                    {
+                        CommonTree *root_1 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+                        root_1 = (CommonTree *)[treeAdaptor becomeRoot:/* ASTTreeParser createRewriteNodeFromElement */
+                        [stream_8 nextNode]
+                         old:root_1];
+
+                        [treeAdaptor addChild:[stream_p nextTree] toTree:root_1];
+
+                        [treeAdaptor addChild:[stream_q nextTree] toTree:root_1];
+
+                        [treeAdaptor addChild:root_1 toTree:root_0];
+                    }
+
+                }
+
+
+                retval.tree = root_0;
+
+                }
+
+                }
+                break;
+            case 5 : ;
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Simplifier.g:28:4: ^( MULT INT poly ) // alt
+                {
+
+                /* ASTTreeParser tree */
+                _last = (CommonTree *)[input LT:1];
+                {
+                CommonTree *_save_last_1 = _last;
+                CommonTree *_first_1 = nil;
+                CommonTree *root_1 = [[[treeAdaptor class] newEmptyTree] retain];
+
+                /* ASTTreeParser tokenRefBang */
+                _last = (CommonTree *)[input LT:1];
+                MULT7=(CommonTree *)[self match:input TokenType:MULT Follow:FOLLOW_MULT_in_poly216]; if ( state.failed ) return retval; 
+                if ( state.backtracking == 0 ) [stream_MULT addElement:MULT7];
+
+                 
+                [self match:input TokenType:TokenTypeDOWN Follow:nil]; if ( state.failed ) return retval;
+
+                /* ASTTreeParser tokenRefBang */
+                _last = (CommonTree *)[input LT:1];
+                INT8=(CommonTree *)[self match:input TokenType:INT Follow:FOLLOW_INT_in_poly218]; if ( state.failed ) return retval; 
+                if ( state.backtracking == 0 ) [stream_INT addElement:INT8];
+
+                 
+                /* ASTTreeParser ruleRefTrack */
+                _last = (CommonTree *)[input LT:1];
+                /* ruleRef */
+                [self pushFollow:FOLLOW_poly_in_poly220];
+                poly9 = [self poly];
+
+                [self popFollow];
+                if ( state.failed ) return retval;
+
+                if ( state.backtracking == 0 ) 
+                [stream_poly addElement:[poly9 getTree]];
+                 
+                [self match:input TokenType:TokenTypeUP Follow:nil]; if ( state.failed ) return retval;
+                [treeAdaptor addChild:root_1 toTree:root_0];
+                _last = _save_last_1;
+                }
+
+                 
+                // AST REWRITE
+                // elements: INT, poly, poly, MULT
+                // token labels: 
+                // rule labels: retval
+                // token list labels: 
+                // rule list labels: 
+                // wildcard labels: 
+                if ( state.backtracking == 0 ) {
+
+                retval.tree = root_0;
+
+                RewriteRuleSubtreeStream *stream_retval =
+                    [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
+                        description:@"token retval" element:retval!=nil?[retval getTree]:nil] retain];
+
+                root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+
+                // 28:21: -> {$INT.int==1}? poly
+                if ((INT8!=nil?[INT8.text integerValue]:0)==1) {
+                    [treeAdaptor addChild:[stream_poly nextTree] toTree:root_0];
+
+                }
+
+                else // 29:8: -> ^( MULT INT poly )
+                {
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Simplifier.g:29:11: ^( MULT INT poly )
+                    {
+                        CommonTree *root_1 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+                        root_1 = (CommonTree *)[treeAdaptor becomeRoot:/* ASTTreeParser createRewriteNodeFromElement */
+                        [stream_MULT nextNode]
+                         old:root_1];
+
+                         // TODO: args: 
+                        [treeAdaptor addChild:/* ASTTreeParser createRewriteNodeFromElement */
+                        [stream_INT nextNode]
+                         toTree:root_1];
+
+                        [treeAdaptor addChild:[stream_poly nextTree] toTree:root_1];
+
+                        [treeAdaptor addChild:root_1 toTree:root_0];
+                    }
+
+                }
+
+
+                retval.tree = root_0;
+
+                }
+
+                }
+                break;
+            case 6 : ;
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Simplifier.g:31:4: ^( '^' ID e= INT ) // alt
+                {
+
+                /* ASTTreeParser tree */
+                _last = (CommonTree *)[input LT:1];
+                {
+                CommonTree *_save_last_1 = _last;
+                CommonTree *_first_1 = nil;
+                CommonTree *root_1 = [[[treeAdaptor class] newEmptyTree] retain];
+
+                /* ASTTreeParser tokenRefBang */
+                _last = (CommonTree *)[input LT:1];
+                char_literal10=(CommonTree *)[self match:input TokenType:9 Follow:FOLLOW_9_in_poly251]; if ( state.failed ) return retval; 
+                if ( state.backtracking == 0 ) [stream_9 addElement:char_literal10];
+
+                 
+                [self match:input TokenType:TokenTypeDOWN Follow:nil]; if ( state.failed ) return retval;
+
+                /* ASTTreeParser tokenRefBang */
+                _last = (CommonTree *)[input LT:1];
+                ID11=(CommonTree *)[self match:input TokenType:ID Follow:FOLLOW_ID_in_poly253]; if ( state.failed ) return retval; 
+                if ( state.backtracking == 0 ) [stream_ID addElement:ID11];
+
+                 
+                /* ASTTreeParser tokenRefBang */
+                _last = (CommonTree *)[input LT:1];
+                e=(CommonTree *)[self match:input TokenType:INT Follow:FOLLOW_INT_in_poly257]; if ( state.failed ) return retval; 
+                if ( state.backtracking == 0 ) [stream_INT addElement:e];
+
+                 
+                [self match:input TokenType:TokenTypeUP Follow:nil]; if ( state.failed ) return retval;
+                [treeAdaptor addChild:root_1 toTree:root_0];
+                _last = _save_last_1;
+                }
+
+                 
+                // AST REWRITE
+                // elements: INT, ID, INT, 9, ID
+                // token labels: 
+                // rule labels: retval
+                // token list labels: 
+                // rule list labels: 
+                // wildcard labels: 
+                if ( state.backtracking == 0 ) {
+
+                retval.tree = root_0;
+
+                RewriteRuleSubtreeStream *stream_retval =
+                    [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
+                        description:@"token retval" element:retval!=nil?[retval getTree]:nil] retain];
+
+                root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+
+                // 31:21: -> {$e.int==1}? ID
+                if ((e!=nil?[e.text integerValue]:0)==1) {
+                     // TODO: args: 
+                    [treeAdaptor addChild:/* ASTTreeParser createRewriteNodeFromElement */
+                    [stream_ID nextNode]
+                     toTree:root_0];
+
+                }
+
+                else // 32:8: -> {$e.int==0}? INT[@\"1\"]
+                if ((e!=nil?[e.text integerValue]:0)==0) {
+                    [treeAdaptor addChild:
+                            [[treeAdaptor createTree:INT FromToken:@"1" Text:@"INT"] retain]
+                     toTree:root_0];
+
+                }
+
+                else // 33:8: -> ^( '^' ID INT )
+                {
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Simplifier.g:33:11: ^( '^' ID INT )
+                    {
+                        CommonTree *root_1 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+                        root_1 = (CommonTree *)[treeAdaptor becomeRoot:/* ASTTreeParser createRewriteNodeFromElement */
+                        [stream_9 nextNode]
+                         old:root_1];
+
+                         // TODO: args: 
+                        [treeAdaptor addChild:/* ASTTreeParser createRewriteNodeFromElement */
+                        [stream_ID nextNode]
+                         toTree:root_1];
+
+                         // TODO: args: 
+                        [treeAdaptor addChild:/* ASTTreeParser createRewriteNodeFromElement */
+                        [stream_INT nextNode]
+                         toTree:root_1];
+
+                        [treeAdaptor addChild:root_1 toTree:root_0];
+                    }
+
+                }
+
+
+                retval.tree = root_0;
+
+                }
+
+                }
+                break;
+            case 7 : ;
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Simplifier.g:35:4: INT // alt
+                {
+                root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+
+
+
+                /* ASTTreeParser tokenRef */
+                _last = (CommonTree *)[input LT:1];
+                INT12=(CommonTree *)[self match:input TokenType:INT Follow:FOLLOW_INT_in_poly302]; if ( state.failed ) return retval;
+                if ( state.backtracking == 0 ) {
+                    INT12_tree = (CommonTree *)[treeAdaptor dupNode:INT12];
+
+
+                    [treeAdaptor addChild:INT12_tree toTree:root_0];
+                }
+
+                 
+                /* ASTTreeParser noRewrite */
+                if ( state.backtracking == 0 ) {
+                }
+                }
+                break;
+            case 8 : ;
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Simplifier.g:36:4: ID // alt
+                {
+                root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+
+
+
+                /* ASTTreeParser tokenRef */
+                _last = (CommonTree *)[input LT:1];
+                ID13=(CommonTree *)[self match:input TokenType:ID Follow:FOLLOW_ID_in_poly307]; if ( state.failed ) return retval;
+                if ( state.backtracking == 0 ) {
+                    ID13_tree = (CommonTree *)[treeAdaptor dupNode:ID13];
+
+
+                    [treeAdaptor addChild:ID13_tree toTree:root_0];
+                }
+
+                 
+                /* ASTTreeParser noRewrite */
+                if ( state.backtracking == 0 ) {
+                }
+                }
+                break;
+
+        }
+        /* ASTTreeParser ruleCleanUp */
+        /* AST ruleCleanUp */
+        /* token+rule list labels */
+
+        [stream_INT release];
+        [stream_MULT release];
+        [stream_ID release];
+        [stream_9 release];
+        [stream_8 release];
+        [stream_poly release];
+
+        if ( state.backtracking == 0 ) {
+
+        retval.tree = (CommonTree *)[treeAdaptor rulePostProcessing:root_0];
+        }
+
+    }
+    @catch (RecognitionException *re) {
+        [self reportError:re];
+        [self recover:input Exception:re];
+    }
+
+    @finally {
+        /* ruleScopeCleanUp */
+
+    }
+    return retval;
+}
+/* $ANTLR end poly */
+// $ANTLR start synpred1_Simplifier_fragment
+- (void) synpred1_Simplifier_fragment
+{
+    /* ruleLabelDefs entry */
+    CommonTree *a = nil;
+    CommonTree *b = nil;
+
+    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Simplifier.g:16:7: ( ^( '+' a= INT b= INT ) ) // ruleBlockSingleAlt
+    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Simplifier.g:16:7: ^( '+' a= INT b= INT ) // alt
+    {
+
+
+    [self match:input TokenType:8 Follow:FOLLOW_8_in_synpred1_Simplifier52]; if ( state.failed ) return ;
+     
+        [self match:input TokenType:DOWN Follow:nil]; if ( state.failed ) return ;
+
+        a=(CommonTree *)[self match:input TokenType:INT Follow:FOLLOW_INT_in_synpred1_Simplifier56]; if ( state.failed ) return ;
+         
+        b=(CommonTree *)[self match:input TokenType:INT Follow:FOLLOW_INT_in_synpred1_Simplifier60]; if ( state.failed ) return ;
+         
+        [self match:input TokenType:UP Follow:nil]; if ( state.failed ) return ;
+
+     
+    }
+
+} // $ANTLR end synpred1_Simplifier_fragment
+// $ANTLR start synpred2_Simplifier_fragment
+- (void) synpred2_Simplifier_fragment
+{
+    /* ruleLabelDefs entry */
+    CommonTree *a = nil;
+    CommonTree *b = nil;Simplifier_poly_return * p = nil ;
+
+
+    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Simplifier.g:18:4: ( ^( '+' ^( '+' a= INT p= poly ) b= INT ) ) // ruleBlockSingleAlt
+    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Simplifier.g:18:4: ^( '+' ^( '+' a= INT p= poly ) b= INT ) // alt
+    {
+
+
+    [self match:input TokenType:8 Follow:FOLLOW_8_in_synpred2_Simplifier73]; if ( state.failed ) return ;
+     
+        [self match:input TokenType:DOWN Follow:nil]; if ( state.failed ) return ;
+
+
+        [self match:input TokenType:8 Follow:FOLLOW_8_in_synpred2_Simplifier76]; if ( state.failed ) return ;
+         
+            [self match:input TokenType:DOWN Follow:nil]; if ( state.failed ) return ;
+
+            a=(CommonTree *)[self match:input TokenType:INT Follow:FOLLOW_INT_in_synpred2_Simplifier80]; if ( state.failed ) return ;
+             
+            /* ruleRef */
+            [self pushFollow:FOLLOW_poly_in_synpred2_Simplifier84];
+            p = [self poly];
+
+            [self popFollow];
+            if ( state.failed ) return ;
+
+             
+            [self match:input TokenType:UP Follow:nil]; if ( state.failed ) return ;
+
+         
+        b=(CommonTree *)[self match:input TokenType:INT Follow:FOLLOW_INT_in_synpred2_Simplifier89]; if ( state.failed ) return ;
+         
+        [self match:input TokenType:UP Follow:nil]; if ( state.failed ) return ;
+
+     
+    }
+
+} // $ANTLR end synpred2_Simplifier_fragment
+// $ANTLR start synpred3_Simplifier_fragment
+- (void) synpred3_Simplifier_fragment
+{
+    /* ruleLabelDefs entry */
+    CommonTree *a = nil;
+    CommonTree *b = nil;Simplifier_poly_return * p = nil ;
+
+
+    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Simplifier.g:21:4: ( ^( '+' ^( '+' p= poly a= INT ) b= INT ) ) // ruleBlockSingleAlt
+    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Simplifier.g:21:4: ^( '+' ^( '+' p= poly a= INT ) b= INT ) // alt
+    {
+
+
+    [self match:input TokenType:8 Follow:FOLLOW_8_in_synpred3_Simplifier117]; if ( state.failed ) return ;
+     
+        [self match:input TokenType:DOWN Follow:nil]; if ( state.failed ) return ;
+
+
+        [self match:input TokenType:8 Follow:FOLLOW_8_in_synpred3_Simplifier120]; if ( state.failed ) return ;
+         
+            [self match:input TokenType:DOWN Follow:nil]; if ( state.failed ) return ;
+
+            /* ruleRef */
+            [self pushFollow:FOLLOW_poly_in_synpred3_Simplifier124];
+            p = [self poly];
+
+            [self popFollow];
+            if ( state.failed ) return ;
+
+             
+            a=(CommonTree *)[self match:input TokenType:INT Follow:FOLLOW_INT_in_synpred3_Simplifier128]; if ( state.failed ) return ;
+             
+            [self match:input TokenType:UP Follow:nil]; if ( state.failed ) return ;
+
+         
+        b=(CommonTree *)[self match:input TokenType:INT Follow:FOLLOW_INT_in_synpred3_Simplifier133]; if ( state.failed ) return ;
+         
+        [self match:input TokenType:UP Follow:nil]; if ( state.failed ) return ;
+
+     
+    }
+
+} // $ANTLR end synpred3_Simplifier_fragment
+// $ANTLR start synpred4_Simplifier_fragment
+- (void) synpred4_Simplifier_fragment
+{
+    /* ruleLabelDefs entry */
+    Simplifier_poly_return * p = nil ;
+
+    Simplifier_poly_return * q = nil ;
+
+
+    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Simplifier.g:24:4: ( ^( '+' p= poly q= poly ) ) // ruleBlockSingleAlt
+    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/polydiff/Simplifier.g:24:4: ^( '+' p= poly q= poly ) // alt
+    {
+
+
+    [self match:input TokenType:8 Follow:FOLLOW_8_in_synpred4_Simplifier161]; if ( state.failed ) return ;
+     
+        [self match:input TokenType:DOWN Follow:nil]; if ( state.failed ) return ;
+
+        /* ruleRef */
+        [self pushFollow:FOLLOW_poly_in_synpred4_Simplifier165];
+        p = [self poly];
+
+        [self popFollow];
+        if ( state.failed ) return ;
+
+         
+        /* ruleRef */
+        [self pushFollow:FOLLOW_poly_in_synpred4_Simplifier169];
+        q = [self poly];
+
+        [self popFollow];
+        if ( state.failed ) return ;
+
+         
+        [self match:input TokenType:UP Follow:nil]; if ( state.failed ) return ;
+
+     
+    }
+
+} // $ANTLR end synpred4_Simplifier_fragment
+/* ObjC end rules */
+
+@end /* end of Simplifier implementation line 692 */
diff --git a/runtime/ObjC/Framework/examples/polydiff/Simplifier.tokens b/runtime/ObjC/Framework/examples/polydiff/Simplifier.tokens
new file mode 100644
index 0000000..c711b35
--- /dev/null
+++ b/runtime/ObjC/Framework/examples/polydiff/Simplifier.tokens
@@ -0,0 +1,8 @@
+T__8=8
+T__9=9
+ID=4
+INT=5
+MULT=6
+WS=7
+'+'=8
+'^'=9
diff --git a/runtime/ObjC/Framework/examples/polydiff/files b/runtime/ObjC/Framework/examples/polydiff/files
new file mode 100644
index 0000000..f061d0c
--- /dev/null
+++ b/runtime/ObjC/Framework/examples/polydiff/files
@@ -0,0 +1,7 @@
+Poly.g
+PolyDifferentiator.g
+Simplifier.g
+PolyPrinter.g
+Main.java
+input
+output
diff --git a/runtime/ObjC/Framework/examples/polydiff/input b/runtime/ObjC/Framework/examples/polydiff/input
new file mode 100644
index 0000000..530a4c8
--- /dev/null
+++ b/runtime/ObjC/Framework/examples/polydiff/input
@@ -0,0 +1 @@
+2x^3 + x^5 + 4x + 10x + 8x + x + 2
diff --git a/runtime/ObjC/Framework/examples/polydiff/main.m b/runtime/ObjC/Framework/examples/polydiff/main.m
new file mode 100644
index 0000000..082ccd2
--- /dev/null
+++ b/runtime/ObjC/Framework/examples/polydiff/main.m
@@ -0,0 +1,50 @@
+#import <Foundation/Foundation.h>
+#import <ANTLR/ANTLR.h>
+#import "PolyLexer.h"
+#import "PolyParser.h"
+// #import "PolyDifferentiator.h"
+// #import "PolyPrinter.h"
+// #import "Simplifier.h"
+
+
+int main(int argc, const char *argv[])
+{
+    NSError *error;
+    NSLog(@"starting polydiff\n");
+	NSString *input = [NSString stringWithContentsOfFile:@"../../examples/polydiff/input"  encoding:NSASCIIStringEncoding error:&error];
+	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:input];
+	NSLog(@"%@", input);
+
+// BUILD AST
+    PolyLexer *lex = [PolyLexer newPolyLexerWithCharStream:stream];
+    CommonTokenStream *tokens = [CommonTokenStream newCommonTokenStreamWithTokenSource:lex];
+    PolyParser *parser = [PolyParser newPolyParser:tokens];
+    PolyParser_poly_return *r = [parser poly];
+    NSLog(@"tree=%@", [r.tree toStringTree]);
+
+#ifdef DONTUSENOMO
+// DIFFERENTIATE
+    CommonTreeNodeStream *nodes = [CommonTreeNodeStream newCommonTreeNodeStream:r.tree];
+    [nodes setTokenStream:tokens];
+    PolyDifferentiator *differ = [PolyDifferentiator newPolyDifferentiator:nodes];
+    PolyDifferentiator_poly_return *r2 = [differ poly];
+    NSLog("d/dx=%@", [r2.tree toStringTree]);
+
+// SIMPLIFY / NORMALIZE
+    nodes = [CommonTreeNodeStream newCommonTreeNodeStream:r2.tree];
+    [nodes setTokenStream:tokens];
+    Simplifier *reducer = [Simplifier newSimplifier:nodes];
+    Simplifier_poly_return *r3 = [reducer poly];
+    NSLog("simplified=%@", [r3.tree toStringTree]);
+
+// CONVERT BACK TO POLYNOMIAL
+    nodes = [CommonTreeNodeStream newCommonTreeNodeStream:r3.tree];
+    [nodes setTokenStream:tokens];
+    PolyPrinter *printer = [PolyPrinter newPolyPrinter:nodes];
+    PolyPrinter_poly_return *r4 = [printer poly];
+    NSLog( [r4.st toString]);
+#endif
+
+    NSLog(@"exiting PolyDiff\n");
+    return 0;
+}
diff --git a/runtime/ObjC/Framework/examples/polydiff/output b/runtime/ObjC/Framework/examples/polydiff/output
new file mode 100644
index 0000000..e525030
--- /dev/null
+++ b/runtime/ObjC/Framework/examples/polydiff/output
@@ -0,0 +1,4 @@
+tree=(+ (+ (+ (+ (+ (+ (* 2 (^ x 3)) (^ x 5)) (* 4 x)) (* 10 x)) (* 8 x)) x) 2)
+d/dx=(+ (+ (+ (+ (+ (+ (* 6 (^ x 2)) (* 5 (^ x 4))) 4) 10) 8) 1) 0)
+simplified=(+ (+ (+ (+ (* 6 (^ x 2)) (* 5 (^ x 4))) 4) 18) 1)
+6x^2+5x^4+4+18+1
diff --git a/runtime/ObjC/Framework/examples/scopes/SymbolTable.g b/runtime/ObjC/Framework/examples/scopes/SymbolTable.g
index 3001d02..db37fc8 100644
--- a/runtime/ObjC/Framework/examples/scopes/SymbolTable.g
+++ b/runtime/ObjC/Framework/examples/scopes/SymbolTable.g
@@ -11,7 +11,7 @@
 }
 
 scope Symbols {
-  ANTLRPtrBuffer *names;
+  PtrBuffer *names;
 }
 
 @memVars {
@@ -31,7 +31,7 @@
 scope Symbols;
 @init {
     level++;
-    $Symbols::names = [ANTLRPtrBuffer newANTLRPtrBufferWithLen:10];
+    $Symbols::names = [PtrBuffer newPtrBufferWithLen:10];
 }
     :   (decl)*
         {
@@ -48,7 +48,7 @@
 scope Symbols;
 @init {
     level++;
-    $Symbols::names = [ANTLRPtrBuffer newANTLRPtrBufferWithLen:10];
+    $Symbols::names = [PtrBuffer newPtrBufferWithLen:10];
 }
     :   '{' (decl)* (stat)* '}'
         {
diff --git a/runtime/ObjC/Framework/examples/scopes/SymbolTableLexer.h b/runtime/ObjC/Framework/examples/scopes/SymbolTableLexer.h
index 2689521..b5c76ec 100644
--- a/runtime/ObjC/Framework/examples/scopes/SymbolTableLexer.h
+++ b/runtime/ObjC/Framework/examples/scopes/SymbolTableLexer.h
@@ -1,9 +1,9 @@
-// $ANTLR ${project.version} ${buildNumber} SymbolTable.g 2011-05-06 15:04:43
+// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g 2012-02-16 17:50:30
 
 /* =============================================================================
- * Standard antlr3 OBJC runtime definitions
+ * Standard antlr OBJC runtime definitions
  */
-#import <Cocoa/Cocoa.h>
+#import <Foundation/Foundation.h>
 #import <ANTLR/ANTLR.h>
 /* End of standard antlr3 runtime definitions
  * =============================================================================
@@ -11,8 +11,8 @@
 
 /* Start cyclicDFAInterface */
 
-#pragma mark Rule return scopes start
-#pragma mark Rule return scopes end
+#pragma mark Rule return scopes Interface start
+#pragma mark Rule return scopes Interface end
 #pragma mark Tokens
 #ifdef EOF
 #undef EOF
@@ -30,12 +30,12 @@
 #define INT 5
 #define WS 6
 /* interface lexer class */
-@interface SymbolTableLexer : ANTLRLexer { // line 283
+@interface SymbolTableLexer : Lexer { // line 283
 /* ObjC start of actions.lexer.memVars */
 /* ObjC end of actions.lexer.memVars */
 }
 + (void) initialize;
-+ (SymbolTableLexer *)newSymbolTableLexerWithCharStream:(id<ANTLRCharStream>)anInput;
++ (SymbolTableLexer *)newSymbolTableLexerWithCharStream:(id<CharStream>)anInput;
 /* ObjC start actions.lexer.methodsDecl */
 /* ObjC end actions.lexer.methodsDecl */
 - (void) mT__7 ; 
diff --git a/runtime/ObjC/Framework/examples/scopes/SymbolTableLexer.m b/runtime/ObjC/Framework/examples/scopes/SymbolTableLexer.m
index 9daf547..d32d85c 100644
--- a/runtime/ObjC/Framework/examples/scopes/SymbolTableLexer.m
+++ b/runtime/ObjC/Framework/examples/scopes/SymbolTableLexer.m
@@ -1,8 +1,8 @@
 /** \file
- *  This OBJC source file was generated by $ANTLR version ${project.version} ${buildNumber}
+ *  This OBJC source file was generated by $ANTLR version 3.4
  *
- *     -  From the grammar source file : SymbolTable.g
- *     -                            On : 2011-05-06 15:04:43
+ *     -  From the grammar source file : /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g
+ *     -                            On : 2012-02-16 17:50:30
  *     -                 for the lexer : SymbolTableLexerLexer
  *
  * Editing it, at least manually, is not wise.
@@ -11,7 +11,7 @@
  *
  *
 */
-// $ANTLR ${project.version} ${buildNumber} SymbolTable.g 2011-05-06 15:04:43
+// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g 2012-02-16 17:50:30
 
 
 /* -----------------------------------------
@@ -31,7 +31,7 @@
 
 + (void) initialize
 {
-    [ANTLRBaseRecognizer setGrammarFileName:@"SymbolTable.g"];
+    [BaseRecognizer setGrammarFileName:@"/Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g"];
 }
 
 + (NSString *) tokenNameForType:(NSInteger)aTokenType
@@ -39,14 +39,14 @@
     return [[self getTokenNames] objectAtIndex:aTokenType];
 }
 
-+ (SymbolTableLexer *)newSymbolTableLexerWithCharStream:(id<ANTLRCharStream>)anInput
++ (SymbolTableLexer *)newSymbolTableLexerWithCharStream:(id<CharStream>)anInput
 {
     return [[SymbolTableLexer alloc] initWithCharStream:anInput];
 }
 
-- (id) initWithCharStream:(id<ANTLRCharStream>)anInput
+- (id) initWithCharStream:(id<CharStream>)anInput
 {
-    self = [super initWithCharStream:anInput State:[[ANTLRRecognizerSharedState newANTLRRecognizerSharedStateWithRuleLen:12+1] retain]];
+    self = [super initWithCharStream:anInput State:[RecognizerSharedState newRecognizerSharedStateWithRuleLen:12+1]];
     if ( self != nil ) {
     }
     return self;
@@ -67,274 +67,292 @@
 - (void) mT__7
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = T__7;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // SymbolTable.g:7:6: ( '(' ) // ruleBlockSingleAlt
-        // SymbolTable.g:7:8: '(' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:7:6: ( '(' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:7:8: '(' // alt
         {
+
+
         [self matchChar:'(']; 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "T__7" */
-
 // $ANTLR start "T__8"
 - (void) mT__8
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = T__8;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // SymbolTable.g:8:6: ( ')' ) // ruleBlockSingleAlt
-        // SymbolTable.g:8:8: ')' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:8:6: ( ')' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:8:8: ')' // alt
         {
+
+
         [self matchChar:')']; 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "T__8" */
-
 // $ANTLR start "T__9"
 - (void) mT__9
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = T__9;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // SymbolTable.g:9:6: ( ';' ) // ruleBlockSingleAlt
-        // SymbolTable.g:9:8: ';' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:9:6: ( ';' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:9:8: ';' // alt
         {
+
+
         [self matchChar:';']; 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "T__9" */
-
 // $ANTLR start "T__10"
 - (void) mT__10
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = T__10;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // SymbolTable.g:10:7: ( '=' ) // ruleBlockSingleAlt
-        // SymbolTable.g:10:9: '=' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:10:7: ( '=' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:10:9: '=' // alt
         {
+
+
         [self matchChar:'=']; 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "T__10" */
-
 // $ANTLR start "T__11"
 - (void) mT__11
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = T__11;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // SymbolTable.g:11:7: ( 'int' ) // ruleBlockSingleAlt
-        // SymbolTable.g:11:9: 'int' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:11:7: ( 'int' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:11:9: 'int' // alt
         {
+
+
         [self matchString:@"int"]; 
 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "T__11" */
-
 // $ANTLR start "T__12"
 - (void) mT__12
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = T__12;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // SymbolTable.g:12:7: ( 'method' ) // ruleBlockSingleAlt
-        // SymbolTable.g:12:9: 'method' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:12:7: ( 'method' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:12:9: 'method' // alt
         {
+
+
         [self matchString:@"method"]; 
 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "T__12" */
-
 // $ANTLR start "T__13"
 - (void) mT__13
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = T__13;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // SymbolTable.g:13:7: ( '{' ) // ruleBlockSingleAlt
-        // SymbolTable.g:13:9: '{' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:13:7: ( '{' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:13:9: '{' // alt
         {
+
+
         [self matchChar:'{']; 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "T__13" */
-
 // $ANTLR start "T__14"
 - (void) mT__14
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = T__14;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // SymbolTable.g:14:7: ( '}' ) // ruleBlockSingleAlt
-        // SymbolTable.g:14:9: '}' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:14:7: ( '}' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:14:9: '}' // alt
         {
+
+
         [self matchChar:'}']; 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "T__14" */
-
 // $ANTLR start "ID"
 - (void) mID
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = ID;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // SymbolTable.g:68:5: ( ( 'a' .. 'z' )+ ) // ruleBlockSingleAlt
-        // SymbolTable.g:68:9: ( 'a' .. 'z' )+ // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:68:5: ( ( 'a' .. 'z' )+ ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:68:9: ( 'a' .. 'z' )+ // alt
         {
-        // SymbolTable.g:68:9: ( 'a' .. 'z' )+ // positiveClosureBlock
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:68:9: ( 'a' .. 'z' )+ // positiveClosureBlock
         NSInteger cnt1 = 0;
         do {
             NSInteger alt1 = 2;
@@ -346,62 +364,64 @@
 
             switch (alt1) {
                 case 1 : ;
-                    // SymbolTable.g: // alt
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g: // alt
                     {
+
                     if ((([input LA:1] >= 'a') && ([input LA:1] <= 'z'))) {
                         [input consume];
                     } else {
-                        ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException newException:nil stream:input];
+                        MismatchedSetException *mse = [MismatchedSetException newException:nil stream:input];
                         [self recover:mse];
                         @throw mse;
                     }
 
-
+                     
                     }
                     break;
 
                 default :
                     if ( cnt1 >= 1 )
                         goto loop1;
-                    ANTLREarlyExitException *eee =
-                        [ANTLREarlyExitException newException:input decisionNumber:1];
+                    EarlyExitException *eee =
+                        [EarlyExitException newException:input decisionNumber:1];
                     @throw eee;
             }
             cnt1++;
         } while (YES);
         loop1: ;
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "ID" */
-
 // $ANTLR start "INT"
 - (void) mINT
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = INT;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // SymbolTable.g:71:5: ( ( '0' .. '9' )+ ) // ruleBlockSingleAlt
-        // SymbolTable.g:71:9: ( '0' .. '9' )+ // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:71:5: ( ( '0' .. '9' )+ ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:71:9: ( '0' .. '9' )+ // alt
         {
-        // SymbolTable.g:71:9: ( '0' .. '9' )+ // positiveClosureBlock
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:71:9: ( '0' .. '9' )+ // positiveClosureBlock
         NSInteger cnt2 = 0;
         do {
             NSInteger alt2 = 2;
@@ -413,62 +433,64 @@
 
             switch (alt2) {
                 case 1 : ;
-                    // SymbolTable.g: // alt
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g: // alt
                     {
+
                     if ((([input LA:1] >= '0') && ([input LA:1] <= '9'))) {
                         [input consume];
                     } else {
-                        ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException newException:nil stream:input];
+                        MismatchedSetException *mse = [MismatchedSetException newException:nil stream:input];
                         [self recover:mse];
                         @throw mse;
                     }
 
-
+                     
                     }
                     break;
 
                 default :
                     if ( cnt2 >= 1 )
                         goto loop2;
-                    ANTLREarlyExitException *eee =
-                        [ANTLREarlyExitException newException:input decisionNumber:2];
+                    EarlyExitException *eee =
+                        [EarlyExitException newException:input decisionNumber:2];
                     @throw eee;
             }
             cnt2++;
         } while (YES);
         loop2: ;
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "INT" */
-
 // $ANTLR start "WS"
 - (void) mWS
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = WS;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // SymbolTable.g:74:5: ( ( ' ' | '\\n' | '\\r' )+ ) // ruleBlockSingleAlt
-        // SymbolTable.g:74:9: ( ' ' | '\\n' | '\\r' )+ // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:74:5: ( ( ' ' | '\\n' | '\\r' )+ ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:74:9: ( ' ' | '\\n' | '\\r' )+ // alt
         {
-        // SymbolTable.g:74:9: ( ' ' | '\\n' | '\\r' )+ // positiveClosureBlock
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:74:9: ( ' ' | '\\n' | '\\r' )+ // positiveClosureBlock
         NSInteger cnt3 = 0;
         do {
             NSInteger alt3 = 2;
@@ -480,54 +502,55 @@
 
             switch (alt3) {
                 case 1 : ;
-                    // SymbolTable.g: // alt
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g: // alt
                     {
+
                     if ([input LA:1] == '\n'||[input LA:1] == '\r'||[input LA:1] == ' ') {
                         [input consume];
                     } else {
-                        ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException newException:nil stream:input];
+                        MismatchedSetException *mse = [MismatchedSetException newException:nil stream:input];
                         [self recover:mse];
                         @throw mse;
                     }
 
-
+                     
                     }
                     break;
 
                 default :
                     if ( cnt3 >= 1 )
                         goto loop3;
-                    ANTLREarlyExitException *eee =
-                        [ANTLREarlyExitException newException:input decisionNumber:3];
+                    EarlyExitException *eee =
+                        [EarlyExitException newException:input decisionNumber:3];
                     @throw eee;
             }
             cnt3++;
         } while (YES);
         loop3: ;
 
+         
 
         _channel=HIDDEN;
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "WS" */
-
 - (void) mTokens
 {
-    // SymbolTable.g:1:8: ( T__7 | T__8 | T__9 | T__10 | T__11 | T__12 | T__13 | T__14 | ID | INT | WS ) //ruleblock
+    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:1:8: ( T__7 | T__8 | T__9 | T__10 | T__11 | T__12 | T__13 | T__14 | ID | INT | WS ) //ruleblock
     NSInteger alt4=11;
     unichar charLA4 = [input LA:1];
     switch (charLA4) {
@@ -685,7 +708,7 @@
             break;
 
     default: ;
-        ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newException:4 state:0 stream:input];
+        NoViableAltException *nvae = [NoViableAltException newException:4 state:0 stream:input];
         nvae.c = charLA4;
         @throw nvae;
 
@@ -693,102 +716,124 @@
 
     switch (alt4) {
         case 1 : ;
-            // SymbolTable.g:1:10: T__7 // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:1:10: T__7 // alt
             {
+
+
             [self mT__7]; 
 
 
-
+             
             }
             break;
         case 2 : ;
-            // SymbolTable.g:1:15: T__8 // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:1:15: T__8 // alt
             {
+
+
             [self mT__8]; 
 
 
-
+             
             }
             break;
         case 3 : ;
-            // SymbolTable.g:1:20: T__9 // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:1:20: T__9 // alt
             {
+
+
             [self mT__9]; 
 
 
-
+             
             }
             break;
         case 4 : ;
-            // SymbolTable.g:1:25: T__10 // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:1:25: T__10 // alt
             {
+
+
             [self mT__10]; 
 
 
-
+             
             }
             break;
         case 5 : ;
-            // SymbolTable.g:1:31: T__11 // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:1:31: T__11 // alt
             {
+
+
             [self mT__11]; 
 
 
-
+             
             }
             break;
         case 6 : ;
-            // SymbolTable.g:1:37: T__12 // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:1:37: T__12 // alt
             {
+
+
             [self mT__12]; 
 
 
-
+             
             }
             break;
         case 7 : ;
-            // SymbolTable.g:1:43: T__13 // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:1:43: T__13 // alt
             {
+
+
             [self mT__13]; 
 
 
-
+             
             }
             break;
         case 8 : ;
-            // SymbolTable.g:1:49: T__14 // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:1:49: T__14 // alt
             {
+
+
             [self mT__14]; 
 
 
-
+             
             }
             break;
         case 9 : ;
-            // SymbolTable.g:1:55: ID // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:1:55: ID // alt
             {
+
+
             [self mID]; 
 
 
-
+             
             }
             break;
         case 10 : ;
-            // SymbolTable.g:1:58: INT // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:1:58: INT // alt
             {
+
+
             [self mINT]; 
 
 
-
+             
             }
             break;
         case 11 : ;
-            // SymbolTable.g:1:62: WS // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:1:62: WS // alt
             {
+
+
             [self mWS]; 
 
 
-
+             
             }
             break;
 
diff --git a/runtime/ObjC/Framework/examples/scopes/SymbolTableParser.h b/runtime/ObjC/Framework/examples/scopes/SymbolTableParser.h
index e67094b..afd118a 100644
--- a/runtime/ObjC/Framework/examples/scopes/SymbolTableParser.h
+++ b/runtime/ObjC/Framework/examples/scopes/SymbolTableParser.h
@@ -1,9 +1,9 @@
-// $ANTLR ${project.version} ${buildNumber} SymbolTable.g 2011-05-06 15:04:42
+// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g 2012-02-16 17:50:30
 
 /* =============================================================================
- * Standard antlr3 OBJC runtime definitions
+ * Standard antlr OBJC runtime definitions
  */
-#import <Cocoa/Cocoa.h>
+#import <Foundation/Foundation.h>
 #import <ANTLR/ANTLR.h>
 /* End of standard antlr3 runtime definitions
  * =============================================================================
@@ -38,46 +38,34 @@
 #define ID 4
 #define INT 5
 #define WS 6
-#pragma mark Dynamic Global Scopes
+#pragma mark Dynamic Global Scopes globalAttributeScopeInterface
 /* globalAttributeScopeInterface */
-@interface Symbols_Scope : ANTLRSymbolsScope {
-ANTLRPtrBuffer * names;
-
-}
+@interface Symbols_Scope : SymbolsScope {
+PtrBuffer * names;
+ }
 /* start of globalAttributeScopeInterface properties */
-
-@property (assign, getter=getnames, setter=setnames:) ANTLRPtrBuffer * names;
-
+@property (assign, getter=getnames, setter=setnames:) PtrBuffer * names;
 /* end globalAttributeScopeInterface properties */
-
-
 + (Symbols_Scope *)newSymbols_Scope;
 - (id) init;
 /* start of globalAttributeScopeInterface methodsDecl */
-
-- (ANTLRPtrBuffer *)getnames;
-- (void)setnames:(ANTLRPtrBuffer *)aVal;
-
+- (PtrBuffer *)getnames;
+- (void)setnames:(PtrBuffer *)aVal;
 /* End of globalAttributeScopeInterface methodsDecl */
-
 @end /* end of Symbols_Scope interface */
 
-#pragma mark Dynamic Rule Scopes
-#pragma mark Rule Return Scopes start
+#pragma mark Dynamic Rule Scopes ruleAttributeScopeInterface
+#pragma mark Rule Return Scopes returnScopeInterface
 
 /* Interface grammar class */
-@interface SymbolTableParser : ANTLRParser { /* line 572 */
-/* ObjC start of ruleAttributeScopeMemVar */
-
-
-/* ObjC end of ruleAttributeScopeMemVar */
-/* ObjC start of globalAttributeScopeMemVar */
+@interface SymbolTableParser  : Parser { /* line 572 */
+#pragma mark Dynamic Rule Scopes ruleAttributeScopeDecl
+#pragma mark Dynamic Global Rule Scopes globalAttributeScopeMemVar
 /* globalAttributeScopeMemVar */
-//ANTLRSymbolStack *gStack;
-ANTLRSymbolStack *Symbols_stack;
+SymbolStack *Symbols_stack;
 Symbols_Scope *Symbols_scope;
 
-/* ObjC end of globalAttributeScopeMemVar */
+
 /* ObjC start of actions.(actionScope).memVars */
 
 int level;
@@ -94,7 +82,7 @@
 /* ObjC end of properties */
 
 + (void) initialize;
-+ (id) newSymbolTableParser:(id<ANTLRTokenStream>)aStream;
++ (id) newSymbolTableParser:(id<TokenStream>)aStream;
 /* ObjC start of actions.(actionScope).methodsDecl */
 /* ObjC end of actions.(actionScope).methodsDecl */
 
diff --git a/runtime/ObjC/Framework/examples/scopes/SymbolTableParser.m b/runtime/ObjC/Framework/examples/scopes/SymbolTableParser.m
index cc2b37e..2f144f8 100644
--- a/runtime/ObjC/Framework/examples/scopes/SymbolTableParser.m
+++ b/runtime/ObjC/Framework/examples/scopes/SymbolTableParser.m
@@ -1,8 +1,8 @@
 /** \file
- *  This OBJC source file was generated by $ANTLR version ${project.version} ${buildNumber}
+ *  This OBJC source file was generated by $ANTLR version 3.4
  *
- *     -  From the grammar source file : SymbolTable.g
- *     -                            On : 2011-05-06 15:04:42
+ *     -  From the grammar source file : /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g
+ *     -                            On : 2012-02-16 17:50:30
  *     -                for the parser : SymbolTableParserParser
  *
  * Editing it, at least manually, is not wise.
@@ -11,7 +11,7 @@
  *
  *
 */
-// $ANTLR ${project.version} ${buildNumber} SymbolTable.g 2011-05-06 15:04:42
+// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g 2012-02-16 17:50:30
 
 
 /* -----------------------------------------
@@ -69,103 +69,93 @@
 static const unsigned long long FOLLOW_9_in_decl223_data[] = { 0x0000000000000002LL};
 
 
-#pragma mark Dynamic Global Scopes
+#pragma mark Dynamic Global globalAttributeScopeImplementation
 @implementation Symbols_Scope  /* globalAttributeScopeImplementation */
 /* start of synthesize -- OBJC-Line 1750 */
-
-@synthesize names;
+@synthesize names; 
 
 + (Symbols_Scope *)newSymbols_Scope
 {
-    return [[[Symbols_Scope alloc] init] retain];
+return [[Symbols_Scope alloc] init];
 }
 
 - (id) init
 {
-    self = [super init];
-    return self;
+self = [super init];
+return self;
 }
 
 /* start of iterate get and set functions */
-
-- (ANTLRPtrBuffer *)getnames { return( names ); }
-
-- (void)setnames:(ANTLRPtrBuffer *)aVal { names = aVal; }
+- (PtrBuffer *)getnames { return( names ); }
+- (void)setnames:(PtrBuffer *)aVal { names = aVal; }
 
 /* End of iterate get and set functions */
-
 @end /* end of Symbols_Scope implementation */
 
 
-#pragma mark Dynamic Rule Scopes
 
-#pragma mark Rule Return Scopes start
-//#pragma mark Rule return scopes start
-//
+#pragma mark Dynamic Rule Scopes ruleAttributeScopeImplementation
 
-#pragma mark Rule return scopes start
+#pragma mark Rule Return Scopes returnScopeImplementation
 
 @implementation SymbolTableParser  // line 637
 
 /* ObjC start of ruleAttributeScope */
-#pragma mark Dynamic Rule Scopes
+#pragma mark Dynamic Rule Scopes ruleAttributeScope
 /* ObjC end of ruleAttributeScope */
-#pragma mark global Attribute Scopes
+#pragma mark global Attribute Scopes globalAttributeScope
 /* ObjC start globalAttributeScope */
-static _stack;
-
+static SymbolStack *Symbols_stack;
+ 
 /* ObjC end globalAttributeScope */
 /* ObjC start actions.(actionScope).synthesize */
-/* ObjC end actions.(actionScope).synthesize */
 /* ObjC start synthesize() */
-/* ObjC end synthesize() */
 
 + (void) initialize
 {
     #pragma mark Bitsets
-    FOLLOW_globals_in_prog50 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_globals_in_prog50_data Count:(NSUInteger)1] retain];
-    FOLLOW_method_in_prog53 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_method_in_prog53_data Count:(NSUInteger)1] retain];
-    FOLLOW_decl_in_globals85 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_decl_in_globals85_data Count:(NSUInteger)1] retain];
-    FOLLOW_12_in_method116 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_12_in_method116_data Count:(NSUInteger)1] retain];
-    FOLLOW_ID_in_method118 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_ID_in_method118_data Count:(NSUInteger)1] retain];
-    FOLLOW_7_in_method120 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_7_in_method120_data Count:(NSUInteger)1] retain];
-    FOLLOW_8_in_method122 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_8_in_method122_data Count:(NSUInteger)1] retain];
-    FOLLOW_block_in_method124 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_block_in_method124_data Count:(NSUInteger)1] retain];
-    FOLLOW_13_in_block153 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_13_in_block153_data Count:(NSUInteger)1] retain];
-    FOLLOW_decl_in_block156 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_decl_in_block156_data Count:(NSUInteger)1] retain];
-    FOLLOW_stat_in_block161 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_stat_in_block161_data Count:(NSUInteger)1] retain];
-    FOLLOW_14_in_block165 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_14_in_block165_data Count:(NSUInteger)1] retain];
-    FOLLOW_ID_in_stat189 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_ID_in_stat189_data Count:(NSUInteger)1] retain];
-    FOLLOW_10_in_stat191 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_10_in_stat191_data Count:(NSUInteger)1] retain];
-    FOLLOW_INT_in_stat193 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_INT_in_stat193_data Count:(NSUInteger)1] retain];
-    FOLLOW_9_in_stat195 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_9_in_stat195_data Count:(NSUInteger)1] retain];
-    FOLLOW_block_in_stat205 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_block_in_stat205_data Count:(NSUInteger)1] retain];
-    FOLLOW_11_in_decl219 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_11_in_decl219_data Count:(NSUInteger)1] retain];
-    FOLLOW_ID_in_decl221 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_ID_in_decl221_data Count:(NSUInteger)1] retain];
-    FOLLOW_9_in_decl223 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_9_in_decl223_data Count:(NSUInteger)1] retain];
+    FOLLOW_globals_in_prog50 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_globals_in_prog50_data Count:(NSUInteger)1] retain];
+    FOLLOW_method_in_prog53 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_method_in_prog53_data Count:(NSUInteger)1] retain];
+    FOLLOW_decl_in_globals85 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_decl_in_globals85_data Count:(NSUInteger)1] retain];
+    FOLLOW_12_in_method116 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_12_in_method116_data Count:(NSUInteger)1] retain];
+    FOLLOW_ID_in_method118 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_ID_in_method118_data Count:(NSUInteger)1] retain];
+    FOLLOW_7_in_method120 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_7_in_method120_data Count:(NSUInteger)1] retain];
+    FOLLOW_8_in_method122 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_8_in_method122_data Count:(NSUInteger)1] retain];
+    FOLLOW_block_in_method124 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_block_in_method124_data Count:(NSUInteger)1] retain];
+    FOLLOW_13_in_block153 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_13_in_block153_data Count:(NSUInteger)1] retain];
+    FOLLOW_decl_in_block156 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_decl_in_block156_data Count:(NSUInteger)1] retain];
+    FOLLOW_stat_in_block161 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_stat_in_block161_data Count:(NSUInteger)1] retain];
+    FOLLOW_14_in_block165 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_14_in_block165_data Count:(NSUInteger)1] retain];
+    FOLLOW_ID_in_stat189 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_ID_in_stat189_data Count:(NSUInteger)1] retain];
+    FOLLOW_10_in_stat191 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_10_in_stat191_data Count:(NSUInteger)1] retain];
+    FOLLOW_INT_in_stat193 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_INT_in_stat193_data Count:(NSUInteger)1] retain];
+    FOLLOW_9_in_stat195 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_9_in_stat195_data Count:(NSUInteger)1] retain];
+    FOLLOW_block_in_stat205 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_block_in_stat205_data Count:(NSUInteger)1] retain];
+    FOLLOW_11_in_decl219 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_11_in_decl219_data Count:(NSUInteger)1] retain];
+    FOLLOW_ID_in_decl221 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_ID_in_decl221_data Count:(NSUInteger)1] retain];
+    FOLLOW_9_in_decl223 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_9_in_decl223_data Count:(NSUInteger)1] retain];
 
-    [ANTLRBaseRecognizer setTokenNames:[[AMutableArray arrayWithObjects:@"<invalid>", @"<EOR>", @"<DOWN>", @"<UP>", 
+    [BaseRecognizer setTokenNames:[[AMutableArray arrayWithObjects:@"<invalid>", @"<EOR>", @"<DOWN>", @"<UP>", 
  @"ID", @"INT", @"WS", @"'('", @"')'", @"';'", @"'='", @"'int'", @"'method'", 
  @"'{'", @"'}'", nil] retain]];
-    [ANTLRBaseRecognizer setGrammarFileName:@"SymbolTable.g"];
+    [BaseRecognizer setGrammarFileName:@"/Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g"];
 }
 
-+ (SymbolTableParser *)newSymbolTableParser:(id<ANTLRTokenStream>)aStream
++ (SymbolTableParser *)newSymbolTableParser:(id<TokenStream>)aStream
 {
     return [[SymbolTableParser alloc] initWithTokenStream:aStream];
-
-
 }
 
-- (id) initWithTokenStream:(id<ANTLRTokenStream>)aStream
+- (id) initWithTokenStream:(id<TokenStream>)aStream
 {
-    self = [super initWithTokenStream:aStream State:[[ANTLRRecognizerSharedState newANTLRRecognizerSharedStateWithRuleLen:6+1] retain]];
+    self = [super initWithTokenStream:aStream State:[[RecognizerSharedState newRecognizerSharedStateWithRuleLen:6+1] retain]];
     if ( self != nil ) {
-
-
         /* globalAttributeScopeInit */
+
         Symbols_scope = [Symbols_Scope newSymbols_Scope];
-        Symbols_stack = [ANTLRSymbolStack newANTLRSymbolStackWithLen:30];
+
+        Symbols_stack = [SymbolStack newSymbolStackWithLen:30];
+
         /* start of actions-actionScope-init */
 
         level = 0;
@@ -178,11 +168,10 @@
 - (void) dealloc
 {
     [Symbols_stack release];
+     
     [super dealloc];
 }
 
-/* ObjC start members */
-/* ObjC end members */
 /* ObjC start actions.(actionScope).methods */
 /* ObjC end actions.(actionScope).methods */
 /* ObjC start methods() */
@@ -190,17 +179,22 @@
 /* ObjC start rules */
 /*
  * $ANTLR start prog
- * SymbolTable.g:25:1: prog : globals ( method )* ;
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:25:1: prog : globals ( method )* ;
  */
 - (void) prog
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
-        // SymbolTable.g:27:5: ( globals ( method )* ) // ruleBlockSingleAlt
-        // SymbolTable.g:27:9: globals ( method )* // alt
+        /* ruleLabelDefs entry */
+
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:27:5: ( globals ( method )* ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:27:9: globals ( method )* // alt
         {
+
         /* ruleRef */
         [self pushFollow:FOLLOW_globals_in_prog50];
         [self globals];
@@ -208,6 +202,7 @@
         [self popFollow];
 
 
+         
 
         do {
             NSInteger alt1=2;
@@ -219,8 +214,9 @@
 
             switch (alt1) {
                 case 1 : ;
-                    // SymbolTable.g:27:18: method // alt
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:27:18: method // alt
                     {
+
                     /* ruleRef */
                     [self pushFollow:FOLLOW_method_in_prog53];
                     [self method];
@@ -228,7 +224,7 @@
                     [self popFollow];
 
 
-
+                     
                     }
                     break;
 
@@ -238,19 +234,19 @@
         } while (YES);
         loop1: ;
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
     }
 
     @finally {
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return ;
@@ -259,22 +255,28 @@
 
 /*
  * $ANTLR start globals
- * SymbolTable.g:30:1: globals : ( decl )* ;
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:30:1: globals : ( decl )* ;
  */
 - (void) globals
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
-    [Symbols_stack push:[[Symbols_Scope newSymbols_Scope] retain]];
+    /* ruleScopeSetUp */
+    [Symbols_stack push:[Symbols_Scope newSymbols_Scope]];
+
+    /* ruleDeclarations */
 
 
         level++;
-        /* scopeSetAttributeRef */((Symbols_Scope *)[Symbols_stack peek]).names =  [ANTLRPtrBuffer newANTLRPtrBufferWithLen:10];
+        /* scopeSetAttributeRef */((Symbols_Scope *)[Symbols_stack peek]).names =  [PtrBuffer newPtrBufferWithLen:10];
 
     @try {
-        // SymbolTable.g:36:5: ( ( decl )* ) // ruleBlockSingleAlt
-        // SymbolTable.g:36:9: ( decl )* // alt
+        /* ruleLabelDefs entry */
+
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:36:5: ( ( decl )* ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:36:9: ( decl )* // alt
         {
+
+
         do {
             NSInteger alt2=2;
             NSInteger LA2_0 = [input LA:1];
@@ -285,8 +287,9 @@
 
             switch (alt2) {
                 case 1 : ;
-                    // SymbolTable.g:36:10: decl // alt
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:36:10: decl // alt
                     {
+
                     /* ruleRef */
                     [self pushFollow:FOLLOW_decl_in_globals85];
                     [self decl];
@@ -294,7 +297,7 @@
                     [self popFollow];
 
 
-
+                     
                     }
                     break;
 
@@ -304,25 +307,26 @@
         } while (YES);
         loop2: ;
 
+         
 
 
                     NSLog( @"globals: %@", [((Symbols_Scope *)[Symbols_stack peek]).names toString] );
                     level--;
                 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
     }
 
     @finally {
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
         [Symbols_stack pop];
 
     }
@@ -332,25 +336,30 @@
 
 /*
  * $ANTLR start method
- * SymbolTable.g:43:1: method : 'method' ID '(' ')' block ;
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:43:1: method : 'method' ID '(' ')' block ;
  */
 - (void) method
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
-        // SymbolTable.g:44:5: ( 'method' ID '(' ')' block ) // ruleBlockSingleAlt
-        // SymbolTable.g:44:9: 'method' ID '(' ')' block // alt
+        /* ruleLabelDefs entry */
+
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:44:5: ( 'method' ID '(' ')' block ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:44:9: 'method' ID '(' ')' block // alt
         {
+
         [self match:input TokenType:12 Follow:FOLLOW_12_in_method116]; 
-
+         
         [self match:input TokenType:ID Follow:FOLLOW_ID_in_method118]; 
-
+         
         [self match:input TokenType:7 Follow:FOLLOW_7_in_method120]; 
-
+         
         [self match:input TokenType:8 Follow:FOLLOW_8_in_method122]; 
-
+         
         /* ruleRef */
         [self pushFollow:FOLLOW_block_in_method124];
         [self block];
@@ -358,19 +367,19 @@
         [self popFollow];
 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
     }
 
     @finally {
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return ;
@@ -379,23 +388,29 @@
 
 /*
  * $ANTLR start block
- * SymbolTable.g:47:1: block : '{' ( decl )* ( stat )* '}' ;
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:47:1: block : '{' ( decl )* ( stat )* '}' ;
  */
 - (void) block
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
-    [Symbols_stack push:[[Symbols_Scope newSymbols_Scope] retain]];
+    /* ruleScopeSetUp */
+    [Symbols_stack push:[Symbols_Scope newSymbols_Scope]];
+
+    /* ruleDeclarations */
 
 
         level++;
-        /* scopeSetAttributeRef */((Symbols_Scope *)[Symbols_stack peek]).names =  [ANTLRPtrBuffer newANTLRPtrBufferWithLen:10];
+        /* scopeSetAttributeRef */((Symbols_Scope *)[Symbols_stack peek]).names =  [PtrBuffer newPtrBufferWithLen:10];
 
     @try {
-        // SymbolTable.g:53:5: ( '{' ( decl )* ( stat )* '}' ) // ruleBlockSingleAlt
-        // SymbolTable.g:53:9: '{' ( decl )* ( stat )* '}' // alt
+        /* ruleLabelDefs entry */
+
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:53:5: ( '{' ( decl )* ( stat )* '}' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:53:9: '{' ( decl )* ( stat )* '}' // alt
         {
+
         [self match:input TokenType:13 Follow:FOLLOW_13_in_block153]; 
+         
 
         do {
             NSInteger alt3=2;
@@ -407,8 +422,9 @@
 
             switch (alt3) {
                 case 1 : ;
-                    // SymbolTable.g:53:14: decl // alt
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:53:14: decl // alt
                     {
+
                     /* ruleRef */
                     [self pushFollow:FOLLOW_decl_in_block156];
                     [self decl];
@@ -416,7 +432,7 @@
                     [self popFollow];
 
 
-
+                     
                     }
                     break;
 
@@ -426,6 +442,7 @@
         } while (YES);
         loop3: ;
 
+         
 
         do {
             NSInteger alt4=2;
@@ -437,8 +454,9 @@
 
             switch (alt4) {
                 case 1 : ;
-                    // SymbolTable.g:53:22: stat // alt
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:53:22: stat // alt
                     {
+
                     /* ruleRef */
                     [self pushFollow:FOLLOW_stat_in_block161];
                     [self stat];
@@ -446,7 +464,7 @@
                     [self popFollow];
 
 
-
+                     
                     }
                     break;
 
@@ -456,27 +474,28 @@
         } while (YES);
         loop4: ;
 
-
+         
         [self match:input TokenType:14 Follow:FOLLOW_14_in_block165]; 
+         
 
 
                     NSLog( @"level %d symbols: %@", level, [((Symbols_Scope *)[Symbols_stack peek]).names toString] );
                     level--;
                 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
     }
 
     @finally {
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
         [Symbols_stack pop];
 
     }
@@ -486,15 +505,19 @@
 
 /*
  * $ANTLR start stat
- * SymbolTable.g:60:1: stat : ( ID '=' INT ';' | block );
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:60:1: stat : ( ID '=' INT ';' | block );
  */
 - (void) stat
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
-        // SymbolTable.g:60:5: ( ID '=' INT ';' | block ) //ruleblock
+        /* ruleLabelDefs entry */
+
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:60:5: ( ID '=' INT ';' | block ) //ruleblock
         NSInteger alt5=2;
         NSInteger LA5_0 = [input LA:1];
 
@@ -505,28 +528,30 @@
             alt5=2;
         }
         else {
-            ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newException:5 state:0 stream:input];
+            NoViableAltException *nvae = [NoViableAltException newException:5 state:0 stream:input];
             nvae.c = LA5_0;
             @throw nvae;
 
         }
         switch (alt5) {
             case 1 : ;
-                // SymbolTable.g:60:9: ID '=' INT ';' // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:60:9: ID '=' INT ';' // alt
                 {
+
                 [self match:input TokenType:ID Follow:FOLLOW_ID_in_stat189]; 
-
+                 
                 [self match:input TokenType:10 Follow:FOLLOW_10_in_stat191]; 
-
+                 
                 [self match:input TokenType:INT Follow:FOLLOW_INT_in_stat193]; 
-
+                 
                 [self match:input TokenType:9 Follow:FOLLOW_9_in_stat195]; 
-
+                 
                 }
                 break;
             case 2 : ;
-                // SymbolTable.g:61:9: block // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:61:9: block // alt
                 {
+
                 /* ruleRef */
                 [self pushFollow:FOLLOW_block_in_stat205];
                 [self block];
@@ -534,21 +559,21 @@
                 [self popFollow];
 
 
-
+                 
                 }
                 break;
 
         }
-        // token+rule list labels
+        /* token+rule list labels */
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
     }
 
     @finally {
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return ;
@@ -557,40 +582,44 @@
 
 /*
  * $ANTLR start decl
- * SymbolTable.g:64:1: decl : 'int' ID ';' ;
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:64:1: decl : 'int' ID ';' ;
  */
 - (void) decl
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
-        ANTLRCommonToken *ID1 = nil;
+        /* ruleLabelDefs entry */
+        CommonToken *ID1 = nil;
 
-        // SymbolTable.g:64:5: ( 'int' ID ';' ) // ruleBlockSingleAlt
-        // SymbolTable.g:64:9: 'int' ID ';' // alt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:64:5: ( 'int' ID ';' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/SymbolTable.g:64:9: 'int' ID ';' // alt
         {
+
         [self match:input TokenType:11 Follow:FOLLOW_11_in_decl219]; 
-
-        ID1=(ANTLRCommonToken *)[self match:input TokenType:ID Follow:FOLLOW_ID_in_decl221]; 
-
+         
+        ID1=(CommonToken *)[self match:input TokenType:ID Follow:FOLLOW_ID_in_decl221]; 
+         
         [self match:input TokenType:9 Follow:FOLLOW_9_in_decl223]; 
+         
 
         [((Symbols_Scope *)[Symbols_stack peek]).names addObject:ID1];
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
     }
 
     @finally {
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return ;
diff --git a/runtime/ObjC/Framework/examples/scopes/antlr3.h b/runtime/ObjC/Framework/examples/scopes/antlr3.h
deleted file mode 100644
index 4f16279..0000000
--- a/runtime/ObjC/Framework/examples/scopes/antlr3.h
+++ /dev/null
@@ -1,79 +0,0 @@
-#import <ANTLR/ANTLRBaseMapElement.h>
-#import <ANTLR/ANTLRBaseRecognizer.h>
-#import <ANTLR/ANTLRBaseStack.h>
-#import <ANTLR/ANTLRBaseTree.h>
-#import <ANTLR/ANTLRBaseTreeAdaptor.h>
-#import <ANTLR/ANTLRBitSet.h>
-#import <ANTLR/ANTLRBufferedTokenStream.h>
-#import <ANTLR/ANTLRBufferedTreeNodeStream.h>
-#import <ANTLR/ANTLRCharStream.h>
-#import <ANTLR/ANTLRCharStreamState.h>
-#import <ANTLR/ANTLRCommonErrorNode.h>
-#import <ANTLR/ANTLRCommonToken.h>
-#import <ANTLR/ANTLRCommonTokenStream.h>
-#import <ANTLR/ANTLRCommonTree.h>
-#import <ANTLR/ANTLRCommonTreeAdaptor.h>
-#import <ANTLR/ANTLRCommonTreeNodeStream.h>
-#import <ANTLR/ANTLRDFA.h>
-#import <ANTLR/ANTLRDebug.h>
-#import <ANTLR/ANTLRDebugEventProxy.h>
-#import <ANTLR/ANTLRDebugEventListener.h>
-#import <ANTLR/ANTLRDebugParser.h>
-#import <ANTLR/ANTLRDebugTokenStream.h>
-#import <ANTLR/ANTLRDebugTreeAdaptor.h>
-#import <ANTLR/ANTLRDebugTreeNodeStream.h>
-#import <ANTLR/ANTLRDebugTreeParser.h>
-#import <ANTLR/ANTLREarlyExitException.h>
-#import <ANTLR/ANTLRError.h>
-#import <ANTLR/ANTLRFailedPredicateException.h>
-#import <ANTLR/ANTLRFastQueue.h>
-#import <ANTLR/ANTLRHashMap.h>
-#import <ANTLR/ANTLRHashRule.h>
-#import <ANTLR/ANTLRIntArray.h>
-#import <ANTLR/ANTLRIntStream.h>
-#import <ANTLR/ANTLRLexer.h>
-#import <ANTLR/ANTLRLexerRuleReturnScope.h>
-#import <ANTLR/ANTLRLinkBase.h>
-#import <ANTLR/ANTLRLookaheadStream.h>
-#import <ANTLR/ANTLRMapElement.h>
-#import <ANTLR/ANTLRMap.h>
-#import <ANTLR/ANTLRMismatchedNotSetException.h>
-#import <ANTLR/ANTLRMismatchedRangeException.h>
-#import <ANTLR/ANTLRMismatchedSetException.h>
-#import <ANTLR/ANTLRMismatchedTokenException.h>
-#import <ANTLR/ANTLRMismatchedTreeNodeException.h>
-#import <ANTLR/ANTLRMissingTokenException.h>
-#import <ANTLR/ANTLRNodeMapElement.h>
-#import <ANTLR/ANTLRNoViableAltException.h>
-#import <ANTLR/ANTLRParser.h>
-#import <ANTLR/ANTLRParserRuleReturnScope.h>
-#import <ANTLR/ANTLRPtrBuffer.h>
-#import <ANTLR/ANTLRRecognitionException.h>
-#import <ANTLR/ANTLRRecognizerSharedState.h>
-#import <ANTLR/ANTLRRewriteRuleElementStream.h>
-#import <ANTLR/ANTLRRewriteRuleSubtreeStream.h>
-#import <ANTLR/ANTLRRewriteRuleTokenStream.h>
-#import <ANTLR/ANTLRRuleMemo.h>
-#import <ANTLR/ANTLRRuleStack.h>
-#import <ANTLR/ANTLRRuleReturnScope.h>
-#import <ANTLR/ANTLRRuntimeException.h>
-#import <ANTLR/ANTLRStreamEnumerator.h>
-#import <ANTLR/ANTLRStringStream.h>
-#import <ANTLR/ANTLRSymbolStack.h>
-#import <ANTLR/ANTLRToken+DebuggerSupport.h>
-#import <ANTLR/ANTLRToken.h>
-#import <ANTLR/ANTLRTokenRewriteStream.h>
-#import <ANTLR/ANTLRTokenSource.h>
-#import <ANTLR/ANTLRTokenStream.h>
-#import <ANTLR/ANTLRTree.h>
-#import <ANTLR/ANTLRTreeAdaptor.h>
-#import <ANTLR/ANTLRTreeException.h>
-#import <ANTLR/ANTLRTreeIterator.h>
-#import <ANTLR/ANTLRTreeNodeStream.h>
-#import <ANTLR/ANTLRTreeParser.h>
-#import <ANTLR/ANTLRTreeRuleReturnScope.h>
-#import <ANTLR/ANTLRUnbufferedTokenStream.h>
-//#import <ANTLR/ANTLRUnbufferedCommonTreeNodeStream.h>
-//#import <ANTLR/ANTLRUnbufferedCommonTreeNodeStreamState.h>
-#import <ANTLR/ANTLRUniqueIDMap.h>
-#import <ANTLR/ANTLRUnwantedTokenException.h>
diff --git a/runtime/ObjC/Framework/examples/scopes/main.m b/runtime/ObjC/Framework/examples/scopes/main.m
index edd9a23..f7700fa 100644
--- a/runtime/ObjC/Framework/examples/scopes/main.m
+++ b/runtime/ObjC/Framework/examples/scopes/main.m
@@ -1,22 +1,24 @@
-#import <Cocoa/Cocoa.h>
-#import <antlr3.h>
+#import <Foundation/Foundation.h>
+#import <ANTLR/ANTLR.h>
 #import "SymbolTableLexer.h"
 #import "SymbolTableParser.h"
 
-int main() {
+int main()
+{
+    NSError *error;
 	NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
 	
-	NSString *string = [NSString stringWithContentsOfFile:@"/Users/acondit/source/antlr3/acondit_localhost/code/antlr/antlr3-main/runtime/ObjC/Framework/examples/scopes/input"];
+	NSString *string = [NSString stringWithContentsOfFile:@"/Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/scopes/input" encoding:NSASCIIStringEncoding error:&error];
 	NSLog(@"input is : %@", string);
 	ANTLRStringStream *stream = [[ANTLRStringStream alloc] initWithStringNoCopy:string];
 	SymbolTableLexer *lexer = [[SymbolTableLexer alloc] initWithCharStream:stream];
 	
-//	ANTLRCommonToken *currentToken;
-//	while ((currentToken = [lexer nextToken]) && [currentToken getType] != ANTLRTokenTypeEOF) {
+//	CommonToken *currentToken;
+//	while ((currentToken = [lexer nextToken]) && currentToken.type != TokenTypeEOF) {
 //		NSLog(@"%@", currentToken);
 //	}
 	
-	ANTLRCommonTokenStream *tokens = [[ANTLRCommonTokenStream alloc] initWithTokenSource:lexer];
+	CommonTokenStream *tokens = [[CommonTokenStream alloc] initWithTokenSource:lexer];
 	SymbolTableParser *parser = [[SymbolTableParser alloc] initWithTokenStream:tokens];
 	[parser prog];
 
diff --git a/runtime/ObjC/Framework/examples/scopes/output1/SymbolTable.tokens b/runtime/ObjC/Framework/examples/scopes/output1/SymbolTable.tokens
deleted file mode 100644
index 6740901..0000000
--- a/runtime/ObjC/Framework/examples/scopes/output1/SymbolTable.tokens
+++ /dev/null
@@ -1,19 +0,0 @@
-WS=6
-T__12=12
-T__11=11
-T__14=14
-T__13=13
-T__10=10
-INT=5
-ID=4
-T__9=9
-T__8=8
-T__7=7
-';'=13
-'}'=11
-'='=12
-'int'=14
-'('=8
-'method'=7
-')'=9
-'{'=10
diff --git a/runtime/ObjC/Framework/examples/scopes/output1/SymbolTableLexer.h b/runtime/ObjC/Framework/examples/scopes/output1/SymbolTableLexer.h
deleted file mode 100644
index 47276a3..0000000
--- a/runtime/ObjC/Framework/examples/scopes/output1/SymbolTableLexer.h
+++ /dev/null
@@ -1,53 +0,0 @@
-// $ANTLR 3.2 Aug 19, 2010 17:16:04 /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g 2010-08-19 17:16:47
-
-/* =============================================================================
- * Standard antlr3 OBJC runtime definitions
- */
-#import <Cocoa/Cocoa.h>
-#import "antlr3.h"
-/* End of standard antlr3 runtime definitions
- * =============================================================================
- */
-
-#pragma mark Cyclic DFA interface start DFA4
-@interface DFA4 : ANTLRDFA {
-}
-+ newDFA4WithRecognizer:(ANTLRBaseRecognizer *)theRecognizer;
-- initWithRecognizer:(ANTLRBaseRecognizer *)recognizer;
-@end
-
-#pragma mark Cyclic DFA interface end DFA4
-
-#pragma mark Rule return scopes start
-#pragma mark Rule return scopes end
-#pragma mark Tokens
-#define WS 6
-#define T__12 12
-#define T__11 11
-#define T__14 14
-#define T__13 13
-#define T__10 10
-#define INT 5
-#define ID 4
-#define EOF -1
-#define T__9 9
-#define T__8 8
-#define T__7 7
-@interface SymbolTableLexer : ANTLRLexer { // line 283
-    DFA4 *dfa4;
-}
-+ (SymbolTableLexer *)newSymbolTableLexer:(id<ANTLRCharStream>)anInput;
-
-- (void) mT__7; 
-- (void) mT__8; 
-- (void) mT__9; 
-- (void) mT__10; 
-- (void) mT__11; 
-- (void) mT__12; 
-- (void) mT__13; 
-- (void) mT__14; 
-- (void) mID; 
-- (void) mINT; 
-- (void) mWS; 
-- (void) mTokens; 
-@end // end of SymbolTableLexer interface
\ No newline at end of file
diff --git a/runtime/ObjC/Framework/examples/scopes/output1/SymbolTableLexer.m b/runtime/ObjC/Framework/examples/scopes/output1/SymbolTableLexer.m
deleted file mode 100644
index baf9292..0000000
--- a/runtime/ObjC/Framework/examples/scopes/output1/SymbolTableLexer.m
+++ /dev/null
@@ -1,712 +0,0 @@
-/** \file
- *  This OBJC source file was generated by $ANTLR version 3.2 Aug 19, 2010 17:16:04
- *
- *     -  From the grammar source file : /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g
- *     -                            On : 2010-08-19 17:16:47
- *     -                 for the lexer : SymbolTableLexerLexer *
- * Editing it, at least manually, is not wise. 
- *
- * C language generator and runtime by Jim Idle, jimi|hereisanat|idle|dotgoeshere|ws.
- *
- *
-*/
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-//
-// 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.
-
-// $ANTLR 3.2 Aug 19, 2010 17:16:04 /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g 2010-08-19 17:16:47
-
-/* -----------------------------------------
- * Include the ANTLR3 generated header file.
- */
-#import "SymbolTableLexer.h"
-/* ----------------------------------------- */
-
-
-/* ============================================================================= */
-
-/* =============================================================================
- * Start of recognizer
- */
-
-#pragma mark Cyclic DFA implementation start DFA4
-@implementation DFA4
-const static NSInteger dfa4_eot[21] =
-    {-1,9,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,9,9,9,17,9,-1,9,20,-1};
-const static NSInteger dfa4_eof[21] =
-    {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
-const static unichar dfa4_min[21] =
-    {10,101,0,0,0,0,0,0,110,0,0,0,116,116,104,97,111,0,100,97,0};
-const static unichar dfa4_max[21] =
-    {125,101,0,0,0,0,0,0,110,0,0,0,116,116,104,122,111,0,100,122,0};
-const static NSInteger dfa4_accept[21] =
-    {-1,-1,2,3,4,5,6,7,-1,9,10,11,-1,-1,-1,-1,-1,8,-1,-1,1};
-const static NSInteger dfa4_special[21] =
-    {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
-const static NSInteger dfa4_transition[] = {};
-const static NSInteger dfa4_transition0[] = {11, -1, -1, 11, -1, -1, -1, 
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 11, -1, -1, 
- -1, -1, -1, -1, -1, 2, 3, -1, -1, -1, -1, -1, -1, 10, 10, 10, 10, 10, 10, 
- 10, 10, 10, 10, -1, 7, -1, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
- -1, -1, -1, -1, -1, -1, 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, 9, 9, 1, 9, 9, 9, 
- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 4, -1, 5};
-const static NSInteger dfa4_transition1[] = {19};
-const static NSInteger dfa4_transition2[] = {16};
-const static NSInteger dfa4_transition3[] = {18};
-const static NSInteger dfa4_transition4[] = {13};
-const static NSInteger dfa4_transition5[] = {15};
-const static NSInteger dfa4_transition6[] = {12};
-const static NSInteger dfa4_transition7[] = {14};
-const static NSInteger dfa4_transition8[] = {9, 9, 9, 9, 9, 9, 9, 9, 9, 
- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9};
-
-
-+ () newDFA4WithRecognizer:(ANTLRBaseRecognizer *)aRecognizer
-{
-    return [[[DFA4 alloc] initWithRecognizer:aRecognizer] retain];
-}
-
-- (id) initWithRecognizer:(ANTLRBaseRecognizer *) theRecognizer
-{
-    if ((self = [super initWithRecognizer:theRecognizer]) != nil) {
-        decisionNumber = 4;
-        eot = dfa4_eot;
-        eof = dfa4_eof;
-        min = dfa4_min;
-        max = dfa4_max;
-        accept = dfa4_accept;
-        special = dfa4_special;
-        if (!(transition = calloc(21, sizeof(void*)))) {
-            [self release];
-            return nil;
-        }
-        len = 21;
-        transition[0] = dfa4_transition0;
-        transition[1] = dfa4_transition6;
-        transition[2] = dfa4_transition;
-        transition[3] = dfa4_transition;
-        transition[4] = dfa4_transition;
-        transition[5] = dfa4_transition;
-        transition[6] = dfa4_transition;
-        transition[7] = dfa4_transition;
-        transition[8] = dfa4_transition4;
-        transition[9] = dfa4_transition;
-        transition[10] = dfa4_transition;
-        transition[11] = dfa4_transition;
-        transition[12] = dfa4_transition7;
-        transition[13] = dfa4_transition5;
-        transition[14] = dfa4_transition2;
-        transition[15] = dfa4_transition8;
-        transition[16] = dfa4_transition3;
-        transition[17] = dfa4_transition;
-        transition[18] = dfa4_transition1;
-        transition[19] = dfa4_transition8;
-        transition[20] = dfa4_transition;
-    }
-    return self;
-}
-
-- (void) dealloc
-{
-    free(transition);
-    [super dealloc];
-}
-
-- (NSString *) description
-{
-    return @"1:1: Tokens : ( T__7 | T__8 | T__9 | T__10 | T__11 | T__12 | T__13 | T__14 | ID | INT | WS );";
-}
-
-
-@end
-#pragma mark Cyclic DFA implementation end DFA4
-
-
-
-/** As per Terence: No returns for lexer rules!
-#pragma mark Rule return scopes start
-#pragma mark Rule return scopes end
-*/
-@implementation SymbolTableLexer // line 330
-
-+ (void) initialize
-{
-    [ANTLRBaseRecognizer setGrammarFileName:@"/usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g"];
-}
-
-+ (NSString *) tokenNameForType:(NSInteger)aTokenType
-{
-    return [[self getTokenNames] objectAtIndex:aTokenType];
-}
-
-+ (SymbolTableLexer *)newSymbolTableLexer:(id<ANTLRCharStream>)anInput
-{
-    return [[SymbolTableLexer alloc] initWithCharStream:anInput];
-}
-
-- (id) initWithCharStream:(id<ANTLRCharStream>)anInput
-{
-    if ((self = [super initWithCharStream:anInput State:[ANTLRRecognizerSharedState newANTLRRecognizerSharedStateWithRuleLen:12+1]]) != nil) {
-
-        dfa4 = [DFA4 newDFA4WithRecognizer:self];
-    }
-    return self;
-}
-
-- (void) dealloc
-{
-    [dfa4 release];
-    [super dealloc];
-}
-
-// Start of actions.lexer.methods
-// start methods()
-
-// Start of Rules
-// $ANTLR start "T__7"
-- (void) mT__7
-{
-    //
-    // ruleScopeSetUp
-
-    @try {
-        NSInteger _type = T__7;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:7:6: ( 'method' ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:7:8: 'method' // alt
-        {
-        [self matchString:@"method"]; 
-          /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-        [state setType:_type];
-
-        state.channel = _channel;
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "T__7"
-
-// $ANTLR start "T__8"
-- (void) mT__8
-{
-    //
-    // ruleScopeSetUp
-
-    @try {
-        NSInteger _type = T__8;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:8:6: ( '(' ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:8:8: '(' // alt
-        {
-        [self matchChar:'(']; 
-          /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-        [state setType:_type];
-
-        state.channel = _channel;
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "T__8"
-
-// $ANTLR start "T__9"
-- (void) mT__9
-{
-    //
-    // ruleScopeSetUp
-
-    @try {
-        NSInteger _type = T__9;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:9:6: ( ')' ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:9:8: ')' // alt
-        {
-        [self matchChar:')']; 
-          /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-        [state setType:_type];
-
-        state.channel = _channel;
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "T__9"
-
-// $ANTLR start "T__10"
-- (void) mT__10
-{
-    //
-    // ruleScopeSetUp
-
-    @try {
-        NSInteger _type = T__10;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:10:7: ( '{' ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:10:9: '{' // alt
-        {
-        [self matchChar:'{']; 
-          /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-        [state setType:_type];
-
-        state.channel = _channel;
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "T__10"
-
-// $ANTLR start "T__11"
-- (void) mT__11
-{
-    //
-    // ruleScopeSetUp
-
-    @try {
-        NSInteger _type = T__11;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:11:7: ( '}' ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:11:9: '}' // alt
-        {
-        [self matchChar:'}']; 
-          /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-        [state setType:_type];
-
-        state.channel = _channel;
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "T__11"
-
-// $ANTLR start "T__12"
-- (void) mT__12
-{
-    //
-    // ruleScopeSetUp
-
-    @try {
-        NSInteger _type = T__12;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:12:7: ( '=' ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:12:9: '=' // alt
-        {
-        [self matchChar:'=']; 
-          /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-        [state setType:_type];
-
-        state.channel = _channel;
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "T__12"
-
-// $ANTLR start "T__13"
-- (void) mT__13
-{
-    //
-    // ruleScopeSetUp
-
-    @try {
-        NSInteger _type = T__13;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:13:7: ( ';' ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:13:9: ';' // alt
-        {
-        [self matchChar:';']; 
-          /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-        [state setType:_type];
-
-        state.channel = _channel;
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "T__13"
-
-// $ANTLR start "T__14"
-- (void) mT__14
-{
-    //
-    // ruleScopeSetUp
-
-    @try {
-        NSInteger _type = T__14;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:14:7: ( 'int' ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:14:9: 'int' // alt
-        {
-        [self matchString:@"int"]; 
-          /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-        [state setType:_type];
-
-        state.channel = _channel;
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "T__14"
-
-// $ANTLR start "ID"
-- (void) mID
-{
-    //
-    // ruleScopeSetUp
-
-    @try {
-        NSInteger _type = ID;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:66:5: ( ( 'a' .. 'z' )+ ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:66:9: ( 'a' .. 'z' )+ // alt
-        {
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:66:9: ( 'a' .. 'z' )+ // positiveClosureBlock
-        NSInteger cnt1=0;
-        do {
-            NSInteger alt1=2;
-            NSInteger LA1_0 = [input LA:1];
-            if ( ((LA1_0>='a' && LA1_0<='z')) ) {
-                alt1=1;
-            }
-
-
-            switch (alt1) {
-                case 1 : ;
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:66:10: 'a' .. 'z' // alt
-                    {
-                    [self matchRangeFromChar:'a' to:'z'];   /* element() */
-                     /* elements */
-                    }
-                    break;
-
-                default :
-                    if ( cnt1 >= 1 )
-                        goto loop1;
-                    ANTLREarlyExitException *eee = [ANTLREarlyExitException exceptionWithStream:input decisionNumber:1];
-                    @throw eee;
-            }
-            cnt1++;
-        } while (YES);
-        loop1: ;
-          /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-        [state setType:_type];
-
-        state.channel = _channel;
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "ID"
-
-// $ANTLR start "INT"
-- (void) mINT
-{
-    //
-    // ruleScopeSetUp
-
-    @try {
-        NSInteger _type = INT;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:69:5: ( ( '0' .. '9' )+ ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:69:9: ( '0' .. '9' )+ // alt
-        {
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:69:9: ( '0' .. '9' )+ // positiveClosureBlock
-        NSInteger cnt2=0;
-        do {
-            NSInteger alt2=2;
-            NSInteger LA2_0 = [input LA:1];
-            if ( ((LA2_0>='0' && LA2_0<='9')) ) {
-                alt2=1;
-            }
-
-
-            switch (alt2) {
-                case 1 : ;
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:69:10: '0' .. '9' // alt
-                    {
-                    [self matchRangeFromChar:'0' to:'9'];   /* element() */
-                     /* elements */
-                    }
-                    break;
-
-                default :
-                    if ( cnt2 >= 1 )
-                        goto loop2;
-                    ANTLREarlyExitException *eee = [ANTLREarlyExitException exceptionWithStream:input decisionNumber:2];
-                    @throw eee;
-            }
-            cnt2++;
-        } while (YES);
-        loop2: ;
-          /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-        [state setType:_type];
-
-        state.channel = _channel;
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "INT"
-
-// $ANTLR start "WS"
-- (void) mWS
-{
-    //
-    // ruleScopeSetUp
-
-    @try {
-        NSInteger _type = WS;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:72:5: ( ( ' ' | '\\n' | '\\r' )+ ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:72:9: ( ' ' | '\\n' | '\\r' )+ // alt
-        {
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:72:9: ( ' ' | '\\n' | '\\r' )+ // positiveClosureBlock
-        NSInteger cnt3=0;
-        do {
-            NSInteger alt3=2;
-            NSInteger LA3_0 = [input LA:1];
-            if ( (LA3_0=='\n'||LA3_0=='\r'||LA3_0==' ') ) {
-                alt3=1;
-            }
-
-
-            switch (alt3) {
-                case 1 : ;
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g: // alt
-                    {
-                    if ([input LA:1] == '\n'||[input LA:1] == '\r'||[input LA:1] == ' ') {
-                        [input consume];
-
-                    } else {
-                        ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException exceptionWithSet:nil stream:input];
-                        [self recover:mse];
-                        @throw mse;}
-                      /* element() */
-                     /* elements */
-                    }
-                    break;
-
-                default :
-                    if ( cnt3 >= 1 )
-                        goto loop3;
-                    ANTLREarlyExitException *eee = [ANTLREarlyExitException exceptionWithStream:input decisionNumber:3];
-                    @throw eee;
-            }
-            cnt3++;
-        } while (YES);
-        loop3: ;
-          /* element() */
-        state.channel=99;  /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-        [state setType:_type];
-
-        state.channel = _channel;
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "WS"
-
-- (void) mTokens
-{
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:1:8: ( T__7 | T__8 | T__9 | T__10 | T__11 | T__12 | T__13 | T__14 | ID | INT | WS ) //ruleblock
-    NSInteger alt4=11;
-    alt4 = [dfa4 predict:input];
-    switch (alt4) {
-        case 1 : ;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:1:10: T__7 // alt
-            {
-                [self mT__7]; 
-              /* element() */
-             /* elements */
-            }
-            break;
-        case 2 : ;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:1:15: T__8 // alt
-            {
-                [self mT__8]; 
-              /* element() */
-             /* elements */
-            }
-            break;
-        case 3 : ;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:1:20: T__9 // alt
-            {
-                [self mT__9]; 
-              /* element() */
-             /* elements */
-            }
-            break;
-        case 4 : ;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:1:25: T__10 // alt
-            {
-                [self mT__10]; 
-              /* element() */
-             /* elements */
-            }
-            break;
-        case 5 : ;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:1:31: T__11 // alt
-            {
-                [self mT__11]; 
-              /* element() */
-             /* elements */
-            }
-            break;
-        case 6 : ;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:1:37: T__12 // alt
-            {
-                [self mT__12]; 
-              /* element() */
-             /* elements */
-            }
-            break;
-        case 7 : ;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:1:43: T__13 // alt
-            {
-                [self mT__13]; 
-              /* element() */
-             /* elements */
-            }
-            break;
-        case 8 : ;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:1:49: T__14 // alt
-            {
-                [self mT__14]; 
-              /* element() */
-             /* elements */
-            }
-            break;
-        case 9 : ;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:1:55: ID // alt
-            {
-                [self mID]; 
-              /* element() */
-             /* elements */
-            }
-            break;
-        case 10 : ;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:1:58: INT // alt
-            {
-                [self mINT]; 
-              /* element() */
-             /* elements */
-            }
-            break;
-        case 11 : ;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:1:62: WS // alt
-            {
-                [self mWS]; 
-              /* element() */
-             /* elements */
-            }
-            break;
-
-    }
-
-}
-
-@end // end of SymbolTableLexer implementation // line 397
-
-/* End of code
- * =============================================================================
- */
diff --git a/runtime/ObjC/Framework/examples/scopes/output1/SymbolTableParser.h b/runtime/ObjC/Framework/examples/scopes/output1/SymbolTableParser.h
deleted file mode 100644
index 6f22956..0000000
--- a/runtime/ObjC/Framework/examples/scopes/output1/SymbolTableParser.h
+++ /dev/null
@@ -1,75 +0,0 @@
-// $ANTLR 3.2 Aug 19, 2010 17:16:04 /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g 2010-08-19 17:16:47
-
-/* =============================================================================
- * Standard antlr3 OBJC runtime definitions
- */
-#import <Cocoa/Cocoa.h>
-#import "antlr3.h"
-/* End of standard antlr3 runtime definitions
- * =============================================================================
- */
-
-#pragma mark Tokens
-#define WS 6
-#define T__12 12
-#define T__11 11
-#define T__14 14
-#define T__13 13
-#define T__10 10
-#define INT 5
-#define ID 4
-#define EOF -1
-#define T__9 9
-#define T__8 8
-#define T__7 7
-#pragma mark Dynamic Global Scopes
-@interface Symbols_Scope : ANTLRSymbolsScope {  /* globalAttributeScopeDecl */
-ANTLRHashMap * names;
-}
-/* start of properties */
-
-@property (retain, getter=getnames, setter=setnames:) ANTLRHashMap * names;
-
-/* end properties */
-
-+ (Symbols_Scope *)newSymbols_Scope;
-/* start of iterated get and set functions */
-
-- (ANTLRHashMap *)getnames;
-- (void)setnames:(ANTLRHashMap *)aVal;
-
-/* End of iterated get and set functions */
-
-@end
-#pragma mark Dynamic Rule Scopes
-#pragma mark Rule Return Scopes start
-#pragma mark Rule return scopes end
-@interface SymbolTableParser : ANTLRParser { // line 529
-// start of globalAttributeScopeMemVar
-/* globalAttributeScopeMemVar */
-ANTLRSymbolStack *gStack;
-Symbols_Scope *Symbols_scope;
-
-// start of action-actionScope-memVars
-
-int level;
-
-// start of ruleAttributeScopeMemVar
-
-
-// Start of memVars
-
- }
-
-// start of action-actionScope-methodsDecl
-
-
-- (void)prog; 
-- (void)globals; 
-- (void)method; 
-- (void)block; 
-- (void)stat; 
-- (void)decl; 
-
-
-@end // end of SymbolTableParser
\ No newline at end of file
diff --git a/runtime/ObjC/Framework/examples/scopes/output1/SymbolTableParser.m b/runtime/ObjC/Framework/examples/scopes/output1/SymbolTableParser.m
deleted file mode 100644
index 100592a..0000000
--- a/runtime/ObjC/Framework/examples/scopes/output1/SymbolTableParser.m
+++ /dev/null
@@ -1,579 +0,0 @@
-/** \file
- *  This OBJC source file was generated by $ANTLR version 3.2 Aug 19, 2010 17:16:04
- *
- *     -  From the grammar source file : /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g
- *     -                            On : 2010-08-19 17:16:47
- *     -                for the parser : SymbolTableParserParser *
- * Editing it, at least manually, is not wise. 
- *
- * C language generator and runtime by Jim Idle, jimi|hereisanat|idle|dotgoeshere|ws.
- *
- *
-*/
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-//
-// 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.
-
-// $ANTLR 3.2 Aug 19, 2010 17:16:04 /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g 2010-08-19 17:16:47
-
-/* -----------------------------------------
- * Include the ANTLR3 generated header file.
- */
-#import "SymbolTableParser.h"
-/* ----------------------------------------- */
-
-
-/* ============================================================================= */
-
-/* =============================================================================
- * Start of recognizer
- */
-
-
-
-#pragma mark Bitsets
-static ANTLRBitSet *FOLLOW_globals_in_prog44;
-
-const unsigned long long FOLLOW_globals_in_prog44_data[] = { 0x0000000000000082LL};
-
-static ANTLRBitSet *FOLLOW_method_in_prog47;
-
-const unsigned long long FOLLOW_method_in_prog47_data[] = { 0x0000000000000082LL};
-
-static ANTLRBitSet *FOLLOW_decl_in_globals79;
-
-const unsigned long long FOLLOW_decl_in_globals79_data[] = { 0x0000000000004002LL};
-
-static ANTLRBitSet *FOLLOW_7_in_method110;
-
-const unsigned long long FOLLOW_7_in_method110_data[] = { 0x0000000000000010LL};
-
-static ANTLRBitSet *FOLLOW_ID_in_method112;
-
-const unsigned long long FOLLOW_ID_in_method112_data[] = { 0x0000000000000100LL};
-
-static ANTLRBitSet *FOLLOW_8_in_method114;
-
-const unsigned long long FOLLOW_8_in_method114_data[] = { 0x0000000000000200LL};
-
-static ANTLRBitSet *FOLLOW_9_in_method116;
-
-const unsigned long long FOLLOW_9_in_method116_data[] = { 0x0000000000000400LL};
-
-static ANTLRBitSet *FOLLOW_block_in_method118;
-
-const unsigned long long FOLLOW_block_in_method118_data[] = { 0x0000000000000002LL};
-
-static ANTLRBitSet *FOLLOW_10_in_block147;
-
-const unsigned long long FOLLOW_10_in_block147_data[] = { 0x0000000000004C10LL};
-
-static ANTLRBitSet *FOLLOW_decl_in_block150;
-
-const unsigned long long FOLLOW_decl_in_block150_data[] = { 0x0000000000004C10LL};
-
-static ANTLRBitSet *FOLLOW_stat_in_block155;
-
-const unsigned long long FOLLOW_stat_in_block155_data[] = { 0x0000000000000C10LL};
-
-static ANTLRBitSet *FOLLOW_11_in_block159;
-
-const unsigned long long FOLLOW_11_in_block159_data[] = { 0x0000000000000002LL};
-
-static ANTLRBitSet *FOLLOW_ID_in_stat183;
-
-const unsigned long long FOLLOW_ID_in_stat183_data[] = { 0x0000000000001000LL};
-
-static ANTLRBitSet *FOLLOW_12_in_stat185;
-
-const unsigned long long FOLLOW_12_in_stat185_data[] = { 0x0000000000000020LL};
-
-static ANTLRBitSet *FOLLOW_INT_in_stat187;
-
-const unsigned long long FOLLOW_INT_in_stat187_data[] = { 0x0000000000002000LL};
-
-static ANTLRBitSet *FOLLOW_13_in_stat189;
-
-const unsigned long long FOLLOW_13_in_stat189_data[] = { 0x0000000000000002LL};
-
-static ANTLRBitSet *FOLLOW_block_in_stat199;
-
-const unsigned long long FOLLOW_block_in_stat199_data[] = { 0x0000000000000002LL};
-
-static ANTLRBitSet *FOLLOW_14_in_decl213;
-
-const unsigned long long FOLLOW_14_in_decl213_data[] = { 0x0000000000000010LL};
-
-static ANTLRBitSet *FOLLOW_ID_in_decl215;
-
-const unsigned long long FOLLOW_ID_in_decl215_data[] = { 0x0000000000002000LL};
-
-static ANTLRBitSet *FOLLOW_13_in_decl217;
-
-const unsigned long long FOLLOW_13_in_decl217_data[] = { 0x0000000000000002LL};
-
-
-
-#pragma mark Dynamic Global Scopes
-@implementation Symbols_Scope  /* globalAttributeScopeImpl */
-/* start of synthesize -- OBJC-Line 1750 */
-
-@synthesize names;
-+ (Symbols_Scope *)newSymbols_Scope
-{
-    return [[[Symbols_Scope alloc] init] retain];
-}
-/* start of iterate get and set functions */
-
-- (ANTLRHashMap *)getnames { return( names ); }
-
-- (void)setnames:(ANTLRHashMap *)aVal { names = aVal; }
-
-
-
-/* End of iterate get and set functions */
-
-@end
-
-#pragma mark Dynamic Rule Scopes
-
-#pragma mark Rule return scopes start
-
-@implementation SymbolTableParser  // line 610
-
-+ (void) initialize
-{
-    FOLLOW_globals_in_prog44 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_globals_in_prog44_data Count:(NSUInteger)1] retain];
-    FOLLOW_method_in_prog47 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_method_in_prog47_data Count:(NSUInteger)1] retain];
-    FOLLOW_decl_in_globals79 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_decl_in_globals79_data Count:(NSUInteger)1] retain];
-    FOLLOW_7_in_method110 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_7_in_method110_data Count:(NSUInteger)1] retain];
-    FOLLOW_ID_in_method112 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_ID_in_method112_data Count:(NSUInteger)1] retain];
-    FOLLOW_8_in_method114 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_8_in_method114_data Count:(NSUInteger)1] retain];
-    FOLLOW_9_in_method116 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_9_in_method116_data Count:(NSUInteger)1] retain];
-    FOLLOW_block_in_method118 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_block_in_method118_data Count:(NSUInteger)1] retain];
-    FOLLOW_10_in_block147 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_10_in_block147_data Count:(NSUInteger)1] retain];
-    FOLLOW_decl_in_block150 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_decl_in_block150_data Count:(NSUInteger)1] retain];
-    FOLLOW_stat_in_block155 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_stat_in_block155_data Count:(NSUInteger)1] retain];
-    FOLLOW_11_in_block159 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_11_in_block159_data Count:(NSUInteger)1] retain];
-    FOLLOW_ID_in_stat183 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_ID_in_stat183_data Count:(NSUInteger)1] retain];
-    FOLLOW_12_in_stat185 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_12_in_stat185_data Count:(NSUInteger)1] retain];
-    FOLLOW_INT_in_stat187 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_INT_in_stat187_data Count:(NSUInteger)1] retain];
-    FOLLOW_13_in_stat189 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_13_in_stat189_data Count:(NSUInteger)1] retain];
-    FOLLOW_block_in_stat199 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_block_in_stat199_data Count:(NSUInteger)1] retain];
-    FOLLOW_14_in_decl213 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_14_in_decl213_data Count:(NSUInteger)1] retain];
-    FOLLOW_ID_in_decl215 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_ID_in_decl215_data Count:(NSUInteger)1] retain];
-    FOLLOW_13_in_decl217 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_13_in_decl217_data Count:(NSUInteger)1] retain];
-
-    [ANTLRBaseRecognizer setTokenNames:[[[NSArray alloc] initWithObjects:@"<invalid>", @"<EOR>", @"<DOWN>", @"<UP>", 
- @"ID", @"INT", @"WS", @"'method'", @"'('", @"')'", @"'{'", @"'}'", @"'='", 
- @"';'", @"'int'", nil] retain]];
-}
-
-+ (SymbolTableParser *)newSymbolTableParser:(id<ANTLRTokenStream>)aStream
-{
-    return [[SymbolTableParser alloc] initWithTokenStream:aStream];
-
-}
-
-- (id) initWithTokenStream:(id<ANTLRTokenStream>)aStream
-{
-    if ((self = [super initWithTokenStream:aStream State:[[ANTLRRecognizerSharedState newANTLRRecognizerSharedStateWithRuleLen:6+1] retain]]) != nil) {
-
-
-        (Symbols_Scope *)Symbols_scope = [Symbols_Scope newSymbols_Scope];
-                                                        
-        // start of actions-actionScope-init
-
-        level = 0;
-
-        // start of init
-    }
-    return self;
-}
-
-- (void) dealloc
-{
-    [Symbols_scope release];
-    [super dealloc];
-}
-// start actions.actionScope.methods
-// start methods()
-// start rules
-/*
- * $ANTLR start prog
- * /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:25:1: prog : globals ( method )* ;
- */
-- (void) prog
-{
-    // ruleScopeSetUp
-
-    @try {
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:25:5: ( globals ( method )* ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:25:9: globals ( method )* // alt
-        {
-        [self pushFollow:FOLLOW_globals_in_prog44];
-        [self globals];
-        [self popFollow];
-
-          /* element() */
-        do {
-            NSInteger alt1=2;
-            NSInteger LA1_0 = [input LA:1];
-            if ( (LA1_0==7) ) {
-                alt1=1;
-            }
-
-
-            switch (alt1) {
-                case 1 : ;
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:25:18: method // alt
-                    {
-                    [self pushFollow:FOLLOW_method_in_prog47];
-                    [self method];
-                    [self popFollow];
-
-                      /* element() */
-                     /* elements */
-                    }
-                    break;
-
-                default :
-                    goto loop1;
-            }
-        } while (YES);
-        loop1: ;
-          /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-    }
-    @catch (ANTLRRecognitionException *re) {
-        [self reportError:re];
-        [self recover:input Exception:re];
-    }    @finally {
-    }
-    return ;
-}
-/* $ANTLR end prog */
-/*
- * $ANTLR start globals
- * /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:28:1: globals : ( decl )* ;
- */
-- (void) globals
-{
-    // ruleScopeSetUp
-    gStack = [ANTLRSymbolStack newANTLRSymbolStackWithLen:30];
-    Symbols_scope = [[Symbols_Scope newSymbols_Scope] retain];
-    [gStack push:Symbols_scope];
-
-
-        level++;
-        /* scopeSetAttributeRef */
-    ((Symbols_Scope *)[gStack peek]).names =  [ANTLRHashMap newANTLRHashMapWithLen:101];
-
-    @try {
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:34:5: ( ( decl )* ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:34:9: ( decl )* // alt
-        {
-        do {
-            NSInteger alt2=2;
-            NSInteger LA2_0 = [input LA:1];
-            if ( (LA2_0==14) ) {
-                alt2=1;
-            }
-
-
-            switch (alt2) {
-                case 1 : ;
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:34:10: decl // alt
-                    {
-                    [self pushFollow:FOLLOW_decl_in_globals79];
-                    [self decl];
-                    [self popFollow];
-
-                      /* element() */
-                     /* elements */
-                    }
-                    break;
-
-                default :
-                    goto loop2;
-            }
-        } while (YES);
-        loop2: ;
-          /* element() */
-
-                NSLog(@"globals: %@", /* scopeAttributeRef */
-        ((Symbols_Scope *)[gStack peek]).names);
-                level--;
-                  /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-    }
-    @catch (ANTLRRecognitionException *re) {
-        [self reportError:re];
-        [self recover:input Exception:re];
-    }    @finally {
-        [gStack pop];
-
-    }
-    return ;
-}
-/* $ANTLR end globals */
-/*
- * $ANTLR start method
- * /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:41:1: method : 'method' ID '(' ')' block ;
- */
-- (void) method
-{
-    // ruleScopeSetUp
-
-    @try {
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:42:5: ( 'method' ID '(' ')' block ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:42:9: 'method' ID '(' ')' block // alt
-        {
-        [self match:input TokenType:7 Follow:FOLLOW_7_in_method110];   /* element() */
-        [self match:input TokenType:ID Follow:FOLLOW_ID_in_method112];   /* element() */
-        [self match:input TokenType:8 Follow:FOLLOW_8_in_method114];   /* element() */
-        [self match:input TokenType:9 Follow:FOLLOW_9_in_method116];   /* element() */
-        [self pushFollow:FOLLOW_block_in_method118];
-        [self block];
-        [self popFollow];
-
-          /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-    }
-    @catch (ANTLRRecognitionException *re) {
-        [self reportError:re];
-        [self recover:input Exception:re];
-    }    @finally {
-    }
-    return ;
-}
-/* $ANTLR end method */
-/*
- * $ANTLR start block
- * /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:45:1: block : '{' ( decl )* ( stat )* '}' ;
- */
-- (void) block
-{
-    // ruleScopeSetUp
-    gStack = [ANTLRSymbolStack newANTLRSymbolStackWithLen:30];
-    Symbols_scope = [[Symbols_Scope newSymbols_Scope] retain];
-    [gStack push:Symbols_scope];
-
-
-        level++;
-        /* scopeSetAttributeRef */
-    ((Symbols_Scope *)[gStack peek]).names =  [ANTLRHashMap newANTLRHashMapWithLen:101];
-
-    @try {
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:51:5: ( '{' ( decl )* ( stat )* '}' ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:51:9: '{' ( decl )* ( stat )* '}' // alt
-        {
-        [self match:input TokenType:10 Follow:FOLLOW_10_in_block147];   /* element() */
-        do {
-            NSInteger alt3=2;
-            NSInteger LA3_0 = [input LA:1];
-            if ( (LA3_0==14) ) {
-                alt3=1;
-            }
-
-
-            switch (alt3) {
-                case 1 : ;
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:51:14: decl // alt
-                    {
-                    [self pushFollow:FOLLOW_decl_in_block150];
-                    [self decl];
-                    [self popFollow];
-
-                      /* element() */
-                     /* elements */
-                    }
-                    break;
-
-                default :
-                    goto loop3;
-            }
-        } while (YES);
-        loop3: ;
-          /* element() */
-        do {
-            NSInteger alt4=2;
-            NSInteger LA4_0 = [input LA:1];
-            if ( (LA4_0==ID||LA4_0==10) ) {
-                alt4=1;
-            }
-
-
-            switch (alt4) {
-                case 1 : ;
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:51:22: stat // alt
-                    {
-                    [self pushFollow:FOLLOW_stat_in_block155];
-                    [self stat];
-                    [self popFollow];
-
-                      /* element() */
-                     /* elements */
-                    }
-                    break;
-
-                default :
-                    goto loop4;
-            }
-        } while (YES);
-        loop4: ;
-          /* element() */
-        [self match:input TokenType:11 Follow:FOLLOW_11_in_block159];   /* element() */
-
-                NSLog(@"level %d symbols: %@", level, /* scopeAttributeRef */
-        ((Symbols_Scope *)[gStack peek]).names);
-                level--;
-                  /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-    }
-    @catch (ANTLRRecognitionException *re) {
-        [self reportError:re];
-        [self recover:input Exception:re];
-    }    @finally {
-        [gStack pop];
-
-    }
-    return ;
-}
-/* $ANTLR end block */
-/*
- * $ANTLR start stat
- * /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:58:1: stat : ( ID '=' INT ';' | block );
- */
-- (void) stat
-{
-    // ruleScopeSetUp
-
-    @try {
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:58:5: ( ID '=' INT ';' | block ) //ruleblock
-        NSInteger alt5=2;
-        NSInteger LA5_0 = [input LA:1];
-
-        if ( (LA5_0==ID) ) {
-            alt5=1;
-        }
-        else if ( (LA5_0==10) ) {
-            alt5=2;
-        }
-        else {
-            ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newANTLRNoViableAltException:5 state:0 stream:input];
-            @throw nvae;
-        }
-        switch (alt5) {
-            case 1 : ;
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:58:9: ID '=' INT ';' // alt
-                {
-                [self match:input TokenType:ID Follow:FOLLOW_ID_in_stat183];   /* element() */
-                [self match:input TokenType:12 Follow:FOLLOW_12_in_stat185];   /* element() */
-                [self match:input TokenType:INT Follow:FOLLOW_INT_in_stat187];   /* element() */
-                [self match:input TokenType:13 Follow:FOLLOW_13_in_stat189];   /* element() */
-                 /* elements */
-                }
-                break;
-            case 2 : ;
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:59:9: block // alt
-                {
-                [self pushFollow:FOLLOW_block_in_stat199];
-                [self block];
-                [self popFollow];
-
-                  /* element() */
-                 /* elements */
-                }
-                break;
-
-        }
-        // token+rule list labels
-
-    }
-    @catch (ANTLRRecognitionException *re) {
-        [self reportError:re];
-        [self recover:input Exception:re];
-    }    @finally {
-    }
-    return ;
-}
-/* $ANTLR end stat */
-/*
- * $ANTLR start decl
- * /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:62:1: decl : 'int' ID ';' ;
- */
-- (void) decl
-{
-    // ruleScopeSetUp
-
-    @try {
-        id<ANTLRToken> ID1 = nil;
-
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:62:5: ( 'int' ID ';' ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/scopes/SymbolTable.g:62:9: 'int' ID ';' // alt
-        {
-        [self match:input TokenType:14 Follow:FOLLOW_14_in_decl213];   /* element() */
-        ID1=(id<ANTLRToken>)[self match:input TokenType:ID Follow:FOLLOW_ID_in_decl215];   /* element() */
-        [self match:input TokenType:13 Follow:FOLLOW_13_in_decl217];   /* element() */
-        [/* scopeAttributeRef */
-        ((Symbols_Scope *)[gStack peek]).names addObject:ID1];  /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-    }
-    @catch (ANTLRRecognitionException *re) {
-        [self reportError:re];
-        [self recover:input Exception:re];
-    }    @finally {
-    }
-    return ;
-}
-/* $ANTLR end decl */
-
-@end // end of SymbolTableParser implementation line 669
-
-/* End of code
- * =============================================================================
- */
diff --git a/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCLexer.h b/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCLexer.h
index 6c33456..e9e2d2a 100644
--- a/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCLexer.h
+++ b/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCLexer.h
@@ -1,9 +1,9 @@
-// $ANTLR ${project.version} ${buildNumber} SimpleC.g 2011-05-06 15:09:17
+// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g 2012-02-16 17:40:52
 
 /* =============================================================================
- * Standard antlr3 OBJC runtime definitions
+ * Standard antlr OBJC runtime definitions
  */
-#import <Cocoa/Cocoa.h>
+#import <Foundation/Foundation.h>
 #import <ANTLR/ANTLR.h>
 /* End of standard antlr3 runtime definitions
  * =============================================================================
@@ -11,8 +11,8 @@
 
 /* Start cyclicDFAInterface */
 
-#pragma mark Rule return scopes start
-#pragma mark Rule return scopes end
+#pragma mark Rule return scopes Interface start
+#pragma mark Rule return scopes Interface end
 #pragma mark Tokens
 #ifdef EOF
 #undef EOF
@@ -42,12 +42,12 @@
 #define VAR_DEF 25
 #define WS 26
 /* interface lexer class */
-@interface SimpleCLexer : ANTLRLexer { // line 283
+@interface SimpleCLexer : Lexer { // line 283
 /* ObjC start of actions.lexer.memVars */
 /* ObjC end of actions.lexer.memVars */
 }
 + (void) initialize;
-+ (SimpleCLexer *)newSimpleCLexerWithCharStream:(id<ANTLRCharStream>)anInput;
++ (SimpleCLexer *)newSimpleCLexerWithCharStream:(id<CharStream>)anInput;
 /* ObjC start actions.lexer.methodsDecl */
 /* ObjC end actions.lexer.methodsDecl */
 - (void) mK_FOR ; 
diff --git a/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCLexer.java b/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCLexer.java
index 58cff4e..e8e76fa 100644
--- a/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCLexer.java
+++ b/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCLexer.java
@@ -1,4 +1,4 @@
-// $ANTLR 3.2 Aug 13, 2010 14:19:31 SimpleC.g 2010-08-13 14:29:19
+// $ANTLR 3.2 Aug 13, 2010 19:41:25 /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g 2010-08-13 19:42:18
 
 import org.antlr.runtime.*;
 import java.util.Stack;
@@ -42,15 +42,15 @@
         super(input,state);
 
     }
-    public String getGrammarFileName() { return "SimpleC.g"; }
+    public String getGrammarFileName() { return "/usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g"; }
 
     // $ANTLR start "T__21"
     public final void mT__21() throws RecognitionException {
         try {
             int _type = T__21;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // SimpleC.g:7:7: ( ';' )
-            // SimpleC.g:7:9: ';'
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:7:7: ( ';' )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:7:9: ';'
             {
             match(';'); 
 
@@ -69,8 +69,8 @@
         try {
             int _type = T__22;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // SimpleC.g:8:7: ( '(' )
-            // SimpleC.g:8:9: '('
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:8:7: ( '(' )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:8:9: '('
             {
             match('('); 
 
@@ -89,8 +89,8 @@
         try {
             int _type = T__23;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // SimpleC.g:9:7: ( ',' )
-            // SimpleC.g:9:9: ','
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:9:7: ( ',' )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:9:9: ','
             {
             match(','); 
 
@@ -109,8 +109,8 @@
         try {
             int _type = T__24;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // SimpleC.g:10:7: ( ')' )
-            // SimpleC.g:10:9: ')'
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:10:7: ( ')' )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:10:9: ')'
             {
             match(')'); 
 
@@ -129,8 +129,8 @@
         try {
             int _type = T__25;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // SimpleC.g:11:7: ( '{' )
-            // SimpleC.g:11:9: '{'
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:11:7: ( '{' )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:11:9: '{'
             {
             match('{'); 
 
@@ -149,8 +149,8 @@
         try {
             int _type = T__26;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // SimpleC.g:12:7: ( '}' )
-            // SimpleC.g:12:9: '}'
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:12:7: ( '}' )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:12:9: '}'
             {
             match('}'); 
 
@@ -169,8 +169,8 @@
         try {
             int _type = FOR;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // SimpleC.g:91:5: ( 'for' )
-            // SimpleC.g:91:7: 'for'
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:91:5: ( 'for' )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:91:7: 'for'
             {
             match("for"); 
 
@@ -190,8 +190,8 @@
         try {
             int _type = INT_TYPE;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // SimpleC.g:92:10: ( 'int' )
-            // SimpleC.g:92:12: 'int'
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:92:10: ( 'int' )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:92:12: 'int'
             {
             match("int"); 
 
@@ -211,8 +211,8 @@
         try {
             int _type = CHAR;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // SimpleC.g:93:5: ( 'char' )
-            // SimpleC.g:93:7: 'char'
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:93:5: ( 'char' )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:93:7: 'char'
             {
             match("char"); 
 
@@ -232,8 +232,8 @@
         try {
             int _type = VOID;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // SimpleC.g:94:5: ( 'void' )
-            // SimpleC.g:94:7: 'void'
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:94:5: ( 'void' )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:94:7: 'void'
             {
             match("void"); 
 
@@ -253,8 +253,8 @@
         try {
             int _type = ID;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // SimpleC.g:96:5: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' )* )
-            // SimpleC.g:96:9: ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' )*
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:96:5: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' )* )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:96:9: ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' )*
             {
             if ( (input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
                 input.consume();
@@ -265,7 +265,7 @@
                 recover(mse);
                 throw mse;}
 
-            // SimpleC.g:96:33: ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' )*
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:96:33: ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' )*
             loop1:
             do {
                 int alt1=2;
@@ -278,7 +278,7 @@
 
                 switch (alt1) {
             	case 1 :
-            	    // SimpleC.g:
+            	    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:
             	    {
             	    if ( (input.LA(1)>='0' && input.LA(1)<='9')||(input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
             	        input.consume();
@@ -316,10 +316,10 @@
             int _channel = DEFAULT_TOKEN_CHANNEL;
             CommonToken int=null;
             List list_int=null;
-            // SimpleC.g:99:5: ( (int+= ( '0' .. '9' ) )+ )
-            // SimpleC.g:99:7: (int+= ( '0' .. '9' ) )+
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:99:5: ( (int+= ( '0' .. '9' ) )+ )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:99:7: (int+= ( '0' .. '9' ) )+
             {
-            // SimpleC.g:99:10: (int+= ( '0' .. '9' ) )+
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:99:10: (int+= ( '0' .. '9' ) )+
             int cnt2=0;
             loop2:
             do {
@@ -333,10 +333,10 @@
 
                 switch (alt2) {
             	case 1 :
-            	    // SimpleC.g:99:10: int+= ( '0' .. '9' )
+            	    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:99:10: int+= ( '0' .. '9' )
             	    {
-            	    // SimpleC.g:99:12: ( '0' .. '9' )
-            	    // SimpleC.g:99:13: '0' .. '9'
+            	    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:99:12: ( '0' .. '9' )
+            	    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:99:13: '0' .. '9'
             	    {
             	    matchRange('0','9'); 
 
@@ -372,8 +372,8 @@
         try {
             int _type = EQ;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // SimpleC.g:102:6: ( '=' )
-            // SimpleC.g:102:8: '='
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:102:6: ( '=' )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:102:8: '='
             {
             match('='); 
 
@@ -392,8 +392,8 @@
         try {
             int _type = EQEQ;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // SimpleC.g:103:6: ( '==' )
-            // SimpleC.g:103:8: '=='
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:103:6: ( '==' )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:103:8: '=='
             {
             match("=="); 
 
@@ -413,8 +413,8 @@
         try {
             int _type = LT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // SimpleC.g:104:6: ( '<' )
-            // SimpleC.g:104:8: '<'
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:104:6: ( '<' )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:104:8: '<'
             {
             match('<'); 
 
@@ -433,8 +433,8 @@
         try {
             int _type = PLUS;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // SimpleC.g:105:6: ( '+' )
-            // SimpleC.g:105:8: '+'
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:105:6: ( '+' )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:105:8: '+'
             {
             match('+'); 
 
@@ -453,10 +453,10 @@
         try {
             int _type = WS;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // SimpleC.g:107:5: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
-            // SimpleC.g:107:9: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:107:5: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:107:9: ( ' ' | '\\t' | '\\r' | '\\n' )+
             {
-            // SimpleC.g:107:9: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:107:9: ( ' ' | '\\t' | '\\r' | '\\n' )+
             int cnt3=0;
             loop3:
             do {
@@ -470,7 +470,7 @@
 
                 switch (alt3) {
             	case 1 :
-            	    // SimpleC.g:
+            	    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:
             	    {
             	    if ( (input.LA(1)>='\t' && input.LA(1)<='\n')||input.LA(1)=='\r'||input.LA(1)==' ' ) {
             	        input.consume();
@@ -507,124 +507,124 @@
     // $ANTLR end "WS"
 
     public void mTokens() throws RecognitionException {
-        // SimpleC.g:1:8: ( T__21 | T__22 | T__23 | T__24 | T__25 | T__26 | FOR | INT_TYPE | CHAR | VOID | ID | INT | EQ | EQEQ | LT | PLUS | WS )
+        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:8: ( T__21 | T__22 | T__23 | T__24 | T__25 | T__26 | FOR | INT_TYPE | CHAR | VOID | ID | INT | EQ | EQEQ | LT | PLUS | WS )
         int alt4=17;
         alt4 = dfa4.predict(input);
         switch (alt4) {
             case 1 :
-                // SimpleC.g:1:10: T__21
+                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:10: T__21
                 {
                 mT__21(); 
 
                 }
                 break;
             case 2 :
-                // SimpleC.g:1:16: T__22
+                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:16: T__22
                 {
                 mT__22(); 
 
                 }
                 break;
             case 3 :
-                // SimpleC.g:1:22: T__23
+                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:22: T__23
                 {
                 mT__23(); 
 
                 }
                 break;
             case 4 :
-                // SimpleC.g:1:28: T__24
+                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:28: T__24
                 {
                 mT__24(); 
 
                 }
                 break;
             case 5 :
-                // SimpleC.g:1:34: T__25
+                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:34: T__25
                 {
                 mT__25(); 
 
                 }
                 break;
             case 6 :
-                // SimpleC.g:1:40: T__26
+                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:40: T__26
                 {
                 mT__26(); 
 
                 }
                 break;
             case 7 :
-                // SimpleC.g:1:46: FOR
+                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:46: FOR
                 {
                 mFOR(); 
 
                 }
                 break;
             case 8 :
-                // SimpleC.g:1:50: INT_TYPE
+                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:50: INT_TYPE
                 {
                 mINT_TYPE(); 
 
                 }
                 break;
             case 9 :
-                // SimpleC.g:1:59: CHAR
+                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:59: CHAR
                 {
                 mCHAR(); 
 
                 }
                 break;
             case 10 :
-                // SimpleC.g:1:64: VOID
+                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:64: VOID
                 {
                 mVOID(); 
 
                 }
                 break;
             case 11 :
-                // SimpleC.g:1:69: ID
+                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:69: ID
                 {
                 mID(); 
 
                 }
                 break;
             case 12 :
-                // SimpleC.g:1:72: INT
+                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:72: INT
                 {
                 mINT(); 
 
                 }
                 break;
             case 13 :
-                // SimpleC.g:1:76: EQ
+                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:76: EQ
                 {
                 mEQ(); 
 
                 }
                 break;
             case 14 :
-                // SimpleC.g:1:79: EQEQ
+                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:79: EQEQ
                 {
                 mEQEQ(); 
 
                 }
                 break;
             case 15 :
-                // SimpleC.g:1:84: LT
+                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:84: LT
                 {
                 mLT(); 
 
                 }
                 break;
             case 16 :
-                // SimpleC.g:1:87: PLUS
+                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:87: PLUS
                 {
                 mPLUS(); 
 
                 }
                 break;
             case 17 :
-                // SimpleC.g:1:92: WS
+                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:92: WS
                 {
                 mWS(); 
 
diff --git a/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCLexer.m b/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCLexer.m
index ce506e1..3f20dff 100644
--- a/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCLexer.m
+++ b/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCLexer.m
@@ -1,8 +1,8 @@
 /** \file
- *  This OBJC source file was generated by $ANTLR version ${project.version} ${buildNumber}
+ *  This OBJC source file was generated by $ANTLR version 3.4
  *
- *     -  From the grammar source file : SimpleC.g
- *     -                            On : 2011-05-06 15:09:17
+ *     -  From the grammar source file : /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g
+ *     -                            On : 2012-02-16 17:40:52
  *     -                 for the lexer : SimpleCLexerLexer
  *
  * Editing it, at least manually, is not wise.
@@ -11,7 +11,7 @@
  *
  *
 */
-// $ANTLR ${project.version} ${buildNumber} SimpleC.g 2011-05-06 15:09:17
+// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g 2012-02-16 17:40:52
 
 
 /* -----------------------------------------
@@ -31,7 +31,7 @@
 
 + (void) initialize
 {
-    [ANTLRBaseRecognizer setGrammarFileName:@"SimpleC.g"];
+    [BaseRecognizer setGrammarFileName:@"/Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g"];
 }
 
 + (NSString *) tokenNameForType:(NSInteger)aTokenType
@@ -39,14 +39,14 @@
     return [[self getTokenNames] objectAtIndex:aTokenType];
 }
 
-+ (SimpleCLexer *)newSimpleCLexerWithCharStream:(id<ANTLRCharStream>)anInput
++ (SimpleCLexer *)newSimpleCLexerWithCharStream:(id<CharStream>)anInput
 {
     return [[SimpleCLexer alloc] initWithCharStream:anInput];
 }
 
-- (id) initWithCharStream:(id<ANTLRCharStream>)anInput
+- (id) initWithCharStream:(id<CharStream>)anInput
 {
-    self = [super initWithCharStream:anInput State:[[ANTLRRecognizerSharedState newANTLRRecognizerSharedStateWithRuleLen:18+1] retain]];
+    self = [super initWithCharStream:anInput State:[RecognizerSharedState newRecognizerSharedStateWithRuleLen:18+1]];
     if ( self != nil ) {
     }
     return self;
@@ -67,155 +67,166 @@
 - (void) mK_FOR
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = K_FOR;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // SimpleC.g:91:7: ( 'for' ) // ruleBlockSingleAlt
-        // SimpleC.g:91:9: 'for' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:91:7: ( 'for' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:91:9: 'for' // alt
         {
+
+
         [self matchString:@"for"]; 
 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "K_FOR" */
-
 // $ANTLR start "K_CHAR"
 - (void) mK_CHAR
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = K_CHAR;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // SimpleC.g:92:7: ( 'char' ) // ruleBlockSingleAlt
-        // SimpleC.g:92:9: 'char' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:92:7: ( 'char' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:92:9: 'char' // alt
         {
+
+
         [self matchString:@"char"]; 
 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "K_CHAR" */
-
 // $ANTLR start "K_INT_TYPE"
 - (void) mK_INT_TYPE
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = K_INT_TYPE;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // SimpleC.g:93:12: ( 'int' ) // ruleBlockSingleAlt
-        // SimpleC.g:93:14: 'int' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:93:12: ( 'int' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:93:14: 'int' // alt
         {
+
+
         [self matchString:@"int"]; 
 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "K_INT_TYPE" */
-
 // $ANTLR start "K_VOID"
 - (void) mK_VOID
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = K_VOID;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // SimpleC.g:94:7: ( 'void' ) // ruleBlockSingleAlt
-        // SimpleC.g:94:9: 'void' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:94:7: ( 'void' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:94:9: 'void' // alt
         {
+
+
         [self matchString:@"void"]; 
 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "K_VOID" */
-
 // $ANTLR start "K_ID"
 - (void) mK_ID
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = K_ID;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // SimpleC.g:96:7: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' )* ) // ruleBlockSingleAlt
-        // SimpleC.g:96:11: ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' )* // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:96:7: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' )* ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:96:11: ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' )* // alt
         {
+
         if ((([input LA:1] >= 'A') && ([input LA:1] <= 'Z'))||[input LA:1] == '_'||(([input LA:1] >= 'a') && ([input LA:1] <= 'z'))) {
             [input consume];
         } else {
-            ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException newException:nil stream:input];
+            MismatchedSetException *mse = [MismatchedSetException newException:nil stream:input];
             [self recover:mse];
             @throw mse;
         }
 
+         
 
         do {
             NSInteger alt1=2;
@@ -227,17 +238,18 @@
 
             switch (alt1) {
                 case 1 : ;
-                    // SimpleC.g: // alt
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g: // alt
                     {
+
                     if ((([input LA:1] >= '0') && ([input LA:1] <= '9'))||(([input LA:1] >= 'A') && ([input LA:1] <= 'Z'))||[input LA:1] == '_'||(([input LA:1] >= 'a') && ([input LA:1] <= 'z'))) {
                         [input consume];
                     } else {
-                        ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException newException:nil stream:input];
+                        MismatchedSetException *mse = [MismatchedSetException newException:nil stream:input];
                         [self recover:mse];
                         @throw mse;
                     }
 
-
+                     
                     }
                     break;
 
@@ -247,39 +259,40 @@
         } while (YES);
         loop1: ;
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "K_ID" */
-
 // $ANTLR start "K_INT"
 - (void) mK_INT
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = K_INT;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        ANTLRCommonToken *anInt=nil;
+        NSInteger _channel = TokenChannelDefault;
+        CommonToken *anInt=nil;
         AMutableArray *list_anInt=nil; 
-        // SimpleC.g:99:7: ( (anInt+= ( '0' .. '9' ) )+ ) // ruleBlockSingleAlt
-        // SimpleC.g:99:9: (anInt+= ( '0' .. '9' ) )+ // alt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:99:7: ( (anInt+= ( '0' .. '9' ) )+ ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:99:9: (anInt+= ( '0' .. '9' ) )+ // alt
         {
-        // SimpleC.g:99:14: (anInt+= ( '0' .. '9' ) )+ // positiveClosureBlock
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:99:14: (anInt+= ( '0' .. '9' ) )+ // positiveClosureBlock
         NSInteger cnt2 = 0;
         do {
             NSInteger alt2 = 2;
@@ -291,41 +304,44 @@
 
             switch (alt2) {
                 case 1 : ;
-                    // SimpleC.g:99:14: anInt+= ( '0' .. '9' ) // alt
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:99:14: anInt+= ( '0' .. '9' ) // alt
                     {
+
+
                     anInt = [input LA:1];
 
                     if ((([input LA:1] >= '0') && ([input LA:1] <= '9'))) {
                         [input consume];
                     } else {
-                        ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException newException:nil stream:input];
+                        MismatchedSetException *mse = [MismatchedSetException newException:nil stream:input];
                         mse.c = anInt;
                         [self recover:mse];
                         @throw mse;
                     }
 
-
+                     
                     }
                     break;
 
                 default :
                     if ( cnt2 >= 1 )
                         goto loop2;
-                    ANTLREarlyExitException *eee =
-                        [ANTLREarlyExitException newException:input decisionNumber:2];
+                    EarlyExitException *eee =
+                        [EarlyExitException newException:input decisionNumber:2];
                     @throw eee;
             }
             cnt2++;
         } while (YES);
         loop2: ;
 
+         
 
         NSLog(@"%@", list_anInt);
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
         [list_anInt release];
 
         state.type = _type;
@@ -333,348 +349,369 @@
     }
     @finally {
         //
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "K_INT" */
-
 // $ANTLR start "K_LCURVE"
 - (void) mK_LCURVE
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = K_LCURVE;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // SimpleC.g:102:10: ( '(' ) // ruleBlockSingleAlt
-        // SimpleC.g:102:12: '(' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:102:10: ( '(' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:102:12: '(' // alt
         {
+
+
         [self matchChar:'(']; 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "K_LCURVE" */
-
 // $ANTLR start "K_RCURVE"
 - (void) mK_RCURVE
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = K_RCURVE;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // SimpleC.g:103:10: ( ')' ) // ruleBlockSingleAlt
-        // SimpleC.g:103:12: ')' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:103:10: ( ')' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:103:12: ')' // alt
         {
+
+
         [self matchChar:')']; 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "K_RCURVE" */
-
 // $ANTLR start "K_PLUS"
 - (void) mK_PLUS
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = K_PLUS;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // SimpleC.g:104:8: ( '+' ) // ruleBlockSingleAlt
-        // SimpleC.g:104:10: '+' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:104:8: ( '+' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:104:10: '+' // alt
         {
+
+
         [self matchChar:'+']; 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "K_PLUS" */
-
 // $ANTLR start "K_COMMA"
 - (void) mK_COMMA
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = K_COMMA;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // SimpleC.g:105:9: ( ',' ) // ruleBlockSingleAlt
-        // SimpleC.g:105:11: ',' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:105:9: ( ',' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:105:11: ',' // alt
         {
+
+
         [self matchChar:',']; 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "K_COMMA" */
-
 // $ANTLR start "K_SEMICOLON"
 - (void) mK_SEMICOLON
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = K_SEMICOLON;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // SimpleC.g:106:13: ( ';' ) // ruleBlockSingleAlt
-        // SimpleC.g:106:15: ';' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:106:13: ( ';' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:106:15: ';' // alt
         {
+
+
         [self matchChar:';']; 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "K_SEMICOLON" */
-
 // $ANTLR start "K_LT"
 - (void) mK_LT
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = K_LT;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // SimpleC.g:107:8: ( '<' ) // ruleBlockSingleAlt
-        // SimpleC.g:107:10: '<' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:107:8: ( '<' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:107:10: '<' // alt
         {
+
+
         [self matchChar:'<']; 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "K_LT" */
-
 // $ANTLR start "K_EQ"
 - (void) mK_EQ
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = K_EQ;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // SimpleC.g:108:8: ( '=' ) // ruleBlockSingleAlt
-        // SimpleC.g:108:10: '=' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:108:8: ( '=' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:108:10: '=' // alt
         {
+
+
         [self matchChar:'=']; 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "K_EQ" */
-
 // $ANTLR start "K_EQEQ"
 - (void) mK_EQEQ
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = K_EQEQ;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // SimpleC.g:109:8: ( '==' ) // ruleBlockSingleAlt
-        // SimpleC.g:109:10: '==' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:109:8: ( '==' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:109:10: '==' // alt
         {
+
+
         [self matchString:@"=="]; 
 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "K_EQEQ" */
-
 // $ANTLR start "K_LCURLY"
 - (void) mK_LCURLY
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = K_LCURLY;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // SimpleC.g:110:10: ( '{' ) // ruleBlockSingleAlt
-        // SimpleC.g:110:12: '{' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:110:10: ( '{' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:110:12: '{' // alt
         {
+
+
         [self matchChar:'{']; 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "K_LCURLY" */
-
 // $ANTLR start "K_RCURLY"
 - (void) mK_RCURLY
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = K_RCURLY;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // SimpleC.g:111:10: ( '}' ) // ruleBlockSingleAlt
-        // SimpleC.g:111:12: '}' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:111:10: ( '}' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:111:12: '}' // alt
         {
+
+
         [self matchChar:'}']; 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "K_RCURLY" */
-
 // $ANTLR start "WS"
 - (void) mWS
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = WS;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // SimpleC.g:113:5: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ ) // ruleBlockSingleAlt
-        // SimpleC.g:113:9: ( ' ' | '\\t' | '\\r' | '\\n' )+ // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:113:5: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:113:9: ( ' ' | '\\t' | '\\r' | '\\n' )+ // alt
         {
-        // SimpleC.g:113:9: ( ' ' | '\\t' | '\\r' | '\\n' )+ // positiveClosureBlock
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:113:9: ( ' ' | '\\t' | '\\r' | '\\n' )+ // positiveClosureBlock
         NSInteger cnt3 = 0;
         do {
             NSInteger alt3 = 2;
@@ -686,54 +723,55 @@
 
             switch (alt3) {
                 case 1 : ;
-                    // SimpleC.g: // alt
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g: // alt
                     {
+
                     if ((([input LA:1] >= '\t') && ([input LA:1] <= '\n'))||[input LA:1] == '\r'||[input LA:1] == ' ') {
                         [input consume];
                     } else {
-                        ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException newException:nil stream:input];
+                        MismatchedSetException *mse = [MismatchedSetException newException:nil stream:input];
                         [self recover:mse];
                         @throw mse;
                     }
 
-
+                     
                     }
                     break;
 
                 default :
                     if ( cnt3 >= 1 )
                         goto loop3;
-                    ANTLREarlyExitException *eee =
-                        [ANTLREarlyExitException newException:input decisionNumber:3];
+                    EarlyExitException *eee =
+                        [EarlyExitException newException:input decisionNumber:3];
                     @throw eee;
             }
             cnt3++;
         } while (YES);
         loop3: ;
 
+         
 
          _channel=HIDDEN; 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "WS" */
-
 - (void) mTokens
 {
-    // SimpleC.g:1:8: ( K_FOR | K_CHAR | K_INT_TYPE | K_VOID | K_ID | K_INT | K_LCURVE | K_RCURVE | K_PLUS | K_COMMA | K_SEMICOLON | K_LT | K_EQ | K_EQEQ | K_LCURLY | K_RCURLY | WS ) //ruleblock
+    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:1:8: ( K_FOR | K_CHAR | K_INT_TYPE | K_VOID | K_ID | K_INT | K_LCURVE | K_RCURVE | K_PLUS | K_COMMA | K_SEMICOLON | K_LT | K_EQ | K_EQEQ | K_LCURLY | K_RCURLY | WS ) //ruleblock
     NSInteger alt4=17;
     unichar charLA4 = [input LA:1];
     switch (charLA4) {
@@ -984,7 +1022,7 @@
             break;
 
     default: ;
-        ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newException:4 state:0 stream:input];
+        NoViableAltException *nvae = [NoViableAltException newException:4 state:0 stream:input];
         nvae.c = charLA4;
         @throw nvae;
 
@@ -992,156 +1030,190 @@
 
     switch (alt4) {
         case 1 : ;
-            // SimpleC.g:1:10: K_FOR // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:1:10: K_FOR // alt
             {
+
+
             [self mK_FOR]; 
 
 
-
+             
             }
             break;
         case 2 : ;
-            // SimpleC.g:1:16: K_CHAR // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:1:16: K_CHAR // alt
             {
+
+
             [self mK_CHAR]; 
 
 
-
+             
             }
             break;
         case 3 : ;
-            // SimpleC.g:1:23: K_INT_TYPE // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:1:23: K_INT_TYPE // alt
             {
+
+
             [self mK_INT_TYPE]; 
 
 
-
+             
             }
             break;
         case 4 : ;
-            // SimpleC.g:1:34: K_VOID // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:1:34: K_VOID // alt
             {
+
+
             [self mK_VOID]; 
 
 
-
+             
             }
             break;
         case 5 : ;
-            // SimpleC.g:1:41: K_ID // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:1:41: K_ID // alt
             {
+
+
             [self mK_ID]; 
 
 
-
+             
             }
             break;
         case 6 : ;
-            // SimpleC.g:1:46: K_INT // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:1:46: K_INT // alt
             {
+
+
             [self mK_INT]; 
 
 
-
+             
             }
             break;
         case 7 : ;
-            // SimpleC.g:1:52: K_LCURVE // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:1:52: K_LCURVE // alt
             {
+
+
             [self mK_LCURVE]; 
 
 
-
+             
             }
             break;
         case 8 : ;
-            // SimpleC.g:1:61: K_RCURVE // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:1:61: K_RCURVE // alt
             {
+
+
             [self mK_RCURVE]; 
 
 
-
+             
             }
             break;
         case 9 : ;
-            // SimpleC.g:1:70: K_PLUS // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:1:70: K_PLUS // alt
             {
+
+
             [self mK_PLUS]; 
 
 
-
+             
             }
             break;
         case 10 : ;
-            // SimpleC.g:1:77: K_COMMA // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:1:77: K_COMMA // alt
             {
+
+
             [self mK_COMMA]; 
 
 
-
+             
             }
             break;
         case 11 : ;
-            // SimpleC.g:1:85: K_SEMICOLON // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:1:85: K_SEMICOLON // alt
             {
+
+
             [self mK_SEMICOLON]; 
 
 
-
+             
             }
             break;
         case 12 : ;
-            // SimpleC.g:1:97: K_LT // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:1:97: K_LT // alt
             {
+
+
             [self mK_LT]; 
 
 
-
+             
             }
             break;
         case 13 : ;
-            // SimpleC.g:1:102: K_EQ // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:1:102: K_EQ // alt
             {
+
+
             [self mK_EQ]; 
 
 
-
+             
             }
             break;
         case 14 : ;
-            // SimpleC.g:1:107: K_EQEQ // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:1:107: K_EQEQ // alt
             {
+
+
             [self mK_EQEQ]; 
 
 
-
+             
             }
             break;
         case 15 : ;
-            // SimpleC.g:1:114: K_LCURLY // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:1:114: K_LCURLY // alt
             {
+
+
             [self mK_LCURLY]; 
 
 
-
+             
             }
             break;
         case 16 : ;
-            // SimpleC.g:1:123: K_RCURLY // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:1:123: K_RCURLY // alt
             {
+
+
             [self mK_RCURLY]; 
 
 
-
+             
             }
             break;
         case 17 : ;
-            // SimpleC.g:1:132: WS // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:1:132: WS // alt
             {
+
+
             [self mWS]; 
 
 
-
+             
             }
             break;
 
diff --git a/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCParser.h b/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCParser.h
index a5420cc..31f40ee 100644
--- a/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCParser.h
+++ b/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCParser.h
@@ -1,9 +1,9 @@
-// $ANTLR ${project.version} ${buildNumber} SimpleC.g 2011-05-06 15:09:17
+// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g 2012-02-16 17:40:52
 
 /* =============================================================================
- * Standard antlr3 OBJC runtime definitions
+ * Standard antlr OBJC runtime definitions
  */
-#import <Cocoa/Cocoa.h>
+#import <Foundation/Foundation.h>
 #import <ANTLR/ANTLR.h>
 /* End of standard antlr3 runtime definitions
  * =============================================================================
@@ -23,10 +23,10 @@
 #endif
 
 #pragma mark Cyclic DFA interface start DFA2
-@interface DFA2 : ANTLRDFA {
+@interface DFA2 : DFA {
 }
-+ newDFA2WithRecognizer:(ANTLRBaseRecognizer *)theRecognizer;
-- initWithRecognizer:(ANTLRBaseRecognizer *)recognizer;
++ (DFA2 *) newDFA2WithRecognizer:(BaseRecognizer *)theRecognizer;
+- initWithRecognizer:(BaseRecognizer *)recognizer;
 @end /* end of DFA2 interface  */
 
 #pragma mark Cyclic DFA interface end DFA2
@@ -59,305 +59,361 @@
 #define K_VOID 24
 #define VAR_DEF 25
 #define WS 26
-#pragma mark Dynamic Global Scopes
-#pragma mark Dynamic Rule Scopes
-#pragma mark Rule Return Scopes start
+#pragma mark Dynamic Global Scopes globalAttributeScopeInterface
+#pragma mark Dynamic Rule Scopes ruleAttributeScopeInterface
+#pragma mark Rule Return Scopes returnScopeInterface
 /* returnScopeInterface SimpleCParser_program_return */
-@interface SimpleCParser_program_return :ANTLRParserRuleReturnScope { /* returnScopeInterface line 1838 */
+@interface SimpleCParser_program_return : ParserRuleReturnScope { /* returnScopeInterface line 1838 */
 /* AST returnScopeInterface.memVars */
-ANTLRCommonTree *tree; /* ObjC start of memVars() */
+CommonTree *tree; /* ObjC start of memVars() */
+
 }
-/* start properties */
+/* start property declarations */
 /* AST returnScopeInterface.properties */
-@property (retain, getter=getTree, setter=setTree:) ANTLRCommonTree *tree;
+@property (retain, getter=getTree, setter=setTree:) CommonTree *tree;
+
+/* start of method declarations */
+
 + (SimpleCParser_program_return *)newSimpleCParser_program_return;
 /* this is start of set and get methods */
 /* AST returnScopeInterface.methodsDecl */
-- (ANTLRCommonTree *)getTree;
+- (CommonTree *)getTree;
 
-- (void) setTree:(ANTLRCommonTree *)aTree;
+- (void) setTree:(CommonTree *)aTree;
   /* methodsDecl */
-@end /* end of returnScopeInterface interface */
 
+@end /* end of returnScopeInterface interface */
 
 
 /* returnScopeInterface SimpleCParser_declaration_return */
-@interface SimpleCParser_declaration_return :ANTLRParserRuleReturnScope { /* returnScopeInterface line 1838 */
+@interface SimpleCParser_declaration_return : ParserRuleReturnScope { /* returnScopeInterface line 1838 */
 /* AST returnScopeInterface.memVars */
-ANTLRCommonTree *tree; /* ObjC start of memVars() */
+CommonTree *tree; /* ObjC start of memVars() */
+
 }
-/* start properties */
+/* start property declarations */
 /* AST returnScopeInterface.properties */
-@property (retain, getter=getTree, setter=setTree:) ANTLRCommonTree *tree;
+@property (retain, getter=getTree, setter=setTree:) CommonTree *tree;
+
+/* start of method declarations */
+
 + (SimpleCParser_declaration_return *)newSimpleCParser_declaration_return;
 /* this is start of set and get methods */
 /* AST returnScopeInterface.methodsDecl */
-- (ANTLRCommonTree *)getTree;
+- (CommonTree *)getTree;
 
-- (void) setTree:(ANTLRCommonTree *)aTree;
+- (void) setTree:(CommonTree *)aTree;
   /* methodsDecl */
-@end /* end of returnScopeInterface interface */
 
+@end /* end of returnScopeInterface interface */
 
 
 /* returnScopeInterface SimpleCParser_variable_return */
-@interface SimpleCParser_variable_return :ANTLRParserRuleReturnScope { /* returnScopeInterface line 1838 */
+@interface SimpleCParser_variable_return : ParserRuleReturnScope { /* returnScopeInterface line 1838 */
 /* AST returnScopeInterface.memVars */
-ANTLRCommonTree *tree; /* ObjC start of memVars() */
+CommonTree *tree; /* ObjC start of memVars() */
+
 }
-/* start properties */
+/* start property declarations */
 /* AST returnScopeInterface.properties */
-@property (retain, getter=getTree, setter=setTree:) ANTLRCommonTree *tree;
+@property (retain, getter=getTree, setter=setTree:) CommonTree *tree;
+
+/* start of method declarations */
+
 + (SimpleCParser_variable_return *)newSimpleCParser_variable_return;
 /* this is start of set and get methods */
 /* AST returnScopeInterface.methodsDecl */
-- (ANTLRCommonTree *)getTree;
+- (CommonTree *)getTree;
 
-- (void) setTree:(ANTLRCommonTree *)aTree;
+- (void) setTree:(CommonTree *)aTree;
   /* methodsDecl */
-@end /* end of returnScopeInterface interface */
 
+@end /* end of returnScopeInterface interface */
 
 
 /* returnScopeInterface SimpleCParser_declarator_return */
-@interface SimpleCParser_declarator_return :ANTLRParserRuleReturnScope { /* returnScopeInterface line 1838 */
+@interface SimpleCParser_declarator_return : ParserRuleReturnScope { /* returnScopeInterface line 1838 */
 /* AST returnScopeInterface.memVars */
-ANTLRCommonTree *tree; /* ObjC start of memVars() */
+CommonTree *tree; /* ObjC start of memVars() */
+
 }
-/* start properties */
+/* start property declarations */
 /* AST returnScopeInterface.properties */
-@property (retain, getter=getTree, setter=setTree:) ANTLRCommonTree *tree;
+@property (retain, getter=getTree, setter=setTree:) CommonTree *tree;
+
+/* start of method declarations */
+
 + (SimpleCParser_declarator_return *)newSimpleCParser_declarator_return;
 /* this is start of set and get methods */
 /* AST returnScopeInterface.methodsDecl */
-- (ANTLRCommonTree *)getTree;
+- (CommonTree *)getTree;
 
-- (void) setTree:(ANTLRCommonTree *)aTree;
+- (void) setTree:(CommonTree *)aTree;
   /* methodsDecl */
-@end /* end of returnScopeInterface interface */
 
+@end /* end of returnScopeInterface interface */
 
 
 /* returnScopeInterface SimpleCParser_functionHeader_return */
-@interface SimpleCParser_functionHeader_return :ANTLRParserRuleReturnScope { /* returnScopeInterface line 1838 */
+@interface SimpleCParser_functionHeader_return : ParserRuleReturnScope { /* returnScopeInterface line 1838 */
 /* AST returnScopeInterface.memVars */
-ANTLRCommonTree *tree; /* ObjC start of memVars() */
+CommonTree *tree; /* ObjC start of memVars() */
+
 }
-/* start properties */
+/* start property declarations */
 /* AST returnScopeInterface.properties */
-@property (retain, getter=getTree, setter=setTree:) ANTLRCommonTree *tree;
+@property (retain, getter=getTree, setter=setTree:) CommonTree *tree;
+
+/* start of method declarations */
+
 + (SimpleCParser_functionHeader_return *)newSimpleCParser_functionHeader_return;
 /* this is start of set and get methods */
 /* AST returnScopeInterface.methodsDecl */
-- (ANTLRCommonTree *)getTree;
+- (CommonTree *)getTree;
 
-- (void) setTree:(ANTLRCommonTree *)aTree;
+- (void) setTree:(CommonTree *)aTree;
   /* methodsDecl */
-@end /* end of returnScopeInterface interface */
 
+@end /* end of returnScopeInterface interface */
 
 
 /* returnScopeInterface SimpleCParser_formalParameter_return */
-@interface SimpleCParser_formalParameter_return :ANTLRParserRuleReturnScope { /* returnScopeInterface line 1838 */
+@interface SimpleCParser_formalParameter_return : ParserRuleReturnScope { /* returnScopeInterface line 1838 */
 /* AST returnScopeInterface.memVars */
-ANTLRCommonTree *tree; /* ObjC start of memVars() */
+CommonTree *tree; /* ObjC start of memVars() */
+
 }
-/* start properties */
+/* start property declarations */
 /* AST returnScopeInterface.properties */
-@property (retain, getter=getTree, setter=setTree:) ANTLRCommonTree *tree;
+@property (retain, getter=getTree, setter=setTree:) CommonTree *tree;
+
+/* start of method declarations */
+
 + (SimpleCParser_formalParameter_return *)newSimpleCParser_formalParameter_return;
 /* this is start of set and get methods */
 /* AST returnScopeInterface.methodsDecl */
-- (ANTLRCommonTree *)getTree;
+- (CommonTree *)getTree;
 
-- (void) setTree:(ANTLRCommonTree *)aTree;
+- (void) setTree:(CommonTree *)aTree;
   /* methodsDecl */
-@end /* end of returnScopeInterface interface */
 
+@end /* end of returnScopeInterface interface */
 
 
 /* returnScopeInterface SimpleCParser_type_return */
-@interface SimpleCParser_type_return :ANTLRParserRuleReturnScope { /* returnScopeInterface line 1838 */
+@interface SimpleCParser_type_return : ParserRuleReturnScope { /* returnScopeInterface line 1838 */
 /* AST returnScopeInterface.memVars */
-ANTLRCommonTree *tree; /* ObjC start of memVars() */
+CommonTree *tree; /* ObjC start of memVars() */
+
 }
-/* start properties */
+/* start property declarations */
 /* AST returnScopeInterface.properties */
-@property (retain, getter=getTree, setter=setTree:) ANTLRCommonTree *tree;
+@property (retain, getter=getTree, setter=setTree:) CommonTree *tree;
+
+/* start of method declarations */
+
 + (SimpleCParser_type_return *)newSimpleCParser_type_return;
 /* this is start of set and get methods */
 /* AST returnScopeInterface.methodsDecl */
-- (ANTLRCommonTree *)getTree;
+- (CommonTree *)getTree;
 
-- (void) setTree:(ANTLRCommonTree *)aTree;
+- (void) setTree:(CommonTree *)aTree;
   /* methodsDecl */
-@end /* end of returnScopeInterface interface */
 
+@end /* end of returnScopeInterface interface */
 
 
 /* returnScopeInterface SimpleCParser_block_return */
-@interface SimpleCParser_block_return :ANTLRParserRuleReturnScope { /* returnScopeInterface line 1838 */
+@interface SimpleCParser_block_return : ParserRuleReturnScope { /* returnScopeInterface line 1838 */
 /* AST returnScopeInterface.memVars */
-ANTLRCommonTree *tree; /* ObjC start of memVars() */
+CommonTree *tree; /* ObjC start of memVars() */
+
 }
-/* start properties */
+/* start property declarations */
 /* AST returnScopeInterface.properties */
-@property (retain, getter=getTree, setter=setTree:) ANTLRCommonTree *tree;
+@property (retain, getter=getTree, setter=setTree:) CommonTree *tree;
+
+/* start of method declarations */
+
 + (SimpleCParser_block_return *)newSimpleCParser_block_return;
 /* this is start of set and get methods */
 /* AST returnScopeInterface.methodsDecl */
-- (ANTLRCommonTree *)getTree;
+- (CommonTree *)getTree;
 
-- (void) setTree:(ANTLRCommonTree *)aTree;
+- (void) setTree:(CommonTree *)aTree;
   /* methodsDecl */
-@end /* end of returnScopeInterface interface */
 
+@end /* end of returnScopeInterface interface */
 
 
 /* returnScopeInterface SimpleCParser_stat_return */
-@interface SimpleCParser_stat_return :ANTLRParserRuleReturnScope { /* returnScopeInterface line 1838 */
+@interface SimpleCParser_stat_return : ParserRuleReturnScope { /* returnScopeInterface line 1838 */
 /* AST returnScopeInterface.memVars */
-ANTLRCommonTree *tree; /* ObjC start of memVars() */
+CommonTree *tree; /* ObjC start of memVars() */
+
 }
-/* start properties */
+/* start property declarations */
 /* AST returnScopeInterface.properties */
-@property (retain, getter=getTree, setter=setTree:) ANTLRCommonTree *tree;
+@property (retain, getter=getTree, setter=setTree:) CommonTree *tree;
+
+/* start of method declarations */
+
 + (SimpleCParser_stat_return *)newSimpleCParser_stat_return;
 /* this is start of set and get methods */
 /* AST returnScopeInterface.methodsDecl */
-- (ANTLRCommonTree *)getTree;
+- (CommonTree *)getTree;
 
-- (void) setTree:(ANTLRCommonTree *)aTree;
+- (void) setTree:(CommonTree *)aTree;
   /* methodsDecl */
-@end /* end of returnScopeInterface interface */
 
+@end /* end of returnScopeInterface interface */
 
 
 /* returnScopeInterface SimpleCParser_forStat_return */
-@interface SimpleCParser_forStat_return :ANTLRParserRuleReturnScope { /* returnScopeInterface line 1838 */
+@interface SimpleCParser_forStat_return : ParserRuleReturnScope { /* returnScopeInterface line 1838 */
 /* AST returnScopeInterface.memVars */
-ANTLRCommonTree *tree; /* ObjC start of memVars() */
+CommonTree *tree; /* ObjC start of memVars() */
+
 }
-/* start properties */
+/* start property declarations */
 /* AST returnScopeInterface.properties */
-@property (retain, getter=getTree, setter=setTree:) ANTLRCommonTree *tree;
+@property (retain, getter=getTree, setter=setTree:) CommonTree *tree;
+
+/* start of method declarations */
+
 + (SimpleCParser_forStat_return *)newSimpleCParser_forStat_return;
 /* this is start of set and get methods */
 /* AST returnScopeInterface.methodsDecl */
-- (ANTLRCommonTree *)getTree;
+- (CommonTree *)getTree;
 
-- (void) setTree:(ANTLRCommonTree *)aTree;
+- (void) setTree:(CommonTree *)aTree;
   /* methodsDecl */
-@end /* end of returnScopeInterface interface */
 
+@end /* end of returnScopeInterface interface */
 
 
 /* returnScopeInterface SimpleCParser_assignStat_return */
-@interface SimpleCParser_assignStat_return :ANTLRParserRuleReturnScope { /* returnScopeInterface line 1838 */
+@interface SimpleCParser_assignStat_return : ParserRuleReturnScope { /* returnScopeInterface line 1838 */
 /* AST returnScopeInterface.memVars */
-ANTLRCommonTree *tree; /* ObjC start of memVars() */
+CommonTree *tree; /* ObjC start of memVars() */
+
 }
-/* start properties */
+/* start property declarations */
 /* AST returnScopeInterface.properties */
-@property (retain, getter=getTree, setter=setTree:) ANTLRCommonTree *tree;
+@property (retain, getter=getTree, setter=setTree:) CommonTree *tree;
+
+/* start of method declarations */
+
 + (SimpleCParser_assignStat_return *)newSimpleCParser_assignStat_return;
 /* this is start of set and get methods */
 /* AST returnScopeInterface.methodsDecl */
-- (ANTLRCommonTree *)getTree;
+- (CommonTree *)getTree;
 
-- (void) setTree:(ANTLRCommonTree *)aTree;
+- (void) setTree:(CommonTree *)aTree;
   /* methodsDecl */
-@end /* end of returnScopeInterface interface */
 
+@end /* end of returnScopeInterface interface */
 
 
 /* returnScopeInterface SimpleCParser_expr_return */
-@interface SimpleCParser_expr_return :ANTLRParserRuleReturnScope { /* returnScopeInterface line 1838 */
+@interface SimpleCParser_expr_return : ParserRuleReturnScope { /* returnScopeInterface line 1838 */
 /* AST returnScopeInterface.memVars */
-ANTLRCommonTree *tree; /* ObjC start of memVars() */
+CommonTree *tree; /* ObjC start of memVars() */
+
 }
-/* start properties */
+/* start property declarations */
 /* AST returnScopeInterface.properties */
-@property (retain, getter=getTree, setter=setTree:) ANTLRCommonTree *tree;
+@property (retain, getter=getTree, setter=setTree:) CommonTree *tree;
+
+/* start of method declarations */
+
 + (SimpleCParser_expr_return *)newSimpleCParser_expr_return;
 /* this is start of set and get methods */
 /* AST returnScopeInterface.methodsDecl */
-- (ANTLRCommonTree *)getTree;
+- (CommonTree *)getTree;
 
-- (void) setTree:(ANTLRCommonTree *)aTree;
+- (void) setTree:(CommonTree *)aTree;
   /* methodsDecl */
-@end /* end of returnScopeInterface interface */
 
+@end /* end of returnScopeInterface interface */
 
 
 /* returnScopeInterface SimpleCParser_condExpr_return */
-@interface SimpleCParser_condExpr_return :ANTLRParserRuleReturnScope { /* returnScopeInterface line 1838 */
+@interface SimpleCParser_condExpr_return : ParserRuleReturnScope { /* returnScopeInterface line 1838 */
 /* AST returnScopeInterface.memVars */
-ANTLRCommonTree *tree; /* ObjC start of memVars() */
+CommonTree *tree; /* ObjC start of memVars() */
+
 }
-/* start properties */
+/* start property declarations */
 /* AST returnScopeInterface.properties */
-@property (retain, getter=getTree, setter=setTree:) ANTLRCommonTree *tree;
+@property (retain, getter=getTree, setter=setTree:) CommonTree *tree;
+
+/* start of method declarations */
+
 + (SimpleCParser_condExpr_return *)newSimpleCParser_condExpr_return;
 /* this is start of set and get methods */
 /* AST returnScopeInterface.methodsDecl */
-- (ANTLRCommonTree *)getTree;
+- (CommonTree *)getTree;
 
-- (void) setTree:(ANTLRCommonTree *)aTree;
+- (void) setTree:(CommonTree *)aTree;
   /* methodsDecl */
-@end /* end of returnScopeInterface interface */
 
+@end /* end of returnScopeInterface interface */
 
 
 /* returnScopeInterface SimpleCParser_aexpr_return */
-@interface SimpleCParser_aexpr_return :ANTLRParserRuleReturnScope { /* returnScopeInterface line 1838 */
+@interface SimpleCParser_aexpr_return : ParserRuleReturnScope { /* returnScopeInterface line 1838 */
 /* AST returnScopeInterface.memVars */
-ANTLRCommonTree *tree; /* ObjC start of memVars() */
+CommonTree *tree; /* ObjC start of memVars() */
+
 }
-/* start properties */
+/* start property declarations */
 /* AST returnScopeInterface.properties */
-@property (retain, getter=getTree, setter=setTree:) ANTLRCommonTree *tree;
+@property (retain, getter=getTree, setter=setTree:) CommonTree *tree;
+
+/* start of method declarations */
+
 + (SimpleCParser_aexpr_return *)newSimpleCParser_aexpr_return;
 /* this is start of set and get methods */
 /* AST returnScopeInterface.methodsDecl */
-- (ANTLRCommonTree *)getTree;
+- (CommonTree *)getTree;
 
-- (void) setTree:(ANTLRCommonTree *)aTree;
+- (void) setTree:(CommonTree *)aTree;
   /* methodsDecl */
-@end /* end of returnScopeInterface interface */
 
+@end /* end of returnScopeInterface interface */
 
 
 /* returnScopeInterface SimpleCParser_atom_return */
-@interface SimpleCParser_atom_return :ANTLRParserRuleReturnScope { /* returnScopeInterface line 1838 */
+@interface SimpleCParser_atom_return : ParserRuleReturnScope { /* returnScopeInterface line 1838 */
 /* AST returnScopeInterface.memVars */
-ANTLRCommonTree *tree; /* ObjC start of memVars() */
+CommonTree *tree; /* ObjC start of memVars() */
+
 }
-/* start properties */
+/* start property declarations */
 /* AST returnScopeInterface.properties */
-@property (retain, getter=getTree, setter=setTree:) ANTLRCommonTree *tree;
+@property (retain, getter=getTree, setter=setTree:) CommonTree *tree;
+
+/* start of method declarations */
+
 + (SimpleCParser_atom_return *)newSimpleCParser_atom_return;
 /* this is start of set and get methods */
 /* AST returnScopeInterface.methodsDecl */
-- (ANTLRCommonTree *)getTree;
+- (CommonTree *)getTree;
 
-- (void) setTree:(ANTLRCommonTree *)aTree;
+- (void) setTree:(CommonTree *)aTree;
   /* methodsDecl */
-@end /* end of returnScopeInterface interface */
 
+@end /* end of returnScopeInterface interface */
 
 
 
 /* Interface grammar class */
-@interface SimpleCParser : ANTLRParser { /* line 572 */
-/* ObjC start of ruleAttributeScopeMemVar */
+@interface SimpleCParser  : Parser { /* line 572 */
+#pragma mark Dynamic Rule Scopes ruleAttributeScopeDecl
+#pragma mark Dynamic Global Rule Scopes globalAttributeScopeMemVar
 
 
-/* ObjC end of ruleAttributeScopeMemVar */
-/* ObjC start of globalAttributeScopeMemVar */
-
-
-/* ObjC end of globalAttributeScopeMemVar */
 /* ObjC start of actions.(actionScope).memVars */
 /* ObjC end of actions.(actionScope).memVars */
 /* ObjC start of memVars */
@@ -366,7 +422,7 @@
 NSArray *ruleNames;
   /* AST super.memVars */
 /* AST parserMemVars */
-id<ANTLRTreeAdaptor> treeAdaptor;   /* AST parserMemVars */
+id<TreeAdaptor> treeAdaptor;   /* AST parserMemVars */
 /* ObjC end of memVars */
 
 DFA2 *dfa2;
@@ -378,11 +434,11 @@
 /* AST parserHeaderFile.properties */
   /* AST super.properties */
 /* AST parserProperties */
-@property (retain, getter=getTreeAdaptor, setter=setTreeAdaptor:) id<ANTLRTreeAdaptor> treeAdaptor;   /* AST parserproperties */
+@property (retain, getter=getTreeAdaptor, setter=setTreeAdaptor:) id<TreeAdaptor> treeAdaptor;   /* AST parserproperties */
 /* ObjC end of properties */
 
 + (void) initialize;
-+ (id) newSimpleCParser:(id<ANTLRTokenStream>)aStream;
++ (id) newSimpleCParser:(id<TokenStream>)aStream;
 /* ObjC start of actions.(actionScope).methodsDecl */
 /* ObjC end of actions.(actionScope).methodsDecl */
 
@@ -390,8 +446,8 @@
 /* AST parserHeaderFile.methodsDecl */
   /* AST super.methodsDecl */
 /* AST parserMethodsDecl */
-- (id<ANTLRTreeAdaptor>) getTreeAdaptor;
-- (void) setTreeAdaptor:(id<ANTLRTreeAdaptor>)theTreeAdaptor;   /* AST parsermethodsDecl */
+- (id<TreeAdaptor>) getTreeAdaptor;
+- (void) setTreeAdaptor:(id<TreeAdaptor>)theTreeAdaptor;   /* AST parsermethodsDecl */
 /* ObjC end of methodsDecl */
 
 - (SimpleCParser_program_return *)program; 
diff --git a/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCParser.java b/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCParser.java
index 4744ee1..51bab3d 100644
--- a/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCParser.java
+++ b/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCParser.java
@@ -1,4 +1,4 @@
-// $ANTLR 3.2 Aug 13, 2010 14:19:31 SimpleC.g 2010-08-13 14:29:19
+// $ANTLR 3.2 Aug 13, 2010 19:41:25 /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g 2010-08-13 19:42:18
 
 import org.antlr.runtime.*;
 import java.util.Stack;
@@ -59,7 +59,7 @@
     }
 
     public String[] getTokenNames() { return SimpleCParser.tokenNames; }
-    public String getGrammarFileName() { return "SimpleC.g"; }
+    public String getGrammarFileName() { return "/usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g"; }
 
 
     public static class program_return extends ParserRuleReturnScope {
@@ -68,7 +68,7 @@
     };
 
     // $ANTLR start "program"
-    // SimpleC.g:16:1: program : ( declaration )+ ;
+    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:16:1: program : ( declaration )+ ;
     public final SimpleCParser.program_return program() throws RecognitionException {
         SimpleCParser.program_return retval = new SimpleCParser.program_return();
         retval.start = input.LT(1);
@@ -80,12 +80,12 @@
 
 
         try {
-            // SimpleC.g:17:5: ( ( declaration )+ )
-            // SimpleC.g:17:9: ( declaration )+
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:17:5: ( ( declaration )+ )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:17:9: ( declaration )+
             {
             root_0 = (Object)adaptor.nil();
 
-            // SimpleC.g:17:9: ( declaration )+
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:17:9: ( declaration )+
             int cnt1=0;
             loop1:
             do {
@@ -99,7 +99,7 @@
 
                 switch (alt1) {
             	case 1 :
-            	    // SimpleC.g:17:9: declaration
+            	    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:17:9: declaration
             	    {
             	    pushFollow(FOLLOW_declaration_in_program85);
             	    declaration1=declaration();
@@ -147,7 +147,7 @@
     };
 
     // $ANTLR start "declaration"
-    // SimpleC.g:20:1: declaration : ( variable | functionHeader ';' -> ^( FUNC_DECL functionHeader ) | functionHeader block -> ^( FUNC_DEF functionHeader block ) );
+    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:20:1: declaration : ( variable | functionHeader ';' -> ^( FUNC_DECL functionHeader ) | functionHeader block -> ^( FUNC_DEF functionHeader block ) );
     public final SimpleCParser.declaration_return declaration() throws RecognitionException {
         SimpleCParser.declaration_return retval = new SimpleCParser.declaration_return();
         retval.start = input.LT(1);
@@ -169,12 +169,12 @@
         RewriteRuleSubtreeStream stream_functionHeader=new RewriteRuleSubtreeStream(adaptor,"rule functionHeader");
         RewriteRuleSubtreeStream stream_block=new RewriteRuleSubtreeStream(adaptor,"rule block");
         try {
-            // SimpleC.g:21:5: ( variable | functionHeader ';' -> ^( FUNC_DECL functionHeader ) | functionHeader block -> ^( FUNC_DEF functionHeader block ) )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:21:5: ( variable | functionHeader ';' -> ^( FUNC_DECL functionHeader ) | functionHeader block -> ^( FUNC_DEF functionHeader block ) )
             int alt2=3;
             alt2 = dfa2.predict(input);
             switch (alt2) {
                 case 1 :
-                    // SimpleC.g:21:9: variable
+                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:21:9: variable
                     {
                     root_0 = (Object)adaptor.nil();
 
@@ -188,7 +188,7 @@
                     }
                     break;
                 case 2 :
-                    // SimpleC.g:22:9: functionHeader ';'
+                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:22:9: functionHeader ';'
                     {
                     pushFollow(FOLLOW_functionHeader_in_declaration115);
                     functionHeader3=functionHeader();
@@ -214,7 +214,7 @@
                     root_0 = (Object)adaptor.nil();
                     // 22:28: -> ^( FUNC_DECL functionHeader )
                     {
-                        // SimpleC.g:22:31: ^( FUNC_DECL functionHeader )
+                        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:22:31: ^( FUNC_DECL functionHeader )
                         {
                         Object root_1 = (Object)adaptor.nil();
                         root_1 = (Object)adaptor.becomeRoot((Object)adaptor.create(FUNC_DECL, "FUNC_DECL"), root_1);
@@ -230,7 +230,7 @@
                     }
                     break;
                 case 3 :
-                    // SimpleC.g:23:9: functionHeader block
+                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:23:9: functionHeader block
                     {
                     pushFollow(FOLLOW_functionHeader_in_declaration135);
                     functionHeader5=functionHeader();
@@ -247,7 +247,7 @@
 
 
                     // AST REWRITE
-                    // elements: block, functionHeader
+                    // elements: functionHeader, block
                     // token labels: 
                     // rule labels: retval
                     // token list labels: 
@@ -259,7 +259,7 @@
                     root_0 = (Object)adaptor.nil();
                     // 23:30: -> ^( FUNC_DEF functionHeader block )
                     {
-                        // SimpleC.g:23:33: ^( FUNC_DEF functionHeader block )
+                        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:23:33: ^( FUNC_DEF functionHeader block )
                         {
                         Object root_1 = (Object)adaptor.nil();
                         root_1 = (Object)adaptor.becomeRoot((Object)adaptor.create(FUNC_DEF, "FUNC_DEF"), root_1);
@@ -301,7 +301,7 @@
     };
 
     // $ANTLR start "variable"
-    // SimpleC.g:26:1: variable : type declarator ';' -> ^( VAR_DEF type declarator ) ;
+    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:26:1: variable : type declarator ';' -> ^( VAR_DEF type declarator ) ;
     public final SimpleCParser.variable_return variable() throws RecognitionException {
         SimpleCParser.variable_return retval = new SimpleCParser.variable_return();
         retval.start = input.LT(1);
@@ -319,8 +319,8 @@
         RewriteRuleSubtreeStream stream_declarator=new RewriteRuleSubtreeStream(adaptor,"rule declarator");
         RewriteRuleSubtreeStream stream_type=new RewriteRuleSubtreeStream(adaptor,"rule type");
         try {
-            // SimpleC.g:27:5: ( type declarator ';' -> ^( VAR_DEF type declarator ) )
-            // SimpleC.g:27:9: type declarator ';'
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:27:5: ( type declarator ';' -> ^( VAR_DEF type declarator ) )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:27:9: type declarator ';'
             {
             pushFollow(FOLLOW_type_in_variable166);
             type7=type();
@@ -340,7 +340,7 @@
 
 
             // AST REWRITE
-            // elements: declarator, type
+            // elements: type, declarator
             // token labels: 
             // rule labels: retval
             // token list labels: 
@@ -352,7 +352,7 @@
             root_0 = (Object)adaptor.nil();
             // 27:29: -> ^( VAR_DEF type declarator )
             {
-                // SimpleC.g:27:32: ^( VAR_DEF type declarator )
+                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:27:32: ^( VAR_DEF type declarator )
                 {
                 Object root_1 = (Object)adaptor.nil();
                 root_1 = (Object)adaptor.becomeRoot((Object)adaptor.create(VAR_DEF, "VAR_DEF"), root_1);
@@ -392,7 +392,7 @@
     };
 
     // $ANTLR start "declarator"
-    // SimpleC.g:30:1: declarator : ID ;
+    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:30:1: declarator : ID ;
     public final SimpleCParser.declarator_return declarator() throws RecognitionException {
         SimpleCParser.declarator_return retval = new SimpleCParser.declarator_return();
         retval.start = input.LT(1);
@@ -404,8 +404,8 @@
         Object ID10_tree=null;
 
         try {
-            // SimpleC.g:31:5: ( ID )
-            // SimpleC.g:31:9: ID
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:31:5: ( ID )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:31:9: ID
             {
             root_0 = (Object)adaptor.nil();
 
@@ -440,7 +440,7 @@
     };
 
     // $ANTLR start "functionHeader"
-    // SimpleC.g:34:1: functionHeader : type ID '(' ( formalParameter ( ',' formalParameter )* )? ')' -> ^( FUNC_HDR type ID ( formalParameter )+ ) ;
+    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:34:1: functionHeader : type ID '(' ( formalParameter ( ',' formalParameter )* )? ')' -> ^( FUNC_HDR type ID ( formalParameter )+ ) ;
     public final SimpleCParser.functionHeader_return functionHeader() throws RecognitionException {
         SimpleCParser.functionHeader_return retval = new SimpleCParser.functionHeader_return();
         retval.start = input.LT(1);
@@ -469,8 +469,8 @@
         RewriteRuleSubtreeStream stream_formalParameter=new RewriteRuleSubtreeStream(adaptor,"rule formalParameter");
         RewriteRuleSubtreeStream stream_type=new RewriteRuleSubtreeStream(adaptor,"rule type");
         try {
-            // SimpleC.g:35:5: ( type ID '(' ( formalParameter ( ',' formalParameter )* )? ')' -> ^( FUNC_HDR type ID ( formalParameter )+ ) )
-            // SimpleC.g:35:9: type ID '(' ( formalParameter ( ',' formalParameter )* )? ')'
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:35:5: ( type ID '(' ( formalParameter ( ',' formalParameter )* )? ')' -> ^( FUNC_HDR type ID ( formalParameter )+ ) )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:35:9: type ID '(' ( formalParameter ( ',' formalParameter )* )? ')'
             {
             pushFollow(FOLLOW_type_in_functionHeader219);
             type11=type();
@@ -484,7 +484,7 @@
             char_literal13=(Token)match(input,22,FOLLOW_22_in_functionHeader223);  
             stream_22.add(char_literal13);
 
-            // SimpleC.g:35:21: ( formalParameter ( ',' formalParameter )* )?
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:35:21: ( formalParameter ( ',' formalParameter )* )?
             int alt4=2;
             int LA4_0 = input.LA(1);
 
@@ -493,7 +493,7 @@
             }
             switch (alt4) {
                 case 1 :
-                    // SimpleC.g:35:23: formalParameter ( ',' formalParameter )*
+                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:35:23: formalParameter ( ',' formalParameter )*
                     {
                     pushFollow(FOLLOW_formalParameter_in_functionHeader227);
                     formalParameter14=formalParameter();
@@ -501,7 +501,7 @@
                     state._fsp--;
 
                     stream_formalParameter.add(formalParameter14.getTree());
-                    // SimpleC.g:35:39: ( ',' formalParameter )*
+                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:35:39: ( ',' formalParameter )*
                     loop3:
                     do {
                         int alt3=2;
@@ -514,7 +514,7 @@
 
                         switch (alt3) {
                     	case 1 :
-                    	    // SimpleC.g:35:41: ',' formalParameter
+                    	    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:35:41: ',' formalParameter
                     	    {
                     	    char_literal15=(Token)match(input,23,FOLLOW_23_in_functionHeader231);  
                     	    stream_23.add(char_literal15);
@@ -546,7 +546,7 @@
 
 
             // AST REWRITE
-            // elements: ID, formalParameter, type
+            // elements: formalParameter, ID, type
             // token labels: 
             // rule labels: retval
             // token list labels: 
@@ -558,7 +558,7 @@
             root_0 = (Object)adaptor.nil();
             // 36:9: -> ^( FUNC_HDR type ID ( formalParameter )+ )
             {
-                // SimpleC.g:36:12: ^( FUNC_HDR type ID ( formalParameter )+ )
+                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:36:12: ^( FUNC_HDR type ID ( formalParameter )+ )
                 {
                 Object root_1 = (Object)adaptor.nil();
                 root_1 = (Object)adaptor.becomeRoot((Object)adaptor.create(FUNC_HDR, "FUNC_HDR"), root_1);
@@ -606,7 +606,7 @@
     };
 
     // $ANTLR start "formalParameter"
-    // SimpleC.g:39:1: formalParameter : type declarator -> ^( ARG_DEF type declarator ) ;
+    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:39:1: formalParameter : type declarator -> ^( ARG_DEF type declarator ) ;
     public final SimpleCParser.formalParameter_return formalParameter() throws RecognitionException {
         SimpleCParser.formalParameter_return retval = new SimpleCParser.formalParameter_return();
         retval.start = input.LT(1);
@@ -621,8 +621,8 @@
         RewriteRuleSubtreeStream stream_declarator=new RewriteRuleSubtreeStream(adaptor,"rule declarator");
         RewriteRuleSubtreeStream stream_type=new RewriteRuleSubtreeStream(adaptor,"rule type");
         try {
-            // SimpleC.g:40:5: ( type declarator -> ^( ARG_DEF type declarator ) )
-            // SimpleC.g:40:9: type declarator
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:40:5: ( type declarator -> ^( ARG_DEF type declarator ) )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:40:9: type declarator
             {
             pushFollow(FOLLOW_type_in_formalParameter281);
             type18=type();
@@ -651,7 +651,7 @@
             root_0 = (Object)adaptor.nil();
             // 40:25: -> ^( ARG_DEF type declarator )
             {
-                // SimpleC.g:40:28: ^( ARG_DEF type declarator )
+                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:40:28: ^( ARG_DEF type declarator )
                 {
                 Object root_1 = (Object)adaptor.nil();
                 root_1 = (Object)adaptor.becomeRoot((Object)adaptor.create(ARG_DEF, "ARG_DEF"), root_1);
@@ -691,7 +691,7 @@
     };
 
     // $ANTLR start "type"
-    // SimpleC.g:43:1: type : ( 'int' | 'char' | 'void' | ID );
+    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:43:1: type : ( 'int' | 'char' | 'void' | ID );
     public final SimpleCParser.type_return type() throws RecognitionException {
         SimpleCParser.type_return retval = new SimpleCParser.type_return();
         retval.start = input.LT(1);
@@ -703,8 +703,8 @@
         Object set20_tree=null;
 
         try {
-            // SimpleC.g:44:5: ( 'int' | 'char' | 'void' | ID )
-            // SimpleC.g:
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:44:5: ( 'int' | 'char' | 'void' | ID )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:
             {
             root_0 = (Object)adaptor.nil();
 
@@ -746,7 +746,7 @@
     };
 
     // $ANTLR start "block"
-    // SimpleC.g:50:1: block : lc= '{' ( variable )* ( stat )* '}' -> ^( BLOCK[$lc,@\"BLOCK\"] ( variable )* ( stat )* ) ;
+    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:50:1: block : lc= '{' ( variable )* ( stat )* '}' -> ^( BLOCK[$lc,@\"BLOCK\"] ( variable )* ( stat )* ) ;
     public final SimpleCParser.block_return block() throws RecognitionException {
         SimpleCParser.block_return retval = new SimpleCParser.block_return();
         retval.start = input.LT(1);
@@ -767,13 +767,13 @@
         RewriteRuleSubtreeStream stream_variable=new RewriteRuleSubtreeStream(adaptor,"rule variable");
         RewriteRuleSubtreeStream stream_stat=new RewriteRuleSubtreeStream(adaptor,"rule stat");
         try {
-            // SimpleC.g:51:5: (lc= '{' ( variable )* ( stat )* '}' -> ^( BLOCK[$lc,@\"BLOCK\"] ( variable )* ( stat )* ) )
-            // SimpleC.g:51:9: lc= '{' ( variable )* ( stat )* '}'
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:51:5: (lc= '{' ( variable )* ( stat )* '}' -> ^( BLOCK[$lc,@\"BLOCK\"] ( variable )* ( stat )* ) )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:51:9: lc= '{' ( variable )* ( stat )* '}'
             {
             lc=(Token)match(input,25,FOLLOW_25_in_block376);  
             stream_25.add(lc);
 
-            // SimpleC.g:52:13: ( variable )*
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:52:13: ( variable )*
             loop5:
             do {
                 int alt5=2;
@@ -795,7 +795,7 @@
 
                 switch (alt5) {
             	case 1 :
-            	    // SimpleC.g:52:13: variable
+            	    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:52:13: variable
             	    {
             	    pushFollow(FOLLOW_variable_in_block390);
             	    variable21=variable();
@@ -812,7 +812,7 @@
                 }
             } while (true);
 
-            // SimpleC.g:53:13: ( stat )*
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:53:13: ( stat )*
             loop6:
             do {
                 int alt6=2;
@@ -825,7 +825,7 @@
 
                 switch (alt6) {
             	case 1 :
-            	    // SimpleC.g:53:13: stat
+            	    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:53:13: stat
             	    {
             	    pushFollow(FOLLOW_stat_in_block405);
             	    stat22=stat();
@@ -848,7 +848,7 @@
 
 
             // AST REWRITE
-            // elements: stat, variable
+            // elements: variable, stat
             // token labels: 
             // rule labels: retval
             // token list labels: 
@@ -860,18 +860,18 @@
             root_0 = (Object)adaptor.nil();
             // 55:9: -> ^( BLOCK[$lc,@\"BLOCK\"] ( variable )* ( stat )* )
             {
-                // SimpleC.g:55:12: ^( BLOCK[$lc,@\"BLOCK\"] ( variable )* ( stat )* )
+                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:55:12: ^( BLOCK[$lc,@\"BLOCK\"] ( variable )* ( stat )* )
                 {
                 Object root_1 = (Object)adaptor.nil();
                 root_1 = (Object)adaptor.becomeRoot((Object)adaptor.create(BLOCK, lc, @"BLOCK"), root_1);
 
-                // SimpleC.g:55:34: ( variable )*
+                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:55:34: ( variable )*
                 while ( stream_variable.hasNext() ) {
                     adaptor.addChild(root_1, stream_variable.nextTree());
 
                 }
                 stream_variable.reset();
-                // SimpleC.g:55:44: ( stat )*
+                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:55:44: ( stat )*
                 while ( stream_stat.hasNext() ) {
                     adaptor.addChild(root_1, stream_stat.nextTree());
 
@@ -910,7 +910,7 @@
     };
 
     // $ANTLR start "stat"
-    // SimpleC.g:58:1: stat : ( forStat | expr ';' | block | assignStat ';' | ';' );
+    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:58:1: stat : ( forStat | expr ';' | block | assignStat ';' | ';' );
     public final SimpleCParser.stat_return stat() throws RecognitionException {
         SimpleCParser.stat_return retval = new SimpleCParser.stat_return();
         retval.start = input.LT(1);
@@ -934,7 +934,7 @@
         Object char_literal30_tree=null;
 
         try {
-            // SimpleC.g:58:5: ( forStat | expr ';' | block | assignStat ';' | ';' )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:58:5: ( forStat | expr ';' | block | assignStat ';' | ';' )
             int alt7=5;
             switch ( input.LA(1) ) {
             case FOR:
@@ -985,7 +985,7 @@
 
             switch (alt7) {
                 case 1 :
-                    // SimpleC.g:58:7: forStat
+                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:58:7: forStat
                     {
                     root_0 = (Object)adaptor.nil();
 
@@ -999,7 +999,7 @@
                     }
                     break;
                 case 2 :
-                    // SimpleC.g:59:7: expr ';'
+                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:59:7: expr ';'
                     {
                     root_0 = (Object)adaptor.nil();
 
@@ -1014,7 +1014,7 @@
                     }
                     break;
                 case 3 :
-                    // SimpleC.g:60:7: block
+                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:60:7: block
                     {
                     root_0 = (Object)adaptor.nil();
 
@@ -1028,7 +1028,7 @@
                     }
                     break;
                 case 4 :
-                    // SimpleC.g:61:7: assignStat ';'
+                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:61:7: assignStat ';'
                     {
                     root_0 = (Object)adaptor.nil();
 
@@ -1043,7 +1043,7 @@
                     }
                     break;
                 case 5 :
-                    // SimpleC.g:62:7: ';'
+                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:62:7: ';'
                     {
                     root_0 = (Object)adaptor.nil();
 
@@ -1077,7 +1077,7 @@
     };
 
     // $ANTLR start "forStat"
-    // SimpleC.g:65:1: forStat : 'for' '(' start= assignStat ';' expr ';' next= assignStat ')' block -> ^( 'for' $start expr $next block ) ;
+    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:65:1: forStat : 'for' '(' start= assignStat ';' expr ';' next= assignStat ')' block -> ^( 'for' $start expr $next block ) ;
     public final SimpleCParser.forStat_return forStat() throws RecognitionException {
         SimpleCParser.forStat_return retval = new SimpleCParser.forStat_return();
         retval.start = input.LT(1);
@@ -1111,8 +1111,8 @@
         RewriteRuleSubtreeStream stream_block=new RewriteRuleSubtreeStream(adaptor,"rule block");
         RewriteRuleSubtreeStream stream_expr=new RewriteRuleSubtreeStream(adaptor,"rule expr");
         try {
-            // SimpleC.g:66:5: ( 'for' '(' start= assignStat ';' expr ';' next= assignStat ')' block -> ^( 'for' $start expr $next block ) )
-            // SimpleC.g:66:9: 'for' '(' start= assignStat ';' expr ';' next= assignStat ')' block
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:66:5: ( 'for' '(' start= assignStat ';' expr ';' next= assignStat ')' block -> ^( 'for' $start expr $next block ) )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:66:9: 'for' '(' start= assignStat ';' expr ';' next= assignStat ')' block
             {
             string_literal31=(Token)match(input,FOR,FOLLOW_FOR_in_forStat507);  
             stream_FOR.add(string_literal31);
@@ -1156,7 +1156,7 @@
 
 
             // AST REWRITE
-            // elements: next, start, FOR, block, expr
+            // elements: block, expr, FOR, start, next
             // token labels: 
             // rule labels: retval, start, next
             // token list labels: 
@@ -1170,7 +1170,7 @@
             root_0 = (Object)adaptor.nil();
             // 67:9: -> ^( 'for' $start expr $next block )
             {
-                // SimpleC.g:67:12: ^( 'for' $start expr $next block )
+                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:67:12: ^( 'for' $start expr $next block )
                 {
                 Object root_1 = (Object)adaptor.nil();
                 root_1 = (Object)adaptor.becomeRoot(stream_FOR.nextNode(), root_1);
@@ -1212,7 +1212,7 @@
     };
 
     // $ANTLR start "assignStat"
-    // SimpleC.g:70:1: assignStat : ID EQ expr -> ^( EQ ID expr ) ;
+    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:70:1: assignStat : ID EQ expr -> ^( EQ ID expr ) ;
     public final SimpleCParser.assignStat_return assignStat() throws RecognitionException {
         SimpleCParser.assignStat_return retval = new SimpleCParser.assignStat_return();
         retval.start = input.LT(1);
@@ -1230,8 +1230,8 @@
         RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
         RewriteRuleSubtreeStream stream_expr=new RewriteRuleSubtreeStream(adaptor,"rule expr");
         try {
-            // SimpleC.g:71:5: ( ID EQ expr -> ^( EQ ID expr ) )
-            // SimpleC.g:71:9: ID EQ expr
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:71:5: ( ID EQ expr -> ^( EQ ID expr ) )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:71:9: ID EQ expr
             {
             ID38=(Token)match(input,ID,FOLLOW_ID_in_assignStat570);  
             stream_ID.add(ID38);
@@ -1248,7 +1248,7 @@
 
 
             // AST REWRITE
-            // elements: EQ, ID, expr
+            // elements: EQ, expr, ID
             // token labels: 
             // rule labels: retval
             // token list labels: 
@@ -1260,7 +1260,7 @@
             root_0 = (Object)adaptor.nil();
             // 71:20: -> ^( EQ ID expr )
             {
-                // SimpleC.g:71:23: ^( EQ ID expr )
+                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:71:23: ^( EQ ID expr )
                 {
                 Object root_1 = (Object)adaptor.nil();
                 root_1 = (Object)adaptor.becomeRoot(stream_EQ.nextNode(), root_1);
@@ -1300,7 +1300,7 @@
     };
 
     // $ANTLR start "expr"
-    // SimpleC.g:74:1: expr : condExpr ;
+    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:74:1: expr : condExpr ;
     public final SimpleCParser.expr_return expr() throws RecognitionException {
         SimpleCParser.expr_return retval = new SimpleCParser.expr_return();
         retval.start = input.LT(1);
@@ -1312,8 +1312,8 @@
 
 
         try {
-            // SimpleC.g:74:5: ( condExpr )
-            // SimpleC.g:74:9: condExpr
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:74:5: ( condExpr )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:74:9: condExpr
             {
             root_0 = (Object)adaptor.nil();
 
@@ -1350,7 +1350,7 @@
     };
 
     // $ANTLR start "condExpr"
-    // SimpleC.g:77:1: condExpr : aexpr ( ( '==' | '<' ) aexpr )? ;
+    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:77:1: condExpr : aexpr ( ( '==' | '<' ) aexpr )? ;
     public final SimpleCParser.condExpr_return condExpr() throws RecognitionException {
         SimpleCParser.condExpr_return retval = new SimpleCParser.condExpr_return();
         retval.start = input.LT(1);
@@ -1368,8 +1368,8 @@
         Object char_literal44_tree=null;
 
         try {
-            // SimpleC.g:78:5: ( aexpr ( ( '==' | '<' ) aexpr )? )
-            // SimpleC.g:78:9: aexpr ( ( '==' | '<' ) aexpr )?
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:78:5: ( aexpr ( ( '==' | '<' ) aexpr )? )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:78:9: aexpr ( ( '==' | '<' ) aexpr )?
             {
             root_0 = (Object)adaptor.nil();
 
@@ -1379,7 +1379,7 @@
             state._fsp--;
 
             adaptor.addChild(root_0, aexpr42.getTree());
-            // SimpleC.g:78:15: ( ( '==' | '<' ) aexpr )?
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:78:15: ( ( '==' | '<' ) aexpr )?
             int alt9=2;
             int LA9_0 = input.LA(1);
 
@@ -1388,9 +1388,9 @@
             }
             switch (alt9) {
                 case 1 :
-                    // SimpleC.g:78:17: ( '==' | '<' ) aexpr
+                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:78:17: ( '==' | '<' ) aexpr
                     {
-                    // SimpleC.g:78:17: ( '==' | '<' )
+                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:78:17: ( '==' | '<' )
                     int alt8=2;
                     int LA8_0 = input.LA(1);
 
@@ -1408,7 +1408,7 @@
                     }
                     switch (alt8) {
                         case 1 :
-                            // SimpleC.g:78:18: '=='
+                            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:78:18: '=='
                             {
                             string_literal43=(Token)match(input,EQEQ,FOLLOW_EQEQ_in_condExpr622); 
                             string_literal43_tree = (Object)adaptor.create(string_literal43);
@@ -1418,7 +1418,7 @@
                             }
                             break;
                         case 2 :
-                            // SimpleC.g:78:26: '<'
+                            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:78:26: '<'
                             {
                             char_literal44=(Token)match(input,LT,FOLLOW_LT_in_condExpr627); 
                             char_literal44_tree = (Object)adaptor.create(char_literal44);
@@ -1469,7 +1469,7 @@
     };
 
     // $ANTLR start "aexpr"
-    // SimpleC.g:81:1: aexpr : atom ( '+' atom )* ;
+    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:81:1: aexpr : atom ( '+' atom )* ;
     public final SimpleCParser.aexpr_return aexpr() throws RecognitionException {
         SimpleCParser.aexpr_return retval = new SimpleCParser.aexpr_return();
         retval.start = input.LT(1);
@@ -1485,8 +1485,8 @@
         Object char_literal47_tree=null;
 
         try {
-            // SimpleC.g:82:5: ( atom ( '+' atom )* )
-            // SimpleC.g:82:9: atom ( '+' atom )*
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:82:5: ( atom ( '+' atom )* )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:82:9: atom ( '+' atom )*
             {
             root_0 = (Object)adaptor.nil();
 
@@ -1496,7 +1496,7 @@
             state._fsp--;
 
             adaptor.addChild(root_0, atom46.getTree());
-            // SimpleC.g:82:14: ( '+' atom )*
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:82:14: ( '+' atom )*
             loop10:
             do {
                 int alt10=2;
@@ -1509,7 +1509,7 @@
 
                 switch (alt10) {
             	case 1 :
-            	    // SimpleC.g:82:16: '+' atom
+            	    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:82:16: '+' atom
             	    {
             	    char_literal47=(Token)match(input,PLUS,FOLLOW_PLUS_in_aexpr657); 
             	    char_literal47_tree = (Object)adaptor.create(char_literal47);
@@ -1557,7 +1557,7 @@
     };
 
     // $ANTLR start "atom"
-    // SimpleC.g:85:1: atom : ( ID | INT | '(' expr ')' -> expr );
+    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:85:1: atom : ( ID | INT | '(' expr ')' -> expr );
     public final SimpleCParser.atom_return atom() throws RecognitionException {
         SimpleCParser.atom_return retval = new SimpleCParser.atom_return();
         retval.start = input.LT(1);
@@ -1579,7 +1579,7 @@
         RewriteRuleTokenStream stream_24=new RewriteRuleTokenStream(adaptor,"token 24");
         RewriteRuleSubtreeStream stream_expr=new RewriteRuleSubtreeStream(adaptor,"rule expr");
         try {
-            // SimpleC.g:86:5: ( ID | INT | '(' expr ')' -> expr )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:86:5: ( ID | INT | '(' expr ')' -> expr )
             int alt11=3;
             switch ( input.LA(1) ) {
             case ID:
@@ -1606,7 +1606,7 @@
 
             switch (alt11) {
                 case 1 :
-                    // SimpleC.g:86:7: ID
+                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:86:7: ID
                     {
                     root_0 = (Object)adaptor.nil();
 
@@ -1618,7 +1618,7 @@
                     }
                     break;
                 case 2 :
-                    // SimpleC.g:87:7: INT
+                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:87:7: INT
                     {
                     root_0 = (Object)adaptor.nil();
 
@@ -1630,7 +1630,7 @@
                     }
                     break;
                 case 3 :
-                    // SimpleC.g:88:7: '(' expr ')'
+                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:88:7: '(' expr ')'
                     {
                     char_literal51=(Token)match(input,22,FOLLOW_22_in_atom708);  
                     stream_22.add(char_literal51);
diff --git a/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCParser.m b/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCParser.m
index 882a065..a8935a3 100644
--- a/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCParser.m
+++ b/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCParser.m
@@ -1,8 +1,8 @@
 /** \file
- *  This OBJC source file was generated by $ANTLR version ${project.version} ${buildNumber}
+ *  This OBJC source file was generated by $ANTLR version 3.4
  *
- *     -  From the grammar source file : SimpleC.g
- *     -                            On : 2011-05-06 15:09:17
+ *     -  From the grammar source file : /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g
+ *     -                            On : 2012-02-16 17:40:52
  *     -                for the parser : SimpleCParserParser
  *
  * Editing it, at least manually, is not wise.
@@ -11,7 +11,7 @@
  *
  *
 */
-// $ANTLR ${project.version} ${buildNumber} SimpleC.g 2011-05-06 15:09:17
+// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g 2012-02-16 17:40:52
 
 
 /* -----------------------------------------
@@ -26,41 +26,76 @@
  * Start of recognizer
  */
 #pragma mark Cyclic DFA implementation start DFA2
+
 @implementation DFA2
 const static NSInteger dfa2_eot[13] =
     {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
 const static NSInteger dfa2_eof[13] =
     {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
 const static unichar dfa2_min[13] =
-    {9,14,18,9,0,14,17,10,0,0,9,14,10};
+    {9,14,18,9,-1,14,17,10,-1,-1,9,14,10};
 const static unichar dfa2_max[13] =
-    {24,14,23,24,0,14,23,22,0,0,24,14,22};
+    {24,14,23,24,-1,14,23,22,-1,-1,24,14,22};
 const static NSInteger dfa2_accept[13] =
     {-1,-1,-1,-1,1,-1,-1,-1,2,3,-1,-1,-1};
 const static NSInteger dfa2_special[13] =
     {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
-const static NSInteger dfa2_transition[] = {};
-const static NSInteger dfa2_transition0[] = {9, -1, -1, -1, -1, -1, 8};
-const static NSInteger dfa2_transition1[] = {10, -1, -1, -1, -1, -1, -1, 
- -1, -1, -1, -1, -1, 6};
-const static NSInteger dfa2_transition2[] = {5, -1, -1, -1, -1, 5, -1, 5, 
- -1, -1, -1, -1, -1, 6, -1, 5};
-const static NSInteger dfa2_transition3[] = {11, -1, -1, -1, -1, 11, -1, 
- 11, -1, -1, -1, -1, -1, -1, -1, 11};
-const static NSInteger dfa2_transition4[] = {3, -1, -1, -1, -1, 4};
-const static NSInteger dfa2_transition5[] = {1, -1, -1, -1, -1, 1, -1, 1, 
- -1, -1, -1, -1, -1, -1, -1, 1};
-const static NSInteger dfa2_transition6[] = {7};
-const static NSInteger dfa2_transition7[] = {12};
-const static NSInteger dfa2_transition8[] = {2};
+
+/** Used when there is no transition table entry for a particular state */
+#define dfa2_T_empty	    nil
+
+const static NSInteger dfa2_T0[] =
+{
+     9, -1, -1, -1, -1, -1, 8
+};
+const static NSInteger dfa2_T1[] =
+{
+     10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6
+};
+const static NSInteger dfa2_T2[] =
+{
+     5, -1, -1, -1, -1, 5, -1, 5, -1, -1, -1, -1, -1, 6, -1, 5
+};
+const static NSInteger dfa2_T3[] =
+{
+     11, -1, -1, -1, -1, 11, -1, 11, -1, -1, -1, -1, -1, -1, -1, 11
+};
+const static NSInteger dfa2_T4[] =
+{
+     3, -1, -1, -1, -1, 4
+};
+const static NSInteger dfa2_T5[] =
+{
+     1, -1, -1, -1, -1, 1, -1, 1, -1, -1, -1, -1, -1, -1, -1, 1
+};
+const static NSInteger dfa2_T6[] =
+{
+     7
+};
+const static NSInteger dfa2_T7[] =
+{
+     12
+};
+const static NSInteger dfa2_T8[] =
+{
+     2
+};
 
 
-+ (id) newDFA2WithRecognizer:(ANTLRBaseRecognizer *)aRecognizer
+const static NSInteger *dfa2_transition[] =
+{
+    dfa2_T5, dfa2_T8, dfa2_T4, dfa2_T2, nil, dfa2_T6, dfa2_T0, dfa2_T1, 
+    nil, nil, dfa2_T3, dfa2_T7, dfa2_T1
+};
+
+//const static NSInteger dfa2_transition[] = {};
+
++ (DFA2 *) newDFA2WithRecognizer:(BaseRecognizer *)aRecognizer
 {
     return [[[DFA2 alloc] initWithRecognizer:aRecognizer] retain];
 }
 
-- (id) initWithRecognizer:(ANTLRBaseRecognizer *) theRecognizer
+- (id) initWithRecognizer:(BaseRecognizer *) theRecognizer
 {
     self = [super initWithRecognizer:theRecognizer];
     if ( self != nil ) {
@@ -71,6 +106,8 @@
         max = dfa2_max;
         accept = dfa2_accept;
         special = dfa2_special;
+        transition = dfa2_transition;
+/*
         if (!(transition = calloc(13, sizeof(void*)))) {
             [self release];
             return nil;
@@ -89,6 +126,7 @@
         transition[7] = dfa2_transition3;
         transition[8] = dfa2_transition7;
         transition[9] = dfa2_transition1;
+ */
     }
     return self;
 }
@@ -224,32 +262,32 @@
 static const unsigned long long FOLLOW_K_RCURVE_in_atom712_data[] = { 0x0000000000000002LL};
 
 
-#pragma mark Dynamic Global Scopes
+#pragma mark Dynamic Global globalAttributeScopeImplementation
 
-#pragma mark Dynamic Rule Scopes
+#pragma mark Dynamic Rule Scopes ruleAttributeScopeImplementation
 
-#pragma mark Rule Return Scopes start
-@implementation SimpleCParser_program_return /* returnScope */
+#pragma mark Rule Return Scopes returnScopeImplementation
+@implementation SimpleCParser_program_return /* returnScopeImplementation */
 /* AST returnScope.synthesize */
 @synthesize tree; /* start of synthesize -- OBJC-Line 1837 */
 + (SimpleCParser_program_return *)newSimpleCParser_program_return
 {
-    return [[[SimpleCParser_program_return alloc] init] retain];
+return [[[SimpleCParser_program_return alloc] init] retain];
 }
 
 - (id) init
 {
-    self = [super init];
-    return self;
+self = [super init];
+return self;
 }
 
 /* AST returnScope.methods */
-- (ANTLRCommonTree *)getTree
+- (CommonTree *)getTree
 {
     return tree;
 }
 
-- (void) setTree:(ANTLRCommonTree *)aTree
+- (void) setTree:(CommonTree *)aTree
 {
     if (tree != aTree) {
         if (tree != nil) [tree release];
@@ -265,31 +303,29 @@
 }
 
 
-
 @end /* end of returnScope implementation */
 
-
-@implementation SimpleCParser_declaration_return /* returnScope */
+@implementation SimpleCParser_declaration_return /* returnScopeImplementation */
 /* AST returnScope.synthesize */
 @synthesize tree; /* start of synthesize -- OBJC-Line 1837 */
 + (SimpleCParser_declaration_return *)newSimpleCParser_declaration_return
 {
-    return [[[SimpleCParser_declaration_return alloc] init] retain];
+return [[[SimpleCParser_declaration_return alloc] init] retain];
 }
 
 - (id) init
 {
-    self = [super init];
-    return self;
+self = [super init];
+return self;
 }
 
 /* AST returnScope.methods */
-- (ANTLRCommonTree *)getTree
+- (CommonTree *)getTree
 {
     return tree;
 }
 
-- (void) setTree:(ANTLRCommonTree *)aTree
+- (void) setTree:(CommonTree *)aTree
 {
     if (tree != aTree) {
         if (tree != nil) [tree release];
@@ -305,31 +341,29 @@
 }
 
 
-
 @end /* end of returnScope implementation */
 
-
-@implementation SimpleCParser_variable_return /* returnScope */
+@implementation SimpleCParser_variable_return /* returnScopeImplementation */
 /* AST returnScope.synthesize */
 @synthesize tree; /* start of synthesize -- OBJC-Line 1837 */
 + (SimpleCParser_variable_return *)newSimpleCParser_variable_return
 {
-    return [[[SimpleCParser_variable_return alloc] init] retain];
+return [[[SimpleCParser_variable_return alloc] init] retain];
 }
 
 - (id) init
 {
-    self = [super init];
-    return self;
+self = [super init];
+return self;
 }
 
 /* AST returnScope.methods */
-- (ANTLRCommonTree *)getTree
+- (CommonTree *)getTree
 {
     return tree;
 }
 
-- (void) setTree:(ANTLRCommonTree *)aTree
+- (void) setTree:(CommonTree *)aTree
 {
     if (tree != aTree) {
         if (tree != nil) [tree release];
@@ -345,31 +379,29 @@
 }
 
 
-
 @end /* end of returnScope implementation */
 
-
-@implementation SimpleCParser_declarator_return /* returnScope */
+@implementation SimpleCParser_declarator_return /* returnScopeImplementation */
 /* AST returnScope.synthesize */
 @synthesize tree; /* start of synthesize -- OBJC-Line 1837 */
 + (SimpleCParser_declarator_return *)newSimpleCParser_declarator_return
 {
-    return [[[SimpleCParser_declarator_return alloc] init] retain];
+return [[[SimpleCParser_declarator_return alloc] init] retain];
 }
 
 - (id) init
 {
-    self = [super init];
-    return self;
+self = [super init];
+return self;
 }
 
 /* AST returnScope.methods */
-- (ANTLRCommonTree *)getTree
+- (CommonTree *)getTree
 {
     return tree;
 }
 
-- (void) setTree:(ANTLRCommonTree *)aTree
+- (void) setTree:(CommonTree *)aTree
 {
     if (tree != aTree) {
         if (tree != nil) [tree release];
@@ -385,31 +417,29 @@
 }
 
 
-
 @end /* end of returnScope implementation */
 
-
-@implementation SimpleCParser_functionHeader_return /* returnScope */
+@implementation SimpleCParser_functionHeader_return /* returnScopeImplementation */
 /* AST returnScope.synthesize */
 @synthesize tree; /* start of synthesize -- OBJC-Line 1837 */
 + (SimpleCParser_functionHeader_return *)newSimpleCParser_functionHeader_return
 {
-    return [[[SimpleCParser_functionHeader_return alloc] init] retain];
+return [[[SimpleCParser_functionHeader_return alloc] init] retain];
 }
 
 - (id) init
 {
-    self = [super init];
-    return self;
+self = [super init];
+return self;
 }
 
 /* AST returnScope.methods */
-- (ANTLRCommonTree *)getTree
+- (CommonTree *)getTree
 {
     return tree;
 }
 
-- (void) setTree:(ANTLRCommonTree *)aTree
+- (void) setTree:(CommonTree *)aTree
 {
     if (tree != aTree) {
         if (tree != nil) [tree release];
@@ -425,31 +455,29 @@
 }
 
 
-
 @end /* end of returnScope implementation */
 
-
-@implementation SimpleCParser_formalParameter_return /* returnScope */
+@implementation SimpleCParser_formalParameter_return /* returnScopeImplementation */
 /* AST returnScope.synthesize */
 @synthesize tree; /* start of synthesize -- OBJC-Line 1837 */
 + (SimpleCParser_formalParameter_return *)newSimpleCParser_formalParameter_return
 {
-    return [[[SimpleCParser_formalParameter_return alloc] init] retain];
+return [[[SimpleCParser_formalParameter_return alloc] init] retain];
 }
 
 - (id) init
 {
-    self = [super init];
-    return self;
+self = [super init];
+return self;
 }
 
 /* AST returnScope.methods */
-- (ANTLRCommonTree *)getTree
+- (CommonTree *)getTree
 {
     return tree;
 }
 
-- (void) setTree:(ANTLRCommonTree *)aTree
+- (void) setTree:(CommonTree *)aTree
 {
     if (tree != aTree) {
         if (tree != nil) [tree release];
@@ -465,31 +493,29 @@
 }
 
 
-
 @end /* end of returnScope implementation */
 
-
-@implementation SimpleCParser_type_return /* returnScope */
+@implementation SimpleCParser_type_return /* returnScopeImplementation */
 /* AST returnScope.synthesize */
 @synthesize tree; /* start of synthesize -- OBJC-Line 1837 */
 + (SimpleCParser_type_return *)newSimpleCParser_type_return
 {
-    return [[[SimpleCParser_type_return alloc] init] retain];
+return [[[SimpleCParser_type_return alloc] init] retain];
 }
 
 - (id) init
 {
-    self = [super init];
-    return self;
+self = [super init];
+return self;
 }
 
 /* AST returnScope.methods */
-- (ANTLRCommonTree *)getTree
+- (CommonTree *)getTree
 {
     return tree;
 }
 
-- (void) setTree:(ANTLRCommonTree *)aTree
+- (void) setTree:(CommonTree *)aTree
 {
     if (tree != aTree) {
         if (tree != nil) [tree release];
@@ -505,31 +531,29 @@
 }
 
 
-
 @end /* end of returnScope implementation */
 
-
-@implementation SimpleCParser_block_return /* returnScope */
+@implementation SimpleCParser_block_return /* returnScopeImplementation */
 /* AST returnScope.synthesize */
 @synthesize tree; /* start of synthesize -- OBJC-Line 1837 */
 + (SimpleCParser_block_return *)newSimpleCParser_block_return
 {
-    return [[[SimpleCParser_block_return alloc] init] retain];
+return [[[SimpleCParser_block_return alloc] init] retain];
 }
 
 - (id) init
 {
-    self = [super init];
-    return self;
+self = [super init];
+return self;
 }
 
 /* AST returnScope.methods */
-- (ANTLRCommonTree *)getTree
+- (CommonTree *)getTree
 {
     return tree;
 }
 
-- (void) setTree:(ANTLRCommonTree *)aTree
+- (void) setTree:(CommonTree *)aTree
 {
     if (tree != aTree) {
         if (tree != nil) [tree release];
@@ -545,31 +569,29 @@
 }
 
 
-
 @end /* end of returnScope implementation */
 
-
-@implementation SimpleCParser_stat_return /* returnScope */
+@implementation SimpleCParser_stat_return /* returnScopeImplementation */
 /* AST returnScope.synthesize */
 @synthesize tree; /* start of synthesize -- OBJC-Line 1837 */
 + (SimpleCParser_stat_return *)newSimpleCParser_stat_return
 {
-    return [[[SimpleCParser_stat_return alloc] init] retain];
+return [[[SimpleCParser_stat_return alloc] init] retain];
 }
 
 - (id) init
 {
-    self = [super init];
-    return self;
+self = [super init];
+return self;
 }
 
 /* AST returnScope.methods */
-- (ANTLRCommonTree *)getTree
+- (CommonTree *)getTree
 {
     return tree;
 }
 
-- (void) setTree:(ANTLRCommonTree *)aTree
+- (void) setTree:(CommonTree *)aTree
 {
     if (tree != aTree) {
         if (tree != nil) [tree release];
@@ -585,31 +607,29 @@
 }
 
 
-
 @end /* end of returnScope implementation */
 
-
-@implementation SimpleCParser_forStat_return /* returnScope */
+@implementation SimpleCParser_forStat_return /* returnScopeImplementation */
 /* AST returnScope.synthesize */
 @synthesize tree; /* start of synthesize -- OBJC-Line 1837 */
 + (SimpleCParser_forStat_return *)newSimpleCParser_forStat_return
 {
-    return [[[SimpleCParser_forStat_return alloc] init] retain];
+return [[[SimpleCParser_forStat_return alloc] init] retain];
 }
 
 - (id) init
 {
-    self = [super init];
-    return self;
+self = [super init];
+return self;
 }
 
 /* AST returnScope.methods */
-- (ANTLRCommonTree *)getTree
+- (CommonTree *)getTree
 {
     return tree;
 }
 
-- (void) setTree:(ANTLRCommonTree *)aTree
+- (void) setTree:(CommonTree *)aTree
 {
     if (tree != aTree) {
         if (tree != nil) [tree release];
@@ -625,31 +645,29 @@
 }
 
 
-
 @end /* end of returnScope implementation */
 
-
-@implementation SimpleCParser_assignStat_return /* returnScope */
+@implementation SimpleCParser_assignStat_return /* returnScopeImplementation */
 /* AST returnScope.synthesize */
 @synthesize tree; /* start of synthesize -- OBJC-Line 1837 */
 + (SimpleCParser_assignStat_return *)newSimpleCParser_assignStat_return
 {
-    return [[[SimpleCParser_assignStat_return alloc] init] retain];
+return [[[SimpleCParser_assignStat_return alloc] init] retain];
 }
 
 - (id) init
 {
-    self = [super init];
-    return self;
+self = [super init];
+return self;
 }
 
 /* AST returnScope.methods */
-- (ANTLRCommonTree *)getTree
+- (CommonTree *)getTree
 {
     return tree;
 }
 
-- (void) setTree:(ANTLRCommonTree *)aTree
+- (void) setTree:(CommonTree *)aTree
 {
     if (tree != aTree) {
         if (tree != nil) [tree release];
@@ -665,31 +683,29 @@
 }
 
 
-
 @end /* end of returnScope implementation */
 
-
-@implementation SimpleCParser_expr_return /* returnScope */
+@implementation SimpleCParser_expr_return /* returnScopeImplementation */
 /* AST returnScope.synthesize */
 @synthesize tree; /* start of synthesize -- OBJC-Line 1837 */
 + (SimpleCParser_expr_return *)newSimpleCParser_expr_return
 {
-    return [[[SimpleCParser_expr_return alloc] init] retain];
+return [[[SimpleCParser_expr_return alloc] init] retain];
 }
 
 - (id) init
 {
-    self = [super init];
-    return self;
+self = [super init];
+return self;
 }
 
 /* AST returnScope.methods */
-- (ANTLRCommonTree *)getTree
+- (CommonTree *)getTree
 {
     return tree;
 }
 
-- (void) setTree:(ANTLRCommonTree *)aTree
+- (void) setTree:(CommonTree *)aTree
 {
     if (tree != aTree) {
         if (tree != nil) [tree release];
@@ -705,31 +721,29 @@
 }
 
 
-
 @end /* end of returnScope implementation */
 
-
-@implementation SimpleCParser_condExpr_return /* returnScope */
+@implementation SimpleCParser_condExpr_return /* returnScopeImplementation */
 /* AST returnScope.synthesize */
 @synthesize tree; /* start of synthesize -- OBJC-Line 1837 */
 + (SimpleCParser_condExpr_return *)newSimpleCParser_condExpr_return
 {
-    return [[[SimpleCParser_condExpr_return alloc] init] retain];
+return [[[SimpleCParser_condExpr_return alloc] init] retain];
 }
 
 - (id) init
 {
-    self = [super init];
-    return self;
+self = [super init];
+return self;
 }
 
 /* AST returnScope.methods */
-- (ANTLRCommonTree *)getTree
+- (CommonTree *)getTree
 {
     return tree;
 }
 
-- (void) setTree:(ANTLRCommonTree *)aTree
+- (void) setTree:(CommonTree *)aTree
 {
     if (tree != aTree) {
         if (tree != nil) [tree release];
@@ -745,31 +759,29 @@
 }
 
 
-
 @end /* end of returnScope implementation */
 
-
-@implementation SimpleCParser_aexpr_return /* returnScope */
+@implementation SimpleCParser_aexpr_return /* returnScopeImplementation */
 /* AST returnScope.synthesize */
 @synthesize tree; /* start of synthesize -- OBJC-Line 1837 */
 + (SimpleCParser_aexpr_return *)newSimpleCParser_aexpr_return
 {
-    return [[[SimpleCParser_aexpr_return alloc] init] retain];
+return [[[SimpleCParser_aexpr_return alloc] init] retain];
 }
 
 - (id) init
 {
-    self = [super init];
-    return self;
+self = [super init];
+return self;
 }
 
 /* AST returnScope.methods */
-- (ANTLRCommonTree *)getTree
+- (CommonTree *)getTree
 {
     return tree;
 }
 
-- (void) setTree:(ANTLRCommonTree *)aTree
+- (void) setTree:(CommonTree *)aTree
 {
     if (tree != aTree) {
         if (tree != nil) [tree release];
@@ -785,31 +797,29 @@
 }
 
 
-
 @end /* end of returnScope implementation */
 
-
-@implementation SimpleCParser_atom_return /* returnScope */
+@implementation SimpleCParser_atom_return /* returnScopeImplementation */
 /* AST returnScope.synthesize */
 @synthesize tree; /* start of synthesize -- OBJC-Line 1837 */
 + (SimpleCParser_atom_return *)newSimpleCParser_atom_return
 {
-    return [[[SimpleCParser_atom_return alloc] init] retain];
+return [[[SimpleCParser_atom_return alloc] init] retain];
 }
 
 - (id) init
 {
-    self = [super init];
-    return self;
+self = [super init];
+return self;
 }
 
 /* AST returnScope.methods */
-- (ANTLRCommonTree *)getTree
+- (CommonTree *)getTree
 {
     return tree;
 }
 
-- (void) setTree:(ANTLRCommonTree *)aTree
+- (void) setTree:(CommonTree *)aTree
 {
     if (tree != aTree) {
         if (tree != nil) [tree release];
@@ -825,116 +835,105 @@
 }
 
 
-
 @end /* end of returnScope implementation */
 
 
-//#pragma mark Rule return scopes start
-//
-
-#pragma mark Rule return scopes start
 
 @implementation SimpleCParser  // line 637
 
 /* ObjC start of ruleAttributeScope */
-#pragma mark Dynamic Rule Scopes
+#pragma mark Dynamic Rule Scopes ruleAttributeScope
 /* ObjC end of ruleAttributeScope */
-#pragma mark global Attribute Scopes
+#pragma mark global Attribute Scopes globalAttributeScope
 /* ObjC start globalAttributeScope */
 /* ObjC end globalAttributeScope */
 /* ObjC start actions.(actionScope).synthesize */
-/* ObjC end actions.(actionScope).synthesize */
 /* ObjC start synthesize() */
 /* AST genericParser.synthesize */
 /* AST parserProperties */
 @synthesize treeAdaptor;
-/* ObjC end synthesize() */
 
 + (void) initialize
 {
     #pragma mark Bitsets
-    FOLLOW_declaration_in_program85 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_declaration_in_program85_data Count:(NSUInteger)1] retain];
-    FOLLOW_variable_in_declaration105 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_variable_in_declaration105_data Count:(NSUInteger)1] retain];
-    FOLLOW_functionHeader_in_declaration115 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_functionHeader_in_declaration115_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_SEMICOLON_in_declaration117 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_SEMICOLON_in_declaration117_data Count:(NSUInteger)1] retain];
-    FOLLOW_functionHeader_in_declaration135 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_functionHeader_in_declaration135_data Count:(NSUInteger)1] retain];
-    FOLLOW_block_in_declaration137 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_block_in_declaration137_data Count:(NSUInteger)1] retain];
-    FOLLOW_type_in_variable166 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_type_in_variable166_data Count:(NSUInteger)1] retain];
-    FOLLOW_declarator_in_variable168 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_declarator_in_variable168_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_SEMICOLON_in_variable170 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_SEMICOLON_in_variable170_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_ID_in_declarator199 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_ID_in_declarator199_data Count:(NSUInteger)1] retain];
-    FOLLOW_type_in_functionHeader219 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_type_in_functionHeader219_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_ID_in_functionHeader221 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_ID_in_functionHeader221_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_LCURVE_in_functionHeader223 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_LCURVE_in_functionHeader223_data Count:(NSUInteger)1] retain];
-    FOLLOW_formalParameter_in_functionHeader227 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_formalParameter_in_functionHeader227_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_COMMA_in_functionHeader231 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_COMMA_in_functionHeader231_data Count:(NSUInteger)1] retain];
-    FOLLOW_formalParameter_in_functionHeader233 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_formalParameter_in_functionHeader233_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_RCURVE_in_functionHeader241 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_RCURVE_in_functionHeader241_data Count:(NSUInteger)1] retain];
-    FOLLOW_type_in_formalParameter281 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_type_in_formalParameter281_data Count:(NSUInteger)1] retain];
-    FOLLOW_declarator_in_formalParameter283 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_declarator_in_formalParameter283_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_LCURLY_in_block376 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_LCURLY_in_block376_data Count:(NSUInteger)1] retain];
-    FOLLOW_variable_in_block390 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_variable_in_block390_data Count:(NSUInteger)1] retain];
-    FOLLOW_stat_in_block405 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_stat_in_block405_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_RCURLY_in_block416 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_RCURLY_in_block416_data Count:(NSUInteger)1] retain];
-    FOLLOW_forStat_in_stat449 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_forStat_in_stat449_data Count:(NSUInteger)1] retain];
-    FOLLOW_expr_in_stat457 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_stat457_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_SEMICOLON_in_stat459 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_SEMICOLON_in_stat459_data Count:(NSUInteger)1] retain];
-    FOLLOW_block_in_stat468 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_block_in_stat468_data Count:(NSUInteger)1] retain];
-    FOLLOW_assignStat_in_stat476 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_assignStat_in_stat476_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_SEMICOLON_in_stat478 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_SEMICOLON_in_stat478_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_SEMICOLON_in_stat487 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_SEMICOLON_in_stat487_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_FOR_in_forStat507 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_FOR_in_forStat507_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_LCURVE_in_forStat509 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_LCURVE_in_forStat509_data Count:(NSUInteger)1] retain];
-    FOLLOW_assignStat_in_forStat513 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_assignStat_in_forStat513_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_SEMICOLON_in_forStat515 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_SEMICOLON_in_forStat515_data Count:(NSUInteger)1] retain];
-    FOLLOW_expr_in_forStat517 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_forStat517_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_SEMICOLON_in_forStat519 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_SEMICOLON_in_forStat519_data Count:(NSUInteger)1] retain];
-    FOLLOW_assignStat_in_forStat523 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_assignStat_in_forStat523_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_RCURVE_in_forStat525 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_RCURVE_in_forStat525_data Count:(NSUInteger)1] retain];
-    FOLLOW_block_in_forStat527 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_block_in_forStat527_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_ID_in_assignStat570 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_ID_in_assignStat570_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_EQ_in_assignStat572 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_EQ_in_assignStat572_data Count:(NSUInteger)1] retain];
-    FOLLOW_expr_in_assignStat574 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_assignStat574_data Count:(NSUInteger)1] retain];
-    FOLLOW_condExpr_in_expr598 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_condExpr_in_expr598_data Count:(NSUInteger)1] retain];
-    FOLLOW_aexpr_in_condExpr617 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_aexpr_in_condExpr617_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_EQEQ_in_condExpr622 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_EQEQ_in_condExpr622_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_LT_in_condExpr627 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_LT_in_condExpr627_data Count:(NSUInteger)1] retain];
-    FOLLOW_aexpr_in_condExpr631 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_aexpr_in_condExpr631_data Count:(NSUInteger)1] retain];
-    FOLLOW_atom_in_aexpr653 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_atom_in_aexpr653_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_PLUS_in_aexpr657 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_PLUS_in_aexpr657_data Count:(NSUInteger)1] retain];
-    FOLLOW_atom_in_aexpr660 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_atom_in_aexpr660_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_ID_in_atom680 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_ID_in_atom680_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_INT_in_atom694 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_INT_in_atom694_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_LCURVE_in_atom708 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_LCURVE_in_atom708_data Count:(NSUInteger)1] retain];
-    FOLLOW_expr_in_atom710 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_atom710_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_RCURVE_in_atom712 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_RCURVE_in_atom712_data Count:(NSUInteger)1] retain];
+    FOLLOW_declaration_in_program85 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_declaration_in_program85_data Count:(NSUInteger)1] retain];
+    FOLLOW_variable_in_declaration105 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_variable_in_declaration105_data Count:(NSUInteger)1] retain];
+    FOLLOW_functionHeader_in_declaration115 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_functionHeader_in_declaration115_data Count:(NSUInteger)1] retain];
+    FOLLOW_K_SEMICOLON_in_declaration117 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_SEMICOLON_in_declaration117_data Count:(NSUInteger)1] retain];
+    FOLLOW_functionHeader_in_declaration135 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_functionHeader_in_declaration135_data Count:(NSUInteger)1] retain];
+    FOLLOW_block_in_declaration137 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_block_in_declaration137_data Count:(NSUInteger)1] retain];
+    FOLLOW_type_in_variable166 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_type_in_variable166_data Count:(NSUInteger)1] retain];
+    FOLLOW_declarator_in_variable168 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_declarator_in_variable168_data Count:(NSUInteger)1] retain];
+    FOLLOW_K_SEMICOLON_in_variable170 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_SEMICOLON_in_variable170_data Count:(NSUInteger)1] retain];
+    FOLLOW_K_ID_in_declarator199 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_ID_in_declarator199_data Count:(NSUInteger)1] retain];
+    FOLLOW_type_in_functionHeader219 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_type_in_functionHeader219_data Count:(NSUInteger)1] retain];
+    FOLLOW_K_ID_in_functionHeader221 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_ID_in_functionHeader221_data Count:(NSUInteger)1] retain];
+    FOLLOW_K_LCURVE_in_functionHeader223 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_LCURVE_in_functionHeader223_data Count:(NSUInteger)1] retain];
+    FOLLOW_formalParameter_in_functionHeader227 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_formalParameter_in_functionHeader227_data Count:(NSUInteger)1] retain];
+    FOLLOW_K_COMMA_in_functionHeader231 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_COMMA_in_functionHeader231_data Count:(NSUInteger)1] retain];
+    FOLLOW_formalParameter_in_functionHeader233 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_formalParameter_in_functionHeader233_data Count:(NSUInteger)1] retain];
+    FOLLOW_K_RCURVE_in_functionHeader241 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_RCURVE_in_functionHeader241_data Count:(NSUInteger)1] retain];
+    FOLLOW_type_in_formalParameter281 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_type_in_formalParameter281_data Count:(NSUInteger)1] retain];
+    FOLLOW_declarator_in_formalParameter283 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_declarator_in_formalParameter283_data Count:(NSUInteger)1] retain];
+    FOLLOW_K_LCURLY_in_block376 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_LCURLY_in_block376_data Count:(NSUInteger)1] retain];
+    FOLLOW_variable_in_block390 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_variable_in_block390_data Count:(NSUInteger)1] retain];
+    FOLLOW_stat_in_block405 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_stat_in_block405_data Count:(NSUInteger)1] retain];
+    FOLLOW_K_RCURLY_in_block416 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_RCURLY_in_block416_data Count:(NSUInteger)1] retain];
+    FOLLOW_forStat_in_stat449 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_forStat_in_stat449_data Count:(NSUInteger)1] retain];
+    FOLLOW_expr_in_stat457 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_stat457_data Count:(NSUInteger)1] retain];
+    FOLLOW_K_SEMICOLON_in_stat459 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_SEMICOLON_in_stat459_data Count:(NSUInteger)1] retain];
+    FOLLOW_block_in_stat468 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_block_in_stat468_data Count:(NSUInteger)1] retain];
+    FOLLOW_assignStat_in_stat476 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_assignStat_in_stat476_data Count:(NSUInteger)1] retain];
+    FOLLOW_K_SEMICOLON_in_stat478 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_SEMICOLON_in_stat478_data Count:(NSUInteger)1] retain];
+    FOLLOW_K_SEMICOLON_in_stat487 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_SEMICOLON_in_stat487_data Count:(NSUInteger)1] retain];
+    FOLLOW_K_FOR_in_forStat507 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_FOR_in_forStat507_data Count:(NSUInteger)1] retain];
+    FOLLOW_K_LCURVE_in_forStat509 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_LCURVE_in_forStat509_data Count:(NSUInteger)1] retain];
+    FOLLOW_assignStat_in_forStat513 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_assignStat_in_forStat513_data Count:(NSUInteger)1] retain];
+    FOLLOW_K_SEMICOLON_in_forStat515 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_SEMICOLON_in_forStat515_data Count:(NSUInteger)1] retain];
+    FOLLOW_expr_in_forStat517 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_forStat517_data Count:(NSUInteger)1] retain];
+    FOLLOW_K_SEMICOLON_in_forStat519 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_SEMICOLON_in_forStat519_data Count:(NSUInteger)1] retain];
+    FOLLOW_assignStat_in_forStat523 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_assignStat_in_forStat523_data Count:(NSUInteger)1] retain];
+    FOLLOW_K_RCURVE_in_forStat525 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_RCURVE_in_forStat525_data Count:(NSUInteger)1] retain];
+    FOLLOW_block_in_forStat527 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_block_in_forStat527_data Count:(NSUInteger)1] retain];
+    FOLLOW_K_ID_in_assignStat570 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_ID_in_assignStat570_data Count:(NSUInteger)1] retain];
+    FOLLOW_K_EQ_in_assignStat572 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_EQ_in_assignStat572_data Count:(NSUInteger)1] retain];
+    FOLLOW_expr_in_assignStat574 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_assignStat574_data Count:(NSUInteger)1] retain];
+    FOLLOW_condExpr_in_expr598 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_condExpr_in_expr598_data Count:(NSUInteger)1] retain];
+    FOLLOW_aexpr_in_condExpr617 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_aexpr_in_condExpr617_data Count:(NSUInteger)1] retain];
+    FOLLOW_K_EQEQ_in_condExpr622 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_EQEQ_in_condExpr622_data Count:(NSUInteger)1] retain];
+    FOLLOW_K_LT_in_condExpr627 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_LT_in_condExpr627_data Count:(NSUInteger)1] retain];
+    FOLLOW_aexpr_in_condExpr631 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_aexpr_in_condExpr631_data Count:(NSUInteger)1] retain];
+    FOLLOW_atom_in_aexpr653 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_atom_in_aexpr653_data Count:(NSUInteger)1] retain];
+    FOLLOW_K_PLUS_in_aexpr657 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_PLUS_in_aexpr657_data Count:(NSUInteger)1] retain];
+    FOLLOW_atom_in_aexpr660 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_atom_in_aexpr660_data Count:(NSUInteger)1] retain];
+    FOLLOW_K_ID_in_atom680 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_ID_in_atom680_data Count:(NSUInteger)1] retain];
+    FOLLOW_K_INT_in_atom694 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_INT_in_atom694_data Count:(NSUInteger)1] retain];
+    FOLLOW_K_LCURVE_in_atom708 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_LCURVE_in_atom708_data Count:(NSUInteger)1] retain];
+    FOLLOW_expr_in_atom710 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_atom710_data Count:(NSUInteger)1] retain];
+    FOLLOW_K_RCURVE_in_atom712 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_RCURVE_in_atom712_data Count:(NSUInteger)1] retain];
 
-    [ANTLRBaseRecognizer setTokenNames:[[AMutableArray arrayWithObjects:@"<invalid>", @"<EOR>", @"<DOWN>", @"<UP>", 
+    [BaseRecognizer setTokenNames:[[AMutableArray arrayWithObjects:@"<invalid>", @"<EOR>", @"<DOWN>", @"<UP>", 
  @"ARG_DEF", @"BLOCK", @"FUNC_DECL", @"FUNC_DEF", @"FUNC_HDR", @"K_CHAR", 
  @"K_COMMA", @"K_EQ", @"K_EQEQ", @"K_FOR", @"K_ID", @"K_INT", @"K_INT_TYPE", 
  @"K_LCURLY", @"K_LCURVE", @"K_LT", @"K_PLUS", @"K_RCURLY", @"K_RCURVE", 
  @"K_SEMICOLON", @"K_VOID", @"VAR_DEF", @"WS", nil] retain]];
-    [ANTLRBaseRecognizer setGrammarFileName:@"SimpleC.g"];
+    [BaseRecognizer setGrammarFileName:@"/Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g"];
 }
 
-+ (SimpleCParser *)newSimpleCParser:(id<ANTLRTokenStream>)aStream
++ (SimpleCParser *)newSimpleCParser:(id<TokenStream>)aStream
 {
     return [[SimpleCParser alloc] initWithTokenStream:aStream];
-
-
 }
 
-- (id) initWithTokenStream:(id<ANTLRTokenStream>)aStream
+- (id) initWithTokenStream:(id<TokenStream>)aStream
 {
-    self = [super initWithTokenStream:aStream State:[[ANTLRRecognizerSharedState newANTLRRecognizerSharedStateWithRuleLen:15+1] retain]];
+    self = [super initWithTokenStream:aStream State:[[RecognizerSharedState newRecognizerSharedStateWithRuleLen:15+1] retain]];
     if ( self != nil ) {
-
-
         dfa2 = [DFA2 newDFA2WithRecognizer:self];
         /* start of actions-actionScope-init */
         /* start of init */
         /* AST genericParser.init */
-        [self setTreeAdaptor:[[ANTLRCommonTreeAdaptor newTreeAdaptor] retain]];
+        [self setTreeAdaptor:[[CommonTreeAdaptor newTreeAdaptor] retain]];
     }
     return self;
 }
@@ -948,19 +947,17 @@
     [super dealloc];
 }
 
-/* ObjC start members */
-/* ObjC end members */
 /* ObjC start actions.(actionScope).methods */
 /* ObjC end actions.(actionScope).methods */
 /* ObjC start methods() */
 /* AST genericParser.methods */
 /* AST parserMethods */
-- (id<ANTLRTreeAdaptor>) getTreeAdaptor
+- (id<TreeAdaptor>) getTreeAdaptor
 {
 	return treeAdaptor;
 }
 
-- (void) setTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor
+- (void) setTreeAdaptor:(id<TreeAdaptor>)aTreeAdaptor
 {
 	if (aTreeAdaptor != treeAdaptor) {
 		treeAdaptor = aTreeAdaptor;
@@ -970,33 +967,35 @@
 /* ObjC start rules */
 /*
  * $ANTLR start program
- * SimpleC.g:16:1: program : ( declaration )+ ;
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:16:1: program : ( declaration )+ ;
  */
 - (SimpleCParser_program_return *) program
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
 
     /* AST ruleDeclarations */
+    /* ruleDeclarations */
     SimpleCParser_program_return * retval = [SimpleCParser_program_return newSimpleCParser_program_return];
     [retval setStart:[input LT:1]];
 
 
-    ANTLRCommonTree *root_0 = nil;
+    CommonTree *root_0 = nil;
 
     @try {
         /* AST ruleLabelDefs */
-         SimpleCParser_declaration_return * declaration1 = nil ;
-         
+        /* ruleLabelDefs entry */
+        SimpleCParser_declaration_return * declaration1 = nil ;
 
 
-        // SimpleC.g:17:5: ( ( declaration )+ ) // ruleBlockSingleAlt
-        // SimpleC.g:17:9: ( declaration )+ // alt
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:17:5: ( ( declaration )+ ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:17:9: ( declaration )+ // alt
         {
-        root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+        root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
 
 
-        // SimpleC.g:17:9: ( declaration )+ // positiveClosureBlock
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:17:9: ( declaration )+ // positiveClosureBlock
         NSInteger cnt1 = 0;
         do {
             NSInteger alt1 = 2;
@@ -1008,8 +1007,9 @@
 
             switch (alt1) {
                 case 1 : ;
-                    // SimpleC.g:17:9: declaration // alt
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:17:9: declaration // alt
                     {
+
                     /* ASTParser ruleRef */
                     /* ruleRef */
                     [self pushFollow:FOLLOW_declaration_in_program85];
@@ -1019,45 +1019,45 @@
 
 
                     [treeAdaptor addChild:[declaration1 getTree] toTree:root_0];
-
+                     
                     }
                     break;
 
                 default :
                     if ( cnt1 >= 1 )
                         goto loop1;
-                    ANTLREarlyExitException *eee =
-                        [ANTLREarlyExitException newException:input decisionNumber:1];
+                    EarlyExitException *eee =
+                        [EarlyExitException newException:input decisionNumber:1];
                     @throw eee;
             }
             cnt1++;
         } while (YES);
         loop1: ;
 
-
+         
         }
 
         /* ASTParser ruleCleanUp */
         /* AST ruleCleanUp */
-        // token+rule list labels
+        /* token+rule list labels */
         [retval setStop:[input LT:-1]];
 
 
 
-            retval.tree = (ANTLRCommonTree *)[treeAdaptor rulePostProcessing:root_0];
+            retval.tree = (CommonTree *)[treeAdaptor rulePostProcessing:root_0];
             [treeAdaptor setTokenBoundaries:retval.tree From:retval.start To:retval.stopToken];
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
         /* ASTParser rule.setErrorReturnValue */
-        retval.tree = (ANTLRCommonTree *)[treeAdaptor errorNode:input From:retval.start To:[input LT:-1] Exception:re];
+        retval.tree = (CommonTree *)[treeAdaptor errorNode:input From:retval.start To:[input LT:-1] Exception:re];
 
     }
 
     @finally {
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return retval;
@@ -1066,50 +1066,51 @@
 
 /*
  * $ANTLR start declaration
- * SimpleC.g:20:1: declaration : ( variable | functionHeader K_SEMICOLON -> ^( FUNC_DECL functionHeader ) | functionHeader block -> ^( FUNC_DEF functionHeader block ) );
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:20:1: declaration : ( variable | functionHeader K_SEMICOLON -> ^( FUNC_DECL functionHeader ) | functionHeader block -> ^( FUNC_DEF functionHeader block ) );
  */
 - (SimpleCParser_declaration_return *) declaration
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
 
     /* AST ruleDeclarations */
+    /* ruleDeclarations */
     SimpleCParser_declaration_return * retval = [SimpleCParser_declaration_return newSimpleCParser_declaration_return];
     [retval setStart:[input LT:1]];
 
 
-    ANTLRCommonTree *root_0 = nil;
+    CommonTree *root_0 = nil;
 
     @try {
         /* AST ruleLabelDefs */
-        ANTLRCommonToken *K_SEMICOLON4 = nil;
-         SimpleCParser_variable_return * variable2 = nil ;
-         
-         SimpleCParser_functionHeader_return * functionHeader3 = nil ;
-         
-         SimpleCParser_functionHeader_return * functionHeader5 = nil ;
-         
-         SimpleCParser_block_return * block6 = nil ;
-         
+        /* ruleLabelDefs entry */
+        CommonToken *K_SEMICOLON4 = nil;SimpleCParser_variable_return * variable2 = nil ;
 
-        ANTLRCommonTree *K_SEMICOLON4_tree=nil;
-        ANTLRRewriteRuleTokenStream *stream_K_SEMICOLON =
-            [[ANTLRRewriteRuleTokenStream newANTLRRewriteRuleTokenStream:treeAdaptor
+        SimpleCParser_functionHeader_return * functionHeader3 = nil ;
+
+        SimpleCParser_functionHeader_return * functionHeader5 = nil ;
+
+        SimpleCParser_block_return * block6 = nil ;
+
+
+        CommonTree *K_SEMICOLON4_tree=nil;
+        RewriteRuleTokenStream *stream_K_SEMICOLON =
+            [[RewriteRuleTokenStream newRewriteRuleTokenStream:treeAdaptor
                                                              description:@"token K_SEMICOLON"] retain];
-        ANTLRRewriteRuleSubtreeStream *stream_functionHeader =
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
+        RewriteRuleSubtreeStream *stream_functionHeader =
+            [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
                                                                 description:@"rule functionHeader"] retain];
-        ANTLRRewriteRuleSubtreeStream *stream_block =
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
+        RewriteRuleSubtreeStream *stream_block =
+            [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
                                                                 description:@"rule block"] retain];
-        // SimpleC.g:21:5: ( variable | functionHeader K_SEMICOLON -> ^( FUNC_DECL functionHeader ) | functionHeader block -> ^( FUNC_DEF functionHeader block ) ) //ruleblock
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:21:5: ( variable | functionHeader K_SEMICOLON -> ^( FUNC_DECL functionHeader ) | functionHeader block -> ^( FUNC_DEF functionHeader block ) ) //ruleblock
         NSInteger alt2=3;
         alt2 = [dfa2 predict:input];
         switch (alt2) {
             case 1 : ;
-                // SimpleC.g:21:9: variable // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:21:9: variable // alt
                 {
-                root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+                root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+
 
 
                 /* ASTParser ruleRef */
@@ -1121,12 +1122,13 @@
 
 
                 [treeAdaptor addChild:[variable2 getTree] toTree:root_0];
-
+                 
                 }
                 break;
             case 2 : ;
-                // SimpleC.g:22:9: functionHeader K_SEMICOLON // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:22:9: functionHeader K_SEMICOLON // alt
                 {
+
                 /* ruleRef */
                 [self pushFollow:FOLLOW_functionHeader_in_declaration115];
                 functionHeader3 = [self functionHeader];
@@ -1135,11 +1137,11 @@
 
 
                 [stream_functionHeader addElement:[functionHeader3 getTree]];
-
-                K_SEMICOLON4=(ANTLRCommonToken *)[self match:input TokenType:K_SEMICOLON Follow:FOLLOW_K_SEMICOLON_in_declaration117];  
+                 
+                K_SEMICOLON4=(CommonToken *)[self match:input TokenType:K_SEMICOLON Follow:FOLLOW_K_SEMICOLON_in_declaration117];  
                     [stream_K_SEMICOLON addElement:K_SEMICOLON4];
 
-
+                 
                 // AST REWRITE
                 // elements: functionHeader
                 // token labels: 
@@ -1149,19 +1151,19 @@
                 // wildcard labels: 
                 retval.tree = root_0;
 
-                ANTLRRewriteRuleSubtreeStream *stream_retval =
-                    [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
+                RewriteRuleSubtreeStream *stream_retval =
+                    [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
                         description:@"token retval" element:retval!=nil?[retval getTree]:nil] retain];
 
-                root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+                root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
 
                 // 22:36: -> ^( FUNC_DECL functionHeader )
                 {
-                    // SimpleC.g:22:39: ^( FUNC_DECL functionHeader )
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:22:39: ^( FUNC_DECL functionHeader )
                     {
-                        ANTLRCommonTree *root_1 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
-                        root_1 = (ANTLRCommonTree *)[treeAdaptor becomeRoot:
-                                [treeAdaptor createTree:FUNC_DECL Text:@"FUNC_DECL"]
+                        CommonTree *root_1 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+                        root_1 = (CommonTree *)[treeAdaptor becomeRoot:
+                                [[treeAdaptor createTree:FUNC_DECL Text:@"FUNC_DECL"] retain]
                          old:root_1];
 
                         [treeAdaptor addChild:[stream_functionHeader nextTree] toTree:root_1];
@@ -1178,8 +1180,9 @@
                 }
                 break;
             case 3 : ;
-                // SimpleC.g:23:9: functionHeader block // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:23:9: functionHeader block // alt
                 {
+
                 /* ruleRef */
                 [self pushFollow:FOLLOW_functionHeader_in_declaration135];
                 functionHeader5 = [self functionHeader];
@@ -1188,7 +1191,7 @@
 
 
                 [stream_functionHeader addElement:[functionHeader5 getTree]];
-
+                 
                 /* ruleRef */
                 [self pushFollow:FOLLOW_block_in_declaration137];
                 block6 = [self block];
@@ -1197,7 +1200,7 @@
 
 
                 [stream_block addElement:[block6 getTree]];
-
+                 
                 // AST REWRITE
                 // elements: functionHeader, block
                 // token labels: 
@@ -1207,19 +1210,19 @@
                 // wildcard labels: 
                 retval.tree = root_0;
 
-                ANTLRRewriteRuleSubtreeStream *stream_retval =
-                    [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
+                RewriteRuleSubtreeStream *stream_retval =
+                    [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
                         description:@"token retval" element:retval!=nil?[retval getTree]:nil] retain];
 
-                root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+                root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
 
                 // 23:30: -> ^( FUNC_DEF functionHeader block )
                 {
-                    // SimpleC.g:23:33: ^( FUNC_DEF functionHeader block )
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:23:33: ^( FUNC_DEF functionHeader block )
                     {
-                        ANTLRCommonTree *root_1 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
-                        root_1 = (ANTLRCommonTree *)[treeAdaptor becomeRoot:
-                                [treeAdaptor createTree:FUNC_DEF Text:@"FUNC_DEF"]
+                        CommonTree *root_1 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+                        root_1 = (CommonTree *)[treeAdaptor becomeRoot:
+                                [[treeAdaptor createTree:FUNC_DEF Text:@"FUNC_DEF"] retain]
                          old:root_1];
 
                         [treeAdaptor addChild:[stream_functionHeader nextTree] toTree:root_1];
@@ -1241,7 +1244,7 @@
         }
         /* ASTParser ruleCleanUp */
         /* AST ruleCleanUp */
-        // token+rule list labels
+        /* token+rule list labels */
         [retval setStop:[input LT:-1]];
 
 
@@ -1249,20 +1252,20 @@
         [stream_functionHeader release];
         [stream_block release];
 
-            retval.tree = (ANTLRCommonTree *)[treeAdaptor rulePostProcessing:root_0];
+            retval.tree = (CommonTree *)[treeAdaptor rulePostProcessing:root_0];
             [treeAdaptor setTokenBoundaries:retval.tree From:retval.start To:retval.stopToken];
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
         /* ASTParser rule.setErrorReturnValue */
-        retval.tree = (ANTLRCommonTree *)[treeAdaptor errorNode:input From:retval.start To:[input LT:-1] Exception:re];
+        retval.tree = (CommonTree *)[treeAdaptor errorNode:input From:retval.start To:[input LT:-1] Exception:re];
 
     }
 
     @finally {
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return retval;
@@ -1271,41 +1274,42 @@
 
 /*
  * $ANTLR start variable
- * SimpleC.g:26:1: variable : type declarator K_SEMICOLON -> ^( VAR_DEF type declarator ) ;
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:26:1: variable : type declarator K_SEMICOLON -> ^( VAR_DEF type declarator ) ;
  */
 - (SimpleCParser_variable_return *) variable
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
 
     /* AST ruleDeclarations */
+    /* ruleDeclarations */
     SimpleCParser_variable_return * retval = [SimpleCParser_variable_return newSimpleCParser_variable_return];
     [retval setStart:[input LT:1]];
 
 
-    ANTLRCommonTree *root_0 = nil;
+    CommonTree *root_0 = nil;
 
     @try {
         /* AST ruleLabelDefs */
-        ANTLRCommonToken *K_SEMICOLON9 = nil;
-         SimpleCParser_type_return * type7 = nil ;
-         
-         SimpleCParser_declarator_return * declarator8 = nil ;
-         
+        /* ruleLabelDefs entry */
+        CommonToken *K_SEMICOLON9 = nil;SimpleCParser_type_return * type7 = nil ;
 
-        ANTLRCommonTree *K_SEMICOLON9_tree=nil;
-        ANTLRRewriteRuleTokenStream *stream_K_SEMICOLON =
-            [[ANTLRRewriteRuleTokenStream newANTLRRewriteRuleTokenStream:treeAdaptor
+        SimpleCParser_declarator_return * declarator8 = nil ;
+
+
+        CommonTree *K_SEMICOLON9_tree=nil;
+        RewriteRuleTokenStream *stream_K_SEMICOLON =
+            [[RewriteRuleTokenStream newRewriteRuleTokenStream:treeAdaptor
                                                              description:@"token K_SEMICOLON"] retain];
-        ANTLRRewriteRuleSubtreeStream *stream_declarator =
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
+        RewriteRuleSubtreeStream *stream_declarator =
+            [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
                                                                 description:@"rule declarator"] retain];
-        ANTLRRewriteRuleSubtreeStream *stream_type =
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
+        RewriteRuleSubtreeStream *stream_type =
+            [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
                                                                 description:@"rule type"] retain];
-        // SimpleC.g:27:5: ( type declarator K_SEMICOLON -> ^( VAR_DEF type declarator ) ) // ruleBlockSingleAlt
-        // SimpleC.g:27:9: type declarator K_SEMICOLON // alt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:27:5: ( type declarator K_SEMICOLON -> ^( VAR_DEF type declarator ) ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:27:9: type declarator K_SEMICOLON // alt
         {
+
         /* ruleRef */
         [self pushFollow:FOLLOW_type_in_variable166];
         type7 = [self type];
@@ -1314,7 +1318,7 @@
 
 
         [stream_type addElement:[type7 getTree]];
-
+         
         /* ruleRef */
         [self pushFollow:FOLLOW_declarator_in_variable168];
         declarator8 = [self declarator];
@@ -1323,11 +1327,11 @@
 
 
         [stream_declarator addElement:[declarator8 getTree]];
-
-        K_SEMICOLON9=(ANTLRCommonToken *)[self match:input TokenType:K_SEMICOLON Follow:FOLLOW_K_SEMICOLON_in_variable170];  
+         
+        K_SEMICOLON9=(CommonToken *)[self match:input TokenType:K_SEMICOLON Follow:FOLLOW_K_SEMICOLON_in_variable170];  
             [stream_K_SEMICOLON addElement:K_SEMICOLON9];
 
-
+         
         // AST REWRITE
         // elements: declarator, type
         // token labels: 
@@ -1337,19 +1341,19 @@
         // wildcard labels: 
         retval.tree = root_0;
 
-        ANTLRRewriteRuleSubtreeStream *stream_retval =
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
+        RewriteRuleSubtreeStream *stream_retval =
+            [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
                 description:@"token retval" element:retval!=nil?[retval getTree]:nil] retain];
 
-        root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+        root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
 
         // 27:37: -> ^( VAR_DEF type declarator )
         {
-            // SimpleC.g:27:40: ^( VAR_DEF type declarator )
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:27:40: ^( VAR_DEF type declarator )
             {
-                ANTLRCommonTree *root_1 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
-                root_1 = (ANTLRCommonTree *)[treeAdaptor becomeRoot:
-                        [treeAdaptor createTree:VAR_DEF Text:@"VAR_DEF"]
+                CommonTree *root_1 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+                root_1 = (CommonTree *)[treeAdaptor becomeRoot:
+                        [[treeAdaptor createTree:VAR_DEF Text:@"VAR_DEF"] retain]
                  old:root_1];
 
                 [treeAdaptor addChild:[stream_type nextTree] toTree:root_1];
@@ -1369,7 +1373,7 @@
 
         /* ASTParser ruleCleanUp */
         /* AST ruleCleanUp */
-        // token+rule list labels
+        /* token+rule list labels */
         [retval setStop:[input LT:-1]];
 
 
@@ -1377,20 +1381,20 @@
         [stream_declarator release];
         [stream_type release];
 
-            retval.tree = (ANTLRCommonTree *)[treeAdaptor rulePostProcessing:root_0];
+            retval.tree = (CommonTree *)[treeAdaptor rulePostProcessing:root_0];
             [treeAdaptor setTokenBoundaries:retval.tree From:retval.start To:retval.stopToken];
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
         /* ASTParser rule.setErrorReturnValue */
-        retval.tree = (ANTLRCommonTree *)[treeAdaptor errorNode:input From:retval.start To:[input LT:-1] Exception:re];
+        retval.tree = (CommonTree *)[treeAdaptor errorNode:input From:retval.start To:[input LT:-1] Exception:re];
 
     }
 
     @finally {
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return retval;
@@ -1399,63 +1403,65 @@
 
 /*
  * $ANTLR start declarator
- * SimpleC.g:30:1: declarator : K_ID ;
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:30:1: declarator : K_ID ;
  */
 - (SimpleCParser_declarator_return *) declarator
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
 
     /* AST ruleDeclarations */
+    /* ruleDeclarations */
     SimpleCParser_declarator_return * retval = [SimpleCParser_declarator_return newSimpleCParser_declarator_return];
     [retval setStart:[input LT:1]];
 
 
-    ANTLRCommonTree *root_0 = nil;
+    CommonTree *root_0 = nil;
 
     @try {
         /* AST ruleLabelDefs */
-        ANTLRCommonToken *K_ID10 = nil;
+        /* ruleLabelDefs entry */
+        CommonToken *K_ID10 = nil;
 
-        ANTLRCommonTree *K_ID10_tree=nil;
+        CommonTree *K_ID10_tree=nil;
 
-        // SimpleC.g:31:5: ( K_ID ) // ruleBlockSingleAlt
-        // SimpleC.g:31:9: K_ID // alt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:31:5: ( K_ID ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:31:9: K_ID // alt
         {
-        root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+        root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+
 
 
         /* ASTParser tokenRef */
-        K_ID10=(ANTLRCommonToken *)[self match:input TokenType:K_ID Follow:FOLLOW_K_ID_in_declarator199]; 
+        K_ID10=(CommonToken *)[self match:input TokenType:K_ID Follow:FOLLOW_K_ID_in_declarator199]; 
         K_ID10_tree = /* ASTParser createNodeFromToken */
-        (ANTLRCommonTree *)[[treeAdaptor create:K_ID10] retain]
+        (CommonTree *)[[treeAdaptor create:K_ID10] retain]
         ;
         [treeAdaptor addChild:K_ID10_tree  toTree:root_0];
 
-
+         
         }
 
         /* ASTParser ruleCleanUp */
         /* AST ruleCleanUp */
-        // token+rule list labels
+        /* token+rule list labels */
         [retval setStop:[input LT:-1]];
 
 
 
-            retval.tree = (ANTLRCommonTree *)[treeAdaptor rulePostProcessing:root_0];
+            retval.tree = (CommonTree *)[treeAdaptor rulePostProcessing:root_0];
             [treeAdaptor setTokenBoundaries:retval.tree From:retval.start To:retval.stopToken];
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
         /* ASTParser rule.setErrorReturnValue */
-        retval.tree = (ANTLRCommonTree *)[treeAdaptor errorNode:input From:retval.start To:[input LT:-1] Exception:re];
+        retval.tree = (CommonTree *)[treeAdaptor errorNode:input From:retval.start To:[input LT:-1] Exception:re];
 
     }
 
     @finally {
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return retval;
@@ -1464,58 +1470,59 @@
 
 /*
  * $ANTLR start functionHeader
- * SimpleC.g:34:1: functionHeader : type K_ID K_LCURVE ( formalParameter ( K_COMMA formalParameter )* )? K_RCURVE -> ^( FUNC_HDR type K_ID ( formalParameter )+ ) ;
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:34:1: functionHeader : type K_ID K_LCURVE ( formalParameter ( K_COMMA formalParameter )* )? K_RCURVE -> ^( FUNC_HDR type K_ID ( formalParameter )+ ) ;
  */
 - (SimpleCParser_functionHeader_return *) functionHeader
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
 
     /* AST ruleDeclarations */
+    /* ruleDeclarations */
     SimpleCParser_functionHeader_return * retval = [SimpleCParser_functionHeader_return newSimpleCParser_functionHeader_return];
     [retval setStart:[input LT:1]];
 
 
-    ANTLRCommonTree *root_0 = nil;
+    CommonTree *root_0 = nil;
 
     @try {
         /* AST ruleLabelDefs */
-        ANTLRCommonToken *K_ID12 = nil;
-        ANTLRCommonToken *K_LCURVE13 = nil;
-        ANTLRCommonToken *K_COMMA15 = nil;
-        ANTLRCommonToken *K_RCURVE17 = nil;
-         SimpleCParser_type_return * type11 = nil ;
-         
-         SimpleCParser_formalParameter_return * formalParameter14 = nil ;
-         
-         SimpleCParser_formalParameter_return * formalParameter16 = nil ;
-         
+        /* ruleLabelDefs entry */
+        CommonToken *K_ID12 = nil;
+        CommonToken *K_LCURVE13 = nil;
+        CommonToken *K_COMMA15 = nil;
+        CommonToken *K_RCURVE17 = nil;SimpleCParser_type_return * type11 = nil ;
 
-        ANTLRCommonTree *K_ID12_tree=nil;
-        ANTLRCommonTree *K_LCURVE13_tree=nil;
-        ANTLRCommonTree *K_COMMA15_tree=nil;
-        ANTLRCommonTree *K_RCURVE17_tree=nil;
-        ANTLRRewriteRuleTokenStream *stream_K_ID =
-            [[ANTLRRewriteRuleTokenStream newANTLRRewriteRuleTokenStream:treeAdaptor
+        SimpleCParser_formalParameter_return * formalParameter14 = nil ;
+
+        SimpleCParser_formalParameter_return * formalParameter16 = nil ;
+
+
+        CommonTree *K_ID12_tree=nil;
+        CommonTree *K_LCURVE13_tree=nil;
+        CommonTree *K_COMMA15_tree=nil;
+        CommonTree *K_RCURVE17_tree=nil;
+        RewriteRuleTokenStream *stream_K_ID =
+            [[RewriteRuleTokenStream newRewriteRuleTokenStream:treeAdaptor
                                                              description:@"token K_ID"] retain];
-        ANTLRRewriteRuleTokenStream *stream_K_LCURVE =
-            [[ANTLRRewriteRuleTokenStream newANTLRRewriteRuleTokenStream:treeAdaptor
+        RewriteRuleTokenStream *stream_K_LCURVE =
+            [[RewriteRuleTokenStream newRewriteRuleTokenStream:treeAdaptor
                                                              description:@"token K_LCURVE"] retain];
-        ANTLRRewriteRuleTokenStream *stream_K_RCURVE =
-            [[ANTLRRewriteRuleTokenStream newANTLRRewriteRuleTokenStream:treeAdaptor
+        RewriteRuleTokenStream *stream_K_RCURVE =
+            [[RewriteRuleTokenStream newRewriteRuleTokenStream:treeAdaptor
                                                              description:@"token K_RCURVE"] retain];
-        ANTLRRewriteRuleTokenStream *stream_K_COMMA =
-            [[ANTLRRewriteRuleTokenStream newANTLRRewriteRuleTokenStream:treeAdaptor
+        RewriteRuleTokenStream *stream_K_COMMA =
+            [[RewriteRuleTokenStream newRewriteRuleTokenStream:treeAdaptor
                                                              description:@"token K_COMMA"] retain];
-        ANTLRRewriteRuleSubtreeStream *stream_formalParameter =
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
+        RewriteRuleSubtreeStream *stream_formalParameter =
+            [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
                                                                 description:@"rule formalParameter"] retain];
-        ANTLRRewriteRuleSubtreeStream *stream_type =
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
+        RewriteRuleSubtreeStream *stream_type =
+            [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
                                                                 description:@"rule type"] retain];
-        // SimpleC.g:35:5: ( type K_ID K_LCURVE ( formalParameter ( K_COMMA formalParameter )* )? K_RCURVE -> ^( FUNC_HDR type K_ID ( formalParameter )+ ) ) // ruleBlockSingleAlt
-        // SimpleC.g:35:9: type K_ID K_LCURVE ( formalParameter ( K_COMMA formalParameter )* )? K_RCURVE // alt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:35:5: ( type K_ID K_LCURVE ( formalParameter ( K_COMMA formalParameter )* )? K_RCURVE -> ^( FUNC_HDR type K_ID ( formalParameter )+ ) ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:35:9: type K_ID K_LCURVE ( formalParameter ( K_COMMA formalParameter )* )? K_RCURVE // alt
         {
+
         /* ruleRef */
         [self pushFollow:FOLLOW_type_in_functionHeader219];
         type11 = [self type];
@@ -1524,16 +1531,16 @@
 
 
         [stream_type addElement:[type11 getTree]];
-
-        K_ID12=(ANTLRCommonToken *)[self match:input TokenType:K_ID Follow:FOLLOW_K_ID_in_functionHeader221];  
+         
+        K_ID12=(CommonToken *)[self match:input TokenType:K_ID Follow:FOLLOW_K_ID_in_functionHeader221];  
             [stream_K_ID addElement:K_ID12];
 
-
-        K_LCURVE13=(ANTLRCommonToken *)[self match:input TokenType:K_LCURVE Follow:FOLLOW_K_LCURVE_in_functionHeader223];  
+         
+        K_LCURVE13=(CommonToken *)[self match:input TokenType:K_LCURVE Follow:FOLLOW_K_LCURVE_in_functionHeader223];  
             [stream_K_LCURVE addElement:K_LCURVE13];
 
-
-        // SimpleC.g:35:28: ( formalParameter ( K_COMMA formalParameter )* )? // block
+         
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:35:28: ( formalParameter ( K_COMMA formalParameter )* )? // block
         NSInteger alt4=2;
         NSInteger LA4_0 = [input LA:1];
 
@@ -1542,8 +1549,9 @@
         }
         switch (alt4) {
             case 1 : ;
-                // SimpleC.g:35:30: formalParameter ( K_COMMA formalParameter )* // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:35:30: formalParameter ( K_COMMA formalParameter )* // alt
                 {
+
                 /* ruleRef */
                 [self pushFollow:FOLLOW_formalParameter_in_functionHeader227];
                 formalParameter14 = [self formalParameter];
@@ -1552,6 +1560,7 @@
 
 
                 [stream_formalParameter addElement:[formalParameter14 getTree]];
+                 
 
                 do {
                     NSInteger alt3=2;
@@ -1563,12 +1572,13 @@
 
                     switch (alt3) {
                         case 1 : ;
-                            // SimpleC.g:35:48: K_COMMA formalParameter // alt
+                            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:35:48: K_COMMA formalParameter // alt
                             {
-                            K_COMMA15=(ANTLRCommonToken *)[self match:input TokenType:K_COMMA Follow:FOLLOW_K_COMMA_in_functionHeader231];  
+
+                            K_COMMA15=(CommonToken *)[self match:input TokenType:K_COMMA Follow:FOLLOW_K_COMMA_in_functionHeader231];  
                                 [stream_K_COMMA addElement:K_COMMA15];
 
-
+                             
                             /* ruleRef */
                             [self pushFollow:FOLLOW_formalParameter_in_functionHeader233];
                             formalParameter16 = [self formalParameter];
@@ -1577,7 +1587,7 @@
 
 
                             [stream_formalParameter addElement:[formalParameter16 getTree]];
-
+                             
                             }
                             break;
 
@@ -1587,19 +1597,19 @@
                 } while (YES);
                 loop3: ;
 
-
+                 
                 }
                 break;
 
         }
 
-
-        K_RCURVE17=(ANTLRCommonToken *)[self match:input TokenType:K_RCURVE Follow:FOLLOW_K_RCURVE_in_functionHeader241];  
+         
+        K_RCURVE17=(CommonToken *)[self match:input TokenType:K_RCURVE Follow:FOLLOW_K_RCURVE_in_functionHeader241];  
             [stream_K_RCURVE addElement:K_RCURVE17];
 
-
+         
         // AST REWRITE
-        // elements: formalParameter, type, K_ID
+        // elements: K_ID, type, formalParameter
         // token labels: 
         // rule labels: retval
         // token list labels: 
@@ -1607,19 +1617,19 @@
         // wildcard labels: 
         retval.tree = root_0;
 
-        ANTLRRewriteRuleSubtreeStream *stream_retval =
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
+        RewriteRuleSubtreeStream *stream_retval =
+            [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
                 description:@"token retval" element:retval!=nil?[retval getTree]:nil] retain];
 
-        root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+        root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
 
         // 36:9: -> ^( FUNC_HDR type K_ID ( formalParameter )+ )
         {
-            // SimpleC.g:36:12: ^( FUNC_HDR type K_ID ( formalParameter )+ )
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:36:12: ^( FUNC_HDR type K_ID ( formalParameter )+ )
             {
-                ANTLRCommonTree *root_1 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
-                root_1 = (ANTLRCommonTree *)[treeAdaptor becomeRoot:
-                        [treeAdaptor createTree:FUNC_HDR Text:@"FUNC_HDR"]
+                CommonTree *root_1 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+                root_1 = (CommonTree *)[treeAdaptor becomeRoot:
+                        [[treeAdaptor createTree:FUNC_HDR Text:@"FUNC_HDR"] retain]
                  old:root_1];
 
                 [treeAdaptor addChild:[stream_type nextTree] toTree:root_1];
@@ -1629,10 +1639,10 @@
                             [stream_K_ID nextNode]
                  toTree:root_1];
 
-                // SimpleC.g:36:33: ( formalParameter )+
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:36:33: ( formalParameter )+
                 {
                 if ( !([stream_formalParameter hasNext]) ) {
-                    @throw [ANTLRRewriteEarlyExitException newException];
+                    @throw [RewriteEarlyExitException newException];
                 }
                 while ( [stream_formalParameter hasNext] ) {
                     [treeAdaptor addChild:[stream_formalParameter nextTree] toTree:root_1];
@@ -1654,7 +1664,7 @@
 
         /* ASTParser ruleCleanUp */
         /* AST ruleCleanUp */
-        // token+rule list labels
+        /* token+rule list labels */
         [retval setStop:[input LT:-1]];
 
 
@@ -1665,20 +1675,20 @@
         [stream_formalParameter release];
         [stream_type release];
 
-            retval.tree = (ANTLRCommonTree *)[treeAdaptor rulePostProcessing:root_0];
+            retval.tree = (CommonTree *)[treeAdaptor rulePostProcessing:root_0];
             [treeAdaptor setTokenBoundaries:retval.tree From:retval.start To:retval.stopToken];
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
         /* ASTParser rule.setErrorReturnValue */
-        retval.tree = (ANTLRCommonTree *)[treeAdaptor errorNode:input From:retval.start To:[input LT:-1] Exception:re];
+        retval.tree = (CommonTree *)[treeAdaptor errorNode:input From:retval.start To:[input LT:-1] Exception:re];
 
     }
 
     @finally {
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return retval;
@@ -1687,36 +1697,38 @@
 
 /*
  * $ANTLR start formalParameter
- * SimpleC.g:39:1: formalParameter : type declarator -> ^( ARG_DEF type declarator ) ;
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:39:1: formalParameter : type declarator -> ^( ARG_DEF type declarator ) ;
  */
 - (SimpleCParser_formalParameter_return *) formalParameter
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
 
     /* AST ruleDeclarations */
+    /* ruleDeclarations */
     SimpleCParser_formalParameter_return * retval = [SimpleCParser_formalParameter_return newSimpleCParser_formalParameter_return];
     [retval setStart:[input LT:1]];
 
 
-    ANTLRCommonTree *root_0 = nil;
+    CommonTree *root_0 = nil;
 
     @try {
         /* AST ruleLabelDefs */
-         SimpleCParser_type_return * type18 = nil ;
-         
-         SimpleCParser_declarator_return * declarator19 = nil ;
-         
+        /* ruleLabelDefs entry */
+        SimpleCParser_type_return * type18 = nil ;
 
-        ANTLRRewriteRuleSubtreeStream *stream_declarator =
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
+        SimpleCParser_declarator_return * declarator19 = nil ;
+
+
+        RewriteRuleSubtreeStream *stream_declarator =
+            [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
                                                                 description:@"rule declarator"] retain];
-        ANTLRRewriteRuleSubtreeStream *stream_type =
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
+        RewriteRuleSubtreeStream *stream_type =
+            [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
                                                                 description:@"rule type"] retain];
-        // SimpleC.g:40:5: ( type declarator -> ^( ARG_DEF type declarator ) ) // ruleBlockSingleAlt
-        // SimpleC.g:40:9: type declarator // alt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:40:5: ( type declarator -> ^( ARG_DEF type declarator ) ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:40:9: type declarator // alt
         {
+
         /* ruleRef */
         [self pushFollow:FOLLOW_type_in_formalParameter281];
         type18 = [self type];
@@ -1725,7 +1737,7 @@
 
 
         [stream_type addElement:[type18 getTree]];
-
+         
         /* ruleRef */
         [self pushFollow:FOLLOW_declarator_in_formalParameter283];
         declarator19 = [self declarator];
@@ -1734,9 +1746,9 @@
 
 
         [stream_declarator addElement:[declarator19 getTree]];
-
+         
         // AST REWRITE
-        // elements: declarator, type
+        // elements: type, declarator
         // token labels: 
         // rule labels: retval
         // token list labels: 
@@ -1744,19 +1756,19 @@
         // wildcard labels: 
         retval.tree = root_0;
 
-        ANTLRRewriteRuleSubtreeStream *stream_retval =
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
+        RewriteRuleSubtreeStream *stream_retval =
+            [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
                 description:@"token retval" element:retval!=nil?[retval getTree]:nil] retain];
 
-        root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+        root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
 
         // 40:25: -> ^( ARG_DEF type declarator )
         {
-            // SimpleC.g:40:28: ^( ARG_DEF type declarator )
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:40:28: ^( ARG_DEF type declarator )
             {
-                ANTLRCommonTree *root_1 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
-                root_1 = (ANTLRCommonTree *)[treeAdaptor becomeRoot:
-                        [treeAdaptor createTree:ARG_DEF Text:@"ARG_DEF"]
+                CommonTree *root_1 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+                root_1 = (CommonTree *)[treeAdaptor becomeRoot:
+                        [[treeAdaptor createTree:ARG_DEF Text:@"ARG_DEF"] retain]
                  old:root_1];
 
                 [treeAdaptor addChild:[stream_type nextTree] toTree:root_1];
@@ -1776,27 +1788,27 @@
 
         /* ASTParser ruleCleanUp */
         /* AST ruleCleanUp */
-        // token+rule list labels
+        /* token+rule list labels */
         [retval setStop:[input LT:-1]];
 
 
         [stream_declarator release];
         [stream_type release];
 
-            retval.tree = (ANTLRCommonTree *)[treeAdaptor rulePostProcessing:root_0];
+            retval.tree = (CommonTree *)[treeAdaptor rulePostProcessing:root_0];
             [treeAdaptor setTokenBoundaries:retval.tree From:retval.start To:retval.stopToken];
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
         /* ASTParser rule.setErrorReturnValue */
-        retval.tree = (ANTLRCommonTree *)[treeAdaptor errorNode:input From:retval.start To:[input LT:-1] Exception:re];
+        retval.tree = (CommonTree *)[treeAdaptor errorNode:input From:retval.start To:[input LT:-1] Exception:re];
 
     }
 
     @finally {
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return retval;
@@ -1805,71 +1817,73 @@
 
 /*
  * $ANTLR start type
- * SimpleC.g:43:1: type : ( K_INT_TYPE | K_CHAR | K_VOID | K_ID );
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:43:1: type : ( K_INT_TYPE | K_CHAR | K_VOID | K_ID );
  */
 - (SimpleCParser_type_return *) type
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
 
     /* AST ruleDeclarations */
+    /* ruleDeclarations */
     SimpleCParser_type_return * retval = [SimpleCParser_type_return newSimpleCParser_type_return];
     [retval setStart:[input LT:1]];
 
 
-    ANTLRCommonTree *root_0 = nil;
+    CommonTree *root_0 = nil;
 
     @try {
         /* AST ruleLabelDefs */
-        ANTLRCommonToken *set20 = nil;
+        /* ruleLabelDefs entry */
+        CommonToken *set20 = nil;
 
-        ANTLRCommonTree *set20_tree=nil;
+        CommonTree *set20_tree=nil;
 
-        // SimpleC.g:44:5: ( K_INT_TYPE | K_CHAR | K_VOID | K_ID ) // ruleBlockSingleAlt
-        // SimpleC.g: // alt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:44:5: ( K_INT_TYPE | K_CHAR | K_VOID | K_ID ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g: // alt
         {
-        root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+        root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+
 
 
         /* ASTParser matchRuleBlockSet */
         /* ASTParser matchSet */
-        set20 = (ANTLRCommonToken *)[input LT:1]; /* matchSet */
+        set20 = (CommonToken *)[input LT:1]; /* matchSet */
 
         if ([input LA:1] == K_CHAR||[input LA:1] == K_ID||[input LA:1] == K_INT_TYPE||[input LA:1] == K_VOID) {
             [input consume];
             [treeAdaptor addChild:/* ASTParser createNodeFromToken */
-            (ANTLRCommonTree *)[[treeAdaptor create:set20] retain]
+            (CommonTree *)[[treeAdaptor create:set20] retain]
              toTree:root_0 ];
             [state setIsErrorRecovery:NO];
         } else {
-            ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException newException:nil stream:input];
+            MismatchedSetException *mse = [MismatchedSetException newException:nil stream:input];
             @throw mse;
         }
 
-
+         
         }
 
         /* ASTParser ruleCleanUp */
         /* AST ruleCleanUp */
-        // token+rule list labels
+        /* token+rule list labels */
         [retval setStop:[input LT:-1]];
 
 
 
-            retval.tree = (ANTLRCommonTree *)[treeAdaptor rulePostProcessing:root_0];
+            retval.tree = (CommonTree *)[treeAdaptor rulePostProcessing:root_0];
             [treeAdaptor setTokenBoundaries:retval.tree From:retval.start To:retval.stopToken];
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
         /* ASTParser rule.setErrorReturnValue */
-        retval.tree = (ANTLRCommonTree *)[treeAdaptor errorNode:input From:retval.start To:[input LT:-1] Exception:re];
+        retval.tree = (CommonTree *)[treeAdaptor errorNode:input From:retval.start To:[input LT:-1] Exception:re];
 
     }
 
     @finally {
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return retval;
@@ -1878,49 +1892,51 @@
 
 /*
  * $ANTLR start block
- * SimpleC.g:50:1: block : lc= K_LCURLY ( variable )* ( stat )* K_RCURLY -> ^( BLOCK[$lc,@\"BLOCK\"] ( variable )* ( stat )* ) ;
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:50:1: block : lc= K_LCURLY ( variable )* ( stat )* K_RCURLY -> ^( BLOCK[$lc,@\"BLOCK\"] ( variable )* ( stat )* ) ;
  */
 - (SimpleCParser_block_return *) block
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
 
     /* AST ruleDeclarations */
+    /* ruleDeclarations */
     SimpleCParser_block_return * retval = [SimpleCParser_block_return newSimpleCParser_block_return];
     [retval setStart:[input LT:1]];
 
 
-    ANTLRCommonTree *root_0 = nil;
+    CommonTree *root_0 = nil;
 
     @try {
         /* AST ruleLabelDefs */
-        ANTLRCommonToken *lc = nil;
-        ANTLRCommonToken *K_RCURLY23 = nil;
-         SimpleCParser_variable_return * variable21 = nil ;
-         
-         SimpleCParser_stat_return * stat22 = nil ;
-         
+        /* ruleLabelDefs entry */
+        CommonToken *lc = nil;
+        CommonToken *K_RCURLY23 = nil;SimpleCParser_variable_return * variable21 = nil ;
 
-        ANTLRCommonTree *lc_tree=nil;
-        ANTLRCommonTree *K_RCURLY23_tree=nil;
-        ANTLRRewriteRuleTokenStream *stream_K_LCURLY =
-            [[ANTLRRewriteRuleTokenStream newANTLRRewriteRuleTokenStream:treeAdaptor
+        SimpleCParser_stat_return * stat22 = nil ;
+
+
+        CommonTree *lc_tree=nil;
+        CommonTree *K_RCURLY23_tree=nil;
+        RewriteRuleTokenStream *stream_K_LCURLY =
+            [[RewriteRuleTokenStream newRewriteRuleTokenStream:treeAdaptor
                                                              description:@"token K_LCURLY"] retain];
-        ANTLRRewriteRuleTokenStream *stream_K_RCURLY =
-            [[ANTLRRewriteRuleTokenStream newANTLRRewriteRuleTokenStream:treeAdaptor
+        RewriteRuleTokenStream *stream_K_RCURLY =
+            [[RewriteRuleTokenStream newRewriteRuleTokenStream:treeAdaptor
                                                              description:@"token K_RCURLY"] retain];
-        ANTLRRewriteRuleSubtreeStream *stream_variable =
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
+        RewriteRuleSubtreeStream *stream_variable =
+            [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
                                                                 description:@"rule variable"] retain];
-        ANTLRRewriteRuleSubtreeStream *stream_stat =
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
+        RewriteRuleSubtreeStream *stream_stat =
+            [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
                                                                 description:@"rule stat"] retain];
-        // SimpleC.g:51:5: (lc= K_LCURLY ( variable )* ( stat )* K_RCURLY -> ^( BLOCK[$lc,@\"BLOCK\"] ( variable )* ( stat )* ) ) // ruleBlockSingleAlt
-        // SimpleC.g:51:9: lc= K_LCURLY ( variable )* ( stat )* K_RCURLY // alt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:51:5: (lc= K_LCURLY ( variable )* ( stat )* K_RCURLY -> ^( BLOCK[$lc,@\"BLOCK\"] ( variable )* ( stat )* ) ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:51:9: lc= K_LCURLY ( variable )* ( stat )* K_RCURLY // alt
         {
-        lc=(ANTLRCommonToken *)[self match:input TokenType:K_LCURLY Follow:FOLLOW_K_LCURLY_in_block376];  
+
+        lc=(CommonToken *)[self match:input TokenType:K_LCURLY Follow:FOLLOW_K_LCURLY_in_block376];  
             [stream_K_LCURLY addElement:lc];
 
+         
 
         do {
             NSInteger alt5=2;
@@ -1940,8 +1956,9 @@
 
             switch (alt5) {
                 case 1 : ;
-                    // SimpleC.g:52:13: variable // alt
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:52:13: variable // alt
                     {
+
                     /* ruleRef */
                     [self pushFollow:FOLLOW_variable_in_block390];
                     variable21 = [self variable];
@@ -1950,7 +1967,7 @@
 
 
                     [stream_variable addElement:[variable21 getTree]];
-
+                     
                     }
                     break;
 
@@ -1960,6 +1977,7 @@
         } while (YES);
         loop5: ;
 
+         
 
         do {
             NSInteger alt6=2;
@@ -1971,8 +1989,9 @@
 
             switch (alt6) {
                 case 1 : ;
-                    // SimpleC.g:53:13: stat // alt
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:53:13: stat // alt
                     {
+
                     /* ruleRef */
                     [self pushFollow:FOLLOW_stat_in_block405];
                     stat22 = [self stat];
@@ -1981,7 +2000,7 @@
 
 
                     [stream_stat addElement:[stat22 getTree]];
-
+                     
                     }
                     break;
 
@@ -1991,11 +2010,11 @@
         } while (YES);
         loop6: ;
 
-
-        K_RCURLY23=(ANTLRCommonToken *)[self match:input TokenType:K_RCURLY Follow:FOLLOW_K_RCURLY_in_block416];  
+         
+        K_RCURLY23=(CommonToken *)[self match:input TokenType:K_RCURLY Follow:FOLLOW_K_RCURLY_in_block416];  
             [stream_K_RCURLY addElement:K_RCURLY23];
 
-
+         
         // AST REWRITE
         // elements: stat, variable
         // token labels: 
@@ -2005,29 +2024,29 @@
         // wildcard labels: 
         retval.tree = root_0;
 
-        ANTLRRewriteRuleSubtreeStream *stream_retval =
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
+        RewriteRuleSubtreeStream *stream_retval =
+            [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
                 description:@"token retval" element:retval!=nil?[retval getTree]:nil] retain];
 
-        root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+        root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
 
         // 55:9: -> ^( BLOCK[$lc,@\"BLOCK\"] ( variable )* ( stat )* )
         {
-            // SimpleC.g:55:12: ^( BLOCK[$lc,@\"BLOCK\"] ( variable )* ( stat )* )
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:55:12: ^( BLOCK[$lc,@\"BLOCK\"] ( variable )* ( stat )* )
             {
-                ANTLRCommonTree *root_1 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
-                root_1 = (ANTLRCommonTree *)[treeAdaptor becomeRoot:
-                        [treeAdaptor createTree:BLOCK FromToken:lc Text:@"BLOCK"]
+                CommonTree *root_1 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+                root_1 = (CommonTree *)[treeAdaptor becomeRoot:
+                        [[treeAdaptor createTree:BLOCK FromToken:lc Text:@"BLOCK"] retain]
                  old:root_1];
 
-                // SimpleC.g:55:34: ( variable )*
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:55:34: ( variable )*
                 while ( [stream_variable hasNext] ) {
                     [treeAdaptor addChild:[stream_variable nextTree] toTree:root_1];
 
                 }
                 [stream_variable reset];
 
-                // SimpleC.g:55:44: ( stat )*
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:55:44: ( stat )*
                 while ( [stream_stat hasNext] ) {
                     [treeAdaptor addChild:[stream_stat nextTree] toTree:root_1];
 
@@ -2047,7 +2066,7 @@
 
         /* ASTParser ruleCleanUp */
         /* AST ruleCleanUp */
-        // token+rule list labels
+        /* token+rule list labels */
         [retval setStop:[input LT:-1]];
 
 
@@ -2056,20 +2075,20 @@
         [stream_variable release];
         [stream_stat release];
 
-            retval.tree = (ANTLRCommonTree *)[treeAdaptor rulePostProcessing:root_0];
+            retval.tree = (CommonTree *)[treeAdaptor rulePostProcessing:root_0];
             [treeAdaptor setTokenBoundaries:retval.tree From:retval.start To:retval.stopToken];
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
         /* ASTParser rule.setErrorReturnValue */
-        retval.tree = (ANTLRCommonTree *)[treeAdaptor errorNode:input From:retval.start To:[input LT:-1] Exception:re];
+        retval.tree = (CommonTree *)[treeAdaptor errorNode:input From:retval.start To:[input LT:-1] Exception:re];
 
     }
 
     @finally {
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return retval;
@@ -2078,39 +2097,39 @@
 
 /*
  * $ANTLR start stat
- * SimpleC.g:58:1: stat : ( forStat | expr K_SEMICOLON !| block | assignStat K_SEMICOLON !| K_SEMICOLON !);
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:58:1: stat : ( forStat | expr K_SEMICOLON !| block | assignStat K_SEMICOLON !| K_SEMICOLON !);
  */
 - (SimpleCParser_stat_return *) stat
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
 
     /* AST ruleDeclarations */
+    /* ruleDeclarations */
     SimpleCParser_stat_return * retval = [SimpleCParser_stat_return newSimpleCParser_stat_return];
     [retval setStart:[input LT:1]];
 
 
-    ANTLRCommonTree *root_0 = nil;
+    CommonTree *root_0 = nil;
 
     @try {
         /* AST ruleLabelDefs */
-        ANTLRCommonToken *K_SEMICOLON26 = nil;
-        ANTLRCommonToken *K_SEMICOLON29 = nil;
-        ANTLRCommonToken *K_SEMICOLON30 = nil;
-         SimpleCParser_forStat_return * forStat24 = nil ;
-         
-         SimpleCParser_expr_return * expr25 = nil ;
-         
-         SimpleCParser_block_return * block27 = nil ;
-         
-         SimpleCParser_assignStat_return * assignStat28 = nil ;
-         
+        /* ruleLabelDefs entry */
+        CommonToken *K_SEMICOLON26 = nil;
+        CommonToken *K_SEMICOLON29 = nil;
+        CommonToken *K_SEMICOLON30 = nil;SimpleCParser_forStat_return * forStat24 = nil ;
 
-        ANTLRCommonTree *K_SEMICOLON26_tree=nil;
-        ANTLRCommonTree *K_SEMICOLON29_tree=nil;
-        ANTLRCommonTree *K_SEMICOLON30_tree=nil;
+        SimpleCParser_expr_return * expr25 = nil ;
 
-        // SimpleC.g:58:5: ( forStat | expr K_SEMICOLON !| block | assignStat K_SEMICOLON !| K_SEMICOLON !) //ruleblock
+        SimpleCParser_block_return * block27 = nil ;
+
+        SimpleCParser_assignStat_return * assignStat28 = nil ;
+
+
+        CommonTree *K_SEMICOLON26_tree=nil;
+        CommonTree *K_SEMICOLON29_tree=nil;
+        CommonTree *K_SEMICOLON30_tree=nil;
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:58:5: ( forStat | expr K_SEMICOLON !| block | assignStat K_SEMICOLON !| K_SEMICOLON !) //ruleblock
         NSInteger alt7=5;
         unichar charLA7 = [input LA:1];
         switch (charLA7) {
@@ -2130,7 +2149,7 @@
                     alt7=2;
                 }
                 else {
-                    ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newException:7 state:2 stream:input];
+                    NoViableAltException *nvae = [NoViableAltException newException:7 state:2 stream:input];
                     nvae.c = LA7_2;
                     @throw nvae;
 
@@ -2155,7 +2174,7 @@
                 break;
 
         default: ;
-            ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newException:7 state:0 stream:input];
+            NoViableAltException *nvae = [NoViableAltException newException:7 state:0 stream:input];
             nvae.c = charLA7;
             @throw nvae;
 
@@ -2163,9 +2182,10 @@
 
         switch (alt7) {
             case 1 : ;
-                // SimpleC.g:58:7: forStat // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:58:7: forStat // alt
                 {
-                root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+                root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+
 
 
                 /* ASTParser ruleRef */
@@ -2177,13 +2197,14 @@
 
 
                 [treeAdaptor addChild:[forStat24 getTree] toTree:root_0];
-
+                 
                 }
                 break;
             case 2 : ;
-                // SimpleC.g:59:7: expr K_SEMICOLON ! // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:59:7: expr K_SEMICOLON ! // alt
                 {
-                root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+                root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+
 
 
                 /* ASTParser ruleRef */
@@ -2195,15 +2216,16 @@
 
 
                 [treeAdaptor addChild:[expr25 getTree] toTree:root_0];
-
-                K_SEMICOLON26=(ANTLRCommonToken *)[self match:input TokenType:K_SEMICOLON Follow:FOLLOW_K_SEMICOLON_in_stat459]; 
-
+                 
+                K_SEMICOLON26=(CommonToken *)[self match:input TokenType:K_SEMICOLON Follow:FOLLOW_K_SEMICOLON_in_stat459]; 
+                 
                 }
                 break;
             case 3 : ;
-                // SimpleC.g:60:7: block // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:60:7: block // alt
                 {
-                root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+                root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+
 
 
                 /* ASTParser ruleRef */
@@ -2215,13 +2237,14 @@
 
 
                 [treeAdaptor addChild:[block27 getTree] toTree:root_0];
-
+                 
                 }
                 break;
             case 4 : ;
-                // SimpleC.g:61:7: assignStat K_SEMICOLON ! // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:61:7: assignStat K_SEMICOLON ! // alt
                 {
-                root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+                root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+
 
 
                 /* ASTParser ruleRef */
@@ -2233,44 +2256,45 @@
 
 
                 [treeAdaptor addChild:[assignStat28 getTree] toTree:root_0];
-
-                K_SEMICOLON29=(ANTLRCommonToken *)[self match:input TokenType:K_SEMICOLON Follow:FOLLOW_K_SEMICOLON_in_stat478]; 
-
+                 
+                K_SEMICOLON29=(CommonToken *)[self match:input TokenType:K_SEMICOLON Follow:FOLLOW_K_SEMICOLON_in_stat478]; 
+                 
                 }
                 break;
             case 5 : ;
-                // SimpleC.g:62:7: K_SEMICOLON ! // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:62:7: K_SEMICOLON ! // alt
                 {
-                root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+                root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
 
 
-                K_SEMICOLON30=(ANTLRCommonToken *)[self match:input TokenType:K_SEMICOLON Follow:FOLLOW_K_SEMICOLON_in_stat487]; 
 
+                K_SEMICOLON30=(CommonToken *)[self match:input TokenType:K_SEMICOLON Follow:FOLLOW_K_SEMICOLON_in_stat487]; 
+                 
                 }
                 break;
 
         }
         /* ASTParser ruleCleanUp */
         /* AST ruleCleanUp */
-        // token+rule list labels
+        /* token+rule list labels */
         [retval setStop:[input LT:-1]];
 
 
 
-            retval.tree = (ANTLRCommonTree *)[treeAdaptor rulePostProcessing:root_0];
+            retval.tree = (CommonTree *)[treeAdaptor rulePostProcessing:root_0];
             [treeAdaptor setTokenBoundaries:retval.tree From:retval.start To:retval.stopToken];
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
         /* ASTParser rule.setErrorReturnValue */
-        retval.tree = (ANTLRCommonTree *)[treeAdaptor errorNode:input From:retval.start To:[input LT:-1] Exception:re];
+        retval.tree = (CommonTree *)[treeAdaptor errorNode:input From:retval.start To:[input LT:-1] Exception:re];
 
     }
 
     @finally {
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return retval;
@@ -2279,73 +2303,74 @@
 
 /*
  * $ANTLR start forStat
- * SimpleC.g:65:1: forStat : K_FOR K_LCURVE start= assignStat K_SEMICOLON expr K_SEMICOLON next= assignStat K_RCURVE block -> ^( K_FOR $start expr $next block ) ;
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:65:1: forStat : K_FOR K_LCURVE start= assignStat K_SEMICOLON expr K_SEMICOLON next= assignStat K_RCURVE block -> ^( K_FOR $start expr $next block ) ;
  */
 - (SimpleCParser_forStat_return *) forStat
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
 
     /* AST ruleDeclarations */
+    /* ruleDeclarations */
     SimpleCParser_forStat_return * retval = [SimpleCParser_forStat_return newSimpleCParser_forStat_return];
     [retval setStart:[input LT:1]];
 
 
-    ANTLRCommonTree *root_0 = nil;
+    CommonTree *root_0 = nil;
 
     @try {
         /* AST ruleLabelDefs */
-        ANTLRCommonToken *K_FOR31 = nil;
-        ANTLRCommonToken *K_LCURVE32 = nil;
-        ANTLRCommonToken *K_SEMICOLON33 = nil;
-        ANTLRCommonToken *K_SEMICOLON35 = nil;
-        ANTLRCommonToken *K_RCURVE36 = nil;
-         SimpleCParser_assignStat_return * start = nil ;
-         
-         SimpleCParser_assignStat_return * next = nil ;
-         
-         SimpleCParser_expr_return * expr34 = nil ;
-         
-         SimpleCParser_block_return * block37 = nil ;
-         
+        /* ruleLabelDefs entry */
+        CommonToken *K_FOR31 = nil;
+        CommonToken *K_LCURVE32 = nil;
+        CommonToken *K_SEMICOLON33 = nil;
+        CommonToken *K_SEMICOLON35 = nil;
+        CommonToken *K_RCURVE36 = nil;SimpleCParser_assignStat_return * start = nil ;
 
-        ANTLRCommonTree *K_FOR31_tree=nil;
-        ANTLRCommonTree *K_LCURVE32_tree=nil;
-        ANTLRCommonTree *K_SEMICOLON33_tree=nil;
-        ANTLRCommonTree *K_SEMICOLON35_tree=nil;
-        ANTLRCommonTree *K_RCURVE36_tree=nil;
-        ANTLRRewriteRuleTokenStream *stream_K_LCURVE =
-            [[ANTLRRewriteRuleTokenStream newANTLRRewriteRuleTokenStream:treeAdaptor
+        SimpleCParser_assignStat_return * next = nil ;
+
+        SimpleCParser_expr_return * expr34 = nil ;
+
+        SimpleCParser_block_return * block37 = nil ;
+
+
+        CommonTree *K_FOR31_tree=nil;
+        CommonTree *K_LCURVE32_tree=nil;
+        CommonTree *K_SEMICOLON33_tree=nil;
+        CommonTree *K_SEMICOLON35_tree=nil;
+        CommonTree *K_RCURVE36_tree=nil;
+        RewriteRuleTokenStream *stream_K_LCURVE =
+            [[RewriteRuleTokenStream newRewriteRuleTokenStream:treeAdaptor
                                                              description:@"token K_LCURVE"] retain];
-        ANTLRRewriteRuleTokenStream *stream_K_RCURVE =
-            [[ANTLRRewriteRuleTokenStream newANTLRRewriteRuleTokenStream:treeAdaptor
+        RewriteRuleTokenStream *stream_K_RCURVE =
+            [[RewriteRuleTokenStream newRewriteRuleTokenStream:treeAdaptor
                                                              description:@"token K_RCURVE"] retain];
-        ANTLRRewriteRuleTokenStream *stream_K_SEMICOLON =
-            [[ANTLRRewriteRuleTokenStream newANTLRRewriteRuleTokenStream:treeAdaptor
+        RewriteRuleTokenStream *stream_K_SEMICOLON =
+            [[RewriteRuleTokenStream newRewriteRuleTokenStream:treeAdaptor
                                                              description:@"token K_SEMICOLON"] retain];
-        ANTLRRewriteRuleTokenStream *stream_K_FOR =
-            [[ANTLRRewriteRuleTokenStream newANTLRRewriteRuleTokenStream:treeAdaptor
+        RewriteRuleTokenStream *stream_K_FOR =
+            [[RewriteRuleTokenStream newRewriteRuleTokenStream:treeAdaptor
                                                              description:@"token K_FOR"] retain];
-        ANTLRRewriteRuleSubtreeStream *stream_assignStat =
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
+        RewriteRuleSubtreeStream *stream_assignStat =
+            [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
                                                                 description:@"rule assignStat"] retain];
-        ANTLRRewriteRuleSubtreeStream *stream_block =
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
+        RewriteRuleSubtreeStream *stream_block =
+            [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
                                                                 description:@"rule block"] retain];
-        ANTLRRewriteRuleSubtreeStream *stream_expr =
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
+        RewriteRuleSubtreeStream *stream_expr =
+            [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
                                                                 description:@"rule expr"] retain];
-        // SimpleC.g:66:5: ( K_FOR K_LCURVE start= assignStat K_SEMICOLON expr K_SEMICOLON next= assignStat K_RCURVE block -> ^( K_FOR $start expr $next block ) ) // ruleBlockSingleAlt
-        // SimpleC.g:66:9: K_FOR K_LCURVE start= assignStat K_SEMICOLON expr K_SEMICOLON next= assignStat K_RCURVE block // alt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:66:5: ( K_FOR K_LCURVE start= assignStat K_SEMICOLON expr K_SEMICOLON next= assignStat K_RCURVE block -> ^( K_FOR $start expr $next block ) ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:66:9: K_FOR K_LCURVE start= assignStat K_SEMICOLON expr K_SEMICOLON next= assignStat K_RCURVE block // alt
         {
-        K_FOR31=(ANTLRCommonToken *)[self match:input TokenType:K_FOR Follow:FOLLOW_K_FOR_in_forStat507];  
+
+        K_FOR31=(CommonToken *)[self match:input TokenType:K_FOR Follow:FOLLOW_K_FOR_in_forStat507];  
             [stream_K_FOR addElement:K_FOR31];
 
-
-        K_LCURVE32=(ANTLRCommonToken *)[self match:input TokenType:K_LCURVE Follow:FOLLOW_K_LCURVE_in_forStat509];  
+         
+        K_LCURVE32=(CommonToken *)[self match:input TokenType:K_LCURVE Follow:FOLLOW_K_LCURVE_in_forStat509];  
             [stream_K_LCURVE addElement:K_LCURVE32];
 
-
+         
         /* ruleRef */
         [self pushFollow:FOLLOW_assignStat_in_forStat513];
         start = [self assignStat];
@@ -2354,11 +2379,11 @@
 
 
         [stream_assignStat addElement:[start getTree]];
-
-        K_SEMICOLON33=(ANTLRCommonToken *)[self match:input TokenType:K_SEMICOLON Follow:FOLLOW_K_SEMICOLON_in_forStat515];  
+         
+        K_SEMICOLON33=(CommonToken *)[self match:input TokenType:K_SEMICOLON Follow:FOLLOW_K_SEMICOLON_in_forStat515];  
             [stream_K_SEMICOLON addElement:K_SEMICOLON33];
 
-
+         
         /* ruleRef */
         [self pushFollow:FOLLOW_expr_in_forStat517];
         expr34 = [self expr];
@@ -2367,11 +2392,11 @@
 
 
         [stream_expr addElement:[expr34 getTree]];
-
-        K_SEMICOLON35=(ANTLRCommonToken *)[self match:input TokenType:K_SEMICOLON Follow:FOLLOW_K_SEMICOLON_in_forStat519];  
+         
+        K_SEMICOLON35=(CommonToken *)[self match:input TokenType:K_SEMICOLON Follow:FOLLOW_K_SEMICOLON_in_forStat519];  
             [stream_K_SEMICOLON addElement:K_SEMICOLON35];
 
-
+         
         /* ruleRef */
         [self pushFollow:FOLLOW_assignStat_in_forStat523];
         next = [self assignStat];
@@ -2380,11 +2405,11 @@
 
 
         [stream_assignStat addElement:[next getTree]];
-
-        K_RCURVE36=(ANTLRCommonToken *)[self match:input TokenType:K_RCURVE Follow:FOLLOW_K_RCURVE_in_forStat525];  
+         
+        K_RCURVE36=(CommonToken *)[self match:input TokenType:K_RCURVE Follow:FOLLOW_K_RCURVE_in_forStat525];  
             [stream_K_RCURVE addElement:K_RCURVE36];
 
-
+         
         /* ruleRef */
         [self pushFollow:FOLLOW_block_in_forStat527];
         block37 = [self block];
@@ -2393,9 +2418,9 @@
 
 
         [stream_block addElement:[block37 getTree]];
-
+         
         // AST REWRITE
-        // elements: start, next, expr, block, K_FOR
+        // elements: block, start, K_FOR, next, expr
         // token labels: 
         // rule labels: retval, start, next
         // token list labels: 
@@ -2403,24 +2428,24 @@
         // wildcard labels: 
         retval.tree = root_0;
 
-        ANTLRRewriteRuleSubtreeStream *stream_retval =
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
+        RewriteRuleSubtreeStream *stream_retval =
+            [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
                 description:@"token retval" element:retval!=nil?[retval getTree]:nil] retain];
-        ANTLRRewriteRuleSubtreeStream *stream_start =
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
+        RewriteRuleSubtreeStream *stream_start =
+            [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
                 description:@"token start" element:start!=nil?[start getTree]:nil] retain];
-        ANTLRRewriteRuleSubtreeStream *stream_next =
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
+        RewriteRuleSubtreeStream *stream_next =
+            [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
                 description:@"token next" element:next!=nil?[next getTree]:nil] retain];
 
-        root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+        root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
 
         // 67:9: -> ^( K_FOR $start expr $next block )
         {
-            // SimpleC.g:67:12: ^( K_FOR $start expr $next block )
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:67:12: ^( K_FOR $start expr $next block )
             {
-                ANTLRCommonTree *root_1 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
-                root_1 = (ANTLRCommonTree *)[treeAdaptor becomeRoot:
+                CommonTree *root_1 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+                root_1 = (CommonTree *)[treeAdaptor becomeRoot:
                             [stream_K_FOR nextNode]
                  old:root_1];
 
@@ -2445,7 +2470,7 @@
 
         /* ASTParser ruleCleanUp */
         /* AST ruleCleanUp */
-        // token+rule list labels
+        /* token+rule list labels */
         [retval setStop:[input LT:-1]];
 
 
@@ -2457,20 +2482,20 @@
         [stream_block release];
         [stream_expr release];
 
-            retval.tree = (ANTLRCommonTree *)[treeAdaptor rulePostProcessing:root_0];
+            retval.tree = (CommonTree *)[treeAdaptor rulePostProcessing:root_0];
             [treeAdaptor setTokenBoundaries:retval.tree From:retval.start To:retval.stopToken];
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
         /* ASTParser rule.setErrorReturnValue */
-        retval.tree = (ANTLRCommonTree *)[treeAdaptor errorNode:input From:retval.start To:[input LT:-1] Exception:re];
+        retval.tree = (CommonTree *)[treeAdaptor errorNode:input From:retval.start To:[input LT:-1] Exception:re];
 
     }
 
     @finally {
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return retval;
@@ -2479,49 +2504,50 @@
 
 /*
  * $ANTLR start assignStat
- * SimpleC.g:70:1: assignStat : K_ID K_EQ expr -> ^( K_EQ K_ID expr ) ;
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:70:1: assignStat : K_ID K_EQ expr -> ^( K_EQ K_ID expr ) ;
  */
 - (SimpleCParser_assignStat_return *) assignStat
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
 
     /* AST ruleDeclarations */
+    /* ruleDeclarations */
     SimpleCParser_assignStat_return * retval = [SimpleCParser_assignStat_return newSimpleCParser_assignStat_return];
     [retval setStart:[input LT:1]];
 
 
-    ANTLRCommonTree *root_0 = nil;
+    CommonTree *root_0 = nil;
 
     @try {
         /* AST ruleLabelDefs */
-        ANTLRCommonToken *K_ID38 = nil;
-        ANTLRCommonToken *K_EQ39 = nil;
-         SimpleCParser_expr_return * expr40 = nil ;
-         
+        /* ruleLabelDefs entry */
+        CommonToken *K_ID38 = nil;
+        CommonToken *K_EQ39 = nil;SimpleCParser_expr_return * expr40 = nil ;
 
-        ANTLRCommonTree *K_ID38_tree=nil;
-        ANTLRCommonTree *K_EQ39_tree=nil;
-        ANTLRRewriteRuleTokenStream *stream_K_ID =
-            [[ANTLRRewriteRuleTokenStream newANTLRRewriteRuleTokenStream:treeAdaptor
+
+        CommonTree *K_ID38_tree=nil;
+        CommonTree *K_EQ39_tree=nil;
+        RewriteRuleTokenStream *stream_K_ID =
+            [[RewriteRuleTokenStream newRewriteRuleTokenStream:treeAdaptor
                                                              description:@"token K_ID"] retain];
-        ANTLRRewriteRuleTokenStream *stream_K_EQ =
-            [[ANTLRRewriteRuleTokenStream newANTLRRewriteRuleTokenStream:treeAdaptor
+        RewriteRuleTokenStream *stream_K_EQ =
+            [[RewriteRuleTokenStream newRewriteRuleTokenStream:treeAdaptor
                                                              description:@"token K_EQ"] retain];
-        ANTLRRewriteRuleSubtreeStream *stream_expr =
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
+        RewriteRuleSubtreeStream *stream_expr =
+            [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
                                                                 description:@"rule expr"] retain];
-        // SimpleC.g:71:5: ( K_ID K_EQ expr -> ^( K_EQ K_ID expr ) ) // ruleBlockSingleAlt
-        // SimpleC.g:71:9: K_ID K_EQ expr // alt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:71:5: ( K_ID K_EQ expr -> ^( K_EQ K_ID expr ) ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:71:9: K_ID K_EQ expr // alt
         {
-        K_ID38=(ANTLRCommonToken *)[self match:input TokenType:K_ID Follow:FOLLOW_K_ID_in_assignStat570];  
+
+        K_ID38=(CommonToken *)[self match:input TokenType:K_ID Follow:FOLLOW_K_ID_in_assignStat570];  
             [stream_K_ID addElement:K_ID38];
 
-
-        K_EQ39=(ANTLRCommonToken *)[self match:input TokenType:K_EQ Follow:FOLLOW_K_EQ_in_assignStat572];  
+         
+        K_EQ39=(CommonToken *)[self match:input TokenType:K_EQ Follow:FOLLOW_K_EQ_in_assignStat572];  
             [stream_K_EQ addElement:K_EQ39];
 
-
+         
         /* ruleRef */
         [self pushFollow:FOLLOW_expr_in_assignStat574];
         expr40 = [self expr];
@@ -2530,9 +2556,9 @@
 
 
         [stream_expr addElement:[expr40 getTree]];
-
+         
         // AST REWRITE
-        // elements: K_ID, K_EQ, expr
+        // elements: expr, K_ID, K_EQ
         // token labels: 
         // rule labels: retval
         // token list labels: 
@@ -2540,18 +2566,18 @@
         // wildcard labels: 
         retval.tree = root_0;
 
-        ANTLRRewriteRuleSubtreeStream *stream_retval =
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
+        RewriteRuleSubtreeStream *stream_retval =
+            [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
                 description:@"token retval" element:retval!=nil?[retval getTree]:nil] retain];
 
-        root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+        root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
 
         // 71:24: -> ^( K_EQ K_ID expr )
         {
-            // SimpleC.g:71:27: ^( K_EQ K_ID expr )
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:71:27: ^( K_EQ K_ID expr )
             {
-                ANTLRCommonTree *root_1 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
-                root_1 = (ANTLRCommonTree *)[treeAdaptor becomeRoot:
+                CommonTree *root_1 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+                root_1 = (CommonTree *)[treeAdaptor becomeRoot:
                             [stream_K_EQ nextNode]
                  old:root_1];
 
@@ -2575,7 +2601,7 @@
 
         /* ASTParser ruleCleanUp */
         /* AST ruleCleanUp */
-        // token+rule list labels
+        /* token+rule list labels */
         [retval setStop:[input LT:-1]];
 
 
@@ -2583,20 +2609,20 @@
         [stream_K_EQ release];
         [stream_expr release];
 
-            retval.tree = (ANTLRCommonTree *)[treeAdaptor rulePostProcessing:root_0];
+            retval.tree = (CommonTree *)[treeAdaptor rulePostProcessing:root_0];
             [treeAdaptor setTokenBoundaries:retval.tree From:retval.start To:retval.stopToken];
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
         /* ASTParser rule.setErrorReturnValue */
-        retval.tree = (ANTLRCommonTree *)[treeAdaptor errorNode:input From:retval.start To:[input LT:-1] Exception:re];
+        retval.tree = (CommonTree *)[treeAdaptor errorNode:input From:retval.start To:[input LT:-1] Exception:re];
 
     }
 
     @finally {
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return retval;
@@ -2605,30 +2631,32 @@
 
 /*
  * $ANTLR start expr
- * SimpleC.g:74:1: expr : condExpr ;
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:74:1: expr : condExpr ;
  */
 - (SimpleCParser_expr_return *) expr
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
 
     /* AST ruleDeclarations */
+    /* ruleDeclarations */
     SimpleCParser_expr_return * retval = [SimpleCParser_expr_return newSimpleCParser_expr_return];
     [retval setStart:[input LT:1]];
 
 
-    ANTLRCommonTree *root_0 = nil;
+    CommonTree *root_0 = nil;
 
     @try {
         /* AST ruleLabelDefs */
-         SimpleCParser_condExpr_return * condExpr41 = nil ;
-         
+        /* ruleLabelDefs entry */
+        SimpleCParser_condExpr_return * condExpr41 = nil ;
 
 
-        // SimpleC.g:74:5: ( condExpr ) // ruleBlockSingleAlt
-        // SimpleC.g:74:9: condExpr // alt
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:74:5: ( condExpr ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:74:9: condExpr // alt
         {
-        root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+        root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+
 
 
         /* ASTParser ruleRef */
@@ -2640,30 +2668,30 @@
 
 
         [treeAdaptor addChild:[condExpr41 getTree] toTree:root_0];
-
+         
         }
 
         /* ASTParser ruleCleanUp */
         /* AST ruleCleanUp */
-        // token+rule list labels
+        /* token+rule list labels */
         [retval setStop:[input LT:-1]];
 
 
 
-            retval.tree = (ANTLRCommonTree *)[treeAdaptor rulePostProcessing:root_0];
+            retval.tree = (CommonTree *)[treeAdaptor rulePostProcessing:root_0];
             [treeAdaptor setTokenBoundaries:retval.tree From:retval.start To:retval.stopToken];
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
         /* ASTParser rule.setErrorReturnValue */
-        retval.tree = (ANTLRCommonTree *)[treeAdaptor errorNode:input From:retval.start To:[input LT:-1] Exception:re];
+        retval.tree = (CommonTree *)[treeAdaptor errorNode:input From:retval.start To:[input LT:-1] Exception:re];
 
     }
 
     @finally {
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return retval;
@@ -2672,36 +2700,37 @@
 
 /*
  * $ANTLR start condExpr
- * SimpleC.g:77:1: condExpr : aexpr ( ( K_EQEQ ^| K_LT ^) aexpr )? ;
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:77:1: condExpr : aexpr ( ( K_EQEQ ^| K_LT ^) aexpr )? ;
  */
 - (SimpleCParser_condExpr_return *) condExpr
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
 
     /* AST ruleDeclarations */
+    /* ruleDeclarations */
     SimpleCParser_condExpr_return * retval = [SimpleCParser_condExpr_return newSimpleCParser_condExpr_return];
     [retval setStart:[input LT:1]];
 
 
-    ANTLRCommonTree *root_0 = nil;
+    CommonTree *root_0 = nil;
 
     @try {
         /* AST ruleLabelDefs */
-        ANTLRCommonToken *K_EQEQ43 = nil;
-        ANTLRCommonToken *K_LT44 = nil;
-         SimpleCParser_aexpr_return * aexpr42 = nil ;
-         
-         SimpleCParser_aexpr_return * aexpr45 = nil ;
-         
+        /* ruleLabelDefs entry */
+        CommonToken *K_EQEQ43 = nil;
+        CommonToken *K_LT44 = nil;SimpleCParser_aexpr_return * aexpr42 = nil ;
 
-        ANTLRCommonTree *K_EQEQ43_tree=nil;
-        ANTLRCommonTree *K_LT44_tree=nil;
+        SimpleCParser_aexpr_return * aexpr45 = nil ;
 
-        // SimpleC.g:78:5: ( aexpr ( ( K_EQEQ ^| K_LT ^) aexpr )? ) // ruleBlockSingleAlt
-        // SimpleC.g:78:9: aexpr ( ( K_EQEQ ^| K_LT ^) aexpr )? // alt
+
+        CommonTree *K_EQEQ43_tree=nil;
+        CommonTree *K_LT44_tree=nil;
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:78:5: ( aexpr ( ( K_EQEQ ^| K_LT ^) aexpr )? ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:78:9: aexpr ( ( K_EQEQ ^| K_LT ^) aexpr )? // alt
         {
-        root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+        root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+
 
 
         /* ASTParser ruleRef */
@@ -2713,8 +2742,8 @@
 
 
         [treeAdaptor addChild:[aexpr42 getTree] toTree:root_0];
-
-        // SimpleC.g:78:15: ( ( K_EQEQ ^| K_LT ^) aexpr )? // block
+         
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:78:15: ( ( K_EQEQ ^| K_LT ^) aexpr )? // block
         NSInteger alt9=2;
         NSInteger LA9_0 = [input LA:1];
 
@@ -2723,9 +2752,10 @@
         }
         switch (alt9) {
             case 1 : ;
-                // SimpleC.g:78:17: ( K_EQEQ ^| K_LT ^) aexpr // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:78:17: ( K_EQEQ ^| K_LT ^) aexpr // alt
                 {
-                // SimpleC.g:78:17: ( K_EQEQ ^| K_LT ^) // block
+
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:78:17: ( K_EQEQ ^| K_LT ^) // block
                 NSInteger alt8=2;
                 NSInteger LA8_0 = [input LA:1];
 
@@ -2736,40 +2766,42 @@
                     alt8=2;
                 }
                 else {
-                    ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newException:8 state:0 stream:input];
+                    NoViableAltException *nvae = [NoViableAltException newException:8 state:0 stream:input];
                     nvae.c = LA8_0;
                     @throw nvae;
 
                 }
                 switch (alt8) {
                     case 1 : ;
-                        // SimpleC.g:78:18: K_EQEQ ^ // alt
+                        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:78:18: K_EQEQ ^ // alt
                         {
-                        K_EQEQ43=(ANTLRCommonToken *)[self match:input TokenType:K_EQEQ Follow:FOLLOW_K_EQEQ_in_condExpr622]; 
+
+                        K_EQEQ43=(CommonToken *)[self match:input TokenType:K_EQEQ Follow:FOLLOW_K_EQEQ_in_condExpr622]; 
                         K_EQEQ43_tree = /* ASTParser createNodeFromToken */
-                        (ANTLRCommonTree *)[[treeAdaptor create:K_EQEQ43] retain]
+                        (CommonTree *)[[treeAdaptor create:K_EQEQ43] retain]
                         ;
-                        root_0 = (ANTLRCommonTree *)[treeAdaptor becomeRoot:K_EQEQ43_tree old:root_0];
+                        root_0 = (CommonTree *)[treeAdaptor becomeRoot:K_EQEQ43_tree old:root_0];
 
-
+                         
                         }
                         break;
                     case 2 : ;
-                        // SimpleC.g:78:28: K_LT ^ // alt
+                        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:78:28: K_LT ^ // alt
                         {
-                        K_LT44=(ANTLRCommonToken *)[self match:input TokenType:K_LT Follow:FOLLOW_K_LT_in_condExpr627]; 
+
+                        K_LT44=(CommonToken *)[self match:input TokenType:K_LT Follow:FOLLOW_K_LT_in_condExpr627]; 
                         K_LT44_tree = /* ASTParser createNodeFromToken */
-                        (ANTLRCommonTree *)[[treeAdaptor create:K_LT44] retain]
+                        (CommonTree *)[[treeAdaptor create:K_LT44] retain]
                         ;
-                        root_0 = (ANTLRCommonTree *)[treeAdaptor becomeRoot:K_LT44_tree old:root_0];
+                        root_0 = (CommonTree *)[treeAdaptor becomeRoot:K_LT44_tree old:root_0];
 
-
+                         
                         }
                         break;
 
                 }
 
-
+                 
                 /* ASTParser ruleRef */
                 /* ruleRef */
                 [self pushFollow:FOLLOW_aexpr_in_condExpr631];
@@ -2779,36 +2811,36 @@
 
 
                 [treeAdaptor addChild:[aexpr45 getTree] toTree:root_0];
-
+                 
                 }
                 break;
 
         }
 
-
+         
         }
 
         /* ASTParser ruleCleanUp */
         /* AST ruleCleanUp */
-        // token+rule list labels
+        /* token+rule list labels */
         [retval setStop:[input LT:-1]];
 
 
 
-            retval.tree = (ANTLRCommonTree *)[treeAdaptor rulePostProcessing:root_0];
+            retval.tree = (CommonTree *)[treeAdaptor rulePostProcessing:root_0];
             [treeAdaptor setTokenBoundaries:retval.tree From:retval.start To:retval.stopToken];
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
         /* ASTParser rule.setErrorReturnValue */
-        retval.tree = (ANTLRCommonTree *)[treeAdaptor errorNode:input From:retval.start To:[input LT:-1] Exception:re];
+        retval.tree = (CommonTree *)[treeAdaptor errorNode:input From:retval.start To:[input LT:-1] Exception:re];
 
     }
 
     @finally {
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return retval;
@@ -2817,34 +2849,35 @@
 
 /*
  * $ANTLR start aexpr
- * SimpleC.g:81:1: aexpr : atom ( K_PLUS ^ atom )* ;
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:81:1: aexpr : atom ( K_PLUS ^ atom )* ;
  */
 - (SimpleCParser_aexpr_return *) aexpr
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
 
     /* AST ruleDeclarations */
+    /* ruleDeclarations */
     SimpleCParser_aexpr_return * retval = [SimpleCParser_aexpr_return newSimpleCParser_aexpr_return];
     [retval setStart:[input LT:1]];
 
 
-    ANTLRCommonTree *root_0 = nil;
+    CommonTree *root_0 = nil;
 
     @try {
         /* AST ruleLabelDefs */
-        ANTLRCommonToken *K_PLUS47 = nil;
-         SimpleCParser_atom_return * atom46 = nil ;
-         
-         SimpleCParser_atom_return * atom48 = nil ;
-         
+        /* ruleLabelDefs entry */
+        CommonToken *K_PLUS47 = nil;SimpleCParser_atom_return * atom46 = nil ;
 
-        ANTLRCommonTree *K_PLUS47_tree=nil;
+        SimpleCParser_atom_return * atom48 = nil ;
 
-        // SimpleC.g:82:5: ( atom ( K_PLUS ^ atom )* ) // ruleBlockSingleAlt
-        // SimpleC.g:82:9: atom ( K_PLUS ^ atom )* // alt
+
+        CommonTree *K_PLUS47_tree=nil;
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:82:5: ( atom ( K_PLUS ^ atom )* ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:82:9: atom ( K_PLUS ^ atom )* // alt
         {
-        root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+        root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+
 
 
         /* ASTParser ruleRef */
@@ -2856,6 +2889,7 @@
 
 
         [treeAdaptor addChild:[atom46 getTree] toTree:root_0];
+         
 
         do {
             NSInteger alt10=2;
@@ -2867,15 +2901,16 @@
 
             switch (alt10) {
                 case 1 : ;
-                    // SimpleC.g:82:16: K_PLUS ^ atom // alt
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:82:16: K_PLUS ^ atom // alt
                     {
-                    K_PLUS47=(ANTLRCommonToken *)[self match:input TokenType:K_PLUS Follow:FOLLOW_K_PLUS_in_aexpr657]; 
+
+                    K_PLUS47=(CommonToken *)[self match:input TokenType:K_PLUS Follow:FOLLOW_K_PLUS_in_aexpr657]; 
                     K_PLUS47_tree = /* ASTParser createNodeFromToken */
-                    (ANTLRCommonTree *)[[treeAdaptor create:K_PLUS47] retain]
+                    (CommonTree *)[[treeAdaptor create:K_PLUS47] retain]
                     ;
-                    root_0 = (ANTLRCommonTree *)[treeAdaptor becomeRoot:K_PLUS47_tree old:root_0];
+                    root_0 = (CommonTree *)[treeAdaptor becomeRoot:K_PLUS47_tree old:root_0];
 
-
+                     
                     /* ASTParser ruleRef */
                     /* ruleRef */
                     [self pushFollow:FOLLOW_atom_in_aexpr660];
@@ -2885,7 +2920,7 @@
 
 
                     [treeAdaptor addChild:[atom48 getTree] toTree:root_0];
-
+                     
                     }
                     break;
 
@@ -2895,30 +2930,30 @@
         } while (YES);
         loop10: ;
 
-
+         
         }
 
         /* ASTParser ruleCleanUp */
         /* AST ruleCleanUp */
-        // token+rule list labels
+        /* token+rule list labels */
         [retval setStop:[input LT:-1]];
 
 
 
-            retval.tree = (ANTLRCommonTree *)[treeAdaptor rulePostProcessing:root_0];
+            retval.tree = (CommonTree *)[treeAdaptor rulePostProcessing:root_0];
             [treeAdaptor setTokenBoundaries:retval.tree From:retval.start To:retval.stopToken];
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
         /* ASTParser rule.setErrorReturnValue */
-        retval.tree = (ANTLRCommonTree *)[treeAdaptor errorNode:input From:retval.start To:[input LT:-1] Exception:re];
+        retval.tree = (CommonTree *)[treeAdaptor errorNode:input From:retval.start To:[input LT:-1] Exception:re];
 
     }
 
     @finally {
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return retval;
@@ -2927,43 +2962,43 @@
 
 /*
  * $ANTLR start atom
- * SimpleC.g:85:1: atom : ( K_ID | K_INT | K_LCURVE expr K_RCURVE -> expr );
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:85:1: atom : ( K_ID | K_INT | K_LCURVE expr K_RCURVE -> expr );
  */
 - (SimpleCParser_atom_return *) atom
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
 
     /* AST ruleDeclarations */
+    /* ruleDeclarations */
     SimpleCParser_atom_return * retval = [SimpleCParser_atom_return newSimpleCParser_atom_return];
     [retval setStart:[input LT:1]];
 
 
-    ANTLRCommonTree *root_0 = nil;
+    CommonTree *root_0 = nil;
 
     @try {
         /* AST ruleLabelDefs */
-        ANTLRCommonToken *K_ID49 = nil;
-        ANTLRCommonToken *K_INT50 = nil;
-        ANTLRCommonToken *K_LCURVE51 = nil;
-        ANTLRCommonToken *K_RCURVE53 = nil;
-         SimpleCParser_expr_return * expr52 = nil ;
-         
+        /* ruleLabelDefs entry */
+        CommonToken *K_ID49 = nil;
+        CommonToken *K_INT50 = nil;
+        CommonToken *K_LCURVE51 = nil;
+        CommonToken *K_RCURVE53 = nil;SimpleCParser_expr_return * expr52 = nil ;
 
-        ANTLRCommonTree *K_ID49_tree=nil;
-        ANTLRCommonTree *K_INT50_tree=nil;
-        ANTLRCommonTree *K_LCURVE51_tree=nil;
-        ANTLRCommonTree *K_RCURVE53_tree=nil;
-        ANTLRRewriteRuleTokenStream *stream_K_LCURVE =
-            [[ANTLRRewriteRuleTokenStream newANTLRRewriteRuleTokenStream:treeAdaptor
+
+        CommonTree *K_ID49_tree=nil;
+        CommonTree *K_INT50_tree=nil;
+        CommonTree *K_LCURVE51_tree=nil;
+        CommonTree *K_RCURVE53_tree=nil;
+        RewriteRuleTokenStream *stream_K_LCURVE =
+            [[RewriteRuleTokenStream newRewriteRuleTokenStream:treeAdaptor
                                                              description:@"token K_LCURVE"] retain];
-        ANTLRRewriteRuleTokenStream *stream_K_RCURVE =
-            [[ANTLRRewriteRuleTokenStream newANTLRRewriteRuleTokenStream:treeAdaptor
+        RewriteRuleTokenStream *stream_K_RCURVE =
+            [[RewriteRuleTokenStream newRewriteRuleTokenStream:treeAdaptor
                                                              description:@"token K_RCURVE"] retain];
-        ANTLRRewriteRuleSubtreeStream *stream_expr =
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
+        RewriteRuleSubtreeStream *stream_expr =
+            [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
                                                                 description:@"rule expr"] retain];
-        // SimpleC.g:86:5: ( K_ID | K_INT | K_LCURVE expr K_RCURVE -> expr ) //ruleblock
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:86:5: ( K_ID | K_INT | K_LCURVE expr K_RCURVE -> expr ) //ruleblock
         NSInteger alt11=3;
         unichar charLA11 = [input LA:1];
         switch (charLA11) {
@@ -2984,7 +3019,7 @@
                 break;
 
         default: ;
-            ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newException:11 state:0 stream:input];
+            NoViableAltException *nvae = [NoViableAltException newException:11 state:0 stream:input];
             nvae.c = charLA11;
             @throw nvae;
 
@@ -2992,44 +3027,47 @@
 
         switch (alt11) {
             case 1 : ;
-                // SimpleC.g:86:7: K_ID // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:86:7: K_ID // alt
                 {
-                root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+                root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+
 
 
                 /* ASTParser tokenRef */
-                K_ID49=(ANTLRCommonToken *)[self match:input TokenType:K_ID Follow:FOLLOW_K_ID_in_atom680]; 
+                K_ID49=(CommonToken *)[self match:input TokenType:K_ID Follow:FOLLOW_K_ID_in_atom680]; 
                 K_ID49_tree = /* ASTParser createNodeFromToken */
-                (ANTLRCommonTree *)[[treeAdaptor create:K_ID49] retain]
+                (CommonTree *)[[treeAdaptor create:K_ID49] retain]
                 ;
                 [treeAdaptor addChild:K_ID49_tree  toTree:root_0];
 
-
+                 
                 }
                 break;
             case 2 : ;
-                // SimpleC.g:87:7: K_INT // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:87:7: K_INT // alt
                 {
-                root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+                root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+
 
 
                 /* ASTParser tokenRef */
-                K_INT50=(ANTLRCommonToken *)[self match:input TokenType:K_INT Follow:FOLLOW_K_INT_in_atom694]; 
+                K_INT50=(CommonToken *)[self match:input TokenType:K_INT Follow:FOLLOW_K_INT_in_atom694]; 
                 K_INT50_tree = /* ASTParser createNodeFromToken */
-                (ANTLRCommonTree *)[[treeAdaptor create:K_INT50] retain]
+                (CommonTree *)[[treeAdaptor create:K_INT50] retain]
                 ;
                 [treeAdaptor addChild:K_INT50_tree  toTree:root_0];
 
-
+                 
                 }
                 break;
             case 3 : ;
-                // SimpleC.g:88:7: K_LCURVE expr K_RCURVE // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleC.g:88:7: K_LCURVE expr K_RCURVE // alt
                 {
-                K_LCURVE51=(ANTLRCommonToken *)[self match:input TokenType:K_LCURVE Follow:FOLLOW_K_LCURVE_in_atom708];  
+
+                K_LCURVE51=(CommonToken *)[self match:input TokenType:K_LCURVE Follow:FOLLOW_K_LCURVE_in_atom708];  
                     [stream_K_LCURVE addElement:K_LCURVE51];
 
-
+                 
                 /* ruleRef */
                 [self pushFollow:FOLLOW_expr_in_atom710];
                 expr52 = [self expr];
@@ -3038,11 +3076,11 @@
 
 
                 [stream_expr addElement:[expr52 getTree]];
-
-                K_RCURVE53=(ANTLRCommonToken *)[self match:input TokenType:K_RCURVE Follow:FOLLOW_K_RCURVE_in_atom712];  
+                 
+                K_RCURVE53=(CommonToken *)[self match:input TokenType:K_RCURVE Follow:FOLLOW_K_RCURVE_in_atom712];  
                     [stream_K_RCURVE addElement:K_RCURVE53];
 
-
+                 
                 // AST REWRITE
                 // elements: expr
                 // token labels: 
@@ -3052,11 +3090,11 @@
                 // wildcard labels: 
                 retval.tree = root_0;
 
-                ANTLRRewriteRuleSubtreeStream *stream_retval =
-                    [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
+                RewriteRuleSubtreeStream *stream_retval =
+                    [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
                         description:@"token retval" element:retval!=nil?[retval getTree]:nil] retain];
 
-                root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+                root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
 
                 // 88:30: -> expr
                 {
@@ -3074,7 +3112,7 @@
         }
         /* ASTParser ruleCleanUp */
         /* AST ruleCleanUp */
-        // token+rule list labels
+        /* token+rule list labels */
         [retval setStop:[input LT:-1]];
 
 
@@ -3082,20 +3120,20 @@
         [stream_K_RCURVE release];
         [stream_expr release];
 
-            retval.tree = (ANTLRCommonTree *)[treeAdaptor rulePostProcessing:root_0];
+            retval.tree = (CommonTree *)[treeAdaptor rulePostProcessing:root_0];
             [treeAdaptor setTokenBoundaries:retval.tree From:retval.start To:retval.stopToken];
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
         /* ASTParser rule.setErrorReturnValue */
-        retval.tree = (ANTLRCommonTree *)[treeAdaptor errorNode:input From:retval.start To:[input LT:-1] Exception:re];
+        retval.tree = (CommonTree *)[treeAdaptor errorNode:input From:retval.start To:[input LT:-1] Exception:re];
 
     }
 
     @finally {
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return retval;
diff --git a/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g b/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g
index c1f89b8..a3a6293 100644
--- a/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g
+++ b/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g
@@ -7,7 +7,7 @@
 
 scope Symbols
 {
-ANTLRCommonTree *tree;
+CommonTree *tree;
 }
 
 program
diff --git a/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.h b/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.h
index 2832b66..e543b4c 100644
--- a/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.h
+++ b/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.h
@@ -1,9 +1,9 @@
-// $ANTLR ${project.version} ${buildNumber} SimpleCTP.g 2011-05-06 15:09:28
+// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g 2012-02-16 17:41:10
 
 /* =============================================================================
- * Standard antlr3 OBJC runtime definitions
+ * Standard antlr OBJC runtime definitions
  */
-#import <Cocoa/Cocoa.h>
+#import <Foundation/Foundation.h>
 #import <ANTLR/ANTLR.h>
 /* End of standard antlr3 runtime definitions
  * =============================================================================
@@ -50,58 +50,51 @@
 #define K_VOID 24
 #define VAR_DEF 25
 #define WS 26
-#pragma mark Dynamic Global Scopes
+#pragma mark Dynamic Global Scopes globalAttributeScopeInterface
 /* globalAttributeScopeInterface */
-@interface Symbols_Scope : ANTLRSymbolsScope {
+@interface Symbols_Scope : SymbolsScope {
 ANTLRCommonTree * tree;
-
-}
+ }
 /* start of globalAttributeScopeInterface properties */
-
 @property (assign, getter=gettree, setter=settree:) ANTLRCommonTree * tree;
-
 /* end globalAttributeScopeInterface properties */
-
-
 + (Symbols_Scope *)newSymbols_Scope;
 - (id) init;
 /* start of globalAttributeScopeInterface methodsDecl */
-
 - (ANTLRCommonTree *)gettree;
 - (void)settree:(ANTLRCommonTree *)aVal;
-
 /* End of globalAttributeScopeInterface methodsDecl */
-
 @end /* end of Symbols_Scope interface */
 
-#pragma mark Dynamic Rule Scopes
-#pragma mark Rule Return Scopes start
+#pragma mark Dynamic Rule Scopes ruleAttributeScopeInterface
+#pragma mark Rule Return Scopes returnScopeInterface
 /* returnScopeInterface SimpleCTP_expr_return */
-@interface SimpleCTP_expr_return :ANTLRTreeRuleReturnScope { /* returnScopeInterface line 1838 */
+@interface SimpleCTP_expr_return : TreeRuleReturnScope { /* returnScopeInterface line 1838 */
  /* ObjC start of memVars() */
+
 }
-/* start properties */
+/* start property declarations */
+
+
+/* start of method declarations */
+
 + (SimpleCTP_expr_return *)newSimpleCTP_expr_return;
 /* this is start of set and get methods */
   /* methodsDecl */
+
 @end /* end of returnScopeInterface interface */
 
 
 
-
 /* Interface grammar class */
-@interface SimpleCTP : ANTLRTreeParser { /* line 572 */
-/* ObjC start of ruleAttributeScopeMemVar */
-
-
-/* ObjC end of ruleAttributeScopeMemVar */
-/* ObjC start of globalAttributeScopeMemVar */
+@interface SimpleCTP  : TreeParser { /* line 572 */
+#pragma mark Dynamic Rule Scopes ruleAttributeScopeDecl
+#pragma mark Dynamic Global Rule Scopes globalAttributeScopeMemVar
 /* globalAttributeScopeMemVar */
-//ANTLRSymbolStack *gStack;
-ANTLRSymbolStack *Symbols_stack;
+SymbolStack *Symbols_stack;
 Symbols_Scope *Symbols_scope;
 
-/* ObjC end of globalAttributeScopeMemVar */
+
 /* ObjC start of actions.(actionScope).memVars */
 /* ObjC end of actions.(actionScope).memVars */
 /* ObjC start of memVars */
@@ -115,7 +108,7 @@
 /* ObjC end of properties */
 
 + (void) initialize;
-+ (id) newSimpleCTP:(id<ANTLRTreeNodeStream>)aStream;
++ (id) newSimpleCTP:(id<TreeNodeStream>)aStream;
 /* ObjC start of actions.(actionScope).methodsDecl */
 /* ObjC end of actions.(actionScope).methodsDecl */
 
diff --git a/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.java b/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.java
index e2e0d1c..4c3ccc2 100644
--- a/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.java
+++ b/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.java
@@ -1,4 +1,4 @@
-// $ANTLR 3.2 Aug 13, 2010 14:19:31 SimpleCTP.g 2010-08-13 14:29:19
+// $ANTLR 3.2 Aug 13, 2010 19:41:25 /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g 2010-08-13 19:42:13
 
 import org.antlr.runtime.*;
 import org.antlr.runtime.tree.*;import java.util.Stack;
@@ -48,18 +48,18 @@
         
 
     public String[] getTokenNames() { return SimpleCTP.tokenNames; }
-    public String getGrammarFileName() { return "SimpleCTP.g"; }
+    public String getGrammarFileName() { return "/usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g"; }
 
 
 
     // $ANTLR start "program"
-    // SimpleCTP.g:8:1: program : ( declaration )+ ;
+    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:8:1: program : ( declaration )+ ;
     public final void program() throws RecognitionException {
         try {
-            // SimpleCTP.g:9:5: ( ( declaration )+ )
-            // SimpleCTP.g:9:9: ( declaration )+
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:9:5: ( ( declaration )+ )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:9:9: ( declaration )+
             {
-            // SimpleCTP.g:9:9: ( declaration )+
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:9:9: ( declaration )+
             int cnt1=0;
             loop1:
             do {
@@ -73,7 +73,7 @@
 
                 switch (alt1) {
             	case 1 :
-            	    // SimpleCTP.g:9:9: declaration
+            	    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:9:9: declaration
             	    {
             	    pushFollow(FOLLOW_declaration_in_program43);
             	    declaration();
@@ -109,10 +109,10 @@
 
 
     // $ANTLR start "declaration"
-    // SimpleCTP.g:12:1: declaration : ( variable | ^( FUNC_DECL functionHeader ) | ^( FUNC_DEF functionHeader block ) );
+    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:12:1: declaration : ( variable | ^( FUNC_DECL functionHeader ) | ^( FUNC_DEF functionHeader block ) );
     public final void declaration() throws RecognitionException {
         try {
-            // SimpleCTP.g:13:5: ( variable | ^( FUNC_DECL functionHeader ) | ^( FUNC_DEF functionHeader block ) )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:13:5: ( variable | ^( FUNC_DECL functionHeader ) | ^( FUNC_DEF functionHeader block ) )
             int alt2=3;
             switch ( input.LA(1) ) {
             case VAR_DEF:
@@ -139,7 +139,7 @@
 
             switch (alt2) {
                 case 1 :
-                    // SimpleCTP.g:13:9: variable
+                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:13:9: variable
                     {
                     pushFollow(FOLLOW_variable_in_declaration63);
                     variable();
@@ -150,7 +150,7 @@
                     }
                     break;
                 case 2 :
-                    // SimpleCTP.g:14:9: ^( FUNC_DECL functionHeader )
+                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:14:9: ^( FUNC_DECL functionHeader )
                     {
                     match(input,FUNC_DECL,FOLLOW_FUNC_DECL_in_declaration74); 
 
@@ -166,7 +166,7 @@
                     }
                     break;
                 case 3 :
-                    // SimpleCTP.g:15:9: ^( FUNC_DEF functionHeader block )
+                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:15:9: ^( FUNC_DEF functionHeader block )
                     {
                     match(input,FUNC_DEF,FOLLOW_FUNC_DEF_in_declaration88); 
 
@@ -201,11 +201,11 @@
 
 
     // $ANTLR start "variable"
-    // SimpleCTP.g:18:1: variable : ^( VAR_DEF type declarator ) ;
+    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:18:1: variable : ^( VAR_DEF type declarator ) ;
     public final void variable() throws RecognitionException {
         try {
-            // SimpleCTP.g:19:5: ( ^( VAR_DEF type declarator ) )
-            // SimpleCTP.g:19:9: ^( VAR_DEF type declarator )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:19:5: ( ^( VAR_DEF type declarator ) )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:19:9: ^( VAR_DEF type declarator )
             {
             match(input,VAR_DEF,FOLLOW_VAR_DEF_in_variable113); 
 
@@ -238,11 +238,11 @@
 
 
     // $ANTLR start "declarator"
-    // SimpleCTP.g:22:1: declarator : ID ;
+    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:22:1: declarator : ID ;
     public final void declarator() throws RecognitionException {
         try {
-            // SimpleCTP.g:23:5: ( ID )
-            // SimpleCTP.g:23:9: ID
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:23:5: ( ID )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:23:9: ID
             {
             match(input,ID,FOLLOW_ID_in_declarator137); 
 
@@ -261,11 +261,11 @@
 
 
     // $ANTLR start "functionHeader"
-    // SimpleCTP.g:26:1: functionHeader : ^( FUNC_HDR type ID ( formalParameter )+ ) ;
+    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:26:1: functionHeader : ^( FUNC_HDR type ID ( formalParameter )+ ) ;
     public final void functionHeader() throws RecognitionException {
         try {
-            // SimpleCTP.g:27:5: ( ^( FUNC_HDR type ID ( formalParameter )+ ) )
-            // SimpleCTP.g:27:9: ^( FUNC_HDR type ID ( formalParameter )+ )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:27:5: ( ^( FUNC_HDR type ID ( formalParameter )+ ) )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:27:9: ^( FUNC_HDR type ID ( formalParameter )+ )
             {
             match(input,FUNC_HDR,FOLLOW_FUNC_HDR_in_functionHeader158); 
 
@@ -276,7 +276,7 @@
             state._fsp--;
 
             match(input,ID,FOLLOW_ID_in_functionHeader162); 
-            // SimpleCTP.g:27:28: ( formalParameter )+
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:27:28: ( formalParameter )+
             int cnt3=0;
             loop3:
             do {
@@ -290,7 +290,7 @@
 
                 switch (alt3) {
             	case 1 :
-            	    // SimpleCTP.g:27:28: formalParameter
+            	    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:27:28: formalParameter
             	    {
             	    pushFollow(FOLLOW_formalParameter_in_functionHeader164);
             	    formalParameter();
@@ -328,11 +328,11 @@
 
 
     // $ANTLR start "formalParameter"
-    // SimpleCTP.g:30:1: formalParameter : ^( ARG_DEF type declarator ) ;
+    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:30:1: formalParameter : ^( ARG_DEF type declarator ) ;
     public final void formalParameter() throws RecognitionException {
         try {
-            // SimpleCTP.g:31:5: ( ^( ARG_DEF type declarator ) )
-            // SimpleCTP.g:31:9: ^( ARG_DEF type declarator )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:31:5: ( ^( ARG_DEF type declarator ) )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:31:9: ^( ARG_DEF type declarator )
             {
             match(input,ARG_DEF,FOLLOW_ARG_DEF_in_formalParameter186); 
 
@@ -365,11 +365,11 @@
 
 
     // $ANTLR start "type"
-    // SimpleCTP.g:34:1: type : ( 'int' | 'char' | 'void' | ID );
+    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:34:1: type : ( 'int' | 'char' | 'void' | ID );
     public final void type() throws RecognitionException {
         try {
-            // SimpleCTP.g:35:5: ( 'int' | 'char' | 'void' | ID )
-            // SimpleCTP.g:
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:35:5: ( 'int' | 'char' | 'void' | ID )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:
             {
             if ( input.LA(1)==ID||(input.LA(1)>=INT_TYPE && input.LA(1)<=VOID) ) {
                 input.consume();
@@ -396,17 +396,17 @@
 
 
     // $ANTLR start "block"
-    // SimpleCTP.g:41:1: block : ^( BLOCK ( variable )* ( stat )* ) ;
+    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:41:1: block : ^( BLOCK ( variable )* ( stat )* ) ;
     public final void block() throws RecognitionException {
         try {
-            // SimpleCTP.g:42:5: ( ^( BLOCK ( variable )* ( stat )* ) )
-            // SimpleCTP.g:42:9: ^( BLOCK ( variable )* ( stat )* )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:42:5: ( ^( BLOCK ( variable )* ( stat )* ) )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:42:9: ^( BLOCK ( variable )* ( stat )* )
             {
             match(input,BLOCK,FOLLOW_BLOCK_in_block273); 
 
             if ( input.LA(1)==Token.DOWN ) {
                 match(input, Token.DOWN, null); 
-                // SimpleCTP.g:42:17: ( variable )*
+                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:42:17: ( variable )*
                 loop4:
                 do {
                     int alt4=2;
@@ -419,7 +419,7 @@
 
                     switch (alt4) {
                 	case 1 :
-                	    // SimpleCTP.g:42:17: variable
+                	    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:42:17: variable
                 	    {
                 	    pushFollow(FOLLOW_variable_in_block275);
                 	    variable();
@@ -435,7 +435,7 @@
                     }
                 } while (true);
 
-                // SimpleCTP.g:42:27: ( stat )*
+                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:42:27: ( stat )*
                 loop5:
                 do {
                     int alt5=2;
@@ -448,7 +448,7 @@
 
                     switch (alt5) {
                 	case 1 :
-                	    // SimpleCTP.g:42:27: stat
+                	    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:42:27: stat
                 	    {
                 	    pushFollow(FOLLOW_stat_in_block278);
                 	    stat();
@@ -483,10 +483,10 @@
 
 
     // $ANTLR start "stat"
-    // SimpleCTP.g:45:1: stat : ( forStat | expr | block );
+    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:45:1: stat : ( forStat | expr | block );
     public final void stat() throws RecognitionException {
         try {
-            // SimpleCTP.g:45:5: ( forStat | expr | block )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:45:5: ( forStat | expr | block )
             int alt6=3;
             switch ( input.LA(1) ) {
             case FOR:
@@ -518,7 +518,7 @@
 
             switch (alt6) {
                 case 1 :
-                    // SimpleCTP.g:45:7: forStat
+                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:45:7: forStat
                     {
                     pushFollow(FOLLOW_forStat_in_stat292);
                     forStat();
@@ -529,7 +529,7 @@
                     }
                     break;
                 case 2 :
-                    // SimpleCTP.g:46:7: expr
+                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:46:7: expr
                     {
                     pushFollow(FOLLOW_expr_in_stat300);
                     expr();
@@ -540,7 +540,7 @@
                     }
                     break;
                 case 3 :
-                    // SimpleCTP.g:47:7: block
+                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:47:7: block
                     {
                     pushFollow(FOLLOW_block_in_stat308);
                     block();
@@ -565,11 +565,11 @@
 
 
     // $ANTLR start "forStat"
-    // SimpleCTP.g:50:1: forStat : ^( 'for' expr expr expr block ) ;
+    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:50:1: forStat : ^( 'for' expr expr expr block ) ;
     public final void forStat() throws RecognitionException {
         try {
-            // SimpleCTP.g:51:5: ( ^( 'for' expr expr expr block ) )
-            // SimpleCTP.g:51:9: ^( 'for' expr expr expr block )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:51:5: ( ^( 'for' expr expr expr block ) )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:51:9: ^( 'for' expr expr expr block )
             {
             match(input,FOR,FOLLOW_FOR_in_forStat328); 
 
@@ -614,7 +614,7 @@
     };
 
     // $ANTLR start "expr"
-    // SimpleCTP.g:54:1: expr : ( ^( EQEQ expr expr ) | ^( LT expr expr ) | ^( PLUS expr expr ) | ^( EQ ID e= expr ) | atom );
+    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:54:1: expr : ( ^( EQEQ expr expr ) | ^( LT expr expr ) | ^( PLUS expr expr ) | ^( EQ ID e= expr ) | atom );
     public final SimpleCTP.expr_return expr() throws RecognitionException {
         SimpleCTP.expr_return retval = new SimpleCTP.expr_return();
         retval.start = input.LT(1);
@@ -624,7 +624,7 @@
 
 
         try {
-            // SimpleCTP.g:54:5: ( ^( EQEQ expr expr ) | ^( LT expr expr ) | ^( PLUS expr expr ) | ^( EQ ID e= expr ) | atom )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:54:5: ( ^( EQEQ expr expr ) | ^( LT expr expr ) | ^( PLUS expr expr ) | ^( EQ ID e= expr ) | atom )
             int alt7=5;
             switch ( input.LA(1) ) {
             case EQEQ:
@@ -662,7 +662,7 @@
 
             switch (alt7) {
                 case 1 :
-                    // SimpleCTP.g:54:9: ^( EQEQ expr expr )
+                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:54:9: ^( EQEQ expr expr )
                     {
                     match(input,EQEQ,FOLLOW_EQEQ_in_expr352); 
 
@@ -683,7 +683,7 @@
                     }
                     break;
                 case 2 :
-                    // SimpleCTP.g:55:9: ^( LT expr expr )
+                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:55:9: ^( LT expr expr )
                     {
                     match(input,LT,FOLLOW_LT_in_expr368); 
 
@@ -704,7 +704,7 @@
                     }
                     break;
                 case 3 :
-                    // SimpleCTP.g:56:9: ^( PLUS expr expr )
+                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:56:9: ^( PLUS expr expr )
                     {
                     match(input,PLUS,FOLLOW_PLUS_in_expr384); 
 
@@ -725,7 +725,7 @@
                     }
                     break;
                 case 4 :
-                    // SimpleCTP.g:57:9: ^( EQ ID e= expr )
+                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:57:9: ^( EQ ID e= expr )
                     {
                     match(input,EQ,FOLLOW_EQ_in_expr400); 
 
@@ -745,7 +745,7 @@
                     }
                     break;
                 case 5 :
-                    // SimpleCTP.g:58:9: atom
+                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:58:9: atom
                     {
                     pushFollow(FOLLOW_atom_in_expr419);
                     atom();
@@ -770,11 +770,11 @@
 
 
     // $ANTLR start "atom"
-    // SimpleCTP.g:61:1: atom : ( ID | INT );
+    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:61:1: atom : ( ID | INT );
     public final void atom() throws RecognitionException {
         try {
-            // SimpleCTP.g:62:5: ( ID | INT )
-            // SimpleCTP.g:
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:62:5: ( ID | INT )
+            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:
             {
             if ( input.LA(1)==ID||input.LA(1)==INT ) {
                 input.consume();
diff --git a/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.m b/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.m
index a9100eb..de4a62c 100644
--- a/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.m
+++ b/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.m
@@ -1,8 +1,8 @@
 /** \file
- *  This OBJC source file was generated by $ANTLR version ${project.version} ${buildNumber}
+ *  This OBJC source file was generated by $ANTLR version 3.4
  *
- *     -  From the grammar source file : SimpleCTP.g
- *     -                            On : 2011-05-06 15:09:28
+ *     -  From the grammar source file : /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g
+ *     -                            On : 2012-02-16 17:41:10
  *     -           for the tree parser : SimpleCTPTreeParser
  *
  * Editing it, at least manually, is not wise.
@@ -11,7 +11,7 @@
  *
  *
 */
-// $ANTLR ${project.version} ${buildNumber} SimpleCTP.g 2011-05-06 15:09:28
+// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g 2012-02-16 17:41:10
 
 
 /* -----------------------------------------
@@ -113,48 +113,45 @@
 static const unsigned long long FOLLOW_atom_in_expr429_data[] = { 0x0000000000000002LL};
 
 
-#pragma mark Dynamic Global Scopes
+#pragma mark Dynamic Global globalAttributeScopeImplementation
 @implementation Symbols_Scope  /* globalAttributeScopeImplementation */
 /* start of synthesize -- OBJC-Line 1750 */
-
-@synthesize tree;
+@synthesize tree; 
 
 + (Symbols_Scope *)newSymbols_Scope
 {
-    return [[[Symbols_Scope alloc] init] retain];
+return [[Symbols_Scope alloc] init];
 }
 
 - (id) init
 {
-    self = [super init];
-    return self;
+self = [super init];
+return self;
 }
 
 /* start of iterate get and set functions */
-
 - (ANTLRCommonTree *)gettree { return( tree ); }
-
 - (void)settree:(ANTLRCommonTree *)aVal { tree = aVal; }
 
 /* End of iterate get and set functions */
-
 @end /* end of Symbols_Scope implementation */
 
 
-#pragma mark Dynamic Rule Scopes
 
-#pragma mark Rule Return Scopes start
-@implementation SimpleCTP_expr_return /* returnScope */
+#pragma mark Dynamic Rule Scopes ruleAttributeScopeImplementation
+
+#pragma mark Rule Return Scopes returnScopeImplementation
+@implementation SimpleCTP_expr_return /* returnScopeImplementation */
  /* start of synthesize -- OBJC-Line 1837 */
 + (SimpleCTP_expr_return *)newSimpleCTP_expr_return
 {
-    return [[[SimpleCTP_expr_return alloc] init] retain];
+return [[[SimpleCTP_expr_return alloc] init] retain];
 }
 
 - (id) init
 {
-    self = [super init];
-    return self;
+self = [super init];
+return self;
 }
 
 
@@ -162,96 +159,89 @@
 @end /* end of returnScope implementation */
 
 
-//#pragma mark Rule return scopes start
-//
-
-#pragma mark Rule return scopes start
 
 @implementation SimpleCTP  // line 637
 
 /* ObjC start of ruleAttributeScope */
-#pragma mark Dynamic Rule Scopes
+#pragma mark Dynamic Rule Scopes ruleAttributeScope
 /* ObjC end of ruleAttributeScope */
-#pragma mark global Attribute Scopes
+#pragma mark global Attribute Scopes globalAttributeScope
 /* ObjC start globalAttributeScope */
 static _stack;
-
+ 
 /* ObjC end globalAttributeScope */
 /* ObjC start actions.(actionScope).synthesize */
-/* ObjC end actions.(actionScope).synthesize */
 /* ObjC start synthesize() */
-/* ObjC end synthesize() */
 
 + (void) initialize
 {
     #pragma mark Bitsets
-    FOLLOW_declaration_in_program56 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_declaration_in_program56_data Count:(NSUInteger)1] retain];
-    FOLLOW_variable_in_declaration76 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_variable_in_declaration76_data Count:(NSUInteger)1] retain];
-    FOLLOW_FUNC_DECL_in_declaration87 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_FUNC_DECL_in_declaration87_data Count:(NSUInteger)1] retain];
-    FOLLOW_functionHeader_in_declaration89 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_functionHeader_in_declaration89_data Count:(NSUInteger)1] retain];
-    FOLLOW_FUNC_DEF_in_declaration101 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_FUNC_DEF_in_declaration101_data Count:(NSUInteger)1] retain];
-    FOLLOW_functionHeader_in_declaration103 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_functionHeader_in_declaration103_data Count:(NSUInteger)1] retain];
-    FOLLOW_block_in_declaration105 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_block_in_declaration105_data Count:(NSUInteger)1] retain];
-    FOLLOW_VAR_DEF_in_variable126 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_VAR_DEF_in_variable126_data Count:(NSUInteger)1] retain];
-    FOLLOW_type_in_variable128 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_type_in_variable128_data Count:(NSUInteger)1] retain];
-    FOLLOW_declarator_in_variable130 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_declarator_in_variable130_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_ID_in_declarator150 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_ID_in_declarator150_data Count:(NSUInteger)1] retain];
-    FOLLOW_FUNC_HDR_in_functionHeader171 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_FUNC_HDR_in_functionHeader171_data Count:(NSUInteger)1] retain];
-    FOLLOW_type_in_functionHeader173 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_type_in_functionHeader173_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_ID_in_functionHeader175 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_ID_in_functionHeader175_data Count:(NSUInteger)1] retain];
-    FOLLOW_formalParameter_in_functionHeader177 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_formalParameter_in_functionHeader177_data Count:(NSUInteger)1] retain];
-    FOLLOW_ARG_DEF_in_formalParameter199 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_ARG_DEF_in_formalParameter199_data Count:(NSUInteger)1] retain];
-    FOLLOW_type_in_formalParameter201 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_type_in_formalParameter201_data Count:(NSUInteger)1] retain];
-    FOLLOW_declarator_in_formalParameter203 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_declarator_in_formalParameter203_data Count:(NSUInteger)1] retain];
-    FOLLOW_BLOCK_in_block283 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_BLOCK_in_block283_data Count:(NSUInteger)1] retain];
-    FOLLOW_variable_in_block285 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_variable_in_block285_data Count:(NSUInteger)1] retain];
-    FOLLOW_stat_in_block288 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_stat_in_block288_data Count:(NSUInteger)1] retain];
-    FOLLOW_forStat_in_stat302 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_forStat_in_stat302_data Count:(NSUInteger)1] retain];
-    FOLLOW_expr_in_stat310 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_stat310_data Count:(NSUInteger)1] retain];
-    FOLLOW_block_in_stat318 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_block_in_stat318_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_FOR_in_forStat338 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_FOR_in_forStat338_data Count:(NSUInteger)1] retain];
-    FOLLOW_expr_in_forStat340 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_forStat340_data Count:(NSUInteger)1] retain];
-    FOLLOW_expr_in_forStat342 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_forStat342_data Count:(NSUInteger)1] retain];
-    FOLLOW_expr_in_forStat344 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_forStat344_data Count:(NSUInteger)1] retain];
-    FOLLOW_block_in_forStat346 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_block_in_forStat346_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_EQEQ_in_expr362 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_EQEQ_in_expr362_data Count:(NSUInteger)1] retain];
-    FOLLOW_expr_in_expr364 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_expr364_data Count:(NSUInteger)1] retain];
-    FOLLOW_expr_in_expr366 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_expr366_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_LT_in_expr378 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_LT_in_expr378_data Count:(NSUInteger)1] retain];
-    FOLLOW_expr_in_expr380 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_expr380_data Count:(NSUInteger)1] retain];
-    FOLLOW_expr_in_expr382 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_expr382_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_PLUS_in_expr394 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_PLUS_in_expr394_data Count:(NSUInteger)1] retain];
-    FOLLOW_expr_in_expr396 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_expr396_data Count:(NSUInteger)1] retain];
-    FOLLOW_expr_in_expr398 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_expr398_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_EQ_in_expr410 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_EQ_in_expr410_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_ID_in_expr412 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_ID_in_expr412_data Count:(NSUInteger)1] retain];
-    FOLLOW_expr_in_expr416 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_expr416_data Count:(NSUInteger)1] retain];
-    FOLLOW_atom_in_expr429 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_atom_in_expr429_data Count:(NSUInteger)1] retain];
+    FOLLOW_declaration_in_program56 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_declaration_in_program56_data Count:(NSUInteger)1] retain];
+    FOLLOW_variable_in_declaration76 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_variable_in_declaration76_data Count:(NSUInteger)1] retain];
+    FOLLOW_FUNC_DECL_in_declaration87 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_FUNC_DECL_in_declaration87_data Count:(NSUInteger)1] retain];
+    FOLLOW_functionHeader_in_declaration89 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_functionHeader_in_declaration89_data Count:(NSUInteger)1] retain];
+    FOLLOW_FUNC_DEF_in_declaration101 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_FUNC_DEF_in_declaration101_data Count:(NSUInteger)1] retain];
+    FOLLOW_functionHeader_in_declaration103 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_functionHeader_in_declaration103_data Count:(NSUInteger)1] retain];
+    FOLLOW_block_in_declaration105 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_block_in_declaration105_data Count:(NSUInteger)1] retain];
+    FOLLOW_VAR_DEF_in_variable126 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_VAR_DEF_in_variable126_data Count:(NSUInteger)1] retain];
+    FOLLOW_type_in_variable128 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_type_in_variable128_data Count:(NSUInteger)1] retain];
+    FOLLOW_declarator_in_variable130 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_declarator_in_variable130_data Count:(NSUInteger)1] retain];
+    FOLLOW_K_ID_in_declarator150 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_ID_in_declarator150_data Count:(NSUInteger)1] retain];
+    FOLLOW_FUNC_HDR_in_functionHeader171 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_FUNC_HDR_in_functionHeader171_data Count:(NSUInteger)1] retain];
+    FOLLOW_type_in_functionHeader173 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_type_in_functionHeader173_data Count:(NSUInteger)1] retain];
+    FOLLOW_K_ID_in_functionHeader175 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_ID_in_functionHeader175_data Count:(NSUInteger)1] retain];
+    FOLLOW_formalParameter_in_functionHeader177 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_formalParameter_in_functionHeader177_data Count:(NSUInteger)1] retain];
+    FOLLOW_ARG_DEF_in_formalParameter199 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_ARG_DEF_in_formalParameter199_data Count:(NSUInteger)1] retain];
+    FOLLOW_type_in_formalParameter201 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_type_in_formalParameter201_data Count:(NSUInteger)1] retain];
+    FOLLOW_declarator_in_formalParameter203 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_declarator_in_formalParameter203_data Count:(NSUInteger)1] retain];
+    FOLLOW_BLOCK_in_block283 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_BLOCK_in_block283_data Count:(NSUInteger)1] retain];
+    FOLLOW_variable_in_block285 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_variable_in_block285_data Count:(NSUInteger)1] retain];
+    FOLLOW_stat_in_block288 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_stat_in_block288_data Count:(NSUInteger)1] retain];
+    FOLLOW_forStat_in_stat302 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_forStat_in_stat302_data Count:(NSUInteger)1] retain];
+    FOLLOW_expr_in_stat310 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_stat310_data Count:(NSUInteger)1] retain];
+    FOLLOW_block_in_stat318 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_block_in_stat318_data Count:(NSUInteger)1] retain];
+    FOLLOW_K_FOR_in_forStat338 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_FOR_in_forStat338_data Count:(NSUInteger)1] retain];
+    FOLLOW_expr_in_forStat340 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_forStat340_data Count:(NSUInteger)1] retain];
+    FOLLOW_expr_in_forStat342 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_forStat342_data Count:(NSUInteger)1] retain];
+    FOLLOW_expr_in_forStat344 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_forStat344_data Count:(NSUInteger)1] retain];
+    FOLLOW_block_in_forStat346 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_block_in_forStat346_data Count:(NSUInteger)1] retain];
+    FOLLOW_K_EQEQ_in_expr362 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_EQEQ_in_expr362_data Count:(NSUInteger)1] retain];
+    FOLLOW_expr_in_expr364 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_expr364_data Count:(NSUInteger)1] retain];
+    FOLLOW_expr_in_expr366 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_expr366_data Count:(NSUInteger)1] retain];
+    FOLLOW_K_LT_in_expr378 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_LT_in_expr378_data Count:(NSUInteger)1] retain];
+    FOLLOW_expr_in_expr380 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_expr380_data Count:(NSUInteger)1] retain];
+    FOLLOW_expr_in_expr382 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_expr382_data Count:(NSUInteger)1] retain];
+    FOLLOW_K_PLUS_in_expr394 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_PLUS_in_expr394_data Count:(NSUInteger)1] retain];
+    FOLLOW_expr_in_expr396 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_expr396_data Count:(NSUInteger)1] retain];
+    FOLLOW_expr_in_expr398 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_expr398_data Count:(NSUInteger)1] retain];
+    FOLLOW_K_EQ_in_expr410 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_EQ_in_expr410_data Count:(NSUInteger)1] retain];
+    FOLLOW_K_ID_in_expr412 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_ID_in_expr412_data Count:(NSUInteger)1] retain];
+    FOLLOW_expr_in_expr416 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_expr416_data Count:(NSUInteger)1] retain];
+    FOLLOW_atom_in_expr429 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_atom_in_expr429_data Count:(NSUInteger)1] retain];
 
-    [ANTLRBaseRecognizer setTokenNames:[[AMutableArray arrayWithObjects:@"<invalid>", @"<EOR>", @"<DOWN>", @"<UP>", 
+    [BaseRecognizer setTokenNames:[[AMutableArray arrayWithObjects:@"<invalid>", @"<EOR>", @"<DOWN>", @"<UP>", 
  @"ARG_DEF", @"BLOCK", @"FUNC_DECL", @"FUNC_DEF", @"FUNC_HDR", @"K_CHAR", 
  @"K_COMMA", @"K_EQ", @"K_EQEQ", @"K_FOR", @"K_ID", @"K_INT", @"K_INT_TYPE", 
  @"K_LCURLY", @"K_LCURVE", @"K_LT", @"K_PLUS", @"K_RCURLY", @"K_RCURVE", 
  @"K_SEMICOLON", @"K_VOID", @"VAR_DEF", @"WS", nil] retain]];
-    [ANTLRBaseRecognizer setGrammarFileName:@"SimpleCTP.g"];
+    [BaseRecognizer setGrammarFileName:@"/Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g"];
 }
 
-+ (SimpleCTP *)newSimpleCTP:(id<ANTLRTreeNodeStream>)aStream
++ (SimpleCTP *)newSimpleCTP:(id<TreeNodeStream>)aStream
 {
     return [[SimpleCTP alloc] initWithStream:aStream];
-
-
 }
 
-- (id) initWithStream:(id<ANTLRTreeNodeStream>)aStream
+- (id) initWithStream:(id<TreeNodeStream>)aStream
 {
-    self = [super initWithStream:aStream State:[[ANTLRRecognizerSharedState newANTLRRecognizerSharedStateWithRuleLen:12+1] retain]];
+    self = [super initWithStream:aStream State:[[RecognizerSharedState newRecognizerSharedStateWithRuleLen:12+1] retain]];
     if ( self != nil ) {
-
-
         /* globalAttributeScopeInit */
+
         Symbols_scope = [Symbols_Scope newSymbols_Scope];
-        Symbols_stack = [ANTLRSymbolStack newANTLRSymbolStackWithLen:30];
+
+        Symbols_stack = [SymbolStack newSymbolStackWithLen:30];
+
         /* start of actions-actionScope-init */
         /* start of init */
     }
@@ -261,11 +251,10 @@
 - (void) dealloc
 {
     [Symbols_stack release];
+     
     [super dealloc];
 }
 
-/* ObjC start members */
-/* ObjC end members */
 /* ObjC start actions.(actionScope).methods */
 /* ObjC end actions.(actionScope).methods */
 /* ObjC start methods() */
@@ -273,18 +262,23 @@
 /* ObjC start rules */
 /*
  * $ANTLR start program
- * SimpleCTP.g:13:1: program : ( declaration )+ ;
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:13:1: program : ( declaration )+ ;
  */
 - (void) program
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
-        // SimpleCTP.g:14:5: ( ( declaration )+ ) // ruleBlockSingleAlt
-        // SimpleCTP.g:14:9: ( declaration )+ // alt
+        /* ruleLabelDefs entry */
+
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:14:5: ( ( declaration )+ ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:14:9: ( declaration )+ // alt
         {
-        // SimpleCTP.g:14:9: ( declaration )+ // positiveClosureBlock
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:14:9: ( declaration )+ // positiveClosureBlock
         NSInteger cnt1 = 0;
         do {
             NSInteger alt1 = 2;
@@ -296,8 +290,9 @@
 
             switch (alt1) {
                 case 1 : ;
-                    // SimpleCTP.g:14:9: declaration // alt
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:14:9: declaration // alt
                     {
+
                     /* ruleRef */
                     [self pushFollow:FOLLOW_declaration_in_program56];
                     [self declaration];
@@ -305,34 +300,34 @@
                     [self popFollow];
 
 
-
+                     
                     }
                     break;
 
                 default :
                     if ( cnt1 >= 1 )
                         goto loop1;
-                    ANTLREarlyExitException *eee =
-                        [ANTLREarlyExitException newException:input decisionNumber:1];
+                    EarlyExitException *eee =
+                        [EarlyExitException newException:input decisionNumber:1];
                     @throw eee;
             }
             cnt1++;
         } while (YES);
         loop1: ;
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
     }
 
     @finally {
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return ;
@@ -341,15 +336,19 @@
 
 /*
  * $ANTLR start declaration
- * SimpleCTP.g:17:1: declaration : ( variable | ^( FUNC_DECL functionHeader ) | ^( FUNC_DEF functionHeader block ) );
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:17:1: declaration : ( variable | ^( FUNC_DECL functionHeader ) | ^( FUNC_DEF functionHeader block ) );
  */
 - (void) declaration
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
-        // SimpleCTP.g:18:5: ( variable | ^( FUNC_DECL functionHeader ) | ^( FUNC_DEF functionHeader block ) ) //ruleblock
+        /* ruleLabelDefs entry */
+
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:18:5: ( variable | ^( FUNC_DECL functionHeader ) | ^( FUNC_DEF functionHeader block ) ) //ruleblock
         NSInteger alt2=3;
         unichar charLA2 = [input LA:1];
         switch (charLA2) {
@@ -370,7 +369,7 @@
                 break;
 
         default: ;
-            ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newException:2 state:0 stream:input];
+            NoViableAltException *nvae = [NoViableAltException newException:2 state:0 stream:input];
             nvae.c = charLA2;
             @throw nvae;
 
@@ -378,8 +377,9 @@
 
         switch (alt2) {
             case 1 : ;
-                // SimpleCTP.g:18:9: variable // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:18:9: variable // alt
                 {
+
                 /* ruleRef */
                 [self pushFollow:FOLLOW_variable_in_declaration76];
                 [self variable];
@@ -387,15 +387,18 @@
                 [self popFollow];
 
 
-
+                 
                 }
                 break;
             case 2 : ;
-                // SimpleCTP.g:19:9: ^( FUNC_DECL functionHeader ) // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:19:9: ^( FUNC_DECL functionHeader ) // alt
                 {
-                [self match:input TokenType:FUNC_DECL Follow:FOLLOW_FUNC_DECL_in_declaration87]; 
 
+
+                [self match:input TokenType:FUNC_DECL Follow:FOLLOW_FUNC_DECL_in_declaration87]; 
+                 
                     [self match:input TokenType:DOWN Follow:nil]; 
+
                     /* ruleRef */
                     [self pushFollow:FOLLOW_functionHeader_in_declaration89];
                     [self functionHeader];
@@ -403,18 +406,21 @@
                     [self popFollow];
 
 
-
+                     
                     [self match:input TokenType:UP Follow:nil]; 
 
-
+                 
                 }
                 break;
             case 3 : ;
-                // SimpleCTP.g:20:9: ^( FUNC_DEF functionHeader block ) // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:20:9: ^( FUNC_DEF functionHeader block ) // alt
                 {
-                [self match:input TokenType:FUNC_DEF Follow:FOLLOW_FUNC_DEF_in_declaration101]; 
 
+
+                [self match:input TokenType:FUNC_DEF Follow:FOLLOW_FUNC_DEF_in_declaration101]; 
+                 
                     [self match:input TokenType:DOWN Follow:nil]; 
+
                     /* ruleRef */
                     [self pushFollow:FOLLOW_functionHeader_in_declaration103];
                     [self functionHeader];
@@ -422,7 +428,7 @@
                     [self popFollow];
 
 
-
+                     
                     /* ruleRef */
                     [self pushFollow:FOLLOW_block_in_declaration105];
                     [self block];
@@ -430,24 +436,24 @@
                     [self popFollow];
 
 
-
+                     
                     [self match:input TokenType:UP Follow:nil]; 
 
-
+                 
                 }
                 break;
 
         }
-        // token+rule list labels
+        /* token+rule list labels */
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
     }
 
     @finally {
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return ;
@@ -456,20 +462,27 @@
 
 /*
  * $ANTLR start variable
- * SimpleCTP.g:23:1: variable : ^( VAR_DEF type declarator ) ;
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:23:1: variable : ^( VAR_DEF type declarator ) ;
  */
 - (void) variable
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
-        // SimpleCTP.g:24:5: ( ^( VAR_DEF type declarator ) ) // ruleBlockSingleAlt
-        // SimpleCTP.g:24:9: ^( VAR_DEF type declarator ) // alt
-        {
-        [self match:input TokenType:VAR_DEF Follow:FOLLOW_VAR_DEF_in_variable126]; 
+        /* ruleLabelDefs entry */
 
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:24:5: ( ^( VAR_DEF type declarator ) ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:24:9: ^( VAR_DEF type declarator ) // alt
+        {
+
+
+        [self match:input TokenType:VAR_DEF Follow:FOLLOW_VAR_DEF_in_variable126]; 
+         
             [self match:input TokenType:DOWN Follow:nil]; 
+
             /* ruleRef */
             [self pushFollow:FOLLOW_type_in_variable128];
             [self type];
@@ -477,7 +490,7 @@
             [self popFollow];
 
 
-
+             
             /* ruleRef */
             [self pushFollow:FOLLOW_declarator_in_variable130];
             [self declarator];
@@ -485,22 +498,22 @@
             [self popFollow];
 
 
-
+             
             [self match:input TokenType:UP Follow:nil]; 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
     }
 
     @finally {
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return ;
@@ -509,31 +522,36 @@
 
 /*
  * $ANTLR start declarator
- * SimpleCTP.g:27:1: declarator : K_ID ;
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:27:1: declarator : K_ID ;
  */
 - (void) declarator
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
-        // SimpleCTP.g:28:5: ( K_ID ) // ruleBlockSingleAlt
-        // SimpleCTP.g:28:9: K_ID // alt
-        {
-        [self match:input TokenType:K_ID Follow:FOLLOW_K_ID_in_declarator150]; 
+        /* ruleLabelDefs entry */
 
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:28:5: ( K_ID ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:28:9: K_ID // alt
+        {
+
+        [self match:input TokenType:K_ID Follow:FOLLOW_K_ID_in_declarator150]; 
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
     }
 
     @finally {
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return ;
@@ -542,20 +560,27 @@
 
 /*
  * $ANTLR start functionHeader
- * SimpleCTP.g:31:1: functionHeader : ^( FUNC_HDR type K_ID ( formalParameter )+ ) ;
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:31:1: functionHeader : ^( FUNC_HDR type K_ID ( formalParameter )+ ) ;
  */
 - (void) functionHeader
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
-        // SimpleCTP.g:32:5: ( ^( FUNC_HDR type K_ID ( formalParameter )+ ) ) // ruleBlockSingleAlt
-        // SimpleCTP.g:32:9: ^( FUNC_HDR type K_ID ( formalParameter )+ ) // alt
-        {
-        [self match:input TokenType:FUNC_HDR Follow:FOLLOW_FUNC_HDR_in_functionHeader171]; 
+        /* ruleLabelDefs entry */
 
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:32:5: ( ^( FUNC_HDR type K_ID ( formalParameter )+ ) ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:32:9: ^( FUNC_HDR type K_ID ( formalParameter )+ ) // alt
+        {
+
+
+        [self match:input TokenType:FUNC_HDR Follow:FOLLOW_FUNC_HDR_in_functionHeader171]; 
+         
             [self match:input TokenType:DOWN Follow:nil]; 
+
             /* ruleRef */
             [self pushFollow:FOLLOW_type_in_functionHeader173];
             [self type];
@@ -563,10 +588,10 @@
             [self popFollow];
 
 
-
+             
             [self match:input TokenType:K_ID Follow:FOLLOW_K_ID_in_functionHeader175]; 
-
-            // SimpleCTP.g:32:30: ( formalParameter )+ // positiveClosureBlock
+             
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:32:30: ( formalParameter )+ // positiveClosureBlock
             NSInteger cnt3 = 0;
             do {
                 NSInteger alt3 = 2;
@@ -578,8 +603,9 @@
 
                 switch (alt3) {
                     case 1 : ;
-                        // SimpleCTP.g:32:30: formalParameter // alt
+                        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:32:30: formalParameter // alt
                         {
+
                         /* ruleRef */
                         [self pushFollow:FOLLOW_formalParameter_in_functionHeader177];
                         [self formalParameter];
@@ -587,37 +613,37 @@
                         [self popFollow];
 
 
-
+                         
                         }
                         break;
 
                     default :
                         if ( cnt3 >= 1 )
                             goto loop3;
-                        ANTLREarlyExitException *eee =
-                            [ANTLREarlyExitException newException:input decisionNumber:3];
+                        EarlyExitException *eee =
+                            [EarlyExitException newException:input decisionNumber:3];
                         @throw eee;
                 }
                 cnt3++;
             } while (YES);
             loop3: ;
 
-
+             
             [self match:input TokenType:UP Follow:nil]; 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
     }
 
     @finally {
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return ;
@@ -626,20 +652,27 @@
 
 /*
  * $ANTLR start formalParameter
- * SimpleCTP.g:35:1: formalParameter : ^( ARG_DEF type declarator ) ;
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:35:1: formalParameter : ^( ARG_DEF type declarator ) ;
  */
 - (void) formalParameter
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
-        // SimpleCTP.g:36:5: ( ^( ARG_DEF type declarator ) ) // ruleBlockSingleAlt
-        // SimpleCTP.g:36:9: ^( ARG_DEF type declarator ) // alt
-        {
-        [self match:input TokenType:ARG_DEF Follow:FOLLOW_ARG_DEF_in_formalParameter199]; 
+        /* ruleLabelDefs entry */
 
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:36:5: ( ^( ARG_DEF type declarator ) ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:36:9: ^( ARG_DEF type declarator ) // alt
+        {
+
+
+        [self match:input TokenType:ARG_DEF Follow:FOLLOW_ARG_DEF_in_formalParameter199]; 
+         
             [self match:input TokenType:DOWN Follow:nil]; 
+
             /* ruleRef */
             [self pushFollow:FOLLOW_type_in_formalParameter201];
             [self type];
@@ -647,7 +680,7 @@
             [self popFollow];
 
 
-
+             
             /* ruleRef */
             [self pushFollow:FOLLOW_declarator_in_formalParameter203];
             [self declarator];
@@ -655,22 +688,22 @@
             [self popFollow];
 
 
-
+             
             [self match:input TokenType:UP Follow:nil]; 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
     }
 
     @finally {
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return ;
@@ -679,38 +712,43 @@
 
 /*
  * $ANTLR start type
- * SimpleCTP.g:39:1: type : ( K_INT_TYPE | K_CHAR | K_VOID | K_ID );
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:39:1: type : ( K_INT_TYPE | K_CHAR | K_VOID | K_ID );
  */
 - (void) type
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
-        // SimpleCTP.g:40:5: ( K_INT_TYPE | K_CHAR | K_VOID | K_ID ) // ruleBlockSingleAlt
-        // SimpleCTP.g: // alt
+        /* ruleLabelDefs entry */
+
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:40:5: ( K_INT_TYPE | K_CHAR | K_VOID | K_ID ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g: // alt
         {
+
         if ([input LA:1] == K_CHAR||[input LA:1] == K_ID||[input LA:1] == K_INT_TYPE||[input LA:1] == K_VOID) {
             [input consume];
             [state setIsErrorRecovery:NO];
         } else {
-            ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException newException:nil stream:input];
+            MismatchedSetException *mse = [MismatchedSetException newException:nil stream:input];
             @throw mse;
         }
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
     }
 
     @finally {
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return ;
@@ -719,21 +757,29 @@
 
 /*
  * $ANTLR start block
- * SimpleCTP.g:46:1: block : ^( BLOCK ( variable )* ( stat )* ) ;
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:46:1: block : ^( BLOCK ( variable )* ( stat )* ) ;
  */
 - (void) block
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
-        // SimpleCTP.g:47:5: ( ^( BLOCK ( variable )* ( stat )* ) ) // ruleBlockSingleAlt
-        // SimpleCTP.g:47:9: ^( BLOCK ( variable )* ( stat )* ) // alt
-        {
-        [self match:input TokenType:BLOCK Follow:FOLLOW_BLOCK_in_block283]; 
+        /* ruleLabelDefs entry */
 
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:47:5: ( ^( BLOCK ( variable )* ( stat )* ) ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:47:9: ^( BLOCK ( variable )* ( stat )* ) // alt
+        {
+
+
+        [self match:input TokenType:BLOCK Follow:FOLLOW_BLOCK_in_block283]; 
+         
         if ( [input LA:1] == DOWN ) {
             [self match:input TokenType:DOWN Follow:nil]; 
+
+
             do {
                 NSInteger alt4=2;
                 NSInteger LA4_0 = [input LA:1];
@@ -744,8 +790,9 @@
 
                 switch (alt4) {
                     case 1 : ;
-                        // SimpleCTP.g:47:17: variable // alt
+                        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:47:17: variable // alt
                         {
+
                         /* ruleRef */
                         [self pushFollow:FOLLOW_variable_in_block285];
                         [self variable];
@@ -753,7 +800,7 @@
                         [self popFollow];
 
 
-
+                         
                         }
                         break;
 
@@ -763,6 +810,7 @@
             } while (YES);
             loop4: ;
 
+             
 
             do {
                 NSInteger alt5=2;
@@ -774,8 +822,9 @@
 
                 switch (alt5) {
                     case 1 : ;
-                        // SimpleCTP.g:47:27: stat // alt
+                        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:47:27: stat // alt
                         {
+
                         /* ruleRef */
                         [self pushFollow:FOLLOW_stat_in_block288];
                         [self stat];
@@ -783,7 +832,7 @@
                         [self popFollow];
 
 
-
+                         
                         }
                         break;
 
@@ -793,23 +842,23 @@
             } while (YES);
             loop5: ;
 
-
+             
             [self match:input TokenType:UP Follow:nil]; 
         }
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
     }
 
     @finally {
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return ;
@@ -818,15 +867,19 @@
 
 /*
  * $ANTLR start stat
- * SimpleCTP.g:50:1: stat : ( forStat | expr | block );
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:50:1: stat : ( forStat | expr | block );
  */
 - (void) stat
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
-        // SimpleCTP.g:50:5: ( forStat | expr | block ) //ruleblock
+        /* ruleLabelDefs entry */
+
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:50:5: ( forStat | expr | block ) //ruleblock
         NSInteger alt6=3;
         unichar charLA6 = [input LA:1];
         switch (charLA6) {
@@ -852,7 +905,7 @@
                 break;
 
         default: ;
-            ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newException:6 state:0 stream:input];
+            NoViableAltException *nvae = [NoViableAltException newException:6 state:0 stream:input];
             nvae.c = charLA6;
             @throw nvae;
 
@@ -860,8 +913,9 @@
 
         switch (alt6) {
             case 1 : ;
-                // SimpleCTP.g:50:7: forStat // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:50:7: forStat // alt
                 {
+
                 /* ruleRef */
                 [self pushFollow:FOLLOW_forStat_in_stat302];
                 [self forStat];
@@ -869,12 +923,13 @@
                 [self popFollow];
 
 
-
+                 
                 }
                 break;
             case 2 : ;
-                // SimpleCTP.g:51:7: expr // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:51:7: expr // alt
                 {
+
                 /* ruleRef */
                 [self pushFollow:FOLLOW_expr_in_stat310];
                 [self expr];
@@ -882,12 +937,13 @@
                 [self popFollow];
 
 
-
+                 
                 }
                 break;
             case 3 : ;
-                // SimpleCTP.g:52:7: block // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:52:7: block // alt
                 {
+
                 /* ruleRef */
                 [self pushFollow:FOLLOW_block_in_stat318];
                 [self block];
@@ -895,21 +951,21 @@
                 [self popFollow];
 
 
-
+                 
                 }
                 break;
 
         }
-        // token+rule list labels
+        /* token+rule list labels */
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
     }
 
     @finally {
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return ;
@@ -918,20 +974,27 @@
 
 /*
  * $ANTLR start forStat
- * SimpleCTP.g:55:1: forStat : ^( K_FOR expr expr expr block ) ;
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:55:1: forStat : ^( K_FOR expr expr expr block ) ;
  */
 - (void) forStat
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
-        // SimpleCTP.g:56:5: ( ^( K_FOR expr expr expr block ) ) // ruleBlockSingleAlt
-        // SimpleCTP.g:56:9: ^( K_FOR expr expr expr block ) // alt
-        {
-        [self match:input TokenType:K_FOR Follow:FOLLOW_K_FOR_in_forStat338]; 
+        /* ruleLabelDefs entry */
 
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:56:5: ( ^( K_FOR expr expr expr block ) ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:56:9: ^( K_FOR expr expr expr block ) // alt
+        {
+
+
+        [self match:input TokenType:K_FOR Follow:FOLLOW_K_FOR_in_forStat338]; 
+         
             [self match:input TokenType:DOWN Follow:nil]; 
+
             /* ruleRef */
             [self pushFollow:FOLLOW_expr_in_forStat340];
             [self expr];
@@ -939,7 +1002,7 @@
             [self popFollow];
 
 
-
+             
             /* ruleRef */
             [self pushFollow:FOLLOW_expr_in_forStat342];
             [self expr];
@@ -947,7 +1010,7 @@
             [self popFollow];
 
 
-
+             
             /* ruleRef */
             [self pushFollow:FOLLOW_expr_in_forStat344];
             [self expr];
@@ -955,7 +1018,7 @@
             [self popFollow];
 
 
-
+             
             /* ruleRef */
             [self pushFollow:FOLLOW_block_in_forStat346];
             [self block];
@@ -963,22 +1026,22 @@
             [self popFollow];
 
 
-
+             
             [self match:input TokenType:UP Follow:nil]; 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
     }
 
     @finally {
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return ;
@@ -987,23 +1050,23 @@
 
 /*
  * $ANTLR start expr
- * SimpleCTP.g:59:1: expr : ( ^( K_EQEQ expr expr ) | ^( K_LT expr expr ) | ^( K_PLUS expr expr ) | ^( K_EQ K_ID e= expr ) | atom );
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:59:1: expr : ( ^( K_EQEQ expr expr ) | ^( K_LT expr expr ) | ^( K_PLUS expr expr ) | ^( K_EQ K_ID e= expr ) | atom );
  */
 - (SimpleCTP_expr_return *) expr
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
 
+    /* ruleDeclarations */
     SimpleCTP_expr_return * retval = [SimpleCTP_expr_return newSimpleCTP_expr_return];
     [retval setStart:[input LT:1]];
 
 
     @try {
-        ANTLRCommonTree *K_ID1 = nil;
-         SimpleCTP_expr_return * e = nil ;
-         
+        /* ruleLabelDefs entry */
+        ANTLRCommonTree *K_ID1 = nil;SimpleCTP_expr_return * e = nil ;
 
-        // SimpleCTP.g:59:5: ( ^( K_EQEQ expr expr ) | ^( K_LT expr expr ) | ^( K_PLUS expr expr ) | ^( K_EQ K_ID e= expr ) | atom ) //ruleblock
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:59:5: ( ^( K_EQEQ expr expr ) | ^( K_LT expr expr ) | ^( K_PLUS expr expr ) | ^( K_EQ K_ID e= expr ) | atom ) //ruleblock
         NSInteger alt7=5;
         unichar charLA7 = [input LA:1];
         switch (charLA7) {
@@ -1035,7 +1098,7 @@
                 break;
 
         default: ;
-            ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newException:7 state:0 stream:input];
+            NoViableAltException *nvae = [NoViableAltException newException:7 state:0 stream:input];
             nvae.c = charLA7;
             @throw nvae;
 
@@ -1043,11 +1106,14 @@
 
         switch (alt7) {
             case 1 : ;
-                // SimpleCTP.g:59:9: ^( K_EQEQ expr expr ) // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:59:9: ^( K_EQEQ expr expr ) // alt
                 {
-                [self match:input TokenType:K_EQEQ Follow:FOLLOW_K_EQEQ_in_expr362]; 
 
+
+                [self match:input TokenType:K_EQEQ Follow:FOLLOW_K_EQEQ_in_expr362]; 
+                 
                     [self match:input TokenType:DOWN Follow:nil]; 
+
                     /* ruleRef */
                     [self pushFollow:FOLLOW_expr_in_expr364];
                     [self expr];
@@ -1055,7 +1121,7 @@
                     [self popFollow];
 
 
-
+                     
                     /* ruleRef */
                     [self pushFollow:FOLLOW_expr_in_expr366];
                     [self expr];
@@ -1063,18 +1129,21 @@
                     [self popFollow];
 
 
-
+                     
                     [self match:input TokenType:UP Follow:nil]; 
 
-
+                 
                 }
                 break;
             case 2 : ;
-                // SimpleCTP.g:60:9: ^( K_LT expr expr ) // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:60:9: ^( K_LT expr expr ) // alt
                 {
-                [self match:input TokenType:K_LT Follow:FOLLOW_K_LT_in_expr378]; 
 
+
+                [self match:input TokenType:K_LT Follow:FOLLOW_K_LT_in_expr378]; 
+                 
                     [self match:input TokenType:DOWN Follow:nil]; 
+
                     /* ruleRef */
                     [self pushFollow:FOLLOW_expr_in_expr380];
                     [self expr];
@@ -1082,7 +1151,7 @@
                     [self popFollow];
 
 
-
+                     
                     /* ruleRef */
                     [self pushFollow:FOLLOW_expr_in_expr382];
                     [self expr];
@@ -1090,18 +1159,21 @@
                     [self popFollow];
 
 
-
+                     
                     [self match:input TokenType:UP Follow:nil]; 
 
-
+                 
                 }
                 break;
             case 3 : ;
-                // SimpleCTP.g:61:9: ^( K_PLUS expr expr ) // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:61:9: ^( K_PLUS expr expr ) // alt
                 {
-                [self match:input TokenType:K_PLUS Follow:FOLLOW_K_PLUS_in_expr394]; 
 
+
+                [self match:input TokenType:K_PLUS Follow:FOLLOW_K_PLUS_in_expr394]; 
+                 
                     [self match:input TokenType:DOWN Follow:nil]; 
+
                     /* ruleRef */
                     [self pushFollow:FOLLOW_expr_in_expr396];
                     [self expr];
@@ -1109,7 +1181,7 @@
                     [self popFollow];
 
 
-
+                     
                     /* ruleRef */
                     [self pushFollow:FOLLOW_expr_in_expr398];
                     [self expr];
@@ -1117,20 +1189,23 @@
                     [self popFollow];
 
 
-
+                     
                     [self match:input TokenType:UP Follow:nil]; 
 
-
+                 
                 }
                 break;
             case 4 : ;
-                // SimpleCTP.g:62:9: ^( K_EQ K_ID e= expr ) // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:62:9: ^( K_EQ K_ID e= expr ) // alt
                 {
+
+
                 [self match:input TokenType:K_EQ Follow:FOLLOW_K_EQ_in_expr410]; 
-
+                 
                     [self match:input TokenType:DOWN Follow:nil]; 
-                    K_ID1=(ANTLRCommonTree *)[self match:input TokenType:K_ID Follow:FOLLOW_K_ID_in_expr412]; 
 
+                    K_ID1=(ANTLRCommonTree *)[self match:input TokenType:K_ID Follow:FOLLOW_K_ID_in_expr412]; 
+                     
                     /* ruleRef */
                     [self pushFollow:FOLLOW_expr_in_expr416];
                     e = [self expr];
@@ -1138,18 +1213,20 @@
                     [self popFollow];
 
 
-
+                     
                     [self match:input TokenType:UP Follow:nil]; 
 
+                 
 
                  NSLog(@"assigning %@ to variable %@", (e!=nil?[[input getTokenStream] toStringFromStart:[[input getTreeAdaptor] getTokenStartIndex:[e getStart]]ToEnd:[[input getTreeAdaptor] getTokenStopIndex:[e getStart]]]:0), (K_ID1!=nil?K_ID1.text:nil)); 
 
-
+                 
                 }
                 break;
             case 5 : ;
-                // SimpleCTP.g:63:9: atom // alt
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:63:9: atom // alt
                 {
+
                 /* ruleRef */
                 [self pushFollow:FOLLOW_atom_in_expr429];
                 [self atom];
@@ -1157,21 +1234,21 @@
                 [self popFollow];
 
 
-
+                 
                 }
                 break;
 
         }
-        // token+rule list labels
+        /* token+rule list labels */
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
     }
 
     @finally {
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return retval;
@@ -1180,38 +1257,43 @@
 
 /*
  * $ANTLR start atom
- * SimpleCTP.g:66:1: atom : ( K_ID | K_INT );
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:66:1: atom : ( K_ID | K_INT );
  */
 - (void) atom
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
-        // SimpleCTP.g:67:5: ( K_ID | K_INT ) // ruleBlockSingleAlt
-        // SimpleCTP.g: // alt
+        /* ruleLabelDefs entry */
+
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:67:5: ( K_ID | K_INT ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g: // alt
         {
+
         if ((([input LA:1] >= K_ID) && ([input LA:1] <= K_INT))) {
             [input consume];
             [state setIsErrorRecovery:NO];
         } else {
-            ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException newException:nil stream:input];
+            MismatchedSetException *mse = [MismatchedSetException newException:nil stream:input];
             @throw mse;
         }
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
     }
 
     @finally {
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return ;
diff --git a/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g b/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g
new file mode 100644
index 0000000..b6d6474
--- /dev/null
+++ b/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g
@@ -0,0 +1,69 @@
+tree grammar SimpleCWalker;
+options {
+    tokenVocab = SimpleC;
+	language = ObjC;
+	ASTLabelType = CommonTree;
+}
+
+scope Symbols
+{
+CommonTree *tree;
+}
+
+program
+    :   declaration+
+    ;
+
+declaration
+    :   variable
+    |   ^(FUNC_DECL functionHeader)
+    |   ^(FUNC_DEF functionHeader block)
+    ;
+
+variable
+    :   ^(VAR_DEF type declarator)
+    ;
+
+declarator
+    :   K_ID 
+    ;
+
+functionHeader
+    :   ^(FUNC_HDR type K_ID formalParameter+)
+    ;
+
+formalParameter
+    :   ^(ARG_DEF type declarator)
+    ;
+
+type
+    :   K_INT_TYPE
+    |   K_CHAR  
+    |   K_VOID
+    |   K_ID        
+    ;
+
+block
+    :   ^(BLOCK variable* stat*)
+    ;
+
+stat: forStat
+    | expr
+    | block
+    ;
+
+forStat
+    :   ^(K_FOR expr expr expr block)
+    ;
+
+expr:   ^(K_EQEQ expr expr)
+    |   ^(K_LT expr expr)
+    |   ^(K_PLUS expr expr)
+    |   ^(K_EQ K_ID e=expr) { NSLog(@"assigning \%@ to variable \%@", $e.text, $K_ID.text); }
+    |   atom
+    ;
+
+atom
+    : K_ID      
+    | K_INT      
+    ; 
diff --git a/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.h b/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.h
new file mode 100644
index 0000000..649efdb
--- /dev/null
+++ b/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.h
@@ -0,0 +1,133 @@
+// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g 2012-02-16 17:56:35
+
+/* =============================================================================
+ * Standard antlr OBJC runtime definitions
+ */
+#import <Foundation/Foundation.h>
+#import <ANTLR/ANTLR.h>
+/* End of standard antlr3 runtime definitions
+ * =============================================================================
+ */
+
+/* treeParserHeaderFile */
+#ifndef ANTLR3TokenTypeAlreadyDefined
+#define ANTLR3TokenTypeAlreadyDefined
+typedef enum {
+    ANTLR_EOF = -1,
+    INVALID,
+    EOR,
+    DOWN,
+    UP,
+    MIN
+} ANTLR3TokenType;
+#endif
+
+#pragma mark Tokens
+#ifdef EOF
+#undef EOF
+#endif
+#define EOF -1
+#define ARG_DEF 4
+#define BLOCK 5
+#define FUNC_DECL 6
+#define FUNC_DEF 7
+#define FUNC_HDR 8
+#define K_CHAR 9
+#define K_COMMA 10
+#define K_EQ 11
+#define K_EQEQ 12
+#define K_FOR 13
+#define K_ID 14
+#define K_INT 15
+#define K_INT_TYPE 16
+#define K_LCURLY 17
+#define K_LCURVE 18
+#define K_LT 19
+#define K_PLUS 20
+#define K_RCURLY 21
+#define K_RCURVE 22
+#define K_SEMICOLON 23
+#define K_VOID 24
+#define VAR_DEF 25
+#define WS 26
+#pragma mark Dynamic Global Scopes globalAttributeScopeInterface
+/* globalAttributeScopeInterface */
+@interface Symbols_Scope : SymbolsScope {
+CommonTree * tree;
+ }
+/* start of globalAttributeScopeInterface properties */
+@property (assign, getter=gettree, setter=settree:) CommonTree * tree;
+/* end globalAttributeScopeInterface properties */
++ (Symbols_Scope *)newSymbols_Scope;
+- (id) init;
+/* start of globalAttributeScopeInterface methodsDecl */
+- (CommonTree *)gettree;
+- (void)settree:(CommonTree *)aVal;
+/* End of globalAttributeScopeInterface methodsDecl */
+@end /* end of Symbols_Scope interface */
+
+#pragma mark Dynamic Rule Scopes ruleAttributeScopeInterface
+#pragma mark Rule Return Scopes returnScopeInterface
+/* returnScopeInterface SimpleCWalker_expr_return */
+@interface SimpleCWalker_expr_return : TreeRuleReturnScope { /* returnScopeInterface line 1838 */
+ /* ObjC start of memVars() */
+
+}
+/* start property declarations */
+
+
+/* start of method declarations */
+
++ (SimpleCWalker_expr_return *)newSimpleCWalker_expr_return;
+/* this is start of set and get methods */
+  /* methodsDecl */
+
+@end /* end of returnScopeInterface interface */
+
+
+
+/* Interface grammar class */
+@interface SimpleCWalker  : TreeParser { /* line 572 */
+#pragma mark Dynamic Rule Scopes ruleAttributeScopeDecl
+#pragma mark Dynamic Global Rule Scopes globalAttributeScopeMemVar
+/* globalAttributeScopeMemVar */
+SymbolStack *Symbols_stack;
+Symbols_Scope *Symbols_scope;
+
+
+/* ObjC start of actions.(actionScope).memVars */
+/* ObjC end of actions.(actionScope).memVars */
+/* ObjC start of memVars */
+/* ObjC end of memVars */
+
+ }
+
+/* ObjC start of actions.(actionScope).properties */
+/* ObjC end of actions.(actionScope).properties */
+/* ObjC start of properties */
+/* ObjC end of properties */
+
++ (void) initialize;
++ (id) newSimpleCWalker:(id<TreeNodeStream>)aStream;
+/* ObjC start of actions.(actionScope).methodsDecl */
+/* ObjC end of actions.(actionScope).methodsDecl */
+
+/* ObjC start of methodsDecl */
+/* ObjC end of methodsDecl */
+
+- (void)program; 
+- (void)declaration; 
+- (void)variable; 
+- (void)declarator; 
+- (void)functionHeader; 
+- (void)formalParameter; 
+- (void)type; 
+- (void)block; 
+- (void)stat; 
+- (void)forStat; 
+- (SimpleCWalker_expr_return *)expr; 
+- (void)atom; 
+
+
+@end /* end of SimpleCWalker interface */
+
diff --git a/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.m b/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.m
new file mode 100644
index 0000000..c7d4cd4
--- /dev/null
+++ b/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.m
@@ -0,0 +1,1304 @@
+/** \file
+ *  This OBJC source file was generated by $ANTLR version 3.4
+ *
+ *     -  From the grammar source file : /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g
+ *     -                            On : 2012-02-16 17:56:35
+ *     -           for the tree parser : SimpleCWalkerTreeParser
+ *
+ * Editing it, at least manually, is not wise.
+ *
+ * ObjC language generator and runtime by Alan Condit, acondit|hereisanat|ipns|dotgoeshere|com.
+ *
+ *
+*/
+// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g 2012-02-16 17:56:35
+
+
+/* -----------------------------------------
+ * Include the ANTLR3 generated header file.
+ */
+#import "SimpleCWalker.h"
+/* ----------------------------------------- */
+
+
+/* ============================================================================= */
+/* =============================================================================
+ * Start of recognizer
+ */
+
+#pragma mark Bitsets
+static ANTLRBitSet *FOLLOW_declaration_in_program56;
+static const unsigned long long FOLLOW_declaration_in_program56_data[] = { 0x00000000020000C2LL};
+static ANTLRBitSet *FOLLOW_variable_in_declaration76;
+static const unsigned long long FOLLOW_variable_in_declaration76_data[] = { 0x0000000000000002LL};
+static ANTLRBitSet *FOLLOW_FUNC_DECL_in_declaration87;
+static const unsigned long long FOLLOW_FUNC_DECL_in_declaration87_data[] = { 0x0000000000000004LL};
+static ANTLRBitSet *FOLLOW_functionHeader_in_declaration89;
+static const unsigned long long FOLLOW_functionHeader_in_declaration89_data[] = { 0x0000000000000008LL};
+static ANTLRBitSet *FOLLOW_FUNC_DEF_in_declaration101;
+static const unsigned long long FOLLOW_FUNC_DEF_in_declaration101_data[] = { 0x0000000000000004LL};
+static ANTLRBitSet *FOLLOW_functionHeader_in_declaration103;
+static const unsigned long long FOLLOW_functionHeader_in_declaration103_data[] = { 0x0000000000000020LL};
+static ANTLRBitSet *FOLLOW_block_in_declaration105;
+static const unsigned long long FOLLOW_block_in_declaration105_data[] = { 0x0000000000000008LL};
+static ANTLRBitSet *FOLLOW_VAR_DEF_in_variable126;
+static const unsigned long long FOLLOW_VAR_DEF_in_variable126_data[] = { 0x0000000000000004LL};
+static ANTLRBitSet *FOLLOW_type_in_variable128;
+static const unsigned long long FOLLOW_type_in_variable128_data[] = { 0x0000000000004000LL};
+static ANTLRBitSet *FOLLOW_declarator_in_variable130;
+static const unsigned long long FOLLOW_declarator_in_variable130_data[] = { 0x0000000000000008LL};
+static ANTLRBitSet *FOLLOW_K_ID_in_declarator150;
+static const unsigned long long FOLLOW_K_ID_in_declarator150_data[] = { 0x0000000000000002LL};
+static ANTLRBitSet *FOLLOW_FUNC_HDR_in_functionHeader171;
+static const unsigned long long FOLLOW_FUNC_HDR_in_functionHeader171_data[] = { 0x0000000000000004LL};
+static ANTLRBitSet *FOLLOW_type_in_functionHeader173;
+static const unsigned long long FOLLOW_type_in_functionHeader173_data[] = { 0x0000000000004000LL};
+static ANTLRBitSet *FOLLOW_K_ID_in_functionHeader175;
+static const unsigned long long FOLLOW_K_ID_in_functionHeader175_data[] = { 0x0000000000000010LL};
+static ANTLRBitSet *FOLLOW_formalParameter_in_functionHeader177;
+static const unsigned long long FOLLOW_formalParameter_in_functionHeader177_data[] = { 0x0000000000000018LL};
+static ANTLRBitSet *FOLLOW_ARG_DEF_in_formalParameter199;
+static const unsigned long long FOLLOW_ARG_DEF_in_formalParameter199_data[] = { 0x0000000000000004LL};
+static ANTLRBitSet *FOLLOW_type_in_formalParameter201;
+static const unsigned long long FOLLOW_type_in_formalParameter201_data[] = { 0x0000000000004000LL};
+static ANTLRBitSet *FOLLOW_declarator_in_formalParameter203;
+static const unsigned long long FOLLOW_declarator_in_formalParameter203_data[] = { 0x0000000000000008LL};
+static ANTLRBitSet *FOLLOW_BLOCK_in_block283;
+static const unsigned long long FOLLOW_BLOCK_in_block283_data[] = { 0x0000000000000004LL};
+static ANTLRBitSet *FOLLOW_variable_in_block285;
+static const unsigned long long FOLLOW_variable_in_block285_data[] = { 0x000000000218F828LL};
+static ANTLRBitSet *FOLLOW_stat_in_block288;
+static const unsigned long long FOLLOW_stat_in_block288_data[] = { 0x000000000018F828LL};
+static ANTLRBitSet *FOLLOW_forStat_in_stat302;
+static const unsigned long long FOLLOW_forStat_in_stat302_data[] = { 0x0000000000000002LL};
+static ANTLRBitSet *FOLLOW_expr_in_stat310;
+static const unsigned long long FOLLOW_expr_in_stat310_data[] = { 0x0000000000000002LL};
+static ANTLRBitSet *FOLLOW_block_in_stat318;
+static const unsigned long long FOLLOW_block_in_stat318_data[] = { 0x0000000000000002LL};
+static ANTLRBitSet *FOLLOW_K_FOR_in_forStat338;
+static const unsigned long long FOLLOW_K_FOR_in_forStat338_data[] = { 0x0000000000000004LL};
+static ANTLRBitSet *FOLLOW_expr_in_forStat340;
+static const unsigned long long FOLLOW_expr_in_forStat340_data[] = { 0x000000000018D800LL};
+static ANTLRBitSet *FOLLOW_expr_in_forStat342;
+static const unsigned long long FOLLOW_expr_in_forStat342_data[] = { 0x000000000018D800LL};
+static ANTLRBitSet *FOLLOW_expr_in_forStat344;
+static const unsigned long long FOLLOW_expr_in_forStat344_data[] = { 0x0000000000000020LL};
+static ANTLRBitSet *FOLLOW_block_in_forStat346;
+static const unsigned long long FOLLOW_block_in_forStat346_data[] = { 0x0000000000000008LL};
+static ANTLRBitSet *FOLLOW_K_EQEQ_in_expr362;
+static const unsigned long long FOLLOW_K_EQEQ_in_expr362_data[] = { 0x0000000000000004LL};
+static ANTLRBitSet *FOLLOW_expr_in_expr364;
+static const unsigned long long FOLLOW_expr_in_expr364_data[] = { 0x000000000018D800LL};
+static ANTLRBitSet *FOLLOW_expr_in_expr366;
+static const unsigned long long FOLLOW_expr_in_expr366_data[] = { 0x0000000000000008LL};
+static ANTLRBitSet *FOLLOW_K_LT_in_expr378;
+static const unsigned long long FOLLOW_K_LT_in_expr378_data[] = { 0x0000000000000004LL};
+static ANTLRBitSet *FOLLOW_expr_in_expr380;
+static const unsigned long long FOLLOW_expr_in_expr380_data[] = { 0x000000000018D800LL};
+static ANTLRBitSet *FOLLOW_expr_in_expr382;
+static const unsigned long long FOLLOW_expr_in_expr382_data[] = { 0x0000000000000008LL};
+static ANTLRBitSet *FOLLOW_K_PLUS_in_expr394;
+static const unsigned long long FOLLOW_K_PLUS_in_expr394_data[] = { 0x0000000000000004LL};
+static ANTLRBitSet *FOLLOW_expr_in_expr396;
+static const unsigned long long FOLLOW_expr_in_expr396_data[] = { 0x000000000018D800LL};
+static ANTLRBitSet *FOLLOW_expr_in_expr398;
+static const unsigned long long FOLLOW_expr_in_expr398_data[] = { 0x0000000000000008LL};
+static ANTLRBitSet *FOLLOW_K_EQ_in_expr410;
+static const unsigned long long FOLLOW_K_EQ_in_expr410_data[] = { 0x0000000000000004LL};
+static ANTLRBitSet *FOLLOW_K_ID_in_expr412;
+static const unsigned long long FOLLOW_K_ID_in_expr412_data[] = { 0x000000000018D800LL};
+static ANTLRBitSet *FOLLOW_expr_in_expr416;
+static const unsigned long long FOLLOW_expr_in_expr416_data[] = { 0x0000000000000008LL};
+static ANTLRBitSet *FOLLOW_atom_in_expr429;
+static const unsigned long long FOLLOW_atom_in_expr429_data[] = { 0x0000000000000002LL};
+
+
+#pragma mark Dynamic Global globalAttributeScopeImplementation
+@implementation Symbols_Scope  /* globalAttributeScopeImplementation */
+/* start of synthesize -- OBJC-Line 1750 */
+@synthesize tree; 
+
++ (Symbols_Scope *)newSymbols_Scope
+{
+return [[Symbols_Scope alloc] init];
+}
+
+- (id) init
+{
+self = [super init];
+return self;
+}
+
+/* start of iterate get and set functions */
+- (CommonTree *)gettree { return( tree ); }
+- (void)settree:(CommonTree *)aVal { tree = aVal; }
+
+/* End of iterate get and set functions */
+@end /* end of Symbols_Scope implementation */
+
+
+
+#pragma mark Dynamic Rule Scopes ruleAttributeScopeImplementation
+
+#pragma mark Rule Return Scopes returnScopeImplementation
+@implementation SimpleCWalker_expr_return /* returnScopeImplementation */
+ /* start of synthesize -- OBJC-Line 1837 */
++ (SimpleCWalker_expr_return *)newSimpleCWalker_expr_return
+{
+return [[[SimpleCWalker_expr_return alloc] init] retain];
+}
+
+- (id) init
+{
+self = [super init];
+return self;
+}
+
+
+
+@end /* end of returnScope implementation */
+
+
+
+@implementation SimpleCWalker  // line 637
+
+/* ObjC start of ruleAttributeScope */
+#pragma mark Dynamic Rule Scopes ruleAttributeScope
+/* ObjC end of ruleAttributeScope */
+#pragma mark global Attribute Scopes globalAttributeScope
+/* ObjC start globalAttributeScope */
+static _stack;
+ 
+/* ObjC end globalAttributeScope */
+/* ObjC start actions.(actionScope).synthesize */
+/* ObjC start synthesize() */
+
++ (void) initialize
+{
+    #pragma mark Bitsets
+    FOLLOW_declaration_in_program56 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_declaration_in_program56_data Count:(NSUInteger)1] retain];
+    FOLLOW_variable_in_declaration76 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_variable_in_declaration76_data Count:(NSUInteger)1] retain];
+    FOLLOW_FUNC_DECL_in_declaration87 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_FUNC_DECL_in_declaration87_data Count:(NSUInteger)1] retain];
+    FOLLOW_functionHeader_in_declaration89 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_functionHeader_in_declaration89_data Count:(NSUInteger)1] retain];
+    FOLLOW_FUNC_DEF_in_declaration101 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_FUNC_DEF_in_declaration101_data Count:(NSUInteger)1] retain];
+    FOLLOW_functionHeader_in_declaration103 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_functionHeader_in_declaration103_data Count:(NSUInteger)1] retain];
+    FOLLOW_block_in_declaration105 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_block_in_declaration105_data Count:(NSUInteger)1] retain];
+    FOLLOW_VAR_DEF_in_variable126 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_VAR_DEF_in_variable126_data Count:(NSUInteger)1] retain];
+    FOLLOW_type_in_variable128 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_type_in_variable128_data Count:(NSUInteger)1] retain];
+    FOLLOW_declarator_in_variable130 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_declarator_in_variable130_data Count:(NSUInteger)1] retain];
+    FOLLOW_K_ID_in_declarator150 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_ID_in_declarator150_data Count:(NSUInteger)1] retain];
+    FOLLOW_FUNC_HDR_in_functionHeader171 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_FUNC_HDR_in_functionHeader171_data Count:(NSUInteger)1] retain];
+    FOLLOW_type_in_functionHeader173 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_type_in_functionHeader173_data Count:(NSUInteger)1] retain];
+    FOLLOW_K_ID_in_functionHeader175 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_ID_in_functionHeader175_data Count:(NSUInteger)1] retain];
+    FOLLOW_formalParameter_in_functionHeader177 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_formalParameter_in_functionHeader177_data Count:(NSUInteger)1] retain];
+    FOLLOW_ARG_DEF_in_formalParameter199 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_ARG_DEF_in_formalParameter199_data Count:(NSUInteger)1] retain];
+    FOLLOW_type_in_formalParameter201 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_type_in_formalParameter201_data Count:(NSUInteger)1] retain];
+    FOLLOW_declarator_in_formalParameter203 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_declarator_in_formalParameter203_data Count:(NSUInteger)1] retain];
+    FOLLOW_BLOCK_in_block283 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_BLOCK_in_block283_data Count:(NSUInteger)1] retain];
+    FOLLOW_variable_in_block285 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_variable_in_block285_data Count:(NSUInteger)1] retain];
+    FOLLOW_stat_in_block288 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_stat_in_block288_data Count:(NSUInteger)1] retain];
+    FOLLOW_forStat_in_stat302 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_forStat_in_stat302_data Count:(NSUInteger)1] retain];
+    FOLLOW_expr_in_stat310 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_stat310_data Count:(NSUInteger)1] retain];
+    FOLLOW_block_in_stat318 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_block_in_stat318_data Count:(NSUInteger)1] retain];
+    FOLLOW_K_FOR_in_forStat338 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_FOR_in_forStat338_data Count:(NSUInteger)1] retain];
+    FOLLOW_expr_in_forStat340 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_forStat340_data Count:(NSUInteger)1] retain];
+    FOLLOW_expr_in_forStat342 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_forStat342_data Count:(NSUInteger)1] retain];
+    FOLLOW_expr_in_forStat344 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_forStat344_data Count:(NSUInteger)1] retain];
+    FOLLOW_block_in_forStat346 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_block_in_forStat346_data Count:(NSUInteger)1] retain];
+    FOLLOW_K_EQEQ_in_expr362 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_EQEQ_in_expr362_data Count:(NSUInteger)1] retain];
+    FOLLOW_expr_in_expr364 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_expr364_data Count:(NSUInteger)1] retain];
+    FOLLOW_expr_in_expr366 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_expr366_data Count:(NSUInteger)1] retain];
+    FOLLOW_K_LT_in_expr378 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_LT_in_expr378_data Count:(NSUInteger)1] retain];
+    FOLLOW_expr_in_expr380 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_expr380_data Count:(NSUInteger)1] retain];
+    FOLLOW_expr_in_expr382 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_expr382_data Count:(NSUInteger)1] retain];
+    FOLLOW_K_PLUS_in_expr394 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_PLUS_in_expr394_data Count:(NSUInteger)1] retain];
+    FOLLOW_expr_in_expr396 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_expr396_data Count:(NSUInteger)1] retain];
+    FOLLOW_expr_in_expr398 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_expr398_data Count:(NSUInteger)1] retain];
+    FOLLOW_K_EQ_in_expr410 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_EQ_in_expr410_data Count:(NSUInteger)1] retain];
+    FOLLOW_K_ID_in_expr412 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_ID_in_expr412_data Count:(NSUInteger)1] retain];
+    FOLLOW_expr_in_expr416 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_expr416_data Count:(NSUInteger)1] retain];
+    FOLLOW_atom_in_expr429 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_atom_in_expr429_data Count:(NSUInteger)1] retain];
+
+    [BaseRecognizer setTokenNames:[[AMutableArray arrayWithObjects:@"<invalid>", @"<EOR>", @"<DOWN>", @"<UP>", 
+ @"ARG_DEF", @"BLOCK", @"FUNC_DECL", @"FUNC_DEF", @"FUNC_HDR", @"K_CHAR", 
+ @"K_COMMA", @"K_EQ", @"K_EQEQ", @"K_FOR", @"K_ID", @"K_INT", @"K_INT_TYPE", 
+ @"K_LCURLY", @"K_LCURVE", @"K_LT", @"K_PLUS", @"K_RCURLY", @"K_RCURVE", 
+ @"K_SEMICOLON", @"K_VOID", @"VAR_DEF", @"WS", nil] retain]];
+    [BaseRecognizer setGrammarFileName:@"/Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g"];
+}
+
++ (SimpleCWalker *)newSimpleCWalker:(id<TreeNodeStream>)aStream
+{
+    return [[SimpleCWalker alloc] initWithStream:aStream];
+}
+
+- (id) initWithStream:(id<TreeNodeStream>)aStream
+{
+    self = [super initWithStream:aStream State:[[RecognizerSharedState newRecognizerSharedStateWithRuleLen:12+1] retain]];
+    if ( self != nil ) {
+        /* globalAttributeScopeInit */
+
+        Symbols_scope = [Symbols_Scope newSymbols_Scope];
+
+        Symbols_stack = [SymbolStack newSymbolStackWithLen:30];
+
+        /* start of actions-actionScope-init */
+        /* start of init */
+    }
+    return self;
+}
+
+- (void) dealloc
+{
+    [Symbols_stack release];
+     
+    [super dealloc];
+}
+
+/* ObjC start actions.(actionScope).methods */
+/* ObjC end actions.(actionScope).methods */
+/* ObjC start methods() */
+/* ObjC end methods() */
+/* ObjC start rules */
+/*
+ * $ANTLR start program
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:13:1: program : ( declaration )+ ;
+ */
+- (void) program
+{
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
+
+    @try {
+        /* ruleLabelDefs entry */
+
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:14:5: ( ( declaration )+ ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:14:9: ( declaration )+ // alt
+        {
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:14:9: ( declaration )+ // positiveClosureBlock
+        NSInteger cnt1 = 0;
+        do {
+            NSInteger alt1 = 2;
+            NSInteger LA1_0 = [input LA:1];
+            if ( ((LA1_0 >= FUNC_DECL && LA1_0 <= FUNC_DEF)||LA1_0==VAR_DEF) ) {
+                alt1=1;
+            }
+
+
+            switch (alt1) {
+                case 1 : ;
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:14:9: declaration // alt
+                    {
+
+                    /* ruleRef */
+                    [self pushFollow:FOLLOW_declaration_in_program56];
+                    [self declaration];
+
+                    [self popFollow];
+
+
+                     
+                    }
+                    break;
+
+                default :
+                    if ( cnt1 >= 1 )
+                        goto loop1;
+                    EarlyExitException *eee =
+                        [EarlyExitException newException:input decisionNumber:1];
+                    @throw eee;
+            }
+            cnt1++;
+        } while (YES);
+        loop1: ;
+
+         
+        }
+
+        /* token+rule list labels */
+
+    }
+    @catch (RecognitionException *re) {
+        [self reportError:re];
+        [self recover:input Exception:re];
+    }
+
+    @finally {
+        /* ruleScopeCleanUp */
+
+    }
+    return ;
+}
+/* $ANTLR end program */
+
+/*
+ * $ANTLR start declaration
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:17:1: declaration : ( variable | ^( FUNC_DECL functionHeader ) | ^( FUNC_DEF functionHeader block ) );
+ */
+- (void) declaration
+{
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
+
+    @try {
+        /* ruleLabelDefs entry */
+
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:18:5: ( variable | ^( FUNC_DECL functionHeader ) | ^( FUNC_DEF functionHeader block ) ) //ruleblock
+        NSInteger alt2=3;
+        unichar charLA2 = [input LA:1];
+        switch (charLA2) {
+            case VAR_DEF: ;
+                {
+                alt2=1;
+                }
+                break;
+            case FUNC_DECL: ;
+                {
+                alt2=2;
+                }
+                break;
+            case FUNC_DEF: ;
+                {
+                alt2=3;
+                }
+                break;
+
+        default: ;
+            NoViableAltException *nvae = [NoViableAltException newException:2 state:0 stream:input];
+            nvae.c = charLA2;
+            @throw nvae;
+
+        }
+
+        switch (alt2) {
+            case 1 : ;
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:18:9: variable // alt
+                {
+
+                /* ruleRef */
+                [self pushFollow:FOLLOW_variable_in_declaration76];
+                [self variable];
+
+                [self popFollow];
+
+
+                 
+                }
+                break;
+            case 2 : ;
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:19:9: ^( FUNC_DECL functionHeader ) // alt
+                {
+
+
+                [self match:input TokenType:FUNC_DECL Follow:FOLLOW_FUNC_DECL_in_declaration87]; 
+                 
+                    [self match:input TokenType:DOWN Follow:nil]; 
+
+                    /* ruleRef */
+                    [self pushFollow:FOLLOW_functionHeader_in_declaration89];
+                    [self functionHeader];
+
+                    [self popFollow];
+
+
+                     
+                    [self match:input TokenType:UP Follow:nil]; 
+
+                 
+                }
+                break;
+            case 3 : ;
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:20:9: ^( FUNC_DEF functionHeader block ) // alt
+                {
+
+
+                [self match:input TokenType:FUNC_DEF Follow:FOLLOW_FUNC_DEF_in_declaration101]; 
+                 
+                    [self match:input TokenType:DOWN Follow:nil]; 
+
+                    /* ruleRef */
+                    [self pushFollow:FOLLOW_functionHeader_in_declaration103];
+                    [self functionHeader];
+
+                    [self popFollow];
+
+
+                     
+                    /* ruleRef */
+                    [self pushFollow:FOLLOW_block_in_declaration105];
+                    [self block];
+
+                    [self popFollow];
+
+
+                     
+                    [self match:input TokenType:UP Follow:nil]; 
+
+                 
+                }
+                break;
+
+        }
+        /* token+rule list labels */
+
+    }
+    @catch (RecognitionException *re) {
+        [self reportError:re];
+        [self recover:input Exception:re];
+    }
+
+    @finally {
+        /* ruleScopeCleanUp */
+
+    }
+    return ;
+}
+/* $ANTLR end declaration */
+
+/*
+ * $ANTLR start variable
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:23:1: variable : ^( VAR_DEF type declarator ) ;
+ */
+- (void) variable
+{
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
+
+    @try {
+        /* ruleLabelDefs entry */
+
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:24:5: ( ^( VAR_DEF type declarator ) ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:24:9: ^( VAR_DEF type declarator ) // alt
+        {
+
+
+        [self match:input TokenType:VAR_DEF Follow:FOLLOW_VAR_DEF_in_variable126]; 
+         
+            [self match:input TokenType:DOWN Follow:nil]; 
+
+            /* ruleRef */
+            [self pushFollow:FOLLOW_type_in_variable128];
+            [self type];
+
+            [self popFollow];
+
+
+             
+            /* ruleRef */
+            [self pushFollow:FOLLOW_declarator_in_variable130];
+            [self declarator];
+
+            [self popFollow];
+
+
+             
+            [self match:input TokenType:UP Follow:nil]; 
+
+         
+        }
+
+        /* token+rule list labels */
+
+    }
+    @catch (RecognitionException *re) {
+        [self reportError:re];
+        [self recover:input Exception:re];
+    }
+
+    @finally {
+        /* ruleScopeCleanUp */
+
+    }
+    return ;
+}
+/* $ANTLR end variable */
+
+/*
+ * $ANTLR start declarator
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:27:1: declarator : K_ID ;
+ */
+- (void) declarator
+{
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
+
+    @try {
+        /* ruleLabelDefs entry */
+
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:28:5: ( K_ID ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:28:9: K_ID // alt
+        {
+
+        [self match:input TokenType:K_ID Follow:FOLLOW_K_ID_in_declarator150]; 
+         
+        }
+
+        /* token+rule list labels */
+
+    }
+    @catch (RecognitionException *re) {
+        [self reportError:re];
+        [self recover:input Exception:re];
+    }
+
+    @finally {
+        /* ruleScopeCleanUp */
+
+    }
+    return ;
+}
+/* $ANTLR end declarator */
+
+/*
+ * $ANTLR start functionHeader
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:31:1: functionHeader : ^( FUNC_HDR type K_ID ( formalParameter )+ ) ;
+ */
+- (void) functionHeader
+{
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
+
+    @try {
+        /* ruleLabelDefs entry */
+
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:32:5: ( ^( FUNC_HDR type K_ID ( formalParameter )+ ) ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:32:9: ^( FUNC_HDR type K_ID ( formalParameter )+ ) // alt
+        {
+
+
+        [self match:input TokenType:FUNC_HDR Follow:FOLLOW_FUNC_HDR_in_functionHeader171]; 
+         
+            [self match:input TokenType:DOWN Follow:nil]; 
+
+            /* ruleRef */
+            [self pushFollow:FOLLOW_type_in_functionHeader173];
+            [self type];
+
+            [self popFollow];
+
+
+             
+            [self match:input TokenType:K_ID Follow:FOLLOW_K_ID_in_functionHeader175]; 
+             
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:32:30: ( formalParameter )+ // positiveClosureBlock
+            NSInteger cnt3 = 0;
+            do {
+                NSInteger alt3 = 2;
+                NSInteger LA3_0 = [input LA:1];
+                if ( (LA3_0==ARG_DEF) ) {
+                    alt3=1;
+                }
+
+
+                switch (alt3) {
+                    case 1 : ;
+                        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:32:30: formalParameter // alt
+                        {
+
+                        /* ruleRef */
+                        [self pushFollow:FOLLOW_formalParameter_in_functionHeader177];
+                        [self formalParameter];
+
+                        [self popFollow];
+
+
+                         
+                        }
+                        break;
+
+                    default :
+                        if ( cnt3 >= 1 )
+                            goto loop3;
+                        EarlyExitException *eee =
+                            [EarlyExitException newException:input decisionNumber:3];
+                        @throw eee;
+                }
+                cnt3++;
+            } while (YES);
+            loop3: ;
+
+             
+            [self match:input TokenType:UP Follow:nil]; 
+
+         
+        }
+
+        /* token+rule list labels */
+
+    }
+    @catch (RecognitionException *re) {
+        [self reportError:re];
+        [self recover:input Exception:re];
+    }
+
+    @finally {
+        /* ruleScopeCleanUp */
+
+    }
+    return ;
+}
+/* $ANTLR end functionHeader */
+
+/*
+ * $ANTLR start formalParameter
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:35:1: formalParameter : ^( ARG_DEF type declarator ) ;
+ */
+- (void) formalParameter
+{
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
+
+    @try {
+        /* ruleLabelDefs entry */
+
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:36:5: ( ^( ARG_DEF type declarator ) ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:36:9: ^( ARG_DEF type declarator ) // alt
+        {
+
+
+        [self match:input TokenType:ARG_DEF Follow:FOLLOW_ARG_DEF_in_formalParameter199]; 
+         
+            [self match:input TokenType:DOWN Follow:nil]; 
+
+            /* ruleRef */
+            [self pushFollow:FOLLOW_type_in_formalParameter201];
+            [self type];
+
+            [self popFollow];
+
+
+             
+            /* ruleRef */
+            [self pushFollow:FOLLOW_declarator_in_formalParameter203];
+            [self declarator];
+
+            [self popFollow];
+
+
+             
+            [self match:input TokenType:UP Follow:nil]; 
+
+         
+        }
+
+        /* token+rule list labels */
+
+    }
+    @catch (RecognitionException *re) {
+        [self reportError:re];
+        [self recover:input Exception:re];
+    }
+
+    @finally {
+        /* ruleScopeCleanUp */
+
+    }
+    return ;
+}
+/* $ANTLR end formalParameter */
+
+/*
+ * $ANTLR start type
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:39:1: type : ( K_INT_TYPE | K_CHAR | K_VOID | K_ID );
+ */
+- (void) type
+{
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
+
+    @try {
+        /* ruleLabelDefs entry */
+
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:40:5: ( K_INT_TYPE | K_CHAR | K_VOID | K_ID ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g: // alt
+        {
+
+        if ([input LA:1] == K_CHAR||[input LA:1] == K_ID||[input LA:1] == K_INT_TYPE||[input LA:1] == K_VOID) {
+            [input consume];
+            [state setIsErrorRecovery:NO];
+        } else {
+            MismatchedSetException *mse = [MismatchedSetException newException:nil stream:input];
+            @throw mse;
+        }
+
+         
+        }
+
+        /* token+rule list labels */
+
+    }
+    @catch (RecognitionException *re) {
+        [self reportError:re];
+        [self recover:input Exception:re];
+    }
+
+    @finally {
+        /* ruleScopeCleanUp */
+
+    }
+    return ;
+}
+/* $ANTLR end type */
+
+/*
+ * $ANTLR start block
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:46:1: block : ^( BLOCK ( variable )* ( stat )* ) ;
+ */
+- (void) block
+{
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
+
+    @try {
+        /* ruleLabelDefs entry */
+
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:47:5: ( ^( BLOCK ( variable )* ( stat )* ) ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:47:9: ^( BLOCK ( variable )* ( stat )* ) // alt
+        {
+
+
+        [self match:input TokenType:BLOCK Follow:FOLLOW_BLOCK_in_block283]; 
+         
+        if ( [input LA:1] == DOWN ) {
+            [self match:input TokenType:DOWN Follow:nil]; 
+
+
+            do {
+                NSInteger alt4=2;
+                NSInteger LA4_0 = [input LA:1];
+                if ( (LA4_0==VAR_DEF) ) {
+                    alt4=1;
+                }
+
+
+                switch (alt4) {
+                    case 1 : ;
+                        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:47:17: variable // alt
+                        {
+
+                        /* ruleRef */
+                        [self pushFollow:FOLLOW_variable_in_block285];
+                        [self variable];
+
+                        [self popFollow];
+
+
+                         
+                        }
+                        break;
+
+                    default :
+                        goto loop4;
+                }
+            } while (YES);
+            loop4: ;
+
+             
+
+            do {
+                NSInteger alt5=2;
+                NSInteger LA5_0 = [input LA:1];
+                if ( (LA5_0==BLOCK||(LA5_0 >= K_EQ && LA5_0 <= K_INT)||(LA5_0 >= K_LT && LA5_0 <= K_PLUS)) ) {
+                    alt5=1;
+                }
+
+
+                switch (alt5) {
+                    case 1 : ;
+                        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:47:27: stat // alt
+                        {
+
+                        /* ruleRef */
+                        [self pushFollow:FOLLOW_stat_in_block288];
+                        [self stat];
+
+                        [self popFollow];
+
+
+                         
+                        }
+                        break;
+
+                    default :
+                        goto loop5;
+                }
+            } while (YES);
+            loop5: ;
+
+             
+            [self match:input TokenType:UP Follow:nil]; 
+        }
+
+         
+        }
+
+        /* token+rule list labels */
+
+    }
+    @catch (RecognitionException *re) {
+        [self reportError:re];
+        [self recover:input Exception:re];
+    }
+
+    @finally {
+        /* ruleScopeCleanUp */
+
+    }
+    return ;
+}
+/* $ANTLR end block */
+
+/*
+ * $ANTLR start stat
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:50:1: stat : ( forStat | expr | block );
+ */
+- (void) stat
+{
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
+
+    @try {
+        /* ruleLabelDefs entry */
+
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:50:5: ( forStat | expr | block ) //ruleblock
+        NSInteger alt6=3;
+        unichar charLA6 = [input LA:1];
+        switch (charLA6) {
+            case K_FOR: ;
+                {
+                alt6=1;
+                }
+                break;
+            case K_EQ: ;
+            case K_EQEQ: ;
+            case K_ID: ;
+            case K_INT: ;
+            case K_LT: ;
+            case K_PLUS: ;
+                {
+                alt6=2;
+                }
+                break;
+            case BLOCK: ;
+                {
+                alt6=3;
+                }
+                break;
+
+        default: ;
+            NoViableAltException *nvae = [NoViableAltException newException:6 state:0 stream:input];
+            nvae.c = charLA6;
+            @throw nvae;
+
+        }
+
+        switch (alt6) {
+            case 1 : ;
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:50:7: forStat // alt
+                {
+
+                /* ruleRef */
+                [self pushFollow:FOLLOW_forStat_in_stat302];
+                [self forStat];
+
+                [self popFollow];
+
+
+                 
+                }
+                break;
+            case 2 : ;
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:51:7: expr // alt
+                {
+
+                /* ruleRef */
+                [self pushFollow:FOLLOW_expr_in_stat310];
+                [self expr];
+
+                [self popFollow];
+
+
+                 
+                }
+                break;
+            case 3 : ;
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:52:7: block // alt
+                {
+
+                /* ruleRef */
+                [self pushFollow:FOLLOW_block_in_stat318];
+                [self block];
+
+                [self popFollow];
+
+
+                 
+                }
+                break;
+
+        }
+        /* token+rule list labels */
+
+    }
+    @catch (RecognitionException *re) {
+        [self reportError:re];
+        [self recover:input Exception:re];
+    }
+
+    @finally {
+        /* ruleScopeCleanUp */
+
+    }
+    return ;
+}
+/* $ANTLR end stat */
+
+/*
+ * $ANTLR start forStat
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:55:1: forStat : ^( K_FOR expr expr expr block ) ;
+ */
+- (void) forStat
+{
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
+
+    @try {
+        /* ruleLabelDefs entry */
+
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:56:5: ( ^( K_FOR expr expr expr block ) ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:56:9: ^( K_FOR expr expr expr block ) // alt
+        {
+
+
+        [self match:input TokenType:K_FOR Follow:FOLLOW_K_FOR_in_forStat338]; 
+         
+            [self match:input TokenType:DOWN Follow:nil]; 
+
+            /* ruleRef */
+            [self pushFollow:FOLLOW_expr_in_forStat340];
+            [self expr];
+
+            [self popFollow];
+
+
+             
+            /* ruleRef */
+            [self pushFollow:FOLLOW_expr_in_forStat342];
+            [self expr];
+
+            [self popFollow];
+
+
+             
+            /* ruleRef */
+            [self pushFollow:FOLLOW_expr_in_forStat344];
+            [self expr];
+
+            [self popFollow];
+
+
+             
+            /* ruleRef */
+            [self pushFollow:FOLLOW_block_in_forStat346];
+            [self block];
+
+            [self popFollow];
+
+
+             
+            [self match:input TokenType:UP Follow:nil]; 
+
+         
+        }
+
+        /* token+rule list labels */
+
+    }
+    @catch (RecognitionException *re) {
+        [self reportError:re];
+        [self recover:input Exception:re];
+    }
+
+    @finally {
+        /* ruleScopeCleanUp */
+
+    }
+    return ;
+}
+/* $ANTLR end forStat */
+
+/*
+ * $ANTLR start expr
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:59:1: expr : ( ^( K_EQEQ expr expr ) | ^( K_LT expr expr ) | ^( K_PLUS expr expr ) | ^( K_EQ K_ID e= expr ) | atom );
+ */
+- (SimpleCWalker_expr_return *) expr
+{
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
+    SimpleCWalker_expr_return * retval = [SimpleCWalker_expr_return newSimpleCWalker_expr_return];
+    [retval setStart:[input LT:1]];
+
+
+    @try {
+        /* ruleLabelDefs entry */
+        CommonTree *K_ID1 = nil;SimpleCWalker_expr_return * e = nil ;
+
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:59:5: ( ^( K_EQEQ expr expr ) | ^( K_LT expr expr ) | ^( K_PLUS expr expr ) | ^( K_EQ K_ID e= expr ) | atom ) //ruleblock
+        NSInteger alt7=5;
+        unichar charLA7 = [input LA:1];
+        switch (charLA7) {
+            case K_EQEQ: ;
+                {
+                alt7=1;
+                }
+                break;
+            case K_LT: ;
+                {
+                alt7=2;
+                }
+                break;
+            case K_PLUS: ;
+                {
+                alt7=3;
+                }
+                break;
+            case K_EQ: ;
+                {
+                alt7=4;
+                }
+                break;
+            case K_ID: ;
+            case K_INT: ;
+                {
+                alt7=5;
+                }
+                break;
+
+        default: ;
+            NoViableAltException *nvae = [NoViableAltException newException:7 state:0 stream:input];
+            nvae.c = charLA7;
+            @throw nvae;
+
+        }
+
+        switch (alt7) {
+            case 1 : ;
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:59:9: ^( K_EQEQ expr expr ) // alt
+                {
+
+
+                [self match:input TokenType:K_EQEQ Follow:FOLLOW_K_EQEQ_in_expr362]; 
+                 
+                    [self match:input TokenType:DOWN Follow:nil]; 
+
+                    /* ruleRef */
+                    [self pushFollow:FOLLOW_expr_in_expr364];
+                    [self expr];
+
+                    [self popFollow];
+
+
+                     
+                    /* ruleRef */
+                    [self pushFollow:FOLLOW_expr_in_expr366];
+                    [self expr];
+
+                    [self popFollow];
+
+
+                     
+                    [self match:input TokenType:UP Follow:nil]; 
+
+                 
+                }
+                break;
+            case 2 : ;
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:60:9: ^( K_LT expr expr ) // alt
+                {
+
+
+                [self match:input TokenType:K_LT Follow:FOLLOW_K_LT_in_expr378]; 
+                 
+                    [self match:input TokenType:DOWN Follow:nil]; 
+
+                    /* ruleRef */
+                    [self pushFollow:FOLLOW_expr_in_expr380];
+                    [self expr];
+
+                    [self popFollow];
+
+
+                     
+                    /* ruleRef */
+                    [self pushFollow:FOLLOW_expr_in_expr382];
+                    [self expr];
+
+                    [self popFollow];
+
+
+                     
+                    [self match:input TokenType:UP Follow:nil]; 
+
+                 
+                }
+                break;
+            case 3 : ;
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:61:9: ^( K_PLUS expr expr ) // alt
+                {
+
+
+                [self match:input TokenType:K_PLUS Follow:FOLLOW_K_PLUS_in_expr394]; 
+                 
+                    [self match:input TokenType:DOWN Follow:nil]; 
+
+                    /* ruleRef */
+                    [self pushFollow:FOLLOW_expr_in_expr396];
+                    [self expr];
+
+                    [self popFollow];
+
+
+                     
+                    /* ruleRef */
+                    [self pushFollow:FOLLOW_expr_in_expr398];
+                    [self expr];
+
+                    [self popFollow];
+
+
+                     
+                    [self match:input TokenType:UP Follow:nil]; 
+
+                 
+                }
+                break;
+            case 4 : ;
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:62:9: ^( K_EQ K_ID e= expr ) // alt
+                {
+
+
+                [self match:input TokenType:K_EQ Follow:FOLLOW_K_EQ_in_expr410]; 
+                 
+                    [self match:input TokenType:DOWN Follow:nil]; 
+
+                    K_ID1=(CommonTree *)[self match:input TokenType:K_ID Follow:FOLLOW_K_ID_in_expr412]; 
+                     
+                    /* ruleRef */
+                    [self pushFollow:FOLLOW_expr_in_expr416];
+                    e = [self expr];
+
+                    [self popFollow];
+
+
+                     
+                    [self match:input TokenType:UP Follow:nil]; 
+
+                 
+
+                 NSLog(@"assigning %@ to variable %@", (e!=nil?[[input getTokenStream] toStringFromStart:[[input getTreeAdaptor] getTokenStartIndex:[e getStart]]ToEnd:[[input getTreeAdaptor] getTokenStopIndex:[e getStart]]]:0), (K_ID1!=nil?K_ID1.text:nil)); 
+
+                 
+                }
+                break;
+            case 5 : ;
+                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:63:9: atom // alt
+                {
+
+                /* ruleRef */
+                [self pushFollow:FOLLOW_atom_in_expr429];
+                [self atom];
+
+                [self popFollow];
+
+
+                 
+                }
+                break;
+
+        }
+        /* token+rule list labels */
+
+    }
+    @catch (RecognitionException *re) {
+        [self reportError:re];
+        [self recover:input Exception:re];
+    }
+
+    @finally {
+        /* ruleScopeCleanUp */
+
+    }
+    return retval;
+}
+/* $ANTLR end expr */
+
+/*
+ * $ANTLR start atom
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:66:1: atom : ( K_ID | K_INT );
+ */
+- (void) atom
+{
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
+
+    @try {
+        /* ruleLabelDefs entry */
+
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g:67:5: ( K_ID | K_INT ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.g: // alt
+        {
+
+        if ((([input LA:1] >= K_ID) && ([input LA:1] <= K_INT))) {
+            [input consume];
+            [state setIsErrorRecovery:NO];
+        } else {
+            MismatchedSetException *mse = [MismatchedSetException newException:nil stream:input];
+            @throw mse;
+        }
+
+         
+        }
+
+        /* token+rule list labels */
+
+    }
+    @catch (RecognitionException *re) {
+        [self reportError:re];
+        [self recover:input Exception:re];
+    }
+
+    @finally {
+        /* ruleScopeCleanUp */
+
+    }
+    return ;
+}
+/* $ANTLR end atom */
+/* ObjC end rules */
+
+@end /* end of SimpleCWalker implementation line 692 */
diff --git a/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.tokens b/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.tokens
new file mode 100644
index 0000000..965ef1f
--- /dev/null
+++ b/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCWalker.tokens
@@ -0,0 +1,23 @@
+ARG_DEF=4
+BLOCK=5
+FUNC_DECL=6
+FUNC_DEF=7
+FUNC_HDR=8
+K_CHAR=9
+K_COMMA=10
+K_EQ=11
+K_EQEQ=12
+K_FOR=13
+K_ID=14
+K_INT=15
+K_INT_TYPE=16
+K_LCURLY=17
+K_LCURVE=18
+K_LT=19
+K_PLUS=20
+K_RCURLY=21
+K_RCURVE=22
+K_SEMICOLON=23
+K_VOID=24
+VAR_DEF=25
+WS=26
diff --git a/runtime/ObjC/Framework/examples/simplecTreeParser/antlr3.h b/runtime/ObjC/Framework/examples/simplecTreeParser/antlr3.h
deleted file mode 100644
index 4f16279..0000000
--- a/runtime/ObjC/Framework/examples/simplecTreeParser/antlr3.h
+++ /dev/null
@@ -1,79 +0,0 @@
-#import <ANTLR/ANTLRBaseMapElement.h>
-#import <ANTLR/ANTLRBaseRecognizer.h>
-#import <ANTLR/ANTLRBaseStack.h>
-#import <ANTLR/ANTLRBaseTree.h>
-#import <ANTLR/ANTLRBaseTreeAdaptor.h>
-#import <ANTLR/ANTLRBitSet.h>
-#import <ANTLR/ANTLRBufferedTokenStream.h>
-#import <ANTLR/ANTLRBufferedTreeNodeStream.h>
-#import <ANTLR/ANTLRCharStream.h>
-#import <ANTLR/ANTLRCharStreamState.h>
-#import <ANTLR/ANTLRCommonErrorNode.h>
-#import <ANTLR/ANTLRCommonToken.h>
-#import <ANTLR/ANTLRCommonTokenStream.h>
-#import <ANTLR/ANTLRCommonTree.h>
-#import <ANTLR/ANTLRCommonTreeAdaptor.h>
-#import <ANTLR/ANTLRCommonTreeNodeStream.h>
-#import <ANTLR/ANTLRDFA.h>
-#import <ANTLR/ANTLRDebug.h>
-#import <ANTLR/ANTLRDebugEventProxy.h>
-#import <ANTLR/ANTLRDebugEventListener.h>
-#import <ANTLR/ANTLRDebugParser.h>
-#import <ANTLR/ANTLRDebugTokenStream.h>
-#import <ANTLR/ANTLRDebugTreeAdaptor.h>
-#import <ANTLR/ANTLRDebugTreeNodeStream.h>
-#import <ANTLR/ANTLRDebugTreeParser.h>
-#import <ANTLR/ANTLREarlyExitException.h>
-#import <ANTLR/ANTLRError.h>
-#import <ANTLR/ANTLRFailedPredicateException.h>
-#import <ANTLR/ANTLRFastQueue.h>
-#import <ANTLR/ANTLRHashMap.h>
-#import <ANTLR/ANTLRHashRule.h>
-#import <ANTLR/ANTLRIntArray.h>
-#import <ANTLR/ANTLRIntStream.h>
-#import <ANTLR/ANTLRLexer.h>
-#import <ANTLR/ANTLRLexerRuleReturnScope.h>
-#import <ANTLR/ANTLRLinkBase.h>
-#import <ANTLR/ANTLRLookaheadStream.h>
-#import <ANTLR/ANTLRMapElement.h>
-#import <ANTLR/ANTLRMap.h>
-#import <ANTLR/ANTLRMismatchedNotSetException.h>
-#import <ANTLR/ANTLRMismatchedRangeException.h>
-#import <ANTLR/ANTLRMismatchedSetException.h>
-#import <ANTLR/ANTLRMismatchedTokenException.h>
-#import <ANTLR/ANTLRMismatchedTreeNodeException.h>
-#import <ANTLR/ANTLRMissingTokenException.h>
-#import <ANTLR/ANTLRNodeMapElement.h>
-#import <ANTLR/ANTLRNoViableAltException.h>
-#import <ANTLR/ANTLRParser.h>
-#import <ANTLR/ANTLRParserRuleReturnScope.h>
-#import <ANTLR/ANTLRPtrBuffer.h>
-#import <ANTLR/ANTLRRecognitionException.h>
-#import <ANTLR/ANTLRRecognizerSharedState.h>
-#import <ANTLR/ANTLRRewriteRuleElementStream.h>
-#import <ANTLR/ANTLRRewriteRuleSubtreeStream.h>
-#import <ANTLR/ANTLRRewriteRuleTokenStream.h>
-#import <ANTLR/ANTLRRuleMemo.h>
-#import <ANTLR/ANTLRRuleStack.h>
-#import <ANTLR/ANTLRRuleReturnScope.h>
-#import <ANTLR/ANTLRRuntimeException.h>
-#import <ANTLR/ANTLRStreamEnumerator.h>
-#import <ANTLR/ANTLRStringStream.h>
-#import <ANTLR/ANTLRSymbolStack.h>
-#import <ANTLR/ANTLRToken+DebuggerSupport.h>
-#import <ANTLR/ANTLRToken.h>
-#import <ANTLR/ANTLRTokenRewriteStream.h>
-#import <ANTLR/ANTLRTokenSource.h>
-#import <ANTLR/ANTLRTokenStream.h>
-#import <ANTLR/ANTLRTree.h>
-#import <ANTLR/ANTLRTreeAdaptor.h>
-#import <ANTLR/ANTLRTreeException.h>
-#import <ANTLR/ANTLRTreeIterator.h>
-#import <ANTLR/ANTLRTreeNodeStream.h>
-#import <ANTLR/ANTLRTreeParser.h>
-#import <ANTLR/ANTLRTreeRuleReturnScope.h>
-#import <ANTLR/ANTLRUnbufferedTokenStream.h>
-//#import <ANTLR/ANTLRUnbufferedCommonTreeNodeStream.h>
-//#import <ANTLR/ANTLRUnbufferedCommonTreeNodeStreamState.h>
-#import <ANTLR/ANTLRUniqueIDMap.h>
-#import <ANTLR/ANTLRUnwantedTokenException.h>
diff --git a/runtime/ObjC/Framework/examples/simplecTreeParser/main.m b/runtime/ObjC/Framework/examples/simplecTreeParser/main.m
index f735ac3..bf3ea27 100644
--- a/runtime/ObjC/Framework/examples/simplecTreeParser/main.m
+++ b/runtime/ObjC/Framework/examples/simplecTreeParser/main.m
@@ -1,5 +1,5 @@
-#import <Cocoa/Cocoa.h>
-#import "antlr3.h"
+#import <Foundation/Foundation.h>
+#import <ANTLR/ANTLR.h>
 #import "SimpleCLexer.h"
 #import "SimpleCParser.h"
 #import "SimpleCWalker.h"
@@ -9,7 +9,7 @@
 int main(int argc, const char * argv[]) {
     NSError *anError;
 	NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
-    char *inp = "/Users/acondit/source/antlr3/acondit_localhost/code/antlr/antlr3-main/runtime/ObjC/Framework/examples/simplecTreeParser/input";
+    char *inp = "/Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/input";
     
 /*
     if (argc < 2) {
@@ -34,14 +34,14 @@
 	
 	// For fun, you could print all tokens the lexer recognized, but we can only do it once. After that
 	// we would need to reset the lexer, and lex again.
-//    id<ANTLRToken> currentToken;
-//    while ((currentToken = [lexer nextToken]) && [currentToken type] != ANTLRTokenTypeEOF) {
+//    id<Token> currentToken;
+//    while ((currentToken = [lexer nextToken]) && [currentToken type] != TokenTypeEOF) {
 //        NSLog(@"%@", currentToken);
 //    }
 //	  [lexer reset];
 	
 	// Since the parser needs to scan back and forth over the tokens, we put them into a stream, too.
-	ANTLRCommonTokenStream *tokenStream = [ANTLRCommonTokenStream newANTLRCommonTokenStreamWithTokenSource:lexer];
+	CommonTokenStream *tokenStream = [CommonTokenStream newCommonTokenStreamWithTokenSource:lexer];
 
 	// Construct a parser and feed it the token stream.
 	SimpleCParser *parser = [[SimpleCParser alloc] initWithTokenStream:tokenStream];
@@ -52,14 +52,14 @@
 	// initialized when you call a specific parser rule).
 	// This is a simple example, so we just call the top-most rule 'program'.
 	// Since we want to parse the AST the parser builds, we just ask the returned object for that.
-	ANTLRCommonTree *program_tree = [[parser program] getTree];
+	CommonTree *program_tree = [[parser program] getTree];
 
     NSLog(@"Reached end of first parse\n");
 	// Print the matched tree as a Lisp-style string
 	NSLog(@"tree: %@", [program_tree treeDescription]);
 	
 	// Create a new tree node stream that's feeding off of the root node (thus seeing the whole tree)
-	ANTLRCommonTreeNodeStream *treeStream = [ANTLRCommonTreeNodeStream newANTLRCommonTreeNodeStream:program_tree];
+	CommonTreeNodeStream *treeStream = [CommonTreeNodeStream newCommonTreeNodeStream:program_tree];
 	// tell the TreeNodeStream where the tokens originally came from, so we can retrieve arbitrary tokens and their text.
 	[treeStream setTokenStream:tokenStream];
 	
diff --git a/runtime/ObjC/Framework/examples/simplecTreeParser/output1/SimpleC.tokens b/runtime/ObjC/Framework/examples/simplecTreeParser/output1/SimpleC.tokens
deleted file mode 100644
index 6d06db9..0000000
--- a/runtime/ObjC/Framework/examples/simplecTreeParser/output1/SimpleC.tokens
+++ /dev/null
@@ -1,29 +0,0 @@
-K_ID=10
-T__26=26
-T__25=25
-T__24=24
-T__23=23
-K_EQEQ=16
-T__22=22
-K_INT=11
-T__21=21
-K_FOR=14
-FUNC_HDR=6
-FUNC_DEF=8
-K_INT_TYPE=19
-FUNC_DECL=7
-ARG_DEF=5
-WS=20
-K_EQ=15
-BLOCK=9
-K_LT=17
-K_CHAR=12
-K_VOID=13
-VAR_DEF=4
-K_PLUS=18
-';'=21
-'}'=26
-'('=22
-','=23
-')'=24
-'{'=25
diff --git a/runtime/ObjC/Framework/examples/simplecTreeParser/output1/SimpleCLexer.h b/runtime/ObjC/Framework/examples/simplecTreeParser/output1/SimpleCLexer.h
deleted file mode 100644
index 6972a44..0000000
--- a/runtime/ObjC/Framework/examples/simplecTreeParser/output1/SimpleCLexer.h
+++ /dev/null
@@ -1,75 +0,0 @@
-// $ANTLR 3.2 Aug 23, 2010 07:48:06 /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g 2010-08-23 07:54:47
-
-/* =============================================================================
- * Standard antlr3 OBJC runtime definitions
- */
-#import <Cocoa/Cocoa.h>
-#import "antlr3.h"
-/* End of standard antlr3 runtime definitions
- * =============================================================================
- */
-
-/* Start cyclicDFAInterface */
-#pragma mark Cyclic DFA interface start DFA4
-@interface DFA4 : ANTLRDFA {
-}
-+ newDFA4WithRecognizer:(ANTLRBaseRecognizer *)theRecognizer;
-- initWithRecognizer:(ANTLRBaseRecognizer *)recognizer;
-@end /* end of DFA4 interface  */
-
-#pragma mark Cyclic DFA interface end DFA4
-
-#pragma mark Rule return scopes start
-#pragma mark Rule return scopes end
-#pragma mark Tokens
-#define K_ID 10
-#define T__26 26
-#define T__25 25
-#define T__24 24
-#define T__23 23
-#define K_EQEQ 16
-#define T__22 22
-#define K_INT 11
-#define T__21 21
-#define K_FOR 14
-#define FUNC_HDR 6
-#define FUNC_DEF 8
-#define EOF -1
-#define K_INT_TYPE 19
-#define FUNC_DECL 7
-#define ARG_DEF 5
-#define WS 20
-#define K_EQ 15
-#define BLOCK 9
-#define K_LT 17
-#define K_CHAR 12
-#define K_VOID 13
-#define VAR_DEF 4
-#define K_PLUS 18
-@interface SimpleCLexer : ANTLRLexer { // line 283
-DFA4 *dfa4;
-// start of actions.lexer.memVars
-// start of action-actionScope-memVars
-}
-+ (SimpleCLexer *)newSimpleCLexer:(id<ANTLRCharStream>)anInput;
-
-- (void)mT__21; 
-- (void)mT__22; 
-- (void)mT__23; 
-- (void)mT__24; 
-- (void)mT__25; 
-- (void)mT__26; 
-- (void)mK_FOR; 
-- (void)mK_INT_TYPE; 
-- (void)mK_CHAR; 
-- (void)mK_VOID; 
-- (void)mK_ID; 
-- (void)mK_INT; 
-- (void)mK_EQ; 
-- (void)mK_EQEQ; 
-- (void)mK_LT; 
-- (void)mK_PLUS; 
-- (void)mWS; 
-- (void)mTokens; 
-
-@end /* end of SimpleCLexer interface */
diff --git a/runtime/ObjC/Framework/examples/simplecTreeParser/output1/SimpleCLexer.java b/runtime/ObjC/Framework/examples/simplecTreeParser/output1/SimpleCLexer.java
deleted file mode 100644
index e8e76fa..0000000
--- a/runtime/ObjC/Framework/examples/simplecTreeParser/output1/SimpleCLexer.java
+++ /dev/null
@@ -1,730 +0,0 @@
-// $ANTLR 3.2 Aug 13, 2010 19:41:25 /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g 2010-08-13 19:42:18
-
-import org.antlr.runtime.*;
-import java.util.Stack;
-import java.util.List;
-import java.util.ArrayList;
-
-public class SimpleCLexer extends Lexer {
-    public static final int LT=18;
-    public static final int T__26=26;
-    public static final int T__25=25;
-    public static final int T__24=24;
-    public static final int T__23=23;
-    public static final int T__22=22;
-    public static final int T__21=21;
-    public static final int CHAR=15;
-    public static final int FOR=13;
-    public static final int FUNC_HDR=6;
-    public static final int INT=12;
-    public static final int FUNC_DEF=8;
-    public static final int INT_TYPE=14;
-    public static final int ID=10;
-    public static final int EOF=-1;
-    public static final int FUNC_DECL=7;
-    public static final int ARG_DEF=5;
-    public static final int WS=20;
-    public static final int BLOCK=9;
-    public static final int PLUS=19;
-    public static final int VOID=16;
-    public static final int EQ=11;
-    public static final int VAR_DEF=4;
-    public static final int EQEQ=17;
-
-    // delegates
-    // delegators
-
-    public SimpleCLexer() {;} 
-    public SimpleCLexer(CharStream input) {
-        this(input, new RecognizerSharedState());
-    }
-    public SimpleCLexer(CharStream input, RecognizerSharedState state) {
-        super(input,state);
-
-    }
-    public String getGrammarFileName() { return "/usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g"; }
-
-    // $ANTLR start "T__21"
-    public final void mT__21() throws RecognitionException {
-        try {
-            int _type = T__21;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:7:7: ( ';' )
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:7:9: ';'
-            {
-            match(';'); 
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__21"
-
-    // $ANTLR start "T__22"
-    public final void mT__22() throws RecognitionException {
-        try {
-            int _type = T__22;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:8:7: ( '(' )
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:8:9: '('
-            {
-            match('('); 
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__22"
-
-    // $ANTLR start "T__23"
-    public final void mT__23() throws RecognitionException {
-        try {
-            int _type = T__23;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:9:7: ( ',' )
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:9:9: ','
-            {
-            match(','); 
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__23"
-
-    // $ANTLR start "T__24"
-    public final void mT__24() throws RecognitionException {
-        try {
-            int _type = T__24;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:10:7: ( ')' )
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:10:9: ')'
-            {
-            match(')'); 
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__24"
-
-    // $ANTLR start "T__25"
-    public final void mT__25() throws RecognitionException {
-        try {
-            int _type = T__25;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:11:7: ( '{' )
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:11:9: '{'
-            {
-            match('{'); 
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__25"
-
-    // $ANTLR start "T__26"
-    public final void mT__26() throws RecognitionException {
-        try {
-            int _type = T__26;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:12:7: ( '}' )
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:12:9: '}'
-            {
-            match('}'); 
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__26"
-
-    // $ANTLR start "FOR"
-    public final void mFOR() throws RecognitionException {
-        try {
-            int _type = FOR;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:91:5: ( 'for' )
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:91:7: 'for'
-            {
-            match("for"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "FOR"
-
-    // $ANTLR start "INT_TYPE"
-    public final void mINT_TYPE() throws RecognitionException {
-        try {
-            int _type = INT_TYPE;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:92:10: ( 'int' )
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:92:12: 'int'
-            {
-            match("int"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "INT_TYPE"
-
-    // $ANTLR start "CHAR"
-    public final void mCHAR() throws RecognitionException {
-        try {
-            int _type = CHAR;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:93:5: ( 'char' )
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:93:7: 'char'
-            {
-            match("char"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "CHAR"
-
-    // $ANTLR start "VOID"
-    public final void mVOID() throws RecognitionException {
-        try {
-            int _type = VOID;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:94:5: ( 'void' )
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:94:7: 'void'
-            {
-            match("void"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "VOID"
-
-    // $ANTLR start "ID"
-    public final void mID() throws RecognitionException {
-        try {
-            int _type = ID;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:96:5: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' )* )
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:96:9: ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' )*
-            {
-            if ( (input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
-                input.consume();
-
-            }
-            else {
-                MismatchedSetException mse = new MismatchedSetException(null,input);
-                recover(mse);
-                throw mse;}
-
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:96:33: ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' )*
-            loop1:
-            do {
-                int alt1=2;
-                int LA1_0 = input.LA(1);
-
-                if ( ((LA1_0>='0' && LA1_0<='9')||(LA1_0>='A' && LA1_0<='Z')||LA1_0=='_'||(LA1_0>='a' && LA1_0<='z')) ) {
-                    alt1=1;
-                }
-
-
-                switch (alt1) {
-            	case 1 :
-            	    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:
-            	    {
-            	    if ( (input.LA(1)>='0' && input.LA(1)<='9')||(input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
-            	        input.consume();
-
-            	    }
-            	    else {
-            	        MismatchedSetException mse = new MismatchedSetException(null,input);
-            	        recover(mse);
-            	        throw mse;}
-
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop1;
-                }
-            } while (true);
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "ID"
-
-    // $ANTLR start "INT"
-    public final void mINT() throws RecognitionException {
-        try {
-            int _type = INT;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            CommonToken int=null;
-            List list_int=null;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:99:5: ( (int+= ( '0' .. '9' ) )+ )
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:99:7: (int+= ( '0' .. '9' ) )+
-            {
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:99:10: (int+= ( '0' .. '9' ) )+
-            int cnt2=0;
-            loop2:
-            do {
-                int alt2=2;
-                int LA2_0 = input.LA(1);
-
-                if ( ((LA2_0>='0' && LA2_0<='9')) ) {
-                    alt2=1;
-                }
-
-
-                switch (alt2) {
-            	case 1 :
-            	    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:99:10: int+= ( '0' .. '9' )
-            	    {
-            	    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:99:12: ( '0' .. '9' )
-            	    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:99:13: '0' .. '9'
-            	    {
-            	    matchRange('0','9'); 
-
-            	    }
-
-
-            	    }
-            	    break;
-
-            	default :
-            	    if ( cnt2 >= 1 ) break loop2;
-                        EarlyExitException eee =
-                            new EarlyExitException(2, input);
-                        throw eee;
-                }
-                cnt2++;
-            } while (true);
-
-            NSLog(@"%@", list_int);
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "INT"
-
-    // $ANTLR start "EQ"
-    public final void mEQ() throws RecognitionException {
-        try {
-            int _type = EQ;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:102:6: ( '=' )
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:102:8: '='
-            {
-            match('='); 
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "EQ"
-
-    // $ANTLR start "EQEQ"
-    public final void mEQEQ() throws RecognitionException {
-        try {
-            int _type = EQEQ;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:103:6: ( '==' )
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:103:8: '=='
-            {
-            match("=="); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "EQEQ"
-
-    // $ANTLR start "LT"
-    public final void mLT() throws RecognitionException {
-        try {
-            int _type = LT;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:104:6: ( '<' )
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:104:8: '<'
-            {
-            match('<'); 
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "LT"
-
-    // $ANTLR start "PLUS"
-    public final void mPLUS() throws RecognitionException {
-        try {
-            int _type = PLUS;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:105:6: ( '+' )
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:105:8: '+'
-            {
-            match('+'); 
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "PLUS"
-
-    // $ANTLR start "WS"
-    public final void mWS() throws RecognitionException {
-        try {
-            int _type = WS;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:107:5: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:107:9: ( ' ' | '\\t' | '\\r' | '\\n' )+
-            {
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:107:9: ( ' ' | '\\t' | '\\r' | '\\n' )+
-            int cnt3=0;
-            loop3:
-            do {
-                int alt3=2;
-                int LA3_0 = input.LA(1);
-
-                if ( ((LA3_0>='\t' && LA3_0<='\n')||LA3_0=='\r'||LA3_0==' ') ) {
-                    alt3=1;
-                }
-
-
-                switch (alt3) {
-            	case 1 :
-            	    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:
-            	    {
-            	    if ( (input.LA(1)>='\t' && input.LA(1)<='\n')||input.LA(1)=='\r'||input.LA(1)==' ' ) {
-            	        input.consume();
-
-            	    }
-            	    else {
-            	        MismatchedSetException mse = new MismatchedSetException(null,input);
-            	        recover(mse);
-            	        throw mse;}
-
-
-            	    }
-            	    break;
-
-            	default :
-            	    if ( cnt3 >= 1 ) break loop3;
-                        EarlyExitException eee =
-                            new EarlyExitException(3, input);
-                        throw eee;
-                }
-                cnt3++;
-            } while (true);
-
-             _channel=99; 
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "WS"
-
-    public void mTokens() throws RecognitionException {
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:8: ( T__21 | T__22 | T__23 | T__24 | T__25 | T__26 | FOR | INT_TYPE | CHAR | VOID | ID | INT | EQ | EQEQ | LT | PLUS | WS )
-        int alt4=17;
-        alt4 = dfa4.predict(input);
-        switch (alt4) {
-            case 1 :
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:10: T__21
-                {
-                mT__21(); 
-
-                }
-                break;
-            case 2 :
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:16: T__22
-                {
-                mT__22(); 
-
-                }
-                break;
-            case 3 :
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:22: T__23
-                {
-                mT__23(); 
-
-                }
-                break;
-            case 4 :
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:28: T__24
-                {
-                mT__24(); 
-
-                }
-                break;
-            case 5 :
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:34: T__25
-                {
-                mT__25(); 
-
-                }
-                break;
-            case 6 :
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:40: T__26
-                {
-                mT__26(); 
-
-                }
-                break;
-            case 7 :
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:46: FOR
-                {
-                mFOR(); 
-
-                }
-                break;
-            case 8 :
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:50: INT_TYPE
-                {
-                mINT_TYPE(); 
-
-                }
-                break;
-            case 9 :
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:59: CHAR
-                {
-                mCHAR(); 
-
-                }
-                break;
-            case 10 :
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:64: VOID
-                {
-                mVOID(); 
-
-                }
-                break;
-            case 11 :
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:69: ID
-                {
-                mID(); 
-
-                }
-                break;
-            case 12 :
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:72: INT
-                {
-                mINT(); 
-
-                }
-                break;
-            case 13 :
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:76: EQ
-                {
-                mEQ(); 
-
-                }
-                break;
-            case 14 :
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:79: EQEQ
-                {
-                mEQEQ(); 
-
-                }
-                break;
-            case 15 :
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:84: LT
-                {
-                mLT(); 
-
-                }
-                break;
-            case 16 :
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:87: PLUS
-                {
-                mPLUS(); 
-
-                }
-                break;
-            case 17 :
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:92: WS
-                {
-                mWS(); 
-
-                }
-                break;
-
-        }
-
-    }
-
-
-    protected DFA4 dfa4 = new DFA4(this);
-    static final String DFA4_eotS =
-        "\7\uffff\4\13\2\uffff\1\26\3\uffff\4\13\2\uffff\1\33\1\34\2\13\2"+
-        "\uffff\1\37\1\40\2\uffff";
-    static final String DFA4_eofS =
-        "\41\uffff";
-    static final String DFA4_minS =
-        "\1\11\6\uffff\1\157\1\156\1\150\1\157\2\uffff\1\75\3\uffff\1\162"+
-        "\1\164\1\141\1\151\2\uffff\2\60\1\162\1\144\2\uffff\2\60\2\uffff";
-    static final String DFA4_maxS =
-        "\1\175\6\uffff\1\157\1\156\1\150\1\157\2\uffff\1\75\3\uffff\1\162"+
-        "\1\164\1\141\1\151\2\uffff\2\172\1\162\1\144\2\uffff\2\172\2\uffff";
-    static final String DFA4_acceptS =
-        "\1\uffff\1\1\1\2\1\3\1\4\1\5\1\6\4\uffff\1\13\1\14\1\uffff\1\17"+
-        "\1\20\1\21\4\uffff\1\16\1\15\4\uffff\1\7\1\10\2\uffff\1\11\1\12";
-    static final String DFA4_specialS =
-        "\41\uffff}>";
-    static final String[] DFA4_transitionS = {
-            "\2\20\2\uffff\1\20\22\uffff\1\20\7\uffff\1\2\1\4\1\uffff\1\17"+
-            "\1\3\3\uffff\12\14\1\uffff\1\1\1\16\1\15\3\uffff\32\13\4\uffff"+
-            "\1\13\1\uffff\2\13\1\11\2\13\1\7\2\13\1\10\14\13\1\12\4\13\1"+
-            "\5\1\uffff\1\6",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "\1\21",
-            "\1\22",
-            "\1\23",
-            "\1\24",
-            "",
-            "",
-            "\1\25",
-            "",
-            "",
-            "",
-            "\1\27",
-            "\1\30",
-            "\1\31",
-            "\1\32",
-            "",
-            "",
-            "\12\13\7\uffff\32\13\4\uffff\1\13\1\uffff\32\13",
-            "\12\13\7\uffff\32\13\4\uffff\1\13\1\uffff\32\13",
-            "\1\35",
-            "\1\36",
-            "",
-            "",
-            "\12\13\7\uffff\32\13\4\uffff\1\13\1\uffff\32\13",
-            "\12\13\7\uffff\32\13\4\uffff\1\13\1\uffff\32\13",
-            "",
-            ""
-    };
-
-    static final short[] DFA4_eot = DFA.unpackEncodedString(DFA4_eotS);
-    static final short[] DFA4_eof = DFA.unpackEncodedString(DFA4_eofS);
-    static final char[] DFA4_min = DFA.unpackEncodedStringToUnsignedChars(DFA4_minS);
-    static final char[] DFA4_max = DFA.unpackEncodedStringToUnsignedChars(DFA4_maxS);
-    static final short[] DFA4_accept = DFA.unpackEncodedString(DFA4_acceptS);
-    static final short[] DFA4_special = DFA.unpackEncodedString(DFA4_specialS);
-    static final short[][] DFA4_transition;
-
-    static {
-        int numStates = DFA4_transitionS.length;
-        DFA4_transition = new short[numStates][];
-        for (int i=0; i<numStates; i++) {
-            DFA4_transition[i] = DFA.unpackEncodedString(DFA4_transitionS[i]);
-        }
-    }
-
-    class DFA4 extends DFA {
-
-        public DFA4(BaseRecognizer recognizer) {
-            this.recognizer = recognizer;
-            this.decisionNumber = 4;
-            this.eot = DFA4_eot;
-            this.eof = DFA4_eof;
-            this.min = DFA4_min;
-            this.max = DFA4_max;
-            this.accept = DFA4_accept;
-            this.special = DFA4_special;
-            this.transition = DFA4_transition;
-        }
-        public String getDescription() {
-            return "1:1: Tokens : ( T__21 | T__22 | T__23 | T__24 | T__25 | T__26 | FOR | INT_TYPE | CHAR | VOID | ID | INT | EQ | EQEQ | LT | PLUS | WS );";
-        }
-    }
- 
-
-}
\ No newline at end of file
diff --git a/runtime/ObjC/Framework/examples/simplecTreeParser/output1/SimpleCLexer.m b/runtime/ObjC/Framework/examples/simplecTreeParser/output1/SimpleCLexer.m
deleted file mode 100644
index f8d4cfe..0000000
--- a/runtime/ObjC/Framework/examples/simplecTreeParser/output1/SimpleCLexer.m
+++ /dev/null
@@ -1,985 +0,0 @@
-/** \file
- *  This OBJC source file was generated by $ANTLR version 3.2 Aug 23, 2010 07:48:06
- *
- *     -  From the grammar source file : /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g
- *     -                            On : 2010-08-23 07:54:47
- *     -                 for the lexer : SimpleCLexerLexer *
- * Editing it, at least manually, is not wise. 
- *
- * ObjC language generator and runtime by Alan Condit, acondit|hereisanat|ipns|dotgoeshere|com.
- *
- *
-*/
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-//
-// 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.
-
-// $ANTLR 3.2 Aug 23, 2010 07:48:06 /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g 2010-08-23 07:54:47
-
-/* -----------------------------------------
- * Include the ANTLR3 generated header file.
- */
-#import "SimpleCLexer.h"
-/* ----------------------------------------- */
-
-
-/* ============================================================================= */
-
-/* =============================================================================
- * Start of recognizer
- */
-
-#pragma mark Cyclic DFA implementation start DFA4
-@implementation DFA4
-const static NSInteger dfa4_eot[33] =
-    {-1,-1,-1,-1,-1,-1,-1,11,11,11,11,-1,-1,22,-1,-1,-1,11,11,11,11,-1,-1,
-     27,28,11,11,-1,-1,31,32,-1,-1};
-const static NSInteger dfa4_eof[33] =
-    {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-     -1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
-const static unichar dfa4_min[33] =
-    {9,0,0,0,0,0,0,111,110,104,111,0,0,61,0,0,0,114,116,97,105,0,0,48,48,
-     114,100,0,0,48,48,0,0};
-const static unichar dfa4_max[33] =
-    {125,0,0,0,0,0,0,111,110,104,111,0,0,61,0,0,0,114,116,97,105,0,0,122,
-     122,114,100,0,0,122,122,0,0};
-const static NSInteger dfa4_accept[33] =
-    {-1,1,2,3,4,5,6,-1,-1,-1,-1,11,12,-1,15,16,17,-1,-1,-1,-1,14,13,-1,-1,
-     -1,-1,7,8,-1,-1,9,10};
-const static NSInteger dfa4_special[33] =
-    {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-     -1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
-const static NSInteger dfa4_transition[] = {};
-const static NSInteger dfa4_transition0[] = {24};
-const static NSInteger dfa4_transition1[] = {26};
-const static NSInteger dfa4_transition2[] = {29};
-const static NSInteger dfa4_transition3[] = {20};
-const static NSInteger dfa4_transition4[] = {25};
-const static NSInteger dfa4_transition5[] = {16, 16, -1, -1, 16, -1, -1, 
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16, -1, 
- -1, -1, -1, -1, -1, -1, 2, 4, -1, 15, 3, -1, -1, -1, 12, 12, 12, 12, 12, 
- 12, 12, 12, 12, 12, -1, 1, 14, 13, -1, -1, -1, 11, 11, 11, 11, 11, 11, 
- 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 
- 11, 11, -1, -1, -1, -1, 11, -1, 11, 11, 9, 11, 11, 7, 11, 11, 8, 11, 11, 
- 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 11, 11, 11, 11, 5, -1, 6};
-const static NSInteger dfa4_transition6[] = {21};
-const static NSInteger dfa4_transition7[] = {11, 11, 11, 11, 11, 11, 11, 
- 11, 11, 11, -1, -1, -1, -1, -1, -1, -1, 11, 11, 11, 11, 11, 11, 11, 11, 
- 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 
- -1, -1, -1, -1, 11, -1, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 
- 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11};
-const static NSInteger dfa4_transition8[] = {18};
-const static NSInteger dfa4_transition9[] = {19};
-const static NSInteger dfa4_transition10[] = {23};
-const static NSInteger dfa4_transition11[] = {17};
-const static NSInteger dfa4_transition12[] = {30};
-
-
-+ () newDFA4WithRecognizer:(ANTLRBaseRecognizer *)aRecognizer
-{
-    return [[[DFA4 alloc] initWithRecognizer:aRecognizer] retain];
-}
-
-- (id) initWithRecognizer:(ANTLRBaseRecognizer *) theRecognizer
-{
-    if ((self = [super initWithRecognizer:theRecognizer]) != nil) {
-        decisionNumber = 4;
-        eot = dfa4_eot;
-        eof = dfa4_eof;
-        min = dfa4_min;
-        max = dfa4_max;
-        accept = dfa4_accept;
-        special = dfa4_special;
-        if (!(transition = calloc(33, sizeof(void*)))) {
-            [self release];
-            return nil;
-        }
-        len = 33;
-        transition[0] = dfa4_transition5;
-        transition[1] = dfa4_transition;
-        transition[2] = dfa4_transition;
-        transition[3] = dfa4_transition;
-        transition[4] = dfa4_transition;
-        transition[5] = dfa4_transition;
-        transition[6] = dfa4_transition;
-        transition[7] = dfa4_transition11;
-        transition[8] = dfa4_transition8;
-        transition[9] = dfa4_transition9;
-        transition[10] = dfa4_transition3;
-        transition[11] = dfa4_transition;
-        transition[12] = dfa4_transition;
-        transition[13] = dfa4_transition6;
-        transition[14] = dfa4_transition;
-        transition[15] = dfa4_transition;
-        transition[16] = dfa4_transition;
-        transition[17] = dfa4_transition10;
-        transition[18] = dfa4_transition0;
-        transition[19] = dfa4_transition4;
-        transition[20] = dfa4_transition1;
-        transition[21] = dfa4_transition;
-        transition[22] = dfa4_transition;
-        transition[23] = dfa4_transition7;
-        transition[24] = dfa4_transition7;
-        transition[25] = dfa4_transition2;
-        transition[26] = dfa4_transition12;
-        transition[27] = dfa4_transition;
-        transition[28] = dfa4_transition;
-        transition[29] = dfa4_transition7;
-        transition[30] = dfa4_transition7;
-        transition[31] = dfa4_transition;
-        transition[32] = dfa4_transition;
-    }
-    return self;
-}
-
-- (void) dealloc
-{
-    free(transition);
-    [super dealloc];
-}
-
-- (NSString *) description
-{
-    return @"1:1: Tokens : ( T__21 | T__22 | T__23 | T__24 | T__25 | T__26 | K_FOR | K_INT_TYPE | K_CHAR | K_VOID | K_ID | K_INT | K_EQ | K_EQEQ | K_LT | K_PLUS | WS );";
-}
-
-
-@end /* end DFA4 implementation */
-
-#pragma mark Cyclic DFA implementation end DFA4
-
-
-
-/** As per Terence: No returns for lexer rules!
-#pragma mark Rule return scopes start
-#pragma mark Rule return scopes end
-*/
-@implementation SimpleCLexer // line 330
-
-+ (void) initialize
-{
-    [ANTLRBaseRecognizer setGrammarFileName:@"/usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g"];
-}
-
-+ (NSString *) tokenNameForType:(NSInteger)aTokenType
-{
-    return [[self getTokenNames] objectAtIndex:aTokenType];
-}
-
-+ (SimpleCLexer *)newSimpleCLexer:(id<ANTLRCharStream>)anInput
-{
-    return [[SimpleCLexer alloc] initWithCharStream:anInput];
-}
-
-- (id) initWithCharStream:(id<ANTLRCharStream>)anInput
-{
-    if ((self = [super initWithCharStream:anInput State:[ANTLRRecognizerSharedState newANTLRRecognizerSharedStateWithRuleLen:18+1]]) != nil) {
-
-        dfa4 = [DFA4 newDFA4WithRecognizer:self];
-    }
-    return self;
-}
-
-- (void) dealloc
-{
-    [dfa4 release];
-    [super dealloc];
-}
-
-/* Start of actions.lexer.methods */
-/* start methods() */
-
-/* Start of Rules */
-// $ANTLR start "T__21"
-- (void) mT__21
-{
-    //
-    /* ruleScopeSetUp */
-
-    @try {
-        NSInteger _type = T__21;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:7:7: ( ';' ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:7:9: ';' // alt
-        {
-        [self matchChar:';']; 
-          /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-        [state setType:_type];
-
-        state.channel = _channel;
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "T__21"
-
-// $ANTLR start "T__22"
-- (void) mT__22
-{
-    //
-    /* ruleScopeSetUp */
-
-    @try {
-        NSInteger _type = T__22;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:8:7: ( '(' ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:8:9: '(' // alt
-        {
-        [self matchChar:'(']; 
-          /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-        [state setType:_type];
-
-        state.channel = _channel;
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "T__22"
-
-// $ANTLR start "T__23"
-- (void) mT__23
-{
-    //
-    /* ruleScopeSetUp */
-
-    @try {
-        NSInteger _type = T__23;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:9:7: ( ',' ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:9:9: ',' // alt
-        {
-        [self matchChar:',']; 
-          /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-        [state setType:_type];
-
-        state.channel = _channel;
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "T__23"
-
-// $ANTLR start "T__24"
-- (void) mT__24
-{
-    //
-    /* ruleScopeSetUp */
-
-    @try {
-        NSInteger _type = T__24;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:10:7: ( ')' ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:10:9: ')' // alt
-        {
-        [self matchChar:')']; 
-          /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-        [state setType:_type];
-
-        state.channel = _channel;
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "T__24"
-
-// $ANTLR start "T__25"
-- (void) mT__25
-{
-    //
-    /* ruleScopeSetUp */
-
-    @try {
-        NSInteger _type = T__25;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:11:7: ( '{' ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:11:9: '{' // alt
-        {
-        [self matchChar:'{']; 
-          /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-        [state setType:_type];
-
-        state.channel = _channel;
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "T__25"
-
-// $ANTLR start "T__26"
-- (void) mT__26
-{
-    //
-    /* ruleScopeSetUp */
-
-    @try {
-        NSInteger _type = T__26;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:12:7: ( '}' ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:12:9: '}' // alt
-        {
-        [self matchChar:'}']; 
-          /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-        [state setType:_type];
-
-        state.channel = _channel;
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "T__26"
-
-// $ANTLR start "K_FOR"
-- (void) mK_FOR
-{
-    //
-    /* ruleScopeSetUp */
-
-    @try {
-        NSInteger _type = K_FOR;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:91:7: ( 'for' ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:91:9: 'for' // alt
-        {
-        [self matchString:@"for"]; 
-          /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-        [state setType:_type];
-
-        state.channel = _channel;
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "K_FOR"
-
-// $ANTLR start "K_INT_TYPE"
-- (void) mK_INT_TYPE
-{
-    //
-    /* ruleScopeSetUp */
-
-    @try {
-        NSInteger _type = K_INT_TYPE;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:92:12: ( 'int' ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:92:14: 'int' // alt
-        {
-        [self matchString:@"int"]; 
-          /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-        [state setType:_type];
-
-        state.channel = _channel;
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "K_INT_TYPE"
-
-// $ANTLR start "K_CHAR"
-- (void) mK_CHAR
-{
-    //
-    /* ruleScopeSetUp */
-
-    @try {
-        NSInteger _type = K_CHAR;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:93:7: ( 'char' ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:93:9: 'char' // alt
-        {
-        [self matchString:@"char"]; 
-          /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-        [state setType:_type];
-
-        state.channel = _channel;
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "K_CHAR"
-
-// $ANTLR start "K_VOID"
-- (void) mK_VOID
-{
-    //
-    /* ruleScopeSetUp */
-
-    @try {
-        NSInteger _type = K_VOID;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:94:7: ( 'void' ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:94:9: 'void' // alt
-        {
-        [self matchString:@"void"]; 
-          /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-        [state setType:_type];
-
-        state.channel = _channel;
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "K_VOID"
-
-// $ANTLR start "K_ID"
-- (void) mK_ID
-{
-    //
-    /* ruleScopeSetUp */
-
-    @try {
-        NSInteger _type = K_ID;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:96:7: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' )* ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:96:11: ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' )* // alt
-        {
-        if ((([input LA:1] >= 'A') && ([input LA:1] <= 'Z'))||[input LA:1] == '_'||(([input LA:1] >= 'a') && ([input LA:1] <= 'z'))) {
-            [input consume];
-
-        } else {
-            ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException exceptionWithSet:nil stream:input];
-            [self recover:mse];
-            @throw mse;}
-          /* element() */
-        do {
-            NSInteger alt1=2;
-            NSInteger LA1_0 = [input LA:1];
-            if ( ((LA1_0>='0' && LA1_0<='9')||(LA1_0>='A' && LA1_0<='Z')||LA1_0=='_'||(LA1_0>='a' && LA1_0<='z')) ) {
-                alt1=1;
-            }
-
-
-            switch (alt1) {
-                case 1 : ;
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g: // alt
-                    {
-                    if ((([input LA:1] >= '0') && ([input LA:1] <= '9'))||(([input LA:1] >= 'A') && ([input LA:1] <= 'Z'))||[input LA:1] == '_'||(([input LA:1] >= 'a') && ([input LA:1] <= 'z'))) {
-                        [input consume];
-
-                    } else {
-                        ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException exceptionWithSet:nil stream:input];
-                        [self recover:mse];
-                        @throw mse;}
-                      /* element() */
-                     /* elements */
-                    }
-                    break;
-
-                default :
-                    goto loop1;
-            }
-        } while (YES);
-        loop1: ;
-          /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-        [state setType:_type];
-
-        state.channel = _channel;
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "K_ID"
-
-// $ANTLR start "K_INT"
-- (void) mK_INT
-{
-    //
-    /* ruleScopeSetUp */
-
-    @try {
-        NSInteger _type = K_INT;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        id<ANTLRToken> *int=nil;
-        NSMutableArray *list_int=nil; 
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:99:7: ( (int+= ( '0' .. '9' ) )+ ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:99:9: (int+= ( '0' .. '9' ) )+ // alt
-        {
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:99:12: (int+= ( '0' .. '9' ) )+ // positiveClosureBlock
-        NSInteger cnt2=0;
-        do {
-            NSInteger alt2=2;
-            NSInteger LA2_0 = [input LA:1];
-            if ( ((LA2_0>='0' && LA2_0<='9')) ) {
-                alt2=1;
-            }
-
-
-            switch (alt2) {
-                case 1 : ;
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:99:12: int+= ( '0' .. '9' ) // alt
-                    {
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:99:14: ( '0' .. '9' ) // blockSingleAlt
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:99:15: '0' .. '9' // alt
-                    {
-                    [self matchRangeFromChar:'0' to:'9'];   /* element() */
-                     /* elements */
-                    }
-                      /* element() */
-                     /* elements */
-                    }
-                    break;
-
-                default :
-                    if ( cnt2 >= 1 )
-                        goto loop2;
-                    ANTLREarlyExitException *eee = [ANTLREarlyExitException exceptionWithStream:input decisionNumber:2];
-                    @throw eee;
-            }
-            cnt2++;
-        } while (YES);
-        loop2: ;
-          /* element() */
-        NSLog(@"%@", list_int);  /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-        [list_int release];
-
-        [state setType:_type];
-
-        state.channel = _channel;
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "K_INT"
-
-// $ANTLR start "K_EQ"
-- (void) mK_EQ
-{
-    //
-    /* ruleScopeSetUp */
-
-    @try {
-        NSInteger _type = K_EQ;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:102:8: ( '=' ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:102:10: '=' // alt
-        {
-        [self matchChar:'=']; 
-          /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-        [state setType:_type];
-
-        state.channel = _channel;
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "K_EQ"
-
-// $ANTLR start "K_EQEQ"
-- (void) mK_EQEQ
-{
-    //
-    /* ruleScopeSetUp */
-
-    @try {
-        NSInteger _type = K_EQEQ;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:103:8: ( '==' ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:103:10: '==' // alt
-        {
-        [self matchString:@"=="]; 
-          /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-        [state setType:_type];
-
-        state.channel = _channel;
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "K_EQEQ"
-
-// $ANTLR start "K_LT"
-- (void) mK_LT
-{
-    //
-    /* ruleScopeSetUp */
-
-    @try {
-        NSInteger _type = K_LT;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:104:8: ( '<' ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:104:10: '<' // alt
-        {
-        [self matchChar:'<']; 
-          /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-        [state setType:_type];
-
-        state.channel = _channel;
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "K_LT"
-
-// $ANTLR start "K_PLUS"
-- (void) mK_PLUS
-{
-    //
-    /* ruleScopeSetUp */
-
-    @try {
-        NSInteger _type = K_PLUS;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:105:8: ( '+' ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:105:10: '+' // alt
-        {
-        [self matchChar:'+']; 
-          /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-        [state setType:_type];
-
-        state.channel = _channel;
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "K_PLUS"
-
-// $ANTLR start "WS"
-- (void) mWS
-{
-    //
-    /* ruleScopeSetUp */
-
-    @try {
-        NSInteger _type = WS;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:107:5: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:107:9: ( ' ' | '\\t' | '\\r' | '\\n' )+ // alt
-        {
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:107:9: ( ' ' | '\\t' | '\\r' | '\\n' )+ // positiveClosureBlock
-        NSInteger cnt3=0;
-        do {
-            NSInteger alt3=2;
-            NSInteger LA3_0 = [input LA:1];
-            if ( ((LA3_0>='\t' && LA3_0<='\n')||LA3_0=='\r'||LA3_0==' ') ) {
-                alt3=1;
-            }
-
-
-            switch (alt3) {
-                case 1 : ;
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g: // alt
-                    {
-                    if ((([input LA:1] >= '\t') && ([input LA:1] <= '\n'))||[input LA:1] == '\r'||[input LA:1] == ' ') {
-                        [input consume];
-
-                    } else {
-                        ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException exceptionWithSet:nil stream:input];
-                        [self recover:mse];
-                        @throw mse;}
-                      /* element() */
-                     /* elements */
-                    }
-                    break;
-
-                default :
-                    if ( cnt3 >= 1 )
-                        goto loop3;
-                    ANTLREarlyExitException *eee = [ANTLREarlyExitException exceptionWithStream:input decisionNumber:3];
-                    @throw eee;
-            }
-            cnt3++;
-        } while (YES);
-        loop3: ;
-          /* element() */
-         state.channel=99;   /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-        [state setType:_type];
-
-        state.channel = _channel;
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "WS"
-
-- (void) mTokens
-{
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:8: ( T__21 | T__22 | T__23 | T__24 | T__25 | T__26 | K_FOR | K_INT_TYPE | K_CHAR | K_VOID | K_ID | K_INT | K_EQ | K_EQEQ | K_LT | K_PLUS | WS ) //ruleblock
-    NSInteger alt4=17;
-    alt4 = [dfa4 predict:input];
-    switch (alt4) {
-        case 1 : ;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:10: T__21 // alt
-            {
-                [self mT__21]; 
-              /* element() */
-             /* elements */
-            }
-            break;
-        case 2 : ;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:16: T__22 // alt
-            {
-                [self mT__22]; 
-              /* element() */
-             /* elements */
-            }
-            break;
-        case 3 : ;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:22: T__23 // alt
-            {
-                [self mT__23]; 
-              /* element() */
-             /* elements */
-            }
-            break;
-        case 4 : ;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:28: T__24 // alt
-            {
-                [self mT__24]; 
-              /* element() */
-             /* elements */
-            }
-            break;
-        case 5 : ;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:34: T__25 // alt
-            {
-                [self mT__25]; 
-              /* element() */
-             /* elements */
-            }
-            break;
-        case 6 : ;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:40: T__26 // alt
-            {
-                [self mT__26]; 
-              /* element() */
-             /* elements */
-            }
-            break;
-        case 7 : ;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:46: K_FOR // alt
-            {
-                [self mK_FOR]; 
-              /* element() */
-             /* elements */
-            }
-            break;
-        case 8 : ;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:52: K_INT_TYPE // alt
-            {
-                [self mK_INT_TYPE]; 
-              /* element() */
-             /* elements */
-            }
-            break;
-        case 9 : ;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:63: K_CHAR // alt
-            {
-                [self mK_CHAR]; 
-              /* element() */
-             /* elements */
-            }
-            break;
-        case 10 : ;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:70: K_VOID // alt
-            {
-                [self mK_VOID]; 
-              /* element() */
-             /* elements */
-            }
-            break;
-        case 11 : ;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:77: K_ID // alt
-            {
-                [self mK_ID]; 
-              /* element() */
-             /* elements */
-            }
-            break;
-        case 12 : ;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:82: K_INT // alt
-            {
-                [self mK_INT]; 
-              /* element() */
-             /* elements */
-            }
-            break;
-        case 13 : ;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:88: K_EQ // alt
-            {
-                [self mK_EQ]; 
-              /* element() */
-             /* elements */
-            }
-            break;
-        case 14 : ;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:93: K_EQEQ // alt
-            {
-                [self mK_EQEQ]; 
-              /* element() */
-             /* elements */
-            }
-            break;
-        case 15 : ;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:100: K_LT // alt
-            {
-                [self mK_LT]; 
-              /* element() */
-             /* elements */
-            }
-            break;
-        case 16 : ;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:105: K_PLUS // alt
-            {
-                [self mK_PLUS]; 
-              /* element() */
-             /* elements */
-            }
-            break;
-        case 17 : ;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:1:112: WS // alt
-            {
-                [self mWS]; 
-              /* element() */
-             /* elements */
-            }
-            break;
-
-    }
-
-}
-
-@end /* end of SimpleCLexer implementation line 397 */
-
-/* End of code
- * =============================================================================
- */
diff --git a/runtime/ObjC/Framework/examples/simplecTreeParser/output1/SimpleCParser.h b/runtime/ObjC/Framework/examples/simplecTreeParser/output1/SimpleCParser.h
deleted file mode 100644
index 6d4f180..0000000
--- a/runtime/ObjC/Framework/examples/simplecTreeParser/output1/SimpleCParser.h
+++ /dev/null
@@ -1,300 +0,0 @@
-// $ANTLR 3.2 Aug 23, 2010 07:48:06 /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g 2010-08-23 07:54:46
-
-/* =============================================================================
- * Standard antlr3 OBJC runtime definitions
- */
-#import <Cocoa/Cocoa.h>
-#import "antlr3.h"
-/* End of standard antlr3 runtime definitions
- * =============================================================================
- */
-
-#pragma mark Cyclic DFA interface start DFA2
-@interface DFA2 : ANTLRDFA {
-}
-+ newDFA2WithRecognizer:(ANTLRBaseRecognizer *)theRecognizer;
-- initWithRecognizer:(ANTLRBaseRecognizer *)recognizer;
-@end /* end of DFA2 interface  */
-
-#pragma mark Cyclic DFA interface end DFA2
-#pragma mark Tokens
-#define K_ID 10
-#define T__26 26
-#define T__25 25
-#define T__24 24
-#define T__23 23
-#define K_EQEQ 16
-#define T__22 22
-#define K_INT 11
-#define T__21 21
-#define K_FOR 14
-#define FUNC_HDR 6
-#define FUNC_DEF 8
-#define EOF -1
-#define K_INT_TYPE 19
-#define FUNC_DECL 7
-#define ARG_DEF 5
-#define WS 20
-#define K_EQ 15
-#define BLOCK 9
-#define K_LT 17
-#define K_CHAR 12
-#define K_VOID 13
-#define VAR_DEF 4
-#define K_PLUS 18
-#pragma mark Dynamic Global Scopes
-#pragma mark Dynamic Rule Scopes
-#pragma mark Rule Return Scopes start
-@interface SimpleCParser_program_return :ANTLRParserRuleReturnScope { // line 1672
-/* AST returnScopeInterface.memVars */
-ANTLRCommonTree *tree; // start of memVars()
-}
-
-// start properties
-@property (retain, getter=getTree, setter=setTree:) ANTLRCommonTree *tree;
-+ (SimpleCParser_program_return *)newSimpleCParser_program_return;
-// this is start of set and get methods
-/* AST returnScopeInterface.methodsdecl */
-- (ANTLRCommonTree *)getTree;
-- (void) setTree:(ANTLRCommonTree *)aTree;
-  // methodsDecl
-@end /* end of returnScopeInterface interface */
-@interface SimpleCParser_declaration_return :ANTLRParserRuleReturnScope { // line 1672
-/* AST returnScopeInterface.memVars */
-ANTLRCommonTree *tree; // start of memVars()
-}
-
-// start properties
-@property (retain, getter=getTree, setter=setTree:) ANTLRCommonTree *tree;
-+ (SimpleCParser_declaration_return *)newSimpleCParser_declaration_return;
-// this is start of set and get methods
-/* AST returnScopeInterface.methodsdecl */
-- (ANTLRCommonTree *)getTree;
-- (void) setTree:(ANTLRCommonTree *)aTree;
-  // methodsDecl
-@end /* end of returnScopeInterface interface */
-@interface SimpleCParser_variable_return :ANTLRParserRuleReturnScope { // line 1672
-/* AST returnScopeInterface.memVars */
-ANTLRCommonTree *tree; // start of memVars()
-}
-
-// start properties
-@property (retain, getter=getTree, setter=setTree:) ANTLRCommonTree *tree;
-+ (SimpleCParser_variable_return *)newSimpleCParser_variable_return;
-// this is start of set and get methods
-/* AST returnScopeInterface.methodsdecl */
-- (ANTLRCommonTree *)getTree;
-- (void) setTree:(ANTLRCommonTree *)aTree;
-  // methodsDecl
-@end /* end of returnScopeInterface interface */
-@interface SimpleCParser_declarator_return :ANTLRParserRuleReturnScope { // line 1672
-/* AST returnScopeInterface.memVars */
-ANTLRCommonTree *tree; // start of memVars()
-}
-
-// start properties
-@property (retain, getter=getTree, setter=setTree:) ANTLRCommonTree *tree;
-+ (SimpleCParser_declarator_return *)newSimpleCParser_declarator_return;
-// this is start of set and get methods
-/* AST returnScopeInterface.methodsdecl */
-- (ANTLRCommonTree *)getTree;
-- (void) setTree:(ANTLRCommonTree *)aTree;
-  // methodsDecl
-@end /* end of returnScopeInterface interface */
-@interface SimpleCParser_functionHeader_return :ANTLRParserRuleReturnScope { // line 1672
-/* AST returnScopeInterface.memVars */
-ANTLRCommonTree *tree; // start of memVars()
-}
-
-// start properties
-@property (retain, getter=getTree, setter=setTree:) ANTLRCommonTree *tree;
-+ (SimpleCParser_functionHeader_return *)newSimpleCParser_functionHeader_return;
-// this is start of set and get methods
-/* AST returnScopeInterface.methodsdecl */
-- (ANTLRCommonTree *)getTree;
-- (void) setTree:(ANTLRCommonTree *)aTree;
-  // methodsDecl
-@end /* end of returnScopeInterface interface */
-@interface SimpleCParser_formalParameter_return :ANTLRParserRuleReturnScope { // line 1672
-/* AST returnScopeInterface.memVars */
-ANTLRCommonTree *tree; // start of memVars()
-}
-
-// start properties
-@property (retain, getter=getTree, setter=setTree:) ANTLRCommonTree *tree;
-+ (SimpleCParser_formalParameter_return *)newSimpleCParser_formalParameter_return;
-// this is start of set and get methods
-/* AST returnScopeInterface.methodsdecl */
-- (ANTLRCommonTree *)getTree;
-- (void) setTree:(ANTLRCommonTree *)aTree;
-  // methodsDecl
-@end /* end of returnScopeInterface interface */
-@interface SimpleCParser_type_return :ANTLRParserRuleReturnScope { // line 1672
-/* AST returnScopeInterface.memVars */
-ANTLRCommonTree *tree; // start of memVars()
-}
-
-// start properties
-@property (retain, getter=getTree, setter=setTree:) ANTLRCommonTree *tree;
-+ (SimpleCParser_type_return *)newSimpleCParser_type_return;
-// this is start of set and get methods
-/* AST returnScopeInterface.methodsdecl */
-- (ANTLRCommonTree *)getTree;
-- (void) setTree:(ANTLRCommonTree *)aTree;
-  // methodsDecl
-@end /* end of returnScopeInterface interface */
-@interface SimpleCParser_block_return :ANTLRParserRuleReturnScope { // line 1672
-/* AST returnScopeInterface.memVars */
-ANTLRCommonTree *tree; // start of memVars()
-}
-
-// start properties
-@property (retain, getter=getTree, setter=setTree:) ANTLRCommonTree *tree;
-+ (SimpleCParser_block_return *)newSimpleCParser_block_return;
-// this is start of set and get methods
-/* AST returnScopeInterface.methodsdecl */
-- (ANTLRCommonTree *)getTree;
-- (void) setTree:(ANTLRCommonTree *)aTree;
-  // methodsDecl
-@end /* end of returnScopeInterface interface */
-@interface SimpleCParser_stat_return :ANTLRParserRuleReturnScope { // line 1672
-/* AST returnScopeInterface.memVars */
-ANTLRCommonTree *tree; // start of memVars()
-}
-
-// start properties
-@property (retain, getter=getTree, setter=setTree:) ANTLRCommonTree *tree;
-+ (SimpleCParser_stat_return *)newSimpleCParser_stat_return;
-// this is start of set and get methods
-/* AST returnScopeInterface.methodsdecl */
-- (ANTLRCommonTree *)getTree;
-- (void) setTree:(ANTLRCommonTree *)aTree;
-  // methodsDecl
-@end /* end of returnScopeInterface interface */
-@interface SimpleCParser_forStat_return :ANTLRParserRuleReturnScope { // line 1672
-/* AST returnScopeInterface.memVars */
-ANTLRCommonTree *tree; // start of memVars()
-}
-
-// start properties
-@property (retain, getter=getTree, setter=setTree:) ANTLRCommonTree *tree;
-+ (SimpleCParser_forStat_return *)newSimpleCParser_forStat_return;
-// this is start of set and get methods
-/* AST returnScopeInterface.methodsdecl */
-- (ANTLRCommonTree *)getTree;
-- (void) setTree:(ANTLRCommonTree *)aTree;
-  // methodsDecl
-@end /* end of returnScopeInterface interface */
-@interface SimpleCParser_assignStat_return :ANTLRParserRuleReturnScope { // line 1672
-/* AST returnScopeInterface.memVars */
-ANTLRCommonTree *tree; // start of memVars()
-}
-
-// start properties
-@property (retain, getter=getTree, setter=setTree:) ANTLRCommonTree *tree;
-+ (SimpleCParser_assignStat_return *)newSimpleCParser_assignStat_return;
-// this is start of set and get methods
-/* AST returnScopeInterface.methodsdecl */
-- (ANTLRCommonTree *)getTree;
-- (void) setTree:(ANTLRCommonTree *)aTree;
-  // methodsDecl
-@end /* end of returnScopeInterface interface */
-@interface SimpleCParser_expr_return :ANTLRParserRuleReturnScope { // line 1672
-/* AST returnScopeInterface.memVars */
-ANTLRCommonTree *tree; // start of memVars()
-}
-
-// start properties
-@property (retain, getter=getTree, setter=setTree:) ANTLRCommonTree *tree;
-+ (SimpleCParser_expr_return *)newSimpleCParser_expr_return;
-// this is start of set and get methods
-/* AST returnScopeInterface.methodsdecl */
-- (ANTLRCommonTree *)getTree;
-- (void) setTree:(ANTLRCommonTree *)aTree;
-  // methodsDecl
-@end /* end of returnScopeInterface interface */
-@interface SimpleCParser_condExpr_return :ANTLRParserRuleReturnScope { // line 1672
-/* AST returnScopeInterface.memVars */
-ANTLRCommonTree *tree; // start of memVars()
-}
-
-// start properties
-@property (retain, getter=getTree, setter=setTree:) ANTLRCommonTree *tree;
-+ (SimpleCParser_condExpr_return *)newSimpleCParser_condExpr_return;
-// this is start of set and get methods
-/* AST returnScopeInterface.methodsdecl */
-- (ANTLRCommonTree *)getTree;
-- (void) setTree:(ANTLRCommonTree *)aTree;
-  // methodsDecl
-@end /* end of returnScopeInterface interface */
-@interface SimpleCParser_aexpr_return :ANTLRParserRuleReturnScope { // line 1672
-/* AST returnScopeInterface.memVars */
-ANTLRCommonTree *tree; // start of memVars()
-}
-
-// start properties
-@property (retain, getter=getTree, setter=setTree:) ANTLRCommonTree *tree;
-+ (SimpleCParser_aexpr_return *)newSimpleCParser_aexpr_return;
-// this is start of set and get methods
-/* AST returnScopeInterface.methodsdecl */
-- (ANTLRCommonTree *)getTree;
-- (void) setTree:(ANTLRCommonTree *)aTree;
-  // methodsDecl
-@end /* end of returnScopeInterface interface */
-@interface SimpleCParser_atom_return :ANTLRParserRuleReturnScope { // line 1672
-/* AST returnScopeInterface.memVars */
-ANTLRCommonTree *tree; // start of memVars()
-}
-
-// start properties
-@property (retain, getter=getTree, setter=setTree:) ANTLRCommonTree *tree;
-+ (SimpleCParser_atom_return *)newSimpleCParser_atom_return;
-// this is start of set and get methods
-/* AST returnScopeInterface.methodsdecl */
-- (ANTLRCommonTree *)getTree;
-- (void) setTree:(ANTLRCommonTree *)aTree;
-  // methodsDecl
-@end /* end of returnScopeInterface interface */
-
-#pragma mark Rule return scopes end
-@interface SimpleCParser : ANTLRParser { // line 529
-// start of globalAttributeScopeMemVar
-
-
-// start of action-actionScope-memVars
-// start of ruleAttributeScopeMemVar
-
-
-// Start of memVars
-/* AST parserHeaderFile.memVars */
-/* AST parsermemVars */
-id<ANTLRTreeAdaptor> treeAdaptor;
-
-DFA2 *dfa2;
- }
-
-// start of action-actionScope-methodsDecl
-
-/* AST parserHeaderFile.methodsdecl */
-/* AST parserMethodsDecl */
-- (id<ANTLRTreeAdaptor>) getTreeAdaptor;
-- (void) setTreeAdaptor:(id<ANTLRTreeAdaptor>)theTreeAdaptor;
-
-- (SimpleCParser_program_return *)program; 
-- (SimpleCParser_declaration_return *)declaration; 
-- (SimpleCParser_variable_return *)variable; 
-- (SimpleCParser_declarator_return *)declarator; 
-- (SimpleCParser_functionHeader_return *)functionHeader; 
-- (SimpleCParser_formalParameter_return *)formalParameter; 
-- (SimpleCParser_type_return *)type; 
-- (SimpleCParser_block_return *)block; 
-- (SimpleCParser_stat_return *)stat; 
-- (SimpleCParser_forStat_return *)forStat; 
-- (SimpleCParser_assignStat_return *)assignStat; 
-- (SimpleCParser_expr_return *)expr; 
-- (SimpleCParser_condExpr_return *)condExpr; 
-- (SimpleCParser_aexpr_return *)aexpr; 
-- (SimpleCParser_atom_return *)atom; 
-
-
-@end /* end of SimpleCParser interface */
diff --git a/runtime/ObjC/Framework/examples/simplecTreeParser/output1/SimpleCParser.java b/runtime/ObjC/Framework/examples/simplecTreeParser/output1/SimpleCParser.java
deleted file mode 100644
index 51bab3d..0000000
--- a/runtime/ObjC/Framework/examples/simplecTreeParser/output1/SimpleCParser.java
+++ /dev/null
@@ -1,1814 +0,0 @@
-// $ANTLR 3.2 Aug 13, 2010 19:41:25 /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g 2010-08-13 19:42:18
-
-import org.antlr.runtime.*;
-import java.util.Stack;
-import java.util.List;
-import java.util.ArrayList;
-
-
-import org.antlr.runtime.tree.*;
-
-public class SimpleCParser extends Parser {
-    public static final String[] tokenNames = new String[] {
-        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "VAR_DEF", "ARG_DEF", "FUNC_HDR", "FUNC_DECL", "FUNC_DEF", "BLOCK", "ID", "EQ", "INT", "FOR", "INT_TYPE", "CHAR", "VOID", "EQEQ", "LT", "PLUS", "WS", "';'", "'('", "','", "')'", "'{'", "'}'"
-    };
-    public static final int LT=18;
-    public static final int T__26=26;
-    public static final int T__25=25;
-    public static final int T__24=24;
-    public static final int T__23=23;
-    public static final int T__22=22;
-    public static final int T__21=21;
-    public static final int CHAR=15;
-    public static final int FOR=13;
-    public static final int FUNC_HDR=6;
-    public static final int INT=12;
-    public static final int FUNC_DEF=8;
-    public static final int INT_TYPE=14;
-    public static final int ID=10;
-    public static final int EOF=-1;
-    public static final int FUNC_DECL=7;
-    public static final int ARG_DEF=5;
-    public static final int WS=20;
-    public static final int BLOCK=9;
-    public static final int PLUS=19;
-    public static final int VOID=16;
-    public static final int EQ=11;
-    public static final int VAR_DEF=4;
-    public static final int EQEQ=17;
-
-    // delegates
-    // delegators
-
-
-        public SimpleCParser(TokenStream input) {
-            this(input, new RecognizerSharedState());
-        }
-        public SimpleCParser(TokenStream input, RecognizerSharedState state) {
-            super(input, state);
-             
-        }
-        
-    protected TreeAdaptor adaptor = new CommonTreeAdaptor();
-
-    public void setTreeAdaptor(TreeAdaptor adaptor) {
-        this.adaptor = adaptor;
-    }
-    public TreeAdaptor getTreeAdaptor() {
-        return adaptor;
-    }
-
-    public String[] getTokenNames() { return SimpleCParser.tokenNames; }
-    public String getGrammarFileName() { return "/usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g"; }
-
-
-    public static class program_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start "program"
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:16:1: program : ( declaration )+ ;
-    public final SimpleCParser.program_return program() throws RecognitionException {
-        SimpleCParser.program_return retval = new SimpleCParser.program_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        SimpleCParser.declaration_return declaration1 = null;
-
-
-
-        try {
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:17:5: ( ( declaration )+ )
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:17:9: ( declaration )+
-            {
-            root_0 = (Object)adaptor.nil();
-
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:17:9: ( declaration )+
-            int cnt1=0;
-            loop1:
-            do {
-                int alt1=2;
-                int LA1_0 = input.LA(1);
-
-                if ( (LA1_0==ID||(LA1_0>=INT_TYPE && LA1_0<=VOID)) ) {
-                    alt1=1;
-                }
-
-
-                switch (alt1) {
-            	case 1 :
-            	    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:17:9: declaration
-            	    {
-            	    pushFollow(FOLLOW_declaration_in_program85);
-            	    declaration1=declaration();
-
-            	    state._fsp--;
-
-            	    adaptor.addChild(root_0, declaration1.getTree());
-
-            	    }
-            	    break;
-
-            	default :
-            	    if ( cnt1 >= 1 ) break loop1;
-                        EarlyExitException eee =
-                            new EarlyExitException(1, input);
-                        throw eee;
-                }
-                cnt1++;
-            } while (true);
-
-
-            }
-
-            retval.stop = input.LT(-1);
-
-            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
-            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);
-
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end "program"
-
-    public static class declaration_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start "declaration"
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:20:1: declaration : ( variable | functionHeader ';' -> ^( FUNC_DECL functionHeader ) | functionHeader block -> ^( FUNC_DEF functionHeader block ) );
-    public final SimpleCParser.declaration_return declaration() throws RecognitionException {
-        SimpleCParser.declaration_return retval = new SimpleCParser.declaration_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        Token char_literal4=null;
-        SimpleCParser.variable_return variable2 = null;
-
-        SimpleCParser.functionHeader_return functionHeader3 = null;
-
-        SimpleCParser.functionHeader_return functionHeader5 = null;
-
-        SimpleCParser.block_return block6 = null;
-
-
-        Object char_literal4_tree=null;
-        RewriteRuleTokenStream stream_21=new RewriteRuleTokenStream(adaptor,"token 21");
-        RewriteRuleSubtreeStream stream_functionHeader=new RewriteRuleSubtreeStream(adaptor,"rule functionHeader");
-        RewriteRuleSubtreeStream stream_block=new RewriteRuleSubtreeStream(adaptor,"rule block");
-        try {
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:21:5: ( variable | functionHeader ';' -> ^( FUNC_DECL functionHeader ) | functionHeader block -> ^( FUNC_DEF functionHeader block ) )
-            int alt2=3;
-            alt2 = dfa2.predict(input);
-            switch (alt2) {
-                case 1 :
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:21:9: variable
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    pushFollow(FOLLOW_variable_in_declaration105);
-                    variable2=variable();
-
-                    state._fsp--;
-
-                    adaptor.addChild(root_0, variable2.getTree());
-
-                    }
-                    break;
-                case 2 :
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:22:9: functionHeader ';'
-                    {
-                    pushFollow(FOLLOW_functionHeader_in_declaration115);
-                    functionHeader3=functionHeader();
-
-                    state._fsp--;
-
-                    stream_functionHeader.add(functionHeader3.getTree());
-                    char_literal4=(Token)match(input,21,FOLLOW_21_in_declaration117);  
-                    stream_21.add(char_literal4);
-
-
-
-                    // AST REWRITE
-                    // elements: functionHeader
-                    // token labels: 
-                    // rule labels: retval
-                    // token list labels: 
-                    // rule list labels: 
-                    // wildcard labels: 
-                    retval.tree = root_0;
-                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);
-
-                    root_0 = (Object)adaptor.nil();
-                    // 22:28: -> ^( FUNC_DECL functionHeader )
-                    {
-                        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:22:31: ^( FUNC_DECL functionHeader )
-                        {
-                        Object root_1 = (Object)adaptor.nil();
-                        root_1 = (Object)adaptor.becomeRoot((Object)adaptor.create(FUNC_DECL, "FUNC_DECL"), root_1);
-
-                        adaptor.addChild(root_1, stream_functionHeader.nextTree());
-
-                        adaptor.addChild(root_0, root_1);
-                        }
-
-                    }
-
-                    retval.tree = root_0;
-                    }
-                    break;
-                case 3 :
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:23:9: functionHeader block
-                    {
-                    pushFollow(FOLLOW_functionHeader_in_declaration135);
-                    functionHeader5=functionHeader();
-
-                    state._fsp--;
-
-                    stream_functionHeader.add(functionHeader5.getTree());
-                    pushFollow(FOLLOW_block_in_declaration137);
-                    block6=block();
-
-                    state._fsp--;
-
-                    stream_block.add(block6.getTree());
-
-
-                    // AST REWRITE
-                    // elements: functionHeader, block
-                    // token labels: 
-                    // rule labels: retval
-                    // token list labels: 
-                    // rule list labels: 
-                    // wildcard labels: 
-                    retval.tree = root_0;
-                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);
-
-                    root_0 = (Object)adaptor.nil();
-                    // 23:30: -> ^( FUNC_DEF functionHeader block )
-                    {
-                        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:23:33: ^( FUNC_DEF functionHeader block )
-                        {
-                        Object root_1 = (Object)adaptor.nil();
-                        root_1 = (Object)adaptor.becomeRoot((Object)adaptor.create(FUNC_DEF, "FUNC_DEF"), root_1);
-
-                        adaptor.addChild(root_1, stream_functionHeader.nextTree());
-                        adaptor.addChild(root_1, stream_block.nextTree());
-
-                        adaptor.addChild(root_0, root_1);
-                        }
-
-                    }
-
-                    retval.tree = root_0;
-                    }
-                    break;
-
-            }
-            retval.stop = input.LT(-1);
-
-            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
-            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);
-
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end "declaration"
-
-    public static class variable_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start "variable"
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:26:1: variable : type declarator ';' -> ^( VAR_DEF type declarator ) ;
-    public final SimpleCParser.variable_return variable() throws RecognitionException {
-        SimpleCParser.variable_return retval = new SimpleCParser.variable_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        Token char_literal9=null;
-        SimpleCParser.type_return type7 = null;
-
-        SimpleCParser.declarator_return declarator8 = null;
-
-
-        Object char_literal9_tree=null;
-        RewriteRuleTokenStream stream_21=new RewriteRuleTokenStream(adaptor,"token 21");
-        RewriteRuleSubtreeStream stream_declarator=new RewriteRuleSubtreeStream(adaptor,"rule declarator");
-        RewriteRuleSubtreeStream stream_type=new RewriteRuleSubtreeStream(adaptor,"rule type");
-        try {
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:27:5: ( type declarator ';' -> ^( VAR_DEF type declarator ) )
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:27:9: type declarator ';'
-            {
-            pushFollow(FOLLOW_type_in_variable166);
-            type7=type();
-
-            state._fsp--;
-
-            stream_type.add(type7.getTree());
-            pushFollow(FOLLOW_declarator_in_variable168);
-            declarator8=declarator();
-
-            state._fsp--;
-
-            stream_declarator.add(declarator8.getTree());
-            char_literal9=(Token)match(input,21,FOLLOW_21_in_variable170);  
-            stream_21.add(char_literal9);
-
-
-
-            // AST REWRITE
-            // elements: type, declarator
-            // token labels: 
-            // rule labels: retval
-            // token list labels: 
-            // rule list labels: 
-            // wildcard labels: 
-            retval.tree = root_0;
-            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);
-
-            root_0 = (Object)adaptor.nil();
-            // 27:29: -> ^( VAR_DEF type declarator )
-            {
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:27:32: ^( VAR_DEF type declarator )
-                {
-                Object root_1 = (Object)adaptor.nil();
-                root_1 = (Object)adaptor.becomeRoot((Object)adaptor.create(VAR_DEF, "VAR_DEF"), root_1);
-
-                adaptor.addChild(root_1, stream_type.nextTree());
-                adaptor.addChild(root_1, stream_declarator.nextTree());
-
-                adaptor.addChild(root_0, root_1);
-                }
-
-            }
-
-            retval.tree = root_0;
-            }
-
-            retval.stop = input.LT(-1);
-
-            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
-            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);
-
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end "variable"
-
-    public static class declarator_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start "declarator"
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:30:1: declarator : ID ;
-    public final SimpleCParser.declarator_return declarator() throws RecognitionException {
-        SimpleCParser.declarator_return retval = new SimpleCParser.declarator_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        Token ID10=null;
-
-        Object ID10_tree=null;
-
-        try {
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:31:5: ( ID )
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:31:9: ID
-            {
-            root_0 = (Object)adaptor.nil();
-
-            ID10=(Token)match(input,ID,FOLLOW_ID_in_declarator199); 
-            ID10_tree = (Object)adaptor.create(ID10);
-            adaptor.addChild(root_0, ID10_tree);
-
-
-            }
-
-            retval.stop = input.LT(-1);
-
-            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
-            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);
-
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end "declarator"
-
-    public static class functionHeader_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start "functionHeader"
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:34:1: functionHeader : type ID '(' ( formalParameter ( ',' formalParameter )* )? ')' -> ^( FUNC_HDR type ID ( formalParameter )+ ) ;
-    public final SimpleCParser.functionHeader_return functionHeader() throws RecognitionException {
-        SimpleCParser.functionHeader_return retval = new SimpleCParser.functionHeader_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        Token ID12=null;
-        Token char_literal13=null;
-        Token char_literal15=null;
-        Token char_literal17=null;
-        SimpleCParser.type_return type11 = null;
-
-        SimpleCParser.formalParameter_return formalParameter14 = null;
-
-        SimpleCParser.formalParameter_return formalParameter16 = null;
-
-
-        Object ID12_tree=null;
-        Object char_literal13_tree=null;
-        Object char_literal15_tree=null;
-        Object char_literal17_tree=null;
-        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
-        RewriteRuleTokenStream stream_22=new RewriteRuleTokenStream(adaptor,"token 22");
-        RewriteRuleTokenStream stream_23=new RewriteRuleTokenStream(adaptor,"token 23");
-        RewriteRuleTokenStream stream_24=new RewriteRuleTokenStream(adaptor,"token 24");
-        RewriteRuleSubtreeStream stream_formalParameter=new RewriteRuleSubtreeStream(adaptor,"rule formalParameter");
-        RewriteRuleSubtreeStream stream_type=new RewriteRuleSubtreeStream(adaptor,"rule type");
-        try {
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:35:5: ( type ID '(' ( formalParameter ( ',' formalParameter )* )? ')' -> ^( FUNC_HDR type ID ( formalParameter )+ ) )
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:35:9: type ID '(' ( formalParameter ( ',' formalParameter )* )? ')'
-            {
-            pushFollow(FOLLOW_type_in_functionHeader219);
-            type11=type();
-
-            state._fsp--;
-
-            stream_type.add(type11.getTree());
-            ID12=(Token)match(input,ID,FOLLOW_ID_in_functionHeader221);  
-            stream_ID.add(ID12);
-
-            char_literal13=(Token)match(input,22,FOLLOW_22_in_functionHeader223);  
-            stream_22.add(char_literal13);
-
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:35:21: ( formalParameter ( ',' formalParameter )* )?
-            int alt4=2;
-            int LA4_0 = input.LA(1);
-
-            if ( (LA4_0==ID||(LA4_0>=INT_TYPE && LA4_0<=VOID)) ) {
-                alt4=1;
-            }
-            switch (alt4) {
-                case 1 :
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:35:23: formalParameter ( ',' formalParameter )*
-                    {
-                    pushFollow(FOLLOW_formalParameter_in_functionHeader227);
-                    formalParameter14=formalParameter();
-
-                    state._fsp--;
-
-                    stream_formalParameter.add(formalParameter14.getTree());
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:35:39: ( ',' formalParameter )*
-                    loop3:
-                    do {
-                        int alt3=2;
-                        int LA3_0 = input.LA(1);
-
-                        if ( (LA3_0==23) ) {
-                            alt3=1;
-                        }
-
-
-                        switch (alt3) {
-                    	case 1 :
-                    	    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:35:41: ',' formalParameter
-                    	    {
-                    	    char_literal15=(Token)match(input,23,FOLLOW_23_in_functionHeader231);  
-                    	    stream_23.add(char_literal15);
-
-                    	    pushFollow(FOLLOW_formalParameter_in_functionHeader233);
-                    	    formalParameter16=formalParameter();
-
-                    	    state._fsp--;
-
-                    	    stream_formalParameter.add(formalParameter16.getTree());
-
-                    	    }
-                    	    break;
-
-                    	default :
-                    	    break loop3;
-                        }
-                    } while (true);
-
-
-                    }
-                    break;
-
-            }
-
-            char_literal17=(Token)match(input,24,FOLLOW_24_in_functionHeader241);  
-            stream_24.add(char_literal17);
-
-
-
-            // AST REWRITE
-            // elements: formalParameter, ID, type
-            // token labels: 
-            // rule labels: retval
-            // token list labels: 
-            // rule list labels: 
-            // wildcard labels: 
-            retval.tree = root_0;
-            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);
-
-            root_0 = (Object)adaptor.nil();
-            // 36:9: -> ^( FUNC_HDR type ID ( formalParameter )+ )
-            {
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:36:12: ^( FUNC_HDR type ID ( formalParameter )+ )
-                {
-                Object root_1 = (Object)adaptor.nil();
-                root_1 = (Object)adaptor.becomeRoot((Object)adaptor.create(FUNC_HDR, "FUNC_HDR"), root_1);
-
-                adaptor.addChild(root_1, stream_type.nextTree());
-                adaptor.addChild(root_1, stream_ID.nextNode());
-                if ( !(stream_formalParameter.hasNext()) ) {
-                    throw new RewriteEarlyExitException();
-                }
-                while ( stream_formalParameter.hasNext() ) {
-                    adaptor.addChild(root_1, stream_formalParameter.nextTree());
-
-                }
-                stream_formalParameter.reset();
-
-                adaptor.addChild(root_0, root_1);
-                }
-
-            }
-
-            retval.tree = root_0;
-            }
-
-            retval.stop = input.LT(-1);
-
-            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
-            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);
-
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end "functionHeader"
-
-    public static class formalParameter_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start "formalParameter"
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:39:1: formalParameter : type declarator -> ^( ARG_DEF type declarator ) ;
-    public final SimpleCParser.formalParameter_return formalParameter() throws RecognitionException {
-        SimpleCParser.formalParameter_return retval = new SimpleCParser.formalParameter_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        SimpleCParser.type_return type18 = null;
-
-        SimpleCParser.declarator_return declarator19 = null;
-
-
-        RewriteRuleSubtreeStream stream_declarator=new RewriteRuleSubtreeStream(adaptor,"rule declarator");
-        RewriteRuleSubtreeStream stream_type=new RewriteRuleSubtreeStream(adaptor,"rule type");
-        try {
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:40:5: ( type declarator -> ^( ARG_DEF type declarator ) )
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:40:9: type declarator
-            {
-            pushFollow(FOLLOW_type_in_formalParameter281);
-            type18=type();
-
-            state._fsp--;
-
-            stream_type.add(type18.getTree());
-            pushFollow(FOLLOW_declarator_in_formalParameter283);
-            declarator19=declarator();
-
-            state._fsp--;
-
-            stream_declarator.add(declarator19.getTree());
-
-
-            // AST REWRITE
-            // elements: declarator, type
-            // token labels: 
-            // rule labels: retval
-            // token list labels: 
-            // rule list labels: 
-            // wildcard labels: 
-            retval.tree = root_0;
-            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);
-
-            root_0 = (Object)adaptor.nil();
-            // 40:25: -> ^( ARG_DEF type declarator )
-            {
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:40:28: ^( ARG_DEF type declarator )
-                {
-                Object root_1 = (Object)adaptor.nil();
-                root_1 = (Object)adaptor.becomeRoot((Object)adaptor.create(ARG_DEF, "ARG_DEF"), root_1);
-
-                adaptor.addChild(root_1, stream_type.nextTree());
-                adaptor.addChild(root_1, stream_declarator.nextTree());
-
-                adaptor.addChild(root_0, root_1);
-                }
-
-            }
-
-            retval.tree = root_0;
-            }
-
-            retval.stop = input.LT(-1);
-
-            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
-            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);
-
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end "formalParameter"
-
-    public static class type_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start "type"
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:43:1: type : ( 'int' | 'char' | 'void' | ID );
-    public final SimpleCParser.type_return type() throws RecognitionException {
-        SimpleCParser.type_return retval = new SimpleCParser.type_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        Token set20=null;
-
-        Object set20_tree=null;
-
-        try {
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:44:5: ( 'int' | 'char' | 'void' | ID )
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:
-            {
-            root_0 = (Object)adaptor.nil();
-
-            set20=(Token)input.LT(1);
-            if ( input.LA(1)==ID||(input.LA(1)>=INT_TYPE && input.LA(1)<=VOID) ) {
-                input.consume();
-                adaptor.addChild(root_0, (Object)adaptor.create(set20));
-                state.errorRecovery=false;
-            }
-            else {
-                MismatchedSetException mse = new MismatchedSetException(null,input);
-                throw mse;
-            }
-
-
-            }
-
-            retval.stop = input.LT(-1);
-
-            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
-            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);
-
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end "type"
-
-    public static class block_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start "block"
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:50:1: block : lc= '{' ( variable )* ( stat )* '}' -> ^( BLOCK[$lc,@\"BLOCK\"] ( variable )* ( stat )* ) ;
-    public final SimpleCParser.block_return block() throws RecognitionException {
-        SimpleCParser.block_return retval = new SimpleCParser.block_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        Token lc=null;
-        Token char_literal23=null;
-        SimpleCParser.variable_return variable21 = null;
-
-        SimpleCParser.stat_return stat22 = null;
-
-
-        Object lc_tree=null;
-        Object char_literal23_tree=null;
-        RewriteRuleTokenStream stream_25=new RewriteRuleTokenStream(adaptor,"token 25");
-        RewriteRuleTokenStream stream_26=new RewriteRuleTokenStream(adaptor,"token 26");
-        RewriteRuleSubtreeStream stream_variable=new RewriteRuleSubtreeStream(adaptor,"rule variable");
-        RewriteRuleSubtreeStream stream_stat=new RewriteRuleSubtreeStream(adaptor,"rule stat");
-        try {
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:51:5: (lc= '{' ( variable )* ( stat )* '}' -> ^( BLOCK[$lc,@\"BLOCK\"] ( variable )* ( stat )* ) )
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:51:9: lc= '{' ( variable )* ( stat )* '}'
-            {
-            lc=(Token)match(input,25,FOLLOW_25_in_block376);  
-            stream_25.add(lc);
-
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:52:13: ( variable )*
-            loop5:
-            do {
-                int alt5=2;
-                int LA5_0 = input.LA(1);
-
-                if ( (LA5_0==ID) ) {
-                    int LA5_2 = input.LA(2);
-
-                    if ( (LA5_2==ID) ) {
-                        alt5=1;
-                    }
-
-
-                }
-                else if ( ((LA5_0>=INT_TYPE && LA5_0<=VOID)) ) {
-                    alt5=1;
-                }
-
-
-                switch (alt5) {
-            	case 1 :
-            	    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:52:13: variable
-            	    {
-            	    pushFollow(FOLLOW_variable_in_block390);
-            	    variable21=variable();
-
-            	    state._fsp--;
-
-            	    stream_variable.add(variable21.getTree());
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop5;
-                }
-            } while (true);
-
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:53:13: ( stat )*
-            loop6:
-            do {
-                int alt6=2;
-                int LA6_0 = input.LA(1);
-
-                if ( (LA6_0==ID||(LA6_0>=INT && LA6_0<=FOR)||(LA6_0>=21 && LA6_0<=22)||LA6_0==25) ) {
-                    alt6=1;
-                }
-
-
-                switch (alt6) {
-            	case 1 :
-            	    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:53:13: stat
-            	    {
-            	    pushFollow(FOLLOW_stat_in_block405);
-            	    stat22=stat();
-
-            	    state._fsp--;
-
-            	    stream_stat.add(stat22.getTree());
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop6;
-                }
-            } while (true);
-
-            char_literal23=(Token)match(input,26,FOLLOW_26_in_block416);  
-            stream_26.add(char_literal23);
-
-
-
-            // AST REWRITE
-            // elements: variable, stat
-            // token labels: 
-            // rule labels: retval
-            // token list labels: 
-            // rule list labels: 
-            // wildcard labels: 
-            retval.tree = root_0;
-            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);
-
-            root_0 = (Object)adaptor.nil();
-            // 55:9: -> ^( BLOCK[$lc,@\"BLOCK\"] ( variable )* ( stat )* )
-            {
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:55:12: ^( BLOCK[$lc,@\"BLOCK\"] ( variable )* ( stat )* )
-                {
-                Object root_1 = (Object)adaptor.nil();
-                root_1 = (Object)adaptor.becomeRoot((Object)adaptor.create(BLOCK, lc, @"BLOCK"), root_1);
-
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:55:34: ( variable )*
-                while ( stream_variable.hasNext() ) {
-                    adaptor.addChild(root_1, stream_variable.nextTree());
-
-                }
-                stream_variable.reset();
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:55:44: ( stat )*
-                while ( stream_stat.hasNext() ) {
-                    adaptor.addChild(root_1, stream_stat.nextTree());
-
-                }
-                stream_stat.reset();
-
-                adaptor.addChild(root_0, root_1);
-                }
-
-            }
-
-            retval.tree = root_0;
-            }
-
-            retval.stop = input.LT(-1);
-
-            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
-            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);
-
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end "block"
-
-    public static class stat_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start "stat"
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:58:1: stat : ( forStat | expr ';' | block | assignStat ';' | ';' );
-    public final SimpleCParser.stat_return stat() throws RecognitionException {
-        SimpleCParser.stat_return retval = new SimpleCParser.stat_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        Token char_literal26=null;
-        Token char_literal29=null;
-        Token char_literal30=null;
-        SimpleCParser.forStat_return forStat24 = null;
-
-        SimpleCParser.expr_return expr25 = null;
-
-        SimpleCParser.block_return block27 = null;
-
-        SimpleCParser.assignStat_return assignStat28 = null;
-
-
-        Object char_literal26_tree=null;
-        Object char_literal29_tree=null;
-        Object char_literal30_tree=null;
-
-        try {
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:58:5: ( forStat | expr ';' | block | assignStat ';' | ';' )
-            int alt7=5;
-            switch ( input.LA(1) ) {
-            case FOR:
-                {
-                alt7=1;
-                }
-                break;
-            case ID:
-                {
-                int LA7_2 = input.LA(2);
-
-                if ( (LA7_2==EQ) ) {
-                    alt7=4;
-                }
-                else if ( ((LA7_2>=EQEQ && LA7_2<=PLUS)||LA7_2==21) ) {
-                    alt7=2;
-                }
-                else {
-                    NoViableAltException nvae =
-                        new NoViableAltException("", 7, 2, input);
-
-                    throw nvae;
-                }
-                }
-                break;
-            case INT:
-            case 22:
-                {
-                alt7=2;
-                }
-                break;
-            case 25:
-                {
-                alt7=3;
-                }
-                break;
-            case 21:
-                {
-                alt7=5;
-                }
-                break;
-            default:
-                NoViableAltException nvae =
-                    new NoViableAltException("", 7, 0, input);
-
-                throw nvae;
-            }
-
-            switch (alt7) {
-                case 1 :
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:58:7: forStat
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    pushFollow(FOLLOW_forStat_in_stat449);
-                    forStat24=forStat();
-
-                    state._fsp--;
-
-                    adaptor.addChild(root_0, forStat24.getTree());
-
-                    }
-                    break;
-                case 2 :
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:59:7: expr ';'
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    pushFollow(FOLLOW_expr_in_stat457);
-                    expr25=expr();
-
-                    state._fsp--;
-
-                    adaptor.addChild(root_0, expr25.getTree());
-                    char_literal26=(Token)match(input,21,FOLLOW_21_in_stat459); 
-
-                    }
-                    break;
-                case 3 :
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:60:7: block
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    pushFollow(FOLLOW_block_in_stat468);
-                    block27=block();
-
-                    state._fsp--;
-
-                    adaptor.addChild(root_0, block27.getTree());
-
-                    }
-                    break;
-                case 4 :
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:61:7: assignStat ';'
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    pushFollow(FOLLOW_assignStat_in_stat476);
-                    assignStat28=assignStat();
-
-                    state._fsp--;
-
-                    adaptor.addChild(root_0, assignStat28.getTree());
-                    char_literal29=(Token)match(input,21,FOLLOW_21_in_stat478); 
-
-                    }
-                    break;
-                case 5 :
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:62:7: ';'
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    char_literal30=(Token)match(input,21,FOLLOW_21_in_stat487); 
-
-                    }
-                    break;
-
-            }
-            retval.stop = input.LT(-1);
-
-            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
-            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);
-
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end "stat"
-
-    public static class forStat_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start "forStat"
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:65:1: forStat : 'for' '(' start= assignStat ';' expr ';' next= assignStat ')' block -> ^( 'for' $start expr $next block ) ;
-    public final SimpleCParser.forStat_return forStat() throws RecognitionException {
-        SimpleCParser.forStat_return retval = new SimpleCParser.forStat_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        Token string_literal31=null;
-        Token char_literal32=null;
-        Token char_literal33=null;
-        Token char_literal35=null;
-        Token char_literal36=null;
-        SimpleCParser.assignStat_return start = null;
-
-        SimpleCParser.assignStat_return next = null;
-
-        SimpleCParser.expr_return expr34 = null;
-
-        SimpleCParser.block_return block37 = null;
-
-
-        Object string_literal31_tree=null;
-        Object char_literal32_tree=null;
-        Object char_literal33_tree=null;
-        Object char_literal35_tree=null;
-        Object char_literal36_tree=null;
-        RewriteRuleTokenStream stream_21=new RewriteRuleTokenStream(adaptor,"token 21");
-        RewriteRuleTokenStream stream_FOR=new RewriteRuleTokenStream(adaptor,"token FOR");
-        RewriteRuleTokenStream stream_22=new RewriteRuleTokenStream(adaptor,"token 22");
-        RewriteRuleTokenStream stream_24=new RewriteRuleTokenStream(adaptor,"token 24");
-        RewriteRuleSubtreeStream stream_assignStat=new RewriteRuleSubtreeStream(adaptor,"rule assignStat");
-        RewriteRuleSubtreeStream stream_block=new RewriteRuleSubtreeStream(adaptor,"rule block");
-        RewriteRuleSubtreeStream stream_expr=new RewriteRuleSubtreeStream(adaptor,"rule expr");
-        try {
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:66:5: ( 'for' '(' start= assignStat ';' expr ';' next= assignStat ')' block -> ^( 'for' $start expr $next block ) )
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:66:9: 'for' '(' start= assignStat ';' expr ';' next= assignStat ')' block
-            {
-            string_literal31=(Token)match(input,FOR,FOLLOW_FOR_in_forStat507);  
-            stream_FOR.add(string_literal31);
-
-            char_literal32=(Token)match(input,22,FOLLOW_22_in_forStat509);  
-            stream_22.add(char_literal32);
-
-            pushFollow(FOLLOW_assignStat_in_forStat513);
-            start=assignStat();
-
-            state._fsp--;
-
-            stream_assignStat.add(start.getTree());
-            char_literal33=(Token)match(input,21,FOLLOW_21_in_forStat515);  
-            stream_21.add(char_literal33);
-
-            pushFollow(FOLLOW_expr_in_forStat517);
-            expr34=expr();
-
-            state._fsp--;
-
-            stream_expr.add(expr34.getTree());
-            char_literal35=(Token)match(input,21,FOLLOW_21_in_forStat519);  
-            stream_21.add(char_literal35);
-
-            pushFollow(FOLLOW_assignStat_in_forStat523);
-            next=assignStat();
-
-            state._fsp--;
-
-            stream_assignStat.add(next.getTree());
-            char_literal36=(Token)match(input,24,FOLLOW_24_in_forStat525);  
-            stream_24.add(char_literal36);
-
-            pushFollow(FOLLOW_block_in_forStat527);
-            block37=block();
-
-            state._fsp--;
-
-            stream_block.add(block37.getTree());
-
-
-            // AST REWRITE
-            // elements: block, expr, FOR, start, next
-            // token labels: 
-            // rule labels: retval, start, next
-            // token list labels: 
-            // rule list labels: 
-            // wildcard labels: 
-            retval.tree = root_0;
-            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);
-            RewriteRuleSubtreeStream stream_start=new RewriteRuleSubtreeStream(adaptor,"rule start",start!=null?start.tree:null);
-            RewriteRuleSubtreeStream stream_next=new RewriteRuleSubtreeStream(adaptor,"rule next",next!=null?next.tree:null);
-
-            root_0 = (Object)adaptor.nil();
-            // 67:9: -> ^( 'for' $start expr $next block )
-            {
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:67:12: ^( 'for' $start expr $next block )
-                {
-                Object root_1 = (Object)adaptor.nil();
-                root_1 = (Object)adaptor.becomeRoot(stream_FOR.nextNode(), root_1);
-
-                adaptor.addChild(root_1, stream_start.nextTree());
-                adaptor.addChild(root_1, stream_expr.nextTree());
-                adaptor.addChild(root_1, stream_next.nextTree());
-                adaptor.addChild(root_1, stream_block.nextTree());
-
-                adaptor.addChild(root_0, root_1);
-                }
-
-            }
-
-            retval.tree = root_0;
-            }
-
-            retval.stop = input.LT(-1);
-
-            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
-            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);
-
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end "forStat"
-
-    public static class assignStat_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start "assignStat"
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:70:1: assignStat : ID EQ expr -> ^( EQ ID expr ) ;
-    public final SimpleCParser.assignStat_return assignStat() throws RecognitionException {
-        SimpleCParser.assignStat_return retval = new SimpleCParser.assignStat_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        Token ID38=null;
-        Token EQ39=null;
-        SimpleCParser.expr_return expr40 = null;
-
-
-        Object ID38_tree=null;
-        Object EQ39_tree=null;
-        RewriteRuleTokenStream stream_EQ=new RewriteRuleTokenStream(adaptor,"token EQ");
-        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
-        RewriteRuleSubtreeStream stream_expr=new RewriteRuleSubtreeStream(adaptor,"rule expr");
-        try {
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:71:5: ( ID EQ expr -> ^( EQ ID expr ) )
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:71:9: ID EQ expr
-            {
-            ID38=(Token)match(input,ID,FOLLOW_ID_in_assignStat570);  
-            stream_ID.add(ID38);
-
-            EQ39=(Token)match(input,EQ,FOLLOW_EQ_in_assignStat572);  
-            stream_EQ.add(EQ39);
-
-            pushFollow(FOLLOW_expr_in_assignStat574);
-            expr40=expr();
-
-            state._fsp--;
-
-            stream_expr.add(expr40.getTree());
-
-
-            // AST REWRITE
-            // elements: EQ, expr, ID
-            // token labels: 
-            // rule labels: retval
-            // token list labels: 
-            // rule list labels: 
-            // wildcard labels: 
-            retval.tree = root_0;
-            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);
-
-            root_0 = (Object)adaptor.nil();
-            // 71:20: -> ^( EQ ID expr )
-            {
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:71:23: ^( EQ ID expr )
-                {
-                Object root_1 = (Object)adaptor.nil();
-                root_1 = (Object)adaptor.becomeRoot(stream_EQ.nextNode(), root_1);
-
-                adaptor.addChild(root_1, stream_ID.nextNode());
-                adaptor.addChild(root_1, stream_expr.nextTree());
-
-                adaptor.addChild(root_0, root_1);
-                }
-
-            }
-
-            retval.tree = root_0;
-            }
-
-            retval.stop = input.LT(-1);
-
-            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
-            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);
-
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end "assignStat"
-
-    public static class expr_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start "expr"
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:74:1: expr : condExpr ;
-    public final SimpleCParser.expr_return expr() throws RecognitionException {
-        SimpleCParser.expr_return retval = new SimpleCParser.expr_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        SimpleCParser.condExpr_return condExpr41 = null;
-
-
-
-        try {
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:74:5: ( condExpr )
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:74:9: condExpr
-            {
-            root_0 = (Object)adaptor.nil();
-
-            pushFollow(FOLLOW_condExpr_in_expr598);
-            condExpr41=condExpr();
-
-            state._fsp--;
-
-            adaptor.addChild(root_0, condExpr41.getTree());
-
-            }
-
-            retval.stop = input.LT(-1);
-
-            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
-            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);
-
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end "expr"
-
-    public static class condExpr_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start "condExpr"
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:77:1: condExpr : aexpr ( ( '==' | '<' ) aexpr )? ;
-    public final SimpleCParser.condExpr_return condExpr() throws RecognitionException {
-        SimpleCParser.condExpr_return retval = new SimpleCParser.condExpr_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        Token string_literal43=null;
-        Token char_literal44=null;
-        SimpleCParser.aexpr_return aexpr42 = null;
-
-        SimpleCParser.aexpr_return aexpr45 = null;
-
-
-        Object string_literal43_tree=null;
-        Object char_literal44_tree=null;
-
-        try {
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:78:5: ( aexpr ( ( '==' | '<' ) aexpr )? )
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:78:9: aexpr ( ( '==' | '<' ) aexpr )?
-            {
-            root_0 = (Object)adaptor.nil();
-
-            pushFollow(FOLLOW_aexpr_in_condExpr617);
-            aexpr42=aexpr();
-
-            state._fsp--;
-
-            adaptor.addChild(root_0, aexpr42.getTree());
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:78:15: ( ( '==' | '<' ) aexpr )?
-            int alt9=2;
-            int LA9_0 = input.LA(1);
-
-            if ( ((LA9_0>=EQEQ && LA9_0<=LT)) ) {
-                alt9=1;
-            }
-            switch (alt9) {
-                case 1 :
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:78:17: ( '==' | '<' ) aexpr
-                    {
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:78:17: ( '==' | '<' )
-                    int alt8=2;
-                    int LA8_0 = input.LA(1);
-
-                    if ( (LA8_0==EQEQ) ) {
-                        alt8=1;
-                    }
-                    else if ( (LA8_0==LT) ) {
-                        alt8=2;
-                    }
-                    else {
-                        NoViableAltException nvae =
-                            new NoViableAltException("", 8, 0, input);
-
-                        throw nvae;
-                    }
-                    switch (alt8) {
-                        case 1 :
-                            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:78:18: '=='
-                            {
-                            string_literal43=(Token)match(input,EQEQ,FOLLOW_EQEQ_in_condExpr622); 
-                            string_literal43_tree = (Object)adaptor.create(string_literal43);
-                            root_0 = (Object)adaptor.becomeRoot(string_literal43_tree, root_0);
-
-
-                            }
-                            break;
-                        case 2 :
-                            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:78:26: '<'
-                            {
-                            char_literal44=(Token)match(input,LT,FOLLOW_LT_in_condExpr627); 
-                            char_literal44_tree = (Object)adaptor.create(char_literal44);
-                            root_0 = (Object)adaptor.becomeRoot(char_literal44_tree, root_0);
-
-
-                            }
-                            break;
-
-                    }
-
-                    pushFollow(FOLLOW_aexpr_in_condExpr631);
-                    aexpr45=aexpr();
-
-                    state._fsp--;
-
-                    adaptor.addChild(root_0, aexpr45.getTree());
-
-                    }
-                    break;
-
-            }
-
-
-            }
-
-            retval.stop = input.LT(-1);
-
-            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
-            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);
-
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end "condExpr"
-
-    public static class aexpr_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start "aexpr"
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:81:1: aexpr : atom ( '+' atom )* ;
-    public final SimpleCParser.aexpr_return aexpr() throws RecognitionException {
-        SimpleCParser.aexpr_return retval = new SimpleCParser.aexpr_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        Token char_literal47=null;
-        SimpleCParser.atom_return atom46 = null;
-
-        SimpleCParser.atom_return atom48 = null;
-
-
-        Object char_literal47_tree=null;
-
-        try {
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:82:5: ( atom ( '+' atom )* )
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:82:9: atom ( '+' atom )*
-            {
-            root_0 = (Object)adaptor.nil();
-
-            pushFollow(FOLLOW_atom_in_aexpr653);
-            atom46=atom();
-
-            state._fsp--;
-
-            adaptor.addChild(root_0, atom46.getTree());
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:82:14: ( '+' atom )*
-            loop10:
-            do {
-                int alt10=2;
-                int LA10_0 = input.LA(1);
-
-                if ( (LA10_0==PLUS) ) {
-                    alt10=1;
-                }
-
-
-                switch (alt10) {
-            	case 1 :
-            	    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:82:16: '+' atom
-            	    {
-            	    char_literal47=(Token)match(input,PLUS,FOLLOW_PLUS_in_aexpr657); 
-            	    char_literal47_tree = (Object)adaptor.create(char_literal47);
-            	    root_0 = (Object)adaptor.becomeRoot(char_literal47_tree, root_0);
-
-            	    pushFollow(FOLLOW_atom_in_aexpr660);
-            	    atom48=atom();
-
-            	    state._fsp--;
-
-            	    adaptor.addChild(root_0, atom48.getTree());
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop10;
-                }
-            } while (true);
-
-
-            }
-
-            retval.stop = input.LT(-1);
-
-            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
-            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);
-
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end "aexpr"
-
-    public static class atom_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start "atom"
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:85:1: atom : ( ID | INT | '(' expr ')' -> expr );
-    public final SimpleCParser.atom_return atom() throws RecognitionException {
-        SimpleCParser.atom_return retval = new SimpleCParser.atom_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        Token ID49=null;
-        Token INT50=null;
-        Token char_literal51=null;
-        Token char_literal53=null;
-        SimpleCParser.expr_return expr52 = null;
-
-
-        Object ID49_tree=null;
-        Object INT50_tree=null;
-        Object char_literal51_tree=null;
-        Object char_literal53_tree=null;
-        RewriteRuleTokenStream stream_22=new RewriteRuleTokenStream(adaptor,"token 22");
-        RewriteRuleTokenStream stream_24=new RewriteRuleTokenStream(adaptor,"token 24");
-        RewriteRuleSubtreeStream stream_expr=new RewriteRuleSubtreeStream(adaptor,"rule expr");
-        try {
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:86:5: ( ID | INT | '(' expr ')' -> expr )
-            int alt11=3;
-            switch ( input.LA(1) ) {
-            case ID:
-                {
-                alt11=1;
-                }
-                break;
-            case INT:
-                {
-                alt11=2;
-                }
-                break;
-            case 22:
-                {
-                alt11=3;
-                }
-                break;
-            default:
-                NoViableAltException nvae =
-                    new NoViableAltException("", 11, 0, input);
-
-                throw nvae;
-            }
-
-            switch (alt11) {
-                case 1 :
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:86:7: ID
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    ID49=(Token)match(input,ID,FOLLOW_ID_in_atom680); 
-                    ID49_tree = (Object)adaptor.create(ID49);
-                    adaptor.addChild(root_0, ID49_tree);
-
-
-                    }
-                    break;
-                case 2 :
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:87:7: INT
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    INT50=(Token)match(input,INT,FOLLOW_INT_in_atom694); 
-                    INT50_tree = (Object)adaptor.create(INT50);
-                    adaptor.addChild(root_0, INT50_tree);
-
-
-                    }
-                    break;
-                case 3 :
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:88:7: '(' expr ')'
-                    {
-                    char_literal51=(Token)match(input,22,FOLLOW_22_in_atom708);  
-                    stream_22.add(char_literal51);
-
-                    pushFollow(FOLLOW_expr_in_atom710);
-                    expr52=expr();
-
-                    state._fsp--;
-
-                    stream_expr.add(expr52.getTree());
-                    char_literal53=(Token)match(input,24,FOLLOW_24_in_atom712);  
-                    stream_24.add(char_literal53);
-
-
-
-                    // AST REWRITE
-                    // elements: expr
-                    // token labels: 
-                    // rule labels: retval
-                    // token list labels: 
-                    // rule list labels: 
-                    // wildcard labels: 
-                    retval.tree = root_0;
-                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);
-
-                    root_0 = (Object)adaptor.nil();
-                    // 88:20: -> expr
-                    {
-                        adaptor.addChild(root_0, stream_expr.nextTree());
-
-                    }
-
-                    retval.tree = root_0;
-                    }
-                    break;
-
-            }
-            retval.stop = input.LT(-1);
-
-            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
-            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);
-
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end "atom"
-
-    // Delegated rules
-
-
-    protected DFA2 dfa2 = new DFA2(this);
-    static final String DFA2_eotS =
-        "\15\uffff";
-    static final String DFA2_eofS =
-        "\15\uffff";
-    static final String DFA2_minS =
-        "\2\12\1\25\1\12\1\uffff\1\12\1\25\1\27\2\uffff\2\12\1\27";
-    static final String DFA2_maxS =
-        "\1\20\1\12\1\26\1\30\1\uffff\1\12\1\31\1\30\2\uffff\1\20\1\12\1"+
-        "\30";
-    static final String DFA2_acceptS =
-        "\4\uffff\1\1\3\uffff\1\3\1\2\3\uffff";
-    static final String DFA2_specialS =
-        "\15\uffff}>";
-    static final String[] DFA2_transitionS = {
-            "\1\1\3\uffff\3\1",
-            "\1\2",
-            "\1\4\1\3",
-            "\1\5\3\uffff\3\5\7\uffff\1\6",
-            "",
-            "\1\7",
-            "\1\11\3\uffff\1\10",
-            "\1\12\1\6",
-            "",
-            "",
-            "\1\13\3\uffff\3\13",
-            "\1\14",
-            "\1\12\1\6"
-    };
-
-    static final short[] DFA2_eot = DFA.unpackEncodedString(DFA2_eotS);
-    static final short[] DFA2_eof = DFA.unpackEncodedString(DFA2_eofS);
-    static final char[] DFA2_min = DFA.unpackEncodedStringToUnsignedChars(DFA2_minS);
-    static final char[] DFA2_max = DFA.unpackEncodedStringToUnsignedChars(DFA2_maxS);
-    static final short[] DFA2_accept = DFA.unpackEncodedString(DFA2_acceptS);
-    static final short[] DFA2_special = DFA.unpackEncodedString(DFA2_specialS);
-    static final short[][] DFA2_transition;
-
-    static {
-        int numStates = DFA2_transitionS.length;
-        DFA2_transition = new short[numStates][];
-        for (int i=0; i<numStates; i++) {
-            DFA2_transition[i] = DFA.unpackEncodedString(DFA2_transitionS[i]);
-        }
-    }
-
-    class DFA2 extends DFA {
-
-        public DFA2(BaseRecognizer recognizer) {
-            this.recognizer = recognizer;
-            this.decisionNumber = 2;
-            this.eot = DFA2_eot;
-            this.eof = DFA2_eof;
-            this.min = DFA2_min;
-            this.max = DFA2_max;
-            this.accept = DFA2_accept;
-            this.special = DFA2_special;
-            this.transition = DFA2_transition;
-        }
-        public String getDescription() {
-            return "20:1: declaration : ( variable | functionHeader ';' -> ^( FUNC_DECL functionHeader ) | functionHeader block -> ^( FUNC_DEF functionHeader block ) );";
-        }
-    }
- 
-
-    public static final BitSet FOLLOW_declaration_in_program85 = new BitSet(new long[]{0x000000000001C402L});
-    public static final BitSet FOLLOW_variable_in_declaration105 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_functionHeader_in_declaration115 = new BitSet(new long[]{0x0000000000200000L});
-    public static final BitSet FOLLOW_21_in_declaration117 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_functionHeader_in_declaration135 = new BitSet(new long[]{0x0000000002000000L});
-    public static final BitSet FOLLOW_block_in_declaration137 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_type_in_variable166 = new BitSet(new long[]{0x0000000000000400L});
-    public static final BitSet FOLLOW_declarator_in_variable168 = new BitSet(new long[]{0x0000000000200000L});
-    public static final BitSet FOLLOW_21_in_variable170 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ID_in_declarator199 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_type_in_functionHeader219 = new BitSet(new long[]{0x0000000000000400L});
-    public static final BitSet FOLLOW_ID_in_functionHeader221 = new BitSet(new long[]{0x0000000000400000L});
-    public static final BitSet FOLLOW_22_in_functionHeader223 = new BitSet(new long[]{0x000000000101C400L});
-    public static final BitSet FOLLOW_formalParameter_in_functionHeader227 = new BitSet(new long[]{0x0000000001800000L});
-    public static final BitSet FOLLOW_23_in_functionHeader231 = new BitSet(new long[]{0x000000000001C400L});
-    public static final BitSet FOLLOW_formalParameter_in_functionHeader233 = new BitSet(new long[]{0x0000000001800000L});
-    public static final BitSet FOLLOW_24_in_functionHeader241 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_type_in_formalParameter281 = new BitSet(new long[]{0x0000000000000400L});
-    public static final BitSet FOLLOW_declarator_in_formalParameter283 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_set_in_type0 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_25_in_block376 = new BitSet(new long[]{0x000000000661F400L});
-    public static final BitSet FOLLOW_variable_in_block390 = new BitSet(new long[]{0x000000000661F400L});
-    public static final BitSet FOLLOW_stat_in_block405 = new BitSet(new long[]{0x0000000006603400L});
-    public static final BitSet FOLLOW_26_in_block416 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_forStat_in_stat449 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_expr_in_stat457 = new BitSet(new long[]{0x0000000000200000L});
-    public static final BitSet FOLLOW_21_in_stat459 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_block_in_stat468 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_assignStat_in_stat476 = new BitSet(new long[]{0x0000000000200000L});
-    public static final BitSet FOLLOW_21_in_stat478 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_21_in_stat487 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_FOR_in_forStat507 = new BitSet(new long[]{0x0000000000400000L});
-    public static final BitSet FOLLOW_22_in_forStat509 = new BitSet(new long[]{0x0000000000000400L});
-    public static final BitSet FOLLOW_assignStat_in_forStat513 = new BitSet(new long[]{0x0000000000200000L});
-    public static final BitSet FOLLOW_21_in_forStat515 = new BitSet(new long[]{0x0000000000401400L});
-    public static final BitSet FOLLOW_expr_in_forStat517 = new BitSet(new long[]{0x0000000000200000L});
-    public static final BitSet FOLLOW_21_in_forStat519 = new BitSet(new long[]{0x0000000000000400L});
-    public static final BitSet FOLLOW_assignStat_in_forStat523 = new BitSet(new long[]{0x0000000001000000L});
-    public static final BitSet FOLLOW_24_in_forStat525 = new BitSet(new long[]{0x0000000002000000L});
-    public static final BitSet FOLLOW_block_in_forStat527 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ID_in_assignStat570 = new BitSet(new long[]{0x0000000000000800L});
-    public static final BitSet FOLLOW_EQ_in_assignStat572 = new BitSet(new long[]{0x0000000000401400L});
-    public static final BitSet FOLLOW_expr_in_assignStat574 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_condExpr_in_expr598 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_aexpr_in_condExpr617 = new BitSet(new long[]{0x0000000000060002L});
-    public static final BitSet FOLLOW_EQEQ_in_condExpr622 = new BitSet(new long[]{0x0000000000401400L});
-    public static final BitSet FOLLOW_LT_in_condExpr627 = new BitSet(new long[]{0x0000000000401400L});
-    public static final BitSet FOLLOW_aexpr_in_condExpr631 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_atom_in_aexpr653 = new BitSet(new long[]{0x0000000000080002L});
-    public static final BitSet FOLLOW_PLUS_in_aexpr657 = new BitSet(new long[]{0x0000000000401400L});
-    public static final BitSet FOLLOW_atom_in_aexpr660 = new BitSet(new long[]{0x0000000000080002L});
-    public static final BitSet FOLLOW_ID_in_atom680 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_INT_in_atom694 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_22_in_atom708 = new BitSet(new long[]{0x0000000000401400L});
-    public static final BitSet FOLLOW_expr_in_atom710 = new BitSet(new long[]{0x0000000001000000L});
-    public static final BitSet FOLLOW_24_in_atom712 = new BitSet(new long[]{0x0000000000000002L});
-
-}
\ No newline at end of file
diff --git a/runtime/ObjC/Framework/examples/simplecTreeParser/output1/SimpleCParser.m b/runtime/ObjC/Framework/examples/simplecTreeParser/output1/SimpleCParser.m
deleted file mode 100644
index 386640a..0000000
--- a/runtime/ObjC/Framework/examples/simplecTreeParser/output1/SimpleCParser.m
+++ /dev/null
@@ -1,2763 +0,0 @@
-/** \file
- *  This OBJC source file was generated by $ANTLR version 3.2 Aug 23, 2010 07:48:06
- *
- *     -  From the grammar source file : /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g
- *     -                            On : 2010-08-23 07:54:46
- *     -                for the parser : SimpleCParserParser *
- * Editing it, at least manually, is not wise. 
- *
- * ObjC language generator and runtime by Alan Condit, acondit|hereisanat|ipns|dotgoeshere|com.
- *
- *
-*/
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-//
-// 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.
-
-// $ANTLR 3.2 Aug 23, 2010 07:48:06 /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g 2010-08-23 07:54:46
-
-/* -----------------------------------------
- * Include the ANTLR3 generated header file.
- */
-#import "SimpleCParser.h"
-/* ----------------------------------------- */
-
-
-/* ============================================================================= */
-
-/* =============================================================================
- * Start of recognizer
- */
-
-
-#pragma mark Cyclic DFA implementation start DFA2
-@implementation DFA2
-const static NSInteger dfa2_eot[13] =
-    {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
-const static NSInteger dfa2_eof[13] =
-    {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
-const static unichar dfa2_min[13] =
-    {10,10,21,10,0,10,21,23,0,0,10,10,23};
-const static unichar dfa2_max[13] =
-    {13,10,22,24,0,10,25,24,0,0,13,10,24};
-const static NSInteger dfa2_accept[13] =
-    {-1,-1,-1,-1,1,-1,-1,-1,3,2,-1,-1,-1};
-const static NSInteger dfa2_special[13] =
-    {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
-const static NSInteger dfa2_transition[] = {};
-const static NSInteger dfa2_transition0[] = {9, -1, -1, -1, 8};
-const static NSInteger dfa2_transition1[] = {10, 6};
-const static NSInteger dfa2_transition2[] = {5, 5, 5, 5, -1, -1, -1, -1, 
- -1, -1, -1, -1, -1, -1, 6};
-const static NSInteger dfa2_transition3[] = {11, 11, 11, 11};
-const static NSInteger dfa2_transition4[] = {4, 3};
-const static NSInteger dfa2_transition5[] = {1, 1, 1, 1};
-const static NSInteger dfa2_transition6[] = {7};
-const static NSInteger dfa2_transition7[] = {12};
-const static NSInteger dfa2_transition8[] = {2};
-
-
-+ () newDFA2WithRecognizer:(ANTLRBaseRecognizer *)aRecognizer
-{
-    return [[[DFA2 alloc] initWithRecognizer:aRecognizer] retain];
-}
-
-- (id) initWithRecognizer:(ANTLRBaseRecognizer *) theRecognizer
-{
-    if ((self = [super initWithRecognizer:theRecognizer]) != nil) {
-        decisionNumber = 2;
-        eot = dfa2_eot;
-        eof = dfa2_eof;
-        min = dfa2_min;
-        max = dfa2_max;
-        accept = dfa2_accept;
-        special = dfa2_special;
-        if (!(transition = calloc(13, sizeof(void*)))) {
-            [self release];
-            return nil;
-        }
-        len = 13;
-        transition[0] = dfa2_transition5;
-        transition[1] = dfa2_transition8;
-        transition[2] = dfa2_transition4;
-        transition[3] = dfa2_transition2;
-        transition[4] = dfa2_transition;
-        transition[5] = dfa2_transition6;
-        transition[6] = dfa2_transition0;
-        transition[7] = dfa2_transition1;
-        transition[8] = dfa2_transition;
-        transition[9] = dfa2_transition;
-        transition[10] = dfa2_transition3;
-        transition[11] = dfa2_transition7;
-        transition[12] = dfa2_transition1;
-    }
-    return self;
-}
-
-- (void) dealloc
-{
-    free(transition);
-    [super dealloc];
-}
-
-- (NSString *) description
-{
-    return @"20:1: declaration : ( variable | functionHeader ';' -> ^( FUNC_DECL functionHeader ) | functionHeader block -> ^( FUNC_DEF functionHeader block ) );";
-}
-
-
-@end /* end DFA2 implementation */
-
-#pragma mark Cyclic DFA implementation end DFA2
-
-
-
-#pragma mark Bitsets
-static ANTLRBitSet *FOLLOW_declaration_in_program85;
-static const unsigned long long FOLLOW_declaration_in_program85_data[] = { 0x0000000000003C02LL};
-static ANTLRBitSet *FOLLOW_variable_in_declaration105;
-static const unsigned long long FOLLOW_variable_in_declaration105_data[] = { 0x0000000000000002LL};
-static ANTLRBitSet *FOLLOW_functionHeader_in_declaration115;
-static const unsigned long long FOLLOW_functionHeader_in_declaration115_data[] = { 0x0000000000200000LL};
-static ANTLRBitSet *FOLLOW_21_in_declaration117;
-static const unsigned long long FOLLOW_21_in_declaration117_data[] = { 0x0000000000000002LL};
-static ANTLRBitSet *FOLLOW_functionHeader_in_declaration135;
-static const unsigned long long FOLLOW_functionHeader_in_declaration135_data[] = { 0x0000000002000000LL};
-static ANTLRBitSet *FOLLOW_block_in_declaration137;
-static const unsigned long long FOLLOW_block_in_declaration137_data[] = { 0x0000000000000002LL};
-static ANTLRBitSet *FOLLOW_type_in_variable166;
-static const unsigned long long FOLLOW_type_in_variable166_data[] = { 0x0000000000000400LL};
-static ANTLRBitSet *FOLLOW_declarator_in_variable168;
-static const unsigned long long FOLLOW_declarator_in_variable168_data[] = { 0x0000000000200000LL};
-static ANTLRBitSet *FOLLOW_21_in_variable170;
-static const unsigned long long FOLLOW_21_in_variable170_data[] = { 0x0000000000000002LL};
-static ANTLRBitSet *FOLLOW_K_ID_in_declarator199;
-static const unsigned long long FOLLOW_K_ID_in_declarator199_data[] = { 0x0000000000000002LL};
-static ANTLRBitSet *FOLLOW_type_in_functionHeader219;
-static const unsigned long long FOLLOW_type_in_functionHeader219_data[] = { 0x0000000000000400LL};
-static ANTLRBitSet *FOLLOW_K_ID_in_functionHeader221;
-static const unsigned long long FOLLOW_K_ID_in_functionHeader221_data[] = { 0x0000000000400000LL};
-static ANTLRBitSet *FOLLOW_22_in_functionHeader223;
-static const unsigned long long FOLLOW_22_in_functionHeader223_data[] = { 0x0000000001003C00LL};
-static ANTLRBitSet *FOLLOW_formalParameter_in_functionHeader227;
-static const unsigned long long FOLLOW_formalParameter_in_functionHeader227_data[] = { 0x0000000001800000LL};
-static ANTLRBitSet *FOLLOW_23_in_functionHeader231;
-static const unsigned long long FOLLOW_23_in_functionHeader231_data[] = { 0x0000000000003C00LL};
-static ANTLRBitSet *FOLLOW_formalParameter_in_functionHeader233;
-static const unsigned long long FOLLOW_formalParameter_in_functionHeader233_data[] = { 0x0000000001800000LL};
-static ANTLRBitSet *FOLLOW_24_in_functionHeader241;
-static const unsigned long long FOLLOW_24_in_functionHeader241_data[] = { 0x0000000000000002LL};
-static ANTLRBitSet *FOLLOW_type_in_formalParameter281;
-static const unsigned long long FOLLOW_type_in_formalParameter281_data[] = { 0x0000000000000400LL};
-static ANTLRBitSet *FOLLOW_declarator_in_formalParameter283;
-static const unsigned long long FOLLOW_declarator_in_formalParameter283_data[] = { 0x0000000000000002LL};
-static ANTLRBitSet *FOLLOW_set_in_type0;
-static const unsigned long long FOLLOW_set_in_type0_data[] = { 0x0000000000000002LL};
-static ANTLRBitSet *FOLLOW_25_in_block376;
-static const unsigned long long FOLLOW_25_in_block376_data[] = { 0x0000000006607C00LL};
-static ANTLRBitSet *FOLLOW_variable_in_block390;
-static const unsigned long long FOLLOW_variable_in_block390_data[] = { 0x0000000006607C00LL};
-static ANTLRBitSet *FOLLOW_stat_in_block405;
-static const unsigned long long FOLLOW_stat_in_block405_data[] = { 0x0000000006604C00LL};
-static ANTLRBitSet *FOLLOW_26_in_block416;
-static const unsigned long long FOLLOW_26_in_block416_data[] = { 0x0000000000000002LL};
-static ANTLRBitSet *FOLLOW_forStat_in_stat449;
-static const unsigned long long FOLLOW_forStat_in_stat449_data[] = { 0x0000000000000002LL};
-static ANTLRBitSet *FOLLOW_expr_in_stat457;
-static const unsigned long long FOLLOW_expr_in_stat457_data[] = { 0x0000000000200000LL};
-static ANTLRBitSet *FOLLOW_21_in_stat459;
-static const unsigned long long FOLLOW_21_in_stat459_data[] = { 0x0000000000000002LL};
-static ANTLRBitSet *FOLLOW_block_in_stat468;
-static const unsigned long long FOLLOW_block_in_stat468_data[] = { 0x0000000000000002LL};
-static ANTLRBitSet *FOLLOW_assignStat_in_stat476;
-static const unsigned long long FOLLOW_assignStat_in_stat476_data[] = { 0x0000000000200000LL};
-static ANTLRBitSet *FOLLOW_21_in_stat478;
-static const unsigned long long FOLLOW_21_in_stat478_data[] = { 0x0000000000000002LL};
-static ANTLRBitSet *FOLLOW_21_in_stat487;
-static const unsigned long long FOLLOW_21_in_stat487_data[] = { 0x0000000000000002LL};
-static ANTLRBitSet *FOLLOW_K_FOR_in_forStat507;
-static const unsigned long long FOLLOW_K_FOR_in_forStat507_data[] = { 0x0000000000400000LL};
-static ANTLRBitSet *FOLLOW_22_in_forStat509;
-static const unsigned long long FOLLOW_22_in_forStat509_data[] = { 0x0000000000000400LL};
-static ANTLRBitSet *FOLLOW_assignStat_in_forStat513;
-static const unsigned long long FOLLOW_assignStat_in_forStat513_data[] = { 0x0000000000200000LL};
-static ANTLRBitSet *FOLLOW_21_in_forStat515;
-static const unsigned long long FOLLOW_21_in_forStat515_data[] = { 0x0000000000400C00LL};
-static ANTLRBitSet *FOLLOW_expr_in_forStat517;
-static const unsigned long long FOLLOW_expr_in_forStat517_data[] = { 0x0000000000200000LL};
-static ANTLRBitSet *FOLLOW_21_in_forStat519;
-static const unsigned long long FOLLOW_21_in_forStat519_data[] = { 0x0000000000000400LL};
-static ANTLRBitSet *FOLLOW_assignStat_in_forStat523;
-static const unsigned long long FOLLOW_assignStat_in_forStat523_data[] = { 0x0000000001000000LL};
-static ANTLRBitSet *FOLLOW_24_in_forStat525;
-static const unsigned long long FOLLOW_24_in_forStat525_data[] = { 0x0000000002000000LL};
-static ANTLRBitSet *FOLLOW_block_in_forStat527;
-static const unsigned long long FOLLOW_block_in_forStat527_data[] = { 0x0000000000000002LL};
-static ANTLRBitSet *FOLLOW_K_ID_in_assignStat570;
-static const unsigned long long FOLLOW_K_ID_in_assignStat570_data[] = { 0x0000000000008000LL};
-static ANTLRBitSet *FOLLOW_K_EQ_in_assignStat572;
-static const unsigned long long FOLLOW_K_EQ_in_assignStat572_data[] = { 0x0000000000400C00LL};
-static ANTLRBitSet *FOLLOW_expr_in_assignStat574;
-static const unsigned long long FOLLOW_expr_in_assignStat574_data[] = { 0x0000000000000002LL};
-static ANTLRBitSet *FOLLOW_condExpr_in_expr598;
-static const unsigned long long FOLLOW_condExpr_in_expr598_data[] = { 0x0000000000000002LL};
-static ANTLRBitSet *FOLLOW_aexpr_in_condExpr617;
-static const unsigned long long FOLLOW_aexpr_in_condExpr617_data[] = { 0x0000000000030002LL};
-static ANTLRBitSet *FOLLOW_K_EQEQ_in_condExpr622;
-static const unsigned long long FOLLOW_K_EQEQ_in_condExpr622_data[] = { 0x0000000000400C00LL};
-static ANTLRBitSet *FOLLOW_K_LT_in_condExpr627;
-static const unsigned long long FOLLOW_K_LT_in_condExpr627_data[] = { 0x0000000000400C00LL};
-static ANTLRBitSet *FOLLOW_aexpr_in_condExpr631;
-static const unsigned long long FOLLOW_aexpr_in_condExpr631_data[] = { 0x0000000000000002LL};
-static ANTLRBitSet *FOLLOW_atom_in_aexpr653;
-static const unsigned long long FOLLOW_atom_in_aexpr653_data[] = { 0x0000000000040002LL};
-static ANTLRBitSet *FOLLOW_K_PLUS_in_aexpr657;
-static const unsigned long long FOLLOW_K_PLUS_in_aexpr657_data[] = { 0x0000000000400C00LL};
-static ANTLRBitSet *FOLLOW_atom_in_aexpr660;
-static const unsigned long long FOLLOW_atom_in_aexpr660_data[] = { 0x0000000000040002LL};
-static ANTLRBitSet *FOLLOW_K_ID_in_atom680;
-static const unsigned long long FOLLOW_K_ID_in_atom680_data[] = { 0x0000000000000002LL};
-static ANTLRBitSet *FOLLOW_K_INT_in_atom694;
-static const unsigned long long FOLLOW_K_INT_in_atom694_data[] = { 0x0000000000000002LL};
-static ANTLRBitSet *FOLLOW_22_in_atom708;
-static const unsigned long long FOLLOW_22_in_atom708_data[] = { 0x0000000000400C00LL};
-static ANTLRBitSet *FOLLOW_expr_in_atom710;
-static const unsigned long long FOLLOW_expr_in_atom710_data[] = { 0x0000000001000000LL};
-static ANTLRBitSet *FOLLOW_24_in_atom712;
-static const unsigned long long FOLLOW_24_in_atom712_data[] = { 0x0000000000000002LL};
-
-
-#pragma mark Dynamic Global Scopes
-
-#pragma mark Dynamic Rule Scopes
-
-#pragma mark Rule return scopes start
-@implementation SimpleCParser_program_return
-+ (SimpleCParser_program_return *)newSimpleCParser_program_return
-{
-    return [[[SimpleCParser_program_return alloc] init] retain];
-}
-
-/* AST returnScope.methods */
-- (ANTLRCommonTree *)getTree
-{
-    return tree;
-}
-
-- (void) setTree:(ANTLRCommonTree *)aTree
-{
-    if (tree != aTree) {
-        if (tree != nil) [tree release];
-        if (aTree != nil) [aTree retain];
-        tree = aTree;
-    }
-}
-
-- (void) dealloc
-{
-    [self setTree:nil];
-    [super dealloc];
-}
-
-
-
-
-@end /* end of returnScope implementation */
-
-@implementation SimpleCParser_declaration_return
-+ (SimpleCParser_declaration_return *)newSimpleCParser_declaration_return
-{
-    return [[[SimpleCParser_declaration_return alloc] init] retain];
-}
-
-/* AST returnScope.methods */
-- (ANTLRCommonTree *)getTree
-{
-    return tree;
-}
-
-- (void) setTree:(ANTLRCommonTree *)aTree
-{
-    if (tree != aTree) {
-        if (tree != nil) [tree release];
-        if (aTree != nil) [aTree retain];
-        tree = aTree;
-    }
-}
-
-- (void) dealloc
-{
-    [self setTree:nil];
-    [super dealloc];
-}
-
-
-
-
-@end /* end of returnScope implementation */
-
-@implementation SimpleCParser_variable_return
-+ (SimpleCParser_variable_return *)newSimpleCParser_variable_return
-{
-    return [[[SimpleCParser_variable_return alloc] init] retain];
-}
-
-/* AST returnScope.methods */
-- (ANTLRCommonTree *)getTree
-{
-    return tree;
-}
-
-- (void) setTree:(ANTLRCommonTree *)aTree
-{
-    if (tree != aTree) {
-        if (tree != nil) [tree release];
-        if (aTree != nil) [aTree retain];
-        tree = aTree;
-    }
-}
-
-- (void) dealloc
-{
-    [self setTree:nil];
-    [super dealloc];
-}
-
-
-
-
-@end /* end of returnScope implementation */
-
-@implementation SimpleCParser_declarator_return
-+ (SimpleCParser_declarator_return *)newSimpleCParser_declarator_return
-{
-    return [[[SimpleCParser_declarator_return alloc] init] retain];
-}
-
-/* AST returnScope.methods */
-- (ANTLRCommonTree *)getTree
-{
-    return tree;
-}
-
-- (void) setTree:(ANTLRCommonTree *)aTree
-{
-    if (tree != aTree) {
-        if (tree != nil) [tree release];
-        if (aTree != nil) [aTree retain];
-        tree = aTree;
-    }
-}
-
-- (void) dealloc
-{
-    [self setTree:nil];
-    [super dealloc];
-}
-
-
-
-
-@end /* end of returnScope implementation */
-
-@implementation SimpleCParser_functionHeader_return
-+ (SimpleCParser_functionHeader_return *)newSimpleCParser_functionHeader_return
-{
-    return [[[SimpleCParser_functionHeader_return alloc] init] retain];
-}
-
-/* AST returnScope.methods */
-- (ANTLRCommonTree *)getTree
-{
-    return tree;
-}
-
-- (void) setTree:(ANTLRCommonTree *)aTree
-{
-    if (tree != aTree) {
-        if (tree != nil) [tree release];
-        if (aTree != nil) [aTree retain];
-        tree = aTree;
-    }
-}
-
-- (void) dealloc
-{
-    [self setTree:nil];
-    [super dealloc];
-}
-
-
-
-
-@end /* end of returnScope implementation */
-
-@implementation SimpleCParser_formalParameter_return
-+ (SimpleCParser_formalParameter_return *)newSimpleCParser_formalParameter_return
-{
-    return [[[SimpleCParser_formalParameter_return alloc] init] retain];
-}
-
-/* AST returnScope.methods */
-- (ANTLRCommonTree *)getTree
-{
-    return tree;
-}
-
-- (void) setTree:(ANTLRCommonTree *)aTree
-{
-    if (tree != aTree) {
-        if (tree != nil) [tree release];
-        if (aTree != nil) [aTree retain];
-        tree = aTree;
-    }
-}
-
-- (void) dealloc
-{
-    [self setTree:nil];
-    [super dealloc];
-}
-
-
-
-
-@end /* end of returnScope implementation */
-
-@implementation SimpleCParser_type_return
-+ (SimpleCParser_type_return *)newSimpleCParser_type_return
-{
-    return [[[SimpleCParser_type_return alloc] init] retain];
-}
-
-/* AST returnScope.methods */
-- (ANTLRCommonTree *)getTree
-{
-    return tree;
-}
-
-- (void) setTree:(ANTLRCommonTree *)aTree
-{
-    if (tree != aTree) {
-        if (tree != nil) [tree release];
-        if (aTree != nil) [aTree retain];
-        tree = aTree;
-    }
-}
-
-- (void) dealloc
-{
-    [self setTree:nil];
-    [super dealloc];
-}
-
-
-
-
-@end /* end of returnScope implementation */
-
-@implementation SimpleCParser_block_return
-+ (SimpleCParser_block_return *)newSimpleCParser_block_return
-{
-    return [[[SimpleCParser_block_return alloc] init] retain];
-}
-
-/* AST returnScope.methods */
-- (ANTLRCommonTree *)getTree
-{
-    return tree;
-}
-
-- (void) setTree:(ANTLRCommonTree *)aTree
-{
-    if (tree != aTree) {
-        if (tree != nil) [tree release];
-        if (aTree != nil) [aTree retain];
-        tree = aTree;
-    }
-}
-
-- (void) dealloc
-{
-    [self setTree:nil];
-    [super dealloc];
-}
-
-
-
-
-@end /* end of returnScope implementation */
-
-@implementation SimpleCParser_stat_return
-+ (SimpleCParser_stat_return *)newSimpleCParser_stat_return
-{
-    return [[[SimpleCParser_stat_return alloc] init] retain];
-}
-
-/* AST returnScope.methods */
-- (ANTLRCommonTree *)getTree
-{
-    return tree;
-}
-
-- (void) setTree:(ANTLRCommonTree *)aTree
-{
-    if (tree != aTree) {
-        if (tree != nil) [tree release];
-        if (aTree != nil) [aTree retain];
-        tree = aTree;
-    }
-}
-
-- (void) dealloc
-{
-    [self setTree:nil];
-    [super dealloc];
-}
-
-
-
-
-@end /* end of returnScope implementation */
-
-@implementation SimpleCParser_forStat_return
-+ (SimpleCParser_forStat_return *)newSimpleCParser_forStat_return
-{
-    return [[[SimpleCParser_forStat_return alloc] init] retain];
-}
-
-/* AST returnScope.methods */
-- (ANTLRCommonTree *)getTree
-{
-    return tree;
-}
-
-- (void) setTree:(ANTLRCommonTree *)aTree
-{
-    if (tree != aTree) {
-        if (tree != nil) [tree release];
-        if (aTree != nil) [aTree retain];
-        tree = aTree;
-    }
-}
-
-- (void) dealloc
-{
-    [self setTree:nil];
-    [super dealloc];
-}
-
-
-
-
-@end /* end of returnScope implementation */
-
-@implementation SimpleCParser_assignStat_return
-+ (SimpleCParser_assignStat_return *)newSimpleCParser_assignStat_return
-{
-    return [[[SimpleCParser_assignStat_return alloc] init] retain];
-}
-
-/* AST returnScope.methods */
-- (ANTLRCommonTree *)getTree
-{
-    return tree;
-}
-
-- (void) setTree:(ANTLRCommonTree *)aTree
-{
-    if (tree != aTree) {
-        if (tree != nil) [tree release];
-        if (aTree != nil) [aTree retain];
-        tree = aTree;
-    }
-}
-
-- (void) dealloc
-{
-    [self setTree:nil];
-    [super dealloc];
-}
-
-
-
-
-@end /* end of returnScope implementation */
-
-@implementation SimpleCParser_expr_return
-+ (SimpleCParser_expr_return *)newSimpleCParser_expr_return
-{
-    return [[[SimpleCParser_expr_return alloc] init] retain];
-}
-
-/* AST returnScope.methods */
-- (ANTLRCommonTree *)getTree
-{
-    return tree;
-}
-
-- (void) setTree:(ANTLRCommonTree *)aTree
-{
-    if (tree != aTree) {
-        if (tree != nil) [tree release];
-        if (aTree != nil) [aTree retain];
-        tree = aTree;
-    }
-}
-
-- (void) dealloc
-{
-    [self setTree:nil];
-    [super dealloc];
-}
-
-
-
-
-@end /* end of returnScope implementation */
-
-@implementation SimpleCParser_condExpr_return
-+ (SimpleCParser_condExpr_return *)newSimpleCParser_condExpr_return
-{
-    return [[[SimpleCParser_condExpr_return alloc] init] retain];
-}
-
-/* AST returnScope.methods */
-- (ANTLRCommonTree *)getTree
-{
-    return tree;
-}
-
-- (void) setTree:(ANTLRCommonTree *)aTree
-{
-    if (tree != aTree) {
-        if (tree != nil) [tree release];
-        if (aTree != nil) [aTree retain];
-        tree = aTree;
-    }
-}
-
-- (void) dealloc
-{
-    [self setTree:nil];
-    [super dealloc];
-}
-
-
-
-
-@end /* end of returnScope implementation */
-
-@implementation SimpleCParser_aexpr_return
-+ (SimpleCParser_aexpr_return *)newSimpleCParser_aexpr_return
-{
-    return [[[SimpleCParser_aexpr_return alloc] init] retain];
-}
-
-/* AST returnScope.methods */
-- (ANTLRCommonTree *)getTree
-{
-    return tree;
-}
-
-- (void) setTree:(ANTLRCommonTree *)aTree
-{
-    if (tree != aTree) {
-        if (tree != nil) [tree release];
-        if (aTree != nil) [aTree retain];
-        tree = aTree;
-    }
-}
-
-- (void) dealloc
-{
-    [self setTree:nil];
-    [super dealloc];
-}
-
-
-
-
-@end /* end of returnScope implementation */
-
-@implementation SimpleCParser_atom_return
-+ (SimpleCParser_atom_return *)newSimpleCParser_atom_return
-{
-    return [[[SimpleCParser_atom_return alloc] init] retain];
-}
-
-/* AST returnScope.methods */
-- (ANTLRCommonTree *)getTree
-{
-    return tree;
-}
-
-- (void) setTree:(ANTLRCommonTree *)aTree
-{
-    if (tree != aTree) {
-        if (tree != nil) [tree release];
-        if (aTree != nil) [aTree retain];
-        tree = aTree;
-    }
-}
-
-- (void) dealloc
-{
-    [self setTree:nil];
-    [super dealloc];
-}
-
-
-
-
-@end /* end of returnScope implementation */
-
-
-
-@implementation SimpleCParser  // line 610
-
-+ (void) initialize
-{
-    #pragma mark Bitsets
-    FOLLOW_declaration_in_program85 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_declaration_in_program85_data Count:(NSUInteger)1] retain];
-    FOLLOW_variable_in_declaration105 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_variable_in_declaration105_data Count:(NSUInteger)1] retain];
-    FOLLOW_functionHeader_in_declaration115 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_functionHeader_in_declaration115_data Count:(NSUInteger)1] retain];
-    FOLLOW_21_in_declaration117 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_21_in_declaration117_data Count:(NSUInteger)1] retain];
-    FOLLOW_functionHeader_in_declaration135 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_functionHeader_in_declaration135_data Count:(NSUInteger)1] retain];
-    FOLLOW_block_in_declaration137 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_block_in_declaration137_data Count:(NSUInteger)1] retain];
-    FOLLOW_type_in_variable166 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_type_in_variable166_data Count:(NSUInteger)1] retain];
-    FOLLOW_declarator_in_variable168 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_declarator_in_variable168_data Count:(NSUInteger)1] retain];
-    FOLLOW_21_in_variable170 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_21_in_variable170_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_ID_in_declarator199 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_ID_in_declarator199_data Count:(NSUInteger)1] retain];
-    FOLLOW_type_in_functionHeader219 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_type_in_functionHeader219_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_ID_in_functionHeader221 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_ID_in_functionHeader221_data Count:(NSUInteger)1] retain];
-    FOLLOW_22_in_functionHeader223 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_22_in_functionHeader223_data Count:(NSUInteger)1] retain];
-    FOLLOW_formalParameter_in_functionHeader227 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_formalParameter_in_functionHeader227_data Count:(NSUInteger)1] retain];
-    FOLLOW_23_in_functionHeader231 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_23_in_functionHeader231_data Count:(NSUInteger)1] retain];
-    FOLLOW_formalParameter_in_functionHeader233 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_formalParameter_in_functionHeader233_data Count:(NSUInteger)1] retain];
-    FOLLOW_24_in_functionHeader241 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_24_in_functionHeader241_data Count:(NSUInteger)1] retain];
-    FOLLOW_type_in_formalParameter281 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_type_in_formalParameter281_data Count:(NSUInteger)1] retain];
-    FOLLOW_declarator_in_formalParameter283 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_declarator_in_formalParameter283_data Count:(NSUInteger)1] retain];
-    FOLLOW_set_in_type0 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_set_in_type0_data Count:(NSUInteger)1] retain];
-    FOLLOW_25_in_block376 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_25_in_block376_data Count:(NSUInteger)1] retain];
-    FOLLOW_variable_in_block390 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_variable_in_block390_data Count:(NSUInteger)1] retain];
-    FOLLOW_stat_in_block405 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_stat_in_block405_data Count:(NSUInteger)1] retain];
-    FOLLOW_26_in_block416 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_26_in_block416_data Count:(NSUInteger)1] retain];
-    FOLLOW_forStat_in_stat449 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_forStat_in_stat449_data Count:(NSUInteger)1] retain];
-    FOLLOW_expr_in_stat457 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_stat457_data Count:(NSUInteger)1] retain];
-    FOLLOW_21_in_stat459 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_21_in_stat459_data Count:(NSUInteger)1] retain];
-    FOLLOW_block_in_stat468 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_block_in_stat468_data Count:(NSUInteger)1] retain];
-    FOLLOW_assignStat_in_stat476 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_assignStat_in_stat476_data Count:(NSUInteger)1] retain];
-    FOLLOW_21_in_stat478 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_21_in_stat478_data Count:(NSUInteger)1] retain];
-    FOLLOW_21_in_stat487 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_21_in_stat487_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_FOR_in_forStat507 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_FOR_in_forStat507_data Count:(NSUInteger)1] retain];
-    FOLLOW_22_in_forStat509 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_22_in_forStat509_data Count:(NSUInteger)1] retain];
-    FOLLOW_assignStat_in_forStat513 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_assignStat_in_forStat513_data Count:(NSUInteger)1] retain];
-    FOLLOW_21_in_forStat515 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_21_in_forStat515_data Count:(NSUInteger)1] retain];
-    FOLLOW_expr_in_forStat517 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_forStat517_data Count:(NSUInteger)1] retain];
-    FOLLOW_21_in_forStat519 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_21_in_forStat519_data Count:(NSUInteger)1] retain];
-    FOLLOW_assignStat_in_forStat523 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_assignStat_in_forStat523_data Count:(NSUInteger)1] retain];
-    FOLLOW_24_in_forStat525 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_24_in_forStat525_data Count:(NSUInteger)1] retain];
-    FOLLOW_block_in_forStat527 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_block_in_forStat527_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_ID_in_assignStat570 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_ID_in_assignStat570_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_EQ_in_assignStat572 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_EQ_in_assignStat572_data Count:(NSUInteger)1] retain];
-    FOLLOW_expr_in_assignStat574 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_assignStat574_data Count:(NSUInteger)1] retain];
-    FOLLOW_condExpr_in_expr598 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_condExpr_in_expr598_data Count:(NSUInteger)1] retain];
-    FOLLOW_aexpr_in_condExpr617 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_aexpr_in_condExpr617_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_EQEQ_in_condExpr622 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_EQEQ_in_condExpr622_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_LT_in_condExpr627 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_LT_in_condExpr627_data Count:(NSUInteger)1] retain];
-    FOLLOW_aexpr_in_condExpr631 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_aexpr_in_condExpr631_data Count:(NSUInteger)1] retain];
-    FOLLOW_atom_in_aexpr653 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_atom_in_aexpr653_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_PLUS_in_aexpr657 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_PLUS_in_aexpr657_data Count:(NSUInteger)1] retain];
-    FOLLOW_atom_in_aexpr660 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_atom_in_aexpr660_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_ID_in_atom680 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_ID_in_atom680_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_INT_in_atom694 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_INT_in_atom694_data Count:(NSUInteger)1] retain];
-    FOLLOW_22_in_atom708 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_22_in_atom708_data Count:(NSUInteger)1] retain];
-    FOLLOW_expr_in_atom710 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_atom710_data Count:(NSUInteger)1] retain];
-    FOLLOW_24_in_atom712 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_24_in_atom712_data Count:(NSUInteger)1] retain];
-
-    [ANTLRBaseRecognizer setTokenNames:[[[NSArray alloc] initWithObjects:@"<invalid>", @"<EOR>", @"<DOWN>", @"<UP>", 
- @"VAR_DEF", @"ARG_DEF", @"FUNC_HDR", @"FUNC_DECL", @"FUNC_DEF", @"BLOCK", 
- @"K_ID", @"K_INT", @"K_CHAR", @"K_VOID", @"K_FOR", @"K_EQ", @"K_EQEQ", 
- @"K_LT", @"K_PLUS", @"K_INT_TYPE", @"WS", @"';'", @"'('", @"','", @"')'", 
- @"'{'", @"'}'", nil] retain]];
-}
-
-+ (SimpleCParser *)newSimpleCParser:(id<ANTLRTokenStream>)aStream
-{
-    return [[SimpleCParser alloc] initWithTokenStream:aStream];
-
-}
-
-- (id) initWithTokenStream:(id<ANTLRTokenStream>)aStream
-{
-    if ((self = [super initWithTokenStream:aStream State:[[ANTLRRecognizerSharedState newANTLRRecognizerSharedStateWithRuleLen:15+1] retain]]) != nil) {
-
-
-        dfa2 = [DFA2 newDFA2WithRecognizer:self];
-
-        /* start of actions-actionScope-init */
-        /* start of init */
-        /* AST genericParser.init */
-        [self setTreeAdaptor:[[ANTLRCommonTreeAdaptor newANTLRCommonTreeAdaptor] retain]];
-    }
-    return self;
-}
-
-- (void) dealloc
-{
-    [dfa2 release];
-    /* AST genericParser.dealloc */
-    [self setTreeAdaptor:nil];
-
-    [super dealloc];
-}
-// start actions.actionScope.methods
-// start methods()
-/* AST genericParser.methods */
-/* AST parserMethods */
-- (id<ANTLRTreeAdaptor>) getTreeAdaptor
-{
-	return treeAdaptor;
-}
-
-- (void) setTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor
-{
-	if (aTreeAdaptor != treeAdaptor) {
-		treeAdaptor = aTreeAdaptor;
-	}
-}
-// start rules
-/*
- * $ANTLR start program
- * /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:16:1: program : ( declaration )+ ;
- */
-- (SimpleCParser_program_return *) program
-{
-    /* ruleScopeSetUp */
-
-    /* AST ruleDeclarations */
-    SimpleCParser_program_return * retval = [SimpleCParser_program_return newSimpleCParser_program_return];
-    [retval setStart:[input LT:1]];
-
-    ANTLRCommonTree *root_0 = nil;
-
-    @try {
-        /* AST ruleLabelDefs */
-        SimpleCParser_declaration_return * declaration1 = nil;
-
-
-
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:17:5: ( ( declaration )+ ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:17:9: ( declaration )+ // alt
-        {
-        root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
-
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:17:9: ( declaration )+ // positiveClosureBlock
-        NSInteger cnt1=0;
-        do {
-            NSInteger alt1=2;
-            NSInteger LA1_0 = [input LA:1];
-            if ( ((LA1_0>=K_ID && LA1_0<=K_VOID)) ) {
-                alt1=1;
-            }
-
-
-            switch (alt1) {
-                case 1 : ;
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:17:9: declaration // alt
-                    {
-                    /* ASTParser ruleRef */
-                    [self pushFollow:FOLLOW_declaration_in_program85];
-                    declaration1 = [self declaration];
-                    [self popFollow];
-
-
-                    [treeAdaptor addChild:[declaration1 getTree] toTree:root_0];  /* element() */
-                     /* elements */
-                    }
-                    break;
-
-                default :
-                    if ( cnt1 >= 1 )
-                        goto loop1;
-                    ANTLREarlyExitException *eee = [ANTLREarlyExitException exceptionWithStream:input decisionNumber:1];
-                    @throw eee;
-            }
-            cnt1++;
-        } while (YES);
-        loop1: ;
-          /* element() */
-         /* elements */
-        }
-
-        /* ASTParser ruleCleanUp */
-        /* AST ruleCleanUp */
-        // token+rule list labels
-        [retval setStop:[input LT:-1]];
-
-
-            retval.tree = (ANTLRCommonTree *)[treeAdaptor rulePostProcessing:root_0];
-            [treeAdaptor setTokenBoundaries:retval.tree From:retval.startToken To:retval.stopToken];
-
-    }
-    @catch (ANTLRRecognitionException *re) {
-        [self reportError:re];
-        [self recover:input Exception:re];
-        /* ASTParser rule.setErrorReturnValue */
-        retval.tree = (ANTLRCommonTree *)[treeAdaptor errorNode:input From:retval.startToken To:[input LT:-1] Exception:re];
-
-    }    @finally {
-    }
-    return retval;
-}
-/* $ANTLR end program */
-/*
- * $ANTLR start declaration
- * /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:20:1: declaration : ( variable | functionHeader ';' -> ^( FUNC_DECL functionHeader ) | functionHeader block -> ^( FUNC_DEF functionHeader block ) );
- */
-- (SimpleCParser_declaration_return *) declaration
-{
-    /* ruleScopeSetUp */
-
-    /* AST ruleDeclarations */
-    SimpleCParser_declaration_return * retval = [SimpleCParser_declaration_return newSimpleCParser_declaration_return];
-    [retval setStart:[input LT:1]];
-
-    ANTLRCommonTree *root_0 = nil;
-
-    @try {
-        /* AST ruleLabelDefs */
-        ANTLRCommonToken *char_literal4 = nil;
-        SimpleCParser_variable_return * variable2 = nil;
-
-        SimpleCParser_functionHeader_return * functionHeader3 = nil;
-
-        SimpleCParser_functionHeader_return * functionHeader5 = nil;
-
-        SimpleCParser_block_return * block6 = nil;
-
-
-        ANTLRCommonTree *char_literal4_tree=nil;
-        ANTLRRewriteRuleTokenStream *stream_21 = 
-            [[ANTLRRewriteRuleTokenStream newANTLRRewriteRuleTokenStream:treeAdaptor
-                                                             description:@"token 21"] retain];
-        ANTLRRewriteRuleSubtreeStream *stream_functionHeader = 
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
-                                                                description:@"rule functionHeader"] retain];
-        ANTLRRewriteRuleSubtreeStream *stream_block = 
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
-                                                                description:@"rule block"] retain];
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:21:5: ( variable | functionHeader ';' -> ^( FUNC_DECL functionHeader ) | functionHeader block -> ^( FUNC_DEF functionHeader block ) ) //ruleblock
-        NSInteger alt2=3;
-        alt2 = [dfa2 predict:input];
-        switch (alt2) {
-            case 1 : ;
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:21:9: variable // alt
-                {
-                root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
-
-                /* ASTParser ruleRef */
-                [self pushFollow:FOLLOW_variable_in_declaration105];
-                variable2 = [self variable];
-                [self popFollow];
-
-
-                [treeAdaptor addChild:[variable2 getTree] toTree:root_0];  /* element() */
-                 /* elements */
-                }
-                break;
-            case 2 : ;
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:22:9: functionHeader ';' // alt
-                {
-                [self pushFollow:FOLLOW_functionHeader_in_declaration115];
-                functionHeader3 = [self functionHeader];
-                [self popFollow];
-
-
-                [stream_functionHeader addElement:[functionHeader3 getTree]];  /* element() */
-                char_literal4=(ANTLRCommonToken *)[self match:input TokenType:21 Follow:FOLLOW_21_in_declaration117];  
-                    [stream_21 addElement:char_literal4];
-                  /* element() */
-                 /* elements */
-
-                // AST REWRITE
-                // elements: functionHeader
-                // token labels: 
-                // rule labels: retval
-                // token list labels: 
-                // rule list labels: 
-                // wildcard labels: 
-                 [retval setTree:root_0];
-
-                retval.tree = root_0;
-
-                ANTLRRewriteRuleSubtreeStream *stream_retval =
-                    [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
-                                                                        description:@"token retval"
-                                                                            element:retval!=nil?[retval getTree]:nil] retain];
-
-                root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
-
-                // 22:28: -> ^( FUNC_DECL functionHeader )
-                {
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:22:31: ^( FUNC_DECL functionHeader )
-                    {
-                        ANTLRCommonTree *root_1 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
-                        root_1 = (ANTLRCommonTree *)[treeAdaptor becomeRoot:[[treeAdaptor createTree:(NSInteger)FUNC_DECL Text:[[ANTLRBaseRecognizer getTokenNames] objectAtIndex:(NSUInteger)FUNC_DECL]] retain]
-                                                                               old:root_1];
-
-                        [treeAdaptor addChild:[stream_functionHeader nextTree] toTree:root_1];
-
-                        [treeAdaptor addChild:root_1 toTree:root_0];
-                    }
-
-                }
-
-                retval.tree = root_0;
-
-                }
-                break;
-            case 3 : ;
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:23:9: functionHeader block // alt
-                {
-                [self pushFollow:FOLLOW_functionHeader_in_declaration135];
-                functionHeader5 = [self functionHeader];
-                [self popFollow];
-
-
-                [stream_functionHeader addElement:[functionHeader5 getTree]];  /* element() */
-                [self pushFollow:FOLLOW_block_in_declaration137];
-                block6 = [self block];
-                [self popFollow];
-
-
-                [stream_block addElement:[block6 getTree]];  /* element() */
-                 /* elements */
-
-                // AST REWRITE
-                // elements: functionHeader, block
-                // token labels: 
-                // rule labels: retval
-                // token list labels: 
-                // rule list labels: 
-                // wildcard labels: 
-                 [retval setTree:root_0];
-
-                retval.tree = root_0;
-
-                ANTLRRewriteRuleSubtreeStream *stream_retval =
-                    [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
-                                                                        description:@"token retval"
-                                                                            element:retval!=nil?[retval getTree]:nil] retain];
-
-                root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
-
-                // 23:30: -> ^( FUNC_DEF functionHeader block )
-                {
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:23:33: ^( FUNC_DEF functionHeader block )
-                    {
-                        ANTLRCommonTree *root_1 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
-                        root_1 = (ANTLRCommonTree *)[treeAdaptor becomeRoot:[[treeAdaptor createTree:(NSInteger)FUNC_DEF Text:[[ANTLRBaseRecognizer getTokenNames] objectAtIndex:(NSUInteger)FUNC_DEF]] retain]
-                                                                               old:root_1];
-
-                        [treeAdaptor addChild:[stream_functionHeader nextTree] toTree:root_1];
-                        [treeAdaptor addChild:[stream_block nextTree] toTree:root_1];
-
-                        [treeAdaptor addChild:root_1 toTree:root_0];
-                    }
-
-                }
-
-                retval.tree = root_0;
-
-                }
-                break;
-
-        }
-        /* ASTParser ruleCleanUp */
-        /* AST ruleCleanUp */
-        // token+rule list labels
-        [retval setStop:[input LT:-1]];
-
-        [stream_21 release];
-        [stream_functionHeader release];
-        [stream_block release];
-
-            retval.tree = (ANTLRCommonTree *)[treeAdaptor rulePostProcessing:root_0];
-            [treeAdaptor setTokenBoundaries:retval.tree From:retval.startToken To:retval.stopToken];
-
-    }
-    @catch (ANTLRRecognitionException *re) {
-        [self reportError:re];
-        [self recover:input Exception:re];
-        /* ASTParser rule.setErrorReturnValue */
-        retval.tree = (ANTLRCommonTree *)[treeAdaptor errorNode:input From:retval.startToken To:[input LT:-1] Exception:re];
-
-    }    @finally {
-    }
-    return retval;
-}
-/* $ANTLR end declaration */
-/*
- * $ANTLR start variable
- * /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:26:1: variable : type declarator ';' -> ^( VAR_DEF type declarator ) ;
- */
-- (SimpleCParser_variable_return *) variable
-{
-    /* ruleScopeSetUp */
-
-    /* AST ruleDeclarations */
-    SimpleCParser_variable_return * retval = [SimpleCParser_variable_return newSimpleCParser_variable_return];
-    [retval setStart:[input LT:1]];
-
-    ANTLRCommonTree *root_0 = nil;
-
-    @try {
-        /* AST ruleLabelDefs */
-        ANTLRCommonToken *char_literal9 = nil;
-        SimpleCParser_type_return * type7 = nil;
-
-        SimpleCParser_declarator_return * declarator8 = nil;
-
-
-        ANTLRCommonTree *char_literal9_tree=nil;
-        ANTLRRewriteRuleTokenStream *stream_21 = 
-            [[ANTLRRewriteRuleTokenStream newANTLRRewriteRuleTokenStream:treeAdaptor
-                                                             description:@"token 21"] retain];
-        ANTLRRewriteRuleSubtreeStream *stream_declarator = 
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
-                                                                description:@"rule declarator"] retain];
-        ANTLRRewriteRuleSubtreeStream *stream_type = 
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
-                                                                description:@"rule type"] retain];
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:27:5: ( type declarator ';' -> ^( VAR_DEF type declarator ) ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:27:9: type declarator ';' // alt
-        {
-        [self pushFollow:FOLLOW_type_in_variable166];
-        type7 = [self type];
-        [self popFollow];
-
-
-        [stream_type addElement:[type7 getTree]];  /* element() */
-        [self pushFollow:FOLLOW_declarator_in_variable168];
-        declarator8 = [self declarator];
-        [self popFollow];
-
-
-        [stream_declarator addElement:[declarator8 getTree]];  /* element() */
-        char_literal9=(ANTLRCommonToken *)[self match:input TokenType:21 Follow:FOLLOW_21_in_variable170];  
-            [stream_21 addElement:char_literal9];
-          /* element() */
-         /* elements */
-
-        // AST REWRITE
-        // elements: type, declarator
-        // token labels: 
-        // rule labels: retval
-        // token list labels: 
-        // rule list labels: 
-        // wildcard labels: 
-         [retval setTree:root_0];
-
-        retval.tree = root_0;
-
-        ANTLRRewriteRuleSubtreeStream *stream_retval =
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
-                                                                description:@"token retval"
-                                                                    element:retval!=nil?[retval getTree]:nil] retain];
-
-        root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
-
-        // 27:29: -> ^( VAR_DEF type declarator )
-        {
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:27:32: ^( VAR_DEF type declarator )
-            {
-                ANTLRCommonTree *root_1 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
-                root_1 = (ANTLRCommonTree *)[treeAdaptor becomeRoot:[[treeAdaptor createTree:(NSInteger)VAR_DEF Text:[[ANTLRBaseRecognizer getTokenNames] objectAtIndex:(NSUInteger)VAR_DEF]] retain]
-                                                                       old:root_1];
-
-                [treeAdaptor addChild:[stream_type nextTree] toTree:root_1];
-                [treeAdaptor addChild:[stream_declarator nextTree] toTree:root_1];
-
-                [treeAdaptor addChild:root_1 toTree:root_0];
-            }
-
-        }
-
-        retval.tree = root_0;
-
-        }
-
-        /* ASTParser ruleCleanUp */
-        /* AST ruleCleanUp */
-        // token+rule list labels
-        [retval setStop:[input LT:-1]];
-
-        [stream_21 release];
-        [stream_declarator release];
-        [stream_type release];
-
-            retval.tree = (ANTLRCommonTree *)[treeAdaptor rulePostProcessing:root_0];
-            [treeAdaptor setTokenBoundaries:retval.tree From:retval.startToken To:retval.stopToken];
-
-    }
-    @catch (ANTLRRecognitionException *re) {
-        [self reportError:re];
-        [self recover:input Exception:re];
-        /* ASTParser rule.setErrorReturnValue */
-        retval.tree = (ANTLRCommonTree *)[treeAdaptor errorNode:input From:retval.startToken To:[input LT:-1] Exception:re];
-
-    }    @finally {
-    }
-    return retval;
-}
-/* $ANTLR end variable */
-/*
- * $ANTLR start declarator
- * /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:30:1: declarator : K_ID ;
- */
-- (SimpleCParser_declarator_return *) declarator
-{
-    /* ruleScopeSetUp */
-
-    /* AST ruleDeclarations */
-    SimpleCParser_declarator_return * retval = [SimpleCParser_declarator_return newSimpleCParser_declarator_return];
-    [retval setStart:[input LT:1]];
-
-    ANTLRCommonTree *root_0 = nil;
-
-    @try {
-        /* AST ruleLabelDefs */
-        ANTLRCommonToken *K_ID10 = nil;
-
-        ANTLRCommonTree *K_ID10_tree=nil;
-
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:31:5: ( K_ID ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:31:9: K_ID // alt
-        {
-        root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
-
-        /* ASTParser tokenRef */
-        K_ID10=(ANTLRCommonToken *)[self match:input TokenType:K_ID Follow:FOLLOW_K_ID_in_declarator199]; 
-        K_ID10_tree = /* ASTParser createNodeFromToken */
-        (ANTLRCommonTree *)[[treeAdaptor createTree:K_ID10] retain];
-        [treeAdaptor addChild:K_ID10_tree  toTree:root_0];
-          /* element() */
-         /* elements */
-        }
-
-        /* ASTParser ruleCleanUp */
-        /* AST ruleCleanUp */
-        // token+rule list labels
-        [retval setStop:[input LT:-1]];
-
-
-            retval.tree = (ANTLRCommonTree *)[treeAdaptor rulePostProcessing:root_0];
-            [treeAdaptor setTokenBoundaries:retval.tree From:retval.startToken To:retval.stopToken];
-
-    }
-    @catch (ANTLRRecognitionException *re) {
-        [self reportError:re];
-        [self recover:input Exception:re];
-        /* ASTParser rule.setErrorReturnValue */
-        retval.tree = (ANTLRCommonTree *)[treeAdaptor errorNode:input From:retval.startToken To:[input LT:-1] Exception:re];
-
-    }    @finally {
-    }
-    return retval;
-}
-/* $ANTLR end declarator */
-/*
- * $ANTLR start functionHeader
- * /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:34:1: functionHeader : type K_ID '(' ( formalParameter ( ',' formalParameter )* )? ')' -> ^( FUNC_HDR type K_ID ( formalParameter )+ ) ;
- */
-- (SimpleCParser_functionHeader_return *) functionHeader
-{
-    /* ruleScopeSetUp */
-
-    /* AST ruleDeclarations */
-    SimpleCParser_functionHeader_return * retval = [SimpleCParser_functionHeader_return newSimpleCParser_functionHeader_return];
-    [retval setStart:[input LT:1]];
-
-    ANTLRCommonTree *root_0 = nil;
-
-    @try {
-        /* AST ruleLabelDefs */
-        ANTLRCommonToken *K_ID12 = nil;
-        ANTLRCommonToken *char_literal13 = nil;
-        ANTLRCommonToken *char_literal15 = nil;
-        ANTLRCommonToken *char_literal17 = nil;
-        SimpleCParser_type_return * type11 = nil;
-
-        SimpleCParser_formalParameter_return * formalParameter14 = nil;
-
-        SimpleCParser_formalParameter_return * formalParameter16 = nil;
-
-
-        ANTLRCommonTree *K_ID12_tree=nil;
-        ANTLRCommonTree *char_literal13_tree=nil;
-        ANTLRCommonTree *char_literal15_tree=nil;
-        ANTLRCommonTree *char_literal17_tree=nil;
-        ANTLRRewriteRuleTokenStream *stream_K_ID = 
-            [[ANTLRRewriteRuleTokenStream newANTLRRewriteRuleTokenStream:treeAdaptor
-                                                             description:@"token K_ID"] retain];
-        ANTLRRewriteRuleTokenStream *stream_22 = 
-            [[ANTLRRewriteRuleTokenStream newANTLRRewriteRuleTokenStream:treeAdaptor
-                                                             description:@"token 22"] retain];
-        ANTLRRewriteRuleTokenStream *stream_23 = 
-            [[ANTLRRewriteRuleTokenStream newANTLRRewriteRuleTokenStream:treeAdaptor
-                                                             description:@"token 23"] retain];
-        ANTLRRewriteRuleTokenStream *stream_24 = 
-            [[ANTLRRewriteRuleTokenStream newANTLRRewriteRuleTokenStream:treeAdaptor
-                                                             description:@"token 24"] retain];
-        ANTLRRewriteRuleSubtreeStream *stream_formalParameter = 
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
-                                                                description:@"rule formalParameter"] retain];
-        ANTLRRewriteRuleSubtreeStream *stream_type = 
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
-                                                                description:@"rule type"] retain];
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:35:5: ( type K_ID '(' ( formalParameter ( ',' formalParameter )* )? ')' -> ^( FUNC_HDR type K_ID ( formalParameter )+ ) ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:35:9: type K_ID '(' ( formalParameter ( ',' formalParameter )* )? ')' // alt
-        {
-        [self pushFollow:FOLLOW_type_in_functionHeader219];
-        type11 = [self type];
-        [self popFollow];
-
-
-        [stream_type addElement:[type11 getTree]];  /* element() */
-        K_ID12=(ANTLRCommonToken *)[self match:input TokenType:K_ID Follow:FOLLOW_K_ID_in_functionHeader221];  
-            [stream_K_ID addElement:K_ID12];
-          /* element() */
-        char_literal13=(ANTLRCommonToken *)[self match:input TokenType:22 Follow:FOLLOW_22_in_functionHeader223];  
-            [stream_22 addElement:char_literal13];
-          /* element() */
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:35:23: ( formalParameter ( ',' formalParameter )* )? // block
-        NSInteger alt4=2;
-        NSInteger LA4_0 = [input LA:1];
-
-        if ( ((LA4_0>=K_ID && LA4_0<=K_VOID)) ) {
-            alt4=1;
-        }
-        switch (alt4) {
-            case 1 : ;
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:35:25: formalParameter ( ',' formalParameter )* // alt
-                {
-                [self pushFollow:FOLLOW_formalParameter_in_functionHeader227];
-                formalParameter14 = [self formalParameter];
-                [self popFollow];
-
-
-                [stream_formalParameter addElement:[formalParameter14 getTree]];  /* element() */
-                do {
-                    NSInteger alt3=2;
-                    NSInteger LA3_0 = [input LA:1];
-                    if ( (LA3_0==23) ) {
-                        alt3=1;
-                    }
-
-
-                    switch (alt3) {
-                        case 1 : ;
-                            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:35:43: ',' formalParameter // alt
-                            {
-                            char_literal15=(ANTLRCommonToken *)[self match:input TokenType:23 Follow:FOLLOW_23_in_functionHeader231];  
-                                [stream_23 addElement:char_literal15];
-                              /* element() */
-                            [self pushFollow:FOLLOW_formalParameter_in_functionHeader233];
-                            formalParameter16 = [self formalParameter];
-                            [self popFollow];
-
-
-                            [stream_formalParameter addElement:[formalParameter16 getTree]];  /* element() */
-                             /* elements */
-                            }
-                            break;
-
-                        default :
-                            goto loop3;
-                    }
-                } while (YES);
-                loop3: ;
-                  /* element() */
-                 /* elements */
-                }
-                break;
-
-        }
-          /* element() */
-        char_literal17=(ANTLRCommonToken *)[self match:input TokenType:24 Follow:FOLLOW_24_in_functionHeader241];  
-            [stream_24 addElement:char_literal17];
-          /* element() */
-         /* elements */
-
-        // AST REWRITE
-        // elements: K_ID, formalParameter, type
-        // token labels: 
-        // rule labels: retval
-        // token list labels: 
-        // rule list labels: 
-        // wildcard labels: 
-         [retval setTree:root_0];
-
-        retval.tree = root_0;
-
-        ANTLRRewriteRuleSubtreeStream *stream_retval =
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
-                                                                description:@"token retval"
-                                                                    element:retval!=nil?[retval getTree]:nil] retain];
-
-        root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
-
-        // 36:9: -> ^( FUNC_HDR type K_ID ( formalParameter )+ )
-        {
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:36:12: ^( FUNC_HDR type K_ID ( formalParameter )+ )
-            {
-                ANTLRCommonTree *root_1 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
-                root_1 = (ANTLRCommonTree *)[treeAdaptor becomeRoot:[[treeAdaptor createTree:(NSInteger)FUNC_HDR Text:[[ANTLRBaseRecognizer getTokenNames] objectAtIndex:(NSUInteger)FUNC_HDR]] retain]
-                                                                       old:root_1];
-
-                [treeAdaptor addChild:[stream_type nextTree] toTree:root_1];
-                 // TODO: args: 
-                [treeAdaptor addChild:[stream_K_ID nextNode] toTree:root_1];
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:36:33: ( formalParameter )+
-                {
-                if ( !([stream_formalParameter hasNext]) ) {
-                    @throw [NSException exceptionWithName:@"RewriteEarlyExitException" reason:nil userInfo:nil];
-                }
-                while ( [stream_formalParameter hasNext] ) {
-                    [treeAdaptor addChild:[stream_formalParameter nextTree] toTree:root_1];
-
-                }
-                [stream_formalParameter reset];
-
-                }
-                [treeAdaptor addChild:root_1 toTree:root_0];
-            }
-
-        }
-
-        retval.tree = root_0;
-
-        }
-
-        /* ASTParser ruleCleanUp */
-        /* AST ruleCleanUp */
-        // token+rule list labels
-        [retval setStop:[input LT:-1]];
-
-        [stream_K_ID release];
-        [stream_22 release];
-        [stream_23 release];
-        [stream_24 release];
-        [stream_formalParameter release];
-        [stream_type release];
-
-            retval.tree = (ANTLRCommonTree *)[treeAdaptor rulePostProcessing:root_0];
-            [treeAdaptor setTokenBoundaries:retval.tree From:retval.startToken To:retval.stopToken];
-
-    }
-    @catch (ANTLRRecognitionException *re) {
-        [self reportError:re];
-        [self recover:input Exception:re];
-        /* ASTParser rule.setErrorReturnValue */
-        retval.tree = (ANTLRCommonTree *)[treeAdaptor errorNode:input From:retval.startToken To:[input LT:-1] Exception:re];
-
-    }    @finally {
-    }
-    return retval;
-}
-/* $ANTLR end functionHeader */
-/*
- * $ANTLR start formalParameter
- * /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:39:1: formalParameter : type declarator -> ^( ARG_DEF type declarator ) ;
- */
-- (SimpleCParser_formalParameter_return *) formalParameter
-{
-    /* ruleScopeSetUp */
-
-    /* AST ruleDeclarations */
-    SimpleCParser_formalParameter_return * retval = [SimpleCParser_formalParameter_return newSimpleCParser_formalParameter_return];
-    [retval setStart:[input LT:1]];
-
-    ANTLRCommonTree *root_0 = nil;
-
-    @try {
-        /* AST ruleLabelDefs */
-        SimpleCParser_type_return * type18 = nil;
-
-        SimpleCParser_declarator_return * declarator19 = nil;
-
-
-        ANTLRRewriteRuleSubtreeStream *stream_declarator = 
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
-                                                                description:@"rule declarator"] retain];
-        ANTLRRewriteRuleSubtreeStream *stream_type = 
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
-                                                                description:@"rule type"] retain];
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:40:5: ( type declarator -> ^( ARG_DEF type declarator ) ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:40:9: type declarator // alt
-        {
-        [self pushFollow:FOLLOW_type_in_formalParameter281];
-        type18 = [self type];
-        [self popFollow];
-
-
-        [stream_type addElement:[type18 getTree]];  /* element() */
-        [self pushFollow:FOLLOW_declarator_in_formalParameter283];
-        declarator19 = [self declarator];
-        [self popFollow];
-
-
-        [stream_declarator addElement:[declarator19 getTree]];  /* element() */
-         /* elements */
-
-        // AST REWRITE
-        // elements: declarator, type
-        // token labels: 
-        // rule labels: retval
-        // token list labels: 
-        // rule list labels: 
-        // wildcard labels: 
-         [retval setTree:root_0];
-
-        retval.tree = root_0;
-
-        ANTLRRewriteRuleSubtreeStream *stream_retval =
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
-                                                                description:@"token retval"
-                                                                    element:retval!=nil?[retval getTree]:nil] retain];
-
-        root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
-
-        // 40:25: -> ^( ARG_DEF type declarator )
-        {
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:40:28: ^( ARG_DEF type declarator )
-            {
-                ANTLRCommonTree *root_1 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
-                root_1 = (ANTLRCommonTree *)[treeAdaptor becomeRoot:[[treeAdaptor createTree:(NSInteger)ARG_DEF Text:[[ANTLRBaseRecognizer getTokenNames] objectAtIndex:(NSUInteger)ARG_DEF]] retain]
-                                                                       old:root_1];
-
-                [treeAdaptor addChild:[stream_type nextTree] toTree:root_1];
-                [treeAdaptor addChild:[stream_declarator nextTree] toTree:root_1];
-
-                [treeAdaptor addChild:root_1 toTree:root_0];
-            }
-
-        }
-
-        retval.tree = root_0;
-
-        }
-
-        /* ASTParser ruleCleanUp */
-        /* AST ruleCleanUp */
-        // token+rule list labels
-        [retval setStop:[input LT:-1]];
-
-        [stream_declarator release];
-        [stream_type release];
-
-            retval.tree = (ANTLRCommonTree *)[treeAdaptor rulePostProcessing:root_0];
-            [treeAdaptor setTokenBoundaries:retval.tree From:retval.startToken To:retval.stopToken];
-
-    }
-    @catch (ANTLRRecognitionException *re) {
-        [self reportError:re];
-        [self recover:input Exception:re];
-        /* ASTParser rule.setErrorReturnValue */
-        retval.tree = (ANTLRCommonTree *)[treeAdaptor errorNode:input From:retval.startToken To:[input LT:-1] Exception:re];
-
-    }    @finally {
-    }
-    return retval;
-}
-/* $ANTLR end formalParameter */
-/*
- * $ANTLR start type
- * /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:43:1: type : ( K_INT | K_CHAR | K_VOID | K_ID );
- */
-- (SimpleCParser_type_return *) type
-{
-    /* ruleScopeSetUp */
-
-    /* AST ruleDeclarations */
-    SimpleCParser_type_return * retval = [SimpleCParser_type_return newSimpleCParser_type_return];
-    [retval setStart:[input LT:1]];
-
-    ANTLRCommonTree *root_0 = nil;
-
-    @try {
-        /* AST ruleLabelDefs */
-        ANTLRCommonToken *set20 = nil;
-
-        ANTLRCommonTree *set20_tree=nil;
-
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:44:5: ( K_INT | K_CHAR | K_VOID | K_ID ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g: // alt
-        {
-        root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
-
-        /* ASTParser matchRuleBlockSet */
-        /* ASTParser matchSet */
-        set20 = (ANTLRCommonToken *)[input LT:1];
-        if ((([input LA:1] >= K_ID) && ([input LA:1] <= K_VOID))) {
-            [input consume];
-                [treeAdaptor addChild:/* ASTParser createNodeFromToken */
-            (ANTLRCommonTree *)[[treeAdaptor createTree:set20] retain] toTree:root_0 ];
-            [state setIsErrorRecovery:NO];
-        } else {
-            ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException exceptionWithSet:nil stream:input];
-            @throw mse;
-        }
-          /* element() */
-         /* elements */
-        }
-
-        /* ASTParser ruleCleanUp */
-        /* AST ruleCleanUp */
-        // token+rule list labels
-        [retval setStop:[input LT:-1]];
-
-
-            retval.tree = (ANTLRCommonTree *)[treeAdaptor rulePostProcessing:root_0];
-            [treeAdaptor setTokenBoundaries:retval.tree From:retval.startToken To:retval.stopToken];
-
-    }
-    @catch (ANTLRRecognitionException *re) {
-        [self reportError:re];
-        [self recover:input Exception:re];
-        /* ASTParser rule.setErrorReturnValue */
-        retval.tree = (ANTLRCommonTree *)[treeAdaptor errorNode:input From:retval.startToken To:[input LT:-1] Exception:re];
-
-    }    @finally {
-    }
-    return retval;
-}
-/* $ANTLR end type */
-/*
- * $ANTLR start block
- * /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:50:1: block : lc= '{' ( variable )* ( stat )* '}' -> ^( BLOCK[$lc,@\"BLOCK\"] ( variable )* ( stat )* ) ;
- */
-- (SimpleCParser_block_return *) block
-{
-    /* ruleScopeSetUp */
-
-    /* AST ruleDeclarations */
-    SimpleCParser_block_return * retval = [SimpleCParser_block_return newSimpleCParser_block_return];
-    [retval setStart:[input LT:1]];
-
-    ANTLRCommonTree *root_0 = nil;
-
-    @try {
-        /* AST ruleLabelDefs */
-        ANTLRCommonToken *lc = nil;
-        ANTLRCommonToken *char_literal23 = nil;
-        SimpleCParser_variable_return * variable21 = nil;
-
-        SimpleCParser_stat_return * stat22 = nil;
-
-
-        ANTLRCommonTree *lc_tree=nil;
-        ANTLRCommonTree *char_literal23_tree=nil;
-        ANTLRRewriteRuleTokenStream *stream_25 = 
-            [[ANTLRRewriteRuleTokenStream newANTLRRewriteRuleTokenStream:treeAdaptor
-                                                             description:@"token 25"] retain];
-        ANTLRRewriteRuleTokenStream *stream_26 = 
-            [[ANTLRRewriteRuleTokenStream newANTLRRewriteRuleTokenStream:treeAdaptor
-                                                             description:@"token 26"] retain];
-        ANTLRRewriteRuleSubtreeStream *stream_variable = 
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
-                                                                description:@"rule variable"] retain];
-        ANTLRRewriteRuleSubtreeStream *stream_stat = 
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
-                                                                description:@"rule stat"] retain];
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:51:5: (lc= '{' ( variable )* ( stat )* '}' -> ^( BLOCK[$lc,@\"BLOCK\"] ( variable )* ( stat )* ) ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:51:9: lc= '{' ( variable )* ( stat )* '}' // alt
-        {
-        lc=(ANTLRCommonToken *)[self match:input TokenType:25 Follow:FOLLOW_25_in_block376];  
-            [stream_25 addElement:lc];
-          /* element() */
-        do {
-            NSInteger alt5=2;
-            switch ([input LA:1]) {
-                case K_ID: ;
-                    {
-                    NSInteger LA5_2 = [input LA:2];
-                    if ( (LA5_2==K_ID) ) {
-                        alt5=1;
-                    }
-
-
-                    }
-                    break;
-                case K_INT: ;
-                    {
-                    NSInteger LA5_3 = [input LA:2];
-                    if ( (LA5_3==K_ID) ) {
-                        alt5=1;
-                    }
-
-
-                    }
-                    break;
-                case K_CHAR: ;
-                case K_VOID: ;
-                    {
-                    alt5=1;
-                    }
-                    break;
-
-            }
-
-            switch (alt5) {
-                case 1 : ;
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:52:13: variable // alt
-                    {
-                    [self pushFollow:FOLLOW_variable_in_block390];
-                    variable21 = [self variable];
-                    [self popFollow];
-
-
-                    [stream_variable addElement:[variable21 getTree]];  /* element() */
-                     /* elements */
-                    }
-                    break;
-
-                default :
-                    goto loop5;
-            }
-        } while (YES);
-        loop5: ;
-          /* element() */
-        do {
-            NSInteger alt6=2;
-            NSInteger LA6_0 = [input LA:1];
-            if ( ((LA6_0>=K_ID && LA6_0<=K_INT)||LA6_0==K_FOR||(LA6_0>=21 && LA6_0<=22)||LA6_0==25) ) {
-                alt6=1;
-            }
-
-
-            switch (alt6) {
-                case 1 : ;
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:53:13: stat // alt
-                    {
-                    [self pushFollow:FOLLOW_stat_in_block405];
-                    stat22 = [self stat];
-                    [self popFollow];
-
-
-                    [stream_stat addElement:[stat22 getTree]];  /* element() */
-                     /* elements */
-                    }
-                    break;
-
-                default :
-                    goto loop6;
-            }
-        } while (YES);
-        loop6: ;
-          /* element() */
-        char_literal23=(ANTLRCommonToken *)[self match:input TokenType:26 Follow:FOLLOW_26_in_block416];  
-            [stream_26 addElement:char_literal23];
-          /* element() */
-         /* elements */
-
-        // AST REWRITE
-        // elements: stat, variable
-        // token labels: 
-        // rule labels: retval
-        // token list labels: 
-        // rule list labels: 
-        // wildcard labels: 
-         [retval setTree:root_0];
-
-        retval.tree = root_0;
-
-        ANTLRRewriteRuleSubtreeStream *stream_retval =
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
-                                                                description:@"token retval"
-                                                                    element:retval!=nil?[retval getTree]:nil] retain];
-
-        root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
-
-        // 55:9: -> ^( BLOCK[$lc,@\"BLOCK\"] ( variable )* ( stat )* )
-        {
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:55:12: ^( BLOCK[$lc,@\"BLOCK\"] ( variable )* ( stat )* )
-            {
-                ANTLRCommonTree *root_1 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
-                root_1 = (ANTLRCommonTree *)[treeAdaptor becomeRoot:[[treeAdaptor createTree:(NSInteger)BLOCK Text:[[ANTLRBaseRecognizer getTokenNames] objectAtIndex:(NSUInteger)BLOCK]] retain]
-                                                                       old:root_1];
-
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:55:34: ( variable )*
-                while ( [stream_variable hasNext] ) {
-                    [treeAdaptor addChild:[stream_variable nextTree] toTree:root_1];
-
-                }
-                [stream_variable reset];
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:55:44: ( stat )*
-                while ( [stream_stat hasNext] ) {
-                    [treeAdaptor addChild:[stream_stat nextTree] toTree:root_1];
-
-                }
-                [stream_stat reset];
-
-                [treeAdaptor addChild:root_1 toTree:root_0];
-            }
-
-        }
-
-        retval.tree = root_0;
-
-        }
-
-        /* ASTParser ruleCleanUp */
-        /* AST ruleCleanUp */
-        // token+rule list labels
-        [retval setStop:[input LT:-1]];
-
-        [stream_25 release];
-        [stream_26 release];
-        [stream_variable release];
-        [stream_stat release];
-
-            retval.tree = (ANTLRCommonTree *)[treeAdaptor rulePostProcessing:root_0];
-            [treeAdaptor setTokenBoundaries:retval.tree From:retval.startToken To:retval.stopToken];
-
-    }
-    @catch (ANTLRRecognitionException *re) {
-        [self reportError:re];
-        [self recover:input Exception:re];
-        /* ASTParser rule.setErrorReturnValue */
-        retval.tree = (ANTLRCommonTree *)[treeAdaptor errorNode:input From:retval.startToken To:[input LT:-1] Exception:re];
-
-    }    @finally {
-    }
-    return retval;
-}
-/* $ANTLR end block */
-/*
- * $ANTLR start stat
- * /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:58:1: stat : ( forStat | expr ';' | block | assignStat ';' | ';' );
- */
-- (SimpleCParser_stat_return *) stat
-{
-    /* ruleScopeSetUp */
-
-    /* AST ruleDeclarations */
-    SimpleCParser_stat_return * retval = [SimpleCParser_stat_return newSimpleCParser_stat_return];
-    [retval setStart:[input LT:1]];
-
-    ANTLRCommonTree *root_0 = nil;
-
-    @try {
-        /* AST ruleLabelDefs */
-        ANTLRCommonToken *char_literal26 = nil;
-        ANTLRCommonToken *char_literal29 = nil;
-        ANTLRCommonToken *char_literal30 = nil;
-        SimpleCParser_forStat_return * forStat24 = nil;
-
-        SimpleCParser_expr_return * expr25 = nil;
-
-        SimpleCParser_block_return * block27 = nil;
-
-        SimpleCParser_assignStat_return * assignStat28 = nil;
-
-
-        ANTLRCommonTree *char_literal26_tree=nil;
-        ANTLRCommonTree *char_literal29_tree=nil;
-        ANTLRCommonTree *char_literal30_tree=nil;
-
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:58:5: ( forStat | expr ';' | block | assignStat ';' | ';' ) //ruleblock
-        NSInteger alt7=5;
-        switch ([input LA:1]) {
-            case K_FOR: ;
-                {
-                alt7=1;
-                }
-                break;
-            case K_ID: ;
-                {
-                NSInteger LA7_2 = [input LA:2];
-
-                if ( (LA7_2==K_EQ) ) {
-                    alt7=4;
-                }
-                else if ( ((LA7_2>=K_EQEQ && LA7_2<=K_PLUS)||LA7_2==21) ) {
-                    alt7=2;
-                }
-                else {
-                    ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newANTLRNoViableAltException:7 state:2 stream:input];
-                    @throw nvae;
-                }
-                }
-                break;
-            case K_INT: ;
-            case 22: ;
-                {
-                alt7=2;
-                }
-                break;
-            case 25: ;
-                {
-                alt7=3;
-                }
-                break;
-            case 21: ;
-                {
-                alt7=5;
-                }
-                break;
-
-        default: ;
-            ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newANTLRNoViableAltException:7 state:0 stream:input];
-            @throw nvae;
-        }
-
-        switch (alt7) {
-            case 1 : ;
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:58:7: forStat // alt
-                {
-                root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
-
-                /* ASTParser ruleRef */
-                [self pushFollow:FOLLOW_forStat_in_stat449];
-                forStat24 = [self forStat];
-                [self popFollow];
-
-
-                [treeAdaptor addChild:[forStat24 getTree] toTree:root_0];  /* element() */
-                 /* elements */
-                }
-                break;
-            case 2 : ;
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:59:7: expr ';' // alt
-                {
-                root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
-
-                /* ASTParser ruleRef */
-                [self pushFollow:FOLLOW_expr_in_stat457];
-                expr25 = [self expr];
-                [self popFollow];
-
-
-                [treeAdaptor addChild:[expr25 getTree] toTree:root_0];  /* element() */
-                char_literal26=(ANTLRCommonToken *)[self match:input TokenType:21 Follow:FOLLOW_21_in_stat459];   /* element() */
-                 /* elements */
-                }
-                break;
-            case 3 : ;
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:60:7: block // alt
-                {
-                root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
-
-                /* ASTParser ruleRef */
-                [self pushFollow:FOLLOW_block_in_stat468];
-                block27 = [self block];
-                [self popFollow];
-
-
-                [treeAdaptor addChild:[block27 getTree] toTree:root_0];  /* element() */
-                 /* elements */
-                }
-                break;
-            case 4 : ;
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:61:7: assignStat ';' // alt
-                {
-                root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
-
-                /* ASTParser ruleRef */
-                [self pushFollow:FOLLOW_assignStat_in_stat476];
-                assignStat28 = [self assignStat];
-                [self popFollow];
-
-
-                [treeAdaptor addChild:[assignStat28 getTree] toTree:root_0];  /* element() */
-                char_literal29=(ANTLRCommonToken *)[self match:input TokenType:21 Follow:FOLLOW_21_in_stat478];   /* element() */
-                 /* elements */
-                }
-                break;
-            case 5 : ;
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:62:7: ';' // alt
-                {
-                root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
-
-                char_literal30=(ANTLRCommonToken *)[self match:input TokenType:21 Follow:FOLLOW_21_in_stat487];   /* element() */
-                 /* elements */
-                }
-                break;
-
-        }
-        /* ASTParser ruleCleanUp */
-        /* AST ruleCleanUp */
-        // token+rule list labels
-        [retval setStop:[input LT:-1]];
-
-
-            retval.tree = (ANTLRCommonTree *)[treeAdaptor rulePostProcessing:root_0];
-            [treeAdaptor setTokenBoundaries:retval.tree From:retval.startToken To:retval.stopToken];
-
-    }
-    @catch (ANTLRRecognitionException *re) {
-        [self reportError:re];
-        [self recover:input Exception:re];
-        /* ASTParser rule.setErrorReturnValue */
-        retval.tree = (ANTLRCommonTree *)[treeAdaptor errorNode:input From:retval.startToken To:[input LT:-1] Exception:re];
-
-    }    @finally {
-    }
-    return retval;
-}
-/* $ANTLR end stat */
-/*
- * $ANTLR start forStat
- * /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:65:1: forStat : K_FOR '(' start= assignStat ';' expr ';' next= assignStat ')' block -> ^( K_FOR $start expr $next block ) ;
- */
-- (SimpleCParser_forStat_return *) forStat
-{
-    /* ruleScopeSetUp */
-
-    /* AST ruleDeclarations */
-    SimpleCParser_forStat_return * retval = [SimpleCParser_forStat_return newSimpleCParser_forStat_return];
-    [retval setStart:[input LT:1]];
-
-    ANTLRCommonTree *root_0 = nil;
-
-    @try {
-        /* AST ruleLabelDefs */
-        ANTLRCommonToken *K_FOR31 = nil;
-        ANTLRCommonToken *char_literal32 = nil;
-        ANTLRCommonToken *char_literal33 = nil;
-        ANTLRCommonToken *char_literal35 = nil;
-        ANTLRCommonToken *char_literal36 = nil;
-        SimpleCParser_assignStat_return * start = nil;
-
-        SimpleCParser_assignStat_return * next = nil;
-
-        SimpleCParser_expr_return * expr34 = nil;
-
-        SimpleCParser_block_return * block37 = nil;
-
-
-        ANTLRCommonTree *K_FOR31_tree=nil;
-        ANTLRCommonTree *char_literal32_tree=nil;
-        ANTLRCommonTree *char_literal33_tree=nil;
-        ANTLRCommonTree *char_literal35_tree=nil;
-        ANTLRCommonTree *char_literal36_tree=nil;
-        ANTLRRewriteRuleTokenStream *stream_21 = 
-            [[ANTLRRewriteRuleTokenStream newANTLRRewriteRuleTokenStream:treeAdaptor
-                                                             description:@"token 21"] retain];
-        ANTLRRewriteRuleTokenStream *stream_22 = 
-            [[ANTLRRewriteRuleTokenStream newANTLRRewriteRuleTokenStream:treeAdaptor
-                                                             description:@"token 22"] retain];
-        ANTLRRewriteRuleTokenStream *stream_24 = 
-            [[ANTLRRewriteRuleTokenStream newANTLRRewriteRuleTokenStream:treeAdaptor
-                                                             description:@"token 24"] retain];
-        ANTLRRewriteRuleTokenStream *stream_K_FOR = 
-            [[ANTLRRewriteRuleTokenStream newANTLRRewriteRuleTokenStream:treeAdaptor
-                                                             description:@"token K_FOR"] retain];
-        ANTLRRewriteRuleSubtreeStream *stream_assignStat = 
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
-                                                                description:@"rule assignStat"] retain];
-        ANTLRRewriteRuleSubtreeStream *stream_block = 
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
-                                                                description:@"rule block"] retain];
-        ANTLRRewriteRuleSubtreeStream *stream_expr = 
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
-                                                                description:@"rule expr"] retain];
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:66:5: ( K_FOR '(' start= assignStat ';' expr ';' next= assignStat ')' block -> ^( K_FOR $start expr $next block ) ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:66:9: K_FOR '(' start= assignStat ';' expr ';' next= assignStat ')' block // alt
-        {
-        K_FOR31=(ANTLRCommonToken *)[self match:input TokenType:K_FOR Follow:FOLLOW_K_FOR_in_forStat507];  
-            [stream_K_FOR addElement:K_FOR31];
-          /* element() */
-        char_literal32=(ANTLRCommonToken *)[self match:input TokenType:22 Follow:FOLLOW_22_in_forStat509];  
-            [stream_22 addElement:char_literal32];
-          /* element() */
-        [self pushFollow:FOLLOW_assignStat_in_forStat513];
-        start = [self assignStat];
-        [self popFollow];
-
-
-        [stream_assignStat addElement:[start getTree]];  /* element() */
-        char_literal33=(ANTLRCommonToken *)[self match:input TokenType:21 Follow:FOLLOW_21_in_forStat515];  
-            [stream_21 addElement:char_literal33];
-          /* element() */
-        [self pushFollow:FOLLOW_expr_in_forStat517];
-        expr34 = [self expr];
-        [self popFollow];
-
-
-        [stream_expr addElement:[expr34 getTree]];  /* element() */
-        char_literal35=(ANTLRCommonToken *)[self match:input TokenType:21 Follow:FOLLOW_21_in_forStat519];  
-            [stream_21 addElement:char_literal35];
-          /* element() */
-        [self pushFollow:FOLLOW_assignStat_in_forStat523];
-        next = [self assignStat];
-        [self popFollow];
-
-
-        [stream_assignStat addElement:[next getTree]];  /* element() */
-        char_literal36=(ANTLRCommonToken *)[self match:input TokenType:24 Follow:FOLLOW_24_in_forStat525];  
-            [stream_24 addElement:char_literal36];
-          /* element() */
-        [self pushFollow:FOLLOW_block_in_forStat527];
-        block37 = [self block];
-        [self popFollow];
-
-
-        [stream_block addElement:[block37 getTree]];  /* element() */
-         /* elements */
-
-        // AST REWRITE
-        // elements: K_FOR, expr, start, next, block
-        // token labels: 
-        // rule labels: retval, start, next
-        // token list labels: 
-        // rule list labels: 
-        // wildcard labels: 
-         [retval setTree:root_0];
-
-        retval.tree = root_0;
-
-        ANTLRRewriteRuleSubtreeStream *stream_retval =
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
-                                                                description:@"token retval"
-                                                                    element:retval!=nil?[retval getTree]:nil] retain];
-        ANTLRRewriteRuleSubtreeStream *stream_start =
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
-                                                                description:@"token start"
-                                                                    element:start!=nil?[start getTree]:nil] retain];
-        ANTLRRewriteRuleSubtreeStream *stream_next =
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
-                                                                description:@"token next"
-                                                                    element:next!=nil?[next getTree]:nil] retain];
-
-        root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
-
-        // 67:9: -> ^( K_FOR $start expr $next block )
-        {
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:67:12: ^( K_FOR $start expr $next block )
-            {
-                ANTLRCommonTree *root_1 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
-                root_1 = (ANTLRCommonTree *)[treeAdaptor becomeRoot:[stream_K_FOR nextNode] old:root_1];
-
-                [treeAdaptor addChild:[stream_start nextTree] toTree:root_1];
-                [treeAdaptor addChild:[stream_expr nextTree] toTree:root_1];
-                [treeAdaptor addChild:[stream_next nextTree] toTree:root_1];
-                [treeAdaptor addChild:[stream_block nextTree] toTree:root_1];
-
-                [treeAdaptor addChild:root_1 toTree:root_0];
-            }
-
-        }
-
-        retval.tree = root_0;
-
-        }
-
-        /* ASTParser ruleCleanUp */
-        /* AST ruleCleanUp */
-        // token+rule list labels
-        [retval setStop:[input LT:-1]];
-
-        [stream_21 release];
-        [stream_22 release];
-        [stream_24 release];
-        [stream_K_FOR release];
-        [stream_assignStat release];
-        [stream_block release];
-        [stream_expr release];
-
-            retval.tree = (ANTLRCommonTree *)[treeAdaptor rulePostProcessing:root_0];
-            [treeAdaptor setTokenBoundaries:retval.tree From:retval.startToken To:retval.stopToken];
-
-    }
-    @catch (ANTLRRecognitionException *re) {
-        [self reportError:re];
-        [self recover:input Exception:re];
-        /* ASTParser rule.setErrorReturnValue */
-        retval.tree = (ANTLRCommonTree *)[treeAdaptor errorNode:input From:retval.startToken To:[input LT:-1] Exception:re];
-
-    }    @finally {
-    }
-    return retval;
-}
-/* $ANTLR end forStat */
-/*
- * $ANTLR start assignStat
- * /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:70:1: assignStat : K_ID K_EQ expr -> ^( K_EQ K_ID expr ) ;
- */
-- (SimpleCParser_assignStat_return *) assignStat
-{
-    /* ruleScopeSetUp */
-
-    /* AST ruleDeclarations */
-    SimpleCParser_assignStat_return * retval = [SimpleCParser_assignStat_return newSimpleCParser_assignStat_return];
-    [retval setStart:[input LT:1]];
-
-    ANTLRCommonTree *root_0 = nil;
-
-    @try {
-        /* AST ruleLabelDefs */
-        ANTLRCommonToken *K_ID38 = nil;
-        ANTLRCommonToken *K_EQ39 = nil;
-        SimpleCParser_expr_return * expr40 = nil;
-
-
-        ANTLRCommonTree *K_ID38_tree=nil;
-        ANTLRCommonTree *K_EQ39_tree=nil;
-        ANTLRRewriteRuleTokenStream *stream_K_ID = 
-            [[ANTLRRewriteRuleTokenStream newANTLRRewriteRuleTokenStream:treeAdaptor
-                                                             description:@"token K_ID"] retain];
-        ANTLRRewriteRuleTokenStream *stream_K_EQ = 
-            [[ANTLRRewriteRuleTokenStream newANTLRRewriteRuleTokenStream:treeAdaptor
-                                                             description:@"token K_EQ"] retain];
-        ANTLRRewriteRuleSubtreeStream *stream_expr = 
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
-                                                                description:@"rule expr"] retain];
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:71:5: ( K_ID K_EQ expr -> ^( K_EQ K_ID expr ) ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:71:9: K_ID K_EQ expr // alt
-        {
-        K_ID38=(ANTLRCommonToken *)[self match:input TokenType:K_ID Follow:FOLLOW_K_ID_in_assignStat570];  
-            [stream_K_ID addElement:K_ID38];
-          /* element() */
-        K_EQ39=(ANTLRCommonToken *)[self match:input TokenType:K_EQ Follow:FOLLOW_K_EQ_in_assignStat572];  
-            [stream_K_EQ addElement:K_EQ39];
-          /* element() */
-        [self pushFollow:FOLLOW_expr_in_assignStat574];
-        expr40 = [self expr];
-        [self popFollow];
-
-
-        [stream_expr addElement:[expr40 getTree]];  /* element() */
-         /* elements */
-
-        // AST REWRITE
-        // elements: K_EQ, K_ID, expr
-        // token labels: 
-        // rule labels: retval
-        // token list labels: 
-        // rule list labels: 
-        // wildcard labels: 
-         [retval setTree:root_0];
-
-        retval.tree = root_0;
-
-        ANTLRRewriteRuleSubtreeStream *stream_retval =
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
-                                                                description:@"token retval"
-                                                                    element:retval!=nil?[retval getTree]:nil] retain];
-
-        root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
-
-        // 71:24: -> ^( K_EQ K_ID expr )
-        {
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:71:27: ^( K_EQ K_ID expr )
-            {
-                ANTLRCommonTree *root_1 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
-                root_1 = (ANTLRCommonTree *)[treeAdaptor becomeRoot:[stream_K_EQ nextNode] old:root_1];
-
-                 // TODO: args: 
-                [treeAdaptor addChild:[stream_K_ID nextNode] toTree:root_1];
-                [treeAdaptor addChild:[stream_expr nextTree] toTree:root_1];
-
-                [treeAdaptor addChild:root_1 toTree:root_0];
-            }
-
-        }
-
-        retval.tree = root_0;
-
-        }
-
-        /* ASTParser ruleCleanUp */
-        /* AST ruleCleanUp */
-        // token+rule list labels
-        [retval setStop:[input LT:-1]];
-
-        [stream_K_ID release];
-        [stream_K_EQ release];
-        [stream_expr release];
-
-            retval.tree = (ANTLRCommonTree *)[treeAdaptor rulePostProcessing:root_0];
-            [treeAdaptor setTokenBoundaries:retval.tree From:retval.startToken To:retval.stopToken];
-
-    }
-    @catch (ANTLRRecognitionException *re) {
-        [self reportError:re];
-        [self recover:input Exception:re];
-        /* ASTParser rule.setErrorReturnValue */
-        retval.tree = (ANTLRCommonTree *)[treeAdaptor errorNode:input From:retval.startToken To:[input LT:-1] Exception:re];
-
-    }    @finally {
-    }
-    return retval;
-}
-/* $ANTLR end assignStat */
-/*
- * $ANTLR start expr
- * /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:74:1: expr : condExpr ;
- */
-- (SimpleCParser_expr_return *) expr
-{
-    /* ruleScopeSetUp */
-
-    /* AST ruleDeclarations */
-    SimpleCParser_expr_return * retval = [SimpleCParser_expr_return newSimpleCParser_expr_return];
-    [retval setStart:[input LT:1]];
-
-    ANTLRCommonTree *root_0 = nil;
-
-    @try {
-        /* AST ruleLabelDefs */
-        SimpleCParser_condExpr_return * condExpr41 = nil;
-
-
-
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:74:5: ( condExpr ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:74:9: condExpr // alt
-        {
-        root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
-
-        /* ASTParser ruleRef */
-        [self pushFollow:FOLLOW_condExpr_in_expr598];
-        condExpr41 = [self condExpr];
-        [self popFollow];
-
-
-        [treeAdaptor addChild:[condExpr41 getTree] toTree:root_0];  /* element() */
-         /* elements */
-        }
-
-        /* ASTParser ruleCleanUp */
-        /* AST ruleCleanUp */
-        // token+rule list labels
-        [retval setStop:[input LT:-1]];
-
-
-            retval.tree = (ANTLRCommonTree *)[treeAdaptor rulePostProcessing:root_0];
-            [treeAdaptor setTokenBoundaries:retval.tree From:retval.startToken To:retval.stopToken];
-
-    }
-    @catch (ANTLRRecognitionException *re) {
-        [self reportError:re];
-        [self recover:input Exception:re];
-        /* ASTParser rule.setErrorReturnValue */
-        retval.tree = (ANTLRCommonTree *)[treeAdaptor errorNode:input From:retval.startToken To:[input LT:-1] Exception:re];
-
-    }    @finally {
-    }
-    return retval;
-}
-/* $ANTLR end expr */
-/*
- * $ANTLR start condExpr
- * /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:77:1: condExpr : aexpr ( ( K_EQEQ | K_LT ) aexpr )? ;
- */
-- (SimpleCParser_condExpr_return *) condExpr
-{
-    /* ruleScopeSetUp */
-
-    /* AST ruleDeclarations */
-    SimpleCParser_condExpr_return * retval = [SimpleCParser_condExpr_return newSimpleCParser_condExpr_return];
-    [retval setStart:[input LT:1]];
-
-    ANTLRCommonTree *root_0 = nil;
-
-    @try {
-        /* AST ruleLabelDefs */
-        ANTLRCommonToken *K_EQEQ43 = nil;
-        ANTLRCommonToken *K_LT44 = nil;
-        SimpleCParser_aexpr_return * aexpr42 = nil;
-
-        SimpleCParser_aexpr_return * aexpr45 = nil;
-
-
-        ANTLRCommonTree *K_EQEQ43_tree=nil;
-        ANTLRCommonTree *K_LT44_tree=nil;
-
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:78:5: ( aexpr ( ( K_EQEQ | K_LT ) aexpr )? ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:78:9: aexpr ( ( K_EQEQ | K_LT ) aexpr )? // alt
-        {
-        root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
-
-        /* ASTParser ruleRef */
-        [self pushFollow:FOLLOW_aexpr_in_condExpr617];
-        aexpr42 = [self aexpr];
-        [self popFollow];
-
-
-        [treeAdaptor addChild:[aexpr42 getTree] toTree:root_0];  /* element() */
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:78:15: ( ( K_EQEQ | K_LT ) aexpr )? // block
-        NSInteger alt9=2;
-        NSInteger LA9_0 = [input LA:1];
-
-        if ( ((LA9_0>=K_EQEQ && LA9_0<=K_LT)) ) {
-            alt9=1;
-        }
-        switch (alt9) {
-            case 1 : ;
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:78:17: ( K_EQEQ | K_LT ) aexpr // alt
-                {
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:78:17: ( K_EQEQ | K_LT ) // block
-                NSInteger alt8=2;
-                NSInteger LA8_0 = [input LA:1];
-
-                if ( (LA8_0==K_EQEQ) ) {
-                    alt8=1;
-                }
-                else if ( (LA8_0==K_LT) ) {
-                    alt8=2;
-                }
-                else {
-                    ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newANTLRNoViableAltException:8 state:0 stream:input];
-                    @throw nvae;
-                }
-                switch (alt8) {
-                    case 1 : ;
-                        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:78:18: K_EQEQ // alt
-                        {
-                        K_EQEQ43=(ANTLRCommonToken *)[self match:input TokenType:K_EQEQ Follow:FOLLOW_K_EQEQ_in_condExpr622]; 
-                        K_EQEQ43_tree = /* ASTParser createNodeFromToken */
-                        (ANTLRCommonTree *)[[treeAdaptor createTree:K_EQEQ43] retain];
-                        root_0 = (ANTLRCommonTree *)[treeAdaptor becomeRoot:K_EQEQ43_tree old:root_0];
-                          /* element() */
-                         /* elements */
-                        }
-                        break;
-                    case 2 : ;
-                        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:78:28: K_LT // alt
-                        {
-                        K_LT44=(ANTLRCommonToken *)[self match:input TokenType:K_LT Follow:FOLLOW_K_LT_in_condExpr627]; 
-                        K_LT44_tree = /* ASTParser createNodeFromToken */
-                        (ANTLRCommonTree *)[[treeAdaptor createTree:K_LT44] retain];
-                        root_0 = (ANTLRCommonTree *)[treeAdaptor becomeRoot:K_LT44_tree old:root_0];
-                          /* element() */
-                         /* elements */
-                        }
-                        break;
-
-                }
-                  /* element() */
-                /* ASTParser ruleRef */
-                [self pushFollow:FOLLOW_aexpr_in_condExpr631];
-                aexpr45 = [self aexpr];
-                [self popFollow];
-
-
-                [treeAdaptor addChild:[aexpr45 getTree] toTree:root_0];  /* element() */
-                 /* elements */
-                }
-                break;
-
-        }
-          /* element() */
-         /* elements */
-        }
-
-        /* ASTParser ruleCleanUp */
-        /* AST ruleCleanUp */
-        // token+rule list labels
-        [retval setStop:[input LT:-1]];
-
-
-            retval.tree = (ANTLRCommonTree *)[treeAdaptor rulePostProcessing:root_0];
-            [treeAdaptor setTokenBoundaries:retval.tree From:retval.startToken To:retval.stopToken];
-
-    }
-    @catch (ANTLRRecognitionException *re) {
-        [self reportError:re];
-        [self recover:input Exception:re];
-        /* ASTParser rule.setErrorReturnValue */
-        retval.tree = (ANTLRCommonTree *)[treeAdaptor errorNode:input From:retval.startToken To:[input LT:-1] Exception:re];
-
-    }    @finally {
-    }
-    return retval;
-}
-/* $ANTLR end condExpr */
-/*
- * $ANTLR start aexpr
- * /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:81:1: aexpr : atom ( K_PLUS atom )* ;
- */
-- (SimpleCParser_aexpr_return *) aexpr
-{
-    /* ruleScopeSetUp */
-
-    /* AST ruleDeclarations */
-    SimpleCParser_aexpr_return * retval = [SimpleCParser_aexpr_return newSimpleCParser_aexpr_return];
-    [retval setStart:[input LT:1]];
-
-    ANTLRCommonTree *root_0 = nil;
-
-    @try {
-        /* AST ruleLabelDefs */
-        ANTLRCommonToken *K_PLUS47 = nil;
-        SimpleCParser_atom_return * atom46 = nil;
-
-        SimpleCParser_atom_return * atom48 = nil;
-
-
-        ANTLRCommonTree *K_PLUS47_tree=nil;
-
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:82:5: ( atom ( K_PLUS atom )* ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:82:9: atom ( K_PLUS atom )* // alt
-        {
-        root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
-
-        /* ASTParser ruleRef */
-        [self pushFollow:FOLLOW_atom_in_aexpr653];
-        atom46 = [self atom];
-        [self popFollow];
-
-
-        [treeAdaptor addChild:[atom46 getTree] toTree:root_0];  /* element() */
-        do {
-            NSInteger alt10=2;
-            NSInteger LA10_0 = [input LA:1];
-            if ( (LA10_0==K_PLUS) ) {
-                alt10=1;
-            }
-
-
-            switch (alt10) {
-                case 1 : ;
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:82:16: K_PLUS atom // alt
-                    {
-                    K_PLUS47=(ANTLRCommonToken *)[self match:input TokenType:K_PLUS Follow:FOLLOW_K_PLUS_in_aexpr657]; 
-                    K_PLUS47_tree = /* ASTParser createNodeFromToken */
-                    (ANTLRCommonTree *)[[treeAdaptor createTree:K_PLUS47] retain];
-                    root_0 = (ANTLRCommonTree *)[treeAdaptor becomeRoot:K_PLUS47_tree old:root_0];
-                      /* element() */
-                    /* ASTParser ruleRef */
-                    [self pushFollow:FOLLOW_atom_in_aexpr660];
-                    atom48 = [self atom];
-                    [self popFollow];
-
-
-                    [treeAdaptor addChild:[atom48 getTree] toTree:root_0];  /* element() */
-                     /* elements */
-                    }
-                    break;
-
-                default :
-                    goto loop10;
-            }
-        } while (YES);
-        loop10: ;
-          /* element() */
-         /* elements */
-        }
-
-        /* ASTParser ruleCleanUp */
-        /* AST ruleCleanUp */
-        // token+rule list labels
-        [retval setStop:[input LT:-1]];
-
-
-            retval.tree = (ANTLRCommonTree *)[treeAdaptor rulePostProcessing:root_0];
-            [treeAdaptor setTokenBoundaries:retval.tree From:retval.startToken To:retval.stopToken];
-
-    }
-    @catch (ANTLRRecognitionException *re) {
-        [self reportError:re];
-        [self recover:input Exception:re];
-        /* ASTParser rule.setErrorReturnValue */
-        retval.tree = (ANTLRCommonTree *)[treeAdaptor errorNode:input From:retval.startToken To:[input LT:-1] Exception:re];
-
-    }    @finally {
-    }
-    return retval;
-}
-/* $ANTLR end aexpr */
-/*
- * $ANTLR start atom
- * /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:85:1: atom : ( K_ID | K_INT | '(' expr ')' -> expr );
- */
-- (SimpleCParser_atom_return *) atom
-{
-    /* ruleScopeSetUp */
-
-    /* AST ruleDeclarations */
-    SimpleCParser_atom_return * retval = [SimpleCParser_atom_return newSimpleCParser_atom_return];
-    [retval setStart:[input LT:1]];
-
-    ANTLRCommonTree *root_0 = nil;
-
-    @try {
-        /* AST ruleLabelDefs */
-        ANTLRCommonToken *K_ID49 = nil;
-        ANTLRCommonToken *K_INT50 = nil;
-        ANTLRCommonToken *char_literal51 = nil;
-        ANTLRCommonToken *char_literal53 = nil;
-        SimpleCParser_expr_return * expr52 = nil;
-
-
-        ANTLRCommonTree *K_ID49_tree=nil;
-        ANTLRCommonTree *K_INT50_tree=nil;
-        ANTLRCommonTree *char_literal51_tree=nil;
-        ANTLRCommonTree *char_literal53_tree=nil;
-        ANTLRRewriteRuleTokenStream *stream_22 = 
-            [[ANTLRRewriteRuleTokenStream newANTLRRewriteRuleTokenStream:treeAdaptor
-                                                             description:@"token 22"] retain];
-        ANTLRRewriteRuleTokenStream *stream_24 = 
-            [[ANTLRRewriteRuleTokenStream newANTLRRewriteRuleTokenStream:treeAdaptor
-                                                             description:@"token 24"] retain];
-        ANTLRRewriteRuleSubtreeStream *stream_expr = 
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
-                                                                description:@"rule expr"] retain];
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:86:5: ( K_ID | K_INT | '(' expr ')' -> expr ) //ruleblock
-        NSInteger alt11=3;
-        switch ([input LA:1]) {
-            case K_ID: ;
-                {
-                alt11=1;
-                }
-                break;
-            case K_INT: ;
-                {
-                alt11=2;
-                }
-                break;
-            case 22: ;
-                {
-                alt11=3;
-                }
-                break;
-
-        default: ;
-            ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newANTLRNoViableAltException:11 state:0 stream:input];
-            @throw nvae;
-        }
-
-        switch (alt11) {
-            case 1 : ;
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:86:7: K_ID // alt
-                {
-                root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
-
-                /* ASTParser tokenRef */
-                K_ID49=(ANTLRCommonToken *)[self match:input TokenType:K_ID Follow:FOLLOW_K_ID_in_atom680]; 
-                K_ID49_tree = /* ASTParser createNodeFromToken */
-                (ANTLRCommonTree *)[[treeAdaptor createTree:K_ID49] retain];
-                [treeAdaptor addChild:K_ID49_tree  toTree:root_0];
-                  /* element() */
-                 /* elements */
-                }
-                break;
-            case 2 : ;
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:87:7: K_INT // alt
-                {
-                root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
-
-                /* ASTParser tokenRef */
-                K_INT50=(ANTLRCommonToken *)[self match:input TokenType:K_INT Follow:FOLLOW_K_INT_in_atom694]; 
-                K_INT50_tree = /* ASTParser createNodeFromToken */
-                (ANTLRCommonTree *)[[treeAdaptor createTree:K_INT50] retain];
-                [treeAdaptor addChild:K_INT50_tree  toTree:root_0];
-                  /* element() */
-                 /* elements */
-                }
-                break;
-            case 3 : ;
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleC.g:88:7: '(' expr ')' // alt
-                {
-                char_literal51=(ANTLRCommonToken *)[self match:input TokenType:22 Follow:FOLLOW_22_in_atom708];  
-                    [stream_22 addElement:char_literal51];
-                  /* element() */
-                [self pushFollow:FOLLOW_expr_in_atom710];
-                expr52 = [self expr];
-                [self popFollow];
-
-
-                [stream_expr addElement:[expr52 getTree]];  /* element() */
-                char_literal53=(ANTLRCommonToken *)[self match:input TokenType:24 Follow:FOLLOW_24_in_atom712];  
-                    [stream_24 addElement:char_literal53];
-                  /* element() */
-                 /* elements */
-
-                // AST REWRITE
-                // elements: expr
-                // token labels: 
-                // rule labels: retval
-                // token list labels: 
-                // rule list labels: 
-                // wildcard labels: 
-                 [retval setTree:root_0];
-
-                retval.tree = root_0;
-
-                ANTLRRewriteRuleSubtreeStream *stream_retval =
-                    [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
-                                                                        description:@"token retval"
-                                                                            element:retval!=nil?[retval getTree]:nil] retain];
-
-                root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
-
-                // 88:20: -> expr
-                {
-                    [treeAdaptor addChild:[stream_expr nextTree] toTree:root_0];
-
-                }
-
-                retval.tree = root_0;
-
-                }
-                break;
-
-        }
-        /* ASTParser ruleCleanUp */
-        /* AST ruleCleanUp */
-        // token+rule list labels
-        [retval setStop:[input LT:-1]];
-
-        [stream_22 release];
-        [stream_24 release];
-        [stream_expr release];
-
-            retval.tree = (ANTLRCommonTree *)[treeAdaptor rulePostProcessing:root_0];
-            [treeAdaptor setTokenBoundaries:retval.tree From:retval.startToken To:retval.stopToken];
-
-    }
-    @catch (ANTLRRecognitionException *re) {
-        [self reportError:re];
-        [self recover:input Exception:re];
-        /* ASTParser rule.setErrorReturnValue */
-        retval.tree = (ANTLRCommonTree *)[treeAdaptor errorNode:input From:retval.startToken To:[input LT:-1] Exception:re];
-
-    }    @finally {
-    }
-    return retval;
-}
-/* $ANTLR end atom */
-
-@end /* end of SimpleCParser implementation line 669 */
-
-
-/* End of code
- * =============================================================================
- */
diff --git a/runtime/ObjC/Framework/examples/simplecTreeParser/output1/SimpleCTP.h b/runtime/ObjC/Framework/examples/simplecTreeParser/output1/SimpleCTP.h
deleted file mode 100644
index fd59407..0000000
--- a/runtime/ObjC/Framework/examples/simplecTreeParser/output1/SimpleCTP.h
+++ /dev/null
@@ -1,102 +0,0 @@
-// $ANTLR 3.2 Aug 23, 2010 07:48:06 /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g 2010-08-23 07:55:04
-
-/* =============================================================================
- * Standard antlr3 OBJC runtime definitions
- */
-#import <Cocoa/Cocoa.h>
-#import "antlr3.h"
-/* End of standard antlr3 runtime definitions
- * =============================================================================
- */
-
-#pragma mark Tokens
-#define K_ID 10
-#define T__26 26
-#define T__25 25
-#define T__24 24
-#define T__23 23
-#define K_EQEQ 16
-#define T__22 22
-#define K_INT 11
-#define T__21 21
-#define K_FOR 14
-#define FUNC_HDR 6
-#define FUNC_DEF 8
-#define EOF -1
-#define K_INT_TYPE 19
-#define FUNC_DECL 7
-#define ARG_DEF 5
-#define WS 20
-#define K_EQ 15
-#define BLOCK 9
-#define K_LT 17
-#define K_CHAR 12
-#define K_VOID 13
-#define VAR_DEF 4
-#define K_PLUS 18
-#pragma mark Dynamic Global Scopes
-@interface Symbols_Scope : ANTLRSymbolsScope {  /* globalAttributeScopeDecl */
-ANTLRCommonTree * tree;
-}
-/* start of properties */
-
-@property (retain, getter=gettree, setter=settree:) ANTLRCommonTree * tree;
-
-/* end properties */
-
-+ (Symbols_Scope *)newSymbols_Scope;
-/* start of iterated get and set functions */
-
-- (ANTLRCommonTree *)gettree;
-- (void)settree:(ANTLRCommonTree *)aVal;
-
-/* End of iterated get and set functions */
-
-@end /* end of Symbols_Scope interface */
-
-#pragma mark Dynamic Rule Scopes
-#pragma mark Rule Return Scopes start
-@interface SimpleCTP_expr_return :ANTLRTreeRuleReturnScope { // line 1672
- // start of memVars()
-}
-
-// start properties
-@property (retain, getter=getTree, setter=setTree:) ANTLRCommonTree *tree;
-+ (SimpleCTP_expr_return *)newSimpleCTP_expr_return;
-// this is start of set and get methods
-  // methodsDecl
-@end /* end of returnScopeInterface interface */
-
-#pragma mark Rule return scopes end
-@interface SimpleCTP : ANTLRTreeParser { // line 529
-// start of globalAttributeScopeMemVar
-/* globalAttributeScopeMemVar */
-ANTLRSymbolStack *gStack;
-Symbols_Scope *Symbols_scope;
-
-// start of action-actionScope-memVars
-// start of ruleAttributeScopeMemVar
-
-
-// Start of memVars
-
- }
-
-// start of action-actionScope-methodsDecl
-
-
-- (void)program; 
-- (void)declaration; 
-- (void)variable; 
-- (void)declarator; 
-- (void)functionHeader; 
-- (void)formalParameter; 
-- (void)type; 
-- (void)block; 
-- (void)stat; 
-- (void)forStat; 
-- (SimpleCTP_expr_return *)expr; 
-- (void)atom; 
-
-
-@end /* end of SimpleCTP interface */
diff --git a/runtime/ObjC/Framework/examples/simplecTreeParser/output1/SimpleCTP.java b/runtime/ObjC/Framework/examples/simplecTreeParser/output1/SimpleCTP.java
deleted file mode 100644
index 4c3ccc2..0000000
--- a/runtime/ObjC/Framework/examples/simplecTreeParser/output1/SimpleCTP.java
+++ /dev/null
@@ -1,852 +0,0 @@
-// $ANTLR 3.2 Aug 13, 2010 19:41:25 /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g 2010-08-13 19:42:13
-
-import org.antlr.runtime.*;
-import org.antlr.runtime.tree.*;import java.util.Stack;
-import java.util.List;
-import java.util.ArrayList;
-
-public class SimpleCTP extends TreeParser {
-    public static final String[] tokenNames = new String[] {
-        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "VAR_DEF", "ARG_DEF", "FUNC_HDR", "FUNC_DECL", "FUNC_DEF", "BLOCK", "ID", "EQ", "INT", "FOR", "INT_TYPE", "CHAR", "VOID", "EQEQ", "LT", "PLUS", "WS", "';'", "'('", "','", "')'", "'{'", "'}'"
-    };
-    public static final int LT=18;
-    public static final int T__26=26;
-    public static final int T__25=25;
-    public static final int T__24=24;
-    public static final int T__23=23;
-    public static final int T__22=22;
-    public static final int T__21=21;
-    public static final int CHAR=15;
-    public static final int FOR=13;
-    public static final int FUNC_HDR=6;
-    public static final int INT=12;
-    public static final int FUNC_DEF=8;
-    public static final int INT_TYPE=14;
-    public static final int ID=10;
-    public static final int EOF=-1;
-    public static final int FUNC_DECL=7;
-    public static final int ARG_DEF=5;
-    public static final int WS=20;
-    public static final int BLOCK=9;
-    public static final int PLUS=19;
-    public static final int VOID=16;
-    public static final int EQ=11;
-    public static final int VAR_DEF=4;
-    public static final int EQEQ=17;
-
-    // delegates
-    // delegators
-
-
-        public SimpleCTP(TreeNodeStream input) {
-            this(input, new RecognizerSharedState());
-        }
-        public SimpleCTP(TreeNodeStream input, RecognizerSharedState state) {
-            super(input, state);
-             
-        }
-        
-
-    public String[] getTokenNames() { return SimpleCTP.tokenNames; }
-    public String getGrammarFileName() { return "/usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g"; }
-
-
-
-    // $ANTLR start "program"
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:8:1: program : ( declaration )+ ;
-    public final void program() throws RecognitionException {
-        try {
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:9:5: ( ( declaration )+ )
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:9:9: ( declaration )+
-            {
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:9:9: ( declaration )+
-            int cnt1=0;
-            loop1:
-            do {
-                int alt1=2;
-                int LA1_0 = input.LA(1);
-
-                if ( (LA1_0==VAR_DEF||(LA1_0>=FUNC_DECL && LA1_0<=FUNC_DEF)) ) {
-                    alt1=1;
-                }
-
-
-                switch (alt1) {
-            	case 1 :
-            	    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:9:9: declaration
-            	    {
-            	    pushFollow(FOLLOW_declaration_in_program43);
-            	    declaration();
-
-            	    state._fsp--;
-
-
-            	    }
-            	    break;
-
-            	default :
-            	    if ( cnt1 >= 1 ) break loop1;
-                        EarlyExitException eee =
-                            new EarlyExitException(1, input);
-                        throw eee;
-                }
-                cnt1++;
-            } while (true);
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "program"
-
-
-    // $ANTLR start "declaration"
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:12:1: declaration : ( variable | ^( FUNC_DECL functionHeader ) | ^( FUNC_DEF functionHeader block ) );
-    public final void declaration() throws RecognitionException {
-        try {
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:13:5: ( variable | ^( FUNC_DECL functionHeader ) | ^( FUNC_DEF functionHeader block ) )
-            int alt2=3;
-            switch ( input.LA(1) ) {
-            case VAR_DEF:
-                {
-                alt2=1;
-                }
-                break;
-            case FUNC_DECL:
-                {
-                alt2=2;
-                }
-                break;
-            case FUNC_DEF:
-                {
-                alt2=3;
-                }
-                break;
-            default:
-                NoViableAltException nvae =
-                    new NoViableAltException("", 2, 0, input);
-
-                throw nvae;
-            }
-
-            switch (alt2) {
-                case 1 :
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:13:9: variable
-                    {
-                    pushFollow(FOLLOW_variable_in_declaration63);
-                    variable();
-
-                    state._fsp--;
-
-
-                    }
-                    break;
-                case 2 :
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:14:9: ^( FUNC_DECL functionHeader )
-                    {
-                    match(input,FUNC_DECL,FOLLOW_FUNC_DECL_in_declaration74); 
-
-                    match(input, Token.DOWN, null); 
-                    pushFollow(FOLLOW_functionHeader_in_declaration76);
-                    functionHeader();
-
-                    state._fsp--;
-
-
-                    match(input, Token.UP, null); 
-
-                    }
-                    break;
-                case 3 :
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:15:9: ^( FUNC_DEF functionHeader block )
-                    {
-                    match(input,FUNC_DEF,FOLLOW_FUNC_DEF_in_declaration88); 
-
-                    match(input, Token.DOWN, null); 
-                    pushFollow(FOLLOW_functionHeader_in_declaration90);
-                    functionHeader();
-
-                    state._fsp--;
-
-                    pushFollow(FOLLOW_block_in_declaration92);
-                    block();
-
-                    state._fsp--;
-
-
-                    match(input, Token.UP, null); 
-
-                    }
-                    break;
-
-            }
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "declaration"
-
-
-    // $ANTLR start "variable"
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:18:1: variable : ^( VAR_DEF type declarator ) ;
-    public final void variable() throws RecognitionException {
-        try {
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:19:5: ( ^( VAR_DEF type declarator ) )
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:19:9: ^( VAR_DEF type declarator )
-            {
-            match(input,VAR_DEF,FOLLOW_VAR_DEF_in_variable113); 
-
-            match(input, Token.DOWN, null); 
-            pushFollow(FOLLOW_type_in_variable115);
-            type();
-
-            state._fsp--;
-
-            pushFollow(FOLLOW_declarator_in_variable117);
-            declarator();
-
-            state._fsp--;
-
-
-            match(input, Token.UP, null); 
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "variable"
-
-
-    // $ANTLR start "declarator"
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:22:1: declarator : ID ;
-    public final void declarator() throws RecognitionException {
-        try {
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:23:5: ( ID )
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:23:9: ID
-            {
-            match(input,ID,FOLLOW_ID_in_declarator137); 
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "declarator"
-
-
-    // $ANTLR start "functionHeader"
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:26:1: functionHeader : ^( FUNC_HDR type ID ( formalParameter )+ ) ;
-    public final void functionHeader() throws RecognitionException {
-        try {
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:27:5: ( ^( FUNC_HDR type ID ( formalParameter )+ ) )
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:27:9: ^( FUNC_HDR type ID ( formalParameter )+ )
-            {
-            match(input,FUNC_HDR,FOLLOW_FUNC_HDR_in_functionHeader158); 
-
-            match(input, Token.DOWN, null); 
-            pushFollow(FOLLOW_type_in_functionHeader160);
-            type();
-
-            state._fsp--;
-
-            match(input,ID,FOLLOW_ID_in_functionHeader162); 
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:27:28: ( formalParameter )+
-            int cnt3=0;
-            loop3:
-            do {
-                int alt3=2;
-                int LA3_0 = input.LA(1);
-
-                if ( (LA3_0==ARG_DEF) ) {
-                    alt3=1;
-                }
-
-
-                switch (alt3) {
-            	case 1 :
-            	    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:27:28: formalParameter
-            	    {
-            	    pushFollow(FOLLOW_formalParameter_in_functionHeader164);
-            	    formalParameter();
-
-            	    state._fsp--;
-
-
-            	    }
-            	    break;
-
-            	default :
-            	    if ( cnt3 >= 1 ) break loop3;
-                        EarlyExitException eee =
-                            new EarlyExitException(3, input);
-                        throw eee;
-                }
-                cnt3++;
-            } while (true);
-
-
-            match(input, Token.UP, null); 
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "functionHeader"
-
-
-    // $ANTLR start "formalParameter"
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:30:1: formalParameter : ^( ARG_DEF type declarator ) ;
-    public final void formalParameter() throws RecognitionException {
-        try {
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:31:5: ( ^( ARG_DEF type declarator ) )
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:31:9: ^( ARG_DEF type declarator )
-            {
-            match(input,ARG_DEF,FOLLOW_ARG_DEF_in_formalParameter186); 
-
-            match(input, Token.DOWN, null); 
-            pushFollow(FOLLOW_type_in_formalParameter188);
-            type();
-
-            state._fsp--;
-
-            pushFollow(FOLLOW_declarator_in_formalParameter190);
-            declarator();
-
-            state._fsp--;
-
-
-            match(input, Token.UP, null); 
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "formalParameter"
-
-
-    // $ANTLR start "type"
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:34:1: type : ( 'int' | 'char' | 'void' | ID );
-    public final void type() throws RecognitionException {
-        try {
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:35:5: ( 'int' | 'char' | 'void' | ID )
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:
-            {
-            if ( input.LA(1)==ID||(input.LA(1)>=INT_TYPE && input.LA(1)<=VOID) ) {
-                input.consume();
-                state.errorRecovery=false;
-            }
-            else {
-                MismatchedSetException mse = new MismatchedSetException(null,input);
-                throw mse;
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "type"
-
-
-    // $ANTLR start "block"
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:41:1: block : ^( BLOCK ( variable )* ( stat )* ) ;
-    public final void block() throws RecognitionException {
-        try {
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:42:5: ( ^( BLOCK ( variable )* ( stat )* ) )
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:42:9: ^( BLOCK ( variable )* ( stat )* )
-            {
-            match(input,BLOCK,FOLLOW_BLOCK_in_block273); 
-
-            if ( input.LA(1)==Token.DOWN ) {
-                match(input, Token.DOWN, null); 
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:42:17: ( variable )*
-                loop4:
-                do {
-                    int alt4=2;
-                    int LA4_0 = input.LA(1);
-
-                    if ( (LA4_0==VAR_DEF) ) {
-                        alt4=1;
-                    }
-
-
-                    switch (alt4) {
-                	case 1 :
-                	    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:42:17: variable
-                	    {
-                	    pushFollow(FOLLOW_variable_in_block275);
-                	    variable();
-
-                	    state._fsp--;
-
-
-                	    }
-                	    break;
-
-                	default :
-                	    break loop4;
-                    }
-                } while (true);
-
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:42:27: ( stat )*
-                loop5:
-                do {
-                    int alt5=2;
-                    int LA5_0 = input.LA(1);
-
-                    if ( ((LA5_0>=BLOCK && LA5_0<=FOR)||(LA5_0>=EQEQ && LA5_0<=PLUS)) ) {
-                        alt5=1;
-                    }
-
-
-                    switch (alt5) {
-                	case 1 :
-                	    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:42:27: stat
-                	    {
-                	    pushFollow(FOLLOW_stat_in_block278);
-                	    stat();
-
-                	    state._fsp--;
-
-
-                	    }
-                	    break;
-
-                	default :
-                	    break loop5;
-                    }
-                } while (true);
-
-
-                match(input, Token.UP, null); 
-            }
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "block"
-
-
-    // $ANTLR start "stat"
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:45:1: stat : ( forStat | expr | block );
-    public final void stat() throws RecognitionException {
-        try {
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:45:5: ( forStat | expr | block )
-            int alt6=3;
-            switch ( input.LA(1) ) {
-            case FOR:
-                {
-                alt6=1;
-                }
-                break;
-            case ID:
-            case EQ:
-            case INT:
-            case EQEQ:
-            case LT:
-            case PLUS:
-                {
-                alt6=2;
-                }
-                break;
-            case BLOCK:
-                {
-                alt6=3;
-                }
-                break;
-            default:
-                NoViableAltException nvae =
-                    new NoViableAltException("", 6, 0, input);
-
-                throw nvae;
-            }
-
-            switch (alt6) {
-                case 1 :
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:45:7: forStat
-                    {
-                    pushFollow(FOLLOW_forStat_in_stat292);
-                    forStat();
-
-                    state._fsp--;
-
-
-                    }
-                    break;
-                case 2 :
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:46:7: expr
-                    {
-                    pushFollow(FOLLOW_expr_in_stat300);
-                    expr();
-
-                    state._fsp--;
-
-
-                    }
-                    break;
-                case 3 :
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:47:7: block
-                    {
-                    pushFollow(FOLLOW_block_in_stat308);
-                    block();
-
-                    state._fsp--;
-
-
-                    }
-                    break;
-
-            }
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "stat"
-
-
-    // $ANTLR start "forStat"
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:50:1: forStat : ^( 'for' expr expr expr block ) ;
-    public final void forStat() throws RecognitionException {
-        try {
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:51:5: ( ^( 'for' expr expr expr block ) )
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:51:9: ^( 'for' expr expr expr block )
-            {
-            match(input,FOR,FOLLOW_FOR_in_forStat328); 
-
-            match(input, Token.DOWN, null); 
-            pushFollow(FOLLOW_expr_in_forStat330);
-            expr();
-
-            state._fsp--;
-
-            pushFollow(FOLLOW_expr_in_forStat332);
-            expr();
-
-            state._fsp--;
-
-            pushFollow(FOLLOW_expr_in_forStat334);
-            expr();
-
-            state._fsp--;
-
-            pushFollow(FOLLOW_block_in_forStat336);
-            block();
-
-            state._fsp--;
-
-
-            match(input, Token.UP, null); 
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "forStat"
-
-    public static class expr_return extends TreeRuleReturnScope {
-    };
-
-    // $ANTLR start "expr"
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:54:1: expr : ( ^( EQEQ expr expr ) | ^( LT expr expr ) | ^( PLUS expr expr ) | ^( EQ ID e= expr ) | atom );
-    public final SimpleCTP.expr_return expr() throws RecognitionException {
-        SimpleCTP.expr_return retval = new SimpleCTP.expr_return();
-        retval.start = input.LT(1);
-
-        ANTLRCommonTree ID1=null;
-        SimpleCTP.expr_return e = null;
-
-
-        try {
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:54:5: ( ^( EQEQ expr expr ) | ^( LT expr expr ) | ^( PLUS expr expr ) | ^( EQ ID e= expr ) | atom )
-            int alt7=5;
-            switch ( input.LA(1) ) {
-            case EQEQ:
-                {
-                alt7=1;
-                }
-                break;
-            case LT:
-                {
-                alt7=2;
-                }
-                break;
-            case PLUS:
-                {
-                alt7=3;
-                }
-                break;
-            case EQ:
-                {
-                alt7=4;
-                }
-                break;
-            case ID:
-            case INT:
-                {
-                alt7=5;
-                }
-                break;
-            default:
-                NoViableAltException nvae =
-                    new NoViableAltException("", 7, 0, input);
-
-                throw nvae;
-            }
-
-            switch (alt7) {
-                case 1 :
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:54:9: ^( EQEQ expr expr )
-                    {
-                    match(input,EQEQ,FOLLOW_EQEQ_in_expr352); 
-
-                    match(input, Token.DOWN, null); 
-                    pushFollow(FOLLOW_expr_in_expr354);
-                    expr();
-
-                    state._fsp--;
-
-                    pushFollow(FOLLOW_expr_in_expr356);
-                    expr();
-
-                    state._fsp--;
-
-
-                    match(input, Token.UP, null); 
-
-                    }
-                    break;
-                case 2 :
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:55:9: ^( LT expr expr )
-                    {
-                    match(input,LT,FOLLOW_LT_in_expr368); 
-
-                    match(input, Token.DOWN, null); 
-                    pushFollow(FOLLOW_expr_in_expr370);
-                    expr();
-
-                    state._fsp--;
-
-                    pushFollow(FOLLOW_expr_in_expr372);
-                    expr();
-
-                    state._fsp--;
-
-
-                    match(input, Token.UP, null); 
-
-                    }
-                    break;
-                case 3 :
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:56:9: ^( PLUS expr expr )
-                    {
-                    match(input,PLUS,FOLLOW_PLUS_in_expr384); 
-
-                    match(input, Token.DOWN, null); 
-                    pushFollow(FOLLOW_expr_in_expr386);
-                    expr();
-
-                    state._fsp--;
-
-                    pushFollow(FOLLOW_expr_in_expr388);
-                    expr();
-
-                    state._fsp--;
-
-
-                    match(input, Token.UP, null); 
-
-                    }
-                    break;
-                case 4 :
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:57:9: ^( EQ ID e= expr )
-                    {
-                    match(input,EQ,FOLLOW_EQ_in_expr400); 
-
-                    match(input, Token.DOWN, null); 
-                    ID1=(ANTLRCommonTree)match(input,ID,FOLLOW_ID_in_expr402); 
-                    pushFollow(FOLLOW_expr_in_expr406);
-                    e=expr();
-
-                    state._fsp--;
-
-
-                    match(input, Token.UP, null); 
-                     NSLog(@"assigning %@ to variable %@", (e!=null?(input.getTokenStream().toString(
-                      input.getTreeAdaptor().getTokenStartIndex(e.start),
-                      input.getTreeAdaptor().getTokenStopIndex(e.start))):null), (ID1!=null?ID1.getText():null)); 
-
-                    }
-                    break;
-                case 5 :
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:58:9: atom
-                    {
-                    pushFollow(FOLLOW_atom_in_expr419);
-                    atom();
-
-                    state._fsp--;
-
-
-                    }
-                    break;
-
-            }
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end "expr"
-
-
-    // $ANTLR start "atom"
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:61:1: atom : ( ID | INT );
-    public final void atom() throws RecognitionException {
-        try {
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:62:5: ( ID | INT )
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:
-            {
-            if ( input.LA(1)==ID||input.LA(1)==INT ) {
-                input.consume();
-                state.errorRecovery=false;
-            }
-            else {
-                MismatchedSetException mse = new MismatchedSetException(null,input);
-                throw mse;
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "atom"
-
-    // Delegated rules
-
-
- 
-
-    public static final BitSet FOLLOW_declaration_in_program43 = new BitSet(new long[]{0x0000000000000192L});
-    public static final BitSet FOLLOW_variable_in_declaration63 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_FUNC_DECL_in_declaration74 = new BitSet(new long[]{0x0000000000000004L});
-    public static final BitSet FOLLOW_functionHeader_in_declaration76 = new BitSet(new long[]{0x0000000000000008L});
-    public static final BitSet FOLLOW_FUNC_DEF_in_declaration88 = new BitSet(new long[]{0x0000000000000004L});
-    public static final BitSet FOLLOW_functionHeader_in_declaration90 = new BitSet(new long[]{0x0000000000000200L});
-    public static final BitSet FOLLOW_block_in_declaration92 = new BitSet(new long[]{0x0000000000000008L});
-    public static final BitSet FOLLOW_VAR_DEF_in_variable113 = new BitSet(new long[]{0x0000000000000004L});
-    public static final BitSet FOLLOW_type_in_variable115 = new BitSet(new long[]{0x0000000000000400L});
-    public static final BitSet FOLLOW_declarator_in_variable117 = new BitSet(new long[]{0x0000000000000008L});
-    public static final BitSet FOLLOW_ID_in_declarator137 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_FUNC_HDR_in_functionHeader158 = new BitSet(new long[]{0x0000000000000004L});
-    public static final BitSet FOLLOW_type_in_functionHeader160 = new BitSet(new long[]{0x0000000000000400L});
-    public static final BitSet FOLLOW_ID_in_functionHeader162 = new BitSet(new long[]{0x0000000000000020L});
-    public static final BitSet FOLLOW_formalParameter_in_functionHeader164 = new BitSet(new long[]{0x0000000000000028L});
-    public static final BitSet FOLLOW_ARG_DEF_in_formalParameter186 = new BitSet(new long[]{0x0000000000000004L});
-    public static final BitSet FOLLOW_type_in_formalParameter188 = new BitSet(new long[]{0x0000000000000400L});
-    public static final BitSet FOLLOW_declarator_in_formalParameter190 = new BitSet(new long[]{0x0000000000000008L});
-    public static final BitSet FOLLOW_set_in_type0 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_BLOCK_in_block273 = new BitSet(new long[]{0x0000000000000004L});
-    public static final BitSet FOLLOW_variable_in_block275 = new BitSet(new long[]{0x00000000000E3E18L});
-    public static final BitSet FOLLOW_stat_in_block278 = new BitSet(new long[]{0x00000000000E3E08L});
-    public static final BitSet FOLLOW_forStat_in_stat292 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_expr_in_stat300 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_block_in_stat308 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_FOR_in_forStat328 = new BitSet(new long[]{0x0000000000000004L});
-    public static final BitSet FOLLOW_expr_in_forStat330 = new BitSet(new long[]{0x00000000000E1C00L});
-    public static final BitSet FOLLOW_expr_in_forStat332 = new BitSet(new long[]{0x00000000000E1C00L});
-    public static final BitSet FOLLOW_expr_in_forStat334 = new BitSet(new long[]{0x0000000000000200L});
-    public static final BitSet FOLLOW_block_in_forStat336 = new BitSet(new long[]{0x0000000000000008L});
-    public static final BitSet FOLLOW_EQEQ_in_expr352 = new BitSet(new long[]{0x0000000000000004L});
-    public static final BitSet FOLLOW_expr_in_expr354 = new BitSet(new long[]{0x00000000000E1C00L});
-    public static final BitSet FOLLOW_expr_in_expr356 = new BitSet(new long[]{0x0000000000000008L});
-    public static final BitSet FOLLOW_LT_in_expr368 = new BitSet(new long[]{0x0000000000000004L});
-    public static final BitSet FOLLOW_expr_in_expr370 = new BitSet(new long[]{0x00000000000E1C00L});
-    public static final BitSet FOLLOW_expr_in_expr372 = new BitSet(new long[]{0x0000000000000008L});
-    public static final BitSet FOLLOW_PLUS_in_expr384 = new BitSet(new long[]{0x0000000000000004L});
-    public static final BitSet FOLLOW_expr_in_expr386 = new BitSet(new long[]{0x00000000000E1C00L});
-    public static final BitSet FOLLOW_expr_in_expr388 = new BitSet(new long[]{0x0000000000000008L});
-    public static final BitSet FOLLOW_EQ_in_expr400 = new BitSet(new long[]{0x0000000000000004L});
-    public static final BitSet FOLLOW_ID_in_expr402 = new BitSet(new long[]{0x00000000000E1C00L});
-    public static final BitSet FOLLOW_expr_in_expr406 = new BitSet(new long[]{0x0000000000000008L});
-    public static final BitSet FOLLOW_atom_in_expr419 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_set_in_atom0 = new BitSet(new long[]{0x0000000000000002L});
-
-}
\ No newline at end of file
diff --git a/runtime/ObjC/Framework/examples/simplecTreeParser/output1/SimpleCTP.m b/runtime/ObjC/Framework/examples/simplecTreeParser/output1/SimpleCTP.m
deleted file mode 100644
index 1ac0952..0000000
--- a/runtime/ObjC/Framework/examples/simplecTreeParser/output1/SimpleCTP.m
+++ /dev/null
@@ -1,1059 +0,0 @@
-/** \file
- *  This OBJC source file was generated by $ANTLR version 3.2 Aug 23, 2010 07:48:06
- *
- *     -  From the grammar source file : /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g
- *     -                            On : 2010-08-23 07:55:04
- *     -           for the tree parser : SimpleCTPTreeParser *
- * Editing it, at least manually, is not wise. 
- *
- * ObjC language generator and runtime by Alan Condit, acondit|hereisanat|ipns|dotgoeshere|com.
- *
- *
-*/
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-//
-// 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.
-
-// $ANTLR 3.2 Aug 23, 2010 07:48:06 /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g 2010-08-23 07:55:04
-
-/* -----------------------------------------
- * Include the ANTLR3 generated header file.
- */
-#import "SimpleCTP.h"
-/* ----------------------------------------- */
-
-
-/* ============================================================================= */
-
-/* =============================================================================
- * Start of recognizer
- */
-
-
-
-#pragma mark Bitsets
-static ANTLRBitSet *FOLLOW_declaration_in_program56;
-static const unsigned long long FOLLOW_declaration_in_program56_data[] = { 0x0000000000000192LL};
-static ANTLRBitSet *FOLLOW_variable_in_declaration76;
-static const unsigned long long FOLLOW_variable_in_declaration76_data[] = { 0x0000000000000002LL};
-static ANTLRBitSet *FOLLOW_FUNC_DECL_in_declaration87;
-static const unsigned long long FOLLOW_FUNC_DECL_in_declaration87_data[] = { 0x0000000000000004LL};
-static ANTLRBitSet *FOLLOW_functionHeader_in_declaration89;
-static const unsigned long long FOLLOW_functionHeader_in_declaration89_data[] = { 0x0000000000000008LL};
-static ANTLRBitSet *FOLLOW_FUNC_DEF_in_declaration101;
-static const unsigned long long FOLLOW_FUNC_DEF_in_declaration101_data[] = { 0x0000000000000004LL};
-static ANTLRBitSet *FOLLOW_functionHeader_in_declaration103;
-static const unsigned long long FOLLOW_functionHeader_in_declaration103_data[] = { 0x0000000000000200LL};
-static ANTLRBitSet *FOLLOW_block_in_declaration105;
-static const unsigned long long FOLLOW_block_in_declaration105_data[] = { 0x0000000000000008LL};
-static ANTLRBitSet *FOLLOW_VAR_DEF_in_variable126;
-static const unsigned long long FOLLOW_VAR_DEF_in_variable126_data[] = { 0x0000000000000004LL};
-static ANTLRBitSet *FOLLOW_type_in_variable128;
-static const unsigned long long FOLLOW_type_in_variable128_data[] = { 0x0000000000000400LL};
-static ANTLRBitSet *FOLLOW_declarator_in_variable130;
-static const unsigned long long FOLLOW_declarator_in_variable130_data[] = { 0x0000000000000008LL};
-static ANTLRBitSet *FOLLOW_K_ID_in_declarator150;
-static const unsigned long long FOLLOW_K_ID_in_declarator150_data[] = { 0x0000000000000002LL};
-static ANTLRBitSet *FOLLOW_FUNC_HDR_in_functionHeader171;
-static const unsigned long long FOLLOW_FUNC_HDR_in_functionHeader171_data[] = { 0x0000000000000004LL};
-static ANTLRBitSet *FOLLOW_type_in_functionHeader173;
-static const unsigned long long FOLLOW_type_in_functionHeader173_data[] = { 0x0000000000000400LL};
-static ANTLRBitSet *FOLLOW_K_ID_in_functionHeader175;
-static const unsigned long long FOLLOW_K_ID_in_functionHeader175_data[] = { 0x0000000000000020LL};
-static ANTLRBitSet *FOLLOW_formalParameter_in_functionHeader177;
-static const unsigned long long FOLLOW_formalParameter_in_functionHeader177_data[] = { 0x0000000000000028LL};
-static ANTLRBitSet *FOLLOW_ARG_DEF_in_formalParameter199;
-static const unsigned long long FOLLOW_ARG_DEF_in_formalParameter199_data[] = { 0x0000000000000004LL};
-static ANTLRBitSet *FOLLOW_type_in_formalParameter201;
-static const unsigned long long FOLLOW_type_in_formalParameter201_data[] = { 0x0000000000000400LL};
-static ANTLRBitSet *FOLLOW_declarator_in_formalParameter203;
-static const unsigned long long FOLLOW_declarator_in_formalParameter203_data[] = { 0x0000000000000008LL};
-static ANTLRBitSet *FOLLOW_set_in_type0;
-static const unsigned long long FOLLOW_set_in_type0_data[] = { 0x0000000000000002LL};
-static ANTLRBitSet *FOLLOW_BLOCK_in_block286;
-static const unsigned long long FOLLOW_BLOCK_in_block286_data[] = { 0x0000000000000004LL};
-static ANTLRBitSet *FOLLOW_variable_in_block288;
-static const unsigned long long FOLLOW_variable_in_block288_data[] = { 0x000000000007CE18LL};
-static ANTLRBitSet *FOLLOW_stat_in_block291;
-static const unsigned long long FOLLOW_stat_in_block291_data[] = { 0x000000000007CE08LL};
-static ANTLRBitSet *FOLLOW_forStat_in_stat305;
-static const unsigned long long FOLLOW_forStat_in_stat305_data[] = { 0x0000000000000002LL};
-static ANTLRBitSet *FOLLOW_expr_in_stat313;
-static const unsigned long long FOLLOW_expr_in_stat313_data[] = { 0x0000000000000002LL};
-static ANTLRBitSet *FOLLOW_block_in_stat321;
-static const unsigned long long FOLLOW_block_in_stat321_data[] = { 0x0000000000000002LL};
-static ANTLRBitSet *FOLLOW_K_FOR_in_forStat341;
-static const unsigned long long FOLLOW_K_FOR_in_forStat341_data[] = { 0x0000000000000004LL};
-static ANTLRBitSet *FOLLOW_expr_in_forStat343;
-static const unsigned long long FOLLOW_expr_in_forStat343_data[] = { 0x0000000000078C00LL};
-static ANTLRBitSet *FOLLOW_expr_in_forStat345;
-static const unsigned long long FOLLOW_expr_in_forStat345_data[] = { 0x0000000000078C00LL};
-static ANTLRBitSet *FOLLOW_expr_in_forStat347;
-static const unsigned long long FOLLOW_expr_in_forStat347_data[] = { 0x0000000000000200LL};
-static ANTLRBitSet *FOLLOW_block_in_forStat349;
-static const unsigned long long FOLLOW_block_in_forStat349_data[] = { 0x0000000000000008LL};
-static ANTLRBitSet *FOLLOW_K_EQEQ_in_expr365;
-static const unsigned long long FOLLOW_K_EQEQ_in_expr365_data[] = { 0x0000000000000004LL};
-static ANTLRBitSet *FOLLOW_expr_in_expr367;
-static const unsigned long long FOLLOW_expr_in_expr367_data[] = { 0x0000000000078C00LL};
-static ANTLRBitSet *FOLLOW_expr_in_expr369;
-static const unsigned long long FOLLOW_expr_in_expr369_data[] = { 0x0000000000000008LL};
-static ANTLRBitSet *FOLLOW_K_LT_in_expr381;
-static const unsigned long long FOLLOW_K_LT_in_expr381_data[] = { 0x0000000000000004LL};
-static ANTLRBitSet *FOLLOW_expr_in_expr383;
-static const unsigned long long FOLLOW_expr_in_expr383_data[] = { 0x0000000000078C00LL};
-static ANTLRBitSet *FOLLOW_expr_in_expr385;
-static const unsigned long long FOLLOW_expr_in_expr385_data[] = { 0x0000000000000008LL};
-static ANTLRBitSet *FOLLOW_K_PLUS_in_expr397;
-static const unsigned long long FOLLOW_K_PLUS_in_expr397_data[] = { 0x0000000000000004LL};
-static ANTLRBitSet *FOLLOW_expr_in_expr399;
-static const unsigned long long FOLLOW_expr_in_expr399_data[] = { 0x0000000000078C00LL};
-static ANTLRBitSet *FOLLOW_expr_in_expr401;
-static const unsigned long long FOLLOW_expr_in_expr401_data[] = { 0x0000000000000008LL};
-static ANTLRBitSet *FOLLOW_K_EQ_in_expr413;
-static const unsigned long long FOLLOW_K_EQ_in_expr413_data[] = { 0x0000000000000004LL};
-static ANTLRBitSet *FOLLOW_K_ID_in_expr415;
-static const unsigned long long FOLLOW_K_ID_in_expr415_data[] = { 0x0000000000078C00LL};
-static ANTLRBitSet *FOLLOW_expr_in_expr419;
-static const unsigned long long FOLLOW_expr_in_expr419_data[] = { 0x0000000000000008LL};
-static ANTLRBitSet *FOLLOW_atom_in_expr432;
-static const unsigned long long FOLLOW_atom_in_expr432_data[] = { 0x0000000000000002LL};
-static ANTLRBitSet *FOLLOW_set_in_atom0;
-static const unsigned long long FOLLOW_set_in_atom0_data[] = { 0x0000000000000002LL};
-
-
-#pragma mark Dynamic Global Scopes
-@implementation Symbols_Scope  /* globalAttributeScopeImpl */
-/* start of synthesize -- OBJC-Line 1750 */
-
-@synthesize tree;
-+ (Symbols_Scope *)newSymbols_Scope
-{
-    return [[[Symbols_Scope alloc] init] retain];
-}
-/* start of iterate get and set functions */
-
-- (ANTLRCommonTree *)gettree { return( tree ); }
-
-- (void)settree:(ANTLRCommonTree *)aVal { tree = aVal; }
-
-
-
-/* End of iterate get and set functions */
-
-@end /* end of Symbols_Scope implementation */
-
-
-#pragma mark Dynamic Rule Scopes
-
-#pragma mark Rule return scopes start
-@implementation SimpleCTP_expr_return
-+ (SimpleCTP_expr_return *)newSimpleCTP_expr_return
-{
-    return [[[SimpleCTP_expr_return alloc] init] retain];
-}
-
-
-
-
-@end /* end of returnScope implementation */
-
-
-
-@implementation SimpleCTP  // line 610
-
-+ (void) initialize
-{
-    #pragma mark Bitsets
-    FOLLOW_declaration_in_program56 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_declaration_in_program56_data Count:(NSUInteger)1] retain];
-    FOLLOW_variable_in_declaration76 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_variable_in_declaration76_data Count:(NSUInteger)1] retain];
-    FOLLOW_FUNC_DECL_in_declaration87 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_FUNC_DECL_in_declaration87_data Count:(NSUInteger)1] retain];
-    FOLLOW_functionHeader_in_declaration89 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_functionHeader_in_declaration89_data Count:(NSUInteger)1] retain];
-    FOLLOW_FUNC_DEF_in_declaration101 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_FUNC_DEF_in_declaration101_data Count:(NSUInteger)1] retain];
-    FOLLOW_functionHeader_in_declaration103 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_functionHeader_in_declaration103_data Count:(NSUInteger)1] retain];
-    FOLLOW_block_in_declaration105 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_block_in_declaration105_data Count:(NSUInteger)1] retain];
-    FOLLOW_VAR_DEF_in_variable126 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_VAR_DEF_in_variable126_data Count:(NSUInteger)1] retain];
-    FOLLOW_type_in_variable128 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_type_in_variable128_data Count:(NSUInteger)1] retain];
-    FOLLOW_declarator_in_variable130 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_declarator_in_variable130_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_ID_in_declarator150 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_ID_in_declarator150_data Count:(NSUInteger)1] retain];
-    FOLLOW_FUNC_HDR_in_functionHeader171 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_FUNC_HDR_in_functionHeader171_data Count:(NSUInteger)1] retain];
-    FOLLOW_type_in_functionHeader173 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_type_in_functionHeader173_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_ID_in_functionHeader175 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_ID_in_functionHeader175_data Count:(NSUInteger)1] retain];
-    FOLLOW_formalParameter_in_functionHeader177 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_formalParameter_in_functionHeader177_data Count:(NSUInteger)1] retain];
-    FOLLOW_ARG_DEF_in_formalParameter199 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_ARG_DEF_in_formalParameter199_data Count:(NSUInteger)1] retain];
-    FOLLOW_type_in_formalParameter201 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_type_in_formalParameter201_data Count:(NSUInteger)1] retain];
-    FOLLOW_declarator_in_formalParameter203 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_declarator_in_formalParameter203_data Count:(NSUInteger)1] retain];
-    FOLLOW_set_in_type0 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_set_in_type0_data Count:(NSUInteger)1] retain];
-    FOLLOW_BLOCK_in_block286 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_BLOCK_in_block286_data Count:(NSUInteger)1] retain];
-    FOLLOW_variable_in_block288 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_variable_in_block288_data Count:(NSUInteger)1] retain];
-    FOLLOW_stat_in_block291 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_stat_in_block291_data Count:(NSUInteger)1] retain];
-    FOLLOW_forStat_in_stat305 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_forStat_in_stat305_data Count:(NSUInteger)1] retain];
-    FOLLOW_expr_in_stat313 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_stat313_data Count:(NSUInteger)1] retain];
-    FOLLOW_block_in_stat321 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_block_in_stat321_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_FOR_in_forStat341 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_FOR_in_forStat341_data Count:(NSUInteger)1] retain];
-    FOLLOW_expr_in_forStat343 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_forStat343_data Count:(NSUInteger)1] retain];
-    FOLLOW_expr_in_forStat345 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_forStat345_data Count:(NSUInteger)1] retain];
-    FOLLOW_expr_in_forStat347 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_forStat347_data Count:(NSUInteger)1] retain];
-    FOLLOW_block_in_forStat349 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_block_in_forStat349_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_EQEQ_in_expr365 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_EQEQ_in_expr365_data Count:(NSUInteger)1] retain];
-    FOLLOW_expr_in_expr367 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_expr367_data Count:(NSUInteger)1] retain];
-    FOLLOW_expr_in_expr369 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_expr369_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_LT_in_expr381 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_LT_in_expr381_data Count:(NSUInteger)1] retain];
-    FOLLOW_expr_in_expr383 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_expr383_data Count:(NSUInteger)1] retain];
-    FOLLOW_expr_in_expr385 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_expr385_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_PLUS_in_expr397 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_PLUS_in_expr397_data Count:(NSUInteger)1] retain];
-    FOLLOW_expr_in_expr399 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_expr399_data Count:(NSUInteger)1] retain];
-    FOLLOW_expr_in_expr401 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_expr401_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_EQ_in_expr413 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_EQ_in_expr413_data Count:(NSUInteger)1] retain];
-    FOLLOW_K_ID_in_expr415 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_K_ID_in_expr415_data Count:(NSUInteger)1] retain];
-    FOLLOW_expr_in_expr419 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_expr419_data Count:(NSUInteger)1] retain];
-    FOLLOW_atom_in_expr432 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_atom_in_expr432_data Count:(NSUInteger)1] retain];
-    FOLLOW_set_in_atom0 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_set_in_atom0_data Count:(NSUInteger)1] retain];
-
-    [ANTLRBaseRecognizer setTokenNames:[[[NSArray alloc] initWithObjects:@"<invalid>", @"<EOR>", @"<DOWN>", @"<UP>", 
- @"VAR_DEF", @"ARG_DEF", @"FUNC_HDR", @"FUNC_DECL", @"FUNC_DEF", @"BLOCK", 
- @"K_ID", @"K_INT", @"K_CHAR", @"K_VOID", @"K_FOR", @"K_EQ", @"K_EQEQ", 
- @"K_LT", @"K_PLUS", @"K_INT_TYPE", @"WS", @"';'", @"'('", @"','", @"')'", 
- @"'{'", @"'}'", nil] retain]];
-}
-
-+ (SimpleCTP *)newSimpleCTP:(id<ANTLRTreeNodeStream>)aStream
-{
-
-    return [[SimpleCTP alloc] initWithStream:aStream];
-
-}
-
-
-- (id) initWithStream:(id<ANTLRTreeNodeStream>)aStream
-{
-    if ((self = [super initWithStream:aStream State:[[ANTLRRecognizerSharedState newANTLRRecognizerSharedStateWithRuleLen:12+1] retain]]) != nil) {
-
-
-
-        /* start of actions-actionScope-init */
-        /* start of init */
-    }
-    return self;
-}
-
-- (void) dealloc
-{
-    [Symbols_scope release];
-    [super dealloc];
-}
-// start actions.actionScope.methods
-// start methods()
-// start rules
-/*
- * $ANTLR start program
- * /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:13:1: program : ( declaration )+ ;
- */
-- (void) program
-{
-    /* ruleScopeSetUp */
-
-    @try {
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:14:5: ( ( declaration )+ ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:14:9: ( declaration )+ // alt
-        {
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:14:9: ( declaration )+ // positiveClosureBlock
-        NSInteger cnt1=0;
-        do {
-            NSInteger alt1=2;
-            NSInteger LA1_0 = [input LA:1];
-            if ( (LA1_0==VAR_DEF||(LA1_0>=FUNC_DECL && LA1_0<=FUNC_DEF)) ) {
-                alt1=1;
-            }
-
-
-            switch (alt1) {
-                case 1 : ;
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:14:9: declaration // alt
-                    {
-                    [self pushFollow:FOLLOW_declaration_in_program56];
-                    [self declaration];
-                    [self popFollow];
-
-                      /* element() */
-                     /* elements */
-                    }
-                    break;
-
-                default :
-                    if ( cnt1 >= 1 )
-                        goto loop1;
-                    ANTLREarlyExitException *eee = [ANTLREarlyExitException exceptionWithStream:input decisionNumber:1];
-                    @throw eee;
-            }
-            cnt1++;
-        } while (YES);
-        loop1: ;
-          /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-    }
-    @catch (ANTLRRecognitionException *re) {
-        [self reportError:re];
-        [self recover:input Exception:re];
-    }    @finally {
-    }
-    return ;
-}
-/* $ANTLR end program */
-/*
- * $ANTLR start declaration
- * /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:17:1: declaration : ( variable | ^( FUNC_DECL functionHeader ) | ^( FUNC_DEF functionHeader block ) );
- */
-- (void) declaration
-{
-    /* ruleScopeSetUp */
-
-    @try {
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:18:5: ( variable | ^( FUNC_DECL functionHeader ) | ^( FUNC_DEF functionHeader block ) ) //ruleblock
-        NSInteger alt2=3;
-        switch ([input LA:1]) {
-            case VAR_DEF: ;
-                {
-                alt2=1;
-                }
-                break;
-            case FUNC_DECL: ;
-                {
-                alt2=2;
-                }
-                break;
-            case FUNC_DEF: ;
-                {
-                alt2=3;
-                }
-                break;
-
-        default: ;
-            ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newANTLRNoViableAltException:2 state:0 stream:input];
-            @throw nvae;
-        }
-
-        switch (alt2) {
-            case 1 : ;
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:18:9: variable // alt
-                {
-                [self pushFollow:FOLLOW_variable_in_declaration76];
-                [self variable];
-                [self popFollow];
-
-                  /* element() */
-                 /* elements */
-                }
-                break;
-            case 2 : ;
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:19:9: ^( FUNC_DECL functionHeader ) // alt
-                {
-                [self match:input TokenType:FUNC_DECL Follow:FOLLOW_FUNC_DECL_in_declaration87];   /* element() */
-
-                    [self match:input TokenType:ANTLRTokenTypeDOWN Follow:nil]; 
-                    [self pushFollow:FOLLOW_functionHeader_in_declaration89];
-                    [self functionHeader];
-                    [self popFollow];
-
-                      /* element() */
-
-                    [self match:input TokenType:ANTLRTokenTypeUP Follow:nil];   /* element() */
-                 /* elements */
-                }
-                break;
-            case 3 : ;
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:20:9: ^( FUNC_DEF functionHeader block ) // alt
-                {
-                [self match:input TokenType:FUNC_DEF Follow:FOLLOW_FUNC_DEF_in_declaration101];   /* element() */
-
-                    [self match:input TokenType:ANTLRTokenTypeDOWN Follow:nil]; 
-                    [self pushFollow:FOLLOW_functionHeader_in_declaration103];
-                    [self functionHeader];
-                    [self popFollow];
-
-                      /* element() */
-                    [self pushFollow:FOLLOW_block_in_declaration105];
-                    [self block];
-                    [self popFollow];
-
-                      /* element() */
-
-                    [self match:input TokenType:ANTLRTokenTypeUP Follow:nil];   /* element() */
-                 /* elements */
-                }
-                break;
-
-        }
-        // token+rule list labels
-
-    }
-    @catch (ANTLRRecognitionException *re) {
-        [self reportError:re];
-        [self recover:input Exception:re];
-    }    @finally {
-    }
-    return ;
-}
-/* $ANTLR end declaration */
-/*
- * $ANTLR start variable
- * /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:23:1: variable : ^( VAR_DEF type declarator ) ;
- */
-- (void) variable
-{
-    /* ruleScopeSetUp */
-
-    @try {
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:24:5: ( ^( VAR_DEF type declarator ) ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:24:9: ^( VAR_DEF type declarator ) // alt
-        {
-        [self match:input TokenType:VAR_DEF Follow:FOLLOW_VAR_DEF_in_variable126];   /* element() */
-
-            [self match:input TokenType:ANTLRTokenTypeDOWN Follow:nil]; 
-            [self pushFollow:FOLLOW_type_in_variable128];
-            [self type];
-            [self popFollow];
-
-              /* element() */
-            [self pushFollow:FOLLOW_declarator_in_variable130];
-            [self declarator];
-            [self popFollow];
-
-              /* element() */
-
-            [self match:input TokenType:ANTLRTokenTypeUP Follow:nil];   /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-    }
-    @catch (ANTLRRecognitionException *re) {
-        [self reportError:re];
-        [self recover:input Exception:re];
-    }    @finally {
-    }
-    return ;
-}
-/* $ANTLR end variable */
-/*
- * $ANTLR start declarator
- * /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:27:1: declarator : K_ID ;
- */
-- (void) declarator
-{
-    /* ruleScopeSetUp */
-
-    @try {
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:28:5: ( K_ID ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:28:9: K_ID // alt
-        {
-        [self match:input TokenType:K_ID Follow:FOLLOW_K_ID_in_declarator150];   /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-    }
-    @catch (ANTLRRecognitionException *re) {
-        [self reportError:re];
-        [self recover:input Exception:re];
-    }    @finally {
-    }
-    return ;
-}
-/* $ANTLR end declarator */
-/*
- * $ANTLR start functionHeader
- * /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:31:1: functionHeader : ^( FUNC_HDR type K_ID ( formalParameter )+ ) ;
- */
-- (void) functionHeader
-{
-    /* ruleScopeSetUp */
-
-    @try {
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:32:5: ( ^( FUNC_HDR type K_ID ( formalParameter )+ ) ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:32:9: ^( FUNC_HDR type K_ID ( formalParameter )+ ) // alt
-        {
-        [self match:input TokenType:FUNC_HDR Follow:FOLLOW_FUNC_HDR_in_functionHeader171];   /* element() */
-
-            [self match:input TokenType:ANTLRTokenTypeDOWN Follow:nil]; 
-            [self pushFollow:FOLLOW_type_in_functionHeader173];
-            [self type];
-            [self popFollow];
-
-              /* element() */
-            [self match:input TokenType:K_ID Follow:FOLLOW_K_ID_in_functionHeader175];   /* element() */
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:32:30: ( formalParameter )+ // positiveClosureBlock
-            NSInteger cnt3=0;
-            do {
-                NSInteger alt3=2;
-                NSInteger LA3_0 = [input LA:1];
-                if ( (LA3_0==ARG_DEF) ) {
-                    alt3=1;
-                }
-
-
-                switch (alt3) {
-                    case 1 : ;
-                        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:32:30: formalParameter // alt
-                        {
-                        [self pushFollow:FOLLOW_formalParameter_in_functionHeader177];
-                        [self formalParameter];
-                        [self popFollow];
-
-                          /* element() */
-                         /* elements */
-                        }
-                        break;
-
-                    default :
-                        if ( cnt3 >= 1 )
-                            goto loop3;
-                        ANTLREarlyExitException *eee = [ANTLREarlyExitException exceptionWithStream:input decisionNumber:3];
-                        @throw eee;
-                }
-                cnt3++;
-            } while (YES);
-            loop3: ;
-              /* element() */
-
-            [self match:input TokenType:ANTLRTokenTypeUP Follow:nil];   /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-    }
-    @catch (ANTLRRecognitionException *re) {
-        [self reportError:re];
-        [self recover:input Exception:re];
-    }    @finally {
-    }
-    return ;
-}
-/* $ANTLR end functionHeader */
-/*
- * $ANTLR start formalParameter
- * /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:35:1: formalParameter : ^( ARG_DEF type declarator ) ;
- */
-- (void) formalParameter
-{
-    /* ruleScopeSetUp */
-
-    @try {
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:36:5: ( ^( ARG_DEF type declarator ) ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:36:9: ^( ARG_DEF type declarator ) // alt
-        {
-        [self match:input TokenType:ARG_DEF Follow:FOLLOW_ARG_DEF_in_formalParameter199];   /* element() */
-
-            [self match:input TokenType:ANTLRTokenTypeDOWN Follow:nil]; 
-            [self pushFollow:FOLLOW_type_in_formalParameter201];
-            [self type];
-            [self popFollow];
-
-              /* element() */
-            [self pushFollow:FOLLOW_declarator_in_formalParameter203];
-            [self declarator];
-            [self popFollow];
-
-              /* element() */
-
-            [self match:input TokenType:ANTLRTokenTypeUP Follow:nil];   /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-    }
-    @catch (ANTLRRecognitionException *re) {
-        [self reportError:re];
-        [self recover:input Exception:re];
-    }    @finally {
-    }
-    return ;
-}
-/* $ANTLR end formalParameter */
-/*
- * $ANTLR start type
- * /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:39:1: type : ( K_INT | K_CHAR | K_VOID | K_ID );
- */
-- (void) type
-{
-    /* ruleScopeSetUp */
-
-    @try {
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:40:5: ( K_INT | K_CHAR | K_VOID | K_ID ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g: // alt
-        {
-        if ((([input LA:1] >= K_ID) && ([input LA:1] <= K_VOID))) {
-            [input consume];
-            [state setIsErrorRecovery:NO];
-        } else {
-            ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException exceptionWithSet:nil stream:input];
-            @throw mse;
-        }
-          /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-    }
-    @catch (ANTLRRecognitionException *re) {
-        [self reportError:re];
-        [self recover:input Exception:re];
-    }    @finally {
-    }
-    return ;
-}
-/* $ANTLR end type */
-/*
- * $ANTLR start block
- * /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:46:1: block : ^( BLOCK ( variable )* ( stat )* ) ;
- */
-- (void) block
-{
-    /* ruleScopeSetUp */
-
-    @try {
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:47:5: ( ^( BLOCK ( variable )* ( stat )* ) ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:47:9: ^( BLOCK ( variable )* ( stat )* ) // alt
-        {
-        [self match:input TokenType:BLOCK Follow:FOLLOW_BLOCK_in_block286];   /* element() */
-
-        if ( [input LA:1] == ANTLRTokenTypeDOWN ) {
-            [self match:input TokenType:ANTLRTokenTypeDOWN Follow:nil]; 
-            do {
-                NSInteger alt4=2;
-                NSInteger LA4_0 = [input LA:1];
-                if ( (LA4_0==VAR_DEF) ) {
-                    alt4=1;
-                }
-
-
-                switch (alt4) {
-                    case 1 : ;
-                        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:47:17: variable // alt
-                        {
-                        [self pushFollow:FOLLOW_variable_in_block288];
-                        [self variable];
-                        [self popFollow];
-
-                          /* element() */
-                         /* elements */
-                        }
-                        break;
-
-                    default :
-                        goto loop4;
-                }
-            } while (YES);
-            loop4: ;
-              /* element() */
-            do {
-                NSInteger alt5=2;
-                NSInteger LA5_0 = [input LA:1];
-                if ( ((LA5_0>=BLOCK && LA5_0<=K_INT)||(LA5_0>=K_FOR && LA5_0<=K_PLUS)) ) {
-                    alt5=1;
-                }
-
-
-                switch (alt5) {
-                    case 1 : ;
-                        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:47:27: stat // alt
-                        {
-                        [self pushFollow:FOLLOW_stat_in_block291];
-                        [self stat];
-                        [self popFollow];
-
-                          /* element() */
-                         /* elements */
-                        }
-                        break;
-
-                    default :
-                        goto loop5;
-                }
-            } while (YES);
-            loop5: ;
-              /* element() */
-
-            [self match:input TokenType:ANTLRTokenTypeUP Follow:nil]; 
-        }  /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-    }
-    @catch (ANTLRRecognitionException *re) {
-        [self reportError:re];
-        [self recover:input Exception:re];
-    }    @finally {
-    }
-    return ;
-}
-/* $ANTLR end block */
-/*
- * $ANTLR start stat
- * /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:50:1: stat : ( forStat | expr | block );
- */
-- (void) stat
-{
-    /* ruleScopeSetUp */
-
-    @try {
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:50:5: ( forStat | expr | block ) //ruleblock
-        NSInteger alt6=3;
-        switch ([input LA:1]) {
-            case K_FOR: ;
-                {
-                alt6=1;
-                }
-                break;
-            case K_ID: ;
-            case K_INT: ;
-            case K_EQ: ;
-            case K_EQEQ: ;
-            case K_LT: ;
-            case K_PLUS: ;
-                {
-                alt6=2;
-                }
-                break;
-            case BLOCK: ;
-                {
-                alt6=3;
-                }
-                break;
-
-        default: ;
-            ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newANTLRNoViableAltException:6 state:0 stream:input];
-            @throw nvae;
-        }
-
-        switch (alt6) {
-            case 1 : ;
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:50:7: forStat // alt
-                {
-                [self pushFollow:FOLLOW_forStat_in_stat305];
-                [self forStat];
-                [self popFollow];
-
-                  /* element() */
-                 /* elements */
-                }
-                break;
-            case 2 : ;
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:51:7: expr // alt
-                {
-                [self pushFollow:FOLLOW_expr_in_stat313];
-                [self expr];
-                [self popFollow];
-
-                  /* element() */
-                 /* elements */
-                }
-                break;
-            case 3 : ;
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:52:7: block // alt
-                {
-                [self pushFollow:FOLLOW_block_in_stat321];
-                [self block];
-                [self popFollow];
-
-                  /* element() */
-                 /* elements */
-                }
-                break;
-
-        }
-        // token+rule list labels
-
-    }
-    @catch (ANTLRRecognitionException *re) {
-        [self reportError:re];
-        [self recover:input Exception:re];
-    }    @finally {
-    }
-    return ;
-}
-/* $ANTLR end stat */
-/*
- * $ANTLR start forStat
- * /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:55:1: forStat : ^( K_FOR expr expr expr block ) ;
- */
-- (void) forStat
-{
-    /* ruleScopeSetUp */
-
-    @try {
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:56:5: ( ^( K_FOR expr expr expr block ) ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:56:9: ^( K_FOR expr expr expr block ) // alt
-        {
-        [self match:input TokenType:K_FOR Follow:FOLLOW_K_FOR_in_forStat341];   /* element() */
-
-            [self match:input TokenType:ANTLRTokenTypeDOWN Follow:nil]; 
-            [self pushFollow:FOLLOW_expr_in_forStat343];
-            [self expr];
-            [self popFollow];
-
-              /* element() */
-            [self pushFollow:FOLLOW_expr_in_forStat345];
-            [self expr];
-            [self popFollow];
-
-              /* element() */
-            [self pushFollow:FOLLOW_expr_in_forStat347];
-            [self expr];
-            [self popFollow];
-
-              /* element() */
-            [self pushFollow:FOLLOW_block_in_forStat349];
-            [self block];
-            [self popFollow];
-
-              /* element() */
-
-            [self match:input TokenType:ANTLRTokenTypeUP Follow:nil];   /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-    }
-    @catch (ANTLRRecognitionException *re) {
-        [self reportError:re];
-        [self recover:input Exception:re];
-    }    @finally {
-    }
-    return ;
-}
-/* $ANTLR end forStat */
-/*
- * $ANTLR start expr
- * /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:59:1: expr : ( ^( K_EQEQ expr expr ) | ^( K_LT expr expr ) | ^( K_PLUS expr expr ) | ^( K_EQ K_ID e= expr ) | atom );
- */
-- (SimpleCTP_expr_return *) expr
-{
-    /* ruleScopeSetUp */
-
-    SimpleCTP_expr_return * retval = [SimpleCTP_expr_return newSimpleCTP_expr_return];
-    [retval setStart:[input LT:1]];
-
-    @try {
-        ANTLRCommonTree *K_ID1 = nil;
-        SimpleCTP_expr_return * e = nil;
-
-
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:59:5: ( ^( K_EQEQ expr expr ) | ^( K_LT expr expr ) | ^( K_PLUS expr expr ) | ^( K_EQ K_ID e= expr ) | atom ) //ruleblock
-        NSInteger alt7=5;
-        switch ([input LA:1]) {
-            case K_EQEQ: ;
-                {
-                alt7=1;
-                }
-                break;
-            case K_LT: ;
-                {
-                alt7=2;
-                }
-                break;
-            case K_PLUS: ;
-                {
-                alt7=3;
-                }
-                break;
-            case K_EQ: ;
-                {
-                alt7=4;
-                }
-                break;
-            case K_ID: ;
-            case K_INT: ;
-                {
-                alt7=5;
-                }
-                break;
-
-        default: ;
-            ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newANTLRNoViableAltException:7 state:0 stream:input];
-            @throw nvae;
-        }
-
-        switch (alt7) {
-            case 1 : ;
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:59:9: ^( K_EQEQ expr expr ) // alt
-                {
-                [self match:input TokenType:K_EQEQ Follow:FOLLOW_K_EQEQ_in_expr365];   /* element() */
-
-                    [self match:input TokenType:ANTLRTokenTypeDOWN Follow:nil]; 
-                    [self pushFollow:FOLLOW_expr_in_expr367];
-                    [self expr];
-                    [self popFollow];
-
-                      /* element() */
-                    [self pushFollow:FOLLOW_expr_in_expr369];
-                    [self expr];
-                    [self popFollow];
-
-                      /* element() */
-
-                    [self match:input TokenType:ANTLRTokenTypeUP Follow:nil];   /* element() */
-                 /* elements */
-                }
-                break;
-            case 2 : ;
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:60:9: ^( K_LT expr expr ) // alt
-                {
-                [self match:input TokenType:K_LT Follow:FOLLOW_K_LT_in_expr381];   /* element() */
-
-                    [self match:input TokenType:ANTLRTokenTypeDOWN Follow:nil]; 
-                    [self pushFollow:FOLLOW_expr_in_expr383];
-                    [self expr];
-                    [self popFollow];
-
-                      /* element() */
-                    [self pushFollow:FOLLOW_expr_in_expr385];
-                    [self expr];
-                    [self popFollow];
-
-                      /* element() */
-
-                    [self match:input TokenType:ANTLRTokenTypeUP Follow:nil];   /* element() */
-                 /* elements */
-                }
-                break;
-            case 3 : ;
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:61:9: ^( K_PLUS expr expr ) // alt
-                {
-                [self match:input TokenType:K_PLUS Follow:FOLLOW_K_PLUS_in_expr397];   /* element() */
-
-                    [self match:input TokenType:ANTLRTokenTypeDOWN Follow:nil]; 
-                    [self pushFollow:FOLLOW_expr_in_expr399];
-                    [self expr];
-                    [self popFollow];
-
-                      /* element() */
-                    [self pushFollow:FOLLOW_expr_in_expr401];
-                    [self expr];
-                    [self popFollow];
-
-                      /* element() */
-
-                    [self match:input TokenType:ANTLRTokenTypeUP Follow:nil];   /* element() */
-                 /* elements */
-                }
-                break;
-            case 4 : ;
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:62:9: ^( K_EQ K_ID e= expr ) // alt
-                {
-                [self match:input TokenType:K_EQ Follow:FOLLOW_K_EQ_in_expr413];   /* element() */
-
-                    [self match:input TokenType:ANTLRTokenTypeDOWN Follow:nil]; 
-                    K_ID1=(ANTLRCommonTree *)[self match:input TokenType:K_ID Follow:FOLLOW_K_ID_in_expr415];   /* element() */
-                    [self pushFollow:FOLLOW_expr_in_expr419];
-                    e = [self expr];
-                    [self popFollow];
-
-                      /* element() */
-
-                    [self match:input TokenType:ANTLRTokenTypeUP Follow:nil];   /* element() */
-                 NSLog(@"assigning %@ to variable %@", (e!=nil?[[input getTokenStream] toStringFromStart:[[input getTreeAdaptor] getTokenStartIndex:[e getStart]]
-                         ToEnd:[[input getTreeAdaptor] getTokenStopIndex:[e getStart]]]:nil), (K_ID1!=nil?[K_ID1 getText]:0));   /* element() */
-                 /* elements */
-                }
-                break;
-            case 5 : ;
-                // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:63:9: atom // alt
-                {
-                [self pushFollow:FOLLOW_atom_in_expr432];
-                [self atom];
-                [self popFollow];
-
-                  /* element() */
-                 /* elements */
-                }
-                break;
-
-        }
-        // token+rule list labels
-
-    }
-    @catch (ANTLRRecognitionException *re) {
-        [self reportError:re];
-        [self recover:input Exception:re];
-    }    @finally {
-    }
-    return retval;
-}
-/* $ANTLR end expr */
-/*
- * $ANTLR start atom
- * /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:66:1: atom : ( K_ID | K_INT );
- */
-- (void) atom
-{
-    /* ruleScopeSetUp */
-
-    @try {
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g:67:5: ( K_ID | K_INT ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/simplecTreeParser/SimpleCTP.g: // alt
-        {
-        if ((([input LA:1] >= K_ID) && ([input LA:1] <= K_INT))) {
-            [input consume];
-            [state setIsErrorRecovery:NO];
-        } else {
-            ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException exceptionWithSet:nil stream:input];
-            @throw mse;
-        }
-          /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-    }
-    @catch (ANTLRRecognitionException *re) {
-        [self reportError:re];
-        [self recover:input Exception:re];
-    }    @finally {
-    }
-    return ;
-}
-/* $ANTLR end atom */
-
-@end /* end of SimpleCTP implementation line 669 */
-
-
-/* End of code
- * =============================================================================
- */
diff --git a/runtime/ObjC/Framework/examples/simplecTreeParser/output1/SimpleCTP.tokens b/runtime/ObjC/Framework/examples/simplecTreeParser/output1/SimpleCTP.tokens
deleted file mode 100644
index 6d06db9..0000000
--- a/runtime/ObjC/Framework/examples/simplecTreeParser/output1/SimpleCTP.tokens
+++ /dev/null
@@ -1,29 +0,0 @@
-K_ID=10
-T__26=26
-T__25=25
-T__24=24
-T__23=23
-K_EQEQ=16
-T__22=22
-K_INT=11
-T__21=21
-K_FOR=14
-FUNC_HDR=6
-FUNC_DEF=8
-K_INT_TYPE=19
-FUNC_DECL=7
-ARG_DEF=5
-WS=20
-K_EQ=15
-BLOCK=9
-K_LT=17
-K_CHAR=12
-K_VOID=13
-VAR_DEF=4
-K_PLUS=18
-';'=21
-'}'=26
-'('=22
-','=23
-')'=24
-'{'=25
diff --git a/runtime/ObjC/Framework/examples/treeparser/Lang.g b/runtime/ObjC/Framework/examples/treeparser/Lang.g
index 90a2512..b2a5f0f 100755
--- a/runtime/ObjC/Framework/examples/treeparser/Lang.g
+++ b/runtime/ObjC/Framework/examples/treeparser/Lang.g
@@ -2,7 +2,7 @@
 options {
 	output=AST;
 	language = ObjC;
-	ASTLabelType=ANTLRCommonTree;
+	ASTLabelType=CommonTree;
 }
 
 tokens {DECL;} // an imaginary node
diff --git a/runtime/ObjC/Framework/examples/treeparser/LangDumpDecl.g b/runtime/ObjC/Framework/examples/treeparser/LangDumpDecl.g
index 07d3e39..5524f12 100755
--- a/runtime/ObjC/Framework/examples/treeparser/LangDumpDecl.g
+++ b/runtime/ObjC/Framework/examples/treeparser/LangDumpDecl.g
@@ -2,7 +2,7 @@
 options {
     tokenVocab=Lang;
 	language = ObjC;
-    ASTLabelType = ANTLRCommonTree;
+    ASTLabelType = CommonTree;
 }
 
 decl : ^(DECL type declarator)
diff --git a/runtime/ObjC/Framework/examples/treeparser/LangDumpDecl.h b/runtime/ObjC/Framework/examples/treeparser/LangDumpDecl.h
index daaa14d..67e4836 100644
--- a/runtime/ObjC/Framework/examples/treeparser/LangDumpDecl.h
+++ b/runtime/ObjC/Framework/examples/treeparser/LangDumpDecl.h
@@ -1,9 +1,9 @@
-// $ANTLR ${project.version} ${buildNumber} LangDumpDecl.g 2011-05-06 17:39:09
+// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/LangDumpDecl.g 2012-02-16 17:59:08
 
 /* =============================================================================
- * Standard antlr3 OBJC runtime definitions
+ * Standard antlr OBJC runtime definitions
  */
-#import <Cocoa/Cocoa.h>
+#import <Foundation/Foundation.h>
 #import <ANTLR/ANTLR.h>
 /* End of standard antlr3 runtime definitions
  * =============================================================================
@@ -34,32 +34,33 @@
 #define INT 7
 #define INTTYPE 8
 #define WS 9
-#pragma mark Dynamic Global Scopes
-#pragma mark Dynamic Rule Scopes
-#pragma mark Rule Return Scopes start
+#pragma mark Dynamic Global Scopes globalAttributeScopeInterface
+#pragma mark Dynamic Rule Scopes ruleAttributeScopeInterface
+#pragma mark Rule Return Scopes returnScopeInterface
 /* returnScopeInterface LangDumpDecl_declarator_return */
-@interface LangDumpDecl_declarator_return :ANTLRTreeRuleReturnScope { /* returnScopeInterface line 1838 */
+@interface LangDumpDecl_declarator_return : TreeRuleReturnScope { /* returnScopeInterface line 1838 */
  /* ObjC start of memVars() */
+
 }
-/* start properties */
+/* start property declarations */
+
+
+/* start of method declarations */
+
 + (LangDumpDecl_declarator_return *)newLangDumpDecl_declarator_return;
 /* this is start of set and get methods */
   /* methodsDecl */
+
 @end /* end of returnScopeInterface interface */
 
 
 
-
 /* Interface grammar class */
-@interface LangDumpDecl : ANTLRTreeParser { /* line 572 */
-/* ObjC start of ruleAttributeScopeMemVar */
+@interface LangDumpDecl  : TreeParser { /* line 572 */
+#pragma mark Dynamic Rule Scopes ruleAttributeScopeDecl
+#pragma mark Dynamic Global Rule Scopes globalAttributeScopeMemVar
 
 
-/* ObjC end of ruleAttributeScopeMemVar */
-/* ObjC start of globalAttributeScopeMemVar */
-
-
-/* ObjC end of globalAttributeScopeMemVar */
 /* ObjC start of actions.(actionScope).memVars */
 /* ObjC end of actions.(actionScope).memVars */
 /* ObjC start of memVars */
@@ -73,7 +74,7 @@
 /* ObjC end of properties */
 
 + (void) initialize;
-+ (id) newLangDumpDecl:(id<ANTLRTreeNodeStream>)aStream;
++ (id) newLangDumpDecl:(id<TreeNodeStream>)aStream;
 /* ObjC start of actions.(actionScope).methodsDecl */
 /* ObjC end of actions.(actionScope).methodsDecl */
 
diff --git a/runtime/ObjC/Framework/examples/treeparser/LangDumpDecl.m b/runtime/ObjC/Framework/examples/treeparser/LangDumpDecl.m
index 72bd695..cd0eac5 100644
--- a/runtime/ObjC/Framework/examples/treeparser/LangDumpDecl.m
+++ b/runtime/ObjC/Framework/examples/treeparser/LangDumpDecl.m
@@ -1,8 +1,8 @@
 /** \file
- *  This OBJC source file was generated by $ANTLR version ${project.version} ${buildNumber}
+ *  This OBJC source file was generated by $ANTLR version 3.4
  *
- *     -  From the grammar source file : LangDumpDecl.g
- *     -                            On : 2011-05-06 17:39:09
+ *     -  From the grammar source file : /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/LangDumpDecl.g
+ *     -                            On : 2012-02-16 17:59:08
  *     -           for the tree parser : LangDumpDeclTreeParser
  *
  * Editing it, at least manually, is not wise.
@@ -11,7 +11,7 @@
  *
  *
 */
-// $ANTLR ${project.version} ${buildNumber} LangDumpDecl.g 2011-05-06 17:39:09
+// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/LangDumpDecl.g 2012-02-16 17:59:08
 
 
 /* -----------------------------------------
@@ -39,22 +39,22 @@
 static const unsigned long long FOLLOW_ID_in_declarator95_data[] = { 0x0000000000000002LL};
 
 
-#pragma mark Dynamic Global Scopes
+#pragma mark Dynamic Global globalAttributeScopeImplementation
 
-#pragma mark Dynamic Rule Scopes
+#pragma mark Dynamic Rule Scopes ruleAttributeScopeImplementation
 
-#pragma mark Rule Return Scopes start
-@implementation LangDumpDecl_declarator_return /* returnScope */
+#pragma mark Rule Return Scopes returnScopeImplementation
+@implementation LangDumpDecl_declarator_return /* returnScopeImplementation */
  /* start of synthesize -- OBJC-Line 1837 */
 + (LangDumpDecl_declarator_return *)newLangDumpDecl_declarator_return
 {
-    return [[[LangDumpDecl_declarator_return alloc] init] retain];
+return [[[LangDumpDecl_declarator_return alloc] init] retain];
 }
 
 - (id) init
 {
-    self = [super init];
-    return self;
+self = [super init];
+return self;
 }
 
 
@@ -62,51 +62,41 @@
 @end /* end of returnScope implementation */
 
 
-//#pragma mark Rule return scopes start
-//
-
-#pragma mark Rule return scopes start
 
 @implementation LangDumpDecl  // line 637
 
 /* ObjC start of ruleAttributeScope */
-#pragma mark Dynamic Rule Scopes
+#pragma mark Dynamic Rule Scopes ruleAttributeScope
 /* ObjC end of ruleAttributeScope */
-#pragma mark global Attribute Scopes
+#pragma mark global Attribute Scopes globalAttributeScope
 /* ObjC start globalAttributeScope */
 /* ObjC end globalAttributeScope */
 /* ObjC start actions.(actionScope).synthesize */
-/* ObjC end actions.(actionScope).synthesize */
 /* ObjC start synthesize() */
-/* ObjC end synthesize() */
 
 + (void) initialize
 {
     #pragma mark Bitsets
-    FOLLOW_DECL_in_decl45 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_DECL_in_decl45_data Count:(NSUInteger)1] retain];
-    FOLLOW_type_in_decl47 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_type_in_decl47_data Count:(NSUInteger)1] retain];
-    FOLLOW_declarator_in_decl49 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_declarator_in_decl49_data Count:(NSUInteger)1] retain];
-    FOLLOW_INTTYPE_in_type81 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_INTTYPE_in_type81_data Count:(NSUInteger)1] retain];
-    FOLLOW_ID_in_declarator95 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_ID_in_declarator95_data Count:(NSUInteger)1] retain];
+    FOLLOW_DECL_in_decl45 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_DECL_in_decl45_data Count:(NSUInteger)1] retain];
+    FOLLOW_type_in_decl47 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_type_in_decl47_data Count:(NSUInteger)1] retain];
+    FOLLOW_declarator_in_decl49 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_declarator_in_decl49_data Count:(NSUInteger)1] retain];
+    FOLLOW_INTTYPE_in_type81 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_INTTYPE_in_type81_data Count:(NSUInteger)1] retain];
+    FOLLOW_ID_in_declarator95 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_ID_in_declarator95_data Count:(NSUInteger)1] retain];
 
-    [ANTLRBaseRecognizer setTokenNames:[[AMutableArray arrayWithObjects:@"<invalid>", @"<EOR>", @"<DOWN>", @"<UP>", 
+    [BaseRecognizer setTokenNames:[[AMutableArray arrayWithObjects:@"<invalid>", @"<EOR>", @"<DOWN>", @"<UP>", 
  @"DECL", @"FLOATTYPE", @"ID", @"INT", @"INTTYPE", @"WS", @"';'", nil] retain]];
-    [ANTLRBaseRecognizer setGrammarFileName:@"LangDumpDecl.g"];
+    [BaseRecognizer setGrammarFileName:@"/Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/LangDumpDecl.g"];
 }
 
-+ (LangDumpDecl *)newLangDumpDecl:(id<ANTLRTreeNodeStream>)aStream
++ (LangDumpDecl *)newLangDumpDecl:(id<TreeNodeStream>)aStream
 {
     return [[LangDumpDecl alloc] initWithStream:aStream];
-
-
 }
 
-- (id) initWithStream:(id<ANTLRTreeNodeStream>)aStream
+- (id) initWithStream:(id<TreeNodeStream>)aStream
 {
-    self = [super initWithStream:aStream State:[[ANTLRRecognizerSharedState newANTLRRecognizerSharedStateWithRuleLen:3+1] retain]];
+    self = [super initWithStream:aStream State:[[RecognizerSharedState newRecognizerSharedStateWithRuleLen:3+1] retain]];
     if ( self != nil ) {
-
-
         /* start of actions-actionScope-init */
         /* start of init */
     }
@@ -118,8 +108,6 @@
     [super dealloc];
 }
 
-/* ObjC start members */
-/* ObjC end members */
 /* ObjC start actions.(actionScope).methods */
 /* ObjC end actions.(actionScope).methods */
 /* ObjC start methods() */
@@ -127,23 +115,28 @@
 /* ObjC start rules */
 /*
  * $ANTLR start decl
- * LangDumpDecl.g:8:1: decl : ^( DECL type declarator ) ;
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/LangDumpDecl.g:8:1: decl : ^( DECL type declarator ) ;
  */
 - (void) decl
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
-         LangDumpDecl_declarator_return * declarator1 = nil ;
-         
+        /* ruleLabelDefs entry */
+        LangDumpDecl_declarator_return * declarator1 = nil ;
 
-        // LangDumpDecl.g:8:6: ( ^( DECL type declarator ) ) // ruleBlockSingleAlt
-        // LangDumpDecl.g:8:8: ^( DECL type declarator ) // alt
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/LangDumpDecl.g:8:6: ( ^( DECL type declarator ) ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/LangDumpDecl.g:8:8: ^( DECL type declarator ) // alt
         {
-        [self match:input TokenType:DECL Follow:FOLLOW_DECL_in_decl45]; 
 
+
+        [self match:input TokenType:DECL Follow:FOLLOW_DECL_in_decl45]; 
+         
             [self match:input TokenType:DOWN Follow:nil]; 
+
             /* ruleRef */
             [self pushFollow:FOLLOW_type_in_decl47];
             [self type];
@@ -151,7 +144,7 @@
             [self popFollow];
 
 
-
+             
             /* ruleRef */
             [self pushFollow:FOLLOW_declarator_in_decl49];
             declarator1 = [self declarator];
@@ -159,25 +152,26 @@
             [self popFollow];
 
 
-
+             
             [self match:input TokenType:UP Follow:nil]; 
 
+         
 
          NSLog(@"int %@", (declarator1!=nil?[[input getTokenStream] toStringFromStart:[[input getTreeAdaptor] getTokenStartIndex:[declarator1 getStart]]ToEnd:[[input getTreeAdaptor] getTokenStopIndex:[declarator1 getStart]]]:0));
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
     }
 
     @finally {
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return ;
@@ -186,31 +180,36 @@
 
 /*
  * $ANTLR start type
- * LangDumpDecl.g:13:1: type : INTTYPE ;
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/LangDumpDecl.g:13:1: type : INTTYPE ;
  */
 - (void) type
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
-        // LangDumpDecl.g:13:6: ( INTTYPE ) // ruleBlockSingleAlt
-        // LangDumpDecl.g:13:8: INTTYPE // alt
-        {
-        [self match:input TokenType:INTTYPE Follow:FOLLOW_INTTYPE_in_type81]; 
+        /* ruleLabelDefs entry */
 
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/LangDumpDecl.g:13:6: ( INTTYPE ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/LangDumpDecl.g:13:8: INTTYPE // alt
+        {
+
+        [self match:input TokenType:INTTYPE Follow:FOLLOW_INTTYPE_in_type81]; 
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
     }
 
     @finally {
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return ;
@@ -219,35 +218,39 @@
 
 /*
  * $ANTLR start declarator
- * LangDumpDecl.g:15:1: declarator : ID ;
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/LangDumpDecl.g:15:1: declarator : ID ;
  */
 - (LangDumpDecl_declarator_return *) declarator
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
 
+    /* ruleDeclarations */
     LangDumpDecl_declarator_return * retval = [LangDumpDecl_declarator_return newLangDumpDecl_declarator_return];
     [retval setStart:[input LT:1]];
 
 
     @try {
-        // LangDumpDecl.g:16:6: ( ID ) // ruleBlockSingleAlt
-        // LangDumpDecl.g:16:8: ID // alt
-        {
-        [self match:input TokenType:ID Follow:FOLLOW_ID_in_declarator95]; 
+        /* ruleLabelDefs entry */
 
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/LangDumpDecl.g:16:6: ( ID ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/LangDumpDecl.g:16:8: ID // alt
+        {
+
+        [self match:input TokenType:ID Follow:FOLLOW_ID_in_declarator95]; 
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
     }
 
     @finally {
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return retval;
diff --git a/runtime/ObjC/Framework/examples/treeparser/LangLexer.h b/runtime/ObjC/Framework/examples/treeparser/LangLexer.h
index d647d13..9905e66 100644
--- a/runtime/ObjC/Framework/examples/treeparser/LangLexer.h
+++ b/runtime/ObjC/Framework/examples/treeparser/LangLexer.h
@@ -1,9 +1,9 @@
-// $ANTLR ${project.version} ${buildNumber} Lang.g 2011-05-06 17:38:52
+// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/Lang.g 2012-02-16 17:58:54
 
 /* =============================================================================
- * Standard antlr3 OBJC runtime definitions
+ * Standard antlr OBJC runtime definitions
  */
-#import <Cocoa/Cocoa.h>
+#import <Foundation/Foundation.h>
 #import <ANTLR/ANTLR.h>
 /* End of standard antlr3 runtime definitions
  * =============================================================================
@@ -11,8 +11,8 @@
 
 /* Start cyclicDFAInterface */
 
-#pragma mark Rule return scopes start
-#pragma mark Rule return scopes end
+#pragma mark Rule return scopes Interface start
+#pragma mark Rule return scopes Interface end
 #pragma mark Tokens
 #ifdef EOF
 #undef EOF
@@ -26,12 +26,12 @@
 #define INTTYPE 8
 #define WS 9
 /* interface lexer class */
-@interface LangLexer : ANTLRLexer { // line 283
+@interface LangLexer : Lexer { // line 283
 /* ObjC start of actions.lexer.memVars */
 /* ObjC end of actions.lexer.memVars */
 }
 + (void) initialize;
-+ (LangLexer *)newLangLexerWithCharStream:(id<ANTLRCharStream>)anInput;
++ (LangLexer *)newLangLexerWithCharStream:(id<CharStream>)anInput;
 /* ObjC start actions.lexer.methodsDecl */
 /* ObjC end actions.lexer.methodsDecl */
 - (void) mT__10 ; 
diff --git a/runtime/ObjC/Framework/examples/treeparser/LangLexer.m b/runtime/ObjC/Framework/examples/treeparser/LangLexer.m
index 12cf90c..bba84cd 100644
--- a/runtime/ObjC/Framework/examples/treeparser/LangLexer.m
+++ b/runtime/ObjC/Framework/examples/treeparser/LangLexer.m
@@ -1,8 +1,8 @@
 /** \file
- *  This OBJC source file was generated by $ANTLR version ${project.version} ${buildNumber}
+ *  This OBJC source file was generated by $ANTLR version 3.4
  *
- *     -  From the grammar source file : Lang.g
- *     -                            On : 2011-05-06 17:38:52
+ *     -  From the grammar source file : /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/Lang.g
+ *     -                            On : 2012-02-16 17:58:54
  *     -                 for the lexer : LangLexerLexer
  *
  * Editing it, at least manually, is not wise.
@@ -11,7 +11,7 @@
  *
  *
 */
-// $ANTLR ${project.version} ${buildNumber} Lang.g 2011-05-06 17:38:52
+// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/Lang.g 2012-02-16 17:58:54
 
 
 /* -----------------------------------------
@@ -31,7 +31,7 @@
 
 + (void) initialize
 {
-    [ANTLRBaseRecognizer setGrammarFileName:@"Lang.g"];
+    [BaseRecognizer setGrammarFileName:@"/Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/Lang.g"];
 }
 
 + (NSString *) tokenNameForType:(NSInteger)aTokenType
@@ -39,14 +39,14 @@
     return [[self getTokenNames] objectAtIndex:aTokenType];
 }
 
-+ (LangLexer *)newLangLexerWithCharStream:(id<ANTLRCharStream>)anInput
++ (LangLexer *)newLangLexerWithCharStream:(id<CharStream>)anInput
 {
     return [[LangLexer alloc] initWithCharStream:anInput];
 }
 
-- (id) initWithCharStream:(id<ANTLRCharStream>)anInput
+- (id) initWithCharStream:(id<CharStream>)anInput
 {
-    self = [super initWithCharStream:anInput State:[[ANTLRRecognizerSharedState newANTLRRecognizerSharedStateWithRuleLen:7+1] retain]];
+    self = [super initWithCharStream:anInput State:[RecognizerSharedState newRecognizerSharedStateWithRuleLen:7+1]];
     if ( self != nil ) {
     }
     return self;
@@ -67,114 +67,122 @@
 - (void) mT__10
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = T__10;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // Lang.g:7:7: ( ';' ) // ruleBlockSingleAlt
-        // Lang.g:7:9: ';' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/Lang.g:7:7: ( ';' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/Lang.g:7:9: ';' // alt
         {
+
+
         [self matchChar:';']; 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "T__10" */
-
 // $ANTLR start "INTTYPE"
 - (void) mINTTYPE
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = INTTYPE;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // Lang.g:18:9: ( 'int' ) // ruleBlockSingleAlt
-        // Lang.g:18:11: 'int' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/Lang.g:18:9: ( 'int' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/Lang.g:18:11: 'int' // alt
         {
+
+
         [self matchString:@"int"]; 
 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "INTTYPE" */
-
 // $ANTLR start "FLOATTYPE"
 - (void) mFLOATTYPE
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = FLOATTYPE;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // Lang.g:19:11: ( 'float' ) // ruleBlockSingleAlt
-        // Lang.g:19:13: 'float' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/Lang.g:19:11: ( 'float' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/Lang.g:19:13: 'float' // alt
         {
+
+
         [self matchString:@"float"]; 
 
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "FLOATTYPE" */
-
 // $ANTLR start "ID"
 - (void) mID
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = ID;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // Lang.g:20:4: ( ( 'a' .. 'z' )+ ) // ruleBlockSingleAlt
-        // Lang.g:20:6: ( 'a' .. 'z' )+ // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/Lang.g:20:4: ( ( 'a' .. 'z' )+ ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/Lang.g:20:6: ( 'a' .. 'z' )+ // alt
         {
-        // Lang.g:20:6: ( 'a' .. 'z' )+ // positiveClosureBlock
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/Lang.g:20:6: ( 'a' .. 'z' )+ // positiveClosureBlock
         NSInteger cnt1 = 0;
         do {
             NSInteger alt1 = 2;
@@ -186,62 +194,64 @@
 
             switch (alt1) {
                 case 1 : ;
-                    // Lang.g: // alt
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/Lang.g: // alt
                     {
+
                     if ((([input LA:1] >= 'a') && ([input LA:1] <= 'z'))) {
                         [input consume];
                     } else {
-                        ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException newException:nil stream:input];
+                        MismatchedSetException *mse = [MismatchedSetException newException:nil stream:input];
                         [self recover:mse];
                         @throw mse;
                     }
 
-
+                     
                     }
                     break;
 
                 default :
                     if ( cnt1 >= 1 )
                         goto loop1;
-                    ANTLREarlyExitException *eee =
-                        [ANTLREarlyExitException newException:input decisionNumber:1];
+                    EarlyExitException *eee =
+                        [EarlyExitException newException:input decisionNumber:1];
                     @throw eee;
             }
             cnt1++;
         } while (YES);
         loop1: ;
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "ID" */
-
 // $ANTLR start "INT"
 - (void) mINT
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = INT;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // Lang.g:21:5: ( ( '0' .. '9' )+ ) // ruleBlockSingleAlt
-        // Lang.g:21:7: ( '0' .. '9' )+ // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/Lang.g:21:5: ( ( '0' .. '9' )+ ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/Lang.g:21:7: ( '0' .. '9' )+ // alt
         {
-        // Lang.g:21:7: ( '0' .. '9' )+ // positiveClosureBlock
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/Lang.g:21:7: ( '0' .. '9' )+ // positiveClosureBlock
         NSInteger cnt2 = 0;
         do {
             NSInteger alt2 = 2;
@@ -253,92 +263,94 @@
 
             switch (alt2) {
                 case 1 : ;
-                    // Lang.g: // alt
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/Lang.g: // alt
                     {
+
                     if ((([input LA:1] >= '0') && ([input LA:1] <= '9'))) {
                         [input consume];
                     } else {
-                        ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException newException:nil stream:input];
+                        MismatchedSetException *mse = [MismatchedSetException newException:nil stream:input];
                         [self recover:mse];
                         @throw mse;
                     }
 
-
+                     
                     }
                     break;
 
                 default :
                     if ( cnt2 >= 1 )
                         goto loop2;
-                    ANTLREarlyExitException *eee =
-                        [ANTLREarlyExitException newException:input decisionNumber:2];
+                    EarlyExitException *eee =
+                        [EarlyExitException newException:input decisionNumber:2];
                     @throw eee;
             }
             cnt2++;
         } while (YES);
         loop2: ;
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "INT" */
-
 // $ANTLR start "WS"
 - (void) mWS
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = WS;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // Lang.g:22:4: ( ( ' ' | '\\n' ) ) // ruleBlockSingleAlt
-        // Lang.g:22:6: ( ' ' | '\\n' ) // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/Lang.g:22:4: ( ( ' ' | '\\n' ) ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/Lang.g:22:6: ( ' ' | '\\n' ) // alt
         {
+
         if ([input LA:1] == '\n'||[input LA:1] == ' ') {
             [input consume];
         } else {
-            ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException newException:nil stream:input];
+            MismatchedSetException *mse = [MismatchedSetException newException:nil stream:input];
             [self recover:mse];
             @throw mse;
         }
 
+         
 
         _channel=HIDDEN;
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "WS" */
-
 - (void) mTokens
 {
-    // Lang.g:1:8: ( T__10 | INTTYPE | FLOATTYPE | ID | INT | WS ) //ruleblock
+    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/Lang.g:1:8: ( T__10 | INTTYPE | FLOATTYPE | ID | INT | WS ) //ruleblock
     NSInteger alt3=6;
     unichar charLA3 = [input LA:1];
     switch (charLA3) {
@@ -463,7 +475,7 @@
             break;
 
     default: ;
-        ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newException:3 state:0 stream:input];
+        NoViableAltException *nvae = [NoViableAltException newException:3 state:0 stream:input];
         nvae.c = charLA3;
         @throw nvae;
 
@@ -471,57 +483,69 @@
 
     switch (alt3) {
         case 1 : ;
-            // Lang.g:1:10: T__10 // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/Lang.g:1:10: T__10 // alt
             {
+
+
             [self mT__10]; 
 
 
-
+             
             }
             break;
         case 2 : ;
-            // Lang.g:1:16: INTTYPE // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/Lang.g:1:16: INTTYPE // alt
             {
+
+
             [self mINTTYPE]; 
 
 
-
+             
             }
             break;
         case 3 : ;
-            // Lang.g:1:24: FLOATTYPE // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/Lang.g:1:24: FLOATTYPE // alt
             {
+
+
             [self mFLOATTYPE]; 
 
 
-
+             
             }
             break;
         case 4 : ;
-            // Lang.g:1:34: ID // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/Lang.g:1:34: ID // alt
             {
+
+
             [self mID]; 
 
 
-
+             
             }
             break;
         case 5 : ;
-            // Lang.g:1:37: INT // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/Lang.g:1:37: INT // alt
             {
+
+
             [self mINT]; 
 
 
-
+             
             }
             break;
         case 6 : ;
-            // Lang.g:1:41: WS // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/Lang.g:1:41: WS // alt
             {
+
+
             [self mWS]; 
 
 
-
+             
             }
             break;
 
diff --git a/runtime/ObjC/Framework/examples/treeparser/LangParser.h b/runtime/ObjC/Framework/examples/treeparser/LangParser.h
index ba51fba..62efb21 100644
--- a/runtime/ObjC/Framework/examples/treeparser/LangParser.h
+++ b/runtime/ObjC/Framework/examples/treeparser/LangParser.h
@@ -1,9 +1,9 @@
-// $ANTLR ${project.version} ${buildNumber} Lang.g 2011-05-06 17:38:52
+// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/Lang.g 2012-02-16 17:58:54
 
 /* =============================================================================
- * Standard antlr3 OBJC runtime definitions
+ * Standard antlr OBJC runtime definitions
  */
-#import <Cocoa/Cocoa.h>
+#import <Foundation/Foundation.h>
 #import <ANTLR/ANTLR.h>
 /* End of standard antlr3 runtime definitions
  * =============================================================================
@@ -34,77 +34,85 @@
 #define INT 7
 #define INTTYPE 8
 #define WS 9
-#pragma mark Dynamic Global Scopes
-#pragma mark Dynamic Rule Scopes
-#pragma mark Rule Return Scopes start
+#pragma mark Dynamic Global Scopes globalAttributeScopeInterface
+#pragma mark Dynamic Rule Scopes ruleAttributeScopeInterface
+#pragma mark Rule Return Scopes returnScopeInterface
 /* returnScopeInterface LangParser_start_return */
-@interface LangParser_start_return :ANTLRParserRuleReturnScope { /* returnScopeInterface line 1838 */
+@interface LangParser_start_return : ParserRuleReturnScope { /* returnScopeInterface line 1838 */
 /* AST returnScopeInterface.memVars */
-ANTLRCommonTree *tree; /* ObjC start of memVars() */
+CommonTree *tree; /* ObjC start of memVars() */
+
 }
-/* start properties */
+/* start property declarations */
 /* AST returnScopeInterface.properties */
-@property (retain, getter=getTree, setter=setTree:) ANTLRCommonTree *tree;
+@property (retain, getter=getTree, setter=setTree:) CommonTree *tree;
+
+/* start of method declarations */
+
 + (LangParser_start_return *)newLangParser_start_return;
 /* this is start of set and get methods */
 /* AST returnScopeInterface.methodsDecl */
-- (ANTLRCommonTree *)getTree;
+- (CommonTree *)getTree;
 
-- (void) setTree:(ANTLRCommonTree *)aTree;
+- (void) setTree:(CommonTree *)aTree;
   /* methodsDecl */
-@end /* end of returnScopeInterface interface */
 
+@end /* end of returnScopeInterface interface */
 
 
 /* returnScopeInterface LangParser_decl_return */
-@interface LangParser_decl_return :ANTLRParserRuleReturnScope { /* returnScopeInterface line 1838 */
+@interface LangParser_decl_return : ParserRuleReturnScope { /* returnScopeInterface line 1838 */
 /* AST returnScopeInterface.memVars */
-ANTLRCommonTree *tree; /* ObjC start of memVars() */
+CommonTree *tree; /* ObjC start of memVars() */
+
 }
-/* start properties */
+/* start property declarations */
 /* AST returnScopeInterface.properties */
-@property (retain, getter=getTree, setter=setTree:) ANTLRCommonTree *tree;
+@property (retain, getter=getTree, setter=setTree:) CommonTree *tree;
+
+/* start of method declarations */
+
 + (LangParser_decl_return *)newLangParser_decl_return;
 /* this is start of set and get methods */
 /* AST returnScopeInterface.methodsDecl */
-- (ANTLRCommonTree *)getTree;
+- (CommonTree *)getTree;
 
-- (void) setTree:(ANTLRCommonTree *)aTree;
+- (void) setTree:(CommonTree *)aTree;
   /* methodsDecl */
-@end /* end of returnScopeInterface interface */
 
+@end /* end of returnScopeInterface interface */
 
 
 /* returnScopeInterface LangParser_type_return */
-@interface LangParser_type_return :ANTLRParserRuleReturnScope { /* returnScopeInterface line 1838 */
+@interface LangParser_type_return : ParserRuleReturnScope { /* returnScopeInterface line 1838 */
 /* AST returnScopeInterface.memVars */
-ANTLRCommonTree *tree; /* ObjC start of memVars() */
+CommonTree *tree; /* ObjC start of memVars() */
+
 }
-/* start properties */
+/* start property declarations */
 /* AST returnScopeInterface.properties */
-@property (retain, getter=getTree, setter=setTree:) ANTLRCommonTree *tree;
+@property (retain, getter=getTree, setter=setTree:) CommonTree *tree;
+
+/* start of method declarations */
+
 + (LangParser_type_return *)newLangParser_type_return;
 /* this is start of set and get methods */
 /* AST returnScopeInterface.methodsDecl */
-- (ANTLRCommonTree *)getTree;
+- (CommonTree *)getTree;
 
-- (void) setTree:(ANTLRCommonTree *)aTree;
+- (void) setTree:(CommonTree *)aTree;
   /* methodsDecl */
-@end /* end of returnScopeInterface interface */
 
+@end /* end of returnScopeInterface interface */
 
 
 
 /* Interface grammar class */
-@interface LangParser : ANTLRParser { /* line 572 */
-/* ObjC start of ruleAttributeScopeMemVar */
+@interface LangParser  : Parser { /* line 572 */
+#pragma mark Dynamic Rule Scopes ruleAttributeScopeDecl
+#pragma mark Dynamic Global Rule Scopes globalAttributeScopeMemVar
 
 
-/* ObjC end of ruleAttributeScopeMemVar */
-/* ObjC start of globalAttributeScopeMemVar */
-
-
-/* ObjC end of globalAttributeScopeMemVar */
 /* ObjC start of actions.(actionScope).memVars */
 /* ObjC end of actions.(actionScope).memVars */
 /* ObjC start of memVars */
@@ -113,7 +121,7 @@
 NSArray *ruleNames;
   /* AST super.memVars */
 /* AST parserMemVars */
-id<ANTLRTreeAdaptor> treeAdaptor;   /* AST parserMemVars */
+id<TreeAdaptor> treeAdaptor;   /* AST parserMemVars */
 /* ObjC end of memVars */
 
  }
@@ -124,11 +132,11 @@
 /* AST parserHeaderFile.properties */
   /* AST super.properties */
 /* AST parserProperties */
-@property (retain, getter=getTreeAdaptor, setter=setTreeAdaptor:) id<ANTLRTreeAdaptor> treeAdaptor;   /* AST parserproperties */
+@property (retain, getter=getTreeAdaptor, setter=setTreeAdaptor:) id<TreeAdaptor> treeAdaptor;   /* AST parserproperties */
 /* ObjC end of properties */
 
 + (void) initialize;
-+ (id) newLangParser:(id<ANTLRTokenStream>)aStream;
++ (id) newLangParser:(id<TokenStream>)aStream;
 /* ObjC start of actions.(actionScope).methodsDecl */
 /* ObjC end of actions.(actionScope).methodsDecl */
 
@@ -136,8 +144,8 @@
 /* AST parserHeaderFile.methodsDecl */
   /* AST super.methodsDecl */
 /* AST parserMethodsDecl */
-- (id<ANTLRTreeAdaptor>) getTreeAdaptor;
-- (void) setTreeAdaptor:(id<ANTLRTreeAdaptor>)theTreeAdaptor;   /* AST parsermethodsDecl */
+- (id<TreeAdaptor>) getTreeAdaptor;
+- (void) setTreeAdaptor:(id<TreeAdaptor>)theTreeAdaptor;   /* AST parsermethodsDecl */
 /* ObjC end of methodsDecl */
 
 - (LangParser_start_return *)start; 
diff --git a/runtime/ObjC/Framework/examples/treeparser/LangParser.m b/runtime/ObjC/Framework/examples/treeparser/LangParser.m
index 6c49d09..e879b2b 100644
--- a/runtime/ObjC/Framework/examples/treeparser/LangParser.m
+++ b/runtime/ObjC/Framework/examples/treeparser/LangParser.m
@@ -1,8 +1,8 @@
 /** \file
- *  This OBJC source file was generated by $ANTLR version ${project.version} ${buildNumber}
+ *  This OBJC source file was generated by $ANTLR version 3.4
  *
- *     -  From the grammar source file : Lang.g
- *     -                            On : 2011-05-06 17:38:52
+ *     -  From the grammar source file : /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/Lang.g
+ *     -                            On : 2012-02-16 17:58:54
  *     -                for the parser : LangParserParser
  *
  * Editing it, at least manually, is not wise.
@@ -11,7 +11,7 @@
  *
  *
 */
-// $ANTLR ${project.version} ${buildNumber} Lang.g 2011-05-06 17:38:52
+// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/Lang.g 2012-02-16 17:58:54
 
 
 /* -----------------------------------------
@@ -37,32 +37,32 @@
 static const unsigned long long FOLLOW_10_in_decl54_data[] = { 0x0000000000000002LL};
 
 
-#pragma mark Dynamic Global Scopes
+#pragma mark Dynamic Global globalAttributeScopeImplementation
 
-#pragma mark Dynamic Rule Scopes
+#pragma mark Dynamic Rule Scopes ruleAttributeScopeImplementation
 
-#pragma mark Rule Return Scopes start
-@implementation LangParser_start_return /* returnScope */
+#pragma mark Rule Return Scopes returnScopeImplementation
+@implementation LangParser_start_return /* returnScopeImplementation */
 /* AST returnScope.synthesize */
 @synthesize tree; /* start of synthesize -- OBJC-Line 1837 */
 + (LangParser_start_return *)newLangParser_start_return
 {
-    return [[[LangParser_start_return alloc] init] retain];
+return [[[LangParser_start_return alloc] init] retain];
 }
 
 - (id) init
 {
-    self = [super init];
-    return self;
+self = [super init];
+return self;
 }
 
 /* AST returnScope.methods */
-- (ANTLRCommonTree *)getTree
+- (CommonTree *)getTree
 {
     return tree;
 }
 
-- (void) setTree:(ANTLRCommonTree *)aTree
+- (void) setTree:(CommonTree *)aTree
 {
     if (tree != aTree) {
         if (tree != nil) [tree release];
@@ -78,31 +78,29 @@
 }
 
 
-
 @end /* end of returnScope implementation */
 
-
-@implementation LangParser_decl_return /* returnScope */
+@implementation LangParser_decl_return /* returnScopeImplementation */
 /* AST returnScope.synthesize */
 @synthesize tree; /* start of synthesize -- OBJC-Line 1837 */
 + (LangParser_decl_return *)newLangParser_decl_return
 {
-    return [[[LangParser_decl_return alloc] init] retain];
+return [[[LangParser_decl_return alloc] init] retain];
 }
 
 - (id) init
 {
-    self = [super init];
-    return self;
+self = [super init];
+return self;
 }
 
 /* AST returnScope.methods */
-- (ANTLRCommonTree *)getTree
+- (CommonTree *)getTree
 {
     return tree;
 }
 
-- (void) setTree:(ANTLRCommonTree *)aTree
+- (void) setTree:(CommonTree *)aTree
 {
     if (tree != aTree) {
         if (tree != nil) [tree release];
@@ -118,31 +116,29 @@
 }
 
 
-
 @end /* end of returnScope implementation */
 
-
-@implementation LangParser_type_return /* returnScope */
+@implementation LangParser_type_return /* returnScopeImplementation */
 /* AST returnScope.synthesize */
 @synthesize tree; /* start of synthesize -- OBJC-Line 1837 */
 + (LangParser_type_return *)newLangParser_type_return
 {
-    return [[[LangParser_type_return alloc] init] retain];
+return [[[LangParser_type_return alloc] init] retain];
 }
 
 - (id) init
 {
-    self = [super init];
-    return self;
+self = [super init];
+return self;
 }
 
 /* AST returnScope.methods */
-- (ANTLRCommonTree *)getTree
+- (CommonTree *)getTree
 {
     return tree;
 }
 
-- (void) setTree:(ANTLRCommonTree *)aTree
+- (void) setTree:(CommonTree *)aTree
 {
     if (tree != aTree) {
         if (tree != nil) [tree release];
@@ -158,61 +154,50 @@
 }
 
 
-
 @end /* end of returnScope implementation */
 
 
-//#pragma mark Rule return scopes start
-//
-
-#pragma mark Rule return scopes start
 
 @implementation LangParser  // line 637
 
 /* ObjC start of ruleAttributeScope */
-#pragma mark Dynamic Rule Scopes
+#pragma mark Dynamic Rule Scopes ruleAttributeScope
 /* ObjC end of ruleAttributeScope */
-#pragma mark global Attribute Scopes
+#pragma mark global Attribute Scopes globalAttributeScope
 /* ObjC start globalAttributeScope */
 /* ObjC end globalAttributeScope */
 /* ObjC start actions.(actionScope).synthesize */
-/* ObjC end actions.(actionScope).synthesize */
 /* ObjC start synthesize() */
 /* AST genericParser.synthesize */
 /* AST parserProperties */
 @synthesize treeAdaptor;
-/* ObjC end synthesize() */
 
 + (void) initialize
 {
     #pragma mark Bitsets
-    FOLLOW_decl_in_start41 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_decl_in_start41_data Count:(NSUInteger)1] retain];
-    FOLLOW_type_in_decl50 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_type_in_decl50_data Count:(NSUInteger)1] retain];
-    FOLLOW_ID_in_decl52 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_ID_in_decl52_data Count:(NSUInteger)1] retain];
-    FOLLOW_10_in_decl54 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_10_in_decl54_data Count:(NSUInteger)1] retain];
+    FOLLOW_decl_in_start41 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_decl_in_start41_data Count:(NSUInteger)1] retain];
+    FOLLOW_type_in_decl50 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_type_in_decl50_data Count:(NSUInteger)1] retain];
+    FOLLOW_ID_in_decl52 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_ID_in_decl52_data Count:(NSUInteger)1] retain];
+    FOLLOW_10_in_decl54 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_10_in_decl54_data Count:(NSUInteger)1] retain];
 
-    [ANTLRBaseRecognizer setTokenNames:[[AMutableArray arrayWithObjects:@"<invalid>", @"<EOR>", @"<DOWN>", @"<UP>", 
+    [BaseRecognizer setTokenNames:[[AMutableArray arrayWithObjects:@"<invalid>", @"<EOR>", @"<DOWN>", @"<UP>", 
  @"DECL", @"FLOATTYPE", @"ID", @"INT", @"INTTYPE", @"WS", @"';'", nil] retain]];
-    [ANTLRBaseRecognizer setGrammarFileName:@"Lang.g"];
+    [BaseRecognizer setGrammarFileName:@"/Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/Lang.g"];
 }
 
-+ (LangParser *)newLangParser:(id<ANTLRTokenStream>)aStream
++ (LangParser *)newLangParser:(id<TokenStream>)aStream
 {
     return [[LangParser alloc] initWithTokenStream:aStream];
-
-
 }
 
-- (id) initWithTokenStream:(id<ANTLRTokenStream>)aStream
+- (id) initWithTokenStream:(id<TokenStream>)aStream
 {
-    self = [super initWithTokenStream:aStream State:[[ANTLRRecognizerSharedState newANTLRRecognizerSharedStateWithRuleLen:3+1] retain]];
+    self = [super initWithTokenStream:aStream State:[[RecognizerSharedState newRecognizerSharedStateWithRuleLen:3+1] retain]];
     if ( self != nil ) {
-
-
         /* start of actions-actionScope-init */
         /* start of init */
         /* AST genericParser.init */
-        [self setTreeAdaptor:[[ANTLRCommonTreeAdaptor newTreeAdaptor] retain]];
+        [self setTreeAdaptor:[[CommonTreeAdaptor newTreeAdaptor] retain]];
     }
     return self;
 }
@@ -225,19 +210,17 @@
     [super dealloc];
 }
 
-/* ObjC start members */
-/* ObjC end members */
 /* ObjC start actions.(actionScope).methods */
 /* ObjC end actions.(actionScope).methods */
 /* ObjC start methods() */
 /* AST genericParser.methods */
 /* AST parserMethods */
-- (id<ANTLRTreeAdaptor>) getTreeAdaptor
+- (id<TreeAdaptor>) getTreeAdaptor
 {
 	return treeAdaptor;
 }
 
-- (void) setTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor
+- (void) setTreeAdaptor:(id<TreeAdaptor>)aTreeAdaptor
 {
 	if (aTreeAdaptor != treeAdaptor) {
 		treeAdaptor = aTreeAdaptor;
@@ -247,30 +230,32 @@
 /* ObjC start rules */
 /*
  * $ANTLR start start
- * Lang.g:10:1: start : decl ;
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/Lang.g:10:1: start : decl ;
  */
 - (LangParser_start_return *) start
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
 
     /* AST ruleDeclarations */
+    /* ruleDeclarations */
     LangParser_start_return * retval = [LangParser_start_return newLangParser_start_return];
     [retval setStart:[input LT:1]];
 
 
-    ANTLRCommonTree *root_0 = nil;
+    CommonTree *root_0 = nil;
 
     @try {
         /* AST ruleLabelDefs */
-         LangParser_decl_return * decl1 = nil ;
-         
+        /* ruleLabelDefs entry */
+        LangParser_decl_return * decl1 = nil ;
 
 
-        // Lang.g:10:7: ( decl ) // ruleBlockSingleAlt
-        // Lang.g:10:9: decl // alt
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/Lang.g:10:7: ( decl ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/Lang.g:10:9: decl // alt
         {
-        root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+        root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+
 
 
         /* ASTParser ruleRef */
@@ -282,30 +267,30 @@
 
 
         [treeAdaptor addChild:[decl1 getTree] toTree:root_0];
-
+         
         }
 
         /* ASTParser ruleCleanUp */
         /* AST ruleCleanUp */
-        // token+rule list labels
+        /* token+rule list labels */
         [retval setStop:[input LT:-1]];
 
 
 
-            retval.tree = (ANTLRCommonTree *)[treeAdaptor rulePostProcessing:root_0];
+            retval.tree = (CommonTree *)[treeAdaptor rulePostProcessing:root_0];
             [treeAdaptor setTokenBoundaries:retval.tree From:retval.start To:retval.stopToken];
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
         /* ASTParser rule.setErrorReturnValue */
-        retval.tree = (ANTLRCommonTree *)[treeAdaptor errorNode:input From:retval.start To:[input LT:-1] Exception:re];
+        retval.tree = (CommonTree *)[treeAdaptor errorNode:input From:retval.start To:[input LT:-1] Exception:re];
 
     }
 
     @finally {
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return retval;
@@ -314,41 +299,42 @@
 
 /*
  * $ANTLR start decl
- * Lang.g:12:1: decl : type ID ';' -> ^( DECL type ID ) ;
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/Lang.g:12:1: decl : type ID ';' -> ^( DECL type ID ) ;
  */
 - (LangParser_decl_return *) decl
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
 
     /* AST ruleDeclarations */
+    /* ruleDeclarations */
     LangParser_decl_return * retval = [LangParser_decl_return newLangParser_decl_return];
     [retval setStart:[input LT:1]];
 
 
-    ANTLRCommonTree *root_0 = nil;
+    CommonTree *root_0 = nil;
 
     @try {
         /* AST ruleLabelDefs */
-        ANTLRCommonToken *ID3 = nil;
-        ANTLRCommonToken *char_literal4 = nil;
-         LangParser_type_return * type2 = nil ;
-         
+        /* ruleLabelDefs entry */
+        CommonToken *ID3 = nil;
+        CommonToken *char_literal4 = nil;LangParser_type_return * type2 = nil ;
 
-        ANTLRCommonTree *ID3_tree=nil;
-        ANTLRCommonTree *char_literal4_tree=nil;
-        ANTLRRewriteRuleTokenStream *stream_10 =
-            [[ANTLRRewriteRuleTokenStream newANTLRRewriteRuleTokenStream:treeAdaptor
+
+        CommonTree *ID3_tree=nil;
+        CommonTree *char_literal4_tree=nil;
+        RewriteRuleTokenStream *stream_10 =
+            [[RewriteRuleTokenStream newRewriteRuleTokenStream:treeAdaptor
                                                              description:@"token 10"] retain];
-        ANTLRRewriteRuleTokenStream *stream_ID =
-            [[ANTLRRewriteRuleTokenStream newANTLRRewriteRuleTokenStream:treeAdaptor
+        RewriteRuleTokenStream *stream_ID =
+            [[RewriteRuleTokenStream newRewriteRuleTokenStream:treeAdaptor
                                                              description:@"token ID"] retain];
-        ANTLRRewriteRuleSubtreeStream *stream_type =
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
+        RewriteRuleSubtreeStream *stream_type =
+            [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
                                                                 description:@"rule type"] retain];
-        // Lang.g:12:6: ( type ID ';' -> ^( DECL type ID ) ) // ruleBlockSingleAlt
-        // Lang.g:12:8: type ID ';' // alt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/Lang.g:12:6: ( type ID ';' -> ^( DECL type ID ) ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/Lang.g:12:8: type ID ';' // alt
         {
+
         /* ruleRef */
         [self pushFollow:FOLLOW_type_in_decl50];
         type2 = [self type];
@@ -357,17 +343,17 @@
 
 
         [stream_type addElement:[type2 getTree]];
-
-        ID3=(ANTLRCommonToken *)[self match:input TokenType:ID Follow:FOLLOW_ID_in_decl52];  
+         
+        ID3=(CommonToken *)[self match:input TokenType:ID Follow:FOLLOW_ID_in_decl52];  
             [stream_ID addElement:ID3];
 
-
-        char_literal4=(ANTLRCommonToken *)[self match:input TokenType:10 Follow:FOLLOW_10_in_decl54];  
+         
+        char_literal4=(CommonToken *)[self match:input TokenType:10 Follow:FOLLOW_10_in_decl54];  
             [stream_10 addElement:char_literal4];
 
-
+         
         // AST REWRITE
-        // elements: ID, type
+        // elements: type, ID
         // token labels: 
         // rule labels: retval
         // token list labels: 
@@ -375,19 +361,19 @@
         // wildcard labels: 
         retval.tree = root_0;
 
-        ANTLRRewriteRuleSubtreeStream *stream_retval =
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
+        RewriteRuleSubtreeStream *stream_retval =
+            [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
                 description:@"token retval" element:retval!=nil?[retval getTree]:nil] retain];
 
-        root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+        root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
 
         // 12:20: -> ^( DECL type ID )
         {
-            // Lang.g:12:23: ^( DECL type ID )
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/Lang.g:12:23: ^( DECL type ID )
             {
-                ANTLRCommonTree *root_1 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
-                root_1 = (ANTLRCommonTree *)[treeAdaptor becomeRoot:
-                        [treeAdaptor createTree:DECL Text:@"DECL"]
+                CommonTree *root_1 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+                root_1 = (CommonTree *)[treeAdaptor becomeRoot:
+                        [[treeAdaptor createTree:DECL Text:@"DECL"] retain]
                  old:root_1];
 
                 [treeAdaptor addChild:[stream_type nextTree] toTree:root_1];
@@ -410,7 +396,7 @@
 
         /* ASTParser ruleCleanUp */
         /* AST ruleCleanUp */
-        // token+rule list labels
+        /* token+rule list labels */
         [retval setStop:[input LT:-1]];
 
 
@@ -418,20 +404,20 @@
         [stream_ID release];
         [stream_type release];
 
-            retval.tree = (ANTLRCommonTree *)[treeAdaptor rulePostProcessing:root_0];
+            retval.tree = (CommonTree *)[treeAdaptor rulePostProcessing:root_0];
             [treeAdaptor setTokenBoundaries:retval.tree From:retval.start To:retval.stopToken];
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
         /* ASTParser rule.setErrorReturnValue */
-        retval.tree = (ANTLRCommonTree *)[treeAdaptor errorNode:input From:retval.start To:[input LT:-1] Exception:re];
+        retval.tree = (CommonTree *)[treeAdaptor errorNode:input From:retval.start To:[input LT:-1] Exception:re];
 
     }
 
     @finally {
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return retval;
@@ -440,71 +426,73 @@
 
 /*
  * $ANTLR start type
- * Lang.g:14:1: type : ( INTTYPE | FLOATTYPE );
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/Lang.g:14:1: type : ( INTTYPE | FLOATTYPE );
  */
 - (LangParser_type_return *) type
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
 
     /* AST ruleDeclarations */
+    /* ruleDeclarations */
     LangParser_type_return * retval = [LangParser_type_return newLangParser_type_return];
     [retval setStart:[input LT:1]];
 
 
-    ANTLRCommonTree *root_0 = nil;
+    CommonTree *root_0 = nil;
 
     @try {
         /* AST ruleLabelDefs */
-        ANTLRCommonToken *set5 = nil;
+        /* ruleLabelDefs entry */
+        CommonToken *set5 = nil;
 
-        ANTLRCommonTree *set5_tree=nil;
+        CommonTree *set5_tree=nil;
 
-        // Lang.g:14:6: ( INTTYPE | FLOATTYPE ) // ruleBlockSingleAlt
-        // Lang.g: // alt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/Lang.g:14:6: ( INTTYPE | FLOATTYPE ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/Lang.g: // alt
         {
-        root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+        root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+
 
 
         /* ASTParser matchRuleBlockSet */
         /* ASTParser matchSet */
-        set5 = (ANTLRCommonToken *)[input LT:1]; /* matchSet */
+        set5 = (CommonToken *)[input LT:1]; /* matchSet */
 
         if ([input LA:1] == FLOATTYPE||[input LA:1] == INTTYPE) {
             [input consume];
             [treeAdaptor addChild:/* ASTParser createNodeFromToken */
-            (ANTLRCommonTree *)[[treeAdaptor create:set5] retain]
+            (CommonTree *)[[treeAdaptor create:set5] retain]
              toTree:root_0 ];
             [state setIsErrorRecovery:NO];
         } else {
-            ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException newException:nil stream:input];
+            MismatchedSetException *mse = [MismatchedSetException newException:nil stream:input];
             @throw mse;
         }
 
-
+         
         }
 
         /* ASTParser ruleCleanUp */
         /* AST ruleCleanUp */
-        // token+rule list labels
+        /* token+rule list labels */
         [retval setStop:[input LT:-1]];
 
 
 
-            retval.tree = (ANTLRCommonTree *)[treeAdaptor rulePostProcessing:root_0];
+            retval.tree = (CommonTree *)[treeAdaptor rulePostProcessing:root_0];
             [treeAdaptor setTokenBoundaries:retval.tree From:retval.start To:retval.stopToken];
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
         /* ASTParser rule.setErrorReturnValue */
-        retval.tree = (ANTLRCommonTree *)[treeAdaptor errorNode:input From:retval.start To:[input LT:-1] Exception:re];
+        retval.tree = (CommonTree *)[treeAdaptor errorNode:input From:retval.start To:[input LT:-1] Exception:re];
 
     }
 
     @finally {
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return retval;
diff --git a/runtime/ObjC/Framework/examples/treeparser/main.m b/runtime/ObjC/Framework/examples/treeparser/main.m
index d1eeaf1..610c76a 100644
--- a/runtime/ObjC/Framework/examples/treeparser/main.m
+++ b/runtime/ObjC/Framework/examples/treeparser/main.m
@@ -1,5 +1,5 @@
-#import <Cocoa/Cocoa.h>
-#import "antlr3.h"
+#import <Foundation/Foundation.h>
+#import <ANTLR/ANTLR.h>
 #import "LangLexer.h"
 #import "LangParser.h"
 #import "LangDumpDecl.h"
@@ -33,19 +33,19 @@
 {
     NSError *error;
     NSLog(@"starting treeparser\n");
-    NSString *dir = @"/Users/acondit/source/antlr3/acondit_localhost/code/antlr/main/runtime/ObjC/Framework/examples/treeparser/input";
+    NSString *dir = @"/Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treeparser/input";
 	NSString *string = [NSString stringWithContentsOfFile:dir  encoding:NSASCIIStringEncoding error:&error];
 	NSLog(@"input = %@", string);
 	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:string];
 	LangLexer *lex = [LangLexer newLangLexerWithCharStream:stream];
-    ANTLRCommonTokenStream *tokens = [ANTLRCommonTokenStream newANTLRCommonTokenStreamWithTokenSource:lex];
+    CommonTokenStream *tokens = [CommonTokenStream newCommonTokenStreamWithTokenSource:lex];
     LangParser *parser = [LangParser newLangParser:tokens];
 //    LangParser_decl_return *r = [parser decl];
     LangParser_start_return *r = [parser start];
     NSLog( @"tree: %@", [r.tree toStringTree]);
-    ANTLRCommonTree *r0 = [r getTree];
+    CommonTree *r0 = [r getTree];
     
-    ANTLRCommonTreeNodeStream *nodes = [ANTLRCommonTreeNodeStream newANTLRCommonTreeNodeStream:r0];
+    CommonTreeNodeStream *nodes = [CommonTreeNodeStream newCommonTreeNodeStream:r0];
     [nodes setTokenStream:tokens];
     LangDumpDecl *walker = [LangDumpDecl newLangDumpDecl:nodes];
     [walker decl];
diff --git a/runtime/ObjC/Framework/examples/treerewrite/TreeRewriteLexer.h b/runtime/ObjC/Framework/examples/treerewrite/TreeRewriteLexer.h
index f51686c..8595371 100644
--- a/runtime/ObjC/Framework/examples/treerewrite/TreeRewriteLexer.h
+++ b/runtime/ObjC/Framework/examples/treerewrite/TreeRewriteLexer.h
@@ -1,9 +1,9 @@
-// $ANTLR ${project.version} ${buildNumber} TreeRewrite.g 2011-05-06 18:56:28
+// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treerewrite/TreeRewrite.g 2012-02-16 17:42:35
 
 /* =============================================================================
- * Standard antlr3 OBJC runtime definitions
+ * Standard antlr OBJC runtime definitions
  */
-#import <Cocoa/Cocoa.h>
+#import <Foundation/Foundation.h>
 #import <ANTLR/ANTLR.h>
 /* End of standard antlr3 runtime definitions
  * =============================================================================
@@ -11,8 +11,8 @@
 
 /* Start cyclicDFAInterface */
 
-#pragma mark Rule return scopes start
-#pragma mark Rule return scopes end
+#pragma mark Rule return scopes Interface start
+#pragma mark Rule return scopes Interface end
 #pragma mark Tokens
 #ifdef EOF
 #undef EOF
@@ -21,12 +21,12 @@
 #define INT 4
 #define WS 5
 /* interface lexer class */
-@interface TreeRewriteLexer : ANTLRLexer { // line 283
+@interface TreeRewriteLexer : Lexer { // line 283
 /* ObjC start of actions.lexer.memVars */
 /* ObjC end of actions.lexer.memVars */
 }
 + (void) initialize;
-+ (TreeRewriteLexer *)newTreeRewriteLexerWithCharStream:(id<ANTLRCharStream>)anInput;
++ (TreeRewriteLexer *)newTreeRewriteLexerWithCharStream:(id<CharStream>)anInput;
 /* ObjC start actions.lexer.methodsDecl */
 /* ObjC end actions.lexer.methodsDecl */
 - (void) mINT ; 
diff --git a/runtime/ObjC/Framework/examples/treerewrite/TreeRewriteLexer.m b/runtime/ObjC/Framework/examples/treerewrite/TreeRewriteLexer.m
index 0d9d31a..136f01f 100644
--- a/runtime/ObjC/Framework/examples/treerewrite/TreeRewriteLexer.m
+++ b/runtime/ObjC/Framework/examples/treerewrite/TreeRewriteLexer.m
@@ -1,8 +1,8 @@
 /** \file
- *  This OBJC source file was generated by $ANTLR version ${project.version} ${buildNumber}
+ *  This OBJC source file was generated by $ANTLR version 3.4
  *
- *     -  From the grammar source file : TreeRewrite.g
- *     -                            On : 2011-05-06 18:56:28
+ *     -  From the grammar source file : /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treerewrite/TreeRewrite.g
+ *     -                            On : 2012-02-16 17:42:35
  *     -                 for the lexer : TreeRewriteLexerLexer
  *
  * Editing it, at least manually, is not wise.
@@ -11,7 +11,7 @@
  *
  *
 */
-// $ANTLR ${project.version} ${buildNumber} TreeRewrite.g 2011-05-06 18:56:28
+// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treerewrite/TreeRewrite.g 2012-02-16 17:42:35
 
 
 /* -----------------------------------------
@@ -31,7 +31,7 @@
 
 + (void) initialize
 {
-    [ANTLRBaseRecognizer setGrammarFileName:@"TreeRewrite.g"];
+    [BaseRecognizer setGrammarFileName:@"/Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treerewrite/TreeRewrite.g"];
 }
 
 + (NSString *) tokenNameForType:(NSInteger)aTokenType
@@ -39,14 +39,14 @@
     return [[self getTokenNames] objectAtIndex:aTokenType];
 }
 
-+ (TreeRewriteLexer *)newTreeRewriteLexerWithCharStream:(id<ANTLRCharStream>)anInput
++ (TreeRewriteLexer *)newTreeRewriteLexerWithCharStream:(id<CharStream>)anInput
 {
     return [[TreeRewriteLexer alloc] initWithCharStream:anInput];
 }
 
-- (id) initWithCharStream:(id<ANTLRCharStream>)anInput
+- (id) initWithCharStream:(id<CharStream>)anInput
 {
-    self = [super initWithCharStream:anInput State:[[ANTLRRecognizerSharedState newANTLRRecognizerSharedStateWithRuleLen:3+1] retain]];
+    self = [super initWithCharStream:anInput State:[RecognizerSharedState newRecognizerSharedStateWithRuleLen:3+1]];
     if ( self != nil ) {
     }
     return self;
@@ -67,16 +67,18 @@
 - (void) mINT
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = INT;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // TreeRewrite.g:15:5: ( ( '0' .. '9' )+ ) // ruleBlockSingleAlt
-        // TreeRewrite.g:15:7: ( '0' .. '9' )+ // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treerewrite/TreeRewrite.g:15:5: ( ( '0' .. '9' )+ ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treerewrite/TreeRewrite.g:15:7: ( '0' .. '9' )+ // alt
         {
-        // TreeRewrite.g:15:7: ( '0' .. '9' )+ // positiveClosureBlock
+
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treerewrite/TreeRewrite.g:15:7: ( '0' .. '9' )+ // positiveClosureBlock
         NSInteger cnt1 = 0;
         do {
             NSInteger alt1 = 2;
@@ -88,86 +90,89 @@
 
             switch (alt1) {
                 case 1 : ;
-                    // TreeRewrite.g: // alt
+                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treerewrite/TreeRewrite.g: // alt
                     {
+
                     if ((([input LA:1] >= '0') && ([input LA:1] <= '9'))) {
                         [input consume];
                     } else {
-                        ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException newException:nil stream:input];
+                        MismatchedSetException *mse = [MismatchedSetException newException:nil stream:input];
                         [self recover:mse];
                         @throw mse;
                     }
 
-
+                     
                     }
                     break;
 
                 default :
                     if ( cnt1 >= 1 )
                         goto loop1;
-                    ANTLREarlyExitException *eee =
-                        [ANTLREarlyExitException newException:input decisionNumber:1];
+                    EarlyExitException *eee =
+                        [EarlyExitException newException:input decisionNumber:1];
                     @throw eee;
             }
             cnt1++;
         } while (YES);
         loop1: ;
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "INT" */
-
 // $ANTLR start "WS"
 - (void) mWS
 {
     //
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
+
+    /* ruleDeclarations */
 
     @try {
         NSInteger _type = WS;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // TreeRewrite.g:18:5: ( ' ' ) // ruleBlockSingleAlt
-        // TreeRewrite.g:18:9: ' ' // alt
+        NSInteger _channel = TokenChannelDefault;
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treerewrite/TreeRewrite.g:18:5: ( ' ' ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treerewrite/TreeRewrite.g:18:9: ' ' // alt
         {
+
+
         [self matchChar:' ']; 
 
+         
 
         _channel=HIDDEN;
 
-
+         
         }
 
-        // token+rule list labels
+        /* token+rule list labels */
 
         state.type = _type;
         state.channel = _channel;
     }
     @finally {
         //
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return;
 }
 /* $ANTLR end "WS" */
-
 - (void) mTokens
 {
-    // TreeRewrite.g:1:8: ( INT | WS ) //ruleblock
+    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treerewrite/TreeRewrite.g:1:8: ( INT | WS ) //ruleblock
     NSInteger alt2=2;
     NSInteger LA2_0 = [input LA:1];
 
@@ -178,28 +183,32 @@
         alt2=2;
     }
     else {
-        ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newException:2 state:0 stream:input];
+        NoViableAltException *nvae = [NoViableAltException newException:2 state:0 stream:input];
         nvae.c = LA2_0;
         @throw nvae;
 
     }
     switch (alt2) {
         case 1 : ;
-            // TreeRewrite.g:1:10: INT // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treerewrite/TreeRewrite.g:1:10: INT // alt
             {
+
+
             [self mINT]; 
 
 
-
+             
             }
             break;
         case 2 : ;
-            // TreeRewrite.g:1:14: WS // alt
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treerewrite/TreeRewrite.g:1:14: WS // alt
             {
+
+
             [self mWS]; 
 
 
-
+             
             }
             break;
 
diff --git a/runtime/ObjC/Framework/examples/treerewrite/TreeRewriteParser.h b/runtime/ObjC/Framework/examples/treerewrite/TreeRewriteParser.h
index f587cdd..3139f47 100644
--- a/runtime/ObjC/Framework/examples/treerewrite/TreeRewriteParser.h
+++ b/runtime/ObjC/Framework/examples/treerewrite/TreeRewriteParser.h
@@ -1,9 +1,9 @@
-// $ANTLR ${project.version} ${buildNumber} TreeRewrite.g 2011-05-06 18:56:28
+// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treerewrite/TreeRewrite.g 2012-02-16 17:42:35
 
 /* =============================================================================
- * Standard antlr3 OBJC runtime definitions
+ * Standard antlr OBJC runtime definitions
  */
-#import <Cocoa/Cocoa.h>
+#import <Foundation/Foundation.h>
 #import <ANTLR/ANTLR.h>
 /* End of standard antlr3 runtime definitions
  * =============================================================================
@@ -29,58 +29,62 @@
 #define EOF -1
 #define INT 4
 #define WS 5
-#pragma mark Dynamic Global Scopes
-#pragma mark Dynamic Rule Scopes
-#pragma mark Rule Return Scopes start
+#pragma mark Dynamic Global Scopes globalAttributeScopeInterface
+#pragma mark Dynamic Rule Scopes ruleAttributeScopeInterface
+#pragma mark Rule Return Scopes returnScopeInterface
 /* returnScopeInterface TreeRewriteParser_rule_return */
-@interface TreeRewriteParser_rule_return :ANTLRParserRuleReturnScope { /* returnScopeInterface line 1838 */
+@interface TreeRewriteParser_rule_return : ParserRuleReturnScope { /* returnScopeInterface line 1838 */
 /* AST returnScopeInterface.memVars */
-ANTLRCommonTree *tree; /* ObjC start of memVars() */
+CommonTree *tree; /* ObjC start of memVars() */
+
 }
-/* start properties */
+/* start property declarations */
 /* AST returnScopeInterface.properties */
-@property (retain, getter=getTree, setter=setTree:) ANTLRCommonTree *tree;
+@property (retain, getter=getTree, setter=setTree:) CommonTree *tree;
+
+/* start of method declarations */
+
 + (TreeRewriteParser_rule_return *)newTreeRewriteParser_rule_return;
 /* this is start of set and get methods */
 /* AST returnScopeInterface.methodsDecl */
-- (ANTLRCommonTree *)getTree;
+- (CommonTree *)getTree;
 
-- (void) setTree:(ANTLRCommonTree *)aTree;
+- (void) setTree:(CommonTree *)aTree;
   /* methodsDecl */
-@end /* end of returnScopeInterface interface */
 
+@end /* end of returnScopeInterface interface */
 
 
 /* returnScopeInterface TreeRewriteParser_subrule_return */
-@interface TreeRewriteParser_subrule_return :ANTLRParserRuleReturnScope { /* returnScopeInterface line 1838 */
+@interface TreeRewriteParser_subrule_return : ParserRuleReturnScope { /* returnScopeInterface line 1838 */
 /* AST returnScopeInterface.memVars */
-ANTLRCommonTree *tree; /* ObjC start of memVars() */
+CommonTree *tree; /* ObjC start of memVars() */
+
 }
-/* start properties */
+/* start property declarations */
 /* AST returnScopeInterface.properties */
-@property (retain, getter=getTree, setter=setTree:) ANTLRCommonTree *tree;
+@property (retain, getter=getTree, setter=setTree:) CommonTree *tree;
+
+/* start of method declarations */
+
 + (TreeRewriteParser_subrule_return *)newTreeRewriteParser_subrule_return;
 /* this is start of set and get methods */
 /* AST returnScopeInterface.methodsDecl */
-- (ANTLRCommonTree *)getTree;
+- (CommonTree *)getTree;
 
-- (void) setTree:(ANTLRCommonTree *)aTree;
+- (void) setTree:(CommonTree *)aTree;
   /* methodsDecl */
-@end /* end of returnScopeInterface interface */
 
+@end /* end of returnScopeInterface interface */
 
 
 
 /* Interface grammar class */
-@interface TreeRewriteParser : ANTLRParser { /* line 572 */
-/* ObjC start of ruleAttributeScopeMemVar */
+@interface TreeRewriteParser  : Parser { /* line 572 */
+#pragma mark Dynamic Rule Scopes ruleAttributeScopeDecl
+#pragma mark Dynamic Global Rule Scopes globalAttributeScopeMemVar
 
 
-/* ObjC end of ruleAttributeScopeMemVar */
-/* ObjC start of globalAttributeScopeMemVar */
-
-
-/* ObjC end of globalAttributeScopeMemVar */
 /* ObjC start of actions.(actionScope).memVars */
 /* ObjC end of actions.(actionScope).memVars */
 /* ObjC start of memVars */
@@ -89,7 +93,7 @@
 NSArray *ruleNames;
   /* AST super.memVars */
 /* AST parserMemVars */
-id<ANTLRTreeAdaptor> treeAdaptor;   /* AST parserMemVars */
+id<TreeAdaptor> treeAdaptor;   /* AST parserMemVars */
 /* ObjC end of memVars */
 
  }
@@ -100,11 +104,11 @@
 /* AST parserHeaderFile.properties */
   /* AST super.properties */
 /* AST parserProperties */
-@property (retain, getter=getTreeAdaptor, setter=setTreeAdaptor:) id<ANTLRTreeAdaptor> treeAdaptor;   /* AST parserproperties */
+@property (retain, getter=getTreeAdaptor, setter=setTreeAdaptor:) id<TreeAdaptor> treeAdaptor;   /* AST parserproperties */
 /* ObjC end of properties */
 
 + (void) initialize;
-+ (id) newTreeRewriteParser:(id<ANTLRTokenStream>)aStream;
++ (id) newTreeRewriteParser:(id<TokenStream>)aStream;
 /* ObjC start of actions.(actionScope).methodsDecl */
 /* ObjC end of actions.(actionScope).methodsDecl */
 
@@ -112,8 +116,8 @@
 /* AST parserHeaderFile.methodsDecl */
   /* AST super.methodsDecl */
 /* AST parserMethodsDecl */
-- (id<ANTLRTreeAdaptor>) getTreeAdaptor;
-- (void) setTreeAdaptor:(id<ANTLRTreeAdaptor>)theTreeAdaptor;   /* AST parsermethodsDecl */
+- (id<TreeAdaptor>) getTreeAdaptor;
+- (void) setTreeAdaptor:(id<TreeAdaptor>)theTreeAdaptor;   /* AST parsermethodsDecl */
 /* ObjC end of methodsDecl */
 
 - (TreeRewriteParser_rule_return *)rule; 
diff --git a/runtime/ObjC/Framework/examples/treerewrite/TreeRewriteParser.m b/runtime/ObjC/Framework/examples/treerewrite/TreeRewriteParser.m
index 9340e6e..b4d635d 100644
--- a/runtime/ObjC/Framework/examples/treerewrite/TreeRewriteParser.m
+++ b/runtime/ObjC/Framework/examples/treerewrite/TreeRewriteParser.m
@@ -1,8 +1,8 @@
 /** \file
- *  This OBJC source file was generated by $ANTLR version ${project.version} ${buildNumber}
+ *  This OBJC source file was generated by $ANTLR version 3.4
  *
- *     -  From the grammar source file : TreeRewrite.g
- *     -                            On : 2011-05-06 18:56:28
+ *     -  From the grammar source file : /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treerewrite/TreeRewrite.g
+ *     -                            On : 2012-02-16 17:42:35
  *     -                for the parser : TreeRewriteParserParser
  *
  * Editing it, at least manually, is not wise.
@@ -11,7 +11,7 @@
  *
  *
 */
-// $ANTLR ${project.version} ${buildNumber} TreeRewrite.g 2011-05-06 18:56:28
+// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treerewrite/TreeRewrite.g 2012-02-16 17:42:35
 
 
 /* -----------------------------------------
@@ -35,32 +35,32 @@
 static const unsigned long long FOLLOW_INT_in_subrule53_data[] = { 0x0000000000000002LL};
 
 
-#pragma mark Dynamic Global Scopes
+#pragma mark Dynamic Global globalAttributeScopeImplementation
 
-#pragma mark Dynamic Rule Scopes
+#pragma mark Dynamic Rule Scopes ruleAttributeScopeImplementation
 
-#pragma mark Rule Return Scopes start
-@implementation TreeRewriteParser_rule_return /* returnScope */
+#pragma mark Rule Return Scopes returnScopeImplementation
+@implementation TreeRewriteParser_rule_return /* returnScopeImplementation */
 /* AST returnScope.synthesize */
 @synthesize tree; /* start of synthesize -- OBJC-Line 1837 */
 + (TreeRewriteParser_rule_return *)newTreeRewriteParser_rule_return
 {
-    return [[[TreeRewriteParser_rule_return alloc] init] retain];
+return [[[TreeRewriteParser_rule_return alloc] init] retain];
 }
 
 - (id) init
 {
-    self = [super init];
-    return self;
+self = [super init];
+return self;
 }
 
 /* AST returnScope.methods */
-- (ANTLRCommonTree *)getTree
+- (CommonTree *)getTree
 {
     return tree;
 }
 
-- (void) setTree:(ANTLRCommonTree *)aTree
+- (void) setTree:(CommonTree *)aTree
 {
     if (tree != aTree) {
         if (tree != nil) [tree release];
@@ -76,31 +76,29 @@
 }
 
 
-
 @end /* end of returnScope implementation */
 
-
-@implementation TreeRewriteParser_subrule_return /* returnScope */
+@implementation TreeRewriteParser_subrule_return /* returnScopeImplementation */
 /* AST returnScope.synthesize */
 @synthesize tree; /* start of synthesize -- OBJC-Line 1837 */
 + (TreeRewriteParser_subrule_return *)newTreeRewriteParser_subrule_return
 {
-    return [[[TreeRewriteParser_subrule_return alloc] init] retain];
+return [[[TreeRewriteParser_subrule_return alloc] init] retain];
 }
 
 - (id) init
 {
-    self = [super init];
-    return self;
+self = [super init];
+return self;
 }
 
 /* AST returnScope.methods */
-- (ANTLRCommonTree *)getTree
+- (CommonTree *)getTree
 {
     return tree;
 }
 
-- (void) setTree:(ANTLRCommonTree *)aTree
+- (void) setTree:(CommonTree *)aTree
 {
     if (tree != aTree) {
         if (tree != nil) [tree release];
@@ -116,60 +114,49 @@
 }
 
 
-
 @end /* end of returnScope implementation */
 
 
-//#pragma mark Rule return scopes start
-//
-
-#pragma mark Rule return scopes start
 
 @implementation TreeRewriteParser  // line 637
 
 /* ObjC start of ruleAttributeScope */
-#pragma mark Dynamic Rule Scopes
+#pragma mark Dynamic Rule Scopes ruleAttributeScope
 /* ObjC end of ruleAttributeScope */
-#pragma mark global Attribute Scopes
+#pragma mark global Attribute Scopes globalAttributeScope
 /* ObjC start globalAttributeScope */
 /* ObjC end globalAttributeScope */
 /* ObjC start actions.(actionScope).synthesize */
-/* ObjC end actions.(actionScope).synthesize */
 /* ObjC start synthesize() */
 /* AST genericParser.synthesize */
 /* AST parserProperties */
 @synthesize treeAdaptor;
-/* ObjC end synthesize() */
 
 + (void) initialize
 {
     #pragma mark Bitsets
-    FOLLOW_INT_in_rule26 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_INT_in_rule26_data Count:(NSUInteger)1] retain];
-    FOLLOW_subrule_in_rule28 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_subrule_in_rule28_data Count:(NSUInteger)1] retain];
-    FOLLOW_INT_in_subrule53 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_INT_in_subrule53_data Count:(NSUInteger)1] retain];
+    FOLLOW_INT_in_rule26 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_INT_in_rule26_data Count:(NSUInteger)1] retain];
+    FOLLOW_subrule_in_rule28 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_subrule_in_rule28_data Count:(NSUInteger)1] retain];
+    FOLLOW_INT_in_subrule53 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_INT_in_subrule53_data Count:(NSUInteger)1] retain];
 
-    [ANTLRBaseRecognizer setTokenNames:[[AMutableArray arrayWithObjects:@"<invalid>", @"<EOR>", @"<DOWN>", @"<UP>", 
+    [BaseRecognizer setTokenNames:[[AMutableArray arrayWithObjects:@"<invalid>", @"<EOR>", @"<DOWN>", @"<UP>", 
  @"INT", @"WS", nil] retain]];
-    [ANTLRBaseRecognizer setGrammarFileName:@"TreeRewrite.g"];
+    [BaseRecognizer setGrammarFileName:@"/Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treerewrite/TreeRewrite.g"];
 }
 
-+ (TreeRewriteParser *)newTreeRewriteParser:(id<ANTLRTokenStream>)aStream
++ (TreeRewriteParser *)newTreeRewriteParser:(id<TokenStream>)aStream
 {
     return [[TreeRewriteParser alloc] initWithTokenStream:aStream];
-
-
 }
 
-- (id) initWithTokenStream:(id<ANTLRTokenStream>)aStream
+- (id) initWithTokenStream:(id<TokenStream>)aStream
 {
-    self = [super initWithTokenStream:aStream State:[[ANTLRRecognizerSharedState newANTLRRecognizerSharedStateWithRuleLen:2+1] retain]];
+    self = [super initWithTokenStream:aStream State:[[RecognizerSharedState newRecognizerSharedStateWithRuleLen:2+1] retain]];
     if ( self != nil ) {
-
-
         /* start of actions-actionScope-init */
         /* start of init */
         /* AST genericParser.init */
-        [self setTreeAdaptor:[[ANTLRCommonTreeAdaptor newTreeAdaptor] retain]];
+        [self setTreeAdaptor:[[CommonTreeAdaptor newTreeAdaptor] retain]];
     }
     return self;
 }
@@ -182,19 +169,17 @@
     [super dealloc];
 }
 
-/* ObjC start members */
-/* ObjC end members */
 /* ObjC start actions.(actionScope).methods */
 /* ObjC end actions.(actionScope).methods */
 /* ObjC start methods() */
 /* AST genericParser.methods */
 /* AST parserMethods */
-- (id<ANTLRTreeAdaptor>) getTreeAdaptor
+- (id<TreeAdaptor>) getTreeAdaptor
 {
 	return treeAdaptor;
 }
 
-- (void) setTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor
+- (void) setTreeAdaptor:(id<TreeAdaptor>)aTreeAdaptor
 {
 	if (aTreeAdaptor != treeAdaptor) {
 		treeAdaptor = aTreeAdaptor;
@@ -204,40 +189,41 @@
 /* ObjC start rules */
 /*
  * $ANTLR start rule
- * TreeRewrite.g:8:1: rule : INT subrule -> ^( subrule INT ) ;
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treerewrite/TreeRewrite.g:8:1: rule : INT subrule -> ^( subrule INT ) ;
  */
 - (TreeRewriteParser_rule_return *) rule
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
 
     /* AST ruleDeclarations */
+    /* ruleDeclarations */
     TreeRewriteParser_rule_return * retval = [TreeRewriteParser_rule_return newTreeRewriteParser_rule_return];
     [retval setStart:[input LT:1]];
 
 
-    ANTLRCommonTree *root_0 = nil;
+    CommonTree *root_0 = nil;
 
     @try {
         /* AST ruleLabelDefs */
-        ANTLRCommonToken *INT1 = nil;
-         TreeRewriteParser_subrule_return * subrule2 = nil ;
-         
+        /* ruleLabelDefs entry */
+        CommonToken *INT1 = nil;TreeRewriteParser_subrule_return * subrule2 = nil ;
 
-        ANTLRCommonTree *INT1_tree=nil;
-        ANTLRRewriteRuleTokenStream *stream_INT =
-            [[ANTLRRewriteRuleTokenStream newANTLRRewriteRuleTokenStream:treeAdaptor
+
+        CommonTree *INT1_tree=nil;
+        RewriteRuleTokenStream *stream_INT =
+            [[RewriteRuleTokenStream newRewriteRuleTokenStream:treeAdaptor
                                                              description:@"token INT"] retain];
-        ANTLRRewriteRuleSubtreeStream *stream_subrule =
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
+        RewriteRuleSubtreeStream *stream_subrule =
+            [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
                                                                 description:@"rule subrule"] retain];
-        // TreeRewrite.g:8:5: ( INT subrule -> ^( subrule INT ) ) // ruleBlockSingleAlt
-        // TreeRewrite.g:8:7: INT subrule // alt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treerewrite/TreeRewrite.g:8:5: ( INT subrule -> ^( subrule INT ) ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treerewrite/TreeRewrite.g:8:7: INT subrule // alt
         {
-        INT1=(ANTLRCommonToken *)[self match:input TokenType:INT Follow:FOLLOW_INT_in_rule26];  
+
+        INT1=(CommonToken *)[self match:input TokenType:INT Follow:FOLLOW_INT_in_rule26];  
             [stream_INT addElement:INT1];
 
-
+         
         /* ruleRef */
         [self pushFollow:FOLLOW_subrule_in_rule28];
         subrule2 = [self subrule];
@@ -246,7 +232,7 @@
 
 
         [stream_subrule addElement:[subrule2 getTree]];
-
+         
         // AST REWRITE
         // elements: subrule, INT
         // token labels: 
@@ -256,18 +242,18 @@
         // wildcard labels: 
         retval.tree = root_0;
 
-        ANTLRRewriteRuleSubtreeStream *stream_retval =
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
+        RewriteRuleSubtreeStream *stream_retval =
+            [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
                 description:@"token retval" element:retval!=nil?[retval getTree]:nil] retain];
 
-        root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+        root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
 
         // 8:19: -> ^( subrule INT )
         {
-            // TreeRewrite.g:8:22: ^( subrule INT )
+            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treerewrite/TreeRewrite.g:8:22: ^( subrule INT )
             {
-                ANTLRCommonTree *root_1 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
-                root_1 = (ANTLRCommonTree *)[treeAdaptor becomeRoot:(id<ANTLRTree>)[stream_subrule nextNode] old:root_1];
+                CommonTree *root_1 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+                root_1 = (CommonTree *)[treeAdaptor becomeRoot:(id<Tree>)[stream_subrule nextNode] old:root_1];
 
                  // TODO: args: 
                 [treeAdaptor addChild:
@@ -287,27 +273,27 @@
 
         /* ASTParser ruleCleanUp */
         /* AST ruleCleanUp */
-        // token+rule list labels
+        /* token+rule list labels */
         [retval setStop:[input LT:-1]];
 
 
         [stream_INT release];
         [stream_subrule release];
 
-            retval.tree = (ANTLRCommonTree *)[treeAdaptor rulePostProcessing:root_0];
+            retval.tree = (CommonTree *)[treeAdaptor rulePostProcessing:root_0];
             [treeAdaptor setTokenBoundaries:retval.tree From:retval.start To:retval.stopToken];
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
         /* ASTParser rule.setErrorReturnValue */
-        retval.tree = (ANTLRCommonTree *)[treeAdaptor errorNode:input From:retval.start To:[input LT:-1] Exception:re];
+        retval.tree = (CommonTree *)[treeAdaptor errorNode:input From:retval.start To:[input LT:-1] Exception:re];
 
     }
 
     @finally {
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return retval;
@@ -316,63 +302,65 @@
 
 /*
  * $ANTLR start subrule
- * TreeRewrite.g:11:1: subrule : INT ;
+ * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treerewrite/TreeRewrite.g:11:1: subrule : INT ;
  */
 - (TreeRewriteParser_subrule_return *) subrule
 {
-    /* my ruleScopeSetUp */
-    /* Terence's stuff */
+    /* ruleScopeSetUp */
 
     /* AST ruleDeclarations */
+    /* ruleDeclarations */
     TreeRewriteParser_subrule_return * retval = [TreeRewriteParser_subrule_return newTreeRewriteParser_subrule_return];
     [retval setStart:[input LT:1]];
 
 
-    ANTLRCommonTree *root_0 = nil;
+    CommonTree *root_0 = nil;
 
     @try {
         /* AST ruleLabelDefs */
-        ANTLRCommonToken *INT3 = nil;
+        /* ruleLabelDefs entry */
+        CommonToken *INT3 = nil;
 
-        ANTLRCommonTree *INT3_tree=nil;
+        CommonTree *INT3_tree=nil;
 
-        // TreeRewrite.g:12:5: ( INT ) // ruleBlockSingleAlt
-        // TreeRewrite.g:12:9: INT // alt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treerewrite/TreeRewrite.g:12:5: ( INT ) // ruleBlockSingleAlt
+        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/treerewrite/TreeRewrite.g:12:9: INT // alt
         {
-        root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+        root_0 = (CommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
+
 
 
         /* ASTParser tokenRef */
-        INT3=(ANTLRCommonToken *)[self match:input TokenType:INT Follow:FOLLOW_INT_in_subrule53]; 
+        INT3=(CommonToken *)[self match:input TokenType:INT Follow:FOLLOW_INT_in_subrule53]; 
         INT3_tree = /* ASTParser createNodeFromToken */
-        (ANTLRCommonTree *)[[treeAdaptor create:INT3] retain]
+        (CommonTree *)[[treeAdaptor create:INT3] retain]
         ;
         [treeAdaptor addChild:INT3_tree  toTree:root_0];
 
-
+         
         }
 
         /* ASTParser ruleCleanUp */
         /* AST ruleCleanUp */
-        // token+rule list labels
+        /* token+rule list labels */
         [retval setStop:[input LT:-1]];
 
 
 
-            retval.tree = (ANTLRCommonTree *)[treeAdaptor rulePostProcessing:root_0];
+            retval.tree = (CommonTree *)[treeAdaptor rulePostProcessing:root_0];
             [treeAdaptor setTokenBoundaries:retval.tree From:retval.start To:retval.stopToken];
 
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
         /* ASTParser rule.setErrorReturnValue */
-        retval.tree = (ANTLRCommonTree *)[treeAdaptor errorNode:input From:retval.start To:[input LT:-1] Exception:re];
+        retval.tree = (CommonTree *)[treeAdaptor errorNode:input From:retval.start To:[input LT:-1] Exception:re];
 
     }
 
     @finally {
-        /* Terence's stuff */
+        /* ruleScopeCleanUp */
 
     }
     return retval;
diff --git a/runtime/ObjC/Framework/examples/treerewrite/antlr3.h b/runtime/ObjC/Framework/examples/treerewrite/antlr3.h
deleted file mode 100644
index 4f16279..0000000
--- a/runtime/ObjC/Framework/examples/treerewrite/antlr3.h
+++ /dev/null
@@ -1,79 +0,0 @@
-#import <ANTLR/ANTLRBaseMapElement.h>
-#import <ANTLR/ANTLRBaseRecognizer.h>
-#import <ANTLR/ANTLRBaseStack.h>
-#import <ANTLR/ANTLRBaseTree.h>
-#import <ANTLR/ANTLRBaseTreeAdaptor.h>
-#import <ANTLR/ANTLRBitSet.h>
-#import <ANTLR/ANTLRBufferedTokenStream.h>
-#import <ANTLR/ANTLRBufferedTreeNodeStream.h>
-#import <ANTLR/ANTLRCharStream.h>
-#import <ANTLR/ANTLRCharStreamState.h>
-#import <ANTLR/ANTLRCommonErrorNode.h>
-#import <ANTLR/ANTLRCommonToken.h>
-#import <ANTLR/ANTLRCommonTokenStream.h>
-#import <ANTLR/ANTLRCommonTree.h>
-#import <ANTLR/ANTLRCommonTreeAdaptor.h>
-#import <ANTLR/ANTLRCommonTreeNodeStream.h>
-#import <ANTLR/ANTLRDFA.h>
-#import <ANTLR/ANTLRDebug.h>
-#import <ANTLR/ANTLRDebugEventProxy.h>
-#import <ANTLR/ANTLRDebugEventListener.h>
-#import <ANTLR/ANTLRDebugParser.h>
-#import <ANTLR/ANTLRDebugTokenStream.h>
-#import <ANTLR/ANTLRDebugTreeAdaptor.h>
-#import <ANTLR/ANTLRDebugTreeNodeStream.h>
-#import <ANTLR/ANTLRDebugTreeParser.h>
-#import <ANTLR/ANTLREarlyExitException.h>
-#import <ANTLR/ANTLRError.h>
-#import <ANTLR/ANTLRFailedPredicateException.h>
-#import <ANTLR/ANTLRFastQueue.h>
-#import <ANTLR/ANTLRHashMap.h>
-#import <ANTLR/ANTLRHashRule.h>
-#import <ANTLR/ANTLRIntArray.h>
-#import <ANTLR/ANTLRIntStream.h>
-#import <ANTLR/ANTLRLexer.h>
-#import <ANTLR/ANTLRLexerRuleReturnScope.h>
-#import <ANTLR/ANTLRLinkBase.h>
-#import <ANTLR/ANTLRLookaheadStream.h>
-#import <ANTLR/ANTLRMapElement.h>
-#import <ANTLR/ANTLRMap.h>
-#import <ANTLR/ANTLRMismatchedNotSetException.h>
-#import <ANTLR/ANTLRMismatchedRangeException.h>
-#import <ANTLR/ANTLRMismatchedSetException.h>
-#import <ANTLR/ANTLRMismatchedTokenException.h>
-#import <ANTLR/ANTLRMismatchedTreeNodeException.h>
-#import <ANTLR/ANTLRMissingTokenException.h>
-#import <ANTLR/ANTLRNodeMapElement.h>
-#import <ANTLR/ANTLRNoViableAltException.h>
-#import <ANTLR/ANTLRParser.h>
-#import <ANTLR/ANTLRParserRuleReturnScope.h>
-#import <ANTLR/ANTLRPtrBuffer.h>
-#import <ANTLR/ANTLRRecognitionException.h>
-#import <ANTLR/ANTLRRecognizerSharedState.h>
-#import <ANTLR/ANTLRRewriteRuleElementStream.h>
-#import <ANTLR/ANTLRRewriteRuleSubtreeStream.h>
-#import <ANTLR/ANTLRRewriteRuleTokenStream.h>
-#import <ANTLR/ANTLRRuleMemo.h>
-#import <ANTLR/ANTLRRuleStack.h>
-#import <ANTLR/ANTLRRuleReturnScope.h>
-#import <ANTLR/ANTLRRuntimeException.h>
-#import <ANTLR/ANTLRStreamEnumerator.h>
-#import <ANTLR/ANTLRStringStream.h>
-#import <ANTLR/ANTLRSymbolStack.h>
-#import <ANTLR/ANTLRToken+DebuggerSupport.h>
-#import <ANTLR/ANTLRToken.h>
-#import <ANTLR/ANTLRTokenRewriteStream.h>
-#import <ANTLR/ANTLRTokenSource.h>
-#import <ANTLR/ANTLRTokenStream.h>
-#import <ANTLR/ANTLRTree.h>
-#import <ANTLR/ANTLRTreeAdaptor.h>
-#import <ANTLR/ANTLRTreeException.h>
-#import <ANTLR/ANTLRTreeIterator.h>
-#import <ANTLR/ANTLRTreeNodeStream.h>
-#import <ANTLR/ANTLRTreeParser.h>
-#import <ANTLR/ANTLRTreeRuleReturnScope.h>
-#import <ANTLR/ANTLRUnbufferedTokenStream.h>
-//#import <ANTLR/ANTLRUnbufferedCommonTreeNodeStream.h>
-//#import <ANTLR/ANTLRUnbufferedCommonTreeNodeStreamState.h>
-#import <ANTLR/ANTLRUniqueIDMap.h>
-#import <ANTLR/ANTLRUnwantedTokenException.h>
diff --git a/runtime/ObjC/Framework/examples/treerewrite/main.m b/runtime/ObjC/Framework/examples/treerewrite/main.m
index cd8f9e1..6b0062b 100644
--- a/runtime/ObjC/Framework/examples/treerewrite/main.m
+++ b/runtime/ObjC/Framework/examples/treerewrite/main.m
@@ -1,5 +1,5 @@
-#import <Cocoa/Cocoa.h>
-#import "antlr3.h"
+#import <Foundation/Foundation.h>
+#import <ANTLR/ANTLR.h>
 #import "TreeRewriteLexer.h"
 #import "TreeRewriteParser.h"
 //#import "stdio.h"
@@ -11,16 +11,16 @@
 	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:@"23 42"];
 	TreeRewriteLexer *lexer = [TreeRewriteLexer newTreeRewriteLexerWithCharStream:stream];
 	
-//    id<ANTLRToken> currentToken;
-//    while ((currentToken = [lexer nextToken]) && [currentToken type] != ANTLRTokenTypeEOF) {
+//    id<Token> currentToken;
+//    while ((currentToken = [lexer nextToken]) && [currentToken type] != TokenTypeEOF) {
 //        NSLog(@"%@", currentToken);
 //    }
 	
-	ANTLRCommonTokenStream *tokenStream = [ANTLRCommonTokenStream newANTLRCommonTokenStreamWithTokenSource:lexer];
+	CommonTokenStream *tokenStream = [CommonTokenStream newCommonTokenStreamWithTokenSource:lexer];
 	TreeRewriteParser *parser = [[TreeRewriteParser alloc] initWithTokenStream:tokenStream];
-	ANTLRCommonTree *rule_tree = [[parser rule] getTree];
+	CommonTree *rule_tree = [[parser rule] getTree];
 	NSLog(@"tree: %@", [rule_tree treeDescription]);
-//	ANTLRCommonTreeNodeStream *treeStream = [[ANTLRCommonTreeNodeStream alloc] initWithTree:program_tree];
+//	CommonTreeNodeStream *treeStream = [[CommonTreeNodeStream alloc] initWithTree:program_tree];
 //	SimpleCTP *walker = [[SimpleCTP alloc] initWithTreeNodeStream:treeStream];
 //	[walker program];
 
diff --git a/runtime/ObjC/Framework/examples/treerewrite/output1/TreeRewrite.tokens b/runtime/ObjC/Framework/examples/treerewrite/output1/TreeRewrite.tokens
deleted file mode 100644
index eb18cc6..0000000
--- a/runtime/ObjC/Framework/examples/treerewrite/output1/TreeRewrite.tokens
+++ /dev/null
@@ -1,2 +0,0 @@
-WS=5
-INT=4
diff --git a/runtime/ObjC/Framework/examples/treerewrite/output1/TreeRewriteLexer.h b/runtime/ObjC/Framework/examples/treerewrite/output1/TreeRewriteLexer.h
deleted file mode 100644
index c97f099..0000000
--- a/runtime/ObjC/Framework/examples/treerewrite/output1/TreeRewriteLexer.h
+++ /dev/null
@@ -1,30 +0,0 @@
-// $ANTLR 3.2 Aug 20, 2010 15:00:19 /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/treerewrite/TreeRewrite.g 2010-08-20 15:03:14
-
-/* =============================================================================
- * Standard antlr3 OBJC runtime definitions
- */
-#import <Cocoa/Cocoa.h>
-#import "antlr3.h"
-/* End of standard antlr3 runtime definitions
- * =============================================================================
- */
-
-/* Start cyclicDFAInterface */
-
-#pragma mark Rule return scopes start
-#pragma mark Rule return scopes end
-#pragma mark Tokens
-#define INT 4
-#define WS 5
-#define EOF -1
-@interface TreeRewriteLexer : ANTLRLexer { // line 283
-// start of actions.lexer.memVars
-// start of action-actionScope-memVars
-}
-+ (TreeRewriteLexer *)newTreeRewriteLexer:(id<ANTLRCharStream>)anInput;
-
-- (void)mINT; 
-- (void)mWS; 
-- (void)mTokens; 
-
-@end /* end of TreeRewriteLexer interface */
diff --git a/runtime/ObjC/Framework/examples/treerewrite/output1/TreeRewriteLexer.m b/runtime/ObjC/Framework/examples/treerewrite/output1/TreeRewriteLexer.m
deleted file mode 100644
index 3b52b07..0000000
--- a/runtime/ObjC/Framework/examples/treerewrite/output1/TreeRewriteLexer.m
+++ /dev/null
@@ -1,224 +0,0 @@
-/** \file
- *  This OBJC source file was generated by $ANTLR version 3.2 Aug 20, 2010 15:00:19
- *
- *     -  From the grammar source file : /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/treerewrite/TreeRewrite.g
- *     -                            On : 2010-08-20 15:03:14
- *     -                 for the lexer : TreeRewriteLexerLexer *
- * Editing it, at least manually, is not wise. 
- *
- * C language generator and runtime by Jim Idle, jimi|hereisanat|idle|dotgoeshere|ws.
- *
- *
-*/
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-//
-// 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.
-
-// $ANTLR 3.2 Aug 20, 2010 15:00:19 /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/treerewrite/TreeRewrite.g 2010-08-20 15:03:14
-
-/* -----------------------------------------
- * Include the ANTLR3 generated header file.
- */
-#import "TreeRewriteLexer.h"
-/* ----------------------------------------- */
-
-
-/* ============================================================================= */
-
-/* =============================================================================
- * Start of recognizer
- */
-
-
-/** As per Terence: No returns for lexer rules!
-#pragma mark Rule return scopes start
-#pragma mark Rule return scopes end
-*/
-@implementation TreeRewriteLexer // line 330
-
-+ (void) initialize
-{
-    [ANTLRBaseRecognizer setGrammarFileName:@"/usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/treerewrite/TreeRewrite.g"];
-}
-
-+ (NSString *) tokenNameForType:(NSInteger)aTokenType
-{
-    return [[self getTokenNames] objectAtIndex:aTokenType];
-}
-
-+ (TreeRewriteLexer *)newTreeRewriteLexer:(id<ANTLRCharStream>)anInput
-{
-    return [[TreeRewriteLexer alloc] initWithCharStream:anInput];
-}
-
-- (id) initWithCharStream:(id<ANTLRCharStream>)anInput
-{
-    if ((self = [super initWithCharStream:anInput State:[ANTLRRecognizerSharedState newANTLRRecognizerSharedStateWithRuleLen:3+1]]) != nil) {
-
-    }
-    return self;
-}
-
-- (void) dealloc
-{
-    [super dealloc];
-}
-
-// Start of actions.lexer.methods
-// start methods()
-
-// Start of Rules
-// $ANTLR start "INT"
-- (void) mINT
-{
-    //
-    // ruleScopeSetUp
-
-    @try {
-        NSInteger _type = INT;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/treerewrite/TreeRewrite.g:15:5: ( ( '0' .. '9' )+ ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/treerewrite/TreeRewrite.g:15:7: ( '0' .. '9' )+ // alt
-        {
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/treerewrite/TreeRewrite.g:15:7: ( '0' .. '9' )+ // positiveClosureBlock
-        NSInteger cnt1=0;
-        do {
-            NSInteger alt1=2;
-            NSInteger LA1_0 = [input LA:1];
-            if ( ((LA1_0>='0' && LA1_0<='9')) ) {
-                alt1=1;
-            }
-
-
-            switch (alt1) {
-                case 1 : ;
-                    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/treerewrite/TreeRewrite.g:15:8: '0' .. '9' // alt
-                    {
-                    [self matchRangeFromChar:'0' to:'9'];   /* element() */
-                     /* elements */
-                    }
-                    break;
-
-                default :
-                    if ( cnt1 >= 1 )
-                        goto loop1;
-                    ANTLREarlyExitException *eee = [ANTLREarlyExitException exceptionWithStream:input decisionNumber:1];
-                    @throw eee;
-            }
-            cnt1++;
-        } while (YES);
-        loop1: ;
-          /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-        [state setType:_type];
-
-        state.channel = _channel;
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "INT"
-
-// $ANTLR start "WS"
-- (void) mWS
-{
-    //
-    // ruleScopeSetUp
-
-    @try {
-        NSInteger _type = WS;
-        NSInteger _channel = ANTLRTokenChannelDefault;
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/treerewrite/TreeRewrite.g:18:5: ( ' ' ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/treerewrite/TreeRewrite.g:18:9: ' ' // alt
-        {
-        [self matchChar:' ']; 
-          /* element() */
-        state.channel=99;  /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-
-        [state setType:_type];
-
-        state.channel = _channel;
-    }
-    @finally {
-        //
-    }
-    return;
-}
-// $ANTLR end "WS"
-
-- (void) mTokens
-{
-    // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/treerewrite/TreeRewrite.g:1:8: ( INT | WS ) //ruleblock
-    NSInteger alt2=2;
-    NSInteger LA2_0 = [input LA:1];
-
-    if ( ((LA2_0>='0' && LA2_0<='9')) ) {
-        alt2=1;
-    }
-    else if ( (LA2_0==' ') ) {
-        alt2=2;
-    }
-    else {
-        ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newANTLRNoViableAltException:2 state:0 stream:input];
-        @throw nvae;
-    }
-    switch (alt2) {
-        case 1 : ;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/treerewrite/TreeRewrite.g:1:10: INT // alt
-            {
-                [self mINT]; 
-              /* element() */
-             /* elements */
-            }
-            break;
-        case 2 : ;
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/treerewrite/TreeRewrite.g:1:14: WS // alt
-            {
-                [self mWS]; 
-              /* element() */
-             /* elements */
-            }
-            break;
-
-    }
-
-}
-
-@end // end of TreeRewriteLexer implementation // line 397
-
-/* End of code
- * =============================================================================
- */
diff --git a/runtime/ObjC/Framework/examples/treerewrite/output1/TreeRewriteParser.h b/runtime/ObjC/Framework/examples/treerewrite/output1/TreeRewriteParser.h
deleted file mode 100644
index 058e7af..0000000
--- a/runtime/ObjC/Framework/examples/treerewrite/output1/TreeRewriteParser.h
+++ /dev/null
@@ -1,75 +0,0 @@
-// $ANTLR 3.2 Aug 20, 2010 15:00:19 /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/treerewrite/TreeRewrite.g 2010-08-20 15:03:14
-
-/* =============================================================================
- * Standard antlr3 OBJC runtime definitions
- */
-#import <Cocoa/Cocoa.h>
-#import "antlr3.h"
-/* End of standard antlr3 runtime definitions
- * =============================================================================
- */
-
-#pragma mark Tokens
-#define WS 5
-#define INT 4
-#define EOF -1
-#pragma mark Dynamic Global Scopes
-#pragma mark Dynamic Rule Scopes
-#pragma mark Rule Return Scopes start
-@interface TreeRewriteParser_rule_return :ANTLRParserRuleReturnScope { // line 1672
-// returnScopeInterface.memVars
-ANTLRCommonTree *tree; // start of memVars()
-}
-
-// start properties
-@property (retain, getter=getTree, setter=setTree:) ANTLRCommonTree *tree;
-+ (TreeRewriteParser_rule_return *)newTreeRewriteParser_rule_return;
-// this is start of set and get methods
-// returnScopeInterface.methodsdecl
-- (ANTLRCommonTree *)getTree;
-- (void) setTree:(ANTLRCommonTree *)aTree;
-  // methodsDecl
-@end 
-@interface TreeRewriteParser_subrule_return :ANTLRParserRuleReturnScope { // line 1672
-// returnScopeInterface.memVars
-ANTLRCommonTree *tree; // start of memVars()
-}
-
-// start properties
-@property (retain, getter=getTree, setter=setTree:) ANTLRCommonTree *tree;
-+ (TreeRewriteParser_subrule_return *)newTreeRewriteParser_subrule_return;
-// this is start of set and get methods
-// returnScopeInterface.methodsdecl
-- (ANTLRCommonTree *)getTree;
-- (void) setTree:(ANTLRCommonTree *)aTree;
-  // methodsDecl
-@end 
-
-#pragma mark Rule return scopes end
-@interface TreeRewriteParser : ANTLRParser { // line 529
-// start of globalAttributeScopeMemVar
-
-
-// start of action-actionScope-memVars
-// start of ruleAttributeScopeMemVar
-
-
-// Start of memVars
-// parserHeaderFile.memVars
-// parsermemVars
-id<ANTLRTreeAdaptor> treeAdaptor;
-
- }
-
-// start of action-actionScope-methodsDecl
-
-// parserHeaderFile.methodsdecl
-// parserMethodsDecl
-- (id<ANTLRTreeAdaptor>) getTreeAdaptor;
-- (void) setTreeAdaptor:(id<ANTLRTreeAdaptor>)theTreeAdaptor;
-
-- (TreeRewriteParser_rule_return *)mrule; 
-- (TreeRewriteParser_subrule_return *)msubrule; 
-
-
-@end /* end of TreeRewriteParser interface */
diff --git a/runtime/ObjC/Framework/examples/treerewrite/output1/TreeRewriteParser.m b/runtime/ObjC/Framework/examples/treerewrite/output1/TreeRewriteParser.m
deleted file mode 100644
index efd085f..0000000
--- a/runtime/ObjC/Framework/examples/treerewrite/output1/TreeRewriteParser.m
+++ /dev/null
@@ -1,354 +0,0 @@
-/** \file
- *  This OBJC source file was generated by $ANTLR version 3.2 Aug 20, 2010 15:00:19
- *
- *     -  From the grammar source file : /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/treerewrite/TreeRewrite.g
- *     -                            On : 2010-08-20 15:03:14
- *     -                for the parser : TreeRewriteParserParser *
- * Editing it, at least manually, is not wise. 
- *
- * C language generator and runtime by Jim Idle, jimi|hereisanat|idle|dotgoeshere|ws.
- *
- *
-*/
-// [The "BSD licence"]
-// Copyright (c) 2010 Alan Condit
-//
-// 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.
-
-// $ANTLR 3.2 Aug 20, 2010 15:00:19 /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/treerewrite/TreeRewrite.g 2010-08-20 15:03:14
-
-/* -----------------------------------------
- * Include the ANTLR3 generated header file.
- */
-#import "TreeRewriteParser.h"
-/* ----------------------------------------- */
-
-
-/* ============================================================================= */
-
-/* =============================================================================
- * Start of recognizer
- */
-
-
-
-#pragma mark Bitsets
-static ANTLRBitSet *FOLLOW_INT_in_rule26;
-
-const unsigned long long FOLLOW_INT_in_rule26_data[] = { 0x0000000000000010LL};
-
-static ANTLRBitSet *FOLLOW_subrule_in_rule28;
-
-const unsigned long long FOLLOW_subrule_in_rule28_data[] = { 0x0000000000000002LL};
-
-static ANTLRBitSet *FOLLOW_INT_in_subrule53;
-
-const unsigned long long FOLLOW_INT_in_subrule53_data[] = { 0x0000000000000002LL};
-
-
-
-#pragma mark Dynamic Global Scopes
-
-#pragma mark Dynamic Rule Scopes
-
-#pragma mark Rule return scopes start
-@implementation TreeRewriteParser_rule_return
-@synthesize tree;
-+ (TreeRewriteParser_rule_return *)newTreeRewriteParser_rule_return
-{
-    return [[[TreeRewriteParser_rule_return alloc] init] retain];
-}
-
-// returnScope.methods
-- (ANTLRCommonTree *)getTree
-{
-    return tree;
-}
-
-- (void) setTree:(ANTLRCommonTree *)aTree
-{
-    if (tree != aTree) {
-        if (tree != nil) [tree release];
-        if (aTree != nil) [aTree retain];
-        tree = aTree;
-    }
-}
-
-- (void) dealloc
-{
-    [self setTree:nil];
-    [super dealloc];
-}
-
-
-
-
-@end 
-
-@implementation TreeRewriteParser_subrule_return
-@synthesize tree;
-+ (TreeRewriteParser_subrule_return *)newTreeRewriteParser_subrule_return
-{
-    return [[[TreeRewriteParser_subrule_return alloc] init] retain];
-}
-
-// returnScope.methods
-- (ANTLRCommonTree *)getTree
-{
-    return tree;
-}
-
-- (void) setTree:(ANTLRCommonTree *)aTree
-{
-    if (tree != aTree) {
-        if (tree != nil) [tree release];
-        if (aTree != nil) [aTree retain];
-        tree = aTree;
-    }
-}
-
-- (void) dealloc
-{
-    [self setTree:nil];
-    [super dealloc];
-}
-
-
-
-
-@end 
-
-
-
-@implementation TreeRewriteParser  // line 610
-
-+ (void) initialize
-{
-    FOLLOW_INT_in_rule26 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_INT_in_rule26_data Count:(NSUInteger)1] retain];
-    FOLLOW_subrule_in_rule28 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_subrule_in_rule28_data Count:(NSUInteger)1] retain];
-    FOLLOW_INT_in_subrule53 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_INT_in_subrule53_data Count:(NSUInteger)1] retain];
-
-    [ANTLRBaseRecognizer setTokenNames:[[[NSArray alloc] initWithObjects:@"<invalid>", @"<EOR>", @"<DOWN>", @"<UP>", 
- @"INT", @"WS", nil] retain]];
-}
-
-+ (TreeRewriteParser *)newTreeRewriteParser:(id<ANTLRTokenStream>)aStream
-{
-    return [[TreeRewriteParser alloc] initWithTokenStream:aStream];
-
-}
-
-- (id) initWithTokenStream:(id<ANTLRTokenStream>)aStream
-{
-    if ((self = [super initWithTokenStream:aStream State:[[ANTLRRecognizerSharedState newANTLRRecognizerSharedStateWithRuleLen:2+1] retain]]) != nil) {
-
-
-                        
-        // start of actions-actionScope-init
-        // start of init
-        // genericParser.init
-        [self setTreeAdaptor:[[ANTLRCommonTreeAdaptor newANTLRCommonTreeAdaptor] retain]];
-    }
-    return self;
-}
-
-- (void) dealloc
-{
-    [self setTreeAdaptor:nil];
-
-    [super dealloc];
-}
-// start actions.actionScope.methods
-// start methods()
-// genericParser.methods
-// parserMethods
-- (id<ANTLRTreeAdaptor>) getTreeAdaptor
-{
-	return treeAdaptor;
-}
-
-- (void) setTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor
-{
-	if (aTreeAdaptor != treeAdaptor) {
-		treeAdaptor = aTreeAdaptor;
-	}
-}
-// start rules
-/*
- * $ANTLR start rule
- * /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/treerewrite/TreeRewrite.g:8:1: rule : INT subrule -> ^( subrule INT ) ;
- */
-- (TreeRewriteParser_rule_return *) rule
-{
-    // ruleScopeSetUp
-
-    // ruleDeclarations
-    TreeRewriteParser_rule_return * retval = [TreeRewriteParser_rule_return newTreeRewriteParser_rule_return];
-    [retval setStart:[input LT:1]];
-
-    ANTLRCommonTree *root_0 = nil;
-
-    @try {
-        // ruleLabelDefs
-        id<ANTLRToken> INT1 = nil;
-        TreeRewriteParser_subrule_return * subrule2 = nil;
-
-
-        ANTLRCommonTree *INT1_tree=nil;
-        ANTLRRewriteRuleTokenStream *stream_INT = 
-            [[ANTLRRewriteRuleTokenStream newANTLRRewriteRuleTokenStream:treeAdaptor
-                                                             description:@"token INT"] retain];
-        ANTLRRewriteRuleSubtreeStream *stream_subrule = 
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
-                                                                description:@"rule subrule"] retain];
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/treerewrite/TreeRewrite.g:8:5: ( INT subrule -> ^( subrule INT ) ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/treerewrite/TreeRewrite.g:8:7: INT subrule // alt
-        {
-        INT1=(id<ANTLRToken>)[self match:input TokenType:INT Follow:FOLLOW_INT_in_rule26];  
-            [stream_INT addElement:INT1];
-          /* element() */
-        [self pushFollow:FOLLOW_subrule_in_rule28];
-        subrule2 = [self subrule];
-        [self popFollow];
-
-
-        [stream_subrule addElement:[subrule2 getTree]];  /* element() */
-         /* elements */
-
-        // AST REWRITE
-        // elements: INT, subrule
-        // token labels: 
-        // rule labels: retval
-        // token list labels: 
-        // rule list labels: 
-        // wildcard labels: 
-         [retval setTree:root_0];
-
-        retval.tree = root_0;
-
-        ANTLRRewriteRuleSubtreeStream *stream_retval =
-            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
-                                                                description:@"token retval"
-                                                                    element:retval!=nil?[retval getTree]:nil] retain];
-
-        root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
-
-        // 8:19: -> ^( subrule INT )
-        {
-            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/treerewrite/TreeRewrite.g:8:22: ^( subrule INT )
-            {
-                ANTLRCommonTree *root_1 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
-                root_1 = (ANTLRCommonTree *)[treeAdaptor becomeRoot:(id<ANTLRTree>)[stream_subrule nextNode]
-                                                                         old:root_1];
-
-                 // TODO: args: 
-                [treeAdaptor addChild:[stream_INT nextNode] toTree:root_1];
-
-                [treeAdaptor addChild:root_1 toTree:root_0];
-            }
-
-        }
-
-        retval.tree = root_0;
-
-        }
-
-        // token+rule list labels
-        [retval setStop:[input LT:-1]];
-
-        [stream_INT release];
-        [stream_subrule release];
-
-        retval.tree = (ANTLRCommonTree *)[treeAdaptor rulePostProcessing:root_0];
-        [treeAdaptor setTokenBoundaries:retval.tree From:retval.startToken To:retval.stopToken];
-
-    }
-    @catch (ANTLRRecognitionException *re) {
-        [self reportError:re];
-        [self recover:input Exception:re];
-        retval.tree = (ANTLRCommonTree *)[treeAdaptor errorNode:input From:retval.startToken To:[input LT:-1] Exception:re];
-
-    }    @finally {
-    }
-    return retval;
-}
-/* $ANTLR end rule */
-/*
- * $ANTLR start subrule
- * /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/treerewrite/TreeRewrite.g:11:1: subrule : INT ;
- */
-- (TreeRewriteParser_subrule_return *) subrule
-{
-    // ruleScopeSetUp
-
-    // ruleDeclarations
-    TreeRewriteParser_subrule_return * retval = [TreeRewriteParser_subrule_return newTreeRewriteParser_subrule_return];
-    [retval setStart:[input LT:1]];
-
-    ANTLRCommonTree *root_0 = nil;
-
-    @try {
-        // ruleLabelDefs
-        id<ANTLRToken> INT3 = nil;
-
-        ANTLRCommonTree *INT3_tree=nil;
-
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/treerewrite/TreeRewrite.g:12:5: ( INT ) // ruleBlockSingleAlt
-        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/treerewrite/TreeRewrite.g:12:9: INT // alt
-        {
-        root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
-
-        INT3=(id<ANTLRToken>)[self match:input TokenType:INT Follow:FOLLOW_INT_in_subrule53]; 
-        INT3_tree = (ANTLRCommonTree *)[[treeAdaptor createTree:INT3] retain];
-        [treeAdaptor addChild:INT3_tree  toTree:root_0];
-          /* element() */
-         /* elements */
-        }
-
-        // token+rule list labels
-        [retval setStop:[input LT:-1]];
-
-
-        retval.tree = (ANTLRCommonTree *)[treeAdaptor rulePostProcessing:root_0];
-        [treeAdaptor setTokenBoundaries:retval.tree From:retval.startToken To:retval.stopToken];
-
-    }
-    @catch (ANTLRRecognitionException *re) {
-        [self reportError:re];
-        [self recover:input Exception:re];
-        retval.tree = (ANTLRCommonTree *)[treeAdaptor errorNode:input From:retval.startToken To:[input LT:-1] Exception:re];
-
-    }    @finally {
-    }
-    return retval;
-}
-/* $ANTLR end subrule */
-
-@end /* end of TreeRewriteParser implementation line 669 */
-
-
-/* End of code
- * =============================================================================
- */
diff --git a/runtime/ObjC/Framework/java src b/runtime/ObjC/Framework/java src
deleted file mode 100644
index 7012ce8..0000000
--- a/runtime/ObjC/Framework/java src
+++ /dev/null
Binary files differ
diff --git a/runtime/ObjC/Framework/test/runtime/TestRewriteRuleTokenStream/TestRewriteRuleTokenStream.h b/runtime/ObjC/Framework/test/runtime/TestRewriteRuleTokenStream/TestRewriteRuleTokenStream.h
index 06e128a..5764f59 100755
--- a/runtime/ObjC/Framework/test/runtime/TestRewriteRuleTokenStream/TestRewriteRuleTokenStream.h
+++ b/runtime/ObjC/Framework/test/runtime/TestRewriteRuleTokenStream/TestRewriteRuleTokenStream.h
@@ -25,18 +25,18 @@
 // THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 #import <SenTestingKit/SenTestingKit.h>
-#import "ANTLRCommonTreeAdaptor.h"
-#import "ANTLRRewriteRuleTokenStream.h"
-#import "ANTLRCommonToken.h"
+#import "CommonTreeAdaptor.h"
+#import "RewriteRuleTokenStream.h"
+#import "CommonToken.h"
 
 @interface TestRewriteRuleTokenStream : SenTestCase {
-    ANTLRCommonTreeAdaptor *treeAdaptor;
-    ANTLRRewriteRuleTokenStream *stream;
+    CommonTreeAdaptor *treeAdaptor;
+    RewriteRuleTokenStream *stream;
     
-    ANTLRCommonToken *token1;
-    ANTLRCommonToken *token2;
-    ANTLRCommonToken *token3;
-    ANTLRCommonToken *token4;
+    CommonToken *token1;
+    CommonToken *token2;
+    CommonToken *token3;
+    CommonToken *token4;
 }
 
 - (void) setUp;
diff --git a/runtime/ObjC/Framework/test/runtime/TestRewriteRuleTokenStream/TestRewriteRuleTokenStream.m b/runtime/ObjC/Framework/test/runtime/TestRewriteRuleTokenStream/TestRewriteRuleTokenStream.m
index ef84361..7cd1fac 100755
--- a/runtime/ObjC/Framework/test/runtime/TestRewriteRuleTokenStream/TestRewriteRuleTokenStream.m
+++ b/runtime/ObjC/Framework/test/runtime/TestRewriteRuleTokenStream/TestRewriteRuleTokenStream.m
@@ -25,21 +25,21 @@
 // THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 #import "TestRewriteRuleTokenStream.h"
-#import "ANTLRRewriteRuleTokenStream.h"
-#import "ANTLRCommonTreeAdaptor.h"
-#import "ANTLRCommonToken.h"
+#import "RewriteRuleTokenStream.h"
+#import "CommonTreeAdaptor.h"
+#import "CommonToken.h"
 
 @implementation TestRewriteRuleTokenStream
 
 - (void) setUp
 {
-    treeAdaptor = [ANTLRCommonTreeAdaptor newTreeAdaptor];
-    stream = [ANTLRRewriteRuleTokenStream newANTLRRewriteRuleTokenStream:treeAdaptor
+    treeAdaptor = [CommonTreeAdaptor newTreeAdaptor];
+    stream = [RewriteRuleTokenStream newRewriteRuleTokenStream:treeAdaptor
                                                           description:@"rewrite rule token stream"];
-    token1 = [ANTLRCommonToken newToken:5];
-    token2 = [ANTLRCommonToken newToken:6];
-    token3 = [ANTLRCommonToken newToken:7];
-    token4 = [ANTLRCommonToken newToken:8];
+    token1 = [CommonToken newToken:5];
+    token2 = [CommonToken newToken:6];
+    token3 = [CommonToken newToken:7];
+    token4 = [CommonToken newToken:8];
     [token1 setText:@"token 1"];
     [token2 setText:@"token 2"];
     [token3 setText:@"token 3"];
@@ -59,8 +59,8 @@
 
 - (void) test01EmptyRewriteStream
 {
-    treeAdaptor = [ANTLRCommonTreeAdaptor newTreeAdaptor];
-    stream = [ANTLRRewriteRuleTokenStream newANTLRRewriteRuleTokenStream:treeAdaptor
+    treeAdaptor = [CommonTreeAdaptor newTreeAdaptor];
+    stream = [RewriteRuleTokenStream newRewriteRuleTokenStream:treeAdaptor
                                                              description:@"rewrite rule token stream"];
     STAssertFalse([stream hasNext], @"-(BOOL)hasNext should be NO, but isn't");
     STAssertThrows([stream nextToken], @"-next on empty stream should throw exception, but doesn't");
@@ -68,11 +68,11 @@
 
 - (void) test02RewriteStreamCount
 {
-    treeAdaptor = [ANTLRCommonTreeAdaptor newTreeAdaptor];
-    stream = [ANTLRRewriteRuleTokenStream newANTLRRewriteRuleTokenStream:treeAdaptor
+    treeAdaptor = [CommonTreeAdaptor newTreeAdaptor];
+    stream = [RewriteRuleTokenStream newRewriteRuleTokenStream:treeAdaptor
                                                              description:@"rewrite rule token stream"];
-    token1 = [ANTLRCommonToken newToken:5];
-    token2 = [ANTLRCommonToken newToken:6];
+    token1 = [CommonToken newToken:5];
+    token2 = [CommonToken newToken:6];
     [token1 setText:@"token 1"];
     [token2 setText:@"token 2"];
     STAssertTrue([stream size] == 0,
@@ -88,27 +88,27 @@
 
 - (void) test03SingleElement
 {
-    treeAdaptor = [ANTLRCommonTreeAdaptor newTreeAdaptor];
-    stream = [ANTLRRewriteRuleTokenStream newANTLRRewriteRuleTokenStream:treeAdaptor
+    treeAdaptor = [CommonTreeAdaptor newTreeAdaptor];
+    stream = [RewriteRuleTokenStream newRewriteRuleTokenStream:treeAdaptor
                                                              description:@"rewrite rule token stream"];
-    token1 = [ANTLRCommonToken newToken:5];
-    token2 = [ANTLRCommonToken newToken:6];
-    token3 = [ANTLRCommonToken newToken:7];
-    token4 = [ANTLRCommonToken newToken:8];
+    token1 = [CommonToken newToken:5];
+    token2 = [CommonToken newToken:6];
+    token3 = [CommonToken newToken:7];
+    token4 = [CommonToken newToken:8];
     [token1 setText:@"token 1"];
     [token2 setText:@"token 2"];
     [token3 setText:@"token 3"];
     [token4 setText:@"token 4"];
     [stream addElement:token1];
     STAssertTrue([stream hasNext], @"-hasNext should be YES, but isn't");
-    ANTLRCommonTree *tree = [stream nextNode];
+    CommonTree *tree = [stream nextNode];
     STAssertEqualObjects([tree getToken], token1, @"return token from stream should be token1, but isn't");
 }
 
 - (void) test04SingleElementDup
 {
     [stream addElement:token1];
-    ANTLRCommonTree *tree1, *tree2;
+    CommonTree *tree1, *tree2;
     STAssertNoThrow(tree1 = [stream nextNode],
                     @"stream iteration should not throw exception"
                     );
@@ -126,7 +126,7 @@
     [stream addElement:token1];
     [stream addElement:token2];
     [stream addElement:token3];
-    ANTLRCommonTree *tree1, *tree2, *tree3, *tree4;
+    CommonTree *tree1, *tree2, *tree3, *tree4;
     STAssertNoThrow(tree1 = [stream nextNode],
                     @"stream iteration should not throw exception"
                     );
@@ -155,7 +155,7 @@
     [stream addElement:token1];
     [stream addElement:token2];
     [stream addElement:token3];
-    ANTLRCommonTree *tree1, *tree2, *tree3;
+    CommonTree *tree1, *tree2, *tree3;
     
     // consume the stream completely
     STAssertNoThrow(tree1 = [stream nextNode],
@@ -176,7 +176,7 @@
     
     [stream reset]; // after resetting the stream it should dup
     
-    ANTLRCommonTree *tree1Dup, *tree2Dup, *tree3Dup;
+    CommonTree *tree1Dup, *tree2Dup, *tree3Dup;
 
     STAssertNoThrow(tree1Dup = [stream nextNode],
                     @"stream iteration should not throw exception"
diff --git a/runtime/ObjC/Framework/test/runtime/misc/ANTLRFastQueueTest.h b/runtime/ObjC/Framework/test/runtime/misc/ANTLRFastQueueTest.h
deleted file mode 100644
index eb85a2d..0000000
--- a/runtime/ObjC/Framework/test/runtime/misc/ANTLRFastQueueTest.h
+++ /dev/null
@@ -1,24 +0,0 @@
-//
-//  ANTLRFastQueueTest.h
-//  ANTLR
-//
-//  Created by Ian Michell on 13/05/2010.
-//  Copyright 2010 Ian Michell. All rights reserved.
-//
-
-#import <SenTestingKit/SenTestingKit.h>
-
-
-@interface ANTLRFastQueueTest : SenTestCase {
-
-}
-
--(void) testInit;
--(void) testAddAndGet;
--(void) testInvalidElementIndex;
--(void) testHead;
--(void) testClear;
--(void) testDescription;
--(void) testRemove;
-
-@end
diff --git a/runtime/ObjC/Framework/test/runtime/misc/ANTLRFastQueueTest.m b/runtime/ObjC/Framework/test/runtime/misc/ANTLRFastQueueTest.m
deleted file mode 100644
index 74508a7..0000000
--- a/runtime/ObjC/Framework/test/runtime/misc/ANTLRFastQueueTest.m
+++ /dev/null
@@ -1,103 +0,0 @@
-//
-//  ANTLRFastQueueTest.m
-//  ANTLR
-//
-//  Created by Ian Michell on 13/05/2010.
-//  Copyright 2010 Ian Michell and Alan Condit. All rights reserved.
-//
-
-#import "ANTLRFastQueueTest.h"
-#import "ANTLRFastQueue.h"
-#import "ANTLRError.h"
-#import "ANTLRRuntimeException.h"
-
-@implementation ANTLRFastQueueTest
-
--(void) testInit
-{
-	ANTLRFastQueue *queue = [[ANTLRFastQueue newANTLRFastQueue] retain];
-	STAssertNotNil(queue, @"Queue was not created and was nil");
-	[queue release];
-}
-
--(void) testAddAndGet
-{
-	ANTLRFastQueue *queue = [[ANTLRFastQueue newANTLRFastQueue] retain];
-	STAssertNotNil(queue, @"Queue was not created and was nil");
-	[queue addObject:@"My String"];
-	STAssertTrue([[queue objectAtIndex:0] isKindOfClass:[NSString class]], @"First object is not a NSString");
-	STAssertEquals([queue objectAtIndex:0], @"My String", @"Object at index zero is invalid");
-	STAssertTrue([queue size] == 1, @"Queue is the wrong size: %d", [queue size]);
-	[queue release];
-}
-
--(void) testInvalidElementIndex
-{
-    //ANTLRRuntimeException *ANTLRNoSuchElementException = [ANTLRNoSuchElementException newException:@"No such element exception"];
-    id retVal;
-	ANTLRFastQueue *queue = [[ANTLRFastQueue newANTLRFastQueue] retain];
-	STAssertNotNil(queue, @"Queue was not created and was nil");
-	@try 
-	{
-		retVal = [queue objectAtIndex:100];
-	}
-	@catch (ANTLRNoSuchElementException *e) 
-	{
-		STAssertTrue([[e name] isEqualTo:@"ANTLRNoSuchElementException"], @"Exception was not type: ANTLRNoSuchElementException -- %@", [e name]);
-		return;
-	}
-	STFail(@"Exception ANTLRNoSuchElementException was not thrown -- %@", [retVal name]);
-    [queue release];
-}
-
--(void) testHead
-{
-	ANTLRFastQueue *queue = [[ANTLRFastQueue newANTLRFastQueue] retain];
-	STAssertNotNil(queue, @"Queue was not created and was nil");
-	[queue addObject:@"Item 1"];
-	[queue addObject:@"Item 2"];
-	[queue addObject:@"Item 3"];
-	id head = [queue head];
-	STAssertNotNil(head, @"Object returned from head is nil");
-	STAssertEquals(head, @"Item 1", @"Object returned was not first item in");
-	[queue release];
-}
-
--(void) testClear
-{
-	ANTLRFastQueue *queue = [[ANTLRFastQueue newANTLRFastQueue] retain];
-	STAssertNotNil(queue, @"Queue was not created and was nil");
-	[queue addObject:@"Item 1"];
-	[queue addObject:@"Item 2"];
-	[queue addObject:@"Item 3"];
-	STAssertTrue([queue size] == 3, @"Queue was too small, was: %d expected 3", [queue size]);
-	[queue reset];
-	STAssertTrue([queue size] == 0, @"Queue is not empty, it's still %d", [queue size]);
-	[queue release];
-}
-
--(void) testDescription
-{
-	ANTLRFastQueue *queue = [[ANTLRFastQueue newANTLRFastQueue] retain];
-	STAssertNotNil(queue, @"Queue was not created and was nil");
-	[queue addObject:@"My"];
-	[queue addObject:@"String"];
-	STAssertTrue([[queue description] isEqualToString:@"My String"], @"Queue description was not right, got: \"%@\" expected: \"My String\"", [queue description]);
-	[queue release];
-}
-
--(void) testRemove
-{
-	ANTLRFastQueue *queue = [[ANTLRFastQueue newANTLRFastQueue] retain];
-	STAssertNotNil(queue, @"Queue was not created and was nil");
-	[queue addObject:@"My"];
-	[queue addObject:@"String"];
-	STAssertTrue([queue size] == 2, @"Queue not the correct size, was: %d expected 2", [queue size]);
-	[queue remove];
-	STAssertTrue([queue size] == 1, @"Queue not the correct size, was %d expected 1", [queue size]);
-	[queue remove]; // test that the queue is reset when we remove the last object...
-	STAssertTrue([queue size] == 0, @"Queue was not reset, when we hit the buffer, was still %d", [queue size]);
-	[queue release];
-}
-
-@end
diff --git a/runtime/ObjC/Framework/test/runtime/misc/ANTLRIntArrayTest.h b/runtime/ObjC/Framework/test/runtime/misc/ANTLRIntArrayTest.h
deleted file mode 100644
index 1dffb23..0000000
--- a/runtime/ObjC/Framework/test/runtime/misc/ANTLRIntArrayTest.h
+++ /dev/null
@@ -1,21 +0,0 @@
-//
-//  ANTLRIntArrayTest.h
-//  ANTLR
-//
-//  Created by Ian Michell on 13/05/2010.
-//  Copyright 2010 Ian Michell. All rights reserved.
-//
-
-#import <SenTestingKit/SenTestingKit.h>
-
-
-@interface ANTLRIntArrayTest : SenTestCase 
-{
-
-}
-
--(void) testAdd;
--(void) testPushPop;
--(void) testClearAndAdd;
-
-@end
diff --git a/runtime/ObjC/Framework/test/runtime/misc/ANTLRIntArrayTest.m b/runtime/ObjC/Framework/test/runtime/misc/ANTLRIntArrayTest.m
deleted file mode 100644
index a3edc20..0000000
--- a/runtime/ObjC/Framework/test/runtime/misc/ANTLRIntArrayTest.m
+++ /dev/null
@@ -1,47 +0,0 @@
-//
-//  ANTLRIntArrayTest.m
-//  ANTLR
-//
-//  Created by Ian Michell on 13/05/2010.
-//  Copyright 2010 Ian Michell. All rights reserved.
-//
-
-#import "ANTLRIntArrayTest.h"
-#import "ANTLRIntArray.h"
-
-@implementation ANTLRIntArrayTest
-
--(void) testAdd
-{
-	ANTLRIntArray *intArray = [ANTLRIntArray newArrayWithLen:10];
-	[intArray addInteger:1];
-	STAssertTrue([intArray count] == 1, @"Int array should be of size 1");
-	STAssertTrue([intArray integerAtIndex:0] == 1, @"First item in int array should be 1");
-	[intArray release];
-}
-
--(void) testPushPop
-{
-	ANTLRIntArray *intArray = [ANTLRIntArray newArrayWithLen:10];
-	for (NSInteger i = 0; i < 10; i++)
-	{
-		[intArray push:i + 1];
-	}
-	NSInteger popped = [intArray pop];
-	NSLog(@"Popped value: %d", popped);
-	STAssertTrue(popped == 10, @"Pop should pull the last element out, which should be 10 was: %d", popped);
-	[intArray release];
-}
-
--(void) testClearAndAdd
-{
-	ANTLRIntArray *intArray = [ANTLRIntArray newArrayWithLen:10];
-	[intArray addInteger:1];
-	STAssertTrue([intArray count] == 1, @"Int array should be of size 1");
-	STAssertTrue([intArray integerAtIndex:0] == 1, @"First item in int array should be 1");
-	[intArray reset];
-	STAssertTrue([intArray count] == 0, @"Array size should be 0");
-	[intArray release];
-}
-
-@end
diff --git a/runtime/ObjC/Framework/test/runtime/misc/FastQueueTest.h b/runtime/ObjC/Framework/test/runtime/misc/FastQueueTest.h
new file mode 100644
index 0000000..3000a59
--- /dev/null
+++ b/runtime/ObjC/Framework/test/runtime/misc/FastQueueTest.h
@@ -0,0 +1,24 @@
+//
+//  ANTLRFastQueueTest.h
+//  ANTLR
+//
+//  Created by Ian Michell on 13/05/2010.
+//  Copyright 2010 Ian Michell. All rights reserved.
+//
+
+#import <SenTestingKit/SenTestingKit.h>
+
+
+@interface FastQueueTest : SenTestCase {
+
+}
+
+-(void) testInit;
+-(void) testAddAndGet;
+-(void) testInvalidElementIndex;
+-(void) testHead;
+-(void) testClear;
+-(void) testDescription;
+-(void) testRemove;
+
+@end
diff --git a/runtime/ObjC/Framework/test/runtime/misc/FastQueueTest.m b/runtime/ObjC/Framework/test/runtime/misc/FastQueueTest.m
new file mode 100644
index 0000000..c37898a
--- /dev/null
+++ b/runtime/ObjC/Framework/test/runtime/misc/FastQueueTest.m
@@ -0,0 +1,103 @@
+//
+//  FastQueueTest.m
+//  ANTLR
+//
+//  Created by Ian Michell on 13/05/2010.
+//  Copyright 2010 Ian Michell and Alan Condit. All rights reserved.
+//
+
+#import "FastQueueTest.h"
+#import "FastQueue.h"
+#import "ANTLRError.h"
+#import "RuntimeException.h"
+
+@implementation FastQueueTest
+
+-(void) testInit
+{
+	FastQueue *queue = [[FastQueue newFastQueue] retain];
+	STAssertNotNil(queue, @"Queue was not created and was nil");
+	[queue release];
+}
+
+-(void) testAddAndGet
+{
+	FastQueue *queue = [[FastQueue newFastQueue] retain];
+	STAssertNotNil(queue, @"Queue was not created and was nil");
+	[queue addObject:@"My String"];
+	STAssertTrue([[queue objectAtIndex:0] isKindOfClass:[NSString class]], @"First object is not a NSString");
+	STAssertEquals([queue objectAtIndex:0], @"My String", @"Object at index zero is invalid");
+	STAssertTrue([queue size] == 1, @"Queue is the wrong size: %d", [queue size]);
+	[queue release];
+}
+
+-(void) testInvalidElementIndex
+{
+    //RuntimeException *NoSuchElementException = [NoSuchElementException newException:@"No such element exception"];
+    id retVal;
+	FastQueue *queue = [[FastQueue newFastQueue] retain];
+	STAssertNotNil(queue, @"Queue was not created and was nil");
+	@try 
+	{
+		retVal = [queue objectAtIndex:100];
+	}
+	@catch (NoSuchElementException *e) 
+	{
+		STAssertTrue([[e name] isEqualTo:@"NoSuchElementException"], @"Exception was not type: NoSuchElementException -- %@", [e name]);
+		return;
+	}
+	STFail(@"Exception NoSuchElementException was not thrown -- %@", [retVal name]);
+    [queue release];
+}
+
+-(void) testHead
+{
+	FastQueue *queue = [[FastQueue newFastQueue] retain];
+	STAssertNotNil(queue, @"Queue was not created and was nil");
+	[queue addObject:@"Item 1"];
+	[queue addObject:@"Item 2"];
+	[queue addObject:@"Item 3"];
+	id head = [queue head];
+	STAssertNotNil(head, @"Object returned from head is nil");
+	STAssertEquals(head, @"Item 1", @"Object returned was not first item in");
+	[queue release];
+}
+
+-(void) testClear
+{
+	FastQueue *queue = [[FastQueue newFastQueue] retain];
+	STAssertNotNil(queue, @"Queue was not created and was nil");
+	[queue addObject:@"Item 1"];
+	[queue addObject:@"Item 2"];
+	[queue addObject:@"Item 3"];
+	STAssertTrue([queue size] == 3, @"Queue was too small, was: %d expected 3", [queue size]);
+	[queue reset];
+	STAssertTrue([queue size] == 0, @"Queue is not empty, it's still %d", [queue size]);
+	[queue release];
+}
+
+-(void) testDescription
+{
+	FastQueue *queue = [[FastQueue newFastQueue] retain];
+	STAssertNotNil(queue, @"Queue was not created and was nil");
+	[queue addObject:@"My"];
+	[queue addObject:@"String"];
+	STAssertTrue([[queue description] isEqualToString:@"My String"], @"Queue description was not right, got: \"%@\" expected: \"My String\"", [queue description]);
+	[queue release];
+}
+
+-(void) testRemove
+{
+	FastQueue *queue = [[FastQueue newFastQueue] retain];
+	STAssertNotNil(queue, @"Queue was not created and was nil");
+	[queue addObject:@"My"];
+	[queue addObject:@"String"];
+	STAssertTrue([queue size] == 2, @"Queue not the correct size, was: %d expected 2", [queue size]);
+	[queue remove];
+	STAssertTrue([queue size] == 1, @"Queue not the correct size, was %d expected 1", [queue size]);
+	[queue remove]; // test that the queue is reset when we remove the last object...
+	STAssertTrue([queue size] == 0, @"Queue was not reset, when we hit the buffer, was still %d", [queue size]);
+	[queue release];
+}
+
+@end
diff --git a/runtime/ObjC/Framework/test/runtime/misc/IntArrayTest.m b/runtime/ObjC/Framework/test/runtime/misc/IntArrayTest.m
index 2b3f3f0..6d1e300 100644
--- a/runtime/ObjC/Framework/test/runtime/misc/IntArrayTest.m
+++ b/runtime/ObjC/Framework/test/runtime/misc/IntArrayTest.m
@@ -13,7 +13,7 @@
 
 -(void) testAdd
 {
-	IntArray *intArray = [IntArray newIntArrayWithLen:10];
+	IntArray *intArray = [IntArray newArrayWithLen:10];
 	[intArray addInteger:1];
 	STAssertTrue([intArray count] == 1, @"Int array should be of size 1");
 	STAssertTrue([intArray integerAtIndex:0] == 1, @"First item in int array should be 1");
@@ -22,7 +22,7 @@
 
 -(void) testPushPop
 {
-	IntArray *intArray = [IntArray newIntArrayWithLen:10];
+	IntArray *intArray = [IntArray newArrayWithLen:10];
 	for (NSInteger i = 0; i < 10; i++)
 	{
 		[intArray push:i + 1];
@@ -35,7 +35,7 @@
 
 -(void) testClearAndAdd
 {
-	IntArray *intArray = [IntArray newIntArrayWithLen:10];
+	IntArray *intArray = [IntArray newArrayWithLen:10];
 	[intArray addInteger:1];
 	STAssertTrue([intArray count] == 1, @"Int array should be of size 1");
 	STAssertTrue([intArray integerAtIndex:0] == 1, @"First item in int array should be 1");
diff --git a/runtime/ObjC/Framework/test/runtime/recognizer/ANTLRRecognizerTest.m b/runtime/ObjC/Framework/test/runtime/recognizer/ANTLRRecognizerTest.m
deleted file mode 100755
index f857107..0000000
--- a/runtime/ObjC/Framework/test/runtime/recognizer/ANTLRRecognizerTest.m
+++ /dev/null
@@ -1,14 +0,0 @@
-//
-//  ANTLRRecognizerTest.m
-//  ANTLR
-//
-//  Created by Ian Michell on 02/07/2010.
-//  Copyright 2010 Ian Michell. All rights reserved.
-//
-
-#import "ANTLRRecognizerTest.h"
-
-
-@implementation ANTLRRecognizerTest
-
-@end
diff --git a/runtime/ObjC/Framework/test/runtime/recognizer/ANTLRRecognizerTest.h b/runtime/ObjC/Framework/test/runtime/recognizer/RecognizerTest.h
similarity index 100%
rename from runtime/ObjC/Framework/test/runtime/recognizer/ANTLRRecognizerTest.h
rename to runtime/ObjC/Framework/test/runtime/recognizer/RecognizerTest.h
diff --git a/runtime/ObjC/Framework/test/runtime/recognizer/RecognizerTest.m b/runtime/ObjC/Framework/test/runtime/recognizer/RecognizerTest.m
new file mode 100755
index 0000000..fb86952
--- /dev/null
+++ b/runtime/ObjC/Framework/test/runtime/recognizer/RecognizerTest.m
@@ -0,0 +1,14 @@
+//
+//  RecognizerTest.m
+//  ANTLR
+//
+//  Created by Ian Michell on 02/07/2010.
+//  Copyright 2010 Ian Michell. All rights reserved.
+//
+
+#import "RecognizerTest.h"
+
+
+@implementation ANTLRRecognizerTest
+
+@end
diff --git a/runtime/ObjC/Framework/test/runtime/sets/ANTLRBitSetTest.h b/runtime/ObjC/Framework/test/runtime/sets/ANTLRBitSetTest.h
index debf650..c77a210 100644
--- a/runtime/ObjC/Framework/test/runtime/sets/ANTLRBitSetTest.h
+++ b/runtime/ObjC/Framework/test/runtime/sets/ANTLRBitSetTest.h
@@ -19,6 +19,7 @@
 -(void) testRemove;
 -(void) testCopyBitSet;
 -(void) testOr;
+-(void) testOrInPlace;
 -(void) testDescription;
 
 @end
diff --git a/runtime/ObjC/Framework/test/runtime/sets/ANTLRBitSetTest.m b/runtime/ObjC/Framework/test/runtime/sets/ANTLRBitSetTest.m
index 70fd894..feec9e9 100644
--- a/runtime/ObjC/Framework/test/runtime/sets/ANTLRBitSetTest.m
+++ b/runtime/ObjC/Framework/test/runtime/sets/ANTLRBitSetTest.m
@@ -8,6 +8,7 @@
 
 #import "ANTLRBitSetTest.h"
 #import "ANTLRBitSet.h"
+#import "ACNumber.h"
 #import <CoreFoundation/CoreFoundation.h>
 #import <CoreFoundation/CFBitVector.h>
 
@@ -16,7 +17,7 @@
 -(void) testWithBitData
 {
 	static const unsigned long long bitData[] = {3LL, 1LL};
-	ANTLRBitSet *bitSet = [ANTLRBitSet newANTLRBitSetWithBits:bitData Count:2];
+	ANTLRBitSet *bitSet = [ANTLRBitSet newBitSetWithBits:bitData Count:2];
     CFIndex actual = (CFIndex)[bitSet numBits];
     CFIndex expected = 3;
 	
@@ -27,19 +28,19 @@
 -(void) testWithBitArray
 {
 	AMutableArray *bits = [AMutableArray arrayWithCapacity:10];
-	[bits addObject:[NSNumber numberWithBool:YES]];
-	[bits addObject:[NSNumber numberWithBool:YES]];
-	[bits addObject:[NSNumber numberWithBool:NO]];
-	[bits addObject:[NSNumber numberWithBool:YES]];
-	[bits addObject:[NSNumber numberWithBool:NO]];
-	[bits addObject:[NSNumber numberWithBool:YES]];
+	[bits addObject:[ACNumber numberWithBool:YES]];
+	[bits addObject:[ACNumber numberWithBool:YES]];
+	[bits addObject:[ACNumber numberWithBool:NO]];
+	[bits addObject:[ACNumber numberWithBool:YES]];
+	[bits addObject:[ACNumber numberWithBool:NO]];
+	[bits addObject:[ACNumber numberWithBool:YES]];
 	STAssertTrue([[bits objectAtIndex:0] boolValue], @"Value at index 0 was not true");
 	STAssertTrue([[bits objectAtIndex:1] boolValue], @"Value at index 1 was not true");
 	STAssertFalse([[bits objectAtIndex:2] boolValue], @"Value at index 2 was not false");
 	STAssertTrue([[bits objectAtIndex:3] boolValue], @"Value at index 3 was not true");
 	STAssertFalse([[bits objectAtIndex:4] boolValue], @"Value at index 4 was not false");
 	STAssertTrue([[bits objectAtIndex:5] boolValue], @"Value at index 5 was not true");
-	ANTLRBitSet *bitSet = [ANTLRBitSet newANTLRBitSetWithArray:bits];
+	ANTLRBitSet *bitSet = [ANTLRBitSet newBitSetWithArray:bits];
 	CFIndex actual = (CFIndex)[bitSet numBits];
 	CFIndex expected = 4;
 	STAssertEquals(actual, expected, @"There should be four bits set in bitvector. But I have %d", actual);
@@ -49,7 +50,7 @@
 -(void) testAdd
 {
 
-	ANTLRBitSet *bitSet = [ANTLRBitSet newANTLRBitSet];
+	ANTLRBitSet *bitSet = [ANTLRBitSet newBitSet];
 	[bitSet add:1];
 	[bitSet add:2];
 	[bitSet add:3];
@@ -61,7 +62,7 @@
 
 -(void) testRemove
 {
-	ANTLRBitSet *bitSet = [ANTLRBitSet newANTLRBitSet];
+	ANTLRBitSet *bitSet = [ANTLRBitSet newBitSet];
 	[bitSet add:1];
 	CFIndex actual = (CFIndex)[bitSet numBits];
 	CFIndex expected = 1;
@@ -77,7 +78,7 @@
 -(void) testCopyBitSet
 {
 	static const unsigned long long bitData[] = {3LL, 1LL};
-	ANTLRBitSet *bitSet = [ANTLRBitSet newANTLRBitSetWithBits:bitData Count:2];
+	ANTLRBitSet *bitSet = [ANTLRBitSet newBitSetWithBits:bitData Count:2];
 	ANTLRBitSet *copy = [bitSet mutableCopyWithZone:nil];
 	CFIndex actual = (CFIndex)[copy numBits];
 	STAssertEquals(actual, (CFIndex)[bitSet numBits], @"There should be three bits set in bitvector. But I have %d", [copy numBits]);
@@ -87,18 +88,38 @@
 -(void) testOr
 {
 	static const unsigned long long bitData[] = {3LL, 1LL};
-	ANTLRBitSet *bitSet = [ANTLRBitSet newANTLRBitSetWithBits:bitData Count:2];
+	ANTLRBitSet *bitSet = [ANTLRBitSet newBitSetWithBits:bitData Count:2];
 	
 	static const unsigned long long otherData[] = {5LL, 3LL, 1LL};
-	ANTLRBitSet *otherBitSet = [ANTLRBitSet newANTLRBitSetWithBits:otherData Count:3];
+	ANTLRBitSet *otherBitSet = [ANTLRBitSet newBitSetWithBits:otherData Count:3];
 	
 	ANTLRBitSet *c = [bitSet or:otherBitSet];
 	STAssertTrue([c size] == [otherBitSet size], @"c should be the same as otherBitSet");
 }
 
+-(void) testOrInPlace
+{
+    
+	ANTLRBitSet *bitSet = [ANTLRBitSet newBitSet];
+	[bitSet add:1];
+	[bitSet add:2];
+	[bitSet add:16];
+	CFIndex actual = (CFIndex)[bitSet numBits];
+	CFIndex expected = 3;
+	STAssertEquals(actual, expected, @"There should be three bits set in bitvector. But I have %d", actual);
+	ANTLRBitSet *followSet = [ANTLRBitSet newBitSet];
+    [followSet orInPlace:bitSet];
+	actual = (CFIndex)[followSet numBits];
+	expected = 3;
+    NSLog( @"%@\n", [followSet description] );
+	STAssertEquals(actual, expected, @"There should be three bits set in bitvector. But I have %d", actual);
+	[bitSet release];
+	[followSet release];
+}
+
 -(void) testDescription
 {
-	ANTLRBitSet *bitSet = [ANTLRBitSet newANTLRBitSet];
+	ANTLRBitSet *bitSet = [ANTLRBitSet newBitSet];
 	[bitSet add:1];
 	[bitSet add:2];
 	NSMutableString *aDescription = (NSMutableString *)[bitSet description];
diff --git a/runtime/ObjC/Framework/test/runtime/stream/ANTLRStringStreamTest.m b/runtime/ObjC/Framework/test/runtime/stream/ANTLRStringStreamTest.m
index 7b6b66e..48b137a 100644
--- a/runtime/ObjC/Framework/test/runtime/stream/ANTLRStringStreamTest.m
+++ b/runtime/ObjC/Framework/test/runtime/stream/ANTLRStringStreamTest.m
@@ -7,7 +7,7 @@
 //
 
 #import "ANTLRStringStreamTest.h"
-#import "ANTLRCharStream.h"
+#import "CharStream.h"
 #import "ANTLRStringStream.h"
 #import "ANTLRError.h"
 
@@ -52,7 +52,7 @@
 	BOOL eofFound = NO;
 	for (i = 1; i <= [stream size]+1; i++) {
 		NSInteger r = [stream LA:i];
-		if (r == (NSInteger)ANTLRCharStreamEOF) {
+		if (r == (NSInteger)CharStreamEOF) {
 			eofFound = YES;
             break;
 		}
@@ -68,7 +68,7 @@
 	BOOL eofFound = NO;
 	for ( i = 1; i <= [stream size]+1; i++) {
 		NSInteger r = [stream LT:i];
-		if (r == (NSInteger)ANTLRCharStreamEOF) {
+		if (r == (NSInteger)CharStreamEOF) {
 			eofFound = YES;
             break;
 		}
diff --git a/runtime/ObjC/Framework/test/runtime/token/ANTLRCommonTokenTest.h b/runtime/ObjC/Framework/test/runtime/token/ANTLRCommonTokenTest.h
deleted file mode 100644
index 77f028b..0000000
--- a/runtime/ObjC/Framework/test/runtime/token/ANTLRCommonTokenTest.h
+++ /dev/null
@@ -1,25 +0,0 @@
-//
-//  ANTLRCommonTokenTest.h
-//  ANTLR
-//
-//  Created by Ian Michell on 25/05/2010.
-//  Copyright 2010 Ian Michell. All rights reserved.
-//
-
-#import <SenTestingKit/SenTestingKit.h>
-
-
-@interface ANTLRCommonTokenTest : SenTestCase 
-{
-
-}
-
--(void) test01InitAndRelease;
--(void) test02GetEOFToken;
--(void) test03InitWithTokenType;
--(void) test04InitWithTokenTypeAndText;
--(void) test05InitWithCharStream;
--(void) test06InitWithToken;
--(void) test07TokenDescription;
-
-@end
diff --git a/runtime/ObjC/Framework/test/runtime/token/ANTLRCommonTokenTest.m b/runtime/ObjC/Framework/test/runtime/token/ANTLRCommonTokenTest.m
deleted file mode 100644
index e945c5d..0000000
--- a/runtime/ObjC/Framework/test/runtime/token/ANTLRCommonTokenTest.m
+++ /dev/null
@@ -1,98 +0,0 @@
-//
-//  ANTLRCommonTokenTest.m
-//  ANTLR
-//
-//  Created by Ian Michell on 25/05/2010.
-//  Copyright 2010 Ian Michell and Alan Condit. All rights reserved.
-//
-
-#import "ANTLRCommonTokenTest.h"
-#import "ANTLRCommonToken.h"
-#import "ANTLRStringStream.h"
-
-@implementation ANTLRCommonTokenTest
-
--(void) test01InitAndRelease
-{
-	ANTLRCommonToken *token = [[ANTLRCommonToken newToken] retain];
-	STAssertNotNil(token, @"Token was nil");
-	[token release];
-}
-
--(void) test02GetEOFToken
-{
-	ANTLRCommonToken *token = [[ANTLRCommonToken eofToken] retain];
-	STAssertNotNil(token, @"Token was nil");
-	STAssertEquals(token.type, (NSInteger)ANTLRTokenTypeEOF, @"Token was not of type ANTLRTokenTypeEOF");
-	[token release];
-}
-
--(void) test03InitWithTokenType
-{
-	ANTLRCommonToken *token = [[ANTLRCommonToken newToken:ANTLRTokenTypeUP] retain];
-	token.text = @"<UP>";
-	STAssertNotNil(token, @"Token was nil");
-	STAssertEquals(token.type, (NSInteger)ANTLRTokenTypeUP, @"Token was not of type ANTLRTokenTypeUP");
-	STAssertNotNil(token.text, @"Token text was nil, was expecting <UP>");
-	STAssertTrue([token.text isEqualToString:@"<UP>"], @"Token text was not <UP> was instead: %@", token.text);
-	[token release];
-}
-
--(void) test04InitWithTokenTypeAndText
-{
-	ANTLRCommonToken *token = [[ANTLRCommonToken newToken:ANTLRTokenTypeUP Text:@"<UP>"] retain];
-	STAssertNotNil(token, @"Token was nil");
-	STAssertEquals(token.type, (NSInteger)ANTLRTokenTypeUP, @"Token was not of type ANTLRTokenTypeUP");
-	STAssertNotNil(token.text, @"Token text was nil, was expecting <UP>");
-	STAssertTrue([token.text isEqualToString:@"<UP>"], @"Token text was not <UP> was instead: %@", token.text);
-	[token release];
-}
-
--(void) test05InitWithCharStream
-{
-	ANTLRStringStream *stream = [[ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"] retain];
-	ANTLRCommonToken *token = [[ANTLRCommonToken newToken:stream Type:555 Channel:ANTLRTokenChannelDefault Start:4 Stop:5] retain];
-	STAssertNotNil(token, @"Token was nil");
-	STAssertEquals(token.type, (NSInteger)555, @"Token was not of type 555"); // Nice random type number
-	STAssertNotNil(token.text, @"Token text was nil, was expecting ||");
-	STAssertTrue([token.text isEqualToString:@"||"], @"Token text was not || was instead: %@", token.text);
-	[token release];
-    [stream release];
-}
-
--(void) test06InitWithToken
-{
-	ANTLRStringStream *stream = [[ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"] retain];
-	ANTLRCommonToken *token = [[ANTLRCommonToken newToken:stream Type:555 Channel:ANTLRTokenChannelDefault Start:4 Stop:5] retain];
-	STAssertNotNil(token, @"Token was nil");
-	STAssertEquals(token.type, (NSInteger)555, @"Token was not of type 555"); // Nice random type number
-	STAssertNotNil(token.text, @"Token text was nil, was expecting ||");
-	STAssertTrue([token.text isEqualToString:@"||"], @"Token text was not || was instead: %@", token.text);
-	
-	ANTLRCommonToken *newToken = [[ANTLRCommonToken newTokenWithToken:token] retain];
-	STAssertNotNil(newToken, @"New token is nil!");
-	STAssertEquals(newToken.type, token.type, @"Tokens types do not match %d:%d!", newToken.type, token.type);
-	STAssertEquals(newToken.line, token.line, @"Token lines do not match!");
-	STAssertEquals(newToken.index, token.index, @"Token indexes do not match");
-	STAssertEquals(newToken.channel, token.channel, @"Token channels are not the same");
-	STAssertEquals(newToken.charPositionInLine, token.charPositionInLine, @"Token char positions in lines do not match");
-	STAssertEquals(newToken.startIndex, token.startIndex, @"Token start positions do not match");
-	STAssertEquals(newToken.stopIndex, token.stopIndex, @"Token stop positions do not match");
-	STAssertTrue([newToken.text isEqualToString:token.text], @"Token text does not match!");
-	[token release];
-	[newToken release];
-    [stream release];
-}
-
--(void) test07TokenDescription
-{
-    NSString *aDescription;
-	ANTLRStringStream *stream = [[ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"] retain];
-	ANTLRCommonToken *token = [[ANTLRCommonToken newToken:stream Type:555 Channel:ANTLRTokenChannelDefault Start:4 Stop:5] retain];
-    aDescription = [token description];
-	STAssertTrue([aDescription isEqualToString:@"[@0, 4:5='||',<555>,0:0]"], @"String description for token is not correct! got %@", aDescription);
-    [token release];
-    [stream release];
-}
-
-@end
diff --git a/runtime/ObjC/Framework/test/runtime/token/CommonTokenTest.h b/runtime/ObjC/Framework/test/runtime/token/CommonTokenTest.h
new file mode 100644
index 0000000..3d82917
--- /dev/null
+++ b/runtime/ObjC/Framework/test/runtime/token/CommonTokenTest.h
@@ -0,0 +1,25 @@
+//
+//  CommonTokenTest.h
+//  ANTLR
+//
+//  Created by Ian Michell on 25/05/2010.
+//  Copyright 2010 Ian Michell. All rights reserved.
+//
+
+#import <SenTestingKit/SenTestingKit.h>
+
+
+@interface CommonTokenTest : SenTestCase 
+{
+
+}
+
+-(void) test01InitAndRelease;
+-(void) test02GetEOFToken;
+-(void) test03InitWithTokenType;
+-(void) test04InitWithTokenTypeAndText;
+-(void) test05InitWithCharStream;
+-(void) test06InitWithToken;
+-(void) test07TokenDescription;
+
+@end
diff --git a/runtime/ObjC/Framework/test/runtime/token/CommonTokenTest.m b/runtime/ObjC/Framework/test/runtime/token/CommonTokenTest.m
new file mode 100644
index 0000000..20a187f
--- /dev/null
+++ b/runtime/ObjC/Framework/test/runtime/token/CommonTokenTest.m
@@ -0,0 +1,98 @@
+//
+//  CommonTokenTest.m
+//  ANTLR
+//
+//  Created by Ian Michell on 25/05/2010.
+//  Copyright 2010 Ian Michell and Alan Condit. All rights reserved.
+//
+
+#import "CommonTokenTest.h"
+#import "CommonToken.h"
+#import "ANTLRStringStream.h"
+
+@implementation CommonTokenTest
+
+-(void) test01InitAndRelease
+{
+	CommonToken *token = [[CommonToken newToken] retain];
+	STAssertNotNil(token, @"Token was nil");
+	[token release];
+}
+
+-(void) test02GetEOFToken
+{
+	CommonToken *token = [[CommonToken eofToken] retain];
+	STAssertNotNil(token, @"Token was nil");
+	STAssertEquals(token.type, (NSInteger)TokenTypeEOF, @"Token was not of type TokenTypeEOF");
+	[token release];
+}
+
+-(void) test03InitWithTokenType
+{
+	CommonToken *token = [[CommonToken newToken:TokenTypeUP] retain];
+	token.text = @"<UP>";
+	STAssertNotNil(token, @"Token was nil");
+	STAssertEquals(token.type, (NSInteger)TokenTypeUP, @"Token was not of type TokenTypeUP");
+	STAssertNotNil(token.text, @"Token text was nil, was expecting <UP>");
+	STAssertTrue([token.text isEqualToString:@"<UP>"], @"Token text was not <UP> was instead: %@", token.text);
+	[token release];
+}
+
+-(void) test04InitWithTokenTypeAndText
+{
+	CommonToken *token = [[CommonToken newToken:TokenTypeUP Text:@"<UP>"] retain];
+	STAssertNotNil(token, @"Token was nil");
+	STAssertEquals(token.type, (NSInteger)TokenTypeUP, @"Token was not of type TokenTypeUP");
+	STAssertNotNil(token.text, @"Token text was nil, was expecting <UP>");
+	STAssertTrue([token.text isEqualToString:@"<UP>"], @"Token text was not <UP> was instead: %@", token.text);
+	[token release];
+}
+
+-(void) test05InitWithCharStream
+{
+	ANTLRStringStream *stream = [[ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"] retain];
+	CommonToken *token = [[CommonToken newToken:stream Type:555 Channel:TokenChannelDefault Start:4 Stop:5] retain];
+	STAssertNotNil(token, @"Token was nil");
+	STAssertEquals(token.type, (NSInteger)555, @"Token was not of type 555"); // Nice random type number
+	STAssertNotNil(token.text, @"Token text was nil, was expecting ||");
+	STAssertTrue([token.text isEqualToString:@"||"], @"Token text was not || was instead: %@", token.text);
+	[token release];
+    [stream release];
+}
+
+-(void) test06InitWithToken
+{
+	ANTLRStringStream *stream = [[ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"] retain];
+	CommonToken *token = [[CommonToken newToken:stream Type:555 Channel:TokenChannelDefault Start:4 Stop:5] retain];
+	STAssertNotNil(token, @"Token was nil");
+	STAssertEquals(token.type, (NSInteger)555, @"Token was not of type 555"); // Nice random type number
+	STAssertNotNil(token.text, @"Token text was nil, was expecting ||");
+	STAssertTrue([token.text isEqualToString:@"||"], @"Token text was not || was instead: %@", token.text);
+	
+	CommonToken *newToken = [[CommonToken newTokenWithToken:token] retain];
+	STAssertNotNil(newToken, @"New token is nil!");
+	STAssertEquals(newToken.type, token.type, @"Tokens types do not match %d:%d!", newToken.type, token.type);
+	STAssertEquals(newToken.line, token.line, @"Token lines do not match!");
+	STAssertEquals(newToken.index, token.index, @"Token indexes do not match");
+	STAssertEquals(newToken.channel, token.channel, @"Token channels are not the same");
+	STAssertEquals(newToken.charPositionInLine, token.charPositionInLine, @"Token char positions in lines do not match");
+	STAssertEquals(newToken.startIndex, token.startIndex, @"Token start positions do not match");
+	STAssertEquals(newToken.stopIndex, token.stopIndex, @"Token stop positions do not match");
+	STAssertTrue([newToken.text isEqualToString:token.text], @"Token text does not match!");
+	[token release];
+	[newToken release];
+    [stream release];
+}
+
+-(void) test07TokenDescription
+{
+    NSString *aDescription;
+	ANTLRStringStream *stream = [[ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"] retain];
+	CommonToken *token = [[CommonToken newToken:stream Type:555 Channel:TokenChannelDefault Start:4 Stop:5] retain];
+    aDescription = [token description];
+	STAssertTrue([aDescription isEqualToString:@"[@0, 4:5='||',<555>,0:0]"], @"String description for token is not correct! got %@", aDescription);
+    [token release];
+    [stream release];
+}
+
+@end
diff --git a/runtime/ObjC/Framework/test/runtime/tree/ANTLRCommonErrorNodeTest.m b/runtime/ObjC/Framework/test/runtime/tree/ANTLRCommonErrorNodeTest.m
deleted file mode 100755
index b5d1c8a..0000000
--- a/runtime/ObjC/Framework/test/runtime/tree/ANTLRCommonErrorNodeTest.m
+++ /dev/null
@@ -1,14 +0,0 @@
-//
-//  ANTLRCommonErrorNodeTest.m
-//  ANTLR
-//
-//  Created by Ian Michell on 10/06/2010.
-//  Copyright 2010 Ian Michell. All rights reserved.
-//
-
-#import "ANTLRCommonErrorNodeTest.h"
-
-
-@implementation ANTLRCommonErrorNodeTest
-
-@end
diff --git a/runtime/ObjC/Framework/test/runtime/tree/ANTLRCommonTreeAdaptorTest.h b/runtime/ObjC/Framework/test/runtime/tree/ANTLRCommonTreeAdaptorTest.h
deleted file mode 100755
index 7326675..0000000
--- a/runtime/ObjC/Framework/test/runtime/tree/ANTLRCommonTreeAdaptorTest.h
+++ /dev/null
@@ -1,16 +0,0 @@
-//
-//  ANTLRCommonTreeAdaptorTest.h
-//  ANTLR
-//
-//  Created by Ian Michell on 10/06/2010.
-//  Copyright 2010 Ian Michell. All rights reserved.
-//
-
-#import <SenTestingKit/SenTestingKit.h>
-
-
-@interface ANTLRCommonTreeAdaptorTest : SenTestCase {
-
-}
-
-@end
diff --git a/runtime/ObjC/Framework/test/runtime/tree/ANTLRCommonTreeAdaptorTest.m b/runtime/ObjC/Framework/test/runtime/tree/ANTLRCommonTreeAdaptorTest.m
deleted file mode 100755
index 9c9a7bb..0000000
--- a/runtime/ObjC/Framework/test/runtime/tree/ANTLRCommonTreeAdaptorTest.m
+++ /dev/null
@@ -1,14 +0,0 @@
-//
-//  ANTLRCommonTreeAdaptorTest.m
-//  ANTLR
-//
-//  Created by Ian Michell on 10/06/2010.
-//  Copyright 2010 Ian Michell. All rights reserved.
-//
-
-#import "ANTLRCommonTreeAdaptorTest.h"
-
-
-@implementation ANTLRCommonTreeAdaptorTest
-
-@end
diff --git a/runtime/ObjC/Framework/test/runtime/tree/ANTLRCommonTreeTest.h b/runtime/ObjC/Framework/test/runtime/tree/ANTLRCommonTreeTest.h
deleted file mode 100644
index 36d23b3..0000000
--- a/runtime/ObjC/Framework/test/runtime/tree/ANTLRCommonTreeTest.h
+++ /dev/null
@@ -1,42 +0,0 @@
-//
-//  ANTLRCommonTreeTest.h
-//  ANTLR
-//
-//  Created by Ian Michell on 26/05/2010.
-//  Copyright 2010 Ian Michell and Alan Condit. All rights reserved.
-//
-
-#import <SenTestingKit/SenTestingKit.h>
-
-
-@interface ANTLRCommonTreeTest : SenTestCase 
-{
-}
-
--(void) test01InitAndRelease;
--(void) test02InitWithTree;
--(void) test03WithToken;
--(void) test04InvalidTreeNode;
--(void) test05InitWithCommonTreeNode;
--(void) test06CopyTree;
--(void) test07Description;
--(void) test08Text;
--(void) test09AddChild;
--(void) test10AddChildren;
--(void) test11AddSelfAsChild;
--(void) test12AddEmptyChildWithNoChildren;
--(void) test13AddEmptyChildWithChildren;
--(void) test14ChildAtIndex;
--(void) test15SetChildAtIndex;
--(void) test16GetAncestor;
--(void) test17FirstChildWithType;
--(void) test18SanityCheckParentAndChildIndexesForParentTree;
--(void) test19DeleteChild;
--(void) test20TreeDescriptions;
--(void) test21ReplaceChildrenAtIndexWithNoChildren;
--(void) test22ReplaceChildrenAtIndex;
--(void) test23ReplaceChildrenAtIndexWithChild;
--(void) test24ReplacechildrenAtIndexWithLessChildren;
--(void) test25ReplacechildrenAtIndexWithMoreChildren;
-
-@end
diff --git a/runtime/ObjC/Framework/test/runtime/tree/ANTLRCommonTreeTest.m b/runtime/ObjC/Framework/test/runtime/tree/ANTLRCommonTreeTest.m
deleted file mode 100644
index b944721..0000000
--- a/runtime/ObjC/Framework/test/runtime/tree/ANTLRCommonTreeTest.m
+++ /dev/null
@@ -1,555 +0,0 @@
-//
-//  ANTLRCommonTreeTest.m
-//  ANTLR
-//
-//  Created by Ian Michell on 26/05/2010.
-//  Copyright 2010 Ian Michell. All rights reserved.
-//
-
-#import "ANTLRBaseTree.h"
-#import "ANTLRCommonTreeTest.h"
-#import "ANTLRStringStream.h"
-#import "ANTLRCommonTree.h"
-#import "ANTLRCommonToken.h"
-#import "ANTLRError.h"
-#import "ANTLRRuntimeException.h"
-
-@implementation ANTLRCommonTreeTest
-
--(void) test01InitAndRelease
-{
-	ANTLRCommonTree *tree = [ANTLRCommonTree newTree];
-	STAssertNotNil(tree, @"Tree was nil");
-	// FIXME: It doesn't do anything else, perhaps initWithTree should set something somewhere, java says no though...
-    return;
-}
-
--(void) test02InitWithTree
-{
-	ANTLRCommonTree *tree = [ANTLRCommonTree newTree];
-	STAssertNotNil(tree, @"Tree was nil");
-    if (tree != nil)
-        STAssertEquals([tree getType], (NSInteger)ANTLRTokenTypeInvalid, @"Tree should have an invalid token type, because it has no token");
-    // [tree release];
-    return;
-}
-
--(void) test03WithToken
-{
-	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"];
-	ANTLRCommonToken *token = [ANTLRCommonToken newToken:stream Type:555 Channel:ANTLRTokenChannelDefault Start:4 Stop:5];
-	token.line = 1;
-	token.charPositionInLine = 4;
-	ANTLRCommonTree *tree = [ANTLRCommonTree newTreeWithToken:token];
-	STAssertNotNil(tree, @"Tree was nil");
-    if (tree != nil)
-        STAssertNotNil(tree.token, @"Tree with token was nil");
-    if (tree != nil && tree.token != nil) {
-        STAssertEquals((NSUInteger) tree.token.line, (NSUInteger)1, [NSString stringWithFormat:@"Tree should be at line 1, but was at %d", tree.token.line] );
-        STAssertEquals((NSUInteger) tree.token.charPositionInLine, (NSUInteger)4, [NSString stringWithFormat:@"Char position should be 1, but was at %d", tree.token.charPositionInLine]);
-        STAssertNotNil(((ANTLRCommonToken *)tree.token).text, @"Tree with token with text was nil");
-    }
-    if (tree != nil && tree.token != nil && tree.token.text != nil)
-        STAssertTrue([tree.token.text isEqualToString:@"||"], @"Text was not ||");
-	//[tree release];
-    return;
-}
-
--(void) test04InvalidTreeNode
-{
-	ANTLRCommonTree *tree = [ANTLRCommonTree newTreeWithToken:[ANTLRCommonToken invalidToken]];
-	STAssertNotNil(tree, @"Tree was nil");
-	STAssertEquals(tree.token.type, (NSInteger)ANTLRTokenTypeInvalid, @"Tree Token type was not ANTLRTokenTypeInvalid");
-	//[tree release];
-    return;
-}
-
--(void) test05InitWithCommonTreeNode
-{
-	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"];
-	ANTLRCommonToken *token = [ANTLRCommonToken newToken:stream Type:555 Channel:ANTLRTokenChannelDefault Start:4 Stop:5];
-	ANTLRCommonTree *tree = [ANTLRCommonTree newTreeWithToken:token];
-	STAssertNotNil(tree, @"Tree was nil");
-	STAssertNotNil(tree.token, @"Tree token was nil");
-	ANTLRCommonTree *newTree = [ANTLRCommonTree newTreeWithTree:tree];
-	STAssertNotNil(newTree, @"New tree was nil");
-	STAssertNotNil(newTree.token, @"New tree token was nil");
-	STAssertEquals(newTree.token, tree.token, @"Tokens did not match");
-	STAssertEquals(newTree.startIndex, tree.startIndex, @"Token start index did not match %d:%d", newTree.startIndex, tree.startIndex);
-	STAssertEquals(newTree.stopIndex, tree.stopIndex, @"Token stop index did not match %d:%d", newTree.stopIndex, tree.stopIndex);
-	//[stream release];
-	//[tree release];
-	//[newTree release];
-	//[token release];
-    return;
-}
-
--(void) test06CopyTree
-{
-	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"];
-	ANTLRCommonToken *token = [ANTLRCommonToken newToken:stream Type:555 Channel:ANTLRTokenChannelDefault Start:4 Stop:5];
-	ANTLRCommonTree *tree = [ANTLRCommonTree newTreeWithToken:token];
-	STAssertNotNil(tree, @"Tree was nil");
-	ANTLRCommonTree *newTree = (ANTLRCommonTree *)[tree copyWithZone:nil];
-	STAssertTrue([newTree isKindOfClass:[ANTLRCommonTree class]], @"Copied tree was not an ANTLRCommonTree");
-	STAssertNotNil(newTree, @"New tree was nil");
-	// STAssertEquals(newTree.token, tree.token, @"Tokens did not match");
-	STAssertEquals(newTree.stopIndex, tree.stopIndex, @"Token stop index did not match");
-	STAssertEquals(newTree.startIndex, tree.startIndex, @"Token start index did not match");
-	//[stream release];
-	//[tree release];
-	//[newTree release];
-	// [token release];
-    return;
-}
-
--(void) test07Description
-{
-    NSString *aString;
-	ANTLRCommonTree *errorTree = [ANTLRCommonTree invalidNode];
-	STAssertNotNil(errorTree, @"Error tree node is nil");
-    if (errorTree != nil) {
-        aString = [errorTree description];
-        STAssertNotNil( aString, @"errorTree description returned nil");
-        if (aString != nil)
-            STAssertTrue([aString isEqualToString:@"<errornode>"], @"Not a valid error node description %@", aString);
-    }
-	//[errorTree release];
-	
-	ANTLRCommonTree *tree = [ANTLRCommonTree newTreeWithTokenType:ANTLRTokenTypeUP];
-	STAssertNotNil(tree, @"Tree is nil");
-    if (tree != nil)
-        STAssertNil([tree description], @"Tree description was not nil, was: %@", [tree description]);
-	//[tree release];
-	
-	tree = [ANTLRCommonTree newTree];
-	STAssertNotNil(tree, @"Tree is nil");
-    if (tree != nil) {
-        aString = [tree description];
-        STAssertNotNil(aString, @"tree description returned nil");
-        if (aString != nil)
-            STAssertTrue([aString isEqualToString:@"nil"], @"Tree description was not empty", [tree description]);
-    }
-	//[tree release];
-	
-	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"];
-	ANTLRCommonToken *token = [ANTLRCommonToken newToken:stream Type:555 Channel:ANTLRTokenChannelDefault Start:4 Stop:5];
-	tree = [ANTLRCommonTree newTreeWithToken:token];
-	STAssertNotNil(tree, @"Tree node is nil");
-    aString = [tree description];
-    STAssertNotNil(aString, @"tree description returned nil");
-    if (aString != nil)
-        STAssertTrue([aString isEqualToString:@"||"], @"description was not || was instead %@", [tree description]);
-	//[tree release];
-    return;
-}
-
--(void) test08Text
-{
-	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"];
-	ANTLRCommonToken *token = [ANTLRCommonToken newToken:stream Type:555 Channel:ANTLRTokenChannelDefault Start:4 Stop:5];
-	ANTLRCommonTree *tree = [ANTLRCommonTree newTreeWithToken:token];
-	STAssertNotNil(tree, @"Tree was nil");
-	STAssertTrue([tree.token.text isEqualToString:@"||"], @"Tree text was not valid, should have been || was %@", tree.token.text);
-	//[tree release];
-	
-	// test nil (for line coverage)
-	tree = [ANTLRCommonTree newTree];
-	STAssertNotNil(tree, @"Tree was nil");
-	STAssertNil(tree.token.text, @"Tree text was not nil: %@", tree.token.text);
-    return;
-}
-
--(void) test09AddChild
-{
-	// Create a new tree
-	ANTLRCommonTree *parent = [ANTLRCommonTree newTreeWithTokenType:555];
-    parent.token.line = 1;
-	parent.token.charPositionInLine = 1;
-	
-	// Child tree
-	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"];
-	ANTLRCommonToken *token = [ANTLRCommonToken newToken:stream Type:555 Channel:ANTLRTokenChannelDefault Start:4 Stop:5];
-	token.line = 1;
-	token.charPositionInLine = 4;
-	ANTLRCommonTree *tree = [ANTLRCommonTree newTreeWithToken:token];
-	
-	// Add a child to the parent tree
-	[parent addChild:tree];
-
-
-	STAssertNotNil(parent, @"parent was nil");
-    if (parent != nil)
-        STAssertNotNil(parent.token, @"parent was nil");
-	STAssertEquals((NSInteger)parent.token.line, (NSInteger)1, @"Tree should be at line 1 but is %d", parent.token.line);
-	STAssertEquals((NSInteger)parent.token.charPositionInLine, (NSInteger)1, @"Char position should be 1 but is %d", parent.token.charPositionInLine);
-	
-	STAssertEquals((NSInteger)[parent getChildCount], (NSInteger)1, @"There should be 1 child but there were %d", [parent getChildCount]);
-	STAssertEquals((NSInteger)[[parent getChild:0] getChildIndex], (NSInteger)0, @"Child index should be 0 was : %d", [[parent getChild:0] getChildIndex]);
-	STAssertEquals([[parent getChild:0] getParent], parent, @"Parent not set for child");
-	
-	//[parent release];
-    return;
-}
-
--(void) test10AddChildren
-{
-	// Create a new tree
-	ANTLRCommonTree *parent = [ANTLRCommonTree newTree];
-	
-	// Child tree
-	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"];
-	ANTLRCommonToken *token = [ANTLRCommonToken newToken:stream Type:555 Channel:ANTLRTokenChannelDefault Start:4 Stop:5];
-	token.line = 1;
-	token.charPositionInLine = 4;
-	ANTLRCommonTree *tree = [ANTLRCommonTree newTreeWithToken:token];
-	
-	// Add a child to the parent tree
-	[parent addChild: tree];
-	
-	ANTLRCommonTree *newParent = [ANTLRCommonTree newTree];
-	[newParent addChildren:parent.children];
-	
-	STAssertEquals([newParent getChild:0], [parent getChild:0], @"Children did not match");
-    return;
-}
-
--(void) test11AddSelfAsChild
-{
-	ANTLRCommonTree *parent = [ANTLRCommonTree newTree];
-	@try 
-	{
-		[parent addChild:parent];
-	}
-	@catch (NSException *e) 
-	{
-		STAssertTrue([[e name] isEqualToString:@"ANTLRIllegalArgumentException"], @"Got wrong kind of exception! %@", [e name]);
-		//[parent release];
-		return;
-	}
-	STFail(@"Did not get an exception when adding an empty child!");
-    return;
-}
-
--(void) test12AddEmptyChildWithNoChildren
-{
-	ANTLRCommonTree *emptyChild = [ANTLRCommonTree newTree];
-	ANTLRCommonTree *parent = [ANTLRCommonTree newTree];
-	[parent addChild:emptyChild];
-	STAssertEquals((NSInteger)[parent getChildCount], (NSInteger)0, @"There were supposed to be no children!");
-	//[parent release];
-	//[emptyChild release];
-    return;
-}
-
--(void) test13AddEmptyChildWithChildren
-{
-	// Create a new tree
-	ANTLRCommonTree *parent = [ANTLRCommonTree newTree];
-	
-	// Child tree
-	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"];
-	ANTLRCommonToken *token = [ANTLRCommonToken newToken:stream Type:555 Channel:ANTLRTokenChannelDefault Start:4 Stop:5];
-	token.line = 1;
-	token.charPositionInLine = 4;
-	ANTLRCommonTree *tree = [ANTLRCommonTree newTreeWithToken:token];
-	
-	// Add a child to the parent tree
-	[parent addChild: tree];
-	
-	ANTLRCommonTree *newParent = [ANTLRCommonTree newTree];
-	[newParent addChild:parent];
-	
-	STAssertEquals((NSInteger)[newParent getChildCount], (NSInteger)1, @"Parent should only have 1 child: %d", [newParent getChildCount]);
-	STAssertEquals([newParent getChild:0], tree, @"Child was not the correct object.");
-	//[parent release];
-	//[newParent release];
-	//[tree release];
-    return;
-}
-
--(void) test14ChildAtIndex
-{
-	// Create a new tree
-	ANTLRCommonTree *parent = [ANTLRCommonTree newTree];
-	
-	// Child tree
-	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"];
-	ANTLRCommonToken *token = [ANTLRCommonToken newToken:stream Type:555 Channel:ANTLRTokenChannelDefault Start:4 Stop:5];
-	ANTLRCommonTree *tree = [ANTLRCommonTree newTreeWithToken:token];
-	
-	// Add a child to the parent tree
-	[parent addChild: tree];
-	
-	STAssertEquals((NSInteger)[parent getChildCount], (NSInteger)1, @"There were either no children or more than 1: %d", [parent getChildCount]);
-	
-	ANTLRCommonTree *child = [parent getChild:0];
-	STAssertNotNil(child, @"Child at index 0 should not be nil");
-	STAssertEquals(child, tree, @"Child and Original tree were not the same");
-	//[parent release];
-    return;
-}
-
--(void) test15SetChildAtIndex
-{
-	ANTLRCommonTree *parent = [ANTLRCommonTree newTree];
-	
-	// Child tree
-	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"];
-	ANTLRCommonToken *token = [ANTLRCommonToken newToken:stream Type:555 Channel:ANTLRTokenChannelDefault Start:4 Stop:5];
-	ANTLRCommonTree *tree = [ANTLRCommonTree newTreeWithToken:token];
-	
-	
-	tree = [ANTLRCommonTree newTreeWithTokenType:ANTLRTokenTypeUP];
-	tree.token.text = @"<UP>";
-	[parent addChild:tree];
-	
-	STAssertTrue([parent getChild:0] == tree, @"Trees don't match");
-	[parent setChild:0 With:tree];
-	
-	ANTLRCommonTree *child = [parent getChild:0];
-	STAssertTrue([parent getChildCount] == 1, @"There were either no children or more than 1: %d", [parent getChildCount]);
-	STAssertNotNil(child, @"Child at index 0 should not be nil");
-	STAssertEquals(child, tree, @"Child and Original tree were not the same");
-	//[parent release];
-    return;
-}
-
--(void) test16GetAncestor
-{
-	ANTLRCommonTree *parent = [ANTLRCommonTree newTreeWithTokenType:ANTLRTokenTypeUP];
-	parent.token.text = @"<UP>";
-	
-	ANTLRCommonTree *down = [ANTLRCommonTree newTreeWithTokenType:ANTLRTokenTypeDOWN];
-	down.token.text = @"<DOWN>";
-	
-	[parent addChild:down];
-	
-	// Child tree
-	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"];
-	ANTLRCommonToken *token = [ANTLRCommonToken newToken:stream Type:555 Channel:ANTLRTokenChannelDefault Start:4 Stop:5];
-	ANTLRCommonTree *tree = [ANTLRCommonTree newTreeWithToken:token];
-	
-	[down addChild:tree];
-	STAssertTrue([tree hasAncestor:ANTLRTokenTypeUP], @"Should have an ancestor of type ANTLRTokenTypeUP");
-	
-	ANTLRCommonTree *ancestor = [tree getAncestor:ANTLRTokenTypeUP];
-	STAssertNotNil(ancestor, @"Ancestor should not be nil");
-	STAssertEquals(ancestor, parent, @"Acenstors do not match");
-	//[parent release];
-    return;
-}
-
--(void) test17FirstChildWithType
-{
-	// Create a new tree
-	ANTLRCommonTree *parent = [ANTLRCommonTree newTree];
-	
-	ANTLRCommonTree *up = [ANTLRCommonTree newTreeWithTokenType:ANTLRTokenTypeUP];
-	ANTLRCommonTree *down = [ANTLRCommonTree newTreeWithTokenType:ANTLRTokenTypeDOWN];
-	
-	[parent addChild:up];
-	[parent addChild:down];
-	
-	ANTLRCommonTree *found = (ANTLRCommonTree *)[parent getFirstChildWithType:ANTLRTokenTypeDOWN];
-	STAssertNotNil(found, @"Child with type DOWN should not be nil");
-    if (found != nil) {
-        STAssertNotNil(found.token, @"Child token with type DOWN should not be nil");
-        if (found.token != nil)
-            STAssertEquals((NSInteger)found.token.type, (NSInteger)ANTLRTokenTypeDOWN, @"Token type was not correct, should be down!");
-    }
-	found = (ANTLRCommonTree *)[parent getFirstChildWithType:ANTLRTokenTypeUP];
-	STAssertNotNil(found, @"Child with type UP should not be nil");
-    if (found != nil) {
-        STAssertNotNil(found.token, @"Child token with type UP should not be nil");
-        if (found.token != nil)
-            STAssertEquals((NSInteger)found.token.type, (NSInteger)ANTLRTokenTypeUP, @"Token type was not correct, should be up!");
-    }
-	//[parent release];
-    return;
-}
-
--(void) test18SanityCheckParentAndChildIndexesForParentTree
-{
-	// Child tree
-	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"];
-	ANTLRCommonToken *token = [ANTLRCommonToken newToken:stream Type:555 Channel:ANTLRTokenChannelDefault Start:4 Stop:5];
-	ANTLRCommonTree *tree = [ANTLRCommonTree newTreeWithToken:token];
-	
-	ANTLRCommonTree *parent = [ANTLRCommonTree newTreeWithTokenType:555];
-	STAssertNotNil(tree, @"tree should not be nil");
-	@try 
-	{
-		[tree sanityCheckParentAndChildIndexes];
-	}
-	@catch (NSException * e) 
-	{
-		STFail(@"Exception was thrown and this is not what's right...");
-	}
-	
-	BOOL passed = NO;
-	@try 
-	{
-		[tree sanityCheckParentAndChildIndexes:parent At:0];
-	}
-	@catch (NSException * e) 
-	{
-		STAssertTrue([[e name] isEqualToString:@"ANTLRIllegalStateException"], @"Exception was not an ANTLRIllegalStateException but was %@", [e name]);
-		passed = YES;
-	}
-	if (!passed)
-	{
-		STFail(@"An exception should have been thrown");
-	}
-	
-	STAssertNotNil(parent, @"parent should not be nil");
-	[parent addChild:tree];
-	@try 
-	{
-		[tree sanityCheckParentAndChildIndexes:parent At:0];
-	}
-	@catch (NSException * e) 
-	{
-		STFail(@"No exception should have been thrown!");
-	}
-    return;
-}
-
--(void) test19DeleteChild
-{
-	// Child tree
-	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"];
-	ANTLRCommonToken *token = [ANTLRCommonToken newToken:stream Type:555 Channel:ANTLRTokenChannelDefault Start:4 Stop:5];
-	ANTLRCommonTree *tree = [ANTLRCommonTree newTreeWithToken:token];
-	
-	ANTLRCommonTree *parent = [ANTLRCommonTree newTree];
-	[parent addChild:tree];
-	
-	ANTLRCommonTree *deletedChild = [parent deleteChild:0];
-	STAssertEquals(deletedChild, tree, @"Children do not match!");
-	STAssertEquals((NSInteger)[parent getChildCount], (NSInteger)0, @"Child count should be zero!");
-    return;
-}
-
--(void) test20TreeDescriptions
-{
-	// Child tree
-	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"];
-	ANTLRCommonToken *token = [ANTLRCommonToken newToken:stream Type:555 Channel:ANTLRTokenChannelDefault Start:4 Stop:5];
-	ANTLRCommonTree *tree = [ANTLRCommonTree newTreeWithToken:token];
-	
-	// Description for tree
-	NSString *treeDesc = [tree treeDescription];
-    STAssertNotNil(treeDesc, @"Tree description should not be nil");
-    STAssertTrue([treeDesc isEqualToString:@"||"], @"Tree description was not || but rather %@", treeDesc);
-	
-	ANTLRCommonTree *parent = [ANTLRCommonTree newTree];
-	STAssertTrue([[parent treeDescription] isEqualToString:@"nil"], @"Tree description was not nil was %@", [parent treeDescription]);
-	[parent addChild:tree];
-	treeDesc = [parent treeDescription];
-	STAssertTrue([treeDesc isEqualToString:@"||"], @"Tree description was not || but was: %@", treeDesc);
-	
-	// Test non empty parent
-	ANTLRCommonTree *down = [ANTLRCommonTree newTreeWithTokenType:ANTLRTokenTypeDOWN];
-	down.token.text = @"<DOWN>";
-	
-	[tree addChild:down];
-	treeDesc = [parent treeDescription];
-	STAssertTrue([treeDesc isEqualToString:@"(|| <DOWN>)"], @"Tree description was wrong expected (|| <DOWN>) but got: %@", treeDesc);
-    return;
-}
-
--(void) test21ReplaceChildrenAtIndexWithNoChildren
-{
-	ANTLRCommonTree *parent = [ANTLRCommonTree newTree];
-	ANTLRCommonTree *parent2 = [ANTLRCommonTree newTree];
-	ANTLRCommonTree *child = [ANTLRCommonTree newTreeWithTokenType:ANTLRTokenTypeDOWN];
-	child.token.text = @"<DOWN>";
-	[parent2 addChild:child];
-	@try 
-	{
-		[parent replaceChildrenFrom:1 To:2 With:parent2];
-	}
-	@catch (NSException *ex)
-	{
-		STAssertTrue([[ex name] isEqualToString:@"ANTLRIllegalArgumentException"], @"Expected an illegal argument exception... Got instead: %@", [ex name]);
-		return;
-	}
-	STFail(@"Exception was not thrown when I tried to replace a child on a parent with no children");
-    return;
-}
-
--(void) test22ReplaceChildrenAtIndex
-{
-	ANTLRCommonTree *parent1 = [ANTLRCommonTree newTree];
-	ANTLRCommonTree *child1 = [ANTLRCommonTree newTreeWithTokenType:ANTLRTokenTypeUP];
-	[parent1 addChild:child1];
-	ANTLRCommonTree *parent2 = [ANTLRCommonTree newTree];
-	ANTLRCommonTree *child2 = [ANTLRCommonTree newTreeWithTokenType:ANTLRTokenTypeDOWN];
-	child2.token.text = @"<DOWN>";
-	[parent2 addChild:child2];
-	
-	[parent2 replaceChildrenFrom:0 To:0 With:parent1];
-	
-	STAssertEquals([parent2 getChild:0], child1, @"Child for parent 2 should have been from parent 1");
-    return;
-}
-
--(void) test23ReplaceChildrenAtIndexWithChild
-{
-	ANTLRCommonTree *replacement = [ANTLRCommonTree newTreeWithTokenType:ANTLRTokenTypeUP];
-	replacement.token.text = @"<UP>";
-	ANTLRCommonTree *parent = [ANTLRCommonTree newTree];
-	ANTLRCommonTree *child = [ANTLRCommonTree newTreeWithTokenType:ANTLRTokenTypeDOWN];
-	child.token.text = @"<DOWN>";
-	[parent addChild:child];
-	
-	[parent replaceChildrenFrom:0 To:0 With:replacement];
-	
-	STAssertTrue([parent getChild:0] == replacement, @"Children do not match");
-    return;
-}
-
--(void) test24ReplacechildrenAtIndexWithLessChildren
-{
-	ANTLRCommonTree *parent1 = [ANTLRCommonTree newTree];
-	ANTLRCommonTree *child1 = [ANTLRCommonTree newTreeWithTokenType:ANTLRTokenTypeUP];
-	[parent1 addChild:child1];
-	
-	ANTLRCommonTree *parent2 = [ANTLRCommonTree newTree];
-	
-	ANTLRCommonTree *child2 = [ANTLRCommonTree newTreeWithTokenType:ANTLRTokenTypeEOF];
-	[parent2 addChild:child2];
-	
-	ANTLRCommonTree *child3 = [ANTLRCommonTree newTreeWithTokenType:ANTLRTokenTypeDOWN];
-	child2.token.text = @"<DOWN>";
-	[parent2 addChild:child3];
-	
-	[parent2 replaceChildrenFrom:0 To:1 With:parent1];
-	STAssertEquals((NSInteger)[parent2 getChildCount], (NSInteger)1, @"Should have one child but has %d", [parent2 getChildCount]);
-	STAssertEquals([parent2 getChild:0], child1, @"Child for parent 2 should have been from parent 1");
-    return;
-}
-
--(void) test25ReplacechildrenAtIndexWithMoreChildren
-{
-	ANTLRCommonTree *parent1 = [ANTLRCommonTree newTree];
-	ANTLRCommonTree *child1 = [ANTLRCommonTree newTreeWithTokenType:ANTLRTokenTypeUP];
-	[parent1 addChild:child1];
-	ANTLRCommonTree *child2 = [ANTLRCommonTree newTreeWithTokenType:ANTLRTokenTypeEOF];
-	[parent1 addChild:child2];
-	
-	ANTLRCommonTree *parent2 = [ANTLRCommonTree newTree];
-	
-	ANTLRCommonTree *child3 = [ANTLRCommonTree newTreeWithTokenType:ANTLRTokenTypeDOWN];
-	child2.token.text = @"<DOWN>";
-	[parent2 addChild:child3];
-	
-	[parent2 replaceChildrenFrom:0 To:0 With:parent1];
-	STAssertEquals((NSInteger)[parent2 getChildCount], (NSInteger)2, @"Should have one child but has %d", [parent2 getChildCount]);
-	STAssertEquals([parent2 getChild:0], child1, @"Child for parent 2 should have been from parent 1");
-	STAssertEquals([parent2 getChild:1], child2, @"An extra child (child2) should be in the children collection");
-    return;
-}
-
-@end
diff --git a/runtime/ObjC/Framework/test/runtime/tree/ANTLRCommonErrorNodeTest.h b/runtime/ObjC/Framework/test/runtime/tree/CommonErrorNodeTest.h
similarity index 100%
rename from runtime/ObjC/Framework/test/runtime/tree/ANTLRCommonErrorNodeTest.h
rename to runtime/ObjC/Framework/test/runtime/tree/CommonErrorNodeTest.h
diff --git a/runtime/ObjC/Framework/test/runtime/tree/CommonErrorNodeTest.m b/runtime/ObjC/Framework/test/runtime/tree/CommonErrorNodeTest.m
new file mode 100755
index 0000000..679646d
--- /dev/null
+++ b/runtime/ObjC/Framework/test/runtime/tree/CommonErrorNodeTest.m
@@ -0,0 +1,14 @@
+//
+//  ANTLRCommonErrorNodeTest.m
+//  ANTLR
+//
+//  Created by Ian Michell on 10/06/2010.
+//  Copyright 2010 Ian Michell. All rights reserved.
+//
+
+#import "CommonErrorNodeTest.h"
+
+
+@implementation ANTLRCommonErrorNodeTest
+
+@end
diff --git a/runtime/ObjC/Framework/test/runtime/tree/CommonTreeAdaptorTest.h b/runtime/ObjC/Framework/test/runtime/tree/CommonTreeAdaptorTest.h
new file mode 100755
index 0000000..85c0493
--- /dev/null
+++ b/runtime/ObjC/Framework/test/runtime/tree/CommonTreeAdaptorTest.h
@@ -0,0 +1,16 @@
+//
+//  CommonTreeAdaptorTest.h
+//  ANTLR
+//
+//  Created by Ian Michell on 10/06/2010.
+//  Copyright 2010 Ian Michell. All rights reserved.
+//
+
+#import <SenTestingKit/SenTestingKit.h>
+
+
+@interface CommonTreeAdaptorTest : SenTestCase {
+
+}
+
+@end
diff --git a/runtime/ObjC/Framework/test/runtime/tree/CommonTreeAdaptorTest.m b/runtime/ObjC/Framework/test/runtime/tree/CommonTreeAdaptorTest.m
new file mode 100755
index 0000000..f5bf007
--- /dev/null
+++ b/runtime/ObjC/Framework/test/runtime/tree/CommonTreeAdaptorTest.m
@@ -0,0 +1,14 @@
+//
+//  CommonTreeAdaptorTest.m
+//  ANTLR
+//
+//  Created by Ian Michell on 10/06/2010.
+//  Copyright 2010 Ian Michell. All rights reserved.
+//
+
+#import "CommonTreeAdaptorTest.h"
+
+
+@implementation CommonTreeAdaptorTest
+
+@end
diff --git a/runtime/ObjC/Framework/test/runtime/tree/CommonTreeTest.h b/runtime/ObjC/Framework/test/runtime/tree/CommonTreeTest.h
new file mode 100644
index 0000000..2e2f10d
--- /dev/null
+++ b/runtime/ObjC/Framework/test/runtime/tree/CommonTreeTest.h
@@ -0,0 +1,42 @@
+//
+//  CommonTreeTest.h
+//  ANTLR
+//
+//  Created by Ian Michell on 26/05/2010.
+//  Copyright 2010 Ian Michell and Alan Condit. All rights reserved.
+//
+
+#import <SenTestingKit/SenTestingKit.h>
+
+
+@interface CommonTreeTest : SenTestCase 
+{
+}
+
+-(void) test01InitAndRelease;
+-(void) test02InitWithTree;
+-(void) test03WithToken;
+-(void) test04InvalidTreeNode;
+-(void) test05InitWithCommonTreeNode;
+-(void) test06CopyTree;
+-(void) test07Description;
+-(void) test08Text;
+-(void) test09AddChild;
+-(void) test10AddChildren;
+-(void) test11AddSelfAsChild;
+-(void) test12AddEmptyChildWithNoChildren;
+-(void) test13AddEmptyChildWithChildren;
+-(void) test14ChildAtIndex;
+-(void) test15SetChildAtIndex;
+-(void) test16GetAncestor;
+-(void) test17FirstChildWithType;
+-(void) test18SanityCheckParentAndChildIndexesForParentTree;
+-(void) test19DeleteChild;
+-(void) test20TreeDescriptions;
+-(void) test21ReplaceChildrenAtIndexWithNoChildren;
+-(void) test22ReplaceChildrenAtIndex;
+-(void) test23ReplaceChildrenAtIndexWithChild;
+-(void) test24ReplacechildrenAtIndexWithLessChildren;
+-(void) test25ReplacechildrenAtIndexWithMoreChildren;
+
+@end
diff --git a/runtime/ObjC/Framework/test/runtime/tree/CommonTreeTest.m b/runtime/ObjC/Framework/test/runtime/tree/CommonTreeTest.m
new file mode 100644
index 0000000..4db2300
--- /dev/null
+++ b/runtime/ObjC/Framework/test/runtime/tree/CommonTreeTest.m
@@ -0,0 +1,555 @@
+//
+//  CommonTreeTest.m
+//  ANTLR
+//
+//  Created by Ian Michell on 26/05/2010.
+//  Copyright 2010 Ian Michell. All rights reserved.
+//
+
+#import <ANTLR/BaseTree.h>
+#import "CommonTreeTest.h"
+#import <ANTLR/ANTLRStringStream.h>
+#import <ANTLR/CommonTree.h>
+#import <ANTLR/CommonToken.h>
+#import <ANTLR/ANTLRError.h>
+#import <ANTLR/RuntimeException.h>
+
+@implementation CommonTreeTest
+
+-(void) test01InitAndRelease
+{
+	CommonTree *tree = [CommonTree newTree];
+	STAssertNotNil(tree, @"Tree was nil");
+	// FIXME: It doesn't do anything else, perhaps initWithTree should set something somewhere, java says no though...
+    return;
+}
+
+-(void) test02InitWithTree
+{
+	CommonTree *tree = [CommonTree newTree];
+	STAssertNotNil(tree, @"Tree was nil");
+    if (tree != nil)
+        STAssertEquals(tree.type, (NSInteger)TokenTypeInvalid, @"Tree should have an invalid token type, because it has no token");
+    // [tree release];
+    return;
+}
+
+-(void) test03WithToken
+{
+	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"];
+	CommonToken *token = [CommonToken newToken:stream Type:555 Channel:TokenChannelDefault Start:4 Stop:5];
+	token.line = 1;
+	token.charPositionInLine = 4;
+	CommonTree *tree = [CommonTree newTreeWithToken:token];
+	STAssertNotNil(tree, @"Tree was nil");
+    if (tree != nil)
+        STAssertNotNil(tree.token, @"Tree with token was nil");
+    if (tree != nil && tree.token != nil) {
+        STAssertEquals((NSUInteger) tree.token.line, (NSUInteger)1, [NSString stringWithFormat:@"Tree should be at line 1, but was at %d", tree.token.line] );
+        STAssertEquals((NSUInteger) tree.token.charPositionInLine, (NSUInteger)4, [NSString stringWithFormat:@"Char position should be 1, but was at %d", tree.token.charPositionInLine]);
+        STAssertNotNil(((CommonToken *)tree.token).text, @"Tree with token with text was nil");
+    }
+    if (tree != nil && tree.token != nil && tree.token.text != nil)
+        STAssertTrue([tree.token.text isEqualToString:@"||"], @"Text was not ||");
+	//[tree release];
+    return;
+}
+
+-(void) test04InvalidTreeNode
+{
+	CommonTree *tree = [CommonTree newTreeWithToken:[CommonToken invalidToken]];
+	STAssertNotNil(tree, @"Tree was nil");
+	STAssertEquals(tree.token.type, (NSInteger)TokenTypeInvalid, @"Tree Token type was not TokenTypeInvalid");
+	//[tree release];
+    return;
+}
+
+-(void) test05InitWithCommonTreeNode
+{
+	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"];
+	CommonToken *token = [CommonToken newToken:stream Type:555 Channel:TokenChannelDefault Start:4 Stop:5];
+	CommonTree *tree = [CommonTree newTreeWithToken:token];
+	STAssertNotNil(tree, @"Tree was nil");
+	STAssertNotNil(tree.token, @"Tree token was nil");
+	CommonTree *newTree = [CommonTree newTreeWithTree:tree];
+	STAssertNotNil(newTree, @"New tree was nil");
+	STAssertNotNil(newTree.token, @"New tree token was nil");
+	STAssertEquals(newTree.token, tree.token, @"Tokens did not match");
+	STAssertEquals(newTree.startIndex, tree.startIndex, @"Token start index did not match %d:%d", newTree.startIndex, tree.startIndex);
+	STAssertEquals(newTree.stopIndex, tree.stopIndex, @"Token stop index did not match %d:%d", newTree.stopIndex, tree.stopIndex);
+	//[stream release];
+	//[tree release];
+	//[newTree release];
+	//[token release];
+    return;
+}
+
+-(void) test06CopyTree
+{
+	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"];
+	CommonToken *token = [CommonToken newToken:stream Type:555 Channel:TokenChannelDefault Start:4 Stop:5];
+	CommonTree *tree = [CommonTree newTreeWithToken:token];
+	STAssertNotNil(tree, @"Tree was nil");
+	CommonTree *newTree = (CommonTree *)[tree copyWithZone:nil];
+	STAssertTrue([newTree isKindOfClass:[CommonTree class]], @"Copied tree was not an CommonTree");
+	STAssertNotNil(newTree, @"New tree was nil");
+	// STAssertEquals(newTree.token, tree.token, @"Tokens did not match");
+	STAssertEquals(newTree.stopIndex, tree.stopIndex, @"Token stop index did not match");
+	STAssertEquals(newTree.startIndex, tree.startIndex, @"Token start index did not match");
+	//[stream release];
+	//[tree release];
+	//[newTree release];
+	// [token release];
+    return;
+}
+
+-(void) test07Description
+{
+    NSString *aString;
+	CommonTree *errorTree = [CommonTree invalidNode];
+	STAssertNotNil(errorTree, @"Error tree node is nil");
+    if (errorTree != nil) {
+        aString = [errorTree description];
+        STAssertNotNil( aString, @"errorTree description returned nil");
+        if (aString != nil)
+            STAssertTrue([aString isEqualToString:@"<errornode>"], @"Not a valid error node description %@", aString);
+    }
+	//[errorTree release];
+	
+	CommonTree *tree = [CommonTree newTreeWithTokenType:TokenTypeUP];
+	STAssertNotNil(tree, @"Tree is nil");
+    if (tree != nil)
+        STAssertNil([tree description], @"Tree description was not nil, was: %@", [tree description]);
+	//[tree release];
+	
+	tree = [CommonTree newTree];
+	STAssertNotNil(tree, @"Tree is nil");
+    if (tree != nil) {
+        aString = [tree description];
+        STAssertNotNil(aString, @"tree description returned nil");
+        if (aString != nil)
+            STAssertTrue([aString isEqualToString:@"nil"], @"Tree description was not empty", [tree description]);
+    }
+	//[tree release];
+	
+	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"];
+	CommonToken *token = [CommonToken newToken:stream Type:555 Channel:TokenChannelDefault Start:4 Stop:5];
+	tree = [CommonTree newTreeWithToken:token];
+	STAssertNotNil(tree, @"Tree node is nil");
+    aString = [tree description];
+    STAssertNotNil(aString, @"tree description returned nil");
+    if (aString != nil)
+        STAssertTrue([aString isEqualToString:@"||"], @"description was not || was instead %@", [tree description]);
+	//[tree release];
+    return;
+}
+
+-(void) test08Text
+{
+	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"];
+	CommonToken *token = [CommonToken newToken:stream Type:555 Channel:TokenChannelDefault Start:4 Stop:5];
+	CommonTree *tree = [CommonTree newTreeWithToken:token];
+	STAssertNotNil(tree, @"Tree was nil");
+	STAssertTrue([tree.token.text isEqualToString:@"||"], @"Tree text was not valid, should have been || was %@", tree.token.text);
+	//[tree release];
+	
+	// test nil (for line coverage)
+	tree = [CommonTree newTree];
+	STAssertNotNil(tree, @"Tree was nil");
+	STAssertNil(tree.token.text, @"Tree text was not nil: %@", tree.token.text);
+    return;
+}
+
+-(void) test09AddChild
+{
+	// Create a new tree
+	CommonTree *parent = [CommonTree newTreeWithTokenType:555];
+    parent.token.line = 1;
+	parent.token.charPositionInLine = 1;
+	
+	// Child tree
+	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"];
+	CommonToken *token = [CommonToken newToken:stream Type:555 Channel:TokenChannelDefault Start:4 Stop:5];
+	token.line = 1;
+	token.charPositionInLine = 4;
+	CommonTree *tree = [CommonTree newTreeWithToken:token];
+	
+	// Add a child to the parent tree
+	[parent addChild:tree];
+
+
+	STAssertNotNil(parent, @"parent was nil");
+    if (parent != nil)
+        STAssertNotNil(parent.token, @"parent was nil");
+	STAssertEquals((NSInteger)parent.token.line, (NSInteger)1, @"Tree should be at line 1 but is %d", parent.token.line);
+	STAssertEquals((NSInteger)parent.token.charPositionInLine, (NSInteger)1, @"Char position should be 1 but is %d", parent.token.charPositionInLine);
+	
+	STAssertEquals((NSInteger)[parent getChildCount], (NSInteger)1, @"There should be 1 child but there were %d", [parent getChildCount]);
+	STAssertEquals((NSInteger)[[parent getChild:0] getChildIndex], (NSInteger)0, @"Child index should be 0 was : %d", [[parent getChild:0] getChildIndex]);
+	STAssertEquals([[parent getChild:0] getParent], parent, @"Parent not set for child");
+	
+	//[parent release];
+    return;
+}
+
+-(void) test10AddChildren
+{
+	// Create a new tree
+	CommonTree *parent = [CommonTree newTree];
+	
+	// Child tree
+	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"];
+	CommonToken *token = [CommonToken newToken:stream Type:555 Channel:TokenChannelDefault Start:4 Stop:5];
+	token.line = 1;
+	token.charPositionInLine = 4;
+	CommonTree *tree = [CommonTree newTreeWithToken:token];
+	
+	// Add a child to the parent tree
+	[parent addChild: tree];
+	
+	CommonTree *newParent = [CommonTree newTree];
+	[newParent addChildren:parent.children];
+	
+	STAssertEquals([newParent getChild:0], [parent getChild:0], @"Children did not match");
+    return;
+}
+
+-(void) test11AddSelfAsChild
+{
+	CommonTree *parent = [CommonTree newTree];
+	@try 
+	{
+		[parent addChild:parent];
+	}
+	@catch (NSException *e) 
+	{
+		STAssertTrue([[e name] isEqualToString:@"IllegalArgumentException"], @"Got wrong kind of exception! %@", [e name]);
+		//[parent release];
+		return;
+	}
+	STFail(@"Did not get an exception when adding an empty child!");
+    return;
+}
+
+-(void) test12AddEmptyChildWithNoChildren
+{
+	CommonTree *emptyChild = [CommonTree newTree];
+	CommonTree *parent = [CommonTree newTree];
+	[parent addChild:emptyChild];
+	STAssertEquals((NSInteger)[parent getChildCount], (NSInteger)0, @"There were supposed to be no children!");
+	//[parent release];
+	//[emptyChild release];
+    return;
+}
+
+-(void) test13AddEmptyChildWithChildren
+{
+	// Create a new tree
+	CommonTree *parent = [CommonTree newTree];
+	
+	// Child tree
+	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"];
+	CommonToken *token = [CommonToken newToken:stream Type:555 Channel:TokenChannelDefault Start:4 Stop:5];
+	token.line = 1;
+	token.charPositionInLine = 4;
+	CommonTree *tree = [CommonTree newTreeWithToken:token];
+	
+	// Add a child to the parent tree
+	[parent addChild: tree];
+	
+	CommonTree *newParent = [CommonTree newTree];
+	[newParent addChild:parent];
+	
+	STAssertEquals((NSInteger)[newParent getChildCount], (NSInteger)1, @"Parent should only have 1 child: %d", [newParent getChildCount]);
+	STAssertEquals([newParent getChild:0], tree, @"Child was not the correct object.");
+	//[parent release];
+	//[newParent release];
+	//[tree release];
+    return;
+}
+
+-(void) test14ChildAtIndex
+{
+	// Create a new tree
+	CommonTree *parent = [CommonTree newTree];
+	
+	// Child tree
+	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"];
+	CommonToken *token = [CommonToken newToken:stream Type:555 Channel:TokenChannelDefault Start:4 Stop:5];
+	CommonTree *tree = [CommonTree newTreeWithToken:token];
+	
+	// Add a child to the parent tree
+	[parent addChild: tree];
+	
+	STAssertEquals((NSInteger)[parent getChildCount], (NSInteger)1, @"There were either no children or more than 1: %d", [parent getChildCount]);
+	
+	CommonTree *child = [parent getChild:0];
+	STAssertNotNil(child, @"Child at index 0 should not be nil");
+	STAssertEquals(child, tree, @"Child and Original tree were not the same");
+	//[parent release];
+    return;
+}
+
+-(void) test15SetChildAtIndex
+{
+	CommonTree *parent = [CommonTree newTree];
+	
+	// Child tree
+	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"];
+	CommonToken *token = [CommonToken newToken:stream Type:555 Channel:TokenChannelDefault Start:4 Stop:5];
+	CommonTree *tree = [CommonTree newTreeWithToken:token];
+	
+	
+	tree = [CommonTree newTreeWithTokenType:TokenTypeUP];
+	tree.token.text = @"<UP>";
+	[parent addChild:tree];
+	
+	STAssertTrue([parent getChild:0] == tree, @"Trees don't match");
+	[parent setChild:0 With:tree];
+	
+	CommonTree *child = [parent getChild:0];
+	STAssertTrue([parent getChildCount] == 1, @"There were either no children or more than 1: %d", [parent getChildCount]);
+	STAssertNotNil(child, @"Child at index 0 should not be nil");
+	STAssertEquals(child, tree, @"Child and Original tree were not the same");
+	//[parent release];
+    return;
+}
+
+-(void) test16GetAncestor
+{
+	CommonTree *parent = [CommonTree newTreeWithTokenType:TokenTypeUP];
+	parent.token.text = @"<UP>";
+	
+	CommonTree *down = [CommonTree newTreeWithTokenType:TokenTypeDOWN];
+	down.token.text = @"<DOWN>";
+	
+	[parent addChild:down];
+	
+	// Child tree
+	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"];
+	CommonToken *token = [CommonToken newToken:stream Type:555 Channel:TokenChannelDefault Start:4 Stop:5];
+	CommonTree *tree = [CommonTree newTreeWithToken:token];
+	
+	[down addChild:tree];
+	STAssertTrue([tree hasAncestor:TokenTypeUP], @"Should have an ancestor of type TokenTypeUP");
+	
+	CommonTree *ancestor = [tree getAncestor:TokenTypeUP];
+	STAssertNotNil(ancestor, @"Ancestor should not be nil");
+	STAssertEquals(ancestor, parent, @"Acenstors do not match");
+	//[parent release];
+    return;
+}
+
+-(void) test17FirstChildWithType
+{
+	// Create a new tree
+	CommonTree *parent = [CommonTree newTree];
+	
+	CommonTree *up = [CommonTree newTreeWithTokenType:TokenTypeUP];
+	CommonTree *down = [CommonTree newTreeWithTokenType:TokenTypeDOWN];
+	
+	[parent addChild:up];
+	[parent addChild:down];
+	
+	CommonTree *found = (CommonTree *)[parent getFirstChildWithType:TokenTypeDOWN];
+	STAssertNotNil(found, @"Child with type DOWN should not be nil");
+    if (found != nil) {
+        STAssertNotNil(found.token, @"Child token with type DOWN should not be nil");
+        if (found.token != nil)
+            STAssertEquals((NSInteger)found.token.type, (NSInteger)TokenTypeDOWN, @"Token type was not correct, should be down!");
+    }
+	found = (CommonTree *)[parent getFirstChildWithType:TokenTypeUP];
+	STAssertNotNil(found, @"Child with type UP should not be nil");
+    if (found != nil) {
+        STAssertNotNil(found.token, @"Child token with type UP should not be nil");
+        if (found.token != nil)
+            STAssertEquals((NSInteger)found.token.type, (NSInteger)TokenTypeUP, @"Token type was not correct, should be up!");
+    }
+	//[parent release];
+    return;
+}
+
+-(void) test18SanityCheckParentAndChildIndexesForParentTree
+{
+	// Child tree
+	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"];
+	CommonToken *token = [CommonToken newToken:stream Type:555 Channel:TokenChannelDefault Start:4 Stop:5];
+	CommonTree *tree = [CommonTree newTreeWithToken:token];
+	
+	CommonTree *parent = [CommonTree newTreeWithTokenType:555];
+	STAssertNotNil(tree, @"tree should not be nil");
+	@try 
+	{
+		[tree sanityCheckParentAndChildIndexes];
+	}
+	@catch (NSException * e) 
+	{
+		STFail(@"Exception was thrown and this is not what's right...");
+	}
+	
+	BOOL passed = NO;
+	@try 
+	{
+		[tree sanityCheckParentAndChildIndexes:parent At:0];
+	}
+	@catch (NSException * e) 
+	{
+		STAssertTrue([[e name] isEqualToString:@"IllegalStateException"], @"Exception was not an IllegalStateException but was %@", [e name]);
+		passed = YES;
+	}
+	if (!passed)
+	{
+		STFail(@"An exception should have been thrown");
+	}
+	
+	STAssertNotNil(parent, @"parent should not be nil");
+	[parent addChild:tree];
+	@try 
+	{
+		[tree sanityCheckParentAndChildIndexes:parent At:0];
+	}
+	@catch (NSException * e) 
+	{
+		STFail(@"No exception should have been thrown!");
+	}
+    return;
+}
+
+-(void) test19DeleteChild
+{
+	// Child tree
+	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"];
+	CommonToken *token = [CommonToken newToken:stream Type:555 Channel:TokenChannelDefault Start:4 Stop:5];
+	CommonTree *tree = [CommonTree newTreeWithToken:token];
+	
+	CommonTree *parent = [CommonTree newTree];
+	[parent addChild:tree];
+	
+	CommonTree *deletedChild = [parent deleteChild:0];
+	STAssertEquals(deletedChild, tree, @"Children do not match!");
+	STAssertEquals((NSInteger)[parent getChildCount], (NSInteger)0, @"Child count should be zero!");
+    return;
+}
+
+-(void) test20TreeDescriptions
+{
+	// Child tree
+	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"];
+	CommonToken *token = [CommonToken newToken:stream Type:555 Channel:TokenChannelDefault Start:4 Stop:5];
+	CommonTree *tree = [CommonTree newTreeWithToken:token];
+	
+	// Description for tree
+	NSString *treeDesc = [tree treeDescription];
+    STAssertNotNil(treeDesc, @"Tree description should not be nil");
+    STAssertTrue([treeDesc isEqualToString:@"||"], @"Tree description was not || but rather %@", treeDesc);
+	
+	CommonTree *parent = [CommonTree newTree];
+	STAssertTrue([[parent treeDescription] isEqualToString:@"nil"], @"Tree description was not nil was %@", [parent treeDescription]);
+	[parent addChild:tree];
+	treeDesc = [parent treeDescription];
+	STAssertTrue([treeDesc isEqualToString:@"||"], @"Tree description was not || but was: %@", treeDesc);
+	
+	// Test non empty parent
+	CommonTree *down = [CommonTree newTreeWithTokenType:TokenTypeDOWN];
+	down.token.text = @"<DOWN>";
+	
+	[tree addChild:down];
+	treeDesc = [parent treeDescription];
+	STAssertTrue([treeDesc isEqualToString:@"(|| <DOWN>)"], @"Tree description was wrong expected (|| <DOWN>) but got: %@", treeDesc);
+    return;
+}
+
+-(void) test21ReplaceChildrenAtIndexWithNoChildren
+{
+	CommonTree *parent = [CommonTree newTree];
+	CommonTree *parent2 = [CommonTree newTree];
+	CommonTree *child = [CommonTree newTreeWithTokenType:TokenTypeDOWN];
+	child.token.text = @"<DOWN>";
+	[parent2 addChild:child];
+	@try 
+	{
+		[parent replaceChildrenFrom:1 To:2 With:parent2];
+	}
+	@catch (NSException *ex)
+	{
+		STAssertTrue([[ex name] isEqualToString:@"IllegalArgumentException"], @"Expected an illegal argument exception... Got instead: %@", [ex name]);
+		return;
+	}
+	STFail(@"Exception was not thrown when I tried to replace a child on a parent with no children");
+    return;
+}
+
+-(void) test22ReplaceChildrenAtIndex
+{
+	CommonTree *parent1 = [CommonTree newTree];
+	CommonTree *child1 = [CommonTree newTreeWithTokenType:TokenTypeUP];
+	[parent1 addChild:child1];
+	CommonTree *parent2 = [CommonTree newTree];
+	CommonTree *child2 = [CommonTree newTreeWithTokenType:TokenTypeDOWN];
+	child2.token.text = @"<DOWN>";
+	[parent2 addChild:child2];
+	
+	[parent2 replaceChildrenFrom:0 To:0 With:parent1];
+	
+	STAssertEquals([parent2 getChild:0], child1, @"Child for parent 2 should have been from parent 1");
+    return;
+}
+
+-(void) test23ReplaceChildrenAtIndexWithChild
+{
+	CommonTree *replacement = [CommonTree newTreeWithTokenType:TokenTypeUP];
+	replacement.token.text = @"<UP>";
+	CommonTree *parent = [CommonTree newTree];
+	CommonTree *child = [CommonTree newTreeWithTokenType:TokenTypeDOWN];
+	child.token.text = @"<DOWN>";
+	[parent addChild:child];
+	
+	[parent replaceChildrenFrom:0 To:0 With:replacement];
+	
+	STAssertTrue([parent getChild:0] == replacement, @"Children do not match");
+    return;
+}
+
+-(void) test24ReplacechildrenAtIndexWithLessChildren
+{
+	CommonTree *parent1 = [CommonTree newTree];
+	CommonTree *child1 = [CommonTree newTreeWithTokenType:TokenTypeUP];
+	[parent1 addChild:child1];
+	
+	CommonTree *parent2 = [CommonTree newTree];
+	
+	CommonTree *child2 = [CommonTree newTreeWithTokenType:TokenTypeEOF];
+	[parent2 addChild:child2];
+	
+	CommonTree *child3 = [CommonTree newTreeWithTokenType:TokenTypeDOWN];
+	child2.token.text = @"<DOWN>";
+	[parent2 addChild:child3];
+	
+	[parent2 replaceChildrenFrom:0 To:1 With:parent1];
+	STAssertEquals((NSInteger)[parent2 getChildCount], (NSInteger)1, @"Should have one child but has %d", [parent2 getChildCount]);
+	STAssertEquals([parent2 getChild:0], child1, @"Child for parent 2 should have been from parent 1");
+    return;
+}
+
+-(void) test25ReplacechildrenAtIndexWithMoreChildren
+{
+	CommonTree *parent1 = [CommonTree newTree];
+	CommonTree *child1 = [CommonTree newTreeWithTokenType:TokenTypeUP];
+	[parent1 addChild:child1];
+	CommonTree *child2 = [CommonTree newTreeWithTokenType:TokenTypeEOF];
+	[parent1 addChild:child2];
+	
+	CommonTree *parent2 = [CommonTree newTree];
+	
+	CommonTree *child3 = [CommonTree newTreeWithTokenType:TokenTypeDOWN];
+	child2.token.text = @"<DOWN>";
+	[parent2 addChild:child3];
+	
+	[parent2 replaceChildrenFrom:0 To:0 With:parent1];
+	STAssertEquals((NSInteger)[parent2 getChildCount], (NSInteger)2, @"Should have one child but has %d", [parent2 getChildCount]);
+	STAssertEquals([parent2 getChild:0], child1, @"Child for parent 2 should have been from parent 1");
+	STAssertEquals([parent2 getChild:1], child2, @"An extra child (child2) should be in the children collection");
+    return;
+}
+
+@end
diff --git a/runtime/ObjC/README b/runtime/ObjC/README
index 702bf9c..22ad627 100644
--- a/runtime/ObjC/README
+++ b/runtime/ObjC/README
@@ -23,4 +23,9 @@
 antlr-3.2/tool/src/main/java/org/antlr/codegen/ObjCTarget/Java>.
 
 If you are using Antlr3.3 the code from here is included with the Antlr tarball. You just need
-to copy the ANTLR.framework to /Library/Frameworks.
\ No newline at end of file
+to copy the ANTLR.framework to /Library/Frameworks.
+
+antlr3.4.1
+Feb. 22, 2012 -- I just uploaded a new binary(zipped) copy of the ANTLR.framework and antlr3.4.jar 
+that has all of the renaming changes that I did to match the Java source names and 
+fixes to the DFA transitions. This is antlr-3.4.1.jar.
\ No newline at end of file
diff --git a/runtime/Python/antlr3/dottreegen.py b/runtime/Python/antlr3/dottreegen.py
index 827d4ec..41415b1 100644
--- a/runtime/Python/antlr3/dottreegen.py
+++ b/runtime/Python/antlr3/dottreegen.py
@@ -157,7 +157,7 @@
         uniqueName = "n%d" % self.getNodeNumber(t)
         nodeST.setAttribute("name", uniqueName)
         if text is not None:
-            text = text.replace('"', r'\\"')
+            text = text.replace('"', r'\"')
         nodeST.setAttribute("text", text)
         return nodeST
 
diff --git a/runtime/Python/antlr3/streams.py b/runtime/Python/antlr3/streams.py
index c9ba7ca..84016bd 100644
--- a/runtime/Python/antlr3/streams.py
+++ b/runtime/Python/antlr3/streams.py
@@ -784,8 +784,8 @@
         if self.p == -1:
             self.fillBuffer()
 
-        if stop is None or stop >= len(self.tokens):
-            stop = len(self.tokens) - 1
+        if stop is None or stop > len(self.tokens):
+            stop = len(self.tokens)
 
         if start is None or stop < 0:
             start = 0
diff --git a/runtime/Python3/.gitignore b/runtime/Python3/.gitignore
new file mode 100644
index 0000000..1868f2a
--- /dev/null
+++ b/runtime/Python3/.gitignore
@@ -0,0 +1,4 @@
+.*.swp
+*~
+*.pyc
+*.gz
diff --git a/runtime/Python3/AUTHORS b/runtime/Python3/AUTHORS
new file mode 100644
index 0000000..5040e43
--- /dev/null
+++ b/runtime/Python3/AUTHORS
@@ -0,0 +1,6 @@
+Python target:
+Benjamin Niemann <pink at odahoda dot de>: Main developer of Python target.
+Clinton Roy <clinton.roy at gmail dot com>: AST templates and runtime.
+
+Python3 target:
+Benjamin S Wolf (http://github.com/Zannick): Converted Python target to Python3.
diff --git a/runtime/Python3/ChangeLog b/runtime/Python3/ChangeLog
new file mode 100644
index 0000000..ff5113f
--- /dev/null
+++ b/runtime/Python3/ChangeLog
@@ -0,0 +1,58 @@
+2012-06-26  Benjamin S Wolf  <jokeserver+antlr3@gmail.com>
+
+	Initial Python3 target, branched from the Python target by Benjamin
+	Niemann, with lots of code cleanup and minor refactoring.
+
+	* CodeGenerator.java, Python3.stg:
+	Generated code now uses set notation for setTest, rather than long
+	conditionals like "a == FOO or a == BAR or 10 <= a <= 12". This is
+	a (slight) performance improvement.
+
+	* tokens.py:
+	Token objects no longer have get/set methods for their attributes as I
+	switched them to use @property instead. The attributes should be accessed
+	directly.
+
+	* tokens.py, Python3.stg:
+	Fix a circular dependency in generated parsers, and give Token objects the
+	ability to return their typeName when asked for it. (The generated
+	recognizer gives Token the mapping from token type to type name.)
+
+2007-11-03  Benjamin Niemann  <pink@odahoda.de>
+
+	* PythonTarget.java, dfa.py, exceptions.py, recognizer.py, streams.py:
+	ANTLRStringStream.LA() now returns the character's ordinal and
+	generated lexers operate on integers. Also made various performance
+	tunings.
+
+2007-10-07  Benjamin Niemann  <pink@odahoda.de>
+
+	* main.py, Python.stg (outputFile): Added simple __main__ section to
+	generated code, so (simple) grammars can be executed as standalone
+	script.
+
+	* tree.py (RecognitionException.extractInformationFromTreeNodeStream),
+	exceptions.py (CommonTree): Small bugfixes.
+
+2007-09-30  Benjamin Niemann  <pink@odahoda.de>
+
+	* recognizers.py (TokenSource): Added iterator interface to TokenSource
+	class - and thus to Lexer.
+
+2007-06-27  Benjamin Niemann  <pink@odahoda.de>
+
+	* Python.stg (genericParser, parser, treeParser): Use correct @init
+	action block for tree parsers.
+
+2007-05-24  Benjamin Niemann  <pink@odahoda.de>
+
+	* Python.stg (rule): Added support for @decorate {...} action for
+	parser rules to add decorators to the rule method.
+
+2007-05-18  Benjamin Niemann  <pink@odahoda.de>
+
+	* Python.stg (isolatedLookaheadRangeTest, lookaheadRangeTest): 
+	Minor improvement of generated code (use '<lower> <= <LA> <= <upper>'
+	instead of '<LA> >= <lower> and <LA> <= <upper>').
+	
+
diff --git a/runtime/Python3/LICENSE b/runtime/Python3/LICENSE
new file mode 100644
index 0000000..66653dd
--- /dev/null
+++ b/runtime/Python3/LICENSE
@@ -0,0 +1,26 @@
+[The "BSD licence"]
+Copyright (c) 2003-2012 Terence Parr
+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.
diff --git a/runtime/Python3/README b/runtime/Python3/README
new file mode 100644
index 0000000..821d4d7
--- /dev/null
+++ b/runtime/Python3/README
@@ -0,0 +1,81 @@
+1) ABOUT
+========
+
+This is the Python3 package 'antlr3', which is required to use parsers created
+by the ANTLR3 tool. See <http://www.antlr.org/> for more information about
+ANTLR3.
+
+
+2) STATUS
+=========
+
+The Python3 target for ANTLR3 is still in beta. Documentation is lacking, some
+bits of the code is not yet done, some functionality has not been tested yet.
+Also the API might change a bit - it currently mimics the Java implementation,
+but it may be made a bit more pythonic here and there.
+
+WARNING: The runtime library is not compatible with recognizers generated by
+ANTLR versions preceding V3.4.x. If you are an application developer,
+then the suggested way to solve this is to package the correct runtime with
+your application. Installing the runtime in the global site-packages directory
+may not be a good idea.
+Sorry for the inconvenience.
+
+
+3) DOWNLOAD
+===========
+
+This runtime is part of the ANTLR distribution. The latest version can be found
+at <http://www.antlr.org/download.html>.
+
+If you are interested in the latest, most bleeding edge version, have a look at
+the git repository at <http://github.com/antlr/antlr3>.
+
+
+4) INSTALLATION
+===============
+
+Just like any other Python package:
+$ python3 setup.py install
+
+See <http://docs.python.org/inst/> for more information.
+
+
+5) DOCUMENTATION
+================
+
+Documentation (as far as it exists) can be found in the wiki
+<http://www.antlr.org/wiki/display/ANTLR3/Antlr3Python3Target>
+
+
+6) REPORTING BUGS
+=================
+
+Please file bug reports on github: <http://github.com/antlr/antlr3>.
+
+
+7) HACKING
+==========
+
+Only the runtime package can be found here. There are also some StringTemplate
+files in 'src/org/antlr/codegen/templates/Python3/' and some Java code in
+'src/org/antlr/codegen/Python3Target.java' (of the main ANTLR3 source
+distribution).
+
+If there are no directories 'tests' and 'unittests' in 'runtime/Python3', you
+should fetch the latest ANTLR3 version from the perforce depot. See section
+DOWNLOAD.
+You'll need java and ant in order to compile and use the tool.
+Be sure to properly setup your CLASSPATH.
+(FIXME: is there some generic information, how to build it yourself? I should
+point to it to avoid duplication.)
+
+You can then use the commands
+$ python3 setup.py unittest
+$ python3 setup.py functest
+to ensure that changes do not break existing behaviour.
+
+Please send patches as pull requests on github. For larger code contributions
+you'll have to sign the "Developer's Certificate of Origin", which can be
+found on <http://www.antlr.org/license.html> or use the feedback form at
+<http://www.antlr.org/misc/feedback>.
diff --git a/runtime/Python3/antlr3/__init__.py b/runtime/Python3/antlr3/__init__.py
new file mode 100644
index 0000000..73b215b
--- /dev/null
+++ b/runtime/Python3/antlr3/__init__.py
@@ -0,0 +1,152 @@
+""" @package antlr3
+@brief ANTLR3 runtime package
+
+This module contains all support classes, which are needed to use recognizers
+generated by ANTLR3.
+
+@mainpage
+
+\\note Please be warned that the line numbers in the API documentation do not
+match the real locations in the source code of the package. This is an
+unintended artifact of doxygen, which I could only convince to use the
+correct module names by concatenating all files from the package into a single
+module file...
+
+Here is a little overview over the most commonly used classes provided by
+this runtime:
+
+@section recognizers Recognizers
+
+These recognizers are baseclasses for the code which is generated by ANTLR3.
+
+- BaseRecognizer: Base class with common recognizer functionality.
+- Lexer: Base class for lexers.
+- Parser: Base class for parsers.
+- tree.TreeParser: Base class for %tree parser.
+
+@section streams Streams
+
+Each recognizer pulls its input from one of the stream classes below. Streams
+handle stuff like buffering, look-ahead and seeking.
+
+A character stream is usually the first element in the pipeline of a typical
+ANTLR3 application. It is used as the input for a Lexer.
+
+- ANTLRStringStream: Reads from a string objects. The input should be a unicode
+  object, or ANTLR3 will have trouble decoding non-ascii data.
+- ANTLRFileStream: Opens a file and read the contents, with optional character
+  decoding.
+- ANTLRInputStream: Reads the date from a file-like object, with optional
+  character decoding.
+
+A Parser needs a TokenStream as input (which in turn is usually fed by a
+Lexer):
+
+- CommonTokenStream: A basic and most commonly used TokenStream
+  implementation.
+- TokenRewriteStream: A modification of CommonTokenStream that allows the
+  stream to be altered (by the Parser). See the 'tweak' example for a usecase.
+
+And tree.TreeParser finally fetches its input from a tree.TreeNodeStream:
+
+- tree.CommonTreeNodeStream: A basic and most commonly used tree.TreeNodeStream
+  implementation.
+  
+
+@section tokenstrees Tokens and Trees
+
+A Lexer emits Token objects which are usually buffered by a TokenStream. A
+Parser can build a Tree, if the output=AST option has been set in the grammar.
+
+The runtime provides these Token implementations:
+
+- CommonToken: A basic and most commonly used Token implementation.
+- ClassicToken: A Token object as used in ANTLR 2.x, used to %tree
+  construction.
+
+Tree objects are wrapper for Token objects.
+
+- tree.CommonTree: A basic and most commonly used Tree implementation.
+
+A tree.TreeAdaptor is used by the parser to create tree.Tree objects for the
+input Token objects.
+
+- tree.CommonTreeAdaptor: A basic and most commonly used tree.TreeAdaptor
+implementation.
+
+
+@section Exceptions
+
+RecognitionException are generated, when a recognizer encounters incorrect
+or unexpected input.
+
+- RecognitionException
+  - MismatchedRangeException
+  - MismatchedSetException
+    - MismatchedNotSetException
+    .
+  - MismatchedTokenException
+  - MismatchedTreeNodeException
+  - NoViableAltException
+  - EarlyExitException
+  - FailedPredicateException
+  .
+.
+
+A tree.RewriteCardinalityException is raised, when the parsers hits a
+cardinality mismatch during AST construction. Although this is basically a
+bug in your grammar, it can only be detected at runtime.
+
+- tree.RewriteCardinalityException
+  - tree.RewriteEarlyExitException
+  - tree.RewriteEmptyStreamException
+  .
+.
+
+"""
+
+# tree.RewriteRuleElementStream
+# tree.RewriteRuleSubtreeStream
+# tree.RewriteRuleTokenStream
+# CharStream
+# DFA
+# TokenSource
+
+# [The "BSD licence"]
+# Copyright (c) 2005-2012 Terence Parr
+# 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.
+
+__version__ = '3.4'
+
+# This runtime is compatible with generated parsers using the
+# API versions listed in constants.compatible_api_versions.
+# 'HEAD' is only used by unittests.
+
+from .constants import *
+from .dfa import *
+from .exceptions import *
+from .recognizers import *
+from .streams import *
+from .tokens import *
diff --git a/runtime/Python3/antlr3/constants.py b/runtime/Python3/antlr3/constants.py
new file mode 100644
index 0000000..f0203ee
--- /dev/null
+++ b/runtime/Python3/antlr3/constants.py
@@ -0,0 +1,59 @@
+"""ANTLR3 runtime package"""
+
+# begin[licence]
+#
+# [The "BSD licence"]
+# Copyright (c) 2005-2012 Terence Parr
+# 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[licence]
+
+compatible_api_versions = ['HEAD', 1]
+
+EOF = -1
+
+## All tokens go to the parser (unless skip() is called in that rule)
+# on a particular "channel".  The parser tunes to a particular channel
+# so that whitespace etc... can go to the parser on a "hidden" channel.
+DEFAULT_CHANNEL = 0
+
+## Anything on different channel than DEFAULT_CHANNEL is not parsed
+# by parser.
+HIDDEN_CHANNEL = 99
+
+# Predefined token types
+EOR_TOKEN_TYPE = 1
+
+##
+# imaginary tree navigation type; traverse "get child" link
+DOWN = 2
+##
+#imaginary tree navigation type; finish with a child list
+UP = 3
+
+MIN_TOKEN_TYPE = UP + 1
+	
+INVALID_TOKEN_TYPE = 0
+
diff --git a/runtime/Python3/antlr3/debug.py b/runtime/Python3/antlr3/debug.py
new file mode 100644
index 0000000..c309a36
--- /dev/null
+++ b/runtime/Python3/antlr3/debug.py
@@ -0,0 +1,1134 @@
+# begin[licence]
+#
+#  [The "BSD licence"]
+#  Copyright (c) 2005-2012 Terence Parr
+#  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[licence]
+
+import socket
+import sys
+from .constants import INVALID_TOKEN_TYPE
+from .exceptions import RecognitionException
+from .recognizers import Parser
+from .streams import TokenStream
+from .tokens import Token
+from .tree import CommonTreeAdaptor, TreeAdaptor, Tree
+
+class DebugParser(Parser):
+    def __init__(self, stream, state=None, dbg=None, *args, **kwargs):
+        # wrap token stream in DebugTokenStream (unless user already did so).
+        if not isinstance(stream, DebugTokenStream):
+            stream = DebugTokenStream(stream, dbg)
+
+        super().__init__(stream, state, *args, **kwargs)
+
+        # Who to notify when events in the parser occur.
+        self._dbg = None
+
+        self.setDebugListener(dbg)
+
+
+    def setDebugListener(self, dbg):
+        """Provide a new debug event listener for this parser.  Notify the
+        input stream too that it should send events to this listener.
+        """
+
+        if hasattr(self.input, 'dbg'):
+            self.input.dbg = dbg
+
+        self._dbg = dbg
+
+    def getDebugListener(self):
+        return self._dbg
+
+    dbg = property(getDebugListener, setDebugListener)
+
+
+    def beginResync(self):
+        self._dbg.beginResync()
+
+
+    def endResync(self):
+        self._dbg.endResync()
+
+
+    def beginBacktrack(self, level):
+        self._dbg.beginBacktrack(level)
+
+
+    def endBacktrack(self, level, successful):
+        self._dbg.endBacktrack(level, successful)
+
+
+    def reportError(self, exc):
+        Parser.reportError(self, exc)
+
+        if isinstance(exc, RecognitionException):
+            self._dbg.recognitionException(exc)
+
+
+class DebugTokenStream(TokenStream):
+    def __init__(self, input, dbg=None):
+        super().__init__()
+        self.input = input
+        self.initialStreamState = True
+        # Track the last mark() call result value for use in rewind().
+        self.lastMarker = None
+
+        self._dbg = None
+        self.setDebugListener(dbg)
+
+        # force TokenStream to get at least first valid token
+        # so we know if there are any hidden tokens first in the stream
+        self.input.LT(1)
+
+
+    def getDebugListener(self):
+        return self._dbg
+
+    def setDebugListener(self, dbg):
+        self._dbg = dbg
+
+    dbg = property(getDebugListener, setDebugListener)
+
+
+    def consume(self):
+        if self.initialStreamState:
+            self.consumeInitialHiddenTokens()
+
+        a = self.input.index()
+        t = self.input.LT(1)
+        self.input.consume()
+        b = self.input.index()
+        self._dbg.consumeToken(t)
+
+        if b > a + 1:
+            # then we consumed more than one token; must be off channel tokens
+            for idx in range(a + 1, b):
+                self._dbg.consumeHiddenToken(self.input.get(idx))
+
+
+    def consumeInitialHiddenTokens(self):
+        """consume all initial off-channel tokens"""
+
+        firstOnChannelTokenIndex = self.input.index()
+        for idx in range(firstOnChannelTokenIndex):
+            self._dbg.consumeHiddenToken(self.input.get(idx))
+
+        self.initialStreamState = False
+
+
+    def LT(self, i):
+        if self.initialStreamState:
+            self.consumeInitialHiddenTokens()
+
+        t = self.input.LT(i)
+        self._dbg.LT(i, t)
+        return t
+
+
+    def LA(self, i):
+        if self.initialStreamState:
+            self.consumeInitialHiddenTokens()
+
+        t = self.input.LT(i)
+        self._dbg.LT(i, t)
+        return t.type
+
+
+    def get(self, i):
+        return self.input.get(i)
+
+
+    def index(self):
+        return self.input.index()
+
+
+    def mark(self):
+        self.lastMarker = self.input.mark()
+        self._dbg.mark(self.lastMarker)
+        return self.lastMarker
+
+
+    def rewind(self, marker=None):
+        self._dbg.rewind(marker)
+        self.input.rewind(marker)
+
+
+    def release(self, marker):
+        pass
+
+
+    def seek(self, index):
+        # TODO: implement seek in dbg interface
+        # self._dbg.seek(index);
+        self.input.seek(index)
+
+
+    def size(self):
+        return self.input.size()
+
+
+    def getTokenSource(self):
+        return self.input.getTokenSource()
+
+
+    def getSourceName(self):
+        return self.getTokenSource().getSourceName()
+
+
+    def toString(self, start=None, stop=None):
+        return self.input.toString(start, stop)
+
+
+class DebugTreeAdaptor(TreeAdaptor):
+    """A TreeAdaptor proxy that fires debugging events to a DebugEventListener
+    delegate and uses the TreeAdaptor delegate to do the actual work.  All
+    AST events are triggered by this adaptor; no code gen changes are needed
+    in generated rules.  Debugging events are triggered *after* invoking
+    tree adaptor routines.
+
+    Trees created with actions in rewrite actions like "-> ^(ADD {foo} {bar})"
+    cannot be tracked as they might not use the adaptor to create foo, bar.
+    The debug listener has to deal with tree node IDs for which it did
+    not see a createNode event.  A single <unknown> node is sufficient even
+    if it represents a whole tree.
+    """
+
+    def __init__(self, dbg, adaptor):
+        super().__init__()
+        self.dbg = dbg
+        self.adaptor = adaptor
+
+
+    def createWithPayload(self, payload):
+        if payload.index < 0:
+            # could be token conjured up during error recovery
+            return self.createFromType(payload.type, payload.text)
+
+        node = self.adaptor.createWithPayload(payload)
+        self.dbg.createNode(node, payload)
+        return node
+
+    def createFromToken(self, tokenType, fromToken, text=None):
+        node = self.adaptor.createFromToken(tokenType, fromToken, text)
+        self.dbg.createNode(node)
+        return node
+
+    def createFromType(self, tokenType, text):
+        node = self.adaptor.createFromType(tokenType, text)
+        self.dbg.createNode(node)
+        return node
+
+
+    def errorNode(self, input, start, stop, exc):
+        node = self.adaptor.errorNode(input, start, stop, exc)
+        if node is not None:
+            self.dbg.errorNode(node)
+
+        return node
+
+
+    def dupTree(self, tree):
+        t = self.adaptor.dupTree(tree)
+        # walk the tree and emit create and add child events
+        # to simulate what dupTree has done. dupTree does not call this debug
+        # adapter so I must simulate.
+        self.simulateTreeConstruction(t)
+        return t
+
+
+    def simulateTreeConstruction(self, t):
+        """^(A B C): emit create A, create B, add child, ..."""
+        self.dbg.createNode(t)
+        for i in range(self.adaptor.getChildCount(t)):
+            child = self.adaptor.getChild(t, i)
+            self.simulateTreeConstruction(child)
+            self.dbg.addChild(t, child)
+
+
+    def dupNode(self, treeNode):
+        d = self.adaptor.dupNode(treeNode)
+        self.dbg.createNode(d)
+        return d
+
+
+    def nil(self):
+        node = self.adaptor.nil()
+        self.dbg.nilNode(node)
+        return node
+
+
+    def isNil(self, tree):
+        return self.adaptor.isNil(tree)
+
+
+    def addChild(self, t, child):
+        if isinstance(child, Token):
+            n = self.createWithPayload(child)
+            self.addChild(t, n)
+
+        else:
+            if t is None or child is None:
+                return
+
+            self.adaptor.addChild(t, child)
+            self.dbg.addChild(t, child)
+
+    def becomeRoot(self, newRoot, oldRoot):
+        if isinstance(newRoot, Token):
+            n = self.createWithPayload(newRoot)
+            self.adaptor.becomeRoot(n, oldRoot)
+        else:
+            n = self.adaptor.becomeRoot(newRoot, oldRoot)
+
+        self.dbg.becomeRoot(newRoot, oldRoot)
+        return n
+
+
+    def rulePostProcessing(self, root):
+        return self.adaptor.rulePostProcessing(root)
+
+
+    def getType(self, t):
+        return self.adaptor.getType(t)
+
+
+    def setType(self, t, type):
+        self.adaptor.setType(t, type)
+
+
+    def getText(self, t):
+        return self.adaptor.getText(t)
+
+
+    def setText(self, t, text):
+        self.adaptor.setText(t, text)
+
+
+    def getToken(self, t):
+        return self.adaptor.getToken(t)
+
+
+    def setTokenBoundaries(self, t, startToken, stopToken):
+        self.adaptor.setTokenBoundaries(t, startToken, stopToken)
+        if t and startToken and stopToken:
+            self.dbg.setTokenBoundaries(
+                t, startToken.index, stopToken.index)
+
+
+    def getTokenStartIndex(self, t):
+        return self.adaptor.getTokenStartIndex(t)
+
+
+    def getTokenStopIndex(self, t):
+        return self.adaptor.getTokenStopIndex(t)
+
+
+    def getChild(self, t, i):
+        return self.adaptor.getChild(t, i)
+
+
+    def setChild(self, t, i, child):
+        self.adaptor.setChild(t, i, child)
+
+
+    def deleteChild(self, t, i):
+        return self.adaptor.deleteChild(t, i)
+
+
+    def getChildCount(self, t):
+        return self.adaptor.getChildCount(t)
+
+
+    def getUniqueID(self, node):
+        return self.adaptor.getUniqueID(node)
+
+
+    def getParent(self, t):
+        return self.adaptor.getParent(t)
+
+
+    def getChildIndex(self, t):
+        return self.adaptor.getChildIndex(t)
+
+
+    def setParent(self, t, parent):
+        self.adaptor.setParent(t, parent)
+
+
+    def setChildIndex(self, t, index):
+        self.adaptor.setChildIndex(t, index)
+
+
+    def replaceChildren(self, parent, startChildIndex, stopChildIndex, t):
+        self.adaptor.replaceChildren(parent, startChildIndex, stopChildIndex, t)
+
+
+    ## support
+
+    def getDebugListener(self):
+        return self.dbg
+
+    def setDebugListener(self, dbg):
+        self.dbg = dbg
+
+
+    def getTreeAdaptor(self):
+        return self.adaptor
+
+
+
+class DebugEventListener(object):
+    """All debugging events that a recognizer can trigger.
+
+    I did not create a separate AST debugging interface as it would create
+    lots of extra classes and DebugParser has a dbg var defined, which makes
+    it hard to change to ASTDebugEventListener.  I looked hard at this issue
+    and it is easier to understand as one monolithic event interface for all
+    possible events.  Hopefully, adding ST debugging stuff won't be bad.  Leave
+    for future. 4/26/2006.
+    """
+
+    # Moved to version 2 for v3.1: added grammar name to enter/exit Rule
+    PROTOCOL_VERSION = "2"
+
+    def enterRule(self, grammarFileName, ruleName):
+        """The parser has just entered a rule. No decision has been made about
+        which alt is predicted.  This is fired AFTER init actions have been
+        executed.  Attributes are defined and available etc...
+        The grammarFileName allows composite grammars to jump around among
+        multiple grammar files.
+        """
+
+        pass
+
+
+    def enterAlt(self, alt):
+        """Because rules can have lots of alternatives, it is very useful to
+        know which alt you are entering.  This is 1..n for n alts.
+        """
+        pass
+
+
+    def exitRule(self, grammarFileName, ruleName):
+        """This is the last thing executed before leaving a rule.  It is
+        executed even if an exception is thrown.  This is triggered after
+        error reporting and recovery have occurred (unless the exception is
+        not caught in this rule).  This implies an "exitAlt" event.
+        The grammarFileName allows composite grammars to jump around among
+        multiple grammar files.
+        """
+        pass
+
+
+    def enterSubRule(self, decisionNumber):
+        """Track entry into any (...) subrule other EBNF construct"""
+        pass
+
+
+    def exitSubRule(self, decisionNumber):
+        pass
+
+
+    def enterDecision(self, decisionNumber, couldBacktrack):
+        """Every decision, fixed k or arbitrary, has an enter/exit event
+        so that a GUI can easily track what LT/consume events are
+        associated with prediction.  You will see a single enter/exit
+        subrule but multiple enter/exit decision events, one for each
+        loop iteration.
+        """
+        pass
+
+
+    def exitDecision(self, decisionNumber):
+        pass
+
+
+    def consumeToken(self, t):
+        """An input token was consumed; matched by any kind of element.
+        Trigger after the token was matched by things like match(), matchAny().
+        """
+        pass
+
+
+    def consumeHiddenToken(self, t):
+        """An off-channel input token was consumed.
+        Trigger after the token was matched by things like match(), matchAny().
+        (unless of course the hidden token is first stuff in the input stream).
+        """
+        pass
+
+
+    def LT(self, i, t):
+        """Somebody (anybody) looked ahead.  Note that this actually gets
+        triggered by both LA and LT calls.  The debugger will want to know
+        which Token object was examined.  Like consumeToken, this indicates
+        what token was seen at that depth.  A remote debugger cannot look
+        ahead into a file it doesn't have so LT events must pass the token
+        even if the info is redundant.
+        For tree parsers, if the type is UP or DOWN,
+        then the ID is not really meaningful as it's fixed--there is
+        just one UP node and one DOWN navigation node.
+        """
+        pass
+
+
+    def mark(self, marker):
+        """The parser is going to look arbitrarily ahead; mark this location,
+        the token stream's marker is sent in case you need it.
+        """
+        pass
+
+
+    def rewind(self, marker=None):
+        """After an arbitrairly long lookahead as with a cyclic DFA (or with
+        any backtrack), this informs the debugger that stream should be
+        rewound to the position associated with marker.
+
+        """
+        pass
+
+
+    def beginBacktrack(self, level):
+        pass
+
+
+    def endBacktrack(self, level, successful):
+        pass
+
+
+    def location(self, line, pos):
+        """To watch a parser move through the grammar, the parser needs to
+        inform the debugger what line/charPos it is passing in the grammar.
+        For now, this does not know how to switch from one grammar to the
+        other and back for island grammars etc...
+
+        This should also allow breakpoints because the debugger can stop
+        the parser whenever it hits this line/pos.
+        """
+        pass
+
+
+    def recognitionException(self, e):
+        """A recognition exception occurred such as NoViableAltException.  I made
+        this a generic event so that I can alter the exception hierachy later
+        without having to alter all the debug objects.
+
+        Upon error, the stack of enter rule/subrule must be properly unwound.
+        If no viable alt occurs it is within an enter/exit decision, which
+        also must be rewound.  Even the rewind for each mark must be unwount.
+        In the Java target this is pretty easy using try/finally, if a bit
+        ugly in the generated code.  The rewind is generated in DFA.predict()
+        actually so no code needs to be generated for that.  For languages
+        w/o this "finally" feature (C++?), the target implementor will have
+        to build an event stack or something.
+
+        Across a socket for remote debugging, only the RecognitionException
+        data fields are transmitted.  The token object or whatever that
+        caused the problem was the last object referenced by LT.  The
+        immediately preceding LT event should hold the unexpected Token or
+        char.
+
+        Here is a sample event trace for grammar:
+
+        b : C ({;}A|B) // {;} is there to prevent A|B becoming a set
+          | D
+          ;
+
+        The sequence for this rule (with no viable alt in the subrule) for
+        input 'c c' (there are 3 tokens) is:
+
+                commence
+                LT(1)
+                enterRule b
+                location 7 1
+                enter decision 3
+                LT(1)
+                exit decision 3
+                enterAlt1
+                location 7 5
+                LT(1)
+                consumeToken [c/<4>,1:0]
+                location 7 7
+                enterSubRule 2
+                enter decision 2
+                LT(1)
+                LT(1)
+                recognitionException NoViableAltException 2 1 2
+                exit decision 2
+                exitSubRule 2
+                beginResync
+                LT(1)
+                consumeToken [c/<4>,1:1]
+                LT(1)
+                endResync
+                LT(-1)
+                exitRule b
+                terminate
+        """
+        pass
+
+
+    def beginResync(self):
+        """Indicates the recognizer is about to consume tokens to resynchronize
+        the parser.  Any consume events from here until the recovered event
+        are not part of the parse--they are dead tokens.
+        """
+        pass
+
+
+    def endResync(self):
+        """Indicates that the recognizer has finished consuming tokens in order
+        to resychronize.  There may be multiple beginResync/endResync pairs
+        before the recognizer comes out of errorRecovery mode (in which
+        multiple errors are suppressed).  This will be useful
+        in a gui where you want to probably grey out tokens that are consumed
+        but not matched to anything in grammar.  Anything between
+        a beginResync/endResync pair was tossed out by the parser.
+        """
+        pass
+
+
+    def semanticPredicate(self, result, predicate):
+        """A semantic predicate was evaluate with this result and action text"""
+        pass
+
+
+    def commence(self):
+        """Announce that parsing has begun.  Not technically useful except for
+        sending events over a socket.  A GUI for example will launch a thread
+        to connect and communicate with a remote parser.  The thread will want
+        to notify the GUI when a connection is made.  ANTLR parsers
+        trigger this upon entry to the first rule (the ruleLevel is used to
+        figure this out).
+        """
+        pass
+
+
+    def terminate(self):
+        """Parsing is over; successfully or not.  Mostly useful for telling
+        remote debugging listeners that it's time to quit.  When the rule
+        invocation level goes to zero at the end of a rule, we are done
+        parsing.
+        """
+        pass
+
+
+    ## T r e e  P a r s i n g
+
+    def consumeNode(self, t):
+        """Input for a tree parser is an AST, but we know nothing for sure
+        about a node except its type and text (obtained from the adaptor).
+        This is the analog of the consumeToken method.  Again, the ID is
+        the hashCode usually of the node so it only works if hashCode is
+        not implemented.  If the type is UP or DOWN, then
+        the ID is not really meaningful as it's fixed--there is
+        just one UP node and one DOWN navigation node.
+        """
+        pass
+
+
+    ## A S T  E v e n t s
+
+    def nilNode(self, t):
+        """A nil was created (even nil nodes have a unique ID...
+        they are not "null" per se).  As of 4/28/2006, this
+        seems to be uniquely triggered when starting a new subtree
+        such as when entering a subrule in automatic mode and when
+        building a tree in rewrite mode.
+
+        If you are receiving this event over a socket via
+        RemoteDebugEventSocketListener then only t.ID is set.
+        """
+        pass
+
+
+    def errorNode(self, t):
+        """Upon syntax error, recognizers bracket the error with an error node
+        if they are building ASTs.
+        """
+        pass
+
+
+    def createNode(self, node, token=None):
+        """Announce a new node built from token elements such as type etc...
+
+        If you are receiving this event over a socket via
+        RemoteDebugEventSocketListener then only t.ID, type, text are
+        set.
+        """
+        pass
+
+
+    def becomeRoot(self, newRoot, oldRoot):
+        """Make a node the new root of an existing root.
+
+        Note: the newRootID parameter is possibly different
+        than the TreeAdaptor.becomeRoot() newRoot parameter.
+        In our case, it will always be the result of calling
+        TreeAdaptor.becomeRoot() and not root_n or whatever.
+
+        The listener should assume that this event occurs
+        only when the current subrule (or rule) subtree is
+        being reset to newRootID.
+
+        If you are receiving this event over a socket via
+        RemoteDebugEventSocketListener then only IDs are set.
+
+        @see antlr3.tree.TreeAdaptor.becomeRoot()
+        """
+        pass
+
+
+    def addChild(self, root, child):
+        """Make childID a child of rootID.
+
+        If you are receiving this event over a socket via
+        RemoteDebugEventSocketListener then only IDs are set.
+
+        @see antlr3.tree.TreeAdaptor.addChild()
+        """
+        pass
+
+
+    def setTokenBoundaries(self, t, tokenStartIndex, tokenStopIndex):
+        """Set the token start/stop token index for a subtree root or node.
+
+        If you are receiving this event over a socket via
+        RemoteDebugEventSocketListener then only t.ID is set.
+        """
+        pass
+
+
+class BlankDebugEventListener(DebugEventListener):
+    """A blank listener that does nothing; useful for real classes so
+    they don't have to have lots of blank methods and are less
+    sensitive to updates to debug interface.
+
+    Note: this class is identical to DebugEventListener and exists purely
+    for compatibility with Java.
+    """
+    pass
+
+
+class TraceDebugEventListener(DebugEventListener):
+    """A listener that simply records text representations of the events.
+
+    Useful for debugging the debugging facility ;)
+
+    Subclasses can override the record() method (which defaults to printing to
+    stdout) to record the events in a different way.
+    """
+
+    def __init__(self, adaptor=None):
+        super().__init__()
+
+        if adaptor is None:
+            adaptor = CommonTreeAdaptor()
+        self.adaptor = adaptor
+
+    def record(self, event):
+        sys.stdout.write(event + '\n')
+
+    def enterRule(self, grammarFileName, ruleName):
+        self.record("enterRule " + ruleName)
+
+    def exitRule(self, grammarFileName, ruleName):
+        self.record("exitRule " + ruleName)
+
+    def enterSubRule(self, decisionNumber):
+        self.record("enterSubRule")
+
+    def exitSubRule(self, decisionNumber):
+        self.record("exitSubRule")
+
+    def location(self, line, pos):
+        self.record("location {}:{}".format(line, pos))
+
+    ## Tree parsing stuff
+
+    def consumeNode(self, t):
+        self.record("consumeNode {} {} {}".format(
+                self.adaptor.getUniqueID(t),
+                self.adaptor.getText(t),
+                self.adaptor.getType(t)))
+
+    def LT(self, i, t):
+        self.record("LT {} {} {} {}".format(
+                i,
+                self.adaptor.getUniqueID(t),
+                self.adaptor.getText(t),
+                self.adaptor.getType(t)))
+
+
+    ## AST stuff
+    def nilNode(self, t):
+        self.record("nilNode {}".format(self.adaptor.getUniqueID(t)))
+
+    def createNode(self, t, token=None):
+        if token is None:
+            self.record("create {}: {}, {}".format(
+                    self.adaptor.getUniqueID(t),
+                    self.adaptor.getText(t),
+                    self.adaptor.getType(t)))
+
+        else:
+            self.record("create {}: {}".format(
+                    self.adaptor.getUniqueID(t),
+                    token.index))
+
+    def becomeRoot(self, newRoot, oldRoot):
+        self.record("becomeRoot {}, {}".format(
+                self.adaptor.getUniqueID(newRoot),
+                self.adaptor.getUniqueID(oldRoot)))
+
+    def addChild(self, root, child):
+        self.record("addChild {}, {}".format(
+                self.adaptor.getUniqueID(root),
+                self.adaptor.getUniqueID(child)))
+
+    def setTokenBoundaries(self, t, tokenStartIndex, tokenStopIndex):
+        self.record("setTokenBoundaries {}, {}, {}".format(
+                self.adaptor.getUniqueID(t),
+                tokenStartIndex, tokenStopIndex))
+
+
+class RecordDebugEventListener(TraceDebugEventListener):
+    """A listener that records events as strings in an array."""
+
+    def __init__(self, adaptor=None):
+        super().__init__(adaptor)
+
+        self.events = []
+
+    def record(self, event):
+        self.events.append(event)
+
+
+class DebugEventSocketProxy(DebugEventListener):
+    """A proxy debug event listener that forwards events over a socket to
+    a debugger (or any other listener) using a simple text-based protocol;
+    one event per line.  ANTLRWorks listens on server socket with a
+    RemoteDebugEventSocketListener instance.  These two objects must therefore
+    be kept in sync.  New events must be handled on both sides of socket.
+    """
+
+    DEFAULT_DEBUGGER_PORT = 49100
+
+    def __init__(self, recognizer, adaptor=None, port=None, debug=None):
+        super().__init__()
+
+        self.grammarFileName = recognizer.getGrammarFileName()
+
+        # Almost certainly the recognizer will have adaptor set, but
+        # we don't know how to cast it (Parser or TreeParser) to get
+        # the adaptor field.  Must be set with a constructor. :(
+        self.adaptor = adaptor
+
+        self.port = port or self.DEFAULT_DEBUGGER_PORT
+
+        self.debug = debug
+
+        self.socket = None
+        self.connection = None
+        self.input = None
+        self.output = None
+
+
+    def log(self, msg):
+        if self.debug:
+            self.debug.write(msg + '\n')
+
+
+    def handshake(self):
+        if self.socket is None:
+            # create listening socket
+            self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+            self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+            self.socket.bind(('', self.port))
+            self.socket.listen(1)
+            self.log("Waiting for incoming connection on port {}".format(self.port))
+
+            # wait for an incoming connection
+            self.connection, addr = self.socket.accept()
+            self.log("Accepted connection from {}:{}".format(addr[0], addr[1]))
+
+            self.connection.setblocking(1)
+            self.connection.setsockopt(socket.SOL_TCP, socket.TCP_NODELAY, 1)
+
+            self.output = self.connection.makefile('w', 1)
+            self.input = self.connection.makefile('r', 1)
+
+            self.write("ANTLR {}".format(self.PROTOCOL_VERSION))
+            self.write('grammar "{}"'.format(self.grammarFileName))
+            self.ack()
+
+
+    def write(self, msg):
+        self.log("> {}".format(msg))
+        self.output.write("{}\n".format(msg))
+        self.output.flush()
+
+
+    def ack(self):
+        t = self.input.readline()
+        self.log("< {}".format(t.rstrip()))
+
+
+    def transmit(self, event):
+        self.write(event)
+        self.ack()
+
+
+    def commence(self):
+        # don't bother sending event; listener will trigger upon connection
+        pass
+
+
+    def terminate(self):
+        self.transmit("terminate")
+        self.output.close()
+        self.input.close()
+        self.connection.close()
+        self.socket.close()
+
+
+    def enterRule(self, grammarFileName, ruleName):
+        self.transmit("enterRule\t{}\t{}".format(grammarFileName, ruleName))
+
+
+    def enterAlt(self, alt):
+        self.transmit("enterAlt\t{}".format(alt))
+
+
+    def exitRule(self, grammarFileName, ruleName):
+        self.transmit("exitRule\t{}\t{}".format(grammarFileName, ruleName))
+
+
+    def enterSubRule(self, decisionNumber):
+        self.transmit("enterSubRule\t{}".format(decisionNumber))
+
+
+    def exitSubRule(self, decisionNumber):
+        self.transmit("exitSubRule\t{}".format(decisionNumber))
+
+
+    def enterDecision(self, decisionNumber, couldBacktrack):
+        self.transmit(
+            "enterDecision\t{}\t{:d}".format(decisionNumber, couldBacktrack))
+
+
+    def exitDecision(self, decisionNumber):
+        self.transmit("exitDecision\t{}".format(decisionNumber))
+
+
+    def consumeToken(self, t):
+        self.transmit("consumeToken\t{}".format(self.serializeToken(t)))
+
+
+    def consumeHiddenToken(self, t):
+        self.transmit("consumeHiddenToken\t{}".format(self.serializeToken(t)))
+
+
+    def LT(self, i, o):
+        if isinstance(o, Tree):
+            return self.LT_tree(i, o)
+        return self.LT_token(i, o)
+
+
+    def LT_token(self, i, t):
+        if t is not None:
+            self.transmit("LT\t{}\t{}".format(i, self.serializeToken(t)))
+
+
+    def mark(self, i):
+        self.transmit("mark\t{}".format(i))
+
+
+    def rewind(self, i=None):
+        if i is not None:
+            self.transmit("rewind\t{}".format(i))
+        else:
+            self.transmit("rewind")
+
+
+    def beginBacktrack(self, level):
+        self.transmit("beginBacktrack\t{}".format(level))
+
+
+    def endBacktrack(self, level, successful):
+        self.transmit("endBacktrack\t{}\t{}".format(
+                level, '1' if successful else '0'))
+
+
+    def location(self, line, pos):
+        self.transmit("location\t{}\t{}".format(line, pos))
+
+
+    def recognitionException(self, exc):
+        self.transmit('\t'.join([
+                    "exception",
+                    exc.__class__.__name__,
+                    str(int(exc.index)),
+                    str(int(exc.line)),
+                    str(int(exc.charPositionInLine))]))
+
+
+    def beginResync(self):
+        self.transmit("beginResync")
+
+
+    def endResync(self):
+        self.transmit("endResync")
+
+
+    def semanticPredicate(self, result, predicate):
+        self.transmit('\t'.join([
+                    "semanticPredicate",
+                    str(int(result)),
+                    self.escapeNewlines(predicate)]))
+
+    ## A S T  P a r s i n g  E v e n t s
+
+    def consumeNode(self, t):
+        FIXME(31)
+#         StringBuffer buf = new StringBuffer(50);
+#         buf.append("consumeNode");
+#         serializeNode(buf, t);
+#         transmit(buf.toString());
+
+
+    def LT_tree(self, i, t):
+        FIXME(34)
+#         int ID = adaptor.getUniqueID(t);
+#         String text = adaptor.getText(t);
+#         int type = adaptor.getType(t);
+#         StringBuffer buf = new StringBuffer(50);
+#         buf.append("LN\t"); // lookahead node; distinguish from LT in protocol
+#         buf.append(i);
+#         serializeNode(buf, t);
+#         transmit(buf.toString());
+
+
+    def serializeNode(self, buf, t):
+        FIXME(33)
+#         int ID = adaptor.getUniqueID(t);
+#         String text = adaptor.getText(t);
+#         int type = adaptor.getType(t);
+#         buf.append("\t");
+#         buf.append(ID);
+#         buf.append("\t");
+#         buf.append(type);
+#         Token token = adaptor.getToken(t);
+#         int line = -1;
+#         int pos = -1;
+#         if ( token!=null ) {
+#             line = token.getLine();
+#             pos = token.getCharPositionInLine();
+#             }
+#         buf.append("\t");
+#         buf.append(line);
+#         buf.append("\t");
+#         buf.append(pos);
+#         int tokenIndex = adaptor.getTokenStartIndex(t);
+#         buf.append("\t");
+#         buf.append(tokenIndex);
+#         serializeText(buf, text);
+
+
+    ## A S T  E v e n t s
+
+    def nilNode(self, t):
+        self.transmit("nilNode\t{}".format(self.adaptor.getUniqueID(t)))
+
+
+    def errorNode(self, t):
+        self.transmit('errorNode\t{}\t{}\t"{}'.format(
+             self.adaptor.getUniqueID(t),
+             INVALID_TOKEN_TYPE,
+             self.escapeNewlines(t.toString())))
+
+
+    def createNode(self, node, token=None):
+        if token is not None:
+            self.transmit("createNode\t{}\t{}".format(
+                    self.adaptor.getUniqueID(node),
+                    token.index))
+
+        else:
+            self.transmit('createNodeFromTokenElements\t{}\t{}\t"{}'.format(
+                    self.adaptor.getUniqueID(node),
+                    self.adaptor.getType(node),
+                    self.adaptor.getText(node)))
+
+
+    def becomeRoot(self, newRoot, oldRoot):
+        self.transmit("becomeRoot\t{}\t{}".format(
+                self.adaptor.getUniqueID(newRoot),
+                self.adaptor.getUniqueID(oldRoot)))
+
+
+    def addChild(self, root, child):
+        self.transmit("addChild\t{}\t{}".format(
+                self.adaptor.getUniqueID(root),
+                self.adaptor.getUniqueID(child)))
+
+
+    def setTokenBoundaries(self, t, tokenStartIndex, tokenStopIndex):
+        self.transmit("setTokenBoundaries\t{}\t{}\t{}".format(
+                self.adaptor.getUniqueID(t),
+                tokenStartIndex, tokenStopIndex))
+
+
+
+    ## support
+
+    def setTreeAdaptor(self, adaptor):
+        self.adaptor = adaptor
+
+    def getTreeAdaptor(self):
+        return self.adaptor
+
+
+    def serializeToken(self, t):
+        buf = [str(int(t.index)),
+               str(int(t.type)),
+               str(int(t.channel)),
+               str(int(t.line or 0)),
+               str(int(t.charPositionInLine or 0)),
+               '"' + self.escapeNewlines(t.text)]
+        return '\t'.join(buf)
+
+
+    def escapeNewlines(self, txt):
+        if txt is None:
+            return ''
+
+        txt = txt.replace("%","%25")   # escape all escape char ;)
+        txt = txt.replace("\n","%0A")  # escape \n
+        txt = txt.replace("\r","%0D")  # escape \r
+        return txt
diff --git a/runtime/Python3/antlr3/dfa.py b/runtime/Python3/antlr3/dfa.py
new file mode 100644
index 0000000..95ad15a
--- /dev/null
+++ b/runtime/Python3/antlr3/dfa.py
@@ -0,0 +1,195 @@
+"""ANTLR3 runtime package"""
+
+# begin[licence]
+#
+# [The "BSD licence"]
+# Copyright (c) 2005-2012 Terence Parr
+# 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[licence]
+
+from .constants import EOF
+from .exceptions import NoViableAltException, BacktrackingFailed
+
+
+class DFA(object):
+    """@brief A DFA implemented as a set of transition tables.
+
+    Any state that has a semantic predicate edge is special; those states
+    are generated with if-then-else structures in a specialStateTransition()
+    which is generated by cyclicDFA template.
+    
+    """
+    
+    def __init__(
+        self,
+        recognizer, decisionNumber,
+        eot, eof, min, max, accept, special, transition
+        ):
+        ## Which recognizer encloses this DFA?  Needed to check backtracking
+        self.recognizer = recognizer
+
+        self.decisionNumber = decisionNumber
+        self.eot = eot
+        self.eof = eof
+        self.min = min
+        self.max = max
+        self.accept = accept
+        self.special = special
+        self.transition = transition
+
+
+    def predict(self, input):
+        """
+        From the input stream, predict what alternative will succeed
+        using this DFA (representing the covering regular approximation
+        to the underlying CFL).  Return an alternative number 1..n.  Throw
+        an exception upon error.
+        """
+        mark = input.mark()
+        s = 0 # we always start at s0
+        try:
+            for _ in range(50000):
+                specialState = self.special[s]
+                if specialState >= 0:
+                    s = self.specialStateTransition(specialState, input)
+                    if s == -1:
+                        self.noViableAlt(s, input)
+                        return 0
+                    input.consume()
+                    continue
+
+                if self.accept[s] >= 1:
+                    return self.accept[s]
+
+                # look for a normal char transition
+                c = input.LA(1)
+
+                if c >= self.min[s] and c <= self.max[s]:
+                    # move to next state
+                    snext = self.transition[s][c-self.min[s]]
+                    
+                    if snext < 0:
+                        # was in range but not a normal transition
+                        # must check EOT, which is like the else clause.
+                        # eot[s]>=0 indicates that an EOT edge goes to another
+                        # state.
+                        if self.eot[s] >= 0: # EOT Transition to accept state?
+                            s = self.eot[s]
+                            input.consume()
+                            # TODO: I had this as return accept[eot[s]]
+                            # which assumed here that the EOT edge always
+                            # went to an accept...faster to do this, but
+                            # what about predicated edges coming from EOT
+                            # target?
+                            continue
+
+                        self.noViableAlt(s, input)
+                        return 0
+
+                    s = snext
+                    input.consume()
+                    continue
+
+                if self.eot[s] >= 0:
+                    s = self.eot[s]
+                    input.consume()
+                    continue
+
+                # EOF Transition to accept state?
+                if c == EOF and self.eof[s] >= 0:
+                    return self.accept[self.eof[s]]
+
+                # not in range and not EOF/EOT, must be invalid symbol
+                self.noViableAlt(s, input)
+                return 0
+
+            else:
+                raise RuntimeError("DFA bang!")
+            
+        finally:
+            input.rewind(mark)
+
+
+    def noViableAlt(self, s, input):
+        if self.recognizer._state.backtracking > 0:
+            raise BacktrackingFailed
+
+        nvae = NoViableAltException(
+            self.getDescription(),
+            self.decisionNumber,
+            s,
+            input
+            )
+
+        self.error(nvae)
+        raise nvae
+
+
+    def error(self, nvae):
+        """A hook for debugging interface"""
+        pass
+
+
+    def specialStateTransition(self, s, input):
+        return -1
+
+
+    def getDescription(self):
+        return "n/a"
+
+
+##     def specialTransition(self, state, symbol):
+##         return 0
+
+
+    @classmethod
+    def unpack(cls, string):
+        """@brief Unpack the runlength encoded table data.
+
+        Terence implemented packed table initializers, because Java has a
+        size restriction on .class files and the lookup tables can grow
+        pretty large. The generated JavaLexer.java of the Java.g example
+        would be about 15MB with uncompressed array initializers.
+
+        Python does not have any size restrictions, but the compilation of
+        such large source files seems to be pretty memory hungry. The memory
+        consumption of the python process grew to >1.5GB when importing a
+        15MB lexer, eating all my swap space and I was to impacient to see,
+        if it could finish at all. With packed initializers that are unpacked
+        at import time of the lexer module, everything works like a charm.
+        
+        """
+        
+        ret = []
+        for i in range(0, len(string) - 1, 2):
+            (n, v) = ord(string[i]), ord(string[i + 1])
+
+            if v == 0xFFFF:
+                v = -1
+
+            ret += [v] * n
+
+        return ret
diff --git a/runtime/Python3/antlr3/exceptions.py b/runtime/Python3/antlr3/exceptions.py
new file mode 100644
index 0000000..78ea441
--- /dev/null
+++ b/runtime/Python3/antlr3/exceptions.py
@@ -0,0 +1,364 @@
+"""ANTLR3 exception hierarchy"""
+
+# begin[licence]
+#
+# [The "BSD licence"]
+# Copyright (c) 2005-2012 Terence Parr
+# 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[licence]
+
+from .constants import INVALID_TOKEN_TYPE
+
+
+class BacktrackingFailed(Exception):
+    """@brief Raised to signal failed backtrack attempt"""
+
+    pass
+
+
+class RecognitionException(Exception):
+    """@brief The root of the ANTLR exception hierarchy.
+
+    To avoid English-only error messages and to generally make things
+    as flexible as possible, these exceptions are not created with strings,
+    but rather the information necessary to generate an error.  Then
+    the various reporting methods in Parser and Lexer can be overridden
+    to generate a localized error message.  For example, MismatchedToken
+    exceptions are built with the expected token type.
+    So, don't expect getMessage() to return anything.
+
+    Note that as of Java 1.4, you can access the stack trace, which means
+    that you can compute the complete trace of rules from the start symbol.
+    This gives you considerable context information with which to generate
+    useful error messages.
+
+    ANTLR generates code that throws exceptions upon recognition error and
+    also generates code to catch these exceptions in each rule.  If you
+    want to quit upon first error, you can turn off the automatic error
+    handling mechanism using rulecatch action, but you still need to
+    override methods mismatch and recoverFromMismatchSet.
+    
+    In general, the recognition exceptions can track where in a grammar a
+    problem occurred and/or what was the expected input.  While the parser
+    knows its state (such as current input symbol and line info) that
+    state can change before the exception is reported so current token index
+    is computed and stored at exception time.  From this info, you can
+    perhaps print an entire line of input not just a single token, for example.
+    Better to just say the recognizer had a problem and then let the parser
+    figure out a fancy report.
+    
+    """
+
+    def __init__(self, input=None):
+        super().__init__()
+
+        # What input stream did the error occur in?
+        self.input = None
+
+        # What is index of token/char were we looking at when the error
+        # occurred?
+        self.index = None
+
+        # The current Token when an error occurred.  Since not all streams
+        # can retrieve the ith Token, we have to track the Token object.
+        # For parsers.  Even when it's a tree parser, token might be set.
+        self.token = None
+
+        # If this is a tree parser exception, node is set to the node with
+        # the problem.
+        self.node = None
+
+        # The current char when an error occurred. For lexers.
+        self.c = None
+
+        # Track the line at which the error occurred in case this is
+        # generated from a lexer.  We need to track this since the
+        # unexpected char doesn't carry the line info.
+        self.line = None
+
+        self.charPositionInLine = None
+
+        # If you are parsing a tree node stream, you will encounter som
+        # imaginary nodes w/o line/col info.  We now search backwards looking
+        # for most recent token with line/col info, but notify getErrorHeader()
+        # that info is approximate.
+        self.approximateLineInfo = False
+
+        
+        if input:
+            self.input = input
+            self.index = input.index()
+
+            # late import to avoid cyclic dependencies
+            from .streams import TokenStream, CharStream
+            from .tree import TreeNodeStream
+
+            if isinstance(self.input, TokenStream):
+                self.token = self.input.LT(1)
+                self.line = self.token.line
+                self.charPositionInLine = self.token.charPositionInLine
+
+            if isinstance(self.input, TreeNodeStream):
+                self.extractInformationFromTreeNodeStream(self.input)
+
+            else:
+                if isinstance(self.input, CharStream):
+                    self.c = self.input.LT(1)
+                    self.line = self.input.line
+                    self.charPositionInLine = self.input.charPositionInLine
+
+                else:
+                    self.c = self.input.LA(1)
+
+    def extractInformationFromTreeNodeStream(self, nodes):
+        from .tree import Tree, CommonTree
+        from .tokens import CommonToken
+        
+        self.node = nodes.LT(1)
+        adaptor = nodes.adaptor
+        payload = adaptor.getToken(self.node)
+        if payload:
+            self.token = payload
+            if payload.line <= 0:
+                # imaginary node; no line/pos info; scan backwards
+                i = -1
+                priorNode = nodes.LT(i)
+                while priorNode:
+                    priorPayload = adaptor.getToken(priorNode)
+                    if priorPayload and priorPayload.line > 0:
+                        # we found the most recent real line / pos info
+                        self.line = priorPayload.line
+                        self.charPositionInLine = priorPayload.charPositionInLine
+                        self.approximateLineInfo = True
+                        break
+                    
+                    i -= 1
+                    priorNode = nodes.LT(i)
+                    
+            else: # node created from real token
+                self.line = payload.line
+                self.charPositionInLine = payload.charPositionInLine
+                
+        elif isinstance(self.node, Tree):
+            self.line = self.node.line
+            self.charPositionInLine = self.node.charPositionInLine
+            if isinstance(self.node, CommonTree):
+                self.token = self.node.token
+
+        else:
+            type = adaptor.getType(self.node)
+            text = adaptor.getText(self.node)
+            self.token = CommonToken(type=type, text=text)
+
+     
+    def getUnexpectedType(self):
+        """Return the token type or char of the unexpected input element"""
+
+        from .streams import TokenStream
+        from .tree import TreeNodeStream
+
+        if isinstance(self.input, TokenStream):
+            return self.token.type
+
+        elif isinstance(self.input, TreeNodeStream):
+            adaptor = self.input.treeAdaptor
+            return adaptor.getType(self.node)
+
+        else:
+            return self.c
+
+    unexpectedType = property(getUnexpectedType)
+    
+
+class MismatchedTokenException(RecognitionException):
+    """@brief A mismatched char or Token or tree node."""
+    
+    def __init__(self, expecting, input):
+        super().__init__(input)
+        self.expecting = expecting
+        
+
+    def __str__(self):
+        return "MismatchedTokenException({!r}!={!r})".format(
+            self.getUnexpectedType(), self.expecting
+            )
+    __repr__ = __str__
+
+
+class UnwantedTokenException(MismatchedTokenException):
+    """An extra token while parsing a TokenStream"""
+
+    def getUnexpectedToken(self):
+        return self.token
+
+
+    def __str__(self):
+        exp = ", expected {}".format(self.expecting)
+        if self.expecting == INVALID_TOKEN_TYPE:
+            exp = ""
+
+        if not self.token:
+            return "UnwantedTokenException(found={}{})".format(None, exp)
+
+        return "UnwantedTokenException(found={}{})".format(self.token.text, exp)
+    __repr__ = __str__
+
+
+class MissingTokenException(MismatchedTokenException):
+    """
+    We were expecting a token but it's not found.  The current token
+    is actually what we wanted next.
+    """
+
+    def __init__(self, expecting, input, inserted):
+        super().__init__(expecting, input)
+
+        self.inserted = inserted
+
+
+    def getMissingType(self):
+        return self.expecting
+
+
+    def __str__(self):
+        if self.token:
+            if self.inserted:
+                return "MissingTokenException(inserted {!r} at {!r})".format(
+                    self.inserted, self.token.text)
+
+            return "MissingTokenException(at {!r})".format(self.token.text)
+
+        return "MissingTokenException"
+    __repr__ = __str__
+
+
+class MismatchedRangeException(RecognitionException):
+    """@brief The next token does not match a range of expected types."""
+
+    def __init__(self, a, b, input):
+        super().__init__(input)
+
+        self.a = a
+        self.b = b
+        
+
+    def __str__(self):
+        return "MismatchedRangeException({!r} not in [{!r}..{!r}])".format(
+            self.getUnexpectedType(), self.a, self.b
+            )
+    __repr__ = __str__
+    
+
+class MismatchedSetException(RecognitionException):
+    """@brief The next token does not match a set of expected types."""
+
+    def __init__(self, expecting, input):
+        super().__init__(input)
+
+        self.expecting = expecting
+        
+
+    def __str__(self):
+        return "MismatchedSetException({!r} not in {!r})".format(
+            self.getUnexpectedType(), self.expecting
+            )
+    __repr__ = __str__
+
+
+class MismatchedNotSetException(MismatchedSetException):
+    """@brief Used for remote debugger deserialization"""
+    
+    def __str__(self):
+        return "MismatchedNotSetException({!r}!={!r})".format(
+            self.getUnexpectedType(), self.expecting
+            )
+    __repr__ = __str__
+
+
+class NoViableAltException(RecognitionException):
+    """@brief Unable to decide which alternative to choose."""
+
+    def __init__(
+        self, grammarDecisionDescription, decisionNumber, stateNumber, input
+        ):
+        super().__init__(input)
+
+        self.grammarDecisionDescription = grammarDecisionDescription
+        self.decisionNumber = decisionNumber
+        self.stateNumber = stateNumber
+
+
+    def __str__(self):
+        return "NoViableAltException({!r}!=[{!r}])".format(
+            self.unexpectedType, self.grammarDecisionDescription
+            )
+    __repr__ = __str__
+    
+
+class EarlyExitException(RecognitionException):
+    """@brief The recognizer did not match anything for a (..)+ loop."""
+
+    def __init__(self, decisionNumber, input):
+        super().__init__(input)
+
+        self.decisionNumber = decisionNumber
+
+
+class FailedPredicateException(RecognitionException):
+    """@brief A semantic predicate failed during validation.
+
+    Validation of predicates
+    occurs when normally parsing the alternative just like matching a token.
+    Disambiguating predicate evaluation occurs when we hoist a predicate into
+    a prediction decision.
+    """
+
+    def __init__(self, input, ruleName, predicateText):
+        super().__init__(input)
+        
+        self.ruleName = ruleName
+        self.predicateText = predicateText
+
+
+    def __str__(self):
+        return "FailedPredicateException({},{{{}}}?)".format(
+            self.ruleName, self.predicateText)
+    __repr__ = __str__
+    
+
+class MismatchedTreeNodeException(RecognitionException):
+    """@brief The next tree mode does not match the expected type."""
+
+    def __init__(self, expecting, input):
+        super().__init__(input)
+        
+        self.expecting = expecting
+
+    def __str__(self):
+        return "MismatchedTreeNodeException({!r}!={!r})".format(
+            self.getUnexpectedType(), self.expecting
+            )
+    __repr__ = __str__
diff --git a/runtime/Python3/antlr3/main.py b/runtime/Python3/antlr3/main.py
new file mode 100644
index 0000000..739726b
--- /dev/null
+++ b/runtime/Python3/antlr3/main.py
@@ -0,0 +1,234 @@
+"""ANTLR3 runtime package"""
+
+# begin[licence]
+#
+# [The "BSD licence"]
+# Copyright (c) 2005-2012 Terence Parr
+# 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[licence]
+
+
+import sys
+import argparse
+
+from .streams import ANTLRStringStream, ANTLRFileStream, \
+     ANTLRInputStream, CommonTokenStream
+from .tree import CommonTreeNodeStream
+
+
+class _Main(object):
+    def __init__(self):
+        self.stdin = sys.stdin
+        self.stdout = sys.stdout
+        self.stderr = sys.stderr
+
+
+    def parseArgs(self, argv):
+        argParser = argparse.ArgumentParser()
+        argParser.add_argument("--input")
+        argParser.add_argument("--interactive", "-i", action="store_true")
+        argParser.add_argument("--no-output", action="store_true")
+        argParser.add_argument("--profile", action="store_true")
+        argParser.add_argument("--hotshot", action="store_true")
+        argParser.add_argument("--port", type=int)
+        argParser.add_argument("--debug-socket", action='store_true')
+        argParser.add_argument("file", nargs='?')
+
+        self.setupArgs(argParser)
+
+        return argParser.parse_args(argv[1:])
+
+
+    def setupArgs(self, argParser):
+        pass
+
+
+    def execute(self, argv):
+        args = self.parseArgs(argv)
+
+        self.setUp(args)
+
+        if args.interactive:
+            while True:
+                try:
+                    input_str = input(">>> ")
+                except (EOFError, KeyboardInterrupt):
+                    self.stdout.write("\nBye.\n")
+                    break
+
+                inStream = ANTLRStringStream(input_str)
+                self.parseStream(args, inStream)
+
+        else:
+            if args.input:
+                inStream = ANTLRStringStream(args.input)
+
+            elif args.file and args.file != '-':
+                inStream = ANTLRFileStream(args.file)
+
+            else:
+                inStream = ANTLRInputStream(self.stdin)
+
+            if args.profile:
+                try:
+                    import cProfile as profile
+                except ImportError:
+                    import profile
+
+                profile.runctx(
+                    'self.parseStream(args, inStream)',
+                    globals(),
+                    locals(),
+                    'profile.dat'
+                    )
+
+                import pstats
+                stats = pstats.Stats('profile.dat')
+                stats.strip_dirs()
+                stats.sort_stats('time')
+                stats.print_stats(100)
+
+            elif args.hotshot:
+                import hotshot
+
+                profiler = hotshot.Profile('hotshot.dat')
+                profiler.runctx(
+                    'self.parseStream(args, inStream)',
+                    globals(),
+                    locals()
+                    )
+
+            else:
+                self.parseStream(args, inStream)
+
+
+    def setUp(self, args):
+        pass
+
+
+    def parseStream(self, args, inStream):
+        raise NotImplementedError
+
+
+    def write(self, args, text):
+        if not args.no_output:
+            self.stdout.write(text)
+
+
+    def writeln(self, args, text):
+        self.write(args, text + '\n')
+
+
+class LexerMain(_Main):
+    def __init__(self, lexerClass):
+        super().__init__()
+
+        self.lexerClass = lexerClass
+
+
+    def parseStream(self, args, inStream):
+        lexer = self.lexerClass(inStream)
+        for token in lexer:
+            self.writeln(args, str(token))
+
+
+class ParserMain(_Main):
+    def __init__(self, lexerClassName, parserClass):
+        super().__init__()
+
+        self.lexerClassName = lexerClassName
+        self.lexerClass = None
+        self.parserClass = parserClass
+
+
+    def setupArgs(self, argParser):
+        argParser.add_argument("--lexer", dest="lexerClass",
+                               default=self.lexerClassName)
+        argParser.add_argument("--rule", dest="parserRule")
+
+
+    def setUp(self, args):
+        lexerMod = __import__(args.lexerClass)
+        self.lexerClass = getattr(lexerMod, args.lexerClass)
+
+
+    def parseStream(self, args, inStream):
+        kwargs = {}
+        if args.port is not None:
+            kwargs['port'] = args.port
+        if args.debug_socket:
+            kwargs['debug_socket'] = sys.stderr
+
+        lexer = self.lexerClass(inStream)
+        tokenStream = CommonTokenStream(lexer)
+        parser = self.parserClass(tokenStream, **kwargs)
+        result = getattr(parser, args.parserRule)()
+        if result:
+            if hasattr(result, 'tree') and result.tree:
+                self.writeln(args, result.tree.toStringTree())
+            else:
+                self.writeln(args, repr(result))
+
+
+class WalkerMain(_Main):
+    def __init__(self, walkerClass):
+        super().__init__()
+
+        self.lexerClass = None
+        self.parserClass = None
+        self.walkerClass = walkerClass
+
+
+    def setupArgs(self, argParser):
+        argParser.add_argument("--lexer", dest="lexerClass")
+        argParser.add_argument("--parser", dest="parserClass")
+        argParser.add_argument("--parser-rule", dest="parserRule")
+        argParser.add_argument("--rule", dest="walkerRule")
+
+
+    def setUp(self, args):
+        lexerMod = __import__(args.lexerClass)
+        self.lexerClass = getattr(lexerMod, args.lexerClass)
+        parserMod = __import__(args.parserClass)
+        self.parserClass = getattr(parserMod, args.parserClass)
+
+
+    def parseStream(self, args, inStream):
+        lexer = self.lexerClass(inStream)
+        tokenStream = CommonTokenStream(lexer)
+        parser = self.parserClass(tokenStream)
+        result = getattr(parser, args.parserRule)()
+        if result:
+            assert hasattr(result, 'tree'), "Parser did not return an AST"
+            nodeStream = CommonTreeNodeStream(result.tree)
+            nodeStream.setTokenStream(tokenStream)
+            walker = self.walkerClass(nodeStream)
+            result = getattr(walker, args.walkerRule)()
+            if result:
+                if hasattr(result, 'tree'):
+                    self.writeln(args, result.tree.toStringTree())
+                else:
+                    self.writeln(args, repr(result))
diff --git a/runtime/Python3/antlr3/recognizers.py b/runtime/Python3/antlr3/recognizers.py
new file mode 100644
index 0000000..3fdb593
--- /dev/null
+++ b/runtime/Python3/antlr3/recognizers.py
@@ -0,0 +1,1455 @@
+"""ANTLR3 runtime package"""
+
+# begin[licence]
+#
+# [The "BSD licence"]
+# Copyright (c) 2005-2012 Terence Parr
+# 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[licence]
+
+import sys
+import inspect
+
+from .constants import compatible_api_versions, DEFAULT_CHANNEL, \
+     HIDDEN_CHANNEL, EOF, EOR_TOKEN_TYPE, INVALID_TOKEN_TYPE
+from .exceptions import RecognitionException, MismatchedTokenException, \
+     MismatchedRangeException, MismatchedTreeNodeException, \
+     NoViableAltException, EarlyExitException, MismatchedSetException, \
+     MismatchedNotSetException, FailedPredicateException, \
+     BacktrackingFailed, UnwantedTokenException, MissingTokenException
+from .tokens import CommonToken, SKIP_TOKEN
+
+
+class RecognizerSharedState(object):
+    """
+    The set of fields needed by an abstract recognizer to recognize input
+    and recover from errors etc...  As a separate state object, it can be
+    shared among multiple grammars; e.g., when one grammar imports another.
+
+    These fields are publically visible but the actual state pointer per
+    parser is protected.
+    """
+
+    def __init__(self):
+        # Track the set of token types that can follow any rule invocation.
+        # Stack grows upwards.
+        self.following = []
+
+        # This is true when we see an error and before having successfully
+        # matched a token.  Prevents generation of more than one error message
+        # per error.
+        self.errorRecovery = False
+
+        # The index into the input stream where the last error occurred.
+        # This is used to prevent infinite loops where an error is found
+        # but no token is consumed during recovery...another error is found,
+        # ad naseum.  This is a failsafe mechanism to guarantee that at least
+        # one token/tree node is consumed for two errors.
+        self.lastErrorIndex = -1
+
+        # If 0, no backtracking is going on.  Safe to exec actions etc...
+        # If >0 then it's the level of backtracking.
+        self.backtracking = 0
+
+        # An array[size num rules] of (int -> int) dicts that tracks
+        # the stop token index for each rule.  ruleMemo[ruleIndex] is
+        # the memoization table for ruleIndex.  For key ruleStartIndex, you
+        # get back the stop token for associated rule or MEMO_RULE_FAILED.
+        #
+        # This is only used if rule memoization is on (which it is by default).
+        self.ruleMemo = None
+
+        ## Did the recognizer encounter a syntax error?  Track how many.
+        self.syntaxErrors = 0
+
+
+        # LEXER FIELDS (must be in same state object to avoid casting
+        # constantly in generated code and Lexer object) :(
+
+
+        ## The goal of all lexer rules/methods is to create a token object.
+        # This is an instance variable as multiple rules may collaborate to
+        # create a single token.  nextToken will return this object after
+        # matching lexer rule(s).  If you subclass to allow multiple token
+        # emissions, then set this to the last token to be matched or
+        # something nonnull so that the auto token emit mechanism will not
+        # emit another token.
+        self.token = None
+
+        ## What character index in the stream did the current token start at?
+        # Needed, for example, to get the text for current token.  Set at
+        # the start of nextToken.
+        self.tokenStartCharIndex = -1
+
+        ## The line on which the first character of the token resides
+        self.tokenStartLine = None
+
+        ## The character position of first character within the line
+        self.tokenStartCharPositionInLine = None
+
+        ## The channel number for the current token
+        self.channel = None
+
+        ## The token type for the current token
+        self.type = None
+
+        ## You can set the text for the current token to override what is in
+        # the input char buffer.  Use setText() or can set this instance var.
+        self.text = None
+
+
+class BaseRecognizer(object):
+    """
+    @brief Common recognizer functionality.
+
+    A generic recognizer that can handle recognizers generated from
+    lexer, parser, and tree grammars.  This is all the parsing
+    support code essentially; most of it is error recovery stuff and
+    backtracking.
+    """
+
+    MEMO_RULE_FAILED = -2
+    MEMO_RULE_UNKNOWN = -1
+
+    # copies from Token object for convenience in actions
+    DEFAULT_TOKEN_CHANNEL = DEFAULT_CHANNEL
+
+    # for convenience in actions
+    HIDDEN = HIDDEN_CHANNEL
+
+    # overridden by generated subclasses
+    grammarFileName = None
+    tokenNames = None
+
+    # The api_version attribute has been introduced in 3.3. If it is not
+    # overwritten in the generated recognizer, we assume a default of v0.
+    api_version = 0
+
+    def __init__(self, state=None):
+        # Input stream of the recognizer. Must be initialized by a subclass.
+        self.input = None
+
+        ## State of a lexer, parser, or tree parser are collected into a state
+        # object so the state can be shared.  This sharing is needed to
+        # have one grammar import others and share same error variables
+        # and other state variables.  It's a kind of explicit multiple
+        # inheritance via delegation of methods and shared state.
+        if state is None:
+            state = RecognizerSharedState()
+        self._state = state
+
+        if self.api_version not in compatible_api_versions:
+            raise RuntimeError(
+                "ANTLR version mismatch: "
+                "The recognizer has been generated with API V{}, "
+                "but this runtime does not support this."
+                .format(self.api_version))
+
+    # this one only exists to shut up pylint :(
+    def setInput(self, input):
+        self.input = input
+
+
+    def reset(self):
+        """
+        reset the parser's state; subclasses must rewind the input stream
+        """
+
+        # wack everything related to error recovery
+        if self._state is None:
+            # no shared state work to do
+            return
+
+        self._state.following = []
+        self._state.errorRecovery = False
+        self._state.lastErrorIndex = -1
+        self._state.syntaxErrors = 0
+        # wack everything related to backtracking and memoization
+        self._state.backtracking = 0
+        if self._state.ruleMemo is not None:
+            self._state.ruleMemo = {}
+
+
+    def match(self, input, ttype, follow):
+        """
+        Match current input symbol against ttype.  Attempt
+        single token insertion or deletion error recovery.  If
+        that fails, throw MismatchedTokenException.
+
+        To turn off single token insertion or deletion error
+        recovery, override recoverFromMismatchedToken() and have it
+        throw an exception. See TreeParser.recoverFromMismatchedToken().
+        This way any error in a rule will cause an exception and
+        immediate exit from rule.  Rule would recover by resynchronizing
+        to the set of symbols that can follow rule ref.
+        """
+
+        matchedSymbol = self.getCurrentInputSymbol(input)
+        if self.input.LA(1) == ttype:
+            self.input.consume()
+            self._state.errorRecovery = False
+            return matchedSymbol
+
+        if self._state.backtracking > 0:
+            # FIXME: need to return matchedSymbol here as well. damn!!
+            raise BacktrackingFailed
+
+        matchedSymbol = self.recoverFromMismatchedToken(input, ttype, follow)
+        return matchedSymbol
+
+
+    def matchAny(self):
+        """Match the wildcard: in a symbol"""
+
+        self._state.errorRecovery = False
+        self.input.consume()
+
+
+    def mismatchIsUnwantedToken(self, input, ttype):
+        return input.LA(2) == ttype
+
+
+    def mismatchIsMissingToken(self, input, follow):
+        if follow is None:
+            # we have no information about the follow; we can only consume
+            # a single token and hope for the best
+            return False
+
+        # compute what can follow this grammar element reference
+        if EOR_TOKEN_TYPE in follow:
+            viableTokensFollowingThisRule = self.computeContextSensitiveRuleFOLLOW()
+            follow |= viableTokensFollowingThisRule
+
+            if len(self._state.following) > 0:
+                # remove EOR if we're not the start symbol
+                follow -= {EOR_TOKEN_TYPE}
+
+        # if current token is consistent with what could come after set
+        # then we know we're missing a token; error recovery is free to
+        # "insert" the missing token
+        if input.LA(1) in follow or EOR_TOKEN_TYPE in follow:
+            return True
+
+        return False
+
+
+    def reportError(self, e):
+        """Report a recognition problem.
+
+        This method sets errorRecovery to indicate the parser is recovering
+        not parsing.  Once in recovery mode, no errors are generated.
+        To get out of recovery mode, the parser must successfully match
+        a token (after a resync).  So it will go:
+
+        1. error occurs
+        2. enter recovery mode, report error
+        3. consume until token found in resync set
+        4. try to resume parsing
+        5. next match() will reset errorRecovery mode
+
+        If you override, make sure to update syntaxErrors if you care about
+        that.
+
+        """
+
+        # if we've already reported an error and have not matched a token
+        # yet successfully, don't report any errors.
+        if self._state.errorRecovery:
+            return
+
+        self._state.syntaxErrors += 1 # don't count spurious
+        self._state.errorRecovery = True
+
+        self.displayRecognitionError(e)
+
+
+    def displayRecognitionError(self, e):
+        hdr = self.getErrorHeader(e)
+        msg = self.getErrorMessage(e)
+        self.emitErrorMessage(hdr + " " + msg)
+
+
+    def getErrorMessage(self, e):
+        """
+        What error message should be generated for the various
+        exception types?
+
+        Not very object-oriented code, but I like having all error message
+        generation within one method rather than spread among all of the
+        exception classes. This also makes it much easier for the exception
+        handling because the exception classes do not have to have pointers back
+        to this object to access utility routines and so on. Also, changing
+        the message for an exception type would be difficult because you
+        would have to subclassing exception, but then somehow get ANTLR
+        to make those kinds of exception objects instead of the default.
+        This looks weird, but trust me--it makes the most sense in terms
+        of flexibility.
+
+        For grammar debugging, you will want to override this to add
+        more information such as the stack frame with
+        getRuleInvocationStack(e, this.getClass().getName()) and,
+        for no viable alts, the decision description and state etc...
+
+        Override this to change the message generated for one or more
+        exception types.
+        """
+
+        if isinstance(e, UnwantedTokenException):
+            if e.expecting == EOF:
+                tokenName = "EOF"
+            else:
+                tokenName = self.tokenNames[e.expecting]
+
+            msg = "extraneous input {} expecting {}".format(
+                self.getTokenErrorDisplay(e.getUnexpectedToken()),
+                tokenName
+                )
+
+        elif isinstance(e, MissingTokenException):
+            if e.expecting == EOF:
+                tokenName = "EOF"
+            else:
+                tokenName = self.tokenNames[e.expecting]
+
+            msg = "missing {} at {}".format(
+                tokenName, self.getTokenErrorDisplay(e.token)
+                )
+
+        elif isinstance(e, MismatchedTokenException):
+            if e.expecting == EOF:
+                tokenName = "EOF"
+            else:
+                tokenName = self.tokenNames[e.expecting]
+
+            msg = "mismatched input {} expecting {}".format(
+                self.getTokenErrorDisplay(e.token),
+                tokenName
+                )
+
+        elif isinstance(e, MismatchedTreeNodeException):
+            if e.expecting == EOF:
+                tokenName = "EOF"
+            else:
+                tokenName = self.tokenNames[e.expecting]
+
+            msg = "mismatched tree node: {} expecting {}".format(
+                e.node, tokenName)
+
+        elif isinstance(e, NoViableAltException):
+            msg = "no viable alternative at input {}".format(
+                self.getTokenErrorDisplay(e.token))
+
+        elif isinstance(e, EarlyExitException):
+            msg = "required (...)+ loop did not match anything at input {}".format(
+                self.getTokenErrorDisplay(e.token))
+
+        elif isinstance(e, MismatchedSetException):
+            msg = "mismatched input {} expecting set {!r}".format(
+                self.getTokenErrorDisplay(e.token),
+                e.expecting
+                )
+
+        elif isinstance(e, MismatchedNotSetException):
+            msg = "mismatched input {} expecting set {!r}".format(
+                self.getTokenErrorDisplay(e.token),
+                e.expecting
+                )
+
+        elif isinstance(e, FailedPredicateException):
+            msg = "rule {} failed predicate: {{{}}}?".format(
+                e.ruleName,
+                e.predicateText
+                )
+
+        else:
+            msg = str(e)
+
+        return msg
+
+
+    def getNumberOfSyntaxErrors(self):
+        """
+        Get number of recognition errors (lexer, parser, tree parser).  Each
+        recognizer tracks its own number.  So parser and lexer each have
+        separate count.  Does not count the spurious errors found between
+        an error and next valid token match.
+
+        See also reportError().
+        """
+        return self._state.syntaxErrors
+
+
+    def getErrorHeader(self, e):
+        """
+        What is the error header, normally line/character position information?
+        """
+
+        source_name = self.getSourceName()
+        if source_name is not None:
+            return "{} line {}:{}".format(source_name, e.line, e.charPositionInLine)
+        return "line {}:{}".format(e.line, e.charPositionInLine)
+
+
+    def getTokenErrorDisplay(self, t):
+        """
+        How should a token be displayed in an error message? The default
+        is to display just the text, but during development you might
+        want to have a lot of information spit out.  Override in that case
+        to use t.toString() (which, for CommonToken, dumps everything about
+        the token). This is better than forcing you to override a method in
+        your token objects because you don't have to go modify your lexer
+        so that it creates a new Java type.
+        """
+
+        s = t.text
+        if s is None:
+            if t.type == EOF:
+                s = "<EOF>"
+            else:
+                s = "<{}>".format(t.typeName)
+
+        return repr(s)
+
+
+    def emitErrorMessage(self, msg):
+        """Override this method to change where error messages go"""
+        sys.stderr.write(msg + '\n')
+
+
+    def recover(self, input, re):
+        """
+        Recover from an error found on the input stream.  This is
+        for NoViableAlt and mismatched symbol exceptions.  If you enable
+        single token insertion and deletion, this will usually not
+        handle mismatched symbol exceptions but there could be a mismatched
+        token that the match() routine could not recover from.
+        """
+
+        # PROBLEM? what if input stream is not the same as last time
+        # perhaps make lastErrorIndex a member of input
+        if self._state.lastErrorIndex == input.index():
+            # uh oh, another error at same token index; must be a case
+            # where LT(1) is in the recovery token set so nothing is
+            # consumed; consume a single token so at least to prevent
+            # an infinite loop; this is a failsafe.
+            input.consume()
+
+        self._state.lastErrorIndex = input.index()
+        followSet = self.computeErrorRecoverySet()
+
+        self.beginResync()
+        self.consumeUntil(input, followSet)
+        self.endResync()
+
+
+    def beginResync(self):
+        """
+        A hook to listen in on the token consumption during error recovery.
+        The DebugParser subclasses this to fire events to the listenter.
+        """
+
+        pass
+
+
+    def endResync(self):
+        """
+        A hook to listen in on the token consumption during error recovery.
+        The DebugParser subclasses this to fire events to the listenter.
+        """
+
+        pass
+
+
+    def computeErrorRecoverySet(self):
+        """
+        Compute the error recovery set for the current rule.  During
+        rule invocation, the parser pushes the set of tokens that can
+        follow that rule reference on the stack; this amounts to
+        computing FIRST of what follows the rule reference in the
+        enclosing rule. This local follow set only includes tokens
+        from within the rule; i.e., the FIRST computation done by
+        ANTLR stops at the end of a rule.
+
+        EXAMPLE
+
+        When you find a "no viable alt exception", the input is not
+        consistent with any of the alternatives for rule r.  The best
+        thing to do is to consume tokens until you see something that
+        can legally follow a call to r *or* any rule that called r.
+        You don't want the exact set of viable next tokens because the
+        input might just be missing a token--you might consume the
+        rest of the input looking for one of the missing tokens.
+
+        Consider grammar:
+
+        a : '[' b ']'
+          | '(' b ')'
+          ;
+        b : c '^' INT ;
+        c : ID
+          | INT
+          ;
+
+        At each rule invocation, the set of tokens that could follow
+        that rule is pushed on a stack.  Here are the various "local"
+        follow sets:
+
+        FOLLOW(b1_in_a) = FIRST(']') = ']'
+        FOLLOW(b2_in_a) = FIRST(')') = ')'
+        FOLLOW(c_in_b) = FIRST('^') = '^'
+
+        Upon erroneous input "[]", the call chain is
+
+        a -> b -> c
+
+        and, hence, the follow context stack is:
+
+        depth  local follow set     after call to rule
+          0         \<EOF>                    a (from main())
+          1          ']'                     b
+          3          '^'                     c
+
+        Notice that ')' is not included, because b would have to have
+        been called from a different context in rule a for ')' to be
+        included.
+
+        For error recovery, we cannot consider FOLLOW(c)
+        (context-sensitive or otherwise).  We need the combined set of
+        all context-sensitive FOLLOW sets--the set of all tokens that
+        could follow any reference in the call chain.  We need to
+        resync to one of those tokens.  Note that FOLLOW(c)='^' and if
+        we resync'd to that token, we'd consume until EOF.  We need to
+        sync to context-sensitive FOLLOWs for a, b, and c: {']','^'}.
+        In this case, for input "[]", LA(1) is in this set so we would
+        not consume anything and after printing an error rule c would
+        return normally.  It would not find the required '^' though.
+        At this point, it gets a mismatched token error and throws an
+        exception (since LA(1) is not in the viable following token
+        set).  The rule exception handler tries to recover, but finds
+        the same recovery set and doesn't consume anything.  Rule b
+        exits normally returning to rule a.  Now it finds the ']' (and
+        with the successful match exits errorRecovery mode).
+
+        So, you cna see that the parser walks up call chain looking
+        for the token that was a member of the recovery set.
+
+        Errors are not generated in errorRecovery mode.
+
+        ANTLR's error recovery mechanism is based upon original ideas:
+
+        "Algorithms + Data Structures = Programs" by Niklaus Wirth
+
+        and
+
+        "A note on error recovery in recursive descent parsers":
+        http://portal.acm.org/citation.cfm?id=947902.947905
+
+        Later, Josef Grosch had some good ideas:
+
+        "Efficient and Comfortable Error Recovery in Recursive Descent
+        Parsers":
+        ftp://www.cocolab.com/products/cocktail/doca4.ps/ell.ps.zip
+
+        Like Grosch I implemented local FOLLOW sets that are combined
+        at run-time upon error to avoid overhead during parsing.
+        """
+
+        return self.combineFollows(False)
+
+
+    def computeContextSensitiveRuleFOLLOW(self):
+        """
+        Compute the context-sensitive FOLLOW set for current rule.
+        This is set of token types that can follow a specific rule
+        reference given a specific call chain.  You get the set of
+        viable tokens that can possibly come next (lookahead depth 1)
+        given the current call chain.  Contrast this with the
+        definition of plain FOLLOW for rule r:
+
+         FOLLOW(r)={x | S=>*alpha r beta in G and x in FIRST(beta)}
+
+        where x in T* and alpha, beta in V*; T is set of terminals and
+        V is the set of terminals and nonterminals.  In other words,
+        FOLLOW(r) is the set of all tokens that can possibly follow
+        references to r in *any* sentential form (context).  At
+        runtime, however, we know precisely which context applies as
+        we have the call chain.  We may compute the exact (rather
+        than covering superset) set of following tokens.
+
+        For example, consider grammar:
+
+        stat : ID '=' expr ';'      // FOLLOW(stat)=={EOF}
+             | "return" expr '.'
+             ;
+        expr : atom ('+' atom)* ;   // FOLLOW(expr)=={';','.',')'}
+        atom : INT                  // FOLLOW(atom)=={'+',')',';','.'}
+             | '(' expr ')'
+             ;
+
+        The FOLLOW sets are all inclusive whereas context-sensitive
+        FOLLOW sets are precisely what could follow a rule reference.
+        For input "i=(3);", here is the derivation:
+
+        stat => ID '=' expr ';'
+             => ID '=' atom ('+' atom)* ';'
+             => ID '=' '(' expr ')' ('+' atom)* ';'
+             => ID '=' '(' atom ')' ('+' atom)* ';'
+             => ID '=' '(' INT ')' ('+' atom)* ';'
+             => ID '=' '(' INT ')' ';'
+
+        At the "3" token, you'd have a call chain of
+
+          stat -> expr -> atom -> expr -> atom
+
+        What can follow that specific nested ref to atom?  Exactly ')'
+        as you can see by looking at the derivation of this specific
+        input.  Contrast this with the FOLLOW(atom)={'+',')',';','.'}.
+
+        You want the exact viable token set when recovering from a
+        token mismatch.  Upon token mismatch, if LA(1) is member of
+        the viable next token set, then you know there is most likely
+        a missing token in the input stream.  "Insert" one by just not
+        throwing an exception.
+        """
+
+        return self.combineFollows(True)
+
+
+    def combineFollows(self, exact):
+        followSet = set()
+        for idx, localFollowSet in reversed(list(enumerate(self._state.following))):
+            followSet |= localFollowSet
+            if exact:
+                # can we see end of rule?
+                if EOR_TOKEN_TYPE in localFollowSet:
+                    # Only leave EOR in set if at top (start rule); this lets
+                    # us know if have to include follow(start rule); i.e., EOF
+                    if idx > 0:
+                        followSet.remove(EOR_TOKEN_TYPE)
+
+                else:
+                    # can't see end of rule, quit
+                    break
+
+        return followSet
+
+
+    def recoverFromMismatchedToken(self, input, ttype, follow):
+        """Attempt to recover from a single missing or extra token.
+
+        EXTRA TOKEN
+
+        LA(1) is not what we are looking for.  If LA(2) has the right token,
+        however, then assume LA(1) is some extra spurious token.  Delete it
+        and LA(2) as if we were doing a normal match(), which advances the
+        input.
+
+        MISSING TOKEN
+
+        If current token is consistent with what could come after
+        ttype then it is ok to 'insert' the missing token, else throw
+        exception For example, Input 'i=(3;' is clearly missing the
+        ')'.  When the parser returns from the nested call to expr, it
+        will have call chain:
+
+          stat -> expr -> atom
+
+        and it will be trying to match the ')' at this point in the
+        derivation:
+
+             => ID '=' '(' INT ')' ('+' atom)* ';'
+                                ^
+        match() will see that ';' doesn't match ')' and report a
+        mismatched token error.  To recover, it sees that LA(1)==';'
+        is in the set of tokens that can follow the ')' token
+        reference in rule atom.  It can assume that you forgot the ')'.
+        """
+
+        e = None
+
+        # if next token is what we are looking for then "delete" this token
+        if self.mismatchIsUnwantedToken(input, ttype):
+            e = UnwantedTokenException(ttype, input)
+
+            self.beginResync()
+            input.consume() # simply delete extra token
+            self.endResync()
+
+            # report after consuming so AW sees the token in the exception
+            self.reportError(e)
+
+            # we want to return the token we're actually matching
+            matchedSymbol = self.getCurrentInputSymbol(input)
+
+            # move past ttype token as if all were ok
+            input.consume()
+            return matchedSymbol
+
+        # can't recover with single token deletion, try insertion
+        if self.mismatchIsMissingToken(input, follow):
+            inserted = self.getMissingSymbol(input, e, ttype, follow)
+            e = MissingTokenException(ttype, input, inserted)
+
+            # report after inserting so AW sees the token in the exception
+            self.reportError(e)
+            return inserted
+
+        # even that didn't work; must throw the exception
+        e = MismatchedTokenException(ttype, input)
+        raise e
+
+
+    def recoverFromMismatchedSet(self, input, e, follow):
+        """Not currently used"""
+
+        if self.mismatchIsMissingToken(input, follow):
+            self.reportError(e)
+            # we don't know how to conjure up a token for sets yet
+            return self.getMissingSymbol(input, e, INVALID_TOKEN_TYPE, follow)
+
+        # TODO do single token deletion like above for Token mismatch
+        raise e
+
+
+    def getCurrentInputSymbol(self, input):
+        """
+        Match needs to return the current input symbol, which gets put
+        into the label for the associated token ref; e.g., x=ID.  Token
+        and tree parsers need to return different objects. Rather than test
+        for input stream type or change the IntStream interface, I use
+        a simple method to ask the recognizer to tell me what the current
+        input symbol is.
+
+        This is ignored for lexers.
+        """
+
+        return None
+
+
+    def getMissingSymbol(self, input, e, expectedTokenType, follow):
+        """Conjure up a missing token during error recovery.
+
+        The recognizer attempts to recover from single missing
+        symbols. But, actions might refer to that missing symbol.
+        For example, x=ID {f($x);}. The action clearly assumes
+        that there has been an identifier matched previously and that
+        $x points at that token. If that token is missing, but
+        the next token in the stream is what we want we assume that
+        this token is missing and we keep going. Because we
+        have to return some token to replace the missing token,
+        we have to conjure one up. This method gives the user control
+        over the tokens returned for missing tokens. Mostly,
+        you will want to create something special for identifier
+        tokens. For literals such as '{' and ',', the default
+        action in the parser or tree parser works. It simply creates
+        a CommonToken of the appropriate type. The text will be the token.
+        If you change what tokens must be created by the lexer,
+        override this method to create the appropriate tokens.
+        """
+
+        return None
+
+
+    def consumeUntil(self, input, tokenTypes):
+        """
+        Consume tokens until one matches the given token or token set
+
+        tokenTypes can be a single token type or a set of token types
+
+        """
+
+        if not isinstance(tokenTypes, (set, frozenset)):
+            tokenTypes = frozenset([tokenTypes])
+
+        ttype = input.LA(1)
+        while ttype != EOF and ttype not in tokenTypes:
+            input.consume()
+            ttype = input.LA(1)
+
+
+    def getRuleInvocationStack(self):
+        """
+        Return List<String> of the rules in your parser instance
+        leading up to a call to this method.  You could override if
+        you want more details such as the file/line info of where
+        in the parser java code a rule is invoked.
+
+        This is very useful for error messages and for context-sensitive
+        error recovery.
+
+        You must be careful, if you subclass a generated recognizers.
+        The default implementation will only search the module of self
+        for rules, but the subclass will not contain any rules.
+        You probably want to override this method to look like
+
+        def getRuleInvocationStack(self):
+            return self._getRuleInvocationStack(<class>.__module__)
+
+        where <class> is the class of the generated recognizer, e.g.
+        the superclass of self.
+        """
+
+        return self._getRuleInvocationStack(self.__module__)
+
+
+    @classmethod
+    def _getRuleInvocationStack(cls, module):
+        """
+        A more general version of getRuleInvocationStack where you can
+        pass in, for example, a RecognitionException to get it's rule
+        stack trace.  This routine is shared with all recognizers, hence,
+        static.
+
+        TODO: move to a utility class or something; weird having lexer call
+        this
+        """
+
+        # mmmhhh,... perhaps look at the first argument
+        # (f_locals[co_varnames[0]]?) and test if it's a (sub)class of
+        # requested recognizer...
+
+        rules = []
+        for frame in reversed(inspect.stack()):
+            code = frame[0].f_code
+            codeMod = inspect.getmodule(code)
+            if codeMod is None:
+                continue
+
+            # skip frames not in requested module
+            if codeMod.__name__ != module:
+                continue
+
+            # skip some unwanted names
+            if code.co_name in ('nextToken', '<module>'):
+                continue
+
+            rules.append(code.co_name)
+
+        return rules
+
+
+    def getBacktrackingLevel(self):
+        return self._state.backtracking
+
+    def setBacktrackingLevel(self, n):
+        self._state.backtracking = n
+
+
+    def getGrammarFileName(self):
+        """For debugging and other purposes, might want the grammar name.
+
+        Have ANTLR generate an implementation for this method.
+        """
+
+        return self.grammarFileName
+
+
+    def getSourceName(self):
+        raise NotImplementedError
+
+
+    def toStrings(self, tokens):
+        """A convenience method for use most often with template rewrites.
+
+        Convert a Token list to a str list.
+        """
+
+        if tokens is None:
+            return None
+
+        return [token.text for token in tokens]
+
+
+    def getRuleMemoization(self, ruleIndex, ruleStartIndex):
+        """
+        Given a rule number and a start token index number, return
+        MEMO_RULE_UNKNOWN if the rule has not parsed input starting from
+        start index.  If this rule has parsed input starting from the
+        start index before, then return where the rule stopped parsing.
+        It returns the index of the last token matched by the rule.
+        """
+
+        if ruleIndex not in self._state.ruleMemo:
+            self._state.ruleMemo[ruleIndex] = {}
+
+        return self._state.ruleMemo[ruleIndex].get(
+            ruleStartIndex, self.MEMO_RULE_UNKNOWN
+            )
+
+
+    def alreadyParsedRule(self, input, ruleIndex):
+        """
+        Has this rule already parsed input at the current index in the
+        input stream?  Return the stop token index or MEMO_RULE_UNKNOWN.
+        If we attempted but failed to parse properly before, return
+        MEMO_RULE_FAILED.
+
+        This method has a side-effect: if we have seen this input for
+        this rule and successfully parsed before, then seek ahead to
+        1 past the stop token matched for this rule last time.
+        """
+
+        stopIndex = self.getRuleMemoization(ruleIndex, input.index())
+        if stopIndex == self.MEMO_RULE_UNKNOWN:
+            return False
+
+        if stopIndex == self.MEMO_RULE_FAILED:
+            raise BacktrackingFailed
+
+        else:
+            input.seek(stopIndex + 1)
+
+        return True
+
+
+    def memoize(self, input, ruleIndex, ruleStartIndex, success):
+        """
+        Record whether or not this rule parsed the input at this position
+        successfully.
+        """
+
+        if success:
+            stopTokenIndex = input.index() - 1
+        else:
+            stopTokenIndex = self.MEMO_RULE_FAILED
+
+        if ruleIndex in self._state.ruleMemo:
+            self._state.ruleMemo[ruleIndex][ruleStartIndex] = stopTokenIndex
+
+
+    def traceIn(self, ruleName, ruleIndex, inputSymbol):
+        sys.stdout.write("enter {} {}".format(ruleName, inputSymbol))
+
+        if self._state.backtracking > 0:
+            sys.stdout.write(" backtracking={}".format(self._state.backtracking))
+
+        sys.stdout.write('\n')
+
+
+    def traceOut(self, ruleName, ruleIndex, inputSymbol):
+        sys.stdout.write("exit {} {}".format(ruleName, inputSymbol))
+
+        if self._state.backtracking > 0:
+            sys.stdout.write(" backtracking={}".format(self._state.backtracking))
+
+        # mmmm... we use BacktrackingFailed exceptions now. So how could we
+        # get that information here?
+        #if self._state.failed:
+        #    sys.stdout.write(" failed")
+        #else:
+        #    sys.stdout.write(" succeeded")
+
+        sys.stdout.write('\n')
+
+
+class TokenSource(object):
+    """
+    @brief Abstract baseclass for token producers.
+
+    A source of tokens must provide a sequence of tokens via nextToken()
+    and also must reveal it's source of characters; CommonToken's text is
+    computed from a CharStream; it only store indices into the char stream.
+
+    Errors from the lexer are never passed to the parser.  Either you want
+    to keep going or you do not upon token recognition error.  If you do not
+    want to continue lexing then you do not want to continue parsing.  Just
+    throw an exception not under RecognitionException and Java will naturally
+    toss you all the way out of the recognizers.  If you want to continue
+    lexing then you should not throw an exception to the parser--it has already
+    requested a token.  Keep lexing until you get a valid one.  Just report
+    errors and keep going, looking for a valid token.
+    """
+
+    def nextToken(self):
+        """Return a Token object from your input stream (usually a CharStream).
+
+        Do not fail/return upon lexing error; keep chewing on the characters
+        until you get a good one; errors are not passed through to the parser.
+        """
+
+        raise NotImplementedError
+
+
+    def __iter__(self):
+        """The TokenSource is an interator.
+
+        The iteration will not include the final EOF token, see also the note
+        for the __next__() method.
+
+        """
+
+        return self
+
+
+    def __next__(self):
+        """Return next token or raise StopIteration.
+
+        Note that this will raise StopIteration when hitting the EOF token,
+        so EOF will not be part of the iteration.
+
+        """
+
+        token = self.nextToken()
+        if token is None or token.type == EOF:
+            raise StopIteration
+        return token
+
+
+class Lexer(BaseRecognizer, TokenSource):
+    """
+    @brief Baseclass for generated lexer classes.
+
+    A lexer is recognizer that draws input symbols from a character stream.
+    lexer grammars result in a subclass of this object. A Lexer object
+    uses simplified match() and error recovery mechanisms in the interest
+    of speed.
+    """
+
+    def __init__(self, input, state=None):
+        BaseRecognizer.__init__(self, state)
+        TokenSource.__init__(self)
+
+        # Where is the lexer drawing characters from?
+        self.input = input
+
+
+    def reset(self):
+        super().reset() # reset all recognizer state variables
+
+        if self.input is not None:
+            # rewind the input
+            self.input.seek(0)
+
+        if self._state is None:
+            # no shared state work to do
+            return
+
+        # wack Lexer state variables
+        self._state.token = None
+        self._state.type = INVALID_TOKEN_TYPE
+        self._state.channel = DEFAULT_CHANNEL
+        self._state.tokenStartCharIndex = -1
+        self._state.tokenStartLine = -1
+        self._state.tokenStartCharPositionInLine = -1
+        self._state.text = None
+
+
+    def makeEOFToken(self):
+        eof = CommonToken(
+            type=EOF, channel=DEFAULT_CHANNEL,
+            input=self.input,
+            start=self.input.index(), stop=self.input.index())
+        eof.line = self.input.line
+        eof.charPositionInLine = self.input.charPositionInLine
+        return eof
+
+    def nextToken(self):
+        """
+        Return a token from this source; i.e., match a token on the char
+        stream.
+        """
+
+        while 1:
+            self._state.token = None
+            self._state.channel = DEFAULT_CHANNEL
+            self._state.tokenStartCharIndex = self.input.index()
+            self._state.tokenStartCharPositionInLine = self.input.charPositionInLine
+            self._state.tokenStartLine = self.input.line
+            self._state.text = None
+            if self.input.LA(1) == EOF:
+                return self.makeEOFToken()
+
+            try:
+                self.mTokens()
+
+                if self._state.token is None:
+                    self.emit()
+
+                elif self._state.token == SKIP_TOKEN:
+                    continue
+
+                return self._state.token
+
+            except NoViableAltException as re:
+                self.reportError(re)
+                self.recover(re) # throw out current char and try again
+
+            except RecognitionException as re:
+                self.reportError(re)
+                # match() routine has already called recover()
+
+
+    def skip(self):
+        """
+        Instruct the lexer to skip creating a token for current lexer rule
+        and look for another token.  nextToken() knows to keep looking when
+        a lexer rule finishes with token set to SKIP_TOKEN.  Recall that
+        if token==null at end of any token rule, it creates one for you
+        and emits it.
+        """
+
+        self._state.token = SKIP_TOKEN
+
+
+    def mTokens(self):
+        """This is the lexer entry point that sets instance var 'token'"""
+
+        # abstract method
+        raise NotImplementedError
+
+
+    def setCharStream(self, input):
+        """Set the char stream and reset the lexer"""
+        self.input = None
+        self.reset()
+        self.input = input
+
+
+    def getSourceName(self):
+        return self.input.getSourceName()
+
+
+    def emit(self, token=None):
+        """
+        The standard method called to automatically emit a token at the
+        outermost lexical rule.  The token object should point into the
+        char buffer start..stop.  If there is a text override in 'text',
+        use that to set the token's text.  Override this method to emit
+        custom Token objects.
+
+        If you are building trees, then you should also override
+        Parser or TreeParser.getMissingSymbol().
+        """
+
+        if token is None:
+            token = CommonToken(
+                input=self.input,
+                type=self._state.type,
+                channel=self._state.channel,
+                start=self._state.tokenStartCharIndex,
+                stop=self.getCharIndex()-1
+                )
+            token.line = self._state.tokenStartLine
+            token.text = self._state.text
+            token.charPositionInLine = self._state.tokenStartCharPositionInLine
+
+        self._state.token = token
+
+        return token
+
+
+    def match(self, s):
+        if isinstance(s, str):
+            for c in s:
+                if self.input.LA(1) != ord(c):
+                    if self._state.backtracking > 0:
+                        raise BacktrackingFailed
+
+                    mte = MismatchedTokenException(c, self.input)
+                    self.recover(mte)
+                    raise mte
+
+                self.input.consume()
+
+        else:
+            if self.input.LA(1) != s:
+                if self._state.backtracking > 0:
+                    raise BacktrackingFailed
+
+                mte = MismatchedTokenException(chr(s), self.input)
+                self.recover(mte) # don't really recover; just consume in lexer
+                raise mte
+
+            self.input.consume()
+
+
+    def matchAny(self):
+        self.input.consume()
+
+
+    def matchRange(self, a, b):
+        if self.input.LA(1) < a or self.input.LA(1) > b:
+            if self._state.backtracking > 0:
+                raise BacktrackingFailed
+
+            mre = MismatchedRangeException(chr(a), chr(b), self.input)
+            self.recover(mre)
+            raise mre
+
+        self.input.consume()
+
+
+    def getLine(self):
+        return self.input.line
+
+
+    def getCharPositionInLine(self):
+        return self.input.charPositionInLine
+
+
+    def getCharIndex(self):
+        """What is the index of the current character of lookahead?"""
+
+        return self.input.index()
+
+
+    def getText(self):
+        """
+        Return the text matched so far for the current token or any
+        text override.
+        """
+        if self._state.text is not None:
+            return self._state.text
+
+        return self.input.substring(
+            self._state.tokenStartCharIndex,
+            self.getCharIndex()-1
+            )
+
+
+    def setText(self, text):
+        """
+        Set the complete text of this token; it wipes any previous
+        changes to the text.
+        """
+        self._state.text = text
+
+
+    text = property(getText, setText)
+
+
+    def reportError(self, e):
+        ## TODO: not thought about recovery in lexer yet.
+
+        ## # if we've already reported an error and have not matched a token
+        ## # yet successfully, don't report any errors.
+        ## if self.errorRecovery:
+        ##     return
+        ##
+        ## self.errorRecovery = True
+
+        self.displayRecognitionError(e)
+
+
+    def getErrorMessage(self, e):
+        msg = None
+
+        if isinstance(e, MismatchedTokenException):
+            msg = "mismatched character {} expecting {}".format(
+                self.getCharErrorDisplay(e.c),
+                self.getCharErrorDisplay(e.expecting))
+
+        elif isinstance(e, NoViableAltException):
+            msg = "no viable alternative at character {}".format(
+                self.getCharErrorDisplay(e.c))
+
+        elif isinstance(e, EarlyExitException):
+            msg = "required (...)+ loop did not match anything at character {}".format(
+                self.getCharErrorDisplay(e.c))
+
+        elif isinstance(e, MismatchedNotSetException):
+            msg = "mismatched character {} expecting set {!r}".format(
+                self.getCharErrorDisplay(e.c),
+                e.expecting)
+
+        elif isinstance(e, MismatchedSetException):
+            msg = "mismatched character {} expecting set {!r}".format(
+                self.getCharErrorDisplay(e.c),
+                e.expecting)
+
+        elif isinstance(e, MismatchedRangeException):
+            msg = "mismatched character {} expecting set {}..{}".format(
+                self.getCharErrorDisplay(e.c),
+                self.getCharErrorDisplay(e.a),
+                self.getCharErrorDisplay(e.b))
+
+        else:
+            msg = super().getErrorMessage(e)
+
+        return msg
+
+
+    def getCharErrorDisplay(self, c):
+        if c == EOF:
+            c = '<EOF>'
+        return repr(c)
+
+
+    def recover(self, re):
+        """
+        Lexers can normally match any char in it's vocabulary after matching
+        a token, so do the easy thing and just kill a character and hope
+        it all works out.  You can instead use the rule invocation stack
+        to do sophisticated error recovery if you are in a fragment rule.
+        """
+
+        self.input.consume()
+
+
+    def traceIn(self, ruleName, ruleIndex):
+        inputSymbol = "{} line={}:{}".format(self.input.LT(1),
+                                             self.getLine(),
+                                             self.getCharPositionInLine()
+                                             )
+
+        super().traceIn(ruleName, ruleIndex, inputSymbol)
+
+
+    def traceOut(self, ruleName, ruleIndex):
+        inputSymbol = "{} line={}:{}".format(self.input.LT(1),
+                                             self.getLine(),
+                                             self.getCharPositionInLine()
+                                             )
+
+        super().traceOut(ruleName, ruleIndex, inputSymbol)
+
+
+
+class Parser(BaseRecognizer):
+    """
+    @brief Baseclass for generated parser classes.
+    """
+
+    def __init__(self, lexer, state=None):
+        super().__init__(state)
+
+        self.input = lexer
+
+
+    def reset(self):
+        super().reset() # reset all recognizer state variables
+        if self.input is not None:
+            self.input.seek(0) # rewind the input
+
+
+    def getCurrentInputSymbol(self, input):
+        return input.LT(1)
+
+
+    def getMissingSymbol(self, input, e, expectedTokenType, follow):
+        if expectedTokenType == EOF:
+            tokenText = "<missing EOF>"
+        else:
+            tokenText = "<missing {}>".format(self.tokenNames[expectedTokenType])
+        t = CommonToken(type=expectedTokenType, text=tokenText)
+        current = input.LT(1)
+        if current.type == EOF:
+            current = input.LT(-1)
+
+        if current is not None:
+            t.line = current.line
+            t.charPositionInLine = current.charPositionInLine
+        t.channel = DEFAULT_CHANNEL
+        return t
+
+
+    def setTokenStream(self, input):
+        """Set the token stream and reset the parser"""
+
+        self.input = None
+        self.reset()
+        self.input = input
+
+
+    def getTokenStream(self):
+        return self.input
+
+
+    def getSourceName(self):
+        return self.input.getSourceName()
+
+
+    def traceIn(self, ruleName, ruleIndex):
+        super().traceIn(ruleName, ruleIndex, self.input.LT(1))
+
+
+    def traceOut(self, ruleName, ruleIndex):
+        super().traceOut(ruleName, ruleIndex, self.input.LT(1))
+
+
+class RuleReturnScope(object):
+    """
+    Rules can return start/stop info as well as possible trees and templates.
+    """
+
+    def getStart(self):
+        """Return the start token or tree."""
+        return None
+
+
+    def getStop(self):
+        """Return the stop token or tree."""
+        return None
+
+
+    def getTree(self):
+        """Has a value potentially if output=AST."""
+        return None
+
+
+    def getTemplate(self):
+        """Has a value potentially if output=template."""
+        return None
+
+
+class ParserRuleReturnScope(RuleReturnScope):
+    """
+    Rules that return more than a single value must return an object
+    containing all the values.  Besides the properties defined in
+    RuleLabelScope.predefinedRulePropertiesScope there may be user-defined
+    return values.  This class simply defines the minimum properties that
+    are always defined and methods to access the others that might be
+    available depending on output option such as template and tree.
+
+    Note text is not an actual property of the return value, it is computed
+    from start and stop using the input stream's toString() method.  I
+    could add a ctor to this so that we can pass in and store the input
+    stream, but I'm not sure we want to do that.  It would seem to be undefined
+    to get the .text property anyway if the rule matches tokens from multiple
+    input streams.
+
+    I do not use getters for fields of objects that are used simply to
+    group values such as this aggregate.  The getters/setters are there to
+    satisfy the superclass interface.
+    """
+
+    def __init__(self):
+        super().__init__()
+        self.start = None
+        self.stop = None
+        self.tree = None  # only used when output=AST
+
+
+    def getStart(self):
+        return self.start
+
+
+    def getStop(self):
+        return self.stop
+
+
+    def getTree(self):
+        return self.tree
diff --git a/runtime/Python3/antlr3/streams.py b/runtime/Python3/antlr3/streams.py
new file mode 100644
index 0000000..069755b
--- /dev/null
+++ b/runtime/Python3/antlr3/streams.py
@@ -0,0 +1,1460 @@
+"""ANTLR3 runtime package"""
+
+# begin[licence]
+#
+# [The "BSD licence"]
+# Copyright (c) 2005-2012 Terence Parr
+# 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[licence]
+
+from io import StringIO
+
+from .constants import DEFAULT_CHANNEL, EOF
+from .tokens import Token
+
+
+############################################################################
+#
+# basic interfaces
+#   IntStream
+#    +- CharStream
+#    \- TokenStream
+#
+# subclasses must implemented all methods
+#
+############################################################################
+
+class IntStream(object):
+    """
+    @brief Base interface for streams of integer values.
+
+    A simple stream of integers used when all I care about is the char
+    or token type sequence (such as interpretation).
+    """
+
+    def consume(self):
+        raise NotImplementedError
+
+
+    def LA(self, i):
+        """Get int at current input pointer + i ahead where i=1 is next int.
+
+        Negative indexes are allowed.  LA(-1) is previous token (token
+        just matched).  LA(-i) where i is before first token should
+        yield -1, invalid char / EOF.
+        """
+
+        raise NotImplementedError
+
+
+    def mark(self):
+        """
+        Tell the stream to start buffering if it hasn't already.  Return
+        current input position, index(), or some other marker so that
+        when passed to rewind() you get back to the same spot.
+        rewind(mark()) should not affect the input cursor.  The Lexer
+        track line/col info as well as input index so its markers are
+        not pure input indexes.  Same for tree node streams.
+        """
+
+        raise NotImplementedError
+
+
+    def index(self):
+        """
+        Return the current input symbol index 0..n where n indicates the
+        last symbol has been read.  The index is the symbol about to be
+        read not the most recently read symbol.
+        """
+
+        raise NotImplementedError
+
+
+    def rewind(self, marker=None):
+        """
+        Reset the stream so that next call to index would return marker.
+        The marker will usually be index() but it doesn't have to be.  It's
+        just a marker to indicate what state the stream was in.  This is
+        essentially calling release() and seek().  If there are markers
+        created after this marker argument, this routine must unroll them
+        like a stack.  Assume the state the stream was in when this marker
+        was created.
+
+        If marker is None:
+        Rewind to the input position of the last marker.
+        Used currently only after a cyclic DFA and just
+        before starting a sem/syn predicate to get the
+        input position back to the start of the decision.
+        Do not "pop" the marker off the state.  mark(i)
+        and rewind(i) should balance still. It is
+        like invoking rewind(last marker) but it should not "pop"
+        the marker off.  It's like seek(last marker's input position).
+        """
+
+        raise NotImplementedError
+
+
+    def release(self, marker=None):
+        """
+        You may want to commit to a backtrack but don't want to force the
+        stream to keep bookkeeping objects around for a marker that is
+        no longer necessary.  This will have the same behavior as
+        rewind() except it releases resources without the backward seek.
+        This must throw away resources for all markers back to the marker
+        argument.  So if you're nested 5 levels of mark(), and then release(2)
+        you have to release resources for depths 2..5.
+        """
+
+        raise NotImplementedError
+
+
+    def seek(self, index):
+        """
+        Set the input cursor to the position indicated by index.  This is
+        normally used to seek ahead in the input stream.  No buffering is
+        required to do this unless you know your stream will use seek to
+        move backwards such as when backtracking.
+
+        This is different from rewind in its multi-directional
+        requirement and in that its argument is strictly an input cursor
+        (index).
+
+        For char streams, seeking forward must update the stream state such
+        as line number.  For seeking backwards, you will be presumably
+        backtracking using the mark/rewind mechanism that restores state and
+        so this method does not need to update state when seeking backwards.
+
+        Currently, this method is only used for efficient backtracking using
+        memoization, but in the future it may be used for incremental parsing.
+
+        The index is 0..n-1.  A seek to position i means that LA(1) will
+        return the ith symbol.  So, seeking to 0 means LA(1) will return the
+        first element in the stream.
+        """
+
+        raise NotImplementedError
+
+
+    def size(self):
+        """
+        Only makes sense for streams that buffer everything up probably, but
+        might be useful to display the entire stream or for testing.  This
+        value includes a single EOF.
+        """
+
+        raise NotImplementedError
+
+
+    def getSourceName(self):
+        """
+        Where are you getting symbols from?  Normally, implementations will
+        pass the buck all the way to the lexer who can ask its input stream
+        for the file name or whatever.
+        """
+
+        raise NotImplementedError
+
+
+class CharStream(IntStream):
+    """
+    @brief A source of characters for an ANTLR lexer.
+
+    This is an abstract class that must be implemented by a subclass.
+
+    """
+
+    # pylint does not realize that this is an interface, too
+    #pylint: disable-msg=W0223
+
+    EOF = -1
+
+    def __init__(self):
+        # line number 1..n within the input
+        self._line = 1
+
+        # The index of the character relative to the beginning of the
+        # line 0..n-1
+        self._charPositionInLine = 0
+
+
+    def substring(self, start, stop):
+        """
+        For infinite streams, you don't need this; primarily I'm providing
+        a useful interface for action code.  Just make sure actions don't
+        use this on streams that don't support it.
+        """
+
+        raise NotImplementedError
+
+
+    def LT(self, i):
+        """
+        Get the ith character of lookahead.  This is the same usually as
+        LA(i).  This will be used for labels in the generated
+        lexer code.  I'd prefer to return a char here type-wise, but it's
+        probably better to be 32-bit clean and be consistent with LA.
+        """
+
+        raise NotImplementedError
+
+
+    @property
+    def line(self):
+        """ANTLR tracks the line information automatically"""
+        return self._line
+
+    @line.setter
+    def line(self, value):
+        """
+        Because this stream can rewind, we need to be able to reset the line
+        """
+        self._line = value
+
+
+    @property
+    def charPositionInLine(self):
+        """
+        The index of the character relative to the beginning of the line 0..n-1
+        """
+        return self._charPositionInLine
+
+    @charPositionInLine.setter
+    def charPositionInLine(self, pos):
+        self._charPositionInLine = pos
+
+
+class TokenStream(IntStream):
+    """
+
+    @brief A stream of tokens accessing tokens from a TokenSource
+
+    This is an abstract class that must be implemented by a subclass.
+
+    """
+
+    # pylint does not realize that this is an interface, too
+    #pylint: disable-msg=W0223
+
+    def LT(self, k):
+        """
+        Get Token at current input pointer + i ahead where i=1 is next Token.
+        i<0 indicates tokens in the past.  So -1 is previous token and -2 is
+        two tokens ago. LT(0) is undefined.  For i>=n, return Token.EOFToken.
+        Return null for LT(0) and any index that results in an absolute address
+        that is negative.
+        """
+
+        raise NotImplementedError
+
+
+    def range(self):
+        """
+        How far ahead has the stream been asked to look?  The return
+        value is a valid index from 0..n-1.
+        """
+
+        raise NotImplementedError
+
+
+    def get(self, i):
+        """
+        Get a token at an absolute index i; 0..n-1.  This is really only
+        needed for profiling and debugging and token stream rewriting.
+        If you don't want to buffer up tokens, then this method makes no
+        sense for you.  Naturally you can't use the rewrite stream feature.
+        I believe DebugTokenStream can easily be altered to not use
+        this method, removing the dependency.
+        """
+
+        raise NotImplementedError
+
+
+    def getTokenSource(self):
+        """
+        Where is this stream pulling tokens from?  This is not the name, but
+        the object that provides Token objects.
+        """
+
+        raise NotImplementedError
+
+
+    def toString(self, start=None, stop=None):
+        """
+        Return the text of all tokens from start to stop, inclusive.
+        If the stream does not buffer all the tokens then it can just
+        return "" or null;  Users should not access $ruleLabel.text in
+        an action of course in that case.
+
+        Because the user is not required to use a token with an index stored
+        in it, we must provide a means for two token objects themselves to
+        indicate the start/end location.  Most often this will just delegate
+        to the other toString(int,int).  This is also parallel with
+        the TreeNodeStream.toString(Object,Object).
+        """
+
+        raise NotImplementedError
+
+
+############################################################################
+#
+# character streams for use in lexers
+#   CharStream
+#   \- ANTLRStringStream
+#
+############################################################################
+
+
+class ANTLRStringStream(CharStream):
+    """
+    @brief CharStream that pull data from a unicode string.
+
+    A pretty quick CharStream that pulls all data from an array
+    directly.  Every method call counts in the lexer.
+
+    """
+
+
+    def __init__(self, data):
+        """
+        @param data This should be a unicode string holding the data you want
+        to parse. If you pass in a byte string, the Lexer will choke on
+        non-ascii data.
+        """
+
+        super().__init__()
+
+        # The data being scanned
+        self.strdata = str(data)
+        self.data = [ord(c) for c in self.strdata]
+
+        # How many characters are actually in the buffer
+        self.n = len(data)
+
+        # 0..n-1 index into string of next char
+        self.p = 0
+
+        # A list of CharStreamState objects that tracks the stream state
+        # values line, charPositionInLine, and p that can change as you
+        # move through the input stream.  Indexed from 0..markDepth-1.
+        self._markers = [ ]
+        self.lastMarker = None
+        self.markDepth = 0
+
+        # What is name or source of this char stream?
+        self.name = None
+
+
+    def reset(self):
+        """
+        Reset the stream so that it's in the same state it was
+        when the object was created *except* the data array is not
+        touched.
+        """
+
+        self.p = 0
+        self._line = 1
+        self.charPositionInLine = 0
+        self._markers = [ ]
+        self.lastMarker = None
+        self.markDepth = 0
+
+
+    def consume(self):
+        if self.p < self.n:
+            if self.data[self.p] == 10: # ord('\n')
+                self._line += 1
+                self.charPositionInLine = 0
+            else:
+                self.charPositionInLine += 1
+
+            self.p += 1
+
+        # else we reached EOF
+        # just do nothing
+
+
+    def LA(self, i):
+        if i == 0:
+            return 0 # undefined
+
+        if i < 0:
+            i += 1 # e.g., translate LA(-1) to use offset i=0; then data[p+0-1]
+
+        if self.p + i - 1 < self.n:
+            return self.data[self.p + i - 1]
+        else:
+            return EOF
+
+
+
+    def LT(self, i):
+        if i == 0:
+            return 0 # undefined
+
+        if i < 0:
+            i += 1 # e.g., translate LA(-1) to use offset i=0; then data[p+0-1]
+
+        if self.p + i - 1 < self.n:
+            return self.strdata[self.p + i - 1]
+        else:
+            return EOF
+
+
+    def index(self):
+        """
+        Return the current input symbol index 0..n where n indicates the
+        last symbol has been read.  The index is the index of char to
+        be returned from LA(1).
+        """
+
+        return self.p
+
+
+    def size(self):
+        return self.n
+
+
+    def mark(self):
+        state = (self.p, self.line, self.charPositionInLine)
+        if self.markDepth < len(self._markers):
+            self._markers[self.markDepth] = state
+        else:
+            self._markers.append(state)
+        self.markDepth += 1
+
+        self.lastMarker = self.markDepth
+
+        return self.lastMarker
+
+
+    def rewind(self, marker=None):
+        if marker is None:
+            marker = self.lastMarker
+
+        p, line, charPositionInLine = self._markers[marker - 1]
+
+        self.seek(p)
+        self._line = line
+        self.charPositionInLine = charPositionInLine
+        self.release(marker)
+
+
+    def release(self, marker=None):
+        if marker is None:
+            marker = self.lastMarker
+
+        self.markDepth = marker - 1
+
+
+    def seek(self, index):
+        """
+        consume() ahead until p==index; can't just set p=index as we must
+        update line and charPositionInLine.
+        """
+
+        if index <= self.p:
+            self.p = index # just jump; don't update stream state (line, ...)
+            return
+
+        # seek forward, consume until p hits index
+        while self.p < index:
+            self.consume()
+
+
+    def substring(self, start, stop):
+        return self.strdata[start:stop + 1]
+
+
+    def getSourceName(self):
+        return self.name
+
+
+class ANTLRFileStream(ANTLRStringStream):
+    """
+    @brief CharStream that opens a file to read the data.
+
+    This is a char buffer stream that is loaded from a file
+    all at once when you construct the object.
+    """
+
+    def __init__(self, fileName):
+        """
+        @param fileName The path to the file to be opened. The file will be
+           opened with mode 'r'.
+
+        """
+
+        self._fileName = fileName
+
+        with open(fileName, 'r') as fp:
+            super().__init__(fp.read())
+
+
+    @property
+    def fileName(self):
+        return self._fileName
+
+
+class ANTLRInputStream(ANTLRStringStream):
+    """
+    @brief CharStream that reads data from a file-like object.
+
+    This is a char buffer stream that is loaded from a file like object
+    all at once when you construct the object.
+
+    All input is consumed from the file, but it is not closed.
+    """
+
+    def __init__(self, file):
+        """
+        @param file A file-like object holding your input. Only the read()
+           method must be implemented.
+
+        """
+
+        data = file.read()
+
+        super().__init__(data)
+
+
+# I guess the ANTLR prefix exists only to avoid a name clash with some Java
+# mumbojumbo. A plain "StringStream" looks better to me, which should be
+# the preferred name in Python.
+StringStream = ANTLRStringStream
+FileStream = ANTLRFileStream
+InputStream = ANTLRInputStream
+
+
+############################################################################
+#
+# Token streams
+#   TokenStream
+#   +- CommonTokenStream
+#   \- TokenRewriteStream
+#
+############################################################################
+
+
+class CommonTokenStream(TokenStream):
+    """
+    @brief The most common stream of tokens
+
+    The most common stream of tokens is one where every token is buffered up
+    and tokens are prefiltered for a certain channel (the parser will only
+    see these tokens and cannot change the filter channel number during the
+    parse).
+    """
+
+    def __init__(self, tokenSource=None, channel=DEFAULT_CHANNEL):
+        """
+        @param tokenSource A TokenSource instance (usually a Lexer) to pull
+            the tokens from.
+
+        @param channel Skip tokens on any channel but this one; this is how we
+            skip whitespace...
+
+        """
+
+        super().__init__()
+
+        self.tokenSource = tokenSource
+
+        # Record every single token pulled from the source so we can reproduce
+        # chunks of it later.
+        self.tokens = []
+
+        # Map<tokentype, channel> to override some Tokens' channel numbers
+        self.channelOverrideMap = {}
+
+        # Set<tokentype>; discard any tokens with this type
+        self.discardSet = set()
+
+        # Skip tokens on any channel but this one; this is how we skip
+        # whitespace...
+        self.channel = channel
+
+        # By default, track all incoming tokens
+        self.discardOffChannelTokens = False
+
+        # The index into the tokens list of the current token (next token
+        # to consume).  p==-1 indicates that the tokens list is empty
+        self.p = -1
+
+        # Remember last marked position
+        self.lastMarker = None
+
+        # how deep have we gone?
+        self._range = -1
+
+
+    def makeEOFToken(self):
+        return self.tokenSource.makeEOFToken()
+
+
+    def setTokenSource(self, tokenSource):
+        """Reset this token stream by setting its token source."""
+
+        self.tokenSource = tokenSource
+        self.tokens = []
+        self.p = -1
+        self.channel = DEFAULT_CHANNEL
+
+
+    def reset(self):
+        self.p = 0
+        self.lastMarker = None
+
+
+    def fillBuffer(self):
+        """
+        Load all tokens from the token source and put in tokens.
+        This is done upon first LT request because you might want to
+        set some token type / channel overrides before filling buffer.
+        """
+
+
+        index = 0
+        t = self.tokenSource.nextToken()
+        while t and t.type != EOF:
+            discard = False
+
+            if self.discardSet and t.type in self.discardSet:
+                discard = True
+
+            elif self.discardOffChannelTokens and t.channel != self.channel:
+                discard = True
+
+            # is there a channel override for token type?
+            if t.type in self.channelOverrideMap:
+                overrideChannel = self.channelOverrideMap[t.type]
+
+                if overrideChannel == self.channel:
+                    t.channel = overrideChannel
+                else:
+                    discard = True
+
+            if not discard:
+                t.index = index
+                self.tokens.append(t)
+                index += 1
+
+            t = self.tokenSource.nextToken()
+
+        # leave p pointing at first token on channel
+        self.p = 0
+        self.p = self.skipOffTokenChannels(self.p)
+
+
+    def consume(self):
+        """
+        Move the input pointer to the next incoming token.  The stream
+        must become active with LT(1) available.  consume() simply
+        moves the input pointer so that LT(1) points at the next
+        input symbol. Consume at least one token.
+
+        Walk past any token not on the channel the parser is listening to.
+        """
+
+        if self.p < len(self.tokens):
+            self.p += 1
+
+            self.p = self.skipOffTokenChannels(self.p) # leave p on valid token
+
+
+    def skipOffTokenChannels(self, i):
+        """
+        Given a starting index, return the index of the first on-channel
+        token.
+        """
+
+        n = len(self.tokens)
+        while i < n and self.tokens[i].channel != self.channel:
+            i += 1
+
+        return i
+
+
+    def skipOffTokenChannelsReverse(self, i):
+        while i >= 0 and self.tokens[i].channel != self.channel:
+            i -= 1
+
+        return i
+
+
+    def setTokenTypeChannel(self, ttype, channel):
+        """
+        A simple filter mechanism whereby you can tell this token stream
+        to force all tokens of type ttype to be on channel.  For example,
+        when interpreting, we cannot exec actions so we need to tell
+        the stream to force all WS and NEWLINE to be a different, ignored
+        channel.
+        """
+
+        self.channelOverrideMap[ttype] = channel
+
+
+    def discardTokenType(self, ttype):
+        self.discardSet.add(ttype)
+
+
+    def getTokens(self, start=None, stop=None, types=None):
+        """
+        Given a start and stop index, return a list of all tokens in
+        the token type set.  Return None if no tokens were found.  This
+        method looks at both on and off channel tokens.
+        """
+
+        if self.p == -1:
+            self.fillBuffer()
+
+        if stop is None or stop > len(self.tokens):
+            stop = len(self.tokens)
+
+        if start is None or start < 0:
+            start = 0
+
+        if start > stop:
+            return None
+
+        if isinstance(types, int):
+            # called with a single type, wrap into set
+            types = set([types])
+
+        filteredTokens = [
+            token for token in self.tokens[start:stop]
+            if types is None or token.type in types
+            ]
+
+        if len(filteredTokens) == 0:
+            return None
+
+        return filteredTokens
+
+
+    def LT(self, k):
+        """
+        Get the ith token from the current position 1..n where k=1 is the
+        first symbol of lookahead.
+        """
+
+        if self.p == -1:
+            self.fillBuffer()
+
+        if k == 0:
+            return None
+
+        if k < 0:
+            return self.LB(-k)
+
+        i = self.p
+        n = 1
+        # find k good tokens
+        while n < k:
+            # skip off-channel tokens
+            i = self.skipOffTokenChannels(i + 1) # leave p on valid token
+            n += 1
+
+        if i > self._range:
+            self._range = i
+
+        if i < len(self.tokens):
+            return self.tokens[i]
+        else:
+            return self.makeEOFToken()
+
+
+    def LB(self, k):
+        """Look backwards k tokens on-channel tokens"""
+
+        if self.p == -1:
+            self.fillBuffer()
+
+        if k == 0:
+            return None
+
+        if self.p - k < 0:
+            return None
+
+        i = self.p
+        n = 1
+        # find k good tokens looking backwards
+        while n <= k:
+            # skip off-channel tokens
+            i = self.skipOffTokenChannelsReverse(i - 1) # leave p on valid token
+            n += 1
+
+        if i < 0:
+            return None
+
+        return self.tokens[i]
+
+
+    def get(self, i):
+        """
+        Return absolute token i; ignore which channel the tokens are on;
+        that is, count all tokens not just on-channel tokens.
+        """
+
+        return self.tokens[i]
+
+
+    def slice(self, start, stop):
+        if self.p == -1:
+            self.fillBuffer()
+
+        if start < 0 or stop < 0:
+            return None
+
+        return self.tokens[start:stop + 1]
+
+
+    def LA(self, i):
+        return self.LT(i).type
+
+
+    def mark(self):
+        self.lastMarker = self.index()
+        return self.lastMarker
+
+
+    def release(self, marker=None):
+        # no resources to release
+        pass
+
+
+    def size(self):
+        return len(self.tokens)
+
+
+    def range(self):
+        return self._range
+
+
+    def index(self):
+        return self.p
+
+
+    def rewind(self, marker=None):
+        if marker is None:
+            marker = self.lastMarker
+
+        self.seek(marker)
+
+
+    def seek(self, index):
+        self.p = index
+
+
+    def getTokenSource(self):
+        return self.tokenSource
+
+
+    def getSourceName(self):
+        return self.tokenSource.getSourceName()
+
+
+    def toString(self, start=None, stop=None):
+        """Returns a string of all tokens between start and stop (inclusive)."""
+        if self.p == -1:
+            self.fillBuffer()
+
+        if start is None:
+            start = 0
+        elif not isinstance(start, int):
+            start = start.index
+
+        if stop is None:
+            stop = len(self.tokens) - 1
+        elif not isinstance(stop, int):
+            stop = stop.index
+
+        if stop >= len(self.tokens):
+            stop = len(self.tokens) - 1
+
+        return ''.join([t.text for t in self.tokens[start:stop + 1]])
+
+
+class RewriteOperation(object):
+    """@brief Internal helper class."""
+
+    def __init__(self, stream, index, text):
+        self.stream = stream
+
+        # What index into rewrites List are we?
+        self.instructionIndex = None
+
+        # Token buffer index.
+        self.index = index
+        self.text = text
+
+    def execute(self, buf):
+        """Execute the rewrite operation by possibly adding to the buffer.
+        Return the index of the next token to operate on.
+        """
+
+        return self.index
+
+    def toString(self):
+        opName = self.__class__.__name__
+        return '<{opName}@{0.index}:"{0.text}">'.format(self, opName=opName)
+
+    __str__ = toString
+    __repr__ = toString
+
+
+class InsertBeforeOp(RewriteOperation):
+    """@brief Internal helper class."""
+
+    def execute(self, buf):
+        buf.write(self.text)
+        if self.stream.tokens[self.index].type != EOF:
+            buf.write(self.stream.tokens[self.index].text)
+        return self.index + 1
+
+
+class ReplaceOp(RewriteOperation):
+    """
+    @brief Internal helper class.
+
+    I'm going to try replacing range from x..y with (y-x)+1 ReplaceOp
+    instructions.
+    """
+
+    def __init__(self, stream, first, last, text):
+        super().__init__(stream, first, text)
+        self.lastIndex = last
+
+
+    def execute(self, buf):
+        if self.text is not None:
+            buf.write(self.text)
+
+        return self.lastIndex + 1
+
+
+    def toString(self):
+        if self.text is None:
+            return '<DeleteOp@{0.index}..{0.lastindex}>'.format(self)
+
+        return '<ReplaceOp@{0.index}..{0.lastIndex}:"{0.text}">'.format(self)
+
+    __str__ = toString
+    __repr__ = toString
+
+
+class TokenRewriteStream(CommonTokenStream):
+    """@brief CommonTokenStream that can be modified.
+
+    Useful for dumping out the input stream after doing some
+    augmentation or other manipulations.
+
+    You can insert stuff, replace, and delete chunks.  Note that the
+    operations are done lazily--only if you convert the buffer to a
+    String.  This is very efficient because you are not moving data around
+    all the time.  As the buffer of tokens is converted to strings, the
+    toString() method(s) check to see if there is an operation at the
+    current index.  If so, the operation is done and then normal String
+    rendering continues on the buffer.  This is like having multiple Turing
+    machine instruction streams (programs) operating on a single input tape. :)
+
+    Since the operations are done lazily at toString-time, operations do not
+    screw up the token index values.  That is, an insert operation at token
+    index i does not change the index values for tokens i+1..n-1.
+
+    Because operations never actually alter the buffer, you may always get
+    the original token stream back without undoing anything.  Since
+    the instructions are queued up, you can easily simulate transactions and
+    roll back any changes if there is an error just by removing instructions.
+    For example,
+
+     CharStream input = new ANTLRFileStream("input");
+     TLexer lex = new TLexer(input);
+     TokenRewriteStream tokens = new TokenRewriteStream(lex);
+     T parser = new T(tokens);
+     parser.startRule();
+
+     Then in the rules, you can execute
+        Token t,u;
+        ...
+        input.insertAfter(t, "text to put after t");}
+        input.insertAfter(u, "text after u");}
+        System.out.println(tokens.toString());
+
+    Actually, you have to cast the 'input' to a TokenRewriteStream. :(
+
+    You can also have multiple "instruction streams" and get multiple
+    rewrites from a single pass over the input.  Just name the instruction
+    streams and use that name again when printing the buffer.  This could be
+    useful for generating a C file and also its header file--all from the
+    same buffer:
+
+        tokens.insertAfter("pass1", t, "text to put after t");}
+        tokens.insertAfter("pass2", u, "text after u");}
+        System.out.println(tokens.toString("pass1"));
+        System.out.println(tokens.toString("pass2"));
+
+    If you don't use named rewrite streams, a "default" stream is used as
+    the first example shows.
+    """
+
+    DEFAULT_PROGRAM_NAME = "default"
+    MIN_TOKEN_INDEX = 0
+
+    def __init__(self, tokenSource=None, channel=DEFAULT_CHANNEL):
+        super().__init__(tokenSource, channel)
+
+        # You may have multiple, named streams of rewrite operations.
+        # I'm calling these things "programs."
+        #  Maps String (name) -> rewrite (List)
+        self.programs = {}
+        self.programs[self.DEFAULT_PROGRAM_NAME] = []
+
+        # Map String (program name) -> Integer index
+        self.lastRewriteTokenIndexes = {}
+
+
+    def rollback(self, *args):
+        """
+        Rollback the instruction stream for a program so that
+        the indicated instruction (via instructionIndex) is no
+        longer in the stream.  UNTESTED!
+        """
+
+        if len(args) == 2:
+            programName = args[0]
+            instructionIndex = args[1]
+        elif len(args) == 1:
+            programName = self.DEFAULT_PROGRAM_NAME
+            instructionIndex = args[0]
+        else:
+            raise TypeError("Invalid arguments")
+
+        p = self.programs.get(programName)
+        if p:
+            self.programs[programName] = (
+                p[self.MIN_TOKEN_INDEX:instructionIndex])
+
+
+    def deleteProgram(self, programName=DEFAULT_PROGRAM_NAME):
+        """Reset the program so that no instructions exist"""
+
+        self.rollback(programName, self.MIN_TOKEN_INDEX)
+
+
+    def insertAfter(self, *args):
+        if len(args) == 2:
+            programName = self.DEFAULT_PROGRAM_NAME
+            index = args[0]
+            text = args[1]
+
+        elif len(args) == 3:
+            programName = args[0]
+            index = args[1]
+            text = args[2]
+
+        else:
+            raise TypeError("Invalid arguments")
+
+        if isinstance(index, Token):
+            # index is a Token, grap the stream index from it
+            index = index.index
+
+        # to insert after, just insert before next index (even if past end)
+        self.insertBefore(programName, index + 1, text)
+
+
+    def insertBefore(self, *args):
+        if len(args) == 2:
+            programName = self.DEFAULT_PROGRAM_NAME
+            index = args[0]
+            text = args[1]
+
+        elif len(args) == 3:
+            programName = args[0]
+            index = args[1]
+            text = args[2]
+
+        else:
+            raise TypeError("Invalid arguments")
+
+        if isinstance(index, Token):
+            # index is a Token, grab the stream index from it
+            index = index.index
+
+        op = InsertBeforeOp(self, index, text)
+        rewrites = self.getProgram(programName)
+        op.instructionIndex = len(rewrites)
+        rewrites.append(op)
+
+
+    def replace(self, *args):
+        if len(args) == 2:
+            programName = self.DEFAULT_PROGRAM_NAME
+            first = args[0]
+            last = args[0]
+            text = args[1]
+
+        elif len(args) == 3:
+            programName = self.DEFAULT_PROGRAM_NAME
+            first = args[0]
+            last = args[1]
+            text = args[2]
+
+        elif len(args) == 4:
+            programName = args[0]
+            first = args[1]
+            last = args[2]
+            text = args[3]
+
+        else:
+            raise TypeError("Invalid arguments")
+
+        if isinstance(first, Token):
+            # first is a Token, grap the stream index from it
+            first = first.index
+
+        if isinstance(last, Token):
+            # last is a Token, grap the stream index from it
+            last = last.index
+
+        if first > last or first < 0 or last < 0 or last >= len(self.tokens):
+            raise ValueError(
+                "replace: range invalid: {}..{} (size={})"
+                .format(first, last, len(self.tokens)))
+
+        op = ReplaceOp(self, first, last, text)
+        rewrites = self.getProgram(programName)
+        op.instructionIndex = len(rewrites)
+        rewrites.append(op)
+
+
+    def delete(self, *args):
+        self.replace(*(list(args) + [None]))
+
+
+    def getLastRewriteTokenIndex(self, programName=DEFAULT_PROGRAM_NAME):
+        return self.lastRewriteTokenIndexes.get(programName, -1)
+
+
+    def setLastRewriteTokenIndex(self, programName, i):
+        self.lastRewriteTokenIndexes[programName] = i
+
+
+    def getProgram(self, name):
+        p = self.programs.get(name)
+        if not p:
+            p = self.initializeProgram(name)
+
+        return p
+
+
+    def initializeProgram(self, name):
+        p = []
+        self.programs[name] = p
+        return p
+
+
+    def toOriginalString(self, start=None, end=None):
+        if self.p == -1:
+            self.fillBuffer()
+
+        if start is None:
+            start = self.MIN_TOKEN_INDEX
+        if end is None:
+            end = self.size() - 1
+
+        buf = StringIO()
+        i = start
+        while i >= self.MIN_TOKEN_INDEX and i <= end and i < len(self.tokens):
+            if self.get(i).type != EOF:
+                buf.write(self.get(i).text)
+            i += 1
+
+        return buf.getvalue()
+
+
+    def toString(self, *args):
+        if self.p == -1:
+            self.fillBuffer()
+
+        if len(args) == 0:
+            programName = self.DEFAULT_PROGRAM_NAME
+            start = self.MIN_TOKEN_INDEX
+            end = self.size() - 1
+
+        elif len(args) == 1:
+            programName = args[0]
+            start = self.MIN_TOKEN_INDEX
+            end = self.size() - 1
+
+        elif len(args) == 2:
+            programName = self.DEFAULT_PROGRAM_NAME
+            start = args[0]
+            end = args[1]
+
+        if start is None:
+            start = self.MIN_TOKEN_INDEX
+        elif not isinstance(start, int):
+            start = start.index
+
+        if end is None:
+            end = len(self.tokens) - 1
+        elif not isinstance(end, int):
+            end = end.index
+
+        # ensure start/end are in range
+        if end >= len(self.tokens):
+            end = len(self.tokens) - 1
+
+        if start < 0:
+            start = 0
+
+        rewrites = self.programs.get(programName)
+        if not rewrites:
+            # no instructions to execute
+            return self.toOriginalString(start, end)
+
+        buf = StringIO()
+
+        # First, optimize instruction stream
+        indexToOp = self.reduceToSingleOperationPerIndex(rewrites)
+
+        # Walk buffer, executing instructions and emitting tokens
+        i = start
+        while i <= end and i < len(self.tokens):
+            # remove so any left have index size-1
+            op = indexToOp.pop(i, None)
+
+            t = self.tokens[i]
+            if op is None:
+                # no operation at that index, just dump token
+                if t.type != EOF:
+                    buf.write(t.text)
+                i += 1 # move to next token
+
+            else:
+                i = op.execute(buf) # execute operation and skip
+
+        # include stuff after end if it's last index in buffer
+        # So, if they did an insertAfter(lastValidIndex, "foo"), include
+        # foo if end == lastValidIndex.
+        if end == len(self.tokens) - 1:
+            # Scan any remaining operations after last token
+            # should be included (they will be inserts).
+            for i, op in sorted(indexToOp.items()):
+                if op.index >= len(self.tokens) - 1:
+                    buf.write(op.text)
+
+        return buf.getvalue()
+
+    __str__ = toString
+
+
+    def reduceToSingleOperationPerIndex(self, rewrites):
+        """
+        We need to combine operations and report invalid operations (like
+        overlapping replaces that are not completed nested).  Inserts to
+        same index need to be combined etc...   Here are the cases:
+
+        I.i.u I.j.v                           leave alone, nonoverlapping
+        I.i.u I.i.v                           combine: Iivu
+
+        R.i-j.u R.x-y.v | i-j in x-y          delete first R
+        R.i-j.u R.i-j.v                       delete first R
+        R.i-j.u R.x-y.v | x-y in i-j          ERROR
+        R.i-j.u R.x-y.v | boundaries overlap  ERROR
+
+        Delete special case of replace (text==null):
+        D.i-j.u D.x-y.v |                     boundaries overlapcombine to
+                                              max(min)..max(right)
+
+        I.i.u R.x-y.v   |                     i in (x+1)-ydelete I (since
+                                              insert before we're not deleting
+                                              i)
+        I.i.u R.x-y.v   |                     i not in (x+1)-yleave alone,
+                                              nonoverlapping
+
+        R.x-y.v I.i.u   | i in x-y            ERROR
+        R.x-y.v I.x.u                         R.x-y.uv (combine, delete I)
+        R.x-y.v I.i.u   | i not in x-y        leave alone, nonoverlapping
+
+        I.i.u = insert u before op @ index i
+        R.x-y.u = replace x-y indexed tokens with u
+
+        First we need to examine replaces.  For any replace op:
+
+          1. wipe out any insertions before op within that range.
+          2. Drop any replace op before that is contained completely within
+             that range.
+          3. Throw exception upon boundary overlap with any previous replace.
+
+        Then we can deal with inserts:
+
+          1. for any inserts to same index, combine even if not adjacent.
+          2. for any prior replace with same left boundary, combine this
+             insert with replace and delete this replace.
+          3. throw exception if index in same range as previous replace
+
+        Don't actually delete; make op null in list. Easier to walk list.
+        Later we can throw as we add to index -> op map.
+
+        Note that I.2 R.2-2 will wipe out I.2 even though, technically, the
+        inserted stuff would be before the replace range.  But, if you
+        add tokens in front of a method body '{' and then delete the method
+        body, I think the stuff before the '{' you added should disappear too.
+
+        Return a map from token index to operation.
+        """
+
+        # WALK REPLACES
+        for i, rop in enumerate(rewrites):
+            if not rop:
+                continue
+
+            if not isinstance(rop, ReplaceOp):
+                continue
+
+            # Wipe prior inserts within range
+            for j, iop in self.getKindOfOps(rewrites, InsertBeforeOp, i):
+                if iop.index == rop.index:
+                    # E.g., insert before 2, delete 2..2; update replace
+                    # text to include insert before, kill insert
+                    rewrites[iop.instructionIndex] = None
+                    rop.text = self.catOpText(iop.text, rop.text)
+
+                elif iop.index > rop.index and iop.index <= rop.lastIndex:
+                    # delete insert as it's a no-op.
+                    rewrites[j] = None
+
+            # Drop any prior replaces contained within
+            for j, prevRop in self.getKindOfOps(rewrites, ReplaceOp, i):
+                if (prevRop.index >= rop.index
+                    and prevRop.lastIndex <= rop.lastIndex):
+                    # delete replace as it's a no-op.
+                    rewrites[j] = None
+                    continue
+
+                # throw exception unless disjoint or identical
+                disjoint = (prevRop.lastIndex < rop.index
+                            or prevRop.index > rop.lastIndex)
+                same = (prevRop.index == rop.index
+                        and prevRop.lastIndex == rop.lastIndex)
+
+                # Delete special case of replace (text==null):
+                # D.i-j.u D.x-y.v| boundaries overlapcombine to
+                # max(min)..max(right)
+                if prevRop.text is None and rop.text is None and not disjoint:
+                    # kill first delete
+                    rewrites[prevRop.instructionIndex] = None
+
+                    rop.index = min(prevRop.index, rop.index)
+                    rop.lastIndex = max(prevRop.lastIndex, rop.lastIndex)
+
+                elif not disjoint and not same:
+                    raise ValueError(
+                        "replace op boundaries of {} overlap with previous {}"
+                        .format(rop, prevRop))
+
+        # WALK INSERTS
+        for i, iop in enumerate(rewrites):
+            if iop is None:
+                continue
+
+            if not isinstance(iop, InsertBeforeOp):
+                continue
+
+            # combine current insert with prior if any at same index
+            for j, prevIop in self.getKindOfOps(rewrites, InsertBeforeOp, i):
+                if prevIop.index == iop.index: # combine objects
+                    # convert to strings...we're in process of toString'ing
+                    # whole token buffer so no lazy eval issue with any
+                    # templates
+                    iop.text = self.catOpText(iop.text, prevIop.text)
+                    # delete redundant prior insert
+                    rewrites[j] = None
+
+            # look for replaces where iop.index is in range; error
+            for j, rop in self.getKindOfOps(rewrites, ReplaceOp, i):
+                if iop.index == rop.index:
+                    rop.text = self.catOpText(iop.text, rop.text)
+                    # delete current insert
+                    rewrites[i] = None
+                    continue
+
+                if iop.index >= rop.index and iop.index <= rop.lastIndex:
+                    raise ValueError(
+                        "insert op {} within boundaries of previous {}"
+                        .format(iop, rop))
+
+        m = {}
+        for i, op in enumerate(rewrites):
+            if op is None:
+                # ignore deleted ops
+                continue
+
+            assert op.index not in m, "should only be one op per index"
+            m[op.index] = op
+
+        return m
+
+
+    def catOpText(self, a, b):
+        x = ""
+        y = ""
+        if a:
+            x = a
+        if b:
+            y = b
+        return x + y
+
+
+    def getKindOfOps(self, rewrites, kind, before=None):
+        """Get all operations before an index of a particular kind."""
+
+        if before is None:
+            before = len(rewrites)
+        elif before > len(rewrites):
+            before = len(rewrites)
+
+        for i, op in enumerate(rewrites[:before]):
+            # ignore deleted
+            if op and op.__class__ == kind:
+                yield i, op
+
+
+    def toDebugString(self, start=None, end=None):
+        if start is None:
+            start = self.MIN_TOKEN_INDEX
+        if end is None:
+            end = self.size() - 1
+
+        buf = StringIO()
+        i = start
+        while i >= self.MIN_TOKEN_INDEX and i <= end and i < len(self.tokens):
+            buf.write(self.get(i))
+            i += 1
+
+        return buf.getvalue()
diff --git a/runtime/Python3/antlr3/tokens.py b/runtime/Python3/antlr3/tokens.py
new file mode 100644
index 0000000..31a2e93
--- /dev/null
+++ b/runtime/Python3/antlr3/tokens.py
@@ -0,0 +1,310 @@
+"""ANTLR3 runtime package"""
+
+# begin[licence]
+#
+# [The "BSD licence"]
+# Copyright (c) 2005-2012 Terence Parr
+# 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[licence]
+
+from .constants import DEFAULT_CHANNEL, EOF, INVALID_TOKEN_TYPE
+
+############################################################################
+#
+# basic token interface
+#
+############################################################################
+
+class Token(object):
+    """@brief Abstract token baseclass."""
+
+    TOKEN_NAMES_MAP = None
+
+    @classmethod
+    def registerTokenNamesMap(cls, tokenNamesMap):
+        """@brief Store a mapping from token type to token name.
+        
+        This enables token.typeName to give something more meaningful
+        than, e.g., '6'.
+        """
+        cls.TOKEN_NAMES_MAP = tokenNamesMap
+        cls.TOKEN_NAMES_MAP[EOF] = "EOF"
+
+    def __init__(self, type=None, channel=DEFAULT_CHANNEL, text=None,
+                 index=-1, line=0, charPositionInLine=-1, input=None):
+        # We use -1 for index and charPositionInLine as an invalid index
+        self._type = type
+        self._channel = channel
+        self._text = text
+        self._index = index
+        self._line = 0
+        self._charPositionInLine = charPositionInLine
+        self.input = input
+
+    # To override a property, you'll need to override both the getter and setter.
+    @property
+    def text(self):
+        return self._text
+
+    @text.setter
+    def text(self, value):
+        self._text = value
+
+
+    @property
+    def type(self):
+        return self._type
+
+    @type.setter
+    def type(self, value):
+        self._type = value
+
+    # For compatibility
+    def getType(self):
+        return self._type
+
+    @property
+    def typeName(self):
+        if self.TOKEN_NAMES_MAP:
+            return self.TOKEN_NAMES_MAP.get(self._type, "INVALID_TOKEN_TYPE")
+        else:
+            return str(self._type)
+    
+    @property
+    def line(self):
+        """Lines are numbered 1..n."""
+        return self._line
+
+    @line.setter
+    def line(self, value):
+        self._line = value
+
+
+    @property
+    def charPositionInLine(self):
+        """Columns are numbered 0..n-1."""
+        return self._charPositionInLine
+
+    @charPositionInLine.setter
+    def charPositionInLine(self, pos):
+        self._charPositionInLine = pos
+
+
+    @property
+    def channel(self):
+        return self._channel
+
+    @channel.setter
+    def channel(self, value):
+        self._channel = value
+
+
+    @property
+    def index(self):
+        """
+        An index from 0..n-1 of the token object in the input stream.
+        This must be valid in order to use the ANTLRWorks debugger.
+        """
+        return self._index
+
+    @index.setter
+    def index(self, value):
+        self._index = value
+
+
+    def getInputStream(self):
+        """@brief From what character stream was this token created.
+
+        You don't have to implement but it's nice to know where a Token
+        comes from if you have include files etc... on the input."""
+
+        raise NotImplementedError
+
+    def setInputStream(self, input):
+        """@brief From what character stream was this token created.
+
+        You don't have to implement but it's nice to know where a Token
+        comes from if you have include files etc... on the input."""
+
+        raise NotImplementedError
+
+
+############################################################################
+#
+# token implementations
+#
+# Token
+# +- CommonToken
+# \- ClassicToken
+#
+############################################################################
+
+class CommonToken(Token):
+    """@brief Basic token implementation.
+
+    This implementation does not copy the text from the input stream upon
+    creation, but keeps start/stop pointers into the stream to avoid
+    unnecessary copy operations.
+
+    """
+
+    def __init__(self, type=None, channel=DEFAULT_CHANNEL, text=None,
+                 input=None, start=None, stop=None, oldToken=None):
+
+        if oldToken:
+            super().__init__(oldToken.type, oldToken.channel, oldToken.text,
+                             oldToken.index, oldToken.line,
+                             oldToken.charPositionInLine, oldToken.input)
+            if isinstance(oldToken, CommonToken):
+                self.start = oldToken.start
+                self.stop = oldToken.stop
+            else:
+                self.start = start
+                self.stop = stop
+
+        else:
+            super().__init__(type=type, channel=channel, input=input)
+
+            # We need to be able to change the text once in a while.  If
+            # this is non-null, then getText should return this.  Note that
+            # start/stop are not affected by changing this.
+            self._text = text
+
+            # The char position into the input buffer where this token starts
+            self.start = start
+
+            # The char position into the input buffer where this token stops
+            # This is the index of the last char, *not* the index after it!
+            self.stop = stop
+
+
+    @property
+    def text(self):
+        # Could be the empty string, and we want to return that.
+        if self._text is not None:
+            return self._text
+
+        if not self.input:
+            return None
+
+        if self.start < self.input.size() and self.stop < self.input.size():
+            return self.input.substring(self.start, self.stop)
+
+        return '<EOF>'
+
+    @text.setter
+    def text(self, value):
+        """
+        Override the text for this token.  getText() will return this text
+        rather than pulling from the buffer.  Note that this does not mean
+        that start/stop indexes are not valid.  It means that that input
+        was converted to a new string in the token object.
+        """
+        self._text = value
+
+
+    def getInputStream(self):
+        return self.input
+
+    def setInputStream(self, input):
+        self.input = input
+
+
+    def __str__(self):
+        if self.type == EOF:
+            return "<EOF>"
+
+        channelStr = ""
+        if self.channel > 0:
+            channelStr = ",channel=" + str(self.channel)
+
+        txt = self.text
+        if txt:
+            # Put 2 backslashes in front of each character
+            txt = txt.replace("\n", r"\\n")
+            txt = txt.replace("\r", r"\\r")
+            txt = txt.replace("\t", r"\\t")
+        else:
+            txt = "<no text>"
+
+        return ("[@{0.index},{0.start}:{0.stop}={txt!r},"
+                "<{0.typeName}>{channelStr},"
+                "{0.line}:{0.charPositionInLine}]"
+                .format(self, txt=txt, channelStr=channelStr))
+
+
+class ClassicToken(Token):
+    """@brief Alternative token implementation.
+
+    A Token object like we'd use in ANTLR 2.x; has an actual string created
+    and associated with this object.  These objects are needed for imaginary
+    tree nodes that have payload objects.  We need to create a Token object
+    that has a string; the tree node will point at this token.  CommonToken
+    has indexes into a char stream and hence cannot be used to introduce
+    new strings.
+    """
+
+    def __init__(self, type=None, text=None, channel=DEFAULT_CHANNEL,
+                 oldToken=None):
+        if oldToken:
+            super().__init__(type=oldToken.type, channel=oldToken.channel,
+                             text=oldToken.text, line=oldToken.line,
+                             charPositionInLine=oldToken.charPositionInLine)
+
+        else:
+            super().__init__(type=type, channel=channel, text=text,
+                             index=None, line=None, charPositionInLine=None)
+
+
+    def getInputStream(self):
+        return None
+
+    def setInputStream(self, input):
+        pass
+
+
+    def toString(self):
+        channelStr = ""
+        if self.channel > 0:
+            channelStr = ",channel=" + str(self.channel)
+
+        txt = self.text
+        if not txt:
+            txt = "<no text>"
+
+        return ("[@{0.index!r},{txt!r},<{0.type!r}>{channelStr},"
+                "{0.line!r}:{0.charPositionInLine!r}]"
+                .format(self, txt=txt, channelStr=channelStr))
+
+    __str__ = toString
+    __repr__ = toString
+
+
+INVALID_TOKEN = CommonToken(type=INVALID_TOKEN_TYPE)
+
+# In an action, a lexer rule can set token to this SKIP_TOKEN and ANTLR
+# will avoid creating a token for this symbol and try to fetch another.
+SKIP_TOKEN = CommonToken(type=INVALID_TOKEN_TYPE)
diff --git a/runtime/Python3/antlr3/tree.py b/runtime/Python3/antlr3/tree.py
new file mode 100644
index 0000000..0a3214b
--- /dev/null
+++ b/runtime/Python3/antlr3/tree.py
@@ -0,0 +1,2829 @@
+""" @package antlr3.tree
+@brief ANTLR3 runtime package, tree module
+
+This module contains all support classes for AST construction and tree parsers.
+
+"""
+
+# begin[licence]
+#
+# [The "BSD licence"]
+# Copyright (c) 2005-2012 Terence Parr
+# 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[licence]
+
+# lot's of docstrings are missing, don't complain for now...
+# pylint: disable-msg=C0111
+
+import re
+
+from antlr3.constants import UP, DOWN, EOF, INVALID_TOKEN_TYPE
+from antlr3.recognizers import BaseRecognizer, RuleReturnScope
+from antlr3.streams import IntStream
+from antlr3.tokens import CommonToken, Token, INVALID_TOKEN
+from antlr3.exceptions import MismatchedTreeNodeException, \
+     MissingTokenException, UnwantedTokenException, MismatchedTokenException, \
+     NoViableAltException
+
+
+############################################################################
+#
+# tree related exceptions
+#
+############################################################################
+
+
+class RewriteCardinalityException(RuntimeError):
+    """
+    @brief Base class for all exceptions thrown during AST rewrite construction.
+
+    This signifies a case where the cardinality of two or more elements
+    in a subrule are different: (ID INT)+ where |ID|!=|INT|
+    """
+
+    def __init__(self, elementDescription):
+        RuntimeError.__init__(self, elementDescription)
+
+        self.elementDescription = elementDescription
+
+
+    def getMessage(self):
+        return self.elementDescription
+
+
+class RewriteEarlyExitException(RewriteCardinalityException):
+    """@brief No elements within a (...)+ in a rewrite rule"""
+
+    def __init__(self, elementDescription=None):
+        RewriteCardinalityException.__init__(self, elementDescription)
+
+
+class RewriteEmptyStreamException(RewriteCardinalityException):
+    """
+    @brief Ref to ID or expr but no tokens in ID stream or subtrees in expr stream
+    """
+
+    pass
+
+
+############################################################################
+#
+# basic Tree and TreeAdaptor interfaces
+#
+############################################################################
+
+class Tree(object):
+    """
+    @brief Abstract baseclass for tree nodes.
+
+    What does a tree look like?  ANTLR has a number of support classes
+    such as CommonTreeNodeStream that work on these kinds of trees.  You
+    don't have to make your trees implement this interface, but if you do,
+    you'll be able to use more support code.
+
+    NOTE: When constructing trees, ANTLR can build any kind of tree; it can
+    even use Token objects as trees if you add a child list to your tokens.
+
+    This is a tree node without any payload; just navigation and factory stuff.
+    """
+
+
+    def getChild(self, i):
+        raise NotImplementedError
+
+
+    def getChildCount(self):
+        raise NotImplementedError
+
+
+    def getParent(self):
+        """Tree tracks parent and child index now > 3.0"""
+
+        raise NotImplementedError
+
+    def setParent(self, t):
+        """Tree tracks parent and child index now > 3.0"""
+
+        raise NotImplementedError
+
+
+    def hasAncestor(self, ttype):
+        """Walk upwards looking for ancestor with this token type."""
+
+        raise NotImplementedError
+
+    def getAncestor(self, ttype):
+        """Walk upwards and get first ancestor with this token type."""
+
+        raise NotImplementedError
+
+    def getAncestors(self):
+        """Return a list of all ancestors of this node.
+
+        The first node of list is the root and the last is the parent of
+        this node.
+        """
+
+        raise NotImplementedError
+
+
+    def getChildIndex(self):
+        """This node is what child index? 0..n-1"""
+
+        raise NotImplementedError
+
+    def setChildIndex(self, index):
+        """This node is what child index? 0..n-1"""
+
+        raise NotImplementedError
+
+
+    def freshenParentAndChildIndexes(self):
+        """Set the parent and child index values for all children"""
+
+        raise NotImplementedError
+
+
+    def addChild(self, t):
+        """
+        Add t as a child to this node.  If t is null, do nothing.  If t
+        is nil, add all children of t to this' children.
+        """
+
+        raise NotImplementedError
+
+
+    def setChild(self, i, t):
+        """Set ith child (0..n-1) to t; t must be non-null and non-nil node"""
+
+        raise NotImplementedError
+
+
+    def deleteChild(self, i):
+        raise NotImplementedError
+
+
+    def replaceChildren(self, startChildIndex, stopChildIndex, t):
+        """
+        Delete children from start to stop and replace with t even if t is
+        a list (nil-root tree).  num of children can increase or decrease.
+        For huge child lists, inserting children can force walking rest of
+        children to set their childindex; could be slow.
+        """
+
+        raise NotImplementedError
+
+
+    def isNil(self):
+        """
+        Indicates the node is a nil node but may still have children, meaning
+        the tree is a flat list.
+        """
+
+        raise NotImplementedError
+
+
+    def getTokenStartIndex(self):
+        """
+        What is the smallest token index (indexing from 0) for this node
+           and its children?
+        """
+
+        raise NotImplementedError
+
+
+    def setTokenStartIndex(self, index):
+        raise NotImplementedError
+
+
+    def getTokenStopIndex(self):
+        """
+        What is the largest token index (indexing from 0) for this node
+        and its children?
+        """
+
+        raise NotImplementedError
+
+
+    def setTokenStopIndex(self, index):
+        raise NotImplementedError
+
+
+    def dupNode(self):
+        raise NotImplementedError
+
+
+    def getType(self):
+        """Return a token type; needed for tree parsing."""
+
+        raise NotImplementedError
+
+
+    def getText(self):
+        raise NotImplementedError
+
+
+    def getLine(self):
+        """
+        In case we don't have a token payload, what is the line for errors?
+        """
+
+        raise NotImplementedError
+
+
+    def getCharPositionInLine(self):
+        raise NotImplementedError
+
+
+    def toStringTree(self):
+        raise NotImplementedError
+
+
+    def toString(self):
+        raise NotImplementedError
+
+
+
+class TreeAdaptor(object):
+    """
+    @brief Abstract baseclass for tree adaptors.
+
+    How to create and navigate trees.  Rather than have a separate factory
+    and adaptor, I've merged them.  Makes sense to encapsulate.
+
+    This takes the place of the tree construction code generated in the
+    generated code in 2.x and the ASTFactory.
+
+    I do not need to know the type of a tree at all so they are all
+    generic Objects.  This may increase the amount of typecasting needed. :(
+    """
+
+    # C o n s t r u c t i o n
+
+    def createWithPayload(self, payload):
+        """
+        Create a tree node from Token object; for CommonTree type trees,
+        then the token just becomes the payload.  This is the most
+        common create call.
+
+        Override if you want another kind of node to be built.
+        """
+
+        raise NotImplementedError
+
+
+    def dupNode(self, treeNode):
+        """Duplicate a single tree node.
+
+        Override if you want another kind of node to be built."""
+
+        raise NotImplementedError
+
+
+    def dupTree(self, tree):
+        """Duplicate tree recursively, using dupNode() for each node"""
+
+        raise NotImplementedError
+
+
+    def nil(self):
+        """
+        Return a nil node (an empty but non-null node) that can hold
+        a list of element as the children.  If you want a flat tree (a list)
+        use "t=adaptor.nil(); t.addChild(x); t.addChild(y);"
+        """
+
+        raise NotImplementedError
+
+
+    def errorNode(self, input, start, stop, exc):
+        """
+        Return a tree node representing an error.  This node records the
+        tokens consumed during error recovery.  The start token indicates the
+        input symbol at which the error was detected.  The stop token indicates
+        the last symbol consumed during recovery.
+
+        You must specify the input stream so that the erroneous text can
+        be packaged up in the error node.  The exception could be useful
+        to some applications; default implementation stores ptr to it in
+        the CommonErrorNode.
+
+        This only makes sense during token parsing, not tree parsing.
+        Tree parsing should happen only when parsing and tree construction
+        succeed.
+        """
+
+        raise NotImplementedError
+
+
+    def isNil(self, tree):
+        """Is tree considered a nil node used to make lists of child nodes?"""
+
+        raise NotImplementedError
+
+
+    def addChild(self, t, child):
+        """
+        Add a child to the tree t.  If child is a flat tree (a list), make all
+        in list children of t.  Warning: if t has no children, but child does
+        and child isNil then you can decide it is ok to move children to t via
+        t.children = child.children; i.e., without copying the array.  Just
+        make sure that this is consistent with have the user will build
+        ASTs. Do nothing if t or child is null.
+        """
+
+        raise NotImplementedError
+
+
+    def becomeRoot(self, newRoot, oldRoot):
+        """
+        If oldRoot is a nil root, just copy or move the children to newRoot.
+        If not a nil root, make oldRoot a child of newRoot.
+
+           old=^(nil a b c), new=r yields ^(r a b c)
+           old=^(a b c), new=r yields ^(r ^(a b c))
+
+        If newRoot is a nil-rooted single child tree, use the single
+        child as the new root node.
+
+           old=^(nil a b c), new=^(nil r) yields ^(r a b c)
+           old=^(a b c), new=^(nil r) yields ^(r ^(a b c))
+
+        If oldRoot was null, it's ok, just return newRoot (even if isNil).
+
+           old=null, new=r yields r
+           old=null, new=^(nil r) yields ^(nil r)
+
+        Return newRoot.  Throw an exception if newRoot is not a
+        simple node or nil root with a single child node--it must be a root
+        node.  If newRoot is ^(nil x) return x as newRoot.
+
+        Be advised that it's ok for newRoot to point at oldRoot's
+        children; i.e., you don't have to copy the list.  We are
+        constructing these nodes so we should have this control for
+        efficiency.
+        """
+
+        raise NotImplementedError
+
+
+    def rulePostProcessing(self, root):
+        """
+        Given the root of the subtree created for this rule, post process
+        it to do any simplifications or whatever you want.  A required
+        behavior is to convert ^(nil singleSubtree) to singleSubtree
+        as the setting of start/stop indexes relies on a single non-nil root
+        for non-flat trees.
+
+        Flat trees such as for lists like "idlist : ID+ ;" are left alone
+        unless there is only one ID.  For a list, the start/stop indexes
+        are set in the nil node.
+
+        This method is executed after all rule tree construction and right
+        before setTokenBoundaries().
+        """
+
+        raise NotImplementedError
+
+
+    def getUniqueID(self, node):
+        """For identifying trees.
+
+        How to identify nodes so we can say "add node to a prior node"?
+        Even becomeRoot is an issue.  Use System.identityHashCode(node)
+        usually.
+        """
+
+        raise NotImplementedError
+
+
+    # R e w r i t e  R u l e s
+
+    def createFromToken(self, tokenType, fromToken, text=None):
+        """
+        Create a new node derived from a token, with a new token type and
+        (optionally) new text.
+
+        This is invoked from an imaginary node ref on right side of a
+        rewrite rule as IMAG[$tokenLabel] or IMAG[$tokenLabel "IMAG"].
+
+        This should invoke createToken(Token).
+        """
+
+        raise NotImplementedError
+
+
+    def createFromType(self, tokenType, text):
+        """Create a new node derived from a token, with a new token type.
+
+        This is invoked from an imaginary node ref on right side of a
+        rewrite rule as IMAG["IMAG"].
+
+        This should invoke createToken(int,String).
+        """
+
+        raise NotImplementedError
+
+
+    # C o n t e n t
+
+    def getType(self, t):
+        """For tree parsing, I need to know the token type of a node"""
+
+        raise NotImplementedError
+
+
+    def setType(self, t, type):
+        """Node constructors can set the type of a node"""
+
+        raise NotImplementedError
+
+
+    def getText(self, t):
+        raise NotImplementedError
+
+    def setText(self, t, text):
+        """Node constructors can set the text of a node"""
+
+        raise NotImplementedError
+
+
+    def getToken(self, t):
+        """Return the token object from which this node was created.
+
+        Currently used only for printing an error message.
+        The error display routine in BaseRecognizer needs to
+        display where the input the error occurred. If your
+        tree of limitation does not store information that can
+        lead you to the token, you can create a token filled with
+        the appropriate information and pass that back.  See
+        BaseRecognizer.getErrorMessage().
+        """
+
+        raise NotImplementedError
+
+
+    def setTokenBoundaries(self, t, startToken, stopToken):
+        """
+        Where are the bounds in the input token stream for this node and
+        all children?  Each rule that creates AST nodes will call this
+        method right before returning.  Flat trees (i.e., lists) will
+        still usually have a nil root node just to hold the children list.
+        That node would contain the start/stop indexes then.
+        """
+
+        raise NotImplementedError
+
+
+    def getTokenStartIndex(self, t):
+        """
+        Get the token start index for this subtree; return -1 if no such index
+        """
+
+        raise NotImplementedError
+
+
+    def getTokenStopIndex(self, t):
+        """
+        Get the token stop index for this subtree; return -1 if no such index
+        """
+
+        raise NotImplementedError
+
+
+    # N a v i g a t i o n  /  T r e e  P a r s i n g
+
+    def getChild(self, t, i):
+        """Get a child 0..n-1 node"""
+
+        raise NotImplementedError
+
+
+    def setChild(self, t, i, child):
+        """Set ith child (0..n-1) to t; t must be non-null and non-nil node"""
+
+        raise NotImplementedError
+
+
+    def deleteChild(self, t, i):
+        """Remove ith child and shift children down from right."""
+
+        raise NotImplementedError
+
+
+    def getChildCount(self, t):
+        """How many children?  If 0, then this is a leaf node"""
+
+        raise NotImplementedError
+
+
+    def getParent(self, t):
+        """
+        Who is the parent node of this node; if null, implies node is root.
+        If your node type doesn't handle this, it's ok but the tree rewrites
+        in tree parsers need this functionality.
+        """
+
+        raise NotImplementedError
+
+
+    def setParent(self, t, parent):
+        """
+        Who is the parent node of this node; if null, implies node is root.
+        If your node type doesn't handle this, it's ok but the tree rewrites
+        in tree parsers need this functionality.
+        """
+
+        raise NotImplementedError
+
+
+    def getChildIndex(self, t):
+        """
+        What index is this node in the child list? Range: 0..n-1
+        If your node type doesn't handle this, it's ok but the tree rewrites
+        in tree parsers need this functionality.
+        """
+
+        raise NotImplementedError
+
+
+    def setChildIndex(self, t, index):
+        """
+        What index is this node in the child list? Range: 0..n-1
+        If your node type doesn't handle this, it's ok but the tree rewrites
+        in tree parsers need this functionality.
+        """
+
+        raise NotImplementedError
+
+
+    def replaceChildren(self, parent, startChildIndex, stopChildIndex, t):
+        """
+        Replace from start to stop child index of parent with t, which might
+        be a list.  Number of children may be different
+        after this call.
+
+        If parent is null, don't do anything; must be at root of overall tree.
+        Can't replace whatever points to the parent externally.  Do nothing.
+        """
+
+        raise NotImplementedError
+
+
+    # Misc
+
+    def create(self, *args):
+        """
+        Deprecated, use createWithPayload, createFromToken or createFromType.
+
+        This method only exists to mimic the Java interface of TreeAdaptor.
+
+        """
+
+        if len(args) == 1 and isinstance(args[0], Token):
+            # Object create(Token payload);
+##             warnings.warn(
+##                 "Using create() is deprecated, use createWithPayload()",
+##                 DeprecationWarning,
+##                 stacklevel=2
+##                 )
+            return self.createWithPayload(args[0])
+
+        if (len(args) == 2
+            and isinstance(args[0], int)
+            and isinstance(args[1], Token)):
+            # Object create(int tokenType, Token fromToken);
+##             warnings.warn(
+##                 "Using create() is deprecated, use createFromToken()",
+##                 DeprecationWarning,
+##                 stacklevel=2
+##                 )
+            return self.createFromToken(args[0], args[1])
+
+        if (len(args) == 3
+            and isinstance(args[0], int)
+            and isinstance(args[1], Token)
+            and isinstance(args[2], str)):
+            # Object create(int tokenType, Token fromToken, String text);
+##             warnings.warn(
+##                 "Using create() is deprecated, use createFromToken()",
+##                 DeprecationWarning,
+##                 stacklevel=2
+##                 )
+            return self.createFromToken(args[0], args[1], args[2])
+
+        if (len(args) == 2
+            and isinstance(args[0], int)
+            and isinstance(args[1], str)):
+            # Object create(int tokenType, String text);
+##             warnings.warn(
+##                 "Using create() is deprecated, use createFromType()",
+##                 DeprecationWarning,
+##                 stacklevel=2
+##                 )
+            return self.createFromType(args[0], args[1])
+
+        raise TypeError(
+            "No create method with this signature found: {}"
+            .format(', '.join(type(v).__name__ for v in args)))
+
+
+############################################################################
+#
+# base implementation of Tree and TreeAdaptor
+#
+# Tree
+# \- BaseTree
+#
+# TreeAdaptor
+# \- BaseTreeAdaptor
+#
+############################################################################
+
+
+class BaseTree(Tree):
+    """
+    @brief A generic tree implementation with no payload.
+
+    You must subclass to
+    actually have any user data.  ANTLR v3 uses a list of children approach
+    instead of the child-sibling approach in v2.  A flat tree (a list) is
+    an empty node whose children represent the list.  An empty, but
+    non-null node is called "nil".
+    """
+
+    # BaseTree is abstract, no need to complain about not implemented abstract
+    # methods
+    # pylint: disable-msg=W0223
+
+    def __init__(self, node=None):
+        """
+        Create a new node from an existing node does nothing for BaseTree
+        as there are no fields other than the children list, which cannot
+        be copied as the children are not considered part of this node.
+        """
+
+        super().__init__()
+        self.children = []
+        self.parent = None
+        self.childIndex = 0
+
+
+    def getChild(self, i):
+        try:
+            return self.children[i]
+        except IndexError:
+            return None
+
+
+    def getChildren(self):
+        """@brief Get the children internal List
+
+        Note that if you directly mess with
+        the list, do so at your own risk.
+        """
+
+        # FIXME: mark as deprecated
+        return self.children
+
+
+    def getFirstChildWithType(self, treeType):
+        for child in self.children:
+            if child.getType() == treeType:
+                return child
+
+        return None
+
+
+    def getChildCount(self):
+        return len(self.children)
+
+
+    def addChild(self, childTree):
+        """Add t as child of this node.
+
+        Warning: if t has no children, but child does
+        and child isNil then this routine moves children to t via
+        t.children = child.children; i.e., without copying the array.
+        """
+
+        # this implementation is much simpler and probably less efficient
+        # than the mumbo-jumbo that Ter did for the Java runtime.
+
+        if childTree is None:
+            return
+
+        if childTree.isNil():
+            # t is an empty node possibly with children
+
+            if self.children is childTree.children:
+                raise ValueError("attempt to add child list to itself")
+
+            # fix parent pointer and childIndex for new children
+            for idx, child in enumerate(childTree.children):
+                child.parent = self
+                child.childIndex = len(self.children) + idx
+
+            self.children += childTree.children
+
+        else:
+            # child is not nil (don't care about children)
+            self.children.append(childTree)
+            childTree.parent = self
+            childTree.childIndex = len(self.children) - 1
+
+
+    def addChildren(self, children):
+        """Add all elements of kids list as children of this node"""
+
+        self.children += children
+
+
+    def setChild(self, i, t):
+        if t is None:
+            return
+
+        if t.isNil():
+            raise ValueError("Can't set single child to a list")
+
+        self.children[i] = t
+        t.parent = self
+        t.childIndex = i
+
+
+    def deleteChild(self, i):
+        killed = self.children[i]
+
+        del self.children[i]
+
+        # walk rest and decrement their child indexes
+        for idx, child in enumerate(self.children[i:]):
+            child.childIndex = i + idx
+
+        return killed
+
+
+    def replaceChildren(self, startChildIndex, stopChildIndex, newTree):
+        """
+        Delete children from start to stop and replace with t even if t is
+        a list (nil-root tree).  num of children can increase or decrease.
+        For huge child lists, inserting children can force walking rest of
+        children to set their childindex; could be slow.
+        """
+
+        if (startChildIndex >= len(self.children)
+            or stopChildIndex >= len(self.children)):
+            raise IndexError("indexes invalid")
+
+        replacingHowMany = stopChildIndex - startChildIndex + 1
+
+        # normalize to a list of children to add: newChildren
+        if newTree.isNil():
+            newChildren = newTree.children
+
+        else:
+            newChildren = [newTree]
+
+        replacingWithHowMany = len(newChildren)
+        delta = replacingHowMany - replacingWithHowMany
+
+
+        if delta == 0:
+            # if same number of nodes, do direct replace
+            for idx, child in enumerate(newChildren):
+                self.children[idx + startChildIndex] = child
+                child.parent = self
+                child.childIndex = idx + startChildIndex
+
+        else:
+            # length of children changes...
+
+            # ...delete replaced segment...
+            del self.children[startChildIndex:stopChildIndex+1]
+
+            # ...insert new segment...
+            self.children[startChildIndex:startChildIndex] = newChildren
+
+            # ...and fix indeces
+            self.freshenParentAndChildIndexes(startChildIndex)
+
+
+    def isNil(self):
+        return False
+
+
+    def freshenParentAndChildIndexes(self, offset=0):
+        for idx, child in enumerate(self.children[offset:]):
+            child.childIndex = idx + offset
+            child.parent = self
+
+
+    def sanityCheckParentAndChildIndexes(self, parent=None, i=-1):
+        if parent != self.parent:
+            raise ValueError(
+                "parents don't match; expected {!r} found {!r}"
+                .format(parent, self.parent))
+
+        if i != self.childIndex:
+            raise ValueError(
+                "child indexes don't match; expected {} found {}"
+                .format(i, self.childIndex))
+
+        for idx, child in enumerate(self.children):
+            child.sanityCheckParentAndChildIndexes(self, idx)
+
+
+    def getChildIndex(self):
+        """BaseTree doesn't track child indexes."""
+
+        return 0
+
+
+    def setChildIndex(self, index):
+        """BaseTree doesn't track child indexes."""
+
+        pass
+
+
+    def getParent(self):
+        """BaseTree doesn't track parent pointers."""
+
+        return None
+
+    def setParent(self, t):
+        """BaseTree doesn't track parent pointers."""
+
+        pass
+
+
+    def hasAncestor(self, ttype):
+        """Walk upwards looking for ancestor with this token type."""
+        return self.getAncestor(ttype) is not None
+
+    def getAncestor(self, ttype):
+        """Walk upwards and get first ancestor with this token type."""
+        t = self.getParent()
+        while t is not None:
+            if t.getType() == ttype:
+                return t
+            t = t.getParent()
+
+        return None
+
+    def getAncestors(self):
+        """Return a list of all ancestors of this node.
+
+        The first node of list is the root and the last is the parent of
+        this node.
+        """
+        if self.getParent() is None:
+            return None
+
+        ancestors = []
+        t = self.getParent()
+        while t is not None:
+            ancestors.insert(0, t) # insert at start
+            t = t.getParent()
+
+        return ancestors
+
+
+    def toStringTree(self):
+        """Print out a whole tree not just a node"""
+
+        if len(self.children) == 0:
+            return self.toString()
+
+        buf = []
+        if not self.isNil():
+            buf.append('(')
+            buf.append(self.toString())
+            buf.append(' ')
+
+        for i, child in enumerate(self.children):
+            if i > 0:
+                buf.append(' ')
+            buf.append(child.toStringTree())
+
+        if not self.isNil():
+            buf.append(')')
+
+        return ''.join(buf)
+
+
+    def getLine(self):
+        return 0
+
+
+    def getCharPositionInLine(self):
+        return 0
+
+
+    def toString(self):
+        """Override to say how a node (not a tree) should look as text"""
+
+        raise NotImplementedError
+
+
+
+class BaseTreeAdaptor(TreeAdaptor):
+    """
+    @brief A TreeAdaptor that works with any Tree implementation.
+    """
+
+    # BaseTreeAdaptor is abstract, no need to complain about not implemented
+    # abstract methods
+    # pylint: disable-msg=W0223
+
+    def nil(self):
+        return self.createWithPayload(None)
+
+
+    def errorNode(self, input, start, stop, exc):
+        """
+        create tree node that holds the start and stop tokens associated
+        with an error.
+
+        If you specify your own kind of tree nodes, you will likely have to
+        override this method. CommonTree returns Token.INVALID_TOKEN_TYPE
+        if no token payload but you might have to set token type for diff
+        node type.
+
+        You don't have to subclass CommonErrorNode; you will likely need to
+        subclass your own tree node class to avoid class cast exception.
+        """
+
+        return CommonErrorNode(input, start, stop, exc)
+
+
+    def isNil(self, tree):
+        return tree.isNil()
+
+
+    def dupTree(self, t, parent=None):
+        """
+        This is generic in the sense that it will work with any kind of
+        tree (not just Tree interface).  It invokes the adaptor routines
+        not the tree node routines to do the construction.
+        """
+
+        if t is None:
+            return None
+
+        newTree = self.dupNode(t)
+
+        # ensure new subtree root has parent/child index set
+
+        # same index in new tree
+        self.setChildIndex(newTree, self.getChildIndex(t))
+
+        self.setParent(newTree, parent)
+
+        for i in range(self.getChildCount(t)):
+            child = self.getChild(t, i)
+            newSubTree = self.dupTree(child, t)
+            self.addChild(newTree, newSubTree)
+
+        return newTree
+
+
+    def addChild(self, tree, child):
+        """
+        Add a child to the tree t.  If child is a flat tree (a list), make all
+        in list children of t.  Warning: if t has no children, but child does
+        and child isNil then you can decide it is ok to move children to t via
+        t.children = child.children; i.e., without copying the array.  Just
+        make sure that this is consistent with have the user will build
+        ASTs.
+        """
+
+        #if isinstance(child, Token):
+        #    child = self.createWithPayload(child)
+
+        if tree is not None and child is not None:
+            tree.addChild(child)
+
+
+    def becomeRoot(self, newRoot, oldRoot):
+        """
+        If oldRoot is a nil root, just copy or move the children to newRoot.
+        If not a nil root, make oldRoot a child of newRoot.
+
+          old=^(nil a b c), new=r yields ^(r a b c)
+          old=^(a b c), new=r yields ^(r ^(a b c))
+
+        If newRoot is a nil-rooted single child tree, use the single
+        child as the new root node.
+
+          old=^(nil a b c), new=^(nil r) yields ^(r a b c)
+          old=^(a b c), new=^(nil r) yields ^(r ^(a b c))
+
+        If oldRoot was null, it's ok, just return newRoot (even if isNil).
+
+          old=null, new=r yields r
+          old=null, new=^(nil r) yields ^(nil r)
+
+        Return newRoot.  Throw an exception if newRoot is not a
+        simple node or nil root with a single child node--it must be a root
+        node.  If newRoot is ^(nil x) return x as newRoot.
+
+        Be advised that it's ok for newRoot to point at oldRoot's
+        children; i.e., you don't have to copy the list.  We are
+        constructing these nodes so we should have this control for
+        efficiency.
+        """
+
+        if isinstance(newRoot, Token):
+            newRoot = self.create(newRoot)
+
+        if oldRoot is None:
+            return newRoot
+
+        if not isinstance(newRoot, CommonTree):
+            newRoot = self.createWithPayload(newRoot)
+
+        # handle ^(nil real-node)
+        if newRoot.isNil():
+            nc = newRoot.getChildCount()
+            if nc == 1:
+                newRoot = newRoot.getChild(0)
+
+            elif nc > 1:
+                # TODO: make tree run time exceptions hierarchy
+                raise RuntimeError("more than one node as root")
+
+        # add oldRoot to newRoot; addChild takes care of case where oldRoot
+        # is a flat list (i.e., nil-rooted tree).  All children of oldRoot
+        # are added to newRoot.
+        newRoot.addChild(oldRoot)
+        return newRoot
+
+
+    def rulePostProcessing(self, root):
+        """Transform ^(nil x) to x and nil to null"""
+
+        if root is not None and root.isNil():
+            if root.getChildCount() == 0:
+                root = None
+
+            elif root.getChildCount() == 1:
+                root = root.getChild(0)
+                # whoever invokes rule will set parent and child index
+                root.setParent(None)
+                root.setChildIndex(-1)
+
+        return root
+
+
+    def createFromToken(self, tokenType, fromToken, text=None):
+        if fromToken is None:
+            return self.createFromType(tokenType, text)
+
+        assert isinstance(tokenType, int), type(tokenType).__name__
+        assert isinstance(fromToken, Token), type(fromToken).__name__
+        assert text is None or isinstance(text, str), type(text).__name__
+
+        fromToken = self.createToken(fromToken)
+        fromToken.type = tokenType
+        if text is not None:
+            fromToken.text = text
+        t = self.createWithPayload(fromToken)
+        return t
+
+
+    def createFromType(self, tokenType, text):
+        assert isinstance(tokenType, int), type(tokenType).__name__
+        assert isinstance(text, str) or text is None, type(text).__name__
+
+        fromToken = self.createToken(tokenType=tokenType, text=text)
+        t = self.createWithPayload(fromToken)
+        return t
+
+
+    def getType(self, t):
+        return t.getType()
+
+
+    def setType(self, t, type):
+        raise RuntimeError("don't know enough about Tree node")
+
+
+    def getText(self, t):
+        return t.getText()
+
+
+    def setText(self, t, text):
+        raise RuntimeError("don't know enough about Tree node")
+
+
+    def getChild(self, t, i):
+        return t.getChild(i)
+
+
+    def setChild(self, t, i, child):
+        t.setChild(i, child)
+
+
+    def deleteChild(self, t, i):
+        return t.deleteChild(i)
+
+
+    def getChildCount(self, t):
+        return t.getChildCount()
+
+
+    def getUniqueID(self, node):
+        return hash(node)
+
+
+    def createToken(self, fromToken=None, tokenType=None, text=None):
+        """
+        Tell me how to create a token for use with imaginary token nodes.
+        For example, there is probably no input symbol associated with imaginary
+        token DECL, but you need to create it as a payload or whatever for
+        the DECL node as in ^(DECL type ID).
+
+        If you care what the token payload objects' type is, you should
+        override this method and any other createToken variant.
+        """
+
+        raise NotImplementedError
+
+
+############################################################################
+#
+# common tree implementation
+#
+# Tree
+# \- BaseTree
+#    \- CommonTree
+#       \- CommonErrorNode
+#
+# TreeAdaptor
+# \- BaseTreeAdaptor
+#    \- CommonTreeAdaptor
+#
+############################################################################
+
+
+class CommonTree(BaseTree):
+    """@brief A tree node that is wrapper for a Token object.
+
+    After 3.0 release
+    while building tree rewrite stuff, it became clear that computing
+    parent and child index is very difficult and cumbersome.  Better to
+    spend the space in every tree node.  If you don't want these extra
+    fields, it's easy to cut them out in your own BaseTree subclass.
+
+    """
+
+    def __init__(self, payload):
+        BaseTree.__init__(self)
+
+        # What token indexes bracket all tokens associated with this node
+        # and below?
+        self.startIndex = -1
+        self.stopIndex = -1
+
+        # Who is the parent node of this node; if null, implies node is root
+        self.parent = None
+
+        # What index is this node in the child list? Range: 0..n-1
+        self.childIndex = -1
+
+        # A single token is the payload
+        if payload is None:
+            self.token = None
+
+        elif isinstance(payload, CommonTree):
+            self.token = payload.token
+            self.startIndex = payload.startIndex
+            self.stopIndex = payload.stopIndex
+
+        elif payload is None or isinstance(payload, Token):
+            self.token = payload
+
+        else:
+            raise TypeError(type(payload).__name__)
+
+
+
+    def getToken(self):
+        return self.token
+
+
+    def dupNode(self):
+        return CommonTree(self)
+
+
+    def isNil(self):
+        return self.token is None
+
+
+    def getType(self):
+        if self.token is None:
+            return INVALID_TOKEN_TYPE
+
+        return self.token.type
+
+    type = property(getType)
+
+
+    def getText(self):
+        if self.token is None:
+            return None
+
+        return self.token.text
+
+    text = property(getText)
+
+
+    def getLine(self):
+        if self.token is None or self.token.line == 0:
+            if self.getChildCount():
+                return self.getChild(0).getLine()
+            else:
+                return 0
+
+        return self.token.line
+
+    line = property(getLine)
+
+
+    def getCharPositionInLine(self):
+        if self.token is None or self.token.charPositionInLine == -1:
+            if self.getChildCount():
+                return self.getChild(0).getCharPositionInLine()
+            else:
+                return 0
+
+        else:
+            return self.token.charPositionInLine
+
+    charPositionInLine = property(getCharPositionInLine)
+
+
+    def getTokenStartIndex(self):
+        if self.startIndex == -1 and self.token:
+            return self.token.index
+
+        return self.startIndex
+
+    def setTokenStartIndex(self, index):
+        self.startIndex = index
+
+    tokenStartIndex = property(getTokenStartIndex, setTokenStartIndex)
+
+
+    def getTokenStopIndex(self):
+        if self.stopIndex == -1 and self.token:
+            return self.token.index
+
+        return self.stopIndex
+
+    def setTokenStopIndex(self, index):
+        self.stopIndex = index
+
+    tokenStopIndex = property(getTokenStopIndex, setTokenStopIndex)
+
+
+    def setUnknownTokenBoundaries(self):
+        """For every node in this subtree, make sure it's start/stop token's
+        are set.  Walk depth first, visit bottom up.  Only updates nodes
+        with at least one token index < 0.
+        """
+
+        if self.children is None:
+            if self.startIndex < 0 or self.stopIndex < 0:
+                self.startIndex = self.stopIndex = self.token.index
+
+            return
+
+        for child in self.children:
+            child.setUnknownTokenBoundaries()
+
+        if self.startIndex >= 0 and self.stopIndex >= 0:
+            # already set
+            return
+
+        if self.children:
+            firstChild = self.children[0]
+            lastChild = self.children[-1]
+            self.startIndex = firstChild.getTokenStartIndex()
+            self.stopIndex = lastChild.getTokenStopIndex()
+
+
+    def getChildIndex(self):
+        #FIXME: mark as deprecated
+        return self.childIndex
+
+
+    def setChildIndex(self, idx):
+        #FIXME: mark as deprecated
+        self.childIndex = idx
+
+
+    def getParent(self):
+        #FIXME: mark as deprecated
+        return self.parent
+
+
+    def setParent(self, t):
+        #FIXME: mark as deprecated
+        self.parent = t
+
+
+    def toString(self):
+        if self.isNil():
+            return "nil"
+
+        if self.getType() == INVALID_TOKEN_TYPE:
+            return "<errornode>"
+
+        return self.token.text
+
+    __str__ = toString
+
+
+
+    def toStringTree(self):
+        if not self.children:
+            return self.toString()
+
+        ret = ''
+        if not self.isNil():
+            ret += '({!s} '.format(self)
+
+        ret += ' '.join([child.toStringTree() for child in self.children])
+
+        if not self.isNil():
+            ret += ')'
+
+        return ret
+
+
+INVALID_NODE = CommonTree(INVALID_TOKEN)
+
+
+class CommonErrorNode(CommonTree):
+    """A node representing erroneous token range in token stream"""
+
+    def __init__(self, input, start, stop, exc):
+        CommonTree.__init__(self, None)
+
+        if (stop is None or (stop.index < start.index and stop.type != EOF)):
+            # sometimes resync does not consume a token (when LT(1) is
+            # in follow set.  So, stop will be 1 to left to start. adjust.
+            # Also handle case where start is the first token and no token
+            # is consumed during recovery; LT(-1) will return null.
+            stop = start
+
+        self.input = input
+        self.start = start
+        self.stop = stop
+        self.trappedException = exc
+
+
+    def isNil(self):
+        return False
+
+
+    def getType(self):
+        return INVALID_TOKEN_TYPE
+
+
+    def getText(self):
+        if isinstance(self.start, Token):
+            i = self.start.index
+            j = self.stop.index
+            if self.stop.type == EOF:
+                j = self.input.size()
+
+            badText = self.input.toString(i, j)
+
+        elif isinstance(self.start, Tree):
+            badText = self.input.toString(self.start, self.stop)
+
+        else:
+            # people should subclass if they alter the tree type so this
+            # next one is for sure correct.
+            badText = "<unknown>"
+
+        return badText
+
+
+    def toString(self):
+        if isinstance(self.trappedException, MissingTokenException):
+            return ("<missing type: "
+                    + str(self.trappedException.getMissingType())
+                    + ">")
+
+        elif isinstance(self.trappedException, UnwantedTokenException):
+            return ("<extraneous: "
+                    + str(self.trappedException.getUnexpectedToken())
+                    + ", resync=" + self.getText() + ">")
+
+        elif isinstance(self.trappedException, MismatchedTokenException):
+            return ("<mismatched token: "
+                    + str(self.trappedException.token)
+                    + ", resync=" + self.getText() + ">")
+
+        elif isinstance(self.trappedException, NoViableAltException):
+            return ("<unexpected: "
+                    + str(self.trappedException.token)
+                    + ", resync=" + self.getText() + ">")
+
+        return "<error: "+self.getText()+">"
+
+    __str__ = toString
+
+
+class CommonTreeAdaptor(BaseTreeAdaptor):
+    """
+    @brief A TreeAdaptor that works with any Tree implementation.
+
+    It provides
+    really just factory methods; all the work is done by BaseTreeAdaptor.
+    If you would like to have different tokens created than ClassicToken
+    objects, you need to override this and then set the parser tree adaptor to
+    use your subclass.
+
+    To get your parser to build nodes of a different type, override
+    create(Token), errorNode(), and to be safe, YourTreeClass.dupNode().
+    dupNode is called to duplicate nodes during rewrite operations.
+    """
+
+    def dupNode(self, treeNode):
+        """
+        Duplicate a node.  This is part of the factory;
+        override if you want another kind of node to be built.
+
+        I could use reflection to prevent having to override this
+        but reflection is slow.
+        """
+
+        if treeNode is None:
+            return None
+
+        return treeNode.dupNode()
+
+
+    def createWithPayload(self, payload):
+        return CommonTree(payload)
+
+
+    def createToken(self, fromToken=None, tokenType=None, text=None):
+        """
+        Tell me how to create a token for use with imaginary token nodes.
+        For example, there is probably no input symbol associated with imaginary
+        token DECL, but you need to create it as a payload or whatever for
+        the DECL node as in ^(DECL type ID).
+
+        If you care what the token payload objects' type is, you should
+        override this method and any other createToken variant.
+        """
+
+        if fromToken is not None:
+            return CommonToken(oldToken=fromToken)
+
+        return CommonToken(type=tokenType, text=text)
+
+
+    def setTokenBoundaries(self, t, startToken, stopToken):
+        """
+        Track start/stop token for subtree root created for a rule.
+        Only works with Tree nodes.  For rules that match nothing,
+        seems like this will yield start=i and stop=i-1 in a nil node.
+        Might be useful info so I'll not force to be i..i.
+        """
+
+        if t is None:
+            return
+
+        start = 0
+        stop = 0
+
+        if startToken is not None:
+            start = startToken.index
+
+        if stopToken is not None:
+            stop = stopToken.index
+
+        t.setTokenStartIndex(start)
+        t.setTokenStopIndex(stop)
+
+
+    def getTokenStartIndex(self, t):
+        if t is None:
+            return -1
+        return t.getTokenStartIndex()
+
+
+    def getTokenStopIndex(self, t):
+        if t is None:
+            return -1
+        return t.getTokenStopIndex()
+
+
+    def getText(self, t):
+        if t is None:
+            return None
+        return t.text
+
+
+    def getType(self, t):
+        if t is None:
+            return INVALID_TOKEN_TYPE
+
+        return t.type
+
+
+    def getToken(self, t):
+        """
+        What is the Token associated with this node?  If
+        you are not using CommonTree, then you must
+        override this in your own adaptor.
+        """
+
+        if isinstance(t, CommonTree):
+            return t.getToken()
+
+        return None # no idea what to do
+
+
+    def getChild(self, t, i):
+        if t is None:
+            return None
+        return t.getChild(i)
+
+
+    def getChildCount(self, t):
+        if t is None:
+            return 0
+        return t.getChildCount()
+
+
+    def getParent(self, t):
+        return t.getParent()
+
+
+    def setParent(self, t, parent):
+        t.setParent(parent)
+
+
+    def getChildIndex(self, t):
+        if t is None:
+            return 0
+        return t.getChildIndex()
+
+
+    def setChildIndex(self, t, index):
+        t.setChildIndex(index)
+
+
+    def replaceChildren(self, parent, startChildIndex, stopChildIndex, t):
+        if parent is not None:
+            parent.replaceChildren(startChildIndex, stopChildIndex, t)
+
+
+############################################################################
+#
+# streams
+#
+# TreeNodeStream
+# \- BaseTree
+#    \- CommonTree
+#
+# TreeAdaptor
+# \- BaseTreeAdaptor
+#    \- CommonTreeAdaptor
+#
+############################################################################
+
+
+
+class TreeNodeStream(IntStream):
+    """@brief A stream of tree nodes
+
+    It accessing nodes from a tree of some kind.
+    """
+
+    # TreeNodeStream is abstract, no need to complain about not implemented
+    # abstract methods
+    # pylint: disable-msg=W0223
+
+    def get(self, i):
+        """Get a tree node at an absolute index i; 0..n-1.
+        If you don't want to buffer up nodes, then this method makes no
+        sense for you.
+        """
+
+        raise NotImplementedError
+
+
+    def LT(self, k):
+        """
+        Get tree node at current input pointer + i ahead where i=1 is next node.
+        i<0 indicates nodes in the past.  So LT(-1) is previous node, but
+        implementations are not required to provide results for k < -1.
+        LT(0) is undefined.  For i>=n, return null.
+        Return null for LT(0) and any index that results in an absolute address
+        that is negative.
+
+        This is analogus to the LT() method of the TokenStream, but this
+        returns a tree node instead of a token.  Makes code gen identical
+        for both parser and tree grammars. :)
+        """
+
+        raise NotImplementedError
+
+
+    def getTreeSource(self):
+        """
+        Where is this stream pulling nodes from?  This is not the name, but
+        the object that provides node objects.
+        """
+
+        raise NotImplementedError
+
+
+    def getTokenStream(self):
+        """
+        If the tree associated with this stream was created from a TokenStream,
+        you can specify it here.  Used to do rule $text attribute in tree
+        parser.  Optional unless you use tree parser rule text attribute
+        or output=template and rewrite=true options.
+        """
+
+        raise NotImplementedError
+
+
+    def getTreeAdaptor(self):
+        """
+        What adaptor can tell me how to interpret/navigate nodes and
+        trees.  E.g., get text of a node.
+        """
+
+        raise NotImplementedError
+
+
+    def setUniqueNavigationNodes(self, uniqueNavigationNodes):
+        """
+        As we flatten the tree, we use UP, DOWN nodes to represent
+        the tree structure.  When debugging we need unique nodes
+        so we have to instantiate new ones.  When doing normal tree
+        parsing, it's slow and a waste of memory to create unique
+        navigation nodes.  Default should be false;
+        """
+
+        raise NotImplementedError
+
+
+    def reset(self):
+        """
+        Reset the tree node stream in such a way that it acts like
+        a freshly constructed stream.
+        """
+
+        raise NotImplementedError
+
+
+    def toString(self, start, stop):
+        """
+        Return the text of all nodes from start to stop, inclusive.
+        If the stream does not buffer all the nodes then it can still
+        walk recursively from start until stop.  You can always return
+        null or "" too, but users should not access $ruleLabel.text in
+        an action of course in that case.
+        """
+
+        raise NotImplementedError
+
+
+    # REWRITING TREES (used by tree parser)
+    def replaceChildren(self, parent, startChildIndex, stopChildIndex, t):
+        """
+ 	Replace from start to stop child index of parent with t, which might
+        be a list.  Number of children may be different
+        after this call.  The stream is notified because it is walking the
+        tree and might need to know you are monkeying with the underlying
+        tree.  Also, it might be able to modify the node stream to avoid
+        restreaming for future phases.
+
+        If parent is null, don't do anything; must be at root of overall tree.
+        Can't replace whatever points to the parent externally.  Do nothing.
+        """
+
+        raise NotImplementedError
+
+
+class CommonTreeNodeStream(TreeNodeStream):
+    """@brief A buffered stream of tree nodes.
+
+    Nodes can be from a tree of ANY kind.
+
+    This node stream sucks all nodes out of the tree specified in
+    the constructor during construction and makes pointers into
+    the tree using an array of Object pointers. The stream necessarily
+    includes pointers to DOWN and UP and EOF nodes.
+
+    This stream knows how to mark/release for backtracking.
+
+    This stream is most suitable for tree interpreters that need to
+    jump around a lot or for tree parsers requiring speed (at cost of memory).
+    There is some duplicated functionality here with UnBufferedTreeNodeStream
+    but just in bookkeeping, not tree walking etc...
+
+    @see UnBufferedTreeNodeStream
+    """
+
+    def __init__(self, *args):
+        TreeNodeStream.__init__(self)
+
+        if len(args) == 1:
+            adaptor = CommonTreeAdaptor()
+            tree = args[0]
+
+            nodes = None
+            down = None
+            up = None
+            eof = None
+
+        elif len(args) == 2:
+            adaptor = args[0]
+            tree = args[1]
+
+            nodes = None
+            down = None
+            up = None
+            eof = None
+
+        elif len(args) == 3:
+            parent = args[0]
+            start = args[1]
+            stop = args[2]
+
+            adaptor = parent.adaptor
+            tree = parent.root
+
+            nodes = parent.nodes[start:stop]
+            down = parent.down
+            up = parent.up
+            eof = parent.eof
+
+        else:
+            raise TypeError("Invalid arguments")
+
+        # all these navigation nodes are shared and hence they
+        # cannot contain any line/column info
+        if down is not None:
+            self.down = down
+        else:
+            self.down = adaptor.createFromType(DOWN, "DOWN")
+
+        if up is not None:
+            self.up = up
+        else:
+            self.up = adaptor.createFromType(UP, "UP")
+
+        if eof is not None:
+            self.eof = eof
+        else:
+            self.eof = adaptor.createFromType(EOF, "EOF")
+
+        # The complete mapping from stream index to tree node.
+        # This buffer includes pointers to DOWN, UP, and EOF nodes.
+        # It is built upon ctor invocation.  The elements are type
+        #  Object as we don't what the trees look like.
+
+        # Load upon first need of the buffer so we can set token types
+        # of interest for reverseIndexing.  Slows us down a wee bit to
+        # do all of the if p==-1 testing everywhere though.
+        if nodes is not None:
+            self.nodes = nodes
+        else:
+            self.nodes = []
+
+        # Pull nodes from which tree?
+        self.root = tree
+
+        # IF this tree (root) was created from a token stream, track it.
+        self.tokens = None
+
+        # What tree adaptor was used to build these trees
+        self.adaptor = adaptor
+
+        # Reuse same DOWN, UP navigation nodes unless this is true
+        self.uniqueNavigationNodes = False
+
+        # The index into the nodes list of the current node (next node
+        # to consume).  If -1, nodes array not filled yet.
+        self.p = -1
+
+        # Track the last mark() call result value for use in rewind().
+        self.lastMarker = None
+
+        # Stack of indexes used for push/pop calls
+        self.calls = []
+
+
+    def fillBuffer(self):
+        """Walk tree with depth-first-search and fill nodes buffer.
+        Don't do DOWN, UP nodes if its a list (t is isNil).
+        """
+
+        self._fillBuffer(self.root)
+        self.p = 0 # buffer of nodes intialized now
+
+
+    def _fillBuffer(self, t):
+        nil = self.adaptor.isNil(t)
+
+        if not nil:
+            self.nodes.append(t) # add this node
+
+        # add DOWN node if t has children
+        n = self.adaptor.getChildCount(t)
+        if not nil and n > 0:
+            self.addNavigationNode(DOWN)
+
+        # and now add all its children
+        for c in range(n):
+            self._fillBuffer(self.adaptor.getChild(t, c))
+
+        # add UP node if t has children
+        if not nil and n > 0:
+            self.addNavigationNode(UP)
+
+
+    def getNodeIndex(self, node):
+        """What is the stream index for node? 0..n-1
+        Return -1 if node not found.
+        """
+
+        if self.p == -1:
+            self.fillBuffer()
+
+        for i, t in enumerate(self.nodes):
+            if t == node:
+                return i
+
+        return -1
+
+
+    def addNavigationNode(self, ttype):
+        """
+        As we flatten the tree, we use UP, DOWN nodes to represent
+        the tree structure.  When debugging we need unique nodes
+        so instantiate new ones when uniqueNavigationNodes is true.
+        """
+
+        navNode = None
+
+        if ttype == DOWN:
+            if self.hasUniqueNavigationNodes():
+                navNode = self.adaptor.createFromType(DOWN, "DOWN")
+
+            else:
+                navNode = self.down
+
+        else:
+            if self.hasUniqueNavigationNodes():
+                navNode = self.adaptor.createFromType(UP, "UP")
+
+            else:
+                navNode = self.up
+
+        self.nodes.append(navNode)
+
+
+    def get(self, i):
+        if self.p == -1:
+            self.fillBuffer()
+
+        return self.nodes[i]
+
+
+    def LT(self, k):
+        if self.p == -1:
+            self.fillBuffer()
+
+        if k == 0:
+            return None
+
+        if k < 0:
+            return self.LB(-k)
+
+        if self.p + k - 1 >= len(self.nodes):
+            return self.eof
+
+        return self.nodes[self.p + k - 1]
+
+
+    def getCurrentSymbol(self):
+        return self.LT(1)
+
+
+    def LB(self, k):
+        """Look backwards k nodes"""
+
+        if k == 0:
+            return None
+
+        if self.p - k < 0:
+            return None
+
+        return self.nodes[self.p - k]
+
+
+    def isEOF(self, obj):
+        return self.adaptor.getType(obj) == EOF
+
+
+    def getTreeSource(self):
+        return self.root
+
+
+    def getSourceName(self):
+        return self.getTokenStream().getSourceName()
+
+
+    def getTokenStream(self):
+        return self.tokens
+
+
+    def setTokenStream(self, tokens):
+        self.tokens = tokens
+
+
+    def getTreeAdaptor(self):
+        return self.adaptor
+
+
+    def hasUniqueNavigationNodes(self):
+        return self.uniqueNavigationNodes
+
+
+    def setUniqueNavigationNodes(self, uniqueNavigationNodes):
+        self.uniqueNavigationNodes = uniqueNavigationNodes
+
+
+    def consume(self):
+        if self.p == -1:
+            self.fillBuffer()
+
+        self.p += 1
+
+
+    def LA(self, i):
+        return self.adaptor.getType(self.LT(i))
+
+
+    def mark(self):
+        if self.p == -1:
+            self.fillBuffer()
+
+
+        self.lastMarker = self.index()
+        return self.lastMarker
+
+
+    def release(self, marker=None):
+        # no resources to release
+
+        pass
+
+
+    def index(self):
+        return self.p
+
+
+    def rewind(self, marker=None):
+        if marker is None:
+            marker = self.lastMarker
+
+        self.seek(marker)
+
+
+    def seek(self, index):
+        if self.p == -1:
+            self.fillBuffer()
+
+        self.p = index
+
+
+    def push(self, index):
+        """
+        Make stream jump to a new location, saving old location.
+        Switch back with pop().
+        """
+
+        self.calls.append(self.p) # save current index
+        self.seek(index)
+
+
+    def pop(self):
+        """
+        Seek back to previous index saved during last push() call.
+        Return top of stack (return index).
+        """
+
+        ret = self.calls.pop(-1)
+        self.seek(ret)
+        return ret
+
+
+    def reset(self):
+        self.p = 0
+        self.lastMarker = 0
+        self.calls = []
+
+
+    def size(self):
+        if self.p == -1:
+            self.fillBuffer()
+
+        return len(self.nodes)
+
+
+    # TREE REWRITE INTERFACE
+
+    def replaceChildren(self, parent, startChildIndex, stopChildIndex, t):
+        if parent is not None:
+            self.adaptor.replaceChildren(
+                parent, startChildIndex, stopChildIndex, t
+                )
+
+
+    def __str__(self):
+        """Used for testing, just return the token type stream"""
+
+        if self.p == -1:
+            self.fillBuffer()
+
+        return ' '.join([str(self.adaptor.getType(node))
+                         for node in self.nodes
+                         ])
+
+
+    def toString(self, start, stop):
+        if start is None or stop is None:
+            return None
+
+        if self.p == -1:
+            self.fillBuffer()
+
+        #System.out.println("stop: "+stop);
+        #if ( start instanceof CommonTree )
+        #    System.out.print("toString: "+((CommonTree)start).getToken()+", ");
+        #else
+        #    System.out.println(start);
+        #if ( stop instanceof CommonTree )
+        #    System.out.println(((CommonTree)stop).getToken());
+        #else
+        #    System.out.println(stop);
+
+        # if we have the token stream, use that to dump text in order
+        if self.tokens is not None:
+            beginTokenIndex = self.adaptor.getTokenStartIndex(start)
+            endTokenIndex = self.adaptor.getTokenStopIndex(stop)
+
+            # if it's a tree, use start/stop index from start node
+            # else use token range from start/stop nodes
+            if self.adaptor.getType(stop) == UP:
+                endTokenIndex = self.adaptor.getTokenStopIndex(start)
+
+            elif self.adaptor.getType(stop) == EOF:
+                endTokenIndex = self.size() -2 # don't use EOF
+
+            return self.tokens.toString(beginTokenIndex, endTokenIndex)
+
+        # walk nodes looking for start
+        i, t = 0, None
+        for i, t in enumerate(self.nodes):
+            if t == start:
+                break
+
+        # now walk until we see stop, filling string buffer with text
+        buf = []
+        t = self.nodes[i]
+        while t != stop:
+            text = self.adaptor.getText(t)
+            if text is None:
+                text = " " + self.adaptor.getType(t)
+
+            buf.append(text)
+            i += 1
+            t = self.nodes[i]
+
+        # include stop node too
+        text = self.adaptor.getText(stop)
+        if text is None:
+            text = " " +self.adaptor.getType(stop)
+
+        buf.append(text)
+
+        return ''.join(buf)
+
+
+    ## iterator interface
+    def __iter__(self):
+        if self.p == -1:
+            self.fillBuffer()
+
+        for node in self.nodes:
+            yield node
+
+
+#############################################################################
+#
+# tree parser
+#
+#############################################################################
+
+class TreeParser(BaseRecognizer):
+    """@brief Baseclass for generated tree parsers.
+
+    A parser for a stream of tree nodes.  "tree grammars" result in a subclass
+    of this.  All the error reporting and recovery is shared with Parser via
+    the BaseRecognizer superclass.
+    """
+
+    def __init__(self, input, state=None):
+        BaseRecognizer.__init__(self, state)
+
+        self.input = None
+        self.setTreeNodeStream(input)
+
+
+    def reset(self):
+        BaseRecognizer.reset(self) # reset all recognizer state variables
+        if self.input is not None:
+            self.input.seek(0) # rewind the input
+
+
+    def setTreeNodeStream(self, input):
+        """Set the input stream"""
+
+        self.input = input
+
+
+    def getTreeNodeStream(self):
+        return self.input
+
+
+    def getSourceName(self):
+        return self.input.getSourceName()
+
+
+    def getCurrentInputSymbol(self, input):
+        return input.LT(1)
+
+
+    def getMissingSymbol(self, input, e, expectedTokenType, follow):
+        tokenText = "<missing " + self.tokenNames[expectedTokenType] + ">"
+        adaptor = input.adaptor
+        return adaptor.createToken(
+            CommonToken(type=expectedTokenType, text=tokenText))
+
+
+    # precompiled regex used by inContext
+    dotdot = ".*[^.]\\.\\.[^.].*"
+    doubleEtc = ".*\\.\\.\\.\\s+\\.\\.\\..*"
+    dotdotPattern = re.compile(dotdot)
+    doubleEtcPattern = re.compile(doubleEtc)
+
+    def inContext(self, context, adaptor=None, tokenName=None, t=None):
+        """Check if current node in input has a context.
+
+        Context means sequence of nodes towards root of tree.  For example,
+        you might say context is "MULT" which means my parent must be MULT.
+        "CLASS VARDEF" says current node must be child of a VARDEF and whose
+        parent is a CLASS node.  You can use "..." to mean zero-or-more nodes.
+        "METHOD ... VARDEF" means my parent is VARDEF and somewhere above
+        that is a METHOD node.  The first node in the context is not
+        necessarily the root.  The context matcher stops matching and returns
+        true when it runs out of context.  There is no way to force the first
+        node to be the root.
+        """
+
+        return self._inContext(
+            self.input.getTreeAdaptor(), self.tokenNames,
+            self.input.LT(1), context)
+
+    @classmethod
+    def _inContext(cls, adaptor, tokenNames, t, context):
+        """The worker for inContext.
+
+        It's static and full of parameters for testing purposes.
+        """
+
+        if cls.dotdotPattern.match(context):
+            # don't allow "..", must be "..."
+            raise ValueError("invalid syntax: ..")
+
+        if cls.doubleEtcPattern.match(context):
+            # don't allow double "..."
+            raise ValueError("invalid syntax: ... ...")
+
+        # ensure spaces around ...
+        context = context.replace("...", " ... ")
+        context = context.strip()
+        nodes = context.split()
+
+        ni = len(nodes) - 1
+        t = adaptor.getParent(t)
+        while ni >= 0 and t is not None:
+            if nodes[ni] == "...":
+                # walk upwards until we see nodes[ni-1] then continue walking
+                if ni == 0:
+                    # ... at start is no-op
+                    return True
+                goal = nodes[ni-1]
+                ancestor = cls._getAncestor(adaptor, tokenNames, t, goal)
+                if ancestor is None:
+                    return False
+                t = ancestor
+                ni -= 1
+
+            name = tokenNames[adaptor.getType(t)]
+            if name != nodes[ni]:
+                return False
+
+            # advance to parent and to previous element in context node list
+            ni -= 1
+            t = adaptor.getParent(t)
+
+        # at root but more nodes to match
+        if t is None and ni >= 0:
+            return False
+
+        return True
+
+    @staticmethod
+    def _getAncestor(adaptor, tokenNames, t, goal):
+        """Helper for static inContext."""
+        while t is not None:
+            name = tokenNames[adaptor.getType(t)]
+            if name == goal:
+                return t
+            t = adaptor.getParent(t)
+
+        return None
+
+
+    def matchAny(self):
+        """
+        Match '.' in tree parser has special meaning.  Skip node or
+        entire tree if node has children.  If children, scan until
+        corresponding UP node.
+        """
+
+        self._state.errorRecovery = False
+
+        look = self.input.LT(1)
+        if self.input.getTreeAdaptor().getChildCount(look) == 0:
+            self.input.consume() # not subtree, consume 1 node and return
+            return
+
+        # current node is a subtree, skip to corresponding UP.
+        # must count nesting level to get right UP
+        level = 0
+        tokenType = self.input.getTreeAdaptor().getType(look)
+        while tokenType != EOF and not (tokenType == UP and level==0):
+            self.input.consume()
+            look = self.input.LT(1)
+            tokenType = self.input.getTreeAdaptor().getType(look)
+            if tokenType == DOWN:
+                level += 1
+
+            elif tokenType == UP:
+                level -= 1
+
+        self.input.consume() # consume UP
+
+
+    def mismatch(self, input, ttype, follow):
+        """
+        We have DOWN/UP nodes in the stream that have no line info; override.
+        plus we want to alter the exception type. Don't try to recover
+        from tree parser errors inline...
+        """
+
+        raise MismatchedTreeNodeException(ttype, input)
+
+
+    def getErrorHeader(self, e):
+        """
+        Prefix error message with the grammar name because message is
+        always intended for the programmer because the parser built
+        the input tree not the user.
+        """
+
+        return (self.getGrammarFileName() +
+                ": node from {}line {}:{}".format(
+                    "after " if e.approximateLineInfo else '',
+                    e.line,
+                    e.charPositionInLine))
+
+    def getErrorMessage(self, e):
+        """
+        Tree parsers parse nodes they usually have a token object as
+        payload. Set the exception token and do the default behavior.
+        """
+
+        if isinstance(self, TreeParser):
+            adaptor = e.input.getTreeAdaptor()
+            e.token = adaptor.getToken(e.node)
+            if e.token is not None: # could be an UP/DOWN node
+                e.token = CommonToken(
+                    type=adaptor.getType(e.node),
+                    text=adaptor.getText(e.node)
+                    )
+
+        return BaseRecognizer.getErrorMessage(self, e)
+
+
+    def traceIn(self, ruleName, ruleIndex):
+        BaseRecognizer.traceIn(self, ruleName, ruleIndex, self.input.LT(1))
+
+
+    def traceOut(self, ruleName, ruleIndex):
+        BaseRecognizer.traceOut(self, ruleName, ruleIndex, self.input.LT(1))
+
+
+#############################################################################
+#
+# tree visitor
+#
+#############################################################################
+
+class TreeVisitor(object):
+    """Do a depth first walk of a tree, applying pre() and post() actions
+    we go.
+    """
+
+    def __init__(self, adaptor=None):
+        if adaptor is not None:
+            self.adaptor = adaptor
+        else:
+            self.adaptor = CommonTreeAdaptor()
+
+    def visit(self, t, pre_action=None, post_action=None):
+        """Visit every node in tree t and trigger an action for each node
+        before/after having visited all of its children.  Bottom up walk.
+        Execute both actions even if t has no children.  Ignore return
+        results from transforming children since they will have altered
+        the child list of this node (their parent).  Return result of
+        applying post action to this node.
+
+        The Python version differs from the Java version by taking two
+        callables 'pre_action' and 'post_action' instead of a class instance
+        that wraps those methods. Those callables must accept a TreeNode as
+        their single argument and return the (potentially transformed or
+        replaced) TreeNode.
+        """
+
+        isNil = self.adaptor.isNil(t)
+        if pre_action is not None and not isNil:
+            # if rewritten, walk children of new t
+            t = pre_action(t)
+
+        idx = 0
+        while idx < self.adaptor.getChildCount(t):
+            child = self.adaptor.getChild(t, idx)
+            self.visit(child, pre_action, post_action)
+            idx += 1
+
+        if post_action is not None and not isNil:
+            t = post_action(t)
+
+        return t
+
+#############################################################################
+#
+# tree iterator
+#
+#############################################################################
+
+class TreeIterator(object):
+    """
+    Return a node stream from a doubly-linked tree whose nodes
+    know what child index they are.
+
+    Emit navigation nodes (DOWN, UP, and EOF) to let show tree structure.
+    """
+
+    def __init__(self, tree, adaptor=None):
+        if adaptor is None:
+            adaptor = CommonTreeAdaptor()
+
+        self.root = tree
+        self.adaptor = adaptor
+
+        self.first_time = True
+        self.tree = tree
+
+        # If we emit UP/DOWN nodes, we need to spit out multiple nodes per
+        # next() call.
+        self.nodes = []
+
+        # navigation nodes to return during walk and at end
+        self.down = adaptor.createFromType(DOWN, "DOWN")
+        self.up = adaptor.createFromType(UP, "UP")
+        self.eof = adaptor.createFromType(EOF, "EOF")
+
+
+    def reset(self):
+        self.first_time = True
+        self.tree = self.root
+        self.nodes = []
+
+
+    def __iter__(self):
+        return self
+
+
+    def has_next(self):
+        if self.first_time:
+            return self.root is not None
+
+        if len(self.nodes) > 0:
+            return True
+
+        if self.tree is None:
+            return False
+
+        if self.adaptor.getChildCount(self.tree) > 0:
+            return True
+
+        # back at root?
+        return self.adaptor.getParent(self.tree) is not None
+
+
+    def __next__(self):
+        if not self.has_next():
+            raise StopIteration
+
+        if self.first_time:
+            # initial condition
+            self.first_time = False
+            if self.adaptor.getChildCount(self.tree) == 0:
+                # single node tree (special)
+                self.nodes.append(self.eof)
+                return self.tree
+
+            return self.tree
+
+        # if any queued up, use those first
+        if len(self.nodes) > 0:
+            return self.nodes.pop(0)
+
+        # no nodes left?
+        if self.tree is None:
+            return self.eof
+
+        # next node will be child 0 if any children
+        if self.adaptor.getChildCount(self.tree) > 0:
+            self.tree = self.adaptor.getChild(self.tree, 0)
+            # real node is next after DOWN
+            self.nodes.append(self.tree)
+            return self.down
+
+        # if no children, look for next sibling of tree or ancestor
+        parent = self.adaptor.getParent(self.tree)
+        # while we're out of siblings, keep popping back up towards root
+        while (parent is not None
+               and self.adaptor.getChildIndex(self.tree)+1 >= self.adaptor.getChildCount(parent)):
+            # we're moving back up
+            self.nodes.append(self.up)
+            self.tree = parent
+            parent = self.adaptor.getParent(self.tree)
+
+        # no nodes left?
+        if parent is None:
+            self.tree = None # back at root? nothing left then
+            self.nodes.append(self.eof) # add to queue, might have UP nodes in there
+            return self.nodes.pop(0)
+
+        # must have found a node with an unvisited sibling
+        # move to it and return it
+        nextSiblingIndex = self.adaptor.getChildIndex(self.tree) + 1
+        self.tree = self.adaptor.getChild(parent, nextSiblingIndex)
+        self.nodes.append(self.tree) # add to queue, might have UP nodes in there
+        return self.nodes.pop(0)
+
+
+
+#############################################################################
+#
+# streams for rule rewriting
+#
+#############################################################################
+
+class RewriteRuleElementStream(object):
+    """@brief Internal helper class.
+
+    A generic list of elements tracked in an alternative to be used in
+    a -> rewrite rule.  We need to subclass to fill in the next() method,
+    which returns either an AST node wrapped around a token payload or
+    an existing subtree.
+
+    Once you start next()ing, do not try to add more elements.  It will
+    break the cursor tracking I believe.
+
+    @see org.antlr.runtime.tree.RewriteRuleSubtreeStream
+    @see org.antlr.runtime.tree.RewriteRuleTokenStream
+
+    TODO: add mechanism to detect/puke on modification after reading from
+    stream
+    """
+
+    def __init__(self, adaptor, elementDescription, elements=None):
+        # Cursor 0..n-1.  If singleElement!=null, cursor is 0 until you next(),
+        # which bumps it to 1 meaning no more elements.
+        self.cursor = 0
+
+        # Track single elements w/o creating a list.  Upon 2nd add, alloc list
+        self.singleElement = None
+
+        # The list of tokens or subtrees we are tracking
+        self.elements = None
+
+        # Once a node / subtree has been used in a stream, it must be dup'd
+        # from then on.  Streams are reset after subrules so that the streams
+        # can be reused in future subrules.  So, reset must set a dirty bit.
+        # If dirty, then next() always returns a dup.
+        self.dirty = False
+
+        # The element or stream description; usually has name of the token or
+        # rule reference that this list tracks.  Can include rulename too, but
+        # the exception would track that info.
+        self.elementDescription = elementDescription
+
+        self.adaptor = adaptor
+
+        if isinstance(elements, (list, tuple)):
+            # Create a stream, but feed off an existing list
+            self.singleElement = None
+            self.elements = elements
+
+        else:
+            # Create a stream with one element
+            self.add(elements)
+
+
+    def reset(self):
+        """
+        Reset the condition of this stream so that it appears we have
+        not consumed any of its elements.  Elements themselves are untouched.
+        Once we reset the stream, any future use will need duplicates.  Set
+        the dirty bit.
+        """
+
+        self.cursor = 0
+        self.dirty = True
+
+
+    def add(self, el):
+        if el is None:
+            return
+
+        if self.elements is not None: # if in list, just add
+            self.elements.append(el)
+            return
+
+        if self.singleElement is None: # no elements yet, track w/o list
+            self.singleElement = el
+            return
+
+        # adding 2nd element, move to list
+        self.elements = []
+        self.elements.append(self.singleElement)
+        self.singleElement = None
+        self.elements.append(el)
+
+
+    def nextTree(self):
+        """
+        Return the next element in the stream.  If out of elements, throw
+        an exception unless size()==1.  If size is 1, then return elements[0].
+
+        Return a duplicate node/subtree if stream is out of elements and
+        size==1. If we've already used the element, dup (dirty bit set).
+        """
+
+        if (self.dirty
+            or (self.cursor >= len(self) and len(self) == 1)
+            ):
+            # if out of elements and size is 1, dup
+            el = self._next()
+            return self.dup(el)
+
+        # test size above then fetch
+        el = self._next()
+        return el
+
+
+    def _next(self):
+        """
+        do the work of getting the next element, making sure that it's
+        a tree node or subtree.  Deal with the optimization of single-
+        element list versus list of size > 1.  Throw an exception
+        if the stream is empty or we're out of elements and size>1.
+        protected so you can override in a subclass if necessary.
+        """
+
+        if len(self) == 0:
+            raise RewriteEmptyStreamException(self.elementDescription)
+
+        if self.cursor >= len(self): # out of elements?
+            if len(self) == 1: # if size is 1, it's ok; return and we'll dup
+                return self.toTree(self.singleElement)
+
+            # out of elements and size was not 1, so we can't dup
+            raise RewriteCardinalityException(self.elementDescription)
+
+        # we have elements
+        if self.singleElement is not None:
+            self.cursor += 1 # move cursor even for single element list
+            return self.toTree(self.singleElement)
+
+        # must have more than one in list, pull from elements
+        o = self.toTree(self.elements[self.cursor])
+        self.cursor += 1
+        return o
+
+
+    def dup(self, el):
+        """
+        When constructing trees, sometimes we need to dup a token or AST
+        subtree.  Dup'ing a token means just creating another AST node
+        around it.  For trees, you must call the adaptor.dupTree() unless
+        the element is for a tree root; then it must be a node dup.
+        """
+
+        raise NotImplementedError
+
+
+    def toTree(self, el):
+        """
+        Ensure stream emits trees; tokens must be converted to AST nodes.
+        AST nodes can be passed through unmolested.
+        """
+
+        return el
+
+
+    def hasNext(self):
+        return ( (self.singleElement is not None and self.cursor < 1)
+                 or (self.elements is not None
+                     and self.cursor < len(self.elements)
+                     )
+                 )
+
+
+    def size(self):
+        if self.singleElement is not None:
+            return 1
+
+        if self.elements is not None:
+            return len(self.elements)
+
+        return 0
+
+    __len__ = size
+
+
+    def getDescription(self):
+        """Deprecated. Directly access elementDescription attribute"""
+
+        return self.elementDescription
+
+
+class RewriteRuleTokenStream(RewriteRuleElementStream):
+    """@brief Internal helper class."""
+
+    def toTree(self, el):
+        # Don't convert to a tree unless they explicitly call nextTree.
+        # This way we can do hetero tree nodes in rewrite.
+        return el
+
+
+    def nextNode(self):
+        t = self._next()
+        return self.adaptor.createWithPayload(t)
+
+
+    def nextToken(self):
+        return self._next()
+
+
+    def dup(self, el):
+        raise TypeError("dup can't be called for a token stream.")
+
+
+class RewriteRuleSubtreeStream(RewriteRuleElementStream):
+    """@brief Internal helper class."""
+
+    def nextNode(self):
+        """
+        Treat next element as a single node even if it's a subtree.
+        This is used instead of next() when the result has to be a
+        tree root node.  Also prevents us from duplicating recently-added
+        children; e.g., ^(type ID)+ adds ID to type and then 2nd iteration
+        must dup the type node, but ID has been added.
+
+        Referencing a rule result twice is ok; dup entire tree as
+        we can't be adding trees as root; e.g., expr expr.
+
+        Hideous code duplication here with super.next().  Can't think of
+        a proper way to refactor.  This needs to always call dup node
+        and super.next() doesn't know which to call: dup node or dup tree.
+        """
+
+        if (self.dirty
+            or (self.cursor >= len(self) and len(self) == 1)
+            ):
+            # if out of elements and size is 1, dup (at most a single node
+            # since this is for making root nodes).
+            el = self._next()
+            return self.adaptor.dupNode(el)
+
+        # test size above then fetch
+        el = self._next()
+        while self.adaptor.isNil(el) and self.adaptor.getChildCount(el) == 1:
+            el = self.adaptor.getChild(el, 0)
+
+        # dup just the root (want node here)
+        return self.adaptor.dupNode(el)
+
+
+    def dup(self, el):
+        return self.adaptor.dupTree(el)
+
+
+
+class RewriteRuleNodeStream(RewriteRuleElementStream):
+    """
+    Queues up nodes matched on left side of -> in a tree parser. This is
+    the analog of RewriteRuleTokenStream for normal parsers.
+    """
+
+    def nextNode(self):
+        return self._next()
+
+
+    def toTree(self, el):
+        return self.adaptor.dupNode(el)
+
+
+    def dup(self, el):
+        # we dup every node, so don't have to worry about calling dup; short-
+        #circuited next() so it doesn't call.
+        raise TypeError("dup can't be called for a node stream.")
+
+
+class TreeRuleReturnScope(RuleReturnScope):
+    """
+    This is identical to the ParserRuleReturnScope except that
+    the start property is a tree nodes not Token object
+    when you are parsing trees.  To be generic the tree node types
+    have to be Object.
+    """
+
+    def __init__(self):
+        super().__init__()
+        self.start = None
+        self.tree = None
+
+
+    def getStart(self):
+        return self.start
+
+
+    def getTree(self):
+        return self.tree
diff --git a/runtime/Python3/antlr3/treewizard.py b/runtime/Python3/antlr3/treewizard.py
new file mode 100644
index 0000000..0fefe0f
--- /dev/null
+++ b/runtime/Python3/antlr3/treewizard.py
@@ -0,0 +1,619 @@
+""" @package antlr3.tree
+@brief ANTLR3 runtime package, treewizard module
+
+A utility module to create ASTs at runtime.
+See <http://www.antlr.org/wiki/display/~admin/2007/07/02/Exploring+Concept+of+TreeWizard> for an overview. Note that the API of the Python implementation is slightly different.
+
+"""
+
+# begin[licence]
+#
+# [The "BSD licence"]
+# Copyright (c) 2005-2012 Terence Parr
+# 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[licence]
+
+from .constants import INVALID_TOKEN_TYPE
+from .tokens import CommonToken
+from .tree import CommonTree, CommonTreeAdaptor
+
+
+def computeTokenTypes(tokenNames):
+    """
+    Compute a dict that is an inverted index of
+    tokenNames (which maps int token types to names).
+    """
+
+    if tokenNames:
+        return dict((name, type) for type, name in enumerate(tokenNames))
+
+    return {}
+
+
+## token types for pattern parser
+EOF = -1
+BEGIN = 1
+END = 2
+ID = 3
+ARG = 4
+PERCENT = 5
+COLON = 6
+DOT = 7
+
+class TreePatternLexer(object):
+    def __init__(self, pattern):
+        ## The tree pattern to lex like "(A B C)"
+        self.pattern = pattern
+
+	## Index into input string
+        self.p = -1
+
+	## Current char
+        self.c = None
+
+	## How long is the pattern in char?
+        self.n = len(pattern)
+
+	## Set when token type is ID or ARG
+        self.sval = None
+
+        self.error = False
+
+        self.consume()
+
+
+    __idStartChar = frozenset(
+        'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_'
+        )
+    __idChar = __idStartChar | frozenset('0123456789')
+
+    def nextToken(self):
+        self.sval = ""
+        while self.c != EOF:
+            if self.c in (' ', '\n', '\r', '\t'):
+                self.consume()
+                continue
+
+            if self.c in self.__idStartChar:
+                self.sval += self.c
+                self.consume()
+                while self.c in self.__idChar:
+                    self.sval += self.c
+                    self.consume()
+
+                return ID
+
+            if self.c == '(':
+                self.consume()
+                return BEGIN
+
+            if self.c == ')':
+                self.consume()
+                return END
+
+            if self.c == '%':
+                self.consume()
+                return PERCENT
+
+            if self.c == ':':
+                self.consume()
+                return COLON
+
+            if self.c == '.':
+                self.consume()
+                return DOT
+
+            if self.c == '[': # grab [x] as a string, returning x
+                self.consume()
+                while self.c != ']':
+                    if self.c == '\\':
+                        self.consume()
+                        if self.c != ']':
+                            self.sval += '\\'
+
+                        self.sval += self.c
+
+                    else:
+                        self.sval += self.c
+
+                    self.consume()
+
+                self.consume()
+                return ARG
+
+            self.consume()
+            self.error = True
+            return EOF
+
+        return EOF
+
+
+    def consume(self):
+        self.p += 1
+        if self.p >= self.n:
+            self.c = EOF
+
+        else:
+            self.c = self.pattern[self.p]
+
+
+class TreePatternParser(object):
+    def __init__(self, tokenizer, wizard, adaptor):
+        self.tokenizer = tokenizer
+        self.wizard = wizard
+        self.adaptor = adaptor
+        self.ttype = tokenizer.nextToken() # kickstart
+
+
+    def pattern(self):
+        if self.ttype == BEGIN:
+            return self.parseTree()
+
+        elif self.ttype == ID:
+            node = self.parseNode()
+            if self.ttype == EOF:
+                return node
+
+            return None # extra junk on end
+
+        return None
+
+
+    def parseTree(self):
+        if self.ttype != BEGIN:
+            return None
+
+        self.ttype = self.tokenizer.nextToken()
+        root = self.parseNode()
+        if root is None:
+            return None
+
+        while self.ttype in (BEGIN, ID, PERCENT, DOT):
+            if self.ttype == BEGIN:
+                subtree = self.parseTree()
+                self.adaptor.addChild(root, subtree)
+
+            else:
+                child = self.parseNode()
+                if child is None:
+                    return None
+
+                self.adaptor.addChild(root, child)
+
+        if self.ttype != END:
+            return None
+
+        self.ttype = self.tokenizer.nextToken()
+        return root
+
+
+    def parseNode(self):
+        # "%label:" prefix
+        label = None
+
+        if self.ttype == PERCENT:
+            self.ttype = self.tokenizer.nextToken()
+            if self.ttype != ID:
+                return None
+
+            label = self.tokenizer.sval
+            self.ttype = self.tokenizer.nextToken()
+            if self.ttype != COLON:
+                return None
+
+            self.ttype = self.tokenizer.nextToken() # move to ID following colon
+
+        # Wildcard?
+        if self.ttype == DOT:
+            self.ttype = self.tokenizer.nextToken()
+            wildcardPayload = CommonToken(0, ".")
+            node = WildcardTreePattern(wildcardPayload)
+            if label is not None:
+                node.label = label
+            return node
+
+        # "ID" or "ID[arg]"
+        if self.ttype != ID:
+            return None
+
+        tokenName = self.tokenizer.sval
+        self.ttype = self.tokenizer.nextToken()
+
+        if tokenName == "nil":
+            return self.adaptor.nil()
+
+        text = tokenName
+        # check for arg
+        arg = None
+        if self.ttype == ARG:
+            arg = self.tokenizer.sval
+            text = arg
+            self.ttype = self.tokenizer.nextToken()
+
+        # create node
+        treeNodeType = self.wizard.getTokenType(tokenName)
+        if treeNodeType == INVALID_TOKEN_TYPE:
+            return None
+
+        node = self.adaptor.createFromType(treeNodeType, text)
+        if label is not None and isinstance(node, TreePattern):
+            node.label = label
+
+        if arg is not None and isinstance(node, TreePattern):
+            node.hasTextArg = True
+
+        return node
+
+
+class TreePattern(CommonTree):
+    """
+    When using %label:TOKENNAME in a tree for parse(), we must
+    track the label.
+    """
+
+    def __init__(self, payload):
+        super().__init__(payload)
+
+        self.label = None
+        self.hasTextArg = None
+
+
+    def toString(self):
+        if self.label:
+            return '%' + self.label + ':' + super().toString()
+
+        else:
+            return super().toString()
+
+
+class WildcardTreePattern(TreePattern):
+    pass
+
+
+class TreePatternTreeAdaptor(CommonTreeAdaptor):
+    """This adaptor creates TreePattern objects for use during scan()"""
+
+    def createWithPayload(self, payload):
+        return TreePattern(payload)
+
+
+class TreeWizard(object):
+    """
+    Build and navigate trees with this object.  Must know about the names
+    of tokens so you have to pass in a map or array of token names (from which
+    this class can build the map).  I.e., Token DECL means nothing unless the
+    class can translate it to a token type.
+
+    In order to create nodes and navigate, this class needs a TreeAdaptor.
+
+    This class can build a token type -> node index for repeated use or for
+    iterating over the various nodes with a particular type.
+
+    This class works in conjunction with the TreeAdaptor rather than moving
+    all this functionality into the adaptor.  An adaptor helps build and
+    navigate trees using methods.  This class helps you do it with string
+    patterns like "(A B C)".  You can create a tree from that pattern or
+    match subtrees against it.
+    """
+
+    def __init__(self, adaptor=None, tokenNames=None, typeMap=None):
+        if adaptor is None:
+            self.adaptor = CommonTreeAdaptor()
+
+        else:
+            self.adaptor = adaptor
+
+        if typeMap is None:
+            self.tokenNameToTypeMap = computeTokenTypes(tokenNames)
+
+        else:
+            if tokenNames:
+                raise ValueError("Can't have both tokenNames and typeMap")
+
+            self.tokenNameToTypeMap = typeMap
+
+
+    def getTokenType(self, tokenName):
+        """Using the map of token names to token types, return the type."""
+
+        if tokenName in self.tokenNameToTypeMap:
+            return self.tokenNameToTypeMap[tokenName]
+        else:
+            return INVALID_TOKEN_TYPE
+
+
+    def create(self, pattern):
+        """
+        Create a tree or node from the indicated tree pattern that closely
+        follows ANTLR tree grammar tree element syntax:
+
+        (root child1 ... child2).
+
+        You can also just pass in a node: ID
+
+        Any node can have a text argument: ID[foo]
+        (notice there are no quotes around foo--it's clear it's a string).
+
+        nil is a special name meaning "give me a nil node".  Useful for
+        making lists: (nil A B C) is a list of A B C.
+        """
+
+        tokenizer = TreePatternLexer(pattern)
+        parser = TreePatternParser(tokenizer, self, self.adaptor)
+        return parser.pattern()
+
+
+    def index(self, tree):
+        """Walk the entire tree and make a node name to nodes mapping.
+
+        For now, use recursion but later nonrecursive version may be
+        more efficient.  Returns a dict int -> list where the list is
+        of your AST node type.  The int is the token type of the node.
+        """
+
+        m = {}
+        self._index(tree, m)
+        return m
+
+
+    def _index(self, t, m):
+        """Do the work for index"""
+
+        if t is None:
+            return
+
+        ttype = self.adaptor.getType(t)
+        elements = m.get(ttype)
+        if elements is None:
+            m[ttype] = elements = []
+
+        elements.append(t)
+        for i in range(self.adaptor.getChildCount(t)):
+            child = self.adaptor.getChild(t, i)
+            self._index(child, m)
+
+
+    def find(self, tree, what):
+        """Return a list of matching token.
+
+        what may either be an integer specifzing the token type to find or
+        a string with a pattern that must be matched.
+
+        """
+
+        if isinstance(what, int):
+            return self._findTokenType(tree, what)
+
+        elif isinstance(what, str):
+            return self._findPattern(tree, what)
+
+        else:
+            raise TypeError("'what' must be string or integer")
+
+
+    def _findTokenType(self, t, ttype):
+        """Return a List of tree nodes with token type ttype"""
+
+        nodes = []
+
+        def visitor(tree, parent, childIndex, labels):
+            nodes.append(tree)
+
+        self.visit(t, ttype, visitor)
+
+        return nodes
+
+
+    def _findPattern(self, t, pattern):
+        """Return a List of subtrees matching pattern."""
+
+        subtrees = []
+
+        # Create a TreePattern from the pattern
+        tokenizer = TreePatternLexer(pattern)
+        parser = TreePatternParser(tokenizer, self, TreePatternTreeAdaptor())
+        tpattern = parser.pattern()
+
+        # don't allow invalid patterns
+        if (tpattern is None or tpattern.isNil()
+            or isinstance(tpattern, WildcardTreePattern)):
+            return None
+
+        rootTokenType = tpattern.getType()
+
+        def visitor(tree, parent, childIndex, label):
+            if self._parse(tree, tpattern, None):
+                subtrees.append(tree)
+
+        self.visit(t, rootTokenType, visitor)
+
+        return subtrees
+
+
+    def visit(self, tree, what, visitor):
+        """Visit every node in tree matching what, invoking the visitor.
+
+        If what is a string, it is parsed as a pattern and only matching
+        subtrees will be visited.
+        The implementation uses the root node of the pattern in combination
+        with visit(t, ttype, visitor) so nil-rooted patterns are not allowed.
+        Patterns with wildcard roots are also not allowed.
+
+        If what is an integer, it is used as a token type and visit will match
+        all nodes of that type (this is faster than the pattern match).
+        The labels arg of the visitor action method is never set (it's None)
+        since using a token type rather than a pattern doesn't let us set a
+        label.
+        """
+
+        if isinstance(what, int):
+            self._visitType(tree, None, 0, what, visitor)
+
+        elif isinstance(what, str):
+            self._visitPattern(tree, what, visitor)
+
+        else:
+            raise TypeError("'what' must be string or integer")
+
+
+    def _visitType(self, t, parent, childIndex, ttype, visitor):
+        """Do the recursive work for visit"""
+
+        if t is None:
+            return
+
+        if self.adaptor.getType(t) == ttype:
+            visitor(t, parent, childIndex, None)
+
+        for i in range(self.adaptor.getChildCount(t)):
+            child = self.adaptor.getChild(t, i)
+            self._visitType(child, t, i, ttype, visitor)
+
+
+    def _visitPattern(self, tree, pattern, visitor):
+        """
+        For all subtrees that match the pattern, execute the visit action.
+        """
+
+        # Create a TreePattern from the pattern
+        tokenizer = TreePatternLexer(pattern)
+        parser = TreePatternParser(tokenizer, self, TreePatternTreeAdaptor())
+        tpattern = parser.pattern()
+
+        # don't allow invalid patterns
+        if (tpattern is None or tpattern.isNil()
+            or isinstance(tpattern, WildcardTreePattern)):
+            return
+
+        rootTokenType = tpattern.getType()
+
+        def rootvisitor(tree, parent, childIndex, labels):
+            labels = {}
+            if self._parse(tree, tpattern, labels):
+                visitor(tree, parent, childIndex, labels)
+
+        self.visit(tree, rootTokenType, rootvisitor)
+
+
+    def parse(self, t, pattern, labels=None):
+        """
+        Given a pattern like (ASSIGN %lhs:ID %rhs:.) with optional labels
+        on the various nodes and '.' (dot) as the node/subtree wildcard,
+        return true if the pattern matches and fill the labels Map with
+        the labels pointing at the appropriate nodes.  Return false if
+        the pattern is malformed or the tree does not match.
+
+        If a node specifies a text arg in pattern, then that must match
+        for that node in t.
+        """
+
+        tokenizer = TreePatternLexer(pattern)
+        parser = TreePatternParser(tokenizer, self, TreePatternTreeAdaptor())
+        tpattern = parser.pattern()
+
+        return self._parse(t, tpattern, labels)
+
+
+    def _parse(self, t1, tpattern, labels):
+        """
+        Do the work for parse. Check to see if the tpattern fits the
+        structure and token types in t1.  Check text if the pattern has
+        text arguments on nodes.  Fill labels map with pointers to nodes
+        in tree matched against nodes in pattern with labels.
+	"""
+
+        # make sure both are non-null
+        if t1 is None or tpattern is None:
+            return False
+
+        # check roots (wildcard matches anything)
+        if not isinstance(tpattern, WildcardTreePattern):
+            if self.adaptor.getType(t1) != tpattern.getType():
+                return False
+
+            # if pattern has text, check node text
+            if (tpattern.hasTextArg
+                and self.adaptor.getText(t1) != tpattern.getText()):
+                return False
+
+        if tpattern.label is not None and labels is not None:
+            # map label in pattern to node in t1
+            labels[tpattern.label] = t1
+
+        # check children
+        n1 = self.adaptor.getChildCount(t1)
+        n2 = tpattern.getChildCount()
+        if n1 != n2:
+            return False
+
+        for i in range(n1):
+            child1 = self.adaptor.getChild(t1, i)
+            child2 = tpattern.getChild(i)
+            if not self._parse(child1, child2, labels):
+                return False
+
+        return True
+
+
+    def equals(self, t1, t2, adaptor=None):
+        """
+        Compare t1 and t2; return true if token types/text, structure match
+        exactly.
+        The trees are examined in their entirety so that (A B) does not match
+        (A B C) nor (A (B C)).
+        """
+
+        if adaptor is None:
+            adaptor = self.adaptor
+
+        return self._equals(t1, t2, adaptor)
+
+
+    def _equals(self, t1, t2, adaptor):
+        # make sure both are non-null
+        if t1 is None or t2 is None:
+            return False
+
+        # check roots
+        if adaptor.getType(t1) != adaptor.getType(t2):
+            return False
+
+        if adaptor.getText(t1) != adaptor.getText(t2):
+            return False
+
+        # check children
+        n1 = adaptor.getChildCount(t1)
+        n2 = adaptor.getChildCount(t2)
+        if n1 != n2:
+            return False
+
+        for i in range(n1):
+            child1 = adaptor.getChild(t1, i)
+            child2 = adaptor.getChild(t2, i)
+            if not self._equals(child1, child2, adaptor):
+                return False
+
+        return True
diff --git a/runtime/Python3/doxyfile b/runtime/Python3/doxyfile
new file mode 100644
index 0000000..9f15919
--- /dev/null
+++ b/runtime/Python3/doxyfile
@@ -0,0 +1,270 @@
+# -*- mode: doxymacs -*-
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = "ANTLR Python3 API"
+PROJECT_NUMBER         = 3.3
+OUTPUT_DIRECTORY       = api
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       = "The $name class" \
+                         "The $name widget" \
+                         "The $name file" \
+                         is \
+                         provides \
+                         specifies \
+                         contains \
+                         represents \
+                         a \
+                         an \
+                         the
+ALWAYS_DETAILED_SEC    = YES
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = YES
+STRIP_FROM_PATH        = build/doc/
+STRIP_FROM_INC_PATH    = 
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+MULTILINE_CPP_IS_BRIEF = NO
+DETAILS_AT_TOP         = NO
+INHERIT_DOCS           = YES
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                = 
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = YES
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = YES
+EXTRACT_PRIVATE        = YES
+EXTRACT_STATIC         = YES
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+HIDE_UNDOC_MEMBERS     = NO
+HIDE_UNDOC_CLASSES     = NO
+HIDE_FRIEND_COMPOUNDS  = NO
+HIDE_IN_BODY_DOCS      = NO
+INTERNAL_DOCS          = NO
+CASE_SENSE_NAMES       = NO
+HIDE_SCOPE_NAMES       = NO
+SHOW_INCLUDE_FILES     = YES
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = YES
+SORT_BRIEF_DOCS        = NO
+SORT_BY_SCOPE_NAME     = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = NO
+GENERATE_BUGLIST       = NO
+GENERATE_DEPRECATEDLIST= NO
+ENABLED_SECTIONS       = 
+MAX_INITIALIZER_LINES  = 30
+SHOW_USED_FILES        = YES
+SHOW_DIRECTORIES       = NO
+FILE_VERSION_FILTER    = 
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = NO
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = YES
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text"
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = build/doc
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          = *.c \
+                         *.cc \
+                         *.cxx \
+                         *.cpp \
+                         *.c++ \
+                         *.d \
+                         *.java \
+                         *.ii \
+                         *.ixx \
+                         *.ipp \
+                         *.i++ \
+                         *.inl \
+                         *.h \
+                         *.hh \
+                         *.hxx \
+                         *.hpp \
+                         *.h++ \
+                         *.idl \
+                         *.odl \
+                         *.cs \
+                         *.php \
+                         *.php3 \
+                         *.inc \
+                         *.m \
+                         *.mm \
+                         *.dox \
+                         *.py
+RECURSIVE              = YES
+EXCLUDE                = build/doc/antlr3/__init__.py
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = 
+EXCLUDE_SYMBOLS        = dfa exceptions recognizers streams tokens constants
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = *
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = YES
+INLINE_SOURCES         = NO
+STRIP_CODE_COMMENTS    = YES
+REFERENCED_BY_RELATION = NO
+REFERENCES_RELATION    = NO
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = YES
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX     = NO
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = YES
+HTML_OUTPUT            = .
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+GENERATE_CHI           = NO
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = NO
+TREEVIEW_WIDTH         = 250
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = NO
+LATEX_OUTPUT           = latex
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = NO
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = 
+LATEX_HEADER           = 
+PDF_HYPERLINKS         = NO
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = NO
+LATEX_HIDE_INDICES     = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = NO
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = NO
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = DOXYGEN_SHOULD_SKIP_THIS
+EXPAND_AS_DEFINED      = 
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = 
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = /usr/bin/perl
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = NO
+MSCGEN_PATH            = 
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+CLASS_GRAPH            = YES
+COLLABORATION_GRAPH    = YES
+GROUP_GRAPHS           = YES
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = NO
+INCLUDE_GRAPH          = YES
+INCLUDED_BY_GRAPH      = YES
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = YES
+DIRECTORY_GRAPH        = YES
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+DOT_GRAPH_MAX_NODES    = 50
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
+
+
+#---------------------------------------------------------------------------
+# doxypy integration
+#---------------------------------------------------------------------------
+FILTER_SOURCE_FILES = YES
+INPUT_FILTER = "python doxypy.py"
diff --git a/runtime/Python3/ez_setup.py b/runtime/Python3/ez_setup.py
new file mode 100644
index 0000000..3ea2e66
--- /dev/null
+++ b/runtime/Python3/ez_setup.py
@@ -0,0 +1,485 @@
+#!python
+"""Bootstrap distribute installation
+
+If you want to use setuptools in your package's setup.py, just include this
+file in the same directory with it, and add this to the top of your setup.py::
+
+    from distribute_setup import use_setuptools
+    use_setuptools()
+
+If you want to require a specific version of setuptools, set a download
+mirror, or use an alternate download directory, you can do so by supplying
+the appropriate options to ``use_setuptools()``.
+
+This file can also be run as a script to install or upgrade setuptools.
+"""
+import os
+import sys
+import time
+import fnmatch
+import tempfile
+import tarfile
+from distutils import log
+
+try:
+    from site import USER_SITE
+except ImportError:
+    USER_SITE = None
+
+try:
+    import subprocess
+
+    def _python_cmd(*args):
+        args = (sys.executable,) + args
+        return subprocess.call(args) == 0
+
+except ImportError:
+    # will be used for python 2.3
+    def _python_cmd(*args):
+        args = (sys.executable,) + args
+        # quoting arguments if windows
+        if sys.platform == 'win32':
+            def quote(arg):
+                if ' ' in arg:
+                    return '"%s"' % arg
+                return arg
+            args = [quote(arg) for arg in args]
+        return os.spawnl(os.P_WAIT, sys.executable, *args) == 0
+
+DEFAULT_VERSION = "0.6.14"
+DEFAULT_URL = "http://pypi.python.org/packages/source/d/distribute/"
+SETUPTOOLS_FAKED_VERSION = "0.6c11"
+
+SETUPTOOLS_PKG_INFO = """\
+Metadata-Version: 1.0
+Name: setuptools
+Version: %s
+Summary: xxxx
+Home-page: xxx
+Author: xxx
+Author-email: xxx
+License: xxx
+Description: xxx
+""" % SETUPTOOLS_FAKED_VERSION
+
+
+def _install(tarball):
+    # extracting the tarball
+    tmpdir = tempfile.mkdtemp()
+    log.warn('Extracting in %s', tmpdir)
+    old_wd = os.getcwd()
+    try:
+        os.chdir(tmpdir)
+        tar = tarfile.open(tarball)
+        _extractall(tar)
+        tar.close()
+
+        # going in the directory
+        subdir = os.path.join(tmpdir, os.listdir(tmpdir)[0])
+        os.chdir(subdir)
+        log.warn('Now working in %s', subdir)
+
+        # installing
+        log.warn('Installing Distribute')
+        if not _python_cmd('setup.py', 'install'):
+            log.warn('Something went wrong during the installation.')
+            log.warn('See the error message above.')
+    finally:
+        os.chdir(old_wd)
+
+
+def _build_egg(egg, tarball, to_dir):
+    # extracting the tarball
+    tmpdir = tempfile.mkdtemp()
+    log.warn('Extracting in %s', tmpdir)
+    old_wd = os.getcwd()
+    try:
+        os.chdir(tmpdir)
+        tar = tarfile.open(tarball)
+        _extractall(tar)
+        tar.close()
+
+        # going in the directory
+        subdir = os.path.join(tmpdir, os.listdir(tmpdir)[0])
+        os.chdir(subdir)
+        log.warn('Now working in %s', subdir)
+
+        # building an egg
+        log.warn('Building a Distribute egg in %s', to_dir)
+        _python_cmd('setup.py', '-q', 'bdist_egg', '--dist-dir', to_dir)
+
+    finally:
+        os.chdir(old_wd)
+    # returning the result
+    log.warn(egg)
+    if not os.path.exists(egg):
+        raise IOError('Could not build the egg.')
+
+
+def _do_download(version, download_base, to_dir, download_delay):
+    egg = os.path.join(to_dir, 'distribute-%s-py%d.%d.egg'
+                       % (version, sys.version_info[0], sys.version_info[1]))
+    if not os.path.exists(egg):
+        tarball = download_setuptools(version, download_base,
+                                      to_dir, download_delay)
+        _build_egg(egg, tarball, to_dir)
+    sys.path.insert(0, egg)
+    import setuptools
+    setuptools.bootstrap_install_from = egg
+
+
+def use_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL,
+                   to_dir=os.curdir, download_delay=15, no_fake=True):
+    # making sure we use the absolute path
+    to_dir = os.path.abspath(to_dir)
+    was_imported = 'pkg_resources' in sys.modules or \
+        'setuptools' in sys.modules
+    try:
+        try:
+            import pkg_resources
+            if not hasattr(pkg_resources, '_distribute'):
+                if not no_fake:
+                    _fake_setuptools()
+                raise ImportError
+        except ImportError:
+            return _do_download(version, download_base, to_dir, download_delay)
+        try:
+            pkg_resources.require("distribute>="+version)
+            return
+        except pkg_resources.VersionConflict:
+            e = sys.exc_info()[1]
+            if was_imported:
+                sys.stderr.write(
+                "The required version of distribute (>=%s) is not available,\n"
+                "and can't be installed while this script is running. Please\n"
+                "install a more recent version first, using\n"
+                "'easy_install -U distribute'."
+                "\n\n(Currently using %r)\n" % (version, e.args[0]))
+                sys.exit(2)
+            else:
+                del pkg_resources, sys.modules['pkg_resources']    # reload ok
+                return _do_download(version, download_base, to_dir,
+                                    download_delay)
+        except pkg_resources.DistributionNotFound:
+            return _do_download(version, download_base, to_dir,
+                                download_delay)
+    finally:
+        if not no_fake:
+            _create_fake_setuptools_pkg_info(to_dir)
+
+def download_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL,
+                        to_dir=os.curdir, delay=15):
+    """Download distribute from a specified location and return its filename
+
+    `version` should be a valid distribute version number that is available
+    as an egg for download under the `download_base` URL (which should end
+    with a '/'). `to_dir` is the directory where the egg will be downloaded.
+    `delay` is the number of seconds to pause before an actual download
+    attempt.
+    """
+    # making sure we use the absolute path
+    to_dir = os.path.abspath(to_dir)
+    try:
+        from urllib.request import urlopen
+    except ImportError:
+        from urllib2 import urlopen
+    tgz_name = "distribute-%s.tar.gz" % version
+    url = download_base + tgz_name
+    saveto = os.path.join(to_dir, tgz_name)
+    src = dst = None
+    if not os.path.exists(saveto):  # Avoid repeated downloads
+        try:
+            log.warn("Downloading %s", url)
+            src = urlopen(url)
+            # Read/write all in one block, so we don't create a corrupt file
+            # if the download is interrupted.
+            data = src.read()
+            dst = open(saveto, "wb")
+            dst.write(data)
+        finally:
+            if src:
+                src.close()
+            if dst:
+                dst.close()
+    return os.path.realpath(saveto)
+
+def _no_sandbox(function):
+    def __no_sandbox(*args, **kw):
+        try:
+            from setuptools.sandbox import DirectorySandbox
+            if not hasattr(DirectorySandbox, '_old'):
+                def violation(*args):
+                    pass
+                DirectorySandbox._old = DirectorySandbox._violation
+                DirectorySandbox._violation = violation
+                patched = True
+            else:
+                patched = False
+        except ImportError:
+            patched = False
+
+        try:
+            return function(*args, **kw)
+        finally:
+            if patched:
+                DirectorySandbox._violation = DirectorySandbox._old
+                del DirectorySandbox._old
+
+    return __no_sandbox
+
+def _patch_file(path, content):
+    """Will backup the file then patch it"""
+    existing_content = open(path).read()
+    if existing_content == content:
+        # already patched
+        log.warn('Already patched.')
+        return False
+    log.warn('Patching...')
+    _rename_path(path)
+    f = open(path, 'w')
+    try:
+        f.write(content)
+    finally:
+        f.close()
+    return True
+
+_patch_file = _no_sandbox(_patch_file)
+
+def _same_content(path, content):
+    return open(path).read() == content
+
+def _rename_path(path):
+    new_name = path + '.OLD.%s' % time.time()
+    log.warn('Renaming %s into %s', path, new_name)
+    os.rename(path, new_name)
+    return new_name
+
+def _remove_flat_installation(placeholder):
+    if not os.path.isdir(placeholder):
+        log.warn('Unkown installation at %s', placeholder)
+        return False
+    found = False
+    for file in os.listdir(placeholder):
+        if fnmatch.fnmatch(file, 'setuptools*.egg-info'):
+            found = True
+            break
+    if not found:
+        log.warn('Could not locate setuptools*.egg-info')
+        return
+
+    log.warn('Removing elements out of the way...')
+    pkg_info = os.path.join(placeholder, file)
+    if os.path.isdir(pkg_info):
+        patched = _patch_egg_dir(pkg_info)
+    else:
+        patched = _patch_file(pkg_info, SETUPTOOLS_PKG_INFO)
+
+    if not patched:
+        log.warn('%s already patched.', pkg_info)
+        return False
+    # now let's move the files out of the way
+    for element in ('setuptools', 'pkg_resources.py', 'site.py'):
+        element = os.path.join(placeholder, element)
+        if os.path.exists(element):
+            _rename_path(element)
+        else:
+            log.warn('Could not find the %s element of the '
+                     'Setuptools distribution', element)
+    return True
+
+_remove_flat_installation = _no_sandbox(_remove_flat_installation)
+
+def _after_install(dist):
+    log.warn('After install bootstrap.')
+    placeholder = dist.get_command_obj('install').install_purelib
+    _create_fake_setuptools_pkg_info(placeholder)
+
+def _create_fake_setuptools_pkg_info(placeholder):
+    if not placeholder or not os.path.exists(placeholder):
+        log.warn('Could not find the install location')
+        return
+    pyver = '%s.%s' % (sys.version_info[0], sys.version_info[1])
+    setuptools_file = 'setuptools-%s-py%s.egg-info' % \
+            (SETUPTOOLS_FAKED_VERSION, pyver)
+    pkg_info = os.path.join(placeholder, setuptools_file)
+    if os.path.exists(pkg_info):
+        log.warn('%s already exists', pkg_info)
+        return
+
+    log.warn('Creating %s', pkg_info)
+    f = open(pkg_info, 'w')
+    try:
+        f.write(SETUPTOOLS_PKG_INFO)
+    finally:
+        f.close()
+
+    pth_file = os.path.join(placeholder, 'setuptools.pth')
+    log.warn('Creating %s', pth_file)
+    f = open(pth_file, 'w')
+    try:
+        f.write(os.path.join(os.curdir, setuptools_file))
+    finally:
+        f.close()
+
+_create_fake_setuptools_pkg_info = _no_sandbox(_create_fake_setuptools_pkg_info)
+
+def _patch_egg_dir(path):
+    # let's check if it's already patched
+    pkg_info = os.path.join(path, 'EGG-INFO', 'PKG-INFO')
+    if os.path.exists(pkg_info):
+        if _same_content(pkg_info, SETUPTOOLS_PKG_INFO):
+            log.warn('%s already patched.', pkg_info)
+            return False
+    _rename_path(path)
+    os.mkdir(path)
+    os.mkdir(os.path.join(path, 'EGG-INFO'))
+    pkg_info = os.path.join(path, 'EGG-INFO', 'PKG-INFO')
+    f = open(pkg_info, 'w')
+    try:
+        f.write(SETUPTOOLS_PKG_INFO)
+    finally:
+        f.close()
+    return True
+
+_patch_egg_dir = _no_sandbox(_patch_egg_dir)
+
+def _before_install():
+    log.warn('Before install bootstrap.')
+    _fake_setuptools()
+
+
+def _under_prefix(location):
+    if 'install' not in sys.argv:
+        return True
+    args = sys.argv[sys.argv.index('install')+1:]
+    for index, arg in enumerate(args):
+        for option in ('--root', '--prefix'):
+            if arg.startswith('%s=' % option):
+                top_dir = arg.split('root=')[-1]
+                return location.startswith(top_dir)
+            elif arg == option:
+                if len(args) > index:
+                    top_dir = args[index+1]
+                    return location.startswith(top_dir)
+        if arg == '--user' and USER_SITE is not None:
+            return location.startswith(USER_SITE)
+    return True
+
+
+def _fake_setuptools():
+    log.warn('Scanning installed packages')
+    try:
+        import pkg_resources
+    except ImportError:
+        # we're cool
+        log.warn('Setuptools or Distribute does not seem to be installed.')
+        return
+    ws = pkg_resources.working_set
+    try:
+        setuptools_dist = ws.find(pkg_resources.Requirement.parse('setuptools',
+                                  replacement=False))
+    except TypeError:
+        # old distribute API
+        setuptools_dist = ws.find(pkg_resources.Requirement.parse('setuptools'))
+
+    if setuptools_dist is None:
+        log.warn('No setuptools distribution found')
+        return
+    # detecting if it was already faked
+    setuptools_location = setuptools_dist.location
+    log.warn('Setuptools installation detected at %s', setuptools_location)
+
+    # if --root or --preix was provided, and if
+    # setuptools is not located in them, we don't patch it
+    if not _under_prefix(setuptools_location):
+        log.warn('Not patching, --root or --prefix is installing Distribute'
+                 ' in another location')
+        return
+
+    # let's see if its an egg
+    if not setuptools_location.endswith('.egg'):
+        log.warn('Non-egg installation')
+        res = _remove_flat_installation(setuptools_location)
+        if not res:
+            return
+    else:
+        log.warn('Egg installation')
+        pkg_info = os.path.join(setuptools_location, 'EGG-INFO', 'PKG-INFO')
+        if (os.path.exists(pkg_info) and
+            _same_content(pkg_info, SETUPTOOLS_PKG_INFO)):
+            log.warn('Already patched.')
+            return
+        log.warn('Patching...')
+        # let's create a fake egg replacing setuptools one
+        res = _patch_egg_dir(setuptools_location)
+        if not res:
+            return
+    log.warn('Patched done.')
+    _relaunch()
+
+
+def _relaunch():
+    log.warn('Relaunching...')
+    # we have to relaunch the process
+    # pip marker to avoid a relaunch bug
+    if sys.argv[:3] == ['-c', 'install', '--single-version-externally-managed']:
+        sys.argv[0] = 'setup.py'
+    args = [sys.executable] + sys.argv
+    sys.exit(subprocess.call(args))
+
+
+def _extractall(self, path=".", members=None):
+    """Extract all members from the archive to the current working
+       directory and set owner, modification time and permissions on
+       directories afterwards. `path' specifies a different directory
+       to extract to. `members' is optional and must be a subset of the
+       list returned by getmembers().
+    """
+    import copy
+    import operator
+    from tarfile import ExtractError
+    directories = []
+
+    if members is None:
+        members = self
+
+    for tarinfo in members:
+        if tarinfo.isdir():
+            # Extract directories with a safe mode.
+            directories.append(tarinfo)
+            tarinfo = copy.copy(tarinfo)
+            tarinfo.mode = 448 # decimal for oct 0700
+        self.extract(tarinfo, path)
+
+    # Reverse sort directories.
+    if sys.version_info < (2, 4):
+        def sorter(dir1, dir2):
+            return cmp(dir1.name, dir2.name)
+        directories.sort(sorter)
+        directories.reverse()
+    else:
+        directories.sort(key=operator.attrgetter('name'), reverse=True)
+
+    # Set correct owner, mtime and filemode on directories.
+    for tarinfo in directories:
+        dirpath = os.path.join(path, tarinfo.name)
+        try:
+            self.chown(tarinfo, dirpath)
+            self.utime(tarinfo, dirpath)
+            self.chmod(tarinfo, dirpath)
+        except ExtractError:
+            e = sys.exc_info()[1]
+            if self.errorlevel > 1:
+                raise
+            else:
+                self._dbg(1, "tarfile: %s" % e)
+
+
+def main(argv, version=DEFAULT_VERSION):
+    """Install or upgrade setuptools and EasyInstall"""
+    tarball = download_setuptools()
+    _install(tarball)
+
+
+if __name__ == '__main__':
+    main(sys.argv[1:])
diff --git a/runtime/Python3/mkdoxy.sh b/runtime/Python3/mkdoxy.sh
new file mode 100755
index 0000000..36fffff
--- /dev/null
+++ b/runtime/Python3/mkdoxy.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+if [ -e doxygen.sh ]; then
+    . doxygen.sh
+fi
+
+rm -fr build/doc
+mkdir -p build/doc/antlr3
+
+for f in __init__ exceptions constants dfa tokens streams recognizers; do
+    sed -e '/begin\[licence\]/,/end\[licence\]/d' antlr3/$f.py \
+      >>build/doc/antlr3.py
+done
+
+touch build/doc/antlr3/__init__.py
+
+cp -f antlr3/tree.py build/doc/antlr3
+cp -f antlr3/treewizard.py build/doc/antlr3
+
+doxygen doxyfile
diff --git a/runtime/Python3/pylintrc b/runtime/Python3/pylintrc
new file mode 100644
index 0000000..1ded626
--- /dev/null
+++ b/runtime/Python3/pylintrc
@@ -0,0 +1,253 @@
+# lint Python modules using external checkers
+
+[MASTER]
+
+# Specify a configuration file.
+#rcfile=
+
+# Python code to execute, usually for sys.path manipulation such as
+# pygtk.require().
+#init-hook=
+
+# Profiled execution.
+profile=no
+
+# Add <file or directory> to the black list. It should be a base name, not a
+# path. You may set this option multiple times.
+ignore=CVS
+
+# Pickle collected data for later comparisons.
+persistent=yes
+
+# List of plugins (as comma separated values of python modules names) to load,
+# usually to register additional checkers.
+load-plugins=
+
+
+[MESSAGES CONTROL]
+
+# Enable the message, report, category or checker with the given id(s). You can
+# either give multiple identifier separated by comma (,) or put this option
+# multiple time.
+#enable=
+
+# Disable the message, report, category or checker with the given id(s). You
+# can either give multiple identifier separated by comma (,) or put this option
+# multiple time (only on the command line, not in the configuration file where
+# it should appear only once).
+# W0622: Redefining built-in '...'
+# C0103: Invalid name
+# R0904: Too many public methods
+# R0201: Method could be a function
+# C0302: Too many lines in a module
+# R0902: Too many instance attributes
+# R0913: Too many arguments
+# R0912: Too many branches
+# R0903: Too few public methods
+# C0111: Missing docstring
+# W0403: Relative import
+# W0401: Wildcard import
+# W0142: */** magic
+disable=W0622,C0103,R0904,R0201,C0302,R0902,R0913,R0912,R0903,C0111,W0403,W0401,W0142
+
+
+[REPORTS]
+
+# Set the output format. Available formats are text, parseable, colorized, msvs
+# (visual studio) and html
+output-format=text
+
+# Include message's id in output
+include-ids=yes
+
+# Put messages in a separate file for each module / package specified on the
+# command line instead of printing them on stdout. Reports (if any) will be
+# written in a file name "pylint_global.[txt|html]".
+files-output=no
+
+# Tells whether to display a full report or only the messages
+reports=yes
+
+# Python expression which should return a note less than 10 (10 is the highest
+# note). You have access to the variables errors warning, statement which
+# respectively contain the number of errors / warnings messages and the total
+# number of statements analyzed. This is used by the global evaluation report
+# (RP0004).
+evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)
+
+# Add a comment according to your evaluation note. This is used by the global
+# evaluation report (RP0004).
+comment=no
+
+
+[BASIC]
+
+# Required attributes for module, separated by a comma
+required-attributes=
+
+# List of builtins function names that should not be used, separated by a comma
+bad-functions=map,filter,apply,input
+
+# Regular expression which should only match correct module names
+module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$
+
+# Regular expression which should only match correct module level names
+const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$
+
+# Regular expression which should only match correct class names
+class-rgx=[A-Z_][a-zA-Z0-9]+$
+
+# Regular expression which should only match correct function names
+function-rgx=[a-z_][a-z0-9_]{2,30}$
+
+# Regular expression which should only match correct method names
+method-rgx=[a-z_][a-z0-9_]{2,30}$
+
+# Regular expression which should only match correct instance attribute names
+attr-rgx=[a-z_][a-z0-9_]{2,30}$
+
+# Regular expression which should only match correct argument names
+argument-rgx=[a-z_][a-z0-9_]{2,30}$
+
+# Regular expression which should only match correct variable names
+variable-rgx=[a-z_][a-z0-9_]{2,30}$
+
+# Regular expression which should only match correct list comprehension /
+# generator expression variable names
+inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$
+
+# Good variable names which should always be accepted, separated by a comma
+good-names=i,j,k,ex,Run,_
+
+# Bad variable names which should always be refused, separated by a comma
+bad-names=foo,bar,baz,toto,tutu,tata
+
+# Regular expression which should only match functions or classes name which do
+# not require a docstring
+no-docstring-rgx=__.*__
+
+
+[FORMAT]
+
+# Maximum number of characters on a single line.
+max-line-length=80
+
+# Maximum number of lines in a module
+max-module-lines=1000
+
+# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1
+# tab).
+indent-string='    '
+
+
+[MISCELLANEOUS]
+
+# List of note tags to take in consideration, separated by a comma.
+notes=FIXME,XXX,TODO
+
+
+[VARIABLES]
+
+# Tells whether we should check for unused import in __init__ files.
+init-import=no
+
+# A regular expression matching the beginning of the name of dummy variables
+# (i.e. not used).
+dummy-variables-rgx=_|dummy
+
+# List of additional names supposed to be defined in builtins. Remember that
+# you should avoid to define new builtins when possible.
+additional-builtins=
+
+
+[SIMILARITIES]
+
+# Minimum lines number of a similarity.
+min-similarity-lines=4
+
+# Ignore comments when computing similarities.
+ignore-comments=yes
+
+# Ignore docstrings when computing similarities.
+ignore-docstrings=yes
+
+
+[TYPECHECK]
+
+# Tells whether missing members accessed in mixin class should be ignored. A
+# mixin class is detected if its name ends with "mixin" (case insensitive).
+ignore-mixin-members=yes
+
+# List of classes names for which member attributes should not be checked
+# (useful for classes with attributes dynamically set).
+ignored-classes=SQLObject
+
+# When zope mode is activated, add a predefined set of Zope acquired attributes
+# to generated-members.
+zope=no
+
+# List of members which are set dynamically and missed by pylint inference
+# system, and so shouldn't trigger E0201 when accessed.
+generated-members=REQUEST,acl_users,aq_parent
+
+
+[CLASSES]
+
+# List of interface methods to ignore, separated by a comma. This is used for
+# instance to not check methods defines in Zope's Interface base class.
+ignore-iface-methods=isImplementedBy,deferred,extends,names,namesAndDescriptions,queryDescriptionFor,getBases,getDescriptionFor,getDoc,getName,getTaggedValue,getTaggedValueTags,isEqualOrExtendedBy,setTaggedValue,isImplementedByInstancesOf,adaptWith,is_implemented_by
+
+# List of method names used to declare (i.e. assign) instance attributes.
+defining-attr-methods=__init__,__new__,setUp
+
+
+[DESIGN]
+
+# Maximum number of arguments for function / method
+max-args=5
+
+# Argument names that match this expression will be ignored. Default to name
+# with leading underscore
+ignored-argument-names=_.*
+
+# Maximum number of locals for function / method body
+max-locals=15
+
+# Maximum number of return / yield for function / method body
+max-returns=6
+
+# Maximum number of branch for function / method body
+max-branchs=12
+
+# Maximum number of statements in function / method body
+max-statements=50
+
+# Maximum number of parents for a class (see R0901).
+max-parents=7
+
+# Maximum number of attributes for a class (see R0902).
+max-attributes=7
+
+# Minimum number of public methods for a class (see R0903).
+min-public-methods=2
+
+# Maximum number of public methods for a class (see R0904).
+max-public-methods=20
+
+
+[IMPORTS]
+
+# Deprecated modules which should not be used, separated by a comma
+deprecated-modules=regsub,string,TERMIOS,Bastion,rexec
+
+# Create a graph of every (i.e. internal and external) dependencies in the
+# given file (report RP0402 must not be disabled)
+import-graph=
+
+# Create a graph of external dependencies in the given file (report RP0402 must
+# not be disabled)
+ext-import-graph=
+
+# Create a graph of internal dependencies in the given file (report RP0402 must
+# not be disabled)
+int-import-graph=
diff --git a/runtime/Python3/setup.py b/runtime/Python3/setup.py
new file mode 100644
index 0000000..92d9ac4
--- /dev/null
+++ b/runtime/Python3/setup.py
@@ -0,0 +1,289 @@
+
+import sys
+if sys.version_info < (3, 2):
+    print('This antlr3 module requires Python 3.2 or later. You can '
+          'download Python 3 from\nhttps://python.org/, '
+          'or visit http://www.antlr.org/ for the Python target.')
+    sys.exit(1)
+
+# bootstrapping setuptools
+import ez_setup
+ez_setup.use_setuptools()
+
+import os
+import textwrap
+from distutils.errors import *
+from distutils.command.clean import clean as _clean
+from distutils.cmd import Command
+from setuptools import setup
+from distutils import log
+
+from distutils.core import setup
+
+class clean(_clean):
+    """Also cleanup local temp files."""
+
+    def run(self):
+        _clean.run(self)
+
+        import fnmatch
+
+        # kill temporary files
+        patterns = [
+            # generic tempfiles
+            '*~', '*.bak', '*.pyc',
+
+            # tempfiles generated by ANTLR runs
+            't[0-9]*Lexer.py', 't[0-9]*Parser.py',
+            '*.tokens', '*__.g',
+            ]
+
+        for path in ('antlr3', 'unittests', 'tests'):
+            path = os.path.join(os.path.dirname(__file__), path)
+            if os.path.isdir(path):
+                for root, dirs, files in os.walk(path, topdown=True):
+                    graveyard = []
+                    for pat in patterns:
+                        graveyard.extend(fnmatch.filter(files, pat))
+
+                    for name in graveyard:
+                        filePath = os.path.join(root, name)
+
+                        try:
+                            log.info("removing '%s'", filePath)
+                            os.unlink(filePath)
+                        except OSError as exc:
+                            log.warn(
+                                "Failed to delete '%s': %s",
+                                filePath, exc
+                                )
+
+
+class TestError(DistutilsError):
+    pass
+
+
+# grml.. the class name appears in the --help output:
+# ...
+# Options for 'CmdUnitTest' command
+# ...
+# so I have to use a rather ugly name...
+class unittest(Command):
+    """Run unit tests for package"""
+
+    description = "run unit tests for package"
+
+    user_options = []
+    boolean_options = []
+
+    def initialize_options(self):
+        pass
+
+    def finalize_options(self):
+        pass
+
+    def run(self):
+        testDir = os.path.join(os.path.dirname(__file__), 'unittests')
+        if not os.path.isdir(testDir):
+            raise DistutilsFileError(
+                "There is no 'unittests' directory. Did you fetch the "
+                "development version?",
+                )
+
+        import glob
+        import imp
+        import unittest
+        import traceback
+        import io
+
+        suite = unittest.TestSuite()
+        loadFailures = []
+
+        # collect tests from all unittests/test*.py files
+        testFiles = []
+        for testPath in glob.glob(os.path.join(testDir, 'test*.py')):
+            testFiles.append(testPath)
+
+        testFiles.sort()
+        for testPath in testFiles:
+            testID = os.path.basename(testPath)[:-3]
+
+            try:
+                modFile, modPathname, modDescription \
+                         = imp.find_module(testID, [testDir])
+
+                testMod = imp.load_module(
+                    testID, modFile, modPathname, modDescription
+                    )
+
+                suite.addTests(
+                    unittest.defaultTestLoader.loadTestsFromModule(testMod)
+                    )
+
+            except Exception:
+                buf = io.StringIO()
+                traceback.print_exc(file=buf)
+
+                loadFailures.append(
+                    (os.path.basename(testPath), buf.getvalue())
+                    )
+
+        runner = unittest.TextTestRunner(verbosity=2)
+        result = runner.run(suite)
+
+        for testName, error in loadFailures:
+            sys.stderr.write('\n' + '='*70 + '\n')
+            sys.stderr.write(
+                "Failed to load test module {}\n".format(testName)
+                )
+            sys.stderr.write(error)
+            sys.stderr.write('\n')
+
+        if not result.wasSuccessful() or loadFailures:
+            raise TestError(
+                "Unit test suite failed!",
+                )
+
+
+class functest(Command):
+    """Run functional tests for package"""
+
+    description = "run functional tests for package"
+
+    user_options = [
+        ('testcase=', None,
+         "testcase to run [default: run all]"),
+        ('antlr-version=', None,
+         "ANTLR version to use [default: HEAD (in ../../build)]"),
+        ('antlr-jar=', None,
+         "Explicit path to an antlr jar (overrides --antlr-version)"),
+        ]
+
+    boolean_options = []
+
+    def initialize_options(self):
+        self.testcase = None
+        self.antlr_version = 'HEAD'
+        self.antlr_jar = None
+
+    def finalize_options(self):
+        pass
+
+    def run(self):
+        import glob
+        import imp
+        import unittest
+        import traceback
+        import io
+
+        testDir = os.path.join(os.path.dirname(__file__), 'tests')
+        if not os.path.isdir(testDir):
+            raise DistutilsFileError(
+                "There is not 'tests' directory. Did you fetch the "
+                "development version?",
+                )
+
+        # make sure, relative imports from testcases work
+        sys.path.insert(0, testDir)
+
+        rootDir = os.path.abspath(
+            os.path.join(os.path.dirname(__file__), '..', '..'))
+
+        if self.antlr_jar is not None:
+            classpath = [self.antlr_jar]
+        elif self.antlr_version == 'HEAD':
+            classpath = [
+                os.path.join(rootDir, 'tool', 'target', 'classes'),
+                os.path.join(rootDir, 'runtime', 'Java', 'target', 'classes')
+                ]
+        else:
+            classpath = [
+                os.path.join(rootDir, 'archive',
+                             'antlr-{}.jar'.format(self.antlr_version))
+                ]
+
+        classpath.extend([
+            os.path.join(rootDir, 'lib', 'antlr-3.4.1-SNAPSHOT.jar'),
+            os.path.join(rootDir, 'lib', 'antlr-runtime-3.4.jar'),
+            os.path.join(rootDir, 'lib', 'ST-4.0.5.jar'),
+            ])
+        os.environ['CLASSPATH'] = ':'.join(classpath)
+
+        os.environ['ANTLRVERSION'] = self.antlr_version
+
+        suite = unittest.TestSuite()
+        loadFailures = []
+
+        # collect tests from all tests/t*.py files
+        testFiles = []
+        test_glob = 't[0-9][0-9][0-9]*.py'
+        for testPath in glob.glob(os.path.join(testDir, test_glob)):
+            if testPath.endswith('Lexer.py') or testPath.endswith('Parser.py'):
+                continue
+
+            # if a single testcase has been selected, filter out all other
+            # tests
+            if (self.testcase is not None
+                and not os.path.basename(testPath)[:-3].startswith(self.testcase)):
+                continue
+
+            testFiles.append(testPath)
+
+        testFiles.sort()
+        for testPath in testFiles:
+            testID = os.path.basename(testPath)[:-3]
+
+            try:
+                modFile, modPathname, modDescription \
+                         = imp.find_module(testID, [testDir])
+
+                testMod = imp.load_module(
+                    testID, modFile, modPathname, modDescription)
+
+                suite.addTests(
+                    unittest.defaultTestLoader.loadTestsFromModule(testMod))
+
+            except Exception:
+                buf = io.StringIO()
+                traceback.print_exc(file=buf)
+
+                loadFailures.append(
+                    (os.path.basename(testPath), buf.getvalue()))
+
+        runner = unittest.TextTestRunner(verbosity=2)
+
+        result = runner.run(suite)
+
+        for testName, error in loadFailures:
+            sys.stderr.write('\n' + '='*70 + '\n')
+            sys.stderr.write(
+                "Failed to load test module {}\n".format(testName)
+                )
+            sys.stderr.write(error)
+            sys.stderr.write('\n')
+
+        if not result.wasSuccessful() or loadFailures:
+            raise TestError(
+                "Functional test suite failed!",
+                )
+
+
+setup(name='antlr_python3_runtime',
+      version='3.4',
+      packages=['antlr3'],
+
+      author="Benjamin S Wolf",
+      author_email="jokeserver+antlr3@gmail.com",
+      url="http://www.antlr.org/",
+      download_url="http://www.antlr.org/download.html",
+      license="BSD",
+      description="Runtime package for ANTLR3",
+      long_description=textwrap.dedent('''\
+      This is the runtime package for ANTLR3, which is required to use parsers
+      generated by ANTLR3.
+      '''),
+      cmdclass={'unittest': unittest,
+                'functest': functest,
+                'clean': clean
+                },
+      )
diff --git a/runtime/Python3/tests/t001lexer.g b/runtime/Python3/tests/t001lexer.g
new file mode 100644
index 0000000..c363316
--- /dev/null
+++ b/runtime/Python3/tests/t001lexer.g
@@ -0,0 +1,6 @@
+lexer grammar t001lexer;
+options {
+  language = Python3;
+}
+
+ZERO: '0';
diff --git a/runtime/Python3/tests/t001lexer.py b/runtime/Python3/tests/t001lexer.py
new file mode 100644
index 0000000..9450e8e
--- /dev/null
+++ b/runtime/Python3/tests/t001lexer.py
@@ -0,0 +1,57 @@
+import antlr3
+import testbase
+import unittest
+
+class t001lexer(testbase.ANTLRTest):
+    def setUp(self):
+        self.compileGrammar()
+        
+        
+    def lexerClass(self, base):
+        class TLexer(base):
+            def emitErrorMessage(self, msg):
+                # report errors to /dev/null
+                pass
+
+            def reportError(self, re):
+                # no error recovery yet, just crash!
+                raise re
+
+        return TLexer
+    
+        
+    def testValid(self):
+        stream = antlr3.StringStream('0')
+        lexer = self.getLexer(stream)
+
+        token = lexer.nextToken()
+        self.assertEqual(token.type, self.lexerModule.ZERO)
+
+        token = lexer.nextToken()
+        self.assertEqual(token.type, self.lexerModule.EOF)
+        
+
+    def testIteratorInterface(self):
+        stream = antlr3.StringStream('0')
+        lexer = self.getLexer(stream)
+
+        types = [token.type for token in lexer]
+
+        self.assertEqual(types, [self.lexerModule.ZERO])
+        
+
+    def testMalformedInput(self):
+        stream = antlr3.StringStream('1')
+        lexer = self.getLexer(stream)
+
+        try:
+            token = lexer.nextToken()
+            self.fail()
+
+        except antlr3.MismatchedTokenException as exc:
+            self.assertEqual(exc.expecting, '0')
+            self.assertEqual(exc.unexpectedType, '1')
+            
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/runtime/Python3/tests/t002lexer.g b/runtime/Python3/tests/t002lexer.g
new file mode 100644
index 0000000..f794d9b
--- /dev/null
+++ b/runtime/Python3/tests/t002lexer.g
@@ -0,0 +1,7 @@
+lexer grammar t002lexer;
+options {
+  language = Python3;
+}
+
+ZERO: '0';
+ONE: '1';
diff --git a/runtime/Python3/tests/t002lexer.py b/runtime/Python3/tests/t002lexer.py
new file mode 100644
index 0000000..37824ba
--- /dev/null
+++ b/runtime/Python3/tests/t002lexer.py
@@ -0,0 +1,50 @@
+import antlr3
+import testbase
+import unittest
+
+class t002lexer(testbase.ANTLRTest):
+    def setUp(self):
+        self.compileGrammar()
+        
+        
+    def lexerClass(self, base):
+        class TLexer(base):
+            def emitErrorMessage(self, msg):
+                # report errors to /dev/null
+                pass
+
+            def reportError(self, re):
+                # no error recovery yet, just crash!
+                raise re
+
+        return TLexer
+    
+        
+    def testValid(self):
+        stream = antlr3.StringStream('01')
+        lexer = self.getLexer(stream)
+
+        token = lexer.nextToken()
+        self.assertEqual(token.type, self.lexerModule.ZERO)
+
+        token = lexer.nextToken()
+        self.assertEqual(token.type, self.lexerModule.ONE)
+
+        token = lexer.nextToken()
+        self.assertEqual(token.type, self.lexerModule.EOF)
+        
+
+    def testMalformedInput(self):
+        stream = antlr3.StringStream('2')
+        lexer = self.getLexer(stream)
+
+        try:
+            token = lexer.nextToken()
+            self.fail()
+
+        except antlr3.NoViableAltException as exc:
+            self.assertEqual(exc.unexpectedType, '2')
+            
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/runtime/Python3/tests/t003lexer.g b/runtime/Python3/tests/t003lexer.g
new file mode 100644
index 0000000..22253d2
--- /dev/null
+++ b/runtime/Python3/tests/t003lexer.g
@@ -0,0 +1,8 @@
+lexer grammar t003lexer;
+options {
+  language = Python3;
+}
+
+ZERO: '0';
+ONE: '1';
+FOOZE: 'fooze';
diff --git a/runtime/Python3/tests/t003lexer.py b/runtime/Python3/tests/t003lexer.py
new file mode 100644
index 0000000..da9421f
--- /dev/null
+++ b/runtime/Python3/tests/t003lexer.py
@@ -0,0 +1,53 @@
+import antlr3
+import testbase
+import unittest
+
+class t003lexer(testbase.ANTLRTest):
+    def setUp(self):
+        self.compileGrammar()
+        
+        
+    def lexerClass(self, base):
+        class TLexer(base):
+            def emitErrorMessage(self, msg):
+                # report errors to /dev/null
+                pass
+
+            def reportError(self, re):
+                # no error recovery yet, just crash!
+                raise re
+
+        return TLexer
+    
+        
+    def testValid(self):
+        stream = antlr3.StringStream('0fooze1')
+        lexer = self.getLexer(stream)
+
+        token = lexer.nextToken()
+        self.assertEqual(token.type, self.lexerModule.ZERO)
+
+        token = lexer.nextToken()
+        self.assertEqual(token.type, self.lexerModule.FOOZE)
+
+        token = lexer.nextToken()
+        self.assertEqual(token.type, self.lexerModule.ONE)
+
+        token = lexer.nextToken()
+        self.assertEqual(token.type, self.lexerModule.EOF)
+        
+
+    def testMalformedInput(self):
+        stream = antlr3.StringStream('2')
+        lexer = self.getLexer(stream)
+
+        try:
+            token = lexer.nextToken()
+            self.fail()
+
+        except antlr3.NoViableAltException as exc:
+            self.assertEqual(exc.unexpectedType, '2')
+            
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/runtime/Python3/tests/t004lexer.g b/runtime/Python3/tests/t004lexer.g
new file mode 100644
index 0000000..4a08d43
--- /dev/null
+++ b/runtime/Python3/tests/t004lexer.g
@@ -0,0 +1,6 @@
+lexer grammar t004lexer;
+options {
+  language = Python3;
+}
+
+FOO: 'f' 'o'*;
diff --git a/runtime/Python3/tests/t004lexer.py b/runtime/Python3/tests/t004lexer.py
new file mode 100644
index 0000000..633427e
--- /dev/null
+++ b/runtime/Python3/tests/t004lexer.py
@@ -0,0 +1,70 @@
+import antlr3
+import testbase
+import unittest
+
+class t004lexer(testbase.ANTLRTest):
+    def setUp(self):
+        self.compileGrammar()
+        
+        
+    def lexerClass(self, base):
+        class TLexer(base):
+            def emitErrorMessage(self, msg):
+                # report errors to /dev/null
+                pass
+
+            def reportError(self, re):
+                # no error recovery yet, just crash!
+                raise re
+
+        return TLexer
+    
+        
+    def testValid(self):
+        stream = antlr3.StringStream('ffofoofooo')
+        lexer = self.getLexer(stream)
+
+        token = lexer.nextToken()
+        self.assertEqual(token.type, self.lexerModule.FOO)
+        self.assertEqual(token.start, 0)
+        self.assertEqual(token.stop, 0)
+        self.assertEqual(token.text, 'f')
+
+        token = lexer.nextToken()
+        self.assertEqual(token.type, self.lexerModule.FOO)
+        self.assertEqual(token.start, 1)
+        self.assertEqual(token.stop, 2)
+        self.assertEqual(token.text, 'fo')
+
+        token = lexer.nextToken()
+        self.assertEqual(token.type, self.lexerModule.FOO)
+        self.assertEqual(token.start, 3)
+        self.assertEqual(token.stop, 5)
+        self.assertEqual(token.text, 'foo')
+
+        token = lexer.nextToken()
+        self.assertEqual(token.type, self.lexerModule.FOO)
+        self.assertEqual(token.start, 6)
+        self.assertEqual(token.stop, 9)
+        self.assertEqual(token.text, 'fooo')
+
+        token = lexer.nextToken()
+        self.assertEqual(token.type, self.lexerModule.EOF)
+        
+
+    def testMalformedInput(self):
+        stream = antlr3.StringStream('2')
+        lexer = self.getLexer(stream)
+
+        try:
+            token = lexer.nextToken()
+            self.fail()
+
+        except antlr3.MismatchedTokenException as exc:
+            self.assertEqual(exc.expecting, 'f')
+            self.assertEqual(exc.unexpectedType, '2')
+            
+
+if __name__ == '__main__':
+    unittest.main()
+
diff --git a/runtime/Python3/tests/t005lexer.g b/runtime/Python3/tests/t005lexer.g
new file mode 100644
index 0000000..247a344
--- /dev/null
+++ b/runtime/Python3/tests/t005lexer.g
@@ -0,0 +1,6 @@
+lexer grammar t005lexer;
+options {
+  language = Python3;
+}
+
+FOO: 'f' 'o'+;
diff --git a/runtime/Python3/tests/t005lexer.py b/runtime/Python3/tests/t005lexer.py
new file mode 100644
index 0000000..e5ee165
--- /dev/null
+++ b/runtime/Python3/tests/t005lexer.py
@@ -0,0 +1,75 @@
+import antlr3
+import testbase
+import unittest
+
+class t005lexer(testbase.ANTLRTest):
+    def setUp(self):
+        self.compileGrammar()
+        
+        
+    def lexerClass(self, base):
+        class TLexer(base):
+            def emitErrorMessage(self, msg):
+                # report errors to /dev/null
+                pass
+
+            def reportError(self, re):
+                # no error recovery yet, just crash!
+                raise re
+
+        return TLexer
+    
+        
+    def testValid(self):
+        stream = antlr3.StringStream('fofoofooo')
+        lexer = self.getLexer(stream)
+
+        token = lexer.nextToken()
+        self.assertEqual(token.type, self.lexerModule.FOO)
+        self.assertEqual(token.start, 0)
+        self.assertEqual(token.stop, 1)
+        self.assertEqual(token.text, 'fo')
+
+        token = lexer.nextToken()
+        self.assertEqual(token.type, self.lexerModule.FOO)
+        self.assertEqual(token.start, 2)
+        self.assertEqual(token.stop, 4)
+        self.assertEqual(token.text, 'foo')
+
+        token = lexer.nextToken()
+        self.assertEqual(token.type, self.lexerModule.FOO)
+        self.assertEqual(token.start, 5)
+        self.assertEqual(token.stop, 8)
+        self.assertEqual(token.text, 'fooo')
+
+        token = lexer.nextToken()
+        self.assertEqual(token.type, self.lexerModule.EOF)
+        
+
+    def testMalformedInput1(self):
+        stream = antlr3.StringStream('2')
+        lexer = self.getLexer(stream)
+
+        try:
+            token = lexer.nextToken()
+            self.fail()
+
+        except antlr3.MismatchedTokenException as exc:
+            self.assertEqual(exc.expecting, 'f')
+            self.assertEqual(exc.unexpectedType, '2')
+
+
+    def testMalformedInput2(self):
+        stream = antlr3.StringStream('f')
+        lexer = self.getLexer(stream)
+
+        try:
+            token = lexer.nextToken()
+            self.fail()
+
+        except antlr3.EarlyExitException as exc:
+            self.assertEqual(exc.unexpectedType, antlr3.EOF)
+            
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/runtime/Python3/tests/t006lexer.g b/runtime/Python3/tests/t006lexer.g
new file mode 100644
index 0000000..b7f4f4a
--- /dev/null
+++ b/runtime/Python3/tests/t006lexer.g
@@ -0,0 +1,6 @@
+lexer grammar t006lexer;
+options {
+  language = Python3;
+}
+
+FOO: 'f' ('o' | 'a')*;
diff --git a/runtime/Python3/tests/t006lexer.py b/runtime/Python3/tests/t006lexer.py
new file mode 100644
index 0000000..daa5d29
--- /dev/null
+++ b/runtime/Python3/tests/t006lexer.py
@@ -0,0 +1,61 @@
+import antlr3
+import testbase
+import unittest
+
+class t006lexer(testbase.ANTLRTest):
+    def setUp(self):
+        self.compileGrammar()
+        
+        
+    def lexerClass(self, base):
+        class TLexer(base):
+            def emitErrorMessage(self, msg):
+                # report errors to /dev/null
+                pass
+
+            def reportError(self, re):
+                # no error recovery yet, just crash!
+                raise re
+
+        return TLexer
+    
+        
+    def testValid(self):
+        stream = antlr3.StringStream('fofaaooa')
+        lexer = self.getLexer(stream)
+
+        token = lexer.nextToken()
+        self.assertEqual(token.type, self.lexerModule.FOO)
+        self.assertEqual(token.start, 0)
+        self.assertEqual(token.stop, 1)
+        self.assertEqual(token.text, 'fo')
+
+        token = lexer.nextToken()
+        self.assertEqual(token.type, self.lexerModule.FOO)
+        self.assertEqual(token.start, 2)
+        self.assertEqual(token.stop, 7)
+        self.assertEqual(token.text, 'faaooa')
+
+        token = lexer.nextToken()
+        self.assertEqual(token.type, self.lexerModule.EOF)
+
+
+    def testMalformedInput(self):
+        stream = antlr3.StringStream('fofoaooaoa2')
+        lexer = self.getLexer(stream)
+
+        lexer.nextToken()
+        lexer.nextToken()
+        try:
+            token = lexer.nextToken()
+            self.fail(token)
+
+        except antlr3.MismatchedTokenException as exc:
+            self.assertEqual(exc.expecting, 'f')
+            self.assertEqual(exc.unexpectedType, '2')
+            self.assertEqual(exc.charPositionInLine, 10)
+            self.assertEqual(exc.line, 1)
+            
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/runtime/Python3/tests/t007lexer.g b/runtime/Python3/tests/t007lexer.g
new file mode 100644
index 0000000..e55b4b7
--- /dev/null
+++ b/runtime/Python3/tests/t007lexer.g
@@ -0,0 +1,6 @@
+lexer grammar t007lexer;
+options {
+  language = Python3;
+}
+
+FOO: 'f' ('o' | 'a' 'b'+)*;
diff --git a/runtime/Python3/tests/t007lexer.py b/runtime/Python3/tests/t007lexer.py
new file mode 100644
index 0000000..02abb77
--- /dev/null
+++ b/runtime/Python3/tests/t007lexer.py
@@ -0,0 +1,59 @@
+import antlr3
+import testbase
+import unittest
+
+class t007lexer(testbase.ANTLRTest):
+    def setUp(self):
+        self.compileGrammar()
+        
+        
+    def lexerClass(self, base):
+        class TLexer(base):
+            def emitErrorMessage(self, msg):
+                # report errors to /dev/null
+                pass
+
+            def reportError(self, re):
+                # no error recovery yet, just crash!
+                raise re
+
+        return TLexer
+    
+        
+    def testValid(self):
+        stream = antlr3.StringStream('fofababbooabb')
+        lexer = self.getLexer(stream)
+
+        token = lexer.nextToken()
+        self.assertEqual(token.type, self.lexerModule.FOO)
+        self.assertEqual(token.start, 0)
+        self.assertEqual(token.stop, 1)
+        self.assertEqual(token.text, 'fo')
+
+        token = lexer.nextToken()
+        self.assertEqual(token.type, self.lexerModule.FOO)
+        self.assertEqual(token.start, 2)
+        self.assertEqual(token.stop, 12)
+        self.assertEqual(token.text, 'fababbooabb')
+
+        token = lexer.nextToken()
+        self.assertEqual(token.type, self.lexerModule.EOF)
+
+
+    def testMalformedInput(self):
+        stream = antlr3.StringStream('foaboao')
+        lexer = self.getLexer(stream)
+
+        try:
+            token = lexer.nextToken()
+            self.fail(token)
+
+        except antlr3.EarlyExitException as exc:
+            self.assertEqual(exc.unexpectedType, 'o')
+            self.assertEqual(exc.charPositionInLine, 6)
+            self.assertEqual(exc.line, 1)
+            
+
+if __name__ == '__main__':
+    unittest.main()
+
diff --git a/runtime/Python3/tests/t008lexer.g b/runtime/Python3/tests/t008lexer.g
new file mode 100644
index 0000000..2a7904e
--- /dev/null
+++ b/runtime/Python3/tests/t008lexer.g
@@ -0,0 +1,6 @@
+lexer grammar t008lexer;
+options {
+  language = Python3;
+}
+
+FOO: 'f' 'a'?;
diff --git a/runtime/Python3/tests/t008lexer.py b/runtime/Python3/tests/t008lexer.py
new file mode 100644
index 0000000..f3b1ed9
--- /dev/null
+++ b/runtime/Python3/tests/t008lexer.py
@@ -0,0 +1,66 @@
+import antlr3
+import testbase
+import unittest
+
+class t008lexer(testbase.ANTLRTest):
+    def setUp(self):
+        self.compileGrammar()
+        
+        
+    def lexerClass(self, base):
+        class TLexer(base):
+            def emitErrorMessage(self, msg):
+                # report errors to /dev/null
+                pass
+
+            def reportError(self, re):
+                # no error recovery yet, just crash!
+                raise re
+
+        return TLexer
+    
+        
+    def testValid(self):
+        stream = antlr3.StringStream('ffaf')
+        lexer = self.getLexer(stream)
+
+        token = lexer.nextToken()
+        self.assertEqual(token.type, self.lexerModule.FOO)
+        self.assertEqual(token.start, 0)
+        self.assertEqual(token.stop, 0)
+        self.assertEqual(token.text, 'f')
+
+        token = lexer.nextToken()
+        self.assertEqual(token.type, self.lexerModule.FOO)
+        self.assertEqual(token.start, 1)
+        self.assertEqual(token.stop, 2)
+        self.assertEqual(token.text, 'fa')
+
+        token = lexer.nextToken()
+        self.assertEqual(token.type, self.lexerModule.FOO)
+        self.assertEqual(token.start, 3)
+        self.assertEqual(token.stop, 3)
+        self.assertEqual(token.text, 'f')
+
+        token = lexer.nextToken()
+        self.assertEqual(token.type, self.lexerModule.EOF)
+
+
+    def testMalformedInput(self):
+        stream = antlr3.StringStream('fafb')
+        lexer = self.getLexer(stream)
+
+        lexer.nextToken()
+        lexer.nextToken()
+        try:
+            token = lexer.nextToken()
+            self.fail(token)
+
+        except antlr3.MismatchedTokenException as exc:
+            self.assertEqual(exc.unexpectedType, 'b')
+            self.assertEqual(exc.charPositionInLine, 3)
+            self.assertEqual(exc.line, 1)
+            
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/runtime/Python3/tests/t009lexer.g b/runtime/Python3/tests/t009lexer.g
new file mode 100644
index 0000000..a04b5b4
--- /dev/null
+++ b/runtime/Python3/tests/t009lexer.g
@@ -0,0 +1,6 @@
+lexer grammar t009lexer;
+options {
+  language = Python3;
+}
+
+DIGIT: '0' .. '9';
diff --git a/runtime/Python3/tests/t009lexer.py b/runtime/Python3/tests/t009lexer.py
new file mode 100644
index 0000000..bf60bce
--- /dev/null
+++ b/runtime/Python3/tests/t009lexer.py
@@ -0,0 +1,67 @@
+import antlr3
+import testbase
+import unittest
+
+class t009lexer(testbase.ANTLRTest):
+    def setUp(self):
+        self.compileGrammar()
+
+
+    def lexerClass(self, base):
+        class TLexer(base):
+            def emitErrorMessage(self, msg):
+                # report errors to /dev/null
+                pass
+
+            def reportError(self, re):
+                # no error recovery yet, just crash!
+                raise re
+
+        return TLexer
+
+
+    def testValid(self):
+        stream = antlr3.StringStream('085')
+        lexer = self.getLexer(stream)
+
+        token = lexer.nextToken()
+        self.assertEqual(token.type, self.lexerModule.DIGIT)
+        self.assertEqual(token.start, 0)
+        self.assertEqual(token.stop, 0)
+        self.assertEqual(token.text, '0')
+
+        token = lexer.nextToken()
+        self.assertEqual(token.type, self.lexerModule.DIGIT)
+        self.assertEqual(token.start, 1)
+        self.assertEqual(token.stop, 1)
+        self.assertEqual(token.text, '8')
+
+        token = lexer.nextToken()
+        self.assertEqual(token.type, self.lexerModule.DIGIT)
+        self.assertEqual(token.start, 2)
+        self.assertEqual(token.stop, 2)
+        self.assertEqual(token.text, '5')
+
+        token = lexer.nextToken()
+        self.assertEqual(token.type, self.lexerModule.EOF)
+
+
+    def testMalformedInput(self):
+        stream = antlr3.StringStream('2a')
+        lexer = self.getLexer(stream)
+
+        lexer.nextToken()
+        try:
+            token = lexer.nextToken()
+            self.fail(token)
+
+        except antlr3.MismatchedSetException as exc:
+            # TODO: This should provide more useful information
+            self.assertIsNone(exc.expecting)
+            self.assertEqual(exc.unexpectedType, 'a')
+            self.assertEqual(exc.charPositionInLine, 1)
+            self.assertEqual(exc.line, 1)
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/runtime/Python3/tests/t010lexer.g b/runtime/Python3/tests/t010lexer.g
new file mode 100644
index 0000000..3a7524d
--- /dev/null
+++ b/runtime/Python3/tests/t010lexer.g
@@ -0,0 +1,7 @@
+lexer grammar t010lexer;
+options {
+  language = Python3;
+}
+
+IDENTIFIER: ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*;
+WS: (' ' | '\n')+;
diff --git a/runtime/Python3/tests/t010lexer.py b/runtime/Python3/tests/t010lexer.py
new file mode 100644
index 0000000..9cedea3
--- /dev/null
+++ b/runtime/Python3/tests/t010lexer.py
@@ -0,0 +1,78 @@
+import antlr3
+import testbase
+import unittest
+
+class t010lexer(testbase.ANTLRTest):
+    def setUp(self):
+        self.compileGrammar()
+        
+        
+    def lexerClass(self, base):
+        class TLexer(base):
+            def emitErrorMessage(self, msg):
+                # report errors to /dev/null
+                pass
+
+            def reportError(self, re):
+                # no error recovery yet, just crash!
+                raise re
+
+        return TLexer
+    
+        
+    def testValid(self):
+        stream = antlr3.StringStream('foobar _Ab98 \n A12sdf')
+        lexer = self.getLexer(stream)
+
+        token = lexer.nextToken()
+        self.assertEqual(token.type, self.lexerModule.IDENTIFIER)
+        self.assertEqual(token.start, 0)
+        self.assertEqual(token.stop, 5)
+        self.assertEqual(token.text, 'foobar')
+
+        token = lexer.nextToken()
+        self.assertEqual(token.type, self.lexerModule.WS)
+        self.assertEqual(token.start, 6)
+        self.assertEqual(token.stop, 6)
+        self.assertEqual(token.text, ' ')
+
+        token = lexer.nextToken()
+        self.assertEqual(token.type, self.lexerModule.IDENTIFIER)
+        self.assertEqual(token.start, 7)
+        self.assertEqual(token.stop, 11)
+        self.assertEqual(token.text, '_Ab98')
+
+        token = lexer.nextToken()
+        self.assertEqual(token.type, self.lexerModule.WS)
+        self.assertEqual(token.start, 12)
+        self.assertEqual(token.stop, 14)
+        self.assertEqual(token.text, ' \n ')
+
+        token = lexer.nextToken()
+        self.assertEqual(token.type, self.lexerModule.IDENTIFIER)
+        self.assertEqual(token.start, 15)
+        self.assertEqual(token.stop, 20)
+        self.assertEqual(token.text, 'A12sdf')
+
+        token = lexer.nextToken()
+        self.assertEqual(token.type, self.lexerModule.EOF)
+
+
+    def testMalformedInput(self):
+        stream = antlr3.StringStream('a-b')
+        lexer = self.getLexer(stream)
+
+        lexer.nextToken()
+        try:
+            token = lexer.nextToken()
+            self.fail(token)
+
+        except antlr3.NoViableAltException as exc:
+            self.assertEqual(exc.unexpectedType, '-')
+            self.assertEqual(exc.charPositionInLine, 1)
+            self.assertEqual(exc.line, 1)
+
+            
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/runtime/Python3/tests/t011lexer.g b/runtime/Python3/tests/t011lexer.g
new file mode 100644
index 0000000..17d01ea
--- /dev/null
+++ b/runtime/Python3/tests/t011lexer.g
@@ -0,0 +1,19 @@
+lexer grammar t011lexer;
+options {
+  language = Python3;
+}
+
+IDENTIFIER: 
+        ('a'..'z'|'A'..'Z'|'_') 
+        ('a'..'z'
+        |'A'..'Z'
+        |'0'..'9'
+        |'_'
+            { 
+              print("Underscore")
+              print("foo")
+            }
+        )*
+    ;
+
+WS: (' ' | '\n')+;
diff --git a/runtime/Python3/tests/t011lexer.py b/runtime/Python3/tests/t011lexer.py
new file mode 100644
index 0000000..b417826
--- /dev/null
+++ b/runtime/Python3/tests/t011lexer.py
@@ -0,0 +1,78 @@
+import antlr3
+import testbase
+import unittest
+
+class t011lexer(testbase.ANTLRTest):
+    def setUp(self):
+        self.compileGrammar()
+        
+        
+    def lexerClass(self, base):
+        class TLexer(base):
+            def emitErrorMessage(self, msg):
+                # report errors to /dev/null
+                pass
+
+            def reportError(self, re):
+                # no error recovery yet, just crash!
+                raise re
+
+        return TLexer
+    
+        
+    def testValid(self):
+        stream = antlr3.StringStream('foobar _Ab98 \n A12sdf')
+        lexer = self.getLexer(stream)
+
+        token = lexer.nextToken()
+        self.assertEqual(token.type, self.lexerModule.IDENTIFIER)
+        self.assertEqual(token.start, 0)
+        self.assertEqual(token.stop, 5)
+        self.assertEqual(token.text, 'foobar')
+
+        token = lexer.nextToken()
+        self.assertEqual(token.type, self.lexerModule.WS)
+        self.assertEqual(token.start, 6)
+        self.assertEqual(token.stop, 6)
+        self.assertEqual(token.text, ' ')
+
+        token = lexer.nextToken()
+        self.assertEqual(token.type, self.lexerModule.IDENTIFIER)
+        self.assertEqual(token.start, 7)
+        self.assertEqual(token.stop, 11)
+        self.assertEqual(token.text, '_Ab98')
+
+        token = lexer.nextToken()
+        self.assertEqual(token.type, self.lexerModule.WS)
+        self.assertEqual(token.start, 12)
+        self.assertEqual(token.stop, 14)
+        self.assertEqual(token.text, ' \n ')
+
+        token = lexer.nextToken()
+        self.assertEqual(token.type, self.lexerModule.IDENTIFIER)
+        self.assertEqual(token.start, 15)
+        self.assertEqual(token.stop, 20)
+        self.assertEqual(token.text, 'A12sdf')
+
+        token = lexer.nextToken()
+        self.assertEqual(token.type, self.lexerModule.EOF)
+
+
+    def testMalformedInput(self):
+        stream = antlr3.StringStream('a-b')
+        lexer = self.getLexer(stream)
+
+        lexer.nextToken()
+        try:
+            token = lexer.nextToken()
+            self.fail(token)
+
+        except antlr3.NoViableAltException as exc:
+            self.assertEqual(exc.unexpectedType, '-')
+            self.assertEqual(exc.charPositionInLine, 1)
+            self.assertEqual(exc.line, 1)
+
+            
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/runtime/Python3/tests/t012lexerXML.input b/runtime/Python3/tests/t012lexerXML.input
new file mode 100644
index 0000000..1815a9f
--- /dev/null
+++ b/runtime/Python3/tests/t012lexerXML.input
@@ -0,0 +1,21 @@
+<?xml version='1.0'?>
+<!DOCTYPE component [
+<!ELEMENT component (PCDATA|sub)*>
+<!ATTLIST component
+          attr CDATA #IMPLIED
+          attr2 CDATA #IMPLIED
+>
+<!ELMENT sub EMPTY>
+
+]>
+<component attr="val'ue" attr2='val"ue'>
+<!-- This is a comment -->
+Text
+<![CDATA[huhu]]>
+öäüß
+&amp;
+&lt;
+<?xtal cursor='11'?>
+<sub/>
+<sub></sub>
+</component>
\ No newline at end of file
diff --git a/runtime/Python3/tests/t012lexerXML.output b/runtime/Python3/tests/t012lexerXML.output
new file mode 100644
index 0000000..825c37f
--- /dev/null
+++ b/runtime/Python3/tests/t012lexerXML.output
@@ -0,0 +1,39 @@
+XML declaration
+Attr: version='1.0'
+ROOTELEMENT: component
+INTERNAL DTD: [
+<!ELEMENT component (PCDATA|sub)*>
+<!ATTLIST component
+          attr CDATA #IMPLIED
+          attr2 CDATA #IMPLIED
+>
+<!ELMENT sub EMPTY>
+
+]
+Start Tag: component
+Attr: attr="val'ue"
+Attr: attr2='val"ue'
+PCDATA: "
+"
+Comment: "<!-- This is a comment -->"
+PCDATA: "
+Text
+"
+CDATA: "<![CDATA[huhu]]>"
+PCDATA: "
+öäüß
+&amp;
+&lt;
+"
+PI: xtal
+Attr: cursor='11'
+PCDATA: "
+"
+Empty Element: sub
+PCDATA: "
+"
+Start Tag: sub
+End Tag: sub
+PCDATA: "
+"
+End Tag: component
diff --git a/runtime/Python3/tests/t012lexerXML.py b/runtime/Python3/tests/t012lexerXML.py
new file mode 100644
index 0000000..40d67bb
--- /dev/null
+++ b/runtime/Python3/tests/t012lexerXML.py
@@ -0,0 +1,120 @@
+import antlr3
+import testbase
+import unittest
+import os
+import sys
+from io import StringIO
+import textwrap
+
+class t012lexerXML(testbase.ANTLRTest):
+    def setUp(self):
+        self.compileGrammar('t012lexerXMLLexer.g')
+        
+        
+    def lexerClass(self, base):
+        class TLexer(base):
+            def emitErrorMessage(self, msg):
+                # report errors to /dev/null
+                pass
+
+            def reportError(self, re):
+                # no error recovery yet, just crash!
+                raise re
+
+        return TLexer
+    
+        
+    def testValid(self):
+        inputPath = os.path.splitext(__file__)[0] + '.input'
+        with open(inputPath) as f:
+            data = f.read()
+        stream = antlr3.StringStream(data)
+        lexer = self.getLexer(stream)
+
+        while True:
+            token = lexer.nextToken()
+            if token.type == self.lexerModule.EOF:
+                break
+
+
+        output = lexer.outbuf.getvalue()
+
+        outputPath = os.path.splitext(__file__)[0] + '.output'
+
+        with open(outputPath) as f:
+            testOutput = f.read()
+
+        self.assertEqual(output, testOutput)
+
+
+    def testMalformedInput1(self):
+        input = textwrap.dedent("""\
+        <?xml version='1.0'?>
+        <document d>
+        </document>
+        """)
+
+        stream = antlr3.StringStream(input)
+        lexer = self.getLexer(stream)
+
+        try:
+            while True:
+                token = lexer.nextToken()
+                # Should raise NoViableAltException before hitting EOF
+                if token.type == antlr3.EOF:
+                    self.fail()
+
+        except antlr3.NoViableAltException as exc:
+            self.assertEqual(exc.unexpectedType, '>')
+            self.assertEqual(exc.charPositionInLine, 11)
+            self.assertEqual(exc.line, 2)
+
+
+    def testMalformedInput2(self):
+        input = textwrap.dedent("""\
+        <?tml version='1.0'?>
+        <document>
+        </document>
+        """)
+
+        stream = antlr3.StringStream(input)
+        lexer = self.getLexer(stream)
+
+        try:
+            while True:
+                token = lexer.nextToken()
+                # Should raise NoViableAltException before hitting EOF
+                if token.type == antlr3.EOF:
+                    self.fail()
+
+        except antlr3.MismatchedSetException as exc:
+            self.assertEqual(exc.unexpectedType, 't')
+            self.assertEqual(exc.charPositionInLine, 2)
+            self.assertEqual(exc.line, 1)
+
+
+    def testMalformedInput3(self):
+        input = textwrap.dedent("""\
+        <?xml version='1.0'?>
+        <docu ment attr="foo">
+        </document>
+        """)
+
+        stream = antlr3.StringStream(input)
+        lexer = self.getLexer(stream)
+
+        try:
+            while True:
+                token = lexer.nextToken()
+                # Should raise NoViableAltException before hitting EOF
+                if token.type == antlr3.EOF:
+                    self.fail()
+
+        except antlr3.NoViableAltException as exc:
+            self.assertEqual(exc.unexpectedType, 'a')
+            self.assertEqual(exc.charPositionInLine, 11)
+            self.assertEqual(exc.line, 2)
+
+            
+if __name__ == '__main__':
+    unittest.main()
diff --git a/runtime/Python3/tests/t012lexerXMLLexer.g b/runtime/Python3/tests/t012lexerXMLLexer.g
new file mode 100644
index 0000000..23e566a
--- /dev/null
+++ b/runtime/Python3/tests/t012lexerXMLLexer.g
@@ -0,0 +1,132 @@
+lexer grammar t012lexerXMLLexer;
+options {
+  language = Python3;
+}
+
+@header {
+from io import StringIO
+}
+
+@lexer::init {
+self.outbuf = StringIO()
+}
+
+@lexer::members {
+def output(self, line):
+    self.outbuf.write(line + "\n")
+}
+
+DOCUMENT
+    :  XMLDECL? WS? DOCTYPE? WS? ELEMENT WS? 
+    ;
+
+fragment DOCTYPE
+    :
+        '<!DOCTYPE' WS rootElementName=GENERIC_ID 
+        {self.output("ROOTELEMENT: "+rootElementName.text)}
+        WS
+        ( 
+            ( 'SYSTEM' WS sys1=VALUE
+                {self.output("SYSTEM: "+sys1.text)}
+                
+            | 'PUBLIC' WS pub=VALUE WS sys2=VALUE
+                {self.output("PUBLIC: "+pub.text)}
+                {self.output("SYSTEM: "+sys2.text)}   
+            )
+            ( WS )?
+        )?
+        ( dtd=INTERNAL_DTD
+            {self.output("INTERNAL DTD: "+dtd.text)}
+        )?
+		'>'
+	;
+
+fragment INTERNAL_DTD : '[' (options {greedy=false;} : .)* ']' ;
+
+fragment PI :
+        '<?' target=GENERIC_ID WS? 
+          {self.output("PI: "+target.text)}
+        ( ATTRIBUTE WS? )*  '?>'
+	;
+
+fragment XMLDECL :
+        '<?' ('x'|'X') ('m'|'M') ('l'|'L') WS? 
+          {self.output("XML declaration")}
+        ( ATTRIBUTE WS? )*  '?>'
+	;
+
+
+fragment ELEMENT
+    : ( START_TAG
+            (ELEMENT
+            | t=PCDATA
+                {self.output('PCDATA: "{}"'.format($t.text))}
+            | t=CDATA
+                {self.output('CDATA: "{}"'.format($t.text))}
+            | t=COMMENT
+                {self.output('Comment: "{}"'.format($t.text))}
+            | pi=PI
+            )*
+            END_TAG
+        | EMPTY_ELEMENT
+        )
+    ;
+
+fragment START_TAG 
+    : '<' WS? name=GENERIC_ID WS?
+          {self.output("Start Tag: "+name.text)}
+        ( ATTRIBUTE WS? )* '>'
+    ;
+
+fragment EMPTY_ELEMENT 
+    : '<' WS? name=GENERIC_ID WS?
+          {self.output("Empty Element: "+name.text)}
+        ( ATTRIBUTE WS? )* '/>'
+    ;
+
+fragment ATTRIBUTE 
+    : name=GENERIC_ID WS? '=' WS? value=VALUE
+        {self.output("Attr: {}={}".format(name.text, value.text))}
+    ;
+
+fragment END_TAG 
+    : '</' WS? name=GENERIC_ID WS? '>'
+        {self.output("End Tag: "+name.text)}
+    ;
+
+fragment COMMENT
+	:	'<!--' (options {greedy=false;} : .)* '-->'
+	;
+
+fragment CDATA
+	:	'<![CDATA[' (options {greedy=false;} : .)* ']]>'
+	;
+
+fragment PCDATA : (~'<')+ ; 
+
+fragment VALUE : 
+        ( '\"' (~'\"')* '\"'
+        | '\'' (~'\'')* '\''
+        )
+	;
+
+fragment GENERIC_ID 
+    : ( LETTER | '_' | ':') 
+        ( options {greedy=true;} : LETTER | '0'..'9' | '.' | '-' | '_' | ':' )*
+	;
+
+fragment LETTER
+	: 'a'..'z' 
+	| 'A'..'Z'
+	;
+
+fragment WS  :
+        (   ' '
+        |   '\t'
+        |  ( '\n'
+            |	'\r\n'
+            |	'\r'
+            )
+        )+
+    ;    
+
diff --git a/runtime/Python3/tests/t013parser.g b/runtime/Python3/tests/t013parser.g
new file mode 100644
index 0000000..bf97d77
--- /dev/null
+++ b/runtime/Python3/tests/t013parser.g
@@ -0,0 +1,23 @@
+grammar t013parser;
+options {
+  language = Python3;
+}
+
+@parser::init {
+self.identifiers = []
+self.reportedErrors = []
+}
+
+@parser::members {
+def foundIdentifier(self, name):
+    self.identifiers.append(name)
+
+def emitErrorMessage(self, msg):
+    self.reportedErrors.append(msg)
+}
+
+document:
+        t=IDENTIFIER {self.foundIdentifier($t.text)}
+        ;
+
+IDENTIFIER: ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*;
diff --git a/runtime/Python3/tests/t013parser.py b/runtime/Python3/tests/t013parser.py
new file mode 100644
index 0000000..4562e36
--- /dev/null
+++ b/runtime/Python3/tests/t013parser.py
@@ -0,0 +1,35 @@
+import antlr3
+import testbase
+import unittest
+
+class t013parser(testbase.ANTLRTest):
+    def setUp(self):
+        self.compileGrammar()
+        
+        
+    def testValid(self):
+        cStream = antlr3.StringStream('foobar')
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+        parser.document()
+
+        self.assertEqual(parser.reportedErrors, [])
+        self.assertEqual(parser.identifiers, ['foobar'])
+
+
+    def testMalformedInput1(self):
+        cStream = antlr3.StringStream('')
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+
+        parser.document()
+
+        # FIXME: currently strings with formatted errors are collected
+        # can't check error locations yet
+        self.assertEqual(len(parser.reportedErrors), 1, parser.reportedErrors)
+            
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/runtime/Python3/tests/t014parser.g b/runtime/Python3/tests/t014parser.g
new file mode 100644
index 0000000..3d58d18
--- /dev/null
+++ b/runtime/Python3/tests/t014parser.g
@@ -0,0 +1,35 @@
+grammar t014parser;
+options {
+  language = Python3;
+}
+
+@parser::init {
+self.events = []
+self.reportedErrors = []
+}
+
+@parser::members {
+def emitErrorMessage(self, msg):
+    self.reportedErrors.append(msg)
+}
+        
+
+document:
+        ( declaration
+        | call
+        )*
+        EOF
+    ;
+
+declaration:
+        'var' t=IDENTIFIER ';'
+        {self.events.append(('decl', $t.text))}
+    ;
+
+call:
+        t=IDENTIFIER '(' ')' ';'
+        {self.events.append(('call', $t.text))}
+    ;
+
+IDENTIFIER: ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*;
+WS:  (' '|'\r'|'\t'|'\n') {$channel=HIDDEN;};
diff --git a/runtime/Python3/tests/t014parser.py b/runtime/Python3/tests/t014parser.py
new file mode 100644
index 0000000..ae071d7
--- /dev/null
+++ b/runtime/Python3/tests/t014parser.py
@@ -0,0 +1,66 @@
+import antlr3
+import testbase
+import unittest
+
+class t014parser(testbase.ANTLRTest):
+    def setUp(self):
+        self.compileGrammar()
+        
+        
+    def testValid(self):
+        cStream = antlr3.StringStream('var foobar; gnarz(); var blupp; flupp ( ) ;')
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+        parser.document()
+
+        self.assertEqual(parser.reportedErrors, [])
+        self.assertEqual(parser.events,
+                         [('decl', 'foobar'), ('call', 'gnarz'),
+                          ('decl', 'blupp'), ('call', 'flupp')])
+
+
+    def testMalformedInput1(self):
+        cStream = antlr3.StringStream('var; foo();')
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+
+        parser.document()
+
+        # FIXME: currently strings with formatted errors are collected
+        # can't check error locations yet
+        self.assertEqual(len(parser.reportedErrors), 1, parser.reportedErrors)
+        self.assertEqual(parser.events, [])
+
+
+    def testMalformedInput2(self):
+        cStream = antlr3.StringStream('var foobar(); gnarz();')
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+
+        parser.document()
+
+        # FIXME: currently strings with formatted errors are collected
+        # can't check error locations yet
+        self.assertEqual(len(parser.reportedErrors), 1, parser.reportedErrors)
+        self.assertEqual(parser.events, [('call', 'gnarz')])
+
+
+    def testMalformedInput3(self):
+        cStream = antlr3.StringStream('gnarz(; flupp();')
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+
+        parser.document()
+
+        # FIXME: currently strings with formatted errors are collected
+        # can't check error locations yet
+        self.assertEqual(len(parser.reportedErrors), 1, parser.reportedErrors)
+        self.assertEqual(parser.events, [('call', 'gnarz'), ('call', 'flupp')])
+            
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/runtime/Python3/tests/t015calc.g b/runtime/Python3/tests/t015calc.g
new file mode 100644
index 0000000..54f17ec
--- /dev/null
+++ b/runtime/Python3/tests/t015calc.g
@@ -0,0 +1,54 @@
+grammar t015calc;
+options {
+  language = Python3;
+}
+
+@header {
+import math
+}
+
+@parser::init {
+self.reportedErrors = []
+}
+
+@parser::members {
+def emitErrorMessage(self, msg):
+    self.reportedErrors.append(msg)
+}
+
+evaluate returns [result]: r=expression {result = r};
+
+expression returns [result]: r=mult (
+    '+' r2=mult {r += r2}
+  | '-' r2=mult {r -= r2}
+  )* {result = r};
+
+mult returns [result]: r=log (
+    '*' r2=log {r *= r2}
+  | '/' r2=log {r /= r2}
+//  | '%' r2=log {r %= r2}
+  )* {result = r};
+
+log returns [result]: 'ln' r=exp {result = math.log(r)}
+    | r=exp {result = r}
+    ;
+
+exp returns [result]: r=atom ('^' r2=atom {r = math.pow(r,r2)} )? {result = r}
+    ;
+
+atom returns [result]:
+    n=INTEGER {result = int($n.text)}
+  | n=DECIMAL {result = float($n.text)} 
+  | '(' r=expression {result = r} ')'
+  | 'PI' {result = math.pi}
+  | 'E' {result = math.e}
+  ;
+
+INTEGER: DIGIT+;
+
+DECIMAL: DIGIT+ '.' DIGIT+;
+
+fragment
+DIGIT: '0'..'9';
+
+WS: (' ' | '\n' | '\t')+ {$channel = HIDDEN};
diff --git a/runtime/Python3/tests/t015calc.py b/runtime/Python3/tests/t015calc.py
new file mode 100644
index 0000000..a7a5639
--- /dev/null
+++ b/runtime/Python3/tests/t015calc.py
@@ -0,0 +1,47 @@
+import antlr3
+import testbase
+import unittest
+
+class t015calc(testbase.ANTLRTest):
+    def setUp(self):
+        self.compileGrammar()
+
+
+    def _evaluate(self, expr, expected, errors=[]):
+        cStream = antlr3.StringStream(expr)
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+        result = parser.evaluate()
+        self.assertEqual(result, expected)
+        self.assertEqual(len(parser.reportedErrors), len(errors),
+                         parser.reportedErrors)
+
+
+    def testValid01(self):
+        self._evaluate("1 + 2", 3)
+
+
+    def testValid02(self):
+        self._evaluate("1 + 2 * 3", 7)
+
+
+    def testValid03(self):
+        self._evaluate("10 / 2", 5)
+
+
+    def testValid04(self):
+        self._evaluate("6 + 2*(3+1) - 4", 10)
+
+
+    def testMalformedInput(self):
+        self._evaluate("6 - (2*1", 4, ["mismatched token at pos 8"])
+        
+    # FIXME: most parse errors result in TypeErrors in action code, because
+    # rules return None, which is then added/multiplied... to integers.
+    # evaluate("6 - foo 2", 4, ["some error"])
+            
+
+if __name__ == '__main__':
+    unittest.main()
+
diff --git a/runtime/Python3/tests/t016actions.g b/runtime/Python3/tests/t016actions.g
new file mode 100644
index 0000000..f6def13
--- /dev/null
+++ b/runtime/Python3/tests/t016actions.g
@@ -0,0 +1,31 @@
+grammar t016actions;
+options {
+  language = Python3;
+}
+
+declaration returns [name]
+    :   functionHeader ';'
+        {$name = $functionHeader.name}
+    ;
+
+functionHeader returns [name]
+    :   type ID
+	{$name = $ID.text}
+    ;
+
+type
+    :   'int'   
+    |   'char'  
+    |   'void'
+    ;
+
+ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
+    ;
+
+WS  :   (   ' '
+        |   '\t'
+        |   '\r'
+        |   '\n'
+        )+
+        {$channel=HIDDEN}
+    ;    
diff --git a/runtime/Python3/tests/t016actions.py b/runtime/Python3/tests/t016actions.py
new file mode 100644
index 0000000..60ea53a
--- /dev/null
+++ b/runtime/Python3/tests/t016actions.py
@@ -0,0 +1,20 @@
+import antlr3
+import testbase
+import unittest
+
+class t016actions(testbase.ANTLRTest):
+    def setUp(self):
+        self.compileGrammar()
+        
+        
+    def testValid(self):
+        cStream = antlr3.StringStream("int foo;")
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+        name = parser.declaration()
+        self.assertEqual(name, 'foo')
+            
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/runtime/Python3/tests/t017parser.g b/runtime/Python3/tests/t017parser.g
new file mode 100644
index 0000000..20b4724
--- /dev/null
+++ b/runtime/Python3/tests/t017parser.g
@@ -0,0 +1,91 @@
+grammar t017parser;
+
+options {
+    language = Python3;
+}
+
+program
+    :   declaration+
+    ;
+
+declaration
+    :   variable
+    |   functionHeader ';'
+    |   functionHeader block
+    ;
+
+variable
+    :   type declarator ';'
+    ;
+
+declarator
+    :   ID 
+    ;
+
+functionHeader
+    :   type ID '(' ( formalParameter ( ',' formalParameter )* )? ')'
+    ;
+
+formalParameter
+    :   type declarator        
+    ;
+
+type
+    :   'int'   
+    |   'char'  
+    |   'void'
+    |   ID        
+    ;
+
+block
+    :   '{'
+            variable*
+            stat*
+        '}'
+    ;
+
+stat: forStat
+    | expr ';'      
+    | block
+    | assignStat ';'
+    | ';'
+    ;
+
+forStat
+    :   'for' '(' assignStat ';' expr ';' assignStat ')' block        
+    ;
+
+assignStat
+    :   ID '=' expr        
+    ;
+
+expr:   condExpr
+    ;
+
+condExpr
+    :   aexpr ( ('==' | '<') aexpr )?
+    ;
+
+aexpr
+    :   atom ( '+' atom )*
+    ;
+
+atom
+    : ID      
+    | INT      
+    | '(' expr ')'
+    ; 
+
+ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
+    ;
+
+INT :	('0'..'9')+
+    ;
+
+WS  :   (   ' '
+        |   '\t'
+        |   '\r'
+        |   '\n'
+        )+
+        {$channel=HIDDEN}
+    ;    
diff --git a/runtime/Python3/tests/t017parser.py b/runtime/Python3/tests/t017parser.py
new file mode 100644
index 0000000..3add2ad
--- /dev/null
+++ b/runtime/Python3/tests/t017parser.py
@@ -0,0 +1,58 @@
+import antlr3
+import testbase
+import unittest
+
+class t017parser(testbase.ANTLRTest):
+    def setUp(self):
+        self.compileGrammar()
+        
+    def parserClass(self, base):
+        class TestParser(base):
+            def __init__(self, *args, **kwargs):
+                super().__init__(*args, **kwargs)
+
+                self.reportedErrors = []
+        
+
+            def emitErrorMessage(self, msg):
+                self.reportedErrors.append(msg)
+                
+        return TestParser
+
+
+    def testValid(self):
+        cStream = antlr3.StringStream("int foo;")
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+        parser.program()
+
+        self.assertEqual(parser.reportedErrors, [])
+
+
+    def testMalformedInput1(self):
+        cStream = antlr3.StringStream('int foo() { 1+2 }')
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+        parser.program()
+
+        # FIXME: currently strings with formatted errors are collected
+        # can't check error locations yet
+        self.assertEqual(len(parser.reportedErrors), 1, parser.reportedErrors)
+
+
+    def testMalformedInput2(self):
+        cStream = antlr3.StringStream('int foo() { 1+; 1+2 }')
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+        parser.program()
+
+        # FIXME: currently strings with formatted errors are collected
+        # can't check error locations yet
+        self.assertEqual(len(parser.reportedErrors), 2, parser.reportedErrors)
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/runtime/Python3/tests/t018llstar.g b/runtime/Python3/tests/t018llstar.g
new file mode 100644
index 0000000..40d8857
--- /dev/null
+++ b/runtime/Python3/tests/t018llstar.g
@@ -0,0 +1,111 @@
+grammar t018llstar;
+
+options {
+    language = Python3;
+}
+
+@header {
+from io import StringIO
+}
+
+@init {
+self.output = StringIO()
+}
+
+program
+    :   declaration+
+    ;
+
+/** In this rule, the functionHeader left prefix on the last two
+ *  alternatives is not LL(k) for a fixed k.  However, it is
+ *  LL(*).  The LL(*) algorithm simply scans ahead until it sees
+ *  either the ';' or the '{' of the block and then it picks
+ *  the appropriate alternative.  Lookhead can be arbitrarily
+ *  long in theory, but is <=10 in most cases.  Works great.
+ *  Use ANTLRWorks to see the lookahead use (step by Location)
+ *  and look for blue tokens in the input window pane. :)
+ */
+declaration
+    :   variable
+    |   functionHeader ';'
+	{self.output.write($functionHeader.name+" is a declaration\n")}
+    |   functionHeader block
+	{self.output.write($functionHeader.name+" is a definition\n")}
+    ;
+
+variable
+    :   type declarator ';'
+    ;
+
+declarator
+    :   ID 
+    ;
+
+functionHeader returns [name]
+    :   type ID '(' ( formalParameter ( ',' formalParameter )* )? ')'
+	{$name = $ID.text}
+    ;
+
+formalParameter
+    :   type declarator        
+    ;
+
+type
+    :   'int'   
+    |   'char'  
+    |   'void'
+    |   ID        
+    ;
+
+block
+    :   '{'
+            variable*
+            stat*
+        '}'
+    ;
+
+stat: forStat
+    | expr ';'      
+    | block
+    | assignStat ';'
+    | ';'
+    ;
+
+forStat
+    :   'for' '(' assignStat ';' expr ';' assignStat ')' block        
+    ;
+
+assignStat
+    :   ID '=' expr        
+    ;
+
+expr:   condExpr
+    ;
+
+condExpr
+    :   aexpr ( ('==' | '<') aexpr )?
+    ;
+
+aexpr
+    :   atom ( '+' atom )*
+    ;
+
+atom
+    : ID      
+    | INT      
+    | '(' expr ')'
+    ; 
+
+ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
+    ;
+
+INT :	('0'..'9')+
+    ;
+
+WS  :   (   ' '
+        |   '\t'
+        |   '\r'
+        |   '\n'
+        )+
+        {$channel=HIDDEN}
+    ;    
diff --git a/runtime/Python3/tests/t018llstar.input b/runtime/Python3/tests/t018llstar.input
new file mode 100644
index 0000000..1aa5a0d
--- /dev/null
+++ b/runtime/Python3/tests/t018llstar.input
@@ -0,0 +1,12 @@
+char c;
+int x;
+
+void bar(int x);
+
+int foo(int y, char d) {
+  int i;
+  for (i=0; i<3; i=i+1) {
+    x=3;
+    y=5;
+  }
+}
diff --git a/runtime/Python3/tests/t018llstar.output b/runtime/Python3/tests/t018llstar.output
new file mode 100644
index 0000000..757c53a
--- /dev/null
+++ b/runtime/Python3/tests/t018llstar.output
@@ -0,0 +1,2 @@
+bar is a declaration
+foo is a definition
diff --git a/runtime/Python3/tests/t018llstar.py b/runtime/Python3/tests/t018llstar.py
new file mode 100644
index 0000000..9cc3e22
--- /dev/null
+++ b/runtime/Python3/tests/t018llstar.py
@@ -0,0 +1,31 @@
+import antlr3
+import testbase
+import unittest
+import os
+import sys
+from io import StringIO
+
+class t018llstar(testbase.ANTLRTest):
+    def setUp(self):
+        self.compileGrammar()
+        
+
+    def testValid(self):
+        inputPath = os.path.splitext(__file__)[0] + '.input'
+        with open(inputPath) as f:
+            cStream = antlr3.StringStream(f.read())
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+        parser.program()
+
+        output = parser.output.getvalue()
+
+        outputPath = os.path.splitext(__file__)[0] + '.output'
+        with open(outputPath) as f:
+            testOutput = f.read()
+
+        self.assertEqual(output, testOutput)
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/runtime/Python3/tests/t019lexer.g b/runtime/Python3/tests/t019lexer.g
new file mode 100644
index 0000000..0b986a0
--- /dev/null
+++ b/runtime/Python3/tests/t019lexer.g
@@ -0,0 +1,64 @@
+lexer grammar t019lexer;
+options {
+    language=Python3;
+    filter=true;
+}
+
+IMPORT
+	:	'import' WS name=QIDStar WS? ';'
+	;
+	
+/** Avoids having "return foo;" match as a field */
+RETURN
+	:	'return' (options {greedy=false;}:.)* ';'
+	;
+
+CLASS
+	:	'class' WS name=ID WS? ('extends' WS QID WS?)?
+		('implements' WS QID WS? (',' WS? QID WS?)*)? '{'
+	;
+	
+COMMENT
+    :   '/*' (options {greedy=false;} : . )* '*/'
+    ;
+
+STRING
+    :	'"' (options {greedy=false;}: ESC | .)* '"'
+	;
+
+CHAR
+	:	'\'' (options {greedy=false;}: ESC | .)* '\''
+	;
+
+WS  :   (' '|'\t'|'\n')+
+    ;
+
+fragment
+QID :	ID ('.' ID)*
+	;
+	
+/** QID cannot see beyond end of token so using QID '.*'? somewhere won't
+ *  ever match since k=1 lookahead in the QID loop of '.' will make it loop.
+ *  I made this rule to compensate.
+ */
+fragment
+QIDStar
+	:	ID ('.' ID)* '.*'?
+	;
+
+fragment
+TYPE:   QID '[]'?
+    ;
+    
+fragment
+ARG :   TYPE WS ID
+    ;
+
+fragment
+ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*
+    ;
+
+fragment
+ESC	:	'\\' ('"'|'\''|'\\')
+	;
+
diff --git a/runtime/Python3/tests/t019lexer.input b/runtime/Python3/tests/t019lexer.input
new file mode 100644
index 0000000..d01e1c1
--- /dev/null
+++ b/runtime/Python3/tests/t019lexer.input
@@ -0,0 +1,13 @@
+import org.antlr.runtime.*;
+
+public class Main {
+	public static void main(String[] args) throws Exception {
+	    for (int i=0; i<args.length; i++) {
+		CharStream input = new ANTLRFileStream(args[i]);
+		FuzzyJava lex = new FuzzyJava(input);
+		TokenStream tokens = new CommonTokenStream(lex);
+		tokens.toString();
+		//System.out.println(tokens);
+	    }
+	}
+}
diff --git a/runtime/Python3/tests/t019lexer.py b/runtime/Python3/tests/t019lexer.py
new file mode 100644
index 0000000..90c4fbb
--- /dev/null
+++ b/runtime/Python3/tests/t019lexer.py
@@ -0,0 +1,23 @@
+import os
+import antlr3
+import testbase
+import unittest
+
+class t019lexer(testbase.ANTLRTest):
+    def setUp(self):
+        self.compileGrammar()
+        
+
+    def testValid(self):
+        inputPath = os.path.splitext(__file__)[0] + '.input'
+        with open(inputPath) as f:
+            stream = antlr3.StringStream(f.read())
+        lexer = self.getLexer(stream)
+
+        while True:
+            token = lexer.nextToken()
+            if token.type == antlr3.EOF:
+                break
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/runtime/Python3/tests/t020fuzzy.input b/runtime/Python3/tests/t020fuzzy.input
new file mode 100644
index 0000000..d01e1c1
--- /dev/null
+++ b/runtime/Python3/tests/t020fuzzy.input
@@ -0,0 +1,13 @@
+import org.antlr.runtime.*;
+
+public class Main {
+	public static void main(String[] args) throws Exception {
+	    for (int i=0; i<args.length; i++) {
+		CharStream input = new ANTLRFileStream(args[i]);
+		FuzzyJava lex = new FuzzyJava(input);
+		TokenStream tokens = new CommonTokenStream(lex);
+		tokens.toString();
+		//System.out.println(tokens);
+	    }
+	}
+}
diff --git a/runtime/Python3/tests/t020fuzzy.output b/runtime/Python3/tests/t020fuzzy.output
new file mode 100644
index 0000000..da134f0
--- /dev/null
+++ b/runtime/Python3/tests/t020fuzzy.output
@@ -0,0 +1,12 @@
+found class Main
+found method main
+found var i
+found var input
+found call ANTLRFileStream
+found var lex
+found call FuzzyJava
+found var tokens
+found call CommonTokenStream
+found call tokens.toString
+found // comment //System.out.println(tokens);
+
diff --git a/runtime/Python3/tests/t020fuzzy.py b/runtime/Python3/tests/t020fuzzy.py
new file mode 100644
index 0000000..e43a12f
--- /dev/null
+++ b/runtime/Python3/tests/t020fuzzy.py
@@ -0,0 +1,35 @@
+import os
+import sys
+import antlr3
+import testbase
+import unittest
+from io import StringIO
+
+class t020fuzzy(testbase.ANTLRTest):
+    def setUp(self):
+        self.compileGrammar('t020fuzzyLexer.g')
+        
+
+    def testValid(self):
+        inputPath = os.path.splitext(__file__)[0] + '.input'
+        with open(inputPath) as f:
+            stream = antlr3.StringStream(f.read())
+        lexer = self.getLexer(stream)
+
+        while True:
+            token = lexer.nextToken()
+            if token.type == antlr3.EOF:
+                break
+
+
+        output = lexer.output.getvalue()
+
+        outputPath = os.path.splitext(__file__)[0] + '.output'
+        with open(outputPath) as f:
+            testOutput = f.read()
+
+        self.assertEqual(output, testOutput)
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/runtime/Python3/tests/t020fuzzyLexer.g b/runtime/Python3/tests/t020fuzzyLexer.g
new file mode 100644
index 0000000..f2aeaf5
--- /dev/null
+++ b/runtime/Python3/tests/t020fuzzyLexer.g
@@ -0,0 +1,96 @@
+lexer grammar t020fuzzyLexer;
+options {
+    language=Python3;
+    filter=true;
+}
+
+@header {
+from io import StringIO
+}
+
+@init {
+self.output = StringIO()
+}
+
+IMPORT
+	:	'import' WS name=QIDStar WS? ';'
+	;
+	
+/** Avoids having "return foo;" match as a field */
+RETURN
+	:	'return' (options {greedy=false;}:.)* ';'
+	;
+
+CLASS
+	:	'class' WS name=ID WS? ('extends' WS QID WS?)?
+		('implements' WS QID WS? (',' WS? QID WS?)*)? '{'
+        {self.output.write("found class "+$name.text+"\n")}
+	;
+	
+METHOD
+    :   TYPE WS name=ID WS? '(' ( ARG WS? (',' WS? ARG WS?)* )? ')' WS? 
+       ('throws' WS QID WS? (',' WS? QID WS?)*)? '{'
+        {self.output.write("found method "+$name.text+"\n");}
+    ;
+
+FIELD
+    :   TYPE WS name=ID '[]'? WS? (';'|'=')
+        {self.output.write("found var "+$name.text+"\n");}
+    ;
+
+STAT:	('if'|'while'|'switch'|'for') WS? '(' ;
+	
+CALL
+    :   name=QID WS? '('
+        {self.output.write("found call "+$name.text+"\n");}
+    ;
+
+COMMENT
+    :   '/*' (options {greedy=false;} : . )* '*/'
+        {self.output.write("found comment "+self.getText()+"\n");}
+    ;
+
+SL_COMMENT
+    :   '//' (options {greedy=false;} : . )* '\n'
+        {self.output.write("found // comment "+self.getText()+"\n");}
+    ;
+	
+STRING
+	:	'"' (options {greedy=false;}: ESC | .)* '"'
+	;
+
+CHAR
+	:	'\'' (options {greedy=false;}: ESC | .)* '\''
+	;
+
+WS  :   (' '|'\t'|'\n')+
+    ;
+
+fragment
+QID :	ID ('.' ID)*
+	;
+	
+/** QID cannot see beyond end of token so using QID '.*'? somewhere won't
+ *  ever match since k=1 lookahead in the QID loop of '.' will make it loop.
+ *  I made this rule to compensate.
+ */
+fragment
+QIDStar
+	:	ID ('.' ID)* '.*'?
+	;
+
+fragment
+TYPE:   QID '[]'?
+    ;
+    
+fragment
+ARG :   TYPE WS ID
+    ;
+
+fragment
+ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*
+    ;
+
+fragment
+ESC	:	'\\' ('"'|'\''|'\\')
+	;
diff --git a/runtime/Python3/tests/t021hoist.g b/runtime/Python3/tests/t021hoist.g
new file mode 100644
index 0000000..4b33c4f
--- /dev/null
+++ b/runtime/Python3/tests/t021hoist.g
@@ -0,0 +1,37 @@
+grammar t021hoist;
+options {
+    language=Python3;
+}
+
+/* With this true, enum is seen as a keyword.  False, it's an identifier */
+@parser::init {
+self.enableEnum = False
+}
+
+stat returns [enumIs]
+    : identifier    {enumIs = "ID"}
+    | enumAsKeyword {enumIs = "keyword"}
+    ;
+
+identifier
+    : ID
+    | enumAsID
+    ;
+
+enumAsKeyword : {self.enableEnum}? 'enum' ;
+
+enumAsID : {not self.enableEnum}? 'enum' ;
+
+ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
+    ;
+
+INT :	('0'..'9')+
+    ;
+
+WS  :   (   ' '
+        |   '\t'
+        |   '\r'
+        |   '\n'
+        )+
+        {$channel=HIDDEN}
+    ;    
diff --git a/runtime/Python3/tests/t021hoist.py b/runtime/Python3/tests/t021hoist.py
new file mode 100644
index 0000000..571a1de
--- /dev/null
+++ b/runtime/Python3/tests/t021hoist.py
@@ -0,0 +1,38 @@
+import os
+import sys
+import antlr3
+import testbase
+import unittest
+
+
+class t021hoist(testbase.ANTLRTest):
+    def setUp(self):
+        self.compileGrammar()
+        
+
+    def testValid1(self):
+        cStream = antlr3.StringStream('enum')
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+        parser.enableEnum = True
+        enumIs = parser.stat()
+
+        self.assertEqual(enumIs, 'keyword')
+
+
+    def testValid2(self):
+        cStream = antlr3.StringStream('enum')
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+        parser.enableEnum = False
+        enumIs = parser.stat()
+
+        self.assertEqual(enumIs, 'ID')
+
+
+
+if __name__ == '__main__':
+    unittest.main()
+
diff --git a/runtime/Python3/tests/t022scopes.g b/runtime/Python3/tests/t022scopes.g
new file mode 100644
index 0000000..fffeac5
--- /dev/null
+++ b/runtime/Python3/tests/t022scopes.g
@@ -0,0 +1,127 @@
+grammar t022scopes;
+
+options {
+    language=Python3;
+}
+
+/* global scopes */
+
+scope aScope {
+names
+}
+
+a
+scope aScope;
+    :   {$aScope::names = [];} ID*
+    ;
+
+
+/* rule scopes, from the book, final beta, p.147 */
+
+b[v]
+scope {x}
+    : {$b::x = v;} b2
+    ;
+
+b2
+    : b3
+    ;
+
+b3 
+    : {$b::x}?=> ID // only visible, if b was called with True
+    | NUM
+    ;
+
+
+/* rule scopes, from the book, final beta, p.148 */
+
+c returns [res]
+scope {
+    symbols
+}
+@init {
+    $c::symbols = set();
+}
+    : '{' c1* c2+ '}'
+        { $res = $c::symbols; }
+    ;
+
+c1
+    : 'int' ID {$c::symbols.add($ID.text)} ';'
+    ;
+
+c2
+    : ID '=' NUM ';'
+        {
+            if $ID.text not in $c::symbols:
+                raise RuntimeError($ID.text)
+        }
+    ;
+
+/* recursive rule scopes, from the book, final beta, p.150 */
+
+d returns [res]
+scope {
+    symbols
+}
+@init {
+    $d::symbols = set();
+}
+    : '{' d1* d2* '}'
+        { $res = $d::symbols; }
+    ;
+
+d1
+    : 'int' ID {$d::symbols.add($ID.text)} ';'
+    ;
+
+d2
+    : ID '=' NUM ';'
+        {
+            for s in reversed(range(len($d))):
+                if $ID.text in $d[s]::symbols:
+                    break
+            else:
+                raise RuntimeError($ID.text)
+        }
+    | d
+    ;
+
+/* recursive rule scopes, access bottom-most scope */
+
+e returns [res]
+scope {
+    a
+}
+@after {
+    $res = $e::a;
+}
+    : NUM { $e[0]::a = int($NUM.text); }
+    | '{' e '}'
+    ;
+
+
+/* recursive rule scopes, access with negative index */
+
+f returns [res]
+scope {
+    a
+}
+@after {
+    $res = $f::a;
+}
+    : NUM { $f[-2]::a = int($NUM.text); }
+    | '{' f '}'
+    ;
+
+
+/* tokens */
+
+ID  :   ('a'..'z')+
+    ;
+
+NUM :   ('0'..'9')+
+    ;
+
+WS  :   (' '|'\n'|'\r')+ {$channel=HIDDEN}
+    ;
diff --git a/runtime/Python3/tests/t022scopes.py b/runtime/Python3/tests/t022scopes.py
new file mode 100644
index 0000000..5dc1f2c
--- /dev/null
+++ b/runtime/Python3/tests/t022scopes.py
@@ -0,0 +1,159 @@
+import antlr3
+import testbase
+import unittest
+import textwrap
+
+
+class t022scopes(testbase.ANTLRTest):
+    def setUp(self):
+        self.compileGrammar()
+        
+
+    def parserClass(self, base):
+        class TParser(base):
+            def emitErrorMessage(self, msg):
+                # report errors to /dev/null
+                pass
+
+            def reportError(self, re):
+                # no error recovery yet, just crash!
+                raise re
+
+        return TParser
+
+        
+    def testa1(self):
+        cStream = antlr3.StringStream('foobar')
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+        parser.a()
+        
+
+    def testb1(self):
+        cStream = antlr3.StringStream('foobar')
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+
+        self.assertRaises(antlr3.RecognitionException, parser.b, False)
+        
+
+    def testb2(self):
+        cStream = antlr3.StringStream('foobar')
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+        parser.b(True)
+        
+
+    def testc1(self):
+        cStream = antlr3.StringStream(
+            textwrap.dedent('''\
+            {
+                int i;
+                int j;
+                i = 0;
+            }
+            '''))
+
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+        symbols = parser.c()
+
+        self.assertEqual(
+            symbols,
+            set(['i', 'j'])
+            )
+        
+
+    def testc2(self):
+        cStream = antlr3.StringStream(
+            textwrap.dedent('''\
+            {
+                int i;
+                int j;
+                i = 0;
+                x = 4;
+            }
+            '''))
+
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+
+        self.assertRaisesRegex(RuntimeError, r'x', parser.c)
+
+
+    def testd1(self):
+        cStream = antlr3.StringStream(
+            textwrap.dedent('''\
+            {
+                int i;
+                int j;
+                i = 0;
+                {
+                    int i;
+                    int x;
+                    x = 5;
+                }
+            }
+            '''))
+
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+        symbols = parser.d()
+
+        self.assertEqual(
+            symbols,
+            set(['i', 'j'])
+            )
+
+
+    def teste1(self):
+        cStream = antlr3.StringStream(
+            textwrap.dedent('''\
+            { { { { 12 } } } }
+            '''))
+
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+        res = parser.e()
+
+        self.assertEqual(res, 12)
+
+
+    def testf1(self):
+        cStream = antlr3.StringStream(
+            textwrap.dedent('''\
+            { { { { 12 } } } }
+            '''))
+
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+        res = parser.f()
+
+        self.assertIsNone(res)
+
+
+    def testf2(self):
+        cStream = antlr3.StringStream(
+            textwrap.dedent('''\
+            { { 12 } }
+            '''))
+
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+        res = parser.f()
+
+        self.assertIsNone(res)
+
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/runtime/Python3/tests/t023scopes.g b/runtime/Python3/tests/t023scopes.g
new file mode 100644
index 0000000..bc94b8d
--- /dev/null
+++ b/runtime/Python3/tests/t023scopes.g
@@ -0,0 +1,18 @@
+grammar t023scopes;
+
+options {
+    language=Python3;
+}
+
+prog
+scope {
+name
+}
+    :   ID {$prog::name=$ID.text;}
+    ;
+
+ID  :   ('a'..'z')+
+    ;
+
+WS  :   (' '|'\n'|'\r')+ {$channel=HIDDEN}
+    ;
diff --git a/runtime/Python3/tests/t023scopes.py b/runtime/Python3/tests/t023scopes.py
new file mode 100644
index 0000000..4c33b8a
--- /dev/null
+++ b/runtime/Python3/tests/t023scopes.py
@@ -0,0 +1,20 @@
+import antlr3
+import testbase
+import unittest
+
+
+class t023scopes(testbase.ANTLRTest):
+    def setUp(self):
+        self.compileGrammar()
+        
+
+    def testValid1(self):
+        cStream = antlr3.StringStream('foobar')
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+        parser.prog()
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/runtime/Python3/tests/t024finally.g b/runtime/Python3/tests/t024finally.g
new file mode 100644
index 0000000..a744de3
--- /dev/null
+++ b/runtime/Python3/tests/t024finally.g
@@ -0,0 +1,19 @@
+grammar t024finally;
+
+options {
+    language=Python3;
+}
+
+prog returns [events]
+@init {events = []}
+@after {events.append('after')}
+    :   ID {raise RuntimeError}
+    ;
+    catch [RuntimeError] {events.append('catch')}
+    finally {events.append('finally')}
+
+ID  :   ('a'..'z')+
+    ;
+
+WS  :   (' '|'\n'|'\r')+ {$channel=HIDDEN}
+    ;
diff --git a/runtime/Python3/tests/t024finally.py b/runtime/Python3/tests/t024finally.py
new file mode 100644
index 0000000..24d0b71
--- /dev/null
+++ b/runtime/Python3/tests/t024finally.py
@@ -0,0 +1,23 @@
+import antlr3
+import testbase
+import unittest
+
+
+class t024finally(testbase.ANTLRTest):
+    def setUp(self):
+        self.compileGrammar()
+        
+
+    def testValid1(self):
+        cStream = antlr3.StringStream('foobar')
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+        events = parser.prog()
+
+        self.assertEqual(events, ['catch', 'finally'])
+
+
+if __name__ == '__main__':
+    unittest.main()
+
diff --git a/runtime/Python3/tests/t025lexerRulePropertyRef.g b/runtime/Python3/tests/t025lexerRulePropertyRef.g
new file mode 100644
index 0000000..0509375
--- /dev/null
+++ b/runtime/Python3/tests/t025lexerRulePropertyRef.g
@@ -0,0 +1,18 @@
+lexer grammar t025lexerRulePropertyRef;
+options {
+  language = Python3;
+}
+
+@lexer::init {
+self.properties = []
+}
+
+IDENTIFIER: 
+        ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
+        {
+self.properties.append(
+    ($text, $type, $line, $pos, $index, $channel, $start, $stop)
+)
+        }
+    ;
+WS: (' ' | '\n')+;
diff --git a/runtime/Python3/tests/t025lexerRulePropertyRef.py b/runtime/Python3/tests/t025lexerRulePropertyRef.py
new file mode 100644
index 0000000..5b23c25
--- /dev/null
+++ b/runtime/Python3/tests/t025lexerRulePropertyRef.py
@@ -0,0 +1,54 @@
+import antlr3
+import testbase
+import unittest
+
+
+class t025lexerRulePropertyRef(testbase.ANTLRTest):
+    def setUp(self):
+        self.compileGrammar()
+        
+
+    def testValid1(self):
+        stream = antlr3.StringStream('foobar _Ab98 \n A12sdf')
+        lexer = self.getLexer(stream)
+
+        while True:
+            token = lexer.nextToken()
+            if token.type == antlr3.EOF:
+                break
+
+        self.assertEqual(len(lexer.properties), 3, lexer.properties)
+
+        text, type, line, pos, index, channel, start, stop = lexer.properties[0]
+        self.assertEqual(text, 'foobar', lexer.properties[0])
+        self.assertEqual(type, self.lexerModule.IDENTIFIER, lexer.properties[0])
+        self.assertEqual(line, 1, lexer.properties[0])
+        self.assertEqual(pos, 0, lexer.properties[0])
+        self.assertEqual(index, -1, lexer.properties[0])
+        self.assertEqual(channel, antlr3.DEFAULT_CHANNEL, lexer.properties[0])
+        self.assertEqual(start, 0, lexer.properties[0])
+        self.assertEqual(stop, 5, lexer.properties[0])
+
+        text, type, line, pos, index, channel, start, stop = lexer.properties[1]
+        self.assertEqual(text, '_Ab98', lexer.properties[1])
+        self.assertEqual(type, self.lexerModule.IDENTIFIER, lexer.properties[1])
+        self.assertEqual(line, 1, lexer.properties[1])
+        self.assertEqual(pos, 7, lexer.properties[1])
+        self.assertEqual(index, -1, lexer.properties[1])
+        self.assertEqual(channel, antlr3.DEFAULT_CHANNEL, lexer.properties[1])
+        self.assertEqual(start, 7, lexer.properties[1])
+        self.assertEqual(stop, 11, lexer.properties[1])
+
+        text, type, line, pos, index, channel, start, stop = lexer.properties[2]
+        self.assertEqual(text, 'A12sdf', lexer.properties[2])
+        self.assertEqual(type, self.lexerModule.IDENTIFIER, lexer.properties[2])
+        self.assertEqual(line, 2, lexer.properties[2])
+        self.assertEqual(pos, 1, lexer.properties[2])
+        self.assertEqual(index, -1, lexer.properties[2])
+        self.assertEqual(channel, antlr3.DEFAULT_CHANNEL, lexer.properties[2])
+        self.assertEqual(start, 15, lexer.properties[2])
+        self.assertEqual(stop, 20, lexer.properties[2])
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/runtime/Python3/tests/t026actions.g b/runtime/Python3/tests/t026actions.g
new file mode 100644
index 0000000..124be34
--- /dev/null
+++ b/runtime/Python3/tests/t026actions.g
@@ -0,0 +1,39 @@
+grammar t026actions;
+options {
+  language = Python3;
+}
+
+@lexer::init {
+    self.foobar = 'attribute;'
+}
+
+prog
+@init {
+    self.capture('init;')
+}
+@after {
+    self.capture('after;')
+}
+    :   IDENTIFIER EOF
+    ;
+    catch [ RecognitionException as exc ] {
+        self.capture('catch;')
+        raise
+    }
+    finally {
+        self.capture('finally;')
+    }
+
+
+IDENTIFIER
+    : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
+        {
+            # a comment
+          self.capture('action;')
+            self.capture('{!r} {!r} {!r} {!r} {!r} {!r} {!r} {!r};'.format($text, $type, $line, $pos, $index, $channel, $start, $stop))
+            if True:
+                self.capture(self.foobar)
+        }
+    ;
+
+WS: (' ' | '\n')+;
diff --git a/runtime/Python3/tests/t026actions.py b/runtime/Python3/tests/t026actions.py
new file mode 100644
index 0000000..20dc88b
--- /dev/null
+++ b/runtime/Python3/tests/t026actions.py
@@ -0,0 +1,68 @@
+import antlr3
+import testbase
+import unittest
+
+
+class t026actions(testbase.ANTLRTest):
+    def parserClass(self, base):
+        class TParser(base):
+            def __init__(self, *args, **kwargs):
+                super().__init__(*args, **kwargs)
+
+                self._errors = []
+                self._output = ""
+
+
+            def capture(self, t):
+                self._output += t
+
+
+            def emitErrorMessage(self, msg):
+                self._errors.append(msg)
+
+            
+        return TParser
+
+
+    def lexerClass(self, base):
+        class TLexer(base):
+            def __init__(self, *args, **kwargs):
+                super().__init__(*args, **kwargs)
+
+                self._errors = []
+                self._output = ""
+
+
+            def capture(self, t):
+                self._output += t
+
+
+            def emitErrorMessage(self, msg):
+                self._errors.append(msg)
+
+            
+        return TLexer
+
+
+    def setUp(self):
+        self.compileGrammar()
+        
+
+    def testValid1(self):
+        cStream = antlr3.StringStream('foobar _Ab98 \n A12sdf')
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+        parser.prog()
+
+        self.assertEqual(
+            parser._output,
+            'init;after;finally;')
+        self.assertEqual(
+            lexer._output,
+            "action;'foobar' 4 1 0 -1 0 0 5;attribute;action;"
+            "'_Ab98' 4 1 7 -1 0 7 11;attribute;action;"
+            "'A12sdf' 4 2 1 -1 0 15 20;attribute;")
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/runtime/Python3/tests/t027eof.g b/runtime/Python3/tests/t027eof.g
new file mode 100644
index 0000000..5c633a2
--- /dev/null
+++ b/runtime/Python3/tests/t027eof.g
@@ -0,0 +1,8 @@
+lexer grammar t027eof;
+
+options {
+    language=Python3;
+}
+
+END: EOF;
+SPACE: ' ';
diff --git a/runtime/Python3/tests/t027eof.py b/runtime/Python3/tests/t027eof.py
new file mode 100644
index 0000000..cf543b5
--- /dev/null
+++ b/runtime/Python3/tests/t027eof.py
@@ -0,0 +1,25 @@
+import antlr3
+import testbase
+import unittest
+
+
+class t027eof(testbase.ANTLRTest):
+    def setUp(self):
+        self.compileGrammar()
+        
+
+    @testbase.broken("That's not how EOF is supposed to be used", Exception)
+    def testValid1(self):
+        cStream = antlr3.StringStream(' ')
+        lexer = self.getLexer(cStream)
+        
+        tok = lexer.nextToken()
+        self.assertEqual(tok.type, self.lexerModule.SPACE, tok)
+        
+        tok = lexer.nextToken()
+        self.assertEqual(tok.type, self.lexerModule.END, tok)
+
+
+if __name__ == '__main__':
+    unittest.main()
+
diff --git a/runtime/Python3/tests/t028labelExpr.g.disabled b/runtime/Python3/tests/t028labelExpr.g.disabled
new file mode 100644
index 0000000..d3ba76c
--- /dev/null
+++ b/runtime/Python3/tests/t028labelExpr.g.disabled
@@ -0,0 +1,5 @@
+lexer grammar t028labelExpr;
+ETAGO: ('</a')=> '</';
+MDO: {True}? ('<!a')=> '<!';
+STAGO: {True}? ('<a')=> '<';
+CDATA: '<';
diff --git a/runtime/Python3/tests/t029synpredgate.g b/runtime/Python3/tests/t029synpredgate.g
new file mode 100644
index 0000000..169892a
--- /dev/null
+++ b/runtime/Python3/tests/t029synpredgate.g
@@ -0,0 +1,16 @@
+lexer grammar t029synpredgate;
+options {
+  language = Python3;
+}
+
+FOO
+    : ('ab')=> A
+    | ('ac')=> B
+    ;
+
+fragment
+A: 'a';
+
+fragment
+B: 'a';
+
diff --git a/runtime/Python3/tests/t029synpredgate.py b/runtime/Python3/tests/t029synpredgate.py
new file mode 100644
index 0000000..b658688
--- /dev/null
+++ b/runtime/Python3/tests/t029synpredgate.py
@@ -0,0 +1,21 @@
+import antlr3
+import testbase
+import unittest
+
+
+class t029synpredgate(testbase.ANTLRTest):
+    def setUp(self):
+        self.compileGrammar()
+        
+
+    def testValid1(self):
+        stream = antlr3.StringStream('ac')
+        lexer = self.getLexer(stream)
+        token = lexer.nextToken()
+
+
+if __name__ == '__main__':
+    unittest.main()
+
+
+
diff --git a/runtime/Python3/tests/t030specialStates.g b/runtime/Python3/tests/t030specialStates.g
new file mode 100644
index 0000000..51451c4
--- /dev/null
+++ b/runtime/Python3/tests/t030specialStates.g
@@ -0,0 +1,26 @@
+grammar t030specialStates;
+options {
+  language = Python3;
+}
+
+@init {
+self.cond = True
+}
+
+@members {
+def recover(self, input, re):
+    # no error recovery yet, just crash!
+    raise re
+}
+
+r
+    : ( {self.cond}? NAME
+        | {not self.cond}? NAME WS+ NAME
+        )
+        ( WS+ NAME )?
+        EOF
+    ;
+
+NAME: ('a'..'z') ('a'..'z' | '0'..'9')+;
+NUMBER: ('0'..'9')+;
+WS: ' '+;
diff --git a/runtime/Python3/tests/t030specialStates.py b/runtime/Python3/tests/t030specialStates.py
new file mode 100644
index 0000000..86c4f7c
--- /dev/null
+++ b/runtime/Python3/tests/t030specialStates.py
@@ -0,0 +1,47 @@
+import antlr3
+import testbase
+import unittest
+
+
+class t030specialStates(testbase.ANTLRTest):
+    def setUp(self):
+        self.compileGrammar()
+        
+
+    def testValid1(self):
+        cStream = antlr3.StringStream('foo')
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+        events = parser.r()
+
+
+    def testValid2(self):
+        cStream = antlr3.StringStream('foo name1')
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+        events = parser.r()
+
+
+    def testValid3(self):
+        cStream = antlr3.StringStream('bar name1')
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+        parser.cond = False
+        events = parser.r()
+
+
+    def testValid4(self):
+        cStream = antlr3.StringStream('bar name1 name2')
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+        parser.cond = False
+        events = parser.r()
+
+
+if __name__ == '__main__':
+    unittest.main()
+
diff --git a/runtime/Python3/tests/t031emptyAlt.g b/runtime/Python3/tests/t031emptyAlt.g
new file mode 100644
index 0000000..de7d46e
--- /dev/null
+++ b/runtime/Python3/tests/t031emptyAlt.g
@@ -0,0 +1,16 @@
+grammar t031emptyAlt;
+options {
+  language = Python3;
+}
+
+r
+    : NAME 
+        ( {self.cond}?=> WS+ NAME
+        | 
+        )
+        EOF
+    ;
+
+NAME: ('a'..'z') ('a'..'z' | '0'..'9')+;
+NUMBER: ('0'..'9')+;
+WS: ' '+;
diff --git a/runtime/Python3/tests/t031emptyAlt.py b/runtime/Python3/tests/t031emptyAlt.py
new file mode 100644
index 0000000..fcae8e1
--- /dev/null
+++ b/runtime/Python3/tests/t031emptyAlt.py
@@ -0,0 +1,21 @@
+import antlr3
+import testbase
+import unittest
+
+
+class t031emptyAlt(testbase.ANTLRTest):
+    def setUp(self):
+        self.compileGrammar()
+        
+
+    def testValid1(self):
+        cStream = antlr3.StringStream('foo')
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+        events = parser.r()
+
+
+if __name__ == '__main__':
+    unittest.main()
+
diff --git a/runtime/Python3/tests/t032subrulePredict.g b/runtime/Python3/tests/t032subrulePredict.g
new file mode 100644
index 0000000..557f51f
--- /dev/null
+++ b/runtime/Python3/tests/t032subrulePredict.g
@@ -0,0 +1,8 @@
+grammar t032subrulePredict;
+options {
+  language = Python3;
+}
+
+a: 'BEGIN' b WS+ 'END';
+b: ( WS+ 'A' )+;
+WS: ' ';
diff --git a/runtime/Python3/tests/t032subrulePredict.py b/runtime/Python3/tests/t032subrulePredict.py
new file mode 100644
index 0000000..7b62add
--- /dev/null
+++ b/runtime/Python3/tests/t032subrulePredict.py
@@ -0,0 +1,44 @@
+import antlr3
+import testbase
+import unittest
+
+
+class t032subrulePredict(testbase.ANTLRTest):
+    def setUp(self):
+        self.compileGrammar()
+        
+
+    def parserClass(self, base):
+        class TParser(base):
+            def recover(self, input, re):
+                # no error recovery yet, just crash!
+                raise
+
+        return TParser
+    
+        
+    def testValid1(self):
+        cStream = antlr3.StringStream(
+            'BEGIN A END'
+            )
+
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+        events = parser.a()
+
+
+    @testbase.broken("DFA tries to look beyond end of rule b", Exception)
+    def testValid2(self):
+        cStream = antlr3.StringStream(
+            ' A'
+            )
+
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+        events = parser.b()
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/runtime/Python3/tests/t033backtracking.g b/runtime/Python3/tests/t033backtracking.g
new file mode 100644
index 0000000..447fac3
--- /dev/null
+++ b/runtime/Python3/tests/t033backtracking.g
@@ -0,0 +1,515 @@
+grammar t033backtracking;
+options {
+    language=Python3;
+    backtrack=true;
+    memoize=true;
+    k=2;
+}
+
+scope Symbols {
+	types;
+}
+
+@members {
+    def isTypeName(self, name):
+        for scope in reversed(self.Symbols_stack):
+            if name in scope.types:
+                return True
+
+        return False
+
+}
+
+translation_unit
+scope Symbols; // entire file is a scope
+@init {
+  $Symbols::types = set()
+}
+	: external_declaration+
+	;
+
+/** Either a function definition or any other kind of C decl/def.
+ *  The LL(*) analysis algorithm fails to deal with this due to
+ *  recursion in the declarator rules.  I'm putting in a
+ *  manual predicate here so that we don't backtrack over
+ *  the entire function.  Further, you get a better error
+ *  as errors within the function itself don't make it fail
+ *  to predict that it's a function.  Weird errors previously.
+ *  Remember: the goal is to avoid backtrack like the plague
+ *  because it makes debugging, actions, and errors harder.
+ *
+ *  Note that k=1 results in a much smaller predictor for the 
+ *  fixed lookahead; k=2 made a few extra thousand lines. ;)
+ *  I'll have to optimize that in the future.
+ */
+external_declaration
+options {k=1;}
+	: ( declaration_specifiers? declarator declaration* '{' )=> function_definition
+	| declaration
+	;
+
+function_definition
+scope Symbols; // put parameters and locals into same scope for now
+@init {
+  $Symbols::types = set()
+}
+	:	declaration_specifiers? declarator
+// 		(	declaration+ compound_statement	// K&R style
+// 		|	compound_statement				// ANSI style
+// 		)
+	;
+
+declaration
+scope {
+  isTypedef;
+}
+@init {
+  $declaration::isTypedef = False
+}
+	: 'typedef' declaration_specifiers? {$declaration::isTypedef = True}
+	  init_declarator_list ';' // special case, looking for typedef	
+	| declaration_specifiers init_declarator_list? ';'
+	;
+
+declaration_specifiers
+	:   (   storage_class_specifier
+		|   type_specifier
+        |   type_qualifier
+        )+
+	;
+
+init_declarator_list
+	: init_declarator (',' init_declarator)*
+	;
+
+init_declarator
+	: declarator //('=' initializer)?
+	;
+
+storage_class_specifier
+	: 'extern'
+	| 'static'
+	| 'auto'
+	| 'register'
+	;
+
+type_specifier
+	: 'void'
+	| 'char'
+	| 'short'
+	| 'int'
+	| 'long'
+	| 'float'
+	| 'double'
+	| 'signed'
+	| 'unsigned'
+// 	| struct_or_union_specifier
+// 	| enum_specifier
+	| type_id
+	;
+
+type_id
+    :   {self.isTypeName(self.input.LT(1).getText())}? IDENTIFIER
+//    	{System.out.println($IDENTIFIER.text+" is a type");}
+    ;
+
+// struct_or_union_specifier
+// options {k=3;}
+// scope Symbols; // structs are scopes
+// @init {
+//   $Symbols::types = set()
+// }
+// 	: struct_or_union IDENTIFIER? '{' struct_declaration_list '}'
+// 	| struct_or_union IDENTIFIER
+// 	;
+
+// struct_or_union
+// 	: 'struct'
+// 	| 'union'
+// 	;
+
+// struct_declaration_list
+// 	: struct_declaration+
+// 	;
+
+// struct_declaration
+// 	: specifier_qualifier_list struct_declarator_list ';'
+// 	;
+
+// specifier_qualifier_list
+// 	: ( type_qualifier | type_specifier )+
+// 	;
+
+// struct_declarator_list
+// 	: struct_declarator (',' struct_declarator)*
+// 	;
+
+// struct_declarator
+// 	: declarator (':' constant_expression)?
+// 	| ':' constant_expression
+// 	;
+
+// enum_specifier
+// options {k=3;}
+// 	: 'enum' '{' enumerator_list '}'
+// 	| 'enum' IDENTIFIER '{' enumerator_list '}'
+// 	| 'enum' IDENTIFIER
+// 	;
+
+// enumerator_list
+// 	: enumerator (',' enumerator)*
+// 	;
+
+// enumerator
+// 	: IDENTIFIER ('=' constant_expression)?
+// 	;
+
+type_qualifier
+	: 'const'
+	| 'volatile'
+	;
+
+declarator
+	: pointer? direct_declarator
+	| pointer
+	;
+
+direct_declarator
+	:   (	IDENTIFIER
+			{
+			if $declaration and $declaration::isTypedef:
+				$Symbols::types.add($IDENTIFIER.text)
+				print("define type "+$IDENTIFIER.text)
+			}
+		|	'(' declarator ')'
+		)
+        declarator_suffix*
+	;
+
+declarator_suffix
+	:   /*'[' constant_expression ']'
+    |*/   '[' ']'
+//     |   '(' parameter_type_list ')'
+//     |   '(' identifier_list ')'
+    |   '(' ')'
+	;
+
+pointer
+	: '*' type_qualifier+ pointer?
+	| '*' pointer
+	| '*'
+	;
+
+// parameter_type_list
+// 	: parameter_list (',' '...')?
+// 	;
+
+// parameter_list
+// 	: parameter_declaration (',' parameter_declaration)*
+// 	;
+
+// parameter_declaration
+// 	: declaration_specifiers (declarator|abstract_declarator)*
+// 	;
+
+// identifier_list
+// 	: IDENTIFIER (',' IDENTIFIER)*
+// 	;
+
+// type_name
+// 	: specifier_qualifier_list abstract_declarator?
+// 	;
+
+// abstract_declarator
+// 	: pointer direct_abstract_declarator?
+// 	| direct_abstract_declarator
+// 	;
+
+// direct_abstract_declarator
+// 	:	( '(' abstract_declarator ')' | abstract_declarator_suffix ) abstract_declarator_suffix*
+// 	;
+
+// abstract_declarator_suffix
+// 	:	'[' ']'
+// 	|	'[' constant_expression ']'
+// 	|	'(' ')'
+// 	|	'(' parameter_type_list ')'
+// 	;
+	
+// initializer
+// 	: assignment_expression
+// 	| '{' initializer_list ','? '}'
+// 	;
+
+// initializer_list
+// 	: initializer (',' initializer)*
+// 	;
+
+// // E x p r e s s i o n s
+
+// argument_expression_list
+// 	:   assignment_expression (',' assignment_expression)*
+// 	;
+
+// additive_expression
+// 	: (multiplicative_expression) ('+' multiplicative_expression | '-' multiplicative_expression)*
+// 	;
+
+// multiplicative_expression
+// 	: (cast_expression) ('*' cast_expression | '/' cast_expression | '%' cast_expression)*
+// 	;
+
+// cast_expression
+// 	: '(' type_name ')' cast_expression
+// 	| unary_expression
+// 	;
+
+// unary_expression
+// 	: postfix_expression
+// 	| '++' unary_expression
+// 	| '--' unary_expression
+// 	| unary_operator cast_expression
+// 	| 'sizeof' unary_expression
+// 	| 'sizeof' '(' type_name ')'
+// 	;
+
+// postfix_expression
+// 	:   primary_expression
+//         (   '[' expression ']'
+//         |   '(' ')'
+//         |   '(' argument_expression_list ')'
+//         |   '.' IDENTIFIER
+//         |   '*' IDENTIFIER
+//         |   '->' IDENTIFIER
+//         |   '++'
+//         |   '--'
+//         )*
+// 	;
+
+// unary_operator
+// 	: '&'
+// 	| '*'
+// 	| '+'
+// 	| '-'
+// 	| '~'
+// 	| '!'
+// 	;
+
+// primary_expression
+// 	: IDENTIFIER
+// 	| constant
+// 	| '(' expression ')'
+// 	;
+
+// constant
+//     :   HEX_LITERAL
+//     |   OCTAL_LITERAL
+//     |   DECIMAL_LITERAL
+//     |	CHARACTER_LITERAL
+// 	|	STRING_LITERAL
+//     |   FLOATING_POINT_LITERAL
+//     ;
+
+// /////
+
+// expression
+// 	: assignment_expression (',' assignment_expression)*
+// 	;
+
+// constant_expression
+// 	: conditional_expression
+// 	;
+
+// assignment_expression
+// 	: lvalue assignment_operator assignment_expression
+// 	| conditional_expression
+// 	;
+	
+// lvalue
+// 	:	unary_expression
+// 	;
+
+// assignment_operator
+// 	: '='
+// 	| '*='
+// 	| '/='
+// 	| '%='
+// 	| '+='
+// 	| '-='
+// 	| '<<='
+// 	| '>>='
+// 	| '&='
+// 	| '^='
+// 	| '|='
+// 	;
+
+// conditional_expression
+// 	: logical_or_expression ('?' expression ':' conditional_expression)?
+// 	;
+
+// logical_or_expression
+// 	: logical_and_expression ('||' logical_and_expression)*
+// 	;
+
+// logical_and_expression
+// 	: inclusive_or_expression ('&&' inclusive_or_expression)*
+// 	;
+
+// inclusive_or_expression
+// 	: exclusive_or_expression ('|' exclusive_or_expression)*
+// 	;
+
+// exclusive_or_expression
+// 	: and_expression ('^' and_expression)*
+// 	;
+
+// and_expression
+// 	: equality_expression ('&' equality_expression)*
+// 	;
+// equality_expression
+// 	: relational_expression (('=='|'!=') relational_expression)*
+// 	;
+
+// relational_expression
+// 	: shift_expression (('<'|'>'|'<='|'>=') shift_expression)*
+// 	;
+
+// shift_expression
+// 	: additive_expression (('<<'|'>>') additive_expression)*
+// 	;
+
+// // S t a t e m e n t s
+
+// statement
+// 	: labeled_statement
+// 	| compound_statement
+// 	| expression_statement
+// 	| selection_statement
+// 	| iteration_statement
+// 	| jump_statement
+// 	;
+
+// labeled_statement
+// 	: IDENTIFIER ':' statement
+// 	| 'case' constant_expression ':' statement
+// 	| 'default' ':' statement
+// 	;
+
+// compound_statement
+// scope Symbols; // blocks have a scope of symbols
+// @init {
+//   $Symbols::types = {}
+// }
+// 	: '{' declaration* statement_list? '}'
+// 	;
+
+// statement_list
+// 	: statement+
+// 	;
+
+// expression_statement
+// 	: ';'
+// 	| expression ';'
+// 	;
+
+// selection_statement
+// 	: 'if' '(' expression ')' statement (options {k=1; backtrack=false;}:'else' statement)?
+// 	| 'switch' '(' expression ')' statement
+// 	;
+
+// iteration_statement
+// 	: 'while' '(' expression ')' statement
+// 	| 'do' statement 'while' '(' expression ')' ';'
+// 	| 'for' '(' expression_statement expression_statement expression? ')' statement
+// 	;
+
+// jump_statement
+// 	: 'goto' IDENTIFIER ';'
+// 	| 'continue' ';'
+// 	| 'break' ';'
+// 	| 'return' ';'
+// 	| 'return' expression ';'
+// 	;
+
+IDENTIFIER
+	:	LETTER (LETTER|'0'..'9')*
+	;
+	
+fragment
+LETTER
+	:	'$'
+	|	'A'..'Z'
+	|	'a'..'z'
+	|	'_'
+	;
+
+CHARACTER_LITERAL
+    :   '\'' ( EscapeSequence | ~('\''|'\\') ) '\''
+    ;
+
+STRING_LITERAL
+    :  '"' ( EscapeSequence | ~('\\'|'"') )* '"'
+    ;
+
+HEX_LITERAL : '0' ('x'|'X') HexDigit+ IntegerTypeSuffix? ;
+
+DECIMAL_LITERAL : ('0' | '1'..'9' '0'..'9'*) IntegerTypeSuffix? ;
+
+OCTAL_LITERAL : '0' ('0'..'7')+ IntegerTypeSuffix? ;
+
+fragment
+HexDigit : ('0'..'9'|'a'..'f'|'A'..'F') ;
+
+fragment
+IntegerTypeSuffix
+	:	('u'|'U')? ('l'|'L')
+	|	('u'|'U')  ('l'|'L')?
+	;
+
+FLOATING_POINT_LITERAL
+    :   ('0'..'9')+ '.' ('0'..'9')* Exponent? FloatTypeSuffix?
+    |   '.' ('0'..'9')+ Exponent? FloatTypeSuffix?
+    |   ('0'..'9')+ Exponent FloatTypeSuffix?
+    |   ('0'..'9')+ Exponent? FloatTypeSuffix
+	;
+
+fragment
+Exponent : ('e'|'E') ('+'|'-')? ('0'..'9')+ ;
+
+fragment
+FloatTypeSuffix : ('f'|'F'|'d'|'D') ;
+
+fragment
+EscapeSequence
+    :   '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
+    |   OctalEscape
+    ;
+
+fragment
+OctalEscape
+    :   '\\' ('0'..'3') ('0'..'7') ('0'..'7')
+    |   '\\' ('0'..'7') ('0'..'7')
+    |   '\\' ('0'..'7')
+    ;
+
+fragment
+UnicodeEscape
+    :   '\\' 'u' HexDigit HexDigit HexDigit HexDigit
+    ;
+
+WS  :  (' '|'\r'|'\t'|'\u000C'|'\n') {$channel=HIDDEN;}
+    ;
+
+COMMENT
+    :   '/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;}
+    ;
+
+LINE_COMMENT
+    : '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}
+    ;
+
+// ignore #line info for now
+LINE_COMMAND 
+    : '#' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}
+    ;
+
diff --git a/runtime/Python3/tests/t033backtracking.py b/runtime/Python3/tests/t033backtracking.py
new file mode 100644
index 0000000..8b5c66a
--- /dev/null
+++ b/runtime/Python3/tests/t033backtracking.py
@@ -0,0 +1,31 @@
+import antlr3
+import testbase
+import unittest
+
+
+class t033backtracking(testbase.ANTLRTest):
+    def setUp(self):
+        self.compileGrammar()
+
+
+    def parserClass(self, base):
+        class TParser(base):
+            def recover(self, input, re):
+                # no error recovery yet, just crash!
+                raise
+
+        return TParser
+
+
+    @testbase.broken("Some bug in the tool", SyntaxError)
+    def testValid1(self):
+        cStream = antlr3.StringStream('int a;')
+
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+        events = parser.translation_unit()
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/runtime/Python3/tests/t034tokenLabelPropertyRef.g b/runtime/Python3/tests/t034tokenLabelPropertyRef.g
new file mode 100644
index 0000000..5a0a35e
--- /dev/null
+++ b/runtime/Python3/tests/t034tokenLabelPropertyRef.g
@@ -0,0 +1,30 @@
+grammar t034tokenLabelPropertyRef;
+options {
+  language = Python3;
+}
+
+a: t=A
+        {
+            print($t.text)
+            print($t.type)
+            print($t.line)
+            print($t.pos)
+            print($t.channel)
+            print($t.index)
+            #print($t.tree)
+        }
+    ;
+
+A: 'a'..'z';
+
+WS  :
+        (   ' '
+        |   '\t'
+        |  ( '\n'
+            |	'\r\n'
+            |	'\r'
+            )
+        )+
+        { $channel = HIDDEN }
+    ;    
+
diff --git a/runtime/Python3/tests/t034tokenLabelPropertyRef.py b/runtime/Python3/tests/t034tokenLabelPropertyRef.py
new file mode 100644
index 0000000..b94de13
--- /dev/null
+++ b/runtime/Python3/tests/t034tokenLabelPropertyRef.py
@@ -0,0 +1,40 @@
+import antlr3
+import testbase
+import unittest
+
+
+class t034tokenLabelPropertyRef(testbase.ANTLRTest):
+    def setUp(self):
+        self.compileGrammar()
+        
+
+    def lexerClass(self, base):
+        class TLexer(base):
+            def recover(self, input, re):
+                # no error recovery yet, just crash!
+                raise
+
+        return TLexer
+    
+        
+    def parserClass(self, base):
+        class TParser(base):
+            def recover(self, input, re):
+                # no error recovery yet, just crash!
+                raise
+
+        return TParser
+    
+        
+    def testValid1(self):
+        cStream = antlr3.StringStream('   a')
+
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+        events = parser.a()
+
+
+if __name__ == '__main__':
+    unittest.main()
+
diff --git a/runtime/Python3/tests/t035ruleLabelPropertyRef.g b/runtime/Python3/tests/t035ruleLabelPropertyRef.g
new file mode 100644
index 0000000..3725d34
--- /dev/null
+++ b/runtime/Python3/tests/t035ruleLabelPropertyRef.g
@@ -0,0 +1,16 @@
+grammar t035ruleLabelPropertyRef;
+options {
+  language = Python3;
+}
+
+a returns [bla]: t=b
+        {
+            $bla = $t.start, $t.stop, $t.text
+        }
+    ;
+
+b: A+;
+
+A: 'a'..'z';
+
+WS: ' '+  { $channel = HIDDEN };
diff --git a/runtime/Python3/tests/t035ruleLabelPropertyRef.py b/runtime/Python3/tests/t035ruleLabelPropertyRef.py
new file mode 100644
index 0000000..3347801
--- /dev/null
+++ b/runtime/Python3/tests/t035ruleLabelPropertyRef.py
@@ -0,0 +1,47 @@
+import antlr3
+import testbase
+import unittest
+
+
+class t035ruleLabelPropertyRef(testbase.ANTLRTest):
+    def setUp(self):
+        self.compileGrammar()
+        
+
+    def lexerClass(self, base):
+        class TLexer(base):
+            def recover(self, input, re):
+                # no error recovery yet, just crash!
+                raise
+
+        return TLexer
+    
+        
+    def parserClass(self, base):
+        class TParser(base):
+            def recover(self, input, re):
+                # no error recovery yet, just crash!
+                raise
+
+        return TParser
+    
+        
+    def testValid1(self):
+        cStream = antlr3.StringStream('   a a a a  ')
+
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+        start, stop, text = parser.a()
+
+        # first token of rule b is the 2nd token (counting hidden tokens)
+        self.assertEqual(start.index, 1, start)
+
+        # first token of rule b is the 7th token (counting hidden tokens)
+        self.assertEqual(stop.index, 7, stop)
+
+        self.assertEqual(text, "a a a a")
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/runtime/Python3/tests/t036multipleReturnValues.g b/runtime/Python3/tests/t036multipleReturnValues.g
new file mode 100644
index 0000000..a3fc8a3
--- /dev/null
+++ b/runtime/Python3/tests/t036multipleReturnValues.g
@@ -0,0 +1,25 @@
+grammar t036multipleReturnValues;
+options {
+  language = Python3;
+}
+
+a returns [foo, bar]: A
+        {
+            $foo = "foo";
+            $bar = "bar";
+        }
+    ;
+
+A: 'a'..'z';
+
+WS  :
+        (   ' '
+        |   '\t'
+        |  ( '\n'
+            |	'\r\n'
+            |	'\r'
+            )
+        )+
+        { $channel = HIDDEN }
+    ;    
+
diff --git a/runtime/Python3/tests/t036multipleReturnValues.py b/runtime/Python3/tests/t036multipleReturnValues.py
new file mode 100644
index 0000000..8dd65be
--- /dev/null
+++ b/runtime/Python3/tests/t036multipleReturnValues.py
@@ -0,0 +1,43 @@
+import antlr3
+import testbase
+import unittest
+
+
+class t036multipleReturnValues(testbase.ANTLRTest):
+    def setUp(self):
+        self.compileGrammar()
+        
+
+    def lexerClass(self, base):
+        class TLexer(base):
+            def recover(self, input, re):
+                # no error recovery yet, just crash!
+                raise
+
+        return TLexer
+    
+        
+    def parserClass(self, base):
+        class TParser(base):
+            def recover(self, input, re):
+                # no error recovery yet, just crash!
+                raise
+
+        return TParser
+    
+        
+    def testValid1(self):
+        cStream = antlr3.StringStream('   a')
+
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+        ret = parser.a()
+        self.assertEqual(ret.foo, 'foo')
+        self.assertEqual(ret.bar, 'bar')
+
+
+if __name__ == '__main__':
+    unittest.main()
+
+
diff --git a/runtime/Python3/tests/t037rulePropertyRef.g b/runtime/Python3/tests/t037rulePropertyRef.g
new file mode 100644
index 0000000..2069db1
--- /dev/null
+++ b/runtime/Python3/tests/t037rulePropertyRef.g
@@ -0,0 +1,15 @@
+grammar t037rulePropertyRef;
+options {
+  language = Python3;
+}
+
+a returns [bla]
+@after {
+    $bla = $start, $stop, $text
+}
+    : A+
+    ;
+
+A: 'a'..'z';
+
+WS: ' '+  { $channel = HIDDEN };
diff --git a/runtime/Python3/tests/t037rulePropertyRef.py b/runtime/Python3/tests/t037rulePropertyRef.py
new file mode 100644
index 0000000..bba4f3c
--- /dev/null
+++ b/runtime/Python3/tests/t037rulePropertyRef.py
@@ -0,0 +1,47 @@
+import antlr3
+import testbase
+import unittest
+
+
+class t037rulePropertyRef(testbase.ANTLRTest):
+    def setUp(self):
+        self.compileGrammar()
+        
+
+    def lexerClass(self, base):
+        class TLexer(base):
+            def recover(self, input, re):
+                # no error recovery yet, just crash!
+                raise
+
+        return TLexer
+    
+        
+    def parserClass(self, base):
+        class TParser(base):
+            def recover(self, input, re):
+                # no error recovery yet, just crash!
+                raise
+
+        return TParser
+    
+        
+    def testValid1(self):
+        cStream = antlr3.StringStream('   a a a a  ')
+
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+        start, stop, text = parser.a().bla
+
+        # first token of rule b is the 2nd token (counting hidden tokens)
+        self.assertEqual(start.index, 1, start)
+        
+        # first token of rule b is the 7th token (counting hidden tokens)
+        self.assertEqual(stop.index, 7, stop)
+
+        self.assertEqual(text, "a a a a")
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/runtime/Python3/tests/t038lexerRuleLabel.g b/runtime/Python3/tests/t038lexerRuleLabel.g
new file mode 100644
index 0000000..8a6967d
--- /dev/null
+++ b/runtime/Python3/tests/t038lexerRuleLabel.g
@@ -0,0 +1,28 @@
+lexer grammar t038lexerRuleLabel;
+options {
+  language = Python3;
+}
+
+A: 'a'..'z' WS '0'..'9'
+        {
+            print($WS)
+            print($WS.type)
+            print($WS.line)
+            print($WS.pos)
+            print($WS.channel)
+            print($WS.index)
+            print($WS.text)
+        }
+    ;
+
+fragment WS  :
+        (   ' '
+        |   '\t'
+        |  ( '\n'
+            |	'\r\n'
+            |	'\r'
+            )
+        )+
+        { $channel = HIDDEN }
+    ;    
+
diff --git a/runtime/Python3/tests/t038lexerRuleLabel.py b/runtime/Python3/tests/t038lexerRuleLabel.py
new file mode 100644
index 0000000..7b2e55a
--- /dev/null
+++ b/runtime/Python3/tests/t038lexerRuleLabel.py
@@ -0,0 +1,33 @@
+import antlr3
+import testbase
+import unittest
+
+
+class t038lexerRuleLabel(testbase.ANTLRTest):
+    def setUp(self):
+        self.compileGrammar()
+        
+
+    def lexerClass(self, base):
+        class TLexer(base):
+            def recover(self, input, re):
+                # no error recovery yet, just crash!
+                raise
+
+        return TLexer
+    
+        
+    def testValid1(self):
+        cStream = antlr3.StringStream('a  2')
+
+        lexer = self.getLexer(cStream)
+
+        while True:
+            t = lexer.nextToken()
+            if t.type == antlr3.EOF:
+                break
+            print(t)
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/runtime/Python3/tests/t039labels.g b/runtime/Python3/tests/t039labels.g
new file mode 100644
index 0000000..12aa649
--- /dev/null
+++ b/runtime/Python3/tests/t039labels.g
@@ -0,0 +1,18 @@
+grammar t039labels;
+options {
+  language = Python3;
+}
+
+a returns [l]
+    : ids+=A ( ',' ids+=(A|B) )* C D w=. ids+=. F EOF
+        { l = ($ids, $w) }
+    ;
+
+A: 'a'..'z';
+B: '0'..'9';
+C: a='A' { print($a) };
+D: a='FOOBAR' { print($a) };
+E: 'GNU' a=. { print($a) };
+F: 'BLARZ' a=EOF { print($a) };
+
+WS: ' '+  { $channel = HIDDEN };
diff --git a/runtime/Python3/tests/t039labels.py b/runtime/Python3/tests/t039labels.py
new file mode 100644
index 0000000..9744017
--- /dev/null
+++ b/runtime/Python3/tests/t039labels.py
@@ -0,0 +1,53 @@
+import antlr3
+import testbase
+import unittest
+
+
+class t039labels(testbase.ANTLRTest):
+    def setUp(self):
+        self.compileGrammar()
+        
+
+    def lexerClass(self, base):
+        class TLexer(base):
+            def recover(self, input, re):
+                # no error recovery yet, just crash!
+                raise
+
+        return TLexer
+    
+        
+    def parserClass(self, base):
+        class TParser(base):
+            def recover(self, input, re):
+                # no error recovery yet, just crash!
+                raise
+
+        return TParser
+    
+        
+    def testValid1(self):
+        cStream = antlr3.StringStream(
+            'a, b, c, 1, 2 A FOOBAR GNU1 A BLARZ'
+            )
+
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+        ids, w = parser.a()
+
+        self.assertEqual(len(ids), 6, ids)
+        self.assertEqual(ids[0].text, 'a', ids[0])
+        self.assertEqual(ids[1].text, 'b', ids[1])
+        self.assertEqual(ids[2].text, 'c', ids[2])
+        self.assertEqual(ids[3].text, '1', ids[3])
+        self.assertEqual(ids[4].text, '2', ids[4])
+        self.assertEqual(ids[5].text, 'A', ids[5])
+
+        self.assertEqual(w.text, 'GNU1', w)
+
+
+if __name__ == '__main__':
+    unittest.main()
+
+
diff --git a/runtime/Python3/tests/t040bug80.g b/runtime/Python3/tests/t040bug80.g
new file mode 100644
index 0000000..dbd87c0
--- /dev/null
+++ b/runtime/Python3/tests/t040bug80.g
@@ -0,0 +1,13 @@
+lexer grammar t040bug80; 
+options {
+  language = Python3;
+}
+ 
+ID_LIKE
+    : 'defined' 
+    | {False}? Identifier 
+    | Identifier 
+    ; 
+ 
+fragment 
+Identifier: 'a'..'z'+ ; // with just 'a', output compiles 
diff --git a/runtime/Python3/tests/t040bug80.py b/runtime/Python3/tests/t040bug80.py
new file mode 100644
index 0000000..34c48b9
--- /dev/null
+++ b/runtime/Python3/tests/t040bug80.py
@@ -0,0 +1,33 @@
+import antlr3
+import testbase
+import unittest
+
+
+class t040bug80(testbase.ANTLRTest):
+    def setUp(self):
+        self.compileGrammar()
+        
+
+    def lexerClass(self, base):
+        class TLexer(base):
+            def recover(self, input, re):
+                # no error recovery yet, just crash!
+                raise
+
+        return TLexer
+    
+        
+    def testValid1(self):
+        cStream = antlr3.StringStream('defined')
+        lexer = self.getLexer(cStream)
+        while True:
+            t = lexer.nextToken()
+            if t.type == antlr3.EOF:
+                break
+            print(t)
+
+
+if __name__ == '__main__':
+    unittest.main()
+
+
diff --git a/runtime/Python3/tests/t041parameters.g b/runtime/Python3/tests/t041parameters.g
new file mode 100644
index 0000000..44db5bf
--- /dev/null
+++ b/runtime/Python3/tests/t041parameters.g
@@ -0,0 +1,16 @@
+grammar t041parameters;
+options {
+  language = Python3;
+}
+
+a[arg1, arg2] returns [l]
+    : A+ EOF
+        { 
+            l = ($arg1, $arg2) 
+            $arg1 = "gnarz"
+        }
+    ;
+
+A: 'a'..'z';
+
+WS: ' '+  { $channel = HIDDEN };
diff --git a/runtime/Python3/tests/t041parameters.py b/runtime/Python3/tests/t041parameters.py
new file mode 100644
index 0000000..e4bc8c0
--- /dev/null
+++ b/runtime/Python3/tests/t041parameters.py
@@ -0,0 +1,45 @@
+import antlr3
+import testbase
+import unittest
+
+
+class t041parameters(testbase.ANTLRTest):
+    def setUp(self):
+        self.compileGrammar()
+        
+
+    def lexerClass(self, base):
+        class TLexer(base):
+            def recover(self, input, re):
+                # no error recovery yet, just crash!
+                raise
+
+        return TLexer
+    
+        
+    def parserClass(self, base):
+        class TParser(base):
+            def recover(self, input, re):
+                # no error recovery yet, just crash!
+                raise
+
+        return TParser
+    
+        
+    def testValid1(self):
+        cStream = antlr3.StringStream('a a a')
+
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+        r = parser.a('foo', 'bar')
+
+        self.assertEqual(r, ('foo', 'bar'))
+
+
+if __name__ == '__main__':
+    unittest.main()
+
+
+
+
diff --git a/runtime/Python3/tests/t042ast.g b/runtime/Python3/tests/t042ast.g
new file mode 100644
index 0000000..5d2b9b9
--- /dev/null
+++ b/runtime/Python3/tests/t042ast.g
@@ -0,0 +1,353 @@
+grammar t042ast;
+options {
+    language = Python3;
+    output = AST;
+}
+
+tokens {
+    VARDEF;
+    FLOAT;
+    EXPR;
+    BLOCK;
+    VARIABLE;
+    FIELD;
+    CALL;
+    INDEX;
+    FIELDACCESS;
+}
+
+@init {
+self.flag = False
+}
+
+r1
+    : INT ('+'^ INT)*
+    ;
+
+r2
+    : 'assert'^ x=expression (':'! y=expression)? ';'!
+    ;
+
+r3
+    : 'if'^ expression s1=statement ('else'! s2=statement)?
+    ;
+
+r4
+    : 'while'^ expression statement
+    ;
+
+r5
+    : 'return'^ expression? ';'!
+    ;
+
+r6
+    : (INT|ID)+
+    ;
+
+r7
+    : INT -> 
+    ;
+
+r8
+    : 'var' ID ':' type -> ^('var' type ID) 
+    ;
+
+r9
+    : type ID ';' -> ^(VARDEF type ID) 
+    ;
+
+r10
+    : INT -> {CommonTree(CommonToken(type=FLOAT, text=$INT.text + ".0"))}
+    ;
+
+r11
+    : expression -> ^(EXPR expression)
+    | -> EXPR
+    ;
+
+r12
+    : ID (',' ID)* -> ID+
+    ;
+
+r13
+    : type ID (',' ID)* ';' -> ^(type ID+)
+    ;
+
+r14
+    :   expression? statement* type+
+        -> ^(EXPR expression? statement* type+)
+    ;
+
+r15
+    : INT -> INT INT
+    ;
+
+r16
+    : 'int' ID (',' ID)* -> ^('int' ID)+
+    ;
+
+r17
+    : 'for' '(' start=statement ';' expression ';' next=statement ')' statement
+        -> ^('for' $start expression $next statement)
+    ;
+
+r18
+    : t='for' -> ^(BLOCK)
+    ;
+
+r19
+    : t='for' -> ^(BLOCK[$t])
+    ;
+
+r20
+    : t='for' -> ^(BLOCK[$t,"FOR"])
+    ;
+
+r21
+    : t='for' -> BLOCK
+    ;
+
+r22
+    : t='for' -> BLOCK[$t]
+    ;
+
+r23
+    : t='for' -> BLOCK[$t,"FOR"]
+    ;
+
+r24
+    : r=statement expression -> ^($r expression)
+    ;
+
+r25
+    : r+=statement (',' r+=statement)+ expression -> ^($r expression)
+    ;
+
+r26
+    : r+=statement (',' r+=statement)+ -> ^(BLOCK $r+)
+    ;
+
+r27
+    : r=statement expression -> ^($r ^($r expression))
+    ;
+
+r28
+    : ('foo28a'|'foo28b') ->
+    ;
+
+r29
+    : (r+=statement)* -> ^(BLOCK $r+)
+    ;
+
+r30
+    : statement* -> ^(BLOCK statement?)
+    ;
+
+r31
+    : modifier type ID ('=' expression)? ';'
+        -> {self.flag == 0}? ^(VARDEF ID modifier* type expression?)
+        -> {self.flag == 1}? ^(VARIABLE ID modifier* type expression?)
+        ->                   ^(FIELD ID modifier* type expression?)
+    ;
+
+r32[which]
+  : ID INT -> {which==1}? ID
+           -> {which==2}? INT
+           -> // yield nothing as else-clause
+  ;
+
+r33
+    :   modifiers! statement
+    ;
+
+r34
+    :   modifiers! r34a[$modifiers.tree]
+    //|   modifiers! r33b[$modifiers.tree]
+    ;
+
+r34a[mod]
+    :   'class' ID ('extends' sup=type)?
+        ( 'implements' i+=type (',' i+=type)*)?
+        '{' statement* '}'
+        -> ^('class' ID {$mod} ^('extends' $sup)? ^('implements' $i+)? statement* )
+    ;
+
+r35
+    : '{' 'extends' (sup=type)? '}'
+        ->  ^('extends' $sup)?
+    ;
+
+r36
+    : 'if' '(' expression ')' s1=statement
+        ( 'else' s2=statement -> ^('if' ^(EXPR expression) $s1 $s2)
+        |                     -> ^('if' ^(EXPR expression) $s1)
+        )
+    ;
+
+r37
+    : (INT -> INT) ('+' i=INT -> ^('+' $r37 $i) )* 
+    ;
+
+r38
+    : INT ('+'^ INT)*
+    ;
+
+r39
+    : (primary->primary) // set return tree to just primary
+        ( '(' arg=expression ')'
+            -> ^(CALL $r39 $arg)
+        | '[' ie=expression ']'
+            -> ^(INDEX $r39 $ie)
+        | '.' p=primary
+            -> ^(FIELDACCESS $r39 $p)
+        )*
+    ;
+
+r40
+    : (INT -> INT) ( ('+' i+=INT)* -> ^('+' $r40 $i*) ) ';'
+    ;
+
+r41
+    : (INT -> INT) ( ('+' i=INT) -> ^($i $r41) )* ';'
+    ;
+
+r42
+    : ids+=ID (','! ids+=ID)*
+    ;
+
+r43 returns [res]
+    : ids+=ID! (','! ids+=ID!)* {$res = [id.text for id in $ids]}
+    ;
+
+r44
+    : ids+=ID^ (','! ids+=ID^)*
+    ;
+
+r45
+    : primary^
+    ;
+
+r46 returns [res]
+    : ids+=primary! (','! ids+=primary!)* {$res = [id.text for id in $ids]}
+    ;
+
+r47
+    : ids+=primary (','! ids+=primary)*
+    ;
+
+r48
+    : ids+=. (','! ids+=.)*
+    ;
+
+r49
+    : .^ ID
+    ;
+
+r50
+    : ID 
+        -> ^({CommonTree(CommonToken(type=FLOAT, text="1.0"))} ID)
+    ;
+
+/** templates tested:
+    tokenLabelPropertyRef_tree
+*/
+r51 returns [res]
+    : ID t=ID ID
+        { $res = $t.tree }
+    ;
+
+/** templates tested:
+    rulePropertyRef_tree
+*/
+r52 returns [res]
+@after {
+    $res = $tree
+}
+    : ID
+    ;
+
+/** templates tested:
+    ruleLabelPropertyRef_tree
+*/
+r53 returns [res]
+    : t=primary
+        { $res = $t.tree }
+    ;
+
+/** templates tested:
+    ruleSetPropertyRef_tree
+*/
+r54 returns [res]
+@after {
+    $tree = $t.tree;
+}
+    : ID t=expression ID
+    ;
+
+/** backtracking */
+r55
+options { backtrack=true; k=1; }
+    : (modifier+ INT)=> modifier+ expression
+    | modifier+ statement
+    ;
+
+
+/** templates tested:
+    rewriteTokenRef with len(args)>0
+*/
+r56
+    : t=ID* -> ID[$t,'foo']
+    ;
+
+/** templates tested:
+    rewriteTokenRefRoot with len(args)>0
+*/
+r57
+    : t=ID* -> ^(ID[$t,'foo'])
+    ;
+
+/** templates tested:
+    ???
+*/
+r58
+    : ({CommonTree(CommonToken(type=FLOAT, text="2.0"))})^
+    ;
+
+/** templates tested:
+    rewriteTokenListLabelRefRoot
+*/
+r59
+    : (t+=ID)+ statement -> ^($t statement)+
+    ;
+
+primary
+    : ID
+    ;
+
+expression
+    : r1
+    ;
+
+statement
+    : 'fooze'
+    | 'fooze2'
+    ;
+
+modifiers
+    : modifier+
+    ;
+
+modifier
+    : 'public'
+    | 'private'
+    ;
+
+type
+    : 'int'
+    | 'bool'
+    ;
+
+ID : 'a'..'z' + ;
+INT : '0'..'9' +;
+WS: (' ' | '\n' | '\t')+ {$channel = HIDDEN;};
+
diff --git a/runtime/Python3/tests/t042ast.py b/runtime/Python3/tests/t042ast.py
new file mode 100644
index 0000000..559d5f1
--- /dev/null
+++ b/runtime/Python3/tests/t042ast.py
@@ -0,0 +1,669 @@
+import unittest
+import textwrap
+import antlr3
+import testbase
+
+class t042ast(testbase.ANTLRTest):
+##     def lexerClass(self, base):
+##         class TLexer(base):
+##             def reportError(self, re):
+##                 # no error recovery yet, just crash!
+##                 raise re
+
+##         return TLexer
+    
+
+    def parserClass(self, base):
+        class TParser(base):
+            def recover(self, input, re):
+                # no error recovery yet, just crash!
+                raise
+
+        return TParser
+    
+
+    def parse(self, text, method, rArgs=(), **kwargs):
+        self.compileGrammar() #options='-trace')
+        
+        cStream = antlr3.StringStream(text)
+        self.lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(self.lexer)
+        self.parser = self.getParser(tStream)
+        
+        for attr, val in kwargs.items():
+            setattr(self.parser, attr, val)
+            
+        return getattr(self.parser, method)(*rArgs)
+
+    
+    def testR1(self):
+        r = self.parse("1 + 2", 'r1')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '(+ 1 2)'
+            )
+
+
+    def testR2a(self):
+        r = self.parse("assert 2+3;", 'r2')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '(assert (+ 2 3))'
+            )
+
+
+    def testR2b(self):
+        r = self.parse("assert 2+3 : 5;", 'r2')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '(assert (+ 2 3) 5)'
+            )
+
+
+    def testR3a(self):
+        r = self.parse("if 1 fooze", 'r3')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '(if 1 fooze)'
+            )
+
+
+    def testR3b(self):
+        r = self.parse("if 1 fooze else fooze", 'r3')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '(if 1 fooze fooze)'
+            )
+
+
+    def testR4a(self):
+        r = self.parse("while 2 fooze", 'r4')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '(while 2 fooze)'
+            )
+
+
+    def testR5a(self):
+        r = self.parse("return;", 'r5')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            'return'
+            )
+
+
+    def testR5b(self):
+        r = self.parse("return 2+3;", 'r5')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '(return (+ 2 3))'
+            )
+
+
+    def testR6a(self):
+        r = self.parse("3", 'r6')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '3'
+            )
+
+
+    def testR6b(self):
+        r = self.parse("3 a", 'r6')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '3 a'
+            )
+
+
+    def testR7(self):
+        r = self.parse("3", 'r7')
+        self.assertIsNone(r.tree)
+
+
+    def testR8(self):
+        r = self.parse("var foo:bool", 'r8')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '(var bool foo)'
+            )
+
+
+    def testR9(self):
+        r = self.parse("int foo;", 'r9')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '(VARDEF int foo)'
+            )
+
+
+    def testR10(self):
+        r = self.parse("10", 'r10')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '10.0'
+            )
+
+
+    def testR11a(self):
+        r = self.parse("1+2", 'r11')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '(EXPR (+ 1 2))'
+            )
+
+
+    def testR11b(self):
+        r = self.parse("", 'r11')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            'EXPR'
+            )
+
+
+    def testR12a(self):
+        r = self.parse("foo", 'r12')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            'foo'
+            )
+
+
+    def testR12b(self):
+        r = self.parse("foo, bar, gnurz", 'r12')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            'foo bar gnurz'
+            )
+
+
+    def testR13a(self):
+        r = self.parse("int foo;", 'r13')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '(int foo)'
+            )
+
+
+    def testR13b(self):
+        r = self.parse("bool foo, bar, gnurz;", 'r13')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '(bool foo bar gnurz)'
+            )
+
+
+    def testR14a(self):
+        r = self.parse("1+2 int", 'r14')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '(EXPR (+ 1 2) int)'
+            )
+
+
+    def testR14b(self):
+        r = self.parse("1+2 int bool", 'r14')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '(EXPR (+ 1 2) int bool)'
+            )
+
+
+    def testR14c(self):
+        r = self.parse("int bool", 'r14')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '(EXPR int bool)'
+            )
+
+
+    def testR14d(self):
+        r = self.parse("fooze fooze int bool", 'r14')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '(EXPR fooze fooze int bool)'
+            )
+
+
+    def testR14e(self):
+        r = self.parse("7+9 fooze fooze int bool", 'r14')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '(EXPR (+ 7 9) fooze fooze int bool)'
+            )
+
+
+    def testR15(self):
+        r = self.parse("7", 'r15')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '7 7'
+            )
+
+
+    def testR16a(self):
+        r = self.parse("int foo", 'r16')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '(int foo)'
+            )
+
+
+    def testR16b(self):
+        r = self.parse("int foo, bar, gnurz", 'r16')
+            
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '(int foo) (int bar) (int gnurz)'
+            )
+
+
+    def testR17a(self):
+        r = self.parse("for ( fooze ; 1 + 2 ; fooze ) fooze", 'r17')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '(for fooze (+ 1 2) fooze fooze)'
+            )
+
+
+    def testR18a(self):
+        r = self.parse("for", 'r18')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            'BLOCK'
+            )
+
+
+    def testR19a(self):
+        r = self.parse("for", 'r19')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            'for'
+            )
+
+
+    def testR20a(self):
+        r = self.parse("for", 'r20')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            'FOR'
+            )
+
+
+    def testR21a(self):
+        r = self.parse("for", 'r21')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            'BLOCK'
+            )
+
+
+    def testR22a(self):
+        r = self.parse("for", 'r22')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            'for'
+            )
+
+
+    def testR23a(self):
+        r = self.parse("for", 'r23')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            'FOR'
+            )
+
+
+    def testR24a(self):
+        r = self.parse("fooze 1 + 2", 'r24')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '(fooze (+ 1 2))'
+            )
+
+
+    def testR25a(self):
+        r = self.parse("fooze, fooze2 1 + 2", 'r25')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '(fooze (+ 1 2))'
+            )
+
+
+    def testR26a(self):
+        r = self.parse("fooze, fooze2", 'r26')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '(BLOCK fooze fooze2)'
+            )
+
+
+    def testR27a(self):
+        r = self.parse("fooze 1 + 2", 'r27')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '(fooze (fooze (+ 1 2)))'
+            )
+            
+
+    def testR28(self):
+        r = self.parse("foo28a", 'r28')
+        self.assertIsNone(r.tree)
+
+
+    def testR29(self):
+        self.assertRaises(RuntimeError, self.parse, "", 'r29')
+
+
+# FIXME: broken upstream?
+##     def testR30(self):
+##         try:
+##             r = self.parse("fooze fooze", 'r30')
+##             self.fail(r.tree.toStringTree())
+##         except RuntimeError:
+##             pass
+
+
+    def testR31a(self):
+        r = self.parse("public int gnurz = 1 + 2;", 'r31', flag=0)
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '(VARDEF gnurz public int (+ 1 2))'
+            )
+
+
+    def testR31b(self):
+        r = self.parse("public int gnurz = 1 + 2;", 'r31', flag=1)
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '(VARIABLE gnurz public int (+ 1 2))'
+            )
+
+
+    def testR31c(self):
+        r = self.parse("public int gnurz = 1 + 2;", 'r31', flag=2)
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '(FIELD gnurz public int (+ 1 2))'
+            )
+
+
+    def testR32a(self):
+        r = self.parse("gnurz 32", 'r32', [1], flag=2)
+        self.assertEqual(
+            r.tree.toStringTree(),
+            'gnurz'
+            )
+
+
+    def testR32b(self):
+        r = self.parse("gnurz 32", 'r32', [2], flag=2)
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '32'
+            )
+
+
+    def testR32c(self):
+        r = self.parse("gnurz 32", 'r32', [3], flag=2)
+        self.assertIsNone(r.tree)
+
+
+    def testR33a(self):
+        r = self.parse("public private fooze", 'r33')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            'fooze'
+            )
+
+
+    def testR34a(self):
+        r = self.parse("public class gnurz { fooze fooze2 }", 'r34')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '(class gnurz public fooze fooze2)'
+            )
+
+
+    def testR34b(self):
+        r = self.parse("public class gnurz extends bool implements int, bool { fooze fooze2 }", 'r34')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '(class gnurz public (extends bool) (implements int bool) fooze fooze2)'
+            )
+
+
+    def testR35(self):
+        self.assertRaises(RuntimeError, self.parse, "{ extends }", 'r35')
+
+
+    def testR36a(self):
+        r = self.parse("if ( 1 + 2 ) fooze", 'r36')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '(if (EXPR (+ 1 2)) fooze)'
+            )
+
+
+    def testR36b(self):
+        r = self.parse("if ( 1 + 2 ) fooze else fooze2", 'r36')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '(if (EXPR (+ 1 2)) fooze fooze2)'
+            )
+
+
+    def testR37(self):
+        r = self.parse("1 + 2 + 3", 'r37')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '(+ (+ 1 2) 3)'
+            )
+
+
+    def testR38(self):
+        r = self.parse("1 + 2 + 3", 'r38')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '(+ (+ 1 2) 3)'
+            )
+
+
+    def testR39a(self):
+        r = self.parse("gnurz[1]", 'r39')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '(INDEX gnurz 1)'
+            )
+
+
+    def testR39b(self):
+        r = self.parse("gnurz(2)", 'r39')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '(CALL gnurz 2)'
+            )
+
+
+    def testR39c(self):
+        r = self.parse("gnurz.gnarz", 'r39')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '(FIELDACCESS gnurz gnarz)'
+            )
+
+
+    def testR39d(self):
+        r = self.parse("gnurz.gnarz.gnorz", 'r39')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '(FIELDACCESS (FIELDACCESS gnurz gnarz) gnorz)'
+            )
+
+
+    def testR40(self):
+        r = self.parse("1 + 2 + 3;", 'r40')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '(+ 1 2 3)'
+            )
+
+
+    def testR41(self):
+        r = self.parse("1 + 2 + 3;", 'r41')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '(3 (2 1))'
+            )
+
+
+    def testR42(self):
+        r = self.parse("gnurz, gnarz, gnorz", 'r42')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            'gnurz gnarz gnorz'
+            )
+
+
+    def testR43(self):
+        r = self.parse("gnurz, gnarz, gnorz", 'r43')
+        self.assertIsNone(r.tree)
+        self.assertEqual(
+            r.res,
+            ['gnurz', 'gnarz', 'gnorz']
+            )
+
+
+    def testR44(self):
+        r = self.parse("gnurz, gnarz, gnorz", 'r44')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '(gnorz (gnarz gnurz))'
+            )
+
+
+    def testR45(self):
+        r = self.parse("gnurz", 'r45')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            'gnurz'
+            )
+
+
+    def testR46(self):
+        r = self.parse("gnurz, gnarz, gnorz", 'r46')
+        self.assertIsNone(r.tree)
+        self.assertEqual(
+            r.res,
+            ['gnurz', 'gnarz', 'gnorz']
+            )
+
+
+    def testR47(self):
+        r = self.parse("gnurz, gnarz, gnorz", 'r47')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            'gnurz gnarz gnorz'
+            )
+
+
+    def testR48(self):
+        r = self.parse("gnurz, gnarz, gnorz", 'r48')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            'gnurz gnarz gnorz'
+            )
+
+
+    def testR49(self):
+        r = self.parse("gnurz gnorz", 'r49')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '(gnurz gnorz)'
+            )
+
+
+    def testR50(self):
+        r = self.parse("gnurz", 'r50')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '(1.0 gnurz)'
+            )
+
+
+    def testR51(self):
+        r = self.parse("gnurza gnurzb gnurzc", 'r51')
+        self.assertEqual(
+            r.res.toStringTree(),
+            'gnurzb'
+            )
+
+
+    def testR52(self):
+        r = self.parse("gnurz", 'r52')
+        self.assertEqual(
+            r.res.toStringTree(),
+            'gnurz'
+            )
+
+
+    def testR53(self):
+        r = self.parse("gnurz", 'r53')
+        self.assertEqual(
+            r.res.toStringTree(),
+            'gnurz'
+            )
+
+
+    def testR54(self):
+        r = self.parse("gnurza 1 + 2 gnurzb", 'r54')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '(+ 1 2)'
+            )
+
+
+    def testR55a(self):
+        r = self.parse("public private 1 + 2", 'r55')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            'public private (+ 1 2)'
+            )
+
+
+    def testR55b(self):
+        r = self.parse("public fooze", 'r55')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            'public fooze'
+            )
+
+
+    def testR56(self):
+        r = self.parse("a b c d", 'r56')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            'foo'
+            )
+
+
+    def testR57(self):
+        r = self.parse("a b c d", 'r57')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            'foo'
+            )
+
+
+    def testR59(self):
+        r = self.parse("a b c fooze", 'r59')
+        self.assertEqual(
+            r.tree.toStringTree(),
+            '(a fooze) (b fooze) (c fooze)'
+            )
+
+
+
+if __name__ == '__main__':
+    unittest.main()
+
diff --git a/runtime/Python3/tests/t043synpred.g b/runtime/Python3/tests/t043synpred.g
new file mode 100644
index 0000000..478b8be
--- /dev/null
+++ b/runtime/Python3/tests/t043synpred.g
@@ -0,0 +1,14 @@
+grammar t043synpred;
+options {
+  language = Python3;
+}
+
+a: ((s+ P)=> s+ b)? E;
+b: P 'foo';
+
+s: S;
+
+
+S: ' ';
+P: '+';
+E: '>';
diff --git a/runtime/Python3/tests/t043synpred.py b/runtime/Python3/tests/t043synpred.py
new file mode 100644
index 0000000..9246de2
--- /dev/null
+++ b/runtime/Python3/tests/t043synpred.py
@@ -0,0 +1,39 @@
+import antlr3
+import testbase
+import unittest
+
+
+class t043synpred(testbase.ANTLRTest):
+    def setUp(self):
+        self.compileGrammar()
+        
+
+    def lexerClass(self, base):
+        class TLexer(base):
+            def recover(self, input, re):
+                # no error recovery yet, just crash!
+                raise
+
+        return TLexer
+    
+        
+    def parserClass(self, base):
+        class TParser(base):
+            def recover(self, input, re):
+                # no error recovery yet, just crash!
+                raise
+
+        return TParser
+    
+        
+    def testValid1(self):
+        cStream = antlr3.StringStream('   +foo>')
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+        events = parser.a()
+
+
+if __name__ == '__main__':
+    unittest.main()
+    
diff --git a/runtime/Python3/tests/t044trace.g b/runtime/Python3/tests/t044trace.g
new file mode 100644
index 0000000..e170bba
--- /dev/null
+++ b/runtime/Python3/tests/t044trace.g
@@ -0,0 +1,20 @@
+grammar t044trace;
+options {
+  language = Python3;
+}
+
+@init {
+    self._stack = None
+}
+
+a: '<' ((INT '+')=>b|c) '>';
+b: c ('+' c)*;
+c: INT 
+    {
+        if self._stack is None:
+            self._stack = self.getRuleInvocationStack()
+    }
+    ;
+
+INT: ('0'..'9')+;
+WS: (' ' | '\n' | '\t')+ {$channel = HIDDEN;};
diff --git a/runtime/Python3/tests/t044trace.py b/runtime/Python3/tests/t044trace.py
new file mode 100644
index 0000000..2d60b61
--- /dev/null
+++ b/runtime/Python3/tests/t044trace.py
@@ -0,0 +1,92 @@
+import antlr3
+import testbase
+import unittest
+
+
+class T(testbase.ANTLRTest):
+    def setUp(self):
+        self.compileGrammar(options='-trace')
+
+
+    def lexerClass(self, base):
+        class TLexer(base):
+            def __init__(self, *args, **kwargs):
+                super().__init__(*args, **kwargs)
+
+                self.traces = []
+
+
+            def traceIn(self, ruleName, ruleIndex):
+                self.traces.append('>'+ruleName)
+
+
+            def traceOut(self, ruleName, ruleIndex):
+                self.traces.append('<'+ruleName)
+
+
+            def recover(self, input, re):
+                # no error recovery yet, just crash!
+                raise
+
+        return TLexer
+
+
+    def parserClass(self, base):
+        class TParser(base):
+            def __init__(self, *args, **kwargs):
+                super().__init__(*args, **kwargs)
+
+                self.traces = []
+
+
+            def traceIn(self, ruleName, ruleIndex):
+                self.traces.append('>'+ruleName)
+
+
+            def traceOut(self, ruleName, ruleIndex):
+                self.traces.append('<'+ruleName)
+
+
+            def recover(self, input, re):
+                # no error recovery yet, just crash!
+                raise
+
+            def getRuleInvocationStack(self):
+                return self._getRuleInvocationStack(base.__module__)
+
+        return TParser
+
+
+    def testTrace(self):
+        cStream = antlr3.StringStream('< 1 + 2 + 3 >')
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+        parser.a()
+
+        self.assertEqual(
+            lexer.traces,
+            [ '>T__7', '<T__7', '>WS', '<WS', '>INT', '<INT', '>WS', '<WS',
+              '>T__6', '<T__6', '>WS', '<WS', '>INT', '<INT', '>WS', '<WS',
+              '>T__6', '<T__6', '>WS', '<WS', '>INT', '<INT', '>WS', '<WS',
+              '>T__8', '<T__8']
+            )
+
+        self.assertEqual(
+            parser.traces,
+            [ '>a', '>synpred1_t044trace_fragment', '<synpred1_t044trace_fragment', '>b', '>c',
+              '<c', '>c', '<c', '>c', '<c', '<b', '<a' ]
+            )
+
+
+    def testInvokationStack(self):
+        cStream = antlr3.StringStream('< 1 + 2 + 3 >')
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+        parser.a()
+
+        self.assertEqual(parser._stack, ['a', 'b', 'c'])
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/runtime/Python3/tests/t045dfabug.g b/runtime/Python3/tests/t045dfabug.g
new file mode 100644
index 0000000..436aefa
--- /dev/null
+++ b/runtime/Python3/tests/t045dfabug.g
@@ -0,0 +1,32 @@
+grammar t045dfabug;
+options {
+    language = Python3;
+    output = AST;
+}
+
+
+// this rule used to generate an infinite loop in DFA.predict
+r
+options { backtrack=true; }
+    : (modifier+ INT)=> modifier+ expression
+    | modifier+ statement
+    ;
+
+expression
+    : INT '+' INT
+    ;
+
+statement
+    : 'fooze'
+    | 'fooze2'
+    ;
+
+modifier
+    : 'public'
+    | 'private'
+    ;
+
+ID : 'a'..'z' + ;
+INT : '0'..'9' +;
+WS: (' ' | '\n' | '\t')+ {$channel = HIDDEN;};
+
diff --git a/runtime/Python3/tests/t045dfabug.py b/runtime/Python3/tests/t045dfabug.py
new file mode 100644
index 0000000..76be15e
--- /dev/null
+++ b/runtime/Python3/tests/t045dfabug.py
@@ -0,0 +1,21 @@
+import unittest
+import textwrap
+import antlr3
+import testbase
+
+class T(testbase.ANTLRTest):
+
+    def testbug(self):
+        self.compileGrammar()
+        
+        cStream = antlr3.StringStream("public fooze")
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+
+        parser.r()
+
+
+if __name__ == '__main__':
+    unittest.main()
+
diff --git a/runtime/Python3/tests/t046rewrite.g b/runtime/Python3/tests/t046rewrite.g
new file mode 100644
index 0000000..58e4071
--- /dev/null
+++ b/runtime/Python3/tests/t046rewrite.g
@@ -0,0 +1,54 @@
+grammar t046rewrite;
+options {
+    language=Python3;
+}
+
+program
+@init {
+    start = self.input.LT(1)
+}
+    :   method+
+        {
+        self.input.insertBefore(start,"public class Wrapper {\n")
+        self.input.insertAfter($method.stop, "\n}\n")
+        }
+    ;
+
+method
+    :   m='method' ID '(' ')' body
+        {self.input.replace($m, "public void");}
+    ; 
+
+body
+scope {
+    decls
+}
+@init {
+    $body::decls = set()
+}
+    :   lcurly='{' stat* '}'
+        {
+        for it in $body::decls:
+            self.input.insertAfter($lcurly, "\nint "+it+";")
+        }
+    ;
+
+stat:   ID '=' expr ';' {$body::decls.add($ID.text);}
+    ;
+
+expr:   mul ('+' mul)* 
+    ;
+
+mul :   atom ('*' atom)*
+    ;
+
+atom:   ID
+    |   INT
+    ;
+
+ID  :   ('a'..'z'|'A'..'Z')+ ;
+
+INT :   ('0'..'9')+ ;
+
+WS  :   (' '|'\t'|'\n')+ {$channel=HIDDEN;}
+    ;
diff --git a/runtime/Python3/tests/t046rewrite.py b/runtime/Python3/tests/t046rewrite.py
new file mode 100644
index 0000000..be1f4aa
--- /dev/null
+++ b/runtime/Python3/tests/t046rewrite.py
@@ -0,0 +1,52 @@
+import unittest
+import textwrap
+import antlr3
+import testbase
+
+class T(testbase.ANTLRTest):
+    def testRewrite(self):
+        self.compileGrammar()
+
+        input = textwrap.dedent(
+            '''\
+            method foo() {
+              i = 3;
+              k = i;
+              i = k*4;
+            }
+
+            method bar() {
+              j = i*2;
+            }
+            ''')
+        
+        cStream = antlr3.StringStream(input)
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.TokenRewriteStream(lexer)
+        parser = self.getParser(tStream)
+        parser.program()
+
+        expectedOutput = textwrap.dedent('''\
+        public class Wrapper {
+        public void foo() {
+        int k;
+        int i;
+          i = 3;
+          k = i;
+          i = k*4;
+        }
+
+        public void bar() {
+        int j;
+          j = i*2;
+        }
+        }
+
+        ''')
+
+        self.assertEqual(str(tStream), expectedOutput)
+
+
+if __name__ == '__main__':
+    unittest.main()
+
diff --git a/runtime/Python3/tests/t047treeparser.g b/runtime/Python3/tests/t047treeparser.g
new file mode 100644
index 0000000..30cd25e
--- /dev/null
+++ b/runtime/Python3/tests/t047treeparser.g
@@ -0,0 +1,113 @@
+grammar t047treeparser;
+options {
+    language=Python3;
+    output=AST;
+}
+
+tokens {
+    VAR_DEF;
+    ARG_DEF;
+    FUNC_HDR;
+    FUNC_DECL;
+    FUNC_DEF;
+    BLOCK;
+}
+
+program
+    :   declaration+
+    ;
+
+declaration
+    :   variable
+    |   functionHeader ';' -> ^(FUNC_DECL functionHeader)
+    |   functionHeader block -> ^(FUNC_DEF functionHeader block)
+    ;
+
+variable
+    :   type declarator ';' -> ^(VAR_DEF type declarator)
+    ;
+
+declarator
+    :   ID 
+    ;
+
+functionHeader
+    :   type ID '(' ( formalParameter ( ',' formalParameter )* )? ')'
+        -> ^(FUNC_HDR type ID formalParameter+)
+    ;
+
+formalParameter
+    :   type declarator -> ^(ARG_DEF type declarator)
+    ;
+
+type
+    :   'int'   
+    |   'char'  
+    |   'void'
+    |   ID        
+    ;
+
+block
+    :   lc='{'
+            variable*
+            stat*
+        '}'
+        -> ^(BLOCK[$lc,"BLOCK"] variable* stat*)
+    ;
+
+stat: forStat
+    | expr ';'!
+    | block
+    | assignStat ';'!
+    | ';'!
+    ;
+
+forStat
+    :   'for' '(' start=assignStat ';' expr ';' next=assignStat ')' block
+        -> ^('for' $start expr $next block)
+    ;
+
+assignStat
+    :   ID EQ expr -> ^(EQ ID expr)
+    ;
+
+expr:   condExpr
+    ;
+
+condExpr
+    :   aexpr ( ('=='^ | '<'^) aexpr )?
+    ;
+
+aexpr
+    :   atom ( '+'^ atom )*
+    ;
+
+atom
+    : ID      
+    | INT      
+    | '(' expr ')' -> expr
+    ; 
+
+FOR : 'for' ;
+INT_TYPE : 'int' ;
+CHAR: 'char';
+VOID: 'void';
+
+ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
+    ;
+
+INT :	('0'..'9')+
+    ;
+
+EQ   : '=' ;
+EQEQ : '==' ;
+LT   : '<' ;
+PLUS : '+' ;
+
+WS  :   (   ' '
+        |   '\t'
+        |   '\r'
+        |   '\n'
+        )+
+        { $channel=HIDDEN }
+    ;    
diff --git a/runtime/Python3/tests/t047treeparser.py b/runtime/Python3/tests/t047treeparser.py
new file mode 100644
index 0000000..5b866b2
--- /dev/null
+++ b/runtime/Python3/tests/t047treeparser.py
@@ -0,0 +1,122 @@
+import unittest
+import textwrap
+import antlr3
+import antlr3.tree
+import testbase
+
+class T(testbase.ANTLRTest):
+    def walkerClass(self, base):
+        class TWalker(base):
+            def __init__(self, *args, **kwargs):
+                super().__init__(*args, **kwargs)
+
+                self.traces = []
+
+
+            def traceIn(self, ruleName, ruleIndex):
+                self.traces.append('>'+ruleName)
+
+
+            def traceOut(self, ruleName, ruleIndex):
+                self.traces.append('<'+ruleName)
+
+
+            def recover(self, input, re):
+                # no error recovery yet, just crash!
+                raise
+            
+        return TWalker
+    
+
+    def setUp(self):
+        self.compileGrammar()
+        self.compileGrammar('t047treeparserWalker.g', options='-trace')
+
+        
+    def testWalker(self):
+        input = textwrap.dedent(
+            '''\
+            char c;
+            int x;
+
+            void bar(int x);
+
+            int foo(int y, char d) {
+              int i;
+              for (i=0; i<3; i=i+1) {
+                x=3;
+                y=5;
+              }
+            }
+            ''')
+        
+        cStream = antlr3.StringStream(input)
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+        r = parser.program()
+
+        self.assertEqual(
+            r.tree.toStringTree(),
+            "(VAR_DEF char c) (VAR_DEF int x) (FUNC_DECL (FUNC_HDR void bar (ARG_DEF int x))) (FUNC_DEF (FUNC_HDR int foo (ARG_DEF int y) (ARG_DEF char d)) (BLOCK (VAR_DEF int i) (for (= i 0) (< i 3) (= i (+ i 1)) (BLOCK (= x 3) (= y 5)))))"
+            )
+        
+        nodes = antlr3.tree.CommonTreeNodeStream(r.tree)
+        nodes.setTokenStream(tStream)
+        walker = self.getWalker(nodes)
+        walker.program()
+
+        # FIXME: need to crosscheck with Java target (compile walker with
+        # -trace option), if this is the real list. For now I'm happy that
+        # it does not crash ;)
+        self.assertEqual(
+            walker.traces,
+            [ '>program', '>declaration', '>variable', '>type', '<type',
+              '>declarator', '<declarator', '<variable', '<declaration',
+              '>declaration', '>variable', '>type', '<type', '>declarator',
+              '<declarator', '<variable', '<declaration', '>declaration',
+              '>functionHeader', '>type', '<type', '>formalParameter',
+              '>type', '<type', '>declarator', '<declarator',
+              '<formalParameter', '<functionHeader', '<declaration',
+              '>declaration', '>functionHeader', '>type', '<type',
+              '>formalParameter', '>type', '<type', '>declarator',
+              '<declarator', '<formalParameter', '>formalParameter', '>type',
+              '<type', '>declarator', '<declarator', '<formalParameter',
+              '<functionHeader', '>block', '>variable', '>type', '<type',
+              '>declarator', '<declarator', '<variable', '>stat', '>forStat',
+              '>expr', '>expr', '>atom', '<atom', '<expr', '<expr', '>expr',
+              '>expr', '>atom', '<atom', '<expr', '>expr', '>atom', '<atom',
+              '<expr', '<expr', '>expr', '>expr', '>expr', '>atom', '<atom',
+              '<expr', '>expr', '>atom', '<atom', '<expr', '<expr', '<expr',
+              '>block', '>stat', '>expr', '>expr', '>atom', '<atom', '<expr',
+              '<expr', '<stat', '>stat', '>expr', '>expr', '>atom', '<atom',
+              '<expr', '<expr', '<stat', '<block', '<forStat', '<stat',
+              '<block', '<declaration', '<program'
+              ]
+            )
+
+    def testRuleLabelPropertyRefText(self):
+        self.compileGrammar()
+        self.compileGrammar('t047treeparserWalker.g', options='-trace')
+
+        input = textwrap.dedent(
+            '''\
+            char c;
+            ''')
+        
+        cStream = antlr3.StringStream(input)
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+        r = parser.variable()
+
+        nodes = antlr3.tree.CommonTreeNodeStream(r.tree)
+        nodes.setTokenStream(tStream)
+        walker = self.getWalker(nodes)
+        r = walker.variable()
+
+        self.assertEqual(r, 'c')
+        
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/runtime/Python3/tests/t047treeparserWalker.g b/runtime/Python3/tests/t047treeparserWalker.g
new file mode 100644
index 0000000..e78b1df
--- /dev/null
+++ b/runtime/Python3/tests/t047treeparserWalker.g
@@ -0,0 +1,67 @@
+tree grammar t047treeparserWalker;
+options {
+    language=Python3;
+    tokenVocab=t047treeparser;
+    ASTLabelType=CommonTree;
+}
+
+program
+    :   declaration+
+    ;
+
+declaration
+    :   variable
+    |   ^(FUNC_DECL functionHeader)
+    |   ^(FUNC_DEF functionHeader block)
+    ;
+
+variable returns [res]
+    :   ^(VAR_DEF type declarator)
+        { 
+            $res = $declarator.text; 
+        }
+    ;
+
+declarator
+    :   ID 
+    ;
+
+functionHeader
+    :   ^(FUNC_HDR type ID formalParameter+)
+    ;
+
+formalParameter
+    :   ^(ARG_DEF type declarator)
+    ;
+
+type
+    :   'int'
+    |   'char'
+    |   'void'
+    |   ID        
+    ;
+
+block
+    :   ^(BLOCK variable* stat*)
+    ;
+
+stat: forStat
+    | expr
+    | block
+    ;
+
+forStat
+    :   ^('for' expr expr expr block)
+    ;
+
+expr:   ^(EQEQ expr expr)
+    |   ^(LT expr expr)
+    |   ^(PLUS expr expr)
+    |   ^(EQ ID expr)
+    |   atom
+    ;
+
+atom
+    : ID      
+    | INT      
+    ; 
diff --git a/runtime/Python3/tests/t048rewrite.g b/runtime/Python3/tests/t048rewrite.g
new file mode 100644
index 0000000..e15e76d
--- /dev/null
+++ b/runtime/Python3/tests/t048rewrite.g
@@ -0,0 +1,9 @@
+lexer grammar t048rewrite;
+options {
+    language=Python3;
+}
+
+A: 'a';
+B: 'b';
+C: 'c';
+
diff --git a/runtime/Python3/tests/t048rewrite.py b/runtime/Python3/tests/t048rewrite.py
new file mode 100644
index 0000000..76edbfe
--- /dev/null
+++ b/runtime/Python3/tests/t048rewrite.py
@@ -0,0 +1,474 @@
+"""Testsuite for TokenRewriteStream class."""
+
+# don't care about docstrings
+# pylint: disable-msg=C0111
+
+import unittest
+import antlr3
+import testbase
+
+class T1(testbase.ANTLRTest):
+    def setUp(self):
+        self.compileGrammar()
+
+
+    def _parse(self, input):
+        cStream = antlr3.StringStream(input)
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.TokenRewriteStream(lexer)
+        tStream.fillBuffer()
+
+        return tStream
+
+
+    def testInsertBeforeIndex0(self):
+        tokens = self._parse("abc")
+        tokens.insertBefore(0, "0")
+
+        result = tokens.toString()
+        expecting = "0abc"
+        self.assertEqual(result, expecting)
+
+
+    def testInsertAfterLastIndex(self):
+        tokens = self._parse("abc")
+        tokens.insertAfter(2, "x")
+
+        result = tokens.toString()
+        expecting = "abcx"
+        self.assertEqual(result, expecting)
+
+
+    def test2InsertBeforeAfterMiddleIndex(self):
+        tokens = self._parse("abc")
+        tokens.insertBefore(1, "x")
+        tokens.insertAfter(1, "x")
+
+        result = tokens.toString()
+        expecting = "axbxc"
+        self.assertEqual(result, expecting)
+
+
+    def testReplaceIndex0(self):
+        tokens = self._parse("abc")
+        tokens.replace(0, "x")
+
+        result = tokens.toString()
+        expecting = "xbc"
+        self.assertEqual(result, expecting)
+
+
+    def testReplaceLastIndex(self):
+        tokens = self._parse("abc")
+        tokens.replace(2, "x")
+
+        result = tokens.toString()
+        expecting = "abx"
+        self.assertEqual(result, expecting)
+
+
+    def testReplaceMiddleIndex(self):
+        tokens = self._parse("abc")
+        tokens.replace(1, "x")
+
+        result = tokens.toString()
+        expecting = "axc"
+        self.assertEqual(result, expecting)
+
+
+    def test2ReplaceMiddleIndex(self):
+        tokens = self._parse("abc")
+        tokens.replace(1, "x")
+        tokens.replace(1, "y")
+
+        result = tokens.toString()
+        expecting = "ayc"
+        self.assertEqual(result, expecting)
+
+
+    def test2ReplaceMiddleIndex1InsertBefore(self):
+        tokens = self._parse("abc")
+        tokens.insertBefore(0, "_")
+        tokens.replace(1, "x")
+        tokens.replace(1, "y")
+
+        result = tokens.toString()
+        expecting = "_ayc"
+        self.assertEqual(expecting, result)
+
+
+    def testReplaceThenDeleteMiddleIndex(self):
+        tokens = self._parse("abc")
+        tokens.replace(1, "x")
+        tokens.delete(1)
+
+        result = tokens.toString()
+        expecting = "ac"
+        self.assertEqual(result, expecting)
+
+
+    def testInsertInPriorReplace(self):
+        tokens = self._parse("abc")
+        tokens.replace(0, 2, "x")
+        tokens.insertBefore(1, "0")
+        self.assertRaisesRegex(
+            ValueError,
+            (r'insert op <InsertBeforeOp@1:"0"> within boundaries of '
+             r'previous <ReplaceOp@0\.\.2:"x">'),
+            tokens.toString)
+
+    def testInsertThenReplaceSameIndex(self):
+        tokens = self._parse("abc")
+        tokens.insertBefore(0, "0")
+        tokens.replace(0, "x")  # supercedes insert at 0
+
+        result = tokens.toString()
+        expecting = "0xbc"
+        self.assertEqual(result, expecting)
+
+
+    def test2InsertMiddleIndex(self):
+        tokens = self._parse("abc")
+        tokens.insertBefore(1, "x")
+        tokens.insertBefore(1, "y")
+
+        result = tokens.toString()
+        expecting = "ayxbc"
+        self.assertEqual(result, expecting)
+
+
+    def test2InsertThenReplaceIndex0(self):
+        tokens = self._parse("abc")
+        tokens.insertBefore(0, "x")
+        tokens.insertBefore(0, "y")
+        tokens.replace(0, "z")
+
+        result = tokens.toString()
+        expecting = "yxzbc"
+        self.assertEqual(result, expecting)
+
+
+    def testReplaceThenInsertBeforeLastIndex(self):
+        tokens = self._parse("abc")
+        tokens.replace(2, "x")
+        tokens.insertBefore(2, "y")
+
+        result = tokens.toString()
+        expecting = "abyx"
+        self.assertEqual(result, expecting)
+
+
+    def testInsertThenReplaceLastIndex(self):
+        tokens = self._parse("abc")
+        tokens.insertBefore(2, "y")
+        tokens.replace(2, "x")
+
+        result = tokens.toString()
+        expecting = "abyx"
+        self.assertEqual(result, expecting)
+
+
+    def testReplaceThenInsertAfterLastIndex(self):
+        tokens = self._parse("abc")
+        tokens.replace(2, "x")
+        tokens.insertAfter(2, "y")
+
+        result = tokens.toString()
+        expecting = "abxy"
+        self.assertEqual(result, expecting)
+
+
+    def testReplaceRangeThenInsertAtLeftEdge(self):
+        tokens = self._parse("abcccba")
+        tokens.replace(2, 4, "x")
+        tokens.insertBefore(2, "y")
+
+        result = tokens.toString()
+        expecting = "abyxba"
+        self.assertEqual(result, expecting)
+
+
+    def testReplaceRangeThenInsertAtRightEdge(self):
+        tokens = self._parse("abcccba")
+        tokens.replace(2, 4, "x")
+        tokens.insertBefore(4, "y") # no effect; within range of a replace
+
+        self.assertRaisesRegex(
+            ValueError,
+            (r'insert op <InsertBeforeOp@4:"y"> within boundaries of '
+             r'previous <ReplaceOp@2\.\.4:"x">'),
+            tokens.toString)
+
+
+    def testReplaceRangeThenInsertAfterRightEdge(self):
+        tokens = self._parse("abcccba")
+        tokens.replace(2, 4, "x")
+        tokens.insertAfter(4, "y")
+
+        result = tokens.toString()
+        expecting = "abxyba"
+        self.assertEqual(result, expecting)
+
+
+    def testReplaceAll(self):
+        tokens = self._parse("abcccba")
+        tokens.replace(0, 6, "x")
+
+        result = tokens.toString()
+        expecting = "x"
+        self.assertEqual(result, expecting)
+
+
+    def testReplaceSubsetThenFetch(self):
+        tokens = self._parse("abcccba")
+        tokens.replace(2, 4, "xyz")
+
+        result = tokens.toString(0, 6)
+        expecting = "abxyzba"
+        self.assertEqual(result, expecting)
+
+
+    def testReplaceThenReplaceSuperset(self):
+        tokens = self._parse("abcccba")
+        tokens.replace(2, 4, "xyz")
+        tokens.replace(3, 5, "foo") # overlaps, error
+
+        self.assertRaisesRegex(
+            ValueError,
+            (r'replace op boundaries of <ReplaceOp@3\.\.5:"foo"> overlap '
+             r'with previous <ReplaceOp@2\.\.4:"xyz">'),
+            tokens.toString)
+
+
+    def testReplaceThenReplaceLowerIndexedSuperset(self):
+        tokens = self._parse("abcccba")
+        tokens.replace(2, 4, "xyz")
+        tokens.replace(1, 3, "foo") # overlap, error
+
+        self.assertRaisesRegex(
+            ValueError,
+            (r'replace op boundaries of <ReplaceOp@1\.\.3:"foo"> overlap '
+             r'with previous <ReplaceOp@2\.\.4:"xyz">'),
+            tokens.toString)
+
+
+    def testReplaceSingleMiddleThenOverlappingSuperset(self):
+        tokens = self._parse("abcba")
+        tokens.replace(2, 2, "xyz")
+        tokens.replace(0, 3, "foo")
+
+        result = tokens.toString()
+        expecting = "fooa"
+        self.assertEqual(result, expecting)
+
+
+    def testCombineInserts(self):
+        tokens = self._parse("abc")
+        tokens.insertBefore(0, "x")
+        tokens.insertBefore(0, "y")
+        result = tokens.toString()
+        expecting = "yxabc"
+        self.assertEqual(expecting, result)
+
+
+    def testCombine3Inserts(self):
+        tokens = self._parse("abc")
+        tokens.insertBefore(1, "x")
+        tokens.insertBefore(0, "y")
+        tokens.insertBefore(1, "z")
+        result = tokens.toString()
+        expecting = "yazxbc"
+        self.assertEqual(expecting, result)
+
+
+    def testCombineInsertOnLeftWithReplace(self):
+        tokens = self._parse("abc")
+        tokens.replace(0, 2, "foo")
+        tokens.insertBefore(0, "z") # combine with left edge of rewrite
+        result = tokens.toString()
+        expecting = "zfoo"
+        self.assertEqual(expecting, result)
+
+
+    def testCombineInsertOnLeftWithDelete(self):
+        tokens = self._parse("abc")
+        tokens.delete(0, 2)
+        tokens.insertBefore(0, "z") # combine with left edge of rewrite
+        result = tokens.toString()
+        expecting = "z" # make sure combo is not znull
+        self.assertEqual(expecting, result)
+
+
+    def testDisjointInserts(self):
+        tokens = self._parse("abc")
+        tokens.insertBefore(1, "x")
+        tokens.insertBefore(2, "y")
+        tokens.insertBefore(0, "z")
+        result = tokens.toString()
+        expecting = "zaxbyc"
+        self.assertEqual(expecting, result)
+
+
+    def testOverlappingReplace(self):
+        tokens = self._parse("abcc")
+        tokens.replace(1, 2, "foo")
+        tokens.replace(0, 3, "bar") # wipes prior nested replace
+        result = tokens.toString()
+        expecting = "bar"
+        self.assertEqual(expecting, result)
+
+
+    def testOverlappingReplace2(self):
+        tokens = self._parse("abcc")
+        tokens.replace(0, 3, "bar")
+        tokens.replace(1, 2, "foo") # cannot split earlier replace
+
+        self.assertRaisesRegex(
+            ValueError,
+            (r'replace op boundaries of <ReplaceOp@1\.\.2:"foo"> overlap '
+             r'with previous <ReplaceOp@0\.\.3:"bar">'),
+            tokens.toString)
+
+
+    def testOverlappingReplace3(self):
+        tokens = self._parse("abcc")
+        tokens.replace(1, 2, "foo")
+        tokens.replace(0, 2, "bar") # wipes prior nested replace
+        result = tokens.toString()
+        expecting = "barc"
+        self.assertEqual(expecting, result)
+
+
+    def testOverlappingReplace4(self):
+        tokens = self._parse("abcc")
+        tokens.replace(1, 2, "foo")
+        tokens.replace(1, 3, "bar") # wipes prior nested replace
+        result = tokens.toString()
+        expecting = "abar"
+        self.assertEqual(expecting, result)
+
+
+    def testDropIdenticalReplace(self):
+        tokens = self._parse("abcc")
+        tokens.replace(1, 2, "foo")
+        tokens.replace(1, 2, "foo") # drop previous, identical
+        result = tokens.toString()
+        expecting = "afooc"
+        self.assertEqual(expecting, result)
+
+
+    def testDropPrevCoveredInsert(self):
+        tokens = self._parse("abc")
+        tokens.insertBefore(1, "foo")
+        tokens.replace(1, 2, "foo") # kill prev insert
+        result = tokens.toString()
+        expecting = "afoofoo"
+        self.assertEqual(expecting, result)
+
+
+    def testLeaveAloneDisjointInsert(self):
+        tokens = self._parse("abcc")
+        tokens.insertBefore(1, "x")
+        tokens.replace(2, 3, "foo")
+        result = tokens.toString()
+        expecting = "axbfoo"
+        self.assertEqual(expecting, result)
+
+
+    def testLeaveAloneDisjointInsert2(self):
+        tokens = self._parse("abcc")
+        tokens.replace(2, 3, "foo")
+        tokens.insertBefore(1, "x")
+        result = tokens.toString()
+        expecting = "axbfoo"
+        self.assertEqual(expecting, result)
+
+
+    def testInsertBeforeTokenThenDeleteThatToken(self):
+        tokens = self._parse("abc")
+        tokens.insertBefore(2, "y")
+        tokens.delete(2)
+        result = tokens.toString()
+        expecting = "aby"
+        self.assertEqual(expecting, result)
+
+
+class T2(testbase.ANTLRTest):
+    def setUp(self):
+        self.compileGrammar('t048rewrite2.g')
+
+
+    def _parse(self, input):
+        cStream = antlr3.StringStream(input)
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.TokenRewriteStream(lexer)
+        tStream.fillBuffer()
+
+        return tStream
+
+
+    def testToStringStartStop(self):
+        # Tokens: 0123456789
+        # Input:  x = 3 * 0
+        tokens = self._parse("x = 3 * 0;")
+        tokens.replace(4, 8, "0") # replace 3 * 0 with 0
+
+        result = tokens.toOriginalString()
+        expecting = "x = 3 * 0;"
+        self.assertEqual(expecting, result)
+
+        result = tokens.toString()
+        expecting = "x = 0;"
+        self.assertEqual(expecting, result)
+
+        result = tokens.toString(0, 9)
+        expecting = "x = 0;"
+        self.assertEqual(expecting, result)
+
+        result = tokens.toString(4, 8)
+        expecting = "0"
+        self.assertEqual(expecting, result)
+
+
+    def testToStringStartStop2(self):
+        # Tokens: 012345678901234567
+        # Input:  x = 3 * 0 + 2 * 0
+        tokens = self._parse("x = 3 * 0 + 2 * 0;")
+
+        result = tokens.toOriginalString()
+        expecting = "x = 3 * 0 + 2 * 0;"
+        self.assertEqual(expecting, result)
+
+        tokens.replace(4, 8, "0") # replace 3 * 0 with 0
+        result = tokens.toString()
+        expecting = "x = 0 + 2 * 0;"
+        self.assertEqual(expecting, result)
+
+        result = tokens.toString(0, 17)
+        expecting = "x = 0 + 2 * 0;"
+        self.assertEqual(expecting, result)
+
+        result = tokens.toString(4, 8)
+        expecting = "0"
+        self.assertEqual(expecting, result)
+
+        result = tokens.toString(0, 8)
+        expecting = "x = 0"
+        self.assertEqual(expecting, result)
+
+        result = tokens.toString(12, 16)
+        expecting = "2 * 0"
+        self.assertEqual(expecting, result)
+
+        tokens.insertAfter(17, "// comment")
+        result = tokens.toString(12, 18)
+        expecting = "2 * 0;// comment"
+        self.assertEqual(expecting, result)
+
+        result = tokens.toString(0, 8) # try again after insert at end
+        expecting = "x = 0"
+        self.assertEqual(expecting, result)
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/runtime/Python3/tests/t048rewrite2.g b/runtime/Python3/tests/t048rewrite2.g
new file mode 100644
index 0000000..60178d7
--- /dev/null
+++ b/runtime/Python3/tests/t048rewrite2.g
@@ -0,0 +1,12 @@
+lexer grammar t048rewrite2;
+options {
+    language=Python3;
+}
+
+ID : 'a'..'z'+;
+INT : '0'..'9'+;
+SEMI : ';';
+PLUS : '+';
+MUL : '*';
+ASSIGN : '=';
+WS : ' '+;
diff --git a/runtime/Python3/tests/t049treeparser.py b/runtime/Python3/tests/t049treeparser.py
new file mode 100644
index 0000000..ec77618
--- /dev/null
+++ b/runtime/Python3/tests/t049treeparser.py
@@ -0,0 +1,477 @@
+import unittest
+import textwrap
+import antlr3
+import antlr3.tree
+import testbase
+
+class T(testbase.ANTLRTest):
+    def walkerClass(self, base):
+        class TWalker(base):
+            def __init__(self, *args, **kwargs):
+                super().__init__(*args, **kwargs)
+
+                self._output = ""
+
+
+            def capture(self, t):
+                self._output += t
+
+
+            def traceIn(self, ruleName, ruleIndex):
+                self.traces.append('>'+ruleName)
+
+
+            def traceOut(self, ruleName, ruleIndex):
+                self.traces.append('<'+ruleName)
+
+
+            def recover(self, input, re):
+                # no error recovery yet, just crash!
+                raise
+            
+        return TWalker
+    
+
+    def execTreeParser(self, grammar, grammarEntry, treeGrammar, treeEntry, input):
+        lexerCls, parserCls = self.compileInlineGrammar(grammar)
+        walkerCls = self.compileInlineGrammar(treeGrammar)
+
+        cStream = antlr3.StringStream(input)
+        lexer = lexerCls(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = parserCls(tStream)
+        r = getattr(parser, grammarEntry)()
+        nodes = antlr3.tree.CommonTreeNodeStream(r.tree)
+        nodes.setTokenStream(tStream)
+        walker = walkerCls(nodes)
+        getattr(walker, treeEntry)()
+
+        return walker._output
+    
+
+    def testFlatList(self):
+        grammar = textwrap.dedent(
+        r'''grammar T;
+        options {
+            language=Python3;
+            output=AST;
+        }
+        a : ID INT;
+        ID : 'a'..'z'+ ;
+        INT : '0'..'9'+;
+        WS : (' '|'\n') {$channel=HIDDEN;} ;
+        ''')
+        
+        treeGrammar = textwrap.dedent(
+        r'''tree grammar TP;
+        options {
+            language=Python3;
+            ASTLabelType=CommonTree;
+        }
+        a : ID INT
+            {self.capture("{}, {}".format($ID, $INT))}
+          ;
+        ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            "abc 34"
+            )
+
+        self.assertEqual("abc, 34", found)
+        
+
+
+    def testSimpleTree(self):
+        grammar = textwrap.dedent(
+            r'''grammar T;
+            options {
+                language=Python3;
+                output=AST;
+            }
+            a : ID INT -> ^(ID INT);
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\\n') {$channel=HIDDEN;} ;
+            ''')
+
+        treeGrammar = textwrap.dedent(
+            r'''tree grammar TP;
+            options {
+                language=Python3;
+                ASTLabelType=CommonTree;
+            }
+            a : ^(ID INT)
+                {self.capture(str($ID)+", "+str($INT))}
+              ;
+            ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            "abc 34"
+            )
+            
+        self.assertEqual("abc, 34", found)
+
+
+    def testFlatVsTreeDecision(self):
+        grammar = textwrap.dedent(
+            r'''grammar T;
+            options {
+                language=Python3;
+                output=AST;
+            }
+            a : b c ;
+            b : ID INT -> ^(ID INT);
+            c : ID INT;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\\n') {$channel=HIDDEN;} ;
+            ''')
+        
+        treeGrammar = textwrap.dedent(
+            r'''tree grammar TP;
+            options {
+                language=Python3;
+                ASTLabelType=CommonTree;
+            }
+            a : b b ;
+            b : ID INT    {self.capture(str($ID)+" "+str($INT)+'\n')}
+              | ^(ID INT) {self.capture("^("+str($ID)+" "+str($INT)+')');}
+              ;
+            ''')
+        
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            "a 1 b 2"
+            )
+        self.assertEqual("^(a 1)b 2\n", found)
+
+
+    def testFlatVsTreeDecision2(self):
+        grammar = textwrap.dedent(
+            r"""grammar T;
+            options {
+                language=Python3;
+                output=AST;
+            }
+            a : b c ;
+            b : ID INT+ -> ^(ID INT+);
+            c : ID INT+;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN;} ;
+            """)
+
+        treeGrammar = textwrap.dedent(
+            r'''tree grammar TP;
+            options {
+                language=Python3;
+                ASTLabelType=CommonTree;
+            }
+            a : b b ;
+            b : ID INT+    {self.capture(str($ID)+" "+str($INT)+"\n")}
+              | ^(x=ID (y=INT)+) {self.capture("^("+str($x)+' '+str($y)+')')}
+              ;
+            ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            "a 1 2 3 b 4 5"
+            )
+        self.assertEqual("^(a 3)b 5\n", found)
+
+
+    def testCyclicDFALookahead(self):
+        grammar = textwrap.dedent(
+            r'''grammar T;
+            options {
+                language=Python3;
+                output=AST;
+            }
+            a : ID INT+ PERIOD;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            SEMI : ';' ;
+            PERIOD : '.' ;
+            WS : (' '|'\n') {$channel=HIDDEN;} ;
+            ''')
+
+        treeGrammar = textwrap.dedent(
+            r'''tree grammar TP;
+            options {
+                language=Python3;
+                ASTLabelType=CommonTree;
+            }
+            a : ID INT+ PERIOD {self.capture("alt 1")}
+              | ID INT+ SEMI   {self.capture("alt 2")}
+              ;
+            ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            "a 1 2 3."
+            )
+        self.assertEqual("alt 1", found)
+
+
+    def testNullableChildList(self):
+        grammar = textwrap.dedent(
+            r'''grammar T;
+            options {
+                language=Python3;
+                output=AST;
+            }
+            a : ID INT? -> ^(ID INT?);
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\\n') {$channel=HIDDEN;} ;
+            ''')
+        
+        treeGrammar = textwrap.dedent(
+            r'''tree grammar TP;
+            options {
+                language=Python3;
+                ASTLabelType=CommonTree;
+            }
+            a : ^(ID INT?)
+                {self.capture(str($ID))}
+              ;
+            ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            "abc"
+            )
+        self.assertEqual("abc", found)
+
+
+    def testNullableChildList2(self):
+        grammar = textwrap.dedent(
+            r'''grammar T;
+            options {
+                language=Python3;
+                output=AST;
+            }
+            a : ID INT? SEMI -> ^(ID INT?) SEMI ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            SEMI : ';' ;
+            WS : (' '|'\n') {$channel=HIDDEN;} ;
+            ''')
+
+        treeGrammar = textwrap.dedent(
+            r'''tree grammar TP;
+            options {
+                language=Python3;
+                ASTLabelType=CommonTree;
+            }
+            a : ^(ID INT?) SEMI
+                {self.capture(str($ID))}
+              ;
+            ''')
+        
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            "abc;"
+            )
+        self.assertEqual("abc", found)
+
+
+    def testNullableChildList3(self):
+        grammar = textwrap.dedent(
+            r'''grammar T;
+            options {
+                language=Python3;
+                output=AST;
+            }
+            a : x=ID INT? (y=ID)? SEMI -> ^($x INT? $y?) SEMI ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            SEMI : ';' ;
+            WS : (' '|'\\n') {$channel=HIDDEN;} ;
+            ''')
+
+        treeGrammar = textwrap.dedent(
+            r'''tree grammar TP;
+            options {
+                language=Python3;
+                ASTLabelType=CommonTree;
+            }
+            a : ^(ID INT? b) SEMI
+                {self.capture(str($ID)+", "+str($b.text))}
+              ;
+            b : ID? ;
+            ''')
+        
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            "abc def;"
+            )
+        self.assertEqual("abc, def", found)
+
+
+    def testActionsAfterRoot(self):
+        grammar = textwrap.dedent(
+            r'''grammar T;
+            options {
+                language=Python3;
+                output=AST;
+            }
+            a : x=ID INT? SEMI -> ^($x INT?) ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            SEMI : ';' ;
+            WS : (' '|'\n') {$channel=HIDDEN;} ;
+            ''')
+
+        treeGrammar = textwrap.dedent(
+            r'''tree grammar TP;
+            options {
+                language=Python3;
+                ASTLabelType=CommonTree;
+            }
+            a @init {x=0} : ^(ID {x=1} {x=2} INT?)
+                {self.capture(str($ID)+", "+str(x))}
+              ;
+            ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            "abc;"
+            )
+        self.assertEqual("abc, 2", found)
+
+
+    def testWildcardLookahead(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3; output=AST;}
+            a : ID '+'^ INT;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            SEMI : ';' ;
+            PERIOD : '.' ;
+            WS : (' '|'\n') {$channel=HIDDEN;} ;
+            ''')
+
+        treeGrammar = textwrap.dedent(
+            r'''
+            tree grammar TP; 
+            options {language=Python3; tokenVocab=T; ASTLabelType=CommonTree;}
+            a : ^('+' . INT) { self.capture("alt 1") }
+              ;
+            ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            "a + 2")
+        self.assertEqual("alt 1", found)
+
+
+    def testWildcardLookahead2(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3; output=AST;}
+            a : ID '+'^ INT;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            SEMI : ';' ;
+            PERIOD : '.' ;
+            WS : (' '|'\n') {$channel=HIDDEN;} ;
+            ''')
+
+        treeGrammar = textwrap.dedent(
+            r'''
+            tree grammar TP;
+            options {language=Python3; tokenVocab=T; ASTLabelType=CommonTree;}
+            a : ^('+' . INT) { self.capture("alt 1") }
+              | ^('+' . .)   { self.capture("alt 2") }
+              ;
+            ''')
+
+        # AMBIG upon '+' DOWN INT UP etc.. but so what.
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            "a + 2")
+        self.assertEqual("alt 1", found)
+
+
+    def testWildcardLookahead3(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3; output=AST;}
+            a : ID '+'^ INT;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            SEMI : ';' ;
+            PERIOD : '.' ;
+            WS : (' '|'\n') {$channel=HIDDEN;} ;
+            ''')
+
+        treeGrammar = textwrap.dedent(
+            r'''
+            tree grammar TP;
+            options {language=Python3; tokenVocab=T; ASTLabelType=CommonTree;}
+            a : ^('+' ID INT) { self.capture("alt 1") }
+              | ^('+' . .)   { self.capture("alt 2") }
+              ;
+            ''')
+
+        # AMBIG upon '+' DOWN INT UP etc.. but so what.
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            "a + 2")
+        self.assertEqual("alt 1", found)
+
+
+    def testWildcardPlusLookahead(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3; output=AST;}
+            a : ID '+'^ INT;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            SEMI : ';' ;
+            PERIOD : '.' ;
+            WS : (' '|'\n') {$channel=HIDDEN;} ;
+            ''')
+
+        treeGrammar = textwrap.dedent(
+            r'''
+            tree grammar TP;
+            options {language=Python3; tokenVocab=T; ASTLabelType=CommonTree;}
+            a : ^('+' INT INT ) { self.capture("alt 1") }
+              | ^('+' .+)   { self.capture("alt 2") }
+              ;
+            ''')
+
+        # AMBIG upon '+' DOWN INT UP etc.. but so what.
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            "a + 2")
+        self.assertEqual("alt 2", found)
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/runtime/Python3/tests/t050decorate.g b/runtime/Python3/tests/t050decorate.g
new file mode 100644
index 0000000..50e54e7
--- /dev/null
+++ b/runtime/Python3/tests/t050decorate.g
@@ -0,0 +1,29 @@
+grammar t050decorate;
+options {
+  language = Python3;
+}
+
+@header {
+    def logme(func):
+        def decorated(self, *args, **kwargs):
+            self.events.append('before')
+            try:
+                return func(self, *args, **kwargs)
+            finally:
+                self.events.append('after')
+
+        return decorated
+}
+
+@parser::init {
+self.events = []
+}
+
+document
+@decorate {
+    @logme
+}
+    : IDENTIFIER
+    ;
+
+IDENTIFIER: ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*;
diff --git a/runtime/Python3/tests/t050decorate.py b/runtime/Python3/tests/t050decorate.py
new file mode 100644
index 0000000..b5337a6
--- /dev/null
+++ b/runtime/Python3/tests/t050decorate.py
@@ -0,0 +1,21 @@
+import antlr3
+import testbase
+import unittest
+
+class t013parser(testbase.ANTLRTest):
+    def setUp(self):
+        self.compileGrammar()
+        
+        
+    def testValid(self):
+        cStream = antlr3.StringStream('foobar')
+        lexer = self.getLexer(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = self.getParser(tStream)
+        parser.document()
+
+        self.assertEqual(parser.events, ['before', 'after'])
+          
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/runtime/Python3/tests/t051treeRewriteAST.py b/runtime/Python3/tests/t051treeRewriteAST.py
new file mode 100644
index 0000000..3c9ced6
--- /dev/null
+++ b/runtime/Python3/tests/t051treeRewriteAST.py
@@ -0,0 +1,1565 @@
+import unittest
+import textwrap
+import antlr3
+import antlr3.tree
+import testbase
+
+class T(testbase.ANTLRTest):
+    def walkerClass(self, base):
+        class TWalker(base):
+            def __init__(self, *args, **kwargs):
+                super().__init__(*args, **kwargs)
+                self.buf = ""
+
+            def traceIn(self, ruleName, ruleIndex):
+                self.traces.append('>'+ruleName)
+
+
+            def traceOut(self, ruleName, ruleIndex):
+                self.traces.append('<'+ruleName)
+
+
+            def recover(self, input, re):
+                # no error recovery yet, just crash!
+                raise
+
+        return TWalker
+
+
+    def execTreeParser(self, grammar, grammarEntry, treeGrammar, treeEntry, input):
+        lexerCls, parserCls = self.compileInlineGrammar(grammar)
+        walkerCls = self.compileInlineGrammar(treeGrammar)
+
+        cStream = antlr3.StringStream(input)
+        lexer = lexerCls(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = parserCls(tStream)
+        r = getattr(parser, grammarEntry)()
+        nodes = antlr3.tree.CommonTreeNodeStream(r.tree)
+        nodes.setTokenStream(tStream)
+        walker = walkerCls(nodes)
+        r = getattr(walker, treeEntry)()
+
+        if r.tree:
+            return r.tree.toStringTree()
+
+        return ""
+
+
+    def testFlatList(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T1;
+        options {
+            language=Python3;
+            output=AST;
+        }
+        a : ID INT;
+        ID : 'a'..'z'+ ;
+        INT : '0'..'9'+;
+        WS : (' '|'\\n') {$channel=HIDDEN;} ;
+        ''')
+
+        treeGrammar = textwrap.dedent(
+        r'''
+        tree grammar TP1;
+        options {
+            language=Python3;
+            output=AST;
+            ASTLabelType=CommonTree;
+            tokenVocab=T1;
+        }
+
+        a : ID INT -> INT ID;
+        ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            "abc 34"
+            )
+
+        self.assertEqual("34 abc", found)
+
+
+    def testSimpleTree(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T2;
+        options {
+            language=Python3;
+            output=AST;
+        }
+        a : ID INT -> ^(ID INT);
+        ID : 'a'..'z'+ ;
+        INT : '0'..'9'+;
+        WS : (' '|'\\n') {$channel=HIDDEN;} ;
+        ''')
+
+        treeGrammar = textwrap.dedent(
+        r'''
+        tree grammar TP2;
+        options {
+            language=Python3;
+            output=AST;
+            ASTLabelType=CommonTree;
+            tokenVocab=T2;
+        }
+        a : ^(ID INT) -> ^(INT ID);
+        ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            "abc 34"
+            )
+
+        self.assertEqual("(34 abc)", found)
+
+
+    def testCombinedRewriteAndAuto(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T3;
+        options {
+            language=Python3;
+            output=AST;
+        }
+        a : ID INT -> ^(ID INT) | INT ;
+        ID : 'a'..'z'+ ;
+        INT : '0'..'9'+;
+        WS : (' '|'\\n') {$channel=HIDDEN;} ;
+        ''')
+
+        treeGrammar = textwrap.dedent(
+        r'''
+        tree grammar TP3;
+        options {
+            language=Python3;
+            output=AST;
+            ASTLabelType=CommonTree;
+            tokenVocab=T3;
+        }
+        a : ^(ID INT) -> ^(INT ID) | INT;
+        ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            "abc 34"
+            )
+
+        self.assertEqual("(34 abc)", found)
+
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            "34"
+            )
+
+        self.assertEqual("34", found)
+
+
+    def testAvoidDup(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T4;
+        options {
+            language=Python3;
+            output=AST;
+        }
+        a : ID ;
+        ID : 'a'..'z'+ ;
+        INT : '0'..'9'+;
+        WS : (' '|'\\n') {$channel=HIDDEN;} ;
+        ''')
+
+        treeGrammar = textwrap.dedent(
+        r'''
+        tree grammar TP4;
+        options {
+            language=Python3;
+            output=AST;
+            ASTLabelType=CommonTree;
+            tokenVocab=T4;
+        }
+        a : ID -> ^(ID ID);
+        ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            "abc"
+            )
+
+        self.assertEqual("(abc abc)", found)
+
+
+    def testLoop(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T5;
+        options {
+            language=Python3;
+            output=AST;
+        }
+        a : ID+ INT+ -> (^(ID INT))+ ;
+        ID : 'a'..'z'+ ;
+        INT : '0'..'9'+;
+        WS : (' '|'\\n') {$channel=HIDDEN;} ;
+        ''')
+
+        treeGrammar = textwrap.dedent(
+        r'''
+        tree grammar TP5;
+        options {
+            language=Python3;
+            output=AST;
+            ASTLabelType=CommonTree;
+            tokenVocab=T5;
+        }
+        a : (^(ID INT))+ -> INT+ ID+;
+        ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            "a b c 3 4 5"
+            )
+
+        self.assertEqual("3 4 5 a b c", found)
+
+
+    def testAutoDup(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T6;
+        options {
+            language=Python3;
+            output=AST;
+        }
+        a : ID ;
+        ID : 'a'..'z'+ ;
+        INT : '0'..'9'+;
+        WS : (' '|'\\n') {$channel=HIDDEN;} ;
+        ''')
+
+        treeGrammar = textwrap.dedent(
+        r'''
+        tree grammar TP6;
+        options {
+            language=Python3;
+            output=AST;
+            ASTLabelType=CommonTree;
+            tokenVocab=T6;
+        }
+        a : ID;
+        ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            "abc"
+            )
+
+        self.assertEqual("abc", found)
+
+
+    def testAutoDupRule(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T7;
+        options {
+            language=Python3;
+            output=AST;
+        }
+        a : ID INT ;
+        ID : 'a'..'z'+ ;
+        INT : '0'..'9'+;
+        WS : (' '|'\\n') {$channel=HIDDEN;} ;
+        ''')
+
+        treeGrammar = textwrap.dedent(
+        r'''
+        tree grammar TP7;
+        options {
+            language=Python3;
+            output=AST;
+            ASTLabelType=CommonTree;
+            tokenVocab=T7;
+        }
+        a : b c ;
+        b : ID ;
+        c : INT ;
+        ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            "a 1"
+            )
+
+        self.assertEqual("a 1", found)
+
+
+    def testAutoWildcard(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : ID INT ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN;} ;
+            ''')
+
+        treeGrammar = textwrap.dedent(
+            r'''
+            tree grammar TP;
+            options {language=Python3;output=AST; ASTLabelType=CommonTree; tokenVocab=T;}
+            a : ID .
+              ;
+            ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            "abc 34")
+        self.assertEqual("abc 34", found)
+
+
+    def testAutoWildcard2(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : ID INT -> ^(ID INT);
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN;} ;
+            ''')
+
+        treeGrammar = textwrap.dedent(
+            r'''
+            tree grammar TP;
+            options {language=Python3;output=AST; ASTLabelType=CommonTree; tokenVocab=T;}
+            a : ^(ID .)
+              ;
+            ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            "abc 34")
+        self.assertEqual("(abc 34)", found)
+
+
+    def testAutoWildcardWithLabel(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : ID INT ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN;} ;
+            ''')
+
+        treeGrammar = textwrap.dedent(
+            r'''
+            tree grammar TP;
+            options {language=Python3;output=AST; ASTLabelType=CommonTree; tokenVocab=T;}
+            a : ID c=.
+              ;
+            ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            "abc 34")
+        self.assertEqual("abc 34", found)
+
+
+    def testAutoWildcardWithListLabel(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : ID INT ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN;} ;
+            ''')
+
+        treeGrammar = textwrap.dedent(
+            r'''
+            tree grammar TP;
+            options {language=Python3;output=AST; ASTLabelType=CommonTree; tokenVocab=T;}
+            a : ID c+=.
+              ;
+            ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            "abc 34")
+        self.assertEqual("abc 34", found)
+
+
+    def testAutoDupMultiple(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T8;
+        options {
+            language=Python3;
+            output=AST;
+        }
+        a : ID ID INT;
+        ID : 'a'..'z'+ ;
+        INT : '0'..'9'+;
+        WS : (' '|'\\n') {$channel=HIDDEN;} ;
+        ''')
+
+        treeGrammar = textwrap.dedent(
+        r'''
+        tree grammar TP8;
+        options {
+            language=Python3;
+            output=AST;
+            ASTLabelType=CommonTree;
+            tokenVocab=T8;
+        }
+        a : ID ID INT
+          ;
+        ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            "a b 3"
+            )
+
+        self.assertEqual("a b 3", found)
+
+
+    def testAutoDupTree(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T9;
+        options {
+            language=Python3;
+            output=AST;
+        }
+        a : ID INT -> ^(ID INT);
+        ID : 'a'..'z'+ ;
+        INT : '0'..'9'+;
+        WS : (' '|'\\n') {$channel=HIDDEN;} ;
+        ''')
+
+        treeGrammar = textwrap.dedent(
+        r'''
+        tree grammar TP9;
+        options {
+            language=Python3;
+            output=AST;
+            ASTLabelType=CommonTree;
+            tokenVocab=T9;
+        }
+        a : ^(ID INT)
+          ;
+        ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            "a 3"
+            )
+
+        self.assertEqual("(a 3)", found)
+
+
+    def testAutoDupTreeWithLabels(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T10;
+        options {
+            language=Python3;
+            output=AST;
+        }
+        a : ID INT -> ^(ID INT);
+        ID : 'a'..'z'+ ;
+        INT : '0'..'9'+;
+        WS : (' '|'\\n') {$channel=HIDDEN;} ;
+        ''')
+
+        treeGrammar = textwrap.dedent(
+        r'''
+        tree grammar TP10;
+        options {
+            language=Python3;
+            output=AST;
+            ASTLabelType=CommonTree;
+            tokenVocab=T10;
+        }
+        a : ^(x=ID y=INT)
+          ;
+        ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            "a 3"
+            )
+
+        self.assertEqual("(a 3)", found)
+
+
+    def testAutoDupTreeWithListLabels(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T11;
+        options {
+            language=Python3;
+            output=AST;
+        }
+        a : ID INT -> ^(ID INT);
+        ID : 'a'..'z'+ ;
+        INT : '0'..'9'+;
+        WS : (' '|'\\n') {$channel=HIDDEN;} ;
+        ''')
+
+        treeGrammar = textwrap.dedent(
+        r'''
+        tree grammar TP11;
+        options {
+            language=Python3;
+            output=AST;
+            ASTLabelType=CommonTree;
+            tokenVocab=T11;
+        }
+        a : ^(x+=ID y+=INT)
+          ;
+        ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            "a 3"
+            )
+
+        self.assertEqual("(a 3)", found)
+
+
+    def testAutoDupTreeWithRuleRoot(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T12;
+        options {
+            language=Python3;
+            output=AST;
+        }
+        a : ID INT -> ^(ID INT);
+        ID : 'a'..'z'+ ;
+        INT : '0'..'9'+;
+        WS : (' '|'\\n') {$channel=HIDDEN;} ;
+        ''')
+
+        treeGrammar = textwrap.dedent(
+        r'''
+        tree grammar TP12;
+        options {
+            language=Python3;
+            output=AST;
+            ASTLabelType=CommonTree;
+            tokenVocab=T12;
+        }
+        a : ^(b INT) ;
+        b : ID ;
+        ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            "a 3"
+            )
+
+        self.assertEqual("(a 3)", found)
+
+
+    def testAutoDupTreeWithRuleRootAndLabels(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T13;
+        options {
+            language=Python3;
+            output=AST;
+        }
+        a : ID INT -> ^(ID INT);
+        ID : 'a'..'z'+ ;
+        INT : '0'..'9'+;
+        WS : (' '|'\\n') {$channel=HIDDEN;} ;
+        ''')
+
+        treeGrammar = textwrap.dedent(
+        r'''
+        tree grammar TP13;
+        options {
+            language=Python3;
+            output=AST;
+            ASTLabelType=CommonTree;
+            tokenVocab=T13;
+        }
+        a : ^(x=b INT) ;
+        b : ID ;
+        ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            "a 3"
+            )
+
+        self.assertEqual("(a 3)", found)
+
+
+    def testAutoDupTreeWithRuleRootAndListLabels(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T14;
+        options {
+            language=Python3;
+            output=AST;
+        }
+        a : ID INT -> ^(ID INT);
+        ID : 'a'..'z'+ ;
+        INT : '0'..'9'+;
+        WS : (' '|'\\n') {$channel=HIDDEN;} ;
+        ''')
+
+        treeGrammar = textwrap.dedent(
+        r'''
+        tree grammar TP14;
+        options {
+            language=Python3;
+            output=AST;
+            ASTLabelType=CommonTree;
+            tokenVocab=T14;
+        }
+        a : ^(x+=b y+=c) ;
+        b : ID ;
+        c : INT ;
+        ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            "a 3"
+            )
+
+        self.assertEqual("(a 3)", found)
+
+
+    def testAutoDupNestedTree(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T15;
+        options {
+            language=Python3;
+            output=AST;
+        }
+        a : x=ID y=ID INT -> ^($x ^($y INT));
+        ID : 'a'..'z'+ ;
+        INT : '0'..'9'+;
+        WS : (' '|'\\n') {$channel=HIDDEN;} ;
+        ''')
+
+        treeGrammar = textwrap.dedent(
+        r'''
+        tree grammar TP15;
+        options {
+            language=Python3;
+            output=AST;
+            ASTLabelType=CommonTree;
+            tokenVocab=T15;
+        }
+        a : ^(ID ^(ID INT))
+          ;
+        ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            "a b 3"
+            )
+
+        self.assertEqual("(a (b 3))", found)
+
+
+    def testDelete(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T16;
+        options {
+            language=Python3;
+            output=AST;
+        }
+        a : ID ;
+        ID : 'a'..'z'+ ;
+        INT : '0'..'9'+;
+        WS : (' '|'\\n') {$channel=HIDDEN;} ;
+        ''')
+
+        treeGrammar = textwrap.dedent(
+        r'''
+        tree grammar TP16;
+        options {
+            language=Python3;
+            output=AST;
+            ASTLabelType=CommonTree;
+            tokenVocab=T16;
+        }
+        a : ID ->
+          ;
+        ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            "abc"
+            )
+
+        self.assertEqual("", found)
+
+    def testSetMatchNoRewrite(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {
+                language=Python3;
+                output=AST;
+            }
+            a : ID INT ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN;} ;
+            ''')
+
+        treeGrammar = textwrap.dedent(
+            r'''
+            tree grammar TP;
+            options {
+                language=Python3;
+                output=AST;
+                ASTLabelType=CommonTree;
+                tokenVocab=T;
+            }
+            a : b INT;
+            b : ID | INT;
+            ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            "abc 34"
+            )
+
+        self.assertEqual("abc 34", found)
+
+
+    def testSetOptionalMatchNoRewrite(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {
+                language=Python3;
+                output=AST;
+            }
+            a : ID INT ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN;} ;
+            ''')
+
+        treeGrammar = textwrap.dedent(
+            r'''
+            tree grammar TP;
+            options {
+                language=Python3;
+                output=AST;
+                ASTLabelType=CommonTree;
+                tokenVocab=T;
+            }
+            a : (ID|INT)? INT ;
+            ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            "abc 34")
+
+        self.assertEqual("abc 34", found)
+
+
+    def testSetMatchNoRewriteLevel2(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {
+                language=Python3;
+                output=AST;
+            }
+            a : x=ID INT -> ^($x INT);
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN;} ;
+            ''')
+
+        treeGrammar = textwrap.dedent(
+            r'''
+            tree grammar TP;
+            options {
+                language=Python3;
+                output=AST;
+                ASTLabelType=CommonTree;
+                tokenVocab=T;
+            }
+            a : ^(ID (ID | INT) ) ;
+            ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            "abc 34"
+            )
+
+        self.assertEqual("(abc 34)", found)
+
+
+    def testSetMatchNoRewriteLevel2Root(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {
+                language=Python3;
+                output=AST;
+            }
+            a : x=ID INT -> ^($x INT);
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN;} ;
+            ''')
+
+        treeGrammar = textwrap.dedent(
+            r'''
+            tree grammar TP;
+            options {
+                language=Python3;
+                output=AST;
+                ASTLabelType=CommonTree;
+                tokenVocab=T;
+            }
+            a : ^((ID | INT) INT) ;
+            ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            "abc 34"
+            )
+
+        self.assertEqual("(abc 34)", found)
+
+
+    ## REWRITE MODE
+
+    def testRewriteModeCombinedRewriteAndAuto(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T17;
+        options {
+            language=Python3;
+            output=AST;
+        }
+        a : ID INT -> ^(ID INT) | INT ;
+        ID : 'a'..'z'+ ;
+        INT : '0'..'9'+;
+        WS : (' '|'\\n') {$channel=HIDDEN;} ;
+        ''')
+
+        treeGrammar = textwrap.dedent(
+        r'''
+        tree grammar TP17;
+        options {
+            language=Python3;
+            output=AST;
+            ASTLabelType=CommonTree;
+            tokenVocab=T17;
+            rewrite=true;
+        }
+        a : ^(ID INT) -> ^(ID["ick"] INT)
+          | INT // leaves it alone, returning $a.start
+          ;
+        ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            "abc 34"
+            )
+
+        self.assertEqual("(ick 34)", found)
+
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            "34"
+            )
+
+        self.assertEqual("34", found)
+
+
+    def testRewriteModeFlatTree(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T18;
+            options {
+              language=Python3;
+              output=AST;
+            }
+            a : ID INT -> ID INT | INT ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN;} ;
+            ''')
+
+        treeGrammar = textwrap.dedent(
+            r'''
+            tree grammar TP18;
+            options {
+              language=Python3;
+              output=AST;
+              ASTLabelType=CommonTree;
+              tokenVocab=T18;
+              rewrite=true;
+            }
+            s : ID a ;
+            a : INT -> INT["1"]
+              ;
+            ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 's',
+            "abc 34"
+            )
+        self.assertEqual("abc 1", found)
+
+
+    def testRewriteModeChainRuleFlatTree(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3; output=AST;}
+            a : ID INT -> ID INT | INT ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN;} ;
+            ''')
+
+        treeGrammar = textwrap.dedent(
+            r'''
+            tree grammar TP;
+            options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}
+            s : a ;
+            a : b ;
+            b : ID INT -> INT ID
+              ;
+            ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 's',
+            "abc 34")
+        self.assertEqual("34 abc", found)
+
+
+    def testRewriteModeChainRuleTree(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3; output=AST;}
+            a : ID INT -> ^(ID INT) ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN;} ;
+            ''')
+
+        treeGrammar = textwrap.dedent(
+            r'''
+            tree grammar TP;
+            options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}
+            s : a ;
+            a : b ; // a.tree must become b.tree
+            b : ^(ID INT) -> INT
+              ;
+            ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 's',
+            "abc 34")
+        self.assertEqual("34", found)
+
+
+    def testRewriteModeChainRuleTree2(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3; output=AST;}
+            a : ID INT -> ^(ID INT) ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN;} ;
+            ''')
+
+        treeGrammar = textwrap.dedent(
+            r"""
+            tree grammar TP;
+            options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}
+            tokens { X; }
+            s : a* b ; // only b contributes to tree, but it's after a*; s.tree = b.tree
+            a : X ;
+            b : ^(ID INT) -> INT
+              ;
+            """)
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 's',
+            "abc 34")
+        self.assertEqual("34", found)
+
+
+    def testRewriteModeChainRuleTree3(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3; output=AST;}
+            a : 'boo' ID INT -> 'boo' ^(ID INT) ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN;} ;
+            ''')
+
+        treeGrammar = textwrap.dedent(
+            r"""
+            tree grammar TP;
+            options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}
+            tokens { X; }
+            s : 'boo' a* b ; // don't reset s.tree to b.tree due to 'boo'
+            a : X ;
+            b : ^(ID INT) -> INT
+              ;
+            """)
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 's',
+            "boo abc 34")
+        self.assertEqual("boo 34", found)
+
+
+    def testRewriteModeChainRuleTree4(self):
+        grammar = textwrap.dedent(
+            r"""
+            grammar T;
+            options {language=Python3; output=AST;}
+            a : 'boo' ID INT -> ^('boo' ^(ID INT)) ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN;} ;
+            """)
+
+        treeGrammar = textwrap.dedent(
+            r"""
+            tree grammar TP;
+            options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}
+            tokens { X; }
+            s : ^('boo' a* b) ; // don't reset s.tree to b.tree due to 'boo'
+            a : X ;
+            b : ^(ID INT) -> INT
+              ;
+            """)
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 's',
+            "boo abc 34")
+        self.assertEqual("(boo 34)", found)
+
+
+    def testRewriteModeChainRuleTree5(self):
+        grammar = textwrap.dedent(
+            r"""
+            grammar T;
+            options {language=Python3; output=AST;}
+            a : 'boo' ID INT -> ^('boo' ^(ID INT)) ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN;} ;
+            """)
+
+        treeGrammar = textwrap.dedent(
+            r"""
+            tree grammar TP;
+            options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}
+            tokens { X; }
+            s : ^(a b) ; // s.tree is a.tree
+            a : 'boo' ;
+            b : ^(ID INT) -> INT
+              ;
+            """)
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 's',
+            "boo abc 34")
+        self.assertEqual("(boo 34)", found)
+
+
+    def testRewriteOfRuleRef(self):
+        grammar = textwrap.dedent(
+            r"""
+            grammar T;
+            options {language=Python3; output=AST;}
+            a : ID INT -> ID INT | INT ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN;} ;
+            """)
+
+        treeGrammar = textwrap.dedent(
+            r"""
+            tree grammar TP;
+            options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}
+            s : a -> a ;
+            a : ID INT -> ID INT ;
+            """)
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 's',
+            "abc 34")
+        self.assertEqual("abc 34", found)
+
+
+    def testRewriteOfRuleRefRoot(self):
+        grammar = textwrap.dedent(
+            r"""
+            grammar T;
+            options {language=Python3; output=AST;}
+            a : ID INT INT -> ^(INT ^(ID INT));
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN;} ;
+            """)
+
+        treeGrammar = textwrap.dedent(
+            r"""
+            tree grammar TP;
+            options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}
+            s : ^(a ^(ID INT)) -> a ;
+            a : INT ;
+            """)
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 's',
+            "abc 12 34")
+        # emits whole tree when you ref the root since I can't know whether
+        # you want the children or not.  You might be returning a whole new
+        # tree.  Hmm...still seems weird.  oh well.
+        self.assertEqual("(12 (abc 34))", found)
+
+
+    def testRewriteOfRuleRefRootLabeled(self):
+        grammar = textwrap.dedent(
+            r"""
+            grammar T;
+            options {language=Python3; output=AST;}
+            a : ID INT INT -> ^(INT ^(ID INT));
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN;} ;
+            """)
+
+        treeGrammar = textwrap.dedent(
+            r"""
+            tree grammar TP;
+            options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}
+            s : ^(label=a ^(ID INT)) -> a ;
+            a : INT ;
+            """)
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 's',
+            "abc 12 34")
+        # emits whole tree when you ref the root since I can't know whether
+        # you want the children or not.  You might be returning a whole new
+        # tree.  Hmm...still seems weird.  oh well.
+        self.assertEqual("(12 (abc 34))", found)
+
+
+    def testRewriteOfRuleRefRootListLabeled(self):
+        grammar = textwrap.dedent(
+            r"""
+            grammar T;
+            options {language=Python3; output=AST;}
+            a : ID INT INT -> ^(INT ^(ID INT));
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN;} ;
+            """)
+
+        treeGrammar = textwrap.dedent(
+            r"""
+            tree grammar TP;
+            options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}
+            s : ^(label+=a ^(ID INT)) -> a ;
+            a : INT ;
+            """)
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 's',
+            "abc 12 34")
+        # emits whole tree when you ref the root since I can't know whether
+        # you want the children or not.  You might be returning a whole new
+        # tree.  Hmm...still seems weird.  oh well.
+        self.assertEqual("(12 (abc 34))", found)
+
+
+    def testRewriteOfRuleRefChild(self):
+        grammar = textwrap.dedent(
+            r"""
+            grammar T;
+            options {language=Python3; output=AST;}
+            a : ID INT -> ^(ID ^(INT INT));
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN;} ;
+            """)
+
+        treeGrammar = textwrap.dedent(
+            r"""
+            tree grammar TP;
+            options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}
+            s : ^(ID a) -> a ;
+            a : ^(INT INT) ;
+            """)
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 's',
+            "abc 34")
+        self.assertEqual("(34 34)", found)
+
+
+    def testRewriteOfRuleRefLabel(self):
+        grammar = textwrap.dedent(
+            r"""
+            grammar T;
+            options {language=Python3; output=AST;}
+            a : ID INT -> ^(ID ^(INT INT));
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN;} ;
+            """)
+
+        treeGrammar = textwrap.dedent(
+            r"""
+            tree grammar TP;
+            options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}
+            s : ^(ID label=a) -> a ;
+            a : ^(INT INT) ;
+            """)
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 's',
+            "abc 34")
+        self.assertEqual("(34 34)", found)
+
+
+    def testRewriteOfRuleRefListLabel(self):
+        grammar = textwrap.dedent(
+            r"""
+            grammar T;
+            options {language=Python3; output=AST;}
+            a : ID INT -> ^(ID ^(INT INT));
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN;} ;
+            """)
+
+        treeGrammar = textwrap.dedent(
+            r"""
+            tree grammar TP;
+            options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}
+            s : ^(ID label+=a) -> a ;
+            a : ^(INT INT) ;
+            """)
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 's',
+            "abc 34")
+        self.assertEqual("(34 34)", found)
+
+
+
+    def testRewriteModeWithPredicatedRewrites(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T19;
+            options {
+              language=Python3;
+              output=AST;
+            }
+            a : ID INT -> ^(ID["root"] ^(ID INT)) | INT -> ^(ID["root"] INT) ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN;} ;
+            ''')
+
+        treeGrammar = textwrap.dedent(
+            r'''
+            tree grammar TP19;
+            options {
+              language=Python3;
+              output=AST;
+              ASTLabelType=CommonTree;
+              tokenVocab=T19;
+              rewrite=true;
+            }
+            s : ^(ID a) { self.buf += $s.start.toStringTree() };
+            a : ^(ID INT) -> {True}? ^(ID["ick"] INT)
+                          -> INT
+              ;
+            ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 's',
+            "abc 34"
+            )
+
+        self.assertEqual("(root (ick 34))", found)
+
+
+    def testWildcardSingleNode(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {
+                language=Python3;
+                output=AST;
+            }
+            a : ID INT -> ^(ID["root"] INT);
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN;} ;
+            ''')
+
+        treeGrammar = textwrap.dedent(
+            r'''
+            tree grammar TP;
+            options {
+                language=Python3;
+                output=AST;
+                ASTLabelType=CommonTree;
+                tokenVocab=T;
+            }
+            s : ^(ID c=.) -> $c
+            ;
+            ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 's',
+            "abc 34"
+            )
+
+        self.assertEqual("34", found)
+
+    def testWildcardUnlabeledSingleNode(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3; output=AST;}
+            a : ID INT -> ^(ID INT);
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN;} ;
+            ''')
+
+        treeGrammar = textwrap.dedent(
+            r'''
+            tree grammar TP;
+            options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T;}
+            s : ^(ID .) -> ID
+              ;
+            ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 's',
+            "abc 34")
+        self.assertEqual("abc", found)
+
+
+    def testWildcardGrabsSubtree(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3; output=AST;}
+            a : ID x=INT y=INT z=INT -> ^(ID[\"root\"] ^($x $y $z));
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN;} ;
+            ''')
+
+        treeGrammar = textwrap.dedent(
+            r'''
+            tree grammar TP;
+            options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T;}
+            s : ^(ID c=.) -> $c
+              ;
+            ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 's',
+            "abc 1 2 3")
+        self.assertEqual("(1 2 3)", found)
+
+
+    def testWildcardGrabsSubtree2(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3; output=AST;}
+            a : ID x=INT y=INT z=INT -> ID ^($x $y $z);
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN;} ;
+            ''')
+
+        treeGrammar = textwrap.dedent(
+            r'''
+            tree grammar TP;
+            options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T;}
+            s : ID c=. -> $c
+              ;
+            ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 's',
+            "abc 1 2 3")
+        self.assertEqual("(1 2 3)", found)
+
+
+    def testWildcardListLabel(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3; output=AST;}
+            a : INT INT INT ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN;} ;
+            ''')
+
+        treeGrammar = textwrap.dedent(
+            r'''
+            tree grammar TP;
+            options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T;}
+            s : (c+=.)+ -> $c+
+              ;
+            ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 's',
+            "1 2 3")
+        self.assertEqual("1 2 3", found)
+
+
+    def testWildcardListLabel2(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3; output=AST; ASTLabelType=CommonTree;}
+            a  : x=INT y=INT z=INT -> ^($x ^($y $z) ^($y $z));
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN;} ;
+            ''')
+
+        treeGrammar = textwrap.dedent(
+            r'''
+            tree grammar TP;
+            options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}
+            s : ^(INT (c+=.)+) -> $c+
+              ;
+            ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 's',
+            "1 2 3")
+        self.assertEqual("(2 3) (2 3)", found)
+
+
+    def testRuleResultAsRoot(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {
+                language=Python3;
+                output=AST;
+            }
+            a : ID '=' INT -> ^('=' ID INT);
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            COLON : ':' ;
+            WS : (' '|'\n') {$channel=HIDDEN;} ;
+            ''')
+
+        treeGrammar = textwrap.dedent(
+            r'''
+            tree grammar TP;
+            options {
+                language=Python3;
+                output=AST;
+                rewrite=true;
+                ASTLabelType=CommonTree;
+                tokenVocab=T;
+            }
+            a : ^(eq e1=ID e2=.) -> ^(eq $e2 $e1) ;
+            eq : '=' | ':' {pass} ;  // bug in set match, doesn't add to tree!! booh. force nonset.
+            ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            "abc = 34")
+        self.assertEqual("(= 34 abc)", found)
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/runtime/Python3/tests/t052import.py b/runtime/Python3/tests/t052import.py
new file mode 100644
index 0000000..d6de6ef
--- /dev/null
+++ b/runtime/Python3/tests/t052import.py
@@ -0,0 +1,431 @@
+import unittest
+import textwrap
+import antlr3
+import antlr3.tree
+import testbase
+import sys
+
+class T(testbase.ANTLRTest):
+    def setUp(self):
+        self.oldPath = sys.path[:]
+        sys.path.insert(0, self.baseDir)
+
+
+    def tearDown(self):
+        sys.path = self.oldPath
+
+
+    def parserClass(self, base):
+        class TParser(base):
+            def __init__(self, *args, **kwargs):
+                super().__init__(*args, **kwargs)
+
+                self._output = ""
+
+
+            def capture(self, t):
+                self._output += t
+
+
+            def traceIn(self, ruleName, ruleIndex):
+                self.traces.append('>'+ruleName)
+
+
+            def traceOut(self, ruleName, ruleIndex):
+                self.traces.append('<'+ruleName)
+
+
+            def recover(self, input, re):
+                # no error recovery yet, just crash!
+                raise
+
+        return TParser
+
+
+    def lexerClass(self, base):
+        class TLexer(base):
+            def __init__(self, *args, **kwargs):
+                super().__init__(*args, **kwargs)
+
+                self._output = ""
+
+
+            def capture(self, t):
+                self._output += t
+
+
+            def traceIn(self, ruleName, ruleIndex):
+                self.traces.append('>'+ruleName)
+
+
+            def traceOut(self, ruleName, ruleIndex):
+                self.traces.append('<'+ruleName)
+
+
+            def recover(self, input):
+                # no error recovery yet, just crash!
+                raise
+
+        return TLexer
+
+
+    def execParser(self, grammar, grammarEntry, slaves, input):
+        for slave in slaves:
+            parserName = self.writeInlineGrammar(slave)[0]
+            # slave parsers are imported as normal python modules
+            # to force reloading current version, purge module from sys.modules
+            if parserName + 'Parser' in sys.modules:
+                del sys.modules[parserName + 'Parser']
+
+        lexerCls, parserCls = self.compileInlineGrammar(grammar)
+
+        cStream = antlr3.StringStream(input)
+        lexer = lexerCls(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = parserCls(tStream)
+        getattr(parser, grammarEntry)()
+
+        return parser._output
+
+
+    def execLexer(self, grammar, slaves, input):
+        for slave in slaves:
+            parserName = self.writeInlineGrammar(slave)[0]
+            # slave parsers are imported as normal python modules
+            # to force reloading current version, purge module from sys.modules
+            if parserName + 'Parser' in sys.modules:
+                del sys.modules[parserName + 'Parser']
+
+        lexerCls = self.compileInlineGrammar(grammar)
+
+        cStream = antlr3.StringStream(input)
+        lexer = lexerCls(cStream)
+
+        while True:
+            token = lexer.nextToken()
+            if token is None or token.type == antlr3.EOF:
+                break
+
+            lexer._output += token.text
+
+        return lexer._output
+
+
+    def testDelegatorInvokesDelegateRule(self):
+        slave = textwrap.dedent(
+        r'''
+        parser grammar S1;
+        options {
+            language=Python3;
+        }
+        @members {
+            def capture(self, t):
+                self.gM1.capture(t)
+
+        }
+
+        a : B { self.capture("S.a") } ;
+        ''')
+
+        master = textwrap.dedent(
+        r'''
+        grammar M1;
+        options {
+            language=Python3;
+        }
+        import S1;
+        s : a ;
+        B : 'b' ; // defines B from inherited token space
+        WS : (' '|'\n') {self.skip()} ;
+        ''')
+
+        found = self.execParser(
+            master, 's',
+            slaves=[slave],
+            input="b"
+            )
+
+        self.assertEqual("S.a", found)
+
+
+    def testDelegatorInvokesDelegateRuleWithArgs(self):
+        slave = textwrap.dedent(
+        r'''
+        parser grammar S2;
+        options {
+            language=Python3;
+        }
+        @members {
+            def capture(self, t):
+                self.gM2.capture(t)
+        }
+        a[x] returns [y] : B {self.capture("S.a"); $y="1000";} ;
+        ''')
+
+        master = textwrap.dedent(
+        r'''
+        grammar M2;
+        options {
+            language=Python3;
+        }
+        import S2;
+        s : label=a[3] {self.capture($label.y);} ;
+        B : 'b' ; // defines B from inherited token space
+        WS : (' '|'\n') {self.skip()} ;
+        ''')
+
+        found = self.execParser(
+            master, 's',
+            slaves=[slave],
+            input="b"
+            )
+
+        self.assertEqual("S.a1000", found)
+
+
+    def testDelegatorAccessesDelegateMembers(self):
+        slave = textwrap.dedent(
+        r'''
+        parser grammar S3;
+        options {
+            language=Python3;
+        }
+        @members {
+            def capture(self, t):
+                self.gM3.capture(t)
+
+            def foo(self):
+                self.capture("foo")
+        }
+        a : B ;
+        ''')
+
+        master = textwrap.dedent(
+        r'''
+        grammar M3;        // uses no rules from the import
+        options {
+            language=Python3;
+        }
+        import S3;
+        s : 'b' {self.gS3.foo();} ; // gS is import pointer
+        WS : (' '|'\n') {self.skip()} ;
+        ''')
+
+        found = self.execParser(
+            master, 's',
+            slaves=[slave],
+            input="b"
+            )
+
+        self.assertEqual("foo", found)
+
+
+    def testDelegatorInvokesFirstVersionOfDelegateRule(self):
+        slave = textwrap.dedent(
+        r'''
+        parser grammar S4;
+        options {
+            language=Python3;
+        }
+        @members {
+            def capture(self, t):
+                self.gM4.capture(t)
+        }
+        a : b {self.capture("S.a");} ;
+        b : B ;
+        ''')
+
+        slave2 = textwrap.dedent(
+        r'''
+        parser grammar T4;
+        options {
+            language=Python3;
+        }
+        @members {
+            def capture(self, t):
+                self.gM4.capture(t)
+        }
+        a : B {self.capture("T.a");} ; // hidden by S.a
+        ''')
+
+        master = textwrap.dedent(
+        r'''
+        grammar M4;
+        options {
+            language=Python3;
+        }
+        import S4,T4;
+        s : a ;
+        B : 'b' ;
+        WS : (' '|'\n') {self.skip()} ;
+        ''')
+
+        found = self.execParser(
+            master, 's',
+            slaves=[slave, slave2],
+            input="b"
+            )
+
+        self.assertEqual("S.a", found)
+
+
+    def testDelegatesSeeSameTokenType(self):
+        slave = textwrap.dedent(
+        r'''
+        parser grammar S5; // A, B, C token type order
+        options {
+            language=Python3;
+        }
+        tokens { A; B; C; }
+        @members {
+            def capture(self, t):
+                self.gM5.capture(t)
+        }
+        x : A {self.capture("S.x ");} ;
+        ''')
+
+        slave2 = textwrap.dedent(
+        r'''
+        parser grammar T5;
+        options {
+            language=Python3;
+        }
+        tokens { C; B; A; } /// reverse order
+        @members {
+            def capture(self, t):
+                self.gM5.capture(t)
+        }
+        y : A {self.capture("T.y");} ;
+        ''')
+
+        master = textwrap.dedent(
+        r'''
+        grammar M5;
+        options {
+            language=Python3;
+        }
+        import S5,T5;
+        s : x y ; // matches AA, which should be "aa"
+        B : 'b' ; // another order: B, A, C
+        A : 'a' ;
+        C : 'c' ;
+        WS : (' '|'\n') {self.skip()} ;
+        ''')
+
+        found = self.execParser(
+            master, 's',
+            slaves=[slave, slave2],
+            input="aa"
+            )
+
+        self.assertEqual("S.x T.y", found)
+
+
+    def testDelegatorRuleOverridesDelegate(self):
+        slave = textwrap.dedent(
+        r'''
+        parser grammar S6;
+        options {
+            language=Python3;
+        }
+        @members {
+            def capture(self, t):
+                self.gM6.capture(t)
+        }
+        a : b {self.capture("S.a");} ;
+        b : B ;
+        ''')
+
+        master = textwrap.dedent(
+        r'''
+        grammar M6;
+        options {
+            language=Python3;
+        }
+        import S6;
+        b : 'b'|'c' ;
+        WS : (' '|'\n') {self.skip()} ;
+        ''')
+
+        found = self.execParser(
+            master, 'a',
+            slaves=[slave],
+            input="c"
+            )
+
+        self.assertEqual("S.a", found)
+
+
+    # LEXER INHERITANCE
+
+    def testLexerDelegatorInvokesDelegateRule(self):
+        slave = textwrap.dedent(
+        r'''
+        lexer grammar S7;
+        options {
+            language=Python3;
+        }
+        @members {
+            def capture(self, t):
+                self.gM7.capture(t)
+        }
+        A : 'a' {self.capture("S.A ");} ;
+        C : 'c' ;
+        ''')
+
+        master = textwrap.dedent(
+        r'''
+        lexer grammar M7;
+        options {
+            language=Python3;
+        }
+        import S7;
+        B : 'b' ;
+        WS : (' '|'\n') {self.skip()} ;
+        ''')
+
+        found = self.execLexer(
+            master,
+            slaves=[slave],
+            input="abc"
+            )
+
+        self.assertEqual("S.A abc", found)
+
+
+    def testLexerDelegatorRuleOverridesDelegate(self):
+        slave = textwrap.dedent(
+        r'''
+        lexer grammar S8;
+        options {
+            language=Python3;
+        }
+        @members {
+            def capture(self, t):
+                self.gM8.capture(t)
+        }
+        A : 'a' {self.capture("S.A")} ;
+        ''')
+
+        master = textwrap.dedent(
+        r'''
+        lexer grammar M8;
+        options {
+            language=Python3;
+        }
+        import S8;
+        A : 'a' {self.capture("M.A ");} ;
+        WS : (' '|'\n') {self.skip()} ;
+        ''')
+
+        found = self.execLexer(
+            master,
+            slaves=[slave],
+            input="a"
+            )
+
+        self.assertEqual("M.A a", found)
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/runtime/Python3/tests/t053hetero.py b/runtime/Python3/tests/t053hetero.py
new file mode 100644
index 0000000..e85c038
--- /dev/null
+++ b/runtime/Python3/tests/t053hetero.py
@@ -0,0 +1,939 @@
+import unittest
+import textwrap
+import antlr3
+import antlr3.tree
+import testbase
+import sys
+
+class T(testbase.ANTLRTest):
+    def parserClass(self, base):
+        class TParser(base):
+            def __init__(self, *args, **kwargs):
+                super().__init__(*args, **kwargs)
+
+                self._output = ""
+
+
+            def capture(self, t):
+                self._output += t
+
+
+            def traceIn(self, ruleName, ruleIndex):
+                self.traces.append('>'+ruleName)
+
+
+            def traceOut(self, ruleName, ruleIndex):
+                self.traces.append('<'+ruleName)
+
+
+            def recover(self, input, re):
+                # no error recovery yet, just crash!
+                raise
+
+        return TParser
+
+
+    def lexerClass(self, base):
+        class TLexer(base):
+            def __init__(self, *args, **kwargs):
+                super().__init__(*args, **kwargs)
+
+                self._output = ""
+
+
+            def capture(self, t):
+                self._output += t
+
+
+            def traceIn(self, ruleName, ruleIndex):
+                self.traces.append('>'+ruleName)
+
+
+            def traceOut(self, ruleName, ruleIndex):
+                self.traces.append('<'+ruleName)
+
+
+            def recover(self, input, re):
+                # no error recovery yet, just crash!
+                raise
+
+        return TLexer
+
+
+    def execParser(self, grammar, grammarEntry, input):
+        lexerCls, parserCls = self.compileInlineGrammar(grammar)
+
+        cStream = antlr3.StringStream(input)
+        lexer = lexerCls(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = parserCls(tStream)
+        r = getattr(parser, grammarEntry)()
+
+        if r:
+            return r.tree.toStringTree()
+
+        return ""
+
+
+    def execTreeParser(self, grammar, grammarEntry, treeGrammar, treeEntry, input):
+        lexerCls, parserCls = self.compileInlineGrammar(grammar)
+        walkerCls = self.compileInlineGrammar(treeGrammar)
+
+        cStream = antlr3.StringStream(input)
+        lexer = lexerCls(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = parserCls(tStream)
+        r = getattr(parser, grammarEntry)()
+        nodes = antlr3.tree.CommonTreeNodeStream(r.tree)
+        nodes.setTokenStream(tStream)
+        walker = walkerCls(nodes)
+        r = getattr(walker, treeEntry)()
+
+        if r:
+            return r.tree.toStringTree()
+
+        return ""
+
+
+    # PARSERS -- AUTO AST
+
+    def testToken(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T1;
+        options {
+            language=Python3;
+            output=AST;
+        }
+        @header {
+        class V(CommonTree):
+            def toString(self):
+                return self.token.text + "<V>"
+            __str__ = toString
+
+        }
+        a : ID<V> ;
+        ID : 'a'..'z'+ ;
+        WS : (' '|'\n') {$channel=HIDDEN;} ;
+        ''')
+
+        found = self.execParser(
+            grammar, 'a',
+            input="a"
+            )
+
+        self.assertEqual("a<V>", found)
+
+
+    def testTokenCommonTree(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {
+                language=Python3;
+                output=AST;
+            }
+            a : ID<CommonTree> ;
+            ID : 'a'..'z'+ ;
+            WS : (' '|'\n') {$channel=HIDDEN;} ;
+            ''')
+
+        found = self.execParser(
+            grammar, 'a',
+            input="a")
+
+        self.assertEqual("a", found)
+
+
+    def testTokenWithQualifiedType(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {
+                language=Python3;
+                output=AST;
+            }
+            @members {
+            class V(CommonTree):
+                def toString(self):
+                    return self.token.text + "<V>"
+                __str__ = toString
+            }
+            a : ID<TParser.V> ; // TParser.V is qualified name
+            ID : 'a'..'z'+ ;
+            WS : (' '|'\n') {$channel=HIDDEN;} ;
+            ''')
+
+        found = self.execParser(
+            grammar, 'a',
+            input="a"
+            )
+
+        self.assertEqual("a<V>", found)
+
+
+    def testNamedType(self):
+        grammar = textwrap.dedent(
+            r"""
+            grammar $T;
+            options {
+                language=Python3;
+                output=AST;
+            }
+            @header {
+            class V(CommonTree):
+                def toString(self):
+                    return self.token.text + "<V>"
+                __str__ = toString
+            }
+            a : ID<node=V> ;
+            ID : 'a'..'z'+ ;
+            WS : (' '|'\\n') {$channel=HIDDEN;} ;
+            """)
+
+        found = self.execParser(grammar, 'a', input="a")
+        self.assertEqual("a<V>", found)
+
+
+    def testTokenWithLabel(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T2;
+        options {
+            language=Python3;
+            output=AST;
+        }
+        @header {
+        class V(CommonTree):
+            def toString(self):
+                return self.token.text + "<V>"
+            __str__ = toString
+
+        }
+        a : x=ID<V> ;
+        ID : 'a'..'z'+ ;
+        WS : (' '|'\n') {$channel=HIDDEN;} ;
+        ''')
+
+        found = self.execParser(
+            grammar, 'a',
+            input="a"
+            )
+
+        self.assertEqual("a<V>", found)
+
+
+    def testTokenWithListLabel(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T3;
+        options {
+            language=Python3;
+            output=AST;
+        }
+        @header {
+        class V(CommonTree):
+            def toString(self):
+                return self.token.text + "<V>"
+            __str__ = toString
+
+        }
+        a : x+=ID<V> ;
+        ID : 'a'..'z'+ ;
+        WS : (' '|'\n') {$channel=HIDDEN;} ;
+        ''')
+
+        found = self.execParser(
+            grammar, 'a',
+            input="a"
+            )
+
+        self.assertEqual("a<V>", found)
+
+
+    def testTokenRoot(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T4;
+        options {
+            language=Python3;
+            output=AST;
+        }
+        @header {
+        class V(CommonTree):
+            def toString(self):
+                return self.token.text + "<V>"
+            __str__ = toString
+
+        }
+        a : ID<V>^ ;
+        ID : 'a'..'z'+ ;
+        WS : (' '|'\n') {$channel=HIDDEN;} ;
+        ''')
+
+        found = self.execParser(
+            grammar, 'a',
+            input="a"
+            )
+
+        self.assertEqual("a<V>", found)
+
+
+    def testTokenRootWithListLabel(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T5;
+        options {
+            language=Python3;
+            output=AST;
+        }
+        @header {
+        class V(CommonTree):
+            def toString(self):
+                return self.token.text + "<V>"
+            __str__ = toString
+
+        }
+        a : x+=ID<V>^ ;
+        ID : 'a'..'z'+ ;
+        WS : (' '|'\n') {$channel=HIDDEN;} ;
+        ''')
+
+        found = self.execParser(
+            grammar, 'a',
+            input="a"
+            )
+
+        self.assertEqual("a<V>", found)
+
+
+    def testString(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T6;
+        options {
+            language=Python3;
+            output=AST;
+        }
+        @header {
+        class V(CommonTree):
+            def toString(self):
+                return self.token.text + "<V>"
+            __str__ = toString
+
+        }
+        a : 'begin'<V> ;
+        ID : 'a'..'z'+ ;
+        WS : (' '|'\n') {$channel=HIDDEN;} ;
+        ''')
+
+        found = self.execParser(
+            grammar, 'a',
+            input="begin"
+            )
+
+        self.assertEqual("begin<V>", found)
+
+
+    def testStringRoot(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T7;
+        options {
+            language=Python3;
+            output=AST;
+        }
+        @header {
+        class V(CommonTree):
+            def toString(self):
+                return self.token.text + "<V>"
+            __str__ = toString
+
+        }
+        a : 'begin'<V>^ ;
+        ID : 'a'..'z'+ ;
+        WS : (' '|'\n') {$channel=HIDDEN;} ;
+        ''')
+
+        found = self.execParser(
+            grammar, 'a',
+            input="begin"
+            )
+
+        self.assertEqual("begin<V>", found)
+
+
+    # PARSERS -- REWRITE AST
+
+    def testRewriteToken(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T8;
+        options {
+            language=Python3;
+            output=AST;
+        }
+        @header {
+        class V(CommonTree):
+            def toString(self):
+                return self.token.text + "<V>"
+            __str__ = toString
+
+        }
+        a : ID -> ID<V> ;
+        ID : 'a'..'z'+ ;
+        WS : (' '|'\n') {$channel=HIDDEN;} ;
+        ''')
+
+        found = self.execParser(
+            grammar, 'a',
+            input="a"
+            )
+
+        self.assertEqual("a<V>", found)
+
+
+    def testRewriteTokenWithArgs(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T9;
+        options {
+            language=Python3;
+            output=AST;
+        }
+        @header {
+        class V(CommonTree):
+            def __init__(self, *args):
+                if len(args) == 4:
+                    ttype = args[0]
+                    x = args[1]
+                    y = args[2]
+                    z = args[3]
+                    token = CommonToken(type=ttype, text="")
+
+                elif len(args) == 3:
+                    ttype = args[0]
+                    token = args[1]
+                    x = args[2]
+                    y, z = 0, 0
+
+                else:
+                    raise TypeError("Invalid args {!r}".format(args))
+
+                super().__init__(token)
+                self.x = x
+                self.y = y
+                self.z = z
+
+            def toString(self):
+                txt = ""
+                if self.token:
+                    txt += self.token.text
+                txt +="<V>;{0.x}{0.y}{0.z}".format(self)
+                return txt
+            __str__ = toString
+
+        }
+        a : ID -> ID<V>[42,19,30] ID<V>[$ID,99];
+        ID : 'a'..'z'+ ;
+        WS : (' '|'\n') {$channel=HIDDEN;} ;
+        ''')
+
+        found = self.execParser(
+            grammar, 'a',
+            input="a"
+            )
+
+        self.assertEqual("<V>;421930 a<V>;9900", found)
+
+
+    def testRewriteTokenRoot(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T10;
+        options {
+            language=Python3;
+            output=AST;
+        }
+        @header {
+        class V(CommonTree):
+            def toString(self):
+                return self.token.text + "<V>"
+            __str__ = toString
+
+        }
+        a : ID INT -> ^(ID<V> INT) ;
+        ID : 'a'..'z'+ ;
+        INT : '0'..'9'+ ;
+        WS : (' '|'\n') {$channel=HIDDEN;} ;
+        ''')
+
+        found = self.execParser(
+            grammar, 'a',
+            input="a 2"
+            )
+
+        self.assertEqual("(a<V> 2)", found)
+
+
+    def testRewriteString(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T11;
+        options {
+            language=Python3;
+            output=AST;
+        }
+        @header {
+        class V(CommonTree):
+            def toString(self):
+                return self.token.text + "<V>"
+            __str__ = toString
+
+        }
+        a : 'begin' -> 'begin'<V> ;
+        ID : 'a'..'z'+ ;
+        WS : (' '|'\n') {$channel=HIDDEN;} ;
+        ''')
+
+        found = self.execParser(
+            grammar, 'a',
+            input="begin"
+            )
+
+        self.assertEqual("begin<V>", found)
+
+
+    def testRewriteStringRoot(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T12;
+        options {
+            language=Python3;
+            output=AST;
+        }
+        @header {
+        class V(CommonTree):
+            def toString(self):
+                return self.token.text + "<V>"
+            __str__ = toString
+
+        }
+        a : 'begin' INT -> ^('begin'<V> INT) ;
+        ID : 'a'..'z'+ ;
+        INT : '0'..'9'+ ;
+        WS : (' '|'\n') {$channel=HIDDEN;} ;
+        ''')
+
+        found = self.execParser(
+            grammar, 'a',
+            input="begin 2"
+            )
+
+        self.assertEqual("(begin<V> 2)", found)
+
+    def testRewriteRuleResults(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {
+                language=Python3;
+                output=AST;
+            }
+            tokens {LIST;}
+            @header {
+            class V(CommonTree):
+                def toString(self):
+                    return self.token.text + "<V>"
+                __str__ = toString
+
+            class W(CommonTree):
+                def __init__(self, tokenType, txt):
+                    super().__init__(
+                        CommonToken(type=tokenType, text=txt))
+
+                def toString(self):
+                    return self.token.text + "<W>"
+                __str__ = toString
+
+            }
+            a : id (',' id)* -> ^(LIST<W>["LIST"] id+);
+            id : ID -> ID<V>;
+            ID : 'a'..'z'+ ;
+            WS : (' '|'\n') {$channel=HIDDEN;} ;
+            ''')
+
+        found = self.execParser(
+            grammar, 'a',
+            input="a,b,c")
+
+        self.assertEqual("(LIST<W> a<V> b<V> c<V>)", found)
+
+    def testCopySemanticsWithHetero(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {
+                language=Python3;
+                output=AST;
+            }
+            @header {
+            class V(CommonTree):
+                def dupNode(self):
+                    return V(self)
+
+                def toString(self):
+                    return self.token.text + "<V>"
+                __str__ = toString
+
+            }
+            a : type ID (',' ID)* ';' -> ^(type ID)+;
+            type : 'int'<V> ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\\n') {$channel=HIDDEN;} ;
+            ''')
+
+        found = self.execParser(
+            grammar, 'a',
+            input="int a, b, c;")
+        self.assertEqual("(int<V> a) (int<V> b) (int<V> c)", found)
+
+    # TREE PARSERS -- REWRITE AST
+
+    def testTreeParserRewriteFlatList(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T13;
+        options {
+            language=Python3;
+            output=AST;
+        }
+        a : ID INT;
+        ID : 'a'..'z'+ ;
+        INT : '0'..'9'+;
+        WS : (' '|'\n') {$channel=HIDDEN;} ;
+        ''')
+
+        treeGrammar = textwrap.dedent(
+        r'''
+        tree grammar TP13;
+        options {
+            language=Python3;
+            output=AST;
+            ASTLabelType=CommonTree;
+            tokenVocab=T13;
+        }
+        @header {
+        class V(CommonTree):
+            def toString(self):
+                return self.token.text + "<V>"
+            __str__ = toString
+
+        class W(CommonTree):
+            def toString(self):
+                return self.token.text + "<W>"
+            __str__ = toString
+
+        }
+        a : ID INT -> INT<V> ID<W>
+          ;
+        ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            input="abc 34"
+            )
+
+        self.assertEqual("34<V> abc<W>", found)
+
+
+    def testTreeParserRewriteTree(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T14;
+        options {
+            language=Python3;
+            output=AST;
+        }
+        a : ID INT;
+        ID : 'a'..'z'+ ;
+        INT : '0'..'9'+;
+        WS : (' '|'\n') {$channel=HIDDEN;} ;
+        ''')
+
+        treeGrammar = textwrap.dedent(
+        r'''
+        tree grammar TP14;
+        options {
+            language=Python3;
+            output=AST;
+            ASTLabelType=CommonTree;
+            tokenVocab=T14;
+        }
+        @header {
+        class V(CommonTree):
+            def toString(self):
+                return self.token.text + "<V>"
+            __str__ = toString
+
+        class W(CommonTree):
+            def toString(self):
+                return self.token.text + "<W>"
+            __str__ = toString
+
+        }
+        a : ID INT -> ^(INT<V> ID<W>)
+          ;
+        ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            input="abc 34"
+            )
+
+        self.assertEqual("(34<V> abc<W>)", found)
+
+
+    def testTreeParserRewriteImaginary(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T15;
+        options {
+            language=Python3;
+            output=AST;
+        }
+        a : ID ;
+        ID : 'a'..'z'+ ;
+        INT : '0'..'9'+;
+        WS : (' '|'\n') {$channel=HIDDEN;} ;
+        ''')
+
+        treeGrammar = textwrap.dedent(
+        r'''
+        tree grammar TP15;
+        options {
+            language=Python3;
+            output=AST;
+            ASTLabelType=CommonTree;
+            tokenVocab=T15;
+        }
+        tokens { ROOT; }
+        @header {
+        class V(CommonTree):
+            def __init__(self, tokenType):
+                super().__init__(CommonToken(tokenType))
+
+            def toString(self):
+                return tokenNames[self.token.type] + "<V>"
+            __str__ = toString
+
+
+        }
+        a : ID -> ROOT<V> ID
+          ;
+        ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            input="abc"
+            )
+
+        self.assertEqual("ROOT<V> abc", found)
+
+
+    def testTreeParserRewriteImaginaryWithArgs(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T16;
+        options {
+            language=Python3;
+            output=AST;
+        }
+        a : ID ;
+        ID : 'a'..'z'+ ;
+        INT : '0'..'9'+;
+        WS : (' '|'\n') {$channel=HIDDEN;} ;
+        ''')
+
+        treeGrammar = textwrap.dedent(
+        r'''
+        tree grammar TP16;
+        options {
+            language=Python3;
+            output=AST;
+            ASTLabelType=CommonTree;
+            tokenVocab=T16;
+        }
+        tokens { ROOT; }
+        @header {
+        class V(CommonTree):
+            def __init__(self, tokenType, x):
+                super().__init__(CommonToken(tokenType))
+                self.x = x
+
+            def toString(self):
+                return tokenNames[self.token.type] + "<V>;" + str(self.x)
+            __str__ = toString
+
+        }
+        a : ID -> ROOT<V>[42] ID
+          ;
+        ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            input="abc"
+            )
+
+        self.assertEqual("ROOT<V>;42 abc", found)
+
+
+    def testTreeParserRewriteImaginaryRoot(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T17;
+        options {
+            language=Python3;
+            output=AST;
+        }
+        a : ID ;
+        ID : 'a'..'z'+ ;
+        INT : '0'..'9'+;
+        WS : (' '|'\n') {$channel=HIDDEN;} ;
+        ''')
+
+        treeGrammar = textwrap.dedent(
+        r'''
+        tree grammar TP17;
+        options {
+            language=Python3;
+            output=AST;
+            ASTLabelType=CommonTree;
+            tokenVocab=T17;
+        }
+        tokens { ROOT; }
+        @header {
+        class V(CommonTree):
+            def __init__(self, tokenType):
+                super().__init__(CommonToken(tokenType))
+
+            def toString(self):
+                return tokenNames[self.token.type] + "<V>"
+            __str__ = toString
+
+        }
+        a : ID -> ^(ROOT<V> ID)
+          ;
+        ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            input="abc"
+            )
+
+        self.assertEqual("(ROOT<V> abc)", found)
+
+
+    def testTreeParserRewriteImaginaryFromReal(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T18;
+        options {
+            language=Python3;
+            output=AST;
+        }
+        a : ID ;
+        ID : 'a'..'z'+ ;
+        INT : '0'..'9'+;
+        WS : (' '|'\n') {$channel=HIDDEN;} ;
+        ''')
+
+        treeGrammar = textwrap.dedent(
+        r'''
+        tree grammar TP18;
+        options {
+            language=Python3;
+            output=AST;
+            ASTLabelType=CommonTree;
+            tokenVocab=T18;
+        }
+        tokens { ROOT; }
+        @header {
+        class V(CommonTree):
+            def __init__(self, tokenType, tree=None):
+                if tree is None:
+                    super().__init__(CommonToken(tokenType))
+                else:
+                    super().__init__(tree)
+                    self.token.type = tokenType
+
+            def toString(self):
+                return tokenNames[self.token.type]+"<V>@"+str(self.token.line)
+            __str__ = toString
+
+        }
+        a : ID -> ROOT<V>[$ID]
+          ;
+        ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            input="abc"
+            )
+
+        self.assertEqual("ROOT<V>@1", found)
+
+
+    def testTreeParserAutoHeteroAST(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {
+                language=Python3;
+                output=AST;
+            }
+            a : ID ';' ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN;} ;
+            ''')
+
+        treeGrammar = textwrap.dedent(
+            r'''
+            tree grammar TP;
+            options {
+                language=Python3;
+                output=AST;
+                ASTLabelType=CommonTree;
+                tokenVocab=T;
+            }
+            tokens { ROOT; }
+            @header {
+            class V(CommonTree):
+                def toString(self):
+                    return CommonTree.toString(self) + "<V>"
+                __str__ = toString
+
+            }
+
+            a : ID<V> ';'<V>;
+            ''')
+
+        found = self.execTreeParser(
+            grammar, 'a',
+            treeGrammar, 'a',
+            input="abc;"
+            )
+
+        self.assertEqual("abc<V> ;<V>", found)
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/runtime/Python3/tests/t054main.py b/runtime/Python3/tests/t054main.py
new file mode 100644
index 0000000..e81d253
--- /dev/null
+++ b/runtime/Python3/tests/t054main.py
@@ -0,0 +1,309 @@
+
+import unittest
+import textwrap
+import antlr3
+import antlr3.tree
+import testbase
+import sys
+from io import StringIO
+
+class T(testbase.ANTLRTest):
+    def setUp(self):
+        self.oldPath = sys.path[:]
+        sys.path.insert(0, self.baseDir)
+
+
+    def tearDown(self):
+        sys.path = self.oldPath
+
+
+    def testOverrideMain(self):
+        grammar = textwrap.dedent(
+            r"""lexer grammar T3;
+            options {
+              language = Python3;
+              }
+
+            @main {
+            def main(argv):
+                raise RuntimeError("no")
+            }
+
+            ID: ('a'..'z' | '\u00c0'..'\u00ff')+;
+            WS: ' '+ { $channel = HIDDEN };
+            """)
+
+
+        stdout = StringIO()
+
+        lexerMod = self.compileInlineGrammar(grammar, returnModule=True)
+        self.assertRaises(RuntimeError, lexerMod.main, ['lexer.py'])
+
+
+    def testLexerFromFile(self):
+        input = "foo bar"
+        inputPath = self.writeFile("input.txt", input)
+
+        grammar = textwrap.dedent(
+            r"""lexer grammar T1;
+            options {
+              language = Python3;
+              }
+
+            ID: 'a'..'z'+;
+            WS: ' '+ { $channel = HIDDEN };
+            """)
+
+
+        stdout = StringIO()
+
+        lexerMod = self.compileInlineGrammar(grammar, returnModule=True)
+        lexerMod.main(
+            ['lexer.py', inputPath],
+            stdout=stdout
+            )
+
+        self.assertEqual(len(stdout.getvalue().splitlines()), 3)
+
+
+    def testLexerFromStdIO(self):
+        input = "foo bar"
+
+        grammar = textwrap.dedent(
+            r"""lexer grammar T2;
+            options {
+              language = Python3;
+              }
+
+            ID: 'a'..'z'+;
+            WS: ' '+ { $channel = HIDDEN };
+            """)
+
+
+        stdout = StringIO()
+
+        lexerMod = self.compileInlineGrammar(grammar, returnModule=True)
+        lexerMod.main(
+            ['lexer.py'],
+            stdin=StringIO(input),
+            stdout=stdout
+            )
+
+        self.assertEqual(len(stdout.getvalue().splitlines()), 3)
+
+
+    def testLexerEncoding(self):
+        input = "föö bär"
+
+        grammar = textwrap.dedent(
+            r"""lexer grammar T3;
+            options {
+              language = Python3;
+              }
+
+            ID: ('a'..'z' | '\u00c0'..'\u00ff')+;
+            WS: ' '+ { $channel = HIDDEN };
+            """)
+
+
+        stdout = StringIO()
+
+        lexerMod = self.compileInlineGrammar(grammar, returnModule=True)
+        lexerMod.main(
+            ['lexer.py'],
+            stdin=StringIO(input),
+            stdout=stdout
+            )
+
+        self.assertEqual(len(stdout.getvalue().splitlines()), 3)
+
+
+    def testCombined(self):
+        input = "foo bar"
+
+        grammar = textwrap.dedent(
+            r"""grammar T4;
+            options {
+              language = Python3;
+              }
+
+            r returns [res]: (ID)+ EOF { $res = $text };
+
+            ID: 'a'..'z'+;
+            WS: ' '+ { $channel = HIDDEN };
+            """)
+
+
+        stdout = StringIO()
+
+        lexerMod, parserMod = self.compileInlineGrammar(grammar, returnModule=True)
+        parserMod.main(
+            ['combined.py', '--rule', 'r'],
+            stdin=StringIO(input),
+            stdout=stdout
+            )
+
+        stdout = stdout.getvalue()
+        self.assertEqual(len(stdout.splitlines()), 1, stdout)
+
+
+    def testCombinedOutputAST(self):
+        input = "foo + bar"
+
+        grammar = textwrap.dedent(
+            r"""grammar T5;
+            options {
+              language = Python3;
+              output = AST;
+            }
+
+            r: ID OP^ ID EOF!;
+
+            ID: 'a'..'z'+;
+            OP: '+';
+            WS: ' '+ { $channel = HIDDEN };
+            """)
+
+
+        stdout = StringIO()
+
+        lexerMod, parserMod = self.compileInlineGrammar(grammar, returnModule=True)
+        parserMod.main(
+            ['combined.py', '--rule', 'r'],
+            stdin=StringIO(input),
+            stdout=stdout
+            )
+
+        stdout = stdout.getvalue().strip()
+        self.assertEqual(stdout, "(+ foo bar)")
+
+
+    def testTreeParser(self):
+        grammar = textwrap.dedent(
+            r'''grammar T6;
+            options {
+              language = Python3;
+              output = AST;
+            }
+
+            r: ID OP^ ID EOF!;
+
+            ID: 'a'..'z'+;
+            OP: '+';
+            WS: ' '+ { $channel = HIDDEN };
+            ''')
+
+        treeGrammar = textwrap.dedent(
+            r'''tree grammar T6Walker;
+            options {
+            language=Python3;
+            ASTLabelType=CommonTree;
+            tokenVocab=T6;
+            }
+            r returns [res]: ^(OP a=ID b=ID)
+              { $res = "{} {} {}".format($a.text, $OP.text, $b.text) }
+              ;
+            ''')
+
+        lexerMod, parserMod = self.compileInlineGrammar(grammar, returnModule=True)
+        walkerMod = self.compileInlineGrammar(treeGrammar, returnModule=True)
+
+        stdout = StringIO()
+        walkerMod.main(
+            ['walker.py', '--rule', 'r', '--parser', 'T6Parser', '--parser-rule', 'r', '--lexer', 'T6Lexer'],
+            stdin=StringIO("a+b"),
+            stdout=stdout
+            )
+
+        stdout = stdout.getvalue().strip()
+        self.assertEqual(stdout, "'a + b'")
+
+
+    def testTreeParserRewrite(self):
+        grammar = textwrap.dedent(
+            r'''grammar T7;
+            options {
+              language = Python3;
+              output = AST;
+            }
+
+            r: ID OP^ ID EOF!;
+
+            ID: 'a'..'z'+;
+            OP: '+';
+            WS: ' '+ { $channel = HIDDEN };
+            ''')
+
+        treeGrammar = textwrap.dedent(
+            r'''tree grammar T7Walker;
+            options {
+              language=Python3;
+              ASTLabelType=CommonTree;
+              tokenVocab=T7;
+              output=AST;
+            }
+            tokens {
+              ARG;
+            }
+            r: ^(OP a=ID b=ID) -> ^(OP ^(ARG ID) ^(ARG ID));
+            ''')
+
+        lexerMod, parserMod = self.compileInlineGrammar(grammar, returnModule=True)
+        walkerMod = self.compileInlineGrammar(treeGrammar, returnModule=True)
+
+        stdout = StringIO()
+        walkerMod.main(
+            ['walker.py', '--rule', 'r', '--parser', 'T7Parser', '--parser-rule', 'r', '--lexer', 'T7Lexer'],
+            stdin=StringIO("a+b"),
+            stdout=stdout
+            )
+
+        stdout = stdout.getvalue().strip()
+        self.assertEqual(stdout, "(+ (ARG a) (ARG b))")
+
+
+
+    def testGrammarImport(self):
+        slave = textwrap.dedent(
+            r'''
+            parser grammar T8S;
+            options {
+              language=Python3;
+            }
+
+            a : B;
+            ''')
+
+        parserName = self.writeInlineGrammar(slave)[0]
+        # slave parsers are imported as normal python modules
+        # to force reloading current version, purge module from sys.modules
+        if parserName + 'Parser' in sys.modules:
+            del sys.modules[parserName+'Parser']
+
+        master = textwrap.dedent(
+            r'''
+            grammar T8M;
+            options {
+              language=Python3;
+            }
+            import T8S;
+            s returns [res]: a { $res = $a.text };
+            B : 'b' ; // defines B from inherited token space
+            WS : (' '|'\n') {self.skip()} ;
+            ''')
+
+        stdout = StringIO()
+
+        lexerMod, parserMod = self.compileInlineGrammar(master, returnModule=True)
+        parserMod.main(
+            ['import.py', '--rule', 's'],
+            stdin=StringIO("b"),
+            stdout=stdout
+            )
+
+        stdout = stdout.getvalue().strip()
+        self.assertEqual(stdout, "'b'")
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/runtime/Python3/tests/t057autoAST.py b/runtime/Python3/tests/t057autoAST.py
new file mode 100644
index 0000000..63ce05a
--- /dev/null
+++ b/runtime/Python3/tests/t057autoAST.py
@@ -0,0 +1,1005 @@
+import unittest
+import textwrap
+import antlr3
+import antlr3.tree
+import testbase
+import sys
+
+class TestAutoAST(testbase.ANTLRTest):
+    def parserClass(self, base):
+        class TParser(base):
+            def __init__(self, *args, **kwargs):
+                super().__init__(*args, **kwargs)
+
+                self._errors = []
+                self._output = ""
+
+
+            def capture(self, t):
+                self._output += t
+
+
+            def traceIn(self, ruleName, ruleIndex):
+                self.traces.append('>'+ruleName)
+
+
+            def traceOut(self, ruleName, ruleIndex):
+                self.traces.append('<'+ruleName)
+
+
+            def emitErrorMessage(self, msg):
+                self._errors.append(msg)
+
+
+        return TParser
+
+
+    def lexerClass(self, base):
+        class TLexer(base):
+            def __init__(self, *args, **kwargs):
+                super().__init__(*args, **kwargs)
+
+                self._output = ""
+
+
+            def capture(self, t):
+                self._output += t
+
+
+            def traceIn(self, ruleName, ruleIndex):
+                self.traces.append('>'+ruleName)
+
+
+            def traceOut(self, ruleName, ruleIndex):
+                self.traces.append('<'+ruleName)
+
+
+            def recover(self, input, re):
+                # no error recovery yet, just crash!
+                raise
+
+        return TLexer
+
+
+    def execParser(self, grammar, grammarEntry, input, expectErrors=False):
+        lexerCls, parserCls = self.compileInlineGrammar(grammar)
+
+        cStream = antlr3.StringStream(input)
+        lexer = lexerCls(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = parserCls(tStream)
+        r = getattr(parser, grammarEntry)()
+
+        if not expectErrors:
+            self.assertEqual(len(parser._errors), 0, parser._errors)
+
+        result = ""
+
+        if r:
+            if hasattr(r, 'result'):
+                result += r.result
+
+            if r.tree:
+                result += r.tree.toStringTree()
+
+        if not expectErrors:
+            return result
+
+        else:
+            return result, parser._errors
+
+
+    def execTreeParser(self, grammar, grammarEntry, treeGrammar, treeEntry, input):
+        lexerCls, parserCls = self.compileInlineGrammar(grammar)
+        walkerCls = self.compileInlineGrammar(treeGrammar)
+
+        cStream = antlr3.StringStream(input)
+        lexer = lexerCls(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = parserCls(tStream)
+        r = getattr(parser, grammarEntry)()
+        nodes = antlr3.tree.CommonTreeNodeStream(r.tree)
+        nodes.setTokenStream(tStream)
+        walker = walkerCls(nodes)
+        r = getattr(walker, treeEntry)()
+
+        if r:
+            return r.tree.toStringTree()
+
+        return ""
+
+
+    def testTokenList(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar foo;
+            options {language=Python3;output=AST;}
+            a : ID INT ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN};
+            ''')
+
+        found = self.execParser(grammar, "a", "abc 34")
+        self.assertEqual("abc 34", found);
+
+
+    def testTokenListInSingleAltBlock(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar foo;
+            options {language=Python3;output=AST;}
+            a : (ID INT) ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar,"a", "abc 34")
+        self.assertEqual("abc 34", found)
+
+
+    def testSimpleRootAtOuterLevel(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar foo;
+            options {language=Python3;output=AST;}
+            a : ID^ INT ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "abc 34")
+        self.assertEqual("(abc 34)", found)
+
+
+    def testSimpleRootAtOuterLevelReverse(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : INT ID^ ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "34 abc")
+        self.assertEqual("(abc 34)", found)
+
+
+    def testBang(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : ID INT! ID! INT ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "abc 34 dag 4532")
+        self.assertEqual("abc 4532", found)
+
+
+    def testOptionalThenRoot(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : ( ID INT )? ID^ ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a 1 b")
+        self.assertEqual("(b a 1)", found)
+
+
+    def testLabeledStringRoot(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : v='void'^ ID ';' ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "void foo;")
+        self.assertEqual("(void foo ;)", found)
+
+
+    def testWildcard(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : v='void'^ . ';' ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "void foo;")
+        self.assertEqual("(void foo ;)", found)
+
+
+    def testWildcardRoot(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : v='void' .^ ';' ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "void foo;")
+        self.assertEqual("(foo void ;)", found)
+
+
+    def testWildcardRootWithLabel(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : v='void' x=.^ ';' ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "void foo;")
+        self.assertEqual("(foo void ;)", found)
+
+
+    def testWildcardRootWithListLabel(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : v='void' x=.^ ';' ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "void foo;")
+        self.assertEqual("(foo void ;)", found)
+
+
+    def testWildcardBangWithListLabel(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : v='void' x=.! ';' ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "void foo;")
+        self.assertEqual("void ;", found)
+
+
+    def testRootRoot(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : ID^ INT^ ID ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a 34 c")
+        self.assertEqual("(34 a c)", found)
+
+
+    def testRootRoot2(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : ID INT^ ID^ ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a 34 c")
+        self.assertEqual("(c (34 a))", found)
+
+
+    def testRootThenRootInLoop(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : ID^ (INT '*'^ ID)+ ;
+            ID  : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a 34 * b 9 * c")
+        self.assertEqual("(* (* (a 34) b 9) c)", found)
+
+
+    def testNestedSubrule(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : 'void' (({pass}ID|INT) ID | 'null' ) ';' ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "void a b;")
+        self.assertEqual("void a b ;", found)
+
+
+    def testInvokeRule(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a  : type ID ;
+            type : {pass}'int' | 'float' ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "int a")
+        self.assertEqual("int a", found)
+
+
+    def testInvokeRuleAsRoot(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a  : type^ ID ;
+            type : {pass}'int' | 'float' ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "int a")
+        self.assertEqual("(int a)", found)
+
+
+    def testInvokeRuleAsRootWithLabel(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a  : x=type^ ID ;
+            type : {pass}'int' | 'float' ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "int a")
+        self.assertEqual("(int a)", found)
+
+
+    def testInvokeRuleAsRootWithListLabel(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a  : x+=type^ ID ;
+            type : {pass}'int' | 'float' ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "int a")
+        self.assertEqual("(int a)", found)
+
+
+    def testRuleRootInLoop(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : ID ('+'^ ID)* ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a+b+c+d")
+        self.assertEqual("(+ (+ (+ a b) c) d)", found)
+
+
+    def testRuleInvocationRuleRootInLoop(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : ID (op^ ID)* ;
+            op : {pass}'+' | '-' ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a+b+c-d")
+        self.assertEqual("(- (+ (+ a b) c) d)", found)
+
+
+    def testTailRecursion(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            s : a ;
+            a : atom ('exp'^ a)? ;
+            atom : INT ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "s", "3 exp 4 exp 5")
+        self.assertEqual("(exp 3 (exp 4 5))", found)
+
+
+    def testSet(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : ID|INT ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "abc")
+        self.assertEqual("abc", found)
+
+
+    def testSetRoot(self):
+        grammar = textwrap.dedent(
+        r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : ('+' | '-')^ ID ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "+abc")
+        self.assertEqual("(+ abc)", found)
+
+
+    @testbase.broken(
+        "FAILS until antlr.g rebuilt in v3", testbase.GrammarCompileError)
+    def testSetRootWithLabel(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : x=('+' | '-')^ ID ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "+abc")
+        self.assertEqual("(+ abc)", found)
+
+
+    def testSetAsRuleRootInLoop(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : ID (('+'|'-')^ ID)* ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a+b-c")
+        self.assertEqual("(- (+ a b) c)", found)
+
+
+    def testNotSet(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : ~ID '+' INT ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "34+2")
+        self.assertEqual("34 + 2", found)
+
+
+    def testNotSetWithLabel(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : x=~ID '+' INT ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "34+2")
+        self.assertEqual("34 + 2", found)
+
+
+    def testNotSetWithListLabel(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : x=~ID '+' INT ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "34+2")
+        self.assertEqual("34 + 2", found)
+
+
+    def testNotSetRoot(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : ~'+'^ INT ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "34 55")
+        self.assertEqual("(34 55)", found)
+
+
+    def testNotSetRootWithLabel(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : ~'+'^ INT ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "34 55")
+        self.assertEqual("(34 55)", found)
+
+
+    def testNotSetRootWithListLabel(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : ~'+'^ INT ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "34 55")
+        self.assertEqual("(34 55)", found)
+
+
+    def testNotSetRuleRootInLoop(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : INT (~INT^ INT)* ;
+            blort : '+' ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "3+4+5")
+        self.assertEqual("(+ (+ 3 4) 5)", found)
+
+
+    @testbase.broken("FIXME: What happened to the semicolon?", AssertionError)
+    def testTokenLabelReuse(self):
+        # check for compilation problem due to multiple defines
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a returns [result] : id=ID id=ID {$result = "2nd id="+$id.text+";"} ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a b")
+        self.assertEqual("2nd id=b;a b", found)
+
+
+    def testTokenLabelReuse2(self):
+        # check for compilation problem due to multiple defines
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a returns [result]: id=ID id=ID^ {$result = "2nd id="+$id.text+','} ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a b")
+        self.assertEqual("2nd id=b,(b a)", found)
+
+
+    def testTokenListLabelReuse(self):
+        # check for compilation problem due to multiple defines
+        # make sure ids has both ID tokens
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a returns [result] : ids+=ID ids+=ID {$result = "id list=[{}],".format(",".join([t.text for t in $ids]))} ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a b")
+        expecting = "id list=[a,b],a b"
+        self.assertEqual(expecting, found)
+
+
+    def testTokenListLabelReuse2(self):
+        # check for compilation problem due to multiple defines
+        # make sure ids has both ID tokens
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a returns [result] : ids+=ID^ ids+=ID {$result = "id list=[{}],".format(",".join([t.text for t in $ids]))} ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a b")
+        expecting = "id list=[a,b],(a b)"
+        self.assertEqual(expecting, found)
+
+
+    def testTokenListLabelRuleRoot(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : id+=ID^ ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a")
+        self.assertEqual("a", found)
+
+
+    def testTokenListLabelBang(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : id+=ID! ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a")
+        self.assertEqual("", found)
+
+
+    def testRuleListLabel(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a returns [result]: x+=b x+=b {
+            t=$x[1]
+            $result = "2nd x="+t.toStringTree()+',';
+            };
+            b : ID;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a b")
+        self.assertEqual("2nd x=b,a b", found)
+
+
+    def testRuleListLabelRuleRoot(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a returns [result] : ( x+=b^ )+ {
+            $result = "x="+$x[1].toStringTree()+',';
+            } ;
+            b : ID;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a b")
+        self.assertEqual("x=(b a),(b a)", found)
+
+
+    def testRuleListLabelBang(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a returns [result] : x+=b! x+=b {
+            $result = "1st x="+$x[0].toStringTree()+',';
+            } ;
+            b : ID;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a b")
+        self.assertEqual("1st x=a,b", found)
+
+
+    def testComplicatedMelange(self):
+        # check for compilation problem
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : A b=B b=B c+=C c+=C D {s = $D.text} ;
+            A : 'a' ;
+            B : 'b' ;
+            C : 'c' ;
+            D : 'd' ;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a b b c c d")
+        self.assertEqual("a b b c c d", found)
+
+
+    def testReturnValueWithAST(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar foo;
+            options {language=Python3;output=AST;}
+            a returns [result] : ID b { $result = str($b.i) + '\n';} ;
+            b returns [i] : INT {$i=int($INT.text);} ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "abc 34")
+        self.assertEqual("34\nabc 34", found)
+
+
+    def testSetLoop(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options { language=Python3;output=AST; }
+            r : (INT|ID)+ ;
+            ID : 'a'..'z' + ;
+            INT : '0'..'9' +;
+            WS: (' ' | '\n' | '\\t')+ {$channel = HIDDEN};
+            ''')
+
+        found = self.execParser(grammar, "r", "abc 34 d")
+        self.assertEqual("abc 34 d", found)
+
+
+    def testExtraTokenInSimpleDecl(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar foo;
+            options {language=Python3;output=AST;}
+            decl : type^ ID '='! INT ';'! ;
+            type : 'int' | 'float' ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found, errors = self.execParser(grammar, "decl", "int 34 x=1;",
+                                        expectErrors=True)
+        self.assertEqual(["line 1:4 extraneous input '34' expecting ID"],
+                         errors)
+        self.assertEqual("(int x 1)", found) # tree gets correct x and 1 tokens
+
+
+    def testMissingIDInSimpleDecl(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar foo;
+            options {language=Python3;output=AST;}
+            tokens {EXPR;}
+            decl : type^ ID '='! INT ';'! ;
+            type : 'int' | 'float' ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found, errors = self.execParser(grammar, "decl", "int =1;",
+                                        expectErrors=True)
+        self.assertEqual(["line 1:4 missing ID at '='"], errors)
+        self.assertEqual("(int <missing ID> 1)", found) # tree gets invented ID token
+
+
+    def testMissingSetInSimpleDecl(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar foo;
+            options {language=Python3;output=AST;}
+            tokens {EXPR;}
+            decl : type^ ID '='! INT ';'! ;
+            type : 'int' | 'float' ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found, errors = self.execParser(grammar, "decl", "x=1;",
+                                        expectErrors=True)
+        self.assertEqual(["line 1:0 mismatched input 'x' expecting set None"], errors)
+        self.assertEqual("(<error: x> x 1)", found) # tree gets invented ID token
+
+
+    def testMissingTokenGivesErrorNode(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar foo;
+            options {language=Python3;output=AST;}
+            a : ID INT ; // follow is EOF
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found, errors = self.execParser(grammar, "a", "abc", expectErrors=True)
+        self.assertEqual(["line 1:3 missing INT at '<EOF>'"], errors)
+        self.assertEqual("abc <missing INT>", found)
+
+
+    def testMissingTokenGivesErrorNodeInInvokedRule(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar foo;
+            options {language=Python3;output=AST;}
+            a : b ;
+            b : ID INT ; // follow should see EOF
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found, errors = self.execParser(grammar, "a", "abc", expectErrors=True)
+        self.assertEqual(["line 1:3 mismatched input '<EOF>' expecting INT"], errors)
+        self.assertEqual("<mismatched token: <EOF>, resync=abc>", found)
+
+
+    def testExtraTokenGivesErrorNode(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar foo;
+            options {language=Python3;output=AST;}
+            a : b c ;
+            b : ID ;
+            c : INT ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found, errors = self.execParser(grammar, "a", "abc ick 34",
+                                        expectErrors=True)
+        self.assertEqual(["line 1:4 extraneous input 'ick' expecting INT"],
+                          errors)
+        self.assertEqual("abc 34", found)
+
+
+    def testMissingFirstTokenGivesErrorNode(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar foo;
+            options {language=Python3;output=AST;}
+            a : ID INT ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found, errors = self.execParser(grammar, "a", "34", expectErrors=True)
+        self.assertEqual(["line 1:0 missing ID at '34'"], errors)
+        self.assertEqual("<missing ID> 34", found)
+
+
+    def testMissingFirstTokenGivesErrorNode2(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar foo;
+            options {language=Python3;output=AST;}
+            a : b c ;
+            b : ID ;
+            c : INT ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found, errors = self.execParser(grammar, "a", "34", expectErrors=True)
+
+        # finds an error at the first token, 34, and re-syncs.
+        # re-synchronizing does not consume a token because 34 follows
+        # ref to rule b (start of c). It then matches 34 in c.
+        self.assertEqual(["line 1:0 missing ID at '34'"], errors)
+        self.assertEqual("<missing ID> 34", found)
+
+
+    def testNoViableAltGivesErrorNode(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar foo;
+            options {language=Python3;output=AST;}
+            a : b | c ;
+            b : ID ;
+            c : INT ;
+            ID : 'a'..'z'+ ;
+            S : '*' ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found, errors = self.execParser(grammar, "a", "*", expectErrors=True)
+        self.assertEqual(["line 1:0 no viable alternative at input '*'"],
+                         errors)
+        self.assertEqual("<unexpected: [@0,0:0='*',<S>,1:0], resync=*>",
+                         found)
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/runtime/Python3/tests/t058rewriteAST.py b/runtime/Python3/tests/t058rewriteAST.py
new file mode 100644
index 0000000..bb59b50
--- /dev/null
+++ b/runtime/Python3/tests/t058rewriteAST.py
@@ -0,0 +1,1505 @@
+import unittest
+import textwrap
+import antlr3
+import antlr3.tree
+import testbase
+import sys
+
+class TestRewriteAST(testbase.ANTLRTest):
+    def parserClass(self, base):
+        class TParser(base):
+            def __init__(self, *args, **kwargs):
+                super().__init__(*args, **kwargs)
+
+                self._errors = []
+                self._output = ""
+
+
+            def capture(self, t):
+                self._output += t
+
+
+            def traceIn(self, ruleName, ruleIndex):
+                self.traces.append('>'+ruleName)
+
+
+            def traceOut(self, ruleName, ruleIndex):
+                self.traces.append('<'+ruleName)
+
+
+            def emitErrorMessage(self, msg):
+                self._errors.append(msg)
+
+
+        return TParser
+
+
+    def lexerClass(self, base):
+        class TLexer(base):
+            def __init__(self, *args, **kwargs):
+                super().__init__(*args, **kwargs)
+
+                self._output = ""
+
+
+            def capture(self, t):
+                self._output += t
+
+
+            def traceIn(self, ruleName, ruleIndex):
+                self.traces.append('>'+ruleName)
+
+
+            def traceOut(self, ruleName, ruleIndex):
+                self.traces.append('<'+ruleName)
+
+
+            def recover(self, input, re):
+                # no error recovery yet, just crash!
+                raise
+
+        return TLexer
+
+
+    def execParser(self, grammar, grammarEntry, input, expectErrors=False):
+        lexerCls, parserCls = self.compileInlineGrammar(grammar)
+
+        cStream = antlr3.StringStream(input)
+        lexer = lexerCls(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = parserCls(tStream)
+        r = getattr(parser, grammarEntry)()
+
+        if not expectErrors:
+            self.assertEqual(len(parser._errors), 0, parser._errors)
+
+        result = ""
+
+        if r:
+            if hasattr(r, 'result'):
+                result += r.result
+
+            if r.tree:
+                result += r.tree.toStringTree()
+
+        if not expectErrors:
+            return result
+
+        else:
+            return result, parser._errors
+
+
+    def execTreeParser(self, grammar, grammarEntry, treeGrammar, treeEntry, input):
+        lexerCls, parserCls = self.compileInlineGrammar(grammar)
+        walkerCls = self.compileInlineGrammar(treeGrammar)
+
+        cStream = antlr3.StringStream(input)
+        lexer = lexerCls(cStream)
+        tStream = antlr3.CommonTokenStream(lexer)
+        parser = parserCls(tStream)
+        r = getattr(parser, grammarEntry)()
+        nodes = antlr3.tree.CommonTreeNodeStream(r.tree)
+        nodes.setTokenStream(tStream)
+        walker = walkerCls(nodes)
+        r = getattr(walker, treeEntry)()
+
+        if r:
+            return r.tree.toStringTree()
+
+        return ""
+
+
+    def testDelete(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : ID INT -> ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "abc 34")
+        self.assertEqual("", found)
+
+
+    def testSingleToken(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : ID -> ID;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "abc")
+        self.assertEqual("abc", found)
+
+
+    def testSingleTokenToNewNode(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : ID -> ID["x"];
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "abc")
+        self.assertEqual("x", found)
+
+
+    def testSingleTokenToNewNodeRoot(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : ID -> ^(ID["x"] INT);
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "abc")
+        self.assertEqual("(x INT)", found)
+
+
+    def testSingleTokenToNewNode2(self):
+        # Allow creation of new nodes w/o args.
+        grammar = textwrap.dedent(
+            r'''
+            grammar TT;
+            options {language=Python3;output=AST;}
+            a : ID -> ID[ ];
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "abc")
+        self.assertEqual("ID", found)
+
+
+    def testSingleCharLiteral(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : 'c' -> 'c';
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "c")
+        self.assertEqual("c", found)
+
+
+    def testSingleStringLiteral(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : 'ick' -> 'ick';
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "ick")
+        self.assertEqual("ick", found)
+
+
+    def testSingleRule(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : b -> b;
+            b : ID ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "abc")
+        self.assertEqual("abc", found)
+
+
+    def testReorderTokens(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : ID INT -> INT ID;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "abc 34")
+        self.assertEqual("34 abc", found)
+
+
+    def testReorderTokenAndRule(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : b INT -> INT b;
+            b : ID ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "abc 34")
+        self.assertEqual("34 abc", found)
+
+
+    def testTokenTree(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : ID INT -> ^(INT ID);
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "abc 34")
+        self.assertEqual("(34 abc)", found)
+
+
+    def testTokenTreeAfterOtherStuff(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : 'void' ID INT -> 'void' ^(INT ID);
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "void abc 34")
+        self.assertEqual("void (34 abc)", found)
+
+
+    def testNestedTokenTreeWithOuterLoop(self):
+        # verify that ID and INT both iterate over outer index variable
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            tokens {DUH;}
+            a : ID INT ID INT -> ^( DUH ID ^( DUH INT) )+ ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a 1 b 2")
+        self.assertEqual("(DUH a (DUH 1)) (DUH b (DUH 2))", found)
+
+
+    def testOptionalSingleToken(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : ID -> ID? ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "abc")
+        self.assertEqual("abc", found)
+
+
+    def testClosureSingleToken(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : ID ID -> ID* ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a b")
+        self.assertEqual("a b", found)
+
+
+    def testPositiveClosureSingleToken(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : ID ID -> ID+ ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a b")
+        self.assertEqual("a b", found)
+
+
+    def testOptionalSingleRule(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : b -> b?;
+            b : ID ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "abc")
+        self.assertEqual("abc", found)
+
+
+    def testClosureSingleRule(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : b b -> b*;
+            b : ID ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a b")
+        self.assertEqual("a b", found)
+
+
+    def testClosureOfLabel(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : x+=b x+=b -> $x*;
+            b : ID ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a b")
+        self.assertEqual("a b", found)
+
+
+    def testOptionalLabelNoListLabel(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : (x=ID)? -> $x?;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a")
+        self.assertEqual("a", found)
+
+
+    def testPositiveClosureSingleRule(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : b b -> b+;
+            b : ID ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a b")
+        self.assertEqual("a b", found)
+
+
+    def testSinglePredicateT(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : ID -> {True}? ID -> ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "abc")
+        self.assertEqual("abc", found)
+
+
+    def testSinglePredicateF(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : ID -> {False}? ID -> ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "abc")
+        self.assertEqual("", found)
+
+
+    def testMultiplePredicate(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : ID INT -> {False}? ID
+                       -> {True}? INT
+                       ->
+              ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a 2")
+        self.assertEqual("2", found)
+
+
+    def testMultiplePredicateTrees(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : ID INT -> {False}? ^(ID INT)
+                       -> {True}? ^(INT ID)
+                       -> ID
+              ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a 2")
+        self.assertEqual("(2 a)", found)
+
+
+    def testSimpleTree(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : op INT -> ^(op INT);
+            op : '+'|'-' ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "-34")
+        self.assertEqual("(- 34)", found)
+
+
+    def testSimpleTree2(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : op INT -> ^(INT op);
+            op : '+'|'-' ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "+ 34")
+        self.assertEqual("(34 +)", found)
+
+
+
+    def testNestedTrees(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : 'var' (ID ':' type ';')+ -> ^('var' ^(':' ID type)+) ;
+            type : 'int' | 'float' ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "var a:int; b:float;")
+        self.assertEqual("(var (: a int) (: b float))", found)
+
+
+    def testImaginaryTokenCopy(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            tokens {VAR;}
+            a : ID (',' ID)*-> ^(VAR ID)+ ;
+            type : 'int' | 'float' ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a,b,c")
+        self.assertEqual("(VAR a) (VAR b) (VAR c)", found)
+
+
+    def testTokenUnreferencedOnLeftButDefined(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            tokens {VAR;}
+            a : b -> ID ;
+            b : ID ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a")
+        self.assertEqual("ID", found)
+
+
+    def testImaginaryTokenCopySetText(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            tokens {VAR;}
+            a : ID (',' ID)*-> ^(VAR["var"] ID)+ ;
+            type : 'int' | 'float' ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a,b,c")
+        self.assertEqual("(var a) (var b) (var c)", found)
+
+
+    def testImaginaryTokenNoCopyFromToken(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            tokens {BLOCK;}
+            a : lc='{' ID+ '}' -> ^(BLOCK[$lc] ID+) ;
+            type : 'int' | 'float' ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "{a b c}")
+        self.assertEqual("({ a b c)", found)
+
+
+    def testImaginaryTokenNoCopyFromTokenSetText(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            tokens {BLOCK;}
+            a : lc='{' ID+ '}' -> ^(BLOCK[$lc,"block"] ID+) ;
+            type : 'int' | 'float' ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "{a b c}")
+        self.assertEqual("(block a b c)", found)
+
+
+    def testMixedRewriteAndAutoAST(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            tokens {BLOCK;}
+            a : b b^ ; // 2nd b matches only an INT; can make it root
+            b : ID INT -> INT ID
+              | INT
+              ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a 1 2")
+        self.assertEqual("(2 1 a)", found)
+
+
+    def testSubruleWithRewrite(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            tokens {BLOCK;}
+            a : b b ;
+            b : (ID INT -> INT ID | INT INT -> INT+ )
+              ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a 1 2 3")
+        self.assertEqual("1 a 2 3", found)
+
+
+    def testSubruleWithRewrite2(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            tokens {TYPE;}
+            a : b b ;
+            b : 'int'
+                ( ID -> ^(TYPE 'int' ID)
+                | ID '=' INT -> ^(TYPE 'int' ID INT)
+                )
+                ';'
+              ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "int a; int b=3;")
+        self.assertEqual("(TYPE int a) (TYPE int b 3)", found)
+
+
+    def testNestedRewriteShutsOffAutoAST(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            tokens {BLOCK;}
+            a : b b ;
+            b : ID ( ID (last=ID -> $last)+ ) ';' // get last ID
+              | INT // should still get auto AST construction
+              ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a b c d; 42")
+        self.assertEqual("d 42", found)
+
+
+    def testRewriteActions(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : atom -> ^({self.adaptor.create(INT,"9")} atom) ;
+            atom : INT ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "3")
+        self.assertEqual("(9 3)", found)
+
+
+    def testRewriteActions2(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : atom -> {self.adaptor.create(INT,"9")} atom ;
+            atom : INT ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "3")
+        self.assertEqual("9 3", found)
+
+
+    def testRefToOldValue(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            tokens {BLOCK;}
+            a : (atom -> atom) (op='+' r=atom -> ^($op $a $r) )* ;
+            atom : INT ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "3+4+5")
+        self.assertEqual("(+ (+ 3 4) 5)", found)
+
+
+    def testCopySemanticsForRules(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            tokens {BLOCK;}
+            a : atom -> ^(atom atom) ; // NOT CYCLE! (dup atom)
+            atom : INT ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "3")
+        self.assertEqual("(3 3)", found)
+
+
+    def testCopySemanticsForRules2(self):
+        # copy type as a root for each invocation of (...)+ in rewrite
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : type ID (',' ID)* ';' -> ^(type ID)+ ;
+            type : 'int' ;
+            ID : 'a'..'z'+ ;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "int a,b,c;")
+        self.assertEqual("(int a) (int b) (int c)", found)
+
+
+    def testCopySemanticsForRules3(self):
+        # copy type *and* modifier even though it's optional
+        # for each invocation of (...)+ in rewrite
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : modifier? type ID (',' ID)* ';' -> ^(type modifier? ID)+ ;
+            type : 'int' ;
+            modifier : 'public' ;
+            ID : 'a'..'z'+ ;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "public int a,b,c;")
+        self.assertEqual("(int public a) (int public b) (int public c)", found)
+
+
+    def testCopySemanticsForRules3Double(self):
+        # copy type *and* modifier even though it's optional
+        # for each invocation of (...)+ in rewrite
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : modifier? type ID (',' ID)* ';' -> ^(type modifier? ID)+ ^(type modifier? ID)+ ;
+            type : 'int' ;
+            modifier : 'public' ;
+            ID : 'a'..'z'+ ;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "public int a,b,c;")
+        self.assertEqual("(int public a) (int public b) (int public c) (int public a) (int public b) (int public c)", found)
+
+
+    def testCopySemanticsForRules4(self):
+        # copy type *and* modifier even though it's optional
+        # for each invocation of (...)+ in rewrite
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            tokens {MOD;}
+            a : modifier? type ID (',' ID)* ';' -> ^(type ^(MOD modifier)? ID)+ ;
+            type : 'int' ;
+            modifier : 'public' ;
+            ID : 'a'..'z'+ ;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "public int a,b,c;")
+        self.assertEqual("(int (MOD public) a) (int (MOD public) b) (int (MOD public) c)", found)
+
+
+    def testCopySemanticsLists(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            tokens {MOD;}
+            a : ID (',' ID)* ';' -> ID+ ID+ ;
+            ID : 'a'..'z'+ ;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a,b,c;")
+        self.assertEqual("a b c a b c", found)
+
+
+    def testCopyRuleLabel(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            tokens {BLOCK;}
+            a : x=b -> $x $x;
+            b : ID ;
+            ID : 'a'..'z'+ ;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a")
+        self.assertEqual("a a", found)
+
+
+    def testCopyRuleLabel2(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            tokens {BLOCK;}
+            a : x=b -> ^($x $x);
+            b : ID ;
+            ID : 'a'..'z'+ ;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a")
+        self.assertEqual("(a a)", found)
+
+
+    def testQueueingOfTokens(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : 'int' ID (',' ID)* ';' -> ^('int' ID+) ;
+            op : '+'|'-' ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "int a,b,c;")
+        self.assertEqual("(int a b c)", found)
+
+
+    def testCopyOfTokens(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : 'int' ID ';' -> 'int' ID 'int' ID ;
+            op : '+'|'-' ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "int a;")
+        self.assertEqual("int a int a", found)
+
+
+    def testTokenCopyInLoop(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : 'int' ID (',' ID)* ';' -> ^('int' ID)+ ;
+            op : '+'|'-' ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "int a,b,c;")
+        self.assertEqual("(int a) (int b) (int c)", found)
+
+
+    def testTokenCopyInLoopAgainstTwoOthers(self):
+        # must smear 'int' copies across as root of multiple trees
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : 'int' ID ':' INT (',' ID ':' INT)* ';' -> ^('int' ID INT)+ ;
+            op : '+'|'-' ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "int a:1,b:2,c:3;")
+        self.assertEqual("(int a 1) (int b 2) (int c 3)", found)
+
+
+    def testListRefdOneAtATime(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : ID+ -> ID ID ID ; // works if 3 input IDs
+            op : '+'|'-' ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a b c")
+        self.assertEqual("a b c", found)
+
+
+    def testSplitListWithLabels(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            tokens {VAR;}
+            a : first=ID others+=ID* -> $first VAR $others+ ;
+            op : '+'|'-' ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a b c")
+        self.assertEqual("a VAR b c", found)
+
+
+    def testComplicatedMelange(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            tokens {BLOCK;}
+            a : A A b=B B b=B c+=C C c+=C D {s=$D.text} -> A+ B+ C+ D ;
+            type : 'int' | 'float' ;
+            A : 'a' ;
+            B : 'b' ;
+            C : 'c' ;
+            D : 'd' ;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a a b b b c c c d")
+        self.assertEqual("a a b b b c c c d", found)
+
+
+    def testRuleLabel(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            tokens {BLOCK;}
+            a : x=b -> $x;
+            b : ID ;
+            ID : 'a'..'z'+ ;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a")
+        self.assertEqual("a", found)
+
+
+    def testAmbiguousRule(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : ID a -> a | INT ;
+            ID : 'a'..'z'+ ;
+            INT: '0'..'9'+ ;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar,
+				    "a", "abc 34")
+        self.assertEqual("34", found)
+
+
+    def testRuleListLabel(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            tokens {BLOCK;}
+            a : x+=b x+=b -> $x+;
+            b : ID ;
+            ID : 'a'..'z'+ ;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a b")
+        self.assertEqual("a b", found)
+
+
+    def testRuleListLabel2(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            tokens {BLOCK;}
+            a : x+=b x+=b -> $x $x*;
+            b : ID ;
+            ID : 'a'..'z'+ ;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a b")
+        self.assertEqual("a b", found)
+
+
+    def testOptional(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            tokens {BLOCK;}
+            a : x=b (y=b)? -> $x $y?;
+            b : ID ;
+            ID : 'a'..'z'+ ;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a")
+        self.assertEqual("a", found)
+
+
+    def testOptional2(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            tokens {BLOCK;}
+            a : x=ID (y=b)? -> $x $y?;
+            b : ID ;
+            ID : 'a'..'z'+ ;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a b")
+        self.assertEqual("a b", found)
+
+
+    def testOptional3(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            tokens {BLOCK;}
+            a : x=ID (y=b)? -> ($x $y)?;
+            b : ID ;
+            ID : 'a'..'z'+ ;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a b")
+        self.assertEqual("a b", found)
+
+
+    def testOptional4(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            tokens {BLOCK;}
+            a : x+=ID (y=b)? -> ($x $y)?;
+            b : ID ;
+            ID : 'a'..'z'+ ;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a b")
+        self.assertEqual("a b", found)
+
+
+    def testOptional5(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            tokens {BLOCK;}
+            a : ID -> ID? ; // match an ID to optional ID
+            b : ID ;
+            ID : 'a'..'z'+ ;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a")
+        self.assertEqual("a", found)
+
+
+    def testArbitraryExprType(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            tokens {BLOCK;}
+            a : x+=b x+=b -> {CommonTree(None)};
+            b : ID ;
+            ID : 'a'..'z'+ ;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "a b")
+        self.assertEqual("", found)
+
+
+    def testSet(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a: (INT|ID)+ -> INT+ ID+ ;
+            INT: '0'..'9'+;
+            ID : 'a'..'z'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "2 a 34 de")
+        self.assertEqual("2 34 a de", found)
+
+
+    def testSet2(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a: (INT|ID) -> INT? ID? ;
+            INT: '0'..'9'+;
+            ID : 'a'..'z'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "2")
+        self.assertEqual("2", found)
+
+
+    @testbase.broken("http://www.antlr.org:8888/browse/ANTLR-162",
+                     antlr3.tree.RewriteEmptyStreamException)
+    def testSetWithLabel(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : x=(INT|ID) -> $x ;
+            INT: '0'..'9'+;
+            ID : 'a'..'z'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "2")
+        self.assertEqual("2", found)
+
+
+    def testRewriteAction(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            tokens { FLOAT; }
+            r
+                : INT -> {CommonTree(CommonToken(type=FLOAT, text=$INT.text+".0"))}
+                ;
+            INT : '0'..'9'+;
+            WS: (' ' | '\n' | '\t')+ {$channel = HIDDEN};
+            ''')
+
+        found = self.execParser(grammar, "r", "25")
+        self.assertEqual("25.0", found)
+
+
+    def testOptionalSubruleWithoutRealElements(self):
+        # copy type *and* modifier even though it's optional
+        # for each invocation of (...)+ in rewrite
+        grammar = textwrap.dedent(
+            r"""
+            grammar T;
+            options {language=Python3;output=AST;}
+            tokens {PARMS;}
+
+            modulo
+             : 'modulo' ID ('(' parms+ ')')? -> ^('modulo' ID ^(PARMS parms+)?)
+             ;
+            parms : '#'|ID;
+            ID : ('a'..'z' | 'A'..'Z')+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            """)
+
+        found = self.execParser(grammar, "modulo", "modulo abc (x y #)")
+        self.assertEqual("(modulo abc (PARMS x y #))", found)
+
+
+    ## C A R D I N A L I T Y  I S S U E S
+
+    def testCardinality(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            tokens {BLOCK;}
+            a : ID ID INT INT INT -> (ID INT)+;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        self.assertRaises(antlr3.tree.RewriteCardinalityException,
+                          self.execParser, grammar, "a", "a b 3 4 5")
+
+
+    def testCardinality2(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : ID+ -> ID ID ID ; // only 2 input IDs
+            op : '+'|'-' ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        self.assertRaises(antlr3.tree.RewriteCardinalityException,
+                          self.execParser, grammar, "a", "a b")
+
+
+    def testCardinality3(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : ID? INT -> ID INT ;
+            op : '+'|'-' ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        self.assertRaises(antlr3.tree.RewriteEmptyStreamException,
+                          self.execParser, grammar, "a", "3")
+
+
+    def testLoopCardinality(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : ID? INT -> ID+ INT ;
+            op : '+'|'-' ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        self.assertRaises(antlr3.tree.RewriteEarlyExitException,
+                          self.execParser, grammar, "a", "3")
+
+
+    def testWildcard(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar T;
+            options {language=Python3;output=AST;}
+            a : ID c=. -> $c;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found = self.execParser(grammar, "a", "abc 34")
+        self.assertEqual("34", found)
+
+
+    # E R R O R S
+
+    def testExtraTokenInSimpleDecl(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar foo;
+            options {language=Python3;output=AST;}
+            tokens {EXPR;}
+            decl : type ID '=' INT ';' -> ^(EXPR type ID INT) ;
+            type : 'int' | 'float' ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found, errors = self.execParser(grammar, "decl", "int 34 x=1;",
+                                        expectErrors=True)
+        self.assertEqual(["line 1:4 extraneous input '34' expecting ID"],
+                         errors)
+        self.assertEqual("(EXPR int x 1)", found) # tree gets correct x and 1 tokens
+
+
+    #@testbase.broken("FIXME", AssertionError)
+    def testMissingIDInSimpleDecl(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar foo;
+            options {language=Python3;output=AST;}
+            tokens {EXPR;}
+            decl : type ID '=' INT ';' -> ^(EXPR type ID INT) ;
+            type : 'int' | 'float' ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found, errors = self.execParser(grammar, "decl", "int =1;",
+                                        expectErrors=True)
+        self.assertEqual(["line 1:4 missing ID at '='"], errors)
+        self.assertEqual("(EXPR int <missing ID> 1)", found) # tree gets invented ID token
+
+
+    def testMissingSetInSimpleDecl(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar foo;
+            options {language=Python3;output=AST;}
+            tokens {EXPR;}
+            decl : type ID '=' INT ';' -> ^(EXPR type ID INT) ;
+            type : 'int' | 'float' ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found, errors = self.execParser(grammar, "decl", "x=1;",
+                                        expectErrors=True)
+        self.assertEqual(["line 1:0 mismatched input 'x' expecting set None"],
+                         errors);
+        self.assertEqual("(EXPR <error: x> x 1)", found) # tree gets invented ID token
+
+
+    def testMissingTokenGivesErrorNode(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar foo;
+            options {language=Python3;output=AST;}
+            a : ID INT -> ID INT ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found, errors = self.execParser(grammar, "a", "abc",
+                                        expectErrors=True)
+        self.assertEqual(["line 1:3 missing INT at '<EOF>'"], errors)
+        # doesn't do in-line recovery for sets (yet?)
+        self.assertEqual("abc <missing INT>", found)
+
+
+    def testExtraTokenGivesErrorNode(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar foo;
+            options {language=Python3;output=AST;}
+            a : b c -> b c;
+            b : ID -> ID ;
+            c : INT -> INT ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found, errors = self.execParser(grammar, "a", "abc ick 34",
+                                        expectErrors=True)
+        self.assertEqual(["line 1:4 extraneous input 'ick' expecting INT"],
+                         errors)
+        self.assertEqual("abc 34", found)
+
+
+    #@testbase.broken("FIXME", AssertionError)
+    def testMissingFirstTokenGivesErrorNode(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar foo;
+            options {language=Python3;output=AST;}
+            a : ID INT -> ID INT ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found, errors = self.execParser(grammar, "a", "34", expectErrors=True)
+        self.assertEqual(["line 1:0 missing ID at '34'"], errors)
+        self.assertEqual("<missing ID> 34", found)
+
+
+    #@testbase.broken("FIXME", AssertionError)
+    def testMissingFirstTokenGivesErrorNode2(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar foo;
+            options {language=Python3;output=AST;}
+            a : b c -> b c;
+            b : ID -> ID ;
+            c : INT -> INT ;
+            ID : 'a'..'z'+ ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found, errors = self.execParser(grammar, "a", "34", expectErrors=True)
+        # finds an error at the first token, 34, and re-syncs.
+        # re-synchronizing does not consume a token because 34 follows
+        # ref to rule b (start of c). It then matches 34 in c.
+        self.assertEqual(["line 1:0 missing ID at '34'"], errors)
+        self.assertEqual("<missing ID> 34", found)
+
+
+    def testNoViableAltGivesErrorNode(self):
+        grammar = textwrap.dedent(
+            r'''
+            grammar foo;
+            options {language=Python3;output=AST;}
+            a : b -> b | c -> c;
+            b : ID -> ID ;
+            c : INT -> INT ;
+            ID : 'a'..'z'+ ;
+            S : '*' ;
+            INT : '0'..'9'+;
+            WS : (' '|'\n') {$channel=HIDDEN} ;
+            ''')
+
+        found, errors = self.execParser(grammar, "a", "*", expectErrors=True)
+        # finds an error at the first token, 34, and re-syncs.
+        # re-synchronizing does not consume a token because 34 follows
+        # ref to rule b (start of c). It then matches 34 in c.
+        self.assertEqual(["line 1:0 no viable alternative at input '*'"],
+                         errors);
+        self.assertEqual("<unexpected: [@0,0:0='*',<S>,1:0], resync=*>",
+                         found)
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/runtime/Python3/tests/t059debug.py b/runtime/Python3/tests/t059debug.py
new file mode 100644
index 0000000..8e129f7
--- /dev/null
+++ b/runtime/Python3/tests/t059debug.py
@@ -0,0 +1,787 @@
+import unittest
+import textwrap
+import antlr3
+import antlr3.tree
+import antlr3.debug
+import testbase
+import sys
+import threading
+import socket
+import errno
+import time
+
+class Debugger(threading.Thread):
+    def __init__(self, port):
+        super().__init__()
+        self.events = []
+        self.success = False
+        self.port = port
+
+    def run(self):
+        # create listening socket
+        s = None
+        tstart = time.time()
+        while time.time() - tstart < 10:
+            try:
+                s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+                s.connect(('127.0.0.1', self.port))
+                break
+            except socket.error as exc:
+                if s:
+                    s.close()
+                if exc.args[0] != errno.ECONNREFUSED:
+                    raise
+                time.sleep(0.1)
+
+        if s is None:
+            self.events.append(['nosocket'])
+            return
+
+        s.setblocking(1)
+        s.settimeout(10.0)
+
+        output = s.makefile('w', 1)
+        input = s.makefile('r', 1)
+
+        try:
+            # handshake
+            l = input.readline().strip()
+            assert l == 'ANTLR 2'
+            l = input.readline().strip()
+            assert l.startswith('grammar "'), l
+
+            output.write('ACK\n')
+            output.flush()
+
+            while True:
+                event = input.readline().strip()
+                self.events.append(event.split('\t'))
+
+                output.write('ACK\n')
+                output.flush()
+
+                if event == 'terminate':
+                    self.success = True
+                    break
+
+        except socket.timeout:
+            self.events.append(['timeout'])
+        except socket.error as exc:
+            self.events.append(['socketerror', exc.args])
+        finally:
+            output.close()
+            input.close()
+            s.close()
+
+
+class T(testbase.ANTLRTest):
+    def execParser(self, grammar, grammarEntry, input, listener,
+                   parser_args={}):
+        if listener is None:
+            port = 49100
+            debugger = Debugger(port)
+            debugger.start()
+            # TODO(pink): install alarm, so it doesn't hang forever in case of a bug
+
+        else:
+            port = None
+
+        try:
+            lexerCls, parserCls = self.compileInlineGrammar(
+                grammar, options='-debug')
+
+            cStream = antlr3.StringStream(input)
+            lexer = lexerCls(cStream)
+            tStream = antlr3.CommonTokenStream(lexer)
+            parser = parserCls(tStream, dbg=listener, port=port, **parser_args)
+            getattr(parser, grammarEntry)()
+
+        finally:
+            if listener is None:
+                debugger.join()
+                return debugger
+
+    def testBasicParser(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T;
+        options {
+            language=Python3;
+        }
+        a : ID EOF;
+        ID : 'a'..'z'+ ;
+        WS : (' '|'\n') {$channel=HIDDEN} ;
+        ''')
+
+        listener = antlr3.debug.RecordDebugEventListener()
+
+        self.execParser(
+            grammar, 'a',
+            input="a",
+            listener=listener)
+
+        # We only check that some LT events are present. How many is subject
+        # to change (at the time of writing there are two, which is one too
+        # many).
+        lt_events = [event for event in listener.events
+                     if event.startswith("LT ")]
+        self.assertNotEqual(lt_events, [])
+
+        # For the rest, filter out LT events to get a reliable test.
+        expected = ["enterRule a",
+                    "location 6:1",
+                    "location 6:5",
+                    "location 6:8",
+                    "location 6:11",
+                    "exitRule a"]
+        found = [event for event in listener.events
+                 if not event.startswith("LT ")]
+        self.assertListEqual(found, expected)
+
+    def testSocketProxy(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T;
+        options {
+            language=Python3;
+        }
+        a : ID EOF;
+        ID : 'a'..'z'+ ;
+        WS : (' '|'\n') {$channel=HIDDEN} ;
+        ''')
+
+        debugger = self.execParser(
+            grammar, 'a',
+            input="a",
+            listener=None)
+
+        self.assertTrue(debugger.success)
+        expected = [['enterRule', 'T.g', 'a'],
+                    ['location', '6', '1'],
+                    ['enterAlt', '1'],
+                    ['location', '6', '5'],
+                    ['LT', '1', '0', '4', '0', '1', '0', '"a'],
+                    ['LT', '1', '0', '4', '0', '1', '0', '"a'],
+                    ['consumeToken', '0', '4', '0', '1', '0', '"a'],
+                    ['location', '6', '8'],
+                    ['LT', '1', '-1', '-1', '0', '1', '1', '"<EOF>'],
+                    ['LT', '1', '-1', '-1', '0', '1', '1', '"<EOF>'],
+                    ['consumeToken', '-1', '-1', '0', '1', '1', '"<EOF>'],
+                    ['location', '6', '11'],
+                    ['exitRule', 'T.g', 'a'],
+                    ['terminate']]
+
+        self.assertListEqual(debugger.events, expected)
+
+    def testRecognitionException(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T;
+        options {
+            language=Python3;
+        }
+        a : ID EOF;
+        ID : 'a'..'z'+ ;
+        WS : (' '|'\n') {$channel=HIDDEN} ;
+        ''')
+
+        debugger = self.execParser(
+            grammar, 'a',
+            input="a b",
+            listener=None)
+
+        self.assertTrue(debugger.success)
+        expected = [['enterRule', 'T.g', 'a'],
+                    ['location', '6', '1'],
+                    ['enterAlt', '1'],
+                    ['location', '6', '5'],
+                    ['LT', '1', '0', '4', '0', '1', '0', '"a'],
+                    ['LT', '1', '0', '4', '0', '1', '0', '"a'],
+                    ['consumeToken', '0', '4', '0', '1', '0', '"a'],
+                    ['consumeHiddenToken', '1', '5', '99', '1', '1', '"'],
+                    ['location', '6', '8'],
+                    ['LT', '1', '2', '4', '0', '1', '2', '"b'],
+                    ['LT', '1', '2', '4', '0', '1', '2', '"b'],
+                    ['LT', '2', '-1', '-1', '0', '1', '3', '"<EOF>'],
+                    ['LT', '1', '2', '4', '0', '1', '2', '"b'],
+                    ['LT', '1', '2', '4', '0', '1', '2', '"b'],
+                    ['beginResync'],
+                    ['consumeToken', '2', '4', '0', '1', '2', '"b'],
+                    ['endResync'],
+                    ['exception', 'UnwantedTokenException', '2', '1', '2'],
+                    ['LT', '1', '-1', '-1', '0', '1', '3', '"<EOF>'],
+                    ['consumeToken', '-1', '-1', '0', '1', '3', '"<EOF>'],
+                    ['location', '6', '11'],
+                    ['exitRule', 'T.g', 'a'],
+                    ['terminate']]
+
+        self.assertListEqual(debugger.events, expected)
+
+
+    def testSemPred(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T;
+        options {
+            language=Python3;
+        }
+        a : {True}? ID EOF;
+        ID : 'a'..'z'+ ;
+        WS : (' '|'\n') {$channel=HIDDEN} ;
+        ''')
+
+        debugger = self.execParser(
+            grammar, 'a',
+            input="a",
+            listener=None)
+
+        self.assertTrue(debugger.success)
+        expected = [['enterRule', 'T.g', 'a'],
+                    ['location', '6', '1'],
+                    ['enterAlt', '1'],
+                    ['location', '6', '5'],
+                    ['semanticPredicate', '1', 'True'],
+                    ['location', '6', '13'],
+                    ['LT', '1', '0', '4', '0', '1', '0', '"a'],
+                    ['LT', '1', '0', '4', '0', '1', '0', '"a'],
+                    ['consumeToken', '0', '4', '0', '1', '0', '"a'],
+                    ['location', '6', '16'],
+                    ['LT', '1', '-1', '-1', '0', '1', '1', '"<EOF>'],
+                    ['LT', '1', '-1', '-1', '0', '1', '1', '"<EOF>'],
+                    ['consumeToken', '-1', '-1', '0', '1', '1', '"<EOF>'],
+                    ['location', '6', '19'],
+                    ['exitRule', 'T.g', 'a'],
+                    ['terminate']]
+
+        self.assertListEqual(debugger.events, expected)
+
+
+    def testPositiveClosureBlock(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T;
+        options {
+            language=Python3;
+        }
+        a : ID ( ID | INT )+ EOF;
+        ID : 'a'..'z'+ ;
+        INT : '0'..'9'+ ;
+        WS : (' '|'\n') {$channel=HIDDEN} ;
+        ''')
+
+        debugger = self.execParser(
+            grammar, 'a',
+            input="a 1 b c 3",
+            listener=None)
+
+        self.assertTrue(debugger.success)
+        expected = [['enterRule', 'T.g', 'a'],
+                    ['location', '6', '1'],
+                    ['enterAlt', '1'],
+                    ['location', '6', '5'],
+                    ['LT', '1', '0', '4', '0', '1', '0', '"a'],
+                    ['LT', '1', '0', '4', '0', '1', '0', '"a'],
+                    ['consumeToken', '0', '4', '0', '1', '0', '"a'],
+                    ['consumeHiddenToken', '1', '6', '99', '1', '1', '"'],
+                    ['location', '6', '8'],
+                    ['enterSubRule', '1'],
+                    ['enterDecision', '1', '0'],
+                    ['LT', '1', '2', '5', '0', '1', '2', '"1'],
+                    ['exitDecision', '1'],
+                    ['enterAlt', '1'],
+                    ['location', '6', '8'],
+                    ['LT', '1', '2', '5', '0', '1', '2', '"1'],
+                    ['consumeToken', '2', '5', '0', '1', '2', '"1'],
+                    ['consumeHiddenToken', '3', '6', '99', '1', '3', '"'],
+                    ['enterDecision', '1', '0'],
+                    ['LT', '1', '4', '4', '0', '1', '4', '"b'],
+                    ['exitDecision', '1'],
+                    ['enterAlt', '1'],
+                    ['location', '6', '8'],
+                    ['LT', '1', '4', '4', '0', '1', '4', '"b'],
+                    ['consumeToken', '4', '4', '0', '1', '4', '"b'],
+                    ['consumeHiddenToken', '5', '6', '99', '1', '5', '"'],
+                    ['enterDecision', '1', '0'],
+                    ['LT', '1', '6', '4', '0', '1', '6', '"c'],
+                    ['exitDecision', '1'],
+                    ['enterAlt', '1'],
+                    ['location', '6', '8'],
+                    ['LT', '1', '6', '4', '0', '1', '6', '"c'],
+                    ['consumeToken', '6', '4', '0', '1', '6', '"c'],
+                    ['consumeHiddenToken', '7', '6', '99', '1', '7', '"'],
+                    ['enterDecision', '1', '0'],
+                    ['LT', '1', '8', '5', '0', '1', '8', '"3'],
+                    ['exitDecision', '1'],
+                    ['enterAlt', '1'],
+                    ['location', '6', '8'],
+                    ['LT', '1', '8', '5', '0', '1', '8', '"3'],
+                    ['consumeToken', '8', '5', '0', '1', '8', '"3'],
+                    ['enterDecision', '1', '0'],
+                    ['LT', '1', '-1', '-1', '0', '1', '9', '"<EOF>'],
+                    ['exitDecision', '1'],
+                    ['exitSubRule', '1'],
+                    ['location', '6', '22'],
+                    ['LT', '1', '-1', '-1', '0', '1', '9', '"<EOF>'],
+                    ['LT', '1', '-1', '-1', '0', '1', '9', '"<EOF>'],
+                    ['consumeToken', '-1', '-1', '0', '1', '9', '"<EOF>'],
+                    ['location', '6', '25'],
+                    ['exitRule', 'T.g', 'a'],
+                    ['terminate']]
+
+        self.assertListEqual(debugger.events, expected)
+
+
+    def testClosureBlock(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T;
+        options {
+            language=Python3;
+        }
+        a : ID ( ID | INT )* EOF;
+        ID : 'a'..'z'+ ;
+        INT : '0'..'9'+ ;
+        WS : (' '|'\n') {$channel=HIDDEN} ;
+        ''')
+
+        debugger = self.execParser(
+            grammar, 'a',
+            input="a 1 b c 3",
+            listener=None)
+
+        self.assertTrue(debugger.success)
+        expected = [['enterRule', 'T.g', 'a'],
+                    ['location', '6', '1'],
+                    ['enterAlt', '1'],
+                    ['location', '6', '5'],
+                    ['LT', '1', '0', '4', '0', '1', '0', '"a'],
+                    ['LT', '1', '0', '4', '0', '1', '0', '"a'],
+                    ['consumeToken', '0', '4', '0', '1', '0', '"a'],
+                    ['consumeHiddenToken', '1', '6', '99', '1', '1', '"'],
+                    ['location', '6', '8'],
+                    ['enterSubRule', '1'],
+                    ['enterDecision', '1', '0'],
+                    ['LT', '1', '2', '5', '0', '1', '2', '"1'],
+                    ['exitDecision', '1'],
+                    ['enterAlt', '1'],
+                    ['location', '6', '8'],
+                    ['LT', '1', '2', '5', '0', '1', '2', '"1'],
+                    ['consumeToken', '2', '5', '0', '1', '2', '"1'],
+                    ['consumeHiddenToken', '3', '6', '99', '1', '3', '"'],
+                    ['enterDecision', '1', '0'],
+                    ['LT', '1', '4', '4', '0', '1', '4', '"b'],
+                    ['exitDecision', '1'],
+                    ['enterAlt', '1'],
+                    ['location', '6', '8'],
+                    ['LT', '1', '4', '4', '0', '1', '4', '"b'],
+                    ['consumeToken', '4', '4', '0', '1', '4', '"b'],
+                    ['consumeHiddenToken', '5', '6', '99', '1', '5', '"'],
+                    ['enterDecision', '1', '0'],
+                    ['LT', '1', '6', '4', '0', '1', '6', '"c'],
+                    ['exitDecision', '1'],
+                    ['enterAlt', '1'],
+                    ['location', '6', '8'],
+                    ['LT', '1', '6', '4', '0', '1', '6', '"c'],
+                    ['consumeToken', '6', '4', '0', '1', '6', '"c'],
+                    ['consumeHiddenToken', '7', '6', '99', '1', '7', '"'],
+                    ['enterDecision', '1', '0'],
+                    ['LT', '1', '8', '5', '0', '1', '8', '"3'],
+                    ['exitDecision', '1'],
+                    ['enterAlt', '1'],
+                    ['location', '6', '8'],
+                    ['LT', '1', '8', '5', '0', '1', '8', '"3'],
+                    ['consumeToken', '8', '5', '0', '1', '8', '"3'],
+                    ['enterDecision', '1', '0'],
+                    ['LT', '1', '-1', '-1', '0', '1', '9', '"<EOF>'],
+                    ['exitDecision', '1'],
+                    ['exitSubRule', '1'],
+                    ['location', '6', '22'],
+                    ['LT', '1', '-1', '-1', '0', '1', '9', '"<EOF>'],
+                    ['LT', '1', '-1', '-1', '0', '1', '9', '"<EOF>'],
+                    ['consumeToken', '-1', '-1', '0', '1', '9', '"<EOF>'],
+                    ['location', '6', '25'],
+                    ['exitRule', 'T.g', 'a'],
+                    ['terminate']]
+
+        self.assertListEqual(debugger.events, expected)
+
+
+    def testMismatchedSetException(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T;
+        options {
+            language=Python3;
+        }
+        a : ID ( ID | INT ) EOF;
+        ID : 'a'..'z'+ ;
+        INT : '0'..'9'+ ;
+        WS : (' '|'\n') {$channel=HIDDEN} ;
+        ''')
+
+        debugger = self.execParser(
+            grammar, 'a',
+            input="a",
+            listener=None)
+
+        self.assertTrue(debugger.success)
+        expected = [['enterRule', 'T.g', 'a'],
+                    ['location', '6', '1'],
+                    ['enterAlt', '1'],
+                    ['location', '6', '5'],
+                    ['LT', '1', '0', '4', '0', '1', '0', '"a'],
+                    ['LT', '1', '0', '4', '0', '1', '0', '"a'],
+                    ['consumeToken', '0', '4', '0', '1', '0', '"a'],
+                    ['location', '6', '8'],
+                    ['LT', '1', '-1', '-1', '0', '1', '1', '"<EOF>'],
+                    ['LT', '1', '-1', '-1', '0', '1', '1', '"<EOF>'],
+                    ['LT', '1', '-1', '-1', '0', '1', '1', '"<EOF>'],
+                    ['exception', 'MismatchedSetException', '1', '1', '1'],
+                    ['exception', 'MismatchedSetException', '1', '1', '1'],
+                    ['beginResync'],
+                    ['LT', '1', '-1', '-1', '0', '1', '1', '"<EOF>'],
+                    ['endResync'],
+                    ['location', '6', '24'],
+                    ['exitRule', 'T.g', 'a'],
+                    ['terminate']]
+
+        self.assertListEqual(debugger.events, expected)
+
+
+    def testBlock(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T;
+        options {
+            language=Python3;
+        }
+        a : ID ( b | c ) EOF;
+        b : ID;
+        c : INT;
+        ID : 'a'..'z'+ ;
+        INT : '0'..'9'+ ;
+        WS : (' '|'\n') {$channel=HIDDEN} ;
+        ''')
+
+        debugger = self.execParser(
+            grammar, 'a',
+            input="a 1",
+            listener=None)
+
+        self.assertTrue(debugger.success)
+        expected =  [['enterRule', 'T.g', 'a'],
+                     ['location', '6', '1'],
+                     ['enterAlt', '1'],
+                     ['location', '6', '5'],
+                     ['LT', '1', '0', '4', '0', '1', '0', '"a'],
+                     ['LT', '1', '0', '4', '0', '1', '0', '"a'],
+                     ['consumeToken', '0', '4', '0', '1', '0', '"a'],
+                     ['consumeHiddenToken', '1', '6', '99', '1', '1', '"'],
+                     ['location', '6', '8'],
+                     ['enterSubRule', '1'],
+                     ['enterDecision', '1', '0'],
+                     ['LT', '1', '2', '5', '0', '1', '2', '"1'],
+                     ['exitDecision', '1'],
+                     ['enterAlt', '2'],
+                     ['location', '6', '14'],
+                     ['enterRule', 'T.g', 'c'],
+                     ['location', '8', '1'],
+                     ['enterAlt', '1'],
+                     ['location', '8', '5'],
+                     ['LT', '1', '2', '5', '0', '1', '2', '"1'],
+                     ['LT', '1', '2', '5', '0', '1', '2', '"1'],
+                     ['consumeToken', '2', '5', '0', '1', '2', '"1'],
+                     ['location', '8', '8'],
+                     ['exitRule', 'T.g', 'c'],
+                     ['exitSubRule', '1'],
+                     ['location', '6', '18'],
+                     ['LT', '1', '-1', '-1', '0', '1', '3', '"<EOF>'],
+                     ['LT', '1', '-1', '-1', '0', '1', '3', '"<EOF>'],
+                     ['consumeToken', '-1', '-1', '0', '1', '3', '"<EOF>'],
+                     ['location', '6', '21'],
+                     ['exitRule', 'T.g', 'a'],
+                     ['terminate']]
+
+        self.assertListEqual(debugger.events, expected)
+
+
+    def testNoViableAlt(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T;
+        options {
+            language=Python3;
+        }
+        a : ID ( b | c ) EOF;
+        b : ID;
+        c : INT;
+        ID : 'a'..'z'+ ;
+        INT : '0'..'9'+ ;
+        BANG : '!' ;
+        WS : (' '|'\n') {$channel=HIDDEN} ;
+        ''')
+
+        debugger = self.execParser(
+            grammar, 'a',
+            input="a !",
+            listener=None)
+
+        self.assertTrue(debugger.success)
+        expected =  [['enterRule', 'T.g', 'a'],
+                     ['location', '6', '1'],
+                     ['enterAlt', '1'],
+                     ['location', '6', '5'],
+                     ['LT', '1', '0', '5', '0', '1', '0', '"a'],
+                     ['LT', '1', '0', '5', '0', '1', '0', '"a'],
+                     ['consumeToken', '0', '5', '0', '1', '0', '"a'],
+                     ['consumeHiddenToken', '1', '7', '99', '1', '1', '"'],
+                     ['location', '6', '8'],
+                     ['enterSubRule', '1'],
+                     ['enterDecision', '1', '0'],
+                     ['LT', '1', '2', '4', '0', '1', '2', '"!'],
+                     ['LT', '1', '2', '4', '0', '1', '2', '"!'],
+                     ['LT', '1', '2', '4', '0', '1', '2', '"!'],
+                     ['exception', 'NoViableAltException', '2', '1', '2'],
+                     ['exitDecision', '1'],
+                     ['exitSubRule', '1'],
+                     ['exception', 'NoViableAltException', '2', '1', '2'],
+                     ['beginResync'],
+                     ['LT', '1', '2', '4', '0', '1', '2', '"!'],
+                     ['consumeToken', '2', '4', '0', '1', '2', '"!'],
+                     ['LT', '1', '-1', '-1', '0', '1', '3', '"<EOF>'],
+                     ['endResync'],
+                     ['location', '6', '21'],
+                     ['exitRule', 'T.g', 'a'],
+                     ['terminate']]
+
+        self.assertListEqual(debugger.events, expected)
+
+
+    def testRuleBlock(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T;
+        options {
+            language=Python3;
+        }
+        a : b | c;
+        b : ID;
+        c : INT;
+        ID : 'a'..'z'+ ;
+        INT : '0'..'9'+ ;
+        WS : (' '|'\n') {$channel=HIDDEN} ;
+        ''')
+
+        debugger = self.execParser(
+            grammar, 'a',
+            input="1",
+            listener=None)
+
+        self.assertTrue(debugger.success)
+        expected = [['enterRule', 'T.g', 'a'],
+                    ['location', '6', '1'],
+                    ['enterDecision', '1', '0'],
+                    ['LT', '1', '0', '5', '0', '1', '0', '"1'],
+                    ['exitDecision', '1'],
+                    ['enterAlt', '2'],
+                    ['location', '6', '9'],
+                    ['enterRule', 'T.g', 'c'],
+                    ['location', '8', '1'],
+                    ['enterAlt', '1'],
+                    ['location', '8', '5'],
+                    ['LT', '1', '0', '5', '0', '1', '0', '"1'],
+                    ['LT', '1', '0', '5', '0', '1', '0', '"1'],
+                    ['consumeToken', '0', '5', '0', '1', '0', '"1'],
+                    ['location', '8', '8'],
+                    ['exitRule', 'T.g', 'c'],
+                    ['location', '6', '10'],
+                    ['exitRule', 'T.g', 'a'],
+                    ['terminate']]
+
+        self.assertListEqual(debugger.events, expected)
+
+
+    def testRuleBlockSingleAlt(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T;
+        options {
+            language=Python3;
+        }
+        a : b;
+        b : ID;
+        ID : 'a'..'z'+ ;
+        INT : '0'..'9'+ ;
+        WS : (' '|'\n') {$channel=HIDDEN} ;
+        ''')
+
+        debugger = self.execParser(
+            grammar, 'a',
+            input="a",
+            listener=None)
+
+        self.assertTrue(debugger.success)
+        expected = [['enterRule', 'T.g', 'a'],
+                    ['location', '6', '1'],
+                    ['enterAlt', '1'],
+                    ['location', '6', '5'],
+                    ['enterRule', 'T.g', 'b'],
+                    ['location', '7', '1'],
+                    ['enterAlt', '1'],
+                    ['location', '7', '5'],
+                    ['LT', '1', '0', '4', '0', '1', '0', '"a'],
+                    ['LT', '1', '0', '4', '0', '1', '0', '"a'],
+                    ['consumeToken', '0', '4', '0', '1', '0', '"a'],
+                    ['location', '7', '7'],
+                    ['exitRule', 'T.g', 'b'],
+                    ['location', '6', '6'],
+                    ['exitRule', 'T.g', 'a'],
+                    ['terminate']]
+
+        self.assertListEqual(debugger.events, expected)
+
+
+    def testBlockSingleAlt(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T;
+        options {
+            language=Python3;
+        }
+        a : ( b );
+        b : ID;
+        ID : 'a'..'z'+ ;
+        INT : '0'..'9'+ ;
+        WS : (' '|'\n') {$channel=HIDDEN} ;
+        ''')
+
+        debugger = self.execParser(
+            grammar, 'a',
+            input="a",
+            listener=None)
+
+        self.assertTrue(debugger.success)
+        expected = [['enterRule', 'T.g', 'a'],
+                    ['location', '6', '1'],
+                    ['enterAlt', '1'],
+                    ['location', '6', '5'],
+                    ['enterAlt', '1'],
+                    ['location', '6', '7'],
+                    ['enterRule', 'T.g', 'b'],
+                    ['location', '7', '1'],
+                    ['enterAlt', '1'],
+                    ['location', '7', '5'],
+                    ['LT', '1', '0', '4', '0', '1', '0', '"a'],
+                    ['LT', '1', '0', '4', '0', '1', '0', '"a'],
+                    ['consumeToken', '0', '4', '0', '1', '0', '"a'],
+                    ['location', '7', '7'],
+                    ['exitRule', 'T.g', 'b'],
+                    ['location', '6', '10'],
+                    ['exitRule', 'T.g', 'a'],
+                    ['terminate']]
+
+        self.assertListEqual(debugger.events, expected)
+
+
+    def testDFA(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T;
+        options {
+            language=Python3;
+        }
+        a : ( b | c ) EOF;
+        b : ID* INT;
+        c : ID+ BANG;
+        ID : 'a'..'z'+ ;
+        INT : '0'..'9'+ ;
+        BANG : '!';
+        WS : (' '|'\n') {$channel=HIDDEN} ;
+        ''')
+
+        debugger = self.execParser(
+            grammar, 'a',
+            input="a!",
+            listener=None)
+
+        self.assertTrue(debugger.success)
+        expected = [['enterRule', 'T.g', 'a'],
+                    ['location', '6', '1'],
+                    ['enterAlt', '1'],
+                    ['location', '6', '5'],
+                    ['enterSubRule', '1'],
+                    ['enterDecision', '1', '0'],
+                    ['mark', '0'],
+                    ['LT', '1', '0', '5', '0', '1', '0', '"a'],
+                    ['consumeToken', '0', '5', '0', '1', '0', '"a'],
+                    ['LT', '1', '1', '4', '0', '1', '1', '"!'],
+                    ['consumeToken', '1', '4', '0', '1', '1', '"!'],
+                    ['rewind', '0'],
+                    ['exitDecision', '1'],
+                    ['enterAlt', '2'],
+                    ['location', '6', '11'],
+                    ['enterRule', 'T.g', 'c'],
+                    ['location', '8', '1'],
+                    ['enterAlt', '1'],
+                    ['location', '8', '5'],
+                    ['enterSubRule', '3'],
+                    ['enterDecision', '3', '0'],
+                    ['LT', '1', '0', '5', '0', '1', '0', '"a'],
+                    ['exitDecision', '3'],
+                    ['enterAlt', '1'],
+                    ['location', '8', '5'],
+                    ['LT', '1', '0', '5', '0', '1', '0', '"a'],
+                    ['LT', '1', '0', '5', '0', '1', '0', '"a'],
+                    ['consumeToken', '0', '5', '0', '1', '0', '"a'],
+                    ['enterDecision', '3', '0'],
+                    ['LT', '1', '1', '4', '0', '1', '1', '"!'],
+                    ['exitDecision', '3'],
+                    ['exitSubRule', '3'],
+                    ['location', '8', '9'],
+                    ['LT', '1', '1', '4', '0', '1', '1', '"!'],
+                    ['LT', '1', '1', '4', '0', '1', '1', '"!'],
+                    ['consumeToken', '1', '4', '0', '1', '1', '"!'],
+                    ['location', '8', '13'],
+                    ['exitRule', 'T.g', 'c'],
+                    ['exitSubRule', '1'],
+                    ['location', '6', '15'],
+                    ['LT', '1', '-1', '-1', '0', '1', '2', '"<EOF>'],
+                    ['LT', '1', '-1', '-1', '0', '1', '2', '"<EOF>'],
+                    ['consumeToken', '-1', '-1', '0', '1', '2', '"<EOF>'],
+                    ['location', '6', '18'],
+                    ['exitRule', 'T.g', 'a'],
+                    ['terminate']]
+
+        self.assertListEqual(debugger.events, expected)
+
+
+    def testBasicAST(self):
+        grammar = textwrap.dedent(
+        r'''
+        grammar T;
+        options {
+            language=Python3;
+            output=AST;
+        }
+        a : ( b | c ) EOF!;
+        b : ID* INT -> ^(INT ID*);
+        c : ID+ BANG -> ^(BANG ID+);
+        ID : 'a'..'z'+ ;
+        INT : '0'..'9'+ ;
+        BANG : '!';
+        WS : (' '|'\n') {$channel=HIDDEN} ;
+        ''')
+
+        listener = antlr3.debug.RecordDebugEventListener()
+
+        self.execParser(
+            grammar, 'a',
+            input="a!",
+            listener=listener)
+
+        # don't check output for now (too dynamic), I'm satisfied if it
+        # doesn't crash
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/runtime/Python3/tests/t060leftrecursion.py b/runtime/Python3/tests/t060leftrecursion.py
new file mode 100644
index 0000000..05b5bc0
--- /dev/null
+++ b/runtime/Python3/tests/t060leftrecursion.py
@@ -0,0 +1,468 @@
+import unittest
+import re
+import textwrap
+import antlr3
+import testbase
+
+
+# Left-recursion resolution is not yet enabled in the tool.
+
+# class TestLeftRecursion(testbase.ANTLRTest):
+#     def parserClass(self, base):
+#         class TParser(base):
+#             def __init__(self, *args, **kwargs):
+#                 super().__init__(*args, **kwargs)
+
+#                 self._output = ""
+
+
+#             def capture(self, t):
+#                 self._output += str(t)
+
+
+#             def recover(self, input, re):
+#                 # no error recovery yet, just crash!
+#                 raise
+
+#         return TParser
+
+
+#     def execParser(self, grammar, grammarEntry, input):
+#         lexerCls, parserCls = self.compileInlineGrammar(grammar)
+
+#         cStream = antlr3.StringStream(input)
+#         lexer = lexerCls(cStream)
+#         tStream = antlr3.CommonTokenStream(lexer)
+#         parser = parserCls(tStream)
+#         getattr(parser, grammarEntry)()
+#         return parser._output
+
+
+#     def runTests(self, grammar, tests, grammarEntry):
+#         lexerCls, parserCls = self.compileInlineGrammar(grammar)
+
+#         build_ast = re.search(r'output\s*=\s*AST', grammar)
+
+#         for input, expecting in tests:
+#             cStream = antlr3.StringStream(input)
+#             lexer = lexerCls(cStream)
+#             tStream = antlr3.CommonTokenStream(lexer)
+#             parser = parserCls(tStream)
+#             r = getattr(parser, grammarEntry)()
+#             found = parser._output
+#             if build_ast:
+#               found += r.tree.toStringTree()
+
+#             self.assertEqual(
+#                 expecting, found,
+#                 "{!r} != {!r} (for input {!r})".format(expecting, found, input))
+
+
+#     def testSimple(self):
+#         grammar = textwrap.dedent(
+#             r"""
+#             grammar T;
+#             options {
+#                 language=Python3;
+#             }
+#             s : a { self.capture($a.text) } ;
+#             a : a ID
+#               | ID
+#               ;
+#             ID : 'a'..'z'+ ;
+#             WS : (' '|'\n') {self.skip()} ;
+#             """)
+
+#         found = self.execParser(grammar, 's', 'a b c')
+#         expecting = "abc"
+#         self.assertEqual(expecting, found)
+
+
+#     def testSemPred(self):
+#         grammar = textwrap.dedent(
+#             r"""
+#             grammar T;
+#             options {
+#                 language=Python3;
+#             }
+#             s : a { self.capture($a.text) } ;
+#             a : a {True}? ID
+#               | ID
+#               ;
+#             ID : 'a'..'z'+ ;
+#             WS : (' '|'\n') {self.skip()} ;
+#             """)
+
+#         found = self.execParser(grammar, "s", "a b c")
+#         expecting = "abc"
+#         self.assertEqual(expecting, found)
+
+#     def testTernaryExpr(self):
+#         grammar = textwrap.dedent(
+#             r"""
+#             grammar T;
+#             options {
+#                 language=Python3;
+#                 output=AST;
+#             }
+#             e : e '*'^ e
+#               | e '+'^ e
+#               | e '?'<assoc=right>^ e ':'! e
+#               | e '='<assoc=right>^ e
+#               | ID
+#               ;
+#             ID : 'a'..'z'+ ;
+#             WS : (' '|'\n') {self.skip()} ;
+#             """)
+
+#         tests = [
+#             ("a", "a"),
+#             ("a+b", "(+ a b)"),
+#             ("a*b", "(* a b)"),
+#             ("a?b:c", "(? a b c)"),
+#             ("a=b=c", "(= a (= b c))"),
+#             ("a?b+c:d", "(? a (+ b c) d)"),
+#             ("a?b=c:d", "(? a (= b c) d)"),
+#             ("a? b?c:d : e", "(? a (? b c d) e)"),
+#             ("a?b: c?d:e", "(? a b (? c d e))"),
+#             ]
+#         self.runTests(grammar, tests, "e")
+
+
+#     def testDeclarationsUsingASTOperators(self):
+#         grammar = textwrap.dedent(
+#             r"""
+#             grammar T;
+#             options {
+#                 language=Python3;
+#                 output=AST;
+#             }
+#             declarator
+#                     : declarator '['^ e ']'!
+#                     | declarator '['^ ']'!
+#                     | declarator '('^ ')'!
+#                     | '*'^ declarator // binds less tight than suffixes
+#                     | '('! declarator ')'!
+#                     | ID
+#                     ;
+#             e : INT ;
+#             ID : 'a'..'z'+ ;
+#             INT : '0'..'9'+ ;
+#             WS : (' '|'\n') {self.skip()} ;
+#             """)
+
+#         tests = [
+#             ("a", "a"),
+#             ("*a", "(* a)"),
+#             ("**a", "(* (* a))"),
+#             ("a[3]", "([ a 3)"),
+#             ("b[]", "([ b)"),
+#             ("(a)", "a"),
+#             ("a[]()", "(( ([ a))"),
+#             ("a[][]", "([ ([ a))"),
+#             ("*a[]", "(* ([ a))"),
+#             ("(*a)[]", "([ (* a))"),
+#             ]
+#         self.runTests(grammar, tests, "declarator")
+
+
+#     def testDeclarationsUsingRewriteOperators(self):
+#         grammar = textwrap.dedent(
+#             r"""
+#             grammar T;
+#             options {
+#                 language=Python3;
+#                 output=AST;
+#             }
+#             declarator
+#                     : declarator '[' e ']' -> ^('[' declarator e)
+#                     | declarator '[' ']' -> ^('[' declarator)
+#                     | declarator '(' ')' -> ^('(' declarator)
+#                     | '*' declarator -> ^('*' declarator)  // binds less tight than suffixes
+#                     | '(' declarator ')' -> declarator
+#                     | ID -> ID
+#                     ;
+#             e : INT ;
+#             ID : 'a'..'z'+ ;
+#             INT : '0'..'9'+ ;
+#             WS : (' '|'\n') {self.skip()} ;
+#             """)
+
+#         tests = [
+#             ("a", "a"),
+#             ("*a", "(* a)"),
+#             ("**a", "(* (* a))"),
+#             ("a[3]", "([ a 3)"),
+#             ("b[]", "([ b)"),
+#             ("(a)", "a"),
+#             ("a[]()", "(( ([ a))"),
+#             ("a[][]", "([ ([ a))"),
+#             ("*a[]", "(* ([ a))"),
+#             ("(*a)[]", "([ (* a))"),
+#             ]
+#         self.runTests(grammar, tests, "declarator")
+
+
+#     def testExpressionsUsingASTOperators(self):
+#         grammar = textwrap.dedent(
+#             r"""
+#             grammar T;
+#             options {
+#                 language=Python3;
+#                 output=AST;
+#             }
+#             e : e '.'^ ID
+#               | e '.'^ 'this'
+#               | '-'^ e
+#               | e '*'^ e
+#               | e ('+'^|'-'^) e
+#               | INT
+#               | ID
+#               ;
+#             ID : 'a'..'z'+ ;
+#             INT : '0'..'9'+ ;
+#             WS : (' '|'\n') {self.skip()} ;
+#             """)
+
+#         tests = [
+#             ("a", "a"),
+#             ("1", "1"),
+#             ("a+1", "(+ a 1)"),
+#             ("a*1", "(* a 1)"),
+#             ("a.b", "(. a b)"),
+#             ("a.this", "(. a this)"),
+#             ("a-b+c", "(+ (- a b) c)"),
+#             ("a+b*c", "(+ a (* b c))"),
+#             ("a.b+1", "(+ (. a b) 1)"),
+#             ("-a", "(- a)"),
+#             ("-a+b", "(+ (- a) b)"),
+#             ("-a.b", "(- (. a b))"),
+#             ]
+#         self.runTests(grammar, tests, "e")
+
+
+#     @testbase.broken(
+#         "Grammar compilation returns errors", testbase.GrammarCompileError)
+#     def testExpressionsUsingRewriteOperators(self):
+#         grammar = textwrap.dedent(
+#             r"""
+#             grammar T;
+#             options {
+#                 language=Python3;
+#                 output=AST;
+#             }
+#             e : e '.' ID                   -> ^('.' e ID)
+#               | e '.' 'this'               -> ^('.' e 'this')
+#               | '-' e                      -> ^('-' e)
+#               | e '*' b=e                  -> ^('*' e $b)
+#               | e (op='+'|op='-') b=e      -> ^($op e $b)
+#               | INT                        -> INT
+#               | ID                         -> ID
+#               ;
+#             ID : 'a'..'z'+ ;
+#             INT : '0'..'9'+ ;
+#             WS : (' '|'\n') {self.skip()} ;
+#             """)
+
+#         tests = [
+#             ("a", "a"),
+#             ("1", "1"),
+#             ("a+1", "(+ a 1)"),
+#             ("a*1", "(* a 1)"),
+#             ("a.b", "(. a b)"),
+#             ("a.this", "(. a this)"),
+#             ("a+b*c", "(+ a (* b c))"),
+#             ("a.b+1", "(+ (. a b) 1)"),
+#             ("-a", "(- a)"),
+#             ("-a+b", "(+ (- a) b)"),
+#             ("-a.b", "(- (. a b))"),
+#             ]
+#         self.runTests(grammar, tests, "e")
+
+
+#     def testExpressionAssociativity(self):
+#         grammar = textwrap.dedent(
+#             r"""
+#             grammar T;
+#             options {
+#                 language=Python3;
+#                 output=AST;
+#             }
+#             e
+#               : e '.'^ ID
+#               | '-'^ e
+#               | e '^'<assoc=right>^ e
+#               | e '*'^ e
+#               | e ('+'^|'-'^) e
+#               | e ('='<assoc=right>^ |'+='<assoc=right>^) e
+#               | INT
+#               | ID
+#               ;
+#             ID : 'a'..'z'+ ;
+#             INT : '0'..'9'+ ;
+#             WS : (' '|'\n') {self.skip()} ;
+#             """)
+
+#         tests = [
+#             ("a", "a"),
+#             ("1", "1"),
+#             ("a+1", "(+ a 1)"),
+#             ("a*1", "(* a 1)"),
+#             ("a.b", "(. a b)"),
+#             ("a-b+c", "(+ (- a b) c)"),
+#             ("a+b*c", "(+ a (* b c))"),
+#             ("a.b+1", "(+ (. a b) 1)"),
+#             ("-a", "(- a)"),
+#             ("-a+b", "(+ (- a) b)"),
+#             ("-a.b", "(- (. a b))"),
+#             ("a^b^c", "(^ a (^ b c))"),
+#             ("a=b=c", "(= a (= b c))"),
+#             ("a=b=c+d.e", "(= a (= b (+ c (. d e))))"),
+#             ]
+#         self.runTests(grammar, tests, "e")
+
+
+#     def testJavaExpressions(self):
+#       grammar = textwrap.dedent(
+#             r"""
+#             grammar T;
+#             options {
+#                 language=Python3;
+#                 output=AST;
+#             }
+#             expressionList
+#                 :   e (','! e)*
+#                 ;
+#             e   :   '('! e ')'!
+#                 |   'this'
+#                 |   'super'
+#                 |   INT
+#                 |   ID
+#                 |   type '.'^ 'class'
+#                 |   e '.'^ ID
+#                 |   e '.'^ 'this'
+#                 |   e '.'^ 'super' '('^ expressionList? ')'!
+#                 |   e '.'^ 'new'^ ID '('! expressionList? ')'!
+#                 |       'new'^ type ( '(' expressionList? ')'! | (options {k=1;}:'[' e ']'!)+) // ugly; simplified
+#                 |   e '['^ e ']'!
+#                 |   '('^ type ')'! e
+#                 |   e ('++'^ | '--'^)
+#                 |   e '('^ expressionList? ')'!
+#                 |   ('+'^|'-'^|'++'^|'--'^) e
+#                 |   ('~'^|'!'^) e
+#                 |   e ('*'^|'/'^|'%'^) e
+#                 |   e ('+'^|'-'^) e
+#                 |   e ('<'^ '<' | '>'^ '>' '>' | '>'^ '>') e
+#                 |   e ('<='^ | '>='^ | '>'^ | '<'^) e
+#                 |   e 'instanceof'^ e
+#                 |   e ('=='^ | '!='^) e
+#                 |   e '&'^ e
+#                 |   e '^'<assoc=right>^ e
+#                 |   e '|'^ e
+#                 |   e '&&'^ e
+#                 |   e '||'^ e
+#                 |   e '?' e ':' e
+#                 |   e ('='<assoc=right>^
+#                       |'+='<assoc=right>^
+#                       |'-='<assoc=right>^
+#                       |'*='<assoc=right>^
+#                       |'/='<assoc=right>^
+#                       |'&='<assoc=right>^
+#                       |'|='<assoc=right>^
+#                       |'^='<assoc=right>^
+#                       |'>>='<assoc=right>^
+#                       |'>>>='<assoc=right>^
+#                       |'<<='<assoc=right>^
+#                       |'%='<assoc=right>^) e
+#                 ;
+#             type: ID
+#                 | ID '['^ ']'!
+#                 | 'int'
+#                 | 'int' '['^ ']'!
+#                 ;
+#             ID : ('a'..'z'|'A'..'Z'|'_'|'$')+;
+#             INT : '0'..'9'+ ;
+#             WS : (' '|'\n') {self.skip()} ;
+#             """)
+
+#       tests = [
+#           ("a", "a"),
+#           ("1", "1"),
+#           ("a+1", "(+ a 1)"),
+#           ("a*1", "(* a 1)"),
+#           ("a.b", "(. a b)"),
+#           ("a-b+c", "(+ (- a b) c)"),
+#           ("a+b*c", "(+ a (* b c))"),
+#           ("a.b+1", "(+ (. a b) 1)"),
+#           ("-a", "(- a)"),
+#           ("-a+b", "(+ (- a) b)"),
+#           ("-a.b", "(- (. a b))"),
+#           ("a^b^c", "(^ a (^ b c))"),
+#           ("a=b=c", "(= a (= b c))"),
+#           ("a=b=c+d.e", "(= a (= b (+ c (. d e))))"),
+#           ("a|b&c", "(| a (& b c))"),
+#           ("(a|b)&c", "(& (| a b) c)"),
+#           ("a > b", "(> a b)"),
+#           ("a >> b", "(> a b)"),  # text is from one token
+#           ("a < b", "(< a b)"),
+#           ("(T)x", "(( T x)"),
+#           ("new A().b", "(. (new A () b)"),
+#           ("(T)t.f()", "(( (( T (. t f)))"),
+#           ("a.f(x)==T.c", "(== (( (. a f) x) (. T c))"),
+#           ("a.f().g(x,1)", "(( (. (( (. a f)) g) x 1)"),
+#           ("new T[((n-1) * x) + 1]", "(new T [ (+ (* (- n 1) x) 1))"),
+#           ]
+#       self.runTests(grammar, tests, "e")
+
+
+#     def testReturnValueAndActions(self):
+#         grammar = textwrap.dedent(
+#             r"""
+#             grammar T;
+#             options {
+#                 language=Python3;
+#             }
+#             s : e { self.capture($e.v) } ;
+#             e returns [v, ignored]
+#               : e '*' b=e {$v *= $b.v;}
+#               | e '+' b=e {$v += $b.v;}
+#               | INT {$v = int($INT.text);}
+#               ;
+#             INT : '0'..'9'+ ;
+#             WS : (' '|'\n') {self.skip()} ;
+#             """)
+
+#         tests = [
+#             ("4", "4"),
+#             ("1+2", "3")
+#             ]
+#         self.runTests(grammar, tests, "s")
+
+
+#     def testReturnValueAndActionsAndASTs(self):
+#         grammar = textwrap.dedent(
+#             r"""
+#             grammar T;
+#             options {
+#                 language=Python3;
+#                 output=AST;
+#             }
+#             s : e { self.capture("v={}, ".format($e.v)) } ;
+#             e returns [v, ignored]
+#               : e '*'^ b=e {$v *= $b.v;}
+#               | e '+'^ b=e {$v += $b.v;}
+#               | INT {$v = int($INT.text);}
+#               ;
+#             INT : '0'..'9'+ ;
+#             WS : (' '|'\n') {self.skip()} ;
+#             """)
+
+#         tests = [
+#             ("4", "v=4, 4"),
+#             ("1+2", "v=3, (+ 1 2)"),
+#             ]
+#         self.runTests(grammar, tests, "s")
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/runtime/Python3/tests/testbase.py b/runtime/Python3/tests/testbase.py
new file mode 100644
index 0000000..b2a9223
--- /dev/null
+++ b/runtime/Python3/tests/testbase.py
@@ -0,0 +1,425 @@
+from distutils.errors import *
+import errno
+import glob
+import hashlib
+import imp
+import inspect
+import os
+import re
+import shutil
+import sys
+import tempfile
+import unittest
+
+import antlr3
+
+def unlink(path):
+    try:
+        os.unlink(path)
+    except OSError as exc:
+        if exc.errno != errno.ENOENT:
+            raise
+
+
+class GrammarCompileError(Exception):
+  """Grammar failed to compile."""
+  pass
+
+
+# At least on MacOSX tempdir (/tmp) is a symlink. It's sometimes dereferences,
+# sometimes not, breaking the inspect.getmodule() function.
+testbasedir = os.path.join(
+    os.path.realpath(tempfile.gettempdir()),
+    'antlr3-test')
+
+
+class BrokenTest(unittest.TestCase.failureException):
+    def __repr__(self):
+        name, reason = self.args
+        return '{}: {}: {} works now'.format(
+            (self.__class__.__name__, name, reason))
+
+
+def broken(reason, *exceptions):
+    '''Indicates a failing (or erroneous) test case fails that should succeed.
+    If the test fails with an exception, list the exception type in args'''
+    def wrapper(test_method):
+        def replacement(*args, **kwargs):
+            try:
+                test_method(*args, **kwargs)
+            except exceptions or unittest.TestCase.failureException:
+                pass
+            else:
+                raise BrokenTest(test_method.__name__, reason)
+        replacement.__doc__ = test_method.__doc__
+        replacement.__name__ = 'XXX_' + test_method.__name__
+        replacement.todo = reason
+        return replacement
+    return wrapper
+
+
+dependencyCache = {}
+compileErrorCache = {}
+
+# setup java CLASSPATH
+if 'CLASSPATH' not in os.environ:
+    cp = []
+
+    baseDir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', '..'))
+    libDir = os.path.join(baseDir, 'lib')
+
+    jar = os.path.join(libDir, 'ST-4.0.5.jar')
+    if not os.path.isfile(jar):
+        raise DistutilsFileError(
+            "Missing file '{}'. Grab it from a distribution package.".format(jar)
+            )
+    cp.append(jar)
+
+    jar = os.path.join(libDir, 'antlr-3.4.1-SNAPSHOT.jar')
+    if not os.path.isfile(jar):
+        raise DistutilsFileError(
+            "Missing file '{}'. Grab it from a distribution package.".format(jar)
+            )
+    cp.append(jar)
+
+    jar = os.path.join(libDir, 'antlr-runtime-3.4.jar')
+    if not os.path.isfile(jar):
+        raise DistutilsFileError(
+            "Missing file '{}'. Grab it from a distribution package.".format(jar)
+            )
+    cp.append(jar)
+
+    cp.append(os.path.join(baseDir, 'runtime', 'Python', 'build'))
+
+    classpath = '-cp "' + ':'.join([os.path.abspath(p) for p in cp]) + '"'
+
+else:
+    classpath = ''
+
+
+class ANTLRTest(unittest.TestCase):
+    def __init__(self, *args, **kwargs):
+        super().__init__(*args, **kwargs)
+
+        self.moduleName = os.path.splitext(os.path.basename(sys.modules[self.__module__].__file__))[0]
+        self.className = self.__class__.__name__
+        self._baseDir = None
+
+        self.lexerModule = None
+        self.parserModule = None
+
+        self.grammarName = None
+        self.grammarType = None
+
+
+    @property
+    def baseDir(self):
+        if self._baseDir is None:
+            testName = 'unknownTest'
+            for frame in inspect.stack():
+                code = frame[0].f_code
+                codeMod = inspect.getmodule(code)
+                if codeMod is None:
+                    continue
+
+                # skip frames not in requested module
+                if codeMod is not sys.modules[self.__module__]:
+                    continue
+
+                # skip some unwanted names
+                if code.co_name in ('nextToken', '<module>'):
+                    continue
+
+                if code.co_name.startswith('test'):
+                    testName = code.co_name
+                    break
+
+            self._baseDir = os.path.join(
+                testbasedir,
+                self.moduleName, self.className, testName)
+            if not os.path.isdir(self._baseDir):
+                os.makedirs(self._baseDir)
+
+        return self._baseDir
+
+
+    def _invokeantlr(self, dir, file, options, javaOptions=''):
+        cmd = 'cd {}; java {} {} org.antlr.Tool -o . {} {} 2>&1'.format(
+            dir, javaOptions, classpath, options, file
+            )
+        fp = os.popen(cmd)
+        output = ''
+        failed = False
+        for line in fp:
+            output += line
+
+            if line.startswith('error('):
+                failed = True
+
+        rc = fp.close()
+        if rc:
+            failed = True
+
+        if failed:
+            raise GrammarCompileError(
+                "Failed to compile grammar '{}':\n{}\n\n{}".format(file, cmd, output)
+                )
+
+
+    def compileGrammar(self, grammarName=None, options='', javaOptions=''):
+        if grammarName is None:
+            grammarName = self.moduleName + '.g'
+
+        self._baseDir = os.path.join(
+            testbasedir,
+            self.moduleName)
+        if not os.path.isdir(self._baseDir):
+            os.makedirs(self._baseDir)
+
+        if self.grammarName is None:
+            self.grammarName = os.path.splitext(grammarName)[0]
+
+        grammarPath = os.path.join(os.path.dirname(os.path.abspath(__file__)), grammarName)
+
+        # get type and name from first grammar line
+        with open(grammarPath, 'r') as fp:
+            grammar = fp.read()
+        m = re.match(r'\s*((lexer|parser|tree)\s+|)grammar\s+(\S+);', grammar, re.MULTILINE)
+        self.assertIsNotNone(m, grammar)
+        self.grammarType = m.group(2) or 'combined'
+
+        self.assertIn(self.grammarType, ('lexer', 'parser', 'tree', 'combined'))
+
+        # don't try to rebuild grammar, if it already failed
+        if grammarName in compileErrorCache:
+            return
+
+        try:
+        #     # get dependencies from antlr
+        #     if grammarName in dependencyCache:
+        #         dependencies = dependencyCache[grammarName]
+
+        #     else:
+        #         dependencies = []
+        #         cmd = ('cd %s; java %s %s org.antlr.Tool -o . -depend %s 2>&1'
+        #                % (self.baseDir, javaOptions, classpath, grammarPath))
+
+        #         output = ""
+        #         failed = False
+
+        #         fp = os.popen(cmd)
+        #         for line in fp:
+        #             output += line
+
+        #             if line.startswith('error('):
+        #                 failed = True
+        #             elif ':' in line:
+        #                 a, b = line.strip().split(':', 1)
+        #                 dependencies.append(
+        #                     (os.path.join(self.baseDir, a.strip()),
+        #                      [os.path.join(self.baseDir, b.strip())])
+        #                     )
+
+        #         rc = fp.close()
+        #         if rc is not None:
+        #             failed = True
+
+        #         if failed:
+        #             raise GrammarCompileError(
+        #                 "antlr -depend failed with code {} on grammar '{}':\n\n{}\n{}".format(
+        #                     rc, grammarName, cmd, output)
+        #                 )
+
+        #         # add dependencies to my .stg files
+        #         templateDir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', '..', 'tool', 'src', 'main', 'resources', 'org', 'antlr', 'codegen', 'templates', 'Python'))
+        #         templates = glob.glob(os.path.join(templateDir, '*.stg'))
+
+        #         for dst, src in dependencies:
+        #             src.extend(templates)
+
+        #         dependencyCache[grammarName] = dependencies
+
+        #     rebuild = False
+        #     for dest, sources in dependencies:
+        #         if not os.path.isfile(dest):
+        #             rebuild = True
+        #             break
+
+        #         for source in sources:
+        #             if os.path.getmtime(source) > os.path.getmtime(dest):
+        #                 rebuild = True
+        #                 break
+
+
+        #     if rebuild:
+        #         self._invokeantlr(self.baseDir, grammarPath, options, javaOptions)
+
+            self._invokeantlr(self.baseDir, grammarPath, options, javaOptions)
+
+        except:
+            # mark grammar as broken
+            compileErrorCache[grammarName] = True
+            raise
+
+
+    def lexerClass(self, base):
+        """Optionally build a subclass of generated lexer class"""
+
+        return base
+
+
+    def parserClass(self, base):
+        """Optionally build a subclass of generated parser class"""
+
+        return base
+
+
+    def walkerClass(self, base):
+        """Optionally build a subclass of generated walker class"""
+
+        return base
+
+
+    def __load_module(self, name):
+        modFile, modPathname, modDescription = imp.find_module(name, [self.baseDir])
+
+        with modFile:
+            return imp.load_module(name, modFile, modPathname, modDescription)
+
+
+    def getLexer(self, *args, **kwargs):
+        """Build lexer instance. Arguments are passed to lexer.__init__()."""
+
+        if self.grammarType == 'lexer':
+            self.lexerModule = self.__load_module(self.grammarName)
+            cls = getattr(self.lexerModule, self.grammarName)
+        else:
+            self.lexerModule = self.__load_module(self.grammarName + 'Lexer')
+            cls = getattr(self.lexerModule, self.grammarName + 'Lexer')
+
+        cls = self.lexerClass(cls)
+
+        lexer = cls(*args, **kwargs)
+
+        return lexer
+
+
+    def getParser(self, *args, **kwargs):
+        """Build parser instance. Arguments are passed to parser.__init__()."""
+
+        if self.grammarType == 'parser':
+            self.lexerModule = self.__load_module(self.grammarName)
+            cls = getattr(self.lexerModule, self.grammarName)
+        else:
+            self.parserModule = self.__load_module(self.grammarName + 'Parser')
+            cls = getattr(self.parserModule, self.grammarName + 'Parser')
+        cls = self.parserClass(cls)
+
+        parser = cls(*args, **kwargs)
+
+        return parser
+
+
+    def getWalker(self, *args, **kwargs):
+        """Build walker instance. Arguments are passed to walker.__init__()."""
+
+        self.walkerModule = self.__load_module(self.grammarName + 'Walker')
+        cls = getattr(self.walkerModule, self.grammarName + 'Walker')
+        cls = self.walkerClass(cls)
+
+        walker = cls(*args, **kwargs)
+
+        return walker
+
+
+    def writeInlineGrammar(self, grammar):
+        # Create a unique ID for this test and use it as the grammar name,
+        # to avoid class name reuse. This kinda sucks. Need to find a way so
+        # tests can use the same grammar name without messing up the namespace.
+        # Well, first I should figure out what the exact problem is...
+        id = hashlib.md5(self.baseDir.encode('utf-8')).hexdigest()[-8:]
+        grammar = grammar.replace('$TP', 'TP' + id)
+        grammar = grammar.replace('$T', 'T' + id)
+
+        # get type and name from first grammar line
+        m = re.match(r'\s*((lexer|parser|tree)\s+|)grammar\s+(\S+);', grammar, re.MULTILINE)
+        self.assertIsNotNone(m, grammar)
+        grammarType = m.group(2) or 'combined'
+        grammarName = m.group(3)
+
+        self.assertIn(grammarType, ('lexer', 'parser', 'tree', 'combined'))
+
+        grammarPath = os.path.join(self.baseDir, grammarName + '.g')
+
+        # dump temp grammar file
+        with open(grammarPath, 'w') as fp:
+            fp.write(grammar)
+
+        return grammarName, grammarPath, grammarType
+
+
+    def writeFile(self, name, contents):
+        testDir = os.path.dirname(os.path.abspath(__file__))
+        path = os.path.join(self.baseDir, name)
+
+        with open(path, 'w') as fp:
+            fp.write(contents)
+
+        return path
+
+
+    def compileInlineGrammar(self, grammar, options='', javaOptions='',
+                             returnModule=False):
+        # write grammar file
+        grammarName, grammarPath, grammarType = self.writeInlineGrammar(grammar)
+
+        # compile it
+        self._invokeantlr(
+            os.path.dirname(grammarPath),
+            os.path.basename(grammarPath),
+            options,
+            javaOptions
+            )
+
+        if grammarType == 'combined':
+            lexerMod = self.__load_module(grammarName + 'Lexer')
+            parserMod = self.__load_module(grammarName + 'Parser')
+            if returnModule:
+                return lexerMod, parserMod
+
+            lexerCls = getattr(lexerMod, grammarName + 'Lexer')
+            lexerCls = self.lexerClass(lexerCls)
+            parserCls = getattr(parserMod, grammarName + 'Parser')
+            parserCls = self.parserClass(parserCls)
+
+            return lexerCls, parserCls
+
+        if grammarType == 'lexer':
+            lexerMod = self.__load_module(grammarName)
+            if returnModule:
+                return lexerMod
+
+            lexerCls = getattr(lexerMod, grammarName)
+            lexerCls = self.lexerClass(lexerCls)
+
+            return lexerCls
+
+        if grammarType == 'parser':
+            parserMod = self.__load_module(grammarName)
+            if returnModule:
+                return parserMod
+
+            parserCls = getattr(parserMod, grammarName)
+            parserCls = self.parserClass(parserCls)
+
+            return parserCls
+
+        if grammarType == 'tree':
+            walkerMod = self.__load_module(grammarName)
+            if returnModule:
+                return walkerMod
+
+            walkerCls = getattr(walkerMod, grammarName)
+            walkerCls = self.walkerClass(walkerCls)
+
+            return walkerCls
diff --git a/runtime/Python3/unittests/testantlr3.py b/runtime/Python3/unittests/testantlr3.py
new file mode 100644
index 0000000..d4c6764
--- /dev/null
+++ b/runtime/Python3/unittests/testantlr3.py
@@ -0,0 +1,7 @@
+
+import unittest
+
+import antlr3
+
+if __name__ == "__main__":
+    unittest.main(testRunner=unittest.TextTestRunner(verbosity=2))
diff --git a/runtime/Python3/unittests/testbase.py b/runtime/Python3/unittests/testbase.py
new file mode 100644
index 0000000..c39243e
--- /dev/null
+++ b/runtime/Python3/unittests/testbase.py
@@ -0,0 +1,27 @@
+import unittest
+
+class BrokenTest(unittest.TestCase.failureException):
+    def __repr__(self):
+        name, reason = self.args
+        return '{}: {}: {} works now'.format(
+            self.__class__.__name__, name, reason)
+
+
+def broken(reason, *exceptions):
+    '''Indicates a failing (or erroneous) test case fails that should succeed.
+    If the test fails with an exception, list the exception type in args'''
+    def wrapper(test_method):
+        def replacement(*args, **kwargs):
+            try:
+                test_method(*args, **kwargs)
+            except exceptions or unittest.TestCase.failureException:
+                pass
+            else:
+                raise BrokenTest(test_method.__name__, reason)
+        replacement.__doc__ = test_method.__doc__
+        replacement.__name__ = 'XXX_' + test_method.__name__
+        replacement.todo = reason
+        return replacement
+    return wrapper
+
+
diff --git a/runtime/Python3/unittests/testdfa.py b/runtime/Python3/unittests/testdfa.py
new file mode 100644
index 0000000..7ae362d
--- /dev/null
+++ b/runtime/Python3/unittests/testdfa.py
@@ -0,0 +1,63 @@
+
+import unittest
+
+import antlr3
+
+
+class TestDFA(unittest.TestCase):
+    """Test case for the DFA class."""
+
+    def setUp(self):
+        """Setup test fixure.
+
+        We need a Recognizer in order to instanciate a DFA.
+
+        """
+
+        class TRecognizer(antlr3.BaseRecognizer):
+            api_version = 'HEAD'
+
+        self.recog = TRecognizer()
+
+
+    def testInit(self):
+        """DFA.__init__()
+
+        Just a smoke test.
+
+        """
+
+        dfa = antlr3.DFA(
+            self.recog, 1,
+            eot=[],
+            eof=[],
+            min=[],
+            max=[],
+            accept=[],
+            special=[],
+            transition=[]
+            )
+
+
+    def testUnpack(self):
+        """DFA.unpack()"""
+
+        self.assertEqual(
+            antlr3.DFA.unpack(
+            "\1\3\1\4\2\uffff\1\5\22\uffff\1\2\31\uffff\1\6\6\uffff"
+            "\32\6\4\uffff\1\6\1\uffff\32\6"
+            ),
+            [ 3, 4, -1, -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+              -1, -1, -1, -1, -1, -1, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+              -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+              6, -1, -1, -1, -1, -1, -1, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+              6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, -1, -1, -1, -1, 6, -1,
+              6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+              6, 6, 6, 6, 6
+              ]
+            )
+
+
+
+if __name__ == "__main__":
+    unittest.main(testRunner=unittest.TextTestRunner(verbosity=2))
diff --git a/runtime/Python3/unittests/testexceptions.py b/runtime/Python3/unittests/testexceptions.py
new file mode 100644
index 0000000..2cdef63
--- /dev/null
+++ b/runtime/Python3/unittests/testexceptions.py
@@ -0,0 +1,96 @@
+import unittest
+import antlr3
+import testbase
+
+
+class TestRecognitionException(unittest.TestCase):
+    """Tests for the antlr3.RecognitionException class"""
+
+    def testInitNone(self):
+        """RecognitionException.__init__()"""
+
+        exc = antlr3.RecognitionException()
+        
+
+class TestEarlyExitException(unittest.TestCase):
+    """Tests for the antlr3.EarlyExitException class"""
+
+    @testbase.broken("FIXME", Exception)
+    def testInitNone(self):
+        """EarlyExitException.__init__()"""
+
+        exc = antlr3.EarlyExitException()
+        
+
+class TestFailedPredicateException(unittest.TestCase):
+    """Tests for the antlr3.FailedPredicateException class"""
+    
+    @testbase.broken("FIXME", Exception)
+    def testInitNone(self):
+        """FailedPredicateException.__init__()"""
+
+        exc = antlr3.FailedPredicateException()
+        
+
+class TestMismatchedNotSetException(unittest.TestCase):
+    """Tests for the antlr3.MismatchedNotSetException class"""
+    
+    @testbase.broken("FIXME", Exception)
+    def testInitNone(self):
+        """MismatchedNotSetException.__init__()"""
+
+        exc = antlr3.MismatchedNotSetException()
+        
+
+class TestMismatchedRangeException(unittest.TestCase):
+    """Tests for the antlr3.MismatchedRangeException class"""
+    
+    @testbase.broken("FIXME", Exception)
+    def testInitNone(self):
+        """MismatchedRangeException.__init__()"""
+
+        exc = antlr3.MismatchedRangeException()
+        
+
+class TestMismatchedSetException(unittest.TestCase):
+    """Tests for the antlr3.MismatchedSetException class"""
+    
+    @testbase.broken("FIXME", Exception)
+    def testInitNone(self):
+        """MismatchedSetException.__init__()"""
+
+        exc = antlr3.MismatchedSetException()
+        
+
+class TestMismatchedTokenException(unittest.TestCase):
+    """Tests for the antlr3.MismatchedTokenException class"""
+    
+    @testbase.broken("FIXME", Exception)
+    def testInitNone(self):
+        """MismatchedTokenException.__init__()"""
+
+        exc = antlr3.MismatchedTokenException()
+        
+
+class TestMismatchedTreeNodeException(unittest.TestCase):
+    """Tests for the antlr3.MismatchedTreeNodeException class"""
+    
+    @testbase.broken("FIXME", Exception)
+    def testInitNone(self):
+        """MismatchedTreeNodeException.__init__()"""
+
+        exc = antlr3.MismatchedTreeNodeException()
+        
+
+class TestNoViableAltException(unittest.TestCase):
+    """Tests for the antlr3.NoViableAltException class"""
+    
+    @testbase.broken("FIXME", Exception)
+    def testInitNone(self):
+        """NoViableAltException.__init__()"""
+
+        exc = antlr3.NoViableAltException()
+        
+
+if __name__ == "__main__":
+    unittest.main(testRunner=unittest.TextTestRunner(verbosity=2))
diff --git a/runtime/Python3/unittests/testrecognizers.py b/runtime/Python3/unittests/testrecognizers.py
new file mode 100644
index 0000000..c30c06c
--- /dev/null
+++ b/runtime/Python3/unittests/testrecognizers.py
@@ -0,0 +1,67 @@
+import sys
+import unittest
+
+import antlr3
+
+
+class TestBaseRecognizer(unittest.TestCase):
+    """Tests for BaseRecognizer class"""
+
+    def testGetRuleInvocationStack(self):
+        """BaseRecognizer._getRuleInvocationStack()"""
+
+        rules = antlr3.BaseRecognizer._getRuleInvocationStack(__name__)
+        self.assertEqual(
+            rules,
+            ['testGetRuleInvocationStack']
+            )
+
+
+class TestTokenSource(unittest.TestCase):
+    """Testcase to the antlr3.TokenSource class"""
+
+
+    def testIteratorInterface(self):
+        """TokenSource.next()"""
+
+        class TrivialToken(object):
+            def __init__(self, type):
+                self.type = type
+
+        class TestSource(antlr3.TokenSource):
+            def __init__(self):
+                self.tokens = [
+                    TrivialToken(1),
+                    TrivialToken(2),
+                    TrivialToken(3),
+                    TrivialToken(4),
+                    TrivialToken(antlr3.EOF),
+                    ]
+
+            def nextToken(self):
+                return self.tokens.pop(0)
+
+
+        src = TestSource()
+        tokens = []
+        for token in src:
+            tokens.append(token.type)
+
+        self.assertEqual(tokens, [1, 2, 3, 4])
+
+
+
+class TestLexer(unittest.TestCase):
+
+    def testInit(self):
+        """Lexer.__init__()"""
+
+        class TLexer(antlr3.Lexer):
+            api_version = 'HEAD'
+
+        stream = antlr3.StringStream('foo')
+        TLexer(stream)
+
+
+if __name__ == "__main__":
+    unittest.main(testRunner=unittest.TextTestRunner(verbosity=2))
diff --git a/runtime/Python3/unittests/teststreams.input1 b/runtime/Python3/unittests/teststreams.input1
new file mode 100644
index 0000000..a907ec3
--- /dev/null
+++ b/runtime/Python3/unittests/teststreams.input1
@@ -0,0 +1,2 @@
+foo
+bar
\ No newline at end of file
diff --git a/runtime/Python3/unittests/teststreams.input2 b/runtime/Python3/unittests/teststreams.input2
new file mode 100644
index 0000000..49dccf4
--- /dev/null
+++ b/runtime/Python3/unittests/teststreams.input2
@@ -0,0 +1,2 @@
+foo
+bär
\ No newline at end of file
diff --git a/runtime/Python3/unittests/teststreams.py b/runtime/Python3/unittests/teststreams.py
new file mode 100644
index 0000000..957fffa
--- /dev/null
+++ b/runtime/Python3/unittests/teststreams.py
@@ -0,0 +1,659 @@
+
+from io import StringIO
+import os
+import unittest
+import antlr3
+
+
+class TestStringStream(unittest.TestCase):
+    """Test case for the StringStream class."""
+
+    def testSize(self):
+        """StringStream.size()"""
+
+        stream = antlr3.StringStream('foo')
+
+        self.assertEqual(stream.size(), 3)
+
+
+    def testIndex(self):
+        """StringStream.index()"""
+
+        stream = antlr3.StringStream('foo')
+
+        self.assertEqual(stream.index(), 0)
+
+
+    def testConsume(self):
+        """StringStream.consume()"""
+
+        stream = antlr3.StringStream('foo\nbar')
+
+        stream.consume() # f
+        self.assertEqual(stream.index(), 1)
+        self.assertEqual(stream.charPositionInLine, 1)
+        self.assertEqual(stream.line, 1)
+
+        stream.consume() # o
+        self.assertEqual(stream.index(), 2)
+        self.assertEqual(stream.charPositionInLine, 2)
+        self.assertEqual(stream.line, 1)
+
+        stream.consume() # o
+        self.assertEqual(stream.index(), 3)
+        self.assertEqual(stream.charPositionInLine, 3)
+        self.assertEqual(stream.line, 1)
+
+        stream.consume() # \n
+        self.assertEqual(stream.index(), 4)
+        self.assertEqual(stream.charPositionInLine, 0)
+        self.assertEqual(stream.line, 2)
+
+        stream.consume() # b
+        self.assertEqual(stream.index(), 5)
+        self.assertEqual(stream.charPositionInLine, 1)
+        self.assertEqual(stream.line, 2)
+
+        stream.consume() # a
+        self.assertEqual(stream.index(), 6)
+        self.assertEqual(stream.charPositionInLine, 2)
+        self.assertEqual(stream.line, 2)
+
+        stream.consume() # r
+        self.assertEqual(stream.index(), 7)
+        self.assertEqual(stream.charPositionInLine, 3)
+        self.assertEqual(stream.line, 2)
+
+        stream.consume() # EOF
+        self.assertEqual(stream.index(), 7)
+        self.assertEqual(stream.charPositionInLine, 3)
+        self.assertEqual(stream.line, 2)
+
+        stream.consume() # EOF
+        self.assertEqual(stream.index(), 7)
+        self.assertEqual(stream.charPositionInLine, 3)
+        self.assertEqual(stream.line, 2)
+
+
+    def testReset(self):
+        """StringStream.reset()"""
+
+        stream = antlr3.StringStream('foo')
+
+        stream.consume()
+        stream.consume()
+
+        stream.reset()
+        self.assertEqual(stream.index(), 0)
+        self.assertEqual(stream.line, 1)
+        self.assertEqual(stream.charPositionInLine, 0)
+        self.assertEqual(stream.LT(1), 'f')
+
+
+    def testLA(self):
+        """StringStream.LA()"""
+
+        stream = antlr3.StringStream('foo')
+
+        self.assertEqual(stream.LT(1), 'f')
+        self.assertEqual(stream.LT(2), 'o')
+        self.assertEqual(stream.LT(3), 'o')
+
+        stream.consume()
+        stream.consume()
+
+        self.assertEqual(stream.LT(1), 'o')
+        self.assertEqual(stream.LT(2), antlr3.EOF)
+        self.assertEqual(stream.LT(3), antlr3.EOF)
+
+
+    def testSubstring(self):
+        """StringStream.substring()"""
+
+        stream = antlr3.StringStream('foobar')
+
+        self.assertEqual(stream.substring(0, 0), 'f')
+        self.assertEqual(stream.substring(0, 1), 'fo')
+        self.assertEqual(stream.substring(0, 5), 'foobar')
+        self.assertEqual(stream.substring(3, 5), 'bar')
+
+
+    def testSeekForward(self):
+        """StringStream.seek(): forward"""
+
+        stream = antlr3.StringStream('foo\nbar')
+
+        stream.seek(4)
+
+        self.assertEqual(stream.index(), 4)
+        self.assertEqual(stream.line, 2)
+        self.assertEqual(stream.charPositionInLine, 0)
+        self.assertEqual(stream.LT(1), 'b')
+
+
+##     # not yet implemented
+##     def testSeekBackward(self):
+##         """StringStream.seek(): backward"""
+
+##         stream = antlr3.StringStream('foo\nbar')
+
+##         stream.seek(4)
+##         stream.seek(1)
+
+##         self.assertEqual(stream.index(), 1)
+##         self.assertEqual(stream.line, 1)
+##         self.assertEqual(stream.charPositionInLine, 1)
+##         self.assertEqual(stream.LA(1), 'o')
+
+
+    def testMark(self):
+        """StringStream.mark()"""
+
+        stream = antlr3.StringStream('foo\nbar')
+
+        stream.seek(4)
+
+        marker = stream.mark()
+        self.assertEqual(marker, 1)
+        self.assertEqual(stream.markDepth, 1)
+
+        stream.consume()
+        marker = stream.mark()
+        self.assertEqual(marker, 2)
+        self.assertEqual(stream.markDepth, 2)
+
+
+    def testReleaseLast(self):
+        """StringStream.release(): last marker"""
+
+        stream = antlr3.StringStream('foo\nbar')
+
+        stream.seek(4)
+        marker1 = stream.mark()
+
+        stream.consume()
+        marker2 = stream.mark()
+
+        stream.release()
+        self.assertEqual(stream.markDepth, 1)
+
+        # release same marker again, nothing has changed
+        stream.release()
+        self.assertEqual(stream.markDepth, 1)
+
+
+    def testReleaseNested(self):
+        """StringStream.release(): nested"""
+
+        stream = antlr3.StringStream('foo\nbar')
+
+        stream.seek(4)
+        marker1 = stream.mark()
+
+        stream.consume()
+        marker2 = stream.mark()
+
+        stream.consume()
+        marker3 = stream.mark()
+
+        stream.release(marker2)
+        self.assertEqual(stream.markDepth, 1)
+
+
+    def testRewindLast(self):
+        """StringStream.rewind(): last marker"""
+
+        stream = antlr3.StringStream('foo\nbar')
+
+        stream.seek(4)
+
+        marker = stream.mark()
+        stream.consume()
+        stream.consume()
+
+        stream.rewind()
+        self.assertEqual(stream.markDepth, 0)
+        self.assertEqual(stream.index(), 4)
+        self.assertEqual(stream.line, 2)
+        self.assertEqual(stream.charPositionInLine, 0)
+        self.assertEqual(stream.LT(1), 'b')
+
+
+    def testRewindNested(self):
+        """StringStream.rewind(): nested"""
+
+        stream = antlr3.StringStream('foo\nbar')
+
+        stream.seek(4)
+        marker1 = stream.mark()
+
+        stream.consume()
+        marker2 = stream.mark()
+
+        stream.consume()
+        marker3 = stream.mark()
+
+        stream.rewind(marker2)
+        self.assertEqual(stream.markDepth, 1)
+        self.assertEqual(stream.index(), 5)
+        self.assertEqual(stream.line, 2)
+        self.assertEqual(stream.charPositionInLine, 1)
+        self.assertEqual(stream.LT(1), 'a')
+
+
+class TestFileStream(unittest.TestCase):
+    """Test case for the FileStream class."""
+
+
+    def testNoEncoding(self):
+        path = os.path.join(os.path.dirname(__file__), 'teststreams.input1')
+
+        stream = antlr3.FileStream(path)
+
+        stream.seek(4)
+        marker1 = stream.mark()
+
+        stream.consume()
+        marker2 = stream.mark()
+
+        stream.consume()
+        marker3 = stream.mark()
+
+        stream.rewind(marker2)
+        self.assertEqual(stream.markDepth, 1)
+        self.assertEqual(stream.index(), 5)
+        self.assertEqual(stream.line, 2)
+        self.assertEqual(stream.charPositionInLine, 1)
+        self.assertEqual(stream.LT(1), 'a')
+        self.assertEqual(stream.LA(1), ord('a'))
+
+
+    def testEncoded(self):
+        path = os.path.join(os.path.dirname(__file__), 'teststreams.input2')
+
+        stream = antlr3.FileStream(path)
+
+        stream.seek(4)
+        marker1 = stream.mark()
+
+        stream.consume()
+        marker2 = stream.mark()
+
+        stream.consume()
+        marker3 = stream.mark()
+
+        stream.rewind(marker2)
+        self.assertEqual(stream.markDepth, 1)
+        self.assertEqual(stream.index(), 5)
+        self.assertEqual(stream.line, 2)
+        self.assertEqual(stream.charPositionInLine, 1)
+        self.assertEqual(stream.LT(1), 'ä')
+        self.assertEqual(stream.LA(1), ord('ä'))
+
+
+
+class TestInputStream(unittest.TestCase):
+    """Test case for the InputStream class."""
+
+    def testNoEncoding(self):
+        file = StringIO('foo\nbar')
+
+        stream = antlr3.InputStream(file)
+
+        stream.seek(4)
+        marker1 = stream.mark()
+
+        stream.consume()
+        marker2 = stream.mark()
+
+        stream.consume()
+        marker3 = stream.mark()
+
+        stream.rewind(marker2)
+        self.assertEqual(stream.markDepth, 1)
+        self.assertEqual(stream.index(), 5)
+        self.assertEqual(stream.line, 2)
+        self.assertEqual(stream.charPositionInLine, 1)
+        self.assertEqual(stream.LT(1), 'a')
+        self.assertEqual(stream.LA(1), ord('a'))
+
+
+    def testEncoded(self):
+        file = StringIO('foo\nbär')
+
+        stream = antlr3.InputStream(file)
+
+        stream.seek(4)
+        marker1 = stream.mark()
+
+        stream.consume()
+        marker2 = stream.mark()
+
+        stream.consume()
+        marker3 = stream.mark()
+
+        stream.rewind(marker2)
+        self.assertEqual(stream.markDepth, 1)
+        self.assertEqual(stream.index(), 5)
+        self.assertEqual(stream.line, 2)
+        self.assertEqual(stream.charPositionInLine, 1)
+        self.assertEqual(stream.LT(1), 'ä')
+        self.assertEqual(stream.LA(1), ord('ä'))
+
+
+class TestCommonTokenStream(unittest.TestCase):
+    """Test case for the StringStream class."""
+
+    def setUp(self):
+        """Setup test fixure
+
+        The constructor of CommonTokenStream needs a token source. This
+        is a simple mock class providing just the nextToken() method.
+
+        """
+
+        class MockSource(object):
+            def __init__(self):
+                self.tokens = []
+
+            def makeEOFToken(self):
+                return antlr3.CommonToken(type=antlr3.EOF)
+
+            def nextToken(self):
+                if self.tokens:
+                    return self.tokens.pop(0)
+                return None
+
+        self.source = MockSource()
+
+
+    def testInit(self):
+        """CommonTokenStream.__init__()"""
+
+        stream = antlr3.CommonTokenStream(self.source)
+        self.assertEqual(stream.index(), -1)
+
+
+    def testSetTokenSource(self):
+        """CommonTokenStream.setTokenSource()"""
+
+        stream = antlr3.CommonTokenStream(None)
+        stream.setTokenSource(self.source)
+        self.assertEqual(stream.index(), -1)
+        self.assertEqual(stream.channel, antlr3.DEFAULT_CHANNEL)
+
+
+    def testLTEmptySource(self):
+        """CommonTokenStream.LT(): EOF (empty source)"""
+
+        stream = antlr3.CommonTokenStream(self.source)
+
+        lt1 = stream.LT(1)
+        self.assertEqual(lt1.type, antlr3.EOF)
+
+
+    def testLT1(self):
+        """CommonTokenStream.LT(1)"""
+
+        self.source.tokens.append(
+            antlr3.CommonToken(type=12)
+            )
+
+        stream = antlr3.CommonTokenStream(self.source)
+
+        lt1 = stream.LT(1)
+        self.assertEqual(lt1.type, 12)
+
+
+    def testLT1WithHidden(self):
+        """CommonTokenStream.LT(1): with hidden tokens"""
+
+        self.source.tokens.append(
+            antlr3.CommonToken(type=12, channel=antlr3.HIDDEN_CHANNEL)
+            )
+
+        self.source.tokens.append(
+            antlr3.CommonToken(type=13)
+            )
+
+        stream = antlr3.CommonTokenStream(self.source)
+
+        lt1 = stream.LT(1)
+        self.assertEqual(lt1.type, 13)
+
+
+    def testLT2BeyondEnd(self):
+        """CommonTokenStream.LT(2): beyond end"""
+
+        self.source.tokens.append(
+            antlr3.CommonToken(type=12)
+            )
+
+        self.source.tokens.append(
+            antlr3.CommonToken(type=13, channel=antlr3.HIDDEN_CHANNEL)
+            )
+
+        stream = antlr3.CommonTokenStream(self.source)
+
+        lt1 = stream.LT(2)
+        self.assertEqual(lt1.type, antlr3.EOF)
+
+
+    # not yet implemented
+    def testLTNegative(self):
+        """CommonTokenStream.LT(-1): look back"""
+
+        self.source.tokens.append(
+            antlr3.CommonToken(type=12)
+            )
+
+        self.source.tokens.append(
+            antlr3.CommonToken(type=13)
+            )
+
+        stream = antlr3.CommonTokenStream(self.source)
+        stream.fillBuffer()
+        stream.consume()
+
+        lt1 = stream.LT(-1)
+        self.assertEqual(lt1.type, 12)
+
+
+    def testLB1(self):
+        """CommonTokenStream.LB(1)"""
+
+        self.source.tokens.append(
+            antlr3.CommonToken(type=12)
+            )
+
+        self.source.tokens.append(
+            antlr3.CommonToken(type=13)
+            )
+
+        stream = antlr3.CommonTokenStream(self.source)
+        stream.fillBuffer()
+        stream.consume()
+
+        self.assertEqual(stream.LB(1).type, 12)
+
+
+    def testLTZero(self):
+        """CommonTokenStream.LT(0)"""
+
+        self.source.tokens.append(
+            antlr3.CommonToken(type=12)
+            )
+
+        self.source.tokens.append(
+            antlr3.CommonToken(type=13)
+            )
+
+        stream = antlr3.CommonTokenStream(self.source)
+
+        lt1 = stream.LT(0)
+        self.assertIsNone(lt1)
+
+
+    def testLBBeyondBegin(self):
+        """CommonTokenStream.LB(-1): beyond begin"""
+
+        self.source.tokens.append(
+            antlr3.CommonToken(type=12)
+            )
+
+        self.source.tokens.append(
+            antlr3.CommonToken(type=12, channel=antlr3.HIDDEN_CHANNEL)
+            )
+
+        self.source.tokens.append(
+            antlr3.CommonToken(type=12, channel=antlr3.HIDDEN_CHANNEL)
+            )
+
+        self.source.tokens.append(
+            antlr3.CommonToken(type=13)
+            )
+
+        stream = antlr3.CommonTokenStream(self.source)
+        self.assertIsNone(stream.LB(1))
+
+        stream.consume()
+        stream.consume()
+        self.assertIsNone(stream.LB(3))
+
+
+    def testFillBuffer(self):
+        """CommonTokenStream.fillBuffer()"""
+
+        self.source.tokens.append(
+            antlr3.CommonToken(type=12)
+            )
+
+        self.source.tokens.append(
+            antlr3.CommonToken(type=13)
+            )
+
+        self.source.tokens.append(
+            antlr3.CommonToken(type=14)
+            )
+
+        self.source.tokens.append(
+            antlr3.CommonToken(type=antlr3.EOF)
+            )
+
+        stream = antlr3.CommonTokenStream(self.source)
+        stream.fillBuffer()
+
+        self.assertEqual(len(stream.tokens), 3)
+        self.assertEqual(stream.tokens[0].type, 12)
+        self.assertEqual(stream.tokens[1].type, 13)
+        self.assertEqual(stream.tokens[2].type, 14)
+
+
+    def testConsume(self):
+        """CommonTokenStream.consume()"""
+
+        self.source.tokens.append(
+            antlr3.CommonToken(type=12)
+            )
+
+        self.source.tokens.append(
+            antlr3.CommonToken(type=13)
+            )
+
+        self.source.tokens.append(
+            antlr3.CommonToken(type=antlr3.EOF)
+            )
+
+        stream = antlr3.CommonTokenStream(self.source)
+        self.assertEqual(stream.LA(1), 12)
+
+        stream.consume()
+        self.assertEqual(stream.LA(1), 13)
+
+        stream.consume()
+        self.assertEqual(stream.LA(1), antlr3.EOF)
+
+        stream.consume()
+        self.assertEqual(stream.LA(1), antlr3.EOF)
+
+
+    def testSeek(self):
+        """CommonTokenStream.seek()"""
+
+        self.source.tokens.append(
+            antlr3.CommonToken(type=12)
+            )
+
+        self.source.tokens.append(
+            antlr3.CommonToken(type=13)
+            )
+
+        self.source.tokens.append(
+            antlr3.CommonToken(type=antlr3.EOF)
+            )
+
+        stream = antlr3.CommonTokenStream(self.source)
+        self.assertEqual(stream.LA(1), 12)
+
+        stream.seek(2)
+        self.assertEqual(stream.LA(1), antlr3.EOF)
+
+        stream.seek(0)
+        self.assertEqual(stream.LA(1), 12)
+
+
+    def testMarkRewind(self):
+        """CommonTokenStream.mark()/rewind()"""
+
+        self.source.tokens.append(
+            antlr3.CommonToken(type=12)
+            )
+
+        self.source.tokens.append(
+            antlr3.CommonToken(type=13)
+            )
+
+        self.source.tokens.append(
+            antlr3.CommonToken(type=antlr3.EOF)
+            )
+
+        stream = antlr3.CommonTokenStream(self.source)
+        stream.fillBuffer()
+
+        stream.consume()
+        marker = stream.mark()
+
+        stream.consume()
+        stream.rewind(marker)
+
+        self.assertEqual(stream.LA(1), 13)
+
+
+    def testToString(self):
+        """CommonTokenStream.toString()"""
+
+        self.source.tokens.append(
+            antlr3.CommonToken(type=12, text="foo")
+            )
+
+        self.source.tokens.append(
+            antlr3.CommonToken(type=13, text="bar")
+            )
+
+        self.source.tokens.append(
+            antlr3.CommonToken(type=14, text="gnurz")
+            )
+
+        self.source.tokens.append(
+            antlr3.CommonToken(type=15, text="blarz")
+            )
+
+        stream = antlr3.CommonTokenStream(self.source)
+
+        self.assertEqual(stream.toString(), "foobargnurzblarz")
+        self.assertEqual(stream.toString(1, 2), "bargnurz")
+        self.assertEqual(stream.toString(stream.tokens[1], stream.tokens[-2]), "bargnurz")
+
+
+if __name__ == "__main__":
+    unittest.main(testRunner=unittest.TextTestRunner(verbosity=2))
diff --git a/runtime/Python3/unittests/testtree.py b/runtime/Python3/unittests/testtree.py
new file mode 100644
index 0000000..83c3876
--- /dev/null
+++ b/runtime/Python3/unittests/testtree.py
@@ -0,0 +1,1334 @@
+
+from io import StringIO
+import os
+import unittest
+
+from antlr3.tree import (CommonTreeNodeStream, CommonTree, CommonTreeAdaptor,
+                         TreeParser, TreeVisitor, TreeIterator)
+from antlr3 import CommonToken, UP, DOWN, EOF
+from antlr3.treewizard import TreeWizard
+
+class TestTreeNodeStream(unittest.TestCase):
+    """Test case for the TreeNodeStream class."""
+
+    def setUp(self):
+        self.adaptor = CommonTreeAdaptor()
+
+
+    def newStream(self, t):
+        """Build new stream; let's us override to test other streams."""
+        return CommonTreeNodeStream(t)
+
+
+    def testSingleNode(self):
+        t = CommonTree(CommonToken(101))
+
+        stream = self.newStream(t)
+        expecting = "101"
+        found = self.toNodesOnlyString(stream)
+        self.assertEqual(expecting, found)
+
+        expecting = "101"
+        found = str(stream)
+        self.assertEqual(expecting, found)
+
+
+    def testTwoChildrenOfNilRoot(self):
+        class V(CommonTree):
+            def __init__(self, token=None, ttype=None):
+                if token:
+                    self.token = token
+                    
+                elif ttype:
+                    self.token = CommonToken(type=ttype)
+                    
+
+            def __str__(self):
+                if self.token:
+                    txt = self.token.text
+                else:
+                    txt = ""
+
+                txt += "<V>"
+                return txt
+
+        root_0 = self.adaptor.nil()
+        t = V(ttype=101)
+        u = V(token=CommonToken(type=102, text="102"))
+        self.adaptor.addChild(root_0, t)
+        self.adaptor.addChild(root_0, u)
+        self.assertIsNone(root_0.parent)
+        self.assertEqual(-1, root_0.childIndex)
+        self.assertEqual(0, t.childIndex)
+        self.assertEqual(1, u.childIndex)
+
+
+    def test4Nodes(self):
+        # ^(101 ^(102 103) 104)
+        t = CommonTree(CommonToken(101))
+        t.addChild(CommonTree(CommonToken(102)))
+        t.getChild(0).addChild(CommonTree(CommonToken(103)))
+        t.addChild(CommonTree(CommonToken(104)))
+
+        stream = self.newStream(t)
+        expecting = "101 102 103 104"
+        found = self.toNodesOnlyString(stream)
+        self.assertEqual(expecting, found)
+
+        expecting = "101 2 102 2 103 3 104 3"
+        found = str(stream)
+        self.assertEqual(expecting, found)
+
+
+    def testList(self):
+        root = CommonTree(None)
+
+        t = CommonTree(CommonToken(101))
+        t.addChild(CommonTree(CommonToken(102)))
+        t.getChild(0).addChild(CommonTree(CommonToken(103)))
+        t.addChild(CommonTree(CommonToken(104)))
+
+        u = CommonTree(CommonToken(105))
+
+        root.addChild(t)
+        root.addChild(u)
+
+        stream = CommonTreeNodeStream(root)
+        expecting = "101 102 103 104 105"
+        found = self.toNodesOnlyString(stream)
+        self.assertEqual(expecting, found)
+
+        expecting = "101 2 102 2 103 3 104 3 105"
+        found = str(stream)
+        self.assertEqual(expecting, found)
+
+
+    def testFlatList(self):
+        root = CommonTree(None)
+
+        root.addChild(CommonTree(CommonToken(101)))
+        root.addChild(CommonTree(CommonToken(102)))
+        root.addChild(CommonTree(CommonToken(103)))
+
+        stream = CommonTreeNodeStream(root)
+        expecting = "101 102 103"
+        found = self.toNodesOnlyString(stream)
+        self.assertEqual(expecting, found)
+
+        expecting = "101 102 103"
+        found = str(stream)
+        self.assertEqual(expecting, found)
+
+
+    def testListWithOneNode(self):
+        root = CommonTree(None)
+
+        root.addChild(CommonTree(CommonToken(101)))
+
+        stream = CommonTreeNodeStream(root)
+        expecting = "101"
+        found = self.toNodesOnlyString(stream)
+        self.assertEqual(expecting, found)
+
+        expecting = "101"
+        found = str(stream)
+        self.assertEqual(expecting, found)
+
+
+    def testAoverB(self):
+        t = CommonTree(CommonToken(101))
+        t.addChild(CommonTree(CommonToken(102)))
+
+        stream = self.newStream(t)
+        expecting = "101 102"
+        found = self.toNodesOnlyString(stream)
+        self.assertEqual(expecting, found)
+
+        expecting = "101 2 102 3"
+        found = str(stream)
+        self.assertEqual(expecting, found)
+
+
+    def testLT(self):
+        # ^(101 ^(102 103) 104)
+        t = CommonTree(CommonToken(101))
+        t.addChild(CommonTree(CommonToken(102)))
+        t.getChild(0).addChild(CommonTree(CommonToken(103)))
+        t.addChild(CommonTree(CommonToken(104)))
+
+        stream = self.newStream(t)
+        self.assertEqual(101, stream.LT(1).getType())
+        self.assertEqual(DOWN, stream.LT(2).getType())
+        self.assertEqual(102, stream.LT(3).getType())
+        self.assertEqual(DOWN, stream.LT(4).getType())
+        self.assertEqual(103, stream.LT(5).getType())
+        self.assertEqual(UP, stream.LT(6).getType())
+        self.assertEqual(104, stream.LT(7).getType())
+        self.assertEqual(UP, stream.LT(8).getType())
+        self.assertEqual(EOF, stream.LT(9).getType())
+        # check way ahead
+        self.assertEqual(EOF, stream.LT(100).getType())
+
+
+    def testMarkRewindEntire(self):
+        # ^(101 ^(102 103 ^(106 107) ) 104 105)
+        # stream has 7 real + 6 nav nodes
+        # Sequence of types: 101 DN 102 DN 103 106 DN 107 UP UP 104 105 UP EOF
+        r0 = CommonTree(CommonToken(101))
+        r1 = CommonTree(CommonToken(102))
+        r0.addChild(r1)
+        r1.addChild(CommonTree(CommonToken(103)))
+        r2 = CommonTree(CommonToken(106))
+        r2.addChild(CommonTree(CommonToken(107)))
+        r1.addChild(r2)
+        r0.addChild(CommonTree(CommonToken(104)))
+        r0.addChild(CommonTree(CommonToken(105)))
+
+        stream = CommonTreeNodeStream(r0)
+        m = stream.mark() # MARK
+        for _ in range(13): # consume til end
+            stream.LT(1)
+            stream.consume()
+
+        self.assertEqual(EOF, stream.LT(1).getType())
+        self.assertEqual(UP, stream.LT(-1).getType())  #TODO: remove?
+        stream.rewind(m)      # REWIND
+
+        # consume til end again :)
+        for _ in range(13): # consume til end
+            stream.LT(1)
+            stream.consume()
+
+        self.assertEqual(EOF, stream.LT(1).getType())
+        self.assertEqual(UP, stream.LT(-1).getType())  #TODO: remove?
+
+
+    def testMarkRewindInMiddle(self):
+        # ^(101 ^(102 103 ^(106 107) ) 104 105)
+        # stream has 7 real + 6 nav nodes
+        # Sequence of types: 101 DN 102 DN 103 106 DN 107 UP UP 104 105 UP EOF
+        r0 = CommonTree(CommonToken(101))
+        r1 = CommonTree(CommonToken(102))
+        r0.addChild(r1)
+        r1.addChild(CommonTree(CommonToken(103)))
+        r2 = CommonTree(CommonToken(106))
+        r2.addChild(CommonTree(CommonToken(107)))
+        r1.addChild(r2)
+        r0.addChild(CommonTree(CommonToken(104)))
+        r0.addChild(CommonTree(CommonToken(105)))
+
+        stream = CommonTreeNodeStream(r0)
+        for _ in range(7): # consume til middle
+            #System.out.println(tream.LT(1).getType())
+            stream.consume()
+
+        self.assertEqual(107, stream.LT(1).getType())
+        m = stream.mark() # MARK
+        stream.consume() # consume 107
+        stream.consume() # consume UP
+        stream.consume() # consume UP
+        stream.consume() # consume 104
+        stream.rewind(m)      # REWIND
+
+        self.assertEqual(107, stream.LT(1).getType())
+        stream.consume()
+        self.assertEqual(UP, stream.LT(1).getType())
+        stream.consume()
+        self.assertEqual(UP, stream.LT(1).getType())
+        stream.consume()
+        self.assertEqual(104, stream.LT(1).getType())
+        stream.consume()
+        # now we're past rewind position
+        self.assertEqual(105, stream.LT(1).getType())
+        stream.consume()
+        self.assertEqual(UP, stream.LT(1).getType())
+        stream.consume()
+        self.assertEqual(EOF, stream.LT(1).getType())
+        self.assertEqual(UP, stream.LT(-1).getType())
+
+
+    def testMarkRewindNested(self):
+        # ^(101 ^(102 103 ^(106 107) ) 104 105)
+        # stream has 7 real + 6 nav nodes
+        # Sequence of types: 101 DN 102 DN 103 106 DN 107 UP UP 104 105 UP EOF
+        r0 = CommonTree(CommonToken(101))
+        r1 = CommonTree(CommonToken(102))
+        r0.addChild(r1)
+        r1.addChild(CommonTree(CommonToken(103)))
+        r2 = CommonTree(CommonToken(106))
+        r2.addChild(CommonTree(CommonToken(107)))
+        r1.addChild(r2)
+        r0.addChild(CommonTree(CommonToken(104)))
+        r0.addChild(CommonTree(CommonToken(105)))
+
+        stream = CommonTreeNodeStream(r0)
+        m = stream.mark() # MARK at start
+        stream.consume() # consume 101
+        stream.consume() # consume DN
+        m2 = stream.mark() # MARK on 102
+        stream.consume() # consume 102
+        stream.consume() # consume DN
+        stream.consume() # consume 103
+        stream.consume() # consume 106
+        stream.rewind(m2)      # REWIND to 102
+        self.assertEqual(102, stream.LT(1).getType())
+        stream.consume()
+        self.assertEqual(DOWN, stream.LT(1).getType())
+        stream.consume()
+        # stop at 103 and rewind to start
+        stream.rewind(m) # REWIND to 101
+        self.assertEqual(101, stream.LT(1).getType())
+        stream.consume()
+        self.assertEqual(DOWN, stream.LT(1).getType())
+        stream.consume()
+        self.assertEqual(102, stream.LT(1).getType())
+        stream.consume()
+        self.assertEqual(DOWN, stream.LT(1).getType())
+
+
+    def testSeek(self):
+        # ^(101 ^(102 103 ^(106 107) ) 104 105)
+        # stream has 7 real + 6 nav nodes
+        # Sequence of types: 101 DN 102 DN 103 106 DN 107 UP UP 104 105 UP EOF
+        r0 = CommonTree(CommonToken(101))
+        r1 = CommonTree(CommonToken(102))
+        r0.addChild(r1)
+        r1.addChild(CommonTree(CommonToken(103)))
+        r2 = CommonTree(CommonToken(106))
+        r2.addChild(CommonTree(CommonToken(107)))
+        r1.addChild(r2)
+        r0.addChild(CommonTree(CommonToken(104)))
+        r0.addChild(CommonTree(CommonToken(105)))
+
+        stream = CommonTreeNodeStream(r0)
+        stream.consume() # consume 101
+        stream.consume() # consume DN
+        stream.consume() # consume 102
+        stream.seek(7)   # seek to 107
+        self.assertEqual(107, stream.LT(1).getType())
+        stream.consume() # consume 107
+        stream.consume() # consume UP
+        stream.consume() # consume UP
+        self.assertEqual(104, stream.LT(1).getType())
+
+
+    def testSeekFromStart(self):
+        # ^(101 ^(102 103 ^(106 107) ) 104 105)
+        # stream has 7 real + 6 nav nodes
+        # Sequence of types: 101 DN 102 DN 103 106 DN 107 UP UP 104 105 UP EOF
+        r0 = CommonTree(CommonToken(101))
+        r1 = CommonTree(CommonToken(102))
+        r0.addChild(r1)
+        r1.addChild(CommonTree(CommonToken(103)))
+        r2 = CommonTree(CommonToken(106))
+        r2.addChild(CommonTree(CommonToken(107)))
+        r1.addChild(r2)
+        r0.addChild(CommonTree(CommonToken(104)))
+        r0.addChild(CommonTree(CommonToken(105)))
+
+        stream = CommonTreeNodeStream(r0)
+        stream.seek(7)   # seek to 107
+        self.assertEqual(107, stream.LT(1).getType())
+        stream.consume() # consume 107
+        stream.consume() # consume UP
+        stream.consume() # consume UP
+        self.assertEqual(104, stream.LT(1).getType())
+
+
+    def testReset(self):
+        # ^(101 ^(102 103 ^(106 107) ) 104 105)
+        # stream has 7 real + 6 nav nodes
+        # Sequence of types: 101 DN 102 DN 103 106 DN 107 UP UP 104 105 UP EOF
+        r0 = CommonTree(CommonToken(101))
+        r1 = CommonTree(CommonToken(102))
+        r0.addChild(r1)
+        r1.addChild(CommonTree(CommonToken(103)))
+        r2 = CommonTree(CommonToken(106))
+        r2.addChild(CommonTree(CommonToken(107)))
+        r1.addChild(r2)
+        r0.addChild(CommonTree(CommonToken(104)))
+        r0.addChild(CommonTree(CommonToken(105)))
+
+        stream = CommonTreeNodeStream(r0)
+        v1 = self.toNodesOnlyString(stream) # scan all
+        stream.reset()
+        v2 = self.toNodesOnlyString(stream) # scan all
+        self.assertEqual(v1, v2)
+
+
+    def testIterator(self):
+        r0 = CommonTree(CommonToken(101))
+        r1 = CommonTree(CommonToken(102))
+        r0.addChild(r1)
+        r1.addChild(CommonTree(CommonToken(103)))
+        r2 = CommonTree(CommonToken(106))
+        r2.addChild(CommonTree(CommonToken(107)))
+        r1.addChild(r2)
+        r0.addChild(CommonTree(CommonToken(104)))
+        r0.addChild(CommonTree(CommonToken(105)))
+
+        stream = CommonTreeNodeStream(r0)
+
+        expecting = [
+            101, DOWN, 102, DOWN, 103, 106, DOWN, 107, UP, UP, 104, 105, UP]
+        found = [t.type for t in stream]
+        self.assertEqual(expecting, found)
+
+
+    def toNodesOnlyString(self, nodes):
+        buf = []
+        for i in range(nodes.size()):
+            t = nodes.LT(i + 1)
+            type = nodes.getTreeAdaptor().getType(t)
+            if type not in {DOWN, UP}:
+                buf.append(str(type))
+
+        return ' '.join(buf)
+
+
+class TestCommonTreeNodeStream(unittest.TestCase):
+    """Test case for the CommonTreeNodeStream class."""
+
+    def testPushPop(self):
+        # ^(101 ^(102 103) ^(104 105) ^(106 107) 108 109)
+        # stream has 9 real + 8 nav nodes
+        # Sequence of types: 101 DN 102 DN 103 UP 104 DN 105 UP 106 DN 107 UP 108 109 UP
+        r0 = CommonTree(CommonToken(101))
+        r1 = CommonTree(CommonToken(102))
+        r1.addChild(CommonTree(CommonToken(103)))
+        r0.addChild(r1)
+        r2 = CommonTree(CommonToken(104))
+        r2.addChild(CommonTree(CommonToken(105)))
+        r0.addChild(r2)
+        r3 = CommonTree(CommonToken(106))
+        r3.addChild(CommonTree(CommonToken(107)))
+        r0.addChild(r3)
+        r0.addChild(CommonTree(CommonToken(108)))
+        r0.addChild(CommonTree(CommonToken(109)))
+
+        stream = CommonTreeNodeStream(r0)
+        expecting = "101 2 102 2 103 3 104 2 105 3 106 2 107 3 108 109 3"
+        found = str(stream)
+        self.assertEqual(expecting, found)
+
+        # Assume we want to hit node 107 and then "call 102" then return
+
+        indexOf102 = 2
+        indexOf107 = 12
+        for _ in range(indexOf107):# consume til 107 node
+            stream.consume()
+
+        # CALL 102
+        self.assertEqual(107, stream.LT(1).getType())
+        stream.push(indexOf102)
+        self.assertEqual(102, stream.LT(1).getType())
+        stream.consume() # consume 102
+        self.assertEqual(DOWN, stream.LT(1).getType())
+        stream.consume() # consume DN
+        self.assertEqual(103, stream.LT(1).getType())
+        stream.consume() # consume 103
+        self.assertEqual(UP, stream.LT(1).getType())
+        # RETURN
+        stream.pop()
+        self.assertEqual(107, stream.LT(1).getType())
+
+
+    def testNestedPushPop(self):
+        # ^(101 ^(102 103) ^(104 105) ^(106 107) 108 109)
+        # stream has 9 real + 8 nav nodes
+        # Sequence of types: 101 DN 102 DN 103 UP 104 DN 105 UP 106 DN 107 UP 108 109 UP
+        r0 = CommonTree(CommonToken(101))
+        r1 = CommonTree(CommonToken(102))
+        r1.addChild(CommonTree(CommonToken(103)))
+        r0.addChild(r1)
+        r2 = CommonTree(CommonToken(104))
+        r2.addChild(CommonTree(CommonToken(105)))
+        r0.addChild(r2)
+        r3 = CommonTree(CommonToken(106))
+        r3.addChild(CommonTree(CommonToken(107)))
+        r0.addChild(r3)
+        r0.addChild(CommonTree(CommonToken(108)))
+        r0.addChild(CommonTree(CommonToken(109)))
+
+        stream = CommonTreeNodeStream(r0)
+
+        # Assume we want to hit node 107 and then "call 102", which
+        # calls 104, then return
+
+        indexOf102 = 2
+        indexOf107 = 12
+        for _ in range(indexOf107): # consume til 107 node
+            stream.consume()
+
+        self.assertEqual(107, stream.LT(1).getType())
+        # CALL 102
+        stream.push(indexOf102)
+        self.assertEqual(102, stream.LT(1).getType())
+        stream.consume() # consume 102
+        self.assertEqual(DOWN, stream.LT(1).getType())
+        stream.consume() # consume DN
+        self.assertEqual(103, stream.LT(1).getType())
+        stream.consume() # consume 103
+
+        # CALL 104
+        indexOf104 = 6
+        stream.push(indexOf104)
+        self.assertEqual(104, stream.LT(1).getType())
+        stream.consume() # consume 102
+        self.assertEqual(DOWN, stream.LT(1).getType())
+        stream.consume() # consume DN
+        self.assertEqual(105, stream.LT(1).getType())
+        stream.consume() # consume 103
+        self.assertEqual(UP, stream.LT(1).getType())
+        # RETURN (to UP node in 102 subtree)
+        stream.pop()
+
+        self.assertEqual(UP, stream.LT(1).getType())
+        # RETURN (to empty stack)
+        stream.pop()
+        self.assertEqual(107, stream.LT(1).getType())
+
+
+    def testPushPopFromEOF(self):
+        # ^(101 ^(102 103) ^(104 105) ^(106 107) 108 109)
+        # stream has 9 real + 8 nav nodes
+        # Sequence of types: 101 DN 102 DN 103 UP 104 DN 105 UP 106 DN 107 UP 108 109 UP
+        r0 = CommonTree(CommonToken(101))
+        r1 = CommonTree(CommonToken(102))
+        r1.addChild(CommonTree(CommonToken(103)))
+        r0.addChild(r1)
+        r2 = CommonTree(CommonToken(104))
+        r2.addChild(CommonTree(CommonToken(105)))
+        r0.addChild(r2)
+        r3 = CommonTree(CommonToken(106))
+        r3.addChild(CommonTree(CommonToken(107)))
+        r0.addChild(r3)
+        r0.addChild(CommonTree(CommonToken(108)))
+        r0.addChild(CommonTree(CommonToken(109)))
+
+        stream = CommonTreeNodeStream(r0)
+
+        while stream.LA(1) != EOF:
+            stream.consume()
+
+        indexOf102 = 2
+        indexOf104 = 6
+        self.assertEqual(EOF, stream.LT(1).getType())
+
+        # CALL 102
+        stream.push(indexOf102)
+        self.assertEqual(102, stream.LT(1).getType())
+        stream.consume() # consume 102
+        self.assertEqual(DOWN, stream.LT(1).getType())
+        stream.consume() # consume DN
+        self.assertEqual(103, stream.LT(1).getType())
+        stream.consume() # consume 103
+        self.assertEqual(UP, stream.LT(1).getType())
+        # RETURN (to empty stack)
+        stream.pop()
+        self.assertEqual(EOF, stream.LT(1).getType())
+
+        # CALL 104
+        stream.push(indexOf104)
+        self.assertEqual(104, stream.LT(1).getType())
+        stream.consume() # consume 102
+        self.assertEqual(DOWN, stream.LT(1).getType())
+        stream.consume() # consume DN
+        self.assertEqual(105, stream.LT(1).getType())
+        stream.consume() # consume 103
+        self.assertEqual(UP, stream.LT(1).getType())
+        # RETURN (to empty stack)
+        stream.pop()
+        self.assertEqual(EOF, stream.LT(1).getType())
+
+
+class TestCommonTree(unittest.TestCase):
+    """Test case for the CommonTree class."""
+
+    def setUp(self):
+        """Setup test fixure"""
+
+        self.adaptor = CommonTreeAdaptor()
+
+
+    def testSingleNode(self):
+        t = CommonTree(CommonToken(101))
+        self.assertIsNone(t.parent)
+        self.assertEqual(-1, t.childIndex)
+
+
+    def test4Nodes(self):
+        # ^(101 ^(102 103) 104)
+        r0 = CommonTree(CommonToken(101))
+        r0.addChild(CommonTree(CommonToken(102)))
+        r0.getChild(0).addChild(CommonTree(CommonToken(103)))
+        r0.addChild(CommonTree(CommonToken(104)))
+
+        self.assertIsNone(r0.parent)
+        self.assertEqual(-1, r0.childIndex)
+
+
+    def testList(self):
+        # ^(nil 101 102 103)
+        r0 = CommonTree(None)
+        c0=CommonTree(CommonToken(101))
+        r0.addChild(c0)
+        c1=CommonTree(CommonToken(102))
+        r0.addChild(c1)
+        c2=CommonTree(CommonToken(103))
+        r0.addChild(c2)
+
+        self.assertIsNone(r0.parent)
+        self.assertEqual(-1, r0.childIndex)
+        self.assertEqual(r0, c0.parent)
+        self.assertEqual(0, c0.childIndex)
+        self.assertEqual(r0, c1.parent)
+        self.assertEqual(1, c1.childIndex)
+        self.assertEqual(r0, c2.parent)
+        self.assertEqual(2, c2.childIndex)
+
+
+    def testList2(self):
+        # Add child ^(nil 101 102 103) to root 5
+        # should pull 101 102 103 directly to become 5's child list
+        root = CommonTree(CommonToken(5))
+
+        # child tree
+        r0 = CommonTree(None)
+        c0=CommonTree(CommonToken(101))
+        r0.addChild(c0)
+        c1=CommonTree(CommonToken(102))
+        r0.addChild(c1)
+        c2=CommonTree(CommonToken(103))
+        r0.addChild(c2)
+
+        root.addChild(r0)
+
+        self.assertIsNone(root.parent)
+        self.assertEqual(-1, root.childIndex)
+        # check children of root all point at root
+        self.assertEqual(root, c0.parent)
+        self.assertEqual(0, c0.childIndex)
+        self.assertEqual(root, c0.parent)
+        self.assertEqual(1, c1.childIndex)
+        self.assertEqual(root, c0.parent)
+        self.assertEqual(2, c2.childIndex)
+
+
+    def testAddListToExistChildren(self):
+        # Add child ^(nil 101 102 103) to root ^(5 6)
+        # should add 101 102 103 to end of 5's child list
+        root = CommonTree(CommonToken(5))
+        root.addChild(CommonTree(CommonToken(6)))
+
+        # child tree
+        r0 = CommonTree(None)
+        c0=CommonTree(CommonToken(101))
+        r0.addChild(c0)
+        c1=CommonTree(CommonToken(102))
+        r0.addChild(c1)
+        c2=CommonTree(CommonToken(103))
+        r0.addChild(c2)
+
+        root.addChild(r0)
+
+        self.assertIsNone(root.parent)
+        self.assertEqual(-1, root.childIndex)
+        # check children of root all point at root
+        self.assertEqual(root, c0.parent)
+        self.assertEqual(1, c0.childIndex)
+        self.assertEqual(root, c0.parent)
+        self.assertEqual(2, c1.childIndex)
+        self.assertEqual(root, c0.parent)
+        self.assertEqual(3, c2.childIndex)
+
+
+    def testDupTree(self):
+        # ^(101 ^(102 103 ^(106 107) ) 104 105)
+        r0 = CommonTree(CommonToken(101))
+        r1 = CommonTree(CommonToken(102))
+        r0.addChild(r1)
+        r1.addChild(CommonTree(CommonToken(103)))
+        r2 = CommonTree(CommonToken(106))
+        r2.addChild(CommonTree(CommonToken(107)))
+        r1.addChild(r2)
+        r0.addChild(CommonTree(CommonToken(104)))
+        r0.addChild(CommonTree(CommonToken(105)))
+
+        dup = self.adaptor.dupTree(r0)
+
+        self.assertIsNone(dup.parent)
+        self.assertEqual(-1, dup.childIndex)
+        dup.sanityCheckParentAndChildIndexes()
+
+
+    def testBecomeRoot(self):
+        # 5 becomes root of ^(nil 101 102 103)
+        newRoot = CommonTree(CommonToken(5))
+
+        oldRoot = CommonTree(None)
+        oldRoot.addChild(CommonTree(CommonToken(101)))
+        oldRoot.addChild(CommonTree(CommonToken(102)))
+        oldRoot.addChild(CommonTree(CommonToken(103)))
+
+        self.adaptor.becomeRoot(newRoot, oldRoot)
+        newRoot.sanityCheckParentAndChildIndexes()
+
+
+    def testBecomeRoot2(self):
+        # 5 becomes root of ^(101 102 103)
+        newRoot = CommonTree(CommonToken(5))
+
+        oldRoot = CommonTree(CommonToken(101))
+        oldRoot.addChild(CommonTree(CommonToken(102)))
+        oldRoot.addChild(CommonTree(CommonToken(103)))
+
+        self.adaptor.becomeRoot(newRoot, oldRoot)
+        newRoot.sanityCheckParentAndChildIndexes()
+
+
+    def testBecomeRoot3(self):
+        # ^(nil 5) becomes root of ^(nil 101 102 103)
+        newRoot = CommonTree(None)
+        newRoot.addChild(CommonTree(CommonToken(5)))
+
+        oldRoot = CommonTree(None)
+        oldRoot.addChild(CommonTree(CommonToken(101)))
+        oldRoot.addChild(CommonTree(CommonToken(102)))
+        oldRoot.addChild(CommonTree(CommonToken(103)))
+
+        self.adaptor.becomeRoot(newRoot, oldRoot)
+        newRoot.sanityCheckParentAndChildIndexes()
+
+
+    def testBecomeRoot5(self):
+        # ^(nil 5) becomes root of ^(101 102 103)
+        newRoot = CommonTree(None)
+        newRoot.addChild(CommonTree(CommonToken(5)))
+
+        oldRoot = CommonTree(CommonToken(101))
+        oldRoot.addChild(CommonTree(CommonToken(102)))
+        oldRoot.addChild(CommonTree(CommonToken(103)))
+
+        self.adaptor.becomeRoot(newRoot, oldRoot)
+        newRoot.sanityCheckParentAndChildIndexes()
+
+
+    def testBecomeRoot6(self):
+        # emulates construction of ^(5 6)
+        root_0 = self.adaptor.nil()
+        root_1 = self.adaptor.nil()
+        root_1 = self.adaptor.becomeRoot(CommonTree(CommonToken(5)), root_1)
+
+        self.adaptor.addChild(root_1, CommonTree(CommonToken(6)))
+
+        self.adaptor.addChild(root_0, root_1)
+
+        root_0.sanityCheckParentAndChildIndexes()
+
+
+    # Test replaceChildren
+
+    def testReplaceWithNoChildren(self):
+        t = CommonTree(CommonToken(101))
+        newChild = CommonTree(CommonToken(5))
+        error = False
+        self.assertRaises(IndexError, t.replaceChildren, 0, 0, newChild)
+
+
+    def testReplaceWithOneChildren(self):
+        # assume token type 99 and use text
+        t = CommonTree(CommonToken(99, text="a"))
+        c0 = CommonTree(CommonToken(99, text="b"))
+        t.addChild(c0)
+
+        newChild = CommonTree(CommonToken(99, text="c"))
+        t.replaceChildren(0, 0, newChild)
+        expecting = "(a c)"
+        self.assertEqual(expecting, t.toStringTree())
+        t.sanityCheckParentAndChildIndexes()
+
+
+    def testReplaceInMiddle(self):
+        t = CommonTree(CommonToken(99, text="a"))
+        t.addChild(CommonTree(CommonToken(99, text="b")))
+        t.addChild(CommonTree(CommonToken(99, text="c"))) # index 1
+        t.addChild(CommonTree(CommonToken(99, text="d")))
+
+        newChild = CommonTree(CommonToken(99, text="x"))
+        t.replaceChildren(1, 1, newChild)
+        expecting = "(a b x d)"
+        self.assertEqual(expecting, t.toStringTree())
+        t.sanityCheckParentAndChildIndexes()
+
+
+    def testReplaceAtLeft(self):
+        t = CommonTree(CommonToken(99, text="a"))
+        t.addChild(CommonTree(CommonToken(99, text="b"))) # index 0
+        t.addChild(CommonTree(CommonToken(99, text="c")))
+        t.addChild(CommonTree(CommonToken(99, text="d")))
+
+        newChild = CommonTree(CommonToken(99, text="x"))
+        t.replaceChildren(0, 0, newChild)
+        expecting = "(a x c d)"
+        self.assertEqual(expecting, t.toStringTree())
+        t.sanityCheckParentAndChildIndexes()
+
+
+    def testReplaceAtRight(self):
+        t = CommonTree(CommonToken(99, text="a"))
+        t.addChild(CommonTree(CommonToken(99, text="b")))
+        t.addChild(CommonTree(CommonToken(99, text="c")))
+        t.addChild(CommonTree(CommonToken(99, text="d"))) # index 2
+
+        newChild = CommonTree(CommonToken(99, text="x"))
+        t.replaceChildren(2, 2, newChild)
+        expecting = "(a b c x)"
+        self.assertEqual(expecting, t.toStringTree())
+        t.sanityCheckParentAndChildIndexes()
+
+
+    def testReplaceOneWithTwoAtLeft(self):
+        t = CommonTree(CommonToken(99, text="a"))
+        t.addChild(CommonTree(CommonToken(99, text="b")))
+        t.addChild(CommonTree(CommonToken(99, text="c")))
+        t.addChild(CommonTree(CommonToken(99, text="d")))
+
+        newChildren = self.adaptor.nil()
+        newChildren.addChild(CommonTree(CommonToken(99, text="x")))
+        newChildren.addChild(CommonTree(CommonToken(99, text="y")))
+
+        t.replaceChildren(0, 0, newChildren)
+        expecting = "(a x y c d)"
+        self.assertEqual(expecting, t.toStringTree())
+        t.sanityCheckParentAndChildIndexes()
+
+
+    def testReplaceOneWithTwoAtRight(self):
+        t = CommonTree(CommonToken(99, text="a"))
+        t.addChild(CommonTree(CommonToken(99, text="b")))
+        t.addChild(CommonTree(CommonToken(99, text="c")))
+        t.addChild(CommonTree(CommonToken(99, text="d")))
+
+        newChildren = self.adaptor.nil()
+        newChildren.addChild(CommonTree(CommonToken(99, text="x")))
+        newChildren.addChild(CommonTree(CommonToken(99, text="y")))
+
+        t.replaceChildren(2, 2, newChildren)
+        expecting = "(a b c x y)"
+        self.assertEqual(expecting, t.toStringTree())
+        t.sanityCheckParentAndChildIndexes()
+
+
+    def testReplaceOneWithTwoInMiddle(self):
+        t = CommonTree(CommonToken(99, text="a"))
+        t.addChild(CommonTree(CommonToken(99, text="b")))
+        t.addChild(CommonTree(CommonToken(99, text="c")))
+        t.addChild(CommonTree(CommonToken(99, text="d")))
+
+        newChildren = self.adaptor.nil()
+        newChildren.addChild(CommonTree(CommonToken(99, text="x")))
+        newChildren.addChild(CommonTree(CommonToken(99, text="y")))
+
+        t.replaceChildren(1, 1, newChildren)
+        expecting = "(a b x y d)"
+        self.assertEqual(expecting, t.toStringTree())
+        t.sanityCheckParentAndChildIndexes()
+
+
+    def testReplaceTwoWithOneAtLeft(self):
+        t = CommonTree(CommonToken(99, text="a"))
+        t.addChild(CommonTree(CommonToken(99, text="b")))
+        t.addChild(CommonTree(CommonToken(99, text="c")))
+        t.addChild(CommonTree(CommonToken(99, text="d")))
+
+        newChild = CommonTree(CommonToken(99, text="x"))
+
+        t.replaceChildren(0, 1, newChild)
+        expecting = "(a x d)"
+        self.assertEqual(expecting, t.toStringTree())
+        t.sanityCheckParentAndChildIndexes()
+
+
+    def testReplaceTwoWithOneAtRight(self):
+        t = CommonTree(CommonToken(99, text="a"))
+        t.addChild(CommonTree(CommonToken(99, text="b")))
+        t.addChild(CommonTree(CommonToken(99, text="c")))
+        t.addChild(CommonTree(CommonToken(99, text="d")))
+
+        newChild = CommonTree(CommonToken(99, text="x"))
+
+        t.replaceChildren(1, 2, newChild)
+        expecting = "(a b x)"
+        self.assertEqual(expecting, t.toStringTree())
+        t.sanityCheckParentAndChildIndexes()
+
+
+    def testReplaceAllWithOne(self):
+        t = CommonTree(CommonToken(99, text="a"))
+        t.addChild(CommonTree(CommonToken(99, text="b")))
+        t.addChild(CommonTree(CommonToken(99, text="c")))
+        t.addChild(CommonTree(CommonToken(99, text="d")))
+
+        newChild = CommonTree(CommonToken(99, text="x"))
+
+        t.replaceChildren(0, 2, newChild)
+        expecting = "(a x)"
+        self.assertEqual(expecting, t.toStringTree())
+        t.sanityCheckParentAndChildIndexes()
+
+
+    def testReplaceAllWithTwo(self):
+        t = CommonTree(CommonToken(99, text="a"))
+        t.addChild(CommonTree(CommonToken(99, text="b")))
+        t.addChild(CommonTree(CommonToken(99, text="c")))
+        t.addChild(CommonTree(CommonToken(99, text="d")))
+
+        newChildren = self.adaptor.nil()
+        newChildren.addChild(CommonTree(CommonToken(99, text="x")))
+        newChildren.addChild(CommonTree(CommonToken(99, text="y")))
+
+        t.replaceChildren(0, 2, newChildren)
+        expecting = "(a x y)"
+        self.assertEqual(expecting, t.toStringTree())
+        t.sanityCheckParentAndChildIndexes()
+
+
+class TestTreeContext(unittest.TestCase):
+    """Test the TreeParser.inContext() method"""
+
+    tokenNames = [
+        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "VEC", "ASSIGN", "PRINT",
+        "PLUS", "MULT", "DOT", "ID", "INT", "WS", "'['", "','", "']'"
+        ]
+
+    def testSimpleParent(self):
+        tree = "(nil (ASSIGN ID[x] INT[3]) (PRINT (MULT ID[x] (VEC INT[1] INT[2] INT[3]))))"
+        adaptor = CommonTreeAdaptor()
+        wiz = TreeWizard(adaptor, self.tokenNames)
+        t = wiz.create(tree)
+
+        labels = {}
+        valid = wiz.parse(
+            t,
+            "(nil (ASSIGN ID[x] INT[3]) (PRINT (MULT ID (VEC INT %x:INT INT))))",
+            labels)
+        self.assertTrue(valid)
+        node = labels.get("x")
+
+        expecting = True
+        found = TreeParser._inContext(adaptor, self.tokenNames, node, "VEC")
+        self.assertEqual(expecting, found)
+
+
+    def testNoParent(self):
+        tree = "(PRINT (MULT ID[x] (VEC INT[1] INT[2] INT[3])))"
+        adaptor = CommonTreeAdaptor()
+        wiz = TreeWizard(adaptor, self.tokenNames)
+        t = wiz.create(tree)
+
+        labels = {}
+        valid = wiz.parse(
+            t,
+            "(%x:PRINT (MULT ID (VEC INT INT INT)))",
+            labels)
+        self.assertTrue(valid)
+        node = labels.get("x")
+
+        expecting = False
+        found = TreeParser._inContext(adaptor, self.tokenNames, node, "VEC")
+        self.assertEqual(expecting, found)
+
+
+    def testParentWithWildcard(self):
+        tree = "(nil (ASSIGN ID[x] INT[3]) (PRINT (MULT ID[x] (VEC INT[1] INT[2] INT[3]))))"
+        adaptor = CommonTreeAdaptor()
+        wiz = TreeWizard(adaptor, self.tokenNames)
+        t = wiz.create(tree)
+
+        labels = {}
+        valid = wiz.parse(
+            t,
+            "(nil (ASSIGN ID[x] INT[3]) (PRINT (MULT ID (VEC INT %x:INT INT))))",
+            labels)
+        self.assertTrue(valid)
+        node = labels.get("x")
+
+        expecting = True
+        found = TreeParser._inContext(adaptor, self.tokenNames, node, "VEC ...")
+        self.assertEqual(expecting, found)
+
+
+    def testWildcardAtStartIgnored(self):
+        tree = "(nil (ASSIGN ID[x] INT[3]) (PRINT (MULT ID[x] (VEC INT[1] INT[2] INT[3]))))"
+        adaptor = CommonTreeAdaptor()
+        wiz = TreeWizard(adaptor, self.tokenNames)
+        t = wiz.create(tree)
+
+        labels = {}
+        valid = wiz.parse(
+            t,
+            "(nil (ASSIGN ID[x] INT[3]) (PRINT (MULT ID (VEC INT %x:INT INT))))",
+            labels)
+        self.assertTrue(valid)
+        node = labels.get("x")
+
+        expecting = True
+        found = TreeParser._inContext(adaptor, self.tokenNames, node, "...VEC")
+        self.assertEqual(expecting, found)
+
+
+    def testWildcardInBetween(self):
+        tree = "(nil (ASSIGN ID[x] INT[3]) (PRINT (MULT ID[x] (VEC INT[1] INT[2] INT[3]))))"
+        adaptor = CommonTreeAdaptor()
+        wiz = TreeWizard(adaptor, self.tokenNames)
+        t = wiz.create(tree)
+
+        labels = {}
+        valid = wiz.parse(
+            t,
+            "(nil (ASSIGN ID[x] INT[3]) (PRINT (MULT ID (VEC INT %x:INT INT))))",
+            labels)
+        self.assertTrue(valid)
+        node = labels.get("x")
+
+        expecting = True
+        found = TreeParser._inContext(adaptor, self.tokenNames, node, "PRINT...VEC")
+        self.assertEqual(expecting, found)
+
+
+    def testLotsOfWildcards(self):
+        tree = "(nil (ASSIGN ID[x] INT[3]) (PRINT (MULT ID[x] (VEC INT[1] INT[2] INT[3]))))"
+        adaptor = CommonTreeAdaptor()
+        wiz = TreeWizard(adaptor, self.tokenNames)
+        t = wiz.create(tree)
+
+        labels = {}
+        valid = wiz.parse(
+            t,
+            "(nil (ASSIGN ID[x] INT[3]) (PRINT (MULT ID (VEC INT %x:INT INT))))",
+            labels)
+        self.assertTrue(valid)
+        node = labels.get("x")
+
+        expecting = True
+        found = TreeParser._inContext(adaptor, self.tokenNames, node, "... PRINT ... VEC ...")
+        self.assertEqual(expecting, found)
+
+
+    def testDeep(self):
+        tree = "(PRINT (MULT ID[x] (VEC (MULT INT[9] INT[1]) INT[2] INT[3])))"
+        adaptor = CommonTreeAdaptor()
+        wiz = TreeWizard(adaptor, self.tokenNames)
+        t = wiz.create(tree)
+
+        labels = {}
+        valid = wiz.parse(
+            t,
+            "(PRINT (MULT ID (VEC (MULT INT %x:INT) INT INT)))",
+            labels)
+        self.assertTrue(valid)
+        node = labels.get("x")
+
+        expecting = True
+        found = TreeParser._inContext(adaptor, self.tokenNames, node, "VEC ...")
+        self.assertEqual(expecting, found)
+
+
+    def testDeepAndFindRoot(self):
+        tree = "(PRINT (MULT ID[x] (VEC (MULT INT[9] INT[1]) INT[2] INT[3])))"
+        adaptor = CommonTreeAdaptor()
+        wiz = TreeWizard(adaptor, self.tokenNames)
+        t = wiz.create(tree)
+
+        labels = {}
+        valid = wiz.parse(
+            t,
+            "(PRINT (MULT ID (VEC (MULT INT %x:INT) INT INT)))",
+            labels)
+        self.assertTrue(valid)
+        node = labels.get("x")
+
+        expecting = True
+        found = TreeParser._inContext(adaptor, self.tokenNames, node, "PRINT ...")
+        self.assertEqual(expecting, found)
+
+
+    def testDeepAndFindRoot2(self):
+        tree = "(PRINT (MULT ID[x] (VEC (MULT INT[9] INT[1]) INT[2] INT[3])))"
+        adaptor = CommonTreeAdaptor()
+        wiz = TreeWizard(adaptor, self.tokenNames)
+        t = wiz.create(tree)
+
+        labels = {}
+        valid = wiz.parse(
+            t,
+            "(PRINT (MULT ID (VEC (MULT INT %x:INT) INT INT)))",
+            labels)
+        self.assertTrue(valid)
+        node = labels.get("x")
+
+        expecting = True
+        found = TreeParser._inContext(adaptor, self.tokenNames, node, "PRINT ... VEC ...")
+        self.assertEqual(expecting, found)
+
+
+    def testChain(self):
+        tree = "(PRINT (MULT ID[x] (VEC (MULT INT[9] INT[1]) INT[2] INT[3])))"
+        adaptor = CommonTreeAdaptor()
+        wiz = TreeWizard(adaptor, self.tokenNames)
+        t = wiz.create(tree)
+
+        labels = {}
+        valid = wiz.parse(
+            t,
+            "(PRINT (MULT ID (VEC (MULT INT %x:INT) INT INT)))",
+            labels)
+        self.assertTrue(valid)
+        node = labels.get("x")
+
+        expecting = True
+        found = TreeParser._inContext(adaptor, self.tokenNames, node, "PRINT MULT VEC MULT")
+        self.assertEqual(expecting, found)
+
+
+    ## TEST INVALID CONTEXTS
+
+    def testNotParent(self):
+        tree = "(PRINT (MULT ID[x] (VEC (MULT INT[9] INT[1]) INT[2] INT[3])))"
+        adaptor = CommonTreeAdaptor()
+        wiz = TreeWizard(adaptor, self.tokenNames)
+        t = wiz.create(tree)
+
+        labels = {}
+        valid = wiz.parse(
+            t,
+            "(PRINT (MULT ID (VEC (MULT INT %x:INT) INT INT)))",
+            labels)
+        self.assertTrue(valid)
+        node = labels.get("x")
+
+        expecting = False
+        found = TreeParser._inContext(adaptor, self.tokenNames, node, "VEC")
+        self.assertEqual(expecting, found)
+
+
+    def testMismatch(self):
+        tree = "(PRINT (MULT ID[x] (VEC (MULT INT[9] INT[1]) INT[2] INT[3])))"
+        adaptor = CommonTreeAdaptor()
+        wiz = TreeWizard(adaptor, self.tokenNames)
+        t = wiz.create(tree)
+
+        labels = {}
+        valid = wiz.parse(
+            t,
+            "(PRINT (MULT ID (VEC (MULT INT %x:INT) INT INT)))",
+            labels)
+        self.assertTrue(valid)
+        node = labels.get("x")
+
+        expecting = False
+        ## missing MULT
+        found = TreeParser._inContext(adaptor, self.tokenNames, node, "PRINT VEC MULT")
+        self.assertEqual(expecting, found)
+
+
+    def testMismatch2(self):
+        tree = "(PRINT (MULT ID[x] (VEC (MULT INT[9] INT[1]) INT[2] INT[3])))"
+        adaptor = CommonTreeAdaptor()
+        wiz = TreeWizard(adaptor, self.tokenNames)
+        t = wiz.create(tree)
+
+        labels = {}
+        valid = wiz.parse(
+            t,
+            "(PRINT (MULT ID (VEC (MULT INT %x:INT) INT INT)))",
+            labels)
+        self.assertTrue(valid)
+        node = labels.get("x")
+
+        expecting = False
+        found = TreeParser._inContext(adaptor, self.tokenNames, node, "PRINT VEC ...")
+        self.assertEqual(expecting, found)
+
+
+    def testMismatch3(self):
+        tree = "(PRINT (MULT ID[x] (VEC (MULT INT[9] INT[1]) INT[2] INT[3])))"
+        adaptor = CommonTreeAdaptor()
+        wiz = TreeWizard(adaptor, self.tokenNames)
+        t = wiz.create(tree)
+
+        labels = {}
+        valid = wiz.parse(
+            t,
+            "(PRINT (MULT ID (VEC (MULT INT %x:INT) INT INT)))",
+            labels)
+        self.assertTrue(valid)
+        node = labels.get("x")
+
+        expecting = False
+        found = TreeParser._inContext(adaptor, self.tokenNames, node, "VEC ... VEC MULT")
+        self.assertEqual(expecting, found)
+
+
+    def testDoubleEtc(self):
+        tree = "(PRINT (MULT ID[x] (VEC (MULT INT[9] INT[1]) INT[2] INT[3])))"
+        adaptor = CommonTreeAdaptor()
+        wiz = TreeWizard(adaptor, self.tokenNames)
+        t = wiz.create(tree)
+
+        labels = {}
+        valid = wiz.parse(
+            t,
+            "(PRINT (MULT ID (VEC (MULT INT %x:INT) INT INT)))",
+            labels)
+        self.assertTrue(valid)
+        node = labels.get("x")
+
+        self.assertRaisesRegex(
+            ValueError, r'invalid syntax: \.\.\. \.\.\.',
+            TreeParser._inContext, adaptor, self.tokenNames, node, "PRINT ... ... VEC")
+
+
+    def testDotDot(self):
+        tree = "(PRINT (MULT ID[x] (VEC (MULT INT[9] INT[1]) INT[2] INT[3])))"
+        adaptor = CommonTreeAdaptor()
+        wiz = TreeWizard(adaptor, self.tokenNames)
+        t = wiz.create(tree)
+
+        labels = {}
+        valid = wiz.parse(
+            t,
+            "(PRINT (MULT ID (VEC (MULT INT %x:INT) INT INT)))",
+            labels)
+        self.assertTrue(valid)
+        node = labels.get("x")
+
+        self.assertRaisesRegex(
+            ValueError, r'invalid syntax: \.\.',
+            TreeParser._inContext, adaptor, self.tokenNames, node, "PRINT .. VEC")
+
+
+class TestTreeVisitor(unittest.TestCase):
+    """Test of the TreeVisitor class."""
+
+    tokenNames = [
+        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "VEC", "ASSIGN", "PRINT",
+        "PLUS", "MULT", "DOT", "ID", "INT", "WS", "'['", "','", "']'"
+        ]
+
+    def testTreeVisitor(self):
+        tree = "(PRINT (MULT ID[x] (VEC (MULT INT[9] INT[1]) INT[2] INT[3])))"
+        adaptor = CommonTreeAdaptor()
+        wiz = TreeWizard(adaptor, self.tokenNames)
+        t = wiz.create(tree)
+
+        found = []
+        def pre(t):
+            found.append("pre({})".format(t))
+            return t
+        def post(t):
+            found.append("post({})".format(t))
+            return t
+
+        visitor = TreeVisitor(adaptor)
+        visitor.visit(t, pre, post)
+
+        expecting = [ "pre(PRINT)", "pre(MULT)", "pre(x)", "post(x)",
+                      "pre(VEC)", "pre(MULT)", "pre(9)", "post(9)", "pre(1)",
+                      "post(1)", "post(MULT)", "pre(2)", "post(2)", "pre(3)",
+                      "post(3)", "post(VEC)", "post(MULT)", "post(PRINT)" ]
+
+        self.assertEqual(expecting, found)
+
+
+class TestTreeIterator(unittest.TestCase):
+    tokens = [
+        "<invalid>", "<EOR>", "<DOWN>", "<UP>",
+        "A", "B", "C", "D", "E", "F", "G" ]
+
+    def testNode(self):
+        adaptor = CommonTreeAdaptor()
+        wiz = TreeWizard(adaptor, self.tokens)
+        t = wiz.create("A")
+        it = TreeIterator(t)
+        expecting = "A EOF"
+        found = self.toString(it)
+        self.assertEqual(expecting, found)
+
+
+    def testFlatAB(self):
+        adaptor = CommonTreeAdaptor()
+        wiz = TreeWizard(adaptor, self.tokens)
+        t = wiz.create("(nil A B)")
+        it = TreeIterator(t)
+        expecting = "nil DOWN A B UP EOF"
+        found = self.toString(it)
+        self.assertEqual(expecting, found)
+
+
+    def testAB(self):
+        adaptor = CommonTreeAdaptor()
+        wiz = TreeWizard(adaptor, self.tokens)
+        t = wiz.create("(A B)")
+        it = TreeIterator(t)
+        expecting = "A DOWN B UP EOF"
+        found = self.toString(it)
+        self.assertEqual(expecting, found)
+
+
+    def testABC(self):
+        adaptor = CommonTreeAdaptor()
+        wiz = TreeWizard(adaptor, self.tokens)
+        t = wiz.create("(A B C)")
+        it = TreeIterator(t)
+        expecting = "A DOWN B C UP EOF"
+        found = self.toString(it)
+        self.assertEqual(expecting, found)
+
+
+    def testVerticalList(self):
+        adaptor = CommonTreeAdaptor()
+        wiz = TreeWizard(adaptor, self.tokens)
+        t = wiz.create("(A (B C))")
+        it = TreeIterator(t)
+        expecting = "A DOWN B DOWN C UP UP EOF"
+        found = self.toString(it)
+        self.assertEqual(expecting, found)
+
+
+    def testComplex(self):
+        adaptor = CommonTreeAdaptor()
+        wiz = TreeWizard(adaptor, self.tokens)
+        t = wiz.create("(A (B (C D E) F) G)")
+        it = TreeIterator(t)
+        expecting = "A DOWN B DOWN C DOWN D E UP F UP G UP EOF"
+        found = self.toString(it)
+        self.assertEqual(expecting, found)
+
+
+    def testReset(self):
+        adaptor = CommonTreeAdaptor()
+        wiz = TreeWizard(adaptor, self.tokens)
+        t = wiz.create("(A (B (C D E) F) G)")
+        it = TreeIterator(t)
+        expecting = "A DOWN B DOWN C DOWN D E UP F UP G UP EOF"
+        found = self.toString(it)
+        self.assertEqual(expecting, found)
+
+        it.reset()
+        expecting = "A DOWN B DOWN C DOWN D E UP F UP G UP EOF"
+        found = self.toString(it)
+        self.assertEqual(expecting, found)
+
+
+    def toString(self, it):
+        buf = []
+        for n in it:
+            buf.append(str(n))
+
+        return ' '.join(buf)
+
+
+if __name__ == "__main__":
+    unittest.main(testRunner=unittest.TextTestRunner(verbosity=2))
diff --git a/runtime/Python3/unittests/testtreewizard.py b/runtime/Python3/unittests/testtreewizard.py
new file mode 100644
index 0000000..5ffaa4d
--- /dev/null
+++ b/runtime/Python3/unittests/testtreewizard.py
@@ -0,0 +1,689 @@
+
+from io import StringIO
+import os
+import unittest
+
+from antlr3.tree import CommonTreeAdaptor, CommonTree, INVALID_TOKEN_TYPE
+from antlr3.treewizard import TreeWizard, computeTokenTypes, \
+     TreePatternLexer, EOF, ID, BEGIN, END, PERCENT, COLON, DOT, ARG, \
+     TreePatternParser, \
+     TreePattern, WildcardTreePattern, TreePatternTreeAdaptor
+
+
+class TestComputeTokenTypes(unittest.TestCase):
+    """Test case for the computeTokenTypes function."""
+
+    def testNone(self):
+        """computeTokenTypes(None) -> {}"""
+
+        typeMap = computeTokenTypes(None)
+        self.assertIsInstance(typeMap, dict)
+        self.assertEqual(typeMap, {})
+
+
+    def testList(self):
+        """computeTokenTypes(['a', 'b']) -> { 'a': 0, 'b': 1 }"""
+
+        typeMap = computeTokenTypes(['a', 'b'])
+        self.assertIsInstance(typeMap, dict)
+        self.assertEqual(typeMap, { 'a': 0, 'b': 1 })
+
+
+class TestTreePatternLexer(unittest.TestCase):
+    """Test case for the TreePatternLexer class."""
+
+    def testBegin(self):
+        """TreePatternLexer(): '('"""
+
+        lexer = TreePatternLexer('(')
+        type = lexer.nextToken()
+        self.assertEqual(type, BEGIN)
+        self.assertEqual(lexer.sval, '')
+        self.assertFalse(lexer.error)
+
+
+    def testEnd(self):
+        """TreePatternLexer(): ')'"""
+
+        lexer = TreePatternLexer(')')
+        type = lexer.nextToken()
+        self.assertEqual(type, END)
+        self.assertEqual(lexer.sval, '')
+        self.assertFalse(lexer.error)
+
+
+    def testPercent(self):
+        """TreePatternLexer(): '%'"""
+
+        lexer = TreePatternLexer('%')
+        type = lexer.nextToken()
+        self.assertEqual(type, PERCENT)
+        self.assertEqual(lexer.sval, '')
+        self.assertFalse(lexer.error)
+
+
+    def testDot(self):
+        """TreePatternLexer(): '.'"""
+
+        lexer = TreePatternLexer('.')
+        type = lexer.nextToken()
+        self.assertEqual(type, DOT)
+        self.assertEqual(lexer.sval, '')
+        self.assertFalse(lexer.error)
+
+
+    def testColon(self):
+        """TreePatternLexer(): ':'"""
+
+        lexer = TreePatternLexer(':')
+        type = lexer.nextToken()
+        self.assertEqual(type, COLON)
+        self.assertEqual(lexer.sval, '')
+        self.assertFalse(lexer.error)
+
+
+    def testEOF(self):
+        """TreePatternLexer(): EOF"""
+
+        lexer = TreePatternLexer('  \n \r \t ')
+        type = lexer.nextToken()
+        self.assertEqual(type, EOF)
+        self.assertEqual(lexer.sval, '')
+        self.assertFalse(lexer.error)
+
+
+    def testID(self):
+        """TreePatternLexer(): ID"""
+
+        lexer = TreePatternLexer('_foo12_bar')
+        type = lexer.nextToken()
+        self.assertEqual(type, ID)
+        self.assertEqual(lexer.sval, '_foo12_bar')
+        self.assertFalse(lexer.error)
+
+
+    def testARG(self):
+        """TreePatternLexer(): ARG"""
+
+        lexer = TreePatternLexer(r'[ \]bla\n]')
+        type = lexer.nextToken()
+        self.assertEqual(type, ARG)
+        self.assertEqual(lexer.sval, r' ]bla\n')
+        self.assertFalse(lexer.error)
+
+
+    def testError(self):
+        """TreePatternLexer(): error"""
+
+        lexer = TreePatternLexer('1')
+        type = lexer.nextToken()
+        self.assertEqual(type, EOF)
+        self.assertEqual(lexer.sval, '')
+        self.assertTrue(lexer.error)
+
+
+class TestTreePatternParser(unittest.TestCase):
+    """Test case for the TreePatternParser class."""
+
+    def setUp(self):
+        """Setup text fixure
+
+        We need a tree adaptor, use CommonTreeAdaptor.
+        And a constant list of token names.
+
+        """
+
+        self.adaptor = CommonTreeAdaptor()
+        self.tokens = [
+            "", "", "", "", "", "A", "B", "C", "D", "E", "ID", "VAR"
+            ]
+        self.wizard = TreeWizard(self.adaptor, tokenNames=self.tokens)
+
+
+    def testSingleNode(self):
+        """TreePatternParser: 'ID'"""
+        lexer = TreePatternLexer('ID')
+        parser = TreePatternParser(lexer, self.wizard, self.adaptor)
+        tree = parser.pattern()
+        self.assertIsInstance(tree, CommonTree)
+        self.assertEqual(tree.getType(), 10)
+        self.assertEqual(tree.getText(), 'ID')
+
+
+    def testSingleNodeWithArg(self):
+        """TreePatternParser: 'ID[foo]'"""
+        lexer = TreePatternLexer('ID[foo]')
+        parser = TreePatternParser(lexer, self.wizard, self.adaptor)
+        tree = parser.pattern()
+        self.assertIsInstance(tree, CommonTree)
+        self.assertEqual(tree.getType(), 10)
+        self.assertEqual(tree.getText(), 'foo')
+
+
+    def testSingleLevelTree(self):
+        """TreePatternParser: '(A B)'"""
+        lexer = TreePatternLexer('(A B)')
+        parser = TreePatternParser(lexer, self.wizard, self.adaptor)
+        tree = parser.pattern()
+        self.assertIsInstance(tree, CommonTree)
+        self.assertEqual(tree.getType(), 5)
+        self.assertEqual(tree.getText(), 'A')
+        self.assertEqual(tree.getChildCount(), 1)
+        self.assertEqual(tree.getChild(0).getType(), 6)
+        self.assertEqual(tree.getChild(0).getText(), 'B')
+
+
+    def testNil(self):
+        """TreePatternParser: 'nil'"""
+        lexer = TreePatternLexer('nil')
+        parser = TreePatternParser(lexer, self.wizard, self.adaptor)
+        tree = parser.pattern()
+        self.assertIsInstance(tree, CommonTree)
+        self.assertEqual(tree.getType(), 0)
+        self.assertIsNone(tree.getText())
+
+
+    def testWildcard(self):
+        """TreePatternParser: '(.)'"""
+        lexer = TreePatternLexer('(.)')
+        parser = TreePatternParser(lexer, self.wizard, self.adaptor)
+        tree = parser.pattern()
+        self.assertIsInstance(tree, WildcardTreePattern)
+
+
+    def testLabel(self):
+        """TreePatternParser: '(%a:A)'"""
+        lexer = TreePatternLexer('(%a:A)')
+        parser = TreePatternParser(lexer, self.wizard, TreePatternTreeAdaptor())
+        tree = parser.pattern()
+        self.assertIsInstance(tree, TreePattern)
+        self.assertEqual(tree.label, 'a')
+
+
+    def testError1(self):
+        """TreePatternParser: ')'"""
+        lexer = TreePatternLexer(')')
+        parser = TreePatternParser(lexer, self.wizard, self.adaptor)
+        tree = parser.pattern()
+        self.assertIsNone(tree)
+
+
+    def testError2(self):
+        """TreePatternParser: '()'"""
+        lexer = TreePatternLexer('()')
+        parser = TreePatternParser(lexer, self.wizard, self.adaptor)
+        tree = parser.pattern()
+        self.assertIsNone(tree)
+
+
+    def testError3(self):
+        """TreePatternParser: '(A ])'"""
+        lexer = TreePatternLexer('(A ])')
+        parser = TreePatternParser(lexer, self.wizard, self.adaptor)
+        tree = parser.pattern()
+        self.assertIsNone(tree)
+
+
+class TestTreeWizard(unittest.TestCase):
+    """Test case for the TreeWizard class."""
+
+    def setUp(self):
+        """Setup text fixure
+
+        We need a tree adaptor, use CommonTreeAdaptor.
+        And a constant list of token names.
+
+        """
+
+        self.adaptor = CommonTreeAdaptor()
+        self.tokens = [
+            "", "", "", "", "", "A", "B", "C", "D", "E", "ID", "VAR"
+            ]
+
+
+    def testInit(self):
+        """TreeWizard.__init__()"""
+
+        wiz = TreeWizard(
+            self.adaptor,
+            tokenNames=['a', 'b']
+            )
+
+        self.assertIs(wiz.adaptor, self.adaptor)
+        self.assertEqual(
+            wiz.tokenNameToTypeMap,
+            { 'a': 0, 'b': 1 }
+            )
+
+
+    def testGetTokenType(self):
+        """TreeWizard.getTokenType()"""
+
+        wiz = TreeWizard(
+            self.adaptor,
+            tokenNames=self.tokens
+            )
+
+        self.assertEqual(
+            wiz.getTokenType('A'),
+            5
+            )
+
+        self.assertEqual(
+            wiz.getTokenType('VAR'),
+            11
+            )
+
+        self.assertEqual(
+            wiz.getTokenType('invalid'),
+            INVALID_TOKEN_TYPE
+            )
+
+    def testSingleNode(self):
+        wiz = TreeWizard(self.adaptor, self.tokens)
+        t = wiz.create("ID")
+        found = t.toStringTree()
+        expecting = "ID"
+        self.assertEqual(expecting, found)
+
+
+    def testSingleNodeWithArg(self):
+        wiz = TreeWizard(self.adaptor, self.tokens)
+        t = wiz.create("ID[foo]")
+        found = t.toStringTree()
+        expecting = "foo"
+        self.assertEqual(expecting, found)
+
+
+    def testSingleNodeTree(self):
+        wiz = TreeWizard(self.adaptor, self.tokens)
+        t = wiz.create("(A)")
+        found = t.toStringTree()
+        expecting = "A"
+        self.assertEqual(expecting, found)
+
+
+    def testSingleLevelTree(self):
+        wiz = TreeWizard(self.adaptor, self.tokens)
+        t = wiz.create("(A B C D)")
+        found = t.toStringTree()
+        expecting = "(A B C D)"
+        self.assertEqual(expecting, found)
+
+
+    def testListTree(self):
+        wiz = TreeWizard(self.adaptor, self.tokens)
+        t = wiz.create("(nil A B C)")
+        found = t.toStringTree()
+        expecting = "A B C"
+        self.assertEqual(expecting, found)
+
+
+    def testInvalidListTree(self):
+        wiz = TreeWizard(self.adaptor, self.tokens)
+        t = wiz.create("A B C")
+        self.assertIsNone(t)
+
+
+    def testDoubleLevelTree(self):
+        wiz = TreeWizard(self.adaptor, self.tokens)
+        t = wiz.create("(A (B C) (B D) E)")
+        found = t.toStringTree()
+        expecting = "(A (B C) (B D) E)"
+        self.assertEqual(expecting, found)
+
+
+    def __simplifyIndexMap(self, indexMap):
+        return dict( # stringify nodes for easy comparing
+            (ttype, [str(node) for node in nodes])
+            for ttype, nodes in indexMap.items()
+            )
+
+    def testSingleNodeIndex(self):
+        wiz = TreeWizard(self.adaptor, self.tokens)
+        tree = wiz.create("ID")
+        indexMap = wiz.index(tree)
+        found = self.__simplifyIndexMap(indexMap)
+        expecting = { 10: ["ID"] }
+        self.assertEqual(expecting, found)
+
+
+    def testNoRepeatsIndex(self):
+        wiz = TreeWizard(self.adaptor, self.tokens)
+        tree = wiz.create("(A B C D)")
+        indexMap = wiz.index(tree)
+        found = self.__simplifyIndexMap(indexMap)
+        expecting = { 8:['D'], 6:['B'], 7:['C'], 5:['A'] }
+        self.assertEqual(expecting, found)
+
+
+    def testRepeatsIndex(self):
+        wiz = TreeWizard(self.adaptor, self.tokens)
+        tree = wiz.create("(A B (A C B) B D D)")
+        indexMap = wiz.index(tree)
+        found = self.__simplifyIndexMap(indexMap)
+        expecting = { 8: ['D', 'D'], 6: ['B', 'B', 'B'], 7: ['C'], 5: ['A', 'A'] }
+        self.assertEqual(expecting, found)
+
+
+    def testNoRepeatsVisit(self):
+        wiz = TreeWizard(self.adaptor, self.tokens)
+        tree = wiz.create("(A B C D)")
+
+        elements = []
+        def visitor(node, parent, childIndex, labels):
+            elements.append(str(node))
+
+        wiz.visit(tree, wiz.getTokenType("B"), visitor)
+
+        expecting = ['B']
+        self.assertEqual(expecting, elements)
+
+
+    def testNoRepeatsVisit2(self):
+        wiz = TreeWizard(self.adaptor, self.tokens)
+        tree = wiz.create("(A B (A C B) B D D)")
+
+        elements = []
+        def visitor(node, parent, childIndex, labels):
+            elements.append(str(node))
+
+        wiz.visit(tree, wiz.getTokenType("C"), visitor)
+
+        expecting = ['C']
+        self.assertEqual(expecting, elements)
+
+
+    def testRepeatsVisit(self):
+        wiz = TreeWizard(self.adaptor, self.tokens)
+        tree = wiz.create("(A B (A C B) B D D)")
+
+        elements = []
+        def visitor(node, parent, childIndex, labels):
+            elements.append(str(node))
+
+        wiz.visit(tree, wiz.getTokenType("B"), visitor)
+
+        expecting = ['B', 'B', 'B']
+        self.assertEqual(expecting, elements)
+
+
+    def testRepeatsVisit2(self):
+        wiz = TreeWizard(self.adaptor, self.tokens)
+        tree = wiz.create("(A B (A C B) B D D)")
+
+        elements = []
+        def visitor(node, parent, childIndex, labels):
+            elements.append(str(node))
+
+        wiz.visit(tree, wiz.getTokenType("A"), visitor)
+
+        expecting = ['A', 'A']
+        self.assertEqual(expecting, elements)
+
+
+    def testRepeatsVisitWithContext(self):
+        wiz = TreeWizard(self.adaptor, self.tokens)
+        tree = wiz.create("(A B (A C B) B D D)")
+
+        elements = []
+        def visitor(node, parent, childIndex, labels):
+            elements.append('{}@{}[{}]'.format(node, parent, childIndex))
+
+        wiz.visit(tree, wiz.getTokenType("B"), visitor)
+
+        expecting = ['B@A[0]', 'B@A[1]', 'B@A[2]']
+        self.assertEqual(expecting, elements)
+
+
+    def testRepeatsVisitWithNullParentAndContext(self):
+        wiz = TreeWizard(self.adaptor, self.tokens)
+        tree = wiz.create("(A B (A C B) B D D)")
+
+        elements = []
+        def visitor(node, parent, childIndex, labels):
+            elements.append(
+                '{}@{}[{}]'.format(
+                    node, parent or 'nil', childIndex)
+                )
+
+        wiz.visit(tree, wiz.getTokenType("A"), visitor)
+
+        expecting = ['A@nil[0]', 'A@A[1]']
+        self.assertEqual(expecting, elements)
+
+
+    def testVisitPattern(self):
+        wiz = TreeWizard(self.adaptor, self.tokens)
+        tree = wiz.create("(A B C (A B) D)")
+
+        elements = []
+        def visitor(node, parent, childIndex, labels):
+            elements.append(
+                str(node)
+                )
+
+        wiz.visit(tree, '(A B)', visitor)
+
+        expecting = ['A'] # shouldn't match overall root, just (A B)
+        self.assertEqual(expecting, elements)
+
+
+    def testVisitPatternMultiple(self):
+        wiz = TreeWizard(self.adaptor, self.tokens)
+        tree = wiz.create("(A B C (A B) (D (A B)))")
+
+        elements = []
+        def visitor(node, parent, childIndex, labels):
+            elements.append(
+                '{}@{}[{}]'.format(node, parent or 'nil', childIndex)
+                )
+
+        wiz.visit(tree, '(A B)', visitor)
+
+        expecting = ['A@A[2]', 'A@D[0]']
+        self.assertEqual(expecting, elements)
+
+
+    def testVisitPatternMultipleWithLabels(self):
+        wiz = TreeWizard(self.adaptor, self.tokens)
+        tree = wiz.create("(A B C (A[foo] B[bar]) (D (A[big] B[dog])))")
+
+        elements = []
+        def visitor(node, parent, childIndex, labels):
+            elements.append(
+                '{}@{}[{}]{}&{}'.format(
+                    node,
+                    parent or 'nil',
+                    childIndex,
+                    labels['a'],
+                    labels['b'],
+                    )
+                )
+
+        wiz.visit(tree, '(%a:A %b:B)', visitor)
+
+        expecting = ['foo@A[2]foo&bar', 'big@D[0]big&dog']
+        self.assertEqual(expecting, elements)
+
+
+    def testParse(self):
+        wiz = TreeWizard(self.adaptor, self.tokens)
+        t = wiz.create("(A B C)")
+        valid = wiz.parse(t, "(A B C)")
+        self.assertTrue(valid)
+
+
+    def testParseSingleNode(self):
+        wiz = TreeWizard(self.adaptor, self.tokens)
+        t = wiz.create("A")
+        valid = wiz.parse(t, "A")
+        self.assertTrue(valid)
+
+
+    def testParseSingleNodeFails(self):
+        wiz = TreeWizard(self.adaptor, self.tokens)
+        t = wiz.create("A")
+        valid = wiz.parse(t, "B")
+        self.assertFalse(valid)
+
+
+    def testParseFlatTree(self):
+        wiz = TreeWizard(self.adaptor, self.tokens)
+        t = wiz.create("(nil A B C)")
+        valid = wiz.parse(t, "(nil A B C)")
+        self.assertTrue(valid)
+
+
+    def testParseFlatTreeFails(self):
+        wiz = TreeWizard(self.adaptor, self.tokens)
+        t = wiz.create("(nil A B C)")
+        valid = wiz.parse(t, "(nil A B)")
+        self.assertFalse(valid)
+
+
+    def testParseFlatTreeFails2(self):
+        wiz = TreeWizard(self.adaptor, self.tokens)
+        t = wiz.create("(nil A B C)")
+        valid = wiz.parse(t, "(nil A B A)")
+        self.assertFalse(valid)
+
+
+    def testWildcard(self):
+        wiz = TreeWizard(self.adaptor, self.tokens)
+        t = wiz.create("(A B C)")
+        valid = wiz.parse(t, "(A . .)")
+        self.assertTrue(valid)
+
+
+    def testParseWithText(self):
+        wiz = TreeWizard(self.adaptor, self.tokens)
+        t = wiz.create("(A B[foo] C[bar])")
+        # C pattern has no text arg so despite [bar] in t, no need
+        # to match text--check structure only.
+        valid = wiz.parse(t, "(A B[foo] C)")
+        self.assertTrue(valid)
+
+
+    def testParseWithText2(self):
+        wiz = TreeWizard(self.adaptor, self.tokens)
+        t = wiz.create("(A B[T__32] (C (D E[a])))")
+        # C pattern has no text arg so despite [bar] in t, no need
+        # to match text--check structure only.
+        valid = wiz.parse(t, "(A B[foo] C)")
+        self.assertEqual("(A T__32 (C (D a)))", t.toStringTree())
+
+
+    def testParseWithTextFails(self):
+        wiz = TreeWizard(self.adaptor, self.tokens)
+        t = wiz.create("(A B C)")
+        valid = wiz.parse(t, "(A[foo] B C)")
+        self.assertFalse(valid) # fails
+
+
+    def testParseLabels(self):
+        wiz = TreeWizard(self.adaptor, self.tokens)
+        t = wiz.create("(A B C)")
+        labels = {}
+        valid = wiz.parse(t, "(%a:A %b:B %c:C)", labels)
+        self.assertTrue(valid)
+        self.assertEqual("A", str(labels["a"]))
+        self.assertEqual("B", str(labels["b"]))
+        self.assertEqual("C", str(labels["c"]))
+
+
+    def testParseWithWildcardLabels(self):
+        wiz = TreeWizard(self.adaptor, self.tokens)
+        t = wiz.create("(A B C)")
+        labels = {}
+        valid = wiz.parse(t, "(A %b:. %c:.)", labels)
+        self.assertTrue(valid)
+        self.assertEqual("B", str(labels["b"]))
+        self.assertEqual("C", str(labels["c"]))
+
+
+    def testParseLabelsAndTestText(self):
+        wiz = TreeWizard(self.adaptor, self.tokens)
+        t = wiz.create("(A B[foo] C)")
+        labels = {}
+        valid = wiz.parse(t, "(%a:A %b:B[foo] %c:C)", labels)
+        self.assertTrue(valid)
+        self.assertEqual("A", str(labels["a"]))
+        self.assertEqual("foo", str(labels["b"]))
+        self.assertEqual("C", str(labels["c"]))
+
+
+    def testParseLabelsInNestedTree(self):
+        wiz = TreeWizard(self.adaptor, self.tokens)
+        t = wiz.create("(A (B C) (D E))")
+        labels = {}
+        valid = wiz.parse(t, "(%a:A (%b:B %c:C) (%d:D %e:E) )", labels)
+        self.assertTrue(valid)
+        self.assertEqual("A", str(labels["a"]))
+        self.assertEqual("B", str(labels["b"]))
+        self.assertEqual("C", str(labels["c"]))
+        self.assertEqual("D", str(labels["d"]))
+        self.assertEqual("E", str(labels["e"]))
+
+
+    def testEquals(self):
+        wiz = TreeWizard(self.adaptor, self.tokens)
+        t1 = wiz.create("(A B C)")
+        t2 = wiz.create("(A B C)")
+        same = wiz.equals(t1, t2)
+        self.assertTrue(same)
+
+
+    def testEqualsWithText(self):
+        wiz = TreeWizard(self.adaptor, self.tokens)
+        t1 = wiz.create("(A B[foo] C)")
+        t2 = wiz.create("(A B[foo] C)")
+        same = wiz.equals(t1, t2)
+        self.assertTrue(same)
+
+
+    def testEqualsWithMismatchedText(self):
+        wiz = TreeWizard(self.adaptor, self.tokens)
+        t1 = wiz.create("(A B[foo] C)")
+        t2 = wiz.create("(A B C)")
+        same = wiz.equals(t1, t2)
+        self.assertFalse(same)
+
+
+    def testEqualsWithMismatchedList(self):
+        wiz = TreeWizard(self.adaptor, self.tokens)
+        t1 = wiz.create("(A B C)")
+        t2 = wiz.create("(A B A)")
+        same = wiz.equals(t1, t2)
+        self.assertFalse(same)
+
+
+    def testEqualsWithMismatchedListLength(self):
+        wiz = TreeWizard(self.adaptor, self.tokens)
+        t1 = wiz.create("(A B C)")
+        t2 = wiz.create("(A B)")
+        same = wiz.equals(t1, t2)
+        self.assertFalse(same)
+
+
+    def testFindPattern(self):
+        wiz = TreeWizard(self.adaptor, self.tokens)
+        t = wiz.create("(A B C (A[foo] B[bar]) (D (A[big] B[dog])))")
+        subtrees = wiz.find(t, "(A B)")
+        found = [str(node) for node in subtrees]
+        expecting = ['foo', 'big']
+        self.assertEqual(expecting, found)
+
+
+    def testFindTokenType(self):
+        wiz = TreeWizard(self.adaptor, self.tokens)
+        t = wiz.create("(A B C (A[foo] B[bar]) (D (A[big] B[dog])))")
+        subtrees = wiz.find(t, wiz.getTokenType('A'))
+        found = [str(node) for node in subtrees]
+        expecting = ['A', 'foo', 'big']
+        self.assertEqual(expecting, found)
+
+
+
+if __name__ == "__main__":
+    unittest.main(testRunner=unittest.TextTestRunner(verbosity=2))
diff --git a/tool/CHANGES.txt b/tool/CHANGES.txt
index f7415f0..0770dcb 100644
--- a/tool/CHANGES.txt
+++ b/tool/CHANGES.txt
@@ -1,5 +1,5 @@
-ANTLR 3.4 Release
-July 18, 2011
+ANTLR 3.5 Release
+January 4, 2012
 
 Terence Parr, parrt at cs usfca edu
 ANTLR project lead and supreme dictator for life
@@ -7,6 +7,77 @@
 
 CHANGES
 
+January 4 2012 -- release 3.5
+
+January 3, 2012
+
+* Improve error reporting and recovery for STRAY_BRACKET, fixes antlr/antlr3#42
+* Do not write output files if errors were reported, fixes antlr/antlr3#61
+* Fix AST operator on labeled set of terminals e.g. x=(A|B)^
+* Fix labeled set of terminals with rewrite e.g. x=(A|B) -> $x
+
+December 1, 2012
+
+* Added error msg for .. in parser
+
+September 17, 2012
+
+* Add Gokulakannan Somasundaram's C++ target based upon C target.
+  Use language=Cpp in options. It's a header-only library, runtime/Cpp/include,
+  so installation is not required.
+
+September 16, 2012
+
+* Python 3.3 target added by Benjamin Wolf based upon Python 2 target
+  https://github.com/antlr/antlr3/pull/23
+
+September 15, 2012
+
+* LookaheadStream bug fixes;
+  https://github.com/antlr/antlr3/pull/21
+
+* Pulled "Fix Python handling of syntactic predicates"
+  https://github.com/antlr/antlr3/pull/33
+
+July 15, 2012
+
+* GUnit improvements
+  https://github.com/antlr/antlr3/pull/27
+
+May 2012:
+
+* ANTLR3 update of ObjC runtime to go with latest ST4-ObjC
+  https://github.com/antlr/antlr3/pull/17
+
+August 9, 2012
+
+* Provide Lexer get end of file method so people can override it.
+
+November 25, 2011
+
+* stderr not test correctly in gunit examineExecResult
+
+October 27, 2011
+
+* Dieter Habelitz reported bug in java code gen with synpreds. labels were
+  being carried from grammar into synpreds but weren't typed properly (they
+  were "void x=null;" for x=ruleref labels)
+
+October 25, 2011
+
+* (Sam) Rule.setOption didn't do memoize option right.
+* (Sam) Fix labels in synpreds
+* (Sam) Fix input index for NoViableAltException during inline prediction
+* (Sam) Fix label aliasing errors in cases like (x=y|x=z)
+
+August 10, 2011
+
+* (Sam) fix stack overflow in semantic context analysis
+
+July 30, 2011
+
+* added range check to BaseTree.insertChild()
+
 July 18, 2011 -- release 3.4
 
 * Added tree method insertChild(int i, Object t).
diff --git a/tool/LICENSE.txt b/tool/LICENSE.txt
index e1cc972..a5216ef 100644
--- a/tool/LICENSE.txt
+++ b/tool/LICENSE.txt
@@ -1,5 +1,5 @@
 [The "BSD license"]
-Copyright (c) 201 Terence Parr
+Copyright (c) 2013 Terence Parr
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
diff --git a/tool/README.txt b/tool/README.txt
deleted file mode 100644
index ca5e198..0000000
--- a/tool/README.txt
+++ /dev/null
@@ -1,139 +0,0 @@
-ANTLR v3.4
-July 18, 2011
-
-Terence Parr, parrt at cs usfca edu
-ANTLR project lead and supreme dictator for life
-University of San Francisco
-
-INTRODUCTION
-
-Welcome to ANTLR v3!  ANTLR (ANother Tool for Language Recognition) is
-a language tool that provides a framework for constructing
-recognizers, interpreters, compilers, and translators from grammatical
-descriptions containing actions in a variety of target
-languages. ANTLR provides excellent support for tree construction,
-tree walking, translation, error recovery, and error reporting. I've
-been working on parser generators for 20 years and on this particular
-version of ANTLR for 7 years.
-
-You should use v3 in conjunction with ANTLRWorks:
-
-    http://www.antlr.org/works/index.html
-
-and gUnit (grammar unit testing tool included in distribution):
-
-    http://www.antlr.org/wiki/display/ANTLR3/gUnit+-+Grammar+Unit+Testing
-
-The book will also help you a great deal (printed May 15, 2007); you
-can also buy the PDF:
-
-    http://www.pragmaticprogrammer.com/titles/tpantlr/index.html
-
-2nd book, Language Implementation Patterns:
-
-    http://pragprog.com/titles/tpdsl/language-implementation-patterns
-
-See the getting started document:
-
-    http://www.antlr.org/wiki/display/ANTLR3/FAQ+-+Getting+Started
-
-You also have the examples plus the source to guide you.
-
-See the wiki FAQ:
-
-    http://www.antlr.org/wiki/display/ANTLR3/ANTLR+v3+FAQ
-
-and general doc root:
-
-    http://www.antlr.org/wiki/display/ANTLR3/ANTLR+3+Wiki+Home
-
-Please help add/update FAQ entries.
-
-If all else fails, you can buy support or ask the antlr-interest list:
-
-    http://www.antlr.org/support.html
-
-Per the license in LICENSE.txt, this software is not guaranteed to
-work and might even destroy all life on this planet:
-
-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.
-
-----------------------------------------------------------------------
-
-EXAMPLES
-
-ANTLR v3 sample grammars:
-
-    http://www.antlr.org/download/examples-v3.tar.gz
-
-Examples from Language Implementation Patterns:
-
-    http://www.pragprog.com/titles/tpdsl/source_code
-
-Also check out Mantra Programming Language for a prototype (work in
-progress) using v3:
-
-    http://www.linguamantra.org/
-
-----------------------------------------------------------------------
-
-What is ANTLR?
-
-ANTLR stands for (AN)other (T)ool for (L)anguage (R)ecognition
-and generates LL(*) recursive-descent parsers. ANTLR is a language tool
-that provides a framework for constructing recognizers, compilers, and
-translators from grammatical descriptions containing actions.
-Target language list:
-
-http://www.antlr.org/wiki/display/ANTLR3/Code+Generation+Targets
-
-----------------------------------------------------------------------
-
-How is ANTLR v3 different than ANTLR v2?
-
-See "What is the difference between ANTLR v2 and v3?"
-
-    http://www.antlr.org/wiki/pages/viewpage.action?pageId=719
-
-See migration guide:
-
-    http://www.antlr.org/wiki/display/ANTLR3/Migrating+from+ANTLR+2+to+ANTLR+3
-
-----------------------------------------------------------------------
-
-How do I install this damn thing?
-
-Just untar antlr-3.4.tar.gz and you'll get:
-
-antlr-3.4/BUILD.txt
-antlr-3.4/antlr3-maven-plugin
-antlr-3.4/antlrjar.xml
-antlr-3.4/antlrsources.xml
-antlr-3.4/gunit
-antlr-3.4/gunit-maven-plugin
-antlr-3.4/pom.xml
-antlr-3.4/runtime
-antlr-3.4/tool
-antlr-3.4/lib
-
-This is the source and java binaries.  You could grab the
-antlr-3.4-complete.jar file from the website, but it's in lib dir.
-It has all of the jars you need combined into one. Then you need to
-add antlr-3.4-complete.jar to your CLASSPATH or add
-to arg list; e.g., on unix:
-
-$ java -cp "/usr/local/lib/antlr-3.4-complete.jar:$CLASSPATH" org.antlr.Tool Test.g
-
-Please see the FAQ
-
-    http://www.antlr.org/wiki/display/ANTLR3/ANTLR+v3+FAQ
diff --git a/tool/pom.xml b/tool/pom.xml
index 60c3871..cc5134d 100644
--- a/tool/pom.xml
+++ b/tool/pom.xml
@@ -1,12 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
     <modelVersion>4.0.0</modelVersion>
-    <groupId>org.antlr</groupId>
     <artifactId>antlr</artifactId>
     <packaging>jar</packaging>
-    <name>ANTLR Grammar Tool v 3.4</name>
-    <url>http://antlr.org</url>
-
+    <name>ANTLR 3 Tool</name>
+    <description>The ANTLR 3 tool.</description>
 
   <!--
 
@@ -18,31 +16,10 @@
     <parent>
         <groupId>org.antlr</groupId>
         <artifactId>antlr-master</artifactId>
-        <version>3.4</version>
+        <version>3.5.2</version>
     </parent>
-    
-    <profiles>
-        <profile>
-            <id>uber</id>
-            <activation>
-                <property>
-                    <name>uber</name>
-                    <value>true</value>
-                </property>
-            </activation>
-            <dependencies>
-                <dependency>
-                    <groupId>org.antlr</groupId>
-                    <artifactId>gunit</artifactId>
-                    <version>${project.version}</version>
-                    <scope>runtime</scope>
-                </dependency>
-            </dependencies>
-        </profile>
-    </profiles>
-    
+
     <dependencies>
-        
         <dependency>
             <groupId>org.antlr</groupId>
             <artifactId>antlr-runtime</artifactId>
@@ -53,17 +30,22 @@
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
-            <version>4.8.2</version>
             <scope>test</scope>
         </dependency>
-        
+
         <dependency>
             <groupId>org.antlr</groupId>
             <artifactId>ST4</artifactId>
-            <version>4.0.4</version>
             <scope>compile</scope>
         </dependency>
-            
+
+        <dependency>
+            <groupId>org.antlr</groupId>
+            <artifactId>stringtemplate</artifactId>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+
     </dependencies>
   <!--
 
@@ -80,14 +62,12 @@
 
     <build>
 
-        <defaultGoal>install</defaultGoal>
-
         <plugins>
 
             <plugin>
                 <groupId>org.antlr</groupId>
                 <artifactId>antlr3-maven-plugin</artifactId>
-                <version>3.3</version>
+                <version>3.5</version>
                 <configuration>
                     <libDirectory>target/generated-sources/antlr/org/antlr/grammar/v3</libDirectory>
                 </configuration>
@@ -98,21 +78,11 @@
                         </goals>
                     </execution>
                 </executions>
+
             </plugin>
 
-            <plugin>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <version>2.3.2</version>
-                <configuration>
-                    <source>1.6</source>
-                    <target>jsr14</target>
-                    <sourceDirectory>src</sourceDirectory>
-                </configuration>
-            </plugin>
-
-
-            
         </plugins>
 
+
     </build>
 </project>
diff --git a/tool/src/main/antlr3/org/antlr/grammar/v3/ANTLR.g b/tool/src/main/antlr3/org/antlr/grammar/v3/ANTLR.g
index 6b4e60b..a501458 100644
--- a/tool/src/main/antlr3/org/antlr/grammar/v3/ANTLR.g
+++ b/tool/src/main/antlr3/org/antlr/grammar/v3/ANTLR.g
@@ -51,6 +51,7 @@
 
 options
 {
+	language=Java;
 	output=AST;
 	ASTLabelType=GrammarAST;
 }
@@ -134,6 +135,24 @@
 public void setFileName(String value) {
     fileName = value;
 }
+
+@Override
+public Token nextToken() {
+	Token token = super.nextToken();
+	while (token.getType() == STRAY_BRACKET) {
+		ErrorManager.syntaxError(
+			ErrorManager.MSG_SYNTAX_ERROR,
+			null,
+			token,
+			"antlr: dangling ']'? make sure to escape with \\]",
+			null);
+
+		// skip this token
+		token = super.nextToken();
+	}
+
+	return token;
+}
 }
 
 @parser::members {
@@ -175,18 +194,15 @@
     public boolean isNil() { return false; }
 
     @Override
-    public String getText()
-    {
+    public String getText() {
         String badText = null;
-        if (start instanceof Token) {
-            int i = ((Token)start).getTokenIndex();
-            int j = ((Token)stop).getTokenIndex();
-            if (((Token)stop).getType() == Token.EOF) {
-                j = ((TokenStream)input).size();
+        if (start != null) {
+            int i = start.getTokenIndex();
+            int j = stop.getTokenIndex();
+            if (stop.getType() == Token.EOF) {
+                j = input.size();
             }
             badText = ((TokenStream)input).toString(i, j);
-        } else if (start instanceof Tree) {
-            badText = ((TreeNodeStream)input).toString(start, stop);
         } else {
             // people should subclass if they alter the tree type so this
             // next one is for sure correct.
@@ -323,7 +339,7 @@
 }
 
 /** Rewrite alt to have a synpred as first element;
- *  (xxx)=>xxx
+ *  (xxx)=&gt;xxx
  *  but only if they didn't specify one manually.
  */
 protected void prefixWithSynPred( GrammarAST alt ) {
@@ -719,10 +735,10 @@
 {
 	IntSet elements=null;
 }
-	:	(	(	id (ASSIGN^|PLUS_ASSIGN^) (atom|block)
+	:	(	id (ASSIGN^|PLUS_ASSIGN^)
+			(	atom (sub=ebnfSuffix[root_0,false]! {root_0 = $sub.tree;})?
+			|	ebnf
 			)
-			(	sub=ebnfSuffix[root_0,false]! {root_0 = $sub.tree;}
-			)?
 		|	a=atom
 			(	sub2=ebnfSuffix[$a.tree,false]! {root_0=$sub2.tree;}
 			)?
@@ -799,9 +815,20 @@
 		)
 	;
 
-range
-	:	c1=CHAR_LITERAL RANGE c2=CHAR_LITERAL
+range!
+	:	{Rule.getRuleType(currentRuleName) == Grammar.LEXER}? =>
+	 	c1=CHAR_LITERAL RANGE c2=CHAR_LITERAL
 		-> ^(CHAR_RANGE[$c1,".."] $c1 $c2)
+	|	// range elsewhere is an error
+		(	t=TOKEN_REF r=RANGE TOKEN_REF
+		|	t=STRING_LITERAL r=RANGE STRING_LITERAL
+		|	t=CHAR_LITERAL r=RANGE CHAR_LITERAL
+		)
+		{
+		ErrorManager.syntaxError(
+			ErrorManager.MSG_RANGE_OP_ILLEGAL,grammar,$r,null,null);
+		}
+		-> $t // have to generate something for surrounding code, just return first token
 	;
 
 terminal
@@ -1139,14 +1166,6 @@
 
 STRAY_BRACKET
 	:	']'
-		{
-			ErrorManager.syntaxError(
-				ErrorManager.MSG_SYNTAX_ERROR,
-				null,
-				state.token,
-				"antlr: dangling ']'? make sure to escape with \\]",
-				null);
-		}
 	;
 
 CHAR_LITERAL
diff --git a/tool/src/main/antlr3/org/antlr/grammar/v3/ANTLRTreePrinter.g b/tool/src/main/antlr3/org/antlr/grammar/v3/ANTLRTreePrinter.g
index 0fbbfa0..d4032fc 100644
--- a/tool/src/main/antlr3/org/antlr/grammar/v3/ANTLRTreePrinter.g
+++ b/tool/src/main/antlr3/org/antlr/grammar/v3/ANTLRTreePrinter.g
@@ -40,6 +40,7 @@
 
 options
 {
+	language=Java;
 	tokenVocab = ANTLR;
 	ASTLabelType = GrammarAST;
 }
diff --git a/tool/src/main/antlr3/org/antlr/grammar/v3/ANTLRv3.g b/tool/src/main/antlr3/org/antlr/grammar/v3/ANTLRv3.g
index ff6cfa0..76c92e4 100644
--- a/tool/src/main/antlr3/org/antlr/grammar/v3/ANTLRv3.g
+++ b/tool/src/main/antlr3/org/antlr/grammar/v3/ANTLRv3.g
@@ -29,6 +29,7 @@
 grammar ANTLRv3;
 
 options {
+	language=Java;
 	output=AST;
 	ASTLabelType=CommonTree;
 }
diff --git a/tool/src/main/antlr3/org/antlr/grammar/v3/ANTLRv3Tree.g b/tool/src/main/antlr3/org/antlr/grammar/v3/ANTLRv3Tree.g
index f6b03d3..a660205 100644
--- a/tool/src/main/antlr3/org/antlr/grammar/v3/ANTLRv3Tree.g
+++ b/tool/src/main/antlr3/org/antlr/grammar/v3/ANTLRv3Tree.g
@@ -30,6 +30,7 @@
 tree grammar ANTLRv3Tree;
 
 options {
+	language=Java;
 	tokenVocab = ANTLRv3;
 	ASTLabelType = CommonTree;
 }
diff --git a/tool/src/main/antlr3/org/antlr/grammar/v3/ActionAnalysis.g b/tool/src/main/antlr3/org/antlr/grammar/v3/ActionAnalysis.g
index ed8bb21..4edcc54 100644
--- a/tool/src/main/antlr3/org/antlr/grammar/v3/ActionAnalysis.g
+++ b/tool/src/main/antlr3/org/antlr/grammar/v3/ActionAnalysis.g
@@ -35,6 +35,7 @@
  */
 lexer grammar ActionAnalysis;
 options {
+  language=Java;
   filter=true;  // try all non-fragment rules in order specified
 }
 
diff --git a/tool/src/main/antlr3/org/antlr/grammar/v3/ActionTranslator.g b/tool/src/main/antlr3/org/antlr/grammar/v3/ActionTranslator.g
index 0aca8b8..f4af2fa 100644
--- a/tool/src/main/antlr3/org/antlr/grammar/v3/ActionTranslator.g
+++ b/tool/src/main/antlr3/org/antlr/grammar/v3/ActionTranslator.g
@@ -27,6 +27,7 @@
 */
 lexer grammar ActionTranslator;
 options {
+  language=Java;
   filter=true;  // try all non-fragment rules in order specified
   // output=template;  TODO: can we make tokens return templates somehow?
 }
@@ -46,7 +47,7 @@
 }
 
 @members {
-public List chunks = new ArrayList();
+public List<Object> chunks = new ArrayList<Object>();
 Rule enclosingRule;
 int outerAltNum;
 Grammar grammar;
@@ -81,7 +82,7 @@
 /** Return a list of strings and ST objects that
  *  represent the translated action.
  */
-public List translateToChunks() {
+public List<Object> translateToChunks() {
 	// System.out.println("###\naction="+action);
 	Token t;
 	do {
@@ -91,11 +92,11 @@
 }
 
 public String translate() {
-	List theChunks = translateToChunks();
+	List<Object> theChunks = translateToChunks();
 	//System.out.println("chunks="+a.chunks);
-	StringBuffer buf = new StringBuffer();
+	StringBuilder buf = new StringBuilder();
 	for (int i = 0; i < theChunks.size(); i++) {
-		Object o = (Object) theChunks.get(i);
+		Object o = theChunks.get(i);
 		if ( o instanceof ST ) buf.append(((ST)o).render());
 		else buf.append(o);
 	}
@@ -103,7 +104,7 @@
 	return buf.toString();
 }
 
-public List translateAction(String action) {
+public List<Object> translateAction(String action) {
 	String rname = null;
 	if ( enclosingRule!=null ) {
 		rname = enclosingRule.name;
@@ -126,7 +127,7 @@
 }
 
 public void checkElementRefUniqueness(String ref, boolean isToken) {
-		List refs = null;
+		List<GrammarAST> refs = null;
 		if ( isToken ) {
 		    refs = enclosingRule.getTokenRefsInAlt(ref, outerAltNum);
 		}
diff --git a/tool/src/main/antlr3/org/antlr/grammar/v3/AssignTokenTypesWalker.g b/tool/src/main/antlr3/org/antlr/grammar/v3/AssignTokenTypesWalker.g
index 4d35c64..15ed503 100644
--- a/tool/src/main/antlr3/org/antlr/grammar/v3/AssignTokenTypesWalker.g
+++ b/tool/src/main/antlr3/org/antlr/grammar/v3/AssignTokenTypesWalker.g
@@ -68,21 +68,22 @@
  *  1. Finds a list of all literals and token names.
  *  2. Finds a list of all token name rule definitions;
  *     no token rules implies pure parser.
- *  3. Finds a list of all simple token rule defs of form "<NAME> : <literal>;"
+ *  3. Finds a list of all simple token rule defs of form "&lt;NAME&gt; : &lt;literal&gt;;"
  *     and aliases them.
  *  4. Walks token names table and assign types to any unassigned
  *  5. Walks aliases and assign types to referenced literals
  *  6. Walks literals, assigning types if untyped
  *  4. Informs the Grammar object of the type definitions such as:
- *     g.defineToken(<charliteral>, ttype);
- *     g.defineToken(<stringliteral>, ttype);
- *     g.defineToken(<tokenID>, ttype);
+ *     g.defineToken(&lt;charliteral&gt;, ttype);
+ *     g.defineToken(&lt;stringliteral&gt;, ttype);
+ *     g.defineToken(&lt;tokenID&gt;, ttype);
  *     where some of the ttype values will be the same for aliases tokens.
  */
 tree grammar AssignTokenTypesWalker;
 
 options
 {
+	language=Java;
 	tokenVocab = ANTLR;
 	ASTLabelType = GrammarAST;
 }
diff --git a/tool/src/main/antlr3/org/antlr/grammar/v3/CodeGenTreeWalker.g b/tool/src/main/antlr3/org/antlr/grammar/v3/CodeGenTreeWalker.g
index 7615833..9c107b5 100644
--- a/tool/src/main/antlr3/org/antlr/grammar/v3/CodeGenTreeWalker.g
+++ b/tool/src/main/antlr3/org/antlr/grammar/v3/CodeGenTreeWalker.g
@@ -40,6 +40,7 @@
 tree grammar CodeGenTreeWalker;
 
 options {
+	language=Java;
 	tokenVocab = ANTLR;
 	ASTLabelType=GrammarAST;
 }
@@ -409,7 +410,7 @@
 	// For syn preds, we don't want any AST code etc... in there.
 	// Save old templates ptr and restore later.  Base templates include Dbg.
 	STGroup saveGroup = templates;
-	if ( ruleDescr.isSynPred )
+	if ( ruleDescr.isSynPred && generator.target.useBaseTemplatesForSynPredFragments() )
 	{
 		templates = generator.getBaseTemplates();
 	}
@@ -425,7 +426,7 @@
 			( ^(OPTIONS .*) )?
 			(ruleScopeSpec)?
 			( ^(AMPERSAND .*) )*
-			b=block["ruleBlock", dfa]
+			b=block["ruleBlock", dfa, null]
 			{
 				description =
 					grammar.grammarTreeToString((GrammarAST)$start.getFirstChildWithType(BLOCK),
@@ -526,7 +527,7 @@
 	:	^( 'scope' ( ^(AMPERSAND .*) )* (ACTION)? ( ID )* )
 	;
 
-block[String blockTemplateName, org.antlr.analysis.DFA dfa]
+block[String blockTemplateName, org.antlr.analysis.DFA dfa, GrammarAST label]
 	 returns [ST code=null]
 options { k=1; }
 @init
@@ -565,7 +566,7 @@
 
 	|	^(  BLOCK
 			( ^(OPTIONS .*) )? // ignore
-			( alt=alternative rew=rewrite
+			( alt=alternative[$label] rew=rewrite
 				{
 					if ( this.blockNestingLevel==RULE_BLOCK_NESTING_LEVEL )
 					{
@@ -574,7 +575,7 @@
 					// add the rewrite code as just another element in the alt :)
 					// (unless it's a " -> ..." rewrite
 					// ( -> ... )
-					GrammarAST firstRewriteAST = (GrammarAST)$rew.start.findFirstType(REWRITE);
+					GrammarAST firstRewriteAST = $rew.start.findFirstType(REWRITE);
 					boolean etc =
 						$rew.start.getType()==REWRITES &&
 						firstRewriteAST.getChild(0)!=null &&
@@ -659,7 +660,7 @@
 exceptionHandler[ST ruleST]
 	:	^('catch' ARG_ACTION ACTION)
 		{
-			List chunks = generator.translateAction(currentRuleName,$ACTION);
+			List<? extends Object> chunks = generator.translateAction(currentRuleName,$ACTION);
 			$ruleST.addAggr("exceptions.{decl,action}",$ARG_ACTION.text,chunks);
 		}
 	;
@@ -667,12 +668,12 @@
 finallyClause[ST ruleST]
 	:	^('finally' ACTION)
 		{
-			List chunks = generator.translateAction(currentRuleName,$ACTION);
+			List<? extends Object> chunks = generator.translateAction(currentRuleName,$ACTION);
 			$ruleST.add("finally",chunks);
 		}
 	;
 
-alternative returns [ST code]
+alternative[GrammarAST label] returns [ST code]
 @init
 {
 	if ( state.backtracking == 0 )
@@ -695,9 +696,9 @@
 }
 	:	^(	a=ALT
 			(
-				e=element[null,null]
+				e=element[$label,null]
 				{
-					if (e != null && e.code != null)
+					if ($e.code != null)
 					{
 						$code.addAggr("elements.{el,line,pos}",
 										  $e.code,
@@ -718,14 +719,14 @@
 	IntSet elements=null;
 	GrammarAST ast = null;
 }
-	:	^(ROOT e=element[label,$ROOT])
+	:	^(ROOT e=element[$label,$ROOT])
 		{ $code = $e.code; }
 
-	|	^(BANG e=element[label,$BANG])
+	|	^(BANG e=element[$label,$BANG])
 		{ $code = $e.code; }
 
-	|	^( n=NOT notElement[$n, $label, $astSuffix] )
-		{ $code = $notElement.code; }
+	|	^( n=NOT ne=notElement[$n, $label, $astSuffix] )
+		{ $code = $ne.code; }
 
 	|	^( ASSIGN alabel=ID e=element[$alabel,$astSuffix] )
 		{ $code = $e.code; }
@@ -746,7 +747,7 @@
 			}
 		}
 
-	|	({((GrammarAST)input.LT(1)).getSetValue()==null}? (BLOCK|OPTIONAL|CLOSURE|POSITIVE_CLOSURE)) => /*{$start.getSetValue()==null}?*/ ebnf
+	|	({((GrammarAST)input.LT(1)).getSetValue()==null}? (BLOCK|OPTIONAL|CLOSURE|POSITIVE_CLOSURE)) => /*{$start.getSetValue()==null}?*/ ebnf[$label]
 		{ $code = $ebnf.code; }
 
 	|	atom[null, $label, $astSuffix]
@@ -851,24 +852,24 @@
 		}
 	;
 
-ebnf returns [ST code=null]
+ebnf[GrammarAST label] returns [ST code=null]
 @init
 {
 	org.antlr.analysis.DFA dfa=null;
 	GrammarAST b = (GrammarAST)$start.getChild(0);
-	GrammarAST eob = (GrammarAST)b.getLastChild(); // loops will use EOB DFA
+	GrammarAST eob = b.getLastChild(); // loops will use EOB DFA
 }
 	:	(	{ dfa = $start.getLookaheadDFA(); }
-			blk=block["block", dfa]
+			blk=block["block", dfa, $label]
 			{ $code = $blk.code; }
 		|	{ dfa = $start.getLookaheadDFA(); }
-			^( OPTIONAL blk=block["optionalBlock", dfa] )
+			^( OPTIONAL blk=block["optionalBlock", dfa, $label] )
 			{ $code = $blk.code; }
 		|	{ dfa = eob.getLookaheadDFA(); }
-			^( CLOSURE blk=block["closureBlock", dfa] )
+			^( CLOSURE blk=block["closureBlock", dfa, $label] )
 			{ $code = $blk.code; }
 		|	{ dfa = eob.getLookaheadDFA(); }
-			^( POSITIVE_CLOSURE blk=block["positiveClosureBlock", dfa] )
+			^( POSITIVE_CLOSURE blk=block["positiveClosureBlock", dfa, $label] )
 			{ $code = $blk.code; }
 		)
 		{
@@ -952,13 +953,13 @@
 			 ($start.getType()==RULE_REF||$start.getType()==TOKEN_REF||
 			  $start.getType()==CHAR_LITERAL||$start.getType()==STRING_LITERAL) )
 		{
-			Rule encRule = grammar.getRule(((GrammarAST)$start).enclosingRuleName);
+			Rule encRule = grammar.getRule($start.enclosingRuleName);
 			if ( encRule!=null && encRule.hasRewrite(outerAltNum) && astSuffix!=null )
 			{
 				ErrorManager.grammarError(ErrorManager.MSG_AST_OP_IN_ALT_WITH_REWRITE,
 										  grammar,
-										  ((GrammarAST)$start).getToken(),
-										  ((GrammarAST)$start).enclosingRuleName,
+										  $start.getToken(),
+										  $start.enclosingRuleName,
 										  outerAltNum);
 				astSuffix = null;
 			}
@@ -1001,7 +1002,7 @@
 			}
 
 			if ( $rarg!=null ) {
-				List args = generator.translateAction(currentRuleName,$rarg);
+				List<? extends Object> args = generator.translateAction(currentRuleName,$rarg);
 				$code.add("args", args);
 			}
 			int i = ((CommonToken)r.getToken()).getTokenIndex();
@@ -1017,7 +1018,7 @@
 			{
 				ErrorManager.grammarError(ErrorManager.MSG_HETERO_ILLEGAL_IN_REWRITE_ALT,
 										grammar,
-										((GrammarAST)($t)).getToken(),
+										$t.getToken(),
 										$t.text);
 			}
 			grammar.checkRuleReference(scope, $t, $targ, currentRuleName);
@@ -1053,7 +1054,7 @@
 					}
 					if ( $targ!=null )
 					{
-						List args = generator.translateAction(currentRuleName,$targ);
+						List<? extends Object> args = generator.translateAction(currentRuleName,$targ);
 						$code.add("args", args);
 					}
 				}
@@ -1239,7 +1240,7 @@
 				^( r=REWRITE (pred=SEMPRED)? alt=rewrite_alternative)
 				{
 					rewriteBlockNestingLevel = OUTER_REWRITE_NESTING_LEVEL;
-					List predChunks = null;
+					List<? extends Object> predChunks = null;
 					if ( $pred!=null )
 					{
 						//predText = #pred.getText();
@@ -1409,7 +1410,7 @@
 			{
 				ErrorManager.grammarError(ErrorManager.MSG_UNDEFINED_RULE_REF,
 										  grammar,
-										  ((GrammarAST)($r)).getToken(),
+										  $r.getToken(),
 										  ruleRefName);
 				$code = new ST(""); // blank; no code gen
 			}
@@ -1418,7 +1419,7 @@
 			{
 				ErrorManager.grammarError(ErrorManager.MSG_REWRITE_ELEMENT_NOT_PRESENT_ON_LHS,
 										  grammar,
-										  ((GrammarAST)($r)).getToken(),
+										  $r.getToken(),
 										  ruleRefName);
 				$code = new ST(""); // blank; no code gen
 			}
@@ -1455,10 +1456,12 @@
 				stName += "Root";
 			}
 			$code = templates.getInstanceOf(stName);
-			$code.add("terminalOptions",term.terminalOptions);
+			if (term.terminalOptions != null) {
+				$code.add("terminalOptions",term.terminalOptions);
+			}
 			if ( $arg!=null )
 			{
-				List args = generator.translateAction(currentRuleName,$arg);
+				List<? extends Object> args = generator.translateAction(currentRuleName,$arg);
 				$code.add("args", args);
 			}
 			$code.add("elementIndex", ((CommonToken)$start.getToken()).getTokenIndex());
@@ -1469,7 +1472,7 @@
 			{
 				ErrorManager.grammarError(ErrorManager.MSG_UNDEFINED_TOKEN_REF_IN_REWRITE,
 										  grammar,
-										  ((GrammarAST)($start)).getToken(),
+										  $start.getToken(),
 										  tokenName);
 				$code = new ST(""); // blank; no code gen
 			}
@@ -1488,7 +1491,7 @@
 				{
 					ErrorManager.grammarError(ErrorManager.MSG_RULE_REF_AMBIG_WITH_RULE_IN_ALT,
 											  grammar,
-											  ((GrammarAST)($LABEL)).getToken(),
+											  $LABEL.getToken(),
 											  labelName);
 				}
 				ST labelST = templates.getInstanceOf("prevRuleRootRef");
@@ -1499,7 +1502,7 @@
 			{
 				ErrorManager.grammarError(ErrorManager.MSG_UNDEFINED_LABEL_REF_IN_REWRITE,
 										  grammar,
-										  ((GrammarAST)($LABEL)).getToken(),
+										  $LABEL.getToken(),
 										  labelName);
 				$code = new ST("");
 			}
@@ -1540,7 +1543,7 @@
 		{
 			// actions in rewrite rules yield a tree object
 			String actText = $ACTION.text;
-			List chunks = generator.translateAction(currentRuleName,$ACTION);
+			List<? extends Object> chunks = generator.translateAction(currentRuleName,$ACTION);
 			$code = templates.getInstanceOf("rewriteNodeAction"+(isRoot?"Root":""));
 			$code.add("action", chunks);
 		}
@@ -1563,7 +1566,7 @@
 				else if ( $ind!=null )
 				{ // must be \%({expr})(args)
 					$code = templates.getInstanceOf("rewriteIndirectTemplate");
-					List chunks=generator.translateAction(currentRuleName,$ind);
+					List<? extends Object> chunks=generator.translateAction(currentRuleName,$ind);
 					$code.add("expr", chunks);
 				}
 			}
@@ -1574,7 +1577,7 @@
 						// because actions like \%foo(name={\$ID.text}) aren't
 						// broken up yet into trees.
 						$a.outerAltNum = this.outerAltNum;
-						List chunks = generator.translateAction(currentRuleName,$a);
+						List<? extends Object> chunks = generator.translateAction(currentRuleName,$a);
 						$code.addAggr("args.{name,value}", $arg.text, chunks);
 					}
 					)
diff --git a/tool/src/main/antlr3/org/antlr/grammar/v3/DefineGrammarItemsWalker.g b/tool/src/main/antlr3/org/antlr/grammar/v3/DefineGrammarItemsWalker.g
index a47ba8b..8fc2dd0 100644
--- a/tool/src/main/antlr3/org/antlr/grammar/v3/DefineGrammarItemsWalker.g
+++ b/tool/src/main/antlr3/org/antlr/grammar/v3/DefineGrammarItemsWalker.g
@@ -32,6 +32,7 @@
 tree grammar DefineGrammarItemsWalker;
 
 options {
+	language=Java;
 	tokenVocab = ANTLR;
 	ASTLabelType = GrammarAST;
 }
@@ -79,7 +80,7 @@
     GrammarAST p = root;
     // find the grammar spec
     while ( !p.getText().equals( "grammar" ) ) {
-        p = (GrammarAST)p.getNextSibling();
+        p = p.getNextSibling();
     }
     for ( int i = 0; i < p.getChildCount(); i++ ) {
         if ( p.getChild( i ).getType() != RULE )
@@ -627,7 +628,7 @@
 	if ( state.backtracking == 0 )
 	{
 		Rule r = grammar.getRule(currentRuleName);
-		Set tokenRefsInAlt = r.getTokenRefsInAlt(outerAltNum);
+		Set<String> tokenRefsInAlt = r.getTokenRefsInAlt(outerAltNum);
 		boolean imaginary =
 			$start.getType()==TOKEN_REF &&
 			!tokenRefsInAlt.contains($start.getText());
diff --git a/tool/src/main/antlr3/org/antlr/grammar/v3/LeftRecursiveRuleWalker.g b/tool/src/main/antlr3/org/antlr/grammar/v3/LeftRecursiveRuleWalker.g
index 537bd12..32deefc 100644
--- a/tool/src/main/antlr3/org/antlr/grammar/v3/LeftRecursiveRuleWalker.g
+++ b/tool/src/main/antlr3/org/antlr/grammar/v3/LeftRecursiveRuleWalker.g
@@ -34,6 +34,7 @@
 tree grammar LeftRecursiveRuleWalker;
 
 options {
+	language=Java;
 	tokenVocab=ANTLR;
     ASTLabelType=GrammarAST;
 }
@@ -163,7 +164,7 @@
 outerAlternative returns [boolean isLeftRec]
 @init
 {
-GrammarAST rew=(GrammarAST)$start.getNextSibling();
+GrammarAST rew = $start.getNextSibling();
 if (rew.getType() != REWRITES)
 	rew = null;
 }
diff --git a/tool/src/main/antlr3/org/antlr/grammar/v3/TreeToNFAConverter.g b/tool/src/main/antlr3/org/antlr/grammar/v3/TreeToNFAConverter.g
index ab206ef..8568a79 100644
--- a/tool/src/main/antlr3/org/antlr/grammar/v3/TreeToNFAConverter.g
+++ b/tool/src/main/antlr3/org/antlr/grammar/v3/TreeToNFAConverter.g
@@ -34,6 +34,7 @@
 tree grammar TreeToNFAConverter;
 
 options {
+	language=Java;
 	tokenVocab = ANTLR;
 	ASTLabelType = GrammarAST;
 }
diff --git a/tool/src/main/java/org/antlr/Tool.java b/tool/src/main/java/org/antlr/Tool.java
index b336baf..0d8709b 100644
--- a/tool/src/main/java/org/antlr/Tool.java
+++ b/tool/src/main/java/org/antlr/Tool.java
@@ -41,8 +41,13 @@
 public class Tool {
 
     public final Properties antlrSettings = new Properties();
-    public String VERSION = "3.4";
-    //public static final String VERSION = "${project.version}";
+
+	public final String VERSION;
+	{
+		String version = Tool.class.getPackage().getImplementationVersion();
+		VERSION = version != null ? version : "3.x";
+	}
+
     public static final String UNINITIALIZED_DIR = "<unset-dir>";
     private List<String> grammarFileNames = new ArrayList<String>();
     private boolean generate_NFA_dot = false;
@@ -83,7 +88,7 @@
     /**
      * A list of dependency generators that are accumulated aaaas (and if) the
      * tool is required to sort the provided grammars into build dependency order.
-    protected Map<String, BuildDependencyGenerator> buildDependencyGenerators;
+    protected Map&lt;String, BuildDependencyGenerator&gt; buildDependencyGenerators;
      */
 
     public static void main(String[] args) {
@@ -104,7 +109,7 @@
      * variables that must be initialized from it, such as the version of ANTLR.
      */
     private void loadResources() {
-        InputStream in = null;
+        InputStream in;
         in = this.getClass().getResourceAsStream("antlr.properties");
 
         // If we found the resource, then load it, otherwise revert to the
@@ -129,6 +134,7 @@
         loadResources();
     }
 
+	@SuppressWarnings("OverridableMethodCallInConstructor")
     public Tool(String[] args) {
         loadResources();
 
@@ -385,6 +391,15 @@
         for (File outputFile : outputFiles) {
             if (!outputFile.exists() || grammarLastModified > outputFile.lastModified()) {
                 // One of the output files does not exist or is out of date, so we must build it
+				if (isVerbose()) {
+					if (!outputFile.exists()) {
+						System.out.println("Output file " + outputFile + " does not exist: must build " + grammarFile);
+					}
+					else {
+						System.out.println("Output file " + outputFile + " is not up-to-date: must build " + grammarFile);
+					}
+				}
+
                 return true;
             }
             // Check all of the imported grammars and see if any of these are younger
@@ -394,6 +409,10 @@
 
                     if (inputFile.lastModified() > outputFile.lastModified()) {
                         // One of the imported grammar files has been updated so we must build
+						if (isVerbose()) {
+							System.out.println("Input file " + inputFile + " is newer than output: must rebuild " + grammarFile);
+						}
+
                         return true;
                     }
                 }
@@ -407,7 +426,7 @@
 
     public void process() {
         boolean exceptionWhenWritingLexerFile = false;
-        String lexerGrammarFileName = null;		// necessary at this scope to have access in the catch below
+        String lexerGrammarFileName;		// necessary at this scope to have access in the catch below
 
         // Have to be tricky here when Maven or build tools call in and must new Tool()
         // before setting options. The banner won't display that way!
@@ -539,7 +558,7 @@
                 }
                 else {
                     ErrorManager.error(ErrorManager.MSG_CANNOT_OPEN_FILE,
-                                       grammarFileName);
+                                       grammarFileName, e);
                 }
             }
             catch (Exception e) {
@@ -558,7 +577,7 @@
 
     public void sortGrammarFiles() throws IOException {
         //System.out.println("Grammar names "+getGrammarFileNames());
-        Graph g = new Graph();
+        Graph<String> g = new Graph<String>();
         List<String> missingFiles = new ArrayList<String>();
         for (String gfile : grammarFileNames) {
             try {
@@ -572,15 +591,15 @@
                 g.addEdge(grammarName+CodeGenerator.VOCAB_FILE_EXTENSION, gfile);
             }
             catch (FileNotFoundException fnfe) {
-                ErrorManager.error(ErrorManager.MSG_CANNOT_OPEN_FILE, gfile);
+                ErrorManager.error(ErrorManager.MSG_CANNOT_OPEN_FILE, gfile, fnfe);
                 missingFiles.add(gfile);
             }
         }
-        List<Object> sorted = g.sort();
+        List<String> sorted = g.sort();
         //System.out.println("sorted="+sorted);
         grammarFileNames.clear(); // wipe so we can give new ordered list
         for (int i = 0; i < sorted.size(); i++) {
-            String f = (String)sorted.get(i);
+            String f = sorted.get(i);
             if ( missingFiles.contains(f) ) continue;
             if ( !(f.endsWith(".g") || f.endsWith(".g3")) ) continue;
             grammarFileNames.add(f);
@@ -599,8 +618,8 @@
         CompositeGrammar composite = new CompositeGrammar();
         Grammar grammar = new Grammar(this, grammarFileName, composite);
         composite.setDelegationRoot(grammar);
-        FileReader fr = null;
-        File f = null;
+        FileReader fr;
+        File f;
 
         if (haveInputDir) {
             f = new File(inputDirectory, grammarFileName);
@@ -660,7 +679,7 @@
 
             List<Grammar> delegates = grammar.getDirectDelegates();
             for (int i = 0; delegates != null && i < delegates.size(); i++) {
-                Grammar delegate = (Grammar) delegates.get(i);
+                Grammar delegate = delegates.get(i);
                 if (delegate != grammar) { // already processing this one
                     generateRecognizer(delegate);
                 }
@@ -692,11 +711,10 @@
 
     protected void generateNFAs(Grammar g) {
         DOTGenerator dotGenerator = new DOTGenerator(g);
-        Collection rules = g.getAllImportedRules();
+        Collection<Rule> rules = new HashSet<Rule>(g.getAllImportedRules());
         rules.addAll(g.getRules());
 
-        for (Iterator itr = rules.iterator(); itr.hasNext();) {
-            Rule r = (Rule) itr.next();
+        for (Rule r : rules) {
             try {
                 String dot = dotGenerator.getDOT(r.startState);
                 if (dot != null) {
@@ -879,11 +897,10 @@
      * to the input directory.
      *
      * @param fileNameWithPath path to input source
-     * @return
      */
     public File getOutputDirectory(String fileNameWithPath) {
 
-        File outputDir = new File(getOutputDirectory());
+        File outputDir;
         String fileDirectory;
 
         // Some files are given to us without a PATH but should should
diff --git a/tool/src/main/java/org/antlr/analysis/ActionLabel.java b/tool/src/main/java/org/antlr/analysis/ActionLabel.java
index e39024c..884d8d5 100644
--- a/tool/src/main/java/org/antlr/analysis/ActionLabel.java
+++ b/tool/src/main/java/org/antlr/analysis/ActionLabel.java
@@ -38,18 +38,22 @@
 		this.actionAST = actionAST;
 	}
 
+	@Override
 	public boolean isEpsilon() {
 		return true; // we are to be ignored by analysis 'cept for predicates
 	}
 
+	@Override
 	public boolean isAction() {
 		return true;
 	}
 
+	@Override
 	public String toString() {
 		return "{"+actionAST+"}";
 	}
 
+	@Override
 	public String toString(Grammar g) {
 		return toString();
 	}
diff --git a/tool/src/main/java/org/antlr/analysis/DFA.java b/tool/src/main/java/org/antlr/analysis/DFA.java
index 896acc7..5cc1556 100644
--- a/tool/src/main/java/org/antlr/analysis/DFA.java
+++ b/tool/src/main/java/org/antlr/analysis/DFA.java
@@ -78,7 +78,7 @@
 
 	/** A set of all uniquely-numbered DFA states.  Maps hash of DFAState
      *  to the actual DFAState object.  We use this to detect
-     *  existing DFA states.  Map<DFAState,DFAState>.  Use Map so
+     *  existing DFA states.  Map&lt;DFAState,DFAState&gt;.  Use Map so
 	 *  we can get old state back (Set only allows you to see if it's there).
 	 *  Not used during fixed k lookahead as it's a waste to fill it with
 	 *  a dup of states array.
@@ -88,7 +88,7 @@
 	/** Maps the state number to the actual DFAState.  Use a Vector as it
 	 *  grows automatically when I set the ith element.  This contains all
 	 *  states, but the states are not unique.  s3 might be same as s1 so
-	 *  s3 -> s1 in this table.  This is how cycles occur.  If fixed k,
+	 *  s3 &rarr; s1 in this table.  This is how cycles occur.  If fixed k,
 	 *  then these states will all be unique as states[i] always points
 	 *  at state i when no cycles exist.
 	 *
@@ -146,7 +146,7 @@
 	protected DFAState[] altToAcceptState;
 
 	/** Track whether an alt discovers recursion for each alt during
-	 *  NFA to DFA conversion; >1 alt with recursion implies nonregular.
+	 *  NFA to DFA conversion; &gt;1 alt with recursion implies nonregular.
 	 */
 	public IntSet recursiveAltSet = new IntervalSet();
 
@@ -183,7 +183,7 @@
 	 *     	  ...
 	 *      };
 	 */
-	public Map edgeTransitionClassMap = new LinkedHashMap();
+	public Map<List<Integer>, Integer> edgeTransitionClassMap = new LinkedHashMap<List<Integer>, Integer>();
 
 	/** The unique edge transition class number; every time we see a new
 	 *  set of edges emanating from a state, we number it so we can reuse
@@ -202,26 +202,26 @@
 	 */
 
 	/** List of special DFAState objects */
-	public List specialStates;
+	public List<DFAState> specialStates;
 	/** List of ST for special states. */
-	public List specialStateSTs;
-	public Vector accept;
-	public Vector eot;
-	public Vector eof;
-	public Vector min;
-	public Vector max;
-	public Vector special;
-	public Vector transition;
-	/** just the Vector<Integer> indicating which unique edge table is at
+	public List<ST> specialStateSTs;
+	public Vector<Integer> accept;
+	public Vector<Integer> eot;
+	public Vector<Integer> eof;
+	public Vector<Integer> min;
+	public Vector<Integer> max;
+	public Vector<Integer> special;
+	public Vector<Vector<Integer>> transition;
+	/** just the Vector&lt;Integer&gt; indicating which unique edge table is at
 	 *  position i.
 	 */
-	public Vector transitionEdgeTables; // not used by java yet
+	public Vector<Integer> transitionEdgeTables; // not used by java yet
 	protected int uniqueCompressedSpecialStateNum = 0;
 
 	/** Which generator to use if we're building state tables */
 	protected CodeGenerator generator = null;
 
-	protected DFA() {;}
+	protected DFA() {}
 
 	public DFA(int decisionNumber, NFAState decisionStartState) {
 		this.decisionNumber = decisionNumber;
@@ -272,7 +272,7 @@
 	 *  will result in states[i] == states[j].  We don't want to waste a state
 	 *  number on this.  Useful mostly for code generation in tables.
 	 *
-	 *  At the start of this routine, states[i].stateNumber <= i by definition.
+	 *  At the start of this routine, states[i].stateNumber &lt;= i by definition.
 	 *  If states[50].stateNumber is 50 then a cycle during conversion may
 	 *  try to add state 103, but we find that an identical DFA state, named
 	 *  50, already exists, hence, states[103]==states[50] and both have
@@ -320,20 +320,20 @@
 	// or even consistently formatted strings acceptable to java that
 	// I am forced to build the individual char elements here
 
-	public List getJavaCompressedAccept() { return getRunLengthEncoding(accept); }
-	public List getJavaCompressedEOT() { return getRunLengthEncoding(eot); }
-	public List getJavaCompressedEOF() { return getRunLengthEncoding(eof); }
-	public List getJavaCompressedMin() { return getRunLengthEncoding(min); }
-	public List getJavaCompressedMax() { return getRunLengthEncoding(max); }
-	public List getJavaCompressedSpecial() { return getRunLengthEncoding(special); }
-	public List getJavaCompressedTransition() {
-		if ( transition==null || transition.size()==0 ) {
+	public List<? extends String> getJavaCompressedAccept() { return getRunLengthEncoding(accept); }
+	public List<? extends String> getJavaCompressedEOT() { return getRunLengthEncoding(eot); }
+	public List<? extends String> getJavaCompressedEOF() { return getRunLengthEncoding(eof); }
+	public List<? extends String> getJavaCompressedMin() { return getRunLengthEncoding(min); }
+	public List<? extends String> getJavaCompressedMax() { return getRunLengthEncoding(max); }
+	public List<? extends String> getJavaCompressedSpecial() { return getRunLengthEncoding(special); }
+	public List<List<? extends String>> getJavaCompressedTransition() {
+		if ( transition==null || transition.isEmpty() ) {
 			return null;
 		}
-		List encoded = new ArrayList(transition.size());
+		List<List<? extends String>> encoded = new ArrayList<List<? extends String>>(transition.size());
 		// walk Vector<Vector<FormattedInteger>> which is the transition[][] table
 		for (int i = 0; i < transition.size(); i++) {
-			Vector transitionsForState = (Vector) transition.elementAt(i);
+			Vector<Integer> transitionsForState = transition.elementAt(i);
 			encoded.add(getRunLengthEncoding(transitionsForState));
 		}
 		return encoded;
@@ -345,32 +345,32 @@
 	 *  that GIF files use.  Transition tables are heavily compressed by
 	 *  this technique.  I got the idea from JFlex http://jflex.de/
 	 *
-	 *  Return List<String> where each string is either \xyz for 8bit char
+	 *  Return List&lt;String&gt; where each string is either \xyz for 8bit char
 	 *  and \uFFFF for 16bit.  Hideous and specific to Java, but it is the
 	 *  only target bad enough to need it.
 	 */
-	public List getRunLengthEncoding(List data) {
-		if ( data==null || data.size()==0 ) {
+	public List<? extends String> getRunLengthEncoding(List<Integer> data) {
+		if ( data==null || data.isEmpty() ) {
 			// for states with no transitions we want an empty string ""
 			// to hold its place in the transitions array.
-			List empty = new ArrayList();
+			List<String> empty = new ArrayList<String>();
 			empty.add("");
 			return empty;
 		}
 		int size = Math.max(2,data.size()/2);
-		List encoded = new ArrayList(size); // guess at size
+		List<String> encoded = new ArrayList<String>(size); // guess at size
 		// scan values looking for runs
 		int i = 0;
 		Integer emptyValue = Utils.integer(-1);
 		while ( i < data.size() ) {
-			Integer I = (Integer)data.get(i);
+			Integer I = data.get(i);
 			if ( I==null ) {
 				I = emptyValue;
 			}
 			// count how many v there are?
 			int n = 0;
 			for (int j = i; j < data.size(); j++) {
-				Integer v = (Integer)data.get(j);
+				Integer v = data.get(j);
 				if ( v==null ) {
 					v = emptyValue;
 				}
@@ -396,27 +396,27 @@
 			generator.target.getTargetStringLiteralFromString(description);
 
 		// create all the tables
-		special = new Vector(this.getNumberOfStates()); // Vector<short>
+		special = new Vector<Integer>(this.getNumberOfStates()); // Vector<short>
 		special.setSize(this.getNumberOfStates());
-		specialStates = new ArrayList();				// List<DFAState>
-		specialStateSTs = new ArrayList();				// List<ST>
-		accept = new Vector(this.getNumberOfStates()); // Vector<int>
+		specialStates = new ArrayList<DFAState>();				// List<DFAState>
+		specialStateSTs = new ArrayList<ST>();				// List<ST>
+		accept = new Vector<Integer>(this.getNumberOfStates()); // Vector<int>
 		accept.setSize(this.getNumberOfStates());
-		eot = new Vector(this.getNumberOfStates()); // Vector<int>
+		eot = new Vector<Integer>(this.getNumberOfStates()); // Vector<int>
 		eot.setSize(this.getNumberOfStates());
-		eof = new Vector(this.getNumberOfStates()); // Vector<int>
+		eof = new Vector<Integer>(this.getNumberOfStates()); // Vector<int>
 		eof.setSize(this.getNumberOfStates());
-		min = new Vector(this.getNumberOfStates()); // Vector<int>
+		min = new Vector<Integer>(this.getNumberOfStates()); // Vector<int>
 		min.setSize(this.getNumberOfStates());
-		max = new Vector(this.getNumberOfStates()); // Vector<int>
+		max = new Vector<Integer>(this.getNumberOfStates()); // Vector<int>
 		max.setSize(this.getNumberOfStates());
-		transition = new Vector(this.getNumberOfStates()); // Vector<Vector<int>>
+		transition = new Vector<Vector<Integer>>(this.getNumberOfStates()); // Vector<Vector<int>>
 		transition.setSize(this.getNumberOfStates());
-		transitionEdgeTables = new Vector(this.getNumberOfStates()); // Vector<Vector<int>>
+		transitionEdgeTables = new Vector<Integer>(this.getNumberOfStates()); // Vector<int>
 		transitionEdgeTables.setSize(this.getNumberOfStates());
 
 		// for each state in the DFA, fill relevant tables.
-		Iterator it = null;
+		Iterator<DFAState> it;
 		if ( getUserMaxLookahead()>0 ) {
 			it = states.iterator();
 		}
@@ -424,7 +424,7 @@
 			it = getUniqueStates().values().iterator();
 		}
 		while ( it.hasNext() ) {
-			DFAState s = (DFAState)it.next();
+			DFAState s = it.next();
 			if ( s==null ) {
 				// ignore null states; some acylic DFA see this condition
 				// when inlining DFA (due to lacking of exit branch pruning?)
@@ -445,7 +445,7 @@
 
 		// now that we have computed list of specialStates, gen code for 'em
 		for (int i = 0; i < specialStates.size(); i++) {
-			DFAState ss = (DFAState) specialStates.get(i);
+			DFAState ss = specialStates.get(i);
 			ST stateST =
 				generator.generateSpecialState(ss);
 			specialStateSTs.add(stateST);
@@ -501,7 +501,7 @@
 		int smin = Label.MAX_CHAR_VALUE + 1;
 		int smax = Label.MIN_ATOM_VALUE - 1;
 		for (int j = 0; j < s.getNumberOfTransitions(); j++) {
-			Transition edge = (Transition) s.transition(j);
+			Transition edge = s.transition(j);
 			Label label = edge.label;
 			if ( label.isAtom() ) {
 				if ( label.getAtom()>=Label.MIN_CHAR_VALUE ) {
@@ -545,14 +545,14 @@
 		System.out.println("createTransitionTableEntryForState s"+s.stateNumber+
 			" dec "+s.dfa.decisionNumber+" cyclic="+s.dfa.isCyclic());
 			*/
-		int smax = ((Integer)max.get(s.stateNumber)).intValue();
-		int smin = ((Integer)min.get(s.stateNumber)).intValue();
+		int smax = max.get(s.stateNumber);
+		int smin = min.get(s.stateNumber);
 
-		Vector stateTransitions = new Vector(smax-smin+1);
+		Vector<Integer> stateTransitions = new Vector<Integer>(smax-smin+1);
 		stateTransitions.setSize(smax-smin+1);
 		transition.set(s.stateNumber, stateTransitions);
 		for (int j = 0; j < s.getNumberOfTransitions(); j++) {
-			Transition edge = (Transition) s.transition(j);
+			Transition edge = s.transition(j);
 			Label label = edge.label;
 			if ( label.isAtom() && label.getAtom()>=Label.MIN_CHAR_VALUE ) {
 				int labelIndex = label.getAtom()-smin; // offset from 0
@@ -573,7 +573,7 @@
 			}
 		}
 		// track unique state transition tables so we can reuse
-		Integer edgeClass = (Integer)edgeTransitionClassMap.get(stateTransitions);
+		Integer edgeClass = edgeTransitionClassMap.get(stateTransitions);
 		if ( edgeClass!=null ) {
 			//System.out.println("we've seen this array before; size="+stateTransitions.size());
 			transitionEdgeTables.set(s.stateNumber, edgeClass);
@@ -591,7 +591,7 @@
 	 */
 	protected void createEOTAndEOFTables(DFAState s) {
 		for (int j = 0; j < s.getNumberOfTransitions(); j++) {
-			Transition edge = (Transition) s.transition(j);
+			Transition edge = s.transition(j);
 			Label label = edge.label;
 			if ( label.isAtom() ) {
 				if ( label.getAtom()==Label.EOT ) {
@@ -625,7 +625,7 @@
 
 		// TODO this code is very similar to canGenerateSwitch.  Refactor to share
 		for (int j = 0; j < s.getNumberOfTransitions(); j++) {
-			Transition edge = (Transition) s.transition(j);
+			Transition edge = s.transition(j);
 			Label label = edge.label;
 			// can't do a switch if the edges have preds or are going to
 			// require gated predicates
@@ -637,8 +637,8 @@
 			}
 		}
 		// if has pred or too big for table, make it special
-		int smax = ((Integer)max.get(s.stateNumber)).intValue();
-		int smin = ((Integer)min.get(s.stateNumber)).intValue();
+		int smax = max.get(s.stateNumber);
+		int smin = min.get(s.stateNumber);
 		if ( hasSemPred || smax-smin>MAX_STATE_TRANSITIONS_FOR_TABLE ) {
 			special.set(s.stateNumber,
 						Utils.integer(uniqueCompressedSpecialStateNum));
@@ -668,7 +668,7 @@
 		}
 		// does a DFA state exist already with everything the same
 		// except its state number?
-		DFAState existing = (DFAState)uniqueStates.get(d);
+		DFAState existing = uniqueStates.get(d);
 		if ( existing != null ) {
             /*
             System.out.println("state "+d.stateNumber+" exists as state "+
@@ -685,7 +685,7 @@
 	}
 
 	public void removeState(DFAState d) {
-		DFAState it = (DFAState)uniqueStates.remove(d);
+		DFAState it = uniqueStates.remove(d);
 		if ( it!=null ) {
 			numberOfStates--;
 		}
@@ -703,7 +703,7 @@
 	}
 
 	public DFAState getState(int stateNumber) {
-		return (DFAState)states.get(stateNumber);
+		return states.get(stateNumber);
 	}
 
 	public void setState(int stateNumber, DFAState d) {
@@ -802,16 +802,16 @@
 	/** Count all disambiguating syn preds (ignore synpred tests
 	 *  for gated edges, which occur for nonambig input sequences).
 	 *  E.g.,
-	 *  x  : (X)=> (X|Y)\n" +
+	 *  x  : (X)=&gt; (X|Y)\n" +
 	 *     | X\n" +
 	 *     ;
 	 *
 	 *  gives
 	 * 
-	 * .s0-X->.s1
-	 * .s0-Y&&{synpred1_t}?->:s2=>1
-	 * .s1-{synpred1_t}?->:s2=>1
-	 * .s1-{true}?->:s3=>2
+	 * .s0-X-&gt;.s1
+	 * .s0-Y&amp;&amp;{synpred1_t}?-&gt;:s2=&gt;1
+	 * .s1-{synpred1_t}?-&gt;:s2=&gt;1
+	 * .s1-{true}?-&gt;:s3=&gt;2
 	 */
 	public boolean hasSynPred() {
 		boolean has = _hasSynPred(startState, new HashSet<DFAState>());
@@ -985,11 +985,10 @@
 			DFAState a = getAcceptState(i);
 			//System.out.println("alt "+i+": "+a);
 			if ( a!=null ) {
-				Set synpreds = a.getGatedSyntacticPredicatesInNFAConfigurations();
+				Set<? extends SemanticContext> synpreds = a.getGatedSyntacticPredicatesInNFAConfigurations();
 				if ( synpreds!=null ) {
 					// add all the predicates we find (should be just one, right?)
-					for (Iterator it = synpreds.iterator(); it.hasNext();) {
-						SemanticContext semctx = (SemanticContext) it.next();
+					for (SemanticContext semctx : synpreds) {
 						// System.out.println("synpreds: "+semctx);
 						nfa.grammar.synPredUsedInDFA(this, semctx);
 					}
@@ -1034,7 +1033,7 @@
 	}
 
 	public String getReasonForFailure() {
-		StringBuffer buf = new StringBuffer();
+		StringBuilder buf = new StringBuilder();
 		if ( probe.isNonLLStarDecision() ) {
 			buf.append("non-LL(*)");
 			if ( predicateVisible ) {
@@ -1095,13 +1094,14 @@
 //	}
 
     protected void initAltRelatedInfo() {
-        unreachableAlts = new LinkedList();
+        unreachableAlts = new LinkedList<Integer>();
         for (int i = 1; i <= nAlts; i++) {
             unreachableAlts.add(Utils.integer(i));
         }
 		altToAcceptState = new DFAState[nAlts+1];
     }
 
+	@Override
 	public String toString() {
 		FASerializer serializer = new FASerializer(nfa.grammar);
 		if ( startState==null ) {
diff --git a/tool/src/main/java/org/antlr/analysis/DFAOptimizer.java b/tool/src/main/java/org/antlr/analysis/DFAOptimizer.java
index d8e8291..ab7fba9 100644
--- a/tool/src/main/java/org/antlr/analysis/DFAOptimizer.java
+++ b/tool/src/main/java/org/antlr/analysis/DFAOptimizer.java
@@ -41,7 +41,7 @@
  *  loop exit branches are unreachable if you prune exit branches
  *  during DFA construction and before determinism checks.
  *
- *  In general, ANTLR's NFA->DFA->codegen pipeline seems very robust
+ *  In general, ANTLR's NFA&rarr;DFA&rarr;codegen pipeline seems very robust
  *  to me which I attribute to a uniform and consistent set of data
  *  structures.  Regardless of what I want to "say"/implement, I do so
  *  within the confines of, for example, a DFA.  The code generator
@@ -99,7 +99,7 @@
  *  state.  This is a waste and messes up my code generation. ;)  If
  *  Tokens rule DFA goes
  *
- * 		s0 -'='-> s3 -EOT-> s5 (accept)
+ * 		s0 -'='-&gt; s3 -EOT-&gt; s5 (accept)
  *
  *  then s5 should be pruned and s3 should be made an accept.  Do NOT do this
  *  for keyword versus ID as the state with EOT edge emanating from it will
@@ -125,7 +125,7 @@
 	 *  This is a side-effect of calling optimize; can't clear after use
 	 *  because code gen needs it.
 	 */
-	protected Set visited = new HashSet();
+	protected Set<Integer> visited = new HashSet<Integer>();
 
     protected Grammar grammar;
 
@@ -189,7 +189,7 @@
 		visited.add(sI);
 		int nAlts = d.dfa.getNumberOfAlts();
 		for (int i = 0; i < d.getNumberOfTransitions(); i++) {
-			Transition edge = (Transition) d.transition(i);
+			Transition edge = d.transition(i);
 			DFAState edgeTarget = ((DFAState)edge.target);
 			/*
 			System.out.println(d.stateNumber+"-"+
@@ -218,7 +218,7 @@
 		}
 		visited.add(sI);
 		for (int i = 0; i < d.getNumberOfTransitions(); i++) {
-			Transition edge = (Transition) d.transition(i);
+			Transition edge = d.transition(i);
 			DFAState edgeTarget = ((DFAState)edge.target);
 			/*
 			System.out.println(d.stateNumber+"-"+
diff --git a/tool/src/main/java/org/antlr/analysis/DFAState.java b/tool/src/main/java/org/antlr/analysis/DFAState.java
index ee1a703..541d81a 100644
--- a/tool/src/main/java/org/antlr/analysis/DFAState.java
+++ b/tool/src/main/java/org/antlr/analysis/DFAState.java
@@ -42,7 +42,7 @@
  *  input a1a2..an, the DFA is in a state that represents the
  *  subset T of the states of the NFA that are reachable from the
  *  NFA's start state along some path labeled a1a2..an."
- *  In conventional NFA->DFA conversion, therefore, the subset T
+ *  In conventional NFA&rarr;DFA conversion, therefore, the subset T
  *  would be a bitset representing the set of states the
  *  NFA could be in.  We need to track the alt predicted by each
  *  state as well, however.  More importantly, we need to maintain
@@ -84,7 +84,7 @@
 	 */
     protected int k;
 
-    /** The NFA->DFA algorithm may terminate leaving some states
+    /** The NFA&rarr;DFA algorithm may terminate leaving some states
      *  without a path to an accept state, implying that upon certain
      *  input, the decision is not deterministic--no decision about
      *  predicting a unique alternative can be made.  Recall that an
@@ -173,14 +173,17 @@
 		reachableLabels = null;
 	}
 
+	@Override
 	public Transition transition(int i) {
-        return (Transition)transitions.get(i);
+        return transitions.get(i);
     }
 
+	@Override
     public int getNumberOfTransitions() {
         return transitions.size();
     }
 
+	@Override
     public void addTransition(Transition t) {
         transitions.add(t);
     }
@@ -202,7 +205,7 @@
 	}
 
     /** Add an NFA configuration to this DFA node.  Add uniquely
-     *  an NFA state/alt/syntactic&semantic context (chain of invoking state(s)
+     *  an NFA state/alt/syntactic&amp;semantic context (chain of invoking state(s)
      *  and semantic predicate contexts).
      *
      *  I don't see how there could be two configurations with same
@@ -291,7 +294,7 @@
      *
      *  The idea for adding a new set, t, is to look for overlap with the
      *  elements of existing list s.  Upon overlap, replace
-     *  existing set s[i] with two new disjoint sets, s[i]-t and s[i]&t.
+     *  existing set s[i] with two new disjoint sets, s[i]-t and s[i]&amp;t.
      *  (if s[i]-t is nil, don't add).  The remainder is t-s[i], which is
      *  what you want to add to the set minus what was already there.  The
      *  remainder must then be compared against the i+1..n elements in s
@@ -377,7 +380,7 @@
 				*/
     }
 
-    public OrderedHashSet getReachableLabels() {
+    public OrderedHashSet<Label> getReachableLabels() {
         return reachableLabels;
     }
 
@@ -389,6 +392,7 @@
      *  This is used when we add DFAState objects to the DFA.states Map and
      *  when we compare DFA states.  Computed in addNFAConfiguration()
      */
+	@Override
     public int hashCode() {
 		if ( cachedHashCode==0 ) {
 			// LL(1) algorithm doesn't use NFA configurations, which
@@ -409,6 +413,7 @@
 	 *  to know if any other state exists that has this exact set of NFA
 	 *  configurations.  The DFAState state number is irrelevant.
      */
+	@Override
     public boolean equals(Object o) {
 		// compare set of NFA configurations in this set with other
         DFAState other = (DFAState)o;
@@ -429,7 +434,7 @@
         int alt = NFA.INVALID_ALT_NUMBER;
 		int numConfigs = nfaConfigurations.size();
 		for (int i = 0; i < numConfigs; i++) {
-			NFAConfiguration configuration = (NFAConfiguration) nfaConfigurations.get(i);
+			NFAConfiguration configuration = nfaConfigurations.get(i);
 			// ignore anything we resolved; predicates will still result
 			// in transitions out of this state, so must count those
 			// configurations; i.e., don't ignore resolveWithPredicate configs
@@ -455,7 +460,7 @@
 		int alt = NFA.INVALID_ALT_NUMBER;
 		int numConfigs = nfaConfigurations.size();
 		for (int i = 0; i < numConfigs; i++) {
-			NFAConfiguration configuration = (NFAConfiguration) nfaConfigurations.get(i);
+			NFAConfiguration configuration = nfaConfigurations.get(i);
 			if ( alt==NFA.INVALID_ALT_NUMBER ) {
 				alt = configuration.alt; // found first alt
 			}
@@ -478,11 +483,11 @@
 	 *  DFA state, that alt is disabled.  There may be other accept states
 	 *  for that alt.
 	 */
-	public Set getDisabledAlternatives() {
-		Set disabled = new LinkedHashSet();
+	public Set<Integer> getDisabledAlternatives() {
+		Set<Integer> disabled = new LinkedHashSet<Integer>();
 		int numConfigs = nfaConfigurations.size();
 		for (int i = 0; i < numConfigs; i++) {
-			NFAConfiguration configuration = (NFAConfiguration) nfaConfigurations.get(i);
+			NFAConfiguration configuration = nfaConfigurations.get(i);
 			if ( configuration.resolved ) {
 				disabled.add(Utils.integer(configuration.alt));
 			}
@@ -490,7 +495,7 @@
 		return disabled;
 	}
 
-	protected Set getNonDeterministicAlts() {
+	protected Set<Integer> getNonDeterministicAlts() {
 		int user_k = dfa.getUserMaxLookahead();
 		if ( user_k>0 && user_k==k ) {
 			// if fixed lookahead, then more than 1 alt is a nondeterminism
@@ -541,21 +546,20 @@
 		MultiMap<Integer, NFAConfiguration> stateToConfigListMap =
 			new MultiMap<Integer, NFAConfiguration>();
 		for (int i = 0; i < numConfigs; i++) {
-			NFAConfiguration configuration = (NFAConfiguration) nfaConfigurations.get(i);
+			NFAConfiguration configuration = nfaConfigurations.get(i);
 			Integer stateI = Utils.integer(configuration.state);
 			stateToConfigListMap.map(stateI, configuration);
 		}
 		// potential conflicts are states with > 1 configuration and diff alts
-		Set states = stateToConfigListMap.keySet();
+		Set<Integer> states = stateToConfigListMap.keySet();
 		int numPotentialConflicts = 0;
-		for (Iterator it = states.iterator(); it.hasNext();) {
-			Integer stateI = (Integer) it.next();
+		for (Integer stateI : states) {
 			boolean thisStateHasPotentialProblem = false;
-			List configsForState = (List)stateToConfigListMap.get(stateI);
+			List<NFAConfiguration> configsForState = stateToConfigListMap.get(stateI);
 			int alt=0;
 			int numConfigsForState = configsForState.size();
 			for (int i = 0; i < numConfigsForState && numConfigsForState>1 ; i++) {
-				NFAConfiguration c = (NFAConfiguration) configsForState.get(i);
+				NFAConfiguration c = configsForState.get(i);
 				if ( alt==0 ) {
 					alt = c.alt;
 				}
@@ -608,9 +612,8 @@
 		// Indeed a conflict exists as same state 3, same context [$], predicts
 		// alts 1 and 2.
 		// walk each state with potential conflicting configurations
-		for (Iterator it = states.iterator(); it.hasNext();) {
-			Integer stateI = (Integer) it.next();
-			List configsForState = (List)stateToConfigListMap.get(stateI);
+		for (Integer stateI : states) {
+			List<NFAConfiguration> configsForState = stateToConfigListMap.get(stateI);
 			// compare each configuration pair s, t to ensure:
 			// s.ctx different than t.ctx if s.alt != t.alt
 			int numConfigsForState = 0;
@@ -618,9 +621,9 @@
 				numConfigsForState = configsForState.size();
 			}
 			for (int i = 0; i < numConfigsForState; i++) {
-				NFAConfiguration s = (NFAConfiguration) configsForState.get(i);
+				NFAConfiguration s = configsForState.get(i);
 				for (int j = i+1; j < numConfigsForState; j++) {
-					NFAConfiguration t = (NFAConfiguration)configsForState.get(j);
+					NFAConfiguration t = configsForState.get(j);
 					// conflicts means s.ctx==t.ctx or s.ctx is a stack
 					// suffix of t.ctx or vice versa (if alts differ).
 					// Also a conflict if s.ctx or t.ctx is empty
@@ -632,7 +635,7 @@
 			}
 		}
 
-		if ( nondeterministicAlts.size()==0 ) {
+		if ( nondeterministicAlts.isEmpty() ) {
 			return null;
 		}
         return nondeterministicAlts;
@@ -641,24 +644,24 @@
 	/** Get the set of all alts mentioned by all NFA configurations in this
 	 *  DFA state.
 	 */
-	public Set getAltSet() {
+	public Set<Integer> getAltSet() {
 		int numConfigs = nfaConfigurations.size();
-		Set alts = new HashSet();
+		Set<Integer> alts = new HashSet<Integer>();
 		for (int i = 0; i < numConfigs; i++) {
-			NFAConfiguration configuration = (NFAConfiguration) nfaConfigurations.get(i);
+			NFAConfiguration configuration = nfaConfigurations.get(i);
 			alts.add(Utils.integer(configuration.alt));
 		}
-		if ( alts.size()==0 ) {
+		if ( alts.isEmpty() ) {
 			return null;
 		}
 		return alts;
 	}
 
-	public Set getGatedSyntacticPredicatesInNFAConfigurations() {
+	public Set<? extends SemanticContext> getGatedSyntacticPredicatesInNFAConfigurations() {
 		int numConfigs = nfaConfigurations.size();
 		Set<SemanticContext> synpreds = new HashSet<SemanticContext>();
 		for (int i = 0; i < numConfigs; i++) {
-			NFAConfiguration configuration = (NFAConfiguration) nfaConfigurations.get(i);
+			NFAConfiguration configuration = nfaConfigurations.get(i);
 			SemanticContext gatedPredExpr =
 				configuration.semanticContext.getGatedPredicateContext();
 			// if this is a manual syn pred (gated and syn pred), add
@@ -668,7 +671,7 @@
 				synpreds.add(configuration.semanticContext);
 			}
 		}
-		if ( synpreds.size()==0 ) {
+		if ( synpreds.isEmpty() ) {
 			return null;
 		}
 		return synpreds;
@@ -688,7 +691,7 @@
 	 *  predicate implies we should evaluate the predicate to true. This
 	 *  means the whole edge has to be ungated. Consider:
 	 *
-	 *	 X : ('a' | {p}?=> 'a')
+	 *	 X : ('a' | {p}?=&gt; 'a')
 	 *	   | 'a' 'b'
 	 *	   ;
 	 *
@@ -698,13 +701,13 @@
 	 *  can't test p.  You can get to the same place with and w/o the context.
 	 *  Therefore, it is never ok to test p in this situation. 
 	 *
-	 *  TODO: cache this as it's called a lot; or at least set bit if >1 present in state
+	 *  TODO: cache this as it's called a lot; or at least set bit if &gt;1 present in state
 	 */
 	public SemanticContext getGatedPredicatesInNFAConfigurations() {
 		SemanticContext unionOfPredicatesFromAllAlts = null;
 		int numConfigs = nfaConfigurations.size();
 		for (int i = 0; i < numConfigs; i++) {
-			NFAConfiguration configuration = (NFAConfiguration) nfaConfigurations.get(i);
+			NFAConfiguration configuration = nfaConfigurations.get(i);
 			SemanticContext gatedPredExpr =
 				configuration.semanticContext.getGatedPredicateContext();
 			if ( gatedPredExpr==null ) {
@@ -748,11 +751,12 @@
     }
 
     /** Print all NFA states plus what alts they predict */
+	@Override
     public String toString() {
-        StringBuffer buf = new StringBuffer();
-        buf.append(stateNumber+":{");
+        StringBuilder buf = new StringBuilder();
+        buf.append(stateNumber).append(":{");
 		for (int i = 0; i < nfaConfigurations.size(); i++) {
-			NFAConfiguration configuration = (NFAConfiguration) nfaConfigurations.get(i);
+			NFAConfiguration configuration = nfaConfigurations.get(i);
 			if ( i>0 ) {
 				buf.append(", ");
 			}
diff --git a/tool/src/main/java/org/antlr/analysis/DecisionProbe.java b/tool/src/main/java/org/antlr/analysis/DecisionProbe.java
index 0e4d393..625728b 100644
--- a/tool/src/main/java/org/antlr/analysis/DecisionProbe.java
+++ b/tool/src/main/java/org/antlr/analysis/DecisionProbe.java
@@ -40,7 +40,7 @@
 /** Collection of information about what is wrong with a decision as
  *  discovered while building the DFA predictor.
  *
- *  The information is collected during NFA->DFA conversion and, while
+ *  The information is collected during NFA&rarr;DFA conversion and, while
  *  some of this is available elsewhere, it is nice to have it all tracked
  *  in one spot so a great error message can be easily had.  I also like
  *  the fact that this object tracks it all for later perusing to make an
@@ -118,7 +118,7 @@
 	 */
 	protected Set<Integer> altsWithProblem = new HashSet<Integer>();
 
-	/** If decision with > 1 alt has recursion in > 1 alt, it's (likely) nonregular
+	/** If decision with &gt; 1 alt has recursion in &gt; 1 alt, it's (likely) nonregular
 	 *  lookahead.  The decision cannot be made with a DFA.
 	 *  the alts are stored in altsWithProblem.
 	 */
@@ -156,7 +156,7 @@
 	 *  an input sequence.  Tracks the input position
 	 *  we were at the last time at this node.  If same input position, then
 	 *  we'd have reached same state without consuming input...probably an
-	 *  infinite loop.  Stop.  Set<String>.  The strings look like
+	 *  infinite loop.  Stop.  Set&lt;String&gt;.  The strings look like
 	 *  stateNumber_labelIndex.
 	 */
 	protected Set<String> statesVisitedAtInputDepth;
@@ -190,18 +190,15 @@
 	 *  no nondeterminisms unresolved by syn preds, all is ok with decision.
 	 */
 	public boolean isDeterministic() {
-		if ( danglingStates.size()==0 &&
-			 statesWithSyntacticallyAmbiguousAltsSet.size()==0 &&
-			 dfa.getUnreachableAlts().size()==0 )
+		if ( danglingStates.isEmpty() &&
+			 statesWithSyntacticallyAmbiguousAltsSet.isEmpty() &&
+			 dfa.getUnreachableAlts().isEmpty() )
 		{
 			return true;
 		}
 
 		if ( statesWithSyntacticallyAmbiguousAltsSet.size()>0 ) {
-			Iterator it =
-				statesWithSyntacticallyAmbiguousAltsSet.iterator();
-			while (	it.hasNext() ) {
-				DFAState d = (DFAState) it.next();
+			for (DFAState d : statesWithSyntacticallyAmbiguousAltsSet) {
 				if ( !statesResolvedWithSemanticPredicatesSet.contains(d) ) {
 					return false;
 				}
@@ -222,7 +219,7 @@
 		return stateToRecursionOverflowConfigurationsMap.size()>0;
 	}
 
-	/** Found recursion in > 1 alt */
+	/** Found recursion in &gt; 1 alt */
 	public boolean isNonLLStarDecision() {
 		return nonLLStarDecision;
 	}
@@ -246,23 +243,23 @@
 	 *  terminate early to avoid infinite recursion for example (due to
 	 *  left recursion perhaps).
 	 */
-	public Set getDanglingStates() {
+	public Set<DFAState> getDanglingStates() {
 		return danglingStates;
 	}
 
-    public Set getNonDeterministicAlts() {
+    public Set<Integer> getNonDeterministicAlts() {
         return altsWithProblem;
 	}
 
 	/** Return the sorted list of alts that conflict within a single state.
 	 *  Note that predicates may resolve the conflict.
 	 */
-	public List getNonDeterministicAltsForState(DFAState targetState) {
-		Set nondetAlts = targetState.getNonDeterministicAlts();
+	public List<Integer> getNonDeterministicAltsForState(DFAState targetState) {
+		Set<Integer> nondetAlts = targetState.getNonDeterministicAlts();
 		if ( nondetAlts==null ) {
 			return null;
 		}
-		List sorted = new LinkedList();
+		List<Integer> sorted = new LinkedList<Integer>();
 		sorted.addAll(nondetAlts);
 		Collections.sort(sorted); // make sure it's 1, 2, ...
 		return sorted;
@@ -272,7 +269,7 @@
 	 *  conflict.  You must report a problem for each state in this set
 	 *  because each state represents a different input sequence.
 	 */
-	public Set getDFAStatesWithSyntacticallyAmbiguousAlts() {
+	public Set<DFAState> getDFAStatesWithSyntacticallyAmbiguousAlts() {
 		return statesWithSyntacticallyAmbiguousAltsSet;
 	}
 
@@ -282,7 +279,7 @@
 	 *  that for this DFA state, that alt is disabled.  There may be other
 	 *  accept states for that alt that make an alt reachable.
 	 */
-	public Set getDisabledAlternatives(DFAState d) {
+	public Set<Integer> getDisabledAlternatives(DFAState d) {
 		return d.getDisabledAlternatives();
 	}
 
@@ -294,12 +291,12 @@
 		stateToRecursionOverflowConfigurationsMap.remove(stateI);
 	}
 
-	/** Return a List<Label> indicating an input sequence that can be matched
+	/** Return a List&lt;Label&gt; indicating an input sequence that can be matched
 	 *  from the start state of the DFA to the targetState (which is known
 	 *  to have a problem).
 	 */
 	public List<Label> getSampleNonDeterministicInputSequence(DFAState targetState) {
-		Set dfaStates = getDFAPathStatesToTarget(targetState);
+		Set<DFAState> dfaStates = getDFAPathStatesToTarget(targetState);
 		statesVisitedDuringSampleSequence = new HashSet<Integer>();
 		List<Label> labels = new ArrayList<Label>(); // may access ith element; use array
 		if ( dfa==null || dfa.startState==null ) {
@@ -312,15 +309,15 @@
 		return labels;
 	}
 
-	/** Given List<Label>, return a String with a useful representation
+	/** Given List&lt;Label&gt;, return a String with a useful representation
 	 *  of the associated input string.  One could show something different
 	 *  for lexers and parsers, for example.
 	 */
-	public String getInputSequenceDisplay(List labels) {
+	public String getInputSequenceDisplay(List<? extends Label> labels) {
         Grammar g = dfa.nfa.grammar;
-		StringBuffer buf = new StringBuffer();
-		for (Iterator it = labels.iterator(); it.hasNext();) {
-			Label label = (Label) it.next();
+		StringBuilder buf = new StringBuilder();
+		for (Iterator<? extends Label> it = labels.iterator(); it.hasNext();) {
+			Label label = it.next();
 			buf.append(label.toString(g));
 			if ( it.hasNext() && g.type!=Grammar.LEXER ) {
 				buf.append(' ');
@@ -337,13 +334,13 @@
 	 *  The first NFA state for all NFA paths will be the same: the starting
 	 *  NFA state of the first nondeterministic alt.  Imagine (A|B|A|A):
 	 *
-	 * 	5->9-A->o
+	 * 	5-&gt;9-A-&gt;o
 	 *  |
-	 *  6->10-B->o
+	 *  6-&gt;10-B-&gt;o
 	 *  |
-	 *  7->11-A->o
+	 *  7-&gt;11-A-&gt;o
 	 *  |
-	 *  8->12-A->o
+	 *  8-&gt;12-A-&gt;o
 	 *
 	 *  There are 3 nondeterministic alts.  The paths should be:
 	 *  5 9 ...
@@ -356,12 +353,12 @@
 	 *  the extra state beginning each alt in my NFA structures).  Here,
 	 *  firstAlt=1.
 	 */
-	public List getNFAPathStatesForAlt(int firstAlt,
+	public List<? extends NFAState> getNFAPathStatesForAlt(int firstAlt,
 									   int alt,
-									   List labels)
+									   List<? extends Label> labels)
 	{
 		NFAState nfaStart = dfa.getNFADecisionStartState();
-		List path = new LinkedList();
+		List<NFAState> path = new LinkedList<NFAState>();
 		// first add all NFA states leading up to altStart state
 		for (int a=firstAlt; a<=alt; a++) {
 			NFAState s =
@@ -375,7 +372,7 @@
 		path.add(isolatedAltStart);
 
 		// add the actual path now
-		statesVisitedAtInputDepth = new HashSet();
+		statesVisitedAtInputDepth = new HashSet<String>();
 		getNFAPath(isolatedAltStart,
 				   0,
 				   labels,
@@ -388,11 +385,11 @@
 	 *  predicate context for a particular alt.
 	 */
     public SemanticContext getSemanticContextForAlt(DFAState d, int alt) {
-		Map altToPredMap = (Map)stateToAltSetWithSemanticPredicatesMap.get(d);
+		Map<Integer, SemanticContext> altToPredMap = stateToAltSetWithSemanticPredicatesMap.get(d);
 		if ( altToPredMap==null ) {
 			return null;
 		}
-		return (SemanticContext)altToPredMap.get(Utils.integer(alt));
+		return altToPredMap.get(Utils.integer(alt));
 	}
 
 	/** At least one alt refs a sem or syn pred */
@@ -400,7 +397,7 @@
 		return stateToAltSetWithSemanticPredicatesMap.size()>0;
 	}
 
-	public Set getNondeterministicStatesResolvedWithSemanticPredicate() {
+	public Set<DFAState> getNondeterministicStatesResolvedWithSemanticPredicate() {
 		return statesResolvedWithSemanticPredicatesSet;
 	}
 
@@ -422,13 +419,13 @@
 		issueRecursionWarnings();
 
 		// generate a separate message for each problem state in DFA
-		Set resolvedStates = getNondeterministicStatesResolvedWithSemanticPredicate();
-		Set problemStates = getDFAStatesWithSyntacticallyAmbiguousAlts();
+		Set<DFAState> resolvedStates = getNondeterministicStatesResolvedWithSemanticPredicate();
+		Set<DFAState> problemStates = getDFAStatesWithSyntacticallyAmbiguousAlts();
 		if ( problemStates.size()>0 ) {
-			Iterator it =
+			Iterator<DFAState> it =
 				problemStates.iterator();
 			while (	it.hasNext() && !dfa.nfa.grammar.NFAToDFAConversionExternallyAborted() ) {
-				DFAState d = (DFAState) it.next();
+				DFAState d = it.next();
 				Map<Integer, Set<Token>> insufficientAltToLocations = getIncompletelyCoveredAlts(d);
 				if ( insufficientAltToLocations!=null && insufficientAltToLocations.size()>0 ) {
 					ErrorManager.insufficientPredicates(this,d,insufficientAltToLocations);
@@ -437,7 +434,7 @@
 				if ( resolvedStates==null || !resolvedStates.contains(d) ) {
 					// first strip last alt from disableAlts if it's wildcard
 					// then don't print error if no more disable alts
-					Set disabledAlts = getDisabledAlternatives(d);
+					Set<Integer> disabledAlts = getDisabledAlternatives(d);
 					stripWildCardAlts(disabledAlts);
 					if ( disabledAlts.size()>0 ) {
 						// nondeterminism; same input predicts multiple alts.
@@ -455,11 +452,10 @@
 			}
 		}
 
-		Set danglingStates = getDanglingStates();
+		Set<DFAState> danglingStates = getDanglingStates();
 		if ( danglingStates.size()>0 ) {
 			//System.err.println("no emanating edges for states: "+danglingStates);
-			for (Iterator it = danglingStates.iterator(); it.hasNext();) {
-				DFAState d = (DFAState) it.next();
+			for (DFAState d : danglingStates) {
 				ErrorManager.danglingState(this,d);
 			}
 		}
@@ -498,21 +494,21 @@
 	 *  if that alt is a simple wildcard.  If so, treat like an else clause
 	 *  and don't emit the error.  Strip out the last alt if it's wildcard.
 	 */
-	protected void stripWildCardAlts(Set disabledAlts) {
-		List sortedDisableAlts = new ArrayList(disabledAlts);
+	protected void stripWildCardAlts(Set<Integer> disabledAlts) {
+		List<Integer> sortedDisableAlts = new ArrayList<Integer>(disabledAlts);
 		Collections.sort(sortedDisableAlts);
 		Integer lastAlt =
-			(Integer)sortedDisableAlts.get(sortedDisableAlts.size()-1);
+			sortedDisableAlts.get(sortedDisableAlts.size()-1);
 		GrammarAST blockAST =
 			dfa.nfa.grammar.getDecisionBlockAST(dfa.decisionNumber);
 		//System.out.println("block with error = "+blockAST.toStringTree());
-		GrammarAST lastAltAST = null;
+		GrammarAST lastAltAST;
 		if ( blockAST.getChild(0).getType()==ANTLRParser.OPTIONS ) {
 			// if options, skip first child: ( options { ( = greedy false ) )
 			lastAltAST = (GrammarAST)blockAST.getChild(lastAlt.intValue());
 		}
 		else {
-			lastAltAST = (GrammarAST)blockAST.getChild(lastAlt.intValue()-1);
+			lastAltAST = (GrammarAST)blockAST.getChild(lastAlt -1);
 		}
 		//System.out.println("last alt is "+lastAltAST.toStringTree());
 		// if last alt looks like ( ALT . <end-of-alt> ) then wildcard
@@ -530,81 +526,79 @@
 
 	protected void issueRecursionWarnings() {
 		// RECURSION OVERFLOW
-		Set dfaStatesWithRecursionProblems =
+		Set<Integer> dfaStatesWithRecursionProblems =
 			stateToRecursionOverflowConfigurationsMap.keySet();
 		// now walk truly unique (unaliased) list of dfa states with inf recur
 		// Goal: create a map from alt to map<target,List<callsites>>
 		// Map<Map<String target, List<NFAState call sites>>
-		Map altToTargetToCallSitesMap = new HashMap();
+		Map<Integer, Map<String, Set<NFAState>>> altToTargetToCallSitesMap =
+			new HashMap<Integer, Map<String, Set<NFAState>>>();
 		// track a single problem DFA state for each alt
-		Map altToDFAState = new HashMap();
+		Map<Integer, DFAState> altToDFAState = new HashMap<Integer, DFAState>();
 		computeAltToProblemMaps(dfaStatesWithRecursionProblems,
 								stateToRecursionOverflowConfigurationsMap,
 								altToTargetToCallSitesMap, // output param
 								altToDFAState);            // output param
 
 		// walk each alt with recursion overflow problems and generate error
-		Set alts = altToTargetToCallSitesMap.keySet();
-		List sortedAlts = new ArrayList(alts);
+		Set<Integer> alts = altToTargetToCallSitesMap.keySet();
+		List<Integer> sortedAlts = new ArrayList<Integer>(alts);
 		Collections.sort(sortedAlts);
-		for (Iterator altsIt = sortedAlts.iterator(); altsIt.hasNext();) {
-			Integer altI = (Integer) altsIt.next();
-			Map targetToCallSiteMap =
-				(Map)altToTargetToCallSitesMap.get(altI);
-			Set targetRules = targetToCallSiteMap.keySet();
-			Collection callSiteStates = targetToCallSiteMap.values();
-			DFAState sampleBadState = (DFAState)altToDFAState.get(altI);
+		for (Integer altI : sortedAlts) {
+			Map<String, Set<NFAState>> targetToCallSiteMap =
+				altToTargetToCallSitesMap.get(altI);
+			Set<String> targetRules = targetToCallSiteMap.keySet();
+			Collection<Set<NFAState>> callSiteStates = targetToCallSiteMap.values();
+			DFAState sampleBadState = altToDFAState.get(altI);
 			ErrorManager.recursionOverflow(this,
 										   sampleBadState,
-										   altI.intValue(),
+										   altI,
 										   targetRules,
 										   callSiteStates);
 		}
 	}
 
-	private void computeAltToProblemMaps(Set dfaStatesUnaliased,
-										 Map configurationsMap,
-										 Map altToTargetToCallSitesMap,
-										 Map altToDFAState)
+	private void computeAltToProblemMaps(Set<Integer> dfaStatesUnaliased,
+										 Map<Integer, List<NFAConfiguration>> configurationsMap,
+										 Map<Integer, Map<String, Set<NFAState>>> altToTargetToCallSitesMap,
+										 Map<Integer, DFAState> altToDFAState)
 	{
-		for (Iterator it = dfaStatesUnaliased.iterator(); it.hasNext();) {
-			Integer stateI = (Integer) it.next();
+		for (Integer stateI : dfaStatesUnaliased) {
 			// walk this DFA's config list
-			List configs = (List)configurationsMap.get(stateI);
+			List<? extends NFAConfiguration> configs = configurationsMap.get(stateI);
 			for (int i = 0; i < configs.size(); i++) {
-				NFAConfiguration c = (NFAConfiguration) configs.get(i);
+				NFAConfiguration c = configs.get(i);
 				NFAState ruleInvocationState = dfa.nfa.getState(c.state);
 				Transition transition0 = ruleInvocationState.transition[0];
 				RuleClosureTransition ref = (RuleClosureTransition)transition0;
 				String targetRule = ((NFAState) ref.target).enclosingRule.name;
 				Integer altI = Utils.integer(c.alt);
-				Map targetToCallSiteMap =
-					(Map)altToTargetToCallSitesMap.get(altI);
+				Map<String, Set<NFAState>> targetToCallSiteMap =
+					altToTargetToCallSitesMap.get(altI);
 				if ( targetToCallSiteMap==null ) {
-					targetToCallSiteMap = new HashMap();
+					targetToCallSiteMap = new HashMap<String, Set<NFAState>>();
 					altToTargetToCallSitesMap.put(altI, targetToCallSiteMap);
 				}
-				Set callSites =
-					(HashSet)targetToCallSiteMap.get(targetRule);
+				Set<NFAState> callSites =
+					targetToCallSiteMap.get(targetRule);
 				if ( callSites==null ) {
-					callSites = new HashSet();
+					callSites = new HashSet<NFAState>();
 					targetToCallSiteMap.put(targetRule, callSites);
 				}
 				callSites.add(ruleInvocationState);
 				// track one problem DFA state per alt
 				if ( altToDFAState.get(altI)==null ) {
-					DFAState sampleBadState = dfa.getState(stateI.intValue());
+					DFAState sampleBadState = dfa.getState(stateI);
 					altToDFAState.put(altI, sampleBadState);
 				}
 			}
 		}
 	}
 
-	private Set getUnaliasedDFAStateSet(Set dfaStatesWithRecursionProblems) {
-		Set dfaStatesUnaliased = new HashSet();
-		for (Iterator it = dfaStatesWithRecursionProblems.iterator(); it.hasNext();) {
-			Integer stateI = (Integer) it.next();
-			DFAState d = dfa.getState(stateI.intValue());
+	private Set<Integer> getUnaliasedDFAStateSet(Set<Integer> dfaStatesWithRecursionProblems) {
+		Set<Integer> dfaStatesUnaliased = new HashSet<Integer>();
+		for (Integer stateI : dfaStatesWithRecursionProblems) {
+			DFAState d = dfa.getState(stateI);
 			dfaStatesUnaliased.add(Utils.integer(d.stateNumber));
 		}
 		return dfaStatesUnaliased;
@@ -689,8 +683,8 @@
 	 *  tryToResolveWithSemanticPredicates() while flagging NFA configurations
 	 *  in d as resolved.
 	 */
-	public void reportAltPredicateContext(DFAState d, Map altPredicateContext) {
-		Map copy = new HashMap();
+	public void reportAltPredicateContext(DFAState d, Map<Integer, ? extends SemanticContext> altPredicateContext) {
+		Map<Integer, SemanticContext> copy = new HashMap<Integer, SemanticContext>();
 		copy.putAll(altPredicateContext);
 		stateToAltSetWithSemanticPredicatesMap.put(d,copy);
 	}
@@ -709,7 +703,7 @@
 	 */
 	protected boolean reachesState(DFAState startState,
 								   DFAState targetState,
-								   Set states) {
+								   Set<DFAState> states) {
 		if ( startState==targetState ) {
 			states.add(targetState);
 			//System.out.println("found target DFA state "+targetState.getStateNumber());
@@ -750,9 +744,9 @@
 		return false; // no path to targetState found.
 	}
 
-	protected Set getDFAPathStatesToTarget(DFAState targetState) {
-		Set dfaStates = new HashSet();
-		stateReachable = new HashMap();
+	protected Set<DFAState> getDFAPathStatesToTarget(DFAState targetState) {
+		Set<DFAState> dfaStates = new HashSet<DFAState>();
+		stateReachable = new HashMap<Integer, Integer>();
 		if ( dfa==null || dfa.startState==null ) {
 			return dfaStates;
 		}
@@ -763,7 +757,7 @@
 	/** Given a start state and a final state, find a list of edge labels
 	 *  between the two ignoring epsilon.  Limit your scan to a set of states
 	 *  passed in.  This is used to show a sample input sequence that is
-	 *  nondeterministic with respect to this decision.  Return List<Label> as
+	 *  nondeterministic with respect to this decision.  Return List&lt;Label&gt; as
 	 *  a parameter.  The incoming states set must be all states that lead
 	 *  from startState to targetState and no others so this algorithm doesn't
 	 *  take a path that eventually leads to a state other than targetState.
@@ -771,7 +765,7 @@
 	 */
 	protected void getSampleInputSequenceUsingStateSet(State startState,
 													   State targetState,
-													   Set states,
+													   Set<DFAState> states,
 													   List<Label> labels)
 	{
 		statesVisitedDuringSampleSequence.add(startState.stateNumber);
@@ -810,8 +804,8 @@
 	 */
 	protected boolean getNFAPath(NFAState s,     // starting where?
 								 int labelIndex, // 0..labels.size()-1
-								 List labels,    // input sequence
-								 List path)      // output list of NFA states
+								 List<? extends Label> labels,    // input sequence
+								 List<? super NFAState> path)      // output list of NFA states
 	{
 		// track a visit to state s at input index labelIndex if not seen
 		String thisStateKey = getStateLabelIndexKey(s.stateNumber,labelIndex);
@@ -887,7 +881,7 @@
 	}
 
 	protected String getStateLabelIndexKey(int s, int i) {
-		StringBuffer buf = new StringBuffer();
+		StringBuilder buf = new StringBuilder();
 		buf.append(s);
 		buf.append('_');
 		buf.append(i);
diff --git a/tool/src/main/java/org/antlr/analysis/LL1Analyzer.java b/tool/src/main/java/org/antlr/analysis/LL1Analyzer.java
index c3f4432..b5dd463 100644
--- a/tool/src/main/java/org/antlr/analysis/LL1Analyzer.java
+++ b/tool/src/main/java/org/antlr/analysis/LL1Analyzer.java
@@ -259,7 +259,7 @@
 					(RuleClosureTransition)transition0;
 				// remove the EOR and get what follows
 				//tset.remove(Label.EOR_TOKEN_TYPE);
-				NFAState following = (NFAState) ruleInvocationTrans.followState;
+				NFAState following = ruleInvocationTrans.followState;
 				LookaheadSet fset =	_FIRST(following, chaseFollowTransitions);
 				fset.orInPlace(tset); // tset cached; or into new set
 				fset.remove(Label.EOR_TOKEN_TYPE);
@@ -361,7 +361,7 @@
 				// should include A.
 				RuleClosureTransition ruleInvocationTrans =
 					(RuleClosureTransition)transition0;
-				NFAState following = (NFAState) ruleInvocationTrans.followState;
+				NFAState following = ruleInvocationTrans.followState;
 				int afterRuleResult =
 					_detectConfoundingPredicates(following,
 												 enclosingRule,
@@ -420,7 +420,7 @@
 		}
 
 		SemanticContext p = null;
-		SemanticContext p0 = null;
+		SemanticContext p0;
 		SemanticContext p1 = null;
 		if ( transition0.label.isSemanticPredicate() ) {
 			//System.out.println("pred "+transition0.label);
diff --git a/tool/src/main/java/org/antlr/analysis/LL1DFA.java b/tool/src/main/java/org/antlr/analysis/LL1DFA.java
index d8f6759..55f0f8c 100644
--- a/tool/src/main/java/org/antlr/analysis/LL1DFA.java
+++ b/tool/src/main/java/org/antlr/analysis/LL1DFA.java
@@ -34,6 +34,7 @@
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 
 /** A special DFA that is exactly LL(1) or LL(1) with backtracking mode
  *  predicates to resolve edge set collisions.
@@ -42,12 +43,13 @@
 	/** From list of lookahead sets (one per alt in decision), create
 	 *  an LL(1) DFA.  One edge per set.
 	 *
-	 *  s0-{alt1}->:o=>1
+	 *  s0-{alt1}-&gt;:o=&gt;1
 	 *  | \
-	 *  |  -{alt2}->:o=>2
+	 *  |  -{alt2}-&gt;:o=&gt;2
 	 *  |
 	 *  ...
 	 */
+	@SuppressWarnings("OverridableMethodCallInConstructor")
 	public LL1DFA(int decisionNumber, NFAState decisionStartState, LookaheadSet[] altLook) {
 		DFAState s0 = newState();
 		startState = s0;
@@ -68,9 +70,10 @@
 		}
 	}
 
-	/** From a set of edgeset->list-of-alts mappings, create a DFA
-	 *  that uses syn preds for all |list-of-alts|>1.
+	/** From a set of edgeset&rarr;list-of-alts mappings, create a DFA
+	 *  that uses syn preds for all |list-of-alts|&gt;1.
 	 */
+	@SuppressWarnings("OverridableMethodCallInConstructor")
 	public LL1DFA(int decisionNumber,
 				  NFAState decisionStartState,
 				  MultiMap<IntervalSet, Integer> edgeMap)
@@ -83,9 +86,9 @@
 		this.decisionNFAStartState = decisionStartState;
 		initAltRelatedInfo();
 		unreachableAlts = null;
-		for (Iterator it = edgeMap.keySet().iterator(); it.hasNext();) {
-			IntervalSet edge = (IntervalSet)it.next();
-			List<Integer> alts = edgeMap.get(edge);
+		for (Map.Entry<IntervalSet, List<Integer>> entry : edgeMap.entrySet()) {
+			IntervalSet edge = entry.getKey();
+			List<Integer> alts = entry.getValue();
 			Collections.sort(alts); // make sure alts are attempted in order
 			//System.out.println(edge+" -> "+alts);
 			DFAState s = newState();
@@ -138,7 +141,7 @@
 	}
 
 	protected Label getLabelForSet(IntervalSet edgeSet) {
-		Label e = null;
+		Label e;
 		int atom = edgeSet.getSingleElement();
 		if ( atom != Label.INVALID ) {
 			e = new Label(atom);
diff --git a/tool/src/main/java/org/antlr/analysis/Label.java b/tool/src/main/java/org/antlr/analysis/Label.java
index 3a8a976..edd0c19 100644
--- a/tool/src/main/java/org/antlr/analysis/Label.java
+++ b/tool/src/main/java/org/antlr/analysis/Label.java
@@ -35,9 +35,9 @@
  *  label such as a token or character.  A label can be a set of char or
  *  tokens.  It can be an epsilon transition.  It can be a semantic predicate
  *  (which assumes an epsilon transition) or a tree of predicates (in a DFA).
- *  Special label types have to be < 0 to avoid conflict with char.
+ *  Special label types have to be &lt; 0 to avoid conflict with char.
  */
-public class Label implements Comparable, Cloneable {
+public class Label implements Comparable<Label>, Cloneable {
     public static final int INVALID = -7;
 
 	public static final int ACTION = -6;
@@ -60,9 +60,9 @@
      *
      *  yields a DFA predictor:
      *
-     *  o-a->o-b->1   predict alt 1
+     *  o-a-&gt;o-b-&gt;1   predict alt 1
      *       |
-     *       |-EOT->o predict alt 2
+     *       |-EOT-&gt;o predict alt 2
      *
      *  To generate code for EOT, treat it as the "default" path, which
      *  implies there is no way to mismatch a char for the state from
@@ -142,6 +142,7 @@
         this.labelSet = labelSet;
     }
 
+	@Override
 	public Object clone() {
 		Label l;
 		try {
@@ -263,6 +264,7 @@
 		return false;
 	}
 
+	@Override
     public int hashCode() {
         if (label==SET) {
             return labelSet.hashCode();
@@ -273,6 +275,7 @@
 	}
 
 	// TODO: do we care about comparing set {A} with atom A? Doesn't now.
+	@Override
 	public boolean equals(Object o) {
 		if ( o==null ) {
 			return false;
@@ -290,8 +293,9 @@
 		return true;  // label values are same, so true
     }
 
-    public int compareTo(Object o) {
-        return this.label-((Label)o).label;
+	@Override
+    public int compareTo(Label o) {
+        return this.label-o.label;
     }
 
     /** Predicates are lists of AST nodes from the NFA created from the
@@ -322,6 +326,7 @@
     }
       */
 
+	@Override
     public String toString() {
         switch (label) {
             case SET :
diff --git a/tool/src/main/java/org/antlr/analysis/LookaheadSet.java b/tool/src/main/java/org/antlr/analysis/LookaheadSet.java
index 7325cc8..4c4efb4 100644
--- a/tool/src/main/java/org/antlr/analysis/LookaheadSet.java
+++ b/tool/src/main/java/org/antlr/analysis/LookaheadSet.java
@@ -84,13 +84,15 @@
 	}
 
 	public void remove(int a) {
-		tokenTypeSet = (IntervalSet)tokenTypeSet.subtract(IntervalSet.of(a));
+		tokenTypeSet = tokenTypeSet.subtract(IntervalSet.of(a));
 	}
 
+	@Override
 	public int hashCode() {
 		return tokenTypeSet.hashCode();
 	}
 
+	@Override
 	public boolean equals(Object other) {
 		return tokenTypeSet.equals(((LookaheadSet)other).tokenTypeSet);
 	}
@@ -103,6 +105,7 @@
 		return r;
 	}
 
+	@Override
 	public String toString() {
 		return toString(null);
 	}
diff --git a/tool/src/main/java/org/antlr/analysis/MachineProbe.java b/tool/src/main/java/org/antlr/analysis/MachineProbe.java
index e5da266..2c2dc7e 100644
--- a/tool/src/main/java/org/antlr/analysis/MachineProbe.java
+++ b/tool/src/main/java/org/antlr/analysis/MachineProbe.java
@@ -94,7 +94,7 @@
 	}
 
 	/**
-	 * Given List<IntSet>, return a String with a useful representation of the
+	 * Given List&lt;IntSet&gt;, return a String with a useful representation of the
 	 * associated input string. One could show something different for lexers
 	 * and parsers, for example.
 	 */
diff --git a/tool/src/main/java/org/antlr/analysis/NFAConfiguration.java b/tool/src/main/java/org/antlr/analysis/NFAConfiguration.java
index 37f3d38..6ed9326 100644
--- a/tool/src/main/java/org/antlr/analysis/NFAConfiguration.java
+++ b/tool/src/main/java/org/antlr/analysis/NFAConfiguration.java
@@ -48,7 +48,7 @@
     /** The set of semantic predicates associated with this NFA
      *  configuration.  The predicates were found on the way to
      *  the associated NFA state in this syntactic context.
-     *  Set<AST>: track nodes in grammar containing the predicate
+     *  Set&lt;AST&gt;: track nodes in grammar containing the predicate
      *  for error messages and such (nice to know where the predicate
      *  came from in case of duplicates etc...).  By using a set,
      *  the equals() method will correctly show {pred1,pred2} as equals()
@@ -75,7 +75,7 @@
     protected boolean resolveWithPredicate;
 
     /** Lots of NFA states have only epsilon edges (1 or 2).  We can
-     *  safely consider only n>0 during closure.
+     *  safely consider only n&gt;0 during closure.
      */
     protected int numberEpsilonTransitionsEmanatingFromState;
 
@@ -104,6 +104,7 @@
      *  semantic contexts, but might as well define equals to be
      *  everything.
      */
+	@Override
     public boolean equals(Object o) {
 		if ( o==null ) {
 			return false;
@@ -115,17 +116,19 @@
                this.semanticContext.equals(other.semanticContext);
     }
 
+	@Override
     public int hashCode() {
         int h = state + alt + context.hashCode();
         return h;
     }
 
+	@Override
 	public String toString() {
 		return toString(true);
 	}
 
 	public String toString(boolean showAlt) {
-		StringBuffer buf = new StringBuffer();
+		StringBuilder buf = new StringBuilder();
 		buf.append(state);
 		if ( showAlt ) {
 			buf.append("|");
diff --git a/tool/src/main/java/org/antlr/analysis/NFAContext.java b/tool/src/main/java/org/antlr/analysis/NFAContext.java
index f56ec42..ac15f14 100644
--- a/tool/src/main/java/org/antlr/analysis/NFAContext.java
+++ b/tool/src/main/java/org/antlr/analysis/NFAContext.java
@@ -62,7 +62,7 @@
 	 *  you could chase your tail forever if somebody said "s : e '.' | e ';' ;"
 	 *  This constant prevents new states from being created after a stack gets
 	 *  "too big".  Actually (12/14/2007) I realize that this example is
-	 *  trapped by the non-LL(*) detector for recursion in > 1 alt.  Here is
+	 *  trapped by the non-LL(*) detector for recursion in &gt; 1 alt.  Here is
 	 *  an example that trips stack overflow:
 	 *
 	 *	  s : a Y | A A A A A X ; // force recursion past m=4
@@ -135,6 +135,7 @@
 	 *  The hashCode is now cheap as it's computed once upon each context
 	 *  push on the stack.  Use it to make equals() more efficient.
 	 */
+	@Override
 	public boolean equals(Object o) {
 		NFAContext other = ((NFAContext)o);
 		if ( this.cachedHashCode != other.cachedHashCode ) {
@@ -167,7 +168,7 @@
 	 *  This is used in relation to checking conflicts associated with a
 	 *  single NFA state's configurations within a single DFA state.
 	 *  If there are configurations s and t within a DFA state such that
-	 *  s.state=t.state && s.alt != t.alt && s.ctx conflicts t.ctx then
+	 *  s.state=t.state &amp;&amp; s.alt != t.alt &amp;&amp; s.ctx conflicts t.ctx then
 	 *  the DFA state predicts more than a single alt--it's nondeterministic.
 	 *  Two contexts conflict if they are the same or if one is a suffix
 	 *  of the other.
@@ -259,6 +260,7 @@
 		return n;
 	}
 
+	@Override
     public int hashCode() {
         return cachedHashCode;
         /*
@@ -279,8 +281,9 @@
 		return parent==null;
 	}
 
+	@Override
     public String toString() {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         NFAContext sp = this;
         buf.append("[");
         while ( sp.parent!=null ) {
diff --git a/tool/src/main/java/org/antlr/analysis/NFAConversionThread.java b/tool/src/main/java/org/antlr/analysis/NFAConversionThread.java
index 0966fda..3690c94 100644
--- a/tool/src/main/java/org/antlr/analysis/NFAConversionThread.java
+++ b/tool/src/main/java/org/antlr/analysis/NFAConversionThread.java
@@ -46,6 +46,7 @@
 		this.i = i;
 		this.j = j;
 	}
+	@Override
 	public void run() {
 		for (int decision=i; decision<=j; decision++) {
 			NFAState decisionStartState = grammar.getDecisionNFAStartState(decision);
diff --git a/tool/src/main/java/org/antlr/analysis/NFAState.java b/tool/src/main/java/org/antlr/analysis/NFAState.java
index 84e1365..4f27545 100644
--- a/tool/src/main/java/org/antlr/analysis/NFAState.java
+++ b/tool/src/main/java/org/antlr/analysis/NFAState.java
@@ -47,7 +47,7 @@
 	int numTransitions = 0;
 	public Transition[] transition = new Transition[MAX_TRANSITIONS];
 
-	/** For o-A->o type NFA tranitions, record the label that leads to this
+	/** For o-A-&gt;o type NFA tranitions, record the label that leads to this
 	 *  state.  Useful for creating rich error messages when we find
 	 *  insufficiently (with preds) covered states.
 	 */
@@ -73,7 +73,7 @@
 	 *  the DFA will always report alt n+1 as the exit branch for n real
 	 *  alts, so I need to translate that depending on the decision state.
 	 *
-	 *  If decisionNumber>0 then this var tells you what kind of decision
+	 *  If decisionNumber&gt;0 then this var tells you what kind of decision
 	 *  state it is.
 	 */
 	public int decisionStateType;
@@ -109,10 +109,12 @@
 		this.nfa = nfa;
 	}
 
+	@Override
 	public int getNumberOfTransitions() {
 		return numTransitions;
 	}
 
+	@Override
 	public void addTransition(Transition e) {
 		if ( e==null ) {
 			throw new IllegalArgumentException("You can't add a null transition");			
@@ -147,6 +149,7 @@
 		numTransitions = 1;
 	}
 
+	@Override
 	public Transition transition(int i) {
 		return transition[i];
 	}
@@ -251,6 +254,7 @@
 		return decisionStateType>0;
 	}
 
+	@Override
 	public String toString() {
 		return String.valueOf(stateNumber);
 	}
diff --git a/tool/src/main/java/org/antlr/analysis/NFAToDFAConverter.java b/tool/src/main/java/org/antlr/analysis/NFAToDFAConverter.java
index 543ab2b..f4b8538 100644
--- a/tool/src/main/java/org/antlr/analysis/NFAToDFAConverter.java
+++ b/tool/src/main/java/org/antlr/analysis/NFAToDFAConverter.java
@@ -40,7 +40,7 @@
  */
 public class NFAToDFAConverter {
 	/** A list of DFA states we still need to process during NFA conversion */
-	protected List work = new LinkedList();
+	protected List<DFAState> work = new LinkedList<DFAState>();
 
 	/** While converting NFA, we must track states that
 	 *  reference other rule's NFAs so we know what to do
@@ -83,7 +83,7 @@
 		while ( work.size()>0 &&
 				!dfa.nfa.grammar.NFAToDFAConversionExternallyAborted() )
 		{
-			DFAState d = (DFAState) work.get(0);
+			DFAState d = work.get(0);
 			if ( dfa.nfa.grammar.composite.watchNFAConversion ) {
 				System.out.println("convert DFA state "+d.stateNumber+
 								   " ("+d.nfaConfigurations.size()+" nfa states)");
@@ -193,14 +193,14 @@
 		return startState;
 	}
 
-	/** From this node, add a d--a-->t transition for all
+	/** From this node, add a d--a--&gt;t transition for all
 	 *  labels 'a' where t is a DFA node created
 	 *  from the set of NFA states reachable from any NFA
 	 *  state in DFA state d.
 	 */
 	protected void findNewDFAStatesAndAddDFATransitions(DFAState d) {
 		//System.out.println("work on DFA state "+d);
-		OrderedHashSet labels = d.getReachableLabels();
+		OrderedHashSet<Label> labels = d.getReachableLabels();
 		//System.out.println("reachable labels="+labels);
 
 		/*
@@ -264,14 +264,14 @@
 		*/
 
 		int numberOfEdgesEmanating = 0;
-		Map targetToLabelMap = new HashMap();
+		Map<Integer, Transition> targetToLabelMap = new HashMap<Integer, Transition>();
 		// for each label that could possibly emanate from NFAStates of d
 		int numLabels = 0;
 		if ( labels!=null ) {
 			numLabels = labels.size();
 		}
 		for (int i=0; i<numLabels; i++) {
-			Label label = (Label)labels.get(i);
+			Label label = labels.get(i);
 			DFAState t = reach(d, label);
 			if ( debug ) {
 				System.out.println("DFA state after reach "+label+" "+d+"-" +
@@ -356,14 +356,14 @@
 	 *
 	 *  The normal decision to predict alts 1, 2, 3 is:
 	 *
-	 *  if ( (input.LA(1)>='1' && input.LA(1)<='9') ) {
+	 *  if ( (input.LA(1)&gt;='1' &amp;&amp; input.LA(1)&lt;='9') ) {
      *       alt7=1;
      *  }
      *  else if ( input.LA(1)=='0' ) {
      *      if ( input.LA(2)=='X'||input.LA(2)=='x' ) {
      *          alt7=2;
      *      }
-     *      else if ( (input.LA(2)>='0' && input.LA(2)<='7') ) {
+     *      else if ( (input.LA(2)&gt;='0' &amp;&amp; input.LA(2)&lt;='7') ) {
      *           alt7=3;
      *      }
      *      else if ( input.LA(2)=='L'||input.LA(2)=='l' ) {
@@ -381,7 +381,7 @@
 	 *
 	 *  A better decision is as follows:
      *
-	 *  if ( (input.LA(1)>='1' && input.LA(1)<='9') ) {
+	 *  if ( (input.LA(1)&gt;='1' &amp;&amp; input.LA(1)&lt;='9') ) {
 	 *      alt7=1;
 	 *  }
 	 *  else if ( input.LA(1)=='0' ) {
@@ -408,14 +408,14 @@
 	protected static int addTransition(DFAState d,
 									   Label label,
 									   DFAState targetState,
-									   Map targetToLabelMap)
+									   Map<Integer, Transition> targetToLabelMap)
 	{
 		//System.out.println(d.stateNumber+"-"+label.toString(dfa.nfa.grammar)+"->"+targetState.stateNumber);
 		int n = 0;
 		if ( DFAOptimizer.COLLAPSE_ALL_PARALLEL_EDGES ) {
 			// track which targets we've hit
 			Integer tI = Utils.integer(targetState.stateNumber);
-			Transition oldTransition = (Transition)targetToLabelMap.get(tI);
+			Transition oldTransition = targetToLabelMap.get(tI);
 			if ( oldTransition!=null ) {
 				//System.out.println("extra transition to "+tI+" upon "+label.toString(dfa.nfa.grammar));
 				// already seen state d to target transition, just add label
@@ -466,7 +466,7 @@
 		// for each NFA configuration in d (abort if we detect non-LL(*) state)
 		int numConfigs = configs.size();
 		for (int i = 0; i < numConfigs; i++) {
-			NFAConfiguration c = (NFAConfiguration)configs.get(i);
+			NFAConfiguration c = configs.get(i);
 			if ( c.singleAtomTransitionEmanating ) {
 				continue; // ignore NFA states w/o epsilon transitions
 			}
@@ -514,7 +514,7 @@
 	 *
 	 *   3. Like case 2, we reach an NFA state associated with the end of a
 	 *      rule, r, in the grammar from which NFA was built.  In this case,
-	 *      however, we realize that during this NFA->DFA conversion, no state
+	 *      however, we realize that during this NFA&rarr;DFA conversion, no state
 	 *      invoked the current rule's NFA.  There is no choice but to add
 	 *      all NFA states that follow references to r's start state.  This is
 	 *      analogous to computing the FOLLOW(r) in the LL(k) world.  By
@@ -581,7 +581,7 @@
 	 *        ;
 	 *
 	 *      Input L ID R is ambiguous but to figure this out, ANTLR
-	 *      needs to go a->b->a->b to find the L ID sequence.
+	 *      needs to go a-&gt;b-&gt;a-&gt;b to find the L ID sequence.
 	 *
 	 *      Do not allow closure to add a configuration that would
 	 *      allow too much recursion.
@@ -910,13 +910,13 @@
 	 *  That would mean that two NFA configurations could reach the
 	 *  end of the token with possibly different predicted alts.
 	 *  Seems like that would be rare or impossible.  Perhaps convert
-	 *  this routine to find all such configs and give error if >1.
+	 *  this routine to find all such configs and give error if &gt;1.
 	 */
 	protected void convertToEOTAcceptState(DFAState d) {
 		Label eot = new Label(Label.EOT);
 		int numConfigs = d.nfaConfigurations.size();
 		for (int i = 0; i < numConfigs; i++) {
-			NFAConfiguration c = (NFAConfiguration)d.nfaConfigurations.get(i);
+			NFAConfiguration c = d.nfaConfigurations.get(i);
 			if ( c.resolved || c.resolveWithPredicate ) {
 				continue; // the conflict resolver indicates we must leave alone
 			}
@@ -938,7 +938,7 @@
 	/** Add a new DFA state to the DFA if not already present.
      *  If the DFA state uniquely predicts a single alternative, it
      *  becomes a stop state; don't add to work list.  Further, if
-     *  there exists an NFA state predicted by > 1 different alternatives
+     *  there exists an NFA state predicted by &gt; 1 different alternatives
      *  and with the same syn and sem context, the DFA is nondeterministic for
      *  at least one input sequence reaching that NFA state.
      */
@@ -1024,7 +1024,7 @@
 		return d;
 	}
 
-	/** If > 1 NFA configurations within this DFA state have identical
+	/** If &gt; 1 NFA configurations within this DFA state have identical
 	 *  NFA state and context, but differ in their predicted
 	 *  TODO update for new context suffix stuff 3-9-2005
 	 *  alternative then a single input sequence predicts multiple alts.
@@ -1079,13 +1079,13 @@
 	 *
 	 *  Here is a (slightly reduced) NFA of this grammar:
 	 *
-	 *  (1)-A->(2)-B->(end)-EOF->(8)
+	 *  (1)-A-&gt;(2)-B-&gt;(end)-EOF-&gt;(8)
 	 *   |              ^
-	 *  (2)-A->(3)-C----|
+	 *  (2)-A-&gt;(3)-C----|
 	 *   |              ^
-	 *  (4)-A->(5)------|
+	 *  (4)-A-&gt;(5)------|
 	 *   |              ^
-	 *  (6)-A->(7)------|
+	 *  (6)-A-&gt;(7)------|
 	 *
 	 *  where (n) is NFA state n.  To begin DFA conversion, the start
 	 *  state is created:
@@ -1114,9 +1114,9 @@
 	 *  {(1|1),(2|2),(4|3),(6|4)}
 	 *              |
 	 *              v
-	 *  {(2|1),(3|2),(5|3),(7|4),(end|3),(end|4)} -B-> (end|1)
+	 *  {(2|1),(3|2),(5|3),(7|4),(end|3),(end|4)} -B-&gt; (end|1)
 	 *              |                        |
-	 *              C                        ----EOF-> (8,3)
+	 *              C                        ----EOF-&gt; (8,3)
 	 *              |
 	 *              v
 	 *           (end|2)
@@ -1160,7 +1160,7 @@
 	 *  it uniquely predicts one alt. :)  Problem
 	 *  states will look like this during conversion:
 	 *
-	 *  DFA 1:{9|1, 19|2, 14|3, 20|2, 23|2, 24|2, ...}-<EOT>->5:{41|3, 42|2}
+	 *  DFA 1:{9|1, 19|2, 14|3, 20|2, 23|2, 24|2, ...}-&lt;EOT&gt;-&gt;5:{41|3, 42|2}
 	 *
 	 *  Worse, when you have two identical literal rules, you will see 3 alts
 	 *  in the EOT state (one for ID and one each for the identical rules).
@@ -1170,7 +1170,7 @@
 			System.out.println("resolveNonDeterminisms "+d.toString());
 		}
 		boolean conflictingLexerRules = false;
-		Set nondeterministicAlts = d.getNonDeterministicAlts();
+		Set<Integer> nondeterministicAlts = d.getNonDeterministicAlts();
 		if ( debug && nondeterministicAlts!=null ) {
 			System.out.println("nondet alts="+nondeterministicAlts);
 		}
@@ -1187,7 +1187,7 @@
 		// indicate that d is nondeterministic on all alts otherwise
 		// it looks like state has no problem
 		if ( anyState.isEOTTargetState() ) {
-			Set allAlts = d.getAltSet();
+			Set<Integer> allAlts = d.getAltSet();
 			// is more than 1 alt predicted?
 			if ( allAlts!=null && allAlts.size()>1 ) {
 				nondeterministicAlts = allAlts;
@@ -1233,8 +1233,8 @@
 		//System.out.println("state "+d.stateNumber+" resolved to alt "+winningAlt);
 	}
 
-	protected int resolveByChoosingFirstAlt(DFAState d, Set nondeterministicAlts) {
-		int winningAlt = 0;
+	protected int resolveByChoosingFirstAlt(DFAState d, Set<Integer> nondeterministicAlts) {
+		int winningAlt;
 		if ( dfa.isGreedy() ) {
 			winningAlt = resolveByPickingMinAlt(d,nondeterministicAlts);
 		}
@@ -1270,8 +1270,8 @@
 	 *
 	 *  Return the min alt found.
 	 */
-	protected int resolveByPickingMinAlt(DFAState d, Set nondeterministicAlts) {
-		int min = Integer.MAX_VALUE;
+	protected int resolveByPickingMinAlt(DFAState d, Set<Integer> nondeterministicAlts) {
+		int min;
 		if ( nondeterministicAlts!=null ) {
 			min = getMinAlt(nondeterministicAlts);
 		}
@@ -1287,7 +1287,7 @@
 	/** Resolve state d by choosing exit alt, which is same value as the
 	 *  number of alternatives.  Return that exit alt.
 	 */
-	protected int resolveByPickingExitAlt(DFAState d, Set nondeterministicAlts) {
+	protected int resolveByPickingExitAlt(DFAState d, Set<Integer> nondeterministicAlts) {
 		int exitAlt = dfa.getNumberOfAlts();
 		turnOffOtherAlts(d, exitAlt, nondeterministicAlts);
 		return exitAlt;
@@ -1299,7 +1299,7 @@
 	protected static void turnOffOtherAlts(DFAState d, int min, Set<Integer> nondeterministicAlts) {
 		int numConfigs = d.nfaConfigurations.size();
 		for (int i = 0; i < numConfigs; i++) {
-			NFAConfiguration configuration = (NFAConfiguration)d.nfaConfigurations.get(i);
+			NFAConfiguration configuration = d.nfaConfigurations.get(i);
 			if ( configuration.alt!=min ) {
 				if ( nondeterministicAlts==null ||
 					 nondeterministicAlts.contains(Utils.integer(configuration.alt)) )
@@ -1313,7 +1313,7 @@
 	protected static int getMinAlt(Set<Integer> nondeterministicAlts) {
 		int min = Integer.MAX_VALUE;
 		for (Integer altI : nondeterministicAlts) {
-			int alt = altI.intValue();
+			int alt = altI;
 			if ( alt < min ) {
 				min = alt;
 			}
@@ -1350,12 +1350,12 @@
 	 *  This is done down in getPredicatesPerNonDeterministicAlt().
 	 */
 	protected boolean tryToResolveWithSemanticPredicates(DFAState d,
-														 Set nondeterministicAlts)
+														 Set<Integer> nondeterministicAlts)
 	{
 		Map<Integer, SemanticContext> altToPredMap =
 				getPredicatesPerNonDeterministicAlt(d, nondeterministicAlts);
 
-		if ( altToPredMap.size()==0 ) {
+		if ( altToPredMap.isEmpty() ) {
 			return false;
 		}
 
@@ -1384,7 +1384,7 @@
 			org.antlr.misc.BitSet ndSet = org.antlr.misc.BitSet.of(nondeterministicAlts);
 			org.antlr.misc.BitSet predSet = org.antlr.misc.BitSet.of(altToPredMap);
 			int nakedAlt = ndSet.subtract(predSet).getSingleElement();
-			SemanticContext nakedAltPred = null;
+			SemanticContext nakedAltPred;
 			if ( nakedAlt == max(nondeterministicAlts) ) {
 				// the naked alt is the last nondet alt and will be the default clause
 				nakedAltPred = new SemanticContext.TruePredicate();
@@ -1417,7 +1417,7 @@
 			int numConfigs = d.nfaConfigurations.size();
 			for (int i = 0; i < numConfigs; i++) { // TODO: I don't think we need to do this; altToPredMap has it
 			 //7/27/10  theok, I removed it and it still seems to work with everything; leave in anyway just in case
-				NFAConfiguration configuration = (NFAConfiguration)d.nfaConfigurations.get(i);
+				NFAConfiguration configuration = d.nfaConfigurations.get(i);
 				if ( configuration.alt == nakedAlt ) {
 					configuration.semanticContext = nakedAltPred;
 				}
@@ -1435,9 +1435,8 @@
 			int numConfigs = d.nfaConfigurations.size();
 			//System.out.println("pred map="+altToPredMap);
 			for (int i = 0; i < numConfigs; i++) {
-				NFAConfiguration configuration = (NFAConfiguration)d.nfaConfigurations.get(i);
-				SemanticContext semCtx = (SemanticContext)
-						altToPredMap.get(Utils.integer(configuration.alt));
+				NFAConfiguration configuration = d.nfaConfigurations.get(i);
+				SemanticContext semCtx = altToPredMap.get(Utils.integer(configuration.alt));
 				if ( semCtx!=null ) {
 					// resolve (first found) with pred
 					// and remove alt from problem list
@@ -1484,7 +1483,7 @@
 	 *  preds, so we really want this for the error message.
 	 */
 	protected Map<Integer, SemanticContext> getPredicatesPerNonDeterministicAlt(DFAState d,
-																				Set nondeterministicAlts)
+																				Set<Integer> nondeterministicAlts)
 	{
 		// map alt to combined SemanticContext
 		Map<Integer, SemanticContext> altToPredicateContextMap =
@@ -1492,8 +1491,7 @@
 		// init the alt to predicate set map
 		Map<Integer, OrderedHashSet<SemanticContext>> altToSetOfContextsMap =
 			new HashMap<Integer, OrderedHashSet<SemanticContext>>();
-		for (Iterator it = nondeterministicAlts.iterator(); it.hasNext();) {
-			Integer altI = (Integer) it.next();
+		for (Integer altI : nondeterministicAlts) {
 			altToSetOfContextsMap.put(altI, new OrderedHashSet<SemanticContext>());
 		}
 
@@ -1513,7 +1511,7 @@
 		//System.out.println("configs with preds="+d.configurationsWithPredicateEdges);
 		int numConfigs = d.nfaConfigurations.size();
 		for (int i = 0; i < numConfigs; i++) {
-			NFAConfiguration configuration = (NFAConfiguration)d.nfaConfigurations.get(i);
+			NFAConfiguration configuration = d.nfaConfigurations.get(i);
 			Integer altI = Utils.integer(configuration.alt);
 			// if alt is nondeterministic, combine its predicates
 			if ( nondeterministicAlts.contains(altI) ) {
@@ -1558,8 +1556,7 @@
 		// with at least 1 predicate and at least one configuration w/o a
 		// predicate. We want this in order to report to the decision probe.
 		List<Integer> incompletelyCoveredAlts = new ArrayList<Integer>();
-		for (Iterator it = nondeterministicAlts.iterator(); it.hasNext();) {
-			Integer altI = (Integer) it.next();
+		for (Integer altI : nondeterministicAlts) {
 			Set<SemanticContext> contextsForThisAlt = altToSetOfContextsMap.get(altI);
 			if ( nondetAltsWithUncoveredConfiguration.contains(altI) ) { // >= 1 config has no ctx
 				if ( contextsForThisAlt.size()>0 ) {    // && at least one pred
@@ -1568,8 +1565,7 @@
 				continue; // don't include at least 1 config has no ctx
 			}
 			SemanticContext combinedContext = null;
-			for (Iterator itrSet = contextsForThisAlt.iterator(); itrSet.hasNext();) {
-				SemanticContext ctx = (SemanticContext) itrSet.next();
+			for (SemanticContext ctx : contextsForThisAlt) {
 				combinedContext =
 						SemanticContext.or(combinedContext,ctx);
 			}
@@ -1589,7 +1585,7 @@
 			System.out.println("altToPredicateContextMap="+altToPredicateContextMap);
 			*/
 			for (int i = 0; i < numConfigs; i++) {
-				NFAConfiguration configuration = (NFAConfiguration)d.nfaConfigurations.get(i);
+				NFAConfiguration configuration = d.nfaConfigurations.get(i);
 				Integer altI = Utils.integer(configuration.alt);
 				if ( incompletelyCoveredAlts.contains(altI) &&
 					 configuration.semanticContext == SemanticContext.EMPTY_SEMANTIC_CONTEXT )
@@ -1630,12 +1626,12 @@
 	/** OR together all predicates from the alts.  Note that the predicate
 	 *  for an alt could itself be a combination of predicates.
 	 */
-	protected static SemanticContext getUnionOfPredicates(Map altToPredMap) {
-		Iterator iter;
+	protected static SemanticContext getUnionOfPredicates(Map<?, SemanticContext> altToPredMap) {
+		Iterator<SemanticContext> iter;
 		SemanticContext unionOfPredicatesFromAllAlts = null;
 		iter = altToPredMap.values().iterator();
 		while ( iter.hasNext() ) {
-			SemanticContext semCtx = (SemanticContext)iter.next();
+			SemanticContext semCtx = iter.next();
 			if ( unionOfPredicatesFromAllAlts==null ) {
 				unionOfPredicatesFromAllAlts = semCtx;
 			}
@@ -1657,30 +1653,29 @@
 	 *  over alt i+1 if both predicates are true.
 	 */
 	protected void addPredicateTransitions(DFAState d) {
-		List configsWithPreds = new ArrayList();
+		List<NFAConfiguration> configsWithPreds = new ArrayList<NFAConfiguration>();
 		// get a list of all configs with predicates
 		int numConfigs = d.nfaConfigurations.size();
 		for (int i = 0; i < numConfigs; i++) {
-			NFAConfiguration c = (NFAConfiguration)d.nfaConfigurations.get(i);
+			NFAConfiguration c = d.nfaConfigurations.get(i);
 			if ( c.resolveWithPredicate ) {
 				configsWithPreds.add(c);
 			}
 		}
 		// Sort ascending according to alt; alt i has higher precedence than i+1
 		Collections.sort(configsWithPreds,
-			 new Comparator() {
-				 public int compare(Object a, Object b) {
-					 NFAConfiguration ca = (NFAConfiguration)a;
-					 NFAConfiguration cb = (NFAConfiguration)b;
-					 if ( ca.alt < cb.alt ) return -1;
-					 else if ( ca.alt > cb.alt ) return 1;
+			 new Comparator<NFAConfiguration>() {
+			@Override
+				 public int compare(NFAConfiguration a, NFAConfiguration b) {
+					 if ( a.alt < b.alt ) return -1;
+					 else if ( a.alt > b.alt ) return 1;
 					 return 0;
 				 }
 			 });
-		List predConfigsSortedByAlt = configsWithPreds;
+		List<NFAConfiguration> predConfigsSortedByAlt = configsWithPreds;
 		// Now, we can add edges emanating from d for these preds in right order
 		for (int i = 0; i < predConfigsSortedByAlt.size(); i++) {
-			NFAConfiguration c = (NFAConfiguration)predConfigsSortedByAlt.get(i);
+			NFAConfiguration c = predConfigsSortedByAlt.get(i);
 			DFAState predDFATarget = d.dfa.getAcceptState(c.alt);
 			if ( predDFATarget==null ) {
 				predDFATarget = dfa.newState(); // create if not there.
@@ -1717,21 +1712,21 @@
         }
     }
 
-	public static int max(Set s) {
+	public static int max(Set<Integer> s) {
 		if ( s==null ) {
 			return Integer.MIN_VALUE;
 		}
 		int i = 0;
 		int m = 0;
-		for (Iterator it = s.iterator(); it.hasNext();) {
+		for (Integer value : s) {
 			i++;
-			Integer I = (Integer) it.next();
+			Integer I = value;
 			if ( i==1 ) { // init m with first value
-				m = I.intValue();
+				m = I;
 				continue;
 			}
-			if ( I.intValue()>m ) {
-				m = I.intValue();
+			if ( I>m ) {
+				m = I;
 			}
 		}
 		return m;
diff --git a/tool/src/main/java/org/antlr/analysis/PredicateLabel.java b/tool/src/main/java/org/antlr/analysis/PredicateLabel.java
index 7252f4f..1aae6c7 100644
--- a/tool/src/main/java/org/antlr/analysis/PredicateLabel.java
+++ b/tool/src/main/java/org/antlr/analysis/PredicateLabel.java
@@ -50,10 +50,12 @@
 		this.semanticContext = semCtx;
 	}
 
+	@Override
 	public int hashCode() {
 		return semanticContext.hashCode();
 	}
 
+	@Override
 	public boolean equals(Object o) {
 		if ( o==null ) {
 			return false;
@@ -67,18 +69,22 @@
 		return semanticContext.equals(((PredicateLabel)o).semanticContext);
 	}
 
+	@Override
 	public boolean isSemanticPredicate() {
 		return true;
 	}
 
+	@Override
 	public SemanticContext getSemanticContext() {
 		return semanticContext;
 	}
 
+	@Override
 	public String toString() {
 		return "{"+semanticContext+"}?";
 	}
 
+	@Override
 	public String toString(Grammar g) {
 		return toString();
 	}
diff --git a/tool/src/main/java/org/antlr/analysis/SemanticContext.java b/tool/src/main/java/org/antlr/analysis/SemanticContext.java
index 682de32..4f43b5a 100644
--- a/tool/src/main/java/org/antlr/analysis/SemanticContext.java
+++ b/tool/src/main/java/org/antlr/analysis/SemanticContext.java
@@ -38,10 +38,10 @@
 
 /** A binary tree structure used to record the semantic context in which
  *  an NFA configuration is valid.  It's either a single predicate or
- *  a tree representing an operation tree such as: p1&&p2 or p1||p2.
+ *  a tree representing an operation tree such as: p1&amp;&amp;p2 or p1||p2.
  *
- *  For NFA o-p1->o-p2->o, create tree AND(p1,p2).
- *  For NFA (1)-p1->(2)
+ *  For NFA o-p1-&gt;o-p2-&gt;o, create tree AND(p1,p2).
+ *  For NFA (1)-p1-&gt;(2)
  *           |       ^
  *           |       |
  *          (3)-p2----
@@ -65,8 +65,8 @@
 	public static final SemanticContext EMPTY_SEMANTIC_CONTEXT = new Predicate(Predicate.INVALID_PRED_VALUE);
 
 	/** Given a semantic context expression tree, return a tree with all
-	 *  nongated predicates set to true and then reduced.  So p&&(q||r) would
-	 *  return p&&r if q is nongated but p and r are gated.
+	 *  nongated predicates set to true and then reduced.  So p&amp;&amp;(q||r) would
+	 *  return p&amp;&amp;r if q is nongated but p and r are gated.
 	 */
 	public abstract SemanticContext getGatedPredicateContext();
 
@@ -88,7 +88,7 @@
 		/** The AST node in tree created from the grammar holding the predicate */
 		public GrammarAST predicateAST;
 
-		/** Is this a {...}?=> gating predicate or a normal disambiguating {..}?
+		/** Is this a {...}?=&gt; gating predicate or a normal disambiguating {..}?
 		 *  If any predicate in expression is gated, then expression is considered
 		 *  gated.
 		 *
@@ -139,6 +139,7 @@
 		 *  Or, if they have the same constant value, return equal.
 		 *  As of July 2006 I'm not sure these are needed.
 		 */
+		@Override
 		public boolean equals(Object o) {
 			if ( !(o instanceof Predicate) ) {
 				return false;
@@ -156,6 +157,7 @@
 			return predicateAST.getText().equals(other.predicateAST.getText());
 		}
 
+		@Override
 		public int hashCode() {
 			if (constantValue != INVALID_PRED_VALUE){
 				return constantValue;
@@ -168,11 +170,12 @@
 			return predicateAST.getText().hashCode();
 		}
 
+		@Override
 		public ST genExpr(CodeGenerator generator,
 									  STGroup templates,
 									  DFA dfa)
 		{
-			ST eST = null;
+			ST eST;
 			if ( templates!=null ) {
 				if ( synpred ) {
 					eST = templates.getInstanceOf("evalSynPredicate");
@@ -415,7 +418,7 @@
 
 		@Override
 		public String toString() {
-			StringBuffer buf = new StringBuffer();
+			StringBuilder buf = new StringBuilder();
 			buf.append("(");
 			int i = 0;
 			for (SemanticContext semctx : operands) {
@@ -452,10 +455,12 @@
 		{
 			ST result = null;
 			for (SemanticContext operand : operands) {
-				if (result == null)
+				if (result == null) {
 					result = operand.genExpr(generator, templates, dfa);
+					continue;
+				}
 
-				ST eST = null;
+				ST eST;
 				if ( templates!=null ) {
 					eST = templates.getInstanceOf("andPredicates");
 				}
@@ -505,12 +510,12 @@
 									  STGroup templates,
 									  DFA dfa)
 		{
-			ST eST = null;
+			ST eST;
 			if ( templates!=null ) {
 				eST = templates.getInstanceOf("orPredicates");
 			}
 			else {
-				eST = new ST("(<first(operands)><rest(operands):{o | ||<o>}>)");
+				eST = new ST("(<operands; separator=\"||\">)");
 			}
 			for (SemanticContext semctx : operands) {
 				eST.add("operands", semctx.genExpr(generator,templates,dfa));
@@ -550,7 +555,7 @@
 									  STGroup templates,
 									  DFA dfa)
 		{
-			ST eST = null;
+			ST eST;
 			if ( templates!=null ) {
 				eST = templates.getInstanceOf("notPredicate");
 			}
@@ -606,6 +611,9 @@
 
 	public static SemanticContext and(SemanticContext a, SemanticContext b) {
 		//System.out.println("AND: "+a+"&&"+b);
+		if (a instanceof FalsePredicate || b instanceof FalsePredicate)
+			return new FalsePredicate();
+
 		SemanticContext[] terms = factorOr(a, b);
 		SemanticContext commonTerms = terms[0];
 		a = terms[1];
@@ -638,11 +646,19 @@
 		//    return a;
 
 		//System.out.println("## have to AND");
-		return new AND(a,b);
+		AND result = new AND(a,b);
+		if (result.operands.size() == 1) {
+			return result.operands.iterator().next();
+		}
+
+		return result;
 	}
 
 	public static SemanticContext or(SemanticContext a, SemanticContext b) {
 		//System.out.println("OR: "+a+"||"+b);
+		if (a instanceof TruePredicate || b instanceof TruePredicate)
+			return new TruePredicate();
+
 		SemanticContext[] terms = factorAnd(a, b);
 		SemanticContext commonTerms = terms[0];
 		a = terms[1];
@@ -722,11 +738,11 @@
 
 		HashSet<SemanticContext> result = new HashSet<SemanticContext>(opsA);
 		result.retainAll(opsB);
-		if (result.size() == 0)
+		if (result.isEmpty())
 			return new SemanticContext[] { EMPTY_SEMANTIC_CONTEXT, a, b };
 
 		opsA.removeAll(result);
-		if (opsA.size() == 0)
+		if (opsA.isEmpty())
 			a = new TruePredicate();
 		else if (opsA.size() == 1)
 			a = opsA.iterator().next();
@@ -734,7 +750,7 @@
 			a = new AND(opsA);
 
 		opsB.removeAll(result);
-		if (opsB.size() == 0)
+		if (opsB.isEmpty())
 			b = new TruePredicate();
 		else if (opsB.size() == 1)
 			b = opsB.iterator().next();
@@ -755,11 +771,11 @@
 
 		HashSet<SemanticContext> result = new HashSet<SemanticContext>(opsA);
 		result.retainAll(opsB);
-		if (result.size() == 0)
+		if (result.isEmpty())
 			return new SemanticContext[] { EMPTY_SEMANTIC_CONTEXT, a, b };
 
 		opsA.removeAll(result);
-		if (opsA.size() == 0)
+		if (opsA.isEmpty())
 			a = new FalsePredicate();
 		else if (opsA.size() == 1)
 			a = opsA.iterator().next();
@@ -767,7 +783,7 @@
 			a = new OR(opsA);
 
 		opsB.removeAll(result);
-		if (opsB.size() == 0)
+		if (opsB.isEmpty())
 			b = new FalsePredicate();
 		else if (opsB.size() == 1)
 			b = opsB.iterator().next();
diff --git a/tool/src/main/java/org/antlr/analysis/Transition.java b/tool/src/main/java/org/antlr/analysis/Transition.java
index 44df53e..7438a81 100644
--- a/tool/src/main/java/org/antlr/analysis/Transition.java
+++ b/tool/src/main/java/org/antlr/analysis/Transition.java
@@ -34,7 +34,7 @@
  *  transitions) and has a label/target pair.  I have abstracted the notion
  *  of a Label to handle the various kinds of things it can be.
  */
-public class Transition implements Comparable {
+public class Transition implements Comparable<Transition> {
     /** What label must be consumed to transition to target */
     public Label label;
 
@@ -63,21 +63,24 @@
         return label.isSemanticPredicate();
     }
 
+	@Override
     public int hashCode() {
         return label.hashCode() + target.stateNumber;
     }
 
+	@Override
     public boolean equals(Object o) {
         Transition other = (Transition)o;
         return this.label.equals(other.label) &&
                this.target.equals(other.target);
     }
 
-    public int compareTo(Object o) {
-        Transition other = (Transition)o;
+	@Override
+    public int compareTo(Transition other) {
         return this.label.compareTo(other.label);
     }
 
+	@Override
     public String toString() {
         return label+"->"+target.stateNumber;
     }
diff --git a/tool/src/main/java/org/antlr/codegen/ACyclicDFACodeGenerator.java b/tool/src/main/java/org/antlr/codegen/ACyclicDFACodeGenerator.java
index 6bc5fd3..93adb61 100644
--- a/tool/src/main/java/org/antlr/codegen/ACyclicDFACodeGenerator.java
+++ b/tool/src/main/java/org/antlr/codegen/ACyclicDFACodeGenerator.java
@@ -27,6 +27,7 @@
  */
 package org.antlr.codegen;
 
+import java.util.ArrayList;
 import org.antlr.analysis.*;
 import org.antlr.misc.Utils;
 import org.stringtemplate.v4.ST;
@@ -82,8 +83,7 @@
 		}
 		dfaST.add("k", Utils.integer(k));
 		dfaST.add("stateNumber", Utils.integer(s.stateNumber));
-		dfaST.add("semPredState",
-						   Boolean.valueOf(s.isResolvedWithPredicates()));
+		dfaST.add("semPredState", s.isResolvedWithPredicates());
 		/*
 		String description = dfa.getNFADecisionStartState().getDescription();
 		description = parentGenerator.target.getTargetStringLiteralFromString(description);
@@ -96,7 +96,7 @@
 		DFAState EOTTarget = null;
 		//System.out.println("DFA state "+s.stateNumber);
 		for (int i = 0; i < s.getNumberOfTransitions(); i++) {
-			Transition edge = (Transition) s.transition(i);
+			Transition edge = s.transition(i);
 			//System.out.println("edge "+s.stateNumber+"-"+edge.label.toString()+"->"+edge.target.stateNumber);
 			if ( edge.label.getAtom()==Label.EOT ) {
 				// don't generate a real edge for EOT; track alt EOT predicts
@@ -113,14 +113,15 @@
 			ST edgeST = templates.getInstanceOf(dfaEdgeName);
 			// If the template wants all the label values delineated, do that
 			if ( edgeST.impl.formalArguments.get("labels")!=null ) {
-				List labels = edge.label.getSet().toList();
+				List<Integer> labels = edge.label.getSet().toList();
+				List<String> targetLabels = new ArrayList<String>(labels.size());
 				for (int j = 0; j < labels.size(); j++) {
-					Integer vI = (Integer) labels.get(j);
+					Integer vI = labels.get(j);
 					String label =
-						parentGenerator.getTokenTypeAsTargetLabel(vI.intValue());
-					labels.set(j, label); // rewrite List element to be name
+						parentGenerator.getTokenTypeAsTargetLabel(vI);
+					targetLabels.add(label); // rewrite List element to be name
 				}
-				edgeST.add("labels", labels);
+				edgeST.add("labels", targetLabels);
 			}
 			else { // else create an expression to evaluate (the general case)
 				edgeST.add("labelExpr",
@@ -169,7 +170,7 @@
 			// state number.  Predicates emanating from EOT targets are
 			// hoisted up to the state that has the EOT edge.
 			for (int i = 0; i < EOTTarget.getNumberOfTransitions(); i++) {
-				Transition predEdge = (Transition)EOTTarget.transition(i);
+				Transition predEdge = EOTTarget.transition(i);
 				ST edgeST = templates.getInstanceOf(dfaEdgeName);
 				edgeST.add("labelExpr",
 									parentGenerator.genSemanticPredicateExpr(templates,predEdge));
diff --git a/tool/src/main/java/org/antlr/codegen/ActionScriptTarget.java b/tool/src/main/java/org/antlr/codegen/ActionScriptTarget.java
index 4e2943b..ace1be3 100644
--- a/tool/src/main/java/org/antlr/codegen/ActionScriptTarget.java
+++ b/tool/src/main/java/org/antlr/codegen/ActionScriptTarget.java
@@ -33,6 +33,7 @@
 
 public class ActionScriptTarget extends Target {
 
+	@Override
     public String getTargetCharLiteralFromANTLRCharLiteral(
             CodeGenerator generator,
             String literal) {
@@ -41,6 +42,7 @@
         return String.valueOf(c);
     }
 
+	@Override
     public String getTokenTypeAsTargetLabel(CodeGenerator generator,
                                             int ttype) {
         // use ints for predefined types;
@@ -72,8 +74,8 @@
      * may be a compressed AMF encoding that is embedded using an Embed tag in ActionScript.
      *
      * @param v
-     * @return
      */
+	@Override
     public String encodeIntAsCharEscape(int v) {
         // encode as hex
         if ( v<=255 ) {
@@ -87,7 +89,7 @@
             System.err.println("Warning: character literal out of range for ActionScript target " + v);
             return "";
         }
-        StringBuffer buf = new StringBuffer("\\u80");
+        StringBuilder buf = new StringBuilder("\\u80");
         buf.append(Integer.toHexString((v >> 8) | 0x100).substring(1, 3)); // high - order bits
         buf.append("\\x");
         buf.append(Integer.toHexString((v & 0xff) | 0x100).substring(1, 3)); // low -order bits
@@ -103,6 +105,7 @@
      *  This is to match how the BitSet constructor works, where the bits are
      *  passed in in 32-bit chunks with low-order bits coming first.
 	 */
+	@Override
 	public String getTarget64BitStringFromValue(long word) {
 		StringBuffer buf = new StringBuffer(22); // enough for the two "0x", "," and " "
 		buf.append("0x");
diff --git a/tool/src/main/java/org/antlr/codegen/CPPTarget.java b/tool/src/main/java/org/antlr/codegen/CPPTarget.java
deleted file mode 100644
index 22962e0..0000000
--- a/tool/src/main/java/org/antlr/codegen/CPPTarget.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * [The "BSD license"]
- *  Copyright (c) 2010 Terence Parr
- *  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.
- */
-package org.antlr.codegen;
-
-import org.antlr.Tool;
-import org.stringtemplate.v4.ST;
-import org.stringtemplate.v4.STGroup;
-import org.antlr.tool.Grammar;
-
-import java.io.IOException;
-
-public class CPPTarget extends Target {
-	
-	public String escapeChar( int c ) {
-		// System.out.println("CPPTarget.escapeChar("+c+")");
-		switch (c) {
-		case '\n' : return "\\n";
-		case '\t' : return "\\t";
-		case '\r' : return "\\r";
-		case '\\' : return "\\\\";
-		case '\'' : return "\\'";
-		case '"' :  return "\\\"";
-		default :
-			if ( c < ' ' || c > 126 )
-			{
-				if (c > 255)
-				{
-					String s = Integer.toString(c,16);
-					// put leading zeroes in front of the thing..
-					while( s.length() < 4 )
-						s = '0' + s;
-					return "\\u" + s;
-				}
-				else {
-					return "\\" + Integer.toString(c,8);
-				}
-			}
-			else {
-				return String.valueOf((char)c);
-			}
-		}
-	}
-
-	/** Converts a String into a representation that can be use as a literal
-	 * when surrounded by double-quotes.
-	 *
-	 * Used for escaping semantic predicate strings for exceptions.
-	 *
-	 * @param s The String to be changed into a literal
-	 */
-	public String escapeString(String s)
-	{
-		StringBuffer retval = new StringBuffer();
-		for (int i = 0; i < s.length(); i++) {
-			retval.append(escapeChar(s.charAt(i)));
-		}
-
-		return retval.toString();
-	}
-
-	protected void genRecognizerHeaderFile(Tool tool,
-										   CodeGenerator generator,
-										   Grammar grammar,
-										   ST headerFileST,
-										   String extName)
-		throws IOException
-	{
-		generator.write(headerFileST, grammar.name+extName);
-	}
-
-	/** Convert from an ANTLR char literal found in a grammar file to
-	 *  an equivalent char literal in the target language.  For Java, this
-	 *  is the identify translation; i.e., '\n' -> '\n'.  Most languages
-	 *  will be able to use this 1-to-1 mapping.  Expect single quotes
-	 *  around the incoming literal.
-	 *  Depending on the charvocabulary the charliteral should be prefixed with a 'L'
-	 */
-	public String getTargetCharLiteralFromANTLRCharLiteral( CodeGenerator codegen, String literal) {
-		int c = Grammar.getCharValueFromGrammarCharLiteral(literal);
-		String prefix = "'";
-		if( codegen.grammar.getMaxCharValue() > 255 )
-			prefix = "L'";
-		else if( (c & 0x80) != 0 )	// if in char mode prevent sign extensions
-			return ""+c;
-		return prefix+escapeChar(c)+"'";
-	}
-
-	/** Convert from an ANTLR string literal found in a grammar file to
-	 *  an equivalent string literal in the target language.  For Java, this
-	 *  is the identify translation; i.e., "\"\n" -> "\"\n".  Most languages
-	 *  will be able to use this 1-to-1 mapping.  Expect double quotes 
-	 *  around the incoming literal.
-	 *  Depending on the charvocabulary the string should be prefixed with a 'L'
-	 */
-	public String getTargetStringLiteralFromANTLRStringLiteral( CodeGenerator codegen, String literal) {
-		StringBuffer buf = Grammar.getUnescapedStringFromGrammarStringLiteral(literal);
-		String prefix = "\"";
-		if( codegen.grammar.getMaxCharValue() > 255 )
-			prefix = "L\"";
-		return prefix+escapeString(buf.toString())+"\"";
-	}
-	/** Character constants get truncated to this value.
-	 * TODO: This should be derived from the charVocabulary. Depending on it
-	 * being 255 or 0xFFFF the templates should generate normal character
-	 * constants or multibyte ones.
-	 */
-	public int getMaxCharValue( CodeGenerator codegen ) {
-		int maxval = 255; // codegen.grammar.get????();
-		if ( maxval <= 255 )
-			return 255;
-		else
-			return maxval;
-	}
-}
diff --git a/tool/src/main/java/org/antlr/codegen/CSharp3Target.java b/tool/src/main/java/org/antlr/codegen/CSharp3Target.java
index f5fef65..643a0e8 100644
--- a/tool/src/main/java/org/antlr/codegen/CSharp3Target.java
+++ b/tool/src/main/java/org/antlr/codegen/CSharp3Target.java
@@ -69,6 +69,11 @@
         }};
 
     @Override
+    public boolean useBaseTemplatesForSynPredFragments() {
+        return false;
+    }
+
+    @Override
     public String encodeIntAsCharEscape(int v) {
         return "\\x" + Integer.toHexString(v).toUpperCase();
     }
@@ -115,6 +120,7 @@
             _target = target;
         }
 
+		@Override
         public String toString(Object obj, String formatName, Locale locale)
         {
             String value = (String)obj;
diff --git a/tool/src/main/java/org/antlr/codegen/CTarget.java b/tool/src/main/java/org/antlr/codegen/CTarget.java
index 51911c3..9ecae9a 100644
--- a/tool/src/main/java/org/antlr/codegen/CTarget.java
+++ b/tool/src/main/java/org/antlr/codegen/CTarget.java
@@ -33,10 +33,11 @@
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.List;
 
 public class CTarget extends Target {
 
-    ArrayList strings = new ArrayList();
+    List<String> strings = new ArrayList<String>();
 
     @Override
     protected void genRecognizerFile(Tool tool,
@@ -194,7 +195,7 @@
             String literal) {
         int index;
         String bytes;
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
 
         buf.append("{ ");
 
@@ -294,7 +295,7 @@
         // the default size. If it is then whack it all the way up to the maximum that
         // we can sensibly get away with.
         //
-        if (CodeGenerator.MAX_ACYCLIC_DFA_STATES_INLINE == CodeGenerator.MAX_ACYCLIC_DFA_STATES_INLINE ) {
+        if (CodeGenerator.MAX_ACYCLIC_DFA_STATES_INLINE == CodeGenerator.MADSI_DEFAULT ) {
 
             CodeGenerator.MAX_ACYCLIC_DFA_STATES_INLINE = 65535;
         }
diff --git a/tool/src/main/java/org/antlr/codegen/CodeGenerator.java b/tool/src/main/java/org/antlr/codegen/CodeGenerator.java
index 916b1fa..b279bd5 100644
--- a/tool/src/main/java/org/antlr/codegen/CodeGenerator.java
+++ b/tool/src/main/java/org/antlr/codegen/CodeGenerator.java
@@ -161,7 +161,7 @@
 		Target target = null;
 		String targetName = "org.antlr.codegen."+language+"Target";
 		try {
-			Class c = Class.forName(targetName);
+			Class<? extends Target> c = Class.forName(targetName).asSubclass(Target.class);
 			target = (Target)c.newInstance();
 		}
 		catch (ClassNotFoundException cnfe) {
@@ -183,35 +183,29 @@
 	/** load the main language.stg template group file */
 	public void loadTemplates(String language) {
 		String langDir = classpathTemplateRootDirectoryName+"/"+language;
-		STGroup coreTemplates = new STGroupFile(langDir+"/"+language+".stg");
-
+		STGroup coreTemplates = new ToolSTGroupFile(langDir+"/"+language+".stg");
 		baseTemplates = coreTemplates;
-		if ( coreTemplates ==null ) {
-			ErrorManager.error(ErrorManager.MSG_MISSING_CODE_GEN_TEMPLATES,
-							   language);
-			return;
-		}
 
 		// dynamically add subgroups that act like filters to apply to
 		// their supergroup.  E.g., Java:Dbg:AST:ASTParser::ASTDbg.
 		String outputOption = (String)grammar.getOption("output");
 		if ( outputOption!=null && outputOption.equals("AST") ) {
 			if ( debug && grammar.type!=Grammar.LEXER ) {
-				STGroup dbgTemplates = new STGroupFile(langDir+"/Dbg.stg");
+				STGroup dbgTemplates = new ToolSTGroupFile(langDir+"/Dbg.stg");
 				dbgTemplates.importTemplates(coreTemplates);
 				baseTemplates = dbgTemplates;
-				STGroup astTemplates = new STGroupFile(langDir+"/AST.stg");
+				STGroup astTemplates = new ToolSTGroupFile(langDir+"/AST.stg");
 				astTemplates.importTemplates(dbgTemplates);
-				STGroup astParserTemplates = astTemplates;
+				STGroup astParserTemplates;
 				if ( grammar.type==Grammar.TREE_PARSER ) {
-					astParserTemplates = new STGroupFile(langDir+"/ASTTreeParser.stg");
+					astParserTemplates = new ToolSTGroupFile(langDir+"/ASTTreeParser.stg");
 					astParserTemplates.importTemplates(astTemplates);
 				}
 				else {
-					astParserTemplates = new STGroupFile(langDir+"/ASTParser.stg");
+					astParserTemplates = new ToolSTGroupFile(langDir+"/ASTParser.stg");
 					astParserTemplates.importTemplates(astTemplates);
 				}
-				STGroup astDbgTemplates = new STGroupFile(langDir+"/ASTDbg.stg");
+				STGroup astDbgTemplates = new ToolSTGroupFile(langDir+"/ASTDbg.stg");
 				astDbgTemplates.importTemplates(astParserTemplates);
 				templates = astDbgTemplates;
 				dbgTemplates.iterateAcrossValues = true; // ST v3 compatibility with Maps
@@ -219,15 +213,15 @@
 				astParserTemplates.iterateAcrossValues = true;
 			}
 			else {
-				STGroup astTemplates = new STGroupFile(langDir+"/AST.stg");
+				STGroup astTemplates = new ToolSTGroupFile(langDir+"/AST.stg");
 				astTemplates.importTemplates(coreTemplates);
-				STGroup astParserTemplates = astTemplates;
+				STGroup astParserTemplates;
 				if ( grammar.type==Grammar.TREE_PARSER ) {
-					astParserTemplates = new STGroupFile(langDir+"/ASTTreeParser.stg");
+					astParserTemplates = new ToolSTGroupFile(langDir+"/ASTTreeParser.stg");
 					astParserTemplates.importTemplates(astTemplates);
 				}
 				else {
-					astParserTemplates = new STGroupFile(langDir+"/ASTParser.stg");
+					astParserTemplates = new ToolSTGroupFile(langDir+"/ASTParser.stg");
 					astParserTemplates.importTemplates(astTemplates);
 				}
 				templates = astParserTemplates;
@@ -237,23 +231,23 @@
 		}
 		else if ( outputOption!=null && outputOption.equals("template") ) {
 			if ( debug && grammar.type!=Grammar.LEXER ) {
-				STGroup dbgTemplates = new STGroupFile(langDir+"/Dbg.stg");
+				STGroup dbgTemplates = new ToolSTGroupFile(langDir+"/Dbg.stg");
 				dbgTemplates.importTemplates(coreTemplates);
 				baseTemplates = dbgTemplates;
-				STGroup stTemplates = new STGroupFile(langDir+"/ST.stg");
+				STGroup stTemplates = new ToolSTGroupFile(langDir+"/ST.stg");
 				stTemplates.importTemplates(dbgTemplates);
 				templates = stTemplates;
 				dbgTemplates.iterateAcrossValues = true;
 			}
 			else {
-				STGroup stTemplates = new STGroupFile(langDir+"/ST.stg");
+				STGroup stTemplates = new ToolSTGroupFile(langDir+"/ST.stg");
 				stTemplates.importTemplates(coreTemplates);
 				templates = stTemplates;
 			}
 			templates.iterateAcrossValues = true; // ST v3 compatibility with Maps
 		}
 		else if ( debug && grammar.type!=Grammar.LEXER ) {
-			STGroup dbgTemplates = new STGroupFile(langDir+"/Dbg.stg");
+			STGroup dbgTemplates = new ToolSTGroupFile(langDir+"/Dbg.stg");
 			dbgTemplates.importTemplates(coreTemplates);
 			templates = dbgTemplates;
 			baseTemplates = templates;
@@ -344,57 +338,57 @@
         headerFileST.add("actions", actions);
 		outputFileST.add("actions", actions);
 
-		headerFileST.add("buildTemplate", new Boolean(grammar.buildTemplate()));
-		outputFileST.add("buildTemplate", new Boolean(grammar.buildTemplate()));
-		headerFileST.add("buildAST", new Boolean(grammar.buildAST()));
-		outputFileST.add("buildAST", new Boolean(grammar.buildAST()));
+		headerFileST.add("buildTemplate", grammar.buildTemplate());
+		outputFileST.add("buildTemplate", grammar.buildTemplate());
+		headerFileST.add("buildAST", grammar.buildAST());
+		outputFileST.add("buildAST", grammar.buildAST());
 
-		outputFileST.add("rewriteMode", Boolean.valueOf(grammar.rewriteMode()));
-		headerFileST.add("rewriteMode", Boolean.valueOf(grammar.rewriteMode()));
+		outputFileST.add("rewriteMode", grammar.rewriteMode());
+		headerFileST.add("rewriteMode", grammar.rewriteMode());
 
-		outputFileST.add("backtracking", Boolean.valueOf(canBacktrack));
-		headerFileST.add("backtracking", Boolean.valueOf(canBacktrack));
+		outputFileST.add("backtracking", canBacktrack);
+		headerFileST.add("backtracking", canBacktrack);
 		// turn on memoize attribute at grammar level so we can create ruleMemo.
 		// each rule has memoize attr that hides this one, indicating whether
 		// it needs to save results
 		String memoize = (String)grammar.getOption("memoize");
 		outputFileST.add("memoize",
 						 (grammar.atLeastOneRuleMemoizes ||
-						  Boolean.valueOf(memoize != null && memoize.equals("true")) &&
+						  memoize != null && memoize.equals("true") &&
 						  canBacktrack));
 		headerFileST.add("memoize",
 						 (grammar.atLeastOneRuleMemoizes ||
-						  Boolean.valueOf(memoize != null && memoize.equals("true")) &&
+						  memoize != null && memoize.equals("true") &&
 						  canBacktrack));
 
 
-		outputFileST.add("trace", Boolean.valueOf(trace));
-		headerFileST.add("trace", Boolean.valueOf(trace));
+		outputFileST.add("trace", trace);
+		headerFileST.add("trace", trace);
 
-		outputFileST.add("profile", Boolean.valueOf(profile));
-		headerFileST.add("profile", Boolean.valueOf(profile));
+		outputFileST.add("profile", profile);
+		headerFileST.add("profile", profile);
 
 		// RECOGNIZER
 		if ( grammar.type==Grammar.LEXER ) {
 			recognizerST = templates.getInstanceOf("lexer");
-			outputFileST.add("LEXER", Boolean.valueOf(true));
-			headerFileST.add("LEXER", Boolean.valueOf(true));
+			outputFileST.add("LEXER", true);
+			headerFileST.add("LEXER", true);
 			recognizerST.add("filterMode",
-							 Boolean.valueOf(filterMode));
+							 filterMode);
 		}
 		else if ( grammar.type==Grammar.PARSER ||
 			grammar.type==Grammar.COMBINED )
 		{
 			recognizerST = templates.getInstanceOf("parser");
-			outputFileST.add("PARSER", Boolean.valueOf(true));
-			headerFileST.add("PARSER", Boolean.valueOf(true));
+			outputFileST.add("PARSER", true);
+			headerFileST.add("PARSER", true);
 		}
 		else {
 			recognizerST = templates.getInstanceOf("treeParser");
-			outputFileST.add("TREE_PARSER", Boolean.valueOf(true));
-			headerFileST.add("TREE_PARSER", Boolean.valueOf(true));
+			outputFileST.add("TREE_PARSER", true);
+			headerFileST.add("TREE_PARSER", true);
             recognizerST.add("filterMode",
-							 Boolean.valueOf(filterMode));
+							 filterMode);
 		}
 		outputFileST.add("recognizer", recognizerST);
 		headerFileST.add("recognizer", recognizerST);
@@ -440,7 +434,7 @@
 		}
 
 		// Now that we know what synpreds are used, we can set into template
-		Set synpredNames = null;
+		Set<String> synpredNames = null;
 		if ( grammar.synPredNamesUsedInDFA.size()>0 ) {
 			synpredNames = grammar.synPredNamesUsedInDFA;
 		}
@@ -450,6 +444,11 @@
 		// all recognizers can see Grammar object
 		recognizerST.add("grammar", grammar);
 
+		// do not render templates to disk if errors occurred
+		if ( ErrorManager.getErrorState().errors > 0 ) {
+			return null;
+		}
+
 		if (LAUNCH_ST_INSPECTOR) {
 			outputFileST.inspect();
 			if ( templates.isDefined("headerFile") ) headerFileST.inspect();
@@ -486,13 +485,12 @@
 	 *  '@headerfile:name {action}' or something.  Make sure the
 	 *  target likes the scopes in action table.
 	 */
-	protected void verifyActionScopesOkForTarget(Map actions) {
-		Set actionScopeKeySet = actions.keySet();
-		for (Iterator it = actionScopeKeySet.iterator(); it.hasNext();) {
-			String scope = (String)it.next();
+	protected void verifyActionScopesOkForTarget(Map<String, Map<String, Object>> actions) {
+		for (Map.Entry<String, Map<String, Object>> entry : actions.entrySet()) {
+			String scope = entry.getKey();
 			if ( !target.isValidActionScope(grammar.type, scope) ) {
 				// get any action from the scope to get error location
-				Map scopeActions = (Map)actions.get(scope);
+				Map<String, Object> scopeActions = entry.getValue();
 				GrammarAST actionAST =
 					(GrammarAST)scopeActions.values().iterator().next();
 				ErrorManager.grammarError(
@@ -506,11 +504,9 @@
 	/** Actions may reference $x::y attributes, call translateAction on
 	 *  each action and replace that action in the Map.
 	 */
-	protected void translateActionAttributeReferences(Map actions) {
-		Set actionScopeKeySet = actions.keySet();
-		for (Iterator it = actionScopeKeySet.iterator(); it.hasNext();) {
-			String scope = (String)it.next();
-			Map scopeActions = (Map)actions.get(scope);
+	protected void translateActionAttributeReferences(Map<String, Map<String, Object>> actions) {
+		for (Map.Entry<String, Map<String, Object>> entry : actions.entrySet()) {
+			Map<String, Object> scopeActions = entry.getValue();
 			translateActionAttributeReferencesForSingleScope(null,scopeActions);
 		}
 	}
@@ -518,17 +514,16 @@
 	/** Use for translating rule @init{...} actions that have no scope */
 	public void translateActionAttributeReferencesForSingleScope(
 		Rule r,
-		Map scopeActions)
+		Map<String, Object> scopeActions)
 	{
 		String ruleName=null;
 		if ( r!=null ) {
 			ruleName = r.name;
 		}
-		Set actionNameSet = scopeActions.keySet();
-		for (Iterator nameIT = actionNameSet.iterator(); nameIT.hasNext();) {
-			String name = (String) nameIT.next();
-			GrammarAST actionAST = (GrammarAST)scopeActions.get(name);
-			List chunks = translateAction(ruleName,actionAST);
+		for (Map.Entry<String, Object> entry : scopeActions.entrySet()) {
+			String name = entry.getKey();
+			GrammarAST actionAST = (GrammarAST)entry.getValue();
+			List<?> chunks = translateAction(ruleName,actionAST);
 			scopeActions.put(name, chunks); // replace with translation
 		}
 	}
@@ -582,11 +577,11 @@
 		}
 		//System.out.println(" "+follow);
 
-        List tokenTypeList = null;
-        long[] words = null;
+        List<Integer> tokenTypeList;
+        long[] words;
 		if ( follow.tokenTypeSet==null ) {
 			words = new long[1];
-            tokenTypeList = new ArrayList();
+            tokenTypeList = new ArrayList<Integer>();
         }
 		else {
 			BitSet bits = BitSet.of(follow.tokenTypeSet);
@@ -666,16 +661,16 @@
 	public ST generateSpecialState(DFAState s) {
 		ST stateST;
 		stateST = templates.getInstanceOf("cyclicDFAState");
-		stateST.add("needErrorClause", Boolean.valueOf(true));
+		stateST.add("needErrorClause", true);
 		stateST.add("semPredState",
-					Boolean.valueOf(s.isResolvedWithPredicates()));
+					s.isResolvedWithPredicates());
 		stateST.add("stateNumber", s.stateNumber);
 		stateST.add("decisionNumber", s.dfa.decisionNumber);
 
 		boolean foundGatedPred = false;
 		ST eotST = null;
 		for (int i = 0; i < s.getNumberOfTransitions(); i++) {
-			Transition edge = (Transition) s.transition(i);
+			Transition edge = s.transition(i);
 			ST edgeST;
 			if ( edge.label.getAtom()==Label.EOT ) {
 				// this is the default clause; has to held until last
@@ -711,7 +706,7 @@
 		if ( foundGatedPred ) {
 			// state has >= 1 edge with a gated pred (syn or sem)
 			// must rewind input first, set flag.
-			stateST.add("semPredState", new Boolean(foundGatedPred));
+			stateST.add("semPredState", foundGatedPred);
 		}
 		if ( eotST!=null ) {
 			stateST.add("edges", eotST);
@@ -749,7 +744,7 @@
 	}
 
 	/** For intervals such as [3..3, 30..35], generate an expression that
-	 *  tests the lookahead similar to LA(1)==3 || (LA(1)>=30&&LA(1)<=35)
+	 *  tests the lookahead similar to LA(1)==3 || (LA(1)&gt;=30&amp;&amp;LA(1)&lt;=35)
 	 */
 	public ST genSetExpr(STGroup templates,
 									 IntSet set,
@@ -760,22 +755,63 @@
 			throw new IllegalArgumentException("unable to generate expressions for non IntervalSet objects");
 		}
 		IntervalSet iset = (IntervalSet)set;
-		if ( iset.getIntervals()==null || iset.getIntervals().size()==0 ) {
+		if ( iset.getIntervals()==null || iset.getIntervals().isEmpty() ) {
 			ST emptyST = new ST(templates, "");
 			emptyST.impl.name = "empty-set-expr";
 			return emptyST;
 		}
 		String testSTName = "lookaheadTest";
 		String testRangeSTName = "lookaheadRangeTest";
+		String testSetSTName = "lookaheadSetTest";
+		String varSTName = "lookaheadVarName";
 		if ( !partOfDFA ) {
 			testSTName = "isolatedLookaheadTest";
 			testRangeSTName = "isolatedLookaheadRangeTest";
+			testSetSTName = "isolatedLookaheadSetTest";
+			varSTName = "isolatedLookaheadVarName";
 		}
 		ST setST = templates.getInstanceOf("setTest");
-		Iterator iter = iset.getIntervals().iterator();
+		// If the SetTest template exists, separate the ranges:
+		// flatten the small ones into one list and make that a range,
+		// and leave the others as they are.
+		if ( templates.isDefined(testSetSTName) ) {
+			// Flatten the IntervalSet into a list of integers.
+			ST sST = templates.getInstanceOf(testSetSTName);
+			Iterator<Interval> iter = iset.getIntervals().iterator();
+			int rangeNumber = 1;
+			while (iter.hasNext()) {
+				Interval I = iter.next();
+				int a = I.a;
+				int b = I.b;
+				// Not flattening the large ranges helps us avoid making a
+				// set that contains 90% of Unicode when we could just use
+				// a simple range like (LA(1)>=123 && LA(1)<=65535).
+				// This flattens all ranges of length 4 or less.
+				if (b - a < 4) {
+					for (int i = a; i <= b; i++) {
+						sST.add("values", getTokenTypeAsTargetLabel(i));
+						sST.add("valuesAsInt", Utils.integer(i));
+					}
+				} else {
+					ST eST = templates.getInstanceOf(testRangeSTName);
+					eST.add("lower", getTokenTypeAsTargetLabel(a));
+					eST.add("lowerAsInt", Utils.integer(a));
+					eST.add("upper", getTokenTypeAsTargetLabel(b));
+					eST.add("upperAsInt", Utils.integer(b));
+					eST.add("rangeNumber", Utils.integer(rangeNumber));
+					eST.add("k", Utils.integer(k));
+					setST.add("ranges", eST);
+					rangeNumber++;
+				}
+			}
+			sST.add("k", Utils.integer(k));
+			setST.add("ranges", sST);
+			return setST;
+		}
+		Iterator<Interval> iter = iset.getIntervals().iterator();
 		int rangeNumber = 1;
 		while (iter.hasNext()) {
-			Interval I = (Interval) iter.next();
+			Interval I = iter.next();
 			int a = I.a;
 			int b = I.b;
 			ST eST;
@@ -808,9 +844,7 @@
 	 */
 	protected void genTokenTypeConstants(ST code) {
 		// make constants for the token types
-		Iterator tokenIDs = grammar.getTokenIDs().iterator();
-		while (tokenIDs.hasNext()) {
-			String tokenID = (String) tokenIDs.next();
+		for (String tokenID : grammar.getTokenIDs()) {
 			int tokenType = grammar.getTokenType(tokenID);
 			if ( tokenType==Label.EOF ||
 				 tokenType>=Label.MIN_TOKEN_TYPE )
@@ -865,9 +899,7 @@
 		vocabFileST.add("tokens",(Object)null);
 		vocabFileST.impl.name = "vocab-file";
 		// make constants for the token names
-		Iterator tokenIDs = grammar.getTokenIDs().iterator();
-		while (tokenIDs.hasNext()) {
-			String tokenID = (String) tokenIDs.next();
+		for (String tokenID : grammar.getTokenIDs()) {
 			int tokenType = grammar.getTokenType(tokenID);
 			if ( tokenType>=Label.MIN_TOKEN_TYPE ) {
 				vocabFileST.addAggr("tokens.{name,type}", tokenID, Utils.integer(tokenType));
@@ -875,9 +907,7 @@
 		}
 
 		// now dump the strings
-		Iterator literals = grammar.getStringLiterals().iterator();
-		while (literals.hasNext()) {
-			String literal = (String) literals.next();
+		for (String literal : grammar.getStringLiterals()) {
 			int tokenType = grammar.getTokenType(literal);
 			if ( tokenType>=Label.MIN_TOKEN_TYPE ) {
 				vocabFileST.addAggr("tokens.{name,type}", literal, Utils.integer(tokenType));
@@ -887,21 +917,21 @@
 		return vocabFileST;
 	}
 
-	public List translateAction(String ruleName,
+	public List<? extends Object> translateAction(String ruleName,
 								GrammarAST actionTree)
 	{
 		if ( actionTree.getType()==ANTLRParser.ARG_ACTION ) {
 			return translateArgAction(ruleName, actionTree);
 		}
 		ActionTranslator translator = new ActionTranslator(this,ruleName,actionTree);
-		List chunks = translator.translateToChunks();
+		List<Object> chunks = translator.translateToChunks();
 		chunks = target.postProcessAction(chunks, actionTree.token);
 		return chunks;
 	}
 
 	/** Translate an action like [3,"foo",a[3]] and return a List of the
 	 *  translated actions.  Because actions are themselves translated to a list
-	 *  of chunks, must cat together into a ST>.  Don't translate
+	 *  of chunks, must cat together into a ST&gt;.  Don't translate
 	 *  to strings early as we need to eval templates in context.
 	 */
 	public List<ST> translateArgAction(String ruleName,
@@ -918,14 +948,14 @@
 					new ActionTranslator(this,ruleName,
 											  actionToken,
 											  actionTree.outerAltNum);
-				List chunks = translator.translateToChunks();
+				List<Object> chunks = translator.translateToChunks();
 				chunks = target.postProcessAction(chunks, actionToken);
 				ST catST = new ST(templates, "<chunks>");
 				catST.add("chunks", chunks);
 				translatedArgs.add(catST);
 			}
 		}
-		if ( translatedArgs.size()==0 ) {
+		if ( translatedArgs.isEmpty() ) {
 			return null;
 		}
 		return translatedArgs;
@@ -1057,7 +1087,7 @@
 		catch (Exception tse) {
 			ErrorManager.internalError("can't parse template action",tse);
 		}
-		GrammarAST rewriteTree = (GrammarAST)parseResult.getTree();
+		GrammarAST rewriteTree = parseResult.getTree();
 
 		// then translate via codegen.g
 		CodeGenTreeWalker gen = new CodeGenTreeWalker(new CommonTreeNodeStream(rewriteTree));
@@ -1281,7 +1311,7 @@
 		}
 		int size = 0;
 		for (int i = 0; i < s.getNumberOfTransitions(); i++) {
-			Transition edge = (Transition) s.transition(i);
+			Transition edge = s.transition(i);
 			if ( edge.label.isSemanticPredicate() ) {
 				return false;
 			}
@@ -1310,7 +1340,7 @@
 	/** Create a label to track a token / rule reference's result.
 	 *  Technically, this is a place where I break model-view separation
 	 *  as I am creating a variable name that could be invalid in a
-	 *  target language, however, label ::= <ID><INT> is probably ok in
+	 *  target language, however, label ::= &lt;ID&gt;&lt;INT&gt; is probably ok in
 	 *  all languages we care about.
 	 */
 	public String createUniqueLabel(String name) {
diff --git a/tool/src/main/java/org/antlr/codegen/CppTarget.java b/tool/src/main/java/org/antlr/codegen/CppTarget.java
new file mode 100755
index 0000000..eef580f
--- /dev/null
+++ b/tool/src/main/java/org/antlr/codegen/CppTarget.java
@@ -0,0 +1,376 @@
+/*
+ * [The "BSD license"]
+ *  Copyright (c) 2010 Terence Parr
+ *  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.
+ */
+package org.antlr.codegen;
+
+import org.antlr.Tool;
+import org.antlr.tool.Grammar;
+import org.stringtemplate.v4.ST;
+import org.stringtemplate.v4.misc.Aggregate;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+public class CppTarget extends Target {
+    @Override
+    public boolean useBaseTemplatesForSynPredFragments() {
+        return false;
+    }
+
+    ArrayList<String> strings = new ArrayList<String>();
+
+    @Override
+    protected void genRecognizerFile(Tool tool,
+            CodeGenerator generator,
+            Grammar grammar,
+            ST outputFileST)
+            throws IOException {
+
+        // Before we write this, and cause it to generate its string,
+        // we need to add all the string literals that we are going to match
+        //
+        outputFileST.add("literals", strings);
+        String fileName = generator.getRecognizerFileName(grammar.name, grammar.type);
+        generator.write(outputFileST, fileName);
+    }
+
+    @Override
+    protected void genRecognizerHeaderFile(Tool tool,
+            CodeGenerator generator,
+            Grammar grammar,
+            ST headerFileST,
+            String extName)
+            throws IOException {
+
+		//Its better we remove the EOF Token, as it would have been defined everywhere in C.
+		//we define it later as "EOF_TOKEN" instead of "EOF"
+		List<?> tokens = (List<?>)headerFileST.getAttribute("tokens");
+		for( int i = 0; i < tokens.size(); ++i )
+		{
+			boolean can_break = false;
+			Object tok = tokens.get(i);
+			if( tok instanceof Aggregate )
+			{
+				Aggregate atok = (Aggregate) tok;
+				for (Map.Entry<String, Object> pairs : atok.properties.entrySet()) {
+					if( pairs.getValue().equals("EOF") )
+					{
+						tokens.remove(i);
+						can_break = true;
+						break;
+					}
+				}
+			}
+
+			if( can_break )
+				break;
+		}
+
+		// Pick up the file name we are generating. This method will return a
+		// a file suffixed with .c, so we must substring and add the extName
+		// to it as we cannot assign into strings in Java.
+        ///
+        String fileName = generator.getRecognizerFileName(grammar.name, grammar.type);
+        fileName = fileName.substring(0, fileName.length() - 4) + extName;
+
+        generator.write(headerFileST, fileName);
+    }
+
+    protected ST chooseWhereCyclicDFAsGo(Tool tool,
+            CodeGenerator generator,
+            Grammar grammar,
+            ST recognizerST,
+            ST cyclicDFAST) {
+        return recognizerST;
+    }
+
+    /** Is scope in @scope::name {action} valid for this kind of grammar?
+     *  Targets like C++ may want to allow new scopes like headerfile or
+     *  some such.  The action names themselves are not policed at the
+     *  moment so targets can add template actions w/o having to recompile
+     *  ANTLR.
+     */
+    @Override
+    public boolean isValidActionScope(int grammarType, String scope) {
+        switch (grammarType) {
+            case Grammar.LEXER:
+                if (scope.equals("lexer")) {
+                    return true;
+                }
+                if (scope.equals("header")) {
+                    return true;
+                }
+                if (scope.equals("includes")) {
+                    return true;
+                }
+                if (scope.equals("preincludes")) {
+                    return true;
+                }
+                if (scope.equals("overrides")) {
+                    return true;
+                }
+                if (scope.equals("namespace")) {
+				    return true;
+				}
+
+                break;
+            case Grammar.PARSER:
+                if (scope.equals("parser")) {
+                    return true;
+                }
+                if (scope.equals("header")) {
+                    return true;
+                }
+                if (scope.equals("includes")) {
+                    return true;
+                }
+                if (scope.equals("preincludes")) {
+                    return true;
+                }
+                if (scope.equals("overrides")) {
+                    return true;
+                }
+				if (scope.equals("namespace")) {
+					return true;
+				}
+
+                break;
+            case Grammar.COMBINED:
+                if (scope.equals("parser")) {
+                    return true;
+                }
+                if (scope.equals("lexer")) {
+                    return true;
+                }
+                if (scope.equals("header")) {
+                    return true;
+                }
+                if (scope.equals("includes")) {
+                    return true;
+                }
+                if (scope.equals("preincludes")) {
+                    return true;
+                }
+                if (scope.equals("overrides")) {
+                    return true;
+                }
+                if (scope.equals("namespace")) {
+				    return true;
+				}
+
+                break;
+            case Grammar.TREE_PARSER:
+                if (scope.equals("treeparser")) {
+                    return true;
+                }
+                if (scope.equals("header")) {
+                    return true;
+                }
+                if (scope.equals("includes")) {
+                    return true;
+                }
+                if (scope.equals("preincludes")) {
+                    return true;
+                }
+                if (scope.equals("overrides")) {
+                    return true;
+                }
+                if (scope.equals("namespace")) {
+				    return true;
+				}
+				break;
+        }
+        return false;
+    }
+
+    @Override
+    public String getTargetCharLiteralFromANTLRCharLiteral(
+            CodeGenerator generator,
+            String literal) {
+
+        if (literal.startsWith("'\\u")) {
+            literal = "0x" + literal.substring(3, 7);
+        } else {
+            int c = literal.charAt(1);
+
+            if (c < 32 || c > 127) {
+                literal = "0x" + Integer.toHexString(c);
+            }
+        }
+
+        return literal;
+    }
+
+    /** Convert from an ANTLR string literal found in a grammar file to
+     *  an equivalent string literal in the C target.
+     *  Because we must support Unicode character sets and have chosen
+     *  to have the lexer match UTF32 characters, then we must encode
+     *  string matches to use 32 bit character arrays. Here then we
+     *  must produce the C array and cater for the case where the
+     *  lexer has been encoded with a string such as 'xyz\n',
+     */
+    @Override
+    public String getTargetStringLiteralFromANTLRStringLiteral(
+            CodeGenerator generator,
+            String literal) {
+        int index;
+        String bytes;
+        StringBuffer buf = new StringBuffer();
+
+        buf.append("{ ");
+
+        // We need ot lose any escaped characters of the form \x and just
+        // replace them with their actual values as well as lose the surrounding
+        // quote marks.
+        //
+        for (int i = 1; i < literal.length() - 1; i++) {
+            buf.append("0x");
+
+            if (literal.charAt(i) == '\\') {
+                i++; // Assume that there is a next character, this will just yield
+                // invalid strings if not, which is what the input would be of course - invalid
+                switch (literal.charAt(i)) {
+                    case 'u':
+                    case 'U':
+                        buf.append(literal.substring(i + 1, i + 5));  // Already a hex string
+                        i = i + 5;                                // Move to next string/char/escape
+                        break;
+
+                    case 'n':
+                    case 'N':
+
+                        buf.append("0A");
+                        break;
+
+                    case 'r':
+                    case 'R':
+
+                        buf.append("0D");
+                        break;
+
+                    case 't':
+                    case 'T':
+
+                        buf.append("09");
+                        break;
+
+                    case 'b':
+                    case 'B':
+
+                        buf.append("08");
+                        break;
+
+                    case 'f':
+                    case 'F':
+
+                        buf.append("0C");
+                        break;
+
+                    default:
+
+                        // Anything else is what it is!
+                        //
+                        buf.append(Integer.toHexString((int) literal.charAt(i)).toUpperCase());
+                        break;
+                }
+            } else {
+                buf.append(Integer.toHexString((int) literal.charAt(i)).toUpperCase());
+            }
+            buf.append(", ");
+        }
+        buf.append(" antlr3::ANTLR_STRING_TERMINATOR}");
+
+        bytes = buf.toString();
+        index = strings.indexOf(bytes);
+
+        if (index == -1) {
+            strings.add(bytes);
+            index = strings.indexOf(bytes);
+        }
+
+        String strref = "lit_" + String.valueOf(index + 1);
+
+        return strref;
+    }
+
+    /**
+     * Overrides the standard grammar analysis so we can prepare the analyser
+     * a little differently from the other targets.
+     *
+     * In particular we want to influence the way the code generator makes assumptions about
+     * switchs vs ifs, vs table driven DFAs. In general, C code should be generated that
+     * has the minimum use of tables, and tha meximum use of large switch statements. This
+     * allows the optimizers to generate very efficient code, it can reduce object code size
+     * by about 30% and give about a 20% performance improvement over not doing this. Hence,
+     * for the C target only, we change the defaults here, but only if they are still set to the
+     * defaults.
+     *
+     * @param generator An instance of the generic code generator class.
+     * @param grammar The grammar that we are currently analyzing
+     */
+    @Override
+    protected void performGrammarAnalysis(CodeGenerator generator, Grammar grammar) {
+
+        // Check to see if the maximum inline DFA states is still set to
+        // the default size. If it is then whack it all the way up to the maximum that
+        // we can sensibly get away with.
+        //
+        if (CodeGenerator.MAX_ACYCLIC_DFA_STATES_INLINE == CodeGenerator.MADSI_DEFAULT ) {
+
+            CodeGenerator.MAX_ACYCLIC_DFA_STATES_INLINE = 65535;
+        }
+
+        // Check to see if the maximum switch size is still set to the default
+        // and bring it up much higher if it is. Modern C compilers can handle
+        // much bigger switch statements than say Java can and if anyone finds a compiler
+        // that cannot deal with such big switches, all the need do is generate the
+        // code with a reduced -Xmaxswitchcaselabels nnn
+        //
+        if  (CodeGenerator.MAX_SWITCH_CASE_LABELS == CodeGenerator.MSCL_DEFAULT) {
+
+            CodeGenerator.MAX_SWITCH_CASE_LABELS = 3000;
+        }
+
+        // Check to see if the number of transitions considered a miminum for using
+        // a switch is still at the default. Because a switch is still generally faster than
+        // an if even with small sets, and given that the optimizer will do the best thing with it
+        // anyway, then we simply want to generate a switch for any number of states.
+        //
+        if (CodeGenerator.MIN_SWITCH_ALTS == CodeGenerator.MSA_DEFAULT) {
+
+            CodeGenerator.MIN_SWITCH_ALTS = 1;
+        }
+
+        // Now we allow the superclass implementation to do whatever it feels it
+        // must do.
+        //
+        super.performGrammarAnalysis(generator, grammar);
+    }
+}
+
diff --git a/tool/src/main/java/org/antlr/codegen/DelphiTarget.java b/tool/src/main/java/org/antlr/codegen/DelphiTarget.java
index 24bb819..2e1d19a 100644
--- a/tool/src/main/java/org/antlr/codegen/DelphiTarget.java
+++ b/tool/src/main/java/org/antlr/codegen/DelphiTarget.java
@@ -55,6 +55,7 @@
     return recognizerST;
   }
 
+	@Override
   public String encodeIntAsCharEscape(int v)
   {
     if (v <= 127)
@@ -66,11 +67,12 @@
     return "'#$" + hex + "'";
   }
   
+	@Override
   public String getTargetCharLiteralFromANTLRCharLiteral(
     CodeGenerator generator,
     String literal)
   {
-    StringBuffer buf = new StringBuffer();
+    StringBuilder buf = new StringBuilder();
     int c = Grammar.getCharValueFromGrammarCharLiteral(literal);
     if ( c<Label.MIN_CHAR_VALUE ) {
       return "0";
@@ -81,11 +83,12 @@
     return buf.toString();
   } 
 
+	@Override
   public String getTargetStringLiteralFromString(String s, boolean quoted) {
     if ( s==null ) {
       return null;
     }
-    StringBuffer buf = new StringBuffer();
+    StringBuilder buf = new StringBuilder();
     if ( quoted ) {
       buf.append('\'');
     }
@@ -113,6 +116,7 @@
     return buf.toString();
   }
 
+	@Override
   public String getTargetStringLiteralFromANTLRStringLiteral(
     CodeGenerator generator,
     String literal)
@@ -121,15 +125,16 @@
     literal = Utils.replace(literal,"\\r\\n","'#13#10'"); 
     literal = Utils.replace(literal,"\\r","'#13'"); 
     literal = Utils.replace(literal,"\\n","'#10'"); 
-    StringBuffer buf = new StringBuffer(literal);
+    StringBuilder buf = new StringBuilder(literal);
     buf.setCharAt(0,'\'');
     buf.setCharAt(literal.length()-1,'\'');
     return buf.toString();
   }
    
+	@Override
   public String getTarget64BitStringFromValue(long word) {
     int numHexDigits = 8*2;
-    StringBuffer buf = new StringBuffer(numHexDigits+2);
+    StringBuilder buf = new StringBuilder(numHexDigits+2);
     buf.append("$");
     String digits = Long.toHexString(word);
     digits = digits.toUpperCase();
diff --git a/tool/src/main/java/org/antlr/codegen/JavaScriptTarget.java b/tool/src/main/java/org/antlr/codegen/JavaScriptTarget.java
index 31e4ea5..2b6c99e 100755
--- a/tool/src/main/java/org/antlr/codegen/JavaScriptTarget.java
+++ b/tool/src/main/java/org/antlr/codegen/JavaScriptTarget.java
@@ -36,6 +36,7 @@
      *  This method overrides the parent class so that characters will always
      *  be encoded as Unicode literals (e.g. \u0011).
      */
+	@Override
     public String encodeIntAsCharEscape(int v) {
         String hex = Integer.toHexString(v|0x10000).substring(1,5);
         return "\\u"+hex;
@@ -52,6 +53,7 @@
      *
      *  Note: stole the following two methods from the ActionScript target.
      */
+	@Override
     public String getTarget64BitStringFromValue(long word) {
         StringBuffer buf = new StringBuffer(22); // enough for the two "0x", "," and " "
         buf.append("0x");
diff --git a/tool/src/main/java/org/antlr/codegen/JavaTarget.java b/tool/src/main/java/org/antlr/codegen/JavaTarget.java
index 3ec7a86..a73f27c 100644
--- a/tool/src/main/java/org/antlr/codegen/JavaTarget.java
+++ b/tool/src/main/java/org/antlr/codegen/JavaTarget.java
@@ -35,6 +35,11 @@
 import java.util.Set;
 
 public class JavaTarget extends Target {
+    @Override
+    public boolean useBaseTemplatesForSynPredFragments() {
+        return false;
+    }
+
 	protected ST chooseWhereCyclicDFAsGo(Tool tool,
 										 CodeGenerator generator,
 										 Grammar grammar,
@@ -50,7 +55,7 @@
 		for (Rule rule : grammar.getRules()) {
 			rule.throwsSpec.add("RecognitionException");
 		}
-		Set<Rule> delegatedRules = grammar.getDelegatedRules();
+		Set<? extends Rule> delegatedRules = grammar.getDelegatedRules();
 		if ( delegatedRules!=null ) {
 			for (Rule rule : delegatedRules) {
 				rule.throwsSpec.add("RecognitionException");
diff --git a/tool/src/main/java/org/antlr/codegen/ObjCTarget.java b/tool/src/main/java/org/antlr/codegen/ObjCTarget.java
index e4554e9..c20f76e 100644
--- a/tool/src/main/java/org/antlr/codegen/ObjCTarget.java
+++ b/tool/src/main/java/org/antlr/codegen/ObjCTarget.java
@@ -36,6 +36,7 @@
 import java.io.IOException;
 
 public class ObjCTarget extends Target {
+	@Override
 	protected void genRecognizerHeaderFile(Tool tool,
 										   CodeGenerator generator,
 										   Grammar grammar,
@@ -46,6 +47,7 @@
 		generator.write(headerFileST, grammar.name + Grammar.grammarTypeToFileNameSuffix[grammar.type] + extName);
 	}
 
+	@Override
 	public String getTargetCharLiteralFromANTLRCharLiteral(CodeGenerator generator,
 														   String literal)
 	{
@@ -63,15 +65,16 @@
 
 	/** Convert from an ANTLR string literal found in a grammar file to
 	*  an equivalent string literal in the target language.  For Java, this
-	*  is the translation 'a\n"' -> "a\n\"".  Expect single quotes
+	*  is the translation 'a\n"' &rarr; "a\n\"".  Expect single quotes
 	*  around the incoming literal.  Just flip the quotes and replace
 	*  double quotes with \"
 	*/
+	@Override
 	public String getTargetStringLiteralFromANTLRStringLiteral(CodeGenerator generator,
 															   String literal)
 	{
 		literal = Utils.replace(literal,"\"","\\\"");
-		StringBuffer buf = new StringBuffer(literal);
+		StringBuilder buf = new StringBuilder(literal);
 		buf.setCharAt(0,'"');
 		buf.setCharAt(literal.length()-1,'"');
 		buf.insert(0,'@');
@@ -79,6 +82,7 @@
 	}
 
 	/** If we have a label, prefix it with the recognizer's name */
+	@Override
 	public String getTokenTypeAsTargetLabel(CodeGenerator generator, int ttype) {
 		String name = generator.grammar.getTokenDisplayName(ttype);
 		// If name is a literal, return the token type instead
diff --git a/tool/src/main/java/org/antlr/codegen/Perl5Target.java b/tool/src/main/java/org/antlr/codegen/Perl5Target.java
index dc16e39..6b9ba16 100644
--- a/tool/src/main/java/org/antlr/codegen/Perl5Target.java
+++ b/tool/src/main/java/org/antlr/codegen/Perl5Target.java
@@ -41,6 +41,7 @@
         RuleLabelScope.predefinedLexerRulePropertiesScope.addAttribute("self", null);
     }
 
+	@Override
     public String getTargetCharLiteralFromANTLRCharLiteral(final CodeGenerator generator,
                                                            final String literal) {
         final StringBuffer buf = new StringBuffer(10);
@@ -79,6 +80,7 @@
         return buf.toString();
     }
 
+	@Override
     public String encodeIntAsCharEscape(final int v) {
         final int intValue;
         if ((v & 0x8000) == 0) {
diff --git a/tool/src/main/java/org/antlr/codegen/Python3Target.java b/tool/src/main/java/org/antlr/codegen/Python3Target.java
new file mode 100644
index 0000000..42bdc43
--- /dev/null
+++ b/tool/src/main/java/org/antlr/codegen/Python3Target.java
@@ -0,0 +1,227 @@
+/*
+ * [The "BSD license"]
+ *  Copyright (c) 2010 Terence Parr
+ *  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.
+ */
+
+/*
+
+Please excuse my obvious lack of Java experience. The code here is probably
+full of WTFs - though IMHO Java is the Real WTF(TM) here...
+
+ */
+
+package org.antlr.codegen;
+
+import org.antlr.runtime.Token;
+import org.antlr.tool.Grammar;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Python3Target extends Target {
+    @Override
+    public boolean useBaseTemplatesForSynPredFragments() {
+        return false;
+    }
+
+    /** Target must be able to override the labels used for token types */
+	@Override
+    public String getTokenTypeAsTargetLabel(CodeGenerator generator,
+					    int ttype) {
+	// use ints for predefined types;
+	// <invalid> <EOR> <DOWN> <UP>
+	if ( ttype >= 0 && ttype <= 3 ) {
+	    return String.valueOf(ttype);
+	}
+
+	String name = generator.grammar.getTokenDisplayName(ttype);
+
+	// If name is a literal, return the token type instead
+	if ( name.charAt(0)=='\'' ) {
+	    return String.valueOf(ttype);
+	}
+
+	return name;
+    }
+
+	@Override
+    public String getTargetCharLiteralFromANTLRCharLiteral(
+            CodeGenerator generator,
+            String literal) {
+	int c = Grammar.getCharValueFromGrammarCharLiteral(literal);
+	return String.valueOf(c);
+    }
+
+    private List<String> splitLines(String text) {
+		ArrayList<String> l = new ArrayList<String>();
+		int idx = 0;
+
+		while ( true ) {
+			int eol = text.indexOf("\n", idx);
+			if ( eol == -1 ) {
+				l.add(text.substring(idx));
+				break;
+			}
+			else {
+				l.add(text.substring(idx, eol+1));
+				idx = eol+1;
+			}
+		}
+
+		return l;
+    }
+
+	@Override
+    public List<Object> postProcessAction(List<Object> chunks, Token actionToken) {
+		/* TODO
+		   - check for and report TAB usage
+		 */
+
+		//System.out.println("\n*** Action at " + actionToken.getLine() + ":" + actionToken.getColumn());
+
+		/* First I create a new list of chunks. String chunks are splitted into
+		   lines and some whitespace my be added at the beginning.
+
+		   As a result I get a list of chunks
+		   - where the first line starts at column 0
+		   - where every LF is at the end of a string chunk
+		*/
+
+		List<Object> nChunks = new ArrayList<Object>();
+		for (int i = 0; i < chunks.size(); i++) {
+			Object chunk = chunks.get(i);
+
+			if ( chunk instanceof String ) {
+				String text = (String)chunks.get(i);
+				if ( nChunks.isEmpty() && actionToken.getCharPositionInLine() >= 0 ) {
+					// first chunk and some 'virtual' WS at beginning
+					// prepend to this chunk
+
+					String ws = "";
+					for ( int j = 0 ; j < actionToken.getCharPositionInLine() ; j++ ) {
+						ws += " ";
+					}
+					text = ws + text;
+				}
+
+				nChunks.addAll(splitLines(text));
+			}
+			else {
+				if ( nChunks.isEmpty() && actionToken.getCharPositionInLine() >= 0 ) {
+					// first chunk and some 'virtual' WS at beginning
+					// add as a chunk of its own
+
+					String ws = "";
+					for ( int j = 0 ; j <= actionToken.getCharPositionInLine() ; j++ ) {
+						ws += " ";
+					}
+					nChunks.add(ws);
+				}
+
+				nChunks.add(chunk);
+			}
+		}
+
+		int lineNo = actionToken.getLine();
+		int col = 0;
+
+		// strip trailing empty lines
+		int lastChunk = nChunks.size() - 1;
+		while ( lastChunk > 0
+				&& nChunks.get(lastChunk) instanceof String
+				&& ((String)nChunks.get(lastChunk)).trim().length() == 0 )
+			lastChunk--;
+
+		// string leading empty lines
+		int firstChunk = 0;
+		while ( firstChunk <= lastChunk
+				&& nChunks.get(firstChunk) instanceof String
+				&& ((String)nChunks.get(firstChunk)).trim().length() == 0
+				&& ((String)nChunks.get(firstChunk)).endsWith("\n") ) {
+			lineNo++;
+			firstChunk++;
+		}
+
+		int indent = -1;
+		for ( int i = firstChunk ; i <= lastChunk ; i++ ) {
+			Object chunk = nChunks.get(i);
+
+			//System.out.println(lineNo + ":" + col + " " + quote(chunk.toString()));
+
+			if ( chunk instanceof String ) {
+				String text = (String)chunk;
+
+				if ( col == 0 ) {
+					if ( indent == -1 ) {
+						// first non-blank line
+						// count number of leading whitespaces
+
+						indent = 0;
+						for ( int j = 0; j < text.length(); j++ ) {
+							if ( !Character.isWhitespace(text.charAt(j)) )
+								break;
+			
+							indent++;
+						}
+					}
+
+					if ( text.length() >= indent ) {
+						int j;
+						for ( j = 0; j < indent ; j++ ) {
+							if ( !Character.isWhitespace(text.charAt(j)) ) {
+								// should do real error reporting here...
+								System.err.println("Warning: badly indented line " + lineNo + " in action:");
+								System.err.println(text);
+								break;
+							}
+						}
+
+						nChunks.set(i, text.substring(j));
+					}
+					else if ( text.trim().length() > 0 ) {
+						// should do real error reporting here...
+						System.err.println("Warning: badly indented line " + lineNo + " in action:");
+						System.err.println(text);
+					}
+				}
+
+				if ( text.endsWith("\n") ) {
+					lineNo++;
+					col = 0;
+				}
+				else {
+					col += text.length();
+				}
+			}
+			else {
+				// not really correct, but all I need is col to increment...
+				col += 1;
+			}
+		}
+
+		return nChunks;
+    }
+}
diff --git a/tool/src/main/java/org/antlr/codegen/PythonTarget.java b/tool/src/main/java/org/antlr/codegen/PythonTarget.java
index d087f4c..9df18c2 100644
--- a/tool/src/main/java/org/antlr/codegen/PythonTarget.java
+++ b/tool/src/main/java/org/antlr/codegen/PythonTarget.java
@@ -42,7 +42,12 @@
 import java.util.List;
 
 public class PythonTarget extends Target {
+    @Override
+    public boolean useBaseTemplatesForSynPredFragments() {
+        return false;
+    }
     /** Target must be able to override the labels used for token types */
+	@Override
     public String getTokenTypeAsTargetLabel(CodeGenerator generator,
 					    int ttype) {
 	// use ints for predefined types;
@@ -61,6 +66,7 @@
 	return name;
     }
 
+	@Override
     public String getTargetCharLiteralFromANTLRCharLiteral(
             CodeGenerator generator,
             String literal) {
@@ -68,8 +74,8 @@
 	return String.valueOf(c);
     }
 
-    private List splitLines(String text) {
-		ArrayList l = new ArrayList();
+    private List<String> splitLines(String text) {
+		ArrayList<String> l = new ArrayList<String>();
 		int idx = 0;
 
 		while ( true ) {
@@ -87,7 +93,8 @@
 		return l;
     }
 
-    public List postProcessAction(List chunks, Token actionToken) {
+	@Override
+    public List<Object> postProcessAction(List<Object> chunks, Token actionToken) {
 		/* TODO
 		   - check for and report TAB usage
 		 */
@@ -102,13 +109,13 @@
 		   - where every LF is at the end of a string chunk
 		*/
 
-		List nChunks = new ArrayList();
+		List<Object> nChunks = new ArrayList<Object>();
 		for (int i = 0; i < chunks.size(); i++) {
 			Object chunk = chunks.get(i);
 
 			if ( chunk instanceof String ) {
 				String text = (String)chunks.get(i);
-				if ( nChunks.size() == 0 && actionToken.getCharPositionInLine() >= 0 ) {
+				if ( nChunks.isEmpty() && actionToken.getCharPositionInLine() >= 0 ) {
 					// first chunk and some 'virtual' WS at beginning
 					// prepend to this chunk
 
@@ -119,14 +126,10 @@
 					text = ws + text;
 				}
 
-				List parts = splitLines(text);
-				for ( int j = 0 ; j < parts.size() ; j++ ) {
-					chunk = parts.get(j);
-					nChunks.add(chunk);
-				}
+				nChunks.addAll(splitLines(text));
 			}
 			else {
-				if ( nChunks.size() == 0 && actionToken.getCharPositionInLine() >= 0 ) {
+				if ( nChunks.isEmpty() && actionToken.getCharPositionInLine() >= 0 ) {
 					// first chunk and some 'virtual' WS at beginning
 					// add as a chunk of its own
 
diff --git a/tool/src/main/java/org/antlr/codegen/RubyTarget.java b/tool/src/main/java/org/antlr/codegen/RubyTarget.java
index 4506d01..cb2107f 100644
--- a/tool/src/main/java/org/antlr/codegen/RubyTarget.java
+++ b/tool/src/main/java/org/antlr/codegen/RubyTarget.java
@@ -42,8 +42,8 @@
     /** A set of ruby keywords which are used to escape labels and method names
      *  which will cause parse errors in the ruby source
      */
-    public static final Set rubyKeywords =
-    new HashSet() {
+    public static final Set<String> rubyKeywords =
+    new HashSet<String>() {
         {
         	add( "alias" );     add( "END" );     add( "retry" );
         	add( "and" );       add( "ensure" );  add( "return" );
@@ -90,6 +90,7 @@
     		rubyCharValueEscape['"'] = "\\\"";
     	}
 
+		@Override
         public String toString( Object o, String formatName, Locale locale ) {
 			if ( formatName==null ) {
 				return o.toString();
@@ -97,7 +98,7 @@
 			
             String idString = o.toString();
 
-            if ( idString.isEmpty() ) return idString;
+            if ( idString.length() == 0 ) return idString;
 
             if ( formatName.equals( "snakecase" ) ) {
                 return snakecase( idString );
@@ -133,11 +134,11 @@
          *
          * example -- aGUIWhatNot
          *   c   c+1 c+2  action
-         *   a   G        << 'a' << '_'  // a lower-upper word edge
-         *   G   U   I    << 'g'
-         *   U   I   W    << 'w'
-         *   I   W   h    << 'i' << '_'  // the last character in an acronym run of uppers
-         *   W   h        << 'w'
+         *   a   G        &lt;&lt; 'a' &lt;&lt; '_'  // a lower-upper word edge
+         *   G   U   I    &lt;&lt; 'g'
+         *   U   I   W    &lt;&lt; 'w'
+         *   I   W   h    &lt;&lt; 'i' &lt;&lt; '_'  // the last character in an acronym run of uppers
+         *   W   h        &lt;&lt; 'w'
          *   ... and so on
          */
         private String snakecase( String value ) {
@@ -148,7 +149,7 @@
             char next;
             char peek;
 
-            if ( value.isEmpty() ) return value;
+            if ( value.length() == 0 ) return value;
             if ( l == 1 ) return value.toLowerCase();
 
             for ( int i = 0; i < cliff; i++ ) {
@@ -245,7 +246,7 @@
             char next;
             boolean at_edge = true;
 
-            if ( value.isEmpty() ) return value;
+            if ( value.length() == 0 ) return value;
             if ( cliff == 1 ) return value.toUpperCase();
 
             for ( int i = 0; i < cliff; i++ ) {
@@ -292,7 +293,7 @@
 
         private String subcamelcase( String value ) {
             value = camelcase( value );
-            if ( value.isEmpty() )
+            if ( value.length() == 0 )
                 return value;
             Character head = Character.toLowerCase( value.charAt( 0 ) );
             String tail = value.substring( 1 );
@@ -300,6 +301,7 @@
         }
     }
 
+	@Override
     protected void genRecognizerFile(
     		Tool tool,
     		CodeGenerator generator,
@@ -364,6 +366,7 @@
         generator.write( outputFileST, fileName );
     }
 
+	@Override
     public String getTargetCharLiteralFromANTLRCharLiteral(
         CodeGenerator generator,
         String literal
@@ -410,12 +413,14 @@
         return ( "0x" + Integer.toHexString( code_point ) );
     }
 
+	@Override
     public int getMaxCharValue( CodeGenerator generator )
     {
         // Versions before 1.9 do not support unicode
         return 0xFF;
     }
 
+	@Override
     public String getTokenTypeAsTargetLabel( CodeGenerator generator, int ttype )
     {
         String name = generator.grammar.getTokenDisplayName( ttype );
@@ -426,6 +431,7 @@
         return name;
     }
 
+	@Override
     public boolean isValidActionScope( int grammarType, String scope ) {
         if ( scope.equals( "all" ) )       {
             return true;
@@ -468,6 +474,7 @@
         return false;
     }
 
+	@Override
     public String encodeIntAsCharEscape( final int v ) {
         final int intValue;
 
diff --git a/tool/src/main/java/org/antlr/codegen/Target.java b/tool/src/main/java/org/antlr/codegen/Target.java
index 848dd7f..0a88326 100644
--- a/tool/src/main/java/org/antlr/codegen/Target.java
+++ b/tool/src/main/java/org/antlr/codegen/Target.java
@@ -83,6 +83,10 @@
 		targetCharValueEscape['"'] = "\\\"";
 	}
 
+    public boolean useBaseTemplatesForSynPredFragments() {
+        return true;
+    }
+
 	protected void genRecognizerFile(Tool tool,
 									 CodeGenerator generator,
 									 Grammar grammar,
@@ -162,7 +166,7 @@
 		CodeGenerator generator,
 		String literal)
 	{
-		StringBuffer buf = new StringBuffer();
+		StringBuilder buf = new StringBuilder();
 		buf.append('\'');
 		int c = Grammar.getCharValueFromGrammarCharLiteral(literal);
 		if ( c<Label.MIN_CHAR_VALUE ) {
@@ -195,7 +199,7 @@
 
 	/** Convert from an ANTLR string literal found in a grammar file to
 	 *  an equivalent string literal in the target language.  For Java, this
-	 *  is the translation 'a\n"' -> "a\n\"".  Expect single quotes
+	 *  is the translation 'a\n"' &rarr; "a\n\"".  Expect single quotes
 	 *  around the incoming literal.  Just flip the quotes and replace
 	 *  double quotes with \"
      * 
@@ -209,7 +213,7 @@
 		String literal)
 	{
         StringBuilder sb = new StringBuilder();
-        StringBuffer is = new StringBuffer(literal);
+        StringBuilder is = new StringBuilder(literal);
         
         // Opening quote
         //
@@ -291,7 +295,7 @@
 			return null;
 		}
 
-		StringBuffer buf = new StringBuffer();
+		StringBuilder buf = new StringBuilder();
 		if ( quoted ) {
 			buf.append('"');
 		}
@@ -322,7 +326,7 @@
 	 */
 	public String getTarget64BitStringFromValue(long word) {
 		int numHexDigits = 8*2;
-		StringBuffer buf = new StringBuffer(numHexDigits+2);
+		StringBuilder buf = new StringBuilder(numHexDigits+2);
 		buf.append("0x");
 		String digits = Long.toHexString(word);
 		digits = digits.toUpperCase();
@@ -353,7 +357,7 @@
 	/** Give target a chance to do some postprocessing on actions.
 	 *  Python for example will have to fix the indention.
 	 */
-	public List postProcessAction(List chunks, Token actionToken) {
+	public List<Object> postProcessAction(List<Object> chunks, Token actionToken) {
 		return chunks;
 	}
 
diff --git a/tool/src/main/java/org/antlr/misc/BitSet.java b/tool/src/main/java/org/antlr/misc/BitSet.java
index ab2928e..c85b923 100644
--- a/tool/src/main/java/org/antlr/misc/BitSet.java
+++ b/tool/src/main/java/org/antlr/misc/BitSet.java
@@ -82,6 +82,7 @@
     }
 
     /** or this element into this set (grow as necessary to accommodate) */
+	@Override
     public void add(int el) {
         //System.out.println("add("+el+")");
         int n = wordNumber(el);
@@ -93,6 +94,7 @@
         bits[n] |= bitMask(el);
     }
 
+	@Override
     public void addAll(IntSet set) {
         if ( set instanceof BitSet ) {
             this.orInPlace((BitSet)set);
@@ -100,8 +102,7 @@
 		else if ( set instanceof IntervalSet ) {
 			IntervalSet other = (IntervalSet)set;
 			// walk set and add each interval
-			for (Iterator iter = other.intervals.iterator(); iter.hasNext();) {
-				Interval I = (Interval) iter.next();
+			for (Interval I : other.intervals) {
 				this.orInPlace(BitSet.range(I.a,I.b));
 			}
 		}
@@ -122,18 +123,12 @@
 		}
 	}
 
-	public void addAll(Iterable elements) {
+	public void addAll(Iterable<Integer> elements) {
 		if ( elements==null ) {
 			return;
 		}
-		Iterator it = elements.iterator();
-		while (it.hasNext()) {
-			Object o = (Object) it.next();
-			if ( !(o instanceof Integer) ) {
-				throw new IllegalArgumentException();
-			}
-			Integer eI = (Integer)o;
-			add(eI.intValue());
+		for (Integer element : elements) {
+			add(element);
 		}
 		/*
 		int n = elements.size();
@@ -148,6 +143,7 @@
 		 */
 	}
 
+	@Override
     public IntSet and(IntSet a) {
         BitSet s = (BitSet)this.clone();
         s.andInPlace((BitSet)a);
@@ -165,7 +161,7 @@
         }
     }
 
-    private final static long bitMask(int bitNumber) {
+    private static long bitMask(int bitNumber) {
         int bitPosition = bitNumber & MOD_MASK; // bitNumber mod BITS
         return 1L << bitPosition;
     }
@@ -184,6 +180,7 @@
         bits[n] &= ~bitMask(el);
     }
 
+	@Override
     public Object clone() {
         BitSet s;
         try {
@@ -197,6 +194,7 @@
         return s;
     }
 
+	@Override
     public int size() {
         int deg = 0;
         for (int i = bits.length - 1; i >= 0; i--) {
@@ -212,6 +210,7 @@
         return deg;
     }
 
+	@Override
     public boolean equals(Object other) {
         if ( other == null || !(other instanceof BitSet) ) {
             return false;
@@ -259,6 +258,7 @@
         bits = newbits;
     }
 
+	@Override
     public boolean member(int el) {
         int n = wordNumber(el);
         if (n >= bits.length) return false;
@@ -268,6 +268,7 @@
     /** Get the first element you find and return it.  Return Label.INVALID
      *  otherwise.
      */
+	@Override
     public int getSingleElement() {
         for (int i = 0; i < (bits.length << LOG_BITS); i++) {
             if (member(i)) {
@@ -277,6 +278,7 @@
         return Label.INVALID;
     }
 
+	@Override
     public boolean isNil() {
         for (int i = bits.length - 1; i >= 0; i--) {
             if (bits[i] != 0) return false;
@@ -290,6 +292,7 @@
         return s;
     }
 
+	@Override
     public IntSet complement(IntSet set) {
 		if ( set==null ) {
 			return this.complement();
@@ -318,7 +321,7 @@
         }
     }
 
-    private final int numWordsToHold(int el) {
+    private int numWordsToHold(int el) {
         return (el >> LOG_BITS) + 1;
     }
 
@@ -328,12 +331,10 @@
         return s;
     }
 
-    public static BitSet of(Collection elements) {
+    public static BitSet of(Collection<? extends Integer> elements) {
         BitSet s = new BitSet();
-        Iterator iter = elements.iterator();
-        while (iter.hasNext()) {
-            Integer el = (Integer) iter.next();
-            s.add(el.intValue());
+        for (Integer el : elements) {
+            s.add(el);
         }
         return s;
     }
@@ -354,7 +355,7 @@
 		throw new IllegalArgumentException("can't create BitSet from "+set.getClass().getName());
 	}
 
-    public static BitSet of(Map elements) {
+    public static BitSet of(Map<? extends Integer, ?> elements) {
         return BitSet.of(elements.keySet());
     }
 
@@ -368,6 +369,7 @@
 	}
 
     /** return this | a in a new set */
+	@Override
     public IntSet or(IntSet a) {
 		if ( a==null ) {
 			return this;
@@ -392,6 +394,7 @@
     }
 
     // remove this element from this set
+	@Override
     public void remove(int el) {
         int n = wordNumber(el);
         if (n >= bits.length) {
@@ -439,6 +442,7 @@
         }
     }
 
+	@Override
     public IntSet subtract(IntSet a) {
         if (a == null || !(a instanceof BitSet)) return null;
 
@@ -447,7 +451,8 @@
         return s;
     }
 
-	public List toList() {
+	@Override
+	public List<Integer> toList() {
 		throw new NoSuchMethodError("BitSet.toList() unimplemented");
 	}
 
@@ -466,6 +471,7 @@
         return bits;
     }
 
+	@Override
     public String toString() {
         return toString(null);
     }
@@ -474,8 +480,9 @@
      * separator The string to put in between elements
      * @return A commma-separated list of values
      */
+	@Override
     public String toString(Grammar g) {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         String separator = ",";
 		boolean havePrintedAnElement = false;
 		buf.append('{');
@@ -504,7 +511,7 @@
      * separator The string to put in between elements
      * @return A commma-separated list of character constants.
      */
-    public String toString(String separator, List vocabulary) {
+    public String toString(String separator, List<String> vocabulary) {
         if (vocabulary == null) {
             return toString(null);
         }
@@ -521,7 +528,7 @@
                     str += "'" + (char)i + "'";
                 }
                 else {
-                    str += (String)vocabulary.get(i);
+                    str += vocabulary.get(i);
                 }
             }
         }
@@ -534,7 +541,7 @@
      * This generates a comma-separated list of C++-like unsigned long constants.
      */
     public String toStringOfHalfWords() {
-        StringBuffer s = new StringBuffer();
+        StringBuilder s = new StringBuilder();
         for (int i = 0; i < bits.length; i++) {
             if (i != 0) s.append(", ");
             long tmp = bits[i];
@@ -555,7 +562,7 @@
      * This generates a comma-separated list of Java-like long int constants.
      */
     public String toStringOfWords() {
-		StringBuffer s = new StringBuffer();
+		StringBuilder s = new StringBuilder();
         for (int i = 0; i < bits.length; i++) {
             if (i != 0) s.append(", ");
             s.append(bits[i]);
@@ -568,7 +575,7 @@
         return toString();
     }
 
-    private final static int wordNumber(int bit) {
+    private static int wordNumber(int bit) {
         return bit >> LOG_BITS; // bit / BITS
     }
 }
diff --git a/tool/src/main/java/org/antlr/misc/Graph.java b/tool/src/main/java/org/antlr/misc/Graph.java
index 74962e5..5df5ac1 100644
--- a/tool/src/main/java/org/antlr/misc/Graph.java
+++ b/tool/src/main/java/org/antlr/misc/Graph.java
@@ -33,36 +33,37 @@
  *  This is only used to topologically sort a list of file dependencies
  *  at the moment.
  */
-public class Graph {
+public class Graph<T> {
 
-    public static class Node {
-        Object payload;
-        List<Node> edges; // points at which nodes?
+    public static class Node<T> {
+        T payload;
+        List<Node<T>> edges; // points at which nodes?
 
-        public Node(Object payload) { this.payload = payload; }
+        public Node(T payload) { this.payload = payload; }
 
-        public void addEdge(Node n) {
-            if ( edges==null ) edges = new ArrayList<Node>();
+        public void addEdge(Node<T> n) {
+            if ( edges==null ) edges = new ArrayList<Node<T>>();
             if ( !edges.contains(n) ) edges.add(n);
         }
 
+		@Override
         public String toString() { return payload.toString(); }
     }
 
     /** Map from node payload to node containing it */
-    protected Map<Object,Node> nodes = new HashMap<Object,Node>();
+    protected Map<T,Node<T>> nodes = new HashMap<T,Node<T>>();
 
-    public void addEdge(Object a, Object b) {
+    public void addEdge(T a, T b) {
         //System.out.println("add edge "+a+" to "+b);
-        Node a_node = getNode(a);
-        Node b_node = getNode(b);
+        Node<T> a_node = getNode(a);
+        Node<T> b_node = getNode(b);
         a_node.addEdge(b_node);
     }
 
-    protected Node getNode(Object a) {
-        Node existing = nodes.get(a);
+    protected Node<T> getNode(T a) {
+        Node<T> existing = nodes.get(a);
         if ( existing!=null ) return existing;
-        Node n = new Node(a);
+        Node<T> n = new Node<T>(a);
         nodes.put(a, n);
         return n;
     }
@@ -72,20 +73,20 @@
      *  For sorting, I'm not following convention here since ANTLR
      *  needs the opposite.  Here's what I assume for sorting:
      *
-     *    If there exists an edge u -> v then u depends on v and v
+     *    If there exists an edge u &rarr; v then u depends on v and v
      *    must happen before u.
      *
      *  So if this gives nonreversed postorder traversal, I get the order
      *  I want.
      */
-    public List<Object> sort() {
-        Set<Node> visited = new OrderedHashSet<Node>();
-        ArrayList<Object> sorted = new ArrayList<Object>();
+    public List<T> sort() {
+        Set<Node<T>> visited = new OrderedHashSet<Node<T>>();
+        ArrayList<T> sorted = new ArrayList<T>();
         while ( visited.size() < nodes.size() ) {
             // pick any unvisited node, n
-            Node n = null;
-            for (Iterator it = nodes.values().iterator(); it.hasNext();) {
-                n = (Node)it.next();
+            Node<T> n = null;
+            for (Node<T> tNode : nodes.values()) {
+                n = tNode;
                 if ( !visited.contains(n) ) break;
             }
             DFS(n, visited, sorted);
@@ -93,12 +94,11 @@
         return sorted;
     }
 
-    public void DFS(Node n, Set<Node> visited, ArrayList<Object> sorted) {
+    public void DFS(Node<T> n, Set<Node<T>> visited, ArrayList<T> sorted) {
         if ( visited.contains(n) ) return;
         visited.add(n);
         if ( n.edges!=null ) {
-            for (Iterator it = n.edges.iterator(); it.hasNext();) {
-                Node target = (Node) it.next();
+            for (Node<T> target : n.edges) {
                 DFS(target, visited, sorted);
             }
         }
diff --git a/tool/src/main/java/org/antlr/misc/IntArrayList.java b/tool/src/main/java/org/antlr/misc/IntArrayList.java
index ab319dd..f1ee077 100644
--- a/tool/src/main/java/org/antlr/misc/IntArrayList.java
+++ b/tool/src/main/java/org/antlr/misc/IntArrayList.java
@@ -33,7 +33,7 @@
  *  modifiable list as I don't do, for example, add(index,element).
  *  TODO: unused?
  */
-public class IntArrayList extends AbstractList implements Cloneable {
+public class IntArrayList extends AbstractList<Integer> implements Cloneable {
 	private static final int DEFAULT_CAPACITY = 10;
 	protected int n = 0;
 	protected int[] elements = null;
@@ -95,7 +95,8 @@
 		}
 	}
 
-	public Object get(int i) {
+	@Override
+	public Integer get(int i) {
 		return Utils.integer(element(i));
 	}
 
@@ -109,6 +110,7 @@
 		return a;
 	}
 
+	@Override
 	public int size() {
 		return n;
 	}
@@ -117,6 +119,7 @@
         return elements.length;
     }
 
+	@Override
 	public boolean equals(Object o) {
         if ( o==null ) {
             return false;
@@ -133,6 +136,7 @@
 		return true;
 	}
 
+	@Override
     public Object clone() throws CloneNotSupportedException {
 		IntArrayList a = (IntArrayList)super.clone();
         a.n = this.n;
@@ -140,8 +144,9 @@
         return a;
     }
 
+	@Override
 	public String toString() {
-		StringBuffer buf = new StringBuffer();
+		StringBuilder buf = new StringBuilder();
 		for (int i = 0; i < n; i++) {
 			if ( i>0 ) {
 				buf.append(", ");
diff --git a/tool/src/main/java/org/antlr/misc/IntSet.java b/tool/src/main/java/org/antlr/misc/IntSet.java
index 3526f26..1551dd3 100644
--- a/tool/src/main/java/org/antlr/misc/IntSet.java
+++ b/tool/src/main/java/org/antlr/misc/IntSet.java
@@ -67,6 +67,7 @@
 
     boolean isNil();
 
+	@Override
     boolean equals(Object obj);
 
     int getSingleElement();
@@ -76,8 +77,9 @@
     /** remove this element from this set */
     void remove(int el);
 
-    List toList();
+    List<Integer> toList();
 
+	@Override
     String toString();
 
     String toString(Grammar g);
diff --git a/tool/src/main/java/org/antlr/misc/Interval.java b/tool/src/main/java/org/antlr/misc/Interval.java
index 5b2410b..3671fee 100644
--- a/tool/src/main/java/org/antlr/misc/Interval.java
+++ b/tool/src/main/java/org/antlr/misc/Interval.java
@@ -61,6 +61,7 @@
 		return cache[a];
 	}
 
+	@Override
 	public boolean equals(Object o) {
 		if ( o==null ) {
 			return false;
@@ -136,6 +137,7 @@
 		return diff;
 	}
 
+	@Override
 	public String toString() {
 		return a+".."+b;
 	}
diff --git a/tool/src/main/java/org/antlr/misc/IntervalSet.java b/tool/src/main/java/org/antlr/misc/IntervalSet.java
index dee54fe..15ec943 100644
--- a/tool/src/main/java/org/antlr/misc/IntervalSet.java
+++ b/tool/src/main/java/org/antlr/misc/IntervalSet.java
@@ -81,12 +81,13 @@
     /** Add a single element to the set.  An isolated element is stored
      *  as a range el..el.
      */
+	@Override
     public void add(int el) {
         add(el,el);
     }
 
     /** Add interval; i.e., add all integers from a to b to set.
-     *  If b<a, do nothing.
+     *  If b&lt;a, do nothing.
      *  Keep list in sorted order (by left range value).
      *  If overlap, combine ranges.  For example,
      *  If this is {1..5, 10..20}, adding 6..7 yields
@@ -104,8 +105,8 @@
 		}
 		// find position in list
 		// Use iterators as we modify list in place
-		for (ListIterator iter = intervals.listIterator(); iter.hasNext();) {
-			Interval r = (Interval) iter.next();
+		for (ListIterator<Interval> iter = intervals.listIterator(); iter.hasNext();) {
+			Interval r = iter.next();
 			if ( addition.equals(r) ) {
 				return;
 			}
@@ -115,14 +116,17 @@
 				iter.set(bigger);
 				// make sure we didn't just create an interval that
 				// should be merged with next interval in list
-				if ( iter.hasNext() ) {
-					Interval next = (Interval) iter.next();
-					if ( bigger.adjacent(next)||!bigger.disjoint(next) ) {
-						// if we bump up against or overlap next, merge
-						iter.remove();   // remove this one
-						iter.previous(); // move backwards to what we just set
-						iter.set(bigger.union(next)); // set to 3 merged ones
+				while ( iter.hasNext() ) {
+					Interval next = iter.next();
+					if ( !bigger.adjacent(next) && bigger.disjoint(next) ) {
+						break;
 					}
+
+					// if we bump up against or overlap next, merge
+					iter.remove();   // remove this one
+					iter.previous(); // move backwards to what we just set
+					iter.set(bigger.union(next)); // set to 3 merged ones
+					iter.next(); // first call to next after previous duplicates the result
 				}
 				return;
 			}
@@ -184,6 +188,7 @@
     }
 */
 
+	@Override
 	public void addAll(IntSet set) {
 		if ( set==null ) {
 			return;
@@ -197,12 +202,12 @@
         // walk set and add each interval
 		int n = other.intervals.size();
 		for (int i = 0; i < n; i++) {
-			Interval I = (Interval) other.intervals.get(i);
+			Interval I = other.intervals.get(i);
 			this.add(I.a,I.b);
 		}
     }
 
-    public IntSet complement(int minElement, int maxElement) {
+    public IntervalSet complement(int minElement, int maxElement) {
         return this.complement(IntervalSet.of(minElement,maxElement));
     }
 
@@ -212,7 +217,8 @@
      *
      *  'this' is assumed to be either a subset or equal to vocabulary.
      */
-    public IntSet complement(IntSet vocabulary) {
+	@Override
+    public IntervalSet complement(IntSet vocabulary) {
         if ( vocabulary==null ) {
             return null; // nothing in common with null set
         }
@@ -228,36 +234,37 @@
 		if ( n ==0 ) {
 			return compl;
 		}
-		Interval first = (Interval)intervals.get(0);
+		Interval first = intervals.get(0);
 		// add a range from 0 to first.a constrained to vocab
 		if ( first.a > 0 ) {
 			IntervalSet s = IntervalSet.of(0, first.a-1);
-			IntervalSet a = (IntervalSet)s.and(vocabularyIS);
+			IntervalSet a = s.and(vocabularyIS);
 			compl.addAll(a);
 		}
 		for (int i=1; i<n; i++) { // from 2nd interval .. nth
-			Interval previous = (Interval)intervals.get(i-1);
-			Interval current = (Interval)intervals.get(i);
+			Interval previous = intervals.get(i-1);
+			Interval current = intervals.get(i);
 			IntervalSet s = IntervalSet.of(previous.b+1, current.a-1);
-			IntervalSet a = (IntervalSet)s.and(vocabularyIS);
+			IntervalSet a = s.and(vocabularyIS);
 			compl.addAll(a);
 		}
-		Interval last = (Interval)intervals.get(n -1);
+		Interval last = intervals.get(n -1);
 		// add a range from last.b to maxElement constrained to vocab
 		if ( last.b < maxElement ) {
 			IntervalSet s = IntervalSet.of(last.b+1, maxElement);
-			IntervalSet a = (IntervalSet)s.and(vocabularyIS);
+			IntervalSet a = s.and(vocabularyIS);
 			compl.addAll(a);
 		}
 		return compl;
     }
 
-	/** Compute this-other via this&~other.
+	/** Compute this-other via this&amp;~other.
 	 *  Return a new set containing all elements in this but not in other.
 	 *  other is assumed to be a subset of this;
      *  anything that is in other but not in this will be ignored.
 	 */
-	public IntSet subtract(IntSet other) {
+	@Override
+	public IntervalSet subtract(IntSet other) {
 		// assume the whole unicode range here for the complement
 		// because it doesn't matter.  Anything beyond the max of this' set
 		// will be ignored since we are doing this & ~other.  The intersection
@@ -387,6 +394,7 @@
 	 */
 
     /** TODO: implement this! */
+	@Override
 	public IntSet or(IntSet a) {
 		IntervalSet o = new IntervalSet();
 		o.addAll(this);
@@ -400,13 +408,14 @@
      *  just walk them together.  This is roughly O(min(n,m)) for interval
      *  list lengths n and m.
      */
-	public IntSet and(IntSet other) {
+	@Override
+	public IntervalSet and(IntSet other) {
 		if ( other==null ) { //|| !(other instanceof IntervalSet) ) {
 			return null; // nothing in common with null set
 		}
 
-		ArrayList myIntervals = (ArrayList)this.intervals;
-		ArrayList theirIntervals = (ArrayList)((IntervalSet)other).intervals;
+		List<Interval> myIntervals = this.intervals;
+		List<Interval> theirIntervals = ((IntervalSet)other).intervals;
 		IntervalSet intersection = null;
 		int mySize = myIntervals.size();
 		int theirSize = theirIntervals.size();
@@ -414,8 +423,8 @@
 		int j = 0;
 		// iterate down both interval lists looking for nondisjoint intervals
 		while ( i<mySize && j<theirSize ) {
-			Interval mine = (Interval)myIntervals.get(i);
-			Interval theirs = (Interval)theirIntervals.get(j);
+			Interval mine = myIntervals.get(i);
+			Interval theirs = theirIntervals.get(j);
 			//System.out.println("mine="+mine+" and theirs="+theirs);
 			if ( mine.startsBeforeDisjoint(theirs) ) {
 				// move this iterator looking for interval that might overlap
@@ -469,10 +478,11 @@
 	}
 
     /** Is el in any range of this set? */
+	@Override
     public boolean member(int el) {
 		int n = intervals.size();
 		for (int i = 0; i < n; i++) {
-			Interval I = (Interval) intervals.get(i);
+			Interval I = intervals.get(i);
 			int a = I.a;
 			int b = I.b;
 			if ( el<a ) {
@@ -498,14 +508,16 @@
     }
 
     /** return true if this set has no members */
+	@Override
     public boolean isNil() {
-        return intervals==null || intervals.size()==0;
+        return intervals==null || intervals.isEmpty();
     }
 
     /** If this set is a single integer, return it otherwise Label.INVALID */
+	@Override
     public int getSingleElement() {
         if ( intervals!=null && intervals.size()==1 ) {
-            Interval I = (Interval)intervals.get(0);
+            Interval I = intervals.get(0);
             if ( I.a == I.b ) {
                 return I.a;
             }
@@ -517,18 +529,18 @@
 		if ( isNil() ) {
 			return Label.INVALID;
 		}
-		Interval last = (Interval)intervals.get(intervals.size()-1);
+		Interval last = intervals.get(intervals.size()-1);
 		return last.b;
 	}
 
-	/** Return minimum element >= 0 */
+	/** Return minimum element &gt;= 0 */
 	public int getMinElement() {
 		if ( isNil() ) {
 			return Label.INVALID;
 		}
 		int n = intervals.size();
 		for (int i = 0; i < n; i++) {
-			Interval I = (Interval) intervals.get(i);
+			Interval I = intervals.get(i);
 			int a = I.a;
 			int b = I.b;
 			for (int v=a; v<=b; v++) {
@@ -548,29 +560,32 @@
      *  to make sure they are the same.  Interval.equals() is used
      *  by the List.equals() method to check the ranges.
      */
+	@Override
     public boolean equals(Object obj) {
-        if ( obj==null || !(obj instanceof IntervalSet) ) {
+        if ( !(obj instanceof IntervalSet) ) {
             return false;
         }
         IntervalSet other = (IntervalSet)obj;
         return this.intervals.equals(other.intervals);
     }
 
+	@Override
     public String toString() {
         return toString(null);
     }
 
+	@Override
     public String toString(Grammar g) {
-        StringBuffer buf = new StringBuffer();
-		if ( this.intervals==null || this.intervals.size()==0 ) {
+        StringBuilder buf = new StringBuilder();
+		if ( this.intervals==null || this.intervals.isEmpty() ) {
 			return "{}";
 		}
         if ( this.intervals.size()>1 ) {
             buf.append("{");
         }
-        Iterator iter = this.intervals.iterator();
+        Iterator<Interval> iter = this.intervals.iterator();
         while (iter.hasNext()) {
-            Interval I = (Interval) iter.next();
+            Interval I = iter.next();
             int a = I.a;
             int b = I.b;
             if ( a==b ) {
@@ -583,10 +598,10 @@
             }
             else {
                 if ( g!=null ) {
-                    buf.append(g.getTokenDisplayName(a)+".."+g.getTokenDisplayName(b));
+                    buf.append(g.getTokenDisplayName(a)).append("..").append(g.getTokenDisplayName(b));
                 }
                 else {
-                    buf.append(a+".."+b);
+                    buf.append(a).append("..").append(b);
                 }
             }
             if ( iter.hasNext() ) {
@@ -599,6 +614,7 @@
         return buf.toString();
     }
 
+	@Override
     public int size() {
 		int n = 0;
 		int numIntervals = intervals.size();
@@ -607,17 +623,18 @@
 			return firstInterval.b-firstInterval.a+1;
 		}
 		for (int i = 0; i < numIntervals; i++) {
-			Interval I = (Interval) intervals.get(i);
+			Interval I = intervals.get(i);
 			n += (I.b-I.a+1);
 		}
 		return n;
     }
 
-    public List toList() {
-		List values = new ArrayList();
+	@Override
+    public List<Integer> toList() {
+		List<Integer> values = new ArrayList<Integer>();
 		int n = intervals.size();
 		for (int i = 0; i < n; i++) {
-			Interval I = (Interval) intervals.get(i);
+			Interval I = intervals.get(i);
 			int a = I.a;
 			int b = I.b;
 			for (int v=a; v<=b; v++) {
@@ -635,7 +652,7 @@
 		int n = intervals.size();
 		int index = 0;
 		for (int j = 0; j < n; j++) {
-			Interval I = (Interval) intervals.get(j);
+			Interval I = intervals.get(j);
 			int a = I.a;
 			int b = I.b;
 			for (int v=a; v<=b; v++) {
@@ -653,7 +670,7 @@
 		int n = intervals.size();
 		int j = 0;
 		for (int i = 0; i < n; i++) {
-			Interval I = (Interval) intervals.get(i);
+			Interval I = intervals.get(i);
 			int a = I.a;
 			int b = I.b;
 			for (int v=a; v<=b; v++) {
@@ -669,7 +686,7 @@
 			new org.antlr.runtime.BitSet(getMaxElement()+1);
 		int n = intervals.size();
 		for (int i = 0; i < n; i++) {
-			Interval I = (Interval) intervals.get(i);
+			Interval I = intervals.get(i);
 			int a = I.a;
 			int b = I.b;
 			for (int v=a; v<=b; v++) {
@@ -679,6 +696,7 @@
 		return s;
 	}
 
+	@Override
 	public void remove(int el) {
         throw new NoSuchMethodError("IntervalSet.remove() unimplemented");
     }
diff --git a/tool/src/main/java/org/antlr/misc/OrderedHashSet.java b/tool/src/main/java/org/antlr/misc/OrderedHashSet.java
index fa5e859..1dbe93f 100644
--- a/tool/src/main/java/org/antlr/misc/OrderedHashSet.java
+++ b/tool/src/main/java/org/antlr/misc/OrderedHashSet.java
@@ -37,7 +37,7 @@
  *  I need the replace/set-element-i functionality so I'm subclassing
  *  OrderedHashSet.
  */
-public class OrderedHashSet<T> extends LinkedHashSet {
+public class OrderedHashSet<T> extends LinkedHashSet<T> {
     /** Track the elements as they are added to the set */
     protected List<T> elements = new ArrayList<T>();
 
@@ -60,14 +60,16 @@
      *  Key is object itself.  Good for say asking if a certain string is in
      *  a list of strings.
      */
-    public boolean add(Object value) {
+	@Override
+    public boolean add(T value) {
         boolean result = super.add(value);
 		if ( result ) {  // only track if new element not in set
-			elements.add((T)value);
+			elements.add(value);
 		}
 		return result;
     }
 
+	@Override
     public boolean remove(Object o) {
 		throw new UnsupportedOperationException();
 		/*
@@ -76,6 +78,7 @@
         */
     }
 
+	@Override
     public void clear() {
         elements.clear();
         super.clear();
@@ -88,14 +91,17 @@
         return elements;
     }
 
+	@Override
 	public Iterator<T> iterator() {
 		return elements.iterator();
 	}
 
+	@Override
 	public Object[] toArray() {
 		return elements.toArray();
 	}
-	
+
+	@Override
     public int size() {
 		/*
 		if ( elements.size()!=super.size() ) {
@@ -106,6 +112,7 @@
         return elements.size();
     }
 
+	@Override
     public String toString() {
         return elements.toString();
     }
diff --git a/tool/src/main/java/org/antlr/misc/Utils.java b/tool/src/main/java/org/antlr/misc/Utils.java
index ca156d5..1e3939d 100644
--- a/tool/src/main/java/org/antlr/misc/Utils.java
+++ b/tool/src/main/java/org/antlr/misc/Utils.java
@@ -27,9 +27,6 @@
  */
 package org.antlr.misc;
 
-import java.util.HashMap;
-import java.util.Map;
-
 public class Utils {
 	public static final int INTEGER_POOL_MAX_VALUE = 1000;
 	static Integer[] ints = new Integer[INTEGER_POOL_MAX_VALUE+1];
@@ -41,10 +38,10 @@
 	 */
 	public static Integer integer(int x) {
 		if ( x<0 || x>INTEGER_POOL_MAX_VALUE ) {
-			return new Integer(x);
+			return x;
 		}
 		if ( ints[x]==null ) {
-			ints[x] = new Integer(x);
+			ints[x] = x;
 		}
 		return ints[x];
 	}
@@ -59,7 +56,7 @@
 		uses regex (I only want to play with strings anyway).
 	*/
 	public static String replace(String src, String replacee, String replacer) {
-		StringBuffer result = new StringBuffer(src.length() + 50);
+		StringBuilder result = new StringBuilder(src.length() + 50);
 		int startIndex = 0;
 		int endIndex = src.indexOf(replacee);
 		while(endIndex != -1) {
diff --git a/tool/src/main/java/org/antlr/tool/AssignTokenTypesBehavior.java b/tool/src/main/java/org/antlr/tool/AssignTokenTypesBehavior.java
index fba4f0e..cc7c0f4 100644
--- a/tool/src/main/java/org/antlr/tool/AssignTokenTypesBehavior.java
+++ b/tool/src/main/java/org/antlr/tool/AssignTokenTypesBehavior.java
@@ -30,7 +30,6 @@
 import org.antlr.analysis.Label;
 import org.antlr.grammar.v3.AssignTokenTypesWalker;
 import org.antlr.misc.Utils;
-import org.antlr.runtime.tree.TreeNodeStream;
 
 import java.util.*;
 
@@ -47,7 +46,7 @@
 	/** Track actual lexer rule defs so we don't get repeated token defs in
 	 *  generated lexer.
 	 */
-	protected Set<String> tokenRuleDefs = new HashSet();
+	protected Set<String> tokenRuleDefs = new HashSet<String>();
 
 	public AssignTokenTypesBehavior() {
 		super(null);
@@ -247,17 +246,16 @@
     @Override
 	protected void assignStringTypes(Grammar root) {
 		// walk string literals assigning types to unassigned ones
-		Set s = stringLiterals.keySet();
-		for (Iterator it = s.iterator(); it.hasNext();) {
-			String lit = (String) it.next();
-			Integer oldTypeI = (Integer)stringLiterals.get(lit);
-			int oldType = oldTypeI.intValue();
+		for (Map.Entry<String, Integer> entry : stringLiterals.entrySet()) {
+			String lit = entry.getKey();
+			Integer oldTypeI = entry.getValue();
+			int oldType = oldTypeI;
 			if ( oldType<Label.MIN_TOKEN_TYPE ) {
 				Integer typeI = Utils.integer(root.getNewTokenType());
 				stringLiterals.put(lit, typeI);
 				// if string referenced in combined grammar parser rule,
 				// automatically define in the generated lexer
-				root.defineLexerRuleForStringLiteral(lit, typeI.intValue());
+				root.defineLexerRuleForStringLiteral(lit, typeI);
 			}
 		}
 	}
@@ -269,16 +267,15 @@
 		}
 		// walk aliases if any and assign types to aliased literals if literal
 		// was referenced
-		Set s = aliases.keySet();
-		for (Iterator it = s.iterator(); it.hasNext();) {
-			String tokenID = (String) it.next();
-			String literal = (String)aliases.get(tokenID);
+		for (Map.Entry<String, String> entry : aliases.entrySet()) {
+			String tokenID = entry.getKey();
+			String literal = entry.getValue();
 			if ( literal.charAt(0)=='\'' && stringLiterals.get(literal)!=null ) {
 				stringLiterals.put(literal, tokens.get(tokenID));
 				// an alias still means you need a lexer rule for it
-				Integer typeI = (Integer)tokens.get(tokenID);
+				Integer typeI = tokens.get(tokenID);
 				if ( !tokenRuleDefs.contains(tokenID) ) {
-					root.defineLexerRuleForAliasedStringLiteral(tokenID, literal, typeI.intValue());
+					root.defineLexerRuleForAliasedStringLiteral(tokenID, literal, typeI);
 				}
 			}
 		}
@@ -287,10 +284,9 @@
     @Override
 	protected void assignTokenIDTypes(Grammar root) {
 		// walk token names, assigning values if unassigned
-		Set s = tokens.keySet();
-		for (Iterator it = s.iterator(); it.hasNext();) {
-			String tokenID = (String) it.next();
-			if ( tokens.get(tokenID)==UNASSIGNED ) {
+		for (Map.Entry<String, Integer> entry : tokens.entrySet()) {
+			String tokenID = entry.getKey();
+			if ( entry.getValue()==UNASSIGNED ) {
 				tokens.put(tokenID, Utils.integer(root.getNewTokenType()));
 			}
 		}
@@ -298,16 +294,13 @@
 
     @Override
 	protected void defineTokenNamesAndLiteralsInGrammar(Grammar root) {
-		Set s = tokens.keySet();
-		for (Iterator it = s.iterator(); it.hasNext();) {
-			String tokenID = (String) it.next();
-			int ttype = ((Integer)tokens.get(tokenID)).intValue();
-			root.defineToken(tokenID, ttype);
+		for (Map.Entry<String, Integer> entry : tokens.entrySet()) {
+			int ttype = entry.getValue();
+			root.defineToken(entry.getKey(), ttype);
 		}
-		s = stringLiterals.keySet();
-		for (Iterator it = s.iterator(); it.hasNext();) {
-			String lit = (String) it.next();
-			int ttype = ((Integer)stringLiterals.get(lit)).intValue();
+		for (Map.Entry<String, Integer> entry : stringLiterals.entrySet()) {
+			String lit = entry.getKey();
+			int ttype = entry.getValue();
 			root.defineToken(lit, ttype);
 		}
 	}
diff --git a/tool/src/main/java/org/antlr/tool/Attribute.java b/tool/src/main/java/org/antlr/tool/Attribute.java
index 9834ec8..f0432fa 100644
--- a/tool/src/main/java/org/antlr/tool/Attribute.java
+++ b/tool/src/main/java/org/antlr/tool/Attribute.java
@@ -124,6 +124,7 @@
 		this.decl = decl;
 	}
 
+	@Override
 	public String toString() {
 		if ( initValue!=null ) {
 			return type+" "+name+"="+initValue;
diff --git a/tool/src/main/java/org/antlr/tool/AttributeScope.java b/tool/src/main/java/org/antlr/tool/AttributeScope.java
index c2641da..ba7c69b 100644
--- a/tool/src/main/java/org/antlr/tool/AttributeScope.java
+++ b/tool/src/main/java/org/antlr/tool/AttributeScope.java
@@ -45,7 +45,8 @@
 	 *  of predefined attributes.  I keep this out of the runtime.Token
 	 *  object to avoid a runtime space burden.
 	 */
-	public static AttributeScope tokenScope = new AttributeScope("Token",null);
+	public static final AttributeScope tokenScope = new AttributeScope("Token",null);
+
 	static {
 		tokenScope.addAttribute("text", null);
 		tokenScope.addAttribute("type", null);
@@ -80,10 +81,10 @@
 	public boolean isPredefinedLexerRuleScope;
 
 	/** The list of Attribute objects */
-	protected LinkedHashMap<String,Attribute> attributes = new LinkedHashMap();
+	protected LinkedHashMap<String,Attribute> attributes = new LinkedHashMap<String, Attribute>();
 
 	/* Placeholder for compatibility with the CSharp3 target. */
-	public LinkedHashMap<String, GrammarAST> actions = new LinkedHashMap();
+	public LinkedHashMap<String, GrammarAST> actions = new LinkedHashMap<String, GrammarAST>();
 
 	public AttributeScope(String name, Token derivedFromToken) {
 		this(null,name,derivedFromToken);
@@ -156,7 +157,7 @@
 	}
 
 	public Attribute getAttribute(String name) {
-		return (Attribute)attributes.get(name);
+		return attributes.get(name);
 	}
 
 	/** Used by templates to get all attributes */
@@ -169,19 +170,18 @@
 	/** Return the set of keys that collide from
 	 *  this and other.
 	 */
-	public Set intersection(AttributeScope other) {
+	public Set<String> intersection(AttributeScope other) {
 		if ( other==null || other.size()==0 || size()==0 ) {
 			return null;
 		}
-		Set inter = new HashSet();
-		Set thisKeys = attributes.keySet();
-		for (Iterator it = thisKeys.iterator(); it.hasNext();) {
-			String key = (String) it.next();
+		Set<String> inter = new HashSet<String>();
+		Set<String> thisKeys = attributes.keySet();
+		for (String key : thisKeys) {
 			if ( other.attributes.get(key)!=null ) {
 				inter.add(key);
 			}
 		}
-		if ( inter.size()==0 ) {
+		if ( inter.isEmpty() ) {
 			return null;
 		}
 		return inter;
@@ -191,6 +191,7 @@
 		return attributes==null?0:attributes.size();
 	}
 
+	@Override
 	public String toString() {
 		return (isDynamicGlobalScope?"global ":"")+getName()+":"+attributes;
 	}
diff --git a/tool/src/main/java/org/antlr/tool/BuildDependencyGenerator.java b/tool/src/main/java/org/antlr/tool/BuildDependencyGenerator.java
index 844046e..77dee7e 100644
--- a/tool/src/main/java/org/antlr/tool/BuildDependencyGenerator.java
+++ b/tool/src/main/java/org/antlr/tool/BuildDependencyGenerator.java
@@ -32,7 +32,6 @@
 import org.antlr.misc.Utils;
 import org.stringtemplate.v4.ST;
 import org.stringtemplate.v4.STGroup;
-import org.stringtemplate.v4.STGroupFile;
 
 import java.io.*;
 import java.util.ArrayList;
@@ -99,7 +98,7 @@
         List<File> files = new ArrayList<File>();
         File outputDir = tool.getOutputDirectory(grammarFileName);
         if (outputDir.getName().equals(".")) {
-            outputDir = null;
+            outputDir = outputDir.getParentFile();
         } else if (outputDir.getName().indexOf(' ') >= 0) { // has spaces?
             String escSpaces = Utils.replace(outputDir.toString(),
                     " ",
@@ -148,7 +147,7 @@
             files.add(new File(fname));
         }
 
-        if (files.size() == 0) {
+        if (files.isEmpty()) {
             return null;
         }
         return files;
@@ -172,7 +171,7 @@
             files.add(new File(fileName));
         }
 
-        if (files.size() == 0) {
+        if (files.isEmpty()) {
             return null;
         }
         return files;
@@ -211,7 +210,7 @@
     public void loadDependencyTemplates() {
         if (templates != null) return;
         String fileName = "org/antlr/tool/templates/depend.stg";
-        templates = new STGroupFile(fileName);
+        templates = new ToolSTGroupFile(fileName);
     }
 
     public String getTokenVocab() {
diff --git a/tool/src/main/java/org/antlr/tool/CompositeGrammar.java b/tool/src/main/java/org/antlr/tool/CompositeGrammar.java
index b9ef82f..9f1863e 100644
--- a/tool/src/main/java/org/antlr/tool/CompositeGrammar.java
+++ b/tool/src/main/java/org/antlr/tool/CompositeGrammar.java
@@ -34,7 +34,14 @@
 import org.antlr.runtime.RecognitionException;
 import org.antlr.runtime.tree.CommonTreeNodeStream;
 
-import java.util.*;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.Vector;
 
 /** A tree of component (delegate) grammars.
  *
@@ -81,7 +88,7 @@
 	protected int maxTokenType = Label.MIN_TOKEN_TYPE-1;
 
 	/** Map token like ID (but not literals like "while") to its token type */
-	public Map tokenIDToTypeMap = new LinkedHashMap();
+	public Map<String, Integer> tokenIDToTypeMap = new LinkedHashMap<String, Integer>();
 
 	/** Map token literals like "while" to its token type.  It may be that
 	 *  WHILE="while"=35, in which case both tokenIDToTypeMap and this
@@ -140,10 +147,12 @@
 		tokenIDToTypeMap.put("UP", Utils.integer(Label.UP));
 	}
 
+	@SuppressWarnings("OverridableMethodCallInConstructor")
 	public CompositeGrammar() {
 		initTokenSymbolTables();
 	}
 
+	@SuppressWarnings("OverridableMethodCallInConstructor")
 	public CompositeGrammar(Grammar g) {
 		this();
 		setDelegationRoot(g);
@@ -209,9 +218,9 @@
 		if ( children==null ) {
 			return null;
 		}
-		List<Grammar> grammars = new ArrayList();
+		List<Grammar> grammars = new ArrayList<Grammar>();
 		for (int i = 0; children!=null && i < children.size(); i++) {
-			CompositeGrammarTree child = (CompositeGrammarTree) children.get(i);
+			CompositeGrammarTree child = children.get(i);
 			grammars.add(child.grammar);
 		}
 		return grammars;
@@ -221,7 +230,9 @@
 	public List<Grammar> getIndirectDelegates(Grammar g) {
 		List<Grammar> direct = getDirectDelegates(g);
 		List<Grammar> delegates = getDelegates(g);
-		delegates.removeAll(direct);
+		if ( direct!=null ) {
+			delegates.removeAll(direct);
+		}
 		return delegates;
 	}
 
@@ -232,7 +243,7 @@
 		if ( g==delegateGrammarTreeRoot.grammar ) {
 			return null;
 		}
-		List<Grammar> grammars = new ArrayList();
+		List<Grammar> grammars = new ArrayList<Grammar>();
 		CompositeGrammarTree t = delegateGrammarTreeRoot.findNode(g);
 		// walk backwards to root, collecting grammars
 		CompositeGrammarTree p = t.parent;
@@ -252,13 +263,13 @@
 	 *  should not be instantiated directly for use as parsers (you can create
 	 *  them to pass to the root parser's ctor as arguments).
 	 */
-	public Set<Rule> getDelegatedRules(Grammar g) {
+	public Set<? extends Rule> getDelegatedRules(Grammar g) {
 		if ( g!=delegateGrammarTreeRoot.grammar ) {
 			return null;
 		}
-		Set<Rule> rules = getAllImportedRules(g);
-		for (Iterator it = rules.iterator(); it.hasNext();) {
-			Rule r = (Rule) it.next();
+		Set<? extends Rule> rules = getAllImportedRules(g);
+		for (Iterator<? extends Rule> it = rules.iterator(); it.hasNext();) {
+			Rule r = it.next();
 			Rule localRule = g.getLocallyDefinedRule(r.name);
 			// if locally defined or it's not local but synpred, don't make
 			// a delegation method
@@ -272,19 +283,18 @@
 	/** Get all rule definitions from all direct/indirect delegate grammars
 	 *  of g.
 	 */
-	public Set<Rule> getAllImportedRules(Grammar g) {
-		Set<String> ruleNames = new HashSet();
-		Set<Rule> rules = new HashSet();
+	public Set<? extends Rule> getAllImportedRules(Grammar g) {
+		Set<String> ruleNames = new HashSet<String>();
+		Set<Rule> rules = new HashSet<Rule>();
 		CompositeGrammarTree subtreeRoot = delegateGrammarTreeRoot.findNode(g);
 
 		List<Grammar> grammars = subtreeRoot.getPreOrderedGrammarList();
 		// walk all grammars preorder, priority given to grammar listed first.
 		for (int i = 0; i < grammars.size(); i++) {
-			Grammar delegate = (org.antlr.tool.Grammar) grammars.get(i);
+			Grammar delegate = grammars.get(i);
 			// for each rule in delegate, add to rules if no rule with that
 			// name as been seen.  (can't use removeAll; wrong hashcode/equals on Rule)
-			for (Iterator it = delegate.getRules().iterator(); it.hasNext();) {
-				Rule r = (Rule)it.next();
+			for (Rule r : delegate.getRules()) {
 				if ( !ruleNames.contains(r.name) ) {
 					ruleNames.add(r.name); // track that we've seen this
 					rules.add(r);
@@ -321,7 +331,7 @@
 	}
 
 	public NFAState getState(int s) {
-		return (NFAState)numberToStateList.get(s);
+		return numberToStateList.get(s);
 	}
 
 	public void assignTokenTypes() throws RecognitionException {
@@ -330,7 +340,7 @@
 		AssignTokenTypesWalker ttypesWalker = new AssignTokenTypesBehavior();
 		List<Grammar> grammars = delegateGrammarTreeRoot.getPostOrderedGrammarList();
 		for (int i = 0; grammars!=null && i < grammars.size(); i++) {
-			Grammar g = (Grammar)grammars.get(i);
+			Grammar g = grammars.get(i);
 			ttypesWalker.setTreeNodeStream(new CommonTreeNodeStream(g.getGrammarTree()));
 			try {
 				//System.out.println("    walking "+g.name);
@@ -382,11 +392,11 @@
 		List<Grammar> grammars = delegateGrammarTreeRoot.getPostOrderedGrammarList();
 		//System.out.println("### createNFAs for composite; grammars: "+names);
 		for (int i = 0; grammars!=null && i < grammars.size(); i++) {
-			Grammar g = (Grammar)grammars.get(i);
+			Grammar g = grammars.get(i);
 			g.createRuleStartAndStopNFAStates();
 		}
 		for (int i = 0; grammars!=null && i < grammars.size(); i++) {
-			Grammar g = (Grammar)grammars.get(i);
+			Grammar g = grammars.get(i);
 			g.buildNFA();
 		}
 	}
diff --git a/tool/src/main/java/org/antlr/tool/DOTGenerator.java b/tool/src/main/java/org/antlr/tool/DOTGenerator.java
index 4e906a3..f0180c4 100644
--- a/tool/src/main/java/org/antlr/tool/DOTGenerator.java
+++ b/tool/src/main/java/org/antlr/tool/DOTGenerator.java
@@ -33,7 +33,7 @@
 import org.antlr.misc.Utils;
 import org.stringtemplate.v4.ST;
 import org.stringtemplate.v4.STGroup;
-import org.stringtemplate.v4.STGroupDir;
+import org.stringtemplate.v4.STGroupFile;
 
 import java.util.*;
 
@@ -44,14 +44,14 @@
 	protected String arrowhead="normal";
 	protected String rankdir="LR";
 
-	/** Library of output templates; use <attrname> format */
-    public static STGroup stlib = new STGroupDir("org/antlr/tool/templates/dot/dfa");
+	/** Library of output templates; use {@code <attrname>} format */
+    public static STGroup stlib = new STGroupFile("org/antlr/tool/templates/dot/dot.stg");
 
     /** To prevent infinite recursion when walking state machines, record
      *  which states we've visited.  Make a new set every time you start
      *  walking in case you reuse this object.
      */
-    protected Set markedStates = null;
+    protected Set<Object> markedStates = null;
 
     protected Grammar grammar;
 
@@ -69,14 +69,14 @@
 			return null;
 		}
 		// The output DOT graph for visualization
-		ST dot = null;
-		markedStates = new HashSet();
+		ST dot;
+		markedStates = new HashSet<Object>();
         if ( startState instanceof DFAState ) {
             dot = stlib.getInstanceOf("dfa");
 			dot.add("startState",
 					Utils.integer(startState.stateNumber));
 			dot.add("useBox",
-					Boolean.valueOf(Tool.internalOption_ShowNFAConfigsInDFA));
+					Tool.internalOption_ShowNFAConfigsInDFA);
 			walkCreatingDFADOT(dot, (DFAState)startState);
         }
         else {
@@ -86,7 +86,7 @@
 			walkRuleNFACreatingDOT(dot, startState);
         }
 		dot.add("rankdir", rankdir);
-        return dot.toString();
+        return dot.render();
     }
 
     /** Return a String containing a DOT description that, when displayed,
@@ -130,7 +130,7 @@
 
         // make a DOT edge for each transition
 		for (int i = 0; i < s.getNumberOfTransitions(); i++) {
-			Transition edge = (Transition) s.transition(i);
+			Transition edge = s.transition(i);
 			/*
 			System.out.println("dfa "+s.dfa.decisionNumber+
 				" edge from s"+s.stateNumber+" ["+i+"] of "+s.getNumberOfTransitions());
@@ -203,9 +203,9 @@
 		}
 
         // make a DOT edge for each transition
-		ST edgeST = null;
+		ST edgeST;
 		for (int i = 0; i < s.getNumberOfTransitions(); i++) {
-            Transition edge = (Transition) s.transition(i);
+            Transition edge = s.transition(i);
             if ( edge instanceof RuleClosureTransition ) {
                 RuleClosureTransition rr = ((RuleClosureTransition)edge);
                 // don't jump to other rules, but display edge to follow node
@@ -296,10 +296,10 @@
 			SemanticContext preds =
 				((DFAState)target).getGatedPredicatesInNFAConfigurations();
 			if ( preds!=null ) {
-				String predsStr = "";
+				String predsStr;
 				predsStr = "&&{"+
 					preds.genExpr(grammar.generator,
-								  grammar.generator.getTemplates(), null).toString()
+								  grammar.generator.getTemplates(), null).render()
 					+"}?";
 				label += predsStr;
 			}
@@ -313,7 +313,7 @@
         }
         String stateLabel = String.valueOf(s.stateNumber);
 		if ( s instanceof DFAState ) {
-            StringBuffer buf = new StringBuffer(250);
+            StringBuilder buf = new StringBuilder(250);
 			buf.append('s');
 			buf.append(s.stateNumber);
 			if ( Tool.internalOption_ShowNFAConfigsInDFA ) {
@@ -323,17 +323,17 @@
 						buf.append("abortedDueToRecursionOverflow");
 					}
 				}
-				Set alts = ((DFAState)s).getAltSet();
+				Set<Integer> alts = ((DFAState)s).getAltSet();
 				if ( alts!=null ) {
 					buf.append("\\n");
 					// separate alts
-					List altList = new ArrayList();
+					List<Integer> altList = new ArrayList<Integer>();
 					altList.addAll(alts);
 					Collections.sort(altList);
-					Set configurations = ((DFAState) s).nfaConfigurations;
+					Set<NFAConfiguration> configurations = ((DFAState) s).nfaConfigurations;
 					for (int altIndex = 0; altIndex < altList.size(); altIndex++) {
-						Integer altI = (Integer) altList.get(altIndex);
-						int alt = altI.intValue();
+						Integer altI = altList.get(altIndex);
+						int alt = altI;
 						if ( altIndex>0 ) {
 							buf.append("\\n");
 						}
@@ -342,16 +342,14 @@
 						buf.append(':');
 						// get a list of configs for just this alt
 						// it will help us print better later
-						List configsInAlt = new ArrayList();
-						for (Iterator it = configurations.iterator(); it.hasNext();) {
-							NFAConfiguration c = (NFAConfiguration) it.next();
+						List<NFAConfiguration> configsInAlt = new ArrayList<NFAConfiguration>();
+						for (NFAConfiguration c : configurations) {
 							if ( c.alt!=alt ) continue;
 							configsInAlt.add(c);
 						}
 						int n = 0;
 						for (int cIndex = 0; cIndex < configsInAlt.size(); cIndex++) {
-							NFAConfiguration c =
-								(NFAConfiguration)configsInAlt.get(cIndex);
+							NFAConfiguration c = configsInAlt.get(cIndex);
 							n++;
 							buf.append(c.toString(false));
 							if ( (cIndex+1)<configsInAlt.size() ) {
diff --git a/tool/src/main/java/org/antlr/tool/ErrorManager.java b/tool/src/main/java/org/antlr/tool/ErrorManager.java
index 7baaf68..82e69e8 100644
--- a/tool/src/main/java/org/antlr/tool/ErrorManager.java
+++ b/tool/src/main/java/org/antlr/tool/ErrorManager.java
@@ -30,6 +30,7 @@
 import org.antlr.Tool;
 import org.antlr.analysis.DFAState;
 import org.antlr.analysis.DecisionProbe;
+import org.antlr.analysis.NFAState;
 import org.antlr.misc.BitSet;
 import org.antlr.runtime.RecognitionException;
 import org.antlr.runtime.Token;
@@ -39,13 +40,15 @@
 import org.stringtemplate.v4.STGroupFile;
 import org.stringtemplate.v4.misc.STMessage;
 
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
 import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.util.*;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+import java.util.WeakHashMap;
 
 /** Defines all the errors ANTLR can generator for both the tool and for
  *  issues with a grammar.
@@ -115,6 +118,7 @@
 	public static final int MSG_CODE_GEN_TEMPLATES_INCOMPLETE = 22;
 	public static final int MSG_CANNOT_CREATE_TARGET_GENERATOR = 23;
 	//public static final int MSG_CANNOT_COMPUTE_SAMPLE_INPUT_SEQ = 24;
+	public static final int MSG_STRING_TEMPLATE_ERROR = 24;
 
 	// GRAMMAR ERRORS
 	public static final int MSG_SYNTAX_ERROR = 100;
@@ -185,6 +189,7 @@
     public static final int MSG_CONFLICTING_OPTION_IN_TREE_FILTER = 167;
 	public static final int MSG_ILLEGAL_OPTION_VALUE = 168;
 	public static final int MSG_ALL_OPS_NEED_SAME_ASSOC = 169;
+	public static final int MSG_RANGE_OP_ILLEGAL = 170;
 
 	// GRAMMAR WARNINGS
 	public static final int MSG_GRAMMAR_NONDETERMINISM = 200; // A predicts alts 1,2
@@ -239,12 +244,12 @@
 	};
 
 	/** Only one error can be emitted for any entry in this table.
-	 *  Map<String,Set> where the key is a method name like danglingState.
+	 *  Map&lt;String,Set&gt; where the key is a method name like danglingState.
 	 *  The set is whatever that method accepts or derives like a DFA.
 	 */
-	public static final Map emitSingleError = new HashMap() {
+	public static final Map<String, Set<String>> emitSingleError = new HashMap<String, Set<String>>() {
 		{
-			put("danglingState", new HashSet());
+			put("danglingState", new HashSet<String>());
 		}
 	};
 
@@ -255,9 +260,9 @@
 	/** Each thread might need it's own error listener; e.g., a GUI with
 	 *  multiple window frames holding multiple grammars.
 	 */
-	private static Map threadToListenerMap = new HashMap();
+	private static final Map<Thread, ANTLRErrorListener> threadToListenerMap = new WeakHashMap<Thread, ANTLRErrorListener>();
 
-	static class ErrorState {
+	public static class ErrorState {
 		public int errors;
 		public int warnings;
 		public int infos;
@@ -273,13 +278,13 @@
 	/** Track the number of errors regardless of the listener but track
 	 *  per thread.
 	 */
-	private static Map threadToErrorStateMap = new HashMap();
+	private static final Map<Thread, ErrorState> threadToErrorStateMap = new WeakHashMap<Thread, ErrorState>();
 
 	/** Each thread has its own ptr to a Tool object, which knows how
 	 *  to panic, for example.  In a GUI, the thread might just throw an Error
 	 *  to exit rather than the suicide System.exit.
 	 */
-	private static Map threadToToolMap = new HashMap();
+	private static final Map<Thread, Tool> threadToToolMap = new WeakHashMap<Thread, Tool>();
 
 	/** The group of templates that represent all possible ANTLR errors. */
 	private static STGroup messages;
@@ -289,9 +294,10 @@
 	/** From a msgID how can I get the name of the template that describes
 	 *  the error or warning?
 	 */
-	private static String[] idToMessageTemplateName = new String[MAX_MESSAGE_NUMBER+1];
+	private static final String[] idToMessageTemplateName = new String[MAX_MESSAGE_NUMBER+1];
 
 	static ANTLRErrorListener theDefaultErrorListener = new ANTLRErrorListener() {
+		@Override
 		public void info(String msg) {
 			if (formatWantsSingleLineMessage()) {
 				msg = msg.replaceAll("\n", " ");
@@ -299,6 +305,7 @@
 			System.err.println(msg);
 		}
 
+		@Override
 		public void error(Message msg) {
 			String outputMsg = msg.toString();
 			if (formatWantsSingleLineMessage()) {
@@ -307,6 +314,7 @@
 			System.err.println(outputMsg);
 		}
 
+		@Override
 		public void warning(Message msg) {
 			String outputMsg = msg.toString();
 			if (formatWantsSingleLineMessage()) {
@@ -315,6 +323,7 @@
 			System.err.println(outputMsg);
 		}
 
+		@Override
 		public void error(ToolMessage msg) {
 			String outputMsg = msg.toString();
 			if (formatWantsSingleLineMessage()) {
@@ -329,18 +338,22 @@
 	 */
 	static STErrorListener initSTListener =
 		new STErrorListener() {
+			@Override
 			public void compileTimeError(STMessage msg) {
 				System.err.println("ErrorManager init error: "+msg);
 			}
 
+			@Override
 			public void runTimeError(STMessage msg) {
 				System.err.println("ErrorManager init error: "+msg);
 			}
 
+			@Override
 			public void IOError(STMessage msg) {
 				System.err.println("ErrorManager init error: "+msg);
 			}
 
+			@Override
 			public void internalError(STMessage msg) {
 				System.err.println("ErrorManager init error: "+msg);
 			}
@@ -353,30 +366,44 @@
 	 */
 	static STErrorListener blankSTListener =
 		new STErrorListener() {
-			public void compileTimeError(STMessage msg) {			}
-			public void runTimeError(STMessage msg) {			}
-			public void IOError(STMessage msg) {			}
-			public void internalError(STMessage msg) {			}
+			@Override public void compileTimeError(STMessage msg) {			}
+			@Override public void runTimeError(STMessage msg) {			}
+			@Override public void IOError(STMessage msg) {			}
+			@Override public void internalError(STMessage msg) {			}
 		};
 
 	/** Errors during initialization related to ST must all go to System.err.
 	 */
 	static STErrorListener theDefaultSTListener =
 		new STErrorListener() {
+			@Override
 			public void compileTimeError(STMessage msg) {
-				ErrorManager.error(ErrorManager.MSG_INTERNAL_ERROR, msg.toString(), msg.cause);
+				ErrorManager.error(ErrorManager.MSG_STRING_TEMPLATE_ERROR, msg.toString(), msg.cause);
 			}
 
+			@Override
 			public void runTimeError(STMessage msg) {
-				ErrorManager.error(ErrorManager.MSG_INTERNAL_ERROR, msg.toString(), msg.cause);
+				switch (msg.error) {
+				case NO_SUCH_ATTRIBUTE:
+				case NO_SUCH_ATTRIBUTE_PASS_THROUGH:
+				case NO_SUCH_PROPERTY:
+					ErrorManager.warning(ErrorManager.MSG_STRING_TEMPLATE_ERROR, msg.toString());
+					return;
+
+				default:
+					ErrorManager.error(ErrorManager.MSG_STRING_TEMPLATE_ERROR, msg.toString(), msg.cause);
+					return;
+				}
 			}
 
+			@Override
 			public void IOError(STMessage msg) {
-				ErrorManager.error(ErrorManager.MSG_INTERNAL_ERROR, msg.toString(), msg.cause);
+				ErrorManager.error(ErrorManager.MSG_STRING_TEMPLATE_ERROR, msg.toString(), msg.cause);
 			}
 
+			@Override
 			public void internalError(STMessage msg) {
-				ErrorManager.error(ErrorManager.MSG_INTERNAL_ERROR, msg.toString(), msg.cause);
+				ErrorManager.error(ErrorManager.MSG_STRING_TEMPLATE_ERROR, msg.toString(), msg.cause);
 			}
 		};
 
@@ -544,7 +571,7 @@
 
 	public static ANTLRErrorListener getErrorListener() {
 		ANTLRErrorListener el =
-			(ANTLRErrorListener)threadToListenerMap.get(Thread.currentThread());
+			threadToListenerMap.get(Thread.currentThread());
 		if ( el==null ) {
 			return theDefaultErrorListener;
 		}
@@ -553,7 +580,7 @@
 
 	public static ErrorState getErrorState() {
 		ErrorState ec =
-			(ErrorState)threadToErrorStateMap.get(Thread.currentThread());
+			threadToErrorStateMap.get(Thread.currentThread());
 		if ( ec==null ) {
 			ec = new ErrorState();
 			threadToErrorStateMap.put(Thread.currentThread(), ec);
@@ -566,7 +593,7 @@
 	}
 
 	public static void resetErrorState() {
-        threadToListenerMap = new HashMap();
+        threadToListenerMap.clear();
         ErrorState ec = new ErrorState();
 		threadToErrorStateMap.put(Thread.currentThread(), ec);
 	}
@@ -627,7 +654,7 @@
 		getErrorState().errors++;
 		Message msg = new GrammarDanglingStateMessage(probe,d);
 		getErrorState().errorMsgIDs.add(msg.msgID);
-		Set seen = (Set)emitSingleError.get("danglingState");
+		Set<String> seen = emitSingleError.get("danglingState");
 		if ( !seen.contains(d.dfa.decisionNumber+"|"+d.getAltSet()) ) {
 			getErrorListener().error(msg);
 			// we've seen this decision and this alt set; never again
@@ -644,7 +671,7 @@
 	}
 
 	public static void unreachableAlts(DecisionProbe probe,
-									   List alts)
+									   List<Integer> alts)
 	{
 		getErrorState().errors++;
 		Message msg = new GrammarUnreachableAltsMessage(probe,alts);
@@ -672,8 +699,8 @@
 	public static void recursionOverflow(DecisionProbe probe,
 										 DFAState sampleBadState,
 										 int alt,
-										 Collection targetRules,
-										 Collection callSiteStates)
+										 Collection<String> targetRules,
+										 Collection<? extends Collection<? extends NFAState>> callSiteStates)
 	{
 		getErrorState().errors++;
 		Message msg = new RecursionOverflowMessage(probe,sampleBadState, alt,
@@ -696,7 +723,7 @@
 	}
 	*/
 
-	public static void leftRecursionCycles(Collection cycles) {
+	public static void leftRecursionCycles(Collection<? extends Set<? extends Rule>> cycles) {
 		getErrorState().errors++;
 		Message msg = new LeftRecursionCyclesMessage(cycles);
 		getErrorState().errorMsgIDs.add(msg.msgID);
@@ -831,7 +858,7 @@
 			}
 			String templateName =
 				fieldName.substring("MSG_".length(),fieldName.length());
-			int msgID = 0;
+			int msgID;
 			try {
 				// get the constant value from this class object
 				msgID = f.getInt(ErrorManager.class);
@@ -912,7 +939,7 @@
 	 *  for GUIs etc...
 	 */
 	public static void panic() {
-		Tool tool = (Tool)threadToToolMap.get(Thread.currentThread());
+		Tool tool = threadToToolMap.get(Thread.currentThread());
 		if ( tool==null ) {
 			// no tool registered, exit
 			throw new Error("ANTLR ErrorManager panic");
diff --git a/tool/src/main/java/org/antlr/tool/FASerializer.java b/tool/src/main/java/org/antlr/tool/FASerializer.java
index 401bbb3..4e601d8 100644
--- a/tool/src/main/java/org/antlr/tool/FASerializer.java
+++ b/tool/src/main/java/org/antlr/tool/FASerializer.java
@@ -41,7 +41,7 @@
      *  walking in case you reuse this object.  Multiple threads will trash
      *  this shared variable.  Use a different FASerializer per thread.
      */
-    protected Set markedStates;
+    protected Set<State> markedStates;
 
     /** Each state we walk will get a new state number for serialization
      *  purposes.  This is the variable that tracks state numbers.
@@ -50,9 +50,9 @@
 
     /** Rather than add a new instance variable to NFA and DFA just for
      *  serializing machines, map old state numbers to new state numbers
-     *  by a State object -> Integer new state number HashMap.
+     *  by a State object &rarr; Integer new state number HashMap.
      */
-    protected Map stateNumberTranslator;
+    protected Map<State, Integer> stateNumberTranslator;
 
     protected Grammar grammar;
 
@@ -77,13 +77,13 @@
      *  states.
      */
     public String serialize(State s, boolean renumber) {
-        markedStates = new HashSet();
+        markedStates = new HashSet<State>();
         stateCounter = 0;
 		if ( renumber ) {
-			stateNumberTranslator = new HashMap();
+			stateNumberTranslator = new HashMap<State, Integer>();
         	walkFANormalizingStateNumbers(s);
 		}
-		List lines = new ArrayList();
+		List<String> lines = new ArrayList<String>();
         if ( s.getNumberOfTransitions()>0 ) {
 			walkSerializingFA(lines, s);
 		}
@@ -92,12 +92,12 @@
 			String s0 = getStateString(0, s);
 			lines.add(s0+"\n");
 		}
-        StringBuffer buf = new StringBuffer(0);
+        StringBuilder buf = new StringBuilder(0);
         // sort lines to normalize; makes states come out ordered
         // and then ordered by edge labels then by target state number :)
         Collections.sort(lines);
         for (int i = 0; i < lines.size(); i++) {
-            String line = (String) lines.get(i);
+            String line = lines.get(i);
             buf.append(line);
         }
         return buf.toString();
@@ -121,7 +121,7 @@
 
         // visit nodes pointed to by each transition;
         for (int i = 0; i < s.getNumberOfTransitions(); i++) {
-            Transition edge = (Transition) s.transition(i);
+            Transition edge = s.transition(i);
             walkFANormalizingStateNumbers(edge.target); // keep walkin'
             // if this transition is a rule reference, the node "following" this state
             // will not be found and appear to be not in graph.  Must explicitly jump
@@ -132,7 +132,7 @@
         }
     }
 
-    protected void walkSerializingFA(List lines, State s) {
+    protected void walkSerializingFA(List<String> lines, State s) {
         if ( markedStates.contains(s) ) {
             return; // already visited this node
         }
@@ -141,16 +141,16 @@
 
 		int normalizedStateNumber = s.stateNumber;
 		if ( stateNumberTranslator!=null ) {
-	        Integer normalizedStateNumberI = (Integer)stateNumberTranslator.get(s);
-			normalizedStateNumber = normalizedStateNumberI.intValue();
+	        Integer normalizedStateNumberI = stateNumberTranslator.get(s);
+			normalizedStateNumber = normalizedStateNumberI;
 		}
 
 		String stateStr = getStateString(normalizedStateNumber, s);
 
         // depth first walk each transition, printing its edge first
         for (int i = 0; i < s.getNumberOfTransitions(); i++) {
-            Transition edge = (Transition) s.transition(i);
-            StringBuffer buf = new StringBuffer();
+            Transition edge = s.transition(i);
+            StringBuilder buf = new StringBuilder();
             buf.append(stateStr);
 			if ( edge.isAction() ) {
 				buf.append("-{}->");
@@ -159,7 +159,7 @@
 				buf.append("->");
 			}
 			else if ( edge.isSemanticPredicate() ) {
-				buf.append("-{"+edge.label.getSemanticContext()+"}?->");
+				buf.append("-{").append(edge.label.getSemanticContext()).append("}?->");
 			}
 			else {
 				String predsStr = "";
@@ -174,14 +174,14 @@
 							+"}?";
 					}
 				}
-				buf.append("-"+edge.label.toString(grammar)+predsStr+"->");
+				buf.append("-").append(edge.label.toString(grammar)).append(predsStr).append("->");
 			}
 
 			int normalizedTargetStateNumber = edge.target.stateNumber;
 			if ( stateNumberTranslator!=null ) {
 				Integer normalizedTargetStateNumberI =
-					(Integer)stateNumberTranslator.get(edge.target);
-				normalizedTargetStateNumber = normalizedTargetStateNumberI.intValue();
+					stateNumberTranslator.get(edge.target);
+				normalizedTargetStateNumber = normalizedTargetStateNumberI;
 			}
 			buf.append(getStateString(normalizedTargetStateNumber, edge.target));
             buf.append("\n");
diff --git a/tool/src/main/java/org/antlr/tool/Grammar.java b/tool/src/main/java/org/antlr/tool/Grammar.java
index a88314d..667ebb2 100644
--- a/tool/src/main/java/org/antlr/tool/Grammar.java
+++ b/tool/src/main/java/org/antlr/tool/Grammar.java
@@ -28,21 +28,64 @@
 package org.antlr.tool;
 
 import org.antlr.Tool;
-import org.antlr.analysis.*;
 import org.antlr.analysis.DFA;
+import org.antlr.analysis.DFAState;
+import org.antlr.analysis.LL1Analyzer;
+import org.antlr.analysis.LL1DFA;
+import org.antlr.analysis.Label;
+import org.antlr.analysis.LookaheadSet;
+import org.antlr.analysis.NFA;
+import org.antlr.analysis.NFAConversionThread;
+import org.antlr.analysis.NFAState;
+import org.antlr.analysis.NFAToDFAConverter;
+import org.antlr.analysis.SemanticContext;
+import org.antlr.analysis.Transition;
 import org.antlr.codegen.CodeGenerator;
-import org.antlr.codegen.*;
-import org.antlr.grammar.v3.*;
-import org.antlr.misc.*;
+import org.antlr.codegen.Target;
+import org.antlr.grammar.v3.ANTLRLexer;
+import org.antlr.grammar.v3.ANTLRParser;
+import org.antlr.grammar.v3.ANTLRTreePrinter;
+import org.antlr.grammar.v3.ActionAnalysis;
+import org.antlr.grammar.v3.DefineGrammarItemsWalker;
+import org.antlr.grammar.v3.TreeToNFAConverter;
+import org.antlr.misc.Barrier;
+import org.antlr.misc.IntSet;
+import org.antlr.misc.IntervalSet;
+import org.antlr.misc.MultiMap;
+import org.antlr.misc.OrderedHashSet;
 import org.antlr.misc.Utils;
-import org.antlr.runtime.*;
+import org.antlr.runtime.ANTLRReaderStream;
+import org.antlr.runtime.ANTLRStringStream;
+import org.antlr.runtime.CommonToken;
+import org.antlr.runtime.CommonTokenStream;
+import org.antlr.runtime.RecognitionException;
+import org.antlr.runtime.Token;
 import org.antlr.runtime.tree.CommonTreeNodeStream;
 import org.stringtemplate.v4.ST;
 import org.stringtemplate.v4.STGroup;
 import org.stringtemplate.v4.STGroupString;
 
-import java.io.*;
-import java.util.*;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.io.Reader;
+import java.io.StreamTokenizer;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.BitSet;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.Vector;
 
 /** Represents a grammar in memory. */
 public class Grammar {
@@ -176,6 +219,7 @@
 		public Rule getReferencedRule() {
 			return getRule(referencedRuleName);
 		}
+		@Override
 		public String toString() {
 			return elementRef.toString();
 		}
@@ -193,10 +237,10 @@
 	 *  interpretation of the key/value pairs...they are simply available for
 	 *  who wants them.
 	 */
-	protected Map options;
+	protected Map<String, Object> options;
 
-	public static final Set legalLexerOptions =
-			new HashSet() {
+	public static final Set<String> legalLexerOptions =
+			new HashSet<String>() {
 				{
 				add("language"); add("tokenVocab");
 				add("TokenLabelType");
@@ -208,8 +252,8 @@
 				}
 			};
 
-	public static final Set legalParserOptions =
-			new HashSet() {
+	public static final Set<String> legalParserOptions =
+			new HashSet<String>() {
 				{
 				add("language"); add("tokenVocab");
 				add("output"); add("rewrite"); add("ASTLabelType");
@@ -221,8 +265,8 @@
 				}
 			};
 
-    public static final Set legalTreeParserOptions =
-        new HashSet() {
+    public static final Set<String> legalTreeParserOptions =
+        new HashSet<String>() {
             {
                 add("language"); add("tokenVocab");
                 add("output"); add("rewrite"); add("ASTLabelType");
@@ -235,36 +279,36 @@
             }
         };
 
-	public static final Set doNotCopyOptionsToLexer =
-		new HashSet() {
+	public static final Set<String> doNotCopyOptionsToLexer =
+		new HashSet<String>() {
 			{
 				add("output"); add("ASTLabelType"); add("superClass");
 				add("k"); add("backtrack"); add("memoize"); add("rewrite");
 			}
 		};
 
-	public static final Map defaultOptions =
-			new HashMap() {
+	public static final Map<String, String> defaultOptions =
+			new HashMap<String, String>() {
 				{
 					put("language","Java");
 				}
 			};
 
-	public static final Set legalBlockOptions =
-			new HashSet() {{add("k"); add("greedy"); add("backtrack"); add("memoize");}};
+	public static final Set<String> legalBlockOptions =
+			new HashSet<String>() {{add("k"); add("greedy"); add("backtrack"); add("memoize");}};
 
 	/** What are the default options for a subrule? */
-	public static final Map defaultBlockOptions =
-			new HashMap() {{put("greedy","true");}};
+	public static final Map<String, String> defaultBlockOptions =
+			new HashMap<String, String>() {{put("greedy","true");}};
 
-	public static final Map defaultLexerBlockOptions =
-			new HashMap() {{put("greedy","true");}};
+	public static final Map<String, String> defaultLexerBlockOptions =
+			new HashMap<String, String>() {{put("greedy","true");}};
 
 	// Token options are here to avoid contaminating Token object in runtime
 
-	/** Legal options for terminal refs like ID<node=MyVarNode> */
-	public static final Set legalTokenOptions =
-		new HashSet() {
+	/** Legal options for terminal refs like ID&lt;node=MyVarNode&gt; */
+	public static final Set<String> legalTokenOptions =
+		new HashSet<String>() {
 			{
 				add(defaultTokenOption);
 				add("type");
@@ -282,7 +326,7 @@
 	protected int global_k = -1;
 
 	/** Map a scope to a map of name:action pairs.
-	 *  Map<String, Map<String,GrammarAST>>
+	 *  Map&lt;String, Map&lt;String,GrammarAST&gt;&gt;
 	 *  The code generator will use this to fill holes in the output files.
 	 *  I track the AST node for the action in case I need the line number
 	 *  for errors.
@@ -318,7 +362,7 @@
 	/** For ANTLRWorks, we want to be able to map a line:col to a specific
 	 *  decision DFA so it can display DFA.
 	 */
-	Map lineColumnToLookaheadDFAMap = new HashMap();
+	Map<String, DFA> lineColumnToLookaheadDFAMap = new HashMap<String, DFA>();
 
 	public Tool tool;
 
@@ -327,7 +371,7 @@
 	 */
 	protected Set<GrammarAST> ruleRefs = new HashSet<GrammarAST>();
 
-	protected Set<GrammarAST> scopedRuleRefs = new HashSet();
+	protected Set<GrammarAST> scopedRuleRefs = new HashSet<GrammarAST>();
 
 	/** The unique set of all token ID references in any rule */
 	protected Set<Token> tokenIDRefs = new HashSet<Token>();
@@ -394,7 +438,7 @@
 	 *  this but I'm leaving in case other targets need it.
 	 *  see NameSpaceChecker.lookForReferencesToUndefinedSymbols()
 	 */
-	protected Set<Rule> delegatedRuleReferences = new HashSet();
+	protected Set<Rule> delegatedRuleReferences = new HashSet<Rule>();
 
 	/** The ANTLRParser tracks lexer rules when reading combined grammars
 	 *  so we can build the Tokens rule.
@@ -404,11 +448,11 @@
 	/** Track the scopes defined outside of rules and the scopes associated
 	 *  with all rules (even if empty).
 	 */
-	protected Map scopes = new HashMap();
+	protected Map<String, AttributeScope> scopes = new HashMap<String, AttributeScope>();
 
 	/** An AST that records entire input grammar with all rules.  A simple
 	 *  grammar with one rule, "grammar t; a : A | B ;", looks like:
-	 * ( grammar t ( rule a ( BLOCK ( ALT A ) ( ALT B ) ) <end-of-rule> ) )
+	 * ( grammar t ( rule a ( BLOCK ( ALT A ) ( ALT B ) ) &lt;end-of-rule&gt; ) )
 	 */
 	protected GrammarAST grammarTree = null;
 
@@ -460,7 +504,7 @@
 	/** How long in ms did it take to build DFAs for this grammar?
 	 *  If this grammar is a combined grammar, it only records time for
 	 *  the parser grammar component.  This only records the time to
-	 *  do the LL(*) work; NFA->DFA conversion.
+	 *  do the LL(*) work; NFA&rarr;DFA conversion.
 	 */
 	public long DFACreationWallClockTimeInMS;
 
@@ -473,7 +517,7 @@
 	/** Track decisions with syn preds specified for reporting.
 	 *  This is the a set of BLOCK type AST nodes.
 	 */
-	public Set<GrammarAST> blocksWithSynPreds = new HashSet();
+	public Set<GrammarAST> blocksWithSynPreds = new HashSet<GrammarAST>();
 
 	/** Track decisions that actually use the syn preds in the DFA.
 	 *  Computed during NFA to DFA conversion.
@@ -486,15 +530,15 @@
 	 *  incident edges can have synpreds.  Same is try for
 	 *  decisionsWhoseDFAsUsesSynPreds.
 	 */
-	public Set<String> synPredNamesUsedInDFA = new HashSet();
+	public Set<String> synPredNamesUsedInDFA = new HashSet<String>();
 
 	/** Track decisions with syn preds specified for reporting.
 	 *  This is the a set of BLOCK type AST nodes.
 	 */
-	public Set<GrammarAST> blocksWithSemPreds = new HashSet();
+	public Set<GrammarAST> blocksWithSemPreds = new HashSet<GrammarAST>();
 
 	/** Track decisions that actually use the syn preds in the DFA. */
-	public Set<DFA> decisionsWhoseDFAsUsesSemPreds = new HashSet();
+	public Set<DFA> decisionsWhoseDFAsUsesSemPreds = new HashSet<DFA>();
 
 	protected boolean allDecisionDFACreated = false;
 
@@ -582,7 +626,7 @@
 		String onlyFileName = saneFile.substring(lastSlash+1, fileName.length());
 		if ( !builtFromString ) {
 			int lastDot = onlyFileName.lastIndexOf('.');
-			String onlyFileNameNoSuffix = null;
+			String onlyFileNameNoSuffix;
 			if ( lastDot < 0 ) {
 				ErrorManager.error(ErrorManager.MSG_FILENAME_EXTENSION_ERROR, fileName);
 				onlyFileNameNoSuffix = onlyFileName+GRAMMAR_FILE_EXTENSION;
@@ -609,7 +653,7 @@
 	public void parseAndBuildAST()
 		throws IOException
 	{
-		FileReader fr = null;
+		FileReader fr;
 		BufferedReader br = null;
 		try {
 			fr = new FileReader(fileName);
@@ -662,16 +706,15 @@
 			}
 		}
 
-		setGrammarTree((GrammarAST)result.getTree());
+		setGrammarTree(result.getTree());
 
 		//if ( grammarTree!=null ) System.out.println("grammar tree: "+grammarTree.toStringTree());
 
 		grammarTree.setUnknownTokenBoundaries();
 
 		setFileName(lexer.getFileName()); // the lexer #src might change name
-		if ( grammarTree==null || grammarTree.findFirstType(ANTLRParser.RULE)==null ) {
+		if ( grammarTree.findFirstType(ANTLRParser.RULE)==null ) {
 			ErrorManager.error(ErrorManager.MSG_NO_RULES, getFileName());
-			return;
 		}
 	}
 
@@ -787,9 +830,7 @@
 		}
 		// make sure generated grammar has the same options
 		if ( options!=null ) {
-			Iterator optionNames = options.keySet().iterator();
-			while (optionNames.hasNext()) {
-				String optionName = (String) optionNames.next();
+			for (String optionName : options.keySet()) {
 				if ( !doNotCopyOptionsToLexer.contains(optionName) ) {
 					Object value = options.get(optionName);
 					lexerGrammarST.addAggr("options.{name,value}", optionName, value);
@@ -816,7 +857,7 @@
 		//System.out.println("grammarsFromRootToMe="+grammarsFromRootToMe);
 		String qualifiedName = name;
 		if ( grammarsFromRootToMe!=null ) {
-			StringBuffer buf = new StringBuffer();
+			StringBuilder buf = new StringBuilder();
 			for (Grammar g : grammarsFromRootToMe) {
 				buf.append(g.name);
 				buf.append('_');
@@ -851,7 +892,7 @@
 												   List<String> ruleNames,
 												   List<String> delegateNames,
 												   boolean filterMode) {
-		ST matchTokenRuleST = null;
+		ST matchTokenRuleST;
 		if ( filterMode ) {
 			matchTokenRuleST = new ST(
 					ARTIFICIAL_TOKENS_RULENAME+
@@ -864,11 +905,11 @@
 
 		// Now add token rule references
 		for (int i = 0; i < ruleNames.size(); i++) {
-			String rname = (String) ruleNames.get(i);
+			String rname = ruleNames.get(i);
 			matchTokenRuleST.add("rules", rname);
 		}
 		for (int i = 0; i < delegateNames.size(); i++) {
-			String dname = (String) delegateNames.get(i);
+			String dname = delegateNames.get(i);
 			matchTokenRuleST.add("rules", dname+".Tokens");
 		}
 		//System.out.println("tokens rule: "+matchTokenRuleST.toString());
@@ -886,7 +927,7 @@
 		parser.setGrammarType(this.type);
 		try {
 			ANTLRParser.rule_return result = parser.rule();
-			return (GrammarAST)result.getTree();
+			return result.getTree();
 		}
 		catch (Exception e) {
 			ErrorManager.error(ErrorManager.MSG_ERROR_CREATING_ARTIFICIAL_RULE,
@@ -912,15 +953,16 @@
 	/** for any syntactic predicates, we need to define rules for them; they will get
 	 *  defined automatically like any other rule. :)
 	 */
-	protected List getArtificialRulesForSyntacticPredicates(LinkedHashMap<String,GrammarAST> nameToSynpredASTMap)
+	protected List<? extends GrammarAST> getArtificialRulesForSyntacticPredicates(LinkedHashMap<String,GrammarAST> nameToSynpredASTMap)
 	{
 		List<GrammarAST> rules = new ArrayList<GrammarAST>();
 		if ( nameToSynpredASTMap==null ) {
 			return rules;
 		}
 		boolean isLexer = grammarTree.getType()==ANTLRParser.LEXER_GRAMMAR;
-		for (String synpredName : nameToSynpredASTMap.keySet()) {
-			GrammarAST fragmentAST = nameToSynpredASTMap.get(synpredName);
+		for (Map.Entry<String, GrammarAST> entry : nameToSynpredASTMap.entrySet()) {
+			String synpredName = entry.getKey();
+			GrammarAST fragmentAST = entry.getValue();
 			GrammarAST ruleAST =
 				ANTLRParser.createSimpleRuleAST(synpredName,
 												fragmentAST,
@@ -932,7 +974,7 @@
 
 	public void addRulesForSyntacticPredicates() {
 		// Get syn pred rules and add to existing tree
-		List synpredRules =
+		List<? extends GrammarAST> synpredRules =
 			getArtificialRulesForSyntacticPredicates(nameToSynpredASTMap);
 		for (int i = 0; i < synpredRules.size(); i++) {
 			GrammarAST rAST = (GrammarAST) synpredRules.get(i);
@@ -971,9 +1013,8 @@
 		nfa = new NFA(this);
 		factory = new NFAFactory(nfa);
 
-		Collection rules = getRules();
-		for (Iterator itr = rules.iterator(); itr.hasNext();) {
-			Rule r = (Rule) itr.next();
+		Collection<Rule> rules = getRules();
+		for (Rule r : rules) {
 			String ruleName = r.name;
 			NFAState ruleBeginState = factory.newState();
 			ruleBeginState.setDescription("rule "+ruleName+" start");
@@ -996,7 +1037,7 @@
 			return;
 		}
 		//System.out.println("### build "+getGrammarTypeString()+" grammar "+name+" NFAs");
-		if ( getRules().size()==0 ) {
+		if ( getRules().isEmpty() ) {
 			return;
 		}
 
@@ -1206,14 +1247,14 @@
 		List<IntervalSet> edges = new ArrayList<IntervalSet>();
 		for (int i = 1; i < altLook.length; i++) {
 			LookaheadSet s = altLook[i];
-			edges.add((IntervalSet)s.tokenTypeSet);
+			edges.add(s.tokenTypeSet);
 		}
 		List<IntervalSet> disjoint = makeEdgeSetsDisjoint(edges);
 		//System.out.println("disjoint="+disjoint);
 
 		MultiMap<IntervalSet, Integer> edgeMap = new MultiMap<IntervalSet, Integer>();
 		for (int i = 0; i < disjoint.size(); i++) {
-			IntervalSet ds = (IntervalSet) disjoint.get(i);
+			IntervalSet ds = disjoint.get(i);
 			for (int alt = 1; alt < altLook.length; alt++) {
 				LookaheadSet look = altLook[alt];
 				if ( !ds.and(look.tokenTypeSet).isNil() ) {
@@ -1239,7 +1280,7 @@
 		GrammarAST decisionAST = nfa.grammar.getDecisionBlockAST(lookaheadDFA.decisionNumber);
 		int line = decisionAST.getLine();
 		int col = decisionAST.getCharPositionInLine();
-		lineColumnToLookaheadDFAMap.put(new StringBuffer().append(line + ":")
+		lineColumnToLookaheadDFAMap.put(new StringBuffer().append(line).append(":")
 										.append(col).toString(), lookaheadDFA);
 	}
 
@@ -1248,7 +1289,7 @@
 		// walk each incoming edge label/set and add to disjoint set
 		int numEdges = edges.size();
 		for (int e = 0; e < numEdges; e++) {
-			IntervalSet t = (IntervalSet) edges.get(e);
+			IntervalSet t = edges.get(e);
 			if ( disjointSets.contains(t) ) { // exact set present
 				continue;
 			}
@@ -1257,7 +1298,7 @@
 			IntervalSet remainder = t; // remainder starts out as whole set to add
 			int numDisjointElements = disjointSets.size();
 			for (int i = 0; i < numDisjointElements; i++) {
-				IntervalSet s_i = (IntervalSet)disjointSets.get(i);
+				IntervalSet s_i = disjointSets.get(i);
 
 				if ( t.and(s_i).isNil() ) { // nothing in common
 					continue;
@@ -1269,11 +1310,11 @@
 
 				// Replace existing s_i with intersection since we
 				// know that will always be a non nil character class
-				IntervalSet intersection = (IntervalSet)s_i.and(t);
+				IntervalSet intersection = s_i.and(t);
 				disjointSets.set(i, intersection);
 
 				// Compute s_i-t to see what is in current set and not in incoming
-				IntSet existingMinusNewElements = s_i.subtract(t);
+				IntervalSet existingMinusNewElements = s_i.subtract(t);
 				//System.out.println(s_i+"-"+t+"="+existingMinusNewElements);
 				if ( !existingMinusNewElements.isNil() ) {
 					// found a new character class, add to the end (doesn't affect
@@ -1282,7 +1323,7 @@
 				}
 
 				// anything left to add to the reachableLabels?
-				remainder = (IntervalSet)t.subtract(s_i);
+				remainder = t.subtract(s_i);
 				if ( remainder.isNil() ) {
 					break; // nothing left to add to set.  done!
 				}
@@ -1303,7 +1344,7 @@
 
 		//System.out.println("createLookaheadDFA(): "+enclosingRule+" dec "+decision+"; synprednames prev used "+synPredNamesUsedInDFA);
 		NFAState decisionStartState = getDecisionNFAStartState(decision);
-		long startDFA=0,stopDFA=0;
+		long startDFA=0,stopDFA;
 		if ( composite.watchNFAConversion ) {
 			System.out.println("--------------------\nbuilding lookahead DFA (d="
 							   +decisionStartState.getDecisionNumber()+") for "+
@@ -1398,7 +1439,7 @@
 		if ( index>=composite.typeToTokenList.size() ) {
 			composite.typeToTokenList.setSize(index+1);
 		}
-		String prevToken = (String)composite.typeToTokenList.get(index);
+		String prevToken = composite.typeToTokenList.get(index);
 		if ( prevToken==null || prevToken.charAt(0)=='\'' ) {
 			// only record if nothing there before or if thing before was a literal
 			composite.typeToTokenList.set(index, text);
@@ -1410,7 +1451,7 @@
 	 */
 	public void defineRule(Token ruleToken,
 						   String modifier,
-						   Map options,
+						   Map<String, Object> options,
 						   GrammarAST tree,
 						   GrammarAST argActionAST,
 						   int numAlts)
@@ -1455,7 +1496,7 @@
 										   String currentRuleName)
 	{
 		if ( nameToSynpredASTMap==null ) {
-			nameToSynpredASTMap = new LinkedHashMap();
+			nameToSynpredASTMap = new LinkedHashMap<String, GrammarAST>();
 		}
 		String predName =
 			SYNPRED_RULE_PREFIX+(nameToSynpredASTMap.size() + 1)+"_"+name;
@@ -1464,7 +1505,7 @@
 		return predName;
 	}
 
-	public LinkedHashMap getSyntacticPredicates() {
+	public LinkedHashMap<String, GrammarAST> getSyntacticPredicates() {
 		return nameToSynpredASTMap;
 	}
 
@@ -1472,7 +1513,7 @@
 		if ( nameToSynpredASTMap==null ) {
 			return null;
 		}
-		return (GrammarAST)nameToSynpredASTMap.get(name);
+		return nameToSynpredASTMap.get(name);
 	}
 
 	public void synPredUsedInDFA(DFA dfa, SemanticContext semCtx) {
@@ -1572,7 +1613,7 @@
 											   ruleAST.ruleStopTokenIndex);
 		*/
 		// first, create the text of the rule
-		StringBuffer buf = new StringBuffer();
+		StringBuilder buf = new StringBuilder();
 		buf.append("// $ANTLR src \"");
 		buf.append(getFileName());
 		buf.append("\" ");
@@ -1745,10 +1786,10 @@
 
 	/** Get a global scope */
 	public AttributeScope getGlobalScope(String name) {
-		return (AttributeScope)scopes.get(name);
+		return scopes.get(name);
 	}
 
-	public Map getGlobalScopes() {
+	public Map<String, AttributeScope> getGlobalScopes() {
 		return scopes;
 	}
 
@@ -1839,7 +1880,7 @@
 		}
 	}
 
-	/** Given a set of all rewrite elements on right of ->, filter for
+	/** Given a set of all rewrite elements on right of -&gt;, filter for
 	 *  label types such as Grammar.TOKEN_LABEL, Grammar.TOKEN_LIST_LABEL, ...
 	 *  Return a displayable token type name computed from the GrammarAST.
 	 */
@@ -1883,21 +1924,20 @@
 	 *  rule labels for example.
 	 */
 	protected void examineAllExecutableActions() {
-		Collection rules = getRules();
-		for (Iterator it = rules.iterator(); it.hasNext();) {
-			Rule r = (Rule) it.next();
+		Collection<Rule> rules = getRules();
+		for (Rule r : rules) {
 			// walk all actions within the rule elements, args, and exceptions
 			List<GrammarAST> actions = r.getInlineActions();
 			for (int i = 0; i < actions.size(); i++) {
-				GrammarAST actionAST = (GrammarAST) actions.get(i);
+				GrammarAST actionAST = actions.get(i);
 				ActionAnalysis sniffer =
 					new ActionAnalysis(this, r.name, actionAST);
 				sniffer.analyze();
 			}
 			// walk any named actions like @init, @after
-			Collection<GrammarAST> namedActions = r.getActions().values();
-			for (Iterator it2 = namedActions.iterator(); it2.hasNext();) {
-				GrammarAST actionAST = (GrammarAST) it2.next();
+			Collection<? extends Object> namedActions = r.getActions().values();
+			for (Object namedAction : namedActions) {
+				GrammarAST actionAST = (GrammarAST)namedAction;
 				ActionAnalysis sniffer =
 					new ActionAnalysis(this, r.name, actionAST);
 				sniffer.analyze();
@@ -1912,9 +1952,8 @@
 		if ( type==LEXER ) {
 			return;
 		}
-		Set rules = nameToRuleMap.keySet();
-		for (Iterator it = rules.iterator(); it.hasNext();) {
-			String ruleName = (String) it.next();
+		Set<String> rules = nameToRuleMap.keySet();
+		for (String ruleName : rules) {
 			Rule r = getRule(ruleName);
 			removeUselessLabels(r.getRuleLabels());
 			removeUselessLabels(r.getRuleListLabels());
@@ -1924,14 +1963,13 @@
 	/** A label on a rule is useless if the rule has no return value, no
 	 *  tree or template output, and it is not referenced in an action.
 	 */
-	protected void removeUselessLabels(Map ruleToElementLabelPairMap) {
+	protected void removeUselessLabels(Map<String, LabelElementPair> ruleToElementLabelPairMap) {
 		if ( ruleToElementLabelPairMap==null ) {
 			return;
 		}
-		Collection labels = ruleToElementLabelPairMap.values();
-		List kill = new ArrayList();
-		for (Iterator labelit = labels.iterator(); labelit.hasNext();) {
-			LabelElementPair pair = (LabelElementPair) labelit.next();
+		Collection<LabelElementPair> labels = ruleToElementLabelPairMap.values();
+		List<String> kill = new ArrayList<String>();
+		for (LabelElementPair pair : labels) {
 			Rule refdRule = getRule(pair.elementRef.getText());
 			if ( refdRule!=null && !refdRule.getHasReturnValue() && !pair.actionReferencesLabel ) {
 				//System.out.println(pair.label.getText()+" is useless");
@@ -1939,7 +1977,7 @@
 			}
 		}
 		for (int i = 0; i < kill.size(); i++) {
-			String labelToKill = (String) kill.get(i);
+			String labelToKill = kill.get(i);
 			// System.out.println("kill "+labelToKill);
 			ruleToElementLabelPairMap.remove(labelToKill);
 		}
@@ -2010,7 +2048,7 @@
 		}
 	}
 
-	public List checkAllRulesForLeftRecursion() {
+	public List<? extends Collection<? extends Rule>> checkAllRulesForLeftRecursion() {
 		return sanity.checkAllRulesForLeftRecursion();
 	}
 
@@ -2044,25 +2082,32 @@
 	 *  any else.
 	 */
 	public boolean isEmptyRule(GrammarAST block) {
-		GrammarAST aTokenRefNode =
-			block.findFirstType(ANTLRParser.TOKEN_REF);
-		GrammarAST aStringLiteralRefNode =
-			block.findFirstType(ANTLRParser.STRING_LITERAL);
-		GrammarAST aCharLiteralRefNode =
-			block.findFirstType(ANTLRParser.CHAR_LITERAL);
-		GrammarAST aWildcardRefNode =
-			block.findFirstType(ANTLRParser.WILDCARD);
-		GrammarAST aRuleRefNode =
-			block.findFirstType(ANTLRParser.RULE_REF);
-		if ( aTokenRefNode==null&&
-			 aStringLiteralRefNode==null&&
-			 aCharLiteralRefNode==null&&
-			 aWildcardRefNode==null&&
-			 aRuleRefNode==null )
-		{
-			return true;
+		BitSet nonEmptyTerminals = new BitSet();
+		nonEmptyTerminals.set(ANTLRParser.TOKEN_REF);
+		nonEmptyTerminals.set(ANTLRParser.STRING_LITERAL);
+		nonEmptyTerminals.set(ANTLRParser.CHAR_LITERAL);
+		nonEmptyTerminals.set(ANTLRParser.WILDCARD);
+		nonEmptyTerminals.set(ANTLRParser.RULE_REF);
+		return findFirstTypeOutsideRewrite(block, nonEmptyTerminals) == null;
+	}
+
+	protected GrammarAST findFirstTypeOutsideRewrite(GrammarAST block, BitSet types) {
+		ArrayList<GrammarAST> worklist = new ArrayList<GrammarAST>();
+		worklist.add(block);
+		while (!worklist.isEmpty()) {
+			GrammarAST current = worklist.remove(worklist.size() - 1);
+			if (current.getType() == ANTLRParser.REWRITE) {
+				continue;
+			}
+
+			if (current.getType() >= 0 && types.get(current.getType())) {
+				return current;
+			}
+
+			worklist.addAll(Arrays.asList(current.getChildrenAsArray()));
 		}
-		return false;
+
+		return null;
 	}
 
 	public boolean isAtomTokenType(int ttype) {
@@ -2075,20 +2120,20 @@
 	}
 
 	public int getTokenType(String tokenName) {
-		Integer I = null;
+		Integer I;
 		if ( tokenName.charAt(0)=='\'') {
-			I = (Integer)composite.stringLiteralToTypeMap.get(tokenName);
+			I = composite.stringLiteralToTypeMap.get(tokenName);
 		}
 		else { // must be a label like ID
-			I = (Integer)composite.tokenIDToTypeMap.get(tokenName);
+			I = composite.tokenIDToTypeMap.get(tokenName);
 		}
-		int i = (I!=null)?I.intValue():Label.INVALID;
+		int i = (I!=null)? I :Label.INVALID;
 		//System.out.println("grammar type "+type+" "+tokenName+"->"+i);
 		return i;
 	}
 
 	/** Get the list of tokens that are IDs like BLOCK and LPAREN */
-	public Set getTokenIDs() {
+	public Set<String> getTokenIDs() {
 		return composite.tokenIDToTypeMap.keySet();
 	}
 
@@ -2096,8 +2141,8 @@
 	 *  corresponding token ID like INT or KEYWORD_BEGIN; for stuff
 	 *  like 'begin'.
 	 */
-	public Collection getTokenTypesWithoutID() {
-		List types = new ArrayList();
+	public Collection<Integer> getTokenTypesWithoutID() {
+		List<Integer> types = new ArrayList<Integer>();
 		for (int t =Label.MIN_TOKEN_TYPE; t<=getMaxTokenType(); t++) {
 			String name = getTokenDisplayName(t);
 			if ( name.charAt(0)=='\'' ) {
@@ -2189,7 +2234,7 @@
 				else if ( Character.isDigit(c) ) {
 					ErrorManager.error(ErrorManager.MSG_SYNTAX_ERROR,
 									   "invalid char literal: "+literal);
-					buf.append("\\"+(char)c);
+					buf.append("\\").append(c);
 				}
 				else {
 					buf.append((char)ANTLRLiteralEscapedCharValue[c]); // normal \x escape
@@ -2213,9 +2258,8 @@
 	 *  Returns the max token type found.
 	 */
 	public int importTokenVocabulary(Grammar importFromGr) {
-		Set importedTokenIDs = importFromGr.getTokenIDs();
-		for (Iterator it = importedTokenIDs.iterator(); it.hasNext();) {
-			String tokenID = (String) it.next();
+		Set<String> importedTokenIDs = importFromGr.getTokenIDs();
+		for (String tokenID : importedTokenIDs) {
 			int tokenType = importFromGr.getTokenType(tokenID);
 			composite.maxTokenType = Math.max(composite.maxTokenType,tokenType);
 			if ( tokenType>=Label.MIN_TOKEN_TYPE ) {
@@ -2241,7 +2285,7 @@
 			String fullName = tool.getLibraryFile(gname);
 			FileReader fr = new FileReader(fullName);
 			br = new BufferedReader(fr);
-			Grammar delegateGrammar = null;
+			Grammar delegateGrammar;
 			delegateGrammar = new Grammar(tool, gname, composite);
 			delegateGrammar.label = label;
 
@@ -2308,7 +2352,7 @@
 		delegateGrammar.composite = this.composite;
 	}
 
-	/** Load a vocab file <vocabName>.tokens and return max token type found. */
+	/** Load a vocab file &lt;vocabName&gt;.tokens and return max token type found. */
 	public int importTokenVocabulary(GrammarAST tokenVocabOptionAST,
 									 String vocabName)
 	{
@@ -2348,7 +2392,7 @@
 					ErrorManager.error(ErrorManager.MSG_TOKENS_FILE_SYNTAX_ERROR,
 									   vocabName+CodeGenerator.VOCAB_FILE_EXTENSION,
 									   Utils.integer(lineNum));
-					while ( tokenizer.nextToken() != StreamTokenizer.TT_EOL ) {;}
+					while ( tokenizer.nextToken() != StreamTokenizer.TT_EOL ) {}
 					token = tokenizer.nextToken();
 					continue;
 				}
@@ -2357,7 +2401,7 @@
 					ErrorManager.error(ErrorManager.MSG_TOKENS_FILE_SYNTAX_ERROR,
 									   vocabName+CodeGenerator.VOCAB_FILE_EXTENSION,
 									   Utils.integer(lineNum));
-					while ( tokenizer.nextToken() != StreamTokenizer.TT_EOL ) {;}
+					while ( tokenizer.nextToken() != StreamTokenizer.TT_EOL ) {}
 					token = tokenizer.nextToken();
 					continue;
 				}
@@ -2366,7 +2410,7 @@
 					ErrorManager.error(ErrorManager.MSG_TOKENS_FILE_SYNTAX_ERROR,
 									   vocabName+CodeGenerator.VOCAB_FILE_EXTENSION,
 									   Utils.integer(lineNum));
-					while ( tokenizer.nextToken() != StreamTokenizer.TT_EOL ) {;}
+					while ( tokenizer.nextToken() != StreamTokenizer.TT_EOL ) {}
 					token = tokenizer.nextToken();
 					continue;
 				}
@@ -2380,7 +2424,7 @@
 					ErrorManager.error(ErrorManager.MSG_TOKENS_FILE_SYNTAX_ERROR,
 									   vocabName+CodeGenerator.VOCAB_FILE_EXTENSION,
 									   Utils.integer(lineNum));
-					while ( tokenizer.nextToken() != StreamTokenizer.TT_EOL ) {;}
+					while ( tokenizer.nextToken() != StreamTokenizer.TT_EOL ) {}
 					token = tokenizer.nextToken();
 					continue;
 				}
@@ -2410,8 +2454,8 @@
 	 *  char vocabulary, compute an ANTLR-valid (possibly escaped) char literal.
 	 */
 	public String getTokenDisplayName(int ttype) {
-		String tokenName = null;
-		int index=0;
+		String tokenName;
+		int index;
 		// inside any target's char range and is lexer grammar?
 		if ( this.type==LEXER &&
 			 ttype >= Label.MIN_CHAR_VALUE && ttype <= Label.MAX_CHAR_VALUE )
@@ -2420,7 +2464,7 @@
 		}
 		// faux label?
 		else if ( ttype<0 ) {
-			tokenName = (String)composite.typeToTokenList.get(Label.NUM_FAUX_LABELS+ttype);
+			tokenName = composite.typeToTokenList.get(Label.NUM_FAUX_LABELS+ttype);
 		}
 		else {
 			// compute index in typeToTokenList for ttype
@@ -2428,7 +2472,7 @@
 			index += Label.NUM_FAUX_LABELS;     // jump over faux tokens
 
 			if ( index<composite.typeToTokenList.size() ) {
-				tokenName = (String)composite.typeToTokenList.get(index);
+				tokenName = composite.typeToTokenList.get(index);
 				if ( tokenName!=null &&
 					 tokenName.startsWith(AUTO_GENERATED_TOKEN_NAME_PREFIX) )
 				{
@@ -2462,7 +2506,7 @@
 		}
 		else if (k instanceof Integer) {
 			Integer kI = (Integer)k;
-			global_k = kI.intValue();
+			global_k = kI;
 		}
 		else {
 			// must be String "*"
@@ -2491,7 +2535,7 @@
             composite.getRootGrammar().atLeastOneBacktrackOption = true;
         }
         if ( options==null ) {
-			options = new HashMap();
+			options = new HashMap<String, Object>();
 		}
 		options.put(key, value);
 		return key;
@@ -2510,14 +2554,14 @@
 		}
 	}
 
-	public void setOptions(Map options, Token optionsStartToken) {
+	public void setOptions(Map<String, Object> options, Token optionsStartToken) {
 		if ( options==null ) {
 			this.options = null;
 			return;
 		}
-		Set keys = options.keySet();
-		for (Iterator it = keys.iterator(); it.hasNext();) {
-			String optionName = (String) it.next();
+		Set<String> keys = options.keySet();
+		for (Iterator<String> it = keys.iterator(); it.hasNext();) {
+			String optionName = it.next();
 			Object optionValue = options.get(optionName);
 			String stored=setOption(optionName, optionValue, optionsStartToken);
 			if ( stored==null ) {
@@ -2562,7 +2606,7 @@
 		}
 		if (k instanceof Integer) {
 			Integer kI = (Integer)k;
-			user_k = kI.intValue();
+			user_k = kI;
 		}
 		else {
 			// must be String "*"
@@ -2635,14 +2679,14 @@
 	 *
 	 *  delegatedRules = imported - overridden
 	 */
-	public Set<Rule> getDelegatedRules() {
+	public Set<? extends Rule> getDelegatedRules() {
 		return composite.getDelegatedRules(this);
 	}
 
 	/** Get set of all rules imported from all delegate grammars even if
 	 *  indirectly delegated.
 	 */
-	public Set<Rule> getAllImportedRules() {
+	public Set<? extends Rule> getAllImportedRules() {
 		return composite.getAllImportedRules(this);
 	}
 
@@ -2768,10 +2812,10 @@
 		return d;
 	}
 
-	public List getDecisionNFAStartStateList() {
-		List states = new ArrayList(100);
+	public List<NFAState> getDecisionNFAStartStateList() {
+		List<NFAState> states = new ArrayList<NFAState>(100);
 		for (int d = 0; d < indexToDecision.size(); d++) {
-			Decision dec = (Decision) indexToDecision.get(d);
+			Decision dec = indexToDecision.get(d);
 			states.add(dec.startState);
 		}
 		return states;
@@ -2807,15 +2851,13 @@
 	 *  ANTLRWorks has to give the *exact* location which
 	 *  is not easy from the user point of view).
 	 *
-	 *  This is not particularly fast as it walks entire line:col->DFA map
+	 *  This is not particularly fast as it walks entire line:col&rarr;DFA map
 	 *  looking for a prefix of "line:".
 	 */
-	public List getLookaheadDFAColumnsForLineInFile(int line) {
+	public List<Integer> getLookaheadDFAColumnsForLineInFile(int line) {
 		String prefix = line+":";
-		List columns = new ArrayList();
-		for(Iterator iter = lineColumnToLookaheadDFAMap.keySet().iterator();
-			iter.hasNext(); ) {
-			String key = (String)iter.next();
+		List<Integer> columns = new ArrayList<Integer>();
+		for (String key : lineColumnToLookaheadDFAMap.keySet()) {
 			if(key.startsWith(prefix)) {
 				columns.add(Integer.valueOf(key.substring(prefix.length())));
 			}
@@ -2825,11 +2867,11 @@
 
 	/** Useful for ANTLRWorks to map position in file to the DFA for display */
 	public DFA getLookaheadDFAFromPositionInFile(int line, int col) {
-		return (DFA)lineColumnToLookaheadDFAMap.get(
-			new StringBuffer().append(line + ":").append(col).toString());
+		return lineColumnToLookaheadDFAMap.get(
+			new StringBuffer().append(line).append(":").append(col).toString());
 	}
 
-	public Map getLineColumnToLookaheadDFAMap() {
+	public Map<String, DFA> getLineColumnToLookaheadDFAMap() {
 		return lineColumnToLookaheadDFAMap;
 	}
 
@@ -2995,7 +3037,7 @@
 	 *  are both valid sets themselves, else we must tree like a BLOCK
 	 */
 	public boolean isValidSet(TreeToNFAConverter nfabuilder, GrammarAST t) {
-		boolean valid = true;
+		boolean valid;
 		try {
 			//System.out.println("parse BLOCK as set tree: "+t.toStringTree());
 			int alts = nfabuilder.testBlockAsSet(t);
@@ -3025,7 +3067,7 @@
 		if ( r==null ) {
 			return null;
 		}
-		IntSet elements = null;
+		IntSet elements;
 		//System.out.println("parsed tree: "+r.tree.toStringTree());
 		elements = nfabuilder.setRule(r.tree);
 		//System.out.println("elements="+elements);
@@ -3053,9 +3095,9 @@
 	 *  an invalid alt is requested.  I must count in to find the right
 	 *  alternative number.  For (A|B), you get NFA structure (roughly):
 	 *
-	 *  o->o-A->o
+	 *  o-&gt;o-A-&gt;o
 	 *  |
-	 *  o->o-B->o
+	 *  o-&gt;o-B-&gt;o
 	 *
 	 *  This routine returns the leftmost state for each alt.  So alt=1, returns
 	 *  the upperleft most state in this structure.
@@ -3129,13 +3171,14 @@
 	}
 
 	/** given a token type and the text of the literal, come up with a
-	 *  decent token type label.  For now it's just T<type>.  Actually,
+	 *  decent token type label.  For now it's just T&lt;type&gt;.  Actually,
 	 *  if there is an aliased name from tokens like PLUS='+', use it.
 	 */
 	public String computeTokenNameFromLiteral(int tokenType, String literal) {
 		return AUTO_GENERATED_TOKEN_NAME_PREFIX +tokenType;
 	}
 
+	@Override
 	public String toString() {
 	//	return "FFFFFFFFFFFFFF";
 		return grammarTreeToString(grammarTree);
@@ -3146,7 +3189,7 @@
 	}
 
 	public String grammarTreeToString(GrammarAST t, boolean showActions) {
-		String s = null;
+		String s;
 		try {
 			s = t.getLine()+":"+(t.getCharPositionInLine()+1)+": ";
 			s += new ANTLRTreePrinter(new CommonTreeNodeStream(t)).toString(this, showActions);
diff --git a/tool/src/main/java/org/antlr/tool/GrammarAST.java b/tool/src/main/java/org/antlr/tool/GrammarAST.java
index 3d36cc8..fdddb11 100644
--- a/tool/src/main/java/org/antlr/tool/GrammarAST.java
+++ b/tool/src/main/java/org/antlr/tool/GrammarAST.java
@@ -31,15 +31,11 @@
 import org.antlr.analysis.NFAState;
 import org.antlr.grammar.v3.ANTLRParser;
 import org.antlr.misc.IntSet;
-import org.antlr.misc.Interval;
 import org.antlr.runtime.CommonToken;
 import org.antlr.runtime.Token;
-import org.antlr.runtime.TokenSource;
 import org.antlr.runtime.tree.CommonTree;
 import org.antlr.runtime.tree.Tree;
-import org.antlr.runtime.tree.TreeAdaptor;
 import org.stringtemplate.v4.ST;
-import org.omg.PortableInterceptor.ORBInitInfoPackage.DuplicateName;
 
 import java.util.*;
 
@@ -128,7 +124,6 @@
 
     /**
      *
-     * @return
      */
     public Map<String, Object> getBlockOptions() {
         return blockOptions;
@@ -142,12 +137,14 @@
         this.blockOptions = blockOptions;
     }
 
-	public GrammarAST() {;}
+	public GrammarAST() {}
 
+	@SuppressWarnings("OverridableMethodCallInConstructor")
 	public GrammarAST(int t, String txt) {
 		initialize(t,txt);
 	}
 
+	@SuppressWarnings("OverridableMethodCallInConstructor")
 	public GrammarAST(Token token) {
 		initialize(token);
 	}
@@ -197,7 +194,7 @@
 	 */
 	public String setBlockOption(Grammar grammar, String key, Object value) {
 		if ( blockOptions == null ) {
-			blockOptions = new HashMap();
+			blockOptions = new HashMap<String, Object>();
 		}
 		return setOption(blockOptions, Grammar.legalBlockOptions, grammar, key, value);
 	}
@@ -209,7 +206,7 @@
 		return setOption(terminalOptions, Grammar.legalTokenOptions, grammar, key, value);
 	}
 
-	public String setOption(Map options, Set legalOptions, Grammar grammar, String key, Object value) {
+	public String setOption(Map<String, Object> options, Set<String> legalOptions, Grammar grammar, String key, Object value) {
 		if ( !legalOptions.contains(key) ) {
 			ErrorManager.grammarError(ErrorManager.MSG_ILLEGAL_OPTION,
 									  grammar,
@@ -241,12 +238,12 @@
 		return value;
 	}
 
-    public void setOptions(Grammar grammar, Map options) {
+    public void setOptions(Grammar grammar, Map<String, Object> options) {
 		if ( options==null ) {
 			this.blockOptions = null;
 			return;
 		}
-		String[] keys = (String[])options.keySet().toArray(new String[options.size()]);
+		String[] keys = options.keySet().toArray(new String[options.size()]);
 		for (String optionName : keys) {
 			String stored= setBlockOption(grammar, optionName, options.get(optionName));
 			if ( stored==null ) {
@@ -344,9 +341,13 @@
         return (GrammarAST)parent.getChild(parent.getChildCount() - 1);
     }
 
-
     public GrammarAST[] getChildrenAsArray() {
-        return (GrammarAST[])getChildren().toArray(new GrammarAST[getChildCount()]);
+		List<? extends Object> children = getChildren();
+		if (children == null) {
+			return new GrammarAST[0];
+		}
+
+        return children.toArray(new GrammarAST[children.size()]);
     }
 
     private static final GrammarAST DescendantDownNode = new GrammarAST(Token.DOWN, "DOWN");
@@ -536,8 +537,13 @@
 		}
 	}
 
-	String toStringList() {
-		return "";
+	public String toStringList() {
+		String result = toStringTree();
+		if (this.getNextSibling() != null) {
+			result += ' ' + getNextSibling().toStringList();
+		}
+
+		return result;
 	}
 
 	/** Track start/stop token for subtree root created for a rule.
diff --git a/tool/src/main/java/org/antlr/tool/GrammarAnalysisAbortedMessage.java b/tool/src/main/java/org/antlr/tool/GrammarAnalysisAbortedMessage.java
index 95d1d17..55f5c91 100644
--- a/tool/src/main/java/org/antlr/tool/GrammarAnalysisAbortedMessage.java
+++ b/tool/src/main/java/org/antlr/tool/GrammarAnalysisAbortedMessage.java
@@ -41,6 +41,7 @@
 		this.probe = probe;
 	}
 
+	@Override
 	public String toString() {
 		GrammarAST decisionASTNode = probe.dfa.getDecisionASTNode();
 		line = decisionASTNode.getLine();
diff --git a/tool/src/main/java/org/antlr/tool/GrammarDanglingStateMessage.java b/tool/src/main/java/org/antlr/tool/GrammarDanglingStateMessage.java
index e360dd7..3cca533 100644
--- a/tool/src/main/java/org/antlr/tool/GrammarDanglingStateMessage.java
+++ b/tool/src/main/java/org/antlr/tool/GrammarDanglingStateMessage.java
@@ -29,6 +29,7 @@
 
 import org.antlr.analysis.DFAState;
 import org.antlr.analysis.DecisionProbe;
+import org.antlr.analysis.Label;
 import org.stringtemplate.v4.ST;
 
 import java.util.ArrayList;
@@ -50,6 +51,7 @@
 		this.problemState = problemState;
 	}
 
+	@Override
 	public String toString() {
 		GrammarAST decisionASTNode = probe.dfa.getDecisionASTNode();
 		line = decisionASTNode.getLine();
@@ -58,10 +60,10 @@
 		if ( fileName!=null ) {
 			file = fileName;
 		}
-		List labels = probe.getSampleNonDeterministicInputSequence(problemState);
+		List<Label> labels = probe.getSampleNonDeterministicInputSequence(problemState);
 		String input = probe.getInputSequenceDisplay(labels);
 		ST st = getMessageTemplate();
-		List alts = new ArrayList();
+		List<Integer> alts = new ArrayList<Integer>();
 		alts.addAll(problemState.getAltSet());
 		Collections.sort(alts);
 		st.add("danglingAlts", alts);
diff --git a/tool/src/main/java/org/antlr/tool/GrammarInsufficientPredicatesMessage.java b/tool/src/main/java/org/antlr/tool/GrammarInsufficientPredicatesMessage.java
index 156bdc1..43a4518 100644
--- a/tool/src/main/java/org/antlr/tool/GrammarInsufficientPredicatesMessage.java
+++ b/tool/src/main/java/org/antlr/tool/GrammarInsufficientPredicatesMessage.java
@@ -50,6 +50,7 @@
 		this.altToLocations = altToLocations;
 	}
 
+	@Override
 	public String toString() {
 		GrammarAST decisionASTNode = probe.dfa.getDecisionASTNode();
 		line = decisionASTNode.getLine();
diff --git a/tool/src/main/java/org/antlr/tool/GrammarNonDeterminismMessage.java b/tool/src/main/java/org/antlr/tool/GrammarNonDeterminismMessage.java
index 8cd95ae..d61258c 100644
--- a/tool/src/main/java/org/antlr/tool/GrammarNonDeterminismMessage.java
+++ b/tool/src/main/java/org/antlr/tool/GrammarNonDeterminismMessage.java
@@ -29,8 +29,8 @@
 
 import org.antlr.analysis.DFAState;
 import org.antlr.analysis.DecisionProbe;
+import org.antlr.analysis.Label;
 import org.antlr.analysis.NFAState;
-import org.antlr.misc.Utils;
 import org.stringtemplate.v4.ST;
 
 import java.util.Iterator;
@@ -56,6 +56,7 @@
 		}
 	}
 
+	@Override
 	public String toString() {
 		GrammarAST decisionASTNode = probe.dfa.getDecisionASTNode();
 		line = decisionASTNode.getLine();
@@ -67,16 +68,15 @@
 
 		ST st = getMessageTemplate();
 		// Now fill template with information about problemState
-		List labels = probe.getSampleNonDeterministicInputSequence(problemState);
+		List<Label> labels = probe.getSampleNonDeterministicInputSequence(problemState);
 		String input = probe.getInputSequenceDisplay(labels);
 		st.add("input", input);
 
 		if ( probe.dfa.isTokensRuleDecision() ) {
-			Set disabledAlts = probe.getDisabledAlternatives(problemState);
-			for (Iterator it = disabledAlts.iterator(); it.hasNext();) {
-				Integer altI = (Integer) it.next();
+			Set<Integer> disabledAlts = probe.getDisabledAlternatives(problemState);
+			for (Integer altI : disabledAlts) {
 				String tokenName =
-					probe.getTokenNameForTokensRuleAlt(altI.intValue());
+					probe.getTokenNameForTokensRuleAlt(altI);
 				// reset the line/col to the token definition (pick last one)
 				NFAState ruleStart =
 					probe.dfa.nfa.grammar.getRuleStartState(tokenName);
@@ -89,20 +89,19 @@
 			st.add("disabled", probe.getDisabledAlternatives(problemState));
 		}
 
-		List nondetAlts = probe.getNonDeterministicAltsForState(problemState);
+		List<Integer> nondetAlts = probe.getNonDeterministicAltsForState(problemState);
 		NFAState nfaStart = probe.dfa.getNFADecisionStartState();
 		// all state paths have to begin with same NFA state
 		int firstAlt = 0;
 		if ( nondetAlts!=null ) {
-			for (Iterator iter = nondetAlts.iterator(); iter.hasNext();) {
-				Integer displayAltI = (Integer) iter.next();
+			for (Integer displayAltI : nondetAlts) {
 				if ( DecisionProbe.verbose ) {
 					int tracePathAlt =
-						nfaStart.translateDisplayAltToWalkAlt(displayAltI.intValue());
+						nfaStart.translateDisplayAltToWalkAlt(displayAltI);
 					if ( firstAlt == 0 ) {
 						firstAlt = tracePathAlt;
 					}
-					List path =
+					List<? extends NFAState> path =
 						probe.getNFAPathStatesForAlt(firstAlt,
 													 tracePathAlt,
 													 labels);
@@ -112,7 +111,7 @@
 					if ( probe.dfa.isTokensRuleDecision() ) {
 						// alts are token rules, convert to the names instead of numbers
 						String tokenName =
-							probe.getTokenNameForTokensRuleAlt(displayAltI.intValue());
+							probe.getTokenNameForTokensRuleAlt(displayAltI);
 						st.add("conflictingTokens", tokenName);
 					}
 					else {
diff --git a/tool/src/main/java/org/antlr/tool/GrammarReport.java b/tool/src/main/java/org/antlr/tool/GrammarReport.java
index e0462a3..416fbf9 100644
--- a/tool/src/main/java/org/antlr/tool/GrammarReport.java
+++ b/tool/src/main/java/org/antlr/tool/GrammarReport.java
@@ -112,9 +112,8 @@
 
 		int totalNonSynPredProductions = 0;
 		int totalNonSynPredRules = 0;
-		Collection rules = g.getRules();
-		for (Iterator it = rules.iterator(); it.hasNext();) {
-			Rule r = (Rule) it.next();
+		Collection<Rule> rules = g.getRules();
+		for (Rule r : rules) {
 			if ( !r.name.toUpperCase()
 				.startsWith(Grammar.SYNPRED_RULE_PREFIX.toUpperCase()) )
 			{
@@ -257,7 +256,7 @@
 	 *  send to the notify page at antlr.org
 	 */
 	public String toNotifyString() {
-		StringBuffer buf = new StringBuffer();
+		StringBuilder buf = new StringBuilder();
 		ReportData data = getReportData(grammar);
 		Field[] fields = ReportData.class.getDeclaredFields();
 		int i = 0;
@@ -277,7 +276,7 @@
 	}
 
 	public String getBacktrackingReport() {
-		StringBuffer buf = new StringBuffer();
+		StringBuilder buf = new StringBuilder();
 		buf.append("Backtracking report:");
 		buf.append(newline);
 		buf.append("Number of decisions that backtrack: ");
@@ -287,12 +286,10 @@
 		return buf.toString();
 	}
 
-	protected String getDFALocations(Set dfas) {
-		Set decisions = new HashSet();
-		StringBuffer buf = new StringBuffer();
-		Iterator it = dfas.iterator();
-		while ( it.hasNext() ) {
-			DFA dfa = (DFA) it.next();
+	protected String getDFALocations(Set<DFA> dfas) {
+		Set<Integer> decisions = new HashSet<Integer>();
+		StringBuilder buf = new StringBuilder();
+		for (DFA dfa : dfas) {
 			// if we aborted a DFA and redid with k=1, the backtrackin
 			if ( decisions.contains(Utils.integer(dfa.decisionNumber)) ) {
 				continue;
@@ -317,6 +314,7 @@
 	 *  return a human-readable version.  Return null if there is a
 	 *  problem with the data.
 	 */
+	@Override
 	public String toString() {
 		return toString(toNotifyString());
 	}
@@ -350,7 +348,7 @@
 		if ( data ==null ) {
 			return null;
 		}
-		StringBuffer buf = new StringBuffer();
+		StringBuilder buf = new StringBuilder();
 		buf.append("ANTLR Grammar Report; Stats Version ");
 		buf.append(data.version);
 		buf.append('\n');
diff --git a/tool/src/main/java/org/antlr/tool/GrammarReport2.java b/tool/src/main/java/org/antlr/tool/GrammarReport2.java
index bc57891..409273d 100644
--- a/tool/src/main/java/org/antlr/tool/GrammarReport2.java
+++ b/tool/src/main/java/org/antlr/tool/GrammarReport2.java
@@ -43,6 +43,7 @@
 		this.root = rootGrammar;
 	}
 
+	@Override
 	public String toString() {
 		StringBuilder buf = new StringBuilder();
 		stats(root, buf);
@@ -64,17 +65,17 @@
 			int k = d.dfa.getMaxLookaheadDepth();
 			Rule enclosingRule = d.dfa.decisionNFAStartState.enclosingRule;
 			if ( enclosingRule.isSynPred ) continue; // don't count synpred rules
-			buf.append(g.name+"."+enclosingRule.name+":" +
+			buf.append(g.name).append(".").append(enclosingRule.name).append(":" +
 					   "");
 			GrammarAST decisionAST =
 				d.dfa.decisionNFAStartState.associatedASTNode;
 			buf.append(decisionAST.getLine());
 			buf.append(":");
 			buf.append(decisionAST.getCharPositionInLine());
-			buf.append(" decision "+decision+":");
+			buf.append(" decision ").append(decision).append(":");
 			
 			if ( d.dfa.isCyclic() ) buf.append(" cyclic");
-			if ( k!=Integer.MAX_VALUE ) buf.append(" k="+k); // fixed, no sempreds
+			if ( k!=Integer.MAX_VALUE ) buf.append(" k=").append(k); // fixed, no sempreds
 			if ( d.dfa.hasSynPred() ) buf.append(" backtracks"); // isolated synpred not gated
 			if ( d.dfa.hasSemPred() ) buf.append(" sempred"); // user-defined sempred
 //			else {
diff --git a/tool/src/main/java/org/antlr/tool/GrammarSanity.java b/tool/src/main/java/org/antlr/tool/GrammarSanity.java
index bcfabfb..5678950 100644
--- a/tool/src/main/java/org/antlr/tool/GrammarSanity.java
+++ b/tool/src/main/java/org/antlr/tool/GrammarSanity.java
@@ -57,14 +57,14 @@
 	 */
 	public List<Set<Rule>> checkAllRulesForLeftRecursion() {
 		grammar.buildNFA(); // make sure we have NFAs
-		grammar.leftRecursiveRules = new HashSet();
-		List<Set<Rule>> listOfRecursiveCycles = new ArrayList();
+		grammar.leftRecursiveRules = new HashSet<Rule>();
+		List<Set<Rule>> listOfRecursiveCycles = new ArrayList<Set<Rule>>();
 		for (int i = 0; i < grammar.composite.ruleIndexToRuleList.size(); i++) {
 			Rule r = grammar.composite.ruleIndexToRuleList.elementAt(i);
 			if ( r!=null ) {
-				visitedDuringRecursionCheck = new HashSet();
+				visitedDuringRecursionCheck = new HashSet<Rule>();
 				visitedDuringRecursionCheck.add(r);
-				Set visitedStates = new HashSet();
+				Set<NFAState> visitedStates = new HashSet<NFAState>();
 				traceStatesLookingForLeftRecursion(r.startState,
 												   visitedStates,
 												   listOfRecursiveCycles);
@@ -87,7 +87,7 @@
 	 *  side-effect, set leftRecursiveRules.
 	 */
 	protected boolean traceStatesLookingForLeftRecursion(NFAState s,
-														 Set visitedStates,
+														 Set<NFAState> visitedStates,
 														 List<Set<Rule>> listOfRecursiveCycles)
 	{
 		if ( s.isAcceptState() ) {
@@ -122,7 +122,7 @@
 				visitedDuringRecursionCheck.add(refRuleDef);
 				boolean callReachedAcceptState =
 					traceStatesLookingForLeftRecursion((NFAState)t0.target,
-													   new HashSet(),
+													   new HashSet<NFAState>(),
 													   listOfRecursiveCycles);
 				// we're back from visiting that rule
 				visitedDuringRecursionCheck.remove(refRuleDef);
@@ -157,7 +157,7 @@
 	/** enclosingRuleName calls targetRuleName, find the cycle containing
 	 *  the target and add the caller.  Find the cycle containing the caller
 	 *  and add the target.  If no cycles contain either, then create a new
-	 *  cycle.  listOfRecursiveCycles is List<Set<String>> that holds a list
+	 *  cycle.  listOfRecursiveCycles is List&lt;Set&lt;String&gt;&gt; that holds a list
 	 *  of cycles (sets of rule names).
 	 */
 	protected void addRulesToCycle(Rule targetRule,
@@ -178,7 +178,7 @@
 			}
 		}
 		if ( !foundCycle ) {
-			Set cycle = new HashSet();
+			Set<Rule> cycle = new HashSet<Rule>();
 			cycle.add(targetRule);
 			cycle.add(enclosingRule);
 			listOfRecursiveCycles.add(cycle);
@@ -252,12 +252,12 @@
 		}
 	}
 
-	/** Rules in tree grammar that use -> rewrites and are spitting out
+	/** Rules in tree grammar that use -&gt; rewrites and are spitting out
 	 *  templates via output=template and then use rewrite=true must only
-	 *  use -> on alts that are simple nodes or trees or single rule refs
+	 *  use -&gt; on alts that are simple nodes or trees or single rule refs
 	 *  that match either nodes or trees.  The altAST is the ALT node
 	 *  for an ALT.  Verify that its first child is simple.  Must be either
-	 *  ( ALT ^( A B ) <end-of-alt> ) or ( ALT A <end-of-alt> ) or
+	 *  ( ALT ^( A B ) &lt;end-of-alt&gt; ) or ( ALT A &lt;end-of-alt&gt; ) or
 	 *  other element.
 	 *
 	 *  Ignore predicates in front and labels.
@@ -267,12 +267,12 @@
 											int outerAltNum)
 	{
 		if ( isValidSimpleElementNode(elementAST) ) {
-			GrammarAST next = (GrammarAST)elementAST.getNextSibling();
+			GrammarAST next = elementAST.getNextSibling();
 			if ( !isNextNonActionElementEOA(next)) {
 				ErrorManager.grammarWarning(ErrorManager.MSG_REWRITE_FOR_MULTI_ELEMENT_ALT,
 											grammar,
 											next.token,
-											new Integer(outerAltNum));
+											outerAltNum);
 			}
 			return;
 		}
@@ -289,14 +289,14 @@
 			case ANTLRParser.BACKTRACK_SEMPRED :
 			case ANTLRParser.GATED_SEMPRED :
 				ensureAltIsSimpleNodeOrTree(altAST,
-											(GrammarAST)elementAST.getNextSibling(),
+											elementAST.getNextSibling(),
 											outerAltNum);
 				return;
 		}
 		ErrorManager.grammarWarning(ErrorManager.MSG_REWRITE_FOR_MULTI_ELEMENT_ALT,
 									grammar,
 									elementAST.token,
-									new Integer(outerAltNum));
+									outerAltNum);
 	}
 
 	protected boolean isValidSimpleElementNode(Tree t) {
@@ -316,7 +316,7 @@
 		while ( t.getType()==ANTLRParser.ACTION ||
 				t.getType()==ANTLRParser.SEMPRED )
 		{
-			t = (GrammarAST)t.getNextSibling();
+			t = t.getNextSibling();
 		}
 		if ( t.getType()==ANTLRParser.EOA ) {
 			return true;
diff --git a/tool/src/main/java/org/antlr/tool/GrammarSemanticsMessage.java b/tool/src/main/java/org/antlr/tool/GrammarSemanticsMessage.java
index 1027182..dc1ae63 100644
--- a/tool/src/main/java/org/antlr/tool/GrammarSemanticsMessage.java
+++ b/tool/src/main/java/org/antlr/tool/GrammarSemanticsMessage.java
@@ -66,6 +66,7 @@
 		this.offendingToken = offendingToken;
 	}
 
+	@Override
 	public String toString() {
 		line = 0;
 		column = 0;
diff --git a/tool/src/main/java/org/antlr/tool/GrammarSerializerFoo.java b/tool/src/main/java/org/antlr/tool/GrammarSerializerFoo.java
index fc1afb8..d66f51e 100644
--- a/tool/src/main/java/org/antlr/tool/GrammarSerializerFoo.java
+++ b/tool/src/main/java/org/antlr/tool/GrammarSerializerFoo.java
@@ -31,23 +31,21 @@
 import org.antlr.runtime.SerializedGrammar;
 
 import java.io.*;
-import java.util.Stack;
 
 /** Serialize a grammar into a highly compressed form with
  *  only the info needed to recognize sentences.
  *  FORMAT:
  *
- *  file ::= $ANTLR<version:byte><grammartype:byte><name:string>;<numRules:short><rules>
- *  rule ::= R<rulename:string>;B<nalts:short><alts>.
- *  alt  ::= A<elems>;
- *  elem ::= t<tokentype:short> | r<ruleIndex:short> | -<char:uchar><char:uchar> | ~<tokentype> | w
+ *  file ::= $ANTLR&lt;version:byte&gt;&lt;grammartype:byte&gt;&lt;name:string&gt;;&lt;numRules:short&gt;&lt;rules&gt;
+ *  rule ::= R&lt;rulename:string&gt;;B&lt;nalts:short&gt;&lt;alts&gt;.
+ *  alt  ::= A&lt;elems&gt;;
+ *  elem ::= t&lt;tokentype:short&gt; | r&lt;ruleIndex:short&gt; | -&lt;char:uchar&gt;&lt;char:uchar&gt; | ~&lt;tokentype&gt; | w
  */
 public class GrammarSerializerFoo {
     protected DataOutputStream out;
     protected String filename;
     protected Grammar g;
 
-    protected Stack streams = new Stack();
     protected ByteArrayOutputStream altBuf;
     protected int numElementsInAlt = 0;
 
diff --git a/tool/src/main/java/org/antlr/tool/GrammarSpelunker.java b/tool/src/main/java/org/antlr/tool/GrammarSpelunker.java
index d7986ec..ddde27f 100644
--- a/tool/src/main/java/org/antlr/tool/GrammarSpelunker.java
+++ b/tool/src/main/java/org/antlr/tool/GrammarSpelunker.java
@@ -135,7 +135,7 @@
             consume();
         }
         match(";");
-        if ( importedGrammars.size()==0 ) importedGrammars = null;
+        if ( importedGrammars.isEmpty() ) importedGrammars = null;
     }
 
     public String getGrammarModifier() { return grammarModifier; }
@@ -187,21 +187,21 @@
             return null;
         }
 
-        /** NAME : LETTER+ ; // NAME is sequence of >=1 letter */
+        /** NAME : LETTER+ ; // NAME is sequence of &gt;=1 letter */
         String ID() throws IOException {
-            StringBuffer buf = new StringBuffer();
+            StringBuilder buf = new StringBuilder();
             while ( c!=EOF && isID_LETTER() ) { buf.append((char)c); consume(); }
             return buf.toString();
         }
 
         String INT() throws IOException {
-            StringBuffer buf = new StringBuffer();
+            StringBuilder buf = new StringBuilder();
             while ( c!=EOF && isDIGIT() ) { buf.append((char)c); consume(); }
             return buf.toString();
         }
 
         String STRING() throws IOException {
-            StringBuffer buf = new StringBuffer();
+            StringBuilder buf = new StringBuilder();
             consume();
             while ( c!=EOF && c!='\'' ) {
                 if ( c=='\\' ) {
diff --git a/tool/src/main/java/org/antlr/tool/GrammarSyntaxMessage.java b/tool/src/main/java/org/antlr/tool/GrammarSyntaxMessage.java
index 290cb66..0950777 100644
--- a/tool/src/main/java/org/antlr/tool/GrammarSyntaxMessage.java
+++ b/tool/src/main/java/org/antlr/tool/GrammarSyntaxMessage.java
@@ -60,6 +60,7 @@
 		this.g = grammar;
 	}
 
+	@Override
 	public String toString() {
 		line = 0;
 		column = 0;
diff --git a/tool/src/main/java/org/antlr/tool/GrammarUnreachableAltsMessage.java b/tool/src/main/java/org/antlr/tool/GrammarUnreachableAltsMessage.java
index 1c18cd5..30ed750 100644
--- a/tool/src/main/java/org/antlr/tool/GrammarUnreachableAltsMessage.java
+++ b/tool/src/main/java/org/antlr/tool/GrammarUnreachableAltsMessage.java
@@ -38,10 +38,10 @@
  */
 public class GrammarUnreachableAltsMessage extends Message {
 	public DecisionProbe probe;
-    public List alts;
+    public List<Integer> alts;
 
 	public GrammarUnreachableAltsMessage(DecisionProbe probe,
-										 List alts)
+										 List<Integer> alts)
 	{
 		super(ErrorManager.MSG_UNREACHABLE_ALTS);
 		this.probe = probe;
@@ -52,6 +52,7 @@
 		}
 	}
 
+	@Override
 	public String toString() {
 		GrammarAST decisionASTNode = probe.dfa.getDecisionASTNode();
 		line = decisionASTNode.getLine();
@@ -66,9 +67,9 @@
 		if ( probe.dfa.isTokensRuleDecision() ) {
 			// alts are token rules, convert to the names instead of numbers
 			for (int i = 0; i < alts.size(); i++) {
-				Integer altI = (Integer) alts.get(i);
+				Integer altI = alts.get(i);
 				String tokenName =
-					probe.getTokenNameForTokensRuleAlt(altI.intValue());
+					probe.getTokenNameForTokensRuleAlt(altI);
 				// reset the line/col to the token definition
 				NFAState ruleStart =
 					probe.dfa.nfa.grammar.getRuleStartState(tokenName);
diff --git a/tool/src/main/java/org/antlr/tool/Interp.java b/tool/src/main/java/org/antlr/tool/Interp.java
index 7ba49bd..71a572d 100644
--- a/tool/src/main/java/org/antlr/tool/Interp.java
+++ b/tool/src/main/java/org/antlr/tool/Interp.java
@@ -33,6 +33,7 @@
 
 import java.io.BufferedReader;
 import java.io.FileReader;
+import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -51,6 +52,7 @@
     public static class FilteringTokenStream extends CommonTokenStream {
         public FilteringTokenStream(TokenSource src) { super(src); }
         Set<Integer> hide = new HashSet<Integer>();
+		@Override
         protected void sync(int i) {
             super.sync(i);
             if ( hide.contains(get(i).getType()) ) get(i).setChannel(Token.HIDDEN_CHANNEL);
@@ -85,7 +87,7 @@
 		parser.composite.defineGrammarSymbols();
 		parser.composite.createNFAs();
 
-		List leftRecursiveRules = parser.checkAllRulesForLeftRecursion();
+		List<? extends Collection<? extends Rule>> leftRecursiveRules = parser.checkAllRulesForLeftRecursion();
 		if ( leftRecursiveRules.size()>0 ) {
 			return;
 		}
diff --git a/tool/src/main/java/org/antlr/tool/Interpreter.java b/tool/src/main/java/org/antlr/tool/Interpreter.java
index fe4e95c..298af5a 100644
--- a/tool/src/main/java/org/antlr/tool/Interpreter.java
+++ b/tool/src/main/java/org/antlr/tool/Interpreter.java
@@ -62,6 +62,7 @@
 			this.g = g;
 		}
 
+		@Override
 		public void exitRule(String grammarFileName, String ruleName) {
 			if ( !ruleName.equals(Grammar.ARTIFICIAL_TOKENS_RULENAME) ){
 				int type = g.getTokenType(ruleName);
@@ -76,6 +77,7 @@
 		this.input = input;
 	}
 
+	@Override
 	public Token nextToken() {
 		if ( grammar.type!=Grammar.LEXER ) {
 			return null;
@@ -123,13 +125,13 @@
 	 */
 	public void scan(String startRule,
 					 DebugEventListener actions,
-					 List visitedStates)
+					 List<NFAState> visitedStates)
 		throws RecognitionException
 	{
 		if ( grammar.type!=Grammar.LEXER ) {
 			return;
 		}
-		CharStream in = (CharStream)this.input;
+
 		//System.out.println("scan("+startRule+",'"+in.substring(in.index(),in.size()-1)+"')");
 		// Build NFAs/DFAs from the grammar AST if NFAs haven't been built yet
 		if ( grammar.getRuleStartState(startRule)==null ) {
@@ -142,10 +144,10 @@
 		}
 
 		// do the parse
-		Stack ruleInvocationStack = new Stack();
+		Stack<NFAState> ruleInvocationStack = new Stack<NFAState>();
 		NFAState start = grammar.getRuleStartState(startRule);
 		NFAState stop = grammar.getRuleStopState(startRule);
-		parseEngine(startRule, start, stop, in, ruleInvocationStack,
+		parseEngine(startRule, start, stop, input, ruleInvocationStack,
 					actions, visitedStates);
 	}
 
@@ -156,7 +158,7 @@
 	}
 
 	public CommonToken scan(String startRule,
-							List visitedStates)
+							List<NFAState> visitedStates)
 		throws RecognitionException
 	{
 		LexerActionGetTokenType actions = new LexerActionGetTokenType(grammar);
@@ -166,7 +168,7 @@
 
 	public void parse(String startRule,
 					  DebugEventListener actions,
-					  List visitedStates)
+					  List<NFAState> visitedStates)
 		throws RecognitionException
 	{
 		//System.out.println("parse("+startRule+")");
@@ -179,7 +181,7 @@
 			grammar.createLookaheadDFAs();
 		}
 		// do the parse
-		Stack ruleInvocationStack = new Stack();
+		Stack<NFAState> ruleInvocationStack = new Stack<NFAState>();
 		NFAState start = grammar.getRuleStartState(startRule);
 		NFAState stop = grammar.getRuleStopState(startRule);
 		parseEngine(startRule, start, stop, input, ruleInvocationStack,
@@ -192,7 +194,7 @@
 		return parse(startRule, null);
 	}
 
-	public ParseTree parse(String startRule, List visitedStates)
+	public ParseTree parse(String startRule, List<NFAState> visitedStates)
 		throws RecognitionException
 	{
 		ParseTreeBuilder actions = new ParseTreeBuilder(grammar.name);
@@ -212,9 +214,9 @@
 							   NFAState start,
 							   NFAState stop,
 							   IntStream input,
-							   Stack ruleInvocationStack,
+							   Stack<NFAState> ruleInvocationStack,
 							   DebugEventListener actions,
-							   List visitedStates)
+							   List<NFAState> visitedStates)
 		throws RecognitionException
 	{
 		NFAState s = start;
@@ -288,7 +290,7 @@
 					break;
 				}
 				// pop invoking state off the stack to know where to return to
-				NFAState invokingState = (NFAState)ruleInvocationStack.pop();
+				NFAState invokingState = ruleInvocationStack.pop();
 				RuleClosureTransition invokingTransition =
 						(RuleClosureTransition)invokingState.transition[0];
 				// move to node after state that invoked this rule
@@ -446,6 +448,7 @@
 			cs.getLine()+":"+cs.getCharPositionInLine()+" "+re);
 	}
 
+	@Override
 	public String getSourceName() {
 		return input.getSourceName();
 	}
diff --git a/tool/src/main/java/org/antlr/tool/LeftRecursionCyclesMessage.java b/tool/src/main/java/org/antlr/tool/LeftRecursionCyclesMessage.java
index 412978e..98e969c 100644
--- a/tool/src/main/java/org/antlr/tool/LeftRecursionCyclesMessage.java
+++ b/tool/src/main/java/org/antlr/tool/LeftRecursionCyclesMessage.java
@@ -36,13 +36,14 @@
  *  invoked when a decision DFA construction finds a problem in closure.
  */
 public class LeftRecursionCyclesMessage extends Message {
-	public Collection cycles;
+	public Collection<? extends Collection<? extends Rule>> cycles;
 
-	public LeftRecursionCyclesMessage(Collection cycles) {
+	public LeftRecursionCyclesMessage(Collection<? extends Collection<? extends Rule>> cycles) {
 		super(ErrorManager.MSG_LEFT_RECURSION_CYCLES);
 		this.cycles = cycles;
 	}
 
+	@Override
 	public String toString() {
 		ST st = getMessageTemplate();
 		st.add("listOfCycles", cycles);
diff --git a/tool/src/main/java/org/antlr/tool/LeftRecursiveRuleAnalyzer.java b/tool/src/main/java/org/antlr/tool/LeftRecursiveRuleAnalyzer.java
index fcbf7db..61e1891 100644
--- a/tool/src/main/java/org/antlr/tool/LeftRecursiveRuleAnalyzer.java
+++ b/tool/src/main/java/org/antlr/tool/LeftRecursiveRuleAnalyzer.java
@@ -42,7 +42,7 @@
 
 	public void loadPrecRuleTemplates() {
 		recRuleTemplates =
-			new STGroupFile(CodeGenerator.classpathTemplateRootDirectoryName+
+			new ToolSTGroupFile(CodeGenerator.classpathTemplateRootDirectoryName+
 							"/LeftRecursiveRules.stg");
 		if ( !recRuleTemplates.isDefined("recRuleName") ) {
 			ErrorManager.error(ErrorManager.MSG_MISSING_CODE_GEN_TEMPLATES,
@@ -108,7 +108,7 @@
 		//System.out.println("binaryAlt " + alt + ": " + altText + ", rewrite=" + rewriteText);
 	}
 
-	/** Convert e ? e : e  ->  ? e : e_[nextPrec] */
+	/** Convert e ? e : e  &rarr;  ? e : e_[nextPrec] */
 	@Override
 	public void ternaryAlt(GrammarAST altTree, GrammarAST rewriteTree, int alt) {
 		altTree = GrammarAST.dupTree(altTree);
@@ -222,8 +222,9 @@
 		opPrecRuleAlts.putAll(binaryAlts);
 		opPrecRuleAlts.putAll(ternaryAlts);
 		opPrecRuleAlts.putAll(suffixAlts);
-		for (int alt : opPrecRuleAlts.keySet()) {
-			String altText = opPrecRuleAlts.get(alt);
+		for (Map.Entry<Integer, String> entry : opPrecRuleAlts.entrySet()) {
+			int alt = entry.getKey();
+			String altText = entry.getValue();
 			ST altST = recRuleTemplates.getInstanceOf("recRuleAlt");
 			ST predST =
 				generator.getTemplates().getInstanceOf("recRuleAltPredicate");
diff --git a/tool/src/main/java/org/antlr/tool/NFAFactory.java b/tool/src/main/java/org/antlr/tool/NFAFactory.java
index de52287..93db958 100644
--- a/tool/src/main/java/org/antlr/tool/NFAFactory.java
+++ b/tool/src/main/java/org/antlr/tool/NFAFactory.java
@@ -41,7 +41,7 @@
  *
  *  TODO: add an optimization that reduces number of states and transitions
  *  will help with speed of conversion and make it easier to view NFA.  For
- *  example, o-A->o-->o-B->o should be o-A->o-B->o
+ *  example, o-A-&gt;o--&gt;o-B-&gt;o should be o-A-&gt;o-B-&gt;o
  */
 public class NFAFactory {
 	/** This factory is attached to a specifc NFA that it is building.
@@ -114,7 +114,7 @@
 		}
 	}
 
-	/** From label A build Graph o-A->o */
+	/** From label A build Graph o-A-&gt;o */
 	public StateCluster build_Atom(int label, GrammarAST associatedAST) {
 		NFAState left = newState();
 		NFAState right = newState();
@@ -130,7 +130,7 @@
 		return build_Atom(tokenType, atomAST);
 	}
 
-	/** From set build single edge graph o->o-set->o.  To conform to
+	/** From set build single edge graph o-&gt;o-set-&gt;o.  To conform to
      *  what an alt block looks like, must have extra state on left.
      */
 	public StateCluster build_Set(IntSet set, GrammarAST associatedAST) {
@@ -170,14 +170,14 @@
         return g;
     }
 
-	/** From char 'c' build StateCluster o-intValue(c)->o
+	/** From char 'c' build StateCluster o-intValue(c)-&gt;o
 	 */
 	public StateCluster build_CharLiteralAtom(GrammarAST charLiteralAST) {
         int c = Grammar.getCharValueFromGrammarCharLiteral(charLiteralAST.getText());
 		return build_Atom(c, charLiteralAST);
 	}
 
-	/** From char 'c' build StateCluster o-intValue(c)->o
+	/** From char 'c' build StateCluster o-intValue(c)-&gt;o
 	 *  can include unicode spec likes '\u0024' later.  Accepts
 	 *  actual unicode 16-bit now, of course, by default.
      *  TODO not supplemental char clean!
@@ -191,7 +191,7 @@
     /** For a non-lexer, just build a simple token reference atom.
      *  For a lexer, a string is a sequence of char to match.  That is,
      *  "fog" is treated as 'f' 'o' 'g' not as a single transition in
-     *  the DFA.  Machine== o-'f'->o-'o'->o-'g'->o and has n+1 states
+     *  the DFA.  Machine== o-'f'-&gt;o-'o'-&gt;o-'g'-&gt;o and has n+1 states
      *  for n characters.
      */
     public StateCluster build_StringLiteralAtom(GrammarAST stringLiteralAST) {
@@ -217,16 +217,16 @@
 
     /** For reference to rule r, build
      *
-     *  o-e->(r)  o
+     *  o-e-&gt;(r)  o
      *
      *  where (r) is the start of rule r and the trailing o is not linked
      *  to from rule ref state directly (it's done thru the transition(0)
      *  RuleClosureTransition.
      *
      *  If the rule r is just a list of tokens, it's block will be just
-     *  a set on an edge o->o->o-set->o->o->o, could inline it rather than doing
+     *  a set on an edge o-&gt;o-&gt;o-set-&gt;o-&gt;o-&gt;o, could inline it rather than doing
      *  the rule reference, but i'm not doing this yet as I'm not sure
-     *  it would help much in the NFA->DFA construction.
+     *  it would help much in the NFA&rarr;DFA construction.
      *
      *  TODO add to codegen: collapse alt blks that are sets into single matchSet
      */
@@ -242,7 +242,7 @@
         return g;
     }
 
-    /** From an empty alternative build StateCluster o-e->o */
+    /** From an empty alternative build StateCluster o-e-&gt;o */
     public StateCluster build_Epsilon() {
         NFAState left = newState();
         NFAState right = newState();
@@ -291,10 +291,9 @@
 	 *  not invoked by another rule (they can only be invoked from outside).
 	 *  These are the start rules.
      */
-    public int build_EOFStates(Collection rules) {
+    public int build_EOFStates(Collection<Rule> rules) {
 		int numberUnInvokedRules = 0;
-        for (Iterator iterator = rules.iterator(); iterator.hasNext();) {
-			Rule r = (Rule) iterator.next();
+        for (Rule r : rules) {
 			NFAState endNFAState = r.stopState;
             // Is this rule a start symbol?  (no follow links)
 			if ( endNFAState.transition[0] ==null ) {
@@ -328,7 +327,7 @@
 		endNFAState.addTransition(toEnd);
 	}
 
-    /** From A B build A-e->B (that is, build an epsilon arc from right
+    /** From A B build A-e-&gt;B (that is, build an epsilon arc from right
      *  of A to left of B).
      *
      *  As a convenience, return B if A is null or return A if B is null.
@@ -347,7 +346,7 @@
 
 	/** From a set ('a'|'b') build
      *
-     *  o->o-'a'..'b'->o->o (last NFAState is blockEndNFAState pointed to by all alts)
+     *  o-&gt;o-'a'..'b'-&gt;o-&gt;o (last NFAState is blockEndNFAState pointed to by all alts)
 	 */
 	public StateCluster build_AlternativeBlockFromSet(StateCluster set) {
 		if ( set==null ) {
@@ -363,13 +362,13 @@
 
 	/** From A|B|..|Z alternative block build
      *
-     *  o->o-A->o->o (last NFAState is blockEndNFAState pointed to by all alts)
+     *  o-&gt;o-A-&gt;o-&gt;o (last NFAState is blockEndNFAState pointed to by all alts)
      *  |          ^
-     *  o->o-B->o--|
+     *  o-&gt;o-B-&gt;o--|
      *  |          |
      *  ...        |
      *  |          |
-     *  o->o-Z->o--|
+     *  o-&gt;o-Z-&gt;o--|
      *
      *  So every alternative gets begin NFAState connected by epsilon
      *  and every alt right side points at a block end NFAState.  There is a
@@ -380,21 +379,21 @@
      *  begin/end.
      *
      *  Special case: if just a list of tokens/chars/sets, then collapse
-     *  to a single edge'd o-set->o graph.
+     *  to a single edge'd o-set-&gt;o graph.
      *
      *  Set alt number (1..n) in the left-Transition NFAState.
      */
-    public StateCluster build_AlternativeBlock(List alternativeStateClusters)
+    public StateCluster build_AlternativeBlock(List<StateCluster> alternativeStateClusters)
     {
-        StateCluster result = null;
-        if ( alternativeStateClusters==null || alternativeStateClusters.size()==0 ) {
+        StateCluster result;
+        if ( alternativeStateClusters==null || alternativeStateClusters.isEmpty() ) {
             return null;
         }
 
 		// single alt case
 		if ( alternativeStateClusters.size()==1 ) {
 			// single alt, no decision, just return only alt state cluster
-			StateCluster g = (StateCluster)alternativeStateClusters.get(0);
+			StateCluster g = alternativeStateClusters.get(0);
 			NFAState startOfAlt = newState(); // must have this no matter what
 			transitionBetweenStates(startOfAlt, g.left, Label.EPSILON);
 
@@ -411,8 +410,7 @@
         NFAState blockEndNFAState = newState();
         blockEndNFAState.setDescription("end block");
         int altNum = 1;
-        for (Iterator iter = alternativeStateClusters.iterator(); iter.hasNext();) {
-            StateCluster g = (StateCluster) iter.next();
+        for (StateCluster g : alternativeStateClusters) {
             // add begin NFAState for this alt connected by epsilon
             NFAState left = newState();
             left.setDescription("alt "+altNum+" of ()");
@@ -444,14 +442,14 @@
 
     /** From (A)? build either:
      *
-	 *  o--A->o
+	 *  o--A-&gt;o
 	 *  |     ^
-	 *  o---->|
+	 *  o----&gt;|
      *
      *  or, if A is a block, just add an empty alt to the end of the block
      */
     public StateCluster build_Aoptional(StateCluster A) {
-        StateCluster g = null;
+        StateCluster g;
         int n = nfa.grammar.getNumberOfAltsForDecisionNFA(A.left);
         if ( n==1 ) {
             // no decision, just wrap in an optional path
@@ -460,7 +458,7 @@
 			decisionState.setDescription("only alt of ()? block");
 			NFAState emptyAlt = newState();
             emptyAlt.setDescription("epsilon path of ()? block");
-            NFAState blockEndNFAState = null;
+            NFAState blockEndNFAState;
 			blockEndNFAState = newState();
 			transitionBetweenStates(A.right, blockEndNFAState, Label.EPSILON);
 			blockEndNFAState.setDescription("end ()? block");
@@ -498,7 +496,7 @@
 	 *
      *     |---|    (Transition 2 from A.right points at alt 1)
 	 *     v   |    (follow of loop is Transition 1)
-     *  o->o-A-o->o
+     *  o-&gt;o-A-o-&gt;o
      *
      *  Meaning that the last NFAState in A points back to A's left Transition NFAState
      *  and we add a new begin/end NFAState.  A can be single alternative or
@@ -540,7 +538,7 @@
      *
 	 *     |---|
 	 *     v   |
-	 *  o->o-A-o--o (Transition 2 from block end points at alt 1; follow is Transition 1)
+	 *  o-&gt;o-A-o--o (Transition 2 from block end points at alt 1; follow is Transition 1)
      *  |         ^
      *  o---------| (optional branch is 2nd alt of optional block containing A+)
      *
@@ -700,7 +698,7 @@
         // make optional . alt
         StateCluster optionalNodeAlt = build_Wildcard(associatedAST);
 
-        List alts = new ArrayList();
+        List<StateCluster> alts = new ArrayList<StateCluster>();
         alts.add(wildRoot);
         alts.add(optionalNodeAlt);
         StateCluster blk = build_AlternativeBlock(alts);
diff --git a/tool/src/main/java/org/antlr/tool/NameSpaceChecker.java b/tool/src/main/java/org/antlr/tool/NameSpaceChecker.java
index 6c6dbb5..8a926b5 100644
--- a/tool/src/main/java/org/antlr/tool/NameSpaceChecker.java
+++ b/tool/src/main/java/org/antlr/tool/NameSpaceChecker.java
@@ -49,17 +49,15 @@
 			}
 			// walk all labels for Rule r
 			if ( r.labelNameSpace!=null ) {
-				Iterator it = r.labelNameSpace.values().iterator();
-				while ( it.hasNext() ) {
-					Grammar.LabelElementPair pair = (Grammar.LabelElementPair) it.next();
+				for (Grammar.LabelElementPair pair : r.labelNameSpace.values()) {
 					checkForLabelConflict(r, pair.label);
 				}
 			}
 			// walk rule scope attributes for Rule r
 			if ( r.ruleScope!=null ) {
-				List attributes = r.ruleScope.getAttributes();
+				List<Attribute> attributes = r.ruleScope.getAttributes();
 				for (int j = 0; j < attributes.size(); j++) {
-					Attribute attribute = (Attribute) attributes.get(j);
+					Attribute attribute = attributes.get(j);
 					checkForRuleScopeAttributeConflict(r, attribute);
 				}
 			}
@@ -67,9 +65,7 @@
 			checkForRuleArgumentAndReturnValueConflicts(r);
 		}
 		// check all global scopes against tokens
-		Iterator it = grammar.getGlobalScopes().values().iterator();
-		while (it.hasNext()) {
-			AttributeScope scope = (AttributeScope) it.next();
+		for (AttributeScope scope : grammar.getGlobalScopes().values()) {
 			checkForGlobalScopeTokenConflict(scope);
 		}
 		// check for missing rule, tokens
@@ -78,10 +74,9 @@
 
 	protected void checkForRuleArgumentAndReturnValueConflicts(Rule r) {
 		if ( r.returnScope!=null ) {
-			Set conflictingKeys = r.returnScope.intersection(r.parameterScope);
+			Set<String> conflictingKeys = r.returnScope.intersection(r.parameterScope);
 			if (conflictingKeys!=null) {
-				for (Iterator it = conflictingKeys.iterator(); it.hasNext();) {
-					String key = (String) it.next();
+				for (String key : conflictingKeys) {
 					ErrorManager.grammarError(
 						ErrorManager.MSG_ARG_RETVAL_CONFLICT,
 						grammar,
@@ -125,8 +120,7 @@
 	 */
 	protected void lookForReferencesToUndefinedSymbols() {
 		// for each rule ref, ask if there is a rule definition
-		for (Iterator iter = grammar.ruleRefs.iterator(); iter.hasNext();) {
-			GrammarAST refAST = (GrammarAST)iter.next();
+		for (GrammarAST refAST : grammar.ruleRefs) {
 			Token tok = refAST.token;
 			String ruleName = tok.getText();
 			Rule localRule = grammar.getLocallyDefinedRule(ruleName);
@@ -145,8 +139,7 @@
 		if ( grammar.type==Grammar.COMBINED ) {
 			// if we're a combined grammar, we know which token IDs have no
 			// associated lexer rule.
-			for (Iterator iter = grammar.tokenIDRefs.iterator(); iter.hasNext();) {
-				Token tok = (Token) iter.next();
+			for (Token tok : grammar.tokenIDRefs) {
 				String tokenID = tok.getText();
 				if ( !grammar.composite.lexerRules.contains(tokenID) &&
 					 grammar.getTokenType(tokenID)!=Label.EOF )
@@ -159,8 +152,7 @@
 			}
 		}
 		// check scopes and scoped rule refs
-		for (Iterator it = grammar.scopedRuleRefs.iterator(); it.hasNext();) {
-			GrammarAST scopeAST = (GrammarAST)it.next(); // ^(DOT ID atom)
+		for (GrammarAST scopeAST : grammar.scopedRuleRefs) { // ^(DOT ID atom)
 			Grammar scopeG = grammar.composite.getGrammar(scopeAST.getText());
 			GrammarAST refAST = (GrammarAST)scopeAST.getChild(1);
 			String ruleName = refAST.getText();
@@ -249,7 +241,7 @@
 	 */
 	public boolean checkForLabelTypeMismatch(Rule r, Token label, int type) {
 		Grammar.LabelElementPair prevLabelPair =
-			(Grammar.LabelElementPair)r.labelNameSpace.get(label.getText());
+			r.labelNameSpace.get(label.getText());
 		if ( prevLabelPair!=null ) {
 			// label already defined; if same type, no problem
 			if ( prevLabelPair.type != type ) {
diff --git a/tool/src/main/java/org/antlr/tool/NonRegularDecisionMessage.java b/tool/src/main/java/org/antlr/tool/NonRegularDecisionMessage.java
index 169f99a..2529a06 100644
--- a/tool/src/main/java/org/antlr/tool/NonRegularDecisionMessage.java
+++ b/tool/src/main/java/org/antlr/tool/NonRegularDecisionMessage.java
@@ -46,6 +46,7 @@
 		this.altsWithRecursion = altsWithRecursion;
 	}
 
+	@Override
 	public String toString() {
 		GrammarAST decisionASTNode = probe.dfa.getDecisionASTNode();
 		line = decisionASTNode.getLine();
@@ -58,7 +59,7 @@
 		ST st = getMessageTemplate();
 		String ruleName = probe.dfa.getNFADecisionStartState().enclosingRule.name;
 		st.add("ruleName", ruleName);
-		List sortedAlts = new ArrayList();
+		List<Integer> sortedAlts = new ArrayList<Integer>();
 		sortedAlts.addAll(altsWithRecursion);
 		Collections.sort(sortedAlts); // make sure it's 1, 2, ...
 		st.add("alts", sortedAlts);
diff --git a/tool/src/main/java/org/antlr/tool/RandomPhrase.java b/tool/src/main/java/org/antlr/tool/RandomPhrase.java
index fff6086..bf154f3 100644
--- a/tool/src/main/java/org/antlr/tool/RandomPhrase.java
+++ b/tool/src/main/java/org/antlr/tool/RandomPhrase.java
@@ -38,6 +38,7 @@
 import java.io.BufferedReader;
 import java.io.FileReader;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 import java.util.Random;
 import java.util.Stack;
@@ -70,9 +71,9 @@
 		NFAState state = g.getRuleStartState(startRule);
 		NFAState stopState = g.getRuleStopState(startRule);
 
-		Stack ruleInvocationStack = new Stack();
+		Stack<NFAState> ruleInvocationStack = new Stack<NFAState>();
 		while ( true ) {
-			if ( state==stopState && ruleInvocationStack.size()==0 ) {
+			if ( state==stopState && ruleInvocationStack.isEmpty() ) {
 				break;
 			}
 			if ( debug ) System.out.println("state "+state);
@@ -82,7 +83,7 @@
 			}
 			// end of rule node
 			if ( state.isAcceptState() ) {
-				NFAState invokingState = (NFAState)ruleInvocationStack.pop();
+				NFAState invokingState = ruleInvocationStack.pop();
 				if ( debug ) System.out.println("pop invoking state "+invokingState);
 				//System.out.println("leave "+state.enclosingRule.name);
 				RuleClosureTransition invokingTransition =
@@ -166,7 +167,7 @@
 			parser.composite.defineGrammarSymbols();
 			parser.composite.createNFAs();
 
-			List leftRecursiveRules = parser.checkAllRulesForLeftRecursion();
+			List<? extends Collection<? extends Rule>> leftRecursiveRules = parser.checkAllRulesForLeftRecursion();
 			if ( leftRecursiveRules.size()>0 ) {
 				return;
 			}
@@ -197,15 +198,15 @@
 			randomPhrase(parser, tokenTypes, startRule);
 			System.out.println("token types="+tokenTypes);
 			for (int i = 0; i < tokenTypes.size(); i++) {
-				Integer ttypeI = (Integer) tokenTypes.get(i);
-				int ttype = ttypeI.intValue();
+				Integer ttypeI = tokenTypes.get(i);
+				int ttype = ttypeI;
 				String ttypeDisplayName = parser.getTokenDisplayName(ttype);
 				if ( Character.isUpperCase(ttypeDisplayName.charAt(0)) ) {
 					List<Integer> charsInToken = new ArrayList<Integer>(10);
 					randomPhrase(lexer, charsInToken, ttypeDisplayName);
 					System.out.print(" ");
 					for (int j = 0; j < charsInToken.size(); j++) {
-						java.lang.Integer cI = (java.lang.Integer) charsInToken.get(j);
+						Integer cI = charsInToken.get(j);
 						System.out.print((char)cI.intValue());
 					}
 				}
diff --git a/tool/src/main/java/org/antlr/tool/RecursionOverflowMessage.java b/tool/src/main/java/org/antlr/tool/RecursionOverflowMessage.java
index 50e72c6..fdb3557 100644
--- a/tool/src/main/java/org/antlr/tool/RecursionOverflowMessage.java
+++ b/tool/src/main/java/org/antlr/tool/RecursionOverflowMessage.java
@@ -29,6 +29,8 @@
 
 import org.antlr.analysis.DFAState;
 import org.antlr.analysis.DecisionProbe;
+import org.antlr.analysis.Label;
+import org.antlr.analysis.NFAState;
 import org.stringtemplate.v4.ST;
 
 import java.util.Collection;
@@ -41,14 +43,14 @@
 	public DecisionProbe probe;
 	public DFAState sampleBadState;
 	public int alt;
-	public Collection targetRules;
-	public Collection callSiteStates;
+	public Collection<String> targetRules;
+	public Collection<? extends Collection<? extends NFAState>> callSiteStates;
 
 	public RecursionOverflowMessage(DecisionProbe probe,
 									DFAState sampleBadState,
 									int alt,
-									Collection targetRules,
-									Collection callSiteStates)
+									Collection<String> targetRules,
+									Collection<? extends Collection<? extends NFAState>> callSiteStates)
 	{
 		super(ErrorManager.MSG_RECURSION_OVERLOW);
 		this.probe = probe;
@@ -58,6 +60,7 @@
 		this.callSiteStates = callSiteStates;
 	}
 
+	@Override
 	public String toString() {
 		GrammarAST decisionASTNode = probe.dfa.getDecisionASTNode();
 		line = decisionASTNode.getLine();
@@ -72,7 +75,7 @@
 		st.add("alt", alt);
 		st.add("callSiteStates", callSiteStates);
 
-		List labels =
+		List<Label> labels =
 			probe.getSampleNonDeterministicInputSequence(sampleBadState);
 		String input = probe.getInputSequenceDisplay(labels);
 		st.add("input", input);
diff --git a/tool/src/main/java/org/antlr/tool/Rule.java b/tool/src/main/java/org/antlr/tool/Rule.java
index 0c141f3..915c215 100644
--- a/tool/src/main/java/org/antlr/tool/Rule.java
+++ b/tool/src/main/java/org/antlr/tool/Rule.java
@@ -37,6 +37,11 @@
 
 /** Combine the info associated with a rule. */
 public class Rule {
+	public static final boolean supportsLabelOptimization;
+	static {
+		supportsLabelOptimization = false;
+	}
+
 	public String name;
 	public int index;
 	public String modifier;
@@ -44,10 +49,10 @@
 	public NFAState stopState;
 
 	/** This rule's options */
-	protected Map options;
+	protected Map<String, Object> options;
 
-	public static final Set legalOptions =
-			new HashSet() {
+	public static final Set<String> legalOptions =
+			new HashSet<String>() {
                 {
                     add("k"); add("greedy"); add("memoize");
                     add("backtrack");
@@ -74,31 +79,31 @@
 	public AttributeScope ruleScope;
 
 	/** A list of scope names (String) used by this rule */
-	public List useScopes;
+	public List<String> useScopes;
 
     /** Exceptions that this rule can throw */
     public Set<String> throwsSpec;
 
     /** A list of all LabelElementPair attached to tokens like id=ID */
-    public LinkedHashMap tokenLabels;
+    public LinkedHashMap<String, Grammar.LabelElementPair> tokenLabels;
 
     /** A list of all LabelElementPair attached to tokens like x=. in tree grammar */
-    public LinkedHashMap wildcardTreeLabels;
+    public LinkedHashMap<String, Grammar.LabelElementPair> wildcardTreeLabels;
 
     /** A list of all LabelElementPair attached to tokens like x+=. in tree grammar */
-    public LinkedHashMap wildcardTreeListLabels;
+    public LinkedHashMap<String, Grammar.LabelElementPair> wildcardTreeListLabels;
 
 	/** A list of all LabelElementPair attached to single char literals like x='a' */
-	public LinkedHashMap charLabels;
+	public LinkedHashMap<String, Grammar.LabelElementPair> charLabels;
 
 	/** A list of all LabelElementPair attached to rule references like f=field */
-	public LinkedHashMap ruleLabels;
+	public LinkedHashMap<String, Grammar.LabelElementPair> ruleLabels;
 
 	/** A list of all Token list LabelElementPair like ids+=ID */
-	public LinkedHashMap tokenListLabels;
+	public LinkedHashMap<String, Grammar.LabelElementPair> tokenListLabels;
 
 	/** A list of all rule ref list LabelElementPair like ids+=expr */
-	public LinkedHashMap ruleListLabels;
+	public LinkedHashMap<String, Grammar.LabelElementPair> ruleListLabels;
 
 	/** All labels go in here (plus being split per the above lists) to
 	 *  catch dup label and label type mismatches.
@@ -113,8 +118,8 @@
 	 *  for errors.  A better name is probably namedActions, but I don't
 	 *  want everyone to have to change their code gen templates now.
 	 */
-	protected Map<String, GrammarAST> actions =
-		new HashMap<String, GrammarAST>();
+	protected Map<String, Object> actions =
+		new HashMap<String, Object>();
 
 	/** Track all executable actions other than named actions like @init.
 	 *  Also tracks exception handlers, predicates, and rewrite rewrites.
@@ -125,7 +130,7 @@
 
 	public int numberOfAlts;
 
-	/** Each alt has a Map<tokenRefName,List<tokenRefAST>>; range 1..numberOfAlts.
+	/** Each alt has a Map&lt;tokenRefName,List&lt;tokenRefAST&gt;&gt;; range 1..numberOfAlts.
 	 *  So, if there are 3 ID refs in a rule's alt number 2, you'll have
 	 *  altToTokenRef[2].get("ID").size()==3.  This is used to see if $ID is ok.
 	 *  There must be only one ID reference in the alt for $ID to be ok in
@@ -138,7 +143,7 @@
 	 */
 	protected Map<String, List<GrammarAST>>[] altToTokenRefMap;
 
-	/** Each alt has a Map<ruleRefName,List<ruleRefAST>>; range 1..numberOfAlts
+	/** Each alt has a Map&lt;ruleRefName,List&lt;ruleRefAST&gt;&gt;; range 1..numberOfAlts
 	 *  So, if there are 3 expr refs in a rule's alt number 2, you'll have
 	 *  altToRuleRef[2].get("expr").size()==3.  This is used to see if $expr is ok.
 	 *  There must be only one expr reference in the alt for $expr to be ok in
@@ -157,6 +162,7 @@
 
 	public boolean imported = false;
 
+	@SuppressWarnings("unchecked")
 	public Rule(Grammar grammar,
 				String ruleName,
 				int ruleIndex,
@@ -167,8 +173,8 @@
 		this.numberOfAlts = numberOfAlts;
 		this.grammar = grammar;
 		throwsSpec = new HashSet<String>();
-		altToTokenRefMap = new Map[numberOfAlts+1];
-		altToRuleRefMap = new Map[numberOfAlts+1];
+		altToTokenRefMap = (Map<String, List<GrammarAST>>[])new Map<?, ?>[numberOfAlts+1];
+		altToRuleRefMap = (Map<String, List<GrammarAST>>[])new Map<?, ?>[numberOfAlts+1];
 		for (int alt=1; alt<=numberOfAlts; alt++) {
 			altToTokenRefMap[alt] = new HashMap<String, List<GrammarAST>>();
 			altToRuleRefMap[alt] = new HashMap<String, List<GrammarAST>>();
@@ -187,60 +193,60 @@
 		labelNameSpace.put(label.getText(), pair);
 		switch ( type ) {
             case Grammar.TOKEN_LABEL :
-                if ( tokenLabels==null ) tokenLabels = new LinkedHashMap();
+                if ( tokenLabels==null ) tokenLabels = new LinkedHashMap<String, Grammar.LabelElementPair>();
                 tokenLabels.put(label.getText(), pair);
                 break;
             case Grammar.WILDCARD_TREE_LABEL :
-                if ( wildcardTreeLabels==null ) wildcardTreeLabels = new LinkedHashMap();
+                if ( wildcardTreeLabels==null ) wildcardTreeLabels = new LinkedHashMap<String, Grammar.LabelElementPair>();
                 wildcardTreeLabels.put(label.getText(), pair);
                 break;
             case Grammar.WILDCARD_TREE_LIST_LABEL :
-                if ( wildcardTreeListLabels==null ) wildcardTreeListLabels = new LinkedHashMap();
+                if ( wildcardTreeListLabels==null ) wildcardTreeListLabels = new LinkedHashMap<String, Grammar.LabelElementPair>();
                 wildcardTreeListLabels.put(label.getText(), pair);
                 break;
 			case Grammar.RULE_LABEL :
-				if ( ruleLabels==null ) ruleLabels = new LinkedHashMap();
+				if ( ruleLabels==null ) ruleLabels = new LinkedHashMap<String, Grammar.LabelElementPair>();
 				ruleLabels.put(label.getText(), pair);
 				break;
 			case Grammar.TOKEN_LIST_LABEL :
-				if ( tokenListLabels==null ) tokenListLabels = new LinkedHashMap();
+				if ( tokenListLabels==null ) tokenListLabels = new LinkedHashMap<String, Grammar.LabelElementPair>();
 				tokenListLabels.put(label.getText(), pair);
 				break;
 			case Grammar.RULE_LIST_LABEL :
-				if ( ruleListLabels==null ) ruleListLabels = new LinkedHashMap();
+				if ( ruleListLabels==null ) ruleListLabels = new LinkedHashMap<String, Grammar.LabelElementPair>();
 				ruleListLabels.put(label.getText(), pair);
 				break;
 			case Grammar.CHAR_LABEL :
-				if ( charLabels==null ) charLabels = new LinkedHashMap();
+				if ( charLabels==null ) charLabels = new LinkedHashMap<String, Grammar.LabelElementPair>();
 				charLabels.put(label.getText(), pair);
 				break;
 		}
 	}
 
 	public Grammar.LabelElementPair getLabel(String name) {
-		return (Grammar.LabelElementPair)labelNameSpace.get(name);
+		return labelNameSpace.get(name);
 	}
 
 	public Grammar.LabelElementPair getTokenLabel(String name) {
 		Grammar.LabelElementPair pair = null;
 		if ( tokenLabels!=null ) {
-			return (Grammar.LabelElementPair)tokenLabels.get(name);
+			return tokenLabels.get(name);
 		}
 		return pair;
 	}
 
-	public Map getRuleLabels() {
+	public Map<String, Grammar.LabelElementPair> getRuleLabels() {
 		return ruleLabels;
 	}
 
-	public Map getRuleListLabels() {
+	public Map<String, Grammar.LabelElementPair> getRuleListLabels() {
 		return ruleListLabels;
 	}
 
 	public Grammar.LabelElementPair getRuleLabel(String name) {
 		Grammar.LabelElementPair pair = null;
 		if ( ruleLabels!=null ) {
-			return (Grammar.LabelElementPair)ruleLabels.get(name);
+			return ruleLabels.get(name);
 		}
 		return pair;
 	}
@@ -248,7 +254,7 @@
 	public Grammar.LabelElementPair getTokenListLabel(String name) {
 		Grammar.LabelElementPair pair = null;
 		if ( tokenListLabels!=null ) {
-			return (Grammar.LabelElementPair)tokenListLabels.get(name);
+			return tokenListLabels.get(name);
 		}
 		return pair;
 	}
@@ -256,7 +262,7 @@
 	public Grammar.LabelElementPair getRuleListLabel(String name) {
 		Grammar.LabelElementPair pair = null;
 		if ( ruleListLabels!=null ) {
-			return (Grammar.LabelElementPair)ruleListLabels.get(name);
+			return ruleListLabels.get(name);
 		}
 		return pair;
 	}
@@ -268,40 +274,40 @@
 	 *  token IDs to check for token IDs without corresponding lexer rules.
 	 */
 	public void trackTokenReferenceInAlt(GrammarAST refAST, int outerAltNum) {
-		List refs = (List)altToTokenRefMap[outerAltNum].get(refAST.getText());
+		List<GrammarAST> refs = altToTokenRefMap[outerAltNum].get(refAST.getText());
 		if ( refs==null ) {
-			refs = new ArrayList();
+			refs = new ArrayList<GrammarAST>();
 			altToTokenRefMap[outerAltNum].put(refAST.getText(), refs);
 		}
 		refs.add(refAST);
 	}
 
-	public List getTokenRefsInAlt(String ref, int outerAltNum) {
+	public List<GrammarAST> getTokenRefsInAlt(String ref, int outerAltNum) {
 		if ( altToTokenRefMap[outerAltNum]!=null ) {
-			List tokenRefASTs = (List)altToTokenRefMap[outerAltNum].get(ref);
+			List<GrammarAST> tokenRefASTs = altToTokenRefMap[outerAltNum].get(ref);
 			return tokenRefASTs;
 		}
 		return null;
 	}
 
 	public void trackRuleReferenceInAlt(GrammarAST refAST, int outerAltNum) {
-		List refs = (List)altToRuleRefMap[outerAltNum].get(refAST.getText());
+		List<GrammarAST> refs = altToRuleRefMap[outerAltNum].get(refAST.getText());
 		if ( refs==null ) {
-			refs = new ArrayList();
+			refs = new ArrayList<GrammarAST>();
 			altToRuleRefMap[outerAltNum].put(refAST.getText(), refs);
 		}
 		refs.add(refAST);
 	}
 
-	public List getRuleRefsInAlt(String ref, int outerAltNum) {
+	public List<GrammarAST> getRuleRefsInAlt(String ref, int outerAltNum) {
 		if ( altToRuleRefMap[outerAltNum]!=null ) {
-			List ruleRefASTs = (List)altToRuleRefMap[outerAltNum].get(ref);
+			List<GrammarAST> ruleRefASTs = altToRuleRefMap[outerAltNum].get(ref);
 			return ruleRefASTs;
 		}
 		return null;
 	}
 
-	public Set getTokenRefsInAlt(int altNum) {
+	public Set<String> getTokenRefsInAlt(int altNum) {
 		return altToTokenRefMap[altNum].keySet();
 	}
 
@@ -310,7 +316,7 @@
 	 *  token types for which the rule needs a list of tokens.  This
 	 *  is called from the rule template not directly by the code generator.
 	 */
-	public Set getAllTokenRefsInAltsWithRewrites() {
+	public Set<String> getAllTokenRefsInAltsWithRewrites() {
 		String output = (String)grammar.getOption("output");
 		Set<String> tokens = new HashSet<String>();
 		if ( output==null || !output.equals("AST") ) {
@@ -332,7 +338,7 @@
 		return tokens;
 	}
 
-	public Set getRuleRefsInAlt(int outerAltNum) {
+	public Set<String> getRuleRefsInAlt(int outerAltNum) {
 		return altToRuleRefMap[outerAltNum].keySet();
 	}
 
@@ -340,11 +346,11 @@
 	 *  left-hand-side; so we need Lists.  This is a unique list of all
 	 *  rule results for which the rule needs a list of results.
 	 */
-	public Set getAllRuleRefsInAltsWithRewrites() {
-		Set rules = new HashSet();
+	public Set<String> getAllRuleRefsInAltsWithRewrites() {
+		Set<String> rules = new HashSet<String>();
 		for (int i = 1; i <= numberOfAlts; i++) {
 			if ( hasRewrite(i) ) {
-				Map m = altToRuleRefMap[i];
+				Map<String, ?> m = altToRuleRefMap[i];
 				rules.addAll(m.keySet());
 			}
 		}
@@ -358,7 +364,7 @@
 	public boolean hasRewrite(int i) {
 		GrammarAST blk = tree.findFirstType(ANTLRParser.BLOCK);
 		GrammarAST alt = blk.getBlockALT(i);
-		GrammarAST rew = (GrammarAST)alt.getNextSibling();
+		GrammarAST rew = alt.getNextSibling();
 		if ( rew!=null && rew.getType()==ANTLRParser.REWRITES ) return true;
 		if ( alt.findFirstType(ANTLRParser.REWRITES)!=null ) return true;
 		return false;
@@ -408,19 +414,19 @@
 			 Character.isUpperCase(refdSymbol.charAt(0)) )
 		{
 			// symbol is a token
-			List tokenRefs = getTokenRefsInAlt(refdSymbol, outerAltNum);
-			uniqueRefAST = (GrammarAST)tokenRefs.get(0);
+			List<GrammarAST> tokenRefs = getTokenRefsInAlt(refdSymbol, outerAltNum);
+			uniqueRefAST = tokenRefs.get(0);
 		}
 		else {
 			// symbol is a rule
-			List ruleRefs = getRuleRefsInAlt(refdSymbol, outerAltNum);
-			uniqueRefAST = (GrammarAST)ruleRefs.get(0);
+			List<GrammarAST> ruleRefs = getRuleRefsInAlt(refdSymbol, outerAltNum);
+			uniqueRefAST = ruleRefs.get(0);
 		}
 		if ( uniqueRefAST.code==null ) {
 			// no code?  must not have gen'd yet; forward ref
 			return null;
 		}
-		String labelName = null;
+		String labelName;
 		String existingLabelName =
 			(String)uniqueRefAST.code.getAttribute("label");
 		// reuse any label or list label if it exists
@@ -472,18 +478,14 @@
 
 	public String getSingleValueReturnType() {
 		if ( returnScope!=null && returnScope.attributes.size()==1 ) {
-			Collection retvalAttrs = returnScope.attributes.values();
-			Object[] javaSucks = retvalAttrs.toArray();
-			return ((Attribute)javaSucks[0]).type;
+			return returnScope.attributes.values().iterator().next().type;
 		}
 		return null;
 	}
 
 	public String getSingleValueReturnName() {
 		if ( returnScope!=null && returnScope.attributes.size()==1 ) {
-			Collection retvalAttrs = returnScope.attributes.values();
-			Object[] javaSucks = retvalAttrs.toArray();
-			return ((Attribute)javaSucks[0]).name;
+			return returnScope.attributes.values().iterator().next().name;
 		}
 		return null;
 	}
@@ -512,11 +514,11 @@
 		inlineActions.add(actionAST);
 	}
 
-	public Map<String, GrammarAST> getActions() {
+	public Map<String, Object> getActions() {
 		return actions;
 	}
 
-	public void setActions(Map<String, GrammarAST> actions) {
+	public void setActions(Map<String, Object> actions) {
 		this.actions = actions;
 	}
 
@@ -532,10 +534,10 @@
 			return null;
 		}
 		if ( options==null ) {
-			options = new HashMap();
+			options = new HashMap<String, Object>();
 		}
         if ( key.equals("memoize") && value.toString().equals("true") ) {
-            grammar.atLeastOneRuleMemoizes = true;
+			grammar.composite.getRootGrammar().atLeastOneRuleMemoizes = true;
         }
         if ( key.equals("backtrack") && value.toString().equals("true") ) {
             grammar.composite.getRootGrammar().atLeastOneBacktrackOption = true;
@@ -547,14 +549,14 @@
 		return key;
 	}
 
-	public void setOptions(Map options, Token optionsStartToken) {
+	public void setOptions(Map<String, Object> options, Token optionsStartToken) {
 		if ( options==null ) {
 			this.options = null;
 			return;
 		}
-		Set keys = options.keySet();
-		for (Iterator it = keys.iterator(); it.hasNext();) {
-			String optionName = (String) it.next();
+		Set<String> keys = options.keySet();
+		for (Iterator<String> it = keys.iterator(); it.hasNext();) {
+			String optionName = it.next();
 			Object optionValue = options.get(optionName);
 			String stored=setOption(optionName, optionValue, optionsStartToken);
 			if ( stored==null ) {
@@ -576,6 +578,7 @@
 	}
 	 * */
 
+	@Override
 	public String toString() { // used for testing
 		return "["+grammar.name+"."+name+",index="+index+",line="+tree.getToken().getLine()+"]";
 	}
diff --git a/tool/src/main/java/org/antlr/tool/RuleLabelScope.java b/tool/src/main/java/org/antlr/tool/RuleLabelScope.java
index 265d245..ab45f8d 100644
--- a/tool/src/main/java/org/antlr/tool/RuleLabelScope.java
+++ b/tool/src/main/java/org/antlr/tool/RuleLabelScope.java
@@ -85,6 +85,7 @@
 	/** If you label a rule reference, you can access that rule's
 	 *  return values as well as any predefined attributes.
 	 */
+	@Override
 	public Attribute getAttribute(String name) {
 		AttributeScope rulePropertiesScope =
 			RuleLabelScope.grammarTypeToRulePropertiesScope[grammar.type];
diff --git a/tool/src/main/java/org/antlr/tool/Strip.java b/tool/src/main/java/org/antlr/tool/Strip.java
index 50152ad..f411090 100644
--- a/tool/src/main/java/org/antlr/tool/Strip.java
+++ b/tool/src/main/java/org/antlr/tool/Strip.java
@@ -56,7 +56,7 @@
 
     public void parseAndRewrite() throws Exception {
         processArgs(args);
-        CharStream input = null;
+        CharStream input;
         if ( filename!=null ) input = new ANTLRFileStream(filename);
         else input = new ANTLRInputStream(System.in);
         // BUILD AST
@@ -64,7 +64,7 @@
         tokens = new TokenRewriteStream(lex);
         ANTLRv3Parser g = new ANTLRv3Parser(tokens);
         ANTLRv3Parser.grammarDef_return r = g.grammarDef();
-        CommonTree t = (CommonTree)r.getTree();
+        CommonTree t = r.getTree();
         if (tree_option) System.out.println(t.toStringTree());
         rewrite(g.getTreeAdaptor(),t,g.getTokenNames());
     }
@@ -75,11 +75,13 @@
         // ACTIONS STUFF
         wiz.visit(t, ANTLRv3Parser.ACTION,
            new TreeWizard.Visitor() {
+			@Override
                public void visit(Object t) { ACTION(tokens, (CommonTree)t); }
            });
 
         wiz.visit(t, ANTLRv3Parser.AT,  // ^('@' id ACTION) rule actions
             new TreeWizard.Visitor() {
+			@Override
               public void visit(Object t) {
                   CommonTree a = (CommonTree)t;
                   CommonTree action = null;
@@ -94,6 +96,7 @@
             });
         wiz.visit(t, ANTLRv3Parser.ARG, // wipe rule arguments
                   new TreeWizard.Visitor() {
+			@Override
               public void visit(Object t) {
                   CommonTree a = (CommonTree)t;
                   a = (CommonTree)a.getChild(0);
@@ -103,6 +106,7 @@
             });
         wiz.visit(t, ANTLRv3Parser.RET, // wipe rule return declarations
             new TreeWizard.Visitor() {
+			@Override
                 public void visit(Object t) {
                     CommonTree a = (CommonTree)t;
                     CommonTree ret = (CommonTree)a.getChild(0);
@@ -112,6 +116,7 @@
             });
         wiz.visit(t, ANTLRv3Parser.SEMPRED, // comment out semantic predicates
             new TreeWizard.Visitor() {
+			@Override
                 public void visit(Object t) {
                     CommonTree a = (CommonTree)t;
                     tokens.replace(a.token.getTokenIndex(), "/*"+a.getText()+"*/");
@@ -119,6 +124,7 @@
             });
         wiz.visit(t, ANTLRv3Parser.GATED_SEMPRED, // comment out semantic predicates
             new TreeWizard.Visitor() {
+			@Override
                 public void visit(Object t) {
                     CommonTree a = (CommonTree)t;
                     String text = tokens.toString(a.getTokenStartIndex(),
@@ -130,6 +136,7 @@
             });
         wiz.visit(t, ANTLRv3Parser.SCOPE, // comment scope specs
             new TreeWizard.Visitor() {
+			@Override
                 public void visit(Object t) {
                     CommonTree a = (CommonTree)t;
                     tokens.delete(a.getTokenStartIndex(),
@@ -139,6 +146,7 @@
             });        
         wiz.visit(t, ANTLRv3Parser.ARG_ACTION, // args r[x,y] -> ^(r [x,y])
             new TreeWizard.Visitor() {
+			@Override
                 public void visit(Object t) {
                     CommonTree a = (CommonTree)t;
                     if ( a.getParent().getType()==ANTLRv3Parser.RULE_REF ) {
@@ -149,6 +157,7 @@
             });
         wiz.visit(t, ANTLRv3Parser.LABEL_ASSIGN, // ^('=' id ^(RULE_REF [arg])), ...
             new TreeWizard.Visitor() {
+			@Override
                 public void visit(Object t) {
                     CommonTree a = (CommonTree)t;
                     if ( !a.hasAncestor(ANTLRv3Parser.OPTIONS) ) { // avoid options
@@ -160,6 +169,7 @@
             });
         wiz.visit(t, ANTLRv3Parser.LIST_LABEL_ASSIGN, // ^('+=' id ^(RULE_REF [arg])), ...
             new TreeWizard.Visitor() {
+			@Override
               public void visit(Object t) {
                   CommonTree a = (CommonTree)t;
                   CommonTree child = (CommonTree)a.getChild(0);
@@ -172,6 +182,7 @@
         // AST STUFF
         wiz.visit(t, ANTLRv3Parser.REWRITE,
             new TreeWizard.Visitor() {
+			@Override
               public void visit(Object t) {
                   CommonTree a = (CommonTree)t;
                   CommonTree child = (CommonTree)a.getChild(0);
@@ -186,12 +197,14 @@
             });
         wiz.visit(t, ANTLRv3Parser.ROOT,
            new TreeWizard.Visitor() {
+			@Override
                public void visit(Object t) {
                    tokens.delete(((CommonTree)t).token.getTokenIndex());
                }
            });
         wiz.visit(t, ANTLRv3Parser.BANG,
            new TreeWizard.Visitor() {
+			@Override
                public void visit(Object t) {
                    tokens.delete(((CommonTree)t).token.getTokenIndex());
                }
@@ -219,9 +232,9 @@
     }
 
     private static void killTrailingNewline(TokenRewriteStream tokens, int index) {
-        List all = tokens.getTokens();
-        Token tok = (Token)all.get(index);
-        Token after = (Token)all.get(index+1);
+        List<? extends Token> all = tokens.getTokens();
+        Token tok = all.get(index);
+        Token after = all.get(index+1);
         String ws = after.getText();
         if ( ws.startsWith("\n") ) {
             //System.out.println("killing WS after action");
diff --git a/tool/src/main/java/org/antlr/tool/ToolMessage.java b/tool/src/main/java/org/antlr/tool/ToolMessage.java
index 6bbd5c0..070049d 100644
--- a/tool/src/main/java/org/antlr/tool/ToolMessage.java
+++ b/tool/src/main/java/org/antlr/tool/ToolMessage.java
@@ -58,6 +58,7 @@
 		super(msgID,arg,null);
 		this.e = e;
 	}
+	@Override
 	public String toString() {
 		ST st = getMessageTemplate();
 		if ( arg!=null ) {
diff --git a/tool/src/main/java/org/antlr/tool/ToolSTGroupFile.java b/tool/src/main/java/org/antlr/tool/ToolSTGroupFile.java
new file mode 100644
index 0000000..d20f813
--- /dev/null
+++ b/tool/src/main/java/org/antlr/tool/ToolSTGroupFile.java
@@ -0,0 +1,47 @@
+/*
+ * [The "BSD license"]
+ *  Copyright (c) 2012 Terence Parr
+ *  Copyright (c) 2012 Sam Harwell
+ *  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.
+ */
+package org.antlr.tool;
+
+import org.stringtemplate.v4.STErrorListener;
+import org.stringtemplate.v4.STGroupFile;
+
+/**
+ * This extension of {@link STGroupFile} automatically sets the group's
+ * {@link STErrorListener} to {@link ErrorManager#getSTErrorListener()}.
+ *
+ * @author Sam Harwell
+ */
+public class ToolSTGroupFile extends STGroupFile {
+
+	public ToolSTGroupFile(String fileName) {
+		super(fileName);
+		setListener(ErrorManager.getSTErrorListener());
+	}
+
+}
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/ActionScript/AST.stg b/tool/src/main/resources/org/antlr/codegen/templates/ActionScript/AST.stg
index 3a0eeda..44d6832 100644
--- a/tool/src/main/resources/org/antlr/codegen/templates/ActionScript/AST.stg
+++ b/tool/src/main/resources/org/antlr/codegen/templates/ActionScript/AST.stg
@@ -25,7 +25,6 @@
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
-group AST;
 
 @outputFile.imports() ::= <<
 <@super.imports()>
@@ -65,12 +64,12 @@
 ruleLabelDefs() ::= <<
 <super.ruleLabelDefs()>
 <[ruleDescriptor.tokenLabels,ruleDescriptor.wildcardTreeLabels,
-  ruleDescriptor.wildcardTreeListLabels]:{var <it.label.text>_tree:<ASTLabelType>=null;}; separator="\n">
-<ruleDescriptor.tokenListLabels:{var <it.label.text>_tree:<ASTLabelType>=null;}; separator="\n">
+  ruleDescriptor.wildcardTreeListLabels]:{it |var <it.label.text>_tree:<ASTLabelType>=null;}; separator="\n">
+<ruleDescriptor.tokenListLabels:{it |var <it.label.text>_tree:<ASTLabelType>=null;}; separator="\n">
 <ruleDescriptor.allTokenRefsInAltsWithRewrites
-    :{var stream_<it>:RewriteRule<rewriteElementType>Stream=new RewriteRule<rewriteElementType>Stream(adaptor,"token <it>");}; separator="\n">
+    :{it |var stream_<it>:RewriteRule<rewriteElementType>Stream=new RewriteRule<rewriteElementType>Stream(adaptor,"token <it>");}; separator="\n">
 <ruleDescriptor.allRuleRefsInAltsWithRewrites
-    :{var stream_<it>:RewriteRuleSubtreeStream=new RewriteRuleSubtreeStream(adaptor,"rule <it>");}; separator="\n">
+    :{it |var stream_<it>:RewriteRuleSubtreeStream=new RewriteRuleSubtreeStream(adaptor,"rule <it>");}; separator="\n">
 >>
 
 /** When doing auto AST construction, we must define some variables;
@@ -125,7 +124,7 @@
 /** x+=rule when output=AST and tracking for rewrite */
 ruleRefTrackAndListLabel(rule,label,elementIndex,args,scope) ::= <<
 <ruleRefTrack(...)>
-<listLabel(elem=label+".tree",...)>
+<listLabel(label, {<label>.tree})>
 >>
 
 /** ^(rule ...) rewrite */
@@ -137,7 +136,7 @@
 /** ^(x+=rule ...) rewrite */
 ruleRefRuleRootTrackAndListLabel(rule,label,elementIndex,args,scope) ::= <<
 <ruleRefRuleRootTrack(...)>
-<listLabel(elem=label+".tree",...)>
+<listLabel(label, {<label>.tree})>
 >>
 
 // R e w r i t e
@@ -160,6 +159,7 @@
 // rule labels: <referencedRuleLabels; separator=", ">
 // token list labels: <referencedTokenListLabels; separator=", ">
 // rule list labels: <referencedRuleListLabels; separator=", ">
+// wildcard labels: <[referencedWildcardLabels,referencedWildcardListLabels]; separator=", ">
 <if(backtracking)>
 if ( <actions.(actionScope).synpredgate> ) {<\n>
 <endif>
@@ -192,27 +192,27 @@
 
 rewriteCodeLabels() ::= <<
 <referencedTokenLabels
-    :{var stream_<it>:RewriteRule<rewriteElementType>Stream=new RewriteRule<rewriteElementType>Stream(adaptor,"token <it>",<it>);};
+    :{it |var stream_<it>:RewriteRule<rewriteElementType>Stream=new RewriteRule<rewriteElementType>Stream(adaptor,"token <it>",<it>);};
     separator="\n"
 >
 <referencedTokenListLabels
-    :{var stream_<it>:RewriteRule<rewriteElementType>Stream=new RewriteRule<rewriteElementType>Stream(adaptor,"token <it>", list_<it>);};
+    :{it |var stream_<it>:RewriteRule<rewriteElementType>Stream=new RewriteRule<rewriteElementType>Stream(adaptor,"token <it>", list_<it>);};
     separator="\n"
 >
 <referencedWildcardLabels
-    :{var  stream_<it>:RewriteRuleSubtreeStream=new RewriteRuleSubtreeStream(adaptor,"wildcard <it>",<it>);};
+    :{it |var  stream_<it>:RewriteRuleSubtreeStream=new RewriteRuleSubtreeStream(adaptor,"wildcard <it>",<it>);};
     separator="\n"
 >
 <referencedWildcardListLabels
-    :{var stream_<it>:RewriteRuleSubtreeStream=new RewriteRuleSubtreeStream(adaptor,"wildcard <it>",list_<it>);};
+    :{it |var stream_<it>:RewriteRuleSubtreeStream=new RewriteRuleSubtreeStream(adaptor,"wildcard <it>",list_<it>);};
     separator="\n"
 >
 <referencedRuleLabels
-    :{var stream_<it>:RewriteRuleSubtreeStream=new RewriteRuleSubtreeStream(adaptor,"rule <it>",<it>!=null?<it>.tree:null);};
+    :{it |var stream_<it>:RewriteRuleSubtreeStream=new RewriteRuleSubtreeStream(adaptor,"rule <it>",<it>!=null?<it>.tree:null);};
     separator="\n"
 >
 <referencedRuleListLabels
-    :{var stream_<it>:RewriteRuleSubtreeStream=new RewriteRuleSubtreeStream(adaptor,"rule <it>",list_<it>);};
+    :{it |var stream_<it>:RewriteRuleSubtreeStream=new RewriteRuleSubtreeStream(adaptor,"token <it>",list_<it>);};
     separator="\n"
 >
 >>
@@ -323,11 +323,11 @@
 >>
 
 rewriteImaginaryTokenRef(args,token,terminalOptions,elementIndex) ::= <<
-adaptor.addChild(root_<treeLevel>, <createImaginaryNode(tokenType=token, ...)>);<\n>
+adaptor.addChild(root_<treeLevel>, <createImaginaryNode(token,terminalOptions,args)>);<\n>
 >>
 
 rewriteImaginaryTokenRefRoot(args,token,terminalOptions,elementIndex) ::= <<
-root_<treeLevel> = <ASTLabelType>(adaptor.becomeRoot(<createImaginaryNode(tokenType=token, ...)>, root_<treeLevel>));<\n>
+root_<treeLevel> = <ASTLabelType>(adaptor.becomeRoot(<createImaginaryNode(token,terminalOptions,args)>, root_<treeLevel>));<\n>
 >>
 
 /** plain -> {foo} action */
@@ -382,6 +382,7 @@
 adaptor.addChild(root_<treeLevel>, stream_<label>.nextTree());<\n>
 >>
 
+
 createImaginaryNode(tokenType,terminalOptions,args) ::= <<
 <if(terminalOptions.node)>
 <! new MethodNode(IDLabel, args) !>
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/ActionScript/ASTParser.stg b/tool/src/main/resources/org/antlr/codegen/templates/ActionScript/ASTParser.stg
index 1596c95..72326b1 100644
--- a/tool/src/main/resources/org/antlr/codegen/templates/ActionScript/ASTParser.stg
+++ b/tool/src/main/resources/org/antlr/codegen/templates/ActionScript/ASTParser.stg
@@ -37,7 +37,6 @@
  *  The situation is not too bad as rewrite (->) usage makes ^ and !
  *  invalid. There is no huge explosion of combinations.
  */
-group ASTParser;
 
 @rule.setErrorReturnValue() ::= <<
 retval.tree = <ASTLabelType>(adaptor.errorNode(input, Token(retval.start), input.LT(-1), re));
@@ -56,7 +55,7 @@
 >>
 
 /** ID! and output=AST (same as plain tokenRef) */
-tokenRefBang(token,label,elementIndex) ::= "<super.tokenRef(...)>"
+tokenRefBang(token,label,elementIndex,terminalOptions) ::= "<super.tokenRef(...)>"
 
 /** ID^ and output=AST */
 tokenRefRuleRoot(token,label,elementIndex,terminalOptions) ::= <<
@@ -98,15 +97,15 @@
 // rather than just added on code.  Investigate that refactoring when
 // I have more time.
 
-matchSet(s,label,terminalOptions,elementIndex,postmatchCode) ::= <<
-<super.matchSet(..., postmatchCode={<if(backtracking)>if ( <actions.(actionScope).synpredgate> ) <endif>adaptor.addChild(root_0, <createNodeFromToken(...)>);})>
->>
+matchSet(s,label,terminalOptions,elementIndex,postmatchCode) ::= <%
+<super.matchSet(postmatchCode={<if(backtracking)>if ( <actions.(actionScope).synpredgate> ) <endif>adaptor.addChild(root_0, <createNodeFromToken(...)>);}, ...)>
+%>
 
 matchRuleBlockSet(s,label,terminalOptions,elementIndex,postmatchCode,treeLevel="0") ::= <<
 <matchSet(...)>
 >>
 
-matchSetBang(s,label,elementIndex,postmatchCode) ::= "<super.matchSet(...)>"
+matchSetBang(s,label,elementIndex,terminalOptions,postmatchCode) ::= "<super.matchSet(...)>"
 
 // note there is no matchSetTrack because -> rewrites force sets to be
 // plain old blocks of alts: (A|B|...|C)
@@ -115,7 +114,7 @@
 <if(label)>
 <label>=<labelType>(input.LT(1));<\n>
 <endif>
-<super.matchSet(..., postmatchCode={<if(backtracking)>if ( <actions.(actionScope).synpredgate> ) <endif>root_0 = <ASTLabelType>(adaptor.becomeRoot(<createNodeFromToken(...)>, root_0));})>
+<super.matchSet(postmatchCode={<if(backtracking)>if ( <actions.(actionScope).synpredgate> ) <endif>root_0 = <ASTLabelType>(adaptor.becomeRoot(<createNodeFromToken(...)>, root_0));},...)>
 >>
 
 // RULE REF AST
@@ -138,24 +137,24 @@
 /** x+=rule when output=AST */
 ruleRefAndListLabel(rule,label,elementIndex,args,scope) ::= <<
 <ruleRef(...)>
-<listLabel(elem=label+".tree",...)>
+<listLabel(label, {<label>.tree})>
 >>
 
 /** x+=rule! when output=AST is a rule ref with list addition */
 ruleRefBangAndListLabel(rule,label,elementIndex,args,scope) ::= <<
 <ruleRefBang(...)>
-<listLabel(elem=label+".tree",...)>
+<listLabel(label, {<label>.tree})>
 >>
 
 /** x+=rule^ */
 ruleRefRuleRootAndListLabel(rule,label,elementIndex,args,scope) ::= <<
 <ruleRefRuleRoot(...)>
-<listLabel(elem=label+".tree",...)>
+<listLabel(label, {<label>.tree})>
 >>
 
 // WILDCARD AST
 
-wildcard(label,elementIndex) ::= <<
+wildcard(token,label,elementIndex,terminalOptions) ::= <<
 <super.wildcard(...)>
 <if(backtracking)>if ( <actions.(actionScope).synpredgate> ) {<endif>
 <label>_tree = <ASTLabelType>(adaptor.create(<label>));
@@ -165,7 +164,7 @@
 
 wildcardBang(label,elementIndex) ::= "<super.wildcard(...)>"
 
-wildcardRuleRoot(label,elementIndex) ::= <<
+wildcardRuleRoot(token,label,elementIndex,terminalOptions) ::= <<
 <super.wildcard(...)>
 <if(backtracking)>if ( <actions.(actionScope).synpredgate> ) {<endif>
 <label>_tree = <ASTLabelType>(adaptor.create(<label>));
@@ -187,4 +186,4 @@
 retval.tree = <ASTLabelType>(adaptor.rulePostProcessing(root_0));
 adaptor.setTokenBoundaries(retval.tree, Token(retval.start), Token(retval.stop));
 <if(backtracking)>}<endif>
->>
\ No newline at end of file
+>>
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/ActionScript/ASTTreeParser.stg b/tool/src/main/resources/org/antlr/codegen/templates/ActionScript/ASTTreeParser.stg
index f598d4f..4f26b1b 100644
--- a/tool/src/main/resources/org/antlr/codegen/templates/ActionScript/ASTTreeParser.stg
+++ b/tool/src/main/resources/org/antlr/codegen/templates/ActionScript/ASTTreeParser.stg
@@ -37,7 +37,6 @@
  *  Each combination has its own template except that label/no label
  *  is combined into tokenRef, ruleRef, ...
  */
-group ASTTreeParser;
 
 /** Add a variable to track last element matched */
 ruleDeclarations() ::= <<
@@ -104,7 +103,7 @@
 /** ID! and output=AST (same as plain tokenRef) 'cept add
  *  setting of _last
  */
-tokenRefBang(token,label,elementIndex) ::= <<
+tokenRefBang(token,label,elementIndex,terminalOptions) ::= <<
 _last = <ASTLabelType>(input.LT(1));
 <super.tokenRef(...)>
 >>
@@ -129,7 +128,7 @@
 >>
 
 /** label+=TOKEN auto construct */
-tokenRefAndListLabel(token,label,elementIndex) ::= <<
+tokenRefAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
 <tokenRef(...)>
 <listLabel(elem=label,...)>
 >>
@@ -175,7 +174,7 @@
 
 matchSet(s,label,terminalOptions,elementIndex,postmatchCode) ::= <<
 _last = <ASTLabelType>(input.LT(1));
-<super.matchSet(..., postmatchCode={
+<super.matchSet(postmatchCode={
 <if(!rewriteMode)>
 <if(backtracking)>if ( <actions.(actionScope).synpredgate> ) {<endif>
 <if(terminalOptions.node)>
@@ -184,24 +183,24 @@
 <label>_tree = <ASTLabelType>(adaptor.dupNode(<label>));
 <endif><\n>
 adaptor.addChild(root_<treeLevel>, <label>_tree);
-<if(backtracking)>}<endif>
+<if(backtracking)>\}<endif>
 <endif>
-}
+}, ...
 )>
 >>
 
 matchRuleBlockSet(s,label,terminalOptions,elementIndex,postmatchCode,treeLevel="0") ::= <<
 <matchSet(...)>
-<noRewrite()> <! set return tree !>
+<noRewrite(...)> <! set return tree !>
 >>
 
-matchSetBang(s,label,elementIndex,postmatchCode) ::= <<
+matchSetBang(s,label,terminalOptions,elementIndex,postmatchCode) ::= <<
 _last = <ASTLabelType>(input.LT(1));
 <super.matchSet(...)>
 >>
 
 matchSetRuleRoot(s,label,terminalOptions,elementIndex,debug) ::= <<
-<super.matchSet(..., postmatchCode={
+<super.matchSet(postmatchCode={
 <if(!rewriteMode)>
 <if(backtracking)>if ( <actions.(actionScope).synpredgate> ) {<endif>
 <if(terminalOptions.node)>
@@ -212,7 +211,7 @@
 root_<treeLevel> = <ASTLabelType>(adaptor.becomeRoot(<label>_tree, root_<treeLevel>));
 <if(backtracking)>}<endif>
 <endif>
-}
+}, ...
 )>
 >>
 
@@ -233,7 +232,7 @@
 /** x+=rule auto construct */
 ruleRefAndListLabel(rule,label,elementIndex,args,scope) ::= <<
 <ruleRef(...)>
-<listLabel(elem=label+".tree",...)>
+<listLabel(label, {<label>.tree})>
 >>
 
 /** ^(rule ...) auto construct */
@@ -248,7 +247,7 @@
 /** ^(x+=rule ...) auto construct */
 ruleRefRuleRootAndListLabel(rule,label,elementIndex,args,scope) ::= <<
 <ruleRefRuleRoot(...)>
-<listLabel(elem=label+".tree",...)>
+<listLabel(label, {<label>.tree})>
 >>
 
 /** rule when output=AST and tracking for rewrite */
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/ActionScript/ActionScript.stg b/tool/src/main/resources/org/antlr/codegen/templates/ActionScript/ActionScript.stg
index 8187ab7..1fdeadc 100644
--- a/tool/src/main/resources/org/antlr/codegen/templates/ActionScript/ActionScript.stg
+++ b/tool/src/main/resources/org/antlr/codegen/templates/ActionScript/ActionScript.stg
@@ -1,6 +1,6 @@
 /*
  [The "BSD license"]
- Copyright (c) 2005-2006 Terence Parr
+ Copyright (c) 2010 Terence Parr
  All rights reserved.
 
  Redistribution and use in source and binary forms, with or without
@@ -25,7 +25,6 @@
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
-group ActionScript;
 
 asTypeInitMap ::= [
 	"int":"0",
@@ -61,11 +60,11 @@
 }
 >>
 
-lexer(grammar, name, tokens, scopes, rules, numRules, labelType="Token",
-      filterMode, superClass="Lexer") ::= <<
+lexer(grammar, name, tokens, scopes, rules, numRules, filterMode, labelType="Token",
+      superClass="Lexer") ::= <<
 public class <grammar.recognizerName> extends <if(actions.(actionScope).superClass)><actions.(actionScope).superClass><else><@superClassName><superClass><@end><endif> {
-    <tokens:{public static const <it.name>:int=<it.type>;}; separator="\n">
-    <scopes:{<if(it.isDynamicGlobalScope)><globalAttributeScope(scope=it)><endif>}>
+    <tokens:{it |public static const <it.name>:int=<it.type>;}; separator="\n">
+    <scopes:{it |<if(it.isDynamicGlobalScope)><globalAttributeScope(it)><endif>}>
     <actions.lexer.members>
 
     // delegates
@@ -168,25 +167,25 @@
 
 /** How to generate a parser */
 genericParser(grammar, name, scopes, tokens, tokenNames, rules, numRules,
-              bitsets, inputStreamType, superClass, filterMode,
-              ASTLabelType="Object", labelType, members, rewriteElementType) ::= <<
+              bitsets, inputStreamType, superClass,
+              labelType, members, rewriteElementType,
+              filterMode, ASTLabelType="Object") ::= <<
 public class <grammar.recognizerName> extends <if(actions.(actionScope).superClass)><actions.(actionScope).superClass><else><@superClassName><superClass><@end><endif> {
 <if(grammar.grammarIsRoot)>
     public static const tokenNames:Array = [
         "\<invalid>", "\<EOR>", "\<DOWN>", "\<UP>", <tokenNames; separator=", ">
     ];<\n>
 <endif>
-    <tokens:{public static const <it.name>:int=<it.type>;}; separator="\n">
+    <tokens:{it |public static const <it.name>:int=<it.type>;}; separator="\n">
 
     // delegates
-    <grammar.delegates:
-         {g|public var <g:delegateName()>:<g.recognizerName>;}; separator="\n">
+    <grammar.delegates: {g|public var <g:delegateName()>:<g.recognizerName>;}; separator="\n">
     // delegators
     <grammar.delegators:
          {g|public var <g:delegateName()>:<g.recognizerName>;}; separator="\n">
     <last(grammar.delegators):{g|public var gParent:<g.recognizerName>;}>
 
-    <scopes:{<if(it.isDynamicGlobalScope)><globalAttributeScope(scope=it)><endif>}>
+    <scopes:{it |<if(it.isDynamicGlobalScope)><globalAttributeScope(it)><endif>}>
     <@members>
    <! WARNING. bug in ST: this is cut-n-paste into Dbg.stg !>
     public function <grammar.recognizerName>(<grammar.delegators:{g|<g:delegateName()>:<g.recognizerName>, }>input:<inputStreamType>, state:RecognizerSharedState = null) {
@@ -211,14 +210,14 @@
        appear to be defined in this recognizer. !>
        // Delegated rules
     <grammar.delegatedRules:{ruleDescriptor|
-        public function <ruleDescriptor.name>(<ruleDescriptor.parameterScope:parameterScope(scope=it)>):<returnType()> \{ <if(ruleDescriptor.hasReturnValue)>return <endif><ruleDescriptor.grammar:delegateName()>.<ruleDescriptor.name>(<ruleDescriptor.parameterScope.attributes:{a|<a.name>}; separator=", ">); \}}; separator="\n">
+        public function <ruleDescriptor.name>(<ruleDescriptor.parameterScope:parameterScope()>):<returnType()> { <if(ruleDescriptor.hasReturnValue)>return <endif><ruleDescriptor.grammar:delegateName()>.<ruleDescriptor.name>(<ruleDescriptor.parameterScope.attributes:{a|<a.name>}; separator=", ">); \}}; separator="\n">
 
     <synpreds:{p | <synpred(p)>}>
 
     <cyclicDFAs:cyclicDFA()> <! dump tables for all DFA !>
 
-    <bitsets:bitset(name={FOLLOW_<it.name>_in_<it.inName><it.tokenIndex>},
-                    words64=it.bits)>
+    <bitsets:{it | <bitset(name={FOLLOW_<it.name>_in_<it.inName><it.tokenIndex>},
+                            words64=it.bits)>}>
 }
 >>
 
@@ -233,14 +232,22 @@
 >>
 
 parser(grammar, name, scopes, tokens, tokenNames, rules, numRules, bitsets, ASTLabelType="Object", superClass="Parser", labelType="Token", members={<actions.parser.members>}) ::= <<
-<genericParser(inputStreamType="TokenStream", rewriteElementType="Token", ...)>
+<genericParser(grammar, name, scopes, tokens, tokenNames, rules, numRules,
+              bitsets, "TokenStream", superClass,
+              labelType, members, "Token",
+              false, ASTLabelType)>
 >>
 
 /** How to generate a tree parser; same as parser except the input
  *  stream is a different type.
  */
-treeParser(grammar, name, scopes, tokens, tokenNames, globalAction, rules, numRules, bitsets, labelType={<ASTLabelType>}, ASTLabelType="Object", superClass="TreeParser", members={<actions.treeparser.members>}, filterMode) ::= <<
-<genericParser(inputStreamType="TreeNodeStream", rewriteElementType="Node", ...)>
+treeParser(grammar, name, scopes, tokens, tokenNames, globalAction, rules,
+           numRules, bitsets, filterMode, labelType={<ASTLabelType>}, ASTLabelType="Object",
+           superClass="TreeParser", members={<actions.treeparser.members>}) ::= <<
+<genericParser(grammar, name, scopes, tokens, tokenNames, rules, numRules,
+              bitsets, "TreeNodeStream", superClass,
+              labelType, members, "Node",
+              filterMode, ASTLabelType)>
 >>
 
 /** A simpler version of a rule template that is specific to the imaginary
@@ -253,7 +260,7 @@
 synpredRule(ruleName, ruleDescriptor, block, description, nakedBlock) ::=
 <<
 // $ANTLR start <ruleName>
-public final function <ruleName>_fragment(<ruleDescriptor.parameterScope:parameterScope(scope=it)>):void {
+public final function <ruleName>_fragment(<ruleDescriptor.parameterScope:parameterScope()>):void {
     <ruleLabelDefs()>
 <if(trace)>
     traceIn("<ruleName>_fragment", <ruleDescriptor.index>);
@@ -316,7 +323,7 @@
 <ruleAttributeScope(scope=ruleDescriptor.ruleScope)>
 // $ANTLR start <ruleName>
 // <fileName>:<description>
-public final function <ruleName>(<ruleDescriptor.parameterScope:parameterScope(scope=it)>):<returnType()> {
+public final function <ruleName>(<ruleDescriptor.parameterScope:parameterScope()>):<returnType()> {
     <if(trace)>traceIn("<ruleName>", <ruleDescriptor.index>);<endif>
     <ruleScopeSetUp()>
     <ruleDeclarations()>
@@ -377,24 +384,24 @@
 >>
 
 ruleScopeSetUp() ::= <<
-<ruleDescriptor.useScopes:{<it>_stack.push(new Object());}; separator="\n">
-<ruleDescriptor.ruleScope:{<it.name>_stack.push(new Object());}; separator="\n">
+<ruleDescriptor.useScopes:{it |<it>_stack.push(new Object());}; separator="\n">
+<ruleDescriptor.ruleScope:{it |<it.name>_stack.push(new Object());}; separator="\n">
 >>
 
 ruleScopeCleanUp() ::= <<
-<ruleDescriptor.useScopes:{<it>_stack.pop();}; separator="\n">
-<ruleDescriptor.ruleScope:{<it.name>_stack.pop();}; separator="\n">
+<ruleDescriptor.useScopes:{it |<it>_stack.pop();}; separator="\n">
+<ruleDescriptor.ruleScope:{it |<it.name>_stack.pop();}; separator="\n">
 >>
 
 ruleLabelDefs() ::= <<
 <[ruleDescriptor.tokenLabels,ruleDescriptor.tokenListLabels,
   ruleDescriptor.wildcardTreeLabels,ruleDescriptor.wildcardTreeListLabels]
-    :{var <it.label.text>:<labelType>=null;}; separator="\n"
+    :{it |var <it.label.text>:<labelType>=null;}; separator="\n"
 >
 <[ruleDescriptor.tokenListLabels,ruleDescriptor.ruleListLabels,ruleDescriptor.wildcardTreeListLabels]
-    :{var list_<it.label.text>:Array=null;}; separator="\n"
+    :{it |var list_<it.label.text>:Array=null;}; separator="\n"
 >
-<ruleDescriptor.ruleLabels:ruleLabelDef(label=it); separator="\n">
+<ruleDescriptor.ruleLabels:ruleLabelDef(); separator="\n">
 <ruleDescriptor.ruleListLabels:{ll|var <ll.label.text>:RuleReturnScope = null;}; separator="\n">
 >>
 
@@ -402,16 +409,16 @@
 <[ruleDescriptor.tokenLabels,
   ruleDescriptor.tokenListLabels,
   ruleDescriptor.ruleLabels]
-    :{var <it.label.text>:<labelType>=null;}; separator="\n"
+    :{it |var <it.label.text>:<labelType>=null;}; separator="\n"
 >
-<ruleDescriptor.charLabels:{var <it.label.text>:int;}; separator="\n">
+<ruleDescriptor.charLabels:{it |var <it.label.text>:int;}; separator="\n">
 <[ruleDescriptor.tokenListLabels,
   ruleDescriptor.ruleListLabels]
-    :{var list_<it.label.text>:Array=null;}; separator="\n"
+    :{it |var list_<it.label.text>:Array=null;}; separator="\n"
 >
 >>
 
-ruleReturnValue() ::= <<
+ruleReturnValue() ::= <%
 <if(!ruleDescriptor.isSynPred)>
 <if(ruleDescriptor.hasReturnValue)>
 <if(ruleDescriptor.hasSingleReturnValue)>
@@ -421,7 +428,7 @@
 <endif>
 <endif>
 <endif>
->>
+%>
 
 ruleCleanUp() ::= <<
 <if(ruleDescriptor.hasMultipleReturnValues)>
@@ -444,7 +451,7 @@
  */
 lexerRule(ruleName,nakedBlock,ruleDescriptor,block,memoize) ::= <<
 // $ANTLR start <ruleName>
-public final function m<ruleName>(<ruleDescriptor.parameterScope:parameterScope(scope=it)>):void {
+public final function m<ruleName>(<ruleDescriptor.parameterScope:parameterScope()>):void {
     <if(trace)>traceIn("<ruleName>", <ruleDescriptor.index>);<endif>
     <ruleScopeSetUp()>
     <ruleDeclarations()>
@@ -497,7 +504,7 @@
 <@postdecision()>
 <@prebranch()>
 switch (alt<decisionNumber>) {
-    <alts:altSwitchCase()>
+    <alts:{a | <altSwitchCase(i, a)>}>
 }
 <@postbranch()>
 >>
@@ -511,7 +518,7 @@
 <decision>
 <@postdecision()>
 switch (alt<decisionNumber>) {
-    <alts:altSwitchCase()>
+    <alts:{a | <altSwitchCase(i, a)>}>
 }
 >>
 
@@ -545,7 +552,7 @@
     <decision>
     <@postdecision()>
     switch (alt<decisionNumber>) {
-	<alts:altSwitchCase()>
+	<alts:{a | <altSwitchCase(i, a)>}>
 	default :
 	    if ( cnt<decisionNumber> >= 1 ) break loop<decisionNumber>;
 	    <ruleBacktrackFailure()>
@@ -571,7 +578,7 @@
     <decision>
     <@postdecision()>
     switch (alt<decisionNumber>) {
-	<alts:altSwitchCase()>
+	<alts:{a | <altSwitchCase(i, a)>}>
 	default :
 	    break loop<decisionNumber>;
     }
@@ -592,10 +599,10 @@
  *  number.  A DFA predicts the alternative and then a simple switch
  *  does the jump to the code that actually matches that alternative.
  */
-altSwitchCase() ::= <<
-case <i> :
+altSwitchCase(altNum, alt) ::= <<
+case <altNum> :
     <@prealt()>
-    <it>
+    <alt>
     break;<\n>
 >>
 
@@ -618,9 +625,9 @@
 // E L E M E N T S
 
 /** Dump the elements one per line */
-element() ::= <<
+element(e) ::= <<
 <@prematch()>
-<it.el><\n>
+<e.el><\n>
 >>
 
 /** match a token optionally with a label in front */
@@ -630,8 +637,8 @@
 
 /** ids+=ID */
 tokenRefAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
-<tokenRef(...)>
-<listLabel(elem=label,...)>
+<tokenRef(token,label,elementIndex,terminalOptions)>
+<listLabel(label, label)>
 >>
 
 listLabel(label,elem) ::= <<
@@ -656,7 +663,7 @@
 >>
 
 /** For now, sets are interval tests and must be tested inline */
-matchSet(s,label,elementIndex,postmatchCode="") ::= <<
+matchSet(s,label,elementIndex,terminalOptions,postmatchCode="") ::= <<
 <if(label)>
 <if(LEXER)>
 <label>= input.LA(1);<\n>
@@ -690,30 +697,34 @@
 
 matchSetAndListLabel(s,label,elementIndex,postmatchCode) ::= <<
 <matchSet(...)>
-<listLabel(elem=label,...)>
+<listLabel(label, label)>
 >>
 
 /** Match a string literal */
-lexerStringRef(string,label,elementIndex) ::= <<
+lexerStringRef(string,label,elementIndex="0") ::= <<
 <if(label)>
 var <label>Start:int = charIndex;
 matchString(<string>); <checkRuleBacktrackFailure()>
+var <label>StartLine<elementIndex>:int = line;
+var <label>StartCharPos<elementIndex>:int = charPositionInLine;
 <label> = CommonToken.createFromStream(input, TokenConstants.INVALID_TOKEN_TYPE, TokenConstants.DEFAULT_CHANNEL, <label>Start, charIndex-1);
+<label>.line = <label>StartLine<elementIndex>;
+<label>.charPositionInLine = <label>StartCharPos<elementIndex>;
 <else>
 matchString(<string>); <checkRuleBacktrackFailure()><\n>
 <endif>
 >>
 
-wildcard(label,elementIndex) ::= <<
+wildcard(token,label,elementIndex,terminalOptions) ::= <<
 <if(label)>
 <label>=<labelType>(input.LT(1));<\n>
 <endif>
 matchAny(input); <checkRuleBacktrackFailure()>
 >>
 
-wildcardAndListLabel(label,elementIndex) ::= <<
+wildcardAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
 <wildcard(...)>
-<listLabel(elem=label,...)>
+<listLabel(label, label)>
 >>
 
 /** Match . wildcard in lexer */
@@ -725,8 +736,8 @@
 >>
 
 wildcardCharListLabel(label, elementIndex) ::= <<
-<wildcardChar(...)>
-<listLabel(elem=label,...)>
+<wildcardChar(label, elementIndex)>
+<listLabel(label, label)>
 >>
 
 /** Match a rule reference by invoking it possibly with arguments
@@ -748,8 +759,8 @@
 
 /** ids+=r */
 ruleRefAndListLabel(rule,label,elementIndex,args,scope) ::= <<
-<ruleRef(...)>
-<listLabel(elem=label,...)>
+<ruleRef(rule,label,elementIndex,args,scope)>
+<listLabel(label, label)>
 >>
 
 /** A lexer rule reference.
@@ -761,8 +772,12 @@
 lexerRuleRef(rule,label,args,elementIndex,scope) ::= <<
 <if(label)>
 var <label>Start<elementIndex>:int = charIndex;
+var <label>StartLine<elementIndex>:int = line;
+var <label>StartCharPos<elementIndex>:int = charPositionInLine;
 <if(scope)><scope:delegateName()>.<endif>m<rule.name>(<args; separator=", ">); <checkRuleBacktrackFailure()>
 <label> = CommonToken.createFromStream(input, TokenConstants.INVALID_TOKEN_TYPE, TokenConstants.DEFAULT_CHANNEL, <label>Start<elementIndex>, charIndex-1);
+<label>.line = <label>StartLine<elementIndex>;
+<label>.charPositionInLine = <label>StartCharPos<elementIndex>;
 <else>
 <if(scope)><scope:delegateName()>.<endif>m<rule.name>(<args; separator=", ">); <checkRuleBacktrackFailure()>
 <endif>
@@ -770,21 +785,32 @@
 
 /** i+=INT in lexer */
 lexerRuleRefAndListLabel(rule,label,args,elementIndex,scope) ::= <<
-<lexerRuleRef(...)>
-<listLabel(elem=label,...)>
+<lexerRuleRef(rule,label,args,elementIndex,scope)>
+<listLabel(label, label)>
 >>
 
 /** EOF in the lexer */
 lexerMatchEOF(label,elementIndex) ::= <<
 <if(label)>
 var <label>Start<elementIndex>:int = charIndex;
+var <label>StartLine<elementIndex>:int = line;
+var <label>StartCharPos<elementIndex>:int = charPositionInLine;
 match(EOF); <checkRuleBacktrackFailure()>
 var <label>:<labelType> = CommonToken.createFromStream(input, EOF, TokenConstants.DEFAULT_CHANNEL, <label>Start<elementIndex>, charIndex-1);
+<label>.line = <label>StartLine<elementIndex>;
+<label>.charPositionInLine = <label>StartCharPos<elementIndex>;
 <else>
 match(EOF); <checkRuleBacktrackFailure()>
 <endif>
 >>
 
+// used for left-recursive rules
+recRuleDefArg()                       ::= "var <recRuleArg()>:int"
+recRuleArg()                          ::= "_p"
+recRuleAltPredicate(ruleName,opPrec)  ::= "<recRuleArg()> \<= <opPrec>"
+recRuleSetResultAction()              ::= "root_0=$<ruleName>_primary.tree;"
+recRuleSetReturnAction(src,name)      ::= "$<name>=$<src>.<name>;"
+
 /** match ^(root children) in tree parser */
 tree(root, actionsAfterRoot, children, nullableChildList,
      enclosingTreeLevel, treeLevel) ::= <<
@@ -807,7 +833,7 @@
  *  also hoisted into a prediction expression).
  */
 validateSemanticPredicate(pred,description) ::= <<
-if ( !(<evalPredicate(...)>) ) {
+if ( !(<evalPredicate(pred,description)>) ) {
     <ruleBacktrackFailure()>
     throw new FailedPredicateException(input, "<ruleName>", "<description>");
 }
@@ -909,7 +935,7 @@
 >>
 
 dfaEdgeSwitch(labels, targetState) ::= <<
-<labels:{case <it>:}; separator="\n">
+<labels:{it |case <it>:}; separator="\n">
     {
     <targetState>
     }
@@ -1025,9 +1051,9 @@
 
 andPredicates(left,right) ::= "(<left>&&<right>)"
 
-orPredicates(operands) ::= "(<first(operands)><rest(operands):{o | ||<o>}>)"
+orPredicates(operands) ::= "(<operands; separator=\"||\">)"
 
-notPredicate(pred) ::= "!(<evalPredicate(...)>)"
+notPredicate(pred) ::= "!(<evalPredicate(pred,{})>)"
 
 evalPredicate(pred,description) ::= "(<pred>)"
 
@@ -1040,14 +1066,16 @@
  */
 isolatedLookaheadTest(atom,k,atomAsInt) ::= "input.LA(<k>)==<atomAsInt>"
 
-lookaheadRangeTest(lower,upper,k,rangeNumber,lowerAsInt,upperAsInt) ::= <<
-(LA<decisionNumber>_<stateNumber>\>=<lowerAsInt> && LA<decisionNumber>_<stateNumber>\<=<upperAsInt>)
+lookaheadRangeTest(lower,upper,k,rangeNumber,lowerAsInt,upperAsInt) ::= <%
+(LA<decisionNumber>_<stateNumber> >= <lowerAsInt> && LA<decisionNumber>_<stateNumber> \<= <upperAsInt>)
+%>
+
+isolatedLookaheadRangeTest(lower,upper,k,rangeNumber,lowerAsInt,upperAsInt) ::= "(input.LA(<k>) >= <lowerAsInt> && input.LA(<k>) \<= <upperAsInt>)"
+
+setTest(ranges) ::= <<
+<ranges; separator="||">
 >>
 
-isolatedLookaheadRangeTest(lower,upper,k,rangeNumber,lowerAsInt,upperAsInt) ::= "(input.LA(<k>)\>=<lowerAsInt> && input.LA(<k>)\<=<upperAsInt>)"
-
-setTest(ranges) ::= "<ranges; separator=\"||\">"
-
 // A T T R I B U T E S
 
 globalAttributeScope(scope) ::= <<
@@ -1091,8 +1119,8 @@
 <endif>
 >>
 
-delegateName() ::= <<
-<if(it.label)><it.label><else>g<it.name><endif>
+delegateName(d) ::= <<
+<if(d.label)><d.label><else>g<d.name><endif>
 >>
 
 /** Using a type to init value map, try to init a type; if not in table
@@ -1114,14 +1142,14 @@
 returnScope(scope) ::= <<
 <if(ruleDescriptor.hasMultipleReturnValues)>
 public static class <returnType()> extends <if(TREE_PARSER)>Tree<else>Parser<endif>RuleReturnScope {
-    <scope.attributes:{public <it.decl>;}; separator="\n">
+    <scope.attributes:{it |public <it.decl>;}; separator="\n">
     <@ruleReturnMembers()>
 };
 <endif>
 >>
 
 parameterScope(scope) ::= <<
-<scope.attributes:{<it.name>:<it.type>}; separator=", ">
+<scope.attributes:{it |<it.name>:<it.type>}; separator=", ">
 >>
 
 parameterAttributeRef(attr) ::= "<attr.name>"
@@ -1280,10 +1308,10 @@
 // M I S C (properties, etc...)
 
 bitset(name, words64) ::= <<
-public static const <name>:BitSet = new BitSet([<words64:{<it>};separator=", ">]);<\n>
+public static const <name>:BitSet = new BitSet([<words64:{it |<it>};separator=", ">]);<\n>
 >>
 
 codeFileExtension() ::= ".as"
 
-true() ::= "true"
-false() ::= "false"
+true_value() ::= "true"
+false_value() ::= "false"
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/C/C.stg b/tool/src/main/resources/org/antlr/codegen/templates/C/C.stg
index eb3a7b6..63646a7 100644
--- a/tool/src/main/resources/org/antlr/codegen/templates/C/C.stg
+++ b/tool/src/main/resources/org/antlr/codegen/templates/C/C.stg
@@ -1447,8 +1447,8 @@
 	//
 <grammar.delegatedRules:{ruleDescriptor|
     <returnType()> <ruleDescriptor.name>(p<name> ctx<if(ruleDescriptor.parameterScope.attributes)>, <endif><ruleDescriptor.parameterScope:parameterScope()>)
-    {
-        <if(ruleDescriptor.hasReturnValue)>return <endif>       ctx-><ruleDescriptor.grammar:delegateName()>-><ruleDescriptor.name>(ctx-><ruleDescriptor.grammar:delegateName()><if(ruleDescriptor.parameterScope.attributes)>, <endif><ruleDescriptor.parameterScope.attributes:{a|<a.name>}; separator=", ">);
+    \{
+        <if(ruleDescriptor.hasReturnValue)>return <endif>ctx-><ruleDescriptor.grammar:delegateName()>-><ruleDescriptor.name>(ctx-><ruleDescriptor.grammar:delegateName()><if(ruleDescriptor.parameterScope.attributes)>, <endif><ruleDescriptor.parameterScope.attributes:{a|<a.name>}; separator=", ">);
 	\}}; separator="\n">
 
 <endif>
@@ -1696,7 +1696,7 @@
 }>
 <endif>
 <if(memoize)>
-ANTLR3_UINT32 <ruleDescriptor.name>_StartIndex;
+ANTLR3_MARKER <ruleDescriptor.name>_StartIndex;
 <endif>
 >>
 
@@ -2132,9 +2132,7 @@
 <if(LEXER)>
     LRECOVER();
 <else>
-<! use following code to make it recover inline;
     RECOVERFROMMISMATCHEDSET(&FOLLOW_set_in_<ruleName><elementIndex>);
-!>
 <endif>
     goto rule<ruleDescriptor.name>Ex;
 }<\n>
@@ -2145,10 +2143,7 @@
 EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
 EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
 <if(PARSER)>
-EXCEPTION->expectingSet = NULL;
-<! use following code to make it recover inline;
 EXCEPTION->expectingSet = &FOLLOW_set_in_<ruleName><elementIndex>;
-!>
 <endif>
 >>
 
@@ -2508,14 +2503,14 @@
 static const ANTLR3_INT32 dfa<dfa.decisionNumber>_T<i0>[] =
     {
 	<table; separator=", ", wrap="\n", null="-1">
-    \};<\n>}; null = "">
+    \};}; null = "">
 
 /* Transition tables are a table of sub tables, with some tables
  * reused for efficiency.
  */
 static const ANTLR3_INT32 * const dfa<dfa.decisionNumber>_transitions[] =
 {
-    <dfa.transitionEdgeTables:{xref|dfa<dfa.decisionNumber>_T<xref>}; separator=", ", wrap="\n", null="NULL">
+    <dfa.transitionEdgeTables:{xref|dfa<dfa.decisionNumber>_T<xref>}; separator=", ", wrap="\n", null="_empty">
 };
 
 <if(dfa.specialStateSTs)>
@@ -2629,7 +2624,7 @@
 
 andPredicates(left,right) ::= "( (<left>) && (<right>) )"
 
-orPredicates(operands) ::= "((<first(operands)>)<rest(operands):{o | ||(<o>)}>)"
+orPredicates(operands) ::= "(<operands:{o|(<o>)}; separator=\"||\">)"
 
 notPredicate(pred) ::= "!( <evalPredicate(pred,{})> )"
 
@@ -2738,7 +2733,7 @@
     // next too far so we don't want to keep freeing and allocating them
     //
     ctx-><scopeStack(sname=scope.name,...)>_limit--;
-    SCOPE_TOP(<scope.name>) = (<scopeType(sname=scope.name)>)(ctx-><scopeStack(sname=scope.name,...)>->get(ctx-><bscopeStack(sname=scope.name,...)>, ctx-><scopeStack(sname=scope.name,...)>_limit - 1));
+    SCOPE_TOP(<scope.name>) = (<scopeType(sname=scope.name)>)(ctx-><scopeStack(sname=scope.name,...)>->get(ctx-><scopeStack(sname=scope.name,...)>, ctx-><scopeStack(sname=scope.name,...)>_limit - 1));
 }
 <endif>
 >>
@@ -3023,7 +3018,7 @@
 %>
 
 delegateName(d) ::= <<
-<if(d.label)><d.label><else>g<d.name><endif>
+<if(d.label)><d.label><else>g<it.name><endif>
 >>
 
 /** Using a type to init value map, try to init a type; if not in table
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/CPP/CPP.stg b/tool/src/main/resources/org/antlr/codegen/templates/CPP/CPP.stg
deleted file mode 100644
index 4488b06..0000000
--- a/tool/src/main/resources/org/antlr/codegen/templates/CPP/CPP.stg
+++ /dev/null
@@ -1,1351 +0,0 @@
-/*
- [The "BSD license"]
- Copyright (c) 2005-2006 Terence Parr
- 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.
-*/
-group Cpp;
-
-cppTypeInitMap ::= [
-	"int":"0",
-	"long":"0",
-	"float":"0.0",
-	"double":"0.0",
-	"bool":"false",
-	"byte":"0",
-	"short":"0",
-	"char":"0",
-	default:"0" // anything other than an atomic type
-]
-
-// What we generate lexer/parser/treeparser, used a suffix in a few places
-generatedType() ::= <<
-<if(LEXER)>Lexer<endif><if(PARSER)>Parser<endif><if(TREE_PARSER)>TreeParser<endif>
->>
-
-leadIn(type) ::=
-<<
-/** \file
- *
- *  This <type> file was generated by ANTLR version <ANTLRVersion>
- *
- *     -  From the grammar source file : <fileName>
- *     -                            On : <generatedTimestamp>
-<if(LEXER)>
- *     -                 for the lexer : <name><\n>
-<endif>
-<if(PARSER)>
- *     -                for the parser : <name><\n>
-<endif>
-<if(TREE_PARSER)>
- *     -           for the tree parser : <name><\n>
-<endif>
- *
- *  Edit at your own peril.
- */
->>
-
-standardHeaders() ::=
-<<
-#include \<antlr3/<generatedType()>.h>
-
-<if(profile)>
-#warning "No profiling support.."
-<endif>
-<if(TREE_PARSER)>
-#warning "No tree parsing yet..."
-<endif>
->>
-
-/** The overall file structure of a recognizer; stores methods for rules
- *  and cyclic DFAs plus support code.
- */
-outputFile(LEXER,PARSER,TREE_PARSER, actionScope, actions,
-			  docComment, recognizer,
-			  name, tokens, tokenNames, rules, cyclicDFAs,
-			  bitsets, buildTemplate, profile,
-			  backtracking, synpreds, memoize, numRules,
-			  fileName, ANTLRVersion, generatedTimestamp, trace,
-			  scopes, superClass) ::=
-<<
-<leadIn("C++ source")>
-<@includes>
-#include "<name><headerFileExtension()>"
-<@end>
-<if(actions.(actionScope).header)>
-// Header action start ========================================================
-<actions.(actionScope).header>
-// Header action end   ========================================================
-<endif>
-
-<headerAction>
-
-<standardHeaders()>
-
-<docComment>
-<recognizer>
->>
-parserHeaderFile() ::= <<
->>
-treeParserHeaderFile() ::= <<
->>
-lexerHeaderFile() ::= <<
-template\<typename StreamType, typename TokenType, typename TokenBuilder>
-class <name> : public antlr3::Lexer\<StreamType,TokenType,TokenBuilder> {
-	// carry over general types
-	typedef typename StreamType::position_type position_type;
-	typedef typename StreamType::char_type char_type;
-
-	typedef antlr3::tokenid_type               tokenid_type;
-	typedef antlr3::channel_type               channel_type;
-	typedef antlr3::decision_type              decision_type;
-	// exception shorthands
-	typedef antlr3::MismatchException\<position_type,char_type>        MismatchException;
-	typedef antlr3::MismatchedRangeException\<position_type,char_type> MismatchedRangeException;
-	typedef antlr3::MismatchedSetException\<position_type,char_type>   MismatchedSetException;
-	typedef antlr3::EarlyExitException\<position_type>       EarlyExitException;
-	typedef antlr3::NoViableAltException\<position_type>     NoViableAltException;
-<if(backtracking)>
-	// @TODO backtracking ruleMemo = new HashMap[<numRules>+1];<\n> <! index from 1..n !>
-<endif>
-
-public:
-	<tokens:{static const tokenid_type <tokenPrefix()><it.name> = <it.type>;}; separator="\n">
-	<scopes:{<if(it.isDynamicGlobalScope)><globalAttributeScope(scope=it)><endif>}>
-	<actions.lexer.members>
-
-	<name>(StreamType* input)
-	: antlr3::Lexer\<StreamType,TokenType,TokenBuilder>(input)
-	{
-	}
-
-<!if(filterMode)!>
-    <!filteringNextToken()!>
-<!endif!>
-	<rules; separator="\n\n">
-
-	// syn preds
-	<synpreds:{p | <lexerSynpred(p)>}>
-
-	// cyclic dfa's
-	<cyclicDFAs:{dfa | DFA<dfa.decisionNumber> dfa<dfa.decisionNumber> = new DFA<dfa.decisionNumber>(this);}; separator="\n">
-	// dfa tables..
-}; // class <name><\n>
->>
-
-headerFile( LEXER,
-            PARSER,
-            TREE_PARSER,
-            actionScope,
-            actions,
-            docComment,
-            recognizer,
-            name,
-            tokens,
-            tokenNames,
-            rules,
-            cyclicDFAs,
-            bitsets,
-            buildTemplate,
-            profile,
-            backtracking,
-            synpreds,
-            memoize,
-            numRules,
-            fileName,
-            ANTLRVersion,
-            generatedTimestamp,
-            trace,
-            scopes,
-            superClass
-        ) ::=
-<<
-#ifndef	_<name>_H
-#define _<name>_H
-<leadIn("C++ header")>
-<actions.(actionScope).headerfile>
-
-<@includes>
-<standardHeaders()>
-<@end>
-
-<if(LEXER)>
-<lexerHeaderFile()>
-<endif>
-<if(PARSER)>
-<parserHeaderFile()>
-<endif>
-<if(TREE_PARSER)>
-<treeParserHeaderFile()>
-<endif>
-
-
-#endif	// _<name>_H<\n>
->>
-
-lexer(grammar, name, tokens, scopes, rules, numRules, labelType="Token",
-      filterMode) ::= <<
-
-<cyclicDFAs:cyclicDFA()> <! dump tables for all DFA !>
-
->>
-
-filteringNextToken() ::= <<
-/** A override of Lexer.nextToken() that backtracks over mTokens() looking
- *  for matches.  No error can be generated upon error; just rewind, consume
- *  a token and then try again.  backtracking needs to be set as well.
- *  Make rule memoization happen only at levels above 1 as we start mTokens
- *  at backtracking==1.
- */
-public Token nextToken() {
-	while (true) {
-		if ( input.LA(1)==CharStream.EOF ) {
-			return Token.EOF_TOKEN;
-		}
-		this->token = 0;
-		tokenStartCharIndex = getCharIndex();
-		try {
-			int m = input.mark();
-			backtracking=1; <! means we won't throw slow exception !>
-			failed=false;
-			mTokens();
-			backtracking=0;
-			<! mTokens backtracks with synpred at backtracking==2
-				and we set the synpredgate to allow actions at level 1. !>
-			if ( failed ) {
-				input.rewind(m);
-				input.consume(); <! advance one char and try again !>
-			}
-			else {
-				return token;
-			}
-		}
-		catch (RecognitionException re) {
-			// shouldn't happen in backtracking mode, but...
-			reportError(re);
-			recover(re);
-		}
-	}
-}
-
-public void memoize(IntStream input, int ruleIndex, int ruleStartIndex)
-{
-	if ( backtracking > 1 )
-		super.memoize(input, ruleIndex, ruleStartIndex);
-}
-
-public boolean alreadyParsedRule(IntStream input, int ruleIndex)
-{
-	if ( backtracking > 1 )
-		return super.alreadyParsedRule(input, ruleIndex);
-	return false;
-}
->>
-
-filteringActionGate() ::= "backtracking == 1"
-
-/** How to generate a parser */
-genericParser(
-	grammar, name, scopes, tokens, tokenNames, rules, numRules, cyclicDFAs,
-	bitsets, inputStreamType, superClass, ASTLabelType="Object",
-	labelType, members, filterMode
-	) ::= <<
-// genericParser
-class <name> : public <@superClassName><superClass><@end> {
-public:
-	static const char* tokenNames[] = {
-		"\<invalid>", "\<EOR>", "\<DOWN>", "\<UP>", <tokenNames; separator=", ">
-	};
-	<tokens:{static tokenid_type <tokenPrefix()><it.name>=<it.type>;}; separator="\n">
-	<scopes:{<if(it.isDynamicGlobalScope)><globalAttributeScope(scope=it)><endif>}>
-	<@members>
-
-	<name>(StreamType* input)
-	: <superClass>\<StreamType,TokenType>(input)
-	{
-<if(backtracking)>
-		ruleMemo = new HashMap[<numRules>+1];<\n> <! index from 1..n !>
-<endif>
-	}
-	<@end>
-
-	//@TODO public String[] getTokenNames() { return tokenNames; }
-	//@TODO public String getGrammarFileName() { return "<fileName>"; }
-	<members>
-
-	<rules; separator="\n\n">
-
-	<synpreds:{p | <synpred(p)>}>
-
-	<cyclicDFAs:{dfa | protected DFA<dfa.decisionNumber> dfa<dfa.decisionNumber> = new DFA<dfa.decisionNumber>(this);}; separator="\n">
-	<cyclicDFAs:cyclicDFA()> <! dump tables for all DFA !>
-
-	<bitsets:bitset(name={FOLLOW_<it.name>_in_<it.inName><it.tokenIndex>},
-							words64=it.bits)>
-};
->>
-
-parser(
-	grammar, name, scopes, tokens, tokenNames,
-	rules, numRules, bitsets, ASTLabelType,
-	superClass="Parser", labelType="Token",
-	members={<actions.parser.members>}) ::= <<
-<genericParser(inputStreamType="TokenStream", ...)>
->>
-
-/** How to generate a tree parser; same as parser except the input
- *  stream is a different type.
- */
-treeParser(grammar, name, scopes, tokens, tokenNames, globalAction,
-	rules, numRules,
-	bitsets,
-	labelType={<ASTLabelType>}, ASTLabelType="Object",
-	superClass="TreeParser", members={<actions.treeparser.members>}, filterMode
-	) ::= <<
-<genericParser(inputStreamType="TreeNodeStream", ...)>
->>
-
-/** A simpler version of a rule template that is specific to the imaginary
- *  rules created for syntactic predicates.  As they never have return values
- *  nor parameters etc..., just give simplest possible method.  Don't do
- *  any of the normal memoization stuff in here either; it's a waste.
- *  As predicates cannot be inlined into the invoking rule, they need to
- *  be in a rule by themselves.
- */
-synpredRule(ruleName, ruleDescriptor, block, description, nakedBlock) ::=
-<<
-// $ANTLR start <ruleName>
-public void <ruleName>_fragment(<ruleDescriptor.parameterScope:parameterScope(scope=it)>) throws RecognitionException {
-	<if(trace)>System.out.println("enter <ruleName> "+input.LT(1)+" failed="+failed+" backtracking="+backtracking);<endif>
-<if(trace)>
-	try {
-		<block>
-	}
-	finally {
-		System.out.println("exit <ruleName> "+input.LT(1)+" failed="+failed+" backtracking="+backtracking);
-	}
-<else>
-	<block>
-<endif>
-}
-// $ANTLR end <ruleName>
->>
-
-synpred(name) ::= <<
-public boolean <name>() {
-    this->backtracking++;
-    <@start()>
-    int start = input.mark();
-    try {
-        <name>_fragment(); // can never throw exception
-    } catch (RecognitionException re) {
-        System.err.println("impossible: "+re);
-    }
-    boolean success = ! this->failed;
-    input.rewind(start);
-    <@stop()>
-    this->backtracking--;
-    this->failed = false;
-    return success;
-}<\n>
->>
-
-lexerSynpred(name) ::= <<
-<synpred(name)>
->>
-
-ruleMemoization(name) ::= <<
-<if(memoize)>
-if ( backtracking > 0 && alreadyParsedRule(input, <ruleDescriptor.index>) )
-	return <ruleReturnValue()>;
-<endif>
->>
-
-/** How to test for failure and return from rule */
-checkRuleBacktrackFailure() ::= <<
-<if(backtracking)>
-if (failed)
-	return <ruleReturnValue()>;
-<endif>
->>
-
-/** This rule has failed, exit indicating failure during backtrack */
-ruleBacktrackFailure() ::= <<
-<if(backtracking)>
-if (backtracking > 0)
-{
-	failed = true;
-	return <ruleReturnValue()>;
-}
-<endif>
->>
-
-/** How to generate code for a rule.  This includes any return type
- *  data aggregates required for multiple return values.
- */
-rule(ruleName,ruleDescriptor,block,emptyRule,description,exceptions,memoize) ::= <<
-<ruleAttributeScope(scope=ruleDescriptor.ruleScope)>
-<returnScope(scope=ruleDescriptor.returnScope)>
-
-// $ANTLR start <ruleName>
-// <fileName>:<description>
-public <returnType()> <ruleName>(<ruleDescriptor.parameterScope:parameterScope(scope=it)>) throw(antlr3::BaseRecognitionException)
-{
-<if(trace)>
-	antlr3::Tracer trace(this,"<ruleName>");
-	System.out.println("enter <ruleName> "+input.LT(1)+" failed="+failed+" backtracking="+backtracking);
-<endif>
-	<ruleDeclarations()>
-	<ruleLabelDefs()>
-	<ruleDescriptor.actions.init>
-	<@preamble()>
-	try {
-		<ruleMemoization(name=ruleName)>
-		<block>
-	}
-<if(exceptions)>
-	<exceptions:{e|<catch(decl=e.decl,action=e.action)><\n>}>
-<else>
-<if(!emptyRule)>
-<if(actions.(actionScope).rulecatch)>
-	<actions.(actionScope).rulecatch>
-<else>
-	catch (RecognitionException re) {
-		reportError(re);
-		recover(input,re);
-	}<\n>
-<endif>
-<endif>
-<endif>
-	finally {
-		<if(trace)>System.out.println("exit <ruleName> "+input.LT(1)+" failed="+failed+" backtracking="+backtracking);<endif>
-		<ruleCleanUp()>
-		<(ruleDescriptor.actions.finally):execAction()>
-	}
-	<@postamble()>
-	return <ruleReturnValue()>;
-}
-// $ANTLR end <ruleName>
->>
-
-catch(decl,action) ::= <<
-catch (<e.decl>) {
-    <e.action>
-}
->>
-
-ruleDeclarations() ::= <<
-<ruleDescriptor.useScopes:{<it>_stack.push(new <it>_scope());}; separator="\n">
-<ruleDescriptor.ruleScope:{<it.name>_stack.push(new <it.name>_scope());}; separator="\n">
-<if(ruleDescriptor.hasMultipleReturnValues)>
-<returnType()> retval = new <returnType()>();
-retval.start = input.LT(1);<\n>
-<else>
-<ruleDescriptor.returnScope.attributes:{ a |
-<a.type> <a.name> = <if(a.initValue)><a.initValue><else><initValue(a.type)><endif>;
-}>
-<endif>
-<if(memoize)>
-int <ruleDescriptor.name>_StartIndex = input.index();
-<endif>
->>
-
-ruleLabelDefs() ::= <<
-<[ruleDescriptor.tokenLabels,ruleDescriptor.tokenListLabels]
-    :{<labelType> <it.label.text>=null;}; separator="\n"
->
-<[ruleDescriptor.tokenListLabels,ruleDescriptor.ruleListLabels]
-    :{List list_<it.label.text>=null;}; separator="\n"
->
-<[ruleDescriptor.ruleLabels,ruleDescriptor.ruleListLabels]
-    :ruleLabelDef(label=it); separator="\n"
->
-<[ruleDescriptor.allRuleRefsInAltsWithRewrites,ruleDescriptor.allTokenRefsInAltsWithRewrites]
-    :{List list_<it>=new ArrayList();}; separator="\n"
->
->>
-
-ruleReturnValue() ::= <<
-<if(!ruleDescriptor.isSynPred)>
-<if(ruleDescriptor.hasReturnValue)>
-<if(ruleDescriptor.hasSingleReturnValue)>
-<ruleDescriptor.singleValueReturnName>
-<else>
-retval
-<endif>
-<endif>
-<endif>
->>
-
-ruleCleanUp() ::= <<
-<ruleDescriptor.useScopes:{<it>_stack.pop();}; separator="\n">
-<ruleDescriptor.ruleScope:{<it.name>_stack.pop();}; separator="\n">
-<if(ruleDescriptor.hasMultipleReturnValues)>
-retval.stop = input.LT(-1);<\n>
-<endif>
-<if(memoize)>
-<if(backtracking)>
-if ( backtracking > 0 ) { memoize(input, <ruleDescriptor.index>, <ruleDescriptor.name>_StartIndex); }
-<endif>
-<endif>
->>
-
-/** How to generate a rule in the lexer; naked blocks are used for
- *  fragment rules.
- */
-lexerRule(ruleName,nakedBlock,ruleDescriptor,block,memoize) ::= <<
-void m<ruleName>(<ruleDescriptor.parameterScope:parameterScope(scope=it)>) throw(antlr3::BaseRecognitionException)
-{
-<if(trace)>
-	antlr3::Tracer trace(this,"<ruleName>");
-<endif>
-	antlr3::CountScope nestingTracker(this->ruleNestingLevel);
-	StreamType& input(this->getInput());
-<if(nakedBlock)>
-	<ruleDescriptor.actions.init>
-	<ruleMemoization(name=ruleName)>
-	<block><\n>
-<else>
-	tokenid_type type = <tokenPrefix()><ruleName>;
-	channel_type channel = antlr3::Token::DEFAULT_CHANNEL;
-	position_type start(input.getPosition());
-	<ruleDescriptor.actions.init>
-	<ruleMemoization(name=ruleName)>
-	<block>
-	<! create token if none exists *and* we are an outermost token rule !>
-	<execAction({if ( this->token == 0 && this->ruleNestingLevel == 1 ) {
-	TokenType *tt = TokenBuilder::build(type,start,input,channel);
-	std::cout \<\< (*tt) \<\< std::endl;
-	this->emit(tt);
-	}<\n>
-})>
-<endif>
-}
->>
-
-/** How to generate code for the implicitly-defined lexer grammar rule
- *  that chooses between lexer rules.
- */
-tokensRule(ruleName,nakedBlock,args,block,ruleDescriptor) ::= <<
-void mTokens() throw(antlr3::BaseRecognitionException)
-{
-	StreamType& input(this->getInput());
-	<block><\n>
-}
->>
-
-// S U B R U L E S
-
-/** A (...) subrule with multiple alternatives */
-block(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,
-	maxK,maxAlt,description) ::= <<
-// block <fileName>:<description>
-decision_type alt<decisionNumber>=<maxAlt>;
-<decls>
-<@predecision()>
-<decision>
-<@postdecision()>
-<@prebranch()>
-switch (alt<decisionNumber>) {
-    <alts:altSwitchCase()>
-}
-<@postbranch()>
->>
-
-/** A rule block with multiple alternatives */
-ruleBlock(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,maxK,maxAlt,description) ::= <<
-// ruleBlock <fileName>:<description>
-decision_type alt<decisionNumber>=<maxAlt>;
-<decls>
-<@predecision()>
-<decision>
-<@postdecision()>
-switch (alt<decisionNumber>) {
-    <alts:altSwitchCase()>
-}
->>
-
-ruleBlockSingleAlt(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,description) ::= <<
-// ruleBlockSingleAlt <fileName>:<description>
-<decls>
-<@prealt()>
-<alts>
-<@postalt()>
->>
-
-/** A special case of a (...) subrule with a single alternative */
-blockSingleAlt(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,description) ::= <<
-// <fileName>:<description>
-<decls>
-<@prealt()>
-<alts>
-<@postalt()>
->>
-
-/** A (..)+ block with 0 or more alternatives */
-positiveClosureBlock(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,maxK,maxAlt,description) ::= <<
-// positiveClosureBlock <fileName>:<description>
-decision_type cnt<decisionNumber>=0;
-<decls>
-<@preloop()>
-do {
-	decision_type alt<decisionNumber>=<maxAlt>;
-	<@predecision()>
-	<decision>
-	<@postdecision()>
-	switch (alt<decisionNumber>) {
-	<alts:altSwitchCase()>
-	default :
-		if ( cnt<decisionNumber> >= 1 )
-			goto loop<decisionNumber>;
-            EarlyExitException eee( input.getPosition(), <decisionNumber> );
-				<@earlyExitException()>
-            throw eee;
-	}
-	cnt<decisionNumber>++;
-} while (true);
-loop<decisionNumber>: ;
-<@postloop()>
->>
-
-positiveClosureBlockSingleAlt ::= positiveClosureBlock
-
-/** A (..)* block with 1 or more alternatives */
-closureBlock(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,maxK,maxAlt,description) ::= <<
-// closureBlock <fileName>:<description>
-<decls>
-<@preloop()>
-do {
-	decision_type alt<decisionNumber>=<maxAlt>;
-	<@predecision()>
-	<decision>
-	<@postdecision()>
-	switch (alt<decisionNumber>) {
-	<alts:altSwitchCase()>
-	default :
-		goto loop<decisionNumber>;
-	}
-} while (true);
-loop<decisionNumber>: ;
-<@postloop()>
->>
-
-closureBlockSingleAlt ::= closureBlock
-
-/** Optional blocks (x)? are translated to (x|) by before code generation
- *  so we can just use the normal block template
- */
-optionalBlock ::= block
-
-optionalBlockSingleAlt ::= block
-
-/** A case in a switch that jumps to an alternative given the alternative
- *  number.  A DFA predicts the alternative and then a simple switch
- *  does the jump to the code that actually matches that alternative.
- */
-altSwitchCase() ::= <<
-case <i> :
-	<@prealt()>
-	<it>
-	break;<\n>
->>
-
-/** An alternative is just a list of elements; at outermost level */
-alt(elements,altNum,description,autoAST,outerAlt) ::= <<
-// alt <fileName>:<description>
-{
-	<@declarations()>
-	<elements:element()>
-	<@cleanup()>
-}
->>
-
-// E L E M E N T S
-
-/** Dump the elements one per line */
-element() ::= <<
-// element <fileName>:<description>
-<@prematch()>
-<it.el><\n>
->>
-
-/** match a token optionally with a label in front */
-tokenRef(token,label,elementIndex) ::= <<
-// tokenRef
-<if(label)>
-<label> = input.LT(1);<\n>
-<endif>
-this->match(input,<token>,FOLLOW_<token>_in_<ruleName><elementIndex>);
-<checkRuleBacktrackFailure()>
->>
-
-/** ids+=ID no AST building */
-tokenRefAndListLabel(token,label,elementIndex) ::= <<
-<tokenRef(...)>
-<listLabel(...)>
->>
-
-listLabel(label) ::= <<
-if (list_<label>==null) list_<label>=new ArrayList();
-list_<label>.add(<label>);<\n>
->>
-
-/** match a character */
-charRef(char,label) ::= <<
-// charRef
-<if(label)>
-<tokenid_type()> <label> = input.LA(1);<\n>
-<endif>
-this->match(<char>);
-<checkRuleBacktrackFailure()>
->>
-
-/** match a character range */
-charRangeRef(a,b) ::= "this->matchRange(<a>,<b>); <checkRuleBacktrackFailure()>"
-
-/** For now, sets are interval tests and must be tested inline */
-matchSet(s,label,elementIndex,postmatchCode="") ::= <<
-// matchSet
-<if(label)>
-<label> = input.LT(1);<\n>
-<endif>
-if ( <s> )
-{
-	<postmatchCode>
-	input.consume();
-<if(!LEXER)>
-	errorRecovery=false;
-<endif>
-	<if(backtracking)>failed=false;<endif>
-}
-else
-{
-	<ruleBacktrackFailure()>
-	MismatchedSetException mse(input.getPosition(),input.LA(1));
-	<@mismatchedSetException()>
-<if(LEXER)>
-	this->recover(mse);
-<else>
-	this->recoverFromMismatchedSet(input,mse,FOLLOW_set_in_<ruleName><elementIndex>);
-<endif>
-	throw mse;
-}<\n>
->>
-
-matchSetAndListLabel(s,label,elementIndex,postmatchCode) ::= <<
-<matchSet(...)>
-<listLabel(...)>
->>
-
-/** Match a string literal */
-lexerStringRef(string,label,elementIndex) ::= <<
-// lexerStringRef
-<if(label)>
-position_type <label>Start(input.getPosition());
-this->match( <string> );
-<checkRuleBacktrackFailure()>
-TokenType* <label> = TokenBuilder::build(Token.INVALID_TOKEN_TYPE,<label>Start,input,Token.DEFAULT_CHANNEL);
-<else>
-this->match( <string> );
-<checkRuleBacktrackFailure()><\n>
-<endif>
->>
-
-wildcard(label,elementIndex) ::= <<
-<if(label)>
-<label> = input.LT(1);<\n>
-<endif>
-this->matchAny( input );
-<checkRuleBacktrackFailure()>
->>
-
-wildcardAndListLabel(label,elementIndex) ::= <<
-<wildcard(...)>
-<listLabel(...)>
->>
-
-/** Match . wildcard */
-wildcardChar(label, elementIndex) ::= <<
-<if(label)>
-<tokenid_type()> <label> = input.LA(1);<\n>
-<endif>
-this->matchAny();
-<checkRuleBacktrackFailure()>
->>
-
-tokenid_type() ::= "<if(LEXER)>char_type<else>tokenid_type<endif>"
-
-wildcardCharListLabel(label, elementIndex) ::= <<
-<wildcardChar(...)>
-<listLabel(...)>
->>
-
-/** Match a rule reference by invoking it possibly with arguments
- *  and a return value or values.
- */
-ruleRef(rule,label,elementIndex,args) ::= <<
-following.push(FOLLOW_<rule>_in_<ruleName><elementIndex>);
-<if(label)>
-<label>=<rule>(<args>);<\n>
-<else>
-<rule>(<args>);<\n>
-<endif>
-following.pop();
-<checkRuleBacktrackFailure()>
->>
-
-/** ids+=ID */
-ruleRefAndListLabel(rule,label,elementIndex,args) ::= <<
-<ruleRef(...)>
-<listLabel(...)>
->>
-
-/** A lexer rule reference */
-lexerRuleRef(rule,label,args) ::= <<
-<if(label)>
-position_type <label>Start(input.getPosition());
-m<rule>(<args>);
-<checkRuleBacktrackFailure()>
-TokenType* <label> = TokenBuilder::build(Token.INVALID_TOKEN_TYPE,<label>Start,input,Token.DEFAULT_CHANNEL);
-<else>
-m<rule>(<args>);
-<checkRuleBacktrackFailure()>
-<endif>
->>
-
-/** EOF in the lexer */
-lexerMatchEOF(label) ::= <<
-<if(label)>
-position_type <label>Start(input.getPosition());
-match(EOF);
-<checkRuleBacktrackFailure()>
-TokenType* <label> = TokenBuilder::build(Token.EOF,<label>Start,input,Token.DEFAULT_CHANNEL);
-<else>
-match(EOF);
-<checkRuleBacktrackFailure()>
-<endif>
->>
-
-/** match ^(root children) in tree parser */
-tree(root, children, nullableChildList) ::= <<
-<root:element()>
-<if(nullableChildList)>
-if ( input.LA(1)==antlr3::Token::DOWN ) {
-    match(input, antlr3::Token::DOWN, null);
-    <checkRuleBacktrackFailure()>
-    <children:element()>
-    match(input, antlr3::Token::UP, null);
-    <checkRuleBacktrackFailure()>
-}
-<else>
-match(input, antlr3::Token::DOWN, null);
-<checkRuleBacktrackFailure()>
-<children:element()>
-match(input, antlr3::Token::UP, null);
-<checkRuleBacktrackFailure()>
-<endif>
->>
-
-/** Every predicate is used as a validating predicate (even when it is
- *  also hoisted into a prediction expression).
- */
-validateSemanticPredicate(pred,description) ::= <<
-if ( !(<evalPredicate(...)>) ) {
-	<ruleBacktrackFailure()>
-	throw new FailedPredicateException(input, "<ruleName>", "<description>");
-}
->>
-
-// F i x e d  D F A  (if-then-else)
-dfaState(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
-<if(!semPredState)>
-<tokenid_type()> LA<decisionNumber>_<stateNumber> = input.LA(<k>);<\n>
-<endif>
-<edges; separator="\nelse ">
-else
-{
-<if(eotPredictsAlt)>
-	alt<decisionNumber> = <eotPredictsAlt>;<\n>
-<else>
-	<ruleBacktrackFailure()>
-	NoViableAltException nvae(input.getPosition(), "<description>", <decisionNumber>, <stateNumber>);<\n>
-	<@noViableAltException()>
-	throw nvae;<\n>
-<endif>
-}
->>
-
-/** Same as a normal DFA state except that we don't examine lookahead
- *  for the bypass alternative.  It delays error detection but this
- *  is faster, smaller, and more what people expect.  For (X)? people
- *  expect "if ( LA(1)==X ) match(X);" and that's it.
- */
-dfaOptionalBlockState(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
-<if(!semPredState)>
-<tokenid_type()> LA<decisionNumber>_<stateNumber> = input.LA(<k>);
-<endif>
-<edges; separator="\nelse ">
->>
-
-/** A DFA state that is actually the loopback decision of a closure
- *  loop.  If end-of-token (EOT) predicts any of the targets then it
- *  should act like a default clause (i.e., no error can be generated).
- *  This is used only in the lexer so that for ('a')* on the end of a rule
- *  anything other than 'a' predicts exiting.
- */
-dfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
-<if(!semPredState)>
-<tokenid_type()> LA<decisionNumber>_<stateNumber> = input.LA(<k>);
-<endif>
-<edges; separator="\nelse "><\n>
-<if(eotPredictsAlt)>
-else
-{
-	alt<decisionNumber> = <eotPredictsAlt>;
-}<\n>
-<endif>
->>
-
-/** An accept state indicates a unique alternative has been predicted */
-dfaAcceptState(alt) ::= "alt<decisionNumber> = <alt>;"
-
-/** A simple edge with an expression.  If the expression is satisfied,
- *  enter to the target state.  To handle gated productions, we may
- *  have to evaluate some predicates for this edge.
- */
-dfaEdge(labelExpr, targetState, predicates) ::= <<
-if ( (<labelExpr>) <if(predicates)>&& (<predicates>)<endif>)
-{
-	<targetState>
-}
->>
-
-// F i x e d  D F A  (switch case)
-
-/** A DFA state where a SWITCH may be generated.  The code generator
- *  decides if this is possible: CodeGenerator.canGenerateSwitch().
- */
-dfaStateSwitch(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
-switch ( input.LA(<k>) ) {
-<edges; separator="\n">
-default:
-<if(eotPredictsAlt)>
-	alt<decisionNumber> = <eotPredictsAlt>;
-<else>
-	NoViableAltException nvae( input.getPosition(), "<description>", <decisionNumber>, <stateNumber> );<\n>
-	<@noViableAltException()>
-	throw nvae;<\n>
-<endif>
-}<\n>
->>
-
-dfaOptionalBlockStateSwitch(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
-switch ( input.LA(<k>) ) {
-	<edges; separator="\n">
-}<\n>
->>
-
-dfaLoopbackStateSwitch(k, edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
-switch ( input.LA(<k>) ) {
-<edges; separator="\n"><\n>
-<if(eotPredictsAlt)>
-default:
-	alt<decisionNumber> = <eotPredictsAlt>;
-	break;<\n>
-<endif>
-}<\n>
->>
-
-dfaEdgeSwitch(labels, targetState) ::= <<
-<labels:{case <it>:}; separator="\n"> {
-	<targetState>
-} break;
->>
-
-// C y c l i c  D F A
-
-/** The code to initiate execution of a cyclic DFA; this is used
- *  in the rule to predict an alt just like the fixed DFA case.
- *  The <name> attribute is inherited via the parser, lexer, ...
- */
-dfaDecision(decisionNumber,description) ::= <<
-// dfaDecision
-alt<decisionNumber> = predictDFA<decisionNumber>(input);
->>
-
-/** The overall cyclic DFA chunk; contains all the DFA states */
-cyclicDFA(dfa) ::= <<
-/* cyclicDFA=<dfa>
-*/
-// cyclic    = <dfa.cyclic>
-// numstates = <dfa.numberOfStates>
-
-// startState = <dfa.startState>
-// startState.numberOfTransitions = <dfa.startState.NumberOfTransitions>
-// startState.lookaheadDepth = <dfa.startState.LookaheadDepth>
-
-const static short <name>dfa<dfa.decisionNumber>_eot[<dfa.numberOfStates>] = {
-	<dfa.eot; wrap="\n     ", separator=",", null="-1">
-};
-const static short <name>dfa<dfa.decisionNumber>_eof[<dfa.numberOfStates>] = {
-	<dfa.eof; wrap="\n     ", separator=",", null="-1">
-};
-const static unichar <name>dfa<dfa.decisionNumber>_min[<dfa.numberOfStates>] = {
-	<dfa.min; wrap="\n     ", separator=",", null="0">
-};
-const static unichar <name>dfa<dfa.decisionNumber>_max[<dfa.numberOfStates>] = {
-	<dfa.max; wrap="\n     ", separator=",", null="0">
-};
-const static short <name>dfa<dfa.decisionNumber>_accept[<dfa.numberOfStates>] = {
-	<dfa.accept; wrap="\n     ", separator=",", null="-1">
-};
-const static short <name>dfa<dfa.decisionNumber>_special[<dfa.numberOfStates>] = {
-	<dfa.special; wrap="\n     ", separator=",", null="-1">
-};
-<dfa.edgeTransitionClassMap.keys:{ table |
-const static short <name>dfa<dfa.decisionNumber>_transition<i0>[] = {
-	<table; separator=", ", wrap="\n	", null="-1">
-};
-}; null="">
-const static short <name>dfa<dfa.decisionNumber>_transition[] = {
-	<dfa.transitionEdgeTables:{whichTable|<name>dfa<dfa.decisionNumber>_transition<whichTable>,}; separator="\n", null="0 /* fixme? */">
-};
-	<! add attribute for the DFA !>
-	DFA\<char_type> dfa<dfa.decisionNumber>;
-<! this should go in the initializer of the thing
-- (id) init
-{
-	if ((self = [super init]) != nil) {
-		eot = <name>dfa<dfa.decisionNumber>_eot;
-		eof = <name>dfa<dfa.decisionNumber>_eof;
-		min = <name>dfa<dfa.decisionNumber>_min;
-		max = <name>dfa<dfa.decisionNumber>_max;
-		accept = <name>dfa<dfa.decisionNumber>_accept;
-		special = <name>dfa<dfa.decisionNumber>_special;
-		if (!(transition = calloc(<dfa.numberOfStates>, sizeof(void*)))) {
-			[self release];
-			return nil;
-		}
-		<dfa.transitionEdgeTables:{whichTable|transition[<i0>] = <name>dfa<dfa.decisionNumber>_transition<whichTable>;}; separator="\n", null="">
-	}
-	return self;
-}
-!>
-
-<if(dfa.specialStateSTs)>
-int specialStateTransition( int state )
-{
-	int s = state;
-	switch ( s ) {
- 		<dfa.specialStateSTs:{state |
-		case <i0> : <! compressed special state numbers 0..n-1 !>
-		<state>}; separator="\n">
-	}
-<if(backtracking)>
-	if ( recognizer.isBacktracking() ) {
-		recognizer.setFailed();
-		return -1;
-	}<\n>
-<endif>
-	noViableAlt(s, input);
-}<\n>
-<endif>
-
-
-<\n>
-
-// <dfa.description>
-decision_type predictDFA<dfa.decisionNumber>( StreamType& input )
-{
-	/* mark current location (rewind automatically when the rewinder goes
-	 * out of scope */
-	antlr3::Rewinder\<position_type> markPoint(input.getPosition());
-	goto s0;	// goto start...
-	// ...
-	throw NoViableAltException( input.getPosition(), "<dfa.description>", <dfa.decisionNumber>, 0 /* fixme */ );<\n>
-}<\n>
->>
-
-/** A state in a cyclic DFA */
-cyclicDFAState(decisionNumber,stateNumber,edges,needErrorClause,semPredState) ::= <<
-// cyclicDFAState
-s<stateNumber>: {
-	<if(semPredState)>
-	input.rewind();<\n>
-	<else>
-	<tokenid_type()> LA<decisionNumber>_<stateNumber> = input.LA(1);
-	<endif>
-	<edges>
-	<if(needErrorClause)>
-	throw NoViableAltException( input.getPosition(), "<description>", <decisionNumber>, <stateNumber> );<\n>
-	<endif><\n>
-}<\n>
->>
-
-/** Just like a fixed DFA edge, test the lookahead and indicate what
- *  state to jump to next if successful.
- */
-cyclicDFAEdge(labelExpr, targetStateNumber, edgeNumber, predicates) ::= <<
-// cyclicDFAEdge
-if ( (<labelExpr>) <if(predicates)>&& (<predicates>)<endif>)
-{
-	input.consume();
-	goto s<targetStateNumber>;
-}<\n>
->>
-
-/** An edge pointing at end-of-token; essentially matches any char;
- *  always jump to the target.
- */
-eotDFAEdge(targetStateNumber,edgeNumber, predicates) ::= "goto s<targetStateNumber>;"
-
-// D F A  E X P R E S S I O N S
-
-andPredicates(left,right) ::= "(<left> && <right>)"
-
-orPredicates(operands) ::= "(<first(operands)><rest(operands):{o | ||<o>}>)"
-
-notPredicate(pred) ::= "!(<pred>)"
-
-evalPredicate(pred,description) ::= "<pred>"
-
-evalSynPredicate(pred,description) ::= "<pred>()"
-
-lookaheadTest(atom,k,atomAsInt) ::= "LA<decisionNumber>_<stateNumber>==<atom>"
-
-/** Sometimes a lookahead test cannot assume that LA(k) is in a temp variable
- *  somewhere.  Must ask for the lookahead directly.
- */
-isolatedLookaheadTest(atom,k,atomAsInt) ::= "input.LA(<k>)==<atom>"
-
-lookaheadRangeTest(lower,upper,k,rangeNumber,lowerAsInt,upperAsInt) ::= <<
-(LA<decisionNumber>_<stateNumber>\>=<lower> && LA<decisionNumber>_<stateNumber>\<=<upper>)
->>
-
-isolatedLookaheadRangeTest(lower,upper,k,rangeNumber,lowerAsInt,upperAsInt) ::= "(input.LA(<k>)\>=<lower> && input.LA(<k>)\<=<upper>)"
-
-setTest(ranges) ::= "<ranges; separator=\"||\">"
-
-// A T T R I B U T E S
-
-globalAttributeScope(scope) ::= <<
-<if(scope.attributes)>
-protected static class <scope.name> {
-    <scope.attributes:{<it.decl>;}; separator="\n">
-}
-protected Stack <scope.name>_stack = new Stack();<\n>
-<endif>
->>
-
-ruleAttributeScope(scope) ::= <<
-<if(scope.attributes)>
-protected static class <scope.name>_scope {
-    <scope.attributes:{<it.decl>;}; separator="\n">
-}
-protected Stack <scope.name>_stack = new Stack();<\n>
-<endif>
->>
-
-returnType() ::= <<
-<if(ruleDescriptor.hasMultipleReturnValues)>
-<ruleDescriptor.name>_return
-<else>
-<if(ruleDescriptor.singleValueReturnType)>
-<ruleDescriptor.singleValueReturnType>
-<else>
-void
-<endif>
-<endif>
->>
-
-ruleLabelType(referencedRule) ::= <<
-<if(referencedRule.hasMultipleReturnValues)>
-<referencedRule.name>_return
-<else>
-<if(referencedRule.singleValueReturnType)>
-<referencedRule.singleValueReturnType>
-<else>
-void
-<endif>
-<endif>
->>
-
-/** Using a type to init value map, try to init a type; if not in table
- *  must be an object, default value is "null".
- */
-initValue(typeName) ::= <<
-<javaTypeInitMap.(typeName)>
->>
-
-ruleLabelDef(label) ::= <<
-<ruleLabelType(referencedRule=label.referencedRule)> <label.label.text> = <initValue(typeName=ruleLabelType(referencedRule=label.referencedRule))>;<\n>
->>
-
-returnScope(scope) ::= <<
-<if(ruleDescriptor.hasMultipleReturnValues)>
-public static class <returnType()> {
-    <labelType> start, stop;
-<if(buildAST)>
-    <ASTLabelType> tree;
-<else>
-<if(buildTemplate)>
-    StringTemplate st;
-<endif>
-<endif>
-    <scope.attributes:{<it.decl>;}; separator="\n">
-};
-<endif>
->>
-
-parameterScope(scope) ::= <<
-<scope.attributes:{<it.decl>}; separator=", ">
->>
-
-/** Used in codegen.g to translate $x.y references.
- *  I could have left actions as StringTemplates to be inserted in
- *  the output (so they could use attributes inherited from surrounding
- *  templates), but really wanted to pass in AttributeScope and Attribute
- *  objects so this translation could query them.  So, translation of
- *  $x.y to executable code occurs before recognizerST.toString() occurs.
- *  I.e., actions are just text strings during final code generation.
- */
-globalAttributeRef(scope,attr) ::= <<
-((<scope>)<scope>_stack.peek()).<attr.name>
->>
-
-parameterAttributeRef(attr) ::= "<attr.name>"
-
-scopeAttributeRef(scope,attr,index,negIndex) ::= <<
-<if(negIndex)>
-((<scope>_scope)<scope>_stack.elementAt(<scope>_stack.size()-<negIndex>-1)).<attr.name>
-<else>
-<if(index)>
-((<scope>_scope)<scope>_stack.elementAt(<index>)).<attr.name>
-<else>
-((<scope>_scope)<scope>_stack.peek()).<attr.name>
-<endif>
-<endif>
->>
-
-/** $x is either global scope or x is rule with dynamic scope; refers
- *  to stack itself not top of stack.  This is useful for predicates
- *  like {$function.size()>0 && $function::name.equals("foo")}?
- */
-isolatedDynamicScopeRef(scope) ::= "<scope>_stack"
-
-/** reference an attribute of rule; might only have single return value */
-ruleLabelRef(referencedRule,scope,attr) ::= <<
-<if(referencedRule.singleValueReturnType)>
-<scope>
-<else>
-<scope>.<attr.name>
-<endif>
->>
-
-returnAttributeRef(ruleDescriptor,attr) ::= <<
-<if(ruleDescriptor.singleValueReturnType)>
-<attr.name>
-<else>
-retval.<attr.name>
-<endif>
->>
-
-/** How to translate $tokenLabel */
-tokenLabelRef(label) ::= "<label>"
-
-/** ids+=ID {$ids} or e+=expr {$e} */
-listLabelRef(label) ::= "list_<label>"
-
-// not sure the next are the right approach; and they are evaluated early;
-// they cannot see TREE_PARSER or PARSER attributes for example. :(
-
-tokenLabelPropertyRef_text(scope,attr) ::= "<scope>.getText()"
-tokenLabelPropertyRef_type(scope,attr) ::= "<scope>.getType()"
-tokenLabelPropertyRef_line(scope,attr) ::= "<scope>.getLine()"
-tokenLabelPropertyRef_pos(scope,attr) ::= "<scope>.getCharPositionInLine()"
-tokenLabelPropertyRef_channel(scope,attr) ::= "<scope>.getChannel()"
-tokenLabelPropertyRef_index(scope,attr) ::= "<scope>.getTokenIndex()"
-tokenLabelPropertyRef_tree(scope,attr) ::= "<scope>_tree"
-
-ruleLabelPropertyRef_start(scope,attr) ::= "<scope>.start"
-ruleLabelPropertyRef_stop(scope,attr) ::= "<scope>.stop"
-ruleLabelPropertyRef_tree(scope,attr) ::= "<scope>.tree"
-ruleLabelPropertyRef_text(scope,attr) ::= "input.toString(<scope>.start,<scope>.stop)"
-ruleLabelPropertyRef_st(scope,attr) ::= "<scope>.st"
-
-/** Isolated $RULE ref ok in lexer as it's a Token */
-lexerRuleLabel(label) ::= "<label>"
-
-lexerRuleLabelPropertyRef_type(scope,attr) ::= "<scope>.getType()"
-lexerRuleLabelPropertyRef_line(scope,attr) ::= "<scope>.getLine()"
-lexerRuleLabelPropertyRef_pos(scope,attr) ::= "<scope>.getCharPositionInLine()"
-lexerRuleLabelPropertyRef_channel(scope,attr) ::= "<scope>.getChannel()"
-lexerRuleLabelPropertyRef_index(scope,attr) ::= "<scope>.getTokenIndex()"
-lexerRuleLabelPropertyRef_text(scope,attr) ::= "<scope>.getText()"
-
-// Somebody may ref $template or $tree or $stop within a rule:
-rulePropertyRef_start(scope,attr) ::= "((<labelType>)retval.start)"
-rulePropertyRef_stop(scope,attr) ::= "((<labelType>)retval.stop)"
-rulePropertyRef_tree(scope,attr) ::= "((<ASTLabelType>)retval.tree)"
-rulePropertyRef_text(scope,attr) ::= "input.toString(retval.start,input.LT(-1))"
-rulePropertyRef_st(scope,attr) ::= "retval.st"
-
-// A C T I O N S
-
-emit(type) ::= "emit(<type>);"
-
-setType(type) ::= "setType(<type>);"
-
-/** How to execute an action */
-execAction(action) ::= <<
-<if(backtracking)>
-<if(actions.(actionScope).synpredgate)>
-if ( <actions.(actionScope).synpredgate> )
-{
-	<action>
-}
-<else>
-if ( backtracking == 0 )
-{
-	<action>
-}
-<endif>
-<else>
-<action>
-<endif>
->>
-
-// M I S C (properties, etc...)
-
-bitset(name, words64) ::= <<
-public static final BitSet <name> = new BitSet(new long[]{<words64:{<it>L};separator=",">});<\n>
->>
-
-tokenPrefix() ::= "TOK_"
-codeFileExtension() ::= ".cpp"
-// used in CPPTarget.java to generate the headerfile extension
-headerFileExtension() ::= ".h"
-
-true() ::= "true"
-false() ::= "false"
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/CSharp2/AST.stg b/tool/src/main/resources/org/antlr/codegen/templates/CSharp2/AST.stg
index 35fdebd..a94ed7c 100644
--- a/tool/src/main/resources/org/antlr/codegen/templates/CSharp2/AST.stg
+++ b/tool/src/main/resources/org/antlr/codegen/templates/CSharp2/AST.stg
@@ -117,7 +117,7 @@
 // T r a c k i n g  R u l e  E l e m e n t s
 
 /** ID and track it for use in a rewrite rule */
-tokenRefTrack(token,label,elementIndex,terminalOptions) ::= <<
+tokenRefTrack(token,label,elementIndex,terminalOptions={}) ::= <<
 <tokenRefBang(...)> <! Track implies no auto AST construction!>
 <if(backtracking)>if (<actions.(actionScope).synpredgate>) <endif>stream_<token>.Add(<label>);<\n>
 >>
@@ -125,19 +125,19 @@
 /** ids+=ID and track it for use in a rewrite rule; adds to ids *and*
  *  to the tracking list stream_ID for use in the rewrite.
  */
-tokenRefTrackAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
+tokenRefTrackAndListLabel(token,label,elementIndex,terminalOptions={}) ::= <<
 <tokenRefTrack(...)>
 <listLabelElem(elem=label,elemType=labelType,...)>
 >>
 
 /** ^(ID ...) track for rewrite */
-tokenRefRuleRootTrack(token,label,elementIndex,terminalOptions) ::= <<
+tokenRefRuleRootTrack(token,label,elementIndex,terminalOptions={}) ::= <<
 <tokenRefBang(...)>
 <if(backtracking)>if (<actions.(actionScope).synpredgate>) <endif>stream_<token>.Add(<label>);
 >>
 
 /** Match ^(label+=TOKEN ...) track for rewrite */
-tokenRefRuleRootTrackAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
+tokenRefRuleRootTrackAndListLabel(token,label,elementIndex,terminalOptions={}) ::= <<
 <tokenRefRuleRootTrack(...)>
 <listLabelElem(elem=label,elemType=labelType,...)>
 >>
@@ -196,10 +196,8 @@
 <! if tree parser and rewrite=true !>
 <if(TREE_PARSER&&rewriteMode)>
 <prevRuleRootRef()>.Tree = (<ASTLabelType>)adaptor.RulePostProcessing(root_0);
-input.ReplaceChildren(adaptor.GetParent(retval.Start),
-                      adaptor.GetChildIndex(retval.Start),
-                      adaptor.GetChildIndex(_last),
-                      retval.Tree);
+if (<prevRuleRootRef()>.Tree != null)
+	input.ReplaceChildren(adaptor.GetParent(retval.Start), adaptor.GetChildIndex(retval.Start), adaptor.GetChildIndex(_last), retval.Tree);
 <endif>
 <! if parser or tree-parser && rewrite!=true, we need to set result !>
 <if(!TREE_PARSER||!rewriteMode)>
@@ -323,7 +321,7 @@
 %>
 
 /** Gen ID or ID[args] */
-rewriteTokenRef(token,elementIndex,terminalOptions,args) ::= <<
+rewriteTokenRef(token,elementIndex,args,terminalOptions={}) ::= <<
 adaptor.AddChild(root_<treeLevel>, <createRewriteNodeFromElement(...)>);<\n>
 >>
 
@@ -346,15 +344,15 @@
 rewriteTokenListLabelRefRoot ::= rewriteTokenLabelRefRoot
 
 /** Gen ^(ID ...) or ^(ID[args] ...) */
-rewriteTokenRefRoot(token,elementIndex,terminalOptions,args) ::= <<
+rewriteTokenRefRoot(token,elementIndex,args,terminalOptions={}) ::= <<
 root_<treeLevel> = (<ASTLabelType>)adaptor.BecomeRoot(<createRewriteNodeFromElement(...)>, root_<treeLevel>);<\n>
 >>
 
-rewriteImaginaryTokenRef(args,token,terminalOptions,elementIndex) ::= <<
+rewriteImaginaryTokenRef(args,token,elementIndex,terminalOptions={}) ::= <<
 adaptor.AddChild(root_<treeLevel>, <createImaginaryNode(tokenType=token, ...)>);<\n>
 >>
 
-rewriteImaginaryTokenRefRoot(args,token,terminalOptions,elementIndex) ::= <<
+rewriteImaginaryTokenRefRoot(args,token,elementIndex,terminalOptions={}) ::= <<
 root_<treeLevel> = (<ASTLabelType>)adaptor.BecomeRoot(<createImaginaryNode(tokenType=token, ...)>, root_<treeLevel>);<\n>
 >>
 
@@ -410,7 +408,7 @@
 adaptor.AddChild(root_<treeLevel>, stream_<label>.NextTree());<\n>
 >>
 
-createImaginaryNode(tokenType,terminalOptions,args) ::= <%
+createImaginaryNode(tokenType,args,terminalOptions={}) ::= <%
 <if(terminalOptions.node)>
 <! new MethodNode(IDLabel, args) !>
 new <terminalOptions.node>(<tokenType><if(args)>, <args; separator=", "><endif>)
@@ -419,7 +417,7 @@
 <endif>
 %>
 
-createRewriteNodeFromElement(token,terminalOptions,args) ::= <%
+createRewriteNodeFromElement(token,args,terminalOptions={}) ::= <%
 <if(terminalOptions.node)>
 new <terminalOptions.node>(stream_<token>.NextToken()<if(args)>, <args; separator=", "><endif>)
 <else>
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/CSharp2/ASTDbg.stg b/tool/src/main/resources/org/antlr/codegen/templates/CSharp2/ASTDbg.stg
index 0d2a441..e7b2904 100644
--- a/tool/src/main/resources/org/antlr/codegen/templates/CSharp2/ASTDbg.stg
+++ b/tool/src/main/resources/org/antlr/codegen/templates/CSharp2/ASTDbg.stg
@@ -33,24 +33,24 @@
  */
 
 parserMembers() ::= <<
-protected DebugTreeAdaptor adaptor;
+	protected DebugTreeAdaptor adaptor;
 
-public ITreeAdaptor TreeAdaptor
-{
-	get
+	public ITreeAdaptor TreeAdaptor
 	{
-		return adaptor;
-	}
-	set
-	{
+		get
+		{
+			return adaptor;
+		}
+		set
+		{
 <if(grammar.grammarIsRoot)>
-		this.adaptor = new DebugTreeAdaptor(dbg,adaptor);
+			this.adaptor = new DebugTreeAdaptor(dbg,adaptor);
 <else>
-		this.adaptor = (DebugTreeAdaptor)adaptor; // delegator sends dbg adaptor
+			this.adaptor = (DebugTreeAdaptor)adaptor; // delegator sends dbg adaptor
 <endif><\n>
-		<grammar.directDelegates:{g|<g:delegateName()>.TreeAdaptor = this.adaptor;}>
-	}
-}<\n>
+			<grammar.directDelegates:{g|<g:delegateName()>.TreeAdaptor = this.adaptor;}>
+		}
+	}<\n>
 >>
 
 parserCtorBody() ::= <<
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/CSharp2/ASTParser.stg b/tool/src/main/resources/org/antlr/codegen/templates/CSharp2/ASTParser.stg
index 6413dfe..1585287 100644
--- a/tool/src/main/resources/org/antlr/codegen/templates/CSharp2/ASTParser.stg
+++ b/tool/src/main/resources/org/antlr/codegen/templates/CSharp2/ASTParser.stg
@@ -49,7 +49,7 @@
 // TOKEN AST STUFF
 
 /** ID and output=AST */
-tokenRef(token,label,elementIndex,terminalOptions) ::= <<
+tokenRef(token,label,elementIndex,terminalOptions={}) ::= <<
 <super.tokenRef(...)>
 <if(backtracking)>if (state.backtracking == 0) {<endif>
 <label>_tree = <createNodeFromToken(...)>;
@@ -61,7 +61,7 @@
 tokenRefBang(token,label,elementIndex) ::= "<super.tokenRef(...)>"
 
 /** ID^ and output=AST */
-tokenRefRuleRoot(token,label,elementIndex,terminalOptions) ::= <<
+tokenRefRuleRoot(token,label,elementIndex,terminalOptions={}) ::= <<
 <super.tokenRef(...)>
 <if(backtracking)>if (<actions.(actionScope).synpredgate>) {<endif>
 <label>_tree = <createNodeFromToken(...)>;
@@ -70,19 +70,19 @@
 >>
 
 /** ids+=ID! and output=AST */
-tokenRefBangAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
+tokenRefBangAndListLabel(token,label,elementIndex,terminalOptions={}) ::= <<
 <tokenRefBang(...)>
 <listLabelElem(elem=label,elemType=labelType,...)>
 >>
 
 /** label+=TOKEN when output=AST but not rewrite alt */
-tokenRefAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
+tokenRefAndListLabel(token,label,elementIndex,terminalOptions={}) ::= <<
 <tokenRef(...)>
 <listLabelElem(elem=label,elemType=labelType,...)>
 >>
 
 /** Match label+=TOKEN^ when output=AST but not rewrite alt */
-tokenRefRuleRootAndListLabel(token,label,terminalOptions,elementIndex) ::= <<
+tokenRefRuleRootAndListLabel(token,label,elementIndex,terminalOptions={}) ::= <<
 <tokenRefRuleRoot(...)>
 <listLabelElem(elem=label,elemType=labelType,...)>
 >>
@@ -100,20 +100,20 @@
 // rather than just added on code.  Investigate that refactoring when
 // I have more time.
 
-matchSet(s,label,terminalOptions,elementIndex,postmatchCode) ::= <<
+matchSet(s,label,elementIndex,postmatchCode,terminalOptions={}) ::= <<
 <super.matchSet(postmatchCode={<if(backtracking)>if (<actions.(actionScope).synpredgate>) <endif>adaptor.AddChild(root_0, <createNodeFromToken(...)>);}, ...)>
 >>
 
-matchRuleBlockSet(s,label,terminalOptions,elementIndex,postmatchCode,treeLevel="0") ::= <<
+matchRuleBlockSet(s,label,elementIndex,postmatchCode,treeLevel="0",terminalOptions={}) ::= <<
 <matchSet(...)>
 >>
 
-matchSetBang(s,label,elementIndex,terminalOptions,postmatchCode) ::= "<super.matchSet(...)>"
+matchSetBang(s,label,elementIndex,postmatchCode,terminalOptions={}) ::= "<super.matchSet(...)>"
 
 // note there is no matchSetTrack because -> rewrites force sets to be
 // plain old blocks of alts: (A|B|...|C)
 
-matchSetRuleRoot(s,label,terminalOptions,elementIndex,debug) ::= <<
+matchSetRuleRoot(s,label,elementIndex,debug,terminalOptions={}) ::= <<
 <if(label)>
 <label>=(<labelType>)input.LT(1);
 <endif>
@@ -157,7 +157,7 @@
 
 // WILDCARD AST
 
-wildcard(token,label,elementIndex,terminalOptions) ::= <<
+wildcard(token,label,elementIndex,terminalOptions={}) ::= <<
 <super.wildcard(...)>
 <if(backtracking)>if (<actions.(actionScope).synpredgate>) {<endif>
 <label>_tree = (<ASTLabelType>)adaptor.Create(<label>);
@@ -165,9 +165,9 @@
 <if(backtracking)>}<endif>
 >>
 
-wildcardBang(label,elementIndex) ::= "<super.wildcard(...)>"
+wildcardBang(label,elementIndex) ::= "<super.wildcard(token=[],...)>"
 
-wildcardRuleRoot(token,label,elementIndex,terminalOptions) ::= <<
+wildcardRuleRoot(token,label,elementIndex,terminalOptions={}) ::= <<
 <super.wildcard(...)>
 <if(backtracking)>if (<actions.(actionScope).synpredgate>) {<endif>
 <label>_tree = (<ASTLabelType>)adaptor.Create(<label>);
@@ -175,7 +175,7 @@
 <if(backtracking)>}<endif>
 >>
 
-createNodeFromToken(label,terminalOptions) ::= <%
+createNodeFromToken(label,terminalOptions={}) ::= <%
 <if(terminalOptions.node)>
 new <terminalOptions.node>(<if(terminalOptions.type)><terminalOptions.type>,<endif><label><if(terminalOptions.text)>,<terminalOptions.text; format="string"><endif>)
 <else>
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/CSharp2/ASTTreeParser.stg b/tool/src/main/resources/org/antlr/codegen/templates/CSharp2/ASTTreeParser.stg
index d749fa6..316282f 100644
--- a/tool/src/main/resources/org/antlr/codegen/templates/CSharp2/ASTTreeParser.stg
+++ b/tool/src/main/resources/org/antlr/codegen/templates/CSharp2/ASTTreeParser.stg
@@ -44,14 +44,17 @@
 /** Add a variable to track last element matched */
 ruleDeclarations() ::= <<
 <super.ruleDeclarations()>
+<if(!ruleDescriptor.isSynPred)>
 <ASTLabelType> _first_0 = default(<ASTLabelType>);
-<ASTLabelType> _last = default(<ASTLabelType>);<\n>
+<ASTLabelType> _last = default(<ASTLabelType>);
+<endif>
 >>
 
 /** What to emit when there is no rewrite rule.  For auto build
  *  mode, does nothing.
  */
-noRewrite(rewriteBlockLevel, treeLevel) ::= <<
+noRewrite(rewriteBlockLevel=false, treeLevel=false) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 <if(backtracking)>if (<actions.(actionScope).synpredgate>) {<endif>
 <if(rewriteMode)>
 retval.Tree = (<ASTLabelType>)_first_0;
@@ -59,6 +62,7 @@
     retval.Tree = (<ASTLabelType>)adaptor.GetParent(retval.Tree);
 <endif>
 <if(backtracking)>}<endif>
+<endif>
 >>
 
 /** match ^(root children) in tree parser; override here to
@@ -66,6 +70,7 @@
  */
 tree(root, actionsAfterRoot, children, nullableChildList,
      enclosingTreeLevel, treeLevel) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 _last = (<ASTLabelType>)input.LT(1);
 {
 <ASTLabelType> _save_last_<treeLevel> = _last;
@@ -98,7 +103,10 @@
 adaptor.AddChild(root_<enclosingTreeLevel>, root_<treeLevel>);
 <endif>
 _last = _save_last_<treeLevel>;
-}<\n>
+}
+<else>
+<super.tree(...)>
+<endif>
 >>
 
 // TOKEN AST STUFF
@@ -107,12 +115,17 @@
  *  setting of _last
  */
 tokenRefBang(token,label,elementIndex,terminalOptions) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 _last = (<ASTLabelType>)input.LT(1);
 <super.tokenRef(...)>
+<else>
+<super.tokenRefBang(...)>
+<endif>
 >>
 
 /** ID auto construct */
 tokenRef(token,label,elementIndex,terminalOptions) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 _last = (<ASTLabelType>)input.LT(1);
 <super.tokenRef(...)>
 <if(!rewriteMode)>
@@ -128,16 +141,24 @@
 <if(backtracking)>if (<actions.(actionScope).synpredgate>)<endif>
 if (_first_<treeLevel> == null) _first_<treeLevel> = <label>;
 <endif>
+<else>
+<super.tokenRef(...)>
+<endif>
 >>
 
 /** label+=TOKEN auto construct */
 tokenRefAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 <tokenRef(...)>
 <listLabelElem(elem=label,...)>
+<else>
+<super.tokenRefAndListLabel(...)>
+<endif>
 >>
 
 /** ^(ID ...) auto construct */
 tokenRefRuleRoot(token,label,elementIndex,terminalOptions) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 _last = (<ASTLabelType>)input.LT(1);
 <super.tokenRef(...)>
 <if(!rewriteMode)>
@@ -150,16 +171,24 @@
 root_<treeLevel> = (<ASTLabelType>)adaptor.BecomeRoot(<label>_tree, root_<treeLevel>);
 <if(backtracking)>}<endif>
 <endif>
+<else>
+<super.tokenRefRuleRoot(...)>
+<endif>
 >>
 
 /** Match ^(label+=TOKEN ...) auto construct */
 tokenRefRuleRootAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 <tokenRefRuleRoot(...)>
 <listLabelElem(elem=label,...)>
+<else>
+<super.tokenRefRuleRootAndListLabel(...)>
+<endif>
 >>
 
 /** Match . wildcard and auto dup the node/subtree */
 wildcard(token,label,elementIndex,terminalOptions) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 _last = (<ASTLabelType>)input.LT(1);
 <super.wildcard(...)>
 <if(!rewriteMode)>
@@ -171,11 +200,15 @@
 <if(backtracking)>if (<actions.(actionScope).synpredgate>)<endif>
 if (_first_<treeLevel> == null) _first_<treeLevel> = <label>;
 <endif>
+<else>
+<super.wildcard(...)>
+<endif>
 >>
 
 // SET AST
 
 matchSet(s,label,terminalOptions,elementIndex,postmatchCode) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 _last = (<ASTLabelType>)input.LT(1);
 <super.matchSet(postmatchCode={
 <if(!rewriteMode)>
@@ -190,19 +223,31 @@
 <endif>
 }, ...
 )>
+<else>
+<super.matchSet(...)>
+<endif>
 >>
 
 matchRuleBlockSet(s,label,terminalOptions,elementIndex,postmatchCode,treeLevel="0") ::= <<
+<if(!ruleDescriptor.isSynPred)>
 <matchSet(...)>
 <noRewrite(...)> <! set return tree !>
+<else>
+<super.matchRuleBlockSet(...)>
+<endif>
 >>
 
 matchSetBang(s,label,terminalOptions,elementIndex,postmatchCode) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 _last = (<ASTLabelType>)input.LT(1);
 <super.matchSet(...)>
+<else>
+<super.matchSetBang(...)>
+<endif>
 >>
 
 matchSetRuleRoot(s,label,terminalOptions,elementIndex,debug) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 <super.matchSet(postmatchCode={
 <if(!rewriteMode)>
 <if(backtracking)>if (<actions.(actionScope).synpredgate>) {<endif>
@@ -216,12 +261,16 @@
 <endif>
 }, ...
 )>
+<else>
+<super.matchSetRuleRoot(...)>
+<endif>
 >>
 
 // RULE REF AST
 
 /** rule auto construct */
 ruleRef(rule,label,elementIndex,args,scope) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 _last = (<ASTLabelType>)input.LT(1);
 <super.ruleRef(...)>
 <if(backtracking)>if (<actions.(actionScope).synpredgate>)<endif>
@@ -230,51 +279,82 @@
 <else> <! rewrite mode !>
 if (_first_<treeLevel> == null) _first_<treeLevel> = <label>.Tree;
 <endif>
+<else>
+<super.ruleRef(...)>
+<endif>
 >>
 
 /** x+=rule auto construct */
 ruleRefAndListLabel(rule,label,elementIndex,args,scope) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 <ruleRef(...)>
 <listLabelElem(elem={<label>.Tree},...)>
+<else>
+<super.ruleRefAndListLabel(...)>
+<endif>
 >>
 
 /** ^(rule ...) auto construct */
 ruleRefRuleRoot(rule,label,elementIndex,args,scope) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 _last = (<ASTLabelType>)input.LT(1);
 <super.ruleRef(...)>
 <if(!rewriteMode)>
 <if(backtracking)>if (<actions.(actionScope).synpredgate>) <endif>root_<treeLevel> = (<ASTLabelType>)adaptor.BecomeRoot(<label>.Tree, root_<treeLevel>);
 <endif>
+<else>
+<super.ruleRefRuleRoot(...)>
+<endif>
 >>
 
 /** ^(x+=rule ...) auto construct */
 ruleRefRuleRootAndListLabel(rule,label,elementIndex,args,scope) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 <ruleRefRuleRoot(...)>
 <listLabelElem(elem={<label>.Tree},...)>
+<else>
+<super.ruleRefRuleRootAndListLabel(...)>
+<endif>
 >>
 
 /** rule when output=AST and tracking for rewrite */
 ruleRefTrack(rule,label,elementIndex,args,scope) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 _last = (<ASTLabelType>)input.LT(1);
 <super.ruleRefTrack(...)>
+<else>
+<super.ruleRefTrack(...)>
+<endif>
 >>
 
 /** x+=rule when output=AST and tracking for rewrite */
 ruleRefTrackAndListLabel(rule,label,elementIndex,args,scope) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 _last = (<ASTLabelType>)input.LT(1);
 <super.ruleRefTrackAndListLabel(...)>
+<else>
+<super.ruleRefTrackAndListLabel(...)>
+<endif>
 >>
 
 /** ^(rule ...) rewrite */
 ruleRefRuleRootTrack(rule,label,elementIndex,args,scope) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 _last = (<ASTLabelType>)input.LT(1);
 <super.ruleRefRootTrack(...)>
+<else>
+<super.ruleRefRuleRootTrack(...)>
+<endif>
 >>
 
 /** ^(x+=rule ...) rewrite */
 ruleRefRuleRootTrackAndListLabel(rule,label,elementIndex,args,scope) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 _last = (<ASTLabelType>)input.LT(1);
 <super.ruleRefRuleRootTrackAndListLabel(...)>
+<else>
+<super.ruleRefRuleRootTrackAndListLabel(...)>
+<endif>
 >>
 
 /** Streams for token refs are tree nodes now; override to
@@ -290,9 +370,11 @@
 
 ruleCleanUp() ::= <<
 <super.ruleCleanUp()>
+<if(!ruleDescriptor.isSynPred)>
 <if(!rewriteMode)>
 <if(backtracking)>if (<actions.(actionScope).synpredgate>) {<endif>
 retval.Tree = (<ASTLabelType>)adaptor.RulePostProcessing(root_0);
 <if(backtracking)>}<endif>
 <endif>
+<endif>
 >>
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/CSharp2/CSharp2.stg b/tool/src/main/resources/org/antlr/codegen/templates/CSharp2/CSharp2.stg
index 8e5d603..8f15ef2 100644
--- a/tool/src/main/resources/org/antlr/codegen/templates/CSharp2/CSharp2.stg
+++ b/tool/src/main/resources/org/antlr/codegen/templates/CSharp2/CSharp2.stg
@@ -165,6 +165,14 @@
 		}
 	}
 
+<if(grammar.delegates)>
+	public override void SetState(RecognizerSharedState state)
+	{
+		base.SetState(state);
+		<grammar.delegates:{g|<g:delegateName()>.SetState(state);}; separator="\n">
+	}
+<endif>
+
 <endif>
 <if(filterMode)>
 	<filteringNextToken()>
@@ -296,6 +304,22 @@
 	<last(grammar.delegators):{g|private <g.recognizerName> gParent;}>
 <endif>
 
+<if(grammar.delegates)>
+	public override void SetState(RecognizerSharedState state)
+	{
+		base.SetState(state);
+		<grammar.delegates:{g|<g:delegateName()>.SetState(state);}; separator="\n">
+	}
+
+<if(TREE_PARSER)>
+	public override void SetTreeNodeStream(ITreeNodeStream input)
+	{
+		base.SetTreeNodeStream(input);
+		<grammar.delegates:{g|<g:delegateName()>.SetTreeNodeStream(input);}; separator="\n">
+	}
+<endif>
+<endif>
+
 	<scopes:{it|<if(it.isDynamicGlobalScope)><globalAttributeScope(scope=it)><endif>}>
 	<@members()>
 
@@ -320,7 +344,7 @@
    appear to be defined in this recognizer. !>
 	#region Delegated rules
 <grammar.delegatedRules:{ruleDescriptor|
-	<ruleModifier(grammar=grammar,ruleDescriptor=ruleDescriptor)> <returnType(ruleDescriptor)> <ruleDescriptor.name; format="id">(<ruleDescriptor.parameterScope:parameterScope()>) <!throws RecognitionException !>{ <if(ruleDescriptor.hasReturnValue)>return <endif><ruleDescriptor.grammar:delegateName()>.<ruleDescriptor.name; format="id">(<ruleDescriptor.parameterScope.attributes:{a|<a.name; format="id">}; separator=", ">); \}}; separator="\n">
+	<ruleModifier(grammar=grammar,ruleDescriptor=ruleDescriptor)> <returnType(ruleDescriptor)> <ruleDescriptor.name; format="id">(<ruleDescriptor.parameterScope:parameterScope()>) <!throws RecognitionException !>{ <if(ruleDescriptor.hasReturnValue)>return <endif><ruleDescriptor.grammar:delegateName()>.<ruleDescriptor.name; format="id">(<if(ruleDescriptor.parameterScope)><ruleDescriptor.parameterScope.attributes:{a|<a.name; format="id">}; separator=", "><endif>); \}}; separator="\n">
 	#endregion Delegated rules
 <endif>
 
@@ -353,14 +377,14 @@
 
 @genericParser.members() ::= <<
 #if ANTLR_DEBUG
-	private static readonly bool[] decisionCanBacktrack =
-		new bool[]
-		{
-			false, // invalid decision
-			<grammar.decisions:{d | <d.dfa.hasSynPred>}; wrap="\n", separator=", ">
-		};
+private static readonly bool[] decisionCanBacktrack =
+	new bool[]
+	{
+		false, // invalid decision
+		<grammar.decisions:{d | <d.dfa.hasSynPred>}; wrap="\n", separator=", ">
+	};
 #else
-	private static readonly bool[] decisionCanBacktrack = new bool[0];
+private static readonly bool[] decisionCanBacktrack = new bool[0];
 #endif
 <! WARNING. bug in ST: this is cut-n-paste into Dbg.stg !>
 <actions.(actionScope).ctorModifier; null="public"> <grammar.recognizerName>(<inputStreamType> input<grammar.delegators:{g|, <g.recognizerName> <g:delegateName()>}>)
@@ -370,7 +394,6 @@
 <actions.(actionScope).ctorModifier; null="public"> <grammar.recognizerName>(<inputStreamType> input, RecognizerSharedState state<grammar.delegators:{g|, <g.recognizerName> <g:delegateName()>}>)
 	: base(input, state)
 {
-	<parserCtorBody()>
 <if(grammar.directDelegates)>
 	<grammar.directDelegates:
 	 {g|<g:delegateName()> = new <g.recognizerName>(input, state<trunc(g.delegators):{p|, <p:delegateName()>}>, this);}; separator="\n">
@@ -381,6 +404,7 @@
 <if(grammar.delegators)>
 	<last(grammar.delegators):{g|gParent = <g:delegateName()>;}>
 <endif>
+	<parserCtorBody()>
 	OnCreated();
 }
 >>
@@ -431,7 +455,7 @@
 protected virtual void LeaveRule_<ruleName>_fragment() {}
 
 // $ANTLR start <ruleName>
-public <!final !>void <ruleName>_fragment(<ruleDescriptor.parameterScope:parameterScope()>)
+<ruleModifier(grammar,ruleDescriptor)> void <ruleName>_fragment(<ruleDescriptor.parameterScope:parameterScope()>)
 {
 	<ruleLabelDefs()>
 	EnterRule_<ruleName>_fragment();
@@ -501,6 +525,24 @@
 <if(backtracking)>if (state.backtracking>0) {state.failed=true; <returnFromRule()>}<endif>
 >>
 
+ruleWrapperMap ::= [
+	"bottomup":{<ruleWrapperBottomup()>},
+	"topdown":{<ruleWrapperTopdown()>},
+	default:""
+]
+
+ruleWrapperBottomup() ::= <<
+<if(TREE_PARSER && filterMode)>
+protected override <if(buildAST)>IAstRuleReturnScope<else>void<endif> Bottomup() { return bottomup(); }
+<endif>
+>>
+
+ruleWrapperTopdown() ::= <<
+<if(TREE_PARSER && filterMode)>
+protected override <if(buildAST)>IAstRuleReturnScope<else>void<endif> Topdown() { return topdown(); }
+<endif>
+>>
+
 /** How to generate code for a rule.  This includes any return type
  *  data aggregates required for multiple return values.
  */
@@ -512,7 +554,7 @@
 protected virtual void EnterRule_<ruleName>() {}
 [Conditional("ANTLR_TRACE")]
 protected virtual void LeaveRule_<ruleName>() {}
-
+<ruleWrapperMap.(ruleName)>
 // $ANTLR start "<ruleName>"
 // <fileName>:<description>
 [GrammarRule("<ruleName>")]
@@ -589,7 +631,7 @@
 <if(ruleDescriptor.hasMultipleReturnValues)>
 <returnType(ruleDescriptor)> retval = new <returnType(ruleDescriptor)>();
 retval.Start = (<labelType>)input.LT(1);
-<else>
+<elseif(ruleDescriptor.returnScope)>
 <ruleDescriptor.returnScope.attributes:{ a |
 <a.type> <a.name; format="id"> = <if(a.initValue)><a.initValue><else><initValue(a.type)><endif>;
 }>
@@ -637,7 +679,7 @@
   ruleDescriptor.ruleListLabels]
     :{it|List\<<labelType>\> list_<it.label.text> = null;}; separator="\n"
 >
-<ruleDescriptor.charListLabels:{it|List\<int\> list_<it.label.text> = null;}; separator="\n"
+<ruleDescriptor.charListLabels:{it|List\<int> list_<it.label.text> = null;}; separator="\n"
 >
 >>
 
@@ -906,12 +948,12 @@
 %>
 
 /** match a token optionally with a label in front */
-tokenRef(token,label,elementIndex,terminalOptions) ::= <<
+tokenRef(token,label,elementIndex,terminalOptions={}) ::= <<
 <if(label)><label>=(<labelType>)<endif>Match(input,<token>,Follow._<token>_in_<ruleName><elementIndex>); <checkRuleBacktrackFailure()>
 >>
 
 /** ids+=ID */
-tokenRefAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
+tokenRefAndListLabel(token,label,elementIndex,terminalOptions={}) ::= <<
 <tokenRef(...)>
 <listLabelElem(elem=label,elemType=labelType,...)>
 >>
@@ -938,7 +980,7 @@
 >>
 
 /** For now, sets are interval tests and must be tested inline */
-matchSet(s,label,terminalOptions,elementIndex,postmatchCode="") ::= <<
+matchSet(s,label,elementIndex,postmatchCode="",terminalOptions={}) ::= <<
 <if(label)>
 <matchSetLabel()>
 <endif>
@@ -1007,14 +1049,14 @@
 <endif>
 %>
 
-wildcard(token,label,elementIndex,terminalOptions) ::= <<
+wildcard(token,label,elementIndex,terminalOptions={}) ::= <<
 <if(label)>
 <label>=(<labelType>)input.LT(1);<\n>
 <endif>
 MatchAny(input); <checkRuleBacktrackFailure()>
 >>
 
-wildcardAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
+wildcardAndListLabel(token,label,elementIndex,terminalOptions={}) ::= <<
 <wildcard(...)>
 <listLabelElem(elem=label,elemType=labelType,...)>
 >>
@@ -1132,20 +1174,22 @@
 // F i x e d  D F A  (if-then-else)
 
 dfaState(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
-int LA<decisionNumber>_<stateNumber> = input.LA(<k>);<\n>
+int LA<decisionNumber>_<k> = input.LA(<k>);<\n>
 <edges; separator="\nelse ">
+<if((!isTrue.(last(edges).labelExpr)) && (!last(edges).predicates))>
 else
 {
 <if(eotPredictsAlt)>
 	alt<decisionNumber> = <eotPredictsAlt>;
 <else>
 	<ruleBacktrackFailure()>
-	NoViableAltException nvae = new NoViableAltException("<description>", <decisionNumber>, <stateNumber>, input);
+	NoViableAltException nvae = new NoViableAltException("<description>", <decisionNumber>, <stateNumber>, input, <k>);
 	DebugRecognitionException(nvae);
 	<@noViableAltException()>
 	throw nvae;
 <endif>
 }
+<endif>
 >>
 
 /** Same as a normal DFA state except that we don't examine lookahead
@@ -1154,7 +1198,7 @@
  *  expect "if ( LA(1)==X ) match(X);" and that's it.
  */
 dfaOptionalBlockState(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
-int LA<decisionNumber>_<stateNumber> = input.LA(<k>);<\n>
+int LA<decisionNumber>_<k> = input.LA(<k>);<\n>
 <edges; separator="\nelse ">
 >>
 
@@ -1165,7 +1209,7 @@
  *  anything other than 'a' predicts exiting.
  */
 dfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
-int LA<decisionNumber>_<stateNumber> = input.LA(<k>);<\n>
+int LA<decisionNumber>_<k> = input.LA(<k>);<\n>
 <edges; separator="\nelse "><\n>
 <if(eotPredictsAlt)>
 <if(!edges)>
@@ -1209,7 +1253,7 @@
 <else>
 	{
 		<ruleBacktrackFailure()>
-		NoViableAltException nvae = new NoViableAltException("<description>", <decisionNumber>, <stateNumber>, input);
+		NoViableAltException nvae = new NoViableAltException("<description>", <decisionNumber>, <stateNumber>, input, <k>);
 		DebugRecognitionException(nvae);
 		<@noViableAltException()>
 		throw nvae;
@@ -1345,12 +1389,22 @@
 	ITreeNodeStream input = (ITreeNodeStream)_input;
 	<endif>
 	int _s = s;
-	switch (s)
+	s = -1;
+	<! pull these outside the switch cases to save space on locals !>
+	int LA<dfa.decisionNumber>_1 = input.LA(1);
+	int index<dfa.decisionNumber>_1 = input.Index;
+	switch (_s)
 	{
-	<dfa.specialStateSTs:{state |
-	case <i0>:<! compressed special state numbers 0..n-1 !>
-		<state>}; separator="\n">
+	<dfa.specialStateSTs:{state |case <i0>:<! compressed special state numbers 0..n-1 !>
+	<state>}; separator="\n">
+
+	default:
+		break;
 	}
+
+	if (s >= 0)
+		return s;
+
 <if(backtracking)>
 	if (state.backtracking > 0) {state.failed=true; return -1;}
 <endif>
@@ -1365,20 +1419,18 @@
  *  state.
  */
 cyclicDFAState(decisionNumber,stateNumber,edges,needErrorClause,semPredState) ::= <<
-int LA<decisionNumber>_<stateNumber> = input.LA(1);<\n>
+{
 <if(semPredState)>
-<! get next lookahead symbol to test edges, then rewind !>
-<\n>int index<decisionNumber>_<stateNumber> = input.Index;
-input.Rewind();
+	<! get next lookahead symbol to test edges, then rewind !>
+	input.Rewind();
 <endif>
-s = -1;
-<edges; separator="\nelse ">
+	<edges; separator="\nelse ">
 <if(semPredState)>
-<! return input cursor to state before we rewound !>
-<\n>input.Seek(index<decisionNumber>_<stateNumber>);
+	<! return input cursor to state before we rewound !>
+	input.Seek(index<decisionNumber>_1);
 <endif>
-if (s >= 0) return s;
-break;
+	break;
+}
 >>
 
 /** Just like a fixed DFA edge, test the lookahead and indicate what
@@ -1400,7 +1452,7 @@
 
 andPredicates(left,right) ::= "(<left>&&<right>)"
 
-orPredicates(operands) ::= "(<first(operands)><rest(operands):{o | ||<o>}>)"
+orPredicates(operands) ::= "(<operands; separator=\"||\">)"
 
 notPredicate(pred) ::= "!(<evalPredicate(...)>)"
 
@@ -1408,7 +1460,7 @@
 
 evalSynPredicate(pred,description) ::= "EvaluatePredicate(<pred>_fragment)"
 
-lookaheadTest(atom,k,atomAsInt) ::= "LA<decisionNumber>_<stateNumber>==<atom>"
+lookaheadTest(atom,k,atomAsInt) ::= "LA<decisionNumber>_<k>==<atom>"
 
 /** Sometimes a lookahead test cannot assume that LA(k) is in a temp variable
  *  somewhere.  Must ask for the lookahead directly.
@@ -1416,7 +1468,7 @@
 isolatedLookaheadTest(atom,k,atomAsInt) ::= "input.LA(<k>)==<atom>"
 
 lookaheadRangeTest(lower,upper,k,rangeNumber,lowerAsInt,upperAsInt) ::= <%
-(LA<decisionNumber>_<stateNumber><ge()><lower> && LA<decisionNumber>_<stateNumber><le()><upper>)
+(LA<decisionNumber>_<k><ge()><lower> && LA<decisionNumber>_<k><le()><upper>)
 %>
 
 isolatedLookaheadRangeTest(lower,upper,k,rangeNumber,lowerAsInt,upperAsInt) ::= "(input.LA(<k>)<ge()><lower> && input.LA(<k>)<le()><upper>)"
@@ -1431,6 +1483,7 @@
 // A T T R I B U T E S
 
 attributeScope(scope) ::= <<
+<if(scope)>
 <if(scope.attributes)>
 protected sealed partial class <scope.name>_scope
 {
@@ -1452,7 +1505,8 @@
 <else>
 protected virtual void <scope.name>_scopeAfter( <scope.name>_scope scope ) {}
 <endif>
-protected readonly ListStack\<<scope.name>_scope\> <scope.name>_stack = new ListStack\<<scope.name>_scope\>();
+protected readonly ListStack\<<scope.name>_scope> <scope.name>_stack = new ListStack\<<scope.name>_scope>();
+<endif>
 <endif>
 >>
 
@@ -1482,9 +1536,7 @@
  *  values.
  */
 ruleLabelType(referencedRule) ::= <%
-<if(referencedRule.returnScope.attributes&&referencedRule.hasMultipleReturnValues)>
-	<referencedRule.grammar.recognizerName>.<referencedRule:returnStructName()>
-<elseif(referencedRule.hasMultipleReturnValues)>
+<if(referencedRule.hasMultipleReturnValues)>
 	<ruleReturnBaseType()>
 <elseif(referencedRule.hasSingleReturnValue)>
 	<referencedRule.singleValueReturnType>
@@ -1575,7 +1627,7 @@
 /** reference an attribute of rule; might only have single return value */
 ruleLabelRef(referencedRule,scope,attr) ::= <%
 <if(referencedRule.hasMultipleReturnValues)>
-(<scope>!=null?<scope>.<attr.name; format="id">:<initValue(attr.type)>)
+(<scope>!=null?((<returnType(referencedRule)>)<scope>).<attr.name; format="id">:<initValue(attr.type)>)
 <else>
 <scope>
 <endif>
@@ -1606,7 +1658,7 @@
 
 // not sure the next are the right approach
 
-tokenLabelPropertyRef_text(scope,attr) ::= "(<scope>!=null?<scope>.Text:null)"
+tokenLabelPropertyRef_text(scope,attr) ::= "(<scope>!=null?<scope>.Text:default(string))"
 tokenLabelPropertyRef_type(scope,attr) ::= "(<scope>!=null?<scope>.Type:0)"
 tokenLabelPropertyRef_line(scope,attr) ::= "(<scope>!=null?<scope>.Line:0)"
 tokenLabelPropertyRef_pos(scope,attr) ::= "(<scope>!=null?<scope>.CharPositionInLine:0)"
@@ -1622,9 +1674,9 @@
 <if(TREE_PARSER)>
 (<scope>!=null?(input.TokenStream.ToString(
   input.TreeAdaptor.GetTokenStartIndex(<scope>.Start),
-  input.TreeAdaptor.GetTokenStopIndex(<scope>.Start))):null)
+  input.TreeAdaptor.GetTokenStopIndex(<scope>.Start))):default(string))
 <else>
-(<scope>!=null?input.ToString(<scope>.Start,<scope>.Stop):null)
+(<scope>!=null?input.ToString(<scope>.Start,<scope>.Stop):default(string))
 <endif>
 %>
 
@@ -1649,7 +1701,7 @@
     "(<scope>!=null?<scope>.TokenIndex:0)"
 
 lexerRuleLabelPropertyRef_text(scope,attr) ::=
-    "(<scope>!=null?<scope>.Text:null)"
+    "(<scope>!=null?<scope>.Text:default(string))"
 
 lexerRuleLabelPropertyRef_int(scope,attr) ::=
     "(<scope>!=null?int.Parse(<scope>.Text):0)"
@@ -1713,3 +1765,8 @@
 
 true_value() ::= "true"
 false_value() ::= "false"
+
+isTrue ::= [
+	"true" : true,
+	default : false
+]
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/CSharp2/Dbg.stg b/tool/src/main/resources/org/antlr/codegen/templates/CSharp2/Dbg.stg
index efad5b5..b537ff1 100644
--- a/tool/src/main/resources/org/antlr/codegen/templates/CSharp2/Dbg.stg
+++ b/tool/src/main/resources/org/antlr/codegen/templates/CSharp2/Dbg.stg
@@ -49,21 +49,21 @@
 	};<\n>
 <endif>
 <if(grammar.grammarIsRoot)><! grammar imports other grammar(s) !>
-	int ruleLevel = 0;
-	public virtual int RuleLevel { get { return ruleLevel; } }
-	public virtual void IncRuleLevel() { ruleLevel++; }
-	public virtual void DecRuleLevel() { ruleLevel--; }
+int ruleLevel = 0;
+public virtual int RuleLevel { get { return ruleLevel; } }
+public virtual void IncRuleLevel() { ruleLevel++; }
+public virtual void DecRuleLevel() { ruleLevel--; }
 <if(profile)>
-	<ctorForProfilingRootGrammar()>
+<ctorForProfilingRootGrammar()>
 <else>
-	<ctorForRootGrammar()>
+<ctorForRootGrammar()>
 <endif>
 <ctorForPredefinedListener()>
 <else><! imported grammar !>
-	public int RuleLevel { get { return <grammar.delegators:{g| <g:delegateName()>}>.RuleLevel; } }
-	public void IncRuleLevel() { <grammar.delegators:{g| <g:delegateName()>}>.IncRuleLevel(); }
-	public void DecRuleLevel() { <grammar.delegators:{g| <g:delegateName()>}>.DecRuleLevel(); }
-	<ctorForDelegateGrammar()>
+public int RuleLevel { get { return <grammar.delegators:{g| <g:delegateName()>}>.RuleLevel; } }
+public void IncRuleLevel() { <grammar.delegators:{g| <g:delegateName()>}>.IncRuleLevel(); }
+public void DecRuleLevel() { <grammar.delegators:{g| <g:delegateName()>}>.DecRuleLevel(); }
+<ctorForDelegateGrammar()>
 <endif>
 <if(profile)>
 public override bool AlreadyParsedRule( IIntStream input, int ruleIndex )
@@ -95,9 +95,9 @@
 <actions.(actionScope).ctorModifier; null="public"> <name>( <inputStreamType> input, int port, RecognizerSharedState state )
 	: base( input, state )
 {
-	<parserCtorBody()>
 	<createListenerAndHandshake()>
 	<grammar.directDelegates:{g|<g:delegateName()> = new <g.recognizerName>( input, dbg, this.state, this<grammar.delegators:{g|, <g:delegateName()>}> );}; separator="\n">
+	<parserCtorBody()>
 	<@finally()>
 }<\n>
 >>
@@ -113,9 +113,9 @@
 {
 	Profiler p = (Profiler)dbg;
 	p.setParser(this);
-	<parserCtorBody()>
 	<grammar.directDelegates:
 	 {g|<g:delegateName()> = new <g.recognizerName>( input, dbg, this.state, this<grammar.delegators:{g|, <g:delegateName()>}> );}; separator="\n">
+	<parserCtorBody()>
 	<@finally()>
 }
 <\n>
@@ -126,9 +126,9 @@
 <actions.(actionScope).ctorModifier; null="public"> <name>( <inputStreamType> input, IDebugEventListener dbg, RecognizerSharedState state<grammar.delegators:{g|, <g.recognizerName> <g:delegateName()>}> )
 	: base( input, dbg, state )
 {
-	<parserCtorBody()>
 	<grammar.directDelegates:
 	 {g|<g:delegateName()> = new <g.recognizerName>( input, this, this.state<grammar.delegators:{g|, <g:delegateName()>}> );}; separator="\n">
+	<parserCtorBody()>
 }<\n>
 >>
 
@@ -140,8 +140,8 @@
 	Profiler p = (Profiler)dbg;
 	p.setParser(this);
 <endif>
-	<parserCtorBody()>
 	<grammar.directDelegates:{g|<g:delegateName()> = new <g.recognizerName>(input, dbg, this.state, this<grammar.delegators:{g|, <g:delegateName()>}>);}; separator="\n">
+	<parserCtorBody()>
 	<@finally()>
 }<\n>
 >>
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/CSharp3/AST.stg b/tool/src/main/resources/org/antlr/codegen/templates/CSharp3/AST.stg
index 0243429..d1d765a 100644
--- a/tool/src/main/resources/org/antlr/codegen/templates/CSharp3/AST.stg
+++ b/tool/src/main/resources/org/antlr/codegen/templates/CSharp3/AST.stg
@@ -115,7 +115,7 @@
 // T r a c k i n g  R u l e  E l e m e n t s
 
 /** ID and track it for use in a rewrite rule */
-tokenRefTrack(token,label,elementIndex,terminalOptions) ::= <<
+tokenRefTrack(token,label,elementIndex,terminalOptions={}) ::= <<
 <tokenRefBang(...)> <! Track implies no auto AST construction!>
 <if(backtracking)>if (<actions.(actionScope).synpredgate>) <endif>stream_<token>.Add(<label>);<\n>
 >>
@@ -123,19 +123,19 @@
 /** ids+=ID and track it for use in a rewrite rule; adds to ids *and*
  *  to the tracking list stream_ID for use in the rewrite.
  */
-tokenRefTrackAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
+tokenRefTrackAndListLabel(token,label,elementIndex,terminalOptions={}) ::= <<
 <tokenRefTrack(...)>
 <listLabelElem(elem=label,elemType=labelType,...)>
 >>
 
 /** ^(ID ...) track for rewrite */
-tokenRefRuleRootTrack(token,label,elementIndex,terminalOptions) ::= <<
+tokenRefRuleRootTrack(token,label,elementIndex,terminalOptions={}) ::= <<
 <tokenRefBang(...)>
 <if(backtracking)>if (<actions.(actionScope).synpredgate>) <endif>stream_<token>.Add(<label>);
 >>
 
 /** Match ^(label+=TOKEN ...) track for rewrite */
-tokenRefRuleRootTrackAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
+tokenRefRuleRootTrackAndListLabel(token,label,elementIndex,terminalOptions={}) ::= <<
 <tokenRefRuleRootTrack(...)>
 <listLabelElem(elem=label,elemType=labelType,...)>
 >>
@@ -194,10 +194,8 @@
 <! if tree parser and rewrite=true !>
 <if(TREE_PARSER&&rewriteMode)>
 <prevRuleRootRef()>.Tree = (<ASTLabelType>)adaptor.RulePostProcessing(root_0);
-input.ReplaceChildren(adaptor.GetParent(retval.Start),
-                      adaptor.GetChildIndex(retval.Start),
-                      adaptor.GetChildIndex(_last),
-                      retval.Tree);
+if (<prevRuleRootRef()>.Tree != null)
+	input.ReplaceChildren(adaptor.GetParent(retval.Start), adaptor.GetChildIndex(retval.Start), adaptor.GetChildIndex(_last), retval.Tree);
 <endif>
 <! if parser or tree-parser && rewrite!=true, we need to set result !>
 <if(!TREE_PARSER||!rewriteMode)>
@@ -212,12 +210,12 @@
 
 rewriteCodeLabels() ::= <<
 <referencedTokenLabels
-    :{it|RewriteRule<rewriteElementType>Stream stream_<it>=new RewriteRule<rewriteElementType>Stream(adaptor,"token <it>",<it>);};
-    separator="\n"
+	:{it|RewriteRule<rewriteElementType>Stream stream_<it>=new RewriteRule<rewriteElementType>Stream(adaptor,"token <it>",<it>);};
+	separator="\n"
 >
 <referencedTokenListLabels
-    :{it|RewriteRule<rewriteElementType>Stream stream_<it>=new RewriteRule<rewriteElementType>Stream(adaptor,"token <it>", list_<it>);};
-    separator="\n"
+	:{it|RewriteRule<rewriteElementType>Stream stream_<it>=new RewriteRule<rewriteElementType>Stream(adaptor,"token <it>", list_<it>);};
+	separator="\n"
 >
 <referencedWildcardLabels
 	:{it|RewriteRuleSubtreeStream stream_<it>=new RewriteRuleSubtreeStream(adaptor,"wildcard <it>",<it>);};
@@ -228,12 +226,12 @@
 	separator="\n"
 >
 <referencedRuleLabels
-    :{it|RewriteRuleSubtreeStream stream_<it>=new RewriteRuleSubtreeStream(adaptor,"rule <it>",<it>!=null?<it>.Tree:null);};
-    separator="\n"
+	:{it|RewriteRuleSubtreeStream stream_<it>=new RewriteRuleSubtreeStream(adaptor,"rule <it>",<it>!=null?<it>.Tree:null);};
+	separator="\n"
 >
 <referencedRuleListLabels
-    :{it|RewriteRuleSubtreeStream stream_<it>=new RewriteRuleSubtreeStream(adaptor,"token <it>",list_<it>);};
-    separator="\n"
+	:{it|RewriteRuleSubtreeStream stream_<it>=new RewriteRuleSubtreeStream(adaptor,"token <it>",list_<it>);};
+	separator="\n"
 >
 >>
 
@@ -321,7 +319,7 @@
 %>
 
 /** Gen ID or ID[args] */
-rewriteTokenRef(token,elementIndex,terminalOptions,args) ::= <<
+rewriteTokenRef(token,elementIndex,args,terminalOptions={}) ::= <<
 adaptor.AddChild(root_<treeLevel>, <createRewriteNodeFromElement(...)>);<\n>
 >>
 
@@ -344,15 +342,15 @@
 rewriteTokenListLabelRefRoot ::= rewriteTokenLabelRefRoot
 
 /** Gen ^(ID ...) or ^(ID[args] ...) */
-rewriteTokenRefRoot(token,elementIndex,terminalOptions,args) ::= <<
+rewriteTokenRefRoot(token,elementIndex,args,terminalOptions={}) ::= <<
 root_<treeLevel> = (<ASTLabelType>)adaptor.BecomeRoot(<createRewriteNodeFromElement(...)>, root_<treeLevel>);<\n>
 >>
 
-rewriteImaginaryTokenRef(args,token,terminalOptions,elementIndex) ::= <<
+rewriteImaginaryTokenRef(args,token,elementIndex,terminalOptions={}) ::= <<
 adaptor.AddChild(root_<treeLevel>, <createImaginaryNode(tokenType=token, ...)>);<\n>
 >>
 
-rewriteImaginaryTokenRefRoot(args,token,terminalOptions,elementIndex) ::= <<
+rewriteImaginaryTokenRefRoot(args,token,elementIndex,terminalOptions={}) ::= <<
 root_<treeLevel> = (<ASTLabelType>)adaptor.BecomeRoot(<createImaginaryNode(tokenType=token, ...)>, root_<treeLevel>);<\n>
 >>
 
@@ -408,7 +406,7 @@
 adaptor.AddChild(root_<treeLevel>, stream_<label>.NextTree());<\n>
 >>
 
-createImaginaryNode(tokenType,terminalOptions,args) ::= <%
+createImaginaryNode(tokenType,args,terminalOptions={}) ::= <%
 <if(terminalOptions.node)>
 <! new MethodNode(IDLabel, args) !>
 new <terminalOptions.node>(<tokenType><if(args)>, <args; separator=", "><endif>)
@@ -417,7 +415,7 @@
 <endif>
 %>
 
-createRewriteNodeFromElement(token,terminalOptions,args) ::= <%
+createRewriteNodeFromElement(token,args,terminalOptions={}) ::= <%
 <if(terminalOptions.node)>
 new <terminalOptions.node>(stream_<token>.NextToken()<if(args)>, <args; separator=", "><endif>)
 <else>
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/CSharp3/ASTDbg.stg b/tool/src/main/resources/org/antlr/codegen/templates/CSharp3/ASTDbg.stg
index 35d1629..b4b245a 100644
--- a/tool/src/main/resources/org/antlr/codegen/templates/CSharp3/ASTDbg.stg
+++ b/tool/src/main/resources/org/antlr/codegen/templates/CSharp3/ASTDbg.stg
@@ -35,26 +35,26 @@
  */
 
 parserMembers() ::= <<
-// Implement this function in your helper file to use a custom tree adaptor
-partial void InitializeTreeAdaptor();
-protected DebugTreeAdaptor adaptor;
+	// Implement this function in your helper file to use a custom tree adaptor
+	partial void InitializeTreeAdaptor();
+	protected DebugTreeAdaptor adaptor;
 
-public ITreeAdaptor TreeAdaptor
-{
-	get
+	public ITreeAdaptor TreeAdaptor
 	{
-		return adaptor;
-	}
-	set
-	{
+		get
+		{
+			return adaptor;
+		}
+		set
+		{
 <if(grammar.grammarIsRoot)>
-		this.adaptor = new DebugTreeAdaptor(dbg,adaptor);
+			this.adaptor = new DebugTreeAdaptor(dbg,adaptor);
 <else>
-		this.adaptor = (DebugTreeAdaptor)adaptor; // delegator sends dbg adaptor
+			this.adaptor = (DebugTreeAdaptor)adaptor; // delegator sends dbg adaptor
 <endif><\n>
-		<grammar.directDelegates:{g|<g:delegateName()>.TreeAdaptor = this.adaptor;}>
-	}
-}<\n>
+			<grammar.directDelegates:{g|<g:delegateName()>.TreeAdaptor = this.adaptor;}>
+		}
+	}<\n>
 >>
 
 parserCtorBody() ::= <<
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/CSharp3/ASTParser.stg b/tool/src/main/resources/org/antlr/codegen/templates/CSharp3/ASTParser.stg
index 8b507c7..b97d44b 100644
--- a/tool/src/main/resources/org/antlr/codegen/templates/CSharp3/ASTParser.stg
+++ b/tool/src/main/resources/org/antlr/codegen/templates/CSharp3/ASTParser.stg
@@ -50,7 +50,7 @@
 // TOKEN AST STUFF
 
 /** ID and output=AST */
-tokenRef(token,label,elementIndex,terminalOptions) ::= <%
+tokenRef(token,label,elementIndex,terminalOptions={}) ::= <%
 <super.tokenRef(...)>
 <if(!ruleDescriptor.isSynPred)>
 <if(backtracking)><\n>if (state.backtracking == 0) {<endif>
@@ -61,10 +61,10 @@
 %>
 
 /** ID! and output=AST (same as plain tokenRef) */
-tokenRefBang(token,label,elementIndex,terminalOptions) ::= "<super.tokenRef(...)>"
+tokenRefBang(token,label,elementIndex,terminalOptions={}) ::= "<super.tokenRef(...)>"
 
 /** ID^ and output=AST */
-tokenRefRuleRoot(token,label,elementIndex,terminalOptions) ::= <%
+tokenRefRuleRoot(token,label,elementIndex,terminalOptions={}) ::= <%
 <super.tokenRef(...)>
 <if(!ruleDescriptor.isSynPred)>
 <if(backtracking)><\n>if (<actions.(actionScope).synpredgate>) {<endif>
@@ -75,19 +75,19 @@
 %>
 
 /** ids+=ID! and output=AST */
-tokenRefBangAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
+tokenRefBangAndListLabel(token,label,elementIndex,terminalOptions={}) ::= <<
 <tokenRefBang(...)>
 <listLabelElem(elem=label,elemType=labelType,...)>
 >>
 
 /** label+=TOKEN when output=AST but not rewrite alt */
-tokenRefAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
+tokenRefAndListLabel(token,label,elementIndex,terminalOptions={}) ::= <<
 <tokenRef(...)>
 <listLabelElem(elem=label,elemType=labelType,...)>
 >>
 
 /** Match label+=TOKEN^ when output=AST but not rewrite alt */
-tokenRefRuleRootAndListLabel(token,label,terminalOptions,elementIndex) ::= <<
+tokenRefRuleRootAndListLabel(token,label,elementIndex,terminalOptions={}) ::= <<
 <tokenRefRuleRoot(...)>
 <listLabelElem(elem=label,elemType=labelType,...)>
 >>
@@ -105,20 +105,20 @@
 // rather than just added on code.  Investigate that refactoring when
 // I have more time.
 
-matchSet(s,label,terminalOptions,elementIndex,postmatchCode) ::= <<
+matchSet(s,label,elementIndex,postmatchCode,terminalOptions={}) ::= <<
 <super.matchSet(postmatchCode={<if(!ruleDescriptor.isSynPred)><if(backtracking)>if (<actions.(actionScope).synpredgate>) <endif>adaptor.AddChild(root_0, <createNodeFromToken(...)>);<endif>}, ...)>
 >>
 
-matchRuleBlockSet(s,label,terminalOptions,elementIndex,postmatchCode,treeLevel="0") ::= <<
+matchRuleBlockSet(s,label,elementIndex,postmatchCode,treeLevel="0",terminalOptions={}) ::= <<
 <matchSet(...)>
 >>
 
-matchSetBang(s,label,elementIndex,terminalOptions,postmatchCode) ::= "<super.matchSet(...)>"
+matchSetBang(s,label,elementIndex,postmatchCode,terminalOptions={}) ::= "<super.matchSet(...)>"
 
 // note there is no matchSetTrack because -> rewrites force sets to be
 // plain old blocks of alts: (A|B|...|C)
 
-matchSetRuleRoot(s,label,terminalOptions,elementIndex,debug) ::= <<
+matchSetRuleRoot(s,label,elementIndex,debug,terminalOptions={}) ::= <<
 <if(label)>
 <label>=(<labelType>)input.LT(1);
 <endif>
@@ -164,7 +164,7 @@
 
 // WILDCARD AST
 
-wildcard(token,label,elementIndex,terminalOptions) ::= <<
+wildcard(token,label,elementIndex,terminalOptions={}) ::= <<
 <super.wildcard(...)>
 <if(!ruleDescriptor.isSynPred)>
 <if(backtracking)>if (<actions.(actionScope).synpredgate>) {<endif>
@@ -174,9 +174,9 @@
 <endif>
 >>
 
-wildcardBang(label,elementIndex) ::= "<super.wildcard(...)>"
+wildcardBang(label,elementIndex) ::= "<super.wildcard(token=[],...)>"
 
-wildcardRuleRoot(token,label,elementIndex,terminalOptions) ::= <<
+wildcardRuleRoot(token,label,elementIndex,terminalOptions={}) ::= <<
 <super.wildcard(...)>
 <if(!ruleDescriptor.isSynPred)>
 <if(backtracking)>if (<actions.(actionScope).synpredgate>) {<endif>
@@ -186,7 +186,7 @@
 <endif>
 >>
 
-createNodeFromToken(label,terminalOptions) ::= <%
+createNodeFromToken(label,terminalOptions={}) ::= <%
 <if(terminalOptions.node)>
 new <terminalOptions.node>(<if(terminalOptions.type)><terminalOptions.type>,<endif><label><if(terminalOptions.text)>,<terminalOptions.text; format="string"><endif>)
 <else>
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/CSharp3/ASTTreeParser.stg b/tool/src/main/resources/org/antlr/codegen/templates/CSharp3/ASTTreeParser.stg
index 3be82ed..c5529b2 100644
--- a/tool/src/main/resources/org/antlr/codegen/templates/CSharp3/ASTTreeParser.stg
+++ b/tool/src/main/resources/org/antlr/codegen/templates/CSharp3/ASTTreeParser.stg
@@ -45,21 +45,25 @@
 /** Add a variable to track last element matched */
 ruleDeclarations() ::= <<
 <super.ruleDeclarations()>
+<if(!ruleDescriptor.isSynPred)>
 <ASTLabelType> _first_0 = default(<ASTLabelType>);
-<ASTLabelType> _last = default(<ASTLabelType>);<\n>
+<ASTLabelType> _last = default(<ASTLabelType>);
+<endif>
 >>
 
 /** What to emit when there is no rewrite rule.  For auto build
  *  mode, does nothing.
  */
-noRewrite(rewriteBlockLevel, treeLevel) ::= <<
+noRewrite(rewriteBlockLevel=false, treeLevel=false) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 <if(backtracking)>if (<actions.(actionScope).synpredgate>) {<endif>
 <if(rewriteMode)>
 retval.Tree = (<ASTLabelType>)_first_0;
 if (adaptor.GetParent(retval.Tree)!=null && adaptor.IsNil(adaptor.GetParent(retval.Tree)))
-    retval.Tree = (<ASTLabelType>)adaptor.GetParent(retval.Tree);
+	retval.Tree = (<ASTLabelType>)adaptor.GetParent(retval.Tree);
 <endif>
 <if(backtracking)>}<endif>
+<endif>
 >>
 
 /** match ^(root children) in tree parser; override here to
@@ -67,6 +71,7 @@
  */
 tree(root, actionsAfterRoot, children, nullableChildList,
      enclosingTreeLevel, treeLevel) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 _last = (<ASTLabelType>)input.LT(1);
 {
 <ASTLabelType> _save_last_<treeLevel> = _last;
@@ -86,9 +91,9 @@
 <actionsAfterRoot:element()>
 <if(nullableChildList)>
 if (input.LA(1) == TokenTypes.Down) {
-    Match(input, TokenTypes.Down, null); <checkRuleBacktrackFailure()>
-    <children:element()>
-    Match(input, TokenTypes.Up, null); <checkRuleBacktrackFailure()>
+	Match(input, TokenTypes.Down, null); <checkRuleBacktrackFailure()>
+	<children:element()>
+	Match(input, TokenTypes.Up, null); <checkRuleBacktrackFailure()>
 }
 <else>
 Match(input, TokenTypes.Down, null); <checkRuleBacktrackFailure()>
@@ -99,7 +104,10 @@
 adaptor.AddChild(root_<enclosingTreeLevel>, root_<treeLevel>);
 <endif>
 _last = _save_last_<treeLevel>;
-}<\n>
+}
+<else>
+<super.tree(...)>
+<endif>
 >>
 
 // TOKEN AST STUFF
@@ -108,12 +116,17 @@
  *  setting of _last
  */
 tokenRefBang(token,label,elementIndex,terminalOptions) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 _last = (<ASTLabelType>)input.LT(1);
 <super.tokenRef(...)>
+<else>
+<super.tokenRefBang(...)>
+<endif>
 >>
 
 /** ID auto construct */
 tokenRef(token,label,elementIndex,terminalOptions) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 _last = (<ASTLabelType>)input.LT(1);
 <super.tokenRef(...)>
 <if(!rewriteMode)>
@@ -129,16 +142,24 @@
 <if(backtracking)>if (<actions.(actionScope).synpredgate>)<endif>
 if (_first_<treeLevel> == null) _first_<treeLevel> = <label>;
 <endif>
+<else>
+<super.tokenRef(...)>
+<endif>
 >>
 
 /** label+=TOKEN auto construct */
 tokenRefAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 <tokenRef(...)>
 <listLabelElem(elem=label,...)>
+<else>
+<super.tokenRefAndListLabel(...)>
+<endif>
 >>
 
 /** ^(ID ...) auto construct */
 tokenRefRuleRoot(token,label,elementIndex,terminalOptions) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 _last = (<ASTLabelType>)input.LT(1);
 <super.tokenRef(...)>
 <if(!rewriteMode)>
@@ -151,16 +172,24 @@
 root_<treeLevel> = (<ASTLabelType>)adaptor.BecomeRoot(<label>_tree, root_<treeLevel>);
 <if(backtracking)>}<endif>
 <endif>
+<else>
+<super.tokenRefRuleRoot(...)>
+<endif>
 >>
 
 /** Match ^(label+=TOKEN ...) auto construct */
 tokenRefRuleRootAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 <tokenRefRuleRoot(...)>
 <listLabelElem(elem=label,...)>
+<else>
+<super.tokenRefRuleRootAndListLabel(...)>
+<endif>
 >>
 
 /** Match . wildcard and auto dup the node/subtree */
 wildcard(token,label,elementIndex,terminalOptions) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 _last = (<ASTLabelType>)input.LT(1);
 <super.wildcard(...)>
 <if(!rewriteMode)>
@@ -172,11 +201,15 @@
 <if(backtracking)>if (<actions.(actionScope).synpredgate>)<endif>
 if (_first_<treeLevel> == null) _first_<treeLevel> = <label>;
 <endif>
+<else>
+<super.wildcard(...)>
+<endif>
 >>
 
 // SET AST
 
 matchSet(s,label,terminalOptions,elementIndex,postmatchCode) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 _last = (<ASTLabelType>)input.LT(1);
 <super.matchSet(postmatchCode={
 <if(!rewriteMode)>
@@ -191,19 +224,31 @@
 <endif>
 }, ...
 )>
+<else>
+<super.matchSet(...)>
+<endif>
 >>
 
 matchRuleBlockSet(s,label,terminalOptions,elementIndex,postmatchCode,treeLevel="0") ::= <<
+<if(!ruleDescriptor.isSynPred)>
 <matchSet(...)>
 <noRewrite(...)> <! set return tree !>
+<else>
+<super.matchRuleBlockSet(...)>
+<endif>
 >>
 
 matchSetBang(s,label,terminalOptions,elementIndex,postmatchCode) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 _last = (<ASTLabelType>)input.LT(1);
 <super.matchSet(...)>
+<else>
+<super.matchSetBang(...)>
+<endif>
 >>
 
 matchSetRuleRoot(s,label,terminalOptions,elementIndex,debug) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 <super.matchSet(postmatchCode={
 <if(!rewriteMode)>
 <if(backtracking)>if (<actions.(actionScope).synpredgate>) {<endif>
@@ -217,12 +262,16 @@
 <endif>
 }, ...
 )>
+<else>
+<super.matchSetRuleRoot(...)>
+<endif>
 >>
 
 // RULE REF AST
 
 /** rule auto construct */
 ruleRef(rule,label,elementIndex,args,scope) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 _last = (<ASTLabelType>)input.LT(1);
 <super.ruleRef(...)>
 <if(backtracking)>if (<actions.(actionScope).synpredgate>)<endif>
@@ -231,27 +280,42 @@
 <else> <! rewrite mode !>
 if (_first_<treeLevel> == null) _first_<treeLevel> = <label>.Tree;
 <endif>
+<else>
+<super.ruleRef(...)>
+<endif>
 >>
 
 /** x+=rule auto construct */
 ruleRefAndListLabel(rule,label,elementIndex,args,scope) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 <ruleRef(...)>
 <listLabelElem(elem={<label>.Tree},...)>
+<else>
+<super.ruleRefAndListLabel(...)>
+<endif>
 >>
 
 /** ^(rule ...) auto construct */
 ruleRefRuleRoot(rule,label,elementIndex,args,scope) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 _last = (<ASTLabelType>)input.LT(1);
 <super.ruleRef(...)>
 <if(!rewriteMode)>
 <if(backtracking)>if (<actions.(actionScope).synpredgate>) <endif>root_<treeLevel> = (<ASTLabelType>)adaptor.BecomeRoot(<label>.Tree, root_<treeLevel>);
 <endif>
+<else>
+<super.ruleRefRuleRoot(...)>
+<endif>
 >>
 
 /** ^(x+=rule ...) auto construct */
 ruleRefRuleRootAndListLabel(rule,label,elementIndex,args,scope) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 <ruleRefRuleRoot(...)>
 <listLabelElem(elem={<label>.Tree},...)>
+<else>
+<super.ruleRefRuleRootAndListLabel(...)>
+<endif>
 >>
 
 /** rule when output=AST and tracking for rewrite */
@@ -262,20 +326,32 @@
 
 /** x+=rule when output=AST and tracking for rewrite */
 ruleRefTrackAndListLabel(rule,label,elementIndex,args,scope) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 _last = (<ASTLabelType>)input.LT(1);
 <super.ruleRefTrackAndListLabel(...)>
+<else>
+<super.ruleRefTrackAndListLabel(...)>
+<endif>
 >>
 
 /** ^(rule ...) rewrite */
 ruleRefRuleRootTrack(rule,label,elementIndex,args,scope) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 _last = (<ASTLabelType>)input.LT(1);
 <super.ruleRefRootTrack(...)>
+<else>
+<super.ruleRefRuleRootTrack(...)>
+<endif>
 >>
 
 /** ^(x+=rule ...) rewrite */
 ruleRefRuleRootTrackAndListLabel(rule,label,elementIndex,args,scope) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 _last = (<ASTLabelType>)input.LT(1);
 <super.ruleRefRuleRootTrackAndListLabel(...)>
+<else>
+<super.ruleRefRuleRootTrackAndListLabel(...)>
+<endif>
 >>
 
 /** Streams for token refs are tree nodes now; override to
@@ -291,9 +367,11 @@
 
 ruleCleanUp() ::= <<
 <super.ruleCleanUp()>
+<if(!ruleDescriptor.isSynPred)>
 <if(!rewriteMode)>
 <if(backtracking)>if (<actions.(actionScope).synpredgate>) {<endif>
 retval.Tree = (<ASTLabelType>)adaptor.RulePostProcessing(root_0);
 <if(backtracking)>}<endif>
 <endif>
+<endif>
 >>
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/CSharp3/CSharp3.stg b/tool/src/main/resources/org/antlr/codegen/templates/CSharp3/CSharp3.stg
index 29c8fae..c9229e1 100644
--- a/tool/src/main/resources/org/antlr/codegen/templates/CSharp3/CSharp3.stg
+++ b/tool/src/main/resources/org/antlr/codegen/templates/CSharp3/CSharp3.stg
@@ -98,7 +98,7 @@
 >>
 
 lexer(grammar, name, tokens, scopes, rules, numRules, filterMode, labelType="CommonToken",
-      superClass={<if(actions.(actionScope).superClass)><actions.(actionScope).superClass><else>Antlr.Runtime.Lexer<endif>},
+	  superClass={<if(actions.(actionScope).superClass)><actions.(actionScope).superClass><else>Antlr.Runtime.Lexer<endif>},
 	  rewriteElementType={}, ASTLabelType={}) ::= <<
 [System.CodeDom.Compiler.GeneratedCode("ANTLR", "<ANTLRVersion>")]
 [System.CLSCompliant(false)]
@@ -108,13 +108,13 @@
 	<scopes:{it|<if(it.isDynamicGlobalScope)><globalAttributeScope(scope=it)><endif>}>
 	<actions.lexer.members>
 
-    // delegates
-    <grammar.delegates:
-         {g|private <g.recognizerName> <g:delegateName()>;}; separator="\n">
-    // delegators
-    <grammar.delegators:
-         {g|private <g.recognizerName> <g:delegateName()>;}; separator="\n">
-    <last(grammar.delegators):{g|private <g.recognizerName> gParent;}>
+	// delegates
+	<grammar.delegates:
+		 {g|private <g.recognizerName> <g:delegateName()>;}; separator="\n">
+	// delegators
+	<grammar.delegators:
+		 {g|private <g.recognizerName> <g:delegateName()>;}; separator="\n">
+	<last(grammar.delegators):{g|private <g.recognizerName> gParent;}>
 
 	<actions.(actionScope).ctorModifier; null="public"> <grammar.recognizerName>()<! needed by subclasses !>
 	{
@@ -162,6 +162,14 @@
 		}
 	}
 
+<if(grammar.delegates)>
+	public override void SetState(RecognizerSharedState state)
+	{
+		base.SetState(state);
+		<grammar.delegates:{g|<g:delegateName()>.SetState(state);}; separator="\n">
+	}
+<endif>
+
 <endif>
 <if(filterMode)>
 	<filteringNextToken()>
@@ -185,7 +193,7 @@
 		<cyclicDFAs:{dfa | dfa<dfa.decisionNumber> = new DFA<dfa.decisionNumber>(this<if(dfa.specialStateSTs)>, SpecialStateTransition<dfa.decisionNumber><endif>);}; separator="\n">
 	}
 
-	<cyclicDFAs:cyclicDFA()> <! dump tables for all DFA !>
+	<cyclicDFAs:cyclicDFA()><! dump tables for all DFA !>
 	#endregion
 
 }
@@ -291,6 +299,22 @@
 	<last(grammar.delegators):{g|private <g.recognizerName> gParent;}>
 <endif>
 
+<if(grammar.delegates)>
+	public override void SetState(RecognizerSharedState state)
+	{
+		base.SetState(state);
+		<grammar.delegates:{g|<g:delegateName()>.SetState(state);}; separator="\n">
+	}
+
+<if(TREE_PARSER)>
+	public override void SetTreeNodeStream(ITreeNodeStream input)
+	{
+		base.SetTreeNodeStream(input);
+		<grammar.delegates:{g|<g:delegateName()>.SetTreeNodeStream(input);}; separator="\n">
+	}
+<endif>
+<endif>
+
 	<scopes:{it|<if(it.isDynamicGlobalScope)><globalAttributeScope(scope=it)><endif>}>
 	<@members()>
 
@@ -312,7 +336,7 @@
    appear to be defined in this recognizer. !>
 	#region Delegated rules
 <grammar.delegatedRules:{ruleDescriptor|
-	<ruleModifier(grammar=grammar,ruleDescriptor=ruleDescriptor)> <returnType(ruleDescriptor)> <ruleDescriptor.name; format="id">(<ruleDescriptor.parameterScope:parameterScope()>) <!throws RecognitionException !>{ <if(ruleDescriptor.hasReturnValue)>return <endif><ruleDescriptor.grammar:delegateName()>.<ruleDescriptor.name; format="id">(<ruleDescriptor.parameterScope.attributes:{a|<a.name; format="id">}; separator=", ">); \}}; separator="\n">
+	<ruleModifier(grammar=grammar,ruleDescriptor=ruleDescriptor)> <returnType(ruleDescriptor)> <ruleDescriptor.name; format="id">(<ruleDescriptor.parameterScope:parameterScope()>)<!throws RecognitionException !>{ <if(ruleDescriptor.hasReturnValue)>return <endif><ruleDescriptor.grammar:delegateName()>.<ruleDescriptor.name; format="id">(<if(ruleDescriptor.parameterScope)><ruleDescriptor.parameterScope.attributes:{a|<a.name; format="id">}; separator=", "><endif>); \}}; separator="\n">
 	#endregion Delegated rules
 <endif>
 
@@ -352,7 +376,6 @@
 <actions.(actionScope).ctorModifier; null="public"> <grammar.recognizerName>(<inputStreamType> input, RecognizerSharedState state<grammar.delegators:{g|, <g.recognizerName> <g:delegateName()>}>)
 	: base(input, state)
 {
-	<parserCtorBody()>
 <if(grammar.directDelegates)>
 	<grammar.directDelegates:
 		{g|<g:delegateName()> = new <g.recognizerName>(input, state<trunc(g.delegators):{p|, <p:delegateName()>}>, this);}; separator="\n">
@@ -363,6 +386,7 @@
 <if(grammar.delegators)>
 	<last(grammar.delegators):{g|gParent = <g:delegateName()>;}>
 <endif>
+	<parserCtorBody()>
 	OnCreated();
 }
 >>
@@ -412,7 +436,7 @@
 partial void LeaveRule_<ruleName>_fragment();
 
 // $ANTLR start <ruleName>
-public <!final !>void <ruleName>_fragment(<ruleDescriptor.parameterScope:parameterScope()>)
+<ruleModifier(grammar=grammar,ruleDescriptor=ruleDescriptor)> void <ruleName>_fragment(<ruleDescriptor.parameterScope:parameterScope()>)
 {
 	<ruleLabelDefs(...)>
 	EnterRule_<ruleName>_fragment();
@@ -482,6 +506,24 @@
 <if(backtracking)>if (state.backtracking>0) {state.failed=true; <returnFromRule()>}<endif>
 >>
 
+ruleWrapperMap ::= [
+	"bottomup":{<ruleWrapperBottomup()>},
+	"topdown":{<ruleWrapperTopdown()>},
+	default:""
+]
+
+ruleWrapperBottomup() ::= <<
+<if(TREE_PARSER && filterMode)>
+protected override <if(buildAST)>IAstRuleReturnScope<else>void<endif> Bottomup() { <if(buildAST)>return <endif>bottomup(); }
+<endif>
+>>
+
+ruleWrapperTopdown() ::= <<
+<if(TREE_PARSER && filterMode)>
+protected override <if(buildAST)>IAstRuleReturnScope<else>void<endif> Topdown() { <if(buildAST)>return <endif>topdown(); }
+<endif>
+>>
+
 /** How to generate code for a rule.  This includes any return type
  *  data aggregates required for multiple return values.
  */
@@ -490,7 +532,7 @@
 <returnScope(ruleDescriptor.returnScope)>
 partial void EnterRule_<ruleName>();
 partial void LeaveRule_<ruleName>();
-
+<ruleWrapperMap.(ruleName)>
 // $ANTLR start "<ruleName>"
 // <fileName>:<description>
 [GrammarRule("<ruleName>")]
@@ -524,7 +566,7 @@
 	{
 		ReportError(re);
 		Recover(input,re);
-	<@setErrorReturnValue()>
+		<@setErrorReturnValue()>
 	}
 <endif>
 <endif>
@@ -567,7 +609,7 @@
 <if(ruleDescriptor.hasMultipleReturnValues)>
 <returnType(ruleDescriptor)> retval = new <returnType(ruleDescriptor)>(<if(ruleDescriptor.returnScope.attributes)>this<endif>);
 retval.Start = (<labelType>)input.LT(1);
-<else>
+<elseif(ruleDescriptor.returnScope)>
 <ruleDescriptor.returnScope.attributes:{ a |
 <a.type> <a.name; format="id"> = <if(a.initValue)><a.initValue><else><initValue(a.type)><endif>;
 }>
@@ -589,13 +631,13 @@
 
 ruleLabelDefs(ruleDescriptor, labelType, ASTLabelType, rewriteElementType) ::= <<
 <[ruleDescriptor.tokenLabels,ruleDescriptor.tokenListLabels,ruleDescriptor.wildcardTreeLabels,ruleDescriptor.wildcardTreeListLabels]
-    :{it|<labelType> <it.label.text> = default(<labelType>);}; separator="\n"
+	:{it|<labelType> <it.label.text> = default(<labelType>);}; separator="\n"
 >
 <ruleDescriptor.tokenListLabels
-    :{it|List\<<labelType>\> list_<it.label.text> = null;}; separator="\n"
+	:{it|List\<<labelType>\> list_<it.label.text> = null;}; separator="\n"
 >
 <[ruleDescriptor.ruleListLabels,ruleDescriptor.wildcardTreeListLabels]
-    :{it|List\<<ASTLabelType>\> list_<it.label.text> = null;}; separator="\n"
+	:{it|List\<<ASTLabelType>\> list_<it.label.text> = null;}; separator="\n"
 >
 <ruleDescriptor.ruleLabels:ruleLabelDef(); separator="\n">
 <ruleDescriptor.ruleListLabels:ruleLabelDef(); separator="\n">
@@ -605,7 +647,7 @@
 <[ruleDescriptor.tokenLabels,
   ruleDescriptor.tokenListLabels,
   ruleDescriptor.ruleLabels]
-    :{it|<labelType> <it.label.text> = default(<labelType>);}; separator="\n"
+	:{it|<labelType> <it.label.text> = default(<labelType>);}; separator="\n"
 >
 <[ruleDescriptor.charListLabels,
   ruleDescriptor.charLabels]
@@ -613,9 +655,9 @@
 >
 <[ruleDescriptor.tokenListLabels,
   ruleDescriptor.ruleListLabels]
-    :{it|List\<<labelType>\> list_<it.label.text> = null;}; separator="\n"
+	:{it|List\<<labelType>\> list_<it.label.text> = null;}; separator="\n"
 >
-<ruleDescriptor.charListLabels:{it|List\<int\> list_<it.label.text> = null;}; separator="\n"
+<ruleDescriptor.charListLabels:{it|List\<int> list_<it.label.text> = null;}; separator="\n"
 >
 >>
 
@@ -882,12 +924,12 @@
 %>
 
 /** match a token optionally with a label in front */
-tokenRef(token,label,elementIndex,terminalOptions) ::= <<
+tokenRef(token,label,elementIndex,terminalOptions={}) ::= <<
 <if(label)><label>=(<labelType>)<endif>Match(input,<token>,Follow._<token>_in_<ruleName><elementIndex>); <checkRuleBacktrackFailure()>
 >>
 
 /** ids+=ID */
-tokenRefAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
+tokenRefAndListLabel(token,label,elementIndex,terminalOptions={}) ::= <<
 <tokenRef(...)>
 <listLabelElem(elem=label,elemType=labelType,...)>
 >>
@@ -918,7 +960,7 @@
 >>
 
 /** For now, sets are interval tests and must be tested inline */
-matchSet(s,label,terminalOptions,elementIndex,postmatchCode="") ::= <<
+matchSet(s,label,elementIndex,postmatchCode="",terminalOptions={}) ::= <<
 <if(label)>
 <matchSetLabel()>
 <endif>
@@ -987,14 +1029,14 @@
 <endif>
 %>
 
-wildcard(token,label,elementIndex,terminalOptions) ::= <<
+wildcard(token,label,elementIndex,terminalOptions={}) ::= <<
 <if(label)>
 <label>=(<labelType>)input.LT(1);<\n>
 <endif>
 MatchAny(input); <checkRuleBacktrackFailure()>
 >>
 
-wildcardAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
+wildcardAndListLabel(token,label,elementIndex,terminalOptions={}) ::= <<
 <wildcard(...)>
 <listLabelElem(elem=label,elemType=labelType,...)>
 >>
@@ -1111,7 +1153,7 @@
 // F i x e d  D F A  (if-then-else)
 
 dfaState(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
-int LA<decisionNumber>_<stateNumber> = input.LA(<k>);<\n>
+int LA<decisionNumber>_<k> = input.LA(<k>);<\n>
 <edges; separator="\nelse ">
 else
 {
@@ -1119,7 +1161,7 @@
 	alt<decisionNumber> = <eotPredictsAlt>;
 <else>
 	<ruleBacktrackFailure()>
-	NoViableAltException nvae = new NoViableAltException("<description>", <decisionNumber>, <stateNumber>, input);
+	NoViableAltException nvae = new NoViableAltException("<description>", <decisionNumber>, <stateNumber>, input, <k>);
 	DebugRecognitionException(nvae);
 	<@noViableAltException()>
 	throw nvae;
@@ -1133,7 +1175,7 @@
  *  expect "if ( LA(1)==X ) match(X);" and that's it.
  */
 dfaOptionalBlockState(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
-int LA<decisionNumber>_<stateNumber> = input.LA(<k>);<\n>
+int LA<decisionNumber>_<k> = input.LA(<k>);<\n>
 <edges; separator="\nelse ">
 >>
 
@@ -1144,7 +1186,7 @@
  *  anything other than 'a' predicts exiting.
  */
 dfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
-int LA<decisionNumber>_<stateNumber> = input.LA(<k>);<\n>
+int LA<decisionNumber>_<k> = input.LA(<k>);<\n>
 <edges; separator="\nelse "><\n>
 <if(eotPredictsAlt)>
 <if(!edges)>
@@ -1188,7 +1230,7 @@
 <else>
 	{
 		<ruleBacktrackFailure()>
-		NoViableAltException nvae = new NoViableAltException("<description>", <decisionNumber>, <stateNumber>, input);
+		NoViableAltException nvae = new NoViableAltException("<description>", <decisionNumber>, <stateNumber>, input, <k>);
 		DebugRecognitionException(nvae);
 		<@noViableAltException()>
 		throw nvae;
@@ -1324,12 +1366,22 @@
 	ITreeNodeStream input = (ITreeNodeStream)_input;
 	<endif>
 	int _s = s;
-	switch (s)
+	s = -1;
+	<! pull these outside the switch cases to save space on locals !>
+	int LA<dfa.decisionNumber>_1 = input.LA(1);
+	int index<dfa.decisionNumber>_1 = input.Index;
+	switch (_s)
 	{
-	<dfa.specialStateSTs:{state |
-	case <i0>:<! compressed special state numbers 0..n-1 !>
-		<state>}; separator="\n">
+	<dfa.specialStateSTs:{state |case <i0>:<! compressed special state numbers 0..n-1 !>
+	<state>}; separator="\n">
+
+	default:
+		break;
 	}
+
+	if (s >= 0)
+		return s;
+
 <if(backtracking)>
 	if (state.backtracking > 0) {state.failed=true; return -1;}
 <endif>
@@ -1344,20 +1396,18 @@
  *  state.
  */
 cyclicDFAState(decisionNumber,stateNumber,edges,needErrorClause,semPredState) ::= <<
-int LA<decisionNumber>_<stateNumber> = input.LA(1);<\n>
+{
 <if(semPredState)>
-<! get next lookahead symbol to test edges, then rewind !>
-<\n>int index<decisionNumber>_<stateNumber> = input.Index;
-input.Rewind();
+	<! get next lookahead symbol to test edges, then rewind !>
+	input.Rewind();
 <endif>
-s = -1;
-<edges; separator="\nelse ">
+	<edges; separator="\nelse ">
 <if(semPredState)>
-<! return input cursor to state before we rewound !>
-<\n>input.Seek(index<decisionNumber>_<stateNumber>);
+	<! return input cursor to state before we rewound !>
+	input.Seek(index<decisionNumber>_1);
 <endif>
-if (s >= 0) return s;
-break;
+	break;
+}
 >>
 
 /** Just like a fixed DFA edge, test the lookahead and indicate what
@@ -1379,7 +1429,7 @@
 
 andPredicates(left,right) ::= "(<left>&&<right>)"
 
-orPredicates(operands) ::= "(<first(operands)><rest(operands):{o | ||<o>}>)"
+orPredicates(operands) ::= "(<operands; separator=\"||\">)"
 
 notPredicate(pred) ::= "!(<evalPredicate(...)>)"
 
@@ -1387,7 +1437,7 @@
 
 evalSynPredicate(pred,description) ::= "EvaluatePredicate(<pred>_fragment)"
 
-lookaheadTest(atom,k,atomAsInt) ::= "LA<decisionNumber>_<stateNumber>==<atom>"
+lookaheadTest(atom,k,atomAsInt) ::= "LA<decisionNumber>_<k>==<atom>"
 
 /** Sometimes a lookahead test cannot assume that LA(k) is in a temp variable
  *  somewhere.  Must ask for the lookahead directly.
@@ -1395,7 +1445,7 @@
 isolatedLookaheadTest(atom,k,atomAsInt) ::= "input.LA(<k>)==<atom>"
 
 lookaheadRangeTest(lower,upper,k,rangeNumber,lowerAsInt,upperAsInt) ::= <%
-(LA<decisionNumber>_<stateNumber><ge()><lower> && LA<decisionNumber>_<stateNumber><le()><upper>)
+(LA<decisionNumber>_<k><ge()><lower> && LA<decisionNumber>_<k><le()><upper>)
 %>
 
 isolatedLookaheadRangeTest(lower,upper,k,rangeNumber,lowerAsInt,upperAsInt) ::= "(input.LA(<k>)<ge()><lower> && input.LA(<k>)<le()><upper>)"
@@ -1410,6 +1460,7 @@
 // A T T R I B U T E S
 
 attributeScope(scope) ::= <<
+<if(scope)>
 <if(scope.attributes)>
 protected sealed partial class <scope.name>_scope
 {
@@ -1434,7 +1485,8 @@
 <else>
 partial void <scope.name>_scopeAfter( <scope.name>_scope scope );
 <endif>
-protected readonly ListStack\<<scope.name>_scope\> <scope.name>_stack = new ListStack\<<scope.name>_scope\>();
+protected readonly ListStack\<<scope.name>_scope> <scope.name>_stack = new ListStack\<<scope.name>_scope>();
+<endif>
 <endif>
 >>
 
@@ -1464,9 +1516,7 @@
  *  values.
  */
 ruleLabelType(referencedRule) ::= <%
-<if(referencedRule.returnScope.attributes&&referencedRule.hasMultipleReturnValues)>
-	<referencedRule.grammar.recognizerName>.<referencedRule:returnStructName()>
-<elseif(referencedRule.hasMultipleReturnValues)>
+<if(referencedRule.hasMultipleReturnValues)>
 	<ruleReturnBaseType()>
 <elseif(referencedRule.hasSingleReturnValue)>
 	<referencedRule.singleValueReturnType>
@@ -1559,7 +1609,7 @@
 /** reference an attribute of rule; might only have single return value */
 ruleLabelRef(referencedRule,scope,attr) ::= <%
 <if(referencedRule.hasMultipleReturnValues)>
-(<scope>!=null?<scope>.<attr.name; format="id">:<initValue(attr.type)>)
+(<scope>!=null?((<returnType(referencedRule)>)<scope>).<attr.name; format="id">:<initValue(attr.type)>)
 <else>
 <scope>
 <endif>
@@ -1590,7 +1640,7 @@
 
 // not sure the next are the right approach
 
-tokenLabelPropertyRef_text(scope,attr) ::= "(<scope>!=null?<scope>.Text:null)"
+tokenLabelPropertyRef_text(scope,attr) ::= "(<scope>!=null?<scope>.Text:default(string))"
 tokenLabelPropertyRef_type(scope,attr) ::= "(<scope>!=null?<scope>.Type:0)"
 tokenLabelPropertyRef_line(scope,attr) ::= "(<scope>!=null?<scope>.Line:0)"
 tokenLabelPropertyRef_pos(scope,attr) ::= "(<scope>!=null?<scope>.CharPositionInLine:0)"
@@ -1606,9 +1656,9 @@
 <if(TREE_PARSER)>
 (<scope>!=null?(input.TokenStream.ToString(
   input.TreeAdaptor.GetTokenStartIndex(<scope>.Start),
-  input.TreeAdaptor.GetTokenStopIndex(<scope>.Start))):null)
+  input.TreeAdaptor.GetTokenStopIndex(<scope>.Start))):default(string))
 <else>
-(<scope>!=null?input.ToString(<scope>.Start,<scope>.Stop):null)
+(<scope>!=null?input.ToString(<scope>.Start,<scope>.Stop):default(string))
 <endif>
 %>
 
@@ -1633,7 +1683,7 @@
     "(<scope>!=null?<scope>.TokenIndex:0)"
 
 lexerRuleLabelPropertyRef_text(scope,attr) ::=
-    "(<scope>!=null?<scope>.Text:null)"
+    "(<scope>!=null?<scope>.Text:default(string))"
 
 lexerRuleLabelPropertyRef_int(scope,attr) ::=
     "(<scope>!=null?int.Parse(<scope>.Text):0)"
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/CSharp3/Dbg.stg b/tool/src/main/resources/org/antlr/codegen/templates/CSharp3/Dbg.stg
index 3841a8f..c250e44 100644
--- a/tool/src/main/resources/org/antlr/codegen/templates/CSharp3/Dbg.stg
+++ b/tool/src/main/resources/org/antlr/codegen/templates/CSharp3/Dbg.stg
@@ -48,21 +48,21 @@
 	};<\n>
 <endif>
 <if(grammar.grammarIsRoot)><! grammar imports other grammar(s) !>
-	int ruleLevel = 0;
-	public virtual int RuleLevel { get { return ruleLevel; } }
-	public virtual void IncRuleLevel() { ruleLevel++; }
-	public virtual void DecRuleLevel() { ruleLevel--; }
+int ruleLevel = 0;
+public virtual int RuleLevel { get { return ruleLevel; } }
+public virtual void IncRuleLevel() { ruleLevel++; }
+public virtual void DecRuleLevel() { ruleLevel--; }
 <if(profile)>
-	<ctorForProfilingRootGrammar()>
+<ctorForProfilingRootGrammar()>
 <else>
-	<ctorForRootGrammar()>
+<ctorForRootGrammar()>
 <endif>
 <ctorForPredefinedListener()>
 <else><! imported grammar !>
-	public int RuleLevel { get { return <grammar.delegators:{g| <g:delegateName()>}>.RuleLevel; } }
-	public void IncRuleLevel() { <grammar.delegators:{g| <g:delegateName()>}>.IncRuleLevel(); }
-	public void DecRuleLevel() { <grammar.delegators:{g| <g:delegateName()>}>.DecRuleLevel(); }
-	<ctorForDelegateGrammar()>
+public int RuleLevel { get { return <grammar.delegators:{g| <g:delegateName()>}>.RuleLevel; } }
+public void IncRuleLevel() { <grammar.delegators:{g| <g:delegateName()>}>.IncRuleLevel(); }
+public void DecRuleLevel() { <grammar.delegators:{g| <g:delegateName()>}>.DecRuleLevel(); }
+<ctorForDelegateGrammar()>
 <endif>
 <if(profile)>
 public override bool AlreadyParsedRule( IIntStream input, int ruleIndex )
@@ -94,9 +94,9 @@
 <actions.(actionScope).ctorModifier; null="public"> <name>( <inputStreamType> input, int port, RecognizerSharedState state )
 	: base( input, state )
 {
-	<parserCtorBody()>
 	<createListenerAndHandshake()>
 	<grammar.directDelegates:{g|<g:delegateName()> = new <g.recognizerName>( input, dbg, this.state, this<grammar.delegators:{g|, <g:delegateName()>}> );}; separator="\n">
+	<parserCtorBody()>
 	<@finally()>
 }<\n>
 >>
@@ -112,9 +112,9 @@
 {
 	Profiler p = (Profiler)dbg;
 	p.setParser(this);
-	<parserCtorBody()>
 	<grammar.directDelegates:
 	 {g|<g:delegateName()> = new <g.recognizerName>( input, dbg, this.state, this<grammar.delegators:{g|, <g:delegateName()>}> );}; separator="\n">
+	<parserCtorBody()>
 	<@finally()>
 }
 <\n>
@@ -125,9 +125,9 @@
 <actions.(actionScope).ctorModifier; null="public"> <name>( <inputStreamType> input, IDebugEventListener dbg, RecognizerSharedState state<grammar.delegators:{g|, <g.recognizerName> <g:delegateName()>}> )
 	: base( input, dbg, state )
 {
-	<parserCtorBody()>
 	<grammar.directDelegates:
 	 {g|<g:delegateName()> = new <g.recognizerName>( input, this, this.state<grammar.delegators:{g|, <g:delegateName()>}> );}; separator="\n">
+	<parserCtorBody()>
 }<\n>
 >>
 
@@ -139,8 +139,8 @@
 	Profiler p = (Profiler)dbg;
 	p.setParser(this);
 <endif>
-	<parserCtorBody()>
 	<grammar.directDelegates:{g|<g:delegateName()> = new <g.recognizerName>(input, dbg, this.state, this<grammar.delegators:{g|, <g:delegateName()>}>);}; separator="\n">
+	<parserCtorBody()>
 	<@finally()>
 }<\n>
 >>
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/Cpp/Cpp.stg b/tool/src/main/resources/org/antlr/codegen/templates/Cpp/Cpp.stg
new file mode 100755
index 0000000..d94024b
--- /dev/null
+++ b/tool/src/main/resources/org/antlr/codegen/templates/Cpp/Cpp.stg
@@ -0,0 +1,2597 @@
+/*
+ [The "BSD license"]
+ Copyright (c) 2005-2009 Gokulakannan Somasundaram,
+ 
+ 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.
+*/
+
+/*
+ * This code generating template and the associated Cpp runtime was produced by:
+ * Gokulakannan Somasundaram ( heavy lifting from C Run-time by Jim Idle )
+ */
+cTypeInitMap ::= [
+	"int"		    : "0",              // Integers     start out being 0
+	"long"		    : "0",              // Longs        start out being 0
+	"float"		    : "0.0",           // Floats       start out being 0
+	"double"	    : "0.0",           // Doubles      start out being 0
+	"bool"    	    : "false",   // Booleans     start out being Antlr C for false
+	"byte"		    : "0",              // Bytes        start out being 0
+	"short"		    : "0",              // Shorts       start out being 0
+	"char"		    : "0"              // Chars        start out being 0
+]
+
+leadIn(type) ::=
+<<
+/** \file
+ *  This <type> file was generated by $ANTLR version <ANTLRVersion>
+ *
+ *     -  From the grammar source file : <fileName>
+ *     -                            On : <generatedTimestamp>
+<if(LEXER)>
+ *     -                 for the lexer : <name>Lexer
+<endif>
+<if(PARSER)>
+ *     -                for the parser : <name>Parser
+<endif>
+<if(TREE_PARSER)>
+ *     -           for the tree parser : <name>TreeParser
+<endif>
+ *
+ * Editing it, at least manually, is not wise.
+ *
+ * C++ language generator and runtime by Gokulakannan Somasundaram ( heavy lifting from C Run-time by Jim Idle )
+ *
+ *
+>>
+
+/** The overall file structure of a recognizer; stores methods for rules
+ *  and cyclic DFAs plus support code.
+ */
+outputFile( LEXER,
+            PARSER,
+            TREE_PARSER,
+            actionScope,
+            actions,
+            docComment,
+            recognizer,
+            name,
+            tokens,
+            tokenNames,
+            rules,
+            cyclicDFAs,
+            bitsets,
+            buildTemplate,
+            buildAST,
+            rewriteMode,
+            profile,
+            backtracking,
+            synpreds,
+            memoize,
+            numRules,
+            fileName,
+            ANTLRVersion,
+            generatedTimestamp,
+            trace,
+            scopes,
+            superClass,
+            literals
+            ) ::=
+<<
+<leadIn("C++ source")>
+*/
+// [The "BSD license"]
+// Copyright (c) 2005-2009 Gokulakannan Somasundaram, ElectronDB
+//
+// 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.
+
+<if(actions.(actionScope).header)>
+
+/* =============================================================================
+ * This is what the grammar programmer asked us to put at the top of every file.
+ */
+<actions.(actionScope).header>
+/* End of Header action.
+ * =============================================================================
+ */
+<endif>
+
+/* -----------------------------------------
+ * Include the ANTLR3 generated header file.
+ */
+#include    "<name>.hpp"
+<if(trace)>
+#include \<iostream>
+<endif>
+<if(recognizer.grammar.delegators)>
+// Include delegator definition header files
+//
+<recognizer.grammar.delegators: {g|#include "<g.recognizerName>.hpp" }; separator="\n">
+<endif>
+
+<actions.(actionScope).postinclude>
+/* ----------------------------------------- */
+
+<docComment>
+
+<if(literals)>
+
+<beginNamespace(actions)>
+
+/** String literals used by <name> that we must do things like MATCHS() with.
+ *  C will normally just lay down 8 bit characters, and you can use L"xxx" to
+ *  get wchar_t, but wchar_t is 16 bits on Windows, which is not UTF32 and so
+ *  we perform this little trick of defining the literals as arrays of UINT32
+ *  and passing in the address of these.
+ */
+<literals:{it | static ANTLR_UCHAR	lit_<i>[]  = <it>;}; separator="\n">
+
+<endNamespace(actions)>
+
+<endif>
+
+/* ============================================================================= */
+
+/* =============================================================================
+ * Start of recognizer
+ */
+
+<recognizer>
+
+/* End of code
+ * =============================================================================
+ */
+
+>>
+headerFileExtension() ::= ".hpp"
+
+beginNamespace(actions) ::= <%
+	<if(actions.(actionScope).namespace)>
+	namespace <actions.(actionScope).namespace> {
+	<endif>
+%>
+
+endNamespace(actions) ::= <%
+	<if(actions.(actionScope).namespace)>
+	}
+	<endif>
+%>
+
+
+headerFile( LEXER,
+            PARSER,
+            TREE_PARSER,
+            actionScope,
+            actions,
+            docComment,
+            recognizer,
+            name,
+            tokens,
+            tokenNames,
+            rules,
+            cyclicDFAs,
+            bitsets,
+            buildTemplate,
+            buildAST,
+            rewriteMode,
+            profile,
+            backtracking,
+            synpreds,
+            memoize,
+            numRules,
+            fileName,
+            ANTLRVersion,
+            generatedTimestamp,
+            trace,
+            scopes,
+            superClass,
+            literals
+        ) ::=
+<<
+<leadIn("C++ header")>
+<if(PARSER)>
+ * The parser <mainName()> has the callable functions (rules) shown below,
+<endif>
+<if(LEXER)>
+ * The lexer <mainName()> has the callable functions (rules) shown below,
+<endif>
+<if(TREE_PARSER)>
+ * The tree parser <mainName()> has the callable functions (rules) shown below,
+<endif>
+ * which will invoke the code for the associated rule in the source grammar
+ * assuming that the input stream is pointing to a token/text stream that could begin
+ * this rule.
+ *
+ * For instance if you call the first (topmost) rule in a parser grammar, you will
+ * get the results of a full parse, but calling a rule half way through the grammar will
+ * allow you to pass part of a full token stream to the parser, such as for syntax checking
+ * in editors and so on.
+ *
+ */
+// [The "BSD license"]
+// Copyright (c) 2005-2009 Gokulakannan Somasundaram. 
+//
+// 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.
+
+#ifndef	_<name>_H
+#define _<name>_H
+<actions.(actionScope).preincludes>
+/* =============================================================================
+ * Standard antlr3 C++ runtime definitions
+ */
+#include \<antlr3.hpp>
+
+/* End of standard antlr 3 runtime definitions
+ * =============================================================================
+ */
+
+<actions.(actionScope).includes>
+
+<if(recognizer.grammar.delegates)>
+// Include delegate definition header files
+//
+<recognizer.grammar.delegates: {g|#include	"<g.recognizerName>.hpp"}; separator="\n">
+
+<endif>
+
+
+<actions.(actionScope).header>
+
+#ifdef	WIN32
+// Disable: Unreferenced parameter,							- Rules with parameters that are not used
+//          constant conditional,							- ANTLR realizes that a prediction is always true (synpred usually)
+//          initialized but unused variable					- tree rewrite variables declared but not needed
+//          Unreferenced local variable						- lexer rule declares but does not always use _type
+//          potentially unitialized variable used			- retval always returned from a rule
+//			unreferenced local function has been removed	- susually getTokenNames or freeScope, they can go without warnigns
+//
+// These are only really displayed at warning level /W4 but that is the code ideal I am aiming at
+// and the codegen must generate some of these warnings by necessity, apart from 4100, which is
+// usually generated when a parser rule is given a parameter that it does not use. Mostly though
+// this is a matter of orthogonality hence I disable that one.
+//
+#pragma warning( disable : 4100 )
+#pragma warning( disable : 4101 )
+#pragma warning( disable : 4127 )
+#pragma warning( disable : 4189 )
+#pragma warning( disable : 4505 )
+#pragma warning( disable : 4701 )
+#endif
+<if(backtracking)>
+
+/* ========================
+ * BACKTRACKING IS ENABLED
+ * ========================
+ */
+<endif>
+
+<beginNamespace(actions)>
+
+<if(recognizer.grammar.delegators)>
+// Include delegator definition classes
+//
+<recognizer.grammar.delegators: {g|class <g.recognizerName>; }; separator="\n">
+<endif>
+
+<actions.(actionScope).traits>
+typedef <name>Traits <name>ImplTraits;
+
+<rules:{r | <if(r.ruleDescriptor.isSynPred)> struct <r.ruleDescriptor.name> {\}; <endif>}; separator="\n">
+
+class <name>Tokens
+{
+public:
+	/** Symbolic definitions of all the tokens that the <grammarType()> will work with.
+	 *
+	 * Antlr will define EOF, but we can't use that as it it is too common in
+	 * in C header files and that would be confusing. There is no way to filter this out at the moment
+	 * so we just undef it here for now. That isn't the value we get back from C recognizers
+	 * anyway. We are looking for ANTLR_TOKEN_EOF.
+	 */
+	enum Tokens 
+	{
+		EOF_TOKEN = <name>ImplTraits::CommonTokenType::TOKEN_EOF
+		<tokens:{it | , <it.name> = <it.type> }; separator="\n">
+	};
+
+};
+
+/** Context tracking structure for <mainName()>
+ */
+class <name> : public <componentBaseType()>, public <name>Tokens
+{
+public:
+	typedef <name>ImplTraits ImplTraits;
+	typedef <name> ComponentType;
+	typedef ComponentType::StreamType StreamType;
+	typedef <componentBaseType()> BaseType;
+	typedef ImplTraits::RecognizerSharedStateType\<StreamType> RecognizerSharedStateType;
+	typedef StreamType InputType;
+<if(recognizer.filterMode)>
+	static const bool IsFiltered = true;
+<else>
+	static const bool IsFiltered = false;
+<endif>
+	
+	<scopes:{it | <if(it.isDynamicGlobalScope)><globalAttributeScopeDecl(it)><endif>}>
+	<rules:{r | <if(r.ruleDescriptor.ruleScope)><ruleAttributeScopeDecl(scope=r.ruleDescriptor.ruleScope)><endif>}>
+	
+private:	
+<if(recognizer.grammar.delegates)>
+	<recognizer.grammar.delegates:
+         {g|<g.recognizerName>*	 m_<g:delegateName()>;}; separator="\n">
+<endif>
+<if(recognizer.grammar.delegators)>
+	<recognizer.grammar.delegators:
+         {g|<g.recognizerName>*	 m_<g:delegateName()>;}; separator="\n">
+<endif>
+<scopes:{it | <if(it.isDynamicGlobalScope)>
+    <globalAttributeScopeDef(it)>
+<endif>}; separator="\n\n">
+<rules: {r |<if(r.ruleDescriptor.ruleScope)>
+    <ruleAttributeScopeDef(scope=r.ruleDescriptor.ruleScope)>
+<endif>}>
+    <@members>
+    <@end>
+
+public:
+    <name>(InputType* instream<recognizer.grammar.delegators:{g|, <g.recognizerName>* <g:delegateName()>}>);
+    <name>(InputType* instream, RecognizerSharedStateType* state<recognizer.grammar.delegators:{g|, <g.recognizerName>* <g:delegateName()>}>);
+    
+    void init(InputType* instream <recognizer.grammar.delegators:{g|, <g.recognizerName>* <g:delegateName()>}> );
+
+    <actions.(actionScope).context>
+
+<if(LEXER)>
+<if(recognizer.filterMode)>
+    void  memoize(ANTLR_MARKER  ruleIndex, ANTLR_MARKER  ruleParseStart);
+    bool  alreadyParsedRule(ANTLR_MARKER	ruleIndex);
+    <filteringNextToken()>
+<endif>    
+    <rules:{r | <if(!r.ruleDescriptor.isSynPred)><headerReturnType(ruleDescriptor=r.ruleDescriptor)>  m<r.ruleDescriptor.name>( <r.ruleDescriptor.parameterScope:parameterScope()>);<endif>}; separator="\n">
+    <rules:{r | <if(r.ruleDescriptor.isSynPred)>  <headerReturnType(ruleDescriptor=r.ruleDescriptor)> msynpred( antlr3::ClassForwarder\< <r.ruleDescriptor.name> > <r.ruleDescriptor.parameterScope:parameterScope()>);
+    void m<r.ruleDescriptor.name>_fragment (<r.ruleDescriptor.parameterScope:parameterScope()>);<endif>}; separator="\n">
+<endif>
+<if(!LEXER)>
+    <rules:{r | <headerReturnScope(ruleDescriptor=r.ruleDescriptor)>}>
+    <rules:{r | <if(!r.ruleDescriptor.isSynPred)> <headerReturnType(ruleDescriptor=r.ruleDescriptor)> <r.ruleDescriptor.name> (<r.ruleDescriptor.parameterScope:parameterScope()>); <endif>}; separator="\n">
+    <rules:{r | <if(r.ruleDescriptor.isSynPred)>  <headerReturnType(ruleDescriptor=r.ruleDescriptor)> msynpred( antlr3::ClassForwarder\< <r.ruleDescriptor.name> > <r.ruleDescriptor.parameterScope:parameterScope()>);
+    void m<r.ruleDescriptor.name>_fragment (<r.ruleDescriptor.parameterScope:parameterScope()>);<endif>}; separator="\n">
+<! generate rule/method definitions for imported rules so they
+   appear to be defined in this recognizer. !>
+    // Delegated rules
+<recognizer.grammar.delegatedRules:{ruleDescriptor|
+    <headerReturnType(ruleDescriptor)> <ruleDescriptor.name>(<ruleDescriptor.parameterScope:parameterScope()>);}; separator="\n">
+<endif>
+
+    const char *    getGrammarFileName();
+    void            reset();
+    ~<name>();
+
+};
+
+// Function protoypes for the constructor functions that external translation units
+// such as delegators and delegates may wish to call.
+//
+<if(!recognizer.grammar.grammarIsRoot)>
+extern ANTLR_UINT8*   <recognizer.grammar.composite.rootGrammar.recognizerName>TokenNames[];
+<endif>
+
+
+/* End of token definitions for <name>
+ * =============================================================================
+ */
+
+<endNamespace(actions)>
+
+#endif
+
+/* END - Note:Keep extra line feed to satisfy UNIX systems */
+
+>>
+
+grammarType() ::= <%
+<if(PARSER)>
+parser
+<endif>
+<if(LEXER)>
+lexer
+<endif>
+<if(TREE_PARSER)>
+tree parser
+<endif>
+%>
+
+componentType() ::= <<
+<if(PARSER)>
+<name>ImplTraits::ParserType
+<endif>
+<if(LEXER)>
+<name>ImplTraits::LexerType
+<endif>
+<if(TREE_PARSER)>
+<name>ImplTraits::TreeParserType
+<endif>
+>>
+
+componentBaseType() ::= <%
+<if(PARSER)>
+<name>ImplTraits::BaseParserType
+<endif>
+<if(LEXER)>
+<name>ImplTraits::BaseLexerType
+<endif>
+<if(TREE_PARSER)>
+<name>ImplTraits::BaseTreeParserType
+<endif>
+%>
+
+streamType() ::= <<
+<if(PARSER)>
+<name>ImplTraits::ParserType::StreamType
+<endif>
+<if(LEXER)>
+<name>ImplTraits::LexerType::StreamType
+<endif>
+<if(TREE_PARSER)>
+<name>ImplTraits::TreeParserType::StreamType
+<endif>
+>>
+
+
+mainName() ::= <%
+<if(PARSER)>
+<name>
+<endif>
+<if(LEXER)>
+<name>
+<endif>
+<if(TREE_PARSER)>
+<name>
+<endif>
+%>
+
+headerReturnScope(ruleDescriptor) ::= "<returnScope(scope=ruleDescriptor.returnScope)>"
+
+headerReturnType(ruleDescriptor) ::= <%
+<if(LEXER)>
+<if(!ruleDescriptor.isSynPred)>
+ void
+<else>
+ <returnType()>
+<endif>
+<else>
+ <returnType()>
+<endif>
+%>
+
+// Produce the lexer output
+//
+lexer(  grammar,
+	name,
+        tokens,
+        scopes,
+        rules,
+        numRules,
+        filterMode,
+        superClass,
+        labelType="ImplTraits::CommonTokenType*") ::= <<
+
+using namespace antlr3;
+
+<beginNamespace(actions)>
+
+<if(filterMode)>
+
+/* Override the normal MEMOIZE and HAVEALREADYPARSED macros as this is a filtering
+ * lexer. In filter mode, the memoizing and backtracking are gated at BACKTRACKING > 1 rather
+ * than just BACKTRACKING. In some cases this might generate code akin to:
+ *   if (BACKTRACKING) if (BACKTRACKING > 1) memoize.
+ */
+void	<name>::memoize(ANTLR_MARKER  ruleIndex, ANTLR_MARKER  ruleParseStart)
+{
+	BaseType* base = this;
+	if ( this->get_backtracking()>1 ) 
+		base->memoize( ruleIndex, ruleParseStart );
+
+}
+
+bool	<name>::alreadyParsedRule(ANTLR_MARKER	ruleIndex)
+{
+	BaseType* base = this;
+	if ( this->get_backtracking() > 1 )
+		return base->haveParsedRule(ruleIndex);
+	return false;
+}
+
+<endif>
+
+/* =========================================================================
+ * Lexer matching rules end.
+ * =========================================================================
+ */
+
+<scopes:{it |<if(it.isDynamicGlobalScope)><globalAttributeScope(it)><endif>}>
+
+<actions.lexer.members>
+
+<name>::~<name>()
+{
+<if(memoize)>
+	RuleMemoType* rulememo = this->getRuleMemo();
+	if(rulememo != NULL)
+	{
+		delete rulememo;
+		this->setRuleMemo(NULL);
+	}
+<endif>
+<if(grammar.directDelegates)>
+	// Free the lexers that we delegated to
+	// functions to. NULL the state so we only free it once.
+	//
+	<grammar.directDelegates:
+         {g| m_<g:delegateName()>->set_lexstate(NULL);
+         delete m_<g:delegateName()>; }; separator="\n">
+<endif>
+}
+
+void
+<name>::reset()
+{
+    this->get_rec()->reset();
+}
+
+/** \brief Name of the grammar file that generated this code
+ */
+static const char fileName[] = "<fileName>";
+
+/** \brief Return the name of the grammar file that generated this code.
+ */
+const char* <name>::getGrammarFileName()
+{
+	return fileName;
+}
+
+/** \brief Create a new lexer called <name>
+ *
+ * \param[in]    instream Pointer to an initialized input stream
+ * \return
+ *     - Success p<name> initialized for the lex start
+ *     - Fail NULL
+ */
+<name>::<name>(StreamType* instream<grammar.delegators:{g|, <g.recognizerName>* <g:delegateName()>}>)
+:<name>ImplTraits::BaseLexerType(ANTLR_SIZE_HINT, instream, NULL)
+{
+	// See if we can create a new lexer with the standard constructor
+	//
+	this->init(instream <grammar.delegators:{g|, <g:delegateName()>}>);
+}
+
+/** \brief Create a new lexer called <name>
+ *
+ * \param[in]    instream Pointer to an initialized input stream
+ * \param[state] state Previously created shared recognizer stat
+ * \return
+ *     - Success p<name> initialized for the lex start
+ *     - Fail NULL
+ */
+<name>::<name>(StreamType* instream, RecognizerSharedStateType* state<grammar.delegators:{g|, <g.recognizerName>* <g:delegateName()>}>)
+:<name>ImplTraits::BaseLexerType(ANTLR_SIZE_HINT, instream, state)
+{
+	this->init(instream <grammar.delegators:{g|, <g:delegateName()>} >);
+}
+
+void <name>::init(StreamType* instream<grammar.delegators:{g|, <g.recognizerName>* <g:delegateName()>} >)
+{
+    /* -------------------------------------------------------------------
+     * Memory for basic structure is allocated, now to fill in
+     * in base ANTLR3 structures. We initialize the function pointers
+     * for the standard ANTLR3 lexer function set, but upon return
+     * from here, the programmer may set the pointers to provide custom
+     * implementations of each function.
+     *
+     * We don't use the macros defined in <name>.h here so you can get a sense
+     * of what goes where.
+     */
+
+<if(memoize)>
+<if(grammar.grammarIsRoot)>
+    // Create a LIST for recording rule memos.
+    //
+    this->setRuleMemo( new IntTrie(15) );	/* 16 bit depth is enough for 32768 rules! */
+<endif>
+<endif>
+
+<if(grammar.directDelegates)>
+	// Initialize the lexers that we are going to delegate some
+	// functions to.
+	//
+	<grammar.directDelegates:
+         {g|m_<g:delegateName()> = new <g.recognizerName>(instream, this->get_lexstate(), this<grammar.delegators:{g|, <g:delegateName()>}>);}; separator="\n">
+<endif>
+<if(grammar.delegators)>
+	// Install the pointers back to lexers that will delegate us to perform certain functions
+	// for them.
+	//
+	<grammar.delegators:
+         {g| m_<g:delegateName()> = <g:delegateName()>;}; separator="\n">
+<endif>
+}
+
+<if(cyclicDFAs)>
+
+/* =========================================================================
+ * DFA tables for the lexer
+ */
+<cyclicDFAs:cyclicDFA()> <! dump tables for all DFA !>
+/* =========================================================================
+ * End of DFA tables for the lexer
+ */
+<endif>
+
+/* =========================================================================
+ * Functions to match the lexer grammar defined tokens from the input stream
+ */
+
+<rules; separator="\n\n">
+
+/* =========================================================================
+ * Lexer matching rules end.
+ * =========================================================================
+ */
+<if(synpreds)>
+
+/* =========================================================================
+ * Lexer syntactic predicates
+ */
+<synpreds:{p | <lexerSynpred(predname=p)>}>
+/* =========================================================================
+ * Lexer syntactic predicates end.
+ * =========================================================================
+ */
+<endif>
+
+/* End of Lexer code
+ * ================================================
+ * ================================================
+ */
+ 
+<endNamespace(actions)>
+
+>>
+
+
+filteringNextToken() ::= <<
+<name>ImplTraits::CommonTokenType*
+<name>ImplTraits::TokenSourceType::nextToken()
+{
+    LexerType*   lexer;
+    typename LexerType::RecognizerSharedStateType* state;
+
+    lexer   = this->get_super();
+    state	= lexer->get_lexstate();
+
+    /* Get rid of any previous token (token factory takes care of
+     * any deallocation when this token is finally used up.
+     */
+    state->set_token_present( false );
+    state->set_error( false );	    /* Start out without an exception	*/
+    state->set_failedflag(false);
+
+    /* Record the start of the token in our input stream.
+     */
+    state->set_tokenStartCharIndex( lexer->index();
+    state->set_tokenStartCharPositionInLine( lexer->getCharPositionInLine() );
+    state->set_tokenStartLine( lexer->getLine() );
+    state->set_text("");
+
+    /* Now call the matching rules and see if we can generate a new token
+     */
+    for	(;;)
+    {
+		if (lexer->LA(1) == ANTLR_CHARSTREAM_EOF)
+		{
+			/* Reached the end of the stream, nothing more to do.
+			 */
+			CommonTokenType&    teof = m_eofToken;
+
+			teof.set_startIndex(lexer->getCharIndex());
+			teof.set_stopIndex(lexer->getCharIndex());
+			teof.setLine(lexer->getLine());
+			return  &teof;
+		}
+
+		state->set_token_present(false);
+		state->set_error(false);	    /* Start out without an exception	*/
+
+		{
+			ANTLR_MARKER   m;
+
+			m	= this->get_istream()->mark();
+			state->set_backtracking(1);				/* No exceptions */
+			state->set_failedflag(false);
+
+			/* Call the generated lexer, see if it can get a new token together.
+			 */
+			lexer->mTokens();
+    			state->set_backtracking(0);
+
+    		<! mTokens backtracks with synpred at BACKTRACKING==2
+				and we set the synpredgate to allow actions at level 1. !>
+
+			if(state->get_failed())
+			{
+				lexer->rewind(m);
+				lexer->consume(); <! advance one char and try again !>
+			}
+			else
+			{
+				lexer->emit();					/* Assemble the token and emit it to the stream */
+				TokenType& tok = state->get_token();
+				return &tok;
+			}
+		}
+    }
+}
+>>
+
+actionGate() ::= "this->get_backtracking()==0"
+
+filteringActionGate() ::= "this->get_backtracking()==1"
+
+/** How to generate a parser */
+genericParser(  grammar, name, scopes, tokens, tokenNames, rules, numRules,
+                bitsets, inputStreamType, superClass,
+                labelType, members,	rewriteElementType,
+                filterMode, ASTLabelType="ImplTraits::TreeType*") ::= <<
+
+using namespace antlr3;
+<if(grammar.grammarIsRoot)>
+/** \brief Table of all token names in symbolic order, mainly used for
+ *         error reporting.
+ */
+ANTLR_UINT8* <name>TokenNames[<length(tokenNames)>+4]
+     = {
+        (ANTLR_UINT8*) "\<invalid>",       /* String to print to indicate an invalid token */
+        (ANTLR_UINT8*) "\<EOR>",
+        (ANTLR_UINT8*) "\<DOWN>",
+        (ANTLR_UINT8*) "\<UP>",
+        <tokenNames:{it |(ANTLR_UINT8*) <it>}; separator=",\n">
+       };
+<endif>
+
+    <@members>
+
+    <@end>
+
+/** \brief Name of the grammar file that generated this code
+ */
+static const char fileName[] = "<fileName>";
+
+/** \brief Return the name of the grammar file that generated this code.
+ */
+const char* <name>::getGrammarFileName()
+{
+	return fileName;
+}
+/** \brief Create a new <name> parser and return a context for it.
+ *
+ * \param[in] instream Pointer to an input stream interface.
+ *
+ * \return Pointer to new parser context upon success.
+ */
+<name>::<name>( StreamType* instream<grammar.delegators:{g|, <g.recognizerName>* <g:delegateName()>}>)
+<constructorInitializerType("NULL")>
+{
+	// See if we can create a new parser with the standard constructor
+	//
+	this->init(instream<grammar.delegators:{g|, <g:delegateName()>}>);
+}
+
+/** \brief Create a new <name> parser and return a context for it.
+ *
+ * \param[in] instream Pointer to an input stream interface.
+ *
+ * \return Pointer to new parser context upon success.
+ */
+<name>::<name>( StreamType* instream, RecognizerSharedStateType* state<grammar.delegators:{g|, <g.recognizerName>* <g:delegateName()>}>)
+<constructorInitializerType("state")>
+{
+	this->init(instream <grammar.delegators:{g|, <g:delegateName()>}>);
+}
+
+void <name>::init(StreamType* instream<grammar.delegators:{g|, <g.recognizerName>* <g:delegateName()>}>)
+{
+    <actions.parser.apifuncs>
+<if(memoize)>
+<if(grammar.grammarIsRoot)>
+    /* Create a LIST for recording rule memos.
+     */
+     typedef RecognizerSharedStateType::RuleMemoType RuleMemoType;
+     this->setRuleMemo( new RuleMemoType(15) );	/* 16 bit depth is enough for 32768 rules! */<\n>
+<endif>
+<endif>
+<if(grammar.directDelegates)>
+	// Initialize the lexers that we are going to delegate some
+	// functions to.
+	//
+	<grammar.directDelegates:
+	      	{g|m_<g:delegateName()> = new <g.recognizerName>(instream, this->get_psrstate(), this<grammar.delegators:{g|, <g:delegateName()>}>);}; separator="\n">
+	<endif>
+        <if(grammar.delegators)>
+     	// Install the pointers back to lexers that will delegate us to perform certain functions
+     	// for them.
+     	//
+     		<grammar.delegators: {g| m_<g:delegateName()> = <g:delegateName()>;}; separator="\n">
+	<endif>
+	/* Install the token table
+	*/
+	this->get_psrstate()->set_tokenNames( <grammar.composite.rootGrammar.recognizerName>TokenNames );
+
+	<@debugStuff()>
+
+}
+
+void
+<name>::reset()
+{
+    this->get_rec()->reset();
+}
+
+/** Free the parser resources
+ */
+<name>::~<name>()
+ {
+    <@cleanup>
+    <@end>
+<if(grammar.directDelegates)>
+	// Free the parsers that we delegated to
+	// functions to.NULL the state so we only free it once.
+	//
+	<grammar.directDelegates:
+         {g| m_<g:delegateName()>->set_psrstate( NULL );
+         delete m_<g:delegateName()>;}; separator="\n">
+<endif>
+<if(memoize)>
+<if(grammar.grammarIsRoot)>
+	if(this->getRuleMemo() != NULL)
+	{
+		delete this->getRuleMemo();
+		this->setRuleMemo(NULL);
+	}
+<endif>
+<endif>
+}
+
+/** Return token names used by this <grammarType()>
+ *
+ * The returned pointer is used as an index into the token names table (using the token
+ * number as the index).
+ *
+ * \return Pointer to first char * in the table.
+ */
+static ANTLR_UINT8**	getTokenNames()
+{
+        return <grammar.composite.rootGrammar.recognizerName>TokenNames;
+}
+
+    <members>
+
+/* Declare the bitsets
+ */
+<bitsets:{it | <bitsetDeclare(bitsetname={FOLLOW_<it.name>_in_<it.inName><it.tokenIndex>},
+                    words64=it.bits, traits={<name>ImplTraits} )>}>
+
+
+<if(cyclicDFAs)>
+
+/* =========================================================================
+ * DFA tables for the parser
+ */
+<cyclicDFAs:cyclicDFA()> <! dump tables for all DFA !>
+/* =========================================================================
+ * End of DFA tables for the parser
+ */
+<endif>
+
+/* ==============================================
+ * Parsing rules
+ */
+<rules; separator="\n\n">
+<if(grammar.delegatedRules)>
+	// Delegated methods that appear to be a part of this
+	// parser
+	//
+<grammar.delegatedRules:{ruleDescriptor|
+    <returnType()> <name>::<ruleDescriptor.name>(<ruleDescriptor.parameterScope:parameterScope()>)
+    {
+        <if(ruleDescriptor.hasReturnValue)>return <endif>m_<ruleDescriptor.grammar:delegateName()>-><ruleDescriptor.name>(<if(ruleDescriptor.parameterScope)><ruleDescriptor.parameterScope.attributes:{a|<a.name>}; separator=", "><endif>);
+    \}}; separator="\n">
+
+<endif>
+/* End of parsing rules
+ * ==============================================
+ */
+
+/* ==============================================
+ * Syntactic predicates
+ */
+<synpreds:{p | <synpred(predname=p)>}>
+/* End of syntactic predicates
+ * ==============================================
+ */
+
+>>
+
+constructorInitializerType(rec_state) ::=<<
+<if(PARSER)>
+    :ImplTraits::BaseParserType(ANTLR_SIZE_HINT, instream, <rec_state>)
+<endif>
+<if(TREE_PARSER)>
+    :ImplTraits::BaseTreeParserType(ANTLR_SIZE_HINT, instream, <rec_state>)
+<endif>
+>>
+
+parser(	grammar,
+		name,
+		scopes,
+		tokens,
+		tokenNames,
+		rules,
+		numRules,
+		bitsets,
+		ASTLabelType,
+		superClass="Parser",
+		labelType="ImplTraits::CommonTokenType*",
+		members={<actions.parser.members>}
+		) ::= <<
+<beginNamespace(actions)>
+<genericParser(inputStreamType="CommonTokenStreamType*", rewriteElementType="Token", filterMode=false, ...)>
+<endNamespace(actions)>
+>>
+
+/** How to generate a tree parser; same as parser except the input
+ *  stream is a different type.
+ */
+treeParser(	grammar,
+			name,
+			scopes,
+			tokens,
+			tokenNames,
+			globalAction,
+			rules,
+			numRules,
+			bitsets,
+			filterMode,
+			labelType={<ASTLabelType>},
+			ASTLabelType="ImplTraits::TreeType*",
+			superClass="TreeParser",
+			members={<actions.treeparser.members>}
+			) ::= <<
+<beginNamespace(actions)>
+<genericParser(inputStreamType="CommonTreeNodeStream*", rewriteElementType="Node", ...)>
+<endNamespace(actions)>
+>>
+
+/** A simpler version of a rule template that is specific to the imaginary
+ *  rules created for syntactic predicates.  As they never have return values
+ *  nor parameters etc..., just give simplest possible method.  Don't do
+ *  any of the normal memoization stuff in here either; it's a waste.
+ *  As predicates cannot be inlined into the invoking rule, they need to
+ *  be in a rule by themselves.
+ */
+synpredRule(ruleName, ruleDescriptor, block, description, nakedBlock) ::=
+<<
+// $ANTLR start <ruleName>
+void <name>::m<ruleName>_fragment( <ruleDescriptor.parameterScope:parameterScope()> )
+{
+	<ruleLabelDefs()>
+	<ruleLabelInitializations()>
+<if(trace)>
+    ANTLR_PRINTF("enter <ruleName> %d failed = %d, backtracking = %d\\n", this->LT(1),failed,this->get_backtracking() );
+    <block>
+    ANTLR_PRINTF("exit <ruleName> %d, failed = %d, backtracking = %d\\n", this->LT(1),failed,this->get_backtracking());
+
+<else>
+    <block>
+<endif>
+
+goto rule<ruleDescriptor.name>Ex; /* Prevent compiler warnings */
+rule<ruleDescriptor.name>Ex: ;
+}
+// $ANTLR end <ruleName>
+>>
+
+synpred(predname) ::= <<
+
+bool <name>::msynpred( antlr3::ClassForwarder\< <predname> >  )
+{
+    ANTLR_MARKER   start;
+    bool  success;
+    
+    this->inc_backtracking();
+    <@start()>
+    start	= this->mark();
+    this->m<predname>_fragment();	    // can never throw exception
+    success	= !( this->get_failedflag() );
+    this->rewind(start);
+    <@stop()>
+    this->dec_backtracking();
+    this->set_failedflag(false);
+    return success;
+}<\n>
+>>
+
+lexerSynpred(predname) ::= <<
+<synpred(predname)>
+>>
+
+ruleMemoization(rname) ::= <<
+<if(memoize)>
+if ( (this->get_backtracking()>0) && (this->haveParsedRule(<ruleDescriptor.index>)) )
+{
+<if(ruleDescriptor.hasMultipleReturnValues)>
+<if(!ruleDescriptor.isSynPred)>
+	retval.start = 0;<\n>
+<endif>
+<endif>
+    <(ruleDescriptor.actions.after):execAfter()>
+    <finalCode(finalBlock=finally)>
+<if(!ruleDescriptor.isSynPred)>
+    <scopeClean()><\n>
+<endif>
+    return <ruleReturnValue()>;
+}
+<endif>
+>>
+
+/** How to test for failure and return from rule */
+checkRuleBacktrackFailure() ::= <<
+if  (this->hasException())
+{
+    goto rule<ruleDescriptor.name>Ex;
+}
+<if(backtracking)>
+if (this->hasFailed())
+{
+    <scopeClean()>
+    <@debugClean()>
+    return <ruleReturnValue()>;
+}
+<endif>
+>>
+
+/** This rule has failed, exit indicating failure during backtrack */
+ruleBacktrackFailure() ::= <<
+<if(backtracking)>
+if (this->get_backtracking()>0)
+{
+    this->set_failedflag( true );
+    <scopeClean()>
+    return <ruleReturnValue()>;
+}
+<endif>
+>>
+
+/** How to generate code for a rule.  This includes any return type
+ *  data aggregates required for multiple return values.
+ */
+rule(ruleName,ruleDescriptor,block,emptyRule,description,exceptions,finally,memoize) ::= <<
+/**
+ * $ANTLR start <ruleName>
+ * <fileName>:<description>
+ */
+<returnType()>
+<name>::<ruleName>(<ruleDescriptor.parameterScope:parameterScope()>)
+{
+    <if(trace)>ANTLR_PRINTF("enter <ruleName> %s failed=%d, backtracking=%d\n", this->LT(1), this->get_backtracking() );<endif>
+    <ruleDeclarations()>
+    <ruleDescriptor.actions.declarations>
+    <ruleLabelDefs()>
+    <ruleInitializations()>
+    <ruleDescriptor.actions.init>
+    <ruleMemoization(rname=ruleName)>
+    <ruleLabelInitializations()>
+    
+    <if(actions.(actionScope).rulecatch)>
+    	try {
+    <else> 
+    <if(exceptions)>
+        try {
+    <endif>
+    <endif>
+    <@preamble()>
+    {
+        <block>
+    }
+    <ruleCleanUp()>
+   
+<if(exceptions)>
+    <(ruleDescriptor.actions.after):execAfter()>
+    <exceptions:{e|<catch(decl=e.decl,action=e.action)><\n>}>
+<else>
+    <if(!emptyRule)>
+    	if (this->hasException())
+        {
+            this->preporterror();
+            this->precover();
+            <@setErrorReturnValue()>
+        }
+        <if(ruleDescriptor.actions.after)>
+        else
+        {
+            <(ruleDescriptor.actions.after):execAfter()>
+        }<\n>
+        <endif>
+	<if(actions.(actionScope).rulecatch)>
+	    } <actions.(actionScope).rulecatch>
+        <endif>
+    <endif>
+<endif>
+
+    <if(trace)>ANTLR_PRINTF("exit <ruleName> %d failed=%s backtracking=%s\n", this->LT(1), failed, this->get_backtracking() );<endif>
+    <memoize()>
+<if(finally)>
+    <finalCode(finalBlock=finally)>
+<endif>
+    <scopeClean()>
+    <@postamble()>
+    return <ruleReturnValue()>;
+}
+/* $ANTLR end <ruleName> */
+>>
+
+finalCode(finalBlock) ::= <<
+{
+    <finalBlock>
+}
+
+>>
+
+catch(decl,action) ::= <<
+/* catch(decl,action)
+ */
+}catch (<e.decl>) {
+   <e.action>
+}
+>>
+
+ruleDeclarations() ::= <<
+
+<if(ruleDescriptor.hasMultipleReturnValues)>
+<returnType()> retval(this);<\n>
+<else>
+<if(PARSER)>
+    <name>ImplTraits::RuleReturnValueType _antlr_rule_exit(this);
+<endif>  
+<if(ruleDescriptor.returnScope)>
+<ruleDescriptor.returnScope.attributes:{ a |
+<a.type> <a.name>;
+}>
+<endif>
+<endif>
+<if(memoize)>
+ANTLR_MARKER <ruleDescriptor.name>_StartIndex;
+<endif>
+>>
+
+ruleInitializations() ::= <<
+/* Initialize rule variables
+ */
+<if(ruleDescriptor.returnScope)>
+<if(ruleDescriptor.hasMultipleReturnValues)>
+<ruleDescriptor.returnScope.attributes:{ a | <if(a.initValue)>retval.<a.name> = <a.initValue>;<endif> }>
+<else>
+<ruleDescriptor.returnScope.attributes:{ a | <if(a.initValue)><a.name> = <a.initValue>;<endif> }>
+<endif>
+<endif>
+<if(memoize)>
+<ruleDescriptor.name>_StartIndex = this->index();<\n>
+<endif>
+<ruleDescriptor.useScopes:{it | m_<it>_stack.push(<it>Scope()); }; separator="\n">
+<ruleDescriptor.ruleScope:{it | m_<it.name>_stack.push(<it.name>Scope()); }; separator="\n">
+>>
+
+ruleLabelDefs() ::= <<
+<[ruleDescriptor.tokenLabels,ruleDescriptor.tokenListLabels,
+  ruleDescriptor.wildcardTreeLabels,ruleDescriptor.wildcardTreeListLabels]
+    :{it |<labelType> <it.label.text> = NULL;}; separator="\n"
+>
+<[ruleDescriptor.tokenListLabels,ruleDescriptor.ruleListLabels,ruleDescriptor.wildcardTreeListLabels]
+    :{it |ImplTraits::TokenPtrsListType list_<it.label.text>;}; separator="\n"
+>
+<ruleDescriptor.ruleLabels:ruleLabelDef(); separator="\n">
+>>
+
+ruleLabelInitializations() ::= <<
+<if(ruleDescriptor.hasMultipleReturnValues)>
+<if(!ruleDescriptor.isSynPred)>
+retval.call_start_placeholder();
+<endif>
+<endif>
+>>
+
+lexerRuleLabelDefs() ::= <<
+<[ruleDescriptor.tokenLabels,
+  ruleDescriptor.tokenListLabels,
+  ruleDescriptor.ruleLabels]
+    :{it |<labelType> <it.label.text> = NULL;}; separator="\n"
+>
+<ruleDescriptor.charLabels:{it |ANTLR_UINT32 <it.label.text>;}; separator="\n">
+<[ruleDescriptor.tokenListLabels,
+  ruleDescriptor.ruleListLabels,
+  ruleDescriptor.ruleListLabels]
+    :{it | ImplTraits::IntTrieType<CommonTokenType>* list_<it.label.text>;}; separator="\n"
+>
+>>
+
+lexerRuleLabelInit() ::= <<
+<[ruleDescriptor.tokenListLabels,
+  ruleDescriptor.ruleListLabels,
+  ruleDescriptor.ruleListLabels]
+    :{it |list_<it.label.text> = new ImplTraits::IntTrieType<CommonTokenType>(31);}; separator="\n"
+>
+>>
+
+lexerRuleLabelFree() ::= <<
+<[ruleDescriptor.tokenLabels,
+  ruleDescriptor.tokenListLabels,
+  ruleDescriptor.ruleLabels]
+    :{it |<it.label.text> = NULL;}; separator="\n"
+>
+<[ruleDescriptor.tokenListLabels,
+  ruleDescriptor.ruleListLabels,
+  ruleDescriptor.ruleListLabels]
+    :{it | delete list_<it.label.text>;}; separator="\n"
+>
+>>
+
+ruleReturnValue() ::= <%
+<if(!ruleDescriptor.isSynPred)>
+<if(ruleDescriptor.hasReturnValue)>
+<if(ruleDescriptor.hasSingleReturnValue)>
+<ruleDescriptor.singleValueReturnName>
+<else>
+retval
+<endif>
+<endif>
+<endif>
+%>
+
+memoize() ::= <<
+<if(memoize)>
+<if(backtracking)>
+if ( this->get_backtracking() > 0 ) { this->memoize(<ruleDescriptor.index>, <ruleDescriptor.name>_StartIndex); }
+<endif>
+<endif>
+>>
+
+ruleCleanUp() ::= <<
+
+// This is where rules clean up and exit
+//
+goto rule<ruleDescriptor.name>Ex; /* Prevent compiler warnings */
+rule<ruleDescriptor.name>Ex: ;
+<if(ruleDescriptor.hasMultipleReturnValues)>
+<if(!TREE_PARSER)>
+<if(!ruleDescriptor.isSynPred)>
+retval.call_stop_placeholder();<\n>
+<endif>
+<endif>
+<endif>
+>>
+
+scopeClean() ::= <<
+<ruleDescriptor.useScopes:{it | m_<it>_stack.pop(); }; separator="\n">
+<ruleDescriptor.ruleScope:{it | m_<it.name>_stack.pop(); }; separator="\n">
+
+>>
+/** How to generate a rule in the lexer; naked blocks are used for
+ *  fragment rules, which do not produce tokens.
+ */
+lexerRule(ruleName,nakedBlock,ruleDescriptor,block,memoize) ::= <<
+//   Comes from: <block.description>
+/** \brief Lexer rule generated by ANTLR3
+ *
+ * $ANTLR start <ruleName>
+ *
+ * Looks to match the characters the constitute the token <ruleName>
+ * from the attached input stream.
+ *
+ *
+ * \remark
+ *  - lexer->error == true if an exception was thrown.
+ */
+void <name>::m<ruleName>(<ruleDescriptor.parameterScope:parameterScope()>)
+{
+    ANTLR_UINT32	_type;
+    <ruleDeclarations()>
+    <ruleDescriptor.actions.declarations>
+    <lexerRuleLabelDefs()>
+    <if(trace)>
+    std::cout \<\< "enter <ruleName> '" \<\< (char)this->LA(1)
+              \<\< "' line=" \<\< this->getLine() \<\< ":" \<\< this->getCharPositionInLine()
+              \<\< " failed=" \<\< this->get_failedflag() \<\< " backtracking=" \<\< this->get_backtracking() \<\< std::endl;
+    <endif>
+
+<if(nakedBlock)>
+    <ruleMemoization(rname=ruleName)>
+    <lexerRuleLabelInit()>
+    <ruleDescriptor.actions.init>
+
+    <block><\n>
+<else>
+    <ruleMemoization(rname=ruleName)>
+    <lexerRuleLabelInit()>
+    _type	    = <ruleName>;
+
+    <ruleDescriptor.actions.init>
+
+    <block>
+	this->get_lexstate()->set_type(_type);
+<endif>
+    <if(trace)>
+    std::cout \<\< "exit <ruleName> '" \<\< (char)this->LA(1)
+              \<\< "' line=" \<\< this->getLine() \<\< ":" \<\< this->getCharPositionInLine()
+              \<\< " failed=" \<\< this->get_failedflag() \<\< " backtracking=" \<\< this->get_backtracking() \<\< std::endl;
+    <endif>
+    <ruleCleanUp()>
+    <lexerRuleLabelFree()>
+    <(ruleDescriptor.actions.after):execAfter()>
+    <memoize>
+}
+// $ANTLR end <ruleName>
+>>
+
+/** How to generate code for the implicitly-defined lexer grammar rule
+ *  that chooses between lexer rules.
+ */
+tokensRule(ruleName,nakedBlock,args,block,ruleDescriptor) ::= <<
+/** This is the entry point in to the lexer from an object that
+ *  wants to generate the next token, such as a pCOMMON_TOKEN_STREAM
+ */
+void
+<name>::mTokens()
+{
+    <block><\n>
+
+    goto ruleTokensEx; /* Prevent compiler warnings */
+ruleTokensEx: ;
+}
+>>
+
+// S U B R U L E S
+
+/** A (...) subrule with multiple alternatives */
+block(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,maxK,maxAlt,description) ::= <<
+
+// <fileName>:<description>
+{
+    int alt<decisionNumber>=<maxAlt>;
+    <decls>
+    <@predecision()>
+    <decision>
+    <@postdecision()>
+    <@prebranch()>
+    switch (alt<decisionNumber>)
+    {
+	<alts:{a | <altSwitchCase(i,a)>}>
+    }
+    <@postbranch()>
+}
+>>
+
+/** A rule block with multiple alternatives */
+ruleBlock(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,maxK,maxAlt,description) ::= <<
+{
+    //  <fileName>:<description>
+
+    ANTLR_UINT32 alt<decisionNumber>;
+
+    alt<decisionNumber>=<maxAlt>;
+
+    <decls>
+    <@predecision()>
+    <decision>
+    <@postdecision()>
+    switch (alt<decisionNumber>)
+    {
+	<alts:{a | <altSwitchCase(i,a)>}>
+    }
+}
+>>
+
+ruleBlockSingleAlt(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,description) ::= <<
+// <fileName>:<description>
+<decls>
+<@prealt()>
+<alts>
+<@postalt()>
+>>
+
+/** A special case of a (...) subrule with a single alternative */
+blockSingleAlt(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,description) ::= <<
+// <fileName>:<description>
+<decls>
+<@prealt()>
+<alts>
+<@postalt()>
+>>
+
+/** A (..)+ block with 1 or more alternatives */
+positiveClosureBlock(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,maxK,maxAlt,description) ::= <<
+// <fileName>:<description>
+{
+    int cnt<decisionNumber>=0;
+    <decls>
+    <@preloop()>
+
+    for (;;)
+    {
+        int alt<decisionNumber>=<maxAlt>;
+	<@predecision()>
+	<decision>
+	<@postdecision()>
+	switch (alt<decisionNumber>)
+	{
+	    <alts:{a | <altSwitchCase(i,a)>}>
+	    default:
+
+		if ( cnt<decisionNumber> >= 1 )
+		{
+		    goto loop<decisionNumber>;
+		}
+		<ruleBacktrackFailure()>
+		<earlyExitEx()>
+		<@earlyExitException()>
+		goto rule<ruleDescriptor.name>Ex;
+	}
+	cnt<decisionNumber>++;
+    }
+    loop<decisionNumber>: ;	/* Jump to here if this rule does not match */
+    <@postloop()>
+}
+>>
+
+earlyExitEx() ::= <<
+/* mismatchedSetEx()
+ */
+new ANTLR_Exception\< <name>ImplTraits, EARLY_EXIT_EXCEPTION, StreamType>( this->get_rec(), "" );
+<\n>
+>>
+positiveClosureBlockSingleAlt ::= positiveClosureBlock
+
+/** A (..)* block with 1 or more alternatives */
+closureBlock(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,maxK,maxAlt,description) ::= <<
+
+// <fileName>:<description>
+<decls>
+
+<@preloop()>
+for (;;)
+{
+    int alt<decisionNumber>=<maxAlt>;
+    <@predecision()>
+    <decision>
+    <@postdecision()>
+    switch (alt<decisionNumber>)
+    {
+	<alts:{a | <altSwitchCase(i,a)>}>
+	default:
+	    goto loop<decisionNumber>;	/* break out of the loop */
+	    break;
+    }
+}
+loop<decisionNumber>: ; /* Jump out to here if this rule does not match */
+<@postloop()>
+>>
+
+closureBlockSingleAlt ::= closureBlock
+
+/** Optional blocks (x)? are translated to (x|) by antlr before code generation
+ *  so we can just use the normal block template
+ */
+optionalBlock ::= block
+
+optionalBlockSingleAlt ::= block
+
+/** A case in a switch that jumps to an alternative given the alternative
+ *  number.  A DFA predicts the alternative and then a simple switch
+ *  does the jump to the code that actually matches that alternative.
+ */
+altSwitchCase(altNum,alt) ::= <<
+case <altNum>:
+    <@prealt()>
+    <alt>
+    break;<\n>
+>>
+
+/** An alternative is just a list of elements; at outermost level */
+alt(elements,altNum,description,autoAST,outerAlt,treeLevel,rew) ::= <<
+// <fileName>:<description>
+{
+    <@declarations()>
+    <@initializations()>
+    <elements:element()>
+    <rew>
+    <@cleanup()>
+}
+>>
+
+// E L E M E N T S
+/** What to emit when there is no rewrite.  For auto build
+ *  mode, does nothing.
+ */
+noRewrite(rewriteBlockLevel, treeLevel) ::= ""
+
+/** Dump the elements one per line */
+element(e) ::= <<
+<@prematch()>
+<e.el><\n>
+>>
+
+/** match a token optionally with a label in front */
+tokenRef(token,label,elementIndex,terminalOptions) ::= <<
+<if(label)><label> = <endif> this->matchToken(<token>, &FOLLOW_<token>_in_<ruleName><elementIndex>);
+<checkRuleBacktrackFailure()>
+>>
+
+/** ids+=ID */
+tokenRefAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
+<tokenRef(...)>
+<listLabel(elem=label,...)>
+>>
+
+listLabel(label,elem) ::= <<
+ list_<label>.push_back(<elem>);
+>>
+
+
+/** match a character */
+charRef(char,label) ::= <<
+<if(label)>
+<label> = this->LA(1);<\n>
+<endif>
+ this->matchc(<char>);
+<checkRuleBacktrackFailure()>
+>>
+
+/** match a character range */
+charRangeRef(a,b,label) ::= <<
+<if(label)>
+<label> = this->LA(1);<\n>
+<endif>
+this->matchRange(<a>, <b>);
+<checkRuleBacktrackFailure()>
+>>
+
+/** For now, sets are interval tests and must be tested inline */
+matchSet(s,label,elementIndex,terminalOptions,postmatchCode="") ::= <<
+<if(label)>
+<if(LEXER)>
+<label>= this->LA(1);<\n>
+<else>
+<label>=(<labelType>) this->LT(1);<\n>
+<endif>
+<endif>
+if ( <s> )
+{
+    this->consume();
+    <postmatchCode>
+<if(!LEXER)>
+    this->set_perror_recovery(false);
+<endif>
+    <if(backtracking)> this->set_failedflag(false); <\n><endif>
+}
+else
+{
+    <ruleBacktrackFailure()>
+    <mismatchedSetEx()>
+    <@mismatchedSetException()>
+<if(LEXER)>
+    this->recover();
+<else>
+<! use following code to make it recover inline;
+    this->recoverFromMismatchedSet(&FOLLOW_set_in_<ruleName><elementIndex>);
+!>
+<endif>
+    goto rule<ruleDescriptor.name>Ex;
+}<\n>
+>>
+
+mismatchedSetEx() ::= <<
+new ANTLR_Exception\< <name>ImplTraits, MISMATCHED_SET_EXCEPTION, StreamType>( this->get_rec(), "" );
+<if(PARSER)>
+this->get_exception()->set_expectingSet(NULL);
+<! use following code to make it recover inline;
+this->get_exception()->set_expectingSet( &FOLLOW_set_in_<ruleName><elementIndex> );
+!>
+<endif>
+>>
+
+matchRuleBlockSet ::= matchSet
+
+matchSetAndListLabel(s,label,elementIndex,postmatchCode) ::= <<
+<matchSet(...)>
+<listLabel(elem=label,...)>
+>>
+
+/** Match a string literal */
+lexerStringRef(string,label,elementIndex) ::= <<
+<if(label)>
+ANTLR_MARKER <label>Start = this->getCharIndex();
+ANTLR_UINT32 <label>StartLine<elementIndex> = this->getLine();
+ANTLR_UINT32 <label>StartCharPos<elementIndex> = this->getCharPositionInLine();
+this->matchs(<string>);
+<checkRuleBacktrackFailure()>
+<label> = new CommonTokenType;
+<label>->set_type( CommonTokenType::TOKEN_INVALID );
+<label>->set_startIndex( <label>Start);
+<label>->set_stopIndex( this->getCharIndex()-1);
+<label>->set_input( this->get_input() );
+<label>->set_line( <label>StartLine<elementIndex> );
+<label>->set_charPositionInLine( <label>StartCharPos<elementIndex> );
+<else>
+this->matchs(<string>);
+<checkRuleBacktrackFailure()><\n>
+<endif>
+>>
+
+wildcard(token,label,elementIndex,terminalOptions) ::= <<
+<if(label)>
+<label>=(<labelType>)this->LT(1);<\n>
+<endif>
+this->matchAnyToken();
+<checkRuleBacktrackFailure()>
+>>
+
+wildcardAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
+<wildcard(...)>
+<listLabel(elem=label,...)>
+>>
+
+/** Match . wildcard in lexer */
+wildcardChar(label, elementIndex) ::= <<
+<if(label)>
+<label> = this->LA(1);<\n>
+<endif>
+this->matchAny();
+<checkRuleBacktrackFailure()>
+>>
+
+wildcardCharListLabel(label, elementIndex) ::= <<
+<wildcardChar(...)>
+<listLabel(elem=label,...)>
+>>
+
+/** Match a rule reference by invoking it possibly with arguments
+ *  and a return value or values. The 'rule' argument was the
+ *  target rule name, but now is type Rule, whose toString is
+ *  same: the rule name.  Now though you can access full rule
+ *  descriptor stuff.
+ */
+ruleRef(rule,label,elementIndex,args,scope) ::= <<
+this->followPush(FOLLOW_<rule.name>_in_<ruleName><elementIndex>);
+<if(label)><label>=<endif><if(scope)>m_<scope:delegateName()>-><endif><rule.name>(<if(args)><args; separator=", "><endif>);<\n>
+this->followPop();
+<checkRuleBacktrackFailure()>
+>>
+
+/** ids+=r */
+ruleRefAndListLabel(rule,label,elementIndex,args,scope) ::= <<
+<ruleRef(...)>
+<listLabel(elem=label,...)>
+>>
+
+/** A lexer rule reference
+ *  The 'rule' argument was the target rule name, but now
+ *  is type Rule, whose toString is same: the rule name.
+ *  Now though you can access full rule descriptor stuff.
+ */
+lexerRuleRef(rule,label,args,elementIndex,scope) ::= <<
+/* <description> */
+<if(label)>
+{
+    ANTLR_MARKER <label>Start<elementIndex> = this->getCharIndex();
+    ANTLR_UINT32 <label>StartLine<elementIndex> = this->getLine();
+    ANTLR_UINT32 <label>StartCharPos<elementIndex> = this->getCharPositionInLine();
+    <if(scope)>m_<scope:delegateName()>-><endif>m<rule.name>(<if(scope)>m_<scope:delegateName()><endif> <if(args)>, <endif><args; separator=", ">);
+    <checkRuleBacktrackFailure()>
+    <label> = new CommonTokenType();
+    <label>->set_type( CommonTokenType::TOKEN_INVALID);
+    <label>->set_startIndex( <label>Start<elementIndex> );
+    <label>->set_stopIndex( this->getCharIndex()-1 );
+    <label>->set_input( this->get_input() );
+    <label>->set_line( <label>StartLine<elementIndex> );
+    <label>->set_charPositionInLine( <label>StartCharPos<elementIndex> );
+}
+<else>
+<if(scope)>m_<scope:delegateName()>-><endif>m<rule.name>(<args; separator=", ">);
+<checkRuleBacktrackFailure()>
+<endif>
+>>
+
+/** i+=INT in lexer */
+lexerRuleRefAndListLabel(rule,label,args,elementIndex,scope) ::= <<
+<lexerRuleRef(...)>
+<listLabel(elem=label,...)>
+>>
+
+/** EOF in the lexer */
+lexerMatchEOF(label,elementIndex) ::= <<
+<if(label)>
+{
+    ANTLR_UINT32 <label>Start<elementIndex>;
+    ANTLR_UINT32 <label>StartLine<elementIndex> = this->getLine();
+    ANTLR_UINT32 <label>StartCharPos<elementIndex> = this->getCharPositionInLine();
+    <labelType> <label>;
+    <label>Start<elementIndex> = this->getCharIndex();
+    this->matchc(ANTLR_CHARSTREAM_EOF);
+    <checkRuleBacktrackFailure()>
+    <label> = new CommonTokenType();
+    <label>->set_type( CommonTokenType::TOKEN_EOF );
+    <label>->set_startIndex(<label>Start<elementIndex>);
+    <label>->set_stopIndex(this->getCharIndex()-1);
+    <label>->set_input( this->get_input() );
+    <label>->set_line( <label>StartLine<elementIndex> );
+    <label>->set_charPositionInLine( <label>StartCharPos<elementIndex> );
+}
+<else>
+    this->matchc(ANTLR_CHARSTREAM_EOF);
+    <checkRuleBacktrackFailure()>
+    <endif>
+>>
+
+// used for left-recursive rules
+recRuleDefArg()                       ::= "int <recRuleArg()>"
+recRuleArg()                          ::= "_p"
+recRuleAltPredicate(ruleName,opPrec)  ::= "<recRuleArg()> \<= <opPrec>"
+recRuleSetResultAction()              ::= "root_0=$<ruleName>_primary.tree;"
+recRuleSetReturnAction(src,name)      ::= "$<name>=$<src>.<name>;"
+
+/** match ^(root children) in tree parser */
+tree(root, actionsAfterRoot, children, nullableChildList, enclosingTreeLevel, treeLevel) ::= <<
+<root:element()>
+<actionsAfterRoot:element()>
+<if(nullableChildList)>
+if ( this->LA(1)== CommonTokenType::TOKEN_DOWN ) {
+    this->matchToken(CommonTokenType::TOKEN_DOWN, NULL);
+    <checkRuleBacktrackFailure()>
+    <children:element()>
+    this->matchToken(CommonTokenType::TOKEN_UP, NULL);
+    <checkRuleBacktrackFailure()>
+}
+<else>
+this->matchToken(CommonTokenType::TOKEN_DOWN, NULL);
+<checkRuleBacktrackFailure()>
+<children:element()>
+this->matchToken(CommonTokenType::TOKEN_UP, NULL);
+<checkRuleBacktrackFailure()>
+<endif>
+>>
+
+/** Every predicate is used as a validating predicate (even when it is
+ *  also hoisted into a prediction expression).
+ */
+validateSemanticPredicate(pred,description) ::= <<
+if ( !(<evalPredicate(...)>) )
+{
+    <ruleBacktrackFailure()>
+    <newFPE(...)>
+}
+>>
+
+newFPE() ::= <<
+	ExceptionBaseType* ex = new ANTLR_Exception\< <name>ImplTraits, FAILED_PREDICATE_EXCEPTION, StreamType>( this->get_rec(), "<description>" );
+    ex->set_ruleName( "<ruleName>" );
+    <\n>
+>>
+
+// F i x e d  D F A  (if-then-else)
+
+dfaState(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
+
+{
+    int LA<decisionNumber>_<stateNumber> = this->LA(<k>);
+    <edges; separator="\nelse ">
+    else
+    {
+<if(eotPredictsAlt)>
+        alt<decisionNumber>=<eotPredictsAlt>;
+<else>
+        <ruleBacktrackFailure()>
+
+        <newNVException()>
+        goto rule<ruleDescriptor.name>Ex;
+
+<endif>
+    }
+}
+>>
+
+newNVException() ::= <<
+ExceptionBaseType* ex = new ANTLR_Exception\< <name>ImplTraits, NO_VIABLE_ALT_EXCEPTION, StreamType>( this->get_rec(), "<description>" );
+ex->set_decisionNum( <decisionNumber> );
+ex->set_state( <stateNumber> );
+<@noViableAltException()>
+<\n>
+>>
+
+/** Same as a normal DFA state except that we don't examine lookahead
+ *  for the bypass alternative.  It delays error detection but this
+ *  is faster, smaller, and more what people expect.  For (X)? people
+ *  expect "if ( LA(1)==X ) match(X);" and that's it.
+ */
+dfaOptionalBlockState(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
+{
+    int LA<decisionNumber>_<stateNumber> = this->LA(<k>);
+    <edges; separator="\nelse ">
+}
+>>
+
+/** A DFA state that is actually the loopback decision of a closure
+ *  loop.  If end-of-token (EOT) predicts any of the targets then it
+ *  should act like a default clause (i.e., no error can be generated).
+ *  This is used only in the lexer so that for ('a')* on the end of a rule
+ *  anything other than 'a' predicts exiting.
+ */
+
+dfaLoopbackStateDecls()::= <<
+ANTLR_UINT32   LA<decisionNumber>_<stateNumber>;
+>>
+dfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
+{
+   /* dfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState)
+    */
+    int LA<decisionNumber>_<stateNumber> = this->LA(<k>);
+    <edges; separator="\nelse "><\n>
+    <if(eotPredictsAlt)>
+    <if(!edges)>
+	alt<decisionNumber>=<eotPredictsAlt>; <! if no edges, don't gen ELSE !>
+	<else>
+    else
+    {
+	alt<decisionNumber>=<eotPredictsAlt>;
+    }<\n>
+    <endif>
+    <endif>
+}
+>>
+
+/** An accept state indicates a unique alternative has been predicted */
+dfaAcceptState(alt) ::= "alt<decisionNumber>=<alt>;"
+
+/** A simple edge with an expression.  If the expression is satisfied,
+ *  enter to the target state.  To handle gated productions, we may
+ *  have to evaluate some predicates for this edge.
+ */
+dfaEdge(labelExpr, targetState, predicates) ::= <<
+if ( (<labelExpr>)<if(predicates)> && (<predicates>)<endif>)
+{
+    <targetState>
+}
+>>
+
+// F i x e d  D F A  (switch case)
+
+/** A DFA state where a SWITCH may be generated.  The code generator
+ *  decides if this is possible: CodeGenerator.canGenerateSwitch().
+ */
+dfaStateSwitch(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
+switch ( this->LA(<k>) )
+{
+<edges; separator="\n">
+
+default:
+<if(eotPredictsAlt)>
+    alt<decisionNumber>=<eotPredictsAlt>;
+<else>
+    <ruleBacktrackFailure()>
+    <newNVException()>
+    goto rule<ruleDescriptor.name>Ex;<\n>
+<endif>
+}<\n>
+>>
+
+dfaOptionalBlockStateSwitch(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
+switch ( this->LA(<k>) )
+{
+    <edges; separator="\n">
+}<\n>
+>>
+
+dfaLoopbackStateSwitch(k, edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
+switch ( this->LA(<k>) )
+{
+<edges; separator="\n"><\n>
+<if(eotPredictsAlt)>
+default:
+    alt<decisionNumber>=<eotPredictsAlt>;
+    break;<\n>
+<endif>
+}<\n>
+>>
+
+dfaEdgeSwitch(labels, targetState) ::= <<
+<labels:{it |case <it>:}; separator="\n">
+	{
+		<targetState>
+	}
+    break;
+>>
+
+// C y c l i c  D F A
+
+/** The code to initiate execution of a cyclic DFA; this is used
+ *  in the rule to predict an alt just like the fixed DFA case.
+ *  The <name> attribute is inherited via the parser, lexer, ...
+ */
+dfaDecision(decisionNumber,description) ::= <<
+alt<decisionNumber> = cdfa<decisionNumber>.predict(this, this->get_rec(), this->get_istream(), cdfa<decisionNumber> );
+<checkRuleBacktrackFailure()>
+>>
+
+/* Dump DFA tables as static initialized arrays of shorts(16 bits)/characters(8 bits)
+ * which are then used to statically initialize the dfa structure, which means that there
+ * is no runtime initialization whatsoever, other than anything the C compiler might
+ * need to generate. In general the C compiler will lay out memory such that there is no
+ * runtime code required.
+ */
+cyclicDFA(dfa) ::= <<
+/** Static dfa state tables for Cyclic dfa:
+ *    <dfa.description>
+ */
+static const ANTLR_INT32 dfa<dfa.decisionNumber>_eot[<dfa.numberOfStates>] =
+    {
+	<dfa.eot; wrap="\n", separator=", ", null="-1">
+    };
+static const ANTLR_INT32 dfa<dfa.decisionNumber>_eof[<dfa.numberOfStates>] =
+    {
+	<dfa.eof; wrap="\n", separator=", ", null="-1">
+    };
+static const ANTLR_INT32 dfa<dfa.decisionNumber>_min[<dfa.numberOfStates>] =
+    {
+	<dfa.min; wrap="\n", separator=", ", null="-1">
+    };
+static const ANTLR_INT32 dfa<dfa.decisionNumber>_max[<dfa.numberOfStates>] =
+    {
+	<dfa.max; wrap="\n", separator=", ", null="-1">
+    };
+static const ANTLR_INT32 dfa<dfa.decisionNumber>_accept[<dfa.numberOfStates>] =
+    {
+	<dfa.accept; wrap="\n", separator=", ", null="-1">
+    };
+static const ANTLR_INT32 dfa<dfa.decisionNumber>_special[<dfa.numberOfStates>] =
+    {
+	<dfa.special; wrap="\n", separator=", ", null="-1">
+    };
+
+/** Used when there is no transition table entry for a particular state */
+static const ANTLR_INT32* dfa<dfa.decisionNumber>_T_empty	 =   NULL;
+
+<dfa.edgeTransitionClassMap.keys:{ table |
+static const ANTLR_INT32 dfa<dfa.decisionNumber>_T<i0>[] =
+    {
+	<table; separator=", ", wrap="\n", null="-1">
+    \};<\n>}; null = "">
+
+/* Transition tables are a table of sub tables, with some tables
+ * reused for efficiency.
+ */
+static const ANTLR_INT32 * const dfa<dfa.decisionNumber>_transitions[] =
+{
+    <dfa.transitionEdgeTables:{xref|dfa<dfa.decisionNumber>_T<xref>}; separator=", ", wrap="\n", null="NULL">
+};
+
+<@errorMethod()>
+
+/* Declare tracking structure for Cyclic DFA <dfa.decisionNumber>
+ */
+class <name>CyclicDFA<dfa.decisionNumber> : public CyclicDFA\< <name>ImplTraits, <name> >, public <name>Tokens
+{
+public:
+	typedef CyclicDFA\< <name>ImplTraits, <name> >  BaseType;
+	typedef BaseType::ContextType CtxType;
+	
+private:
+<if(dfa.specialStateSTs)>
+	//to maintain C-Target compatibility, we need to make some of ctx functions look like member funcs
+	CtxType*	m_ctx; 
+<endif>	
+
+public:
+	<name>CyclicDFA<dfa.decisionNumber>( ANTLR_INT32	decisionNumber
+					, const ANTLR_UCHAR*	description
+					, const ANTLR_INT32* const	eot
+					, const ANTLR_INT32* const	eof
+					, const ANTLR_INT32* const	min
+					, const ANTLR_INT32* const	max
+					, const ANTLR_INT32* const	accept
+					, const ANTLR_INT32* const	special
+					, const ANTLR_INT32* const *const	transition)
+					:BaseType( decisionNumber, description, eot, eof, min, max, accept,
+								special, transition )
+	{
+	<if(dfa.specialStateSTs)>
+		m_ctx = NULL;
+	<endif>		
+	}
+
+    <if(dfa.specialStateSTs)>
+    ANTLR_UINT32 LA(ANTLR_INT32 i)
+    {
+        return m_ctx->LA(i);
+    }
+
+    <if(PARSER)>
+    const CtxType::CommonTokenType*  LT(ANTLR_INT32 k)
+    {
+        return m_ctx->LT(k);
+    }
+    <endif>
+    <if(synpreds)>
+    template\<typename PredType>
+    bool msynpred( PredType pred )
+    {
+        return m_ctx->msynpred(pred);
+    }
+    <endif>
+        
+	ANTLR_INT32  specialStateTransition(CtxType * ctx, RecognizerType* recognizer, IntStreamType* is, ANTLR_INT32 s)
+	{
+	    ANTLR_INT32    _s;
+		
+	    m_ctx = ctx;
+	    _s	    = s;
+	    switch  (s)
+	    {
+	    <dfa.specialStateSTs:{state |
+	    case <i0>:
+
+		<state>}; separator="\n">
+	    }
+	<if(backtracking)>
+	    if ( ctx->get_backtracking() > 0)
+	    {
+		 ctx->set_failedflag( true );
+		return	-1;
+	    }
+	<endif>
+	    ExceptionBaseType* ex = new ANTLR_Exception\< <name>ImplTraits, NO_VIABLE_ALT_EXCEPTION, StreamType>( recognizer, "<dfa.description>" );
+	    ex->set_decisionNum( <dfa.decisionNumber> );
+	    ex->set_state(_s);
+	    <@noViableAltException()>
+	    return -1;
+	}
+	<endif>
+};
+ 
+static <name>CyclicDFA<dfa.decisionNumber>  cdfa<dfa.decisionNumber>(
+	    <dfa.decisionNumber>,		    /* Decision number of this dfa	    */
+	    /* Which decision this represents:   */
+	    (const ANTLR_UCHAR*)"<dfa.description>",
+	    dfa<dfa.decisionNumber>_eot,	    /* EOT table			    */
+	    dfa<dfa.decisionNumber>_eof,	    /* EOF table			    */
+	    dfa<dfa.decisionNumber>_min,	    /* Minimum tokens for each state    */
+	    dfa<dfa.decisionNumber>_max,	    /* Maximum tokens for each state    */
+	    dfa<dfa.decisionNumber>_accept,	/* Accept table			    */
+	    dfa<dfa.decisionNumber>_special,	/* Special transition states	    */
+	    dfa<dfa.decisionNumber>_transitions	/* Table of transition tables	    */
+
+	);
+
+
+/* End of Cyclic DFA <dfa.decisionNumber>
+ * ---------------------
+ */
+>>
+
+/** A state in a cyclic DFA; it's a special state and part of a big switch on
+ *  state.
+ */
+cyclicDFAState(decisionNumber,stateNumber,edges,needErrorClause,semPredState) ::= <<
+{
+    ANTLR_UINT32 LA<decisionNumber>_<stateNumber>;<\n>
+    ANTLR_MARKER index<decisionNumber>_<stateNumber>;<\n>
+
+    LA<decisionNumber>_<stateNumber> = ctx->LA(1);<\n>
+    <if(semPredState)> <! get next lookahead symbol to test edges, then rewind !>
+    index<decisionNumber>_<stateNumber> = ctx->index();<\n>
+    ctx->rewindLast();<\n>
+    <endif>
+    s = -1;
+    <edges; separator="\nelse ">
+	<if(semPredState)> <! return input cursor to state before we rewound !>
+	ctx->seek(index<decisionNumber>_<stateNumber>);<\n>
+	<endif>
+    if ( s>=0 )
+    {
+	return s;
+    }
+}
+break;
+>>
+
+/** Just like a fixed DFA edge, test the lookahead and indicate what
+ *  state to jump to next if successful.
+ */
+cyclicDFAEdge(labelExpr, targetStateNumber, edgeNumber, predicates) ::= <<
+if ( (<labelExpr>) <if(predicates)>&& (<predicates>)<endif> )
+{
+    s = <targetStateNumber>;
+}<\n>
+>>
+
+/** An edge pointing at end-of-token; essentially matches any char;
+ *  always jump to the target.
+ */
+eotDFAEdge(targetStateNumber,edgeNumber, predicates) ::= <<
+ s = <targetStateNumber>;<\n>
+>>
+
+
+// D F A  E X P R E S S I O N S
+
+andPredicates(left,right) ::= "( (<left>) && (<right>) )"
+
+orPredicates(operands) ::= "(<operands:{o|(<o>)}; separator=\"||\">)"
+
+notPredicate(pred) ::= "!( <evalPredicate(pred,{})> )"
+
+evalPredicate(pred,description) ::= "(<pred>)"
+
+evalSynPredicate(pred,description) ::= "this->msynpred( antlr3::ClassForwarder\<<pred>>() )"
+
+lookaheadTest(atom,k,atomAsInt) ::= "LA<decisionNumber>_<stateNumber> == <atom>"
+
+/** Sometimes a lookahead test cannot assume that LA(k) is in a temp variable
+ *  somewhere.  Must ask for the lookahead directly.
+ */
+isolatedLookaheadTest(atom,k,atomAsInt) ::= "this->LA(<k>) == <atom>"
+
+lookaheadRangeTest(lower,upper,k,rangeNumber,lowerAsInt,upperAsInt) ::= <%
+((LA<decisionNumber>_<stateNumber> >= <lower>) && (LA<decisionNumber>_<stateNumber> \<= <upper>))
+%>
+
+isolatedLookaheadRangeTest(lower,upper,k,rangeNumber,lowerAsInt,upperAsInt) ::= "((this->LA(<k>) >= <lower>) && (this->LA(<k>) \<= <upper>))"
+
+setTest(ranges) ::= "<ranges; separator=\" || \">"
+
+// A T T R I B U T E S
+
+makeScopeSet() ::= <<
+/* makeScopeSet()
+ */
+ /** Definition of the <scope.name> scope variable tracking
+ *  structure. An instance of this structure is created by calling
+ *  <name>_<scope.name>Push().
+ */
+struct  <scopeStruct(sname=scope.name,...)>
+{
+    /* =============================================================================
+     * Programmer defined variables...
+     */
+    <scope.attributes:{it |<it.decl>;}; separator="\n">
+
+    /* End of programmer defined variables
+     * =============================================================================
+     */
+};
+
+>>
+
+globalAttributeScopeDecl(scope) ::= <<
+<if(scope.attributes)>
+/* globalAttributeScopeDecl(scope)
+ */
+<makeScopeSet(...)>
+<endif>
+>>
+
+ruleAttributeScopeDecl(scope) ::= <<
+<if(scope.attributes)>
+/* ruleAttributeScopeDecl(scope)
+ */
+<makeScopeSet(...)>
+<endif>
+>>
+
+globalAttributeScopeDef(scope) ::=
+<<
+/* globalAttributeScopeDef(scope)
+ */
+<if(scope.attributes)>
+
+StackType\< <scopeStruct(sname=scope.name)> > <scopeStack(sname=scope.name)>;
+
+<endif>
+>>
+
+ruleAttributeScopeDef(scope) ::= <<
+<if(scope.attributes)>
+/* ruleAttributeScopeDef(scope)
+ */
+StackType\< <scopeStruct(sname=scope.name)> >  <scopeStack(sname=scope.name,...)>;
+
+<endif>
+>>
+
+scopeStruct(sname) ::= <<
+<sname>Scope
+>>
+
+scopeStack(sname) ::= <<
+m_<sname>_stack
+>>
+
+returnStructName(r) ::= "<r.name>_return"
+
+returnType() ::= <%
+<if(!ruleDescriptor.isSynPred)>
+<if(ruleDescriptor.hasMultipleReturnValues)>
+<ruleDescriptor.grammar.recognizerName>::<ruleDescriptor:returnStructName()>
+<else>
+<if(ruleDescriptor.hasSingleReturnValue)>
+<ruleDescriptor.singleValueReturnType>
+<else>
+void
+<endif>
+<endif>
+<else>
+bool
+<endif>
+%>
+
+/** Generate the C type associated with a single or multiple return
+ *  value(s).
+ */
+ruleLabelType(referencedRule) ::= <%
+<if(referencedRule.hasMultipleReturnValues)>
+<referencedRule.name>_return
+<else>
+<if(referencedRule.hasSingleReturnValue)>
+<referencedRule.singleValueReturnType>
+<else>
+void
+<endif>
+<endif>
+%>
+
+delegateName(d) ::= <<
+<if(d.label)><d.label><else>g<d.name><endif>
+>>
+
+/** Using a type to init value map, try to init a type; if not in table
+ *  must be an object, default value is "0".
+ */
+initValue(typeName) ::= <<
+ = <cTypeInitMap.(typeName)>
+>>
+
+/** Define a rule label  */
+ruleLabelDef(label) ::= <<
+<ruleLabelType(referencedRule=label.referencedRule)> <label.label.text>;
+>>
+/**  Rule label default value */
+ruleLabelInitVal(label) ::= <<
+>>
+
+ASTLabelType() ::= "<if(recognizer.ASTLabelType)><recognizer.ASTLabelType><else>ImplTraits::TreeType*<endif>"
+
+/** Define a return struct for a rule if the code needs to access its
+ *  start/stop tokens, tree stuff, attributes, ...  Leave a hole for
+ *  subgroups to stick in members.
+ */
+returnScope(scope) ::= <<
+<if(!ruleDescriptor.isSynPred)>
+<if(ruleDescriptor.hasMultipleReturnValues)>
+<if(!TREE_PARSER)>
+struct <ruleDescriptor:returnStructName()> : public <name>ImplTraits::RuleReturnValueType
+{
+public:
+    typedef <name>ImplTraits::RuleReturnValueType BaseType;
+    <ruleDescriptor:returnStructName()>()
+        : BaseType()
+        <if(scope)>, <scope.attributes:{it | <it.name>() }; separator=","><endif>
+        { init(); }
+    <ruleDescriptor:returnStructName()>( BaseParserType* parser )
+        : BaseType(parser)
+        <if(scope)>, <scope.attributes:{it | <it.name>() }; separator=","><endif>
+        { init(); }
+    <ruleDescriptor:returnStructName()>( const <ruleDescriptor:returnStructName()>& other )
+        : BaseType(other)
+    <if(scope)>, <scope.attributes:{it | <it.name>(other.<it.name>) }; separator=", "><endif>
+    { copy(other); }
+    ~<ruleDescriptor:returnStructName()>()
+    {
+        <@ruleReturnMembersDelete()>
+    }
+
+    <ruleDescriptor:returnStructName()>&
+    operator=( const <ruleDescriptor:returnStructName()>& other )
+    {
+        BaseType::operator=( other );
+        <if(scope)><scope.attributes:{it | <it.name> = other.<it.name>; }; separator="\n"><endif>
+        copy(other);    
+    	return *this;
+    }
+    <@ruleReturnMembers()>
+    void init() { <@ruleReturnMembersInit()> }
+    void copy( const <ruleDescriptor:returnStructName()>& other) { <@ruleReturnMembersCopy()> }    
+<else>
+struct <ruleDescriptor:returnStructName()>
+{
+public:
+    <name>ImplTraits::<recognizer.ASTLabelType>       start;
+    <name>ImplTraits::<recognizer.ASTLabelType>       stop;
+    <ruleDescriptor:returnStructName()>( const <ruleDescriptor:returnStructName()>& other )
+    <if(scope.attributes)>
+    <scope.attributes:{it | <it.name>(other.<it.name>) }; separator=",">
+    <endif>
+    {
+     	start = other.start;
+     	stop  = other.stop;
+    }
+    
+    <ruleDescriptor:returnStructName()>&
+    operator=( const <ruleDescriptor:returnStructName()>& other )
+    {
+     	start = other.start;
+     	stop  = other.stop;
+
+    	<scope.attributes:{it | <it.name> = other.<it.name>; }; separator="\n">
+    	return *this;
+    }
+<endif>
+    <if(scope)><scope.attributes:{it |<it.type> <it.name>;}; separator="\n"><endif>
+};
+
+<endif>
+<endif>
+>>
+
+parameterScope(scope) ::= <<
+<scope.attributes:{it |<it.decl>}; separator=", ">
+>>
+
+parameterAttributeRef(attr) ::= "<attr.name>"
+parameterSetAttributeRef(attr,expr) ::= "<attr.name>=<expr>;"
+
+/** Note that the scopeAttributeRef does not have access to the
+ * grammar name directly
+ */
+scopeAttributeRef(scope,attr,index,negIndex) ::= <%
+<if(negIndex)>
+  m_<scope>_stack.at( m_<scope>_stack.size()-<negIndex>-1).<attr.name>
+<else>
+<if(index)>
+  m_<scope>_stack.at(<index>).<attr.name>
+<else>
+  m_<scope>_stack.peek().<attr.name>
+<endif>
+<endif>
+%>
+
+scopeSetAttributeRef(scope,attr,expr,index,negIndex) ::= <%
+<if(negIndex)>
+  m_<scope>_stack.at( m_<scope>_stack.size()-<negIndex>-1).<attr.name> = <expr>;
+<else>
+<if(index)>
+  m_<scope>_stack.at(<index>).<attr.name> = <expr>;
+<else>
+  m_<scope>_stack.peek().<attr.name> =<expr>;
+<endif>
+<endif>
+%>
+
+/** $x is either global scope or x is rule with dynamic scope; refers
+ *  to stack itself not top of stack.  This is useful for predicates
+ *  like {$function.size()>0 && $function::name.equals("foo")}?
+ */
+isolatedDynamicScopeRef(scope) ::= "<scope>_stack"
+
+/** reference an attribute of rule; might only have single return value */
+ruleLabelRef(referencedRule,scope,attr) ::= <<
+<if(referencedRule.hasMultipleReturnValues)>
+<scope>.<attr.name>
+<else>
+<scope>
+<endif>
+>>
+
+returnAttributeRef(ruleDescriptor,attr) ::= <<
+<if(ruleDescriptor.hasMultipleReturnValues)>
+retval.<attr.name>
+<else>
+<attr.name>
+<endif>
+>>
+
+returnSetAttributeRef(ruleDescriptor,attr,expr) ::= <<
+<if(ruleDescriptor.hasMultipleReturnValues)>
+retval.<attr.name>=<expr>;
+<else>
+<attr.name>=<expr>;
+<endif>
+>>
+
+/** How to translate $tokenLabel */
+tokenLabelRef(label) ::= "<label>"
+
+/** ids+=ID {$ids} or e+=expr {$e} */
+listLabelRef(label) ::= "list_<label>"
+
+
+// not sure the next are the right approach
+//
+tokenLabelPropertyRef_text(scope,attr) ::= "(<scope>->getText())"
+tokenLabelPropertyRef_type(scope,attr) ::= "(<scope>->get_type())"
+tokenLabelPropertyRef_line(scope,attr) ::= "(<scope>->get_line())"
+tokenLabelPropertyRef_pos(scope,attr) ::= "(<scope>->get_charPositionInLine())"
+tokenLabelPropertyRef_channel(scope,attr) ::= "(<scope>->get_channel())"
+tokenLabelPropertyRef_index(scope,attr) ::= "(<scope>->get_tokenIndex())"
+tokenLabelPropertyRef_tree(scope,attr) ::= "(<scope>->get_tree())"
+tokenLabelPropertyRef_int(scope,attr) ::= "(<name>ImplTraits::ConvertToInt32(<scope>->getText()))"
+
+ruleLabelPropertyRef_start(scope,attr) ::= "(<scope>.start)"
+ruleLabelPropertyRef_stop(scope,attr) ::= "(<scope>.stop)"
+ruleLabelPropertyRef_tree(scope,attr) ::= "(<scope>.tree)"
+ruleLabelPropertyRef_text(scope,attr) ::= <<
+<if(TREE_PARSER)>
+(this->get_strstream()->toStringSS(<scope>.start, <scope>.start))
+<else>
+(this->get_strstream()->toStringTT(<scope>.start, <scope>.stop))
+<endif>
+>>
+
+ruleLabelPropertyRef_st(scope,attr) ::= "<scope>.st"
+
+/** Isolated $RULE ref ok in lexer as it's a Token */
+lexerRuleLabel(label) ::= "<label>"
+
+lexerRuleLabelPropertyRef_type(scope,attr) ::= "(<scope>->get_type())"
+lexerRuleLabelPropertyRef_line(scope,attr) ::= "(<scope>->get_line())"
+lexerRuleLabelPropertyRef_pos(scope,attr) ::= "(<scope>->get_charPositionInLine())"
+lexerRuleLabelPropertyRef_channel(scope,attr) ::= "(<scope>->get_channel())"
+lexerRuleLabelPropertyRef_index(scope,attr) ::= "(<scope>->get_tokenIndex())"
+lexerRuleLabelPropertyRef_text(scope,attr) ::= "(<scope>->getText())"
+
+// Somebody may ref $template or $tree or $stop within a rule:
+rulePropertyRef_start(scope,attr) ::= "retval.start"
+rulePropertyRef_stop(scope,attr) ::= "retval.stop"
+rulePropertyRef_tree(scope,attr) ::= "retval.tree"
+rulePropertyRef_text(scope,attr) ::= <<
+<if(TREE_PARSER)>
+this->get_input()->toStringSS( this->get_adaptor()->getTokenStartIndex(retval.start), this->get_adaptor()->getTokenStopIndex(retval.start))
+<else>
+this->get_strstream()->toStringTT(retval.start, this->LT(-1))
+<endif>
+>>
+rulePropertyRef_st(scope,attr) ::= "retval.st"
+
+lexerRulePropertyRef_text(scope,attr) ::= "this->getText()"
+lexerRulePropertyRef_type(scope,attr) ::= "_type"
+lexerRulePropertyRef_line(scope,attr) ::= "this->get_state()->get_tokenStartLine()"
+lexerRulePropertyRef_pos(scope,attr) ::= "this->get_state()->get_tokenStartCharPositionInLine()"
+lexerRulePropertyRef_channel(scope,attr) ::= "this->get_state()->get_channel()"
+lexerRulePropertyRef_start(scope,attr) ::= "this->get_state()->get_tokenStartCharIndex()"
+lexerRulePropertyRef_stop(scope,attr) ::= "(this->getCharIndex()-1)"
+lexerRulePropertyRef_index(scope,attr) ::= "-1" // undefined token index in lexer
+lexerRulePropertyRef_int(scope,attr) ::= "(<name>ImplTraits::ConvertToInt32(<scope>->getText()))"
+
+
+// setting $st and $tree is allowed in local rule. everything else is flagged as error
+ruleSetPropertyRef_tree(scope,attr,expr) ::= "retval.tree=<expr>;"
+ruleSetPropertyRef_st(scope,attr,expr) ::= "retval.st=<expr>;"
+
+
+/** How to deal with an @after for C targets. Because we cannot rely on
+ *  any garbage collection, after code is executed even in backtracking
+ *  mode. Must be documented clearly.
+ */
+execAfter(action) ::= <<
+{
+    <action>
+}
+>>
+
+/** How to execute an action (when not backtracking) */
+execAction(action) ::= <<
+<if(backtracking)>
+<if(actions.(actionScope).synpredgate)>
+if ( <actions.(actionScope).synpredgate> )
+{
+    <action>
+}
+<else>
+if ( BACKTRACKING == 0 )
+{
+    <action>
+}
+<endif>
+<else>
+{
+    <action>
+}
+<endif>
+>>
+
+// M I S C (properties, etc...)
+
+bitsetDeclare(bitsetname, words64, traits) ::= <<
+
+/** Bitset defining follow set for error recovery in rule state: <name>  */
+static	ANTLR_BITWORD <bitsetname>_bits[]	= { <words64:{it |ANTLR_UINT64_LIT(<it>)}; separator=", "> };
+static  <traits>::BitsetListType <bitsetname>( <bitsetname>_bits, <length(words64)> );
+>>
+
+codeFileExtension() ::= ".cpp"
+
+true_value() ::= "true"
+false_value() ::= "false"
+
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/Delphi/Delphi.stg b/tool/src/main/resources/org/antlr/codegen/templates/Delphi/Delphi.stg
index bbf3dfb..7390fde 100644
--- a/tool/src/main/resources/org/antlr/codegen/templates/Delphi/Delphi.stg
+++ b/tool/src/main/resources/org/antlr/codegen/templates/Delphi/Delphi.stg
@@ -1484,7 +1484,7 @@
 
 andPredicates(left,right) ::= "((<left>) and (<right>))"
 
-orPredicates(operands) ::= "((<first(operands)>)<rest(operands):{o | or (<o>)}>)"
+orPredicates(operands) ::= "(<operands:{o|(<o>)}; separator=\" or \">)"
 
 notPredicate(pred) ::= "!(<evalPredicate(...)>)"
 
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/Java/AST.stg b/tool/src/main/resources/org/antlr/codegen/templates/Java/AST.stg
index 2f6671a..7956218 100644
--- a/tool/src/main/resources/org/antlr/codegen/templates/Java/AST.stg
+++ b/tool/src/main/resources/org/antlr/codegen/templates/Java/AST.stg
@@ -35,24 +35,26 @@
 
 @genericParser.members() ::= <<
 <@super.members()>
-<parserMembers()>
+	<parserMembers()>
 >>
 
 /** Add an adaptor property that knows how to build trees */
 parserMembers() ::= <<
-protected TreeAdaptor adaptor = new CommonTreeAdaptor();<\n>
+protected TreeAdaptor adaptor = new CommonTreeAdaptor();
+
 public void setTreeAdaptor(TreeAdaptor adaptor) {
-    this.adaptor = adaptor;
-    <grammar.directDelegates:{g|<g:delegateName()>.setTreeAdaptor(this.adaptor);}>
+	this.adaptor = adaptor;
+	<grammar.directDelegates:{g|<g:delegateName()>.setTreeAdaptor(this.adaptor);}>
 }
 public TreeAdaptor getTreeAdaptor() {
-    return adaptor;
+	return adaptor;
 }
 >>
 
 @returnScope.ruleReturnMembers() ::= <<
 <ASTLabelType> tree;
-public Object getTree() { return tree; }
+@Override
+public <ASTLabelType> getTree() { return tree; }
 >>
 
 /** Add a variable to track rule's return AST */
@@ -63,13 +65,22 @@
 
 ruleLabelDefs() ::= <<
 <super.ruleLabelDefs()>
+<if(!ruleDescriptor.isSynPred)>
 <[ruleDescriptor.tokenLabels,ruleDescriptor.wildcardTreeLabels,
   ruleDescriptor.wildcardTreeListLabels]:{it | <ASTLabelType> <it.label.text>_tree=null;}; separator="\n">
 <ruleDescriptor.tokenListLabels:{it | <ASTLabelType> <it.label.text>_tree=null;}; separator="\n">
+<if(ruleDescriptor.supportsLabelOptimization)>
+<ruleDescriptor.allTokenRefsInRewrites
+	:{it | RewriteRule<rewriteElementType>Stream stream_<it>=new RewriteRule<rewriteElementType>Stream(adaptor,"token <it>");}; separator="\n">
+<ruleDescriptor.allRuleRefsInRewrites
+	:{it | RewriteRuleSubtreeStream stream_<it>=new RewriteRuleSubtreeStream(adaptor,"rule <it>");}; separator="\n">
+<else>
 <ruleDescriptor.allTokenRefsInAltsWithRewrites
-    :{it | RewriteRule<rewriteElementType>Stream stream_<it>=new RewriteRule<rewriteElementType>Stream(adaptor,"token <it>");}; separator="\n">
+	:{it | RewriteRule<rewriteElementType>Stream stream_<it>=new RewriteRule<rewriteElementType>Stream(adaptor,"token <it>");}; separator="\n">
 <ruleDescriptor.allRuleRefsInAltsWithRewrites
-    :{it | RewriteRuleSubtreeStream stream_<it>=new RewriteRuleSubtreeStream(adaptor,"rule <it>");}; separator="\n">
+	:{it | RewriteRuleSubtreeStream stream_<it>=new RewriteRuleSubtreeStream(adaptor,"rule <it>");}; separator="\n">
+<endif>
+<endif>
 >>
 
 /** When doing auto AST construction, we must define some variables;
@@ -80,7 +91,7 @@
 @alt.declarations() ::= <<
 <if(autoAST)>
 <if(outerAlt)>
-<if(!rewriteMode)>
+<if(!rewriteMode && !ruleDescriptor.isSynPred)>
 root_0 = (<ASTLabelType>)adaptor.nil();<\n>
 <endif>
 <endif>
@@ -90,7 +101,7 @@
 // T r a c k i n g  R u l e  E l e m e n t s
 
 /** ID and track it for use in a rewrite rule */
-tokenRefTrack(token,label,elementIndex,terminalOptions) ::= <<
+tokenRefTrack(token,label,elementIndex,terminalOptions={}) ::= <<
 <tokenRefBang(...)> <! Track implies no auto AST construction!>
 <if(backtracking)>if ( <actions.(actionScope).synpredgate> ) <endif>stream_<token>.add(<label>);<\n>
 >>
@@ -98,19 +109,19 @@
 /** ids+=ID and track it for use in a rewrite rule; adds to ids *and*
  *  to the tracking list stream_ID for use in the rewrite.
  */
-tokenRefTrackAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
+tokenRefTrackAndListLabel(token,label,elementIndex,terminalOptions={}) ::= <<
 <tokenRefTrack(...)>
 <listLabel(elem=label, ...)>
 >>
 
 /** ^(ID ...) track for rewrite */
-tokenRefRuleRootTrack(token,label,elementIndex,terminalOptions) ::= <<
+tokenRefRuleRootTrack(token,label,elementIndex,terminalOptions={}) ::= <<
 <tokenRefBang(...)>
 <if(backtracking)>if ( <actions.(actionScope).synpredgate> ) <endif>stream_<token>.add(<label>);<\n>
 >>
 
 /** Match ^(label+=TOKEN ...) track for rewrite */
-tokenRefRuleRootTrackAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
+tokenRefRuleRootTrackAndListLabel(token,label,elementIndex,terminalOptions={}) ::= <<
 <tokenRefRuleRootTrack(...)>
 <listLabel(elem=label, ...)>
 >>
@@ -161,7 +172,7 @@
 // rule list labels: <referencedRuleListLabels; separator=", ">
 // wildcard labels: <[referencedWildcardLabels,referencedWildcardListLabels]; separator=", ">
 <if(backtracking)>
-if ( <actions.(actionScope).synpredgate> ) {<\n>
+if ( <actions.(actionScope).synpredgate> ) {
 <endif>
 <prevRuleRootRef()>.tree = root_0;
 <rewriteCodeLabels()>
@@ -172,9 +183,9 @@
 <if(rewriteMode)>
 <prevRuleRootRef()>.tree = (<ASTLabelType>)adaptor.rulePostProcessing(root_0);
 input.replaceChildren(adaptor.getParent(retval.start),
-                      adaptor.getChildIndex(retval.start),
-                      adaptor.getChildIndex(_last),
-                      retval.tree);
+					  adaptor.getChildIndex(retval.start),
+					  adaptor.getChildIndex(_last),
+					  retval.tree);
 <endif>
 <endif>
 <! if parser or tree-parser && rewrite!=true, we need to set result !>
@@ -192,28 +203,28 @@
 
 rewriteCodeLabels() ::= <<
 <referencedTokenLabels
-    :{it | RewriteRule<rewriteElementType>Stream stream_<it>=new RewriteRule<rewriteElementType>Stream(adaptor,"token <it>",<it>);};
-    separator="\n"
+	:{it | RewriteRule<rewriteElementType>Stream stream_<it>=new RewriteRule<rewriteElementType>Stream(adaptor,"token <it>",<it>);};
+	separator="\n"
 >
 <referencedTokenListLabels
-    :{it | RewriteRule<rewriteElementType>Stream stream_<it>=new RewriteRule<rewriteElementType>Stream(adaptor,"token <it>", list_<it>);};
-    separator="\n"
+	:{it | RewriteRule<rewriteElementType>Stream stream_<it>=new RewriteRule<rewriteElementType>Stream(adaptor,"token <it>", list_<it>);};
+	separator="\n"
 >
 <referencedWildcardLabels
-    :{it | RewriteRuleSubtreeStream stream_<it>=new RewriteRuleSubtreeStream(adaptor,"wildcard <it>",<it>);};
-    separator="\n"
+	:{it | RewriteRuleSubtreeStream stream_<it>=new RewriteRuleSubtreeStream(adaptor,"wildcard <it>",<it>);};
+	separator="\n"
 >
 <referencedWildcardListLabels
-    :{it | RewriteRuleSubtreeStream stream_<it>=new RewriteRuleSubtreeStream(adaptor,"wildcard <it>",list_<it>);};
-    separator="\n"
+	:{it | RewriteRuleSubtreeStream stream_<it>=new RewriteRuleSubtreeStream(adaptor,"wildcard <it>",list_<it>);};
+	separator="\n"
 >
 <referencedRuleLabels
-    :{it | RewriteRuleSubtreeStream stream_<it>=new RewriteRuleSubtreeStream(adaptor,"rule <it>",<it>!=null?<it>.tree:null);};
-    separator="\n"
+	:{it | RewriteRuleSubtreeStream stream_<it>=new RewriteRuleSubtreeStream(adaptor,"rule <it>",<it>!=null?<it>.getTree():null);};
+	separator="\n"
 >
 <referencedRuleListLabels
-    :{it | RewriteRuleSubtreeStream stream_<it>=new RewriteRuleSubtreeStream(adaptor,"token <it>",list_<it>);};
-    separator="\n"
+	:{it | RewriteRuleSubtreeStream stream_<it>=new RewriteRuleSubtreeStream(adaptor,"token <it>",list_<it>);};
+	separator="\n"
 >
 >>
 
@@ -228,7 +239,7 @@
 <<
 // <fileName>:<description>
 if ( <referencedElementsDeep:{el | stream_<el>.hasNext()}; separator="||"> ) {
-    <alt>
+	<alt>
 }
 <referencedElementsDeep:{el | stream_<el>.reset();<\n>}>
 >>
@@ -241,7 +252,7 @@
 <<
 // <fileName>:<description>
 while ( <referencedElements:{el | stream_<el>.hasNext()}; separator="||"> ) {
-    <alt>
+	<alt>
 }
 <referencedElements:{el | stream_<el>.reset();<\n>}>
 >>
@@ -253,10 +264,10 @@
 	description) ::=
 <<
 if ( !(<referencedElements:{el | stream_<el>.hasNext()}; separator="||">) ) {
-    throw new RewriteEarlyExitException();
+	throw new RewriteEarlyExitException();
 }
 while ( <referencedElements:{el | stream_<el>.hasNext()}; separator="||"> ) {
-    <alt>
+	<alt>
 }
 <referencedElements:{el | stream_<el>.reset();<\n>}>
 >>
@@ -265,11 +276,11 @@
 // <a.description>
 <if(a.pred)>
 if (<a.pred>) {
-    <a.alt>
+	<a.alt>
 }<\n>
 <else>
 {
-    <a.alt>
+	<a.alt>
 }<\n>
 <endif>
 >>
@@ -295,44 +306,44 @@
 >>
 
 /** Gen ID or ID[args] */
-rewriteTokenRef(token,elementIndex,terminalOptions,args) ::= <<
-adaptor.addChild(root_<treeLevel>, <createRewriteNodeFromElement(...)>);<\n>
+rewriteTokenRef(token,elementIndex,args,terminalOptions={}) ::= <<
+adaptor.addChild(root_<treeLevel>, <createRewriteNodeFromElement(...)>);
 >>
 
 /** Gen $label ... where defined via label=ID */
 rewriteTokenLabelRef(label,elementIndex) ::= <<
-adaptor.addChild(root_<treeLevel>, stream_<label>.nextNode());<\n>
+adaptor.addChild(root_<treeLevel>, stream_<label>.nextNode());
 >>
 
 /** Gen $label ... where defined via label+=ID */
 rewriteTokenListLabelRef(label,elementIndex) ::= <<
-adaptor.addChild(root_<treeLevel>, stream_<label>.nextNode());<\n>
+adaptor.addChild(root_<treeLevel>, stream_<label>.nextNode());
 >>
 
 /** Gen ^($label ...) */
 rewriteTokenLabelRefRoot(label,elementIndex) ::= <<
-root_<treeLevel> = (<ASTLabelType>)adaptor.becomeRoot(stream_<label>.nextNode(), root_<treeLevel>);<\n>
+root_<treeLevel> = (<ASTLabelType>)adaptor.becomeRoot(stream_<label>.nextNode(), root_<treeLevel>);
 >>
 
 /** Gen ^($label ...) where label+=... */
 rewriteTokenListLabelRefRoot ::= rewriteTokenLabelRefRoot
 
 /** Gen ^(ID ...) or ^(ID[args] ...) */
-rewriteTokenRefRoot(token,elementIndex,terminalOptions,args) ::= <<
-root_<treeLevel> = (<ASTLabelType>)adaptor.becomeRoot(<createRewriteNodeFromElement(...)>, root_<treeLevel>);<\n>
+rewriteTokenRefRoot(token,elementIndex,args,terminalOptions={}) ::= <<
+root_<treeLevel> = (<ASTLabelType>)adaptor.becomeRoot(<createRewriteNodeFromElement(...)>, root_<treeLevel>);
 >>
 
-rewriteImaginaryTokenRef(args,token,terminalOptions,elementIndex) ::= <<
-adaptor.addChild(root_<treeLevel>, <createImaginaryNode(token,terminalOptions,args)>);<\n>
+rewriteImaginaryTokenRef(args,token,elementIndex,terminalOptions={}) ::= <<
+adaptor.addChild(root_<treeLevel>, <createImaginaryNode(token,args,terminalOptions)>);
 >>
 
-rewriteImaginaryTokenRefRoot(args,token,terminalOptions,elementIndex) ::= <<
-root_<treeLevel> = (<ASTLabelType>)adaptor.becomeRoot(<createImaginaryNode(token,terminalOptions,args)>, root_<treeLevel>);<\n>
+rewriteImaginaryTokenRefRoot(args,token,elementIndex,terminalOptions={}) ::= <<
+root_<treeLevel> = (<ASTLabelType>)adaptor.becomeRoot(<createImaginaryNode(token,args,terminalOptions)>, root_<treeLevel>);
 >>
 
 /** plain -> {foo} action */
 rewriteAction(action) ::= <<
-root_0 = <action>;<\n>
+root_0 = <action>;
 >>
 
 /** What is the name of the previous value of this rule's root tree?  This
@@ -343,56 +354,56 @@
 prevRuleRootRef() ::= "retval"
 
 rewriteRuleRef(rule) ::= <<
-adaptor.addChild(root_<treeLevel>, stream_<rule>.nextTree());<\n>
+adaptor.addChild(root_<treeLevel>, stream_<rule>.nextTree());
 >>
 
 rewriteRuleRefRoot(rule) ::= <<
-root_<treeLevel> = (<ASTLabelType>)adaptor.becomeRoot(stream_<rule>.nextNode(), root_<treeLevel>);<\n>
+root_<treeLevel> = (<ASTLabelType>)adaptor.becomeRoot(stream_<rule>.nextNode(), root_<treeLevel>);
 >>
 
 rewriteNodeAction(action) ::= <<
-adaptor.addChild(root_<treeLevel>, <action>);<\n>
+adaptor.addChild(root_<treeLevel>, <action>);
 >>
 
 rewriteNodeActionRoot(action) ::= <<
-root_<treeLevel> = (<ASTLabelType>)adaptor.becomeRoot(<action>, root_<treeLevel>);<\n>
+root_<treeLevel> = (<ASTLabelType>)adaptor.becomeRoot(<action>, root_<treeLevel>);
 >>
 
 /** Gen $ruleLabel ... where defined via ruleLabel=rule */
 rewriteRuleLabelRef(label) ::= <<
-adaptor.addChild(root_<treeLevel>, stream_<label>.nextTree());<\n>
+adaptor.addChild(root_<treeLevel>, stream_<label>.nextTree());
 >>
 
 /** Gen $ruleLabel ... where defined via ruleLabel+=rule */
 rewriteRuleListLabelRef(label) ::= <<
-adaptor.addChild(root_<treeLevel>, stream_<label>.nextTree());<\n>
+adaptor.addChild(root_<treeLevel>, stream_<label>.nextTree());
 >>
 
 /** Gen ^($ruleLabel ...) where ruleLabel=rule */
 rewriteRuleLabelRefRoot(label) ::= <<
-root_<treeLevel> = (<ASTLabelType>)adaptor.becomeRoot(stream_<label>.nextNode(), root_<treeLevel>);<\n>
+root_<treeLevel> = (<ASTLabelType>)adaptor.becomeRoot(stream_<label>.nextNode(), root_<treeLevel>);
 >>
 
 /** Gen ^($ruleLabel ...) where ruleLabel+=rule */
 rewriteRuleListLabelRefRoot(label) ::= <<
-root_<treeLevel> = (<ASTLabelType>)adaptor.becomeRoot(stream_<label>.nextNode(), root_<treeLevel>);<\n>
+root_<treeLevel> = (<ASTLabelType>)adaptor.becomeRoot(stream_<label>.nextNode(), root_<treeLevel>);
 >>
 
 rewriteWildcardLabelRef(label) ::= <<
-adaptor.addChild(root_<treeLevel>, stream_<label>.nextTree());<\n>
+adaptor.addChild(root_<treeLevel>, stream_<label>.nextTree());
 >>
 
 
-createImaginaryNode(tokenType,terminalOptions,args) ::= <<
+createImaginaryNode(tokenType,args,terminalOptions={}) ::= <%
 <if(terminalOptions.node)>
 <! new MethodNode(IDLabel, args) !>
 new <terminalOptions.node>(<tokenType><if(args)>, <args; separator=", "><endif>)
 <else>
 (<ASTLabelType>)adaptor.create(<tokenType>, <args; separator=", "><if(!args)>"<tokenType>"<endif>)
 <endif>
->>
+%>
 
-createRewriteNodeFromElement(token,terminalOptions,args) ::= <<
+createRewriteNodeFromElement(token,args,terminalOptions={}) ::= <%
 <if(terminalOptions.node)>
 new <terminalOptions.node>(stream_<token>.nextToken()<if(args)>, <args; separator=", "><endif>)
 <else>
@@ -402,4 +413,4 @@
 stream_<token>.nextNode()
 <endif>
 <endif>
->>
+%>
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/Java/ASTDbg.stg b/tool/src/main/resources/org/antlr/codegen/templates/Java/ASTDbg.stg
index 886e198..6ff493c 100644
--- a/tool/src/main/resources/org/antlr/codegen/templates/Java/ASTDbg.stg
+++ b/tool/src/main/resources/org/antlr/codegen/templates/Java/ASTDbg.stg
@@ -31,18 +31,18 @@
  */
 
 parserMembers() ::= <<
-protected DebugTreeAdaptor adaptor;
-public void setTreeAdaptor(TreeAdaptor adaptor) {
+	protected DebugTreeAdaptor adaptor;
+	public void setTreeAdaptor(TreeAdaptor adaptor) {
 <if(grammar.grammarIsRoot)>
-    this.adaptor = new DebugTreeAdaptor(dbg,adaptor);
+		this.adaptor = new DebugTreeAdaptor(dbg,adaptor);
 <else>
-    this.adaptor = (DebugTreeAdaptor)adaptor; // delegator sends dbg adaptor
-<endif><\n>
-    <grammar.directDelegates:{g|<g:delegateName()>.setTreeAdaptor(this.adaptor);}>
-}
-public TreeAdaptor getTreeAdaptor() {
-    return adaptor;
-}<\n>
+		this.adaptor = (DebugTreeAdaptor)adaptor; // delegator sends dbg adaptor
+<endif>
+		<grammar.directDelegates:{g|<g:delegateName()>.setTreeAdaptor(this.adaptor);}>
+	}
+	public TreeAdaptor getTreeAdaptor() {
+		return adaptor;
+	}
 >>
 
 parserCtorBody() ::= <<
@@ -51,14 +51,14 @@
 
 createListenerAndHandshake() ::= <<
 DebugEventSocketProxy proxy =
-    new DebugEventSocketProxy(this,port,<if(TREE_PARSER)>input.getTreeAdaptor()<else>adaptor<endif>);
+	new DebugEventSocketProxy(this,port,<if(TREE_PARSER)>input.getTreeAdaptor()<else>adaptor<endif>);
 setDebugListener(proxy);
 set<inputStreamType>(new Debug<inputStreamType>(input,proxy));
 try {
-    proxy.handshake();
+	proxy.handshake();
 }
 catch (IOException ioe) {
-    reportError(ioe);
+	reportError(ioe);
 }
 >>
 
@@ -78,7 +78,7 @@
 @ctorForPredefinedListener.finally() ::=<<
 <if(grammar.grammarIsRoot)> <! don't create new adaptor for delegates !>
 TreeAdaptor adap = new CommonTreeAdaptor();
-setTreeAdaptor(adap);<\n>
+setTreeAdaptor(adap);
 <endif>
 >>
 
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/Java/ASTParser.stg b/tool/src/main/resources/org/antlr/codegen/templates/Java/ASTParser.stg
index fd12288..7df6e42 100644
--- a/tool/src/main/resources/org/antlr/codegen/templates/Java/ASTParser.stg
+++ b/tool/src/main/resources/org/antlr/codegen/templates/Java/ASTParser.stg
@@ -39,47 +39,51 @@
  */
 
 @rule.setErrorReturnValue() ::= <<
-retval.tree = (<ASTLabelType>)adaptor.errorNode(input, retval.start, input.LT(-1), re);
-<! System.out.println("<ruleName> returns "+((CommonTree)retval.tree).toStringTree()); !>
+retval.tree = (<ASTLabelType>)adaptor.errorNode(input, retval.start, input.LT(-1), re);<!
+ System.out.println("<ruleName> returns "+((CommonTree)retval.tree).toStringTree()); !>
 >>
 
 // TOKEN AST STUFF
 
 /** ID and output=AST */
-tokenRef(token,label,elementIndex,terminalOptions) ::= <<
+tokenRef(token,label,elementIndex,terminalOptions={}) ::= <<
 <super.tokenRef(...)>
+<if(!ruleDescriptor.isSynPred)>
 <if(backtracking)>if ( <actions.(actionScope).synpredgate> ) {<endif>
 <label>_tree = <createNodeFromToken(...)>;
 adaptor.addChild(root_0, <label>_tree);
 <if(backtracking)>}<endif>
+<endif>
 >>
 
 /** ID! and output=AST (same as plain tokenRef) */
-tokenRefBang(token,label,elementIndex,terminalOptions) ::= "<super.tokenRef(...)>"
+tokenRefBang(token,label,elementIndex,terminalOptions={}) ::= "<super.tokenRef(...)>"
 
 /** ID^ and output=AST */
-tokenRefRuleRoot(token,label,elementIndex,terminalOptions) ::= <<
+tokenRefRuleRoot(token,label,elementIndex,terminalOptions={}) ::= <<
 <super.tokenRef(...)>
+<if(!ruleDescriptor.isSynPred)>
 <if(backtracking)>if ( <actions.(actionScope).synpredgate> ) {<endif>
 <label>_tree = <createNodeFromToken(...)>;
 root_0 = (<ASTLabelType>)adaptor.becomeRoot(<label>_tree, root_0);
 <if(backtracking)>}<endif>
+<endif>
 >>
 
 /** ids+=ID! and output=AST */
-tokenRefBangAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
+tokenRefBangAndListLabel(token,label,elementIndex,terminalOptions={}) ::= <<
 <tokenRefBang(...)>
 <listLabel(elem=label, ...)>
 >>
 
 /** label+=TOKEN when output=AST but not rewrite alt */
-tokenRefAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
+tokenRefAndListLabel(token,label,elementIndex,terminalOptions={}) ::= <<
 <tokenRef(...)>
 <listLabel(elem=label, ...)>
 >>
 
 /** Match label+=TOKEN^ when output=AST but not rewrite alt */
-tokenRefRuleRootAndListLabel(token,label,terminalOptions,elementIndex) ::= <<
+tokenRefRuleRootAndListLabel(token,label,elementIndex,terminalOptions={}) ::= <<
 <tokenRefRuleRoot(...)>
 <listLabel(elem=label, ...)>
 >>
@@ -97,24 +101,24 @@
 // rather than just added on code.  Investigate that refactoring when
 // I have more time.
 
-matchSet(s,label,terminalOptions,elementIndex,postmatchCode) ::= <%
-<super.matchSet(postmatchCode={<if(backtracking)>if ( <actions.(actionScope).synpredgate> ) <endif>adaptor.addChild(root_0, <createNodeFromToken(...)>);}, ...)>
+matchSet(s,label,elementIndex,postmatchCode,terminalOptions={}) ::= <%
+<super.matchSet(postmatchCode={<if(!ruleDescriptor.isSynPred)><if(backtracking)>if ( <actions.(actionScope).synpredgate> ) <endif>adaptor.addChild(root_0, <createNodeFromToken(...)>);<endif>}, ...)>
 %>
 
-matchRuleBlockSet(s,label,terminalOptions,elementIndex,postmatchCode,treeLevel="0") ::= <<
+matchRuleBlockSet(s,label,elementIndex,postmatchCode,treeLevel="0",terminalOptions={}) ::= <<
 <matchSet(...)>
 >>
 
-matchSetBang(s,label,elementIndex,terminalOptions,postmatchCode) ::= "<super.matchSet(...)>"
+matchSetBang(s,label,elementIndex,postmatchCode,terminalOptions={}) ::= "<super.matchSet(...)>"
 
 // note there is no matchSetTrack because -> rewrites force sets to be
 // plain old blocks of alts: (A|B|...|C)
 
-matchSetRuleRoot(s,label,terminalOptions,elementIndex,debug) ::= <<
+matchSetRuleRoot(s,label,elementIndex,debug,terminalOptions={}) ::= <<
 <if(label)>
-<label>=(<labelType>)input.LT(1);<\n>
+<label>=<castToLabelType("input.LT(1)")>;
 <endif>
-<super.matchSet(postmatchCode={<if(backtracking)>if ( <actions.(actionScope).synpredgate> ) <endif>root_0 = (<ASTLabelType>)adaptor.becomeRoot(<createNodeFromToken(...)>, root_0);},...)>
+<super.matchSet(postmatchCode={<if(!ruleDescriptor.isSynPred)><if(backtracking)>if ( <actions.(actionScope).synpredgate> ) <endif>root_0 = (<ASTLabelType>)adaptor.becomeRoot(<createNodeFromToken(...)>, root_0);<endif>},...)>
 >>
 
 // RULE REF AST
@@ -122,7 +126,9 @@
 /** rule when output=AST */
 ruleRef(rule,label,elementIndex,args,scope) ::= <<
 <super.ruleRef(...)>
+<if(!ruleDescriptor.isSynPred)>
 <if(backtracking)>if ( <actions.(actionScope).synpredgate> ) <endif>adaptor.addChild(root_0, <label>.getTree());
+<endif>
 >>
 
 /** rule! is same as normal rule ref */
@@ -154,35 +160,39 @@
 
 // WILDCARD AST
 
-wildcard(token,label,elementIndex,terminalOptions) ::= <<
+wildcard(token,label,elementIndex,terminalOptions={}) ::= <<
 <super.wildcard(...)>
+<if(!ruleDescriptor.isSynPred)>
 <if(backtracking)>if ( <actions.(actionScope).synpredgate> ) {<endif>
 <label>_tree = (<ASTLabelType>)adaptor.create(<label>);
 adaptor.addChild(root_0, <label>_tree);
 <if(backtracking)>}<endif>
+<endif>
 >>
 
-wildcardBang(label,elementIndex) ::= "<super.wildcard(...)>"
+wildcardBang(label,elementIndex) ::= "<super.wildcard(token=[],...)>"
 
-wildcardRuleRoot(token,label,elementIndex,terminalOptions) ::= <<
+wildcardRuleRoot(token,label,elementIndex,terminalOptions={}) ::= <<
 <super.wildcard(...)>
+<if(!ruleDescriptor.isSynPred)>
 <if(backtracking)>if ( <actions.(actionScope).synpredgate> ) {<endif>
 <label>_tree = (<ASTLabelType>)adaptor.create(<label>);
 root_0 = (<ASTLabelType>)adaptor.becomeRoot(<label>_tree, root_0);
 <if(backtracking)>}<endif>
+<endif>
 >>
 
-createNodeFromToken(label,terminalOptions) ::= <<
+createNodeFromToken(label,terminalOptions={}) ::= <%
 <if(terminalOptions.node)>
 new <terminalOptions.node>(<label>) <! new MethodNode(IDLabel) !>
 <else>
 (<ASTLabelType>)adaptor.create(<label>)
 <endif>
->>
+%>
 
 ruleCleanUp() ::= <<
 <super.ruleCleanUp()>
-<if(backtracking)>if ( <actions.(actionScope).synpredgate> ) {<\n><endif>
+<if(backtracking)>if ( <actions.(actionScope).synpredgate> ) {<endif>
 retval.tree = (<ASTLabelType>)adaptor.rulePostProcessing(root_0);
 adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
 <if(backtracking)>}<endif>
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/Java/ASTTreeParser.stg b/tool/src/main/resources/org/antlr/codegen/templates/Java/ASTTreeParser.stg
index 1f86683..cbc26ea 100644
--- a/tool/src/main/resources/org/antlr/codegen/templates/Java/ASTTreeParser.stg
+++ b/tool/src/main/resources/org/antlr/codegen/templates/Java/ASTTreeParser.stg
@@ -41,28 +41,33 @@
 /** Add a variable to track last element matched */
 ruleDeclarations() ::= <<
 <super.ruleDeclarations()>
+<if(!ruleDescriptor.isSynPred)>
 <ASTLabelType> _first_0 = null;
 <ASTLabelType> _last = null;<\n>
+<endif>
 >>
 
 /** What to emit when there is no rewrite rule.  For auto build
  *  mode, does nothing.
  */
-noRewrite(rewriteBlockLevel, treeLevel) ::= <<
+noRewrite(rewriteBlockLevel=false, treeLevel=false) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 <if(backtracking)>if ( <actions.(actionScope).synpredgate> ) {<endif>
 <if(rewriteMode)>
-retval.tree = (<ASTLabelType>)_first_0;
+retval.tree = _first_0;
 if ( adaptor.getParent(retval.tree)!=null && adaptor.isNil( adaptor.getParent(retval.tree) ) )
-    retval.tree = (<ASTLabelType>)adaptor.getParent(retval.tree);
+	retval.tree = (<ASTLabelType>)adaptor.getParent(retval.tree);
 <endif>
 <if(backtracking)>}<endif>
+<endif>
 >>
 
 /** match ^(root children) in tree parser; override here to
  *  add tree construction actions.
  */
 tree(root, actionsAfterRoot, children, nullableChildList,
-     enclosingTreeLevel, treeLevel) ::= <<
+	 enclosingTreeLevel, treeLevel) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 _last = (<ASTLabelType>)input.LT(1);
 {
 <ASTLabelType> _save_last_<treeLevel> = _last;
@@ -74,17 +79,17 @@
 <if(rewriteMode)>
 <if(backtracking)>if ( <actions.(actionScope).synpredgate> )<endif>
 <if(root.el.rule)>
-if ( _first_<enclosingTreeLevel>==null ) _first_<enclosingTreeLevel> = <root.el.label>.tree;
-<else>
+if ( _first_<enclosingTreeLevel>==null ) _first_<enclosingTreeLevel> = (<ASTLabelType>)<root.el.label>.getTree();
+<elseif(root.el.label)>
 if ( _first_<enclosingTreeLevel>==null ) _first_<enclosingTreeLevel> = <root.el.label>;
 <endif>
 <endif>
 <actionsAfterRoot:element()>
 <if(nullableChildList)>
 if ( input.LA(1)==Token.DOWN ) {
-    match(input, Token.DOWN, null); <checkRuleBacktrackFailure()>
-    <children:element()>
-    match(input, Token.UP, null); <checkRuleBacktrackFailure()>
+	match(input, Token.DOWN, null); <checkRuleBacktrackFailure()>
+	<children:element()>
+	match(input, Token.UP, null); <checkRuleBacktrackFailure()>
 }
 <else>
 match(input, Token.DOWN, null); <checkRuleBacktrackFailure()>
@@ -96,6 +101,9 @@
 <endif>
 _last = _save_last_<treeLevel>;
 }<\n>
+<else>
+<super.tree(...)>
+<endif>
 >>
 
 // TOKEN AST STUFF
@@ -103,13 +111,18 @@
 /** ID! and output=AST (same as plain tokenRef) 'cept add
  *  setting of _last
  */
-tokenRefBang(token,label,elementIndex,terminalOptions) ::= <<
+tokenRefBang(token,label,elementIndex,terminalOptions={}) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 _last = (<ASTLabelType>)input.LT(1);
 <super.tokenRef(...)>
+<else>
+<super.tokenRefBang(...)>
+<endif>
 >>
 
 /** ID auto construct */
-tokenRef(token,label,elementIndex,terminalOptions) ::= <<
+tokenRef(token,label,elementIndex,terminalOptions={}) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 _last = (<ASTLabelType>)input.LT(1);
 <super.tokenRef(...)>
 <if(!rewriteMode)>
@@ -125,16 +138,24 @@
 <if(backtracking)>if ( <actions.(actionScope).synpredgate> )<endif>
 if ( _first_<treeLevel>==null ) _first_<treeLevel> = <label>;
 <endif>
+<else>
+<super.tokenRef(...)>
+<endif>
 >>
 
 /** label+=TOKEN auto construct */
-tokenRefAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
+tokenRefAndListLabel(token,label,elementIndex,terminalOptions={}) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 <tokenRef(...)>
 <listLabel(elem=label,...)>
+<else>
+<super.tokenRefAndListLabel(...)>
+<endif>
 >>
 
 /** ^(ID ...) auto construct */
-tokenRefRuleRoot(token,label,elementIndex,terminalOptions) ::= <<
+tokenRefRuleRoot(token,label,elementIndex,terminalOptions={}) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 _last = (<ASTLabelType>)input.LT(1);
 <super.tokenRef(...)>
 <if(!rewriteMode)>
@@ -147,16 +168,24 @@
 root_<treeLevel> = (<ASTLabelType>)adaptor.becomeRoot(<label>_tree, root_<treeLevel>);
 <if(backtracking)>}<endif>
 <endif>
+<else>
+<super.tokenRefRuleRoot(...)>
+<endif>
 >>
 
 /** Match ^(label+=TOKEN ...) auto construct */
-tokenRefRuleRootAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
+tokenRefRuleRootAndListLabel(token,label,elementIndex,terminalOptions={}) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 <tokenRefRuleRoot(...)>
 <listLabel(elem=label,...)>
+<else>
+<super.tokenRefRuleRootAndListLabel(...)>
+<endif>
 >>
 
 /** Match . wildcard and auto dup the node/subtree */
-wildcard(token,label,elementIndex,terminalOptions) ::= <<
+wildcard(token,label,elementIndex,terminalOptions={}) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 _last = (<ASTLabelType>)input.LT(1);
 <super.wildcard(...)>
 <if(!rewriteMode)>
@@ -168,11 +197,15 @@
 <if(backtracking)>if ( <actions.(actionScope).synpredgate> )<endif>
 if ( _first_<treeLevel>==null ) _first_<treeLevel> = <label>;
 <endif>
+<else>
+<super.wildcard(...)>
+<endif>
 >>
 
 // SET AST
 
-matchSet(s,label,terminalOptions,elementIndex,postmatchCode) ::= <<
+matchSet(s,label,elementIndex,postmatchCode,terminalOptions={}) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 _last = (<ASTLabelType>)input.LT(1);
 <super.matchSet(postmatchCode={
 <if(!rewriteMode)>
@@ -187,19 +220,31 @@
 <endif>
 }, ...
 )>
+<else>
+<super.matchSet(...)>
+<endif>
 >>
 
-matchRuleBlockSet(s,label,terminalOptions,elementIndex,postmatchCode,treeLevel="0") ::= <<
+matchRuleBlockSet(s,label,elementIndex,postmatchCode,treeLevel="0",terminalOptions={}) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 <matchSet(...)>
 <noRewrite(...)> <! set return tree !>
+<else>
+<super.matchRuleBlockSet(...)>
+<endif>
 >>
 
-matchSetBang(s,label,terminalOptions,elementIndex,postmatchCode) ::= <<
+matchSetBang(s,label,elementIndex,postmatchCode,terminalOptions={}) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 _last = (<ASTLabelType>)input.LT(1);
 <super.matchSet(...)>
+<else>
+<super.matchSetBang(...)>
+<endif>
 >>
 
-matchSetRuleRoot(s,label,terminalOptions,elementIndex,debug) ::= <<
+matchSetRuleRoot(s,label,elementIndex,debug,terminalOptions={}) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 <super.matchSet(postmatchCode={
 <if(!rewriteMode)>
 <if(backtracking)>if ( <actions.(actionScope).synpredgate> ) {<endif>
@@ -213,41 +258,60 @@
 <endif>
 }, ...
 )>
+<else>
+<super.matchSetRuleRoot(...)>
+<endif>
 >>
 
 // RULE REF AST
 
 /** rule auto construct */
 ruleRef(rule,label,elementIndex,args,scope) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 _last = (<ASTLabelType>)input.LT(1);
 <super.ruleRef(...)>
 <if(backtracking)>if ( <actions.(actionScope).synpredgate> ) <endif>
 <if(!rewriteMode)>
 adaptor.addChild(root_<treeLevel>, <label>.getTree());
 <else> <! rewrite mode !>
-if ( _first_<treeLevel>==null ) _first_<treeLevel> = <label>.tree;
+if ( _first_<treeLevel>==null ) _first_<treeLevel> = (<ASTLabelType>)<label>.getTree();
+<endif>
+<else>
+<super.ruleRef(...)>
 <endif>
 >>
 
 /** x+=rule auto construct */
 ruleRefAndListLabel(rule,label,elementIndex,args,scope) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 <ruleRef(...)>
 <listLabel(label, {<label>.getTree()})>
+<else>
+<super.ruleRefAndListLabel(...)>
+<endif>
 >>
 
 /** ^(rule ...) auto construct */
 ruleRefRuleRoot(rule,label,elementIndex,args,scope) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 _last = (<ASTLabelType>)input.LT(1);
 <super.ruleRef(...)>
 <if(!rewriteMode)>
 <if(backtracking)>if ( <actions.(actionScope).synpredgate> ) <endif>root_<treeLevel> = (<ASTLabelType>)adaptor.becomeRoot(<label>.getTree(), root_<treeLevel>);
 <endif>
+<else>
+<super.ruleRefRuleRoot(...)>
+<endif>
 >>
 
 /** ^(x+=rule ...) auto construct */
 ruleRefRuleRootAndListLabel(rule,label,elementIndex,args,scope) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 <ruleRefRuleRoot(...)>
 <listLabel(label, {<label>.getTree()})>
+<else>
+<super.ruleRefRuleRootAndListLabel(...)>
+<endif>
 >>
 
 /** rule when output=AST and tracking for rewrite */
@@ -258,26 +322,38 @@
 
 /** x+=rule when output=AST and tracking for rewrite */
 ruleRefTrackAndListLabel(rule,label,elementIndex,args,scope) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 _last = (<ASTLabelType>)input.LT(1);
 <super.ruleRefTrackAndListLabel(...)>
+<else>
+<super.ruleRefTrackAndListLabel(...)>
+<endif>
 >>
 
 /** ^(rule ...) rewrite */
 ruleRefRuleRootTrack(rule,label,elementIndex,args,scope) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 _last = (<ASTLabelType>)input.LT(1);
 <super.ruleRefRootTrack(...)>
+<else>
+<super.ruleRefRootTrack(...)>
+<endif>
 >>
 
 /** ^(x+=rule ...) rewrite */
 ruleRefRuleRootTrackAndListLabel(rule,label,elementIndex,args,scope) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 _last = (<ASTLabelType>)input.LT(1);
 <super.ruleRefRuleRootTrackAndListLabel(...)>
+<else>
+<super.ruleRefRuleRootTrackAndListLabel(...)>
+<endif>
 >>
 
 /** Streams for token refs are tree nodes now; override to
  *  change nextToken to nextNode.
  */
-createRewriteNodeFromElement(token,terminalOptions,scope) ::= <<
+createRewriteNodeFromElement(token,args,terminalOptions={}) ::= <<
 <if(terminalOptions.node)>
 new <terminalOptions.node>(stream_<token>.nextNode())
 <else>
@@ -287,9 +363,11 @@
 
 ruleCleanUp() ::= <<
 <super.ruleCleanUp()>
+<if(!ruleDescriptor.isSynPred)>
 <if(!rewriteMode)>
 <if(backtracking)>if ( <actions.(actionScope).synpredgate> ) {<\n><endif>
 retval.tree = (<ASTLabelType>)adaptor.rulePostProcessing(root_0);
 <if(backtracking)>}<endif>
 <endif>
+<endif>
 >>
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/Java/Dbg.stg b/tool/src/main/resources/org/antlr/codegen/templates/Java/Dbg.stg
index b512b2b..e422ed8 100644
--- a/tool/src/main/resources/org/antlr/codegen/templates/Java/Dbg.stg
+++ b/tool/src/main/resources/org/antlr/codegen/templates/Java/Dbg.stg
@@ -36,79 +36,81 @@
 
 @genericParser.members() ::= <<
 <if(grammar.grammarIsRoot)>
-public static final String[] ruleNames = new String[] {
-    "invalidRule", <grammar.allImportedRules:{rST | "<rST.name>"}; wrap="\n    ", separator=", ">
-};<\n>
+	public static final String[] ruleNames = new String[] {
+		"invalidRule", <grammar.allImportedRules:{rST | "<rST.name>"}; wrap="\n\t\t", separator=", ">
+	};<\n>
 <endif>
-public static final boolean[] decisionCanBacktrack = new boolean[] {
-    false, // invalid decision
-    <grammar.decisions:{d | <d.dfa.hasSynPred; null="false">}; wrap="\n    ", separator=", ">
-};<\n>
+	public static final boolean[] decisionCanBacktrack = new boolean[] {
+		false, // invalid decision
+		<grammar.decisions:{d | <d.dfa.hasSynPred; null="false">}; wrap="\n    ", separator=", ">
+	};<\n>
 <if(grammar.grammarIsRoot)> <! grammar imports other grammar(s) !>
-    public int ruleLevel = 0;
-    public int getRuleLevel() { return ruleLevel; }
-    public void incRuleLevel() { ruleLevel++; }
-    public void decRuleLevel() { ruleLevel--; }
+	public int ruleLevel = 0;
+	public int getRuleLevel() { return ruleLevel; }
+	public void incRuleLevel() { ruleLevel++; }
+	public void decRuleLevel() { ruleLevel--; }
 <if(profile)>
-    <ctorForProfilingRootGrammar()>
+	<ctorForProfilingRootGrammar()>
 <else>
-    <ctorForRootGrammar()>
+	<ctorForRootGrammar()>
 <endif>
-<ctorForPredefinedListener()>
-<else> <! imported grammar !>
-    public int getRuleLevel() { return <grammar.delegators:{g| <g:delegateName()>}>.getRuleLevel(); }
-    public void incRuleLevel() { <grammar.delegators:{g| <g:delegateName()>}>.incRuleLevel(); }
-    public void decRuleLevel() { <grammar.delegators:{g| <g:delegateName()>}>.decRuleLevel(); }
-    <ctorForDelegateGrammar()>
+	<ctorForPredefinedListener()>
+<else><! imported grammar !>
+	public int getRuleLevel() { return <grammar.delegators:{g| <g:delegateName()>}>.getRuleLevel(); }
+	public void incRuleLevel() { <grammar.delegators:{g| <g:delegateName()>}>.incRuleLevel(); }
+	public void decRuleLevel() { <grammar.delegators:{g| <g:delegateName()>}>.decRuleLevel(); }
+	<ctorForDelegateGrammar()>
 <endif>
 <if(profile)>
-public boolean alreadyParsedRule(IntStream input, int ruleIndex) {
-	int stopIndex = getRuleMemoization(ruleIndex, input.index());
-    ((Profiler)dbg).examineRuleMemoization(input, ruleIndex, stopIndex, <grammar.composite.rootGrammar.recognizerName>.ruleNames[ruleIndex]);
-    return super.alreadyParsedRule(input, ruleIndex);
-}<\n>
-public void memoize(IntStream input,
-                    int ruleIndex,
-                    int ruleStartIndex)
-{
-    ((Profiler)dbg).memoize(input, ruleIndex, ruleStartIndex, <grammar.composite.rootGrammar.recognizerName>.ruleNames[ruleIndex]);
-    super.memoize(input, ruleIndex, ruleStartIndex);
-}<\n>
+	public boolean alreadyParsedRule(IntStream input, int ruleIndex) {
+		int stopIndex = getRuleMemoization(ruleIndex, input.index());
+		((Profiler)dbg).examineRuleMemoization(input, ruleIndex, stopIndex, <grammar.composite.rootGrammar.recognizerName>.ruleNames[ruleIndex]);
+		return super.alreadyParsedRule(input, ruleIndex);
+	}
+
+	@Override
+	public void memoize(IntStream input,
+						int ruleIndex,
+						int ruleStartIndex)
+	{
+		((Profiler)dbg).memoize(input, ruleIndex, ruleStartIndex, <grammar.composite.rootGrammar.recognizerName>.ruleNames[ruleIndex]);
+		super.memoize(input, ruleIndex, ruleStartIndex);
+	}<\n>
 <endif>
-protected boolean evalPredicate(boolean result, String predicate) {
-    dbg.semanticPredicate(result, predicate);
-    return result;
-}<\n>
+	protected boolean evalPredicate(boolean result, String predicate) {
+		dbg.semanticPredicate(result, predicate);
+		return result;
+	}<\n>
 >>
 
 ctorForRootGrammar() ::= <<
 <! bug: can't use <@super.members()> cut-n-paste instead !>
 <! Same except we add port number and profile stuff if root grammar !>
 public <name>(<inputStreamType> input) {
-    this(input, DebugEventSocketProxy.DEFAULT_DEBUGGER_PORT, new RecognizerSharedState());
+	this(input, DebugEventSocketProxy.DEFAULT_DEBUGGER_PORT, new RecognizerSharedState());
 }
 public <name>(<inputStreamType> input, int port, RecognizerSharedState state) {
-    super(input, state);
-    <parserCtorBody()>
-    <createListenerAndHandshake()>
-    <grammar.directDelegates:{g|<g:delegateName()> = new <g.recognizerName>(input, dbg, this.state, this<grammar.delegators:{g|, <g:delegateName()>}>);}; separator="\n">
-    <@finally()>
+	super(input, state);
+	<parserCtorBody()>
+	<createListenerAndHandshake()>
+	<grammar.directDelegates:{g|<g:delegateName()> = new <g.recognizerName>(input, dbg, this.state, this<grammar.delegators:{g|, <g:delegateName()>}>);}; separator="\n">
+	<@finally()>
 }<\n>
 >>
 
 ctorForProfilingRootGrammar() ::= <<
 <! bug: can't use <@super.members()> cut-n-paste instead !>
 public <name>(<inputStreamType> input) {
-    this(input, new Profiler(null), new RecognizerSharedState());
+	this(input, new Profiler(null), new RecognizerSharedState());
 }
 public <name>(<inputStreamType> input, DebugEventListener dbg, RecognizerSharedState state) {
-    super(input, dbg, state);
-    Profiler p = (Profiler)dbg;
-    p.setParser(this);
-    <parserCtorBody()>
-    <grammar.directDelegates:
-     {g|<g:delegateName()> = new <g.recognizerName>(input, dbg, this.state, this<grammar.delegators:{g|, <g:delegateName()>}>);}; separator="\n">
-    <@finally()>
+	super(input, dbg, state);
+	Profiler p = (Profiler)dbg;
+	p.setParser(this);
+	<parserCtorBody()>
+	<grammar.directDelegates:
+		{g|<g:delegateName()> = new <g.recognizerName>(input, dbg, this.state, this<grammar.delegators:{g|, <g:delegateName()>}>);}; separator="\n">
+	<@finally()>
 }
 <\n>
 >>
@@ -116,40 +118,40 @@
 /** Basically we don't want to set any dbg listeners are root will have it. */
 ctorForDelegateGrammar() ::= <<
 public <name>(<inputStreamType> input, DebugEventListener dbg, RecognizerSharedState state<grammar.delegators:{g|, <g.recognizerName> <g:delegateName()>}>) {
-    super(input, dbg, state);
-    <parserCtorBody()>
-    <grammar.directDelegates:
-     {g|<g:delegateName()> = new <g.recognizerName>(input, this, this.state<grammar.delegators:{g|, <g:delegateName()>}>);}; separator="\n">
+	super(input, dbg, state);
+	<parserCtorBody()>
+	<grammar.directDelegates:
+		{g|<g:delegateName()> = new <g.recognizerName>(input, this, this.state<grammar.delegators:{g|, <g:delegateName()>}>);}; separator="\n">
 }<\n>
 >>
 
 ctorForPredefinedListener() ::= <<
 public <name>(<inputStreamType> input, DebugEventListener dbg) {
-    <@superClassRef>super(input, dbg, new RecognizerSharedState());<@end>
+	<@superClassRef>super(input, dbg, new RecognizerSharedState());<@end>
 <if(profile)>
-    Profiler p = (Profiler)dbg;
-    p.setParser(this);
+	Profiler p = (Profiler)dbg;
+	p.setParser(this);
 <endif>
-    <parserCtorBody()>
-    <grammar.directDelegates:{g|<g:delegateName()> = new <g.recognizerName>(input, dbg, this.state, this<grammar.delegators:{g|, <g:delegateName()>}>);}; separator="\n">
-    <@finally()>
+	<parserCtorBody()>
+	<grammar.directDelegates:{g|<g:delegateName()> = new <g.recognizerName>(input, dbg, this.state, this<grammar.delegators:{g|, <g:delegateName()>}>);}; separator="\n">
+	<@finally()>
 }<\n>
 >>
 
 createListenerAndHandshake() ::= <<
 <if(TREE_PARSER)>
 DebugEventSocketProxy proxy =
-    new DebugEventSocketProxy(this, port, input.getTreeAdaptor());<\n>
+	new DebugEventSocketProxy(this, port, input.getTreeAdaptor());<\n>
 <else>
 DebugEventSocketProxy proxy =
-    new DebugEventSocketProxy(this, port, null);<\n>
+	new DebugEventSocketProxy(this, port, null);<\n>
 <endif>
 setDebugListener(proxy);
 try {
-    proxy.handshake();
+	proxy.handshake();
 }
 catch (IOException ioe) {
-    reportError(ioe);
+	reportError(ioe);
 }
 >>
 
@@ -166,9 +168,9 @@
 dbg.location(<ruleDescriptor.EORNode.line>, <ruleDescriptor.EORNode.charPositionInLine>);<\n>
 }
 finally {
-    dbg.exitRule(getGrammarFileName(), "<ruleName>");
-    decRuleLevel();
-    if ( getRuleLevel()==0 ) {dbg.terminate();}
+	dbg.exitRule(getGrammarFileName(), "<ruleName>");
+	decRuleLevel();
+	if ( getRuleLevel()==0 ) {dbg.terminate();}
 }<\n>
 >>
 
@@ -179,16 +181,16 @@
 // Common debug event triggers used by region overrides below
 
 enterSubRule() ::=
-    "try { dbg.enterSubRule(<decisionNumber>);<\n>"
+	"try { dbg.enterSubRule(<decisionNumber>);<\n>"
 
 exitSubRule() ::=
-    "} finally {dbg.exitSubRule(<decisionNumber>);}<\n>"
+	"} finally {dbg.exitSubRule(<decisionNumber>);}<\n>"
 
 enterDecision() ::=
-    "try { dbg.enterDecision(<decisionNumber>, decisionCanBacktrack[<decisionNumber>]);<\n>"
+	"try { dbg.enterDecision(<decisionNumber>, decisionCanBacktrack[<decisionNumber>]);<\n>"
 
 exitDecision() ::=
-    "} finally {dbg.exitDecision(<decisionNumber>);}<\n>"
+	"} finally {dbg.exitDecision(<decisionNumber>);}<\n>"
 
 enterAlt(n) ::= "dbg.enterAlt(<n>);<\n>"
 
@@ -217,7 +219,7 @@
 @positiveClosureBlock.postdecision() ::= "<exitDecision()>"
 
 @positiveClosureBlock.earlyExitException() ::=
-    "dbg.recognitionException(eee);<\n>"
+	"dbg.recognitionException(eee);<\n>"
 
 @closureBlock.preloop() ::= "<enterSubRule()>"
 
@@ -230,10 +232,10 @@
 @altSwitchCase.prealt() ::= "<enterAlt(altNum)>" // altNum is arg of altSwitchCase
 
 @element.prematch() ::=
-    "dbg.location(<e.line>,<e.pos>);" // e is arg of element
+	"dbg.location(<e.line>,<e.pos>);" // e is arg of element
 
 @matchSet.mismatchedSetException() ::=
-    "dbg.recognitionException(mse);"
+	"dbg.recognitionException(mse);"
 
 @dfaState.noViableAltException() ::= "dbg.recognitionException(nvae);"
 
@@ -241,18 +243,18 @@
 
 dfaDecision(decisionNumber,description) ::= <<
 try {
-    isCyclicDecision = true;
-    <super.dfaDecision(...)>
+	isCyclicDecision = true;
+	<super.dfaDecision(...)>
 }
 catch (NoViableAltException nvae) {
-    dbg.recognitionException(nvae);
-    throw nvae;
+	dbg.recognitionException(nvae);
+	throw nvae;
 }
 >>
 
 @cyclicDFA.errorMethod() ::= <<
 public void error(NoViableAltException nvae) {
-    dbg.recognitionException(nvae);
+	dbg.recognitionException(nvae);
 }
 >>
 
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/Java/Java.stg b/tool/src/main/resources/org/antlr/codegen/templates/Java/Java.stg
index c8ef58c..c4cc8d4 100644
--- a/tool/src/main/resources/org/antlr/codegen/templates/Java/Java.stg
+++ b/tool/src/main/resources/org/antlr/codegen/templates/Java/Java.stg
@@ -77,56 +77,57 @@
 <@end>
 
 <docComment>
-@SuppressWarnings({"all", "warnings", "unchecked"})
+@SuppressWarnings("all")
 <recognizer>
+
 >>
 
 lexer(grammar, name, tokens, scopes, rules, numRules, filterMode, labelType="CommonToken",
       superClass="Lexer") ::= <<
 public class <grammar.recognizerName> extends <@superClassName><superClass><@end> {
-    <tokens:{it | public static final int <it.name>=<it.type>;}; separator="\n">
-    <scopes:{it |<if(it.isDynamicGlobalScope)><globalAttributeScope(it)><endif>}>
-    <actions.lexer.members>
+	<tokens:{it | public static final int <it.name>=<it.type>;}; separator="\n">
+	<scopes:{it |<if(it.isDynamicGlobalScope)><globalAttributeScope(it)><endif>}>
+	<actions.lexer.members>
 
-    // delegates
-    <grammar.delegates:
-         {g|public <g.recognizerName> <g:delegateName()>;}; separator="\n">
-    // delegators
-    <grammar.delegators:
-         {g|public <g.recognizerName> <g:delegateName()>;}; separator="\n">
-    <last(grammar.delegators):{g|public <g.recognizerName> gParent;}>
-    public <superClass>[] getDelegates() {
-        return new <superClass>[] {<grammar.delegates: {g|<g:delegateName()>}; separator = ", ">};
-    }
+	// delegates
+	<grammar.delegates:
+		{g|public <g.recognizerName> <g:delegateName()>;}; separator="\n">
+	// delegators
+	<grammar.delegators:
+		{g|public <g.recognizerName> <g:delegateName()>;}; separator="\n">
+	<last(grammar.delegators):{g|public <g.recognizerName> gParent;}>
+	public <superClass>[] getDelegates() {
+		return new <superClass>[] {<grammar.delegates: {g|<g:delegateName()>}; separator = ", ">};
+	}
 
-    public <grammar.recognizerName>() {} <! needed by subclasses !>
-    public <grammar.recognizerName>(CharStream input<grammar.delegators:{g|, <g.recognizerName> <g:delegateName()>}>) {
-        this(input, new RecognizerSharedState()<grammar.delegators:{g|, <g:delegateName()>}>);
-    }
-    public <grammar.recognizerName>(CharStream input, RecognizerSharedState state<grammar.delegators:{g|, <g.recognizerName> <g:delegateName()>}>) {
-        super(input,state);
+	public <grammar.recognizerName>() {} <! needed by subclasses !>
+	public <grammar.recognizerName>(CharStream input<grammar.delegators:{g|, <g.recognizerName> <g:delegateName()>}>) {
+		this(input, new RecognizerSharedState()<grammar.delegators:{g|, <g:delegateName()>}>);
+	}
+	public <grammar.recognizerName>(CharStream input, RecognizerSharedState state<grammar.delegators:{g|, <g.recognizerName> <g:delegateName()>}>) {
+		super(input,state);
 <if(memoize)>
 <if(grammar.grammarIsRoot)>
-        state.ruleMemo = new HashMap[<numRules>+1];<\n> <! index from 1..n !>
+		state.ruleMemo = new HashMap[<numRules>+1];<\n><! index from 1..n !>
 <endif>
 <endif>
-        <grammar.directDelegates:
-         {g|<g:delegateName()> = new <g.recognizerName>(input, state<trunc(g.delegators):{p|, <p:delegateName()>}>, this);}; separator="\n">
-        <grammar.delegators:
-         {g|this.<g:delegateName()> = <g:delegateName()>;}; separator="\n">
-        <last(grammar.delegators):{g|gParent = <g:delegateName()>;}>
-    }
-    public String getGrammarFileName() { return "<fileName>"; }
+		<grammar.directDelegates:
+			{g|<g:delegateName()> = new <g.recognizerName>(input, state<trunc(g.delegators):{p|, <p:delegateName()>}>, this);}; separator="\n">
+		<grammar.delegators:
+			{g|this.<g:delegateName()> = <g:delegateName()>;}; separator="\n">
+		<last(grammar.delegators):{g|gParent = <g:delegateName()>;}>
+	}
+	@Override public String getGrammarFileName() { return "<fileName>"; }
 
 <if(filterMode)>
-    <filteringNextToken()>
+	<filteringNextToken()>
 <endif>
-    <rules; separator="\n\n">
+	<rules; separator="\n\n">
 
-    <synpreds:{p | <lexerSynpred(p)>}>
+	<synpreds:{p | <lexerSynpred(p)>}>
 
-    <cyclicDFAs:{dfa | protected DFA<dfa.decisionNumber> dfa<dfa.decisionNumber> = new DFA<dfa.decisionNumber>(this);}; separator="\n">
-    <cyclicDFAs:cyclicDFA()> <! dump tables for all DFA !>
+	<cyclicDFAs:{dfa | protected DFA<dfa.decisionNumber> dfa<dfa.decisionNumber> = new DFA<dfa.decisionNumber>(this);}; separator="\n">
+	<cyclicDFAs:cyclicDFA(); separator="\n\n"><! dump tables for all DFA !>
 
 }
 >>
@@ -138,47 +139,49 @@
  *  at backtracking==1.
  */
 filteringNextToken() ::= <<
+@Override
 public Token nextToken() {
-    while (true) {
-        if ( input.LA(1)==CharStream.EOF ) {
-            Token eof = new CommonToken((CharStream)input,Token.EOF,
-                                        Token.DEFAULT_CHANNEL,
-                                        input.index(),input.index());
-            eof.setLine(getLine());
-            eof.setCharPositionInLine(getCharPositionInLine());
-            return eof;
-        }
-        state.token = null;
+	while (true) {
+		if ( input.LA(1)==CharStream.EOF ) {
+			Token eof = new CommonToken(input,Token.EOF,
+										Token.DEFAULT_CHANNEL,
+										input.index(),input.index());
+			eof.setLine(getLine());
+			eof.setCharPositionInLine(getCharPositionInLine());
+			return eof;
+		}
+		state.token = null;
 	state.channel = Token.DEFAULT_CHANNEL;
-        state.tokenStartCharIndex = input.index();
-        state.tokenStartCharPositionInLine = input.getCharPositionInLine();
-        state.tokenStartLine = input.getLine();
+		state.tokenStartCharIndex = input.index();
+		state.tokenStartCharPositionInLine = input.getCharPositionInLine();
+		state.tokenStartLine = input.getLine();
 	state.text = null;
-        try {
-            int m = input.mark();
-            state.backtracking=1; <! means we won't throw slow exception !>
-            state.failed=false;
-            mTokens();
-            state.backtracking=0;
-            <! mTokens backtracks with synpred at backtracking==2
-               and we set the synpredgate to allow actions at level 1. !>
-            if ( state.failed ) {
-                input.rewind(m);
-                input.consume(); <! advance one char and try again !>
-            }
-            else {
-                emit();
-                return state.token;
-            }
-        }
-        catch (RecognitionException re) {
-            // shouldn't happen in backtracking mode, but...
-            reportError(re);
-            recover(re);
-        }
-    }
+		try {
+			int m = input.mark();
+			state.backtracking=1; <! means we won't throw slow exception !>
+			state.failed=false;
+			mTokens();
+			state.backtracking=0;
+			<! mTokens backtracks with synpred at backtracking==2
+				and we set the synpredgate to allow actions at level 1. !>
+			if ( state.failed ) {
+				input.rewind(m);
+				input.consume(); <! advance one char and try again !>
+			}
+			else {
+				emit();
+				return state.token;
+			}
+		}
+		catch (RecognitionException re) {
+			// shouldn't happen in backtracking mode, but...
+			reportError(re);
+			recover(re);
+		}
+	}
 }
 
+@Override
 public void memoize(IntStream input,
 		int ruleIndex,
 		int ruleStartIndex)
@@ -186,6 +189,7 @@
 if ( state.backtracking>1 ) super.memoize(input, ruleIndex, ruleStartIndex);
 }
 
+@Override
 public boolean alreadyParsedRule(IntStream input, int ruleIndex) {
 if ( state.backtracking>1 ) return super.alreadyParsedRule(input, ruleIndex);
 return false;
@@ -203,71 +207,71 @@
               filterMode, ASTLabelType="Object") ::= <<
 public class <grammar.recognizerName> extends <@superClassName><superClass><@end> {
 <if(grammar.grammarIsRoot)>
-    public static final String[] tokenNames = new String[] {
-        "\<invalid>", "\<EOR>", "\<DOWN>", "\<UP>", <tokenNames; separator=", ">
-    };<\n>
+	public static final String[] tokenNames = new String[] {
+		"\<invalid>", "\<EOR>", "\<DOWN>", "\<UP>", <tokenNames; separator=", ", wrap="\n\t\t">
+	};
 <endif>
-    <tokens:{it |public static final int <it.name>=<it.type>;}; separator="\n">
+	<tokens:{it |public static final int <it.name>=<it.type>;}; separator="\n">
 
-    // delegates
-    <grammar.delegates: {g|public <g.recognizerName> <g:delegateName()>;}; separator="\n">
-    public <superClass>[] getDelegates() {
-        return new <superClass>[] {<grammar.delegates: {g|<g:delegateName()>}; separator = ", ">};
-    }
+	// delegates
+	<grammar.delegates: {g|public <g.recognizerName> <g:delegateName()>;}; separator="\n">
+	public <superClass>[] getDelegates() {
+		return new <superClass>[] {<grammar.delegates: {g|<g:delegateName()>}; separator = ", ">};
+	}
 
-    // delegators
-    <grammar.delegators:
-         {g|public <g.recognizerName> <g:delegateName()>;}; separator="\n">
-    <last(grammar.delegators):{g|public <g.recognizerName> gParent;}>
+	// delegators
+	<grammar.delegators:
+		{g|public <g.recognizerName> <g:delegateName()>;}; separator="\n">
+	<last(grammar.delegators):{g|public <g.recognizerName> gParent;}>
 
-    <scopes:{it |<if(it.isDynamicGlobalScope)><globalAttributeScope(it)><endif>}>
+	<scopes:{it |<if(it.isDynamicGlobalScope)><globalAttributeScope(it)><endif>}>
 
-    <@members>
-    <! WARNING. bug in ST: this is cut-n-paste into Dbg.stg !>
-    public <grammar.recognizerName>(<inputStreamType> input<grammar.delegators:{g|, <g.recognizerName> <g:delegateName()>}>) {
-        this(input, new RecognizerSharedState()<grammar.delegators:{g|, <g:delegateName()>}>);
-    }
-    public <grammar.recognizerName>(<inputStreamType> input, RecognizerSharedState state<grammar.delegators:{g|, <g.recognizerName> <g:delegateName()>}>) {
-        super(input, state);
-        <parserCtorBody()>
-        <grammar.directDelegates:
-         {g|<g:delegateName()> = new <g.recognizerName>(input, state<trunc(g.delegators):{p|, <p:delegateName()>}>, this);}; separator="\n">
-        <grammar.indirectDelegates:{g | <g:delegateName()> = <g.delegator:delegateName()>.<g:delegateName()>;}; separator="\n">
-        <last(grammar.delegators):{g|gParent = <g:delegateName()>;}>
-    }
-    <@end>
+<@members>
+	<! WARNING. bug in ST: this is cut-n-paste into Dbg.stg !>
+	public <grammar.recognizerName>(<inputStreamType> input<grammar.delegators:{g|, <g.recognizerName> <g:delegateName()>}>) {
+		this(input, new RecognizerSharedState()<grammar.delegators:{g|, <g:delegateName()>}>);
+	}
+	public <grammar.recognizerName>(<inputStreamType> input, RecognizerSharedState state<grammar.delegators:{g|, <g.recognizerName> <g:delegateName()>}>) {
+		super(input, state);
+		<parserCtorBody()>
+		<grammar.directDelegates:
+			{g|<g:delegateName()> = new <g.recognizerName>(input, state<trunc(g.delegators):{p|, <p:delegateName()>}>, this);}; separator="\n">
+		<grammar.indirectDelegates:{g | <g:delegateName()> = <g.delegator:delegateName()>.<g:delegateName()>;}; separator="\n">
+		<last(grammar.delegators):{g|gParent = <g:delegateName()>;}>
+	}
+<@end>
 
-    public String[] getTokenNames() { return <grammar.composite.rootGrammar.recognizerName>.tokenNames; }
-    public String getGrammarFileName() { return "<fileName>"; }
+	@Override public String[] getTokenNames() { return <grammar.composite.rootGrammar.recognizerName>.tokenNames; }
+	@Override public String getGrammarFileName() { return "<fileName>"; }
 
-    <members>
+	<members>
 
-    <rules; separator="\n\n">
+	<rules; separator="\n\n">
 
 <! generate rule/method definitions for imported rules so they
    appear to be defined in this recognizer. !>
-    // Delegated rules
+	// Delegated rules
 <grammar.delegatedRules:{ruleDescriptor|
-    public <returnType()> <ruleDescriptor.name>(<ruleDescriptor.parameterScope:parameterScope()>) throws <ruleDescriptor.throwsSpec; separator=", "> { <if(ruleDescriptor.hasReturnValue)>return <endif><ruleDescriptor.grammar:delegateName()>.<ruleDescriptor.name>(<ruleDescriptor.parameterScope.attributes:{a|<a.name>}; separator=", ">); \}}; separator="\n">
+	public <returnType(ruleDescriptor)> <ruleDescriptor.name>(<ruleDescriptor.parameterScope:parameterScope()>) throws <ruleDescriptor.throwsSpec; separator=", "> { <if(ruleDescriptor.hasReturnValue)>return <endif><ruleDescriptor.grammar:delegateName()>.<ruleDescriptor.name>(<if(ruleDescriptor.parameterScope)><ruleDescriptor.parameterScope.attributes:{a|<a.name>}; separator=", "><endif>); \}}; separator="\n">
 
-    <synpreds:{p | <synpred(p)>}>
+	<synpreds:{p | <synpred(p)>}>
 
-    <cyclicDFAs:{dfa | protected DFA<dfa.decisionNumber> dfa<dfa.decisionNumber> = new DFA<dfa.decisionNumber>(this);}; separator="\n">
-    <cyclicDFAs:cyclicDFA()> <! dump tables for all DFA !>
+	<cyclicDFAs:{dfa | protected DFA<dfa.decisionNumber> dfa<dfa.decisionNumber> = new DFA<dfa.decisionNumber>(this);}; separator="\n">
+	<cyclicDFAs:cyclicDFA(); separator="\n\n"><! dump tables for all DFA !>
 
-    <bitsets:{it | <bitset(name={FOLLOW_<it.name>_in_<it.inName><it.tokenIndex>},
-                          words64=it.bits)>}>
+	<bitsets:{it | <bitset(name={FOLLOW_<it.name>_in_<it.inName><it.tokenIndex>},
+							words64=it.bits)>}; separator="\n">
 }
 >>
 
 parserCtorBody() ::= <<
 <if(memoize)>
 <if(grammar.grammarIsRoot)>
-this.state.ruleMemo = new HashMap[<length(grammar.allImportedRules)>+1];<\n> <! index from 1..n !>
+this.state.ruleMemo = new HashMap[<length(grammar.allImportedRules)>+1];<\n><! index from 1..n !>
 <endif>
 <endif>
 <grammar.delegators:
- {g|this.<g:delegateName()> = <g:delegateName()>;}; separator="\n">
+	{g|this.<g:delegateName()> = <g:delegateName()>;}; separator="\n">
 >>
 
 parser(grammar, name, scopes, tokens, tokenNames, rules, numRules, bitsets,
@@ -304,17 +308,17 @@
 <<
 // $ANTLR start <ruleName>
 public final void <ruleName>_fragment(<ruleDescriptor.parameterScope:parameterScope()>) throws <ruleDescriptor.throwsSpec:{x|<x>}; separator=", "> {
-    <ruleLabelDefs()>
+	<ruleLabelDefs()>
 <if(trace)>
-    traceIn("<ruleName>_fragment", <ruleDescriptor.index>);
-    try {
-        <block>
-    }
-    finally {
-        traceOut("<ruleName>_fragment", <ruleDescriptor.index>);
-    }
+	traceIn("<ruleName>_fragment", <ruleDescriptor.index>);
+	try {
+		<block>
+	}
+	finally {
+		traceOut("<ruleName>_fragment", <ruleDescriptor.index>);
+	}
 <else>
-    <block>
+	<block>
 <endif>
 }
 // $ANTLR end <ruleName>
@@ -322,20 +326,20 @@
 
 synpred(name) ::= <<
 public final boolean <name>() {
-    state.backtracking++;
-    <@start()>
-    int start = input.mark();
-    try {
-        <name>_fragment(); // can never throw exception
-    } catch (RecognitionException re) {
-        System.err.println("impossible: "+re);
-    }
-    boolean success = !state.failed;
-    input.rewind(start);
-    <@stop()>
-    state.backtracking--;
-    state.failed=false;
-    return success;
+	state.backtracking++;
+	<@start()>
+	int start = input.mark();
+	try {
+		<name>_fragment(); // can never throw exception
+	} catch (RecognitionException re) {
+		System.err.println("impossible: "+re);
+	}
+	boolean success = !state.failed;
+	input.rewind(start);
+	<@stop()>
+	state.backtracking--;
+	state.failed=false;
+	return success;
 }<\n>
 >>
 
@@ -345,18 +349,18 @@
 
 ruleMemoization(name) ::= <<
 <if(memoize)>
-if ( state.backtracking>0 && alreadyParsedRule(input, <ruleDescriptor.index>) ) { return <ruleReturnValue()>; }
+if ( state.backtracking>0 && alreadyParsedRule(input, <ruleDescriptor.index>) ) { <returnStatement(({<ruleReturnValue()>}))> }
 <endif>
 >>
 
 /** How to test for failure and return from rule */
 checkRuleBacktrackFailure() ::= <<
-<if(backtracking)>if (state.failed) return <ruleReturnValue()>;<endif>
+<if(backtracking)>if (state.failed) <returnStatement(({<ruleReturnValue()>}))><endif>
 >>
 
 /** This rule has failed, exit indicating failure during backtrack */
 ruleBacktrackFailure() ::= <<
-<if(backtracking)>if (state.backtracking>0) {state.failed=true; return <ruleReturnValue()>;}<endif>
+<if(backtracking)>if (state.backtracking>0) {state.failed=true; <returnStatement(({<ruleReturnValue()>}))>}<endif>
 >>
 
 /** How to generate code for a rule.  This includes any return type
@@ -368,58 +372,69 @@
 
 // $ANTLR start "<ruleName>"
 // <fileName>:<description>
-public final <returnType()> <ruleName>(<ruleDescriptor.parameterScope:parameterScope()>) throws <ruleDescriptor.throwsSpec:{x|<x>}; separator=", "> {
-    <if(trace)>traceIn("<ruleName>", <ruleDescriptor.index>);<endif>
-    <ruleScopeSetUp()>
-    <ruleDeclarations()>
-    <ruleLabelDefs()>
-    <ruleDescriptor.actions.init>
-    <@preamble()>
-    try {
-        <ruleMemoization(name=ruleName)>
-        <block>
-        <ruleCleanUp()>
-        <(ruleDescriptor.actions.after):execAction()>
-    }
+<if(isPredefinedRewriteRule.(ruleName) && filterMode && buildAST)>
+@Override
+<endif>
+public final <returnType(ruleDescriptor)> <ruleName>(<ruleDescriptor.parameterScope:parameterScope()>) throws <ruleDescriptor.throwsSpec:{x|<x>}; separator=", "> {
+	<if(trace)>traceIn("<ruleName>", <ruleDescriptor.index>);<endif>
+	<ruleScopeSetUp()>
+	<ruleDeclarations()>
+	<ruleLabelDefs()>
+	<ruleDescriptor.actions.init>
+	<@preamble()>
+	try {
+		<ruleMemoization(name=ruleName)>
+		<block>
+		<ruleCleanUp()>
+		<(ruleDescriptor.actions.after):execAction()>
+	}
 <if(exceptions)>
-    <exceptions:{e|<catch(decl=e.decl,action=e.action)><\n>}>
+	<exceptions:{e|<catch(decl=e.decl,action=e.action)><\n>}>
 <else>
 <if(!emptyRule)>
 <if(actions.(actionScope).rulecatch)>
-    <actions.(actionScope).rulecatch>
+	<actions.(actionScope).rulecatch>
 <else>
-    catch (RecognitionException re) {
-        reportError(re);
-        recover(input,re);
-	<@setErrorReturnValue()>
-    }<\n>
+	catch (RecognitionException re) {
+		reportError(re);
+		recover(input,re);
+		<@setErrorReturnValue()>
+	}
 <endif>
 <endif>
 <endif>
-    finally {
-    	// do for sure before leaving
-        <if(trace)>traceOut("<ruleName>", <ruleDescriptor.index>);<endif>
-        <memoize()>
-        <ruleScopeCleanUp()>
-        <finally>
-    }
-    <@postamble()>
-    return <ruleReturnValue()>;
+	finally {
+		// do for sure before leaving
+		<if(trace)>traceOut("<ruleName>", <ruleDescriptor.index>);<endif>
+		<memoize()>
+		<ruleScopeCleanUp()>
+		<finally>
+	}
+	<@postamble()>
+	<returnStatement(({<ruleReturnValue()>}), false)>
 }
 // $ANTLR end "<ruleName>"
 >>
 
+returnStatement(returnValue, force=true) ::= <%
+<if(!isEmptyString.(returnValue))>
+	return <returnValue>;
+<elseif(force)>
+	return;
+<endif>
+%>
+
 catch(decl,action) ::= <<
 catch (<e.decl>) {
-    <e.action>
+	<e.action>
 }
 >>
 
 ruleDeclarations() ::= <<
 <if(ruleDescriptor.hasMultipleReturnValues)>
-<returnType()> retval = new <returnType()>();
-retval.start = input.LT(1);<\n>
-<else>
+<returnType(ruleDescriptor)> retval = new <returnType(ruleDescriptor)>();
+retval.start = input.LT(1);
+<elseif(ruleDescriptor.returnScope)>
 <ruleDescriptor.returnScope.attributes:{ a |
 <a.type> <a.name> = <if(a.initValue)><a.initValue><else><initValue(a.type)><endif>;
 }>
@@ -443,10 +458,10 @@
 ruleLabelDefs() ::= <<
 <[ruleDescriptor.tokenLabels,ruleDescriptor.tokenListLabels,
   ruleDescriptor.wildcardTreeLabels,ruleDescriptor.wildcardTreeListLabels]
-    :{it |<labelType> <it.label.text>=null;}; separator="\n"
+	:{it |<labelType> <it.label.text>=null;}; separator="\n"
 >
 <[ruleDescriptor.tokenListLabels,ruleDescriptor.ruleListLabels,ruleDescriptor.wildcardTreeListLabels]
-    :{it |List list_<it.label.text>=null;}; separator="\n"
+	:{it |List\<Object> list_<it.label.text>=null;}; separator="\n"
 >
 <ruleDescriptor.ruleLabels:ruleLabelDef(); separator="\n">
 <ruleDescriptor.ruleListLabels:{ll|RuleReturnScope <ll.label.text> = null;}; separator="\n">
@@ -456,12 +471,12 @@
 <[ruleDescriptor.tokenLabels,
   ruleDescriptor.tokenListLabels,
   ruleDescriptor.ruleLabels]
-    :{it |<labelType> <it.label.text>=null;}; separator="\n"
+	:{it |<labelType> <it.label.text>=null;}; separator="\n"
 >
 <ruleDescriptor.charLabels:{it |int <it.label.text>;}; separator="\n">
 <[ruleDescriptor.tokenListLabels,
   ruleDescriptor.ruleListLabels]
-    :{it |List list_<it.label.text>=null;}; separator="\n"
+	:{it |List\<Object> list_<it.label.text>=null;}; separator="\n"
 >
 >>
 
@@ -480,7 +495,7 @@
 ruleCleanUp() ::= <<
 <if(ruleDescriptor.hasMultipleReturnValues)>
 <if(!TREE_PARSER)>
-retval.stop = input.LT(-1);<\n>
+retval.stop = input.LT(-1);
 <endif>
 <endif>
 >>
@@ -499,34 +514,34 @@
 lexerRule(ruleName,nakedBlock,ruleDescriptor,block,memoize) ::= <<
 // $ANTLR start "<ruleName>"
 public final void m<ruleName>(<ruleDescriptor.parameterScope:parameterScope()>) throws RecognitionException {
-    <if(trace)>traceIn("<ruleName>", <ruleDescriptor.index>);<endif>
-    <ruleScopeSetUp()>
-    <ruleDeclarations()>
-    try {
+	<if(trace)>traceIn("<ruleName>", <ruleDescriptor.index>);<endif>
+	<ruleScopeSetUp()>
+	<ruleDeclarations()>
+	try {
 <if(nakedBlock)>
-        <ruleMemoization(name=ruleName)>
-        <lexerRuleLabelDefs()>
-        <ruleDescriptor.actions.init>
-        <block><\n>
+		<ruleMemoization(name=ruleName)>
+		<lexerRuleLabelDefs()>
+		<ruleDescriptor.actions.init>
+		<block>
 <else>
-        int _type = <ruleName>;
-        int _channel = DEFAULT_TOKEN_CHANNEL;
-        <ruleMemoization(name=ruleName)>
-        <lexerRuleLabelDefs()>
-        <ruleDescriptor.actions.init>
-        <block>
-        <ruleCleanUp()>
-        state.type = _type;
-        state.channel = _channel;
-        <(ruleDescriptor.actions.after):execAction()>
+		int _type = <ruleName>;
+		int _channel = DEFAULT_TOKEN_CHANNEL;
+		<ruleMemoization(name=ruleName)>
+		<lexerRuleLabelDefs()>
+		<ruleDescriptor.actions.init>
+		<block>
+		<ruleCleanUp()>
+		state.type = _type;
+		state.channel = _channel;
+		<(ruleDescriptor.actions.after):execAction()>
 <endif>
-    }
-    finally {
-    	// do for sure before leaving
-        <if(trace)>traceOut("<ruleName>", <ruleDescriptor.index>);<endif>
-        <ruleScopeCleanUp()>
-        <memoize()>
-    }
+	}
+	finally {
+		// do for sure before leaving
+		<if(trace)>traceOut("<ruleName>", <ruleDescriptor.index>);<endif>
+		<ruleScopeCleanUp()>
+		<memoize()>
+	}
 }
 // $ANTLR end "<ruleName>"
 >>
@@ -535,8 +550,9 @@
  *  that chooses between lexer rules.
  */
 tokensRule(ruleName,nakedBlock,args,block,ruleDescriptor) ::= <<
+@Override
 public void mTokens() throws RecognitionException {
-    <block><\n>
+	<block>
 }
 >>
 
@@ -552,7 +568,7 @@
 <@postdecision()>
 <@prebranch()>
 switch (alt<decisionNumber>) {
-    <alts:{a | <altSwitchCase(i,a)>}>
+	<alts:{a | <altSwitchCase(i,a)>}>
 }
 <@postbranch()>
 >>
@@ -566,7 +582,7 @@
 <decision>
 <@postdecision()>
 switch (alt<decisionNumber>) {
-    <alts:{a | <altSwitchCase(i,a)>}>
+	<alts:{a | <altSwitchCase(i,a)>}>
 }
 >>
 
@@ -594,23 +610,22 @@
 <decls>
 <@preloop()>
 loop<decisionNumber>:
-do {
-    int alt<decisionNumber>=<maxAlt>;
-    <@predecision()>
-    <decision>
-    <@postdecision()>
-    switch (alt<decisionNumber>) {
+while (true) {
+	int alt<decisionNumber>=<maxAlt>;
+	<@predecision()>
+	<decision>
+	<@postdecision()>
+	switch (alt<decisionNumber>) {
 	<alts:{a | <altSwitchCase(i,a)>}>
 	default :
-	    if ( cnt<decisionNumber> >= 1 ) break loop<decisionNumber>;
-	    <ruleBacktrackFailure()>
-            EarlyExitException eee =
-                new EarlyExitException(<decisionNumber>, input);
-            <@earlyExitException()>
-            throw eee;
-    }
-    cnt<decisionNumber>++;
-} while (true);
+		if ( cnt<decisionNumber> >= 1 ) break loop<decisionNumber>;
+		<ruleBacktrackFailure()>
+		EarlyExitException eee = new EarlyExitException(<decisionNumber>, input);
+		<@earlyExitException()>
+		throw eee;
+	}
+	cnt<decisionNumber>++;
+}
 <@postloop()>
 >>
 
@@ -622,17 +637,17 @@
 <decls>
 <@preloop()>
 loop<decisionNumber>:
-do {
-    int alt<decisionNumber>=<maxAlt>;
-    <@predecision()>
-    <decision>
-    <@postdecision()>
-    switch (alt<decisionNumber>) {
+while (true) {
+	int alt<decisionNumber>=<maxAlt>;
+	<@predecision()>
+	<decision>
+	<@postdecision()>
+	switch (alt<decisionNumber>) {
 	<alts:{a | <altSwitchCase(i,a)>}>
 	default :
-	    break loop<decisionNumber>;
-    }
-} while (true);
+		break loop<decisionNumber>;
+	}
+}
 <@postloop()>
 >>
 
@@ -651,9 +666,9 @@
  */
 altSwitchCase(altNum,alt) ::= <<
 case <altNum> :
-    <@prealt()>
-    <alt>
-    break;<\n>
+	<@prealt()>
+	<alt>
+	break;<\n>
 >>
 
 /** An alternative is just a list of elements; at outermost level */
@@ -677,29 +692,29 @@
 /** Dump the elements one per line */
 element(e) ::= <<
 <@prematch()>
-<e.el><\n>
+<e.el>
 >>
 
 /** match a token optionally with a label in front */
-tokenRef(token,label,elementIndex,terminalOptions) ::= <<
+tokenRef(token,label,elementIndex,terminalOptions={}) ::= <<
 <if(label)><label>=(<labelType>)<endif>match(input,<token>,FOLLOW_<token>_in_<ruleName><elementIndex>); <checkRuleBacktrackFailure()>
 >>
 
 /** ids+=ID */
-tokenRefAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
+tokenRefAndListLabel(token,label,elementIndex,terminalOptions={}) ::= <<
 <tokenRef(token,label,elementIndex,terminalOptions)>
 <listLabel(label, label)>
 >>
 
 listLabel(label,elem) ::= <<
-if (list_<label>==null) list_<label>=new ArrayList();
-list_<label>.add(<elem>);<\n>
+if (list_<label>==null) list_<label>=new ArrayList\<Object>();
+list_<label>.add(<elem>);
 >>
 
 /** match a character */
 charRef(char,label) ::= <<
 <if(label)>
-<label> = input.LA(1);<\n>
+<label> = input.LA(1);
 <endif>
 match(<char>); <checkRuleBacktrackFailure()>
 >>
@@ -707,42 +722,42 @@
 /** match a character range */
 charRangeRef(a,b,label) ::= <<
 <if(label)>
-<label> = input.LA(1);<\n>
+<label> = input.LA(1);
 <endif>
 matchRange(<a>,<b>); <checkRuleBacktrackFailure()>
 >>
 
 /** For now, sets are interval tests and must be tested inline */
-matchSet(s,label,elementIndex,terminalOptions,postmatchCode="") ::= <<
+matchSet(s,label,elementIndex,postmatchCode="",terminalOptions={}) ::= <<
 <if(label)>
 <if(LEXER)>
-<label>= input.LA(1);<\n>
+<label>= input.LA(1);
 <else>
-<label>=(<labelType>)input.LT(1);<\n>
+<label>=<castToLabelType("input.LT(1)")>;
 <endif>
 <endif>
 if ( <s> ) {
-    input.consume();
-    <postmatchCode>
+	input.consume();
+	<postmatchCode>
 <if(!LEXER)>
-    state.errorRecovery=false;
+	state.errorRecovery=false;
 <endif>
-    <if(backtracking)>state.failed=false;<endif>
+	<if(backtracking)>state.failed=false;<endif>
 }
 else {
-    <ruleBacktrackFailure()>
-    MismatchedSetException mse = new MismatchedSetException(null,input);
-    <@mismatchedSetException()>
+	<ruleBacktrackFailure()>
+	MismatchedSetException mse = new MismatchedSetException(null,input);
+	<@mismatchedSetException()>
 <if(LEXER)>
-    recover(mse);
-    throw mse;
+	recover(mse);
+	throw mse;
 <else>
-    throw mse;
-    <! use following code to make it recover inline; remove throw mse;
-    recoverFromMismatchedSet(input,mse,FOLLOW_set_in_<ruleName><elementIndex>);
-    !>
+	throw mse;
+	<! use following code to make it recover inline; remove throw mse;
+	recoverFromMismatchedSet(input,mse,FOLLOW_set_in_<ruleName><elementIndex>);
+	!>
 <endif>
-}<\n>
+}
 >>
 
 matchRuleBlockSet ::= matchSet
@@ -763,18 +778,18 @@
 <label>.setLine(<label>StartLine<elementIndex>);
 <label>.setCharPositionInLine(<label>StartCharPos<elementIndex>);
 <else>
-match(<string>); <checkRuleBacktrackFailure()><\n>
+match(<string>); <checkRuleBacktrackFailure()>
 <endif>
 >>
 
-wildcard(token,label,elementIndex,terminalOptions) ::= <<
+wildcard(token,label,elementIndex,terminalOptions={}) ::= <<
 <if(label)>
-<label>=(<labelType>)input.LT(1);<\n>
+<label>=<castToLabelType("input.LT(1)")>;
 <endif>
 matchAny(input); <checkRuleBacktrackFailure()>
 >>
 
-wildcardAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
+wildcardAndListLabel(token,label,elementIndex,terminalOptions={}) ::= <<
 <wildcard(...)>
 <listLabel(label, label)>
 >>
@@ -782,7 +797,7 @@
 /** Match . wildcard in lexer */
 wildcardChar(label, elementIndex) ::= <<
 <if(label)>
-<label> = input.LA(1);<\n>
+<label> = input.LA(1);
 <endif>
 matchAny(); <checkRuleBacktrackFailure()>
 >>
@@ -800,7 +815,7 @@
  */
 ruleRef(rule,label,elementIndex,args,scope) ::= <<
 pushFollow(FOLLOW_<rule.name>_in_<ruleName><elementIndex>);
-<if(label)><label>=<endif><if(scope)><scope:delegateName()>.<endif><rule.name>(<args; separator=", ">);<\n>
+<if(label)><label>=<endif><if(scope)><scope:delegateName()>.<endif><rule.name>(<args; separator=", ">);
 state._fsp--;
 <checkRuleBacktrackFailure()>
 >>
@@ -866,9 +881,9 @@
 <actionsAfterRoot:element()>
 <if(nullableChildList)>
 if ( input.LA(1)==Token.DOWN ) {
-    match(input, Token.DOWN, null); <checkRuleBacktrackFailure()>
-    <children:element()>
-    match(input, Token.UP, null); <checkRuleBacktrackFailure()>
+	match(input, Token.DOWN, null); <checkRuleBacktrackFailure()>
+	<children:element()>
+	match(input, Token.UP, null); <checkRuleBacktrackFailure()>
 }
 <else>
 match(input, Token.DOWN, null); <checkRuleBacktrackFailure()>
@@ -882,27 +897,61 @@
  */
 validateSemanticPredicate(pred,description) ::= <<
 if ( !(<evalPredicate(pred,description)>) ) {
-    <ruleBacktrackFailure()>
-    throw new FailedPredicateException(input, "<ruleName>", "<description>");
+	<ruleBacktrackFailure()>
+	throw new FailedPredicateException(input, "<ruleName>", "<description>");
 }
 >>
 
 // F i x e d  D F A  (if-then-else)
 
 dfaState(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
-int LA<decisionNumber>_<stateNumber> = input.LA(<k>);<\n>
+int LA<decisionNumber>_<stateNumber> = input.LA(<k>);
 <edges; separator="\nelse ">
+<if((!isTrue.(last(edges).labelExpr)) && (!last(edges).predicates))>
 else {
 <if(eotPredictsAlt)>
-    alt<decisionNumber>=<eotPredictsAlt>;
+	alt<decisionNumber>=<eotPredictsAlt>;
 <else>
-    <ruleBacktrackFailure()>
-    NoViableAltException nvae =
-        new NoViableAltException("<description>", <decisionNumber>, <stateNumber>, input);<\n>
-    <@noViableAltException()>
-    throw nvae;<\n>
+	<ruleBacktrackFailure()>
+	<(nvaExceptionWrapperMap.(k))({NoViableAltException nvae =
+	new NoViableAltException("<description>", <decisionNumber>, <stateNumber>, input);
+<@noViableAltException()>
+throw nvae;})>
 <endif>
 }
+<endif>
+>>
+
+nvaExceptionWrapperMap ::= [
+	"1":"wrapNvaExceptionForK1",
+	"2":"wrapNvaExceptionForK2",
+	default:"wrapNvaExceptionForKN"
+]
+
+wrapNvaExceptionForK1(exceptionCode) ::= <<
+<exceptionCode>
+>>
+
+wrapNvaExceptionForK2(exceptionCode) ::= <<
+int nvaeMark = input.mark();
+try {
+	input.consume();
+	<exceptionCode>
+} finally {
+	input.rewind(nvaeMark);
+}
+>>
+
+wrapNvaExceptionForKN(exceptionCode) ::= <<
+int nvaeMark = input.mark();
+try {
+	for (int nvaeConsume = 0; nvaeConsume \< <k> - 1; nvaeConsume++) {
+		input.consume();
+	}
+	<exceptionCode>
+} finally {
+	input.rewind(nvaeMark);
+}
 >>
 
 /** Same as a normal DFA state except that we don't examine lookahead
@@ -911,7 +960,7 @@
  *  expect "if ( LA(1)==X ) match(X);" and that's it.
  */
 dfaOptionalBlockState(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
-int LA<decisionNumber>_<stateNumber> = input.LA(<k>);<\n>
+int LA<decisionNumber>_<stateNumber> = input.LA(<k>);
 <edges; separator="\nelse ">
 >>
 
@@ -922,15 +971,15 @@
  *  anything other than 'a' predicts exiting.
  */
 dfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
-int LA<decisionNumber>_<stateNumber> = input.LA(<k>);<\n>
-<edges; separator="\nelse "><\n>
+int LA<decisionNumber>_<stateNumber> = input.LA(<k>);
+<edges; separator="\nelse ">
 <if(eotPredictsAlt)>
 <if(!edges)>
 alt<decisionNumber>=<eotPredictsAlt>; <! if no edges, don't gen ELSE !>
 <else>
 else {
-    alt<decisionNumber>=<eotPredictsAlt>;
-}<\n>
+	alt<decisionNumber>=<eotPredictsAlt>;
+}
 <endif>
 <endif>
 >>
@@ -944,7 +993,7 @@
  */
 dfaEdge(labelExpr, targetState, predicates) ::= <<
 if ( (<labelExpr>) <if(predicates)>&& (<predicates>)<endif>) {
-    <targetState>
+	<targetState>
 }
 >>
 
@@ -958,40 +1007,40 @@
 <edges; separator="\n">
 default:
 <if(eotPredictsAlt)>
-    alt<decisionNumber>=<eotPredictsAlt>;
+	alt<decisionNumber>=<eotPredictsAlt>;
 <else>
-    <ruleBacktrackFailure()>
-    NoViableAltException nvae =
-        new NoViableAltException("<description>", <decisionNumber>, <stateNumber>, input);<\n>
-    <@noViableAltException()>
-    throw nvae;<\n>
+	<ruleBacktrackFailure()>
+	<(nvaExceptionWrapperMap.(k))({NoViableAltException nvae =
+	new NoViableAltException("<description>", <decisionNumber>, <stateNumber>, input);
+<@noViableAltException()>
+throw nvae;})>
 <endif>
-}<\n>
+}
 >>
 
 dfaOptionalBlockStateSwitch(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
 switch ( input.LA(<k>) ) {
-    <edges; separator="\n">
-}<\n>
+	<edges; separator="\n">
+}
 >>
 
 dfaLoopbackStateSwitch(k, edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
 switch ( input.LA(<k>) ) {
-<edges; separator="\n"><\n>
+<edges; separator="\n">
 <if(eotPredictsAlt)>
 default:
-    alt<decisionNumber>=<eotPredictsAlt>;
-    break;<\n>
+	alt<decisionNumber>=<eotPredictsAlt>;
+	break;
 <endif>
-}<\n>
+}
 >>
 
 dfaEdgeSwitch(labels, targetState) ::= <<
 <labels:{it |case <it>:}; separator="\n">
-    {
-    <targetState>
-    }
-    break;
+	{
+	<targetState>
+	}
+	break;
 >>
 
 // C y c l i c  D F A
@@ -1014,19 +1063,19 @@
  */
 cyclicDFA(dfa) ::= <<
 static final String DFA<dfa.decisionNumber>_eotS =
-    "<dfa.javaCompressedEOT; wrap="\"+\n    \"">";
+	"<dfa.javaCompressedEOT; wrap="\"+\n\t\"">";
 static final String DFA<dfa.decisionNumber>_eofS =
-    "<dfa.javaCompressedEOF; wrap="\"+\n    \"">";
+	"<dfa.javaCompressedEOF; wrap="\"+\n\t\"">";
 static final String DFA<dfa.decisionNumber>_minS =
-    "<dfa.javaCompressedMin; wrap="\"+\n    \"">";
+	"<dfa.javaCompressedMin; wrap="\"+\n\t\"">";
 static final String DFA<dfa.decisionNumber>_maxS =
-    "<dfa.javaCompressedMax; wrap="\"+\n    \"">";
+	"<dfa.javaCompressedMax; wrap="\"+\n\t\"">";
 static final String DFA<dfa.decisionNumber>_acceptS =
-    "<dfa.javaCompressedAccept; wrap="\"+\n    \"">";
+	"<dfa.javaCompressedAccept; wrap="\"+\n\t\"">";
 static final String DFA<dfa.decisionNumber>_specialS =
-    "<dfa.javaCompressedSpecial; wrap="\"+\n    \"">}>";
+	"<dfa.javaCompressedSpecial; wrap="\"+\n\t\"">}>";
 static final String[] DFA<dfa.decisionNumber>_transitionS = {
-        <dfa.javaCompressedTransition:{s|"<s; wrap="\"+\n\"">"}; separator=",\n">
+		<dfa.javaCompressedTransition:{s|"<s; wrap="\"+\n\"">"}; separator=",\n">
 };
 
 static final short[] DFA<dfa.decisionNumber>_eot = DFA.unpackEncodedString(DFA<dfa.decisionNumber>_eotS);
@@ -1038,72 +1087,74 @@
 static final short[][] DFA<dfa.decisionNumber>_transition;
 
 static {
-    int numStates = DFA<dfa.decisionNumber>_transitionS.length;
-    DFA<dfa.decisionNumber>_transition = new short[numStates][];
-    for (int i=0; i\<numStates; i++) {
-        DFA<dfa.decisionNumber>_transition[i] = DFA.unpackEncodedString(DFA<dfa.decisionNumber>_transitionS[i]);
-    }
+	int numStates = DFA<dfa.decisionNumber>_transitionS.length;
+	DFA<dfa.decisionNumber>_transition = new short[numStates][];
+	for (int i=0; i\<numStates; i++) {
+		DFA<dfa.decisionNumber>_transition[i] = DFA.unpackEncodedString(DFA<dfa.decisionNumber>_transitionS[i]);
+	}
 }
 
-class DFA<dfa.decisionNumber> extends DFA {
+protected class DFA<dfa.decisionNumber> extends DFA {
 
-    public DFA<dfa.decisionNumber>(BaseRecognizer recognizer) {
-        this.recognizer = recognizer;
-        this.decisionNumber = <dfa.decisionNumber>;
-        this.eot = DFA<dfa.decisionNumber>_eot;
-        this.eof = DFA<dfa.decisionNumber>_eof;
-        this.min = DFA<dfa.decisionNumber>_min;
-        this.max = DFA<dfa.decisionNumber>_max;
-        this.accept = DFA<dfa.decisionNumber>_accept;
-        this.special = DFA<dfa.decisionNumber>_special;
-        this.transition = DFA<dfa.decisionNumber>_transition;
-    }
-    public String getDescription() {
-        return "<dfa.description>";
-    }
-    <@errorMethod()>
+	public DFA<dfa.decisionNumber>(BaseRecognizer recognizer) {
+		this.recognizer = recognizer;
+		this.decisionNumber = <dfa.decisionNumber>;
+		this.eot = DFA<dfa.decisionNumber>_eot;
+		this.eof = DFA<dfa.decisionNumber>_eof;
+		this.min = DFA<dfa.decisionNumber>_min;
+		this.max = DFA<dfa.decisionNumber>_max;
+		this.accept = DFA<dfa.decisionNumber>_accept;
+		this.special = DFA<dfa.decisionNumber>_special;
+		this.transition = DFA<dfa.decisionNumber>_transition;
+	}
+	@Override
+	public String getDescription() {
+		return "<dfa.description>";
+	}
+	<@errorMethod()>
 <if(dfa.specialStateSTs)>
-    public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
-        <if(LEXER)>
-        IntStream input = _input;
-        <endif>
-        <if(PARSER)>
-        TokenStream input = (TokenStream)_input;
-        <endif>
-        <if(TREE_PARSER)>
-        TreeNodeStream input = (TreeNodeStream)_input;
-        <endif>
-    	int _s = s;
-        switch ( s ) {
-        <dfa.specialStateSTs:{state |
-        case <i0> : <! compressed special state numbers 0..n-1 !>
-            <state>}; separator="\n">
-        }
+	@Override
+	public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+		<if(LEXER)>
+		IntStream input = _input;
+		<endif>
+		<if(PARSER)>
+		TokenStream input = (TokenStream)_input;
+		<endif>
+		<if(TREE_PARSER)>
+		TreeNodeStream input = (TreeNodeStream)_input;
+		<endif>
+		int _s = s;
+		switch ( s ) {
+		<dfa.specialStateSTs:{state |
+		case <i0> : <! compressed special state numbers 0..n-1 !>
+			<state>}; separator="\n">
+		}
 <if(backtracking)>
-        if (state.backtracking>0) {state.failed=true; return -1;}<\n>
+		if (state.backtracking>0) {state.failed=true; return -1;}
 <endif>
-        NoViableAltException nvae =
-            new NoViableAltException(getDescription(), <dfa.decisionNumber>, _s, input);
-        error(nvae);
-        throw nvae;
-    }<\n>
+		NoViableAltException nvae =
+			new NoViableAltException(getDescription(), <dfa.decisionNumber>, _s, input);
+		error(nvae);
+		throw nvae;
+	}
 <endif>
-}<\n>
+}
 >>
 
 /** A state in a cyclic DFA; it's a special state and part of a big switch on
  *  state.
  */
 cyclicDFAState(decisionNumber,stateNumber,edges,needErrorClause,semPredState) ::= <<
-int LA<decisionNumber>_<stateNumber> = input.LA(1);<\n>
+int LA<decisionNumber>_<stateNumber> = input.LA(1);
 <if(semPredState)> <! get next lookahead symbol to test edges, then rewind !>
 int index<decisionNumber>_<stateNumber> = input.index();
-input.rewind();<\n>
+input.rewind();
 <endif>
 s = -1;
 <edges; separator="\nelse ">
 <if(semPredState)> <! return input cursor to state before we rewound !>
-input.seek(index<decisionNumber>_<stateNumber>);<\n>
+input.seek(index<decisionNumber>_<stateNumber>);
 <endif>
 if ( s>=0 ) return s;
 break;
@@ -1113,14 +1164,14 @@
  *  state to jump to next if successful.
  */
 cyclicDFAEdge(labelExpr, targetStateNumber, edgeNumber, predicates) ::= <<
-if ( (<labelExpr>) <if(predicates)>&& (<predicates>)<endif>) {s = <targetStateNumber>;}<\n>
+if ( (<labelExpr>) <if(predicates)>&& (<predicates>)<endif>) {s = <targetStateNumber>;}
 >>
 
 /** An edge pointing at end-of-token; essentially matches any char;
  *  always jump to the target.
  */
 eotDFAEdge(targetStateNumber,edgeNumber, predicates) ::= <<
-s = <targetStateNumber>;<\n>
+s = <targetStateNumber>;
 >>
 
 
@@ -1128,7 +1179,7 @@
 
 andPredicates(left,right) ::= "(<left>&&<right>)"
 
-orPredicates(operands) ::= "(<first(operands)><rest(operands):{o | ||<o>}>)"
+orPredicates(operands) ::= "(<operands; separator=\"||\">)"
 
 notPredicate(pred) ::= "!(<evalPredicate(pred,{})>)"
 
@@ -1158,33 +1209,33 @@
 globalAttributeScope(scope) ::= <<
 <if(scope.attributes)>
 protected static class <scope.name>_scope {
-    <scope.attributes:{it |<it.decl>;}; separator="\n">
+	<scope.attributes:{it |<it.decl>;}; separator="\n">
 }
-protected Stack <scope.name>_stack = new Stack();<\n>
+protected Stack\<<scope.name>_scope> <scope.name>_stack = new Stack\<<scope.name>_scope>();
 <endif>
 >>
 
 ruleAttributeScope(scope) ::= <<
+<if(scope)>
 <if(scope.attributes)>
 protected static class <scope.name>_scope {
-    <scope.attributes:{it |<it.decl>;}; separator="\n">
+	<scope.attributes:{it |<it.decl>;}; separator="\n">
 }
-protected Stack <scope.name>_stack = new Stack();<\n>
+protected Stack\<<scope.name>_scope> <scope.name>_stack = new Stack\<<scope.name>_scope>();
+<endif>
 <endif>
 >>
 
 returnStructName(r) ::= "<r.name>_return"
 
-returnType() ::= <%
+returnType(ruleDescriptor) ::= <%
 <if(ruleDescriptor.hasMultipleReturnValues)>
 <ruleDescriptor.grammar.recognizerName>.<ruleDescriptor:returnStructName()>
-<else>
-<if(ruleDescriptor.hasSingleReturnValue)>
+<elseif(ruleDescriptor.hasSingleReturnValue)>
 <ruleDescriptor.singleValueReturnType>
 <else>
 void
 <endif>
-<endif>
 %>
 
 /** Generate the Java type associated with a single or multiple return
@@ -1192,14 +1243,12 @@
  */
 ruleLabelType(referencedRule) ::= <%
 <if(referencedRule.hasMultipleReturnValues)>
-<referencedRule.grammar.recognizerName>.<referencedRule.name>_return
-<else>
-<if(referencedRule.hasSingleReturnValue)>
+<returnScopeBaseType()>
+<elseif(referencedRule.hasSingleReturnValue)>
 <referencedRule.singleValueReturnType>
 <else>
 void
 <endif>
-<endif>
 %>
 
 delegateName(d) ::= <<
@@ -1216,7 +1265,7 @@
 /** Define a rule label including default value */
 ruleLabelDef(label) ::= <%
 <ruleLabelType(referencedRule=label.referencedRule)> <label.label.text> =
- <initValue(typeName=ruleLabelType(referencedRule=label.referencedRule))>;<\n>
+ <initValue(typeName=ruleLabelType(referencedRule=label.referencedRule))>;
 %>
 
 /** Define a return struct for a rule if the code needs to access its
@@ -1225,13 +1274,17 @@
  */
 returnScope(scope) ::= <<
 <if(ruleDescriptor.hasMultipleReturnValues)>
-public static class <ruleDescriptor:returnStructName()> extends <if(TREE_PARSER)>Tree<else>Parser<endif>RuleReturnScope {
-    <scope.attributes:{it |public <it.decl>;}; separator="\n">
-    <@ruleReturnMembers()>
+public static class <ruleDescriptor:returnStructName()> extends <returnScopeBaseType()> {
+	<if(scope)><scope.attributes:{it |public <it.decl>;}; separator="\n"><endif>
+	<@ruleReturnMembers()>
 };
 <endif>
 >>
 
+returnScopeBaseType() ::= <%
+<if(TREE_PARSER)>Tree<else>Parser<endif>RuleReturnScope
+%>
+
 parameterScope(scope) ::= <<
 <scope.attributes:{it |<it.decl>}; separator=", ">
 >>
@@ -1241,24 +1294,24 @@
 
 scopeAttributeRef(scope,attr,index,negIndex) ::= <%
 <if(negIndex)>
-((<scope>_scope)<scope>_stack.elementAt(<scope>_stack.size()-<negIndex>-1)).<attr.name>
+<scope>_stack.elementAt(<scope>_stack.size()-<negIndex>-1).<attr.name>
 <else>
 <if(index)>
-((<scope>_scope)<scope>_stack.elementAt(<index>)).<attr.name>
+<scope>_stack.elementAt(<index>).<attr.name>
 <else>
-((<scope>_scope)<scope>_stack.peek()).<attr.name>
+<scope>_stack.peek().<attr.name>
 <endif>
 <endif>
 %>
 
 scopeSetAttributeRef(scope,attr,expr,index,negIndex) ::= <%
 <if(negIndex)>
-((<scope>_scope)<scope>_stack.elementAt(<scope>_stack.size()-<negIndex>-1)).<attr.name> =<expr>;
+<scope>_stack.elementAt(<scope>_stack.size()-<negIndex>-1).<attr.name> =<expr>;
 <else>
 <if(index)>
-((<scope>_scope)<scope>_stack.elementAt(<index>)).<attr.name> =<expr>;
+<scope>_stack.elementAt(<index>).<attr.name> =<expr>;
 <else>
-((<scope>_scope)<scope>_stack.peek()).<attr.name> =<expr>;
+<scope>_stack.peek().<attr.name> =<expr>;
 <endif>
 <endif>
 %>
@@ -1272,7 +1325,7 @@
 /** reference an attribute of rule; might only have single return value */
 ruleLabelRef(referencedRule,scope,attr) ::= <%
 <if(referencedRule.hasMultipleReturnValues)>
-(<scope>!=null?<scope>.<attr.name>:<initValue(attr.type)>)
+(<scope>!=null?((<returnType(referencedRule)>)<scope>).<attr.name>:<initValue(attr.type)>)
 <else>
 <scope>
 <endif>
@@ -1312,9 +1365,9 @@
 tokenLabelPropertyRef_tree(scope,attr) ::= "<scope>_tree"
 tokenLabelPropertyRef_int(scope,attr) ::= "(<scope>!=null?Integer.valueOf(<scope>.getText()):0)"
 
-ruleLabelPropertyRef_start(scope,attr) ::= "(<scope>!=null?((<labelType>)<scope>.start):null)"
-ruleLabelPropertyRef_stop(scope,attr) ::= "(<scope>!=null?((<labelType>)<scope>.stop):null)"
-ruleLabelPropertyRef_tree(scope,attr) ::= "(<scope>!=null?((<ASTLabelType>)<scope>.tree):null)"
+ruleLabelPropertyRef_start(scope,attr) ::= "(<scope>!=null?(<castToLabelType({<scope>.start})>):null)"
+ruleLabelPropertyRef_stop(scope,attr) ::= "(<scope>!=null?(<castToLabelType({<scope>.stop})>):null)"
+ruleLabelPropertyRef_tree(scope,attr) ::= "(<scope>!=null?((<ASTLabelType>)<scope>.getTree()):null)"
 ruleLabelPropertyRef_text(scope,attr) ::= <%
 <if(TREE_PARSER)>
 (<scope>!=null?(input.getTokenStream().toString(
@@ -1325,30 +1378,30 @@
 <endif>
 %>
 
-ruleLabelPropertyRef_st(scope,attr) ::= "(<scope>!=null?<scope>.st:null)"
+ruleLabelPropertyRef_st(scope,attr) ::= "(<scope>!=null?((StringTemplate)<scope>.getTemplate()):null)"
 
 /** Isolated $RULE ref ok in lexer as it's a Token */
 lexerRuleLabel(label) ::= "<label>"
 
 lexerRuleLabelPropertyRef_type(scope,attr) ::=
-    "(<scope>!=null?<scope>.getType():0)"
+	"(<scope>!=null?<scope>.getType():0)"
 lexerRuleLabelPropertyRef_line(scope,attr) ::=
-    "(<scope>!=null?<scope>.getLine():0)"
+	"(<scope>!=null?<scope>.getLine():0)"
 lexerRuleLabelPropertyRef_pos(scope,attr) ::=
-    "(<scope>!=null?<scope>.getCharPositionInLine():-1)"
+	"(<scope>!=null?<scope>.getCharPositionInLine():-1)"
 lexerRuleLabelPropertyRef_channel(scope,attr) ::=
-    "(<scope>!=null?<scope>.getChannel():0)"
+	"(<scope>!=null?<scope>.getChannel():0)"
 lexerRuleLabelPropertyRef_index(scope,attr) ::=
-    "(<scope>!=null?<scope>.getTokenIndex():0)"
+	"(<scope>!=null?<scope>.getTokenIndex():0)"
 lexerRuleLabelPropertyRef_text(scope,attr) ::=
-    "(<scope>!=null?<scope>.getText():null)"
+	"(<scope>!=null?<scope>.getText():null)"
 lexerRuleLabelPropertyRef_int(scope,attr) ::=
-    "(<scope>!=null?Integer.valueOf(<scope>.getText()):0)"
+	"(<scope>!=null?Integer.valueOf(<scope>.getText()):0)"
 
 // Somebody may ref $template or $tree or $stop within a rule:
-rulePropertyRef_start(scope,attr) ::= "((<labelType>)retval.start)"
-rulePropertyRef_stop(scope,attr) ::= "((<labelType>)retval.stop)"
-rulePropertyRef_tree(scope,attr) ::= "((<ASTLabelType>)retval.tree)"
+rulePropertyRef_start(scope,attr) ::= "(<castToLabelType(\"retval.start\")>)"
+rulePropertyRef_stop(scope,attr) ::= "(<castToLabelType(\"retval.stop\")>)"
+rulePropertyRef_tree(scope,attr) ::= "retval.tree"
 rulePropertyRef_text(scope,attr) ::= <%
 <if(TREE_PARSER)>
 input.getTokenStream().toString(
@@ -1392,10 +1445,38 @@
 // M I S C (properties, etc...)
 
 bitset(name, words64) ::= <<
-public static final BitSet <name> = new BitSet(new long[]{<words64:{it |<it>L};separator=",">});<\n>
+public static final BitSet <name> = new BitSet(new long[]{<words64:{it |<it>L};separator=",">});
 >>
 
 codeFileExtension() ::= ".java"
 
 true_value() ::= "true"
 false_value() ::= "false"
+
+isEmptyString ::= [
+	"" : true,
+	default : false
+]
+
+isTrue ::= [
+	"true" : true,
+	default : false
+]
+
+isDefaultLabelType ::= [
+	"Token" : true,
+	default : false
+]
+
+isPredefinedRewriteRule ::= [
+	"topdown" : true,
+	"bottomup" : true,
+	default : false
+]
+
+castToLabelType(value) ::= <%
+<if(!isDefaultLabelType.(labelType))>
+(<labelType>)
+<endif>
+<value>
+%>
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/Java/ST.stg b/tool/src/main/resources/org/antlr/codegen/templates/Java/ST.stg
index a898e4d..3b5323b 100644
--- a/tool/src/main/resources/org/antlr/codegen/templates/Java/ST.stg
+++ b/tool/src/main/resources/org/antlr/codegen/templates/Java/ST.stg
@@ -45,28 +45,25 @@
 
 @genericParser.members() ::= <<
 <@super.members()>
-protected StringTemplateGroup templateLib =
-  new StringTemplateGroup("<name>Templates", AngleBracketTemplateLexer.class);
+	protected StringTemplateGroup templateLib =
+	  new StringTemplateGroup("<name>Templates", AngleBracketTemplateLexer.class);
 
-public void setTemplateLib(StringTemplateGroup templateLib) {
-  this.templateLib = templateLib;
-}
-public StringTemplateGroup getTemplateLib() {
-  return templateLib;
-}
-/** allows convenient multi-value initialization:
- *  "new STAttrMap().put(...).put(...)"
- */
-public static class STAttrMap extends HashMap {
-  public STAttrMap put(String attrName, Object value) {
-    super.put(attrName, value);
-    return this;
-  }
-  public STAttrMap put(String attrName, int value) {
-    super.put(attrName, new Integer(value));
-    return this;
-  }
-}
+	public void setTemplateLib(StringTemplateGroup templateLib) {
+	  this.templateLib = templateLib;
+	}
+	public StringTemplateGroup getTemplateLib() {
+	  return templateLib;
+	}
+	/** allows convenient multi-value initialization:
+	 *  "new STAttrMap().put(...).put(...)"
+	 */
+	@SuppressWarnings("serial")
+	public static class STAttrMap extends HashMap\<String, Object> {
+		public STAttrMap put(String attrName, Object value) {
+			super.put(attrName, value);
+			return this;
+		}
+	}
 >>
 
 /** x+=rule when output=template */
@@ -107,11 +104,11 @@
 // <alt.description>
 <if(alt.pred)>
 if (<alt.pred>) {
-    retval.st = <alt.alt>;
+	retval.st = <alt.alt>;
 }<\n>
 <else>
 {
-    retval.st = <alt.alt>;
+	retval.st = <alt.alt>;
 }<\n>
 <endif>
 >>
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/JavaScript/JavaScript.stg b/tool/src/main/resources/org/antlr/codegen/templates/JavaScript/JavaScript.stg
index e0adab4..73cbaf4 100755
--- a/tool/src/main/resources/org/antlr/codegen/templates/JavaScript/JavaScript.stg
+++ b/tool/src/main/resources/org/antlr/codegen/templates/JavaScript/JavaScript.stg
@@ -1069,7 +1069,7 @@
 
 andPredicates(left,right) ::= "(<left>&&<right>)"
 
-orPredicates(operands) ::= "(<first(operands)><rest(operands):{o | ||<o>}>)"
+orPredicates(operands) ::= "(<operands; separator=\"||\">)"
 
 notPredicate(pred) ::= "!(<evalPredicate(...)>)"
 
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/ObjC/AST.stg b/tool/src/main/resources/org/antlr/codegen/templates/ObjC/AST.stg
index 4e9215e..5ecadd7 100644
--- a/tool/src/main/resources/org/antlr/codegen/templates/ObjC/AST.stg
+++ b/tool/src/main/resources/org/antlr/codegen/templates/ObjC/AST.stg
@@ -61,7 +61,7 @@
 @genericParser.init() ::= <<
 /* AST genericParser.init */
 <@super.init()>
-[self setTreeAdaptor:[[ANTLRCommonTreeAdaptor newTreeAdaptor] retain]];
+[self setTreeAdaptor:[[CommonTreeAdaptor newTreeAdaptor] retain]];
 >>
 
 @genericParser.dealloc() ::= <<
@@ -73,20 +73,20 @@
 /* Add an adaptor property that knows how to build trees */
 parserMemVars() ::= <<
 /* AST parserMemVars */
-id\<ANTLRTreeAdaptor> treeAdaptor;
+id\<TreeAdaptor> treeAdaptor;
 >>
 
 /* Add an adaptor property that knows how to build trees */
 parserProperties() ::= <<
 /* AST parserProperties */
-@property (retain, getter=getTreeAdaptor, setter=setTreeAdaptor:) id\<ANTLRTreeAdaptor> treeAdaptor;
+@property (retain, getter=getTreeAdaptor, setter=setTreeAdaptor:) id\<TreeAdaptor> treeAdaptor;
 >>
 
 /** Declaration of additional tree support methods - go in interface of parserHeaderFile() */
 parserMethodsDecl() ::= <<
 /* AST parserMethodsDecl */
-- (id\<ANTLRTreeAdaptor>) getTreeAdaptor;
-- (void) setTreeAdaptor:(id\<ANTLRTreeAdaptor>)theTreeAdaptor;
+- (id\<TreeAdaptor>) getTreeAdaptor;
+- (void) setTreeAdaptor:(id\<TreeAdaptor>)theTreeAdaptor;
 >>
 
 /* Add an adaptor property that knows how to build trees */
@@ -98,12 +98,12 @@
 /** Definition of addition tree support methods - go in implementation of genericParser() */
 parserMethods() ::= <<
 /* AST parserMethods */
-- (id\<ANTLRTreeAdaptor>) getTreeAdaptor
+- (id\<TreeAdaptor>) getTreeAdaptor
 {
 	return treeAdaptor;
 }
 
-- (void) setTreeAdaptor:(id\<ANTLRTreeAdaptor>)aTreeAdaptor
+- (void) setTreeAdaptor:(id\<TreeAdaptor>)aTreeAdaptor
 {
 	if (aTreeAdaptor != treeAdaptor) {
 		treeAdaptor = aTreeAdaptor;
@@ -114,20 +114,20 @@
 /** addition memVars for returnscopes */
 @returnScopeInterface.memVars() ::= <<
 /* AST returnScopeInterface.memVars */
-<recognizer.ASTLabelType; null="ANTLRCommonTree"> *tree;
+<recognizer.ASTLabelType; null="CommonTree"> *tree;
 >>
 
 /** the interface of returnScope properties */
 @returnScopeInterface.properties() ::= <<
 /* AST returnScopeInterface.properties */
-@property (retain, getter=getTree, setter=setTree:) <recognizer.ASTLabelType; null="ANTLRCommonTree"> *tree;
+@property (retain, getter=getTree, setter=setTree:) <recognizer.ASTLabelType; null="CommonTree"> *tree;
 >>
 
 /** the interface of returnScope methodsDecl */
 @returnScopeInterface.methodsDecl() ::= <<
 /* AST returnScopeInterface.methodsDecl */
-- (<recognizer.ASTLabelType; null="ANTLRCommonTree"> *)getTree;<\n>
-- (void) setTree:(<recognizer.ASTLabelType; null="ANTLRCommonTree"> *)aTree;<\n>
+- (<recognizer.ASTLabelType; null="CommonTree"> *)getTree;<\n>
+- (void) setTree:(<recognizer.ASTLabelType; null="CommonTree"> *)aTree;<\n>
 >>
 
 /** the implementation of returnScope synthesize */
@@ -147,8 +147,8 @@
 - (void) setTree:(<ASTLabelType> *)aTree
 {
     if (tree != aTree) {
-        if ( tree ) [tree release];
-        if ( aTree ) [aTree retain];
+        if (tree != nil) [tree release];
+        if (aTree != nil) [aTree retain];
         tree = aTree;
     }
 }
@@ -174,11 +174,11 @@
 <[ruleDescriptor.tokenLabels,ruleDescriptor.wildcardTreeLabels,
   ruleDescriptor.wildcardTreeListLabels]:{it | <ASTLabelType> *<it.label.text>_tree=nil;}; separator="\n">
 <ruleDescriptor.tokenListLabels:{it | <ASTLabelType> *<it.label.text>_tree = nil;}; separator="\n">
-<ruleDescriptor.allTokenRefsInAltsWithRewrites:{it | ANTLRRewriteRuleTokenStream *stream_<it> =
-    [[ANTLRRewriteRule<rewriteElementType>Stream newANTLRRewriteRule<rewriteElementType>Stream:treeAdaptor
+<ruleDescriptor.allTokenRefsInAltsWithRewrites:{it | RewriteRuleTokenStream *stream_<it> =
+    [[RewriteRule<rewriteElementType>Stream newRewriteRule<rewriteElementType>Stream:treeAdaptor
                                                      description:@"token <it>"] retain];}; separator="\n">
-<ruleDescriptor.allRuleRefsInAltsWithRewrites:{it | ANTLRRewriteRuleSubtreeStream *stream_<it> =
-    [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
+<ruleDescriptor.allRuleRefsInAltsWithRewrites:{it | RewriteRuleSubtreeStream *stream_<it> =
+    [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
                                                         description:@"rule <it>"] retain];}; separator="\n">
 >>
 
@@ -338,32 +338,32 @@
 
 rewriteCodeLabels() ::= <<
 <referencedTokenLabels
-    :{it | ANTLRRewriteRule<rewriteElementType>Stream *stream_<it> =
-    [[ANTLRRewriteRule<rewriteElementType>Stream newANTLRRewriteRule<rewriteElementType>Stream:treeAdaptor description:@"token <it>" element:<it>] retain];};
+    :{it | RewriteRule<rewriteElementType>Stream *stream_<it> =
+    [[RewriteRule<rewriteElementType>Stream newRewriteRule<rewriteElementType>Stream:treeAdaptor description:@"token <it>" element:<it>] retain];};
     separator="\n"
 >
-<referencedTokenListLabels:{it | ANTLRRewriteRule<rewriteElementType>Stream *stream_<it> =
-    [[ANTLRRewriteRule<rewriteElementType>Stream newANTLRRewriteRule<rewriteElementType>Stream:treeAdaptor
+<referencedTokenListLabels:{it | RewriteRule<rewriteElementType>Stream *stream_<it> =
+    [[RewriteRule<rewriteElementType>Stream newRewriteRule<rewriteElementType>Stream:treeAdaptor
         description:@"token <it>" elements:list_<it>] retain];};
     separator="\n"
 >
 <referencedWildcardLabels:{it | RewriteRuleSubtreeStream stream_<it> =
-    [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
+    [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
         description:"wildcard <it>" element:<it>] retain];};
     separator="\n"
 >
 <referencedWildcardListLabels:{it | RewriteRuleSubtreeStream stream_<it> =
-    [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
+    [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
         descriptor:"wildcard <it>" elements:list_<it>] retain];};
     separator="\n"
 >
-<referencedRuleLabels:{it | ANTLRRewriteRuleSubtreeStream *stream_<it> =
-    [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
+<referencedRuleLabels:{it | RewriteRuleSubtreeStream *stream_<it> =
+    [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
         description:@"token <it>" element:<it>!=nil?[<it> getTree]:nil] retain];};
     separator="\n"
 >
-<referencedRuleListLabels:{it | ANTLRRewriteRuleSubtreeStream *stream_<it> =
-    [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
+<referencedRuleListLabels:{it | RewriteRuleSubtreeStream *stream_<it> =
+    [[RewriteRuleSubtreeStream newRewriteRuleSubtreeStream:treeAdaptor
         description:@"token <it>" elements:list_<it>] retain];};
     separator="\n"
 >
@@ -407,7 +407,7 @@
 // <fileName>:<description>
 {
 if ( !(<referencedElements:{el | [stream_<el> hasNext]}; separator=" || ">) ) {
-    @throw [ANTLRRewriteEarlyExitException newException];
+    @throw [RewriteEarlyExitException newException];
 }
 while ( <referencedElements:{el | [stream_<el> hasNext]}; separator=" || "> ) {
     <alt>
@@ -503,7 +503,7 @@
 >>
 
 rewriteRuleRefRoot(rule) ::= <<
-root_<treeLevel> = (<ASTLabelType> *)[treeAdaptor becomeRoot:(id\<ANTLRTree>)[stream_<rule> nextNode] old:root_<treeLevel>];<\n>
+root_<treeLevel> = (<ASTLabelType> *)[treeAdaptor becomeRoot:(id\<Tree>)[stream_<rule> nextNode] old:root_<treeLevel>];<\n>
 >>
 
 rewriteNodeAction(action) ::= <<
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/ObjC/ASTDbg.stg b/tool/src/main/resources/org/antlr/codegen/templates/ObjC/ASTDbg.stg
index 8756fa5..210cfcd 100644
--- a/tool/src/main/resources/org/antlr/codegen/templates/ObjC/ASTDbg.stg
+++ b/tool/src/main/resources/org/antlr/codegen/templates/ObjC/ASTDbg.stg
@@ -30,21 +30,21 @@
  *  hierarchy is set up as ASTDbg : AST : Dbg : Java by code generator.
  */
 parserMembers() ::= <<
-ANTLRDebugTreeAdaptor *adaptor = [ANTLRDebugTreeAdaptor newTreeAdaptor:(id)dbg Adaptor:[ANTLRCommonTreeAdaptor newTreeAdaptor]];
+DebugTreeAdaptor *adaptor = [DebugTreeAdaptor newTreeAdaptor:(id)dbg Adaptor:[CommonTreeAdaptor newTreeAdaptor]];
 
 // fix this
-- (void) setTreeAdaptor:(id<ANTLRTreeAdaptor>)anAdaptor
+- (void) setTreeAdaptor:(id<TreeAdaptor>)anAdaptor
 {
-    adaptor = [ANTLRDebugTreeAdaptor newTreeAdaptor:dbg Adaptor:anAdaptor];
+    adaptor = [DebugTreeAdaptor newTreeAdaptor:dbg Adaptor:anAdaptor];
 <if(grammar.grammarIsRoot)>
-    adaptor = [ANTLRDebugTreeAdaptor newTreeAdaptor:adaptor withDBG:dbg];
+    adaptor = [DebugTreeAdaptor newTreeAdaptor:adaptor withDBG:dbg];
 <else>
-    adaptor = (ANTLRDebugTreeAdaptor *)adaptor; // delegator sends dbg adaptor
+    adaptor = (DebugTreeAdaptor *)adaptor; // delegator sends dbg adaptor
 <endif><\n>
     <grammar.directDelegates:{g|[<g:delegateName()> setTreeAdaptor:adaptor];}>
 }
 
-- (id<ANTLRTreeAdaptor>)getTreeAdaptor
+- (id<TreeAdaptor>)getTreeAdaptor
 {
     return adaptor;
 }<\n>
@@ -55,10 +55,10 @@
 >>
 
 createListenerAndHandshake() ::= <<
-ANTLRDebugEventSocketProxy proxy =
-    [ANTLRDebugEventSocketProxy newANTLRDebugEventSocketProxy:self, port, <if(TREE_PARSER)>[input getTreeAdaptor]<else>adaptor<endif>];
+DebugEventSocketProxy proxy =
+    [DebugEventSocketProxy newDebugEventSocketProxy:self, port, <if(TREE_PARSER)>[input getTreeAdaptor]<else>adaptor<endif>];
 [self setDebugListener:proxy];
-[self set<inputStreamType>:[ANTLRANTLRDebug<inputStreamType> newANTLRDebug<inputStreamType>:input with:proxy]];
+[self set<inputStreamType>:[Debug<inputStreamType> newDebug<inputStreamType>:input with:proxy]];
 try {
     [proxy handshake];
 }
@@ -68,13 +68,13 @@
 >>
 
 @ctorForRootGrammar.finally() ::= <<
-ANTLRCommonTreeAdaptor *adap = [ANTLRCommonTreeAdaptor newTreeAdaptor];
+CommonTreeAdaptor *adap = [CommonTreeAdaptor newTreeAdaptor];
 [self setTreeAdaptor:adap];
 [proxy setTreeAdaptor:adap];
 >>
 
 @ctorForProfilingRootGrammar.finally() ::=<<
-ANTLRCommonTreeAdaptor *adap = [ANTLRCommonTreeAdaptor newTreeAdaptor];
+CommonTreeAdaptor *adap = [CommonTreeAdaptor newTreeAdaptor];
 [self setTreeAdaptor:adap];
 [proxy setTreeAdaptor:adap];
 >>
@@ -83,11 +83,11 @@
 
 @ctorForPredefinedListener.finally() ::=<<
 <if(grammar.grammarIsRoot)> <! don't create new adaptor for delegates !>
-ANTLRCommonTreeAdaptor *adap = [ANTLRCommonTreeAdaptor newTreeAdaptor];
+CommonTreeAdaptor *adap = [CommonTreeAdaptor newTreeAdaptor];
 [self setTreeAdaptor:adap];<\n>
 <endif>
 >>
 
-@treeParserHeaderFile.superClassName ::= "ANTLRDebugTreeParser"
+@treeParserHeaderFile.superClassName ::= "DebugTreeParser"
 
 @rewriteElement.pregen() ::= "[debugListener locationLine:<e.line> column:<e.pos>];"
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/ObjC/ASTParser.stg b/tool/src/main/resources/org/antlr/codegen/templates/ObjC/ASTParser.stg
index 26dbe6a..4eed274 100644
--- a/tool/src/main/resources/org/antlr/codegen/templates/ObjC/ASTParser.stg
+++ b/tool/src/main/resources/org/antlr/codegen/templates/ObjC/ASTParser.stg
@@ -175,7 +175,7 @@
 /* ASTParser wildcard */
 <super.wildcard(...)>
 <if(backtracking)>if ( <actions.(actionScope).synpredgate> ) {<endif>
-    [treeAdaptor addChild:[[treeAdaptor createTree:<label>] retain] toTree:root_0];
+    [treeAdaptor addChild:[[treeAdaptor create:<label>] retain] toTree:root_0];
 <if(backtracking)>}<endif>
 >>
 
@@ -185,7 +185,7 @@
 /* ASTParser wildcardRuleRoot */
 <super.wildcard(...)>
 <if(backtracking)>if ( <actions.(actionScope).synpredgate> ) {<endif>
-    <label>_tree = [[treeAdaptor createTree:<label>] retain]
+    <label>_tree = [[treeAdaptor create:<label>] retain]
     root_0 = (<ASTLabelType> *)[treeAdaptor becomeRoot:<label>_tree old:root_0];
 <if(backtracking)>}<endif>
 >>
@@ -193,9 +193,9 @@
 createNodeFromToken(label,terminalOptions) ::= <<
 /* ASTParser createNodeFromToken */
 <if(terminalOptions.node)>
-[ANTLR<terminalOptions.node> newANTLR<terminalOptions.node>:<label>] <! new MethodNode(IDLabel) !>
+[<terminalOptions.node> new<terminalOptions.node>:<label>] <! new MethodNode(IDLabel) !>
 <else>
-(<ASTLabelType> *)[[treeAdaptor createTree:<label>] retain]
+(<ASTLabelType> *)[[treeAdaptor create:<label>] retain]
 <endif>
 >>
 
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/ObjC/ASTTreeParser.stg b/tool/src/main/resources/org/antlr/codegen/templates/ObjC/ASTTreeParser.stg
index 56959a3..9eb45dd 100644
--- a/tool/src/main/resources/org/antlr/codegen/templates/ObjC/ASTTreeParser.stg
+++ b/tool/src/main/resources/org/antlr/codegen/templates/ObjC/ASTTreeParser.stg
@@ -41,14 +41,14 @@
 /* addition memVars for returnscopes */
 @returnScopeInterface.memVars() ::= <<
 /* ASTTreeParser returnScopeInterface.memVars */
-<recognizer.ASTLabelType; null="ANTLRCommonTree"> *tree;
+<recognizer.ASTLabelType; null="CommonTree"> *tree;
 >>
 
 /** the interface of returnScope methodsDecl */
 @returnScopeInterface.methodsDecl() ::= <<
 /* ASTTreeParser returnScopeInterface.methodsDecl */
-- (<recognizer.ASTLabelType; null="ANTLRCommonTree"> *)getTree;
-- (void) setTree:(<recognizer.ASTLabelType; null="ANTLRCommonTree"> *)aTree;<\n>
+- (<recognizer.ASTLabelType; null="CommonTree"> *)getTree;
+- (void) setTree:(<recognizer.ASTLabelType; null="CommonTree"> *)aTree;<\n>
 >>
 
 /** the implementation of returnScope methods */
@@ -62,8 +62,8 @@
 - (void) setTree:(<ASTLabelType> *)aTree
 {
     if (tree != aTree) {
-        if ( tree ) [tree release];
-        if ( aTree ) [aTree retain];
+        if (tree != nil) [tree release];
+        if (aTree != nil) [aTree retain];
         tree = aTree;
     }
 }
@@ -78,7 +78,7 @@
 >>
 
 @returnScopeProperties() ::= <<
-@property (retain) <recognizer.ASTLabelType; null="ANTLRCommonTree"> *tree;
+@property (retain) <recognizer.ASTLabelType; null="CommonTree"> *tree;
 >>
 
 /** Add a variable to track last element matched */
@@ -127,15 +127,15 @@
 <endif>
 <actionsAfterRoot:element()>
 <if(nullableChildList)>
-if ( [input LA:1] == ANTLRTokenTypeDOWN ) {
-    [self match:input TokenType:ANTLRTokenTypeDOWN Follow:nil]; <checkRuleBacktrackFailure()>
+if ( [input LA:1] == TokenTypeDOWN ) {
+    [self match:input TokenType:TokenTypeDOWN Follow:nil]; <checkRuleBacktrackFailure()>
     <children:element()>
-    [self match:input TokenType:ANTLRTokenTypeUP Follow:nil]; <checkRuleBacktrackFailure()>
+    [self match:input TokenType:TokenTypeUP Follow:nil]; <checkRuleBacktrackFailure()>
 }
 <else>
-[self match:input TokenType:ANTLRTokenTypeDOWN Follow:nil]; <checkRuleBacktrackFailure()>
+[self match:input TokenType:TokenTypeDOWN Follow:nil]; <checkRuleBacktrackFailure()>
 <children:element()>
-[self match:input TokenType:ANTLRTokenTypeUP Follow:nil]; <checkRuleBacktrackFailure()>
+[self match:input TokenType:TokenTypeUP Follow:nil]; <checkRuleBacktrackFailure()>
 <endif>
 <if(!rewriteMode)>
 [treeAdaptor addChild:root_<treeLevel> toTree:root_<enclosingTreeLevel>];
@@ -163,7 +163,7 @@
 <if(!rewriteMode)>
 <if(backtracking)>if ( <actions.(actionScope).synpredgate> ) {<endif>
 <if(terminalOptions.node)>
-    <label>_tree = [ANTLR<terminalOptions.node> newANTLR<terminalOptions.node>:<label>];
+    <label>_tree = [<terminalOptions.node> new<terminalOptions.node>:<label>];
 <else>
     <label>_tree = (<ASTLabelType> *)[treeAdaptor dupNode:<label>];
 <endif><\n>
@@ -190,7 +190,7 @@
 <if(!rewriteMode)>
 <if(backtracking)>if ( <actions.(actionScope).synpredgate> ) {<endif>
 <if(terminalOptions.node)>
-<label>_tree = [ANTLR<terminalOptions.node> newANTLR<terminalOptions.node>:<label>];
+<label>_tree = [<terminalOptions.node> new<terminalOptions.node>:<label>];
 <else>
 <label>_tree = (<ASTLabelType> *)[treeAdaptor dupNode:<label>];
 <endif><\n>
@@ -231,7 +231,7 @@
 <if(!rewriteMode)>
 <if(backtracking)>if ( <actions.(actionScope).synpredgate> ) {<endif>
 <if(terminalOptions.node)>
-<label>_tree = [ANTLR<terminalOptions.node> newANTLR<terminalOptions.node>:<label>];
+<label>_tree = [<terminalOptions.node> new<terminalOptions.node>:<label>];
 <else>
 <label>_tree = (<ASTLabelType> *)[adaptor dupNode:<label>];
 <endif><\n>
@@ -260,7 +260,7 @@
 <if(!rewriteMode)>
 <if(backtracking)>if ( <actions.(actionScope).synpredgate> ) {<endif>
 <if(terminalOptions.node)>
-<label>_tree = [ANTLR<terminalOptions.node> newANTLR<terminalOptions.node>:<label>];
+<label>_tree = [<terminalOptions.node> new<terminalOptions.node>:<label>];
 <else>
 <label>_tree = (<ASTLabelType> *)[adaptor dupNode:<label>];
 <endif><\n>
@@ -347,7 +347,7 @@
 /* ASTTreeParser createRewriteNodeFromElement */
 <if(terminalOptions.node)>
 <! new <terminalOptions.node>(stream_<token>.nextNode()) !>
-[[[ANTLR<terminalOptions.node>(stream_<token> alloc] init] nextNode];
+[[[<terminalOptions.node>(stream_<token> alloc] init] nextNode];
 <else>
 <! stream_<token>.nextNode() !>
 [stream_<token> nextNode]
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/ObjC/Dbg.stg b/tool/src/main/resources/org/antlr/codegen/templates/ObjC/Dbg.stg
index 6c8b42d..5bad893 100644
--- a/tool/src/main/resources/org/antlr/codegen/templates/ObjC/Dbg.stg
+++ b/tool/src/main/resources/org/antlr/codegen/templates/ObjC/Dbg.stg
@@ -30,7 +30,7 @@
  */
 @headerFile.imports() ::= <<
 <@super.imports()>
-#import \<ANTLR/ANTLRDebug.h>
+#import \<ANTLR/Debug.h>
 >>
 
 @parserHeaderFile.memVars() ::= <<
@@ -81,7 +81,7 @@
     [(Profiler)dbg examineRuleMemoization:input, ruleIndex, <grammar.composite.rootGrammar.recognizerName>.ruleNames objectAtIndex:ruleIndex];
     return super.alreadyParsedRule(input, ruleIndex);
 }<\n>
-- (void) memoize:(id<ANTLRIntStream>)input RuleIndex:(NSInteger)ruleIndex StartIndex:(NSInteger)ruleStartIndex
+- (void) memoize:(id<IntStream>)input RuleIndex:(NSInteger)ruleIndex StartIndex:(NSInteger)ruleStartIndex
 {
     [((Profiler)dbg) memoize:input RuleIndex:ruleIndex StartIndex:ruleStartIndex [<grammar.composite.rootGrammar.recognizerName> ruleNames[ruleIndex]];
     [super memoize:input RuleIndex:ruleIndex StartIndex:ruleStartIndex];
@@ -111,7 +111,7 @@
 >>
 
 /* bug: can't use @super.superClassName()> */
-@parserHeaderFile.superClassName() ::= "ANTLRDebug<if(TREE_PARSER)>Tree<endif>Parser"
+@parserHeaderFile.superClassName() ::= "Debug<if(TREE_PARSER)>Tree<endif>Parser"
 
 @rule.preamble() ::= <<
 @try { [debugListener enterRule:@"<ruleName>"];
@@ -209,14 +209,14 @@
     // isCyclicDecision = YES;
     <super.dfaDecision(...)>
 }
-@catch (ANTLRNoViableAltException *nvae) {
+@catch (NoViableAltException *nvae) {
     [debugListener recognitionException:nvae];
     @throw nvae;
 }
 >>
 
 @cyclicDFA.errorMethod() ::= <<
--(void) error:(ANTLRNoViableAltException *)nvae
+-(void) error:(NoViableAltException *)nvae
 {
     [[recognizer debugListener] recognitionException:nvae];
 }
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/ObjC/ObjC.stg b/tool/src/main/resources/org/antlr/codegen/templates/ObjC/ObjC.stg
index dbba0ff..369310a 100644
--- a/tool/src/main/resources/org/antlr/codegen/templates/ObjC/ObjC.stg
+++ b/tool/src/main/resources/org/antlr/codegen/templates/ObjC/ObjC.stg
@@ -49,6 +49,17 @@
     default         : "nil"             // anything other than an atomic type
 ]
 
+// System.Boolean.ToString() returns "True" and "False", but the proper C# literals are "true" and "false"
+// The Java version of Boolean returns "true" and "false", so they map to themselves here.
+booleanLiteral ::= [
+	"True":"true",
+	"False":"false",
+	"true":"YES",
+	"false":"NO",
+	default:"NO"
+]
+
+
 className() ::= "<name><!<if(LEXER)>Lexer<else><if(TREE_PARSER)>Tree<endif>Parser<endif>!>"
 leadIn(type) ::=
 <<
@@ -184,9 +195,9 @@
 <@imports>
 <actions.(actionScope).preincludes>
 /* =============================================================================
- * Standard antlr3 OBJC runtime definitions
+ * Standard antlr OBJC runtime definitions
  */
-#import \<Foundation/Foundation.h>
+#import \<Cocoa/Cocoa.h>
 #import \<ANTLR/ANTLR.h>
 /* End of standard antlr3 runtime definitions
  * =============================================================================
@@ -230,7 +241,7 @@
             generatedTimestamp,
             trace,
             scopes,
-            superClass="ANTLRLexer"
+            superClass="Lexer"
             ) ::=
 <<
 
@@ -252,10 +263,13 @@
 <rule.ruleDescriptor:{ruleDescriptor | <returnScopeInterface(scope=ruleDescriptor.returnScope)>}>}>
 #pragma mark Rule return scopes Interface end
 #pragma mark Tokens
+#ifndef TOKENLISTAlreadyDefined
+#define TOKENLISTAlreadyDefined 1
 #ifdef EOF
 #undef EOF
 #endif
 <tokens:{it | #define <it.name> <it.type>}; separator="\n">
+#endif
 /* interface lexer class */
 @interface <className()> <@superClassName>: <superClass><@end> { // line 283
 <cyclicDFAs:{dfa | DFA<dfa.decisionNumber> *dfa<dfa.decisionNumber>;}; separator="\n">
@@ -265,7 +279,7 @@
 /* ObjC end of actions.lexer.memVars */
 }
 + (void) initialize;
-+ (<className()> *)new<className()>WithCharStream:(id\<ANTLRCharStream>)anInput;
++ (<className()> *)new<className()>WithCharStream:(id\<CharStream>)anInput;
 /* ObjC start actions.lexer.methodsDecl */
 <actions.lexer.methodsDecl>
 /* ObjC end actions.lexer.methodsDecl */
@@ -294,8 +308,8 @@
         rules,
         numRules,
         filterMode,
-        labelType="ANTLRCommonToken",
-        superClass="ANTLRLexer"
+        labelType="CommonToken",
+        superClass="Lexer"
         ) ::= <<
 <cyclicDFAs:cyclicDFA()>
 
@@ -311,7 +325,7 @@
 
 + (void) initialize
 {
-    [ANTLRBaseRecognizer setGrammarFileName:@"<fileName>"];
+    [BaseRecognizer setGrammarFileName:@"<fileName>"];
 }
 
 + (NSString *) tokenNameForType:(NSInteger)aTokenType
@@ -319,24 +333,24 @@
     return [[self getTokenNames] objectAtIndex:aTokenType];
 }
 
-+ (<grammar.recognizerName> *)new<grammar.recognizerName>WithCharStream:(id\<ANTLRCharStream>)anInput
++ (<grammar.recognizerName> *)new<grammar.recognizerName>WithCharStream:(id\<CharStream>)anInput
 {
     return [[<grammar.recognizerName> alloc] initWithCharStream:anInput];
 }
 
-- (id) initWithCharStream:(id\<ANTLRCharStream>)anInput
+- (id) initWithCharStream:(id\<CharStream>)anInput
 {
-    self = [super initWithCharStream:anInput State:[ANTLRRecognizerSharedState newANTLRRecognizerSharedStateWithRuleLen:<numRules>+1]];
+    self = [super initWithCharStream:anInput State:[RecognizerSharedState newRecognizerSharedStateWithRuleLen:<numRules>+1]];
     if ( self != nil ) {
 <if(memoize)>
         if ( state.ruleMemo == nil ) {
-            state.ruleMemo = [[ANTLRRuleStack newANTLRRuleStackWithSize:<numRules>+1] retain];
+            state.ruleMemo = [[RuleStack newRuleStackWithSize:<numRules>+1] retain];
         }
         if ( [state.ruleMemo count] == 0 ) {
             // initialize the memoization cache - the indices are 1-based in the runtime code!
             <! [state.ruleMemo addObject:[NSNull null]];     /* dummy entry to ensure 1-basedness. */ !>
             for (NSInteger i = 0; i \< <numRules>; i++) {
-                [state.ruleMemo addObject:[ANTLRHashRule newANTLRHashRuleWithLen:17]];
+                [state.ruleMemo addObject:[HashRule newHashRuleWithLen:17]];
             }
         }
 <endif>
@@ -385,14 +399,14 @@
  *  at backtracking==1.
  */
 filteringNextToken() ::= <<
-- (id\<ANTLRToken>) nextToken
+- (id\<Token>) nextToken
 {
     while (YES) {
-        if ( [input LA:1] == ANTLRCharStreamEOF ) {
+        if ( [input LA:1] == CharStreamEOF ) {
             return [<labelType> eofToken];
         }
         state.token = nil;
-        state.channel = ANTLRTokenChannelDefault;
+        state.channel = TokenChannelDefault;
         state.tokenStartCharIndex = input.index;
         state.tokenStartCharPositionInLine = input.charPositionInLine;
         state.tokenStartLine = input.line;
@@ -413,7 +427,7 @@
                 return state.token;
             }
         }
-        @catch (ANTLRRecognitionException *re) {
+        @catch (RecognitionException *re) {
             // shouldn't happen in backtracking mode, but...
             [self reportError:re];
             [self recover:re];
@@ -421,14 +435,14 @@
     }
 }
 
-- (void)memoize:(id\<ANTLRIntStream\>)anInput
+- (void)memoize:(id\<IntStream\>)anInput
       RuleIndex:(NSInteger)ruleIndex
      StartIndex:(NSInteger)ruleStartIndex
 {
     if ( state.backtracking > 1 ) [super memoize:anInput RuleIndex:ruleIndex StartIndex:ruleStartIndex];
 }
 
-- (BOOL)alreadyParsedRule:(id\<ANTLRIntStream\>)anInput RuleIndex:(NSInteger)ruleIndex
+- (BOOL)alreadyParsedRule:(id\<IntStream\>)anInput RuleIndex:(NSInteger)ruleIndex
 {
     if ( state.backtracking > 1 ) return [super alreadyParsedRule:anInput RuleIndex:ruleIndex];
     return NO;
@@ -464,10 +478,10 @@
             trace,
             scopes,
             literals,
-            superClass="ANTLRParser"
+            superClass="Parser"
             ) ::= <<
 /* parserHeaderFile */
-<genericParserHeaderFile(inputStreamType="id\<ANTLRTokenStream>",...)>
+<genericParserHeaderFile(inputStreamType="id\<TokenStream>",...)>
 >>
 
 treeParserHeaderFile( LEXER,
@@ -495,10 +509,10 @@
             trace,
             scopes,
             literals,
-            superClass="ANTLRTreeParser"
+            superClass="TreeParser"
             ) ::= <<
 /* treeParserHeaderFile */
-<genericParserHeaderFile(inputStreamType="id\<ANTLRTreeNodeStream>",...)>
+<genericParserHeaderFile(inputStreamType="id\<TreeNodeStream>",...)>
 >>
 
 genericParserHeaderFile( LEXER,
@@ -554,10 +568,13 @@
 
 <cyclicDFAs:cyclicDFAInterface()>
 #pragma mark Tokens
+#ifndef TOKENLISTAlreadyDefined
+#define TOKENLISTAlreadyDefined 1
 #ifdef EOF
 #undef EOF
 #endif
 <tokens:{it | #define <it.name> <it.type>}; separator="\n">
+#endif
 #pragma mark Dynamic Global Scopes globalAttributeScopeInterface
 <scopes:{it | <if(it.isDynamicGlobalScope)><globalAttributeScopeInterface(scope=it)><endif>}>
 #pragma mark Dynamic Rule Scopes ruleAttributeScopeInterface
@@ -591,7 +608,7 @@
 /* ObjC end of properties */
 
 + (void) initialize;
-+ (id) new<className()>:(<inputStreamType>)aStream;
++ (<className()> *) new<className()>:(<inputStreamType>)aStream;
 /* ObjC start of actions.(actionScope).methodsDecl */
 <actions.(actionScope).methodsDecl>
 /* ObjC end of actions.(actionScope).methodsDecl */
@@ -614,12 +631,12 @@
         rules,
         numRules,
         bitsets,
-        ASTLabelType="ANTLRCommonTree",
-        superClass="ANTLRParser",
-        labelType="ANTLRCommonToken",
+        ASTLabelType="CommonTree",
+        superClass="Parser",
+        labelType="CommonToken",
         members={<actions.parser.members>}
         ) ::= <<
-<genericParser(inputStreamType="id\<ANTLRTokenStream>", rewriteElementType="Token", ...)>
+<genericParser(inputStreamType="id\<TokenStream>", rewriteElementType="Token", ...)>
 >>
 
 /** How to generate a tree parser; same as parser except the input
@@ -636,11 +653,11 @@
         bitsets,
         filterMode,
         labelType={<ASTLabelType>},
-        ASTLabelType="ANTLRCommonTree",
-        superClass={<if(filterMode)><if(buildAST)>ANTLRTreeRewriter<else>ANTLRTreeFilter<endif><else>ANTLRTreeParser<endif>},
+        ASTLabelType="CommonTree",
+        superClass={<if(filterMode)><if(buildAST)>TreeRewriter<else>TreeFilter<endif><else>TreeParser<endif>},
         members={<actions.treeparser.members>}
         ) ::= <<
-<genericParser(inputStreamType="id\<ANTLRTreeNodeStream>", rewriteElementType="Node", ...)>
+<genericParser(inputStreamType="id\<TreeNodeStream>", rewriteElementType="Node", ...)>
 >>
 
 /** How to generate a parser */
@@ -678,10 +695,14 @@
 
 @implementation <grammar.recognizerName>  // line 637
 
+/* ObjC start of ruleAttributeScope */
 #pragma mark Dynamic Rule Scopes ruleAttributeScope
 <rules:{rule | <rule.ruleDescriptor.ruleScope:ruleAttributeScope()>}>
+/* ObjC end of ruleAttributeScope */
 #pragma mark global Attribute Scopes globalAttributeScope
+/* ObjC start globalAttributeScope */
 <scopes:{it | <if(it.isDynamicGlobalScope)><globalAttributeScope()><endif>}>
+/* ObjC end globalAttributeScope */
 /* ObjC start actions.(actionScope).synthesize */
 <actions.(actionScope).synthesize>
 /* ObjC start synthesize() */
@@ -691,8 +712,8 @@
 {
     #pragma mark Bitsets
     <bitsets:{it | <bitsetInit(name={FOLLOW_<it.name>_in_<it.inName><it.tokenIndex>}, words64=it.bits)>}>
-    [ANTLRBaseRecognizer setTokenNames:[[AMutableArray arrayWithObjects:@"\<invalid>", @"\<EOR>", @"\<DOWN>", @"\<UP>", <tokenNames:{it | @<it>}; separator=", ", wrap="\n ">, nil] retain]];
-    [ANTLRBaseRecognizer setGrammarFileName:@"<fileName>"];
+    [BaseRecognizer setTokenNames:[[AMutableArray arrayWithObjects:@"\<invalid>", @"\<EOR>", @"\<DOWN>", @"\<UP>", <tokenNames:{it | @<it>}; separator=", ", wrap="\n ">, nil] retain]];
+    [BaseRecognizer setGrammarFileName:@"<fileName>"];
     <synpreds:{pred | <synpred(pred)>}>
 }
 
@@ -708,12 +729,12 @@
 <if(PARSER)>
 - (id) initWithTokenStream:(<inputStreamType>)aStream
 {
-    self = [super initWithTokenStream:aStream State:[ANTLRRecognizerSharedState newANTLRRecognizerSharedStateWithRuleLen:<numRules>+1]];
+    self = [super initWithTokenStream:aStream State:[[RecognizerSharedState newRecognizerSharedStateWithRuleLen:<numRules>+1] retain]];
     if ( self != nil ) {
 <else><! TREE_PARSER !>
 - (id) initWithStream:(<inputStreamType>)aStream
 {
-    self = [super initWithStream:aStream State:[[ANTLRRecognizerSharedState newANTLRRecognizerSharedStateWithRuleLen:<numRules>+1] retain]];
+    self = [super initWithStream:aStream State:[[RecognizerSharedState newRecognizerSharedStateWithRuleLen:<numRules>+1] retain]];
     if ( self != nil ) {
 <endif>
         <! <parserCtorBody()> !>
@@ -753,7 +774,7 @@
 parserCtorBody() ::= <<
 <if(memoize)> /* parserCtorBody */
 <if(grammar.grammarIsRoot)>
-state.ruleMemo = [[ANTLRRuleStack newANTLRRuleStack:<numRules>+1] retain];<\n> <! index from 1..n !>
+state.ruleMemo = [[RuleStack newRuleStack:<numRules>+1] retain];<\n> <! index from 1..n !>
 <endif>
 <endif>
 <grammar.delegators:
@@ -798,7 +819,7 @@
     @try {
         [self <name>_fragment]; // can never throw exception
     }
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         NSLog(@"impossible: %@\n", re.name);
     }
     BOOL success = (state.failed == NO);
@@ -859,7 +880,7 @@
 <else><if(!emptyRule)><if(actions.(actionScope).rulecatch)>
     <actions.(actionScope).rulecatch>
 <else>
-    @catch (ANTLRRecognitionException *re) {
+    @catch (RecognitionException *re) {
         [self reportError:re];
         [self recover:input Exception:re];
         <@setErrorReturnValue()>
@@ -916,26 +937,26 @@
 <ruleDescriptor.ruleScope:{it | [<it.name>_stack pop];}; separator="\n">
 >>
 
-ruleLabelDefs() ::= <<
+ruleLabelDefs() ::= <%
+/* ruleLabelDefs entry */<"\n">
 <[ruleDescriptor.tokenLabels, ruleDescriptor.tokenListLabels,
   ruleDescriptor.wildcardTreeLabels,ruleDescriptor.wildcardTreeListLabels]
-    :{it | <labelType> *<it.label.text> = nil;}; separator="\n">
+    :{it |<labelType> *<it.label.text> = nil;}; separator="\n"><"\n">
 <[ruleDescriptor.tokenListLabels,ruleDescriptor.ruleListLabels,ruleDescriptor.wildcardTreeListLabels]
-    :{it | AMutableArray *list_<it.label.text> = nil;}; separator="\n"
->
-<ruleDescriptor.ruleLabels:ruleLabelDef(); separator="\n">
-<ruleDescriptor.ruleListLabels:{ll|ANTLRParserRuleReturnScope *<ll.label.text> = nil;}; separator="\n">
->>
+    :{it | AMutableArray *list_<it.label.text> = nil;}; separator="\n"><"\n">
+<ruleDescriptor.ruleLabels:ruleLabelDef(); separator="\n"><"\n">
+<ruleDescriptor.ruleListLabels:{ll|ParserRuleReturnScope *<ll.label.text> = nil;}; separator="\n"><"\n">
+%>
 
 lexerRuleLabelDefs() ::= <<
 <[ruleDescriptor.tokenLabels,
   ruleDescriptor.tokenListLabels,
   ruleDescriptor.ruleLabels]
-    :{it | <labelType> *<it.label.text>=nil;}; separator="\n"
+    :{it |<labelType> *<it.label.text>=nil;}; separator="\n"
 >
-<ruleDescriptor.charLabels:{it | NSInteger <it.label.text>;}; separator="\n">
+<ruleDescriptor.charLabels:{it |NSInteger <it.label.text>;}; separator="\n">
 <[ruleDescriptor.tokenListLabels,
-  ruleDescriptor.ruleListLabels]:{it | AMutableArray *list_<it.label.text>=nil; }; separator="\n">
+  ruleDescriptor.ruleListLabels]:{it |AMutableArray *list_<it.label.text>=nil; }; separator="\n">
 >>
 
 ruleReturnValue() ::= <%
@@ -952,7 +973,7 @@
 
 ruleCleanUp() ::= <<
 /* token+rule list labels */
-<[ruleDescriptor.tokenListLabels,ruleDescriptor.ruleListLabels]:{it | [list_<it.label.text> release];}; separator="\n">
+<[ruleDescriptor.tokenListLabels,ruleDescriptor.ruleListLabels]:{it |[list_<it.label.text> release];}; separator="\n">
 <if(ruleDescriptor.hasMultipleReturnValues)>
 <if(!TREE_PARSER)>
 [retval setStop:[input LT:-1]];<\n>
@@ -991,7 +1012,7 @@
         <block><\n>
 <else>
         NSInteger _type = <ruleName>;
-        NSInteger _channel = ANTLRTokenChannelDefault;
+        NSInteger _channel = TokenChannelDefault;
         <ruleMemoization(name=ruleName)>
         <lexerRuleLabelDefs()>
         <ruleDescriptor.actions.init>
@@ -1089,8 +1110,8 @@
             if ( cnt<decisionNumber> >= 1 )
                 goto loop<decisionNumber>;
             <ruleBacktrackFailure()>
-            ANTLREarlyExitException *eee =
-                [ANTLREarlyExitException newException:input decisionNumber:<decisionNumber>];
+            EarlyExitException *eee =
+                [EarlyExitException newException:input decisionNumber:<decisionNumber>];
             <@earlyExitException()>
             @throw eee;
     }
@@ -1207,7 +1228,7 @@
     <if(backtracking)>state.failed = NO;<\n><endif>
 } else {
     <ruleBacktrackFailure()>
-    ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException newException:nil stream:input];
+    MismatchedSetException *mse = [MismatchedSetException newException:nil stream:input];
     <@mismatchedSetException()>
 <if(LEXER)>
 <if(label)>
@@ -1237,7 +1258,7 @@
 [self matchString:<string>]; <checkRuleBacktrackFailure()>
 NSInteger StartLine<elementIndex> = self.line;
 NSInteger <label>StartCharPos<elementIndex> = self.charPositionInLine;
-<label> = [[<labelType> newToken:input Type:ANTLRTokenTypeInvalid Channel:ANTLRTokenChannelDefault Start:<label>Start Stop:input.index] retain];
+<label> = [[<labelType> newToken:input Type:TokenTypeInvalid Channel:TokenChannelDefault Start:<label>Start Stop:input.index] retain];
 [self setLine:<label>StartLine<elementIndex>];
 [self setCharPositionInLine:<label>StartCharPos<elementIndex>];
 <else>
@@ -1300,7 +1321,7 @@
 <if(label)>
 NSInteger <label>Start<elementIndex> = input.index;
 [self m<rule.name><if(args)>:<args; separator=" :"><endif>]; <checkRuleBacktrackFailure()><\n>
-<label> = [[<labelType> newToken:input Type:ANTLRTokenTypeInvalid Channel:ANTLRTokenChannelDefault Start:<label>Start<elementIndex> Stop:input.index-1] retain];
+<label> = [[<labelType> newToken:input Type:TokenTypeInvalid Channel:TokenChannelDefault Start:<label>Start<elementIndex> Stop:input.index-1] retain];
 <label>.line = self.line;
 <else>
 [self <if(scope)><scope:delegateName()>.<endif>m<rule.name><if(args)>:<args; separator=" :"><endif>]; <checkRuleBacktrackFailure()><\n>
@@ -1317,11 +1338,11 @@
 lexerMatchEOF(label,elementIndex) ::= <<
 <if(label)>
 NSInteger <label>Start<elementIndex> = input.index;
-[self matchChar:ANTLRCharStreamEOF]; <checkRuleBacktrackFailure()><\n>
-<labelType> <label> = [[<labelType> newToken:input Type:ANTLRTokenTypeEOF Channel:ANTLRTokenChannelDefault Start:<label>Start<elementIndex> Stop:input.index-1] retain];
+[self matchChar:CharStreamEOF]; <checkRuleBacktrackFailure()><\n>
+<labelType> <label> = [[<labelType> newToken:input Type:TokenTypeEOF Channel:TokenChannelDefault Start:<label>Start<elementIndex> Stop:input.index-1] retain];
 <label>.line = self.line;
 <else>
-[self matchChar:ANTLRCharStreamEOF]; <checkRuleBacktrackFailure()><\n>
+[self matchChar:CharStreamEOF]; <checkRuleBacktrackFailure()><\n>
 <endif>
 >>
 
@@ -1355,7 +1376,7 @@
 validateSemanticPredicate(pred,description) ::= <<
 if ( !(<evalPredicate(...)>) ) {
     <ruleBacktrackFailure()>
-    @throw [ANTLRFailedPredicateException newException:@"<ruleName>" predicate:@"<description>" stream:input];
+    @throw [FailedPredicateException newException:@"<ruleName>" predicate:@"<description>" stream:input];
 }
 >>
 
@@ -1369,7 +1390,7 @@
     alt<decisionNumber> = <eotPredictsAlt>;
 <else>
     <ruleBacktrackFailure()>
-    ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newException:<decisionNumber> state:<stateNumber> stream:input];
+    NoViableAltException *nvae = [NoViableAltException newException:<decisionNumber> state:<stateNumber> stream:input];
     nvae.c = LA<decisionNumber>_<stateNumber>;
     <@noViableAltException()>
     @throw nvae;<\n>
@@ -1433,7 +1454,7 @@
     alt<decisionNumber> = <eotPredictsAlt>;
 <else>
     <ruleBacktrackFailure()>
-    ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newException:<decisionNumber> state:<stateNumber> stream:input];
+    NoViableAltException *nvae = [NoViableAltException newException:<decisionNumber> state:<stateNumber> stream:input];
     nvae.c = charLA<decisionNumber>;
     <@noViableAltException()>
     @throw nvae;<\n>
@@ -1479,10 +1500,10 @@
 /** Used in headerFile */
 cyclicDFAInterface(dfa) ::= <<
 #pragma mark Cyclic DFA interface start DFA<dfa.decisionNumber>
-@interface DFA<dfa.decisionNumber> : ANTLRDFA {
+@interface DFA<dfa.decisionNumber> : DFA {
 }
-+ newDFA<dfa.decisionNumber>WithRecognizer:(ANTLRBaseRecognizer *)theRecognizer;
-- initWithRecognizer:(ANTLRBaseRecognizer *)recognizer;
++ (DFA<dfa.decisionNumber> *) newDFA<dfa.decisionNumber>WithRecognizer:(BaseRecognizer *)theRecognizer;
+- initWithRecognizer:(BaseRecognizer *)recognizer;
 @end /* end of DFA<dfa.decisionNumber> interface  */<\n>
 #pragma mark Cyclic DFA interface end DFA<dfa.decisionNumber><\n>
 >>
@@ -1498,30 +1519,42 @@
  */
 cyclicDFA(dfa) ::= <<
 #pragma mark Cyclic DFA implementation start DFA<dfa.decisionNumber>
+
 @implementation DFA<dfa.decisionNumber>
 const static NSInteger dfa<dfa.decisionNumber>_eot[<dfa.numberOfStates>] =
     {<dfa.eot; wrap="\n     ", separator=",", null="-1">};
 const static NSInteger dfa<dfa.decisionNumber>_eof[<dfa.numberOfStates>] =
     {<dfa.eof; wrap="\n     ", separator=",", null="-1">};
 const static unichar dfa<dfa.decisionNumber>_min[<dfa.numberOfStates>] =
-    {<dfa.min; wrap="\n     ", separator=",", null="0">};
+    {<dfa.min; wrap="\n     ", separator=",", null="-1">};
 const static unichar dfa<dfa.decisionNumber>_max[<dfa.numberOfStates>] =
-    {<dfa.max; wrap="\n     ", separator=",", null="0">};
+    {<dfa.max; wrap="\n     ", separator=",", null="-1">};
 const static NSInteger dfa<dfa.decisionNumber>_accept[<dfa.numberOfStates>] =
     {<dfa.accept; wrap="\n     ", separator=",", null="-1">};
 const static NSInteger dfa<dfa.decisionNumber>_special[<dfa.numberOfStates>] =
     {<dfa.special; wrap="\n     ", separator=",", null="-1">};
-const static NSInteger dfa<dfa.decisionNumber>_transition[] = {};
+
+/** Used when there is no transition table entry for a particular state */
+#define dfa<dfa.decisionNumber>_T_empty	    nil
+
 <dfa.edgeTransitionClassMap.keys:{ table |
-const static NSInteger dfa<dfa.decisionNumber>_transition<i0>[] = {<table; separator=", ", wrap="\n ", null="-1">\};
+const static NSInteger dfa<dfa.decisionNumber>_T<i0>[] =
+{
+     <table; separator=", ", wrap="\n ", null="-1">
+\};
 }; null="">
 
-+ (id) newDFA<dfa.decisionNumber>WithRecognizer:(ANTLRBaseRecognizer *)aRecognizer
+const static NSInteger *dfa<dfa.decisionNumber>_transition[] =
+{
+    <dfa.transitionEdgeTables:{whichTable|dfa<dfa.decisionNumber>_T<whichTable>}; separator=", ", wrap="\n", null="nil">
+};
+
++ (DFA<dfa.decisionNumber> *) newDFA<dfa.decisionNumber>WithRecognizer:(BaseRecognizer *)aRecognizer
 {
     return [[[DFA<dfa.decisionNumber> alloc] initWithRecognizer:aRecognizer] retain];
 }
 
-- (id) initWithRecognizer:(ANTLRBaseRecognizer *) theRecognizer
+- (id) initWithRecognizer:(BaseRecognizer *) theRecognizer
 {
     self = [super initWithRecognizer:theRecognizer];
     if ( self != nil ) {
@@ -1532,28 +1565,23 @@
         max = dfa<dfa.decisionNumber>_max;
         accept = dfa<dfa.decisionNumber>_accept;
         special = dfa<dfa.decisionNumber>_special;
-        if (!(transition = calloc(<dfa.numberOfStates>, sizeof(void*)))) {
-            [self release];
-            return nil;
-        }
-        len = <dfa.numberOfStates>;
-        <dfa.transitionEdgeTables:{whichTable|transition[<i0>] = dfa<dfa.decisionNumber>_transition<whichTable>;}; separator="\n", null="">
+        transition = dfa<dfa.decisionNumber>_transition;
     }
     return self;
 }
 
 <if(dfa.specialStateSTs)>
 /* start dfa.specialStateSTs */
-- (NSInteger) specialStateTransition:(NSInteger)s Stream:(id\<ANTLRIntStream\>)anInput
+- (NSInteger) specialStateTransition:(NSInteger)s Stream:(id\<IntStream\>)anInput
 {
 <if(LEXER)>
-    id\<ANTLRIntStream\> input = anInput;<\n>
+    id\<IntStream\> input = anInput;<\n>
 <endif>
 <if(PARSER)>
-    id\<ANTLRTokenStream\> input = (id\<ANTLRTokenStream\>)anInput;<\n>
+    id\<TokenStream\> input = (id\<TokenStream\>)anInput;<\n>
 <endif>
 <if(TREE_PARSER)>
-    id\<ANTLRTreeNodeStream\> input = (id\<ANTLRTreeNodeStream\>)anInput;<\n>
+    id\<TreeNodeStream\> input = (id\<TreeNodeStream\>)anInput;<\n>
 <endif>
     switch (s) {
         <dfa.specialStateSTs:{state |
@@ -1563,7 +1591,7 @@
 <if(backtracking)>
     if ( [recognizer getBacktrackingLevel] > 0 ) { [recognizer setFailed:YES]; return -1; }<\n>
 <endif>
-    ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newException:<dfa.decisionNumber> state:s stream:recognizer.input];
+    NoViableAltException *nvae = [NoViableAltException newException:<dfa.decisionNumber> state:s stream:recognizer.input];
     // nvae.c = s;
     /* [self error:nvae]; */ <! for debugger - do later !>
     @throw nvae;
@@ -1573,7 +1601,7 @@
 
 - (void) dealloc
 {
-    free(transition);
+    //free(transition);
     [super dealloc];
 }
 
@@ -1627,9 +1655,9 @@
 
 andPredicates(left,right) ::= "(<left>&&<right>)"
 
-orPredicates(operands) ::= "(<first(operands)><rest(operands):{o | ||<o>}>)"
+orPredicates(operands) ::= "(<operands; separator=\"||\">)"
 
-notPredicate(pred) ::= "!(<evalPredicate(pred, \"\")>)"
+notPredicate(pred) ::= "!(<evalPredicate(pred, {})>)"
 
 evalPredicate(pred,description) ::= "(<pred>)"
 
@@ -1638,7 +1666,7 @@
  *
  * synpreds are broken in cyclic DFA special states
  *  Damn! For now, work around with using the selectors directly, and by providing a trampoline evalSynPred method in
- *  ANTLRDFA
+ *  DFA
  */
 /* evalSynPredicate(pred,description) ::= "[self evaluateSyntacticPredicate:<pred>Selector stream:input]" */
 evalSynPredicate(pred,description) ::= "[self evaluateSyntacticPredicate:@selector(<pred>_fragment)]"
@@ -1657,21 +1685,23 @@
 
 isolatedLookaheadRangeTest(lower,upper,k,rangeNumber,lowerAsInt,upperAsInt) ::= "(([input LA:<k>] >= <lower>) && ([input LA:<k>] \<= <upper>))"
 
-setTest(ranges) ::= "<ranges; separator=\"||\">"
+setTest(ranges) ::= <%
+<ranges; separator="||">
+%>
 
 // A T T R I B U T E S
 
-memVars(scope) ::= << <scope.attributes:{a|<a.type> <a.name>;<\n>}; separator="\n"> >>
+memVars(scope) ::= <% <scope.attributes:{a|<a.type> <a.name>;<\n>}; separator="\n"> %>
 
-properties(scope) ::= <<
+properties(scope) ::= <%
 <scope.attributes:{a|@property (assign, getter=get<a.name>, setter=set<a.name>:) <a.type> <a.name>;<\n>}; separator="\n">
->>
+%>
 
-methodsDecl(scope) ::= <<
+methodsDecl(scope) ::= <%
 <scope.attributes:{a|- (<a.type>)get<a.name>;<\n>- (void)set<a.name>:(<a.type>)aVal;<\n>}; separator="\n">
->>
+%>
 
-synthesize(scope) ::= << <scope.attributes:{a|@synthesize <a.name>;}; separator="\n"> >>
+synthesize(scope) ::= <% <scope.attributes:{a|@synthesize <a.name>;}; separator="\n"> %>
 
 methods(scope) ::= <%
 <scope.attributes:{a|
@@ -1681,7 +1711,7 @@
 
 globalAttributeScopeInterface(scope) ::= <%
 /* globalAttributeScopeInterface */<\n>
-@interface <scope.name>_Scope : ANTLRSymbolsScope {<\n>
+@interface <scope.name>_Scope : SymbolsScope {<\n>
 <if(scope.attributes)>
 <memVars(scope)>
 <endif>
@@ -1704,7 +1734,7 @@
 
 globalAttributeScopeMemVar(scope) ::= <%
 /* globalAttributeScopeMemVar */<\n>
-ANTLRSymbolStack *<scope.name>_stack;<\n>
+SymbolStack *<scope.name>_stack;<\n>
 <scope.name>_Scope *<scope.name>_scope;<\n>
 %>
 
@@ -1737,12 +1767,16 @@
 globalAttributeScopeInit(scope) ::= <<
 /* globalAttributeScopeInit */<\n>
 <scope.name>_scope = [<scope.name>_Scope new<scope.name>_Scope];<\n>
-<scope.name>_stack = [ANTLRSymbolStack newANTLRSymbolStackWithLen:30];<\n>
+<scope.name>_stack = [SymbolStack newSymbolStackWithLen:30];<\n>
 >>
 
-globalAttributeScopeDealloc(scope) ::= << [<scope.name>_stack release];<\n> >>
+globalAttributeScopeDealloc(scope) ::= <% [<scope.name>_stack release];<\n> %>
 
-globalAttributeScope(scope) ::= << static <scope.name>_stack;<\n> >>
+globalAttributeScope(scope) ::= <%
+<if(scope.name)>
+static <scope.name>_stack;<\n>
+<endif>
+%>
 
 ruleAttributeScopeMemVar(scope) ::= <%
 /* ObjC ruleAttributeScopeMemVar */<\n>
@@ -1754,7 +1788,7 @@
 ruleAttributeScopeInterface(scope) ::= <%
 <if(scope.attributes)>
 /* start of ruleAttributeScopeInterface */<\n>
-@interface <scope.name>_Scope : ANTLRSymbolsScope {<\n>
+@interface <scope.name>_Scope : SymbolsScope {<\n>
     <memVars(scope)><\n>
 }<\n>
 <\n>
@@ -1794,7 +1828,7 @@
 ruleAttributeScopeInit(scope) ::= <%
 /* ruleAttributeScopeInit */<\n>
 <scope.name>_scope = [<scope.name>_Scope new<scope.name>_Scope];<\n>
-<scope.name>_stack = [ANTLRSymbolStack newANTLRSymbolStackWithLen:30];<\n>
+<scope.name>_stack = [SymbolStack newSymbolStackWithLen:30];<\n>
 %>
 
 ruleAttributeScopeDealloc(scope) ::= <% [<scope.name>_Scope release];<\n> %>
@@ -1802,7 +1836,8 @@
 ruleAttributeScope(scope) ::= <%
 <if(scope.attributes)>
 /* ruleAttributeScope */<\n>
-static ANTLRSymbolStack *<scope.name>_stack;<\n>
+static SymbolStack *<scope.name>_stack;<\n>
+static <scope.name>_Scope *<scope.name>_scope;
 <endif>
 %>
 
@@ -1842,7 +1877,7 @@
 <endif>
 %>
 
-delegateName(d) ::= << <if(d.label)><d.label><else>g<d.name><endif> >>
+delegateName(d) ::= <% <if(d.label)><d.label><else>g<d.name><endif> %>
 
 /** Using a type to init value map, try to init a type; if not in table
  *  must be an object, default value is "null".
@@ -1850,7 +1885,9 @@
 initValue(typeName) ::= <% <objcTypeInitMap.(typeName)> %>
 
 /** Define a rule label including default value */
-ruleLabelDef(label) ::= << <ruleLabelType(referencedRule=label.referencedRule)> <label.label.text> = <initValue(typeName=ruleLabelType(referencedRule=label.referencedRule))>;<\n> >>
+ruleLabelDef(label) ::= <%
+<ruleLabelType(referencedRule=label.referencedRule)> <label.label.text> = <initValue(typeName=ruleLabelType(referencedRule=label.referencedRule))>;<\n>
+%>
 
 /** Define a return struct for a rule if the code needs to access its
  *  start/stop tokens, tree stuff, attributes, ...  Leave a hole for
@@ -1859,7 +1896,7 @@
 returnScopeInterface(scope) ::= <<
 <if(ruleDescriptor.hasMultipleReturnValues)>
 /* returnScopeInterface <ruleDescriptor:returnStructName()> */
-@interface <ruleDescriptor:returnStructName()> : ANTLR<if(TREE_PARSER)>Tree<else>Parser<endif>RuleReturnScope { /* returnScopeInterface line 1838 */
+@interface <ruleDescriptor:returnStructName()> : <if(TREE_PARSER)>Tree<else>Parser<endif>RuleReturnScope { /* returnScopeInterface line 1838 */
 <@memVars()> /* ObjC start of memVars() */<\n>
 <if(scope.attributes)>
 <memVars(scope)><\n>
@@ -2019,7 +2056,7 @@
 (<scope>!=nil?[[input getTokenStream] toStringFromStart:[[input getTreeAdaptor] getTokenStartIndex:[<scope> getStart]]
          ToEnd:[[input getTreeAdaptor] getTokenStopIndex:[<scope> getStart]]]:0)
 <else>
-(<scope>!=nil?([input toStringFromStart:[<scope> getStart] ToEnd:[<scope> getStop]]:0)
+(<scope>!=nil?([input toStringFromToken:[<scope> getStart] ToToken:[<scope> getStop]]:0)
 <endif>
 %>
 ruleLabelPropertyRef_st(scope,attr) ::= "(<scope>!=nil?[<scope> st]:nil)"
@@ -2099,7 +2136,7 @@
 >>
 
 bitsetInit(name, words64) ::= <<
-<name> = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)<name>_data Count:(NSUInteger)<length(words64)>] retain];<\n>
+<name> = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)<name>_data Count:(NSUInteger)<length(words64)>] retain];<\n>
 >>
 
 codeFileExtension() ::= ".m"
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/ObjC/ST.stg b/tool/src/main/resources/org/antlr/codegen/templates/ObjC/ST.stg
index 8350477..398d34f 100644
--- a/tool/src/main/resources/org/antlr/codegen/templates/ObjC/ST.stg
+++ b/tool/src/main/resources/org/antlr/codegen/templates/ObjC/ST.stg
@@ -51,7 +51,7 @@
 
 @returnScopeInterface() ::= <<
 /* ST returnScopeInterface */
-@interface <returnScopeInterface.name> : ANTLRReturnScope {
+@interface <returnScopeInterface.name> : ReturnScope {
 <returnScopeInterface.memVars()>
 }
 <returnScopeInterface.properties()>
@@ -173,7 +173,7 @@
 
 @STAttrMap.interface() ::= <<
 /* -------- ST start STAttrMap.interface ------------ */
-@interface STAttrMap : ANTLRHashMap {
+@interface STAttrMap : HashMap {
 /*    <@STAttrMap.memVars()> */
     STGroup *templateLib;
 }
@@ -284,13 +284,13 @@
 replaceTextInLine() ::= <<
 /* -------- ST start replaceTextInLine ------------ */
 <if(TREE_PARSER)>
-[[(ANTLRTokenRewriteStream *)input getTokenStream]
+[[(TokenRewriteStream *)input getTokenStream]
     replaceFromIndex:[[input getTreeAdaptor] getTokenStartIndex:retval.start]
              ToIndex:[[input getTreeAdaptor] getTokenStopIndex:retval.start]
                 Text:retval.st];
 <else>
-[(ANTLRTokenRewriteStream *)input)
-        replaceFromIndex:[((ANTLRCommonToken *)retval.start) getTokenIndex]
+[(TokenRewriteStream *)input)
+        replaceFromIndex:[((CommonToken *)retval.start) getTokenIndex]
                  ToIndex:[[input LT:-1] getTokenIndex]
                     Text:retval.st];
 <endif>
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/Perl5/Perl5.stg b/tool/src/main/resources/org/antlr/codegen/templates/Perl5/Perl5.stg
index fa875d1..1eb08ee 100644
--- a/tool/src/main/resources/org/antlr/codegen/templates/Perl5/Perl5.stg
+++ b/tool/src/main/resources/org/antlr/codegen/templates/Perl5/Perl5.stg
@@ -1105,7 +1105,7 @@
 
 andPredicates(left,right) ::= "(<left> && <right>)"
 
-orPredicates(operands) ::= "(<first(operands)><rest(operands):{o | ||<o>}>)"
+orPredicates(operands) ::= "(<operands; separator=\"||\">)"
 
 notPredicate(pred) ::= "!(<evalPredicate(...)>)"
 
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/Python/AST.stg b/tool/src/main/resources/org/antlr/codegen/templates/Python/AST.stg
index a9252e3..f007330 100644
--- a/tool/src/main/resources/org/antlr/codegen/templates/Python/AST.stg
+++ b/tool/src/main/resources/org/antlr/codegen/templates/Python/AST.stg
@@ -60,7 +60,7 @@
 
 def setTreeAdaptor(self, adaptor):
     self._adaptor = adaptor
-    <grammar.directDelegates:{g|<g:delegateName()>.adaptor = adaptor}; separator="\n">
+    <grammar.directDelegates:{g|self.<g:delegateName()>.adaptor = adaptor}; separator="\n">
 
 adaptor = property(getTreeAdaptor, setTreeAdaptor)
 >>
@@ -107,7 +107,7 @@
 // T r a c k i n g  R u l e  E l e m e n t s
 
 /** ID and track it for use in a rewrite rule */
-tokenRefTrack(token,label,elementIndex,terminalOptions) ::= <<
+tokenRefTrack(token,label,elementIndex,terminalOptions={}) ::= <<
 <tokenRefBang(...)> <! Track implies no auto AST construction!>
 <finishedBacktracking({stream_<token>.add(<label>)})>
 >>
@@ -115,19 +115,19 @@
 /** ids+=ID and track it for use in a rewrite rule; adds to ids *and*
  *  to the tracking list stream_ID for use in the rewrite.
  */
-tokenRefTrackAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
+tokenRefTrackAndListLabel(token,label,elementIndex,terminalOptions={}) ::= <<
 <tokenRefTrack(...)>
 <listLabel(elem=label,...)>
 >>
 
 /** ^(ID ...) track for rewrite */
-tokenRefRuleRootTrack(token,label,elementIndex,terminalOptions) ::= <<
+tokenRefRuleRootTrack(token,label,elementIndex,terminalOptions={}) ::= <<
 <tokenRefBang(...)>
 <finishedBacktracking({stream_<token>.add(<label>)})>
 >>
 
 /** Match ^(label+=TOKEN ...) track for rewrite */
-tokenRefRuleRootTrackAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
+tokenRefRuleRootTrackAndListLabel(token,label,elementIndex,terminalOptions={}) ::= <<
 <tokenRefRuleRootTrack(...)>
 <listLabel(elem=label,...)>
 >>
@@ -325,7 +325,7 @@
 >>
 
 /** Gen ID or ID[args] */
-rewriteTokenRef(token,elementIndex,terminalOptions,args) ::= <<
+rewriteTokenRef(token,elementIndex,args,terminalOptions={}) ::= <<
 self._adaptor.addChild(root_<treeLevel>, <createRewriteNodeFromElement(...)>)<\n>
 >>
 
@@ -348,16 +348,16 @@
 rewriteTokenListLabelRefRoot ::= rewriteTokenLabelRefRoot
 
 /** Gen ^(ID ...) or ^(ID[args] ...) */
-rewriteTokenRefRoot(token,elementIndex,terminalOptions,args) ::= <<
+rewriteTokenRefRoot(token,elementIndex,args,terminalOptions={}) ::= <<
 root_<treeLevel> = self._adaptor.becomeRoot(<createRewriteNodeFromElement(...)>, root_<treeLevel>)<\n>
 >>
 
-rewriteImaginaryTokenRef(args,token,terminalOptions,elementIndex) ::= <<
-self._adaptor.addChild(root_<treeLevel>, <createImaginaryNode(token, terminalOptions, args)>)<\n>
+rewriteImaginaryTokenRef(args,token,elementIndex,terminalOptions={}) ::= <<
+self._adaptor.addChild(root_<treeLevel>, <createImaginaryNode(token, args, terminalOptions)>)<\n>
 >>
 
-rewriteImaginaryTokenRefRoot(args,token,terminalOptions,elementIndex) ::= <<
-root_<treeLevel> = self._adaptor.becomeRoot(<createImaginaryNode(token, terminalOptions, args)>, root_<treeLevel>)<\n>
+rewriteImaginaryTokenRefRoot(args,token,elementIndex,terminalOptions={}) ::= <<
+root_<treeLevel> = self._adaptor.becomeRoot(<createImaginaryNode(token, args, terminalOptions)>, root_<treeLevel>)<\n>
 >>
 
 /** plain -> {foo} action */
@@ -413,7 +413,7 @@
 self._adaptor.addChild(root_<treeLevel>, stream_<label>.nextTree())<\n>
 >>
 
-createImaginaryNode(tokenType,terminalOptions,args) ::= <<
+createImaginaryNode(tokenType,args,terminalOptions={}) ::= <<
 <if(terminalOptions.node)>
 <! new MethodNode(IDLabel, args) !>
 <terminalOptions.node>(<tokenType><if(args)>, <args; separator=", "><endif>)
@@ -433,7 +433,7 @@
 //<endif>
 
 
-createRewriteNodeFromElement(token,terminalOptions,args) ::= <<
+createRewriteNodeFromElement(token,args,terminalOptions={}) ::= <<
 <if(terminalOptions.node)>
 <terminalOptions.node>(stream_<token>.nextToken()<if(args)>, <args; separator=", "><endif>)
 <else>
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/Python/ASTParser.stg b/tool/src/main/resources/org/antlr/codegen/templates/Python/ASTParser.stg
index 64ffa68..7b4bc03 100644
--- a/tool/src/main/resources/org/antlr/codegen/templates/Python/ASTParser.stg
+++ b/tool/src/main/resources/org/antlr/codegen/templates/Python/ASTParser.stg
@@ -39,12 +39,14 @@
  */
 
 finishedBacktracking(block) ::= <<
+<if(!ruleDescriptor.isSynPred)>
 <if(backtracking)>
 if <actions.(actionScope).synpredgate>:
     <block>
 <else>
 <block>
 <endif>
+<endif>
 >>
 
 @ruleBody.setErrorReturnValue() ::= <<
@@ -54,7 +56,7 @@
 // TOKEN AST STUFF
 
 /** ID and output=AST */
-tokenRef(token,label,elementIndex,terminalOptions) ::= <<
+tokenRef(token,label,elementIndex,terminalOptions={}) ::= <<
 <super.tokenRef(...)>
 <finishedBacktracking({
 <label>_tree = <createNodeFromToken(...)>
@@ -63,10 +65,10 @@
 >>
 
 /** ID! and output=AST (same as plain tokenRef) */
-tokenRefBang(token,label,elementIndex,terminalOptions) ::= "<super.tokenRef(...)>"
+tokenRefBang(token,label,elementIndex,terminalOptions={}) ::= "<super.tokenRef(...)>"
 
 /** ID^ and output=AST */
-tokenRefRuleRoot(token,label,elementIndex,terminalOptions) ::= <<
+tokenRefRuleRoot(token,label,elementIndex,terminalOptions={}) ::= <<
 <super.tokenRef(...)>
 <finishedBacktracking({
 <label>_tree = <createNodeFromToken(...)>
@@ -75,19 +77,19 @@
 >>
 
 /** ids+=ID! and output=AST */
-tokenRefBangAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
+tokenRefBangAndListLabel(token,label,elementIndex,terminalOptions={}) ::= <<
 <tokenRefBang(...)>
 <listLabel(elem=label,...)>
 >>
 
 /** label+=TOKEN when output=AST but not rewrite alt */
-tokenRefAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
+tokenRefAndListLabel(token,label,elementIndex,terminalOptions={}) ::= <<
 <tokenRef(...)>
 <listLabel(elem=label,...)>
 >>
 
 /** Match label+=TOKEN^ when output=AST but not rewrite alt */
-tokenRefRuleRootAndListLabel(token,label,terminalOptions,elementIndex) ::= <<
+tokenRefRuleRootAndListLabel(token,label,elementIndex,terminalOptions={}) ::= <<
 <tokenRefRuleRoot(...)>
 <listLabel(elem=label,...)>
 >>
@@ -105,20 +107,20 @@
 // rather than just added on code.  Investigate that refactoring when
 // I have more time.
 
-matchSet(s,label,terminalOptions,elementIndex,postmatchCode) ::= <%
+matchSet(s,label,elementIndex,postmatchCode,terminalOptions={}) ::= <%
 <super.matchSet(postmatchCode={<finishedBacktracking({self._adaptor.addChild(root_0, <createNodeFromToken(...)>)})>}, ...)>
 %>
 
-matchRuleBlockSet(s,label,terminalOptions,elementIndex,postmatchCode,treeLevel="0") ::= <<
+matchRuleBlockSet(s,label,elementIndex,postmatchCode,treeLevel="0",terminalOptions={}) ::= <<
 <matchSet(...)>
 >>
 
-matchSetBang(s,label,elementIndex,terminalOptions,postmatchCode) ::= "<super.matchSet(...)>"
+matchSetBang(s,label,elementIndex,postmatchCode,terminalOptions={}) ::= "<super.matchSet(...)>"
 
 // note there is no matchSetTrack because -> rewrites force sets to be
 // plain old blocks of alts: (A|B|...|C)
 
-matchSetRuleRoot(s,label,terminalOptions,elementIndex,debug) ::= <<
+matchSetRuleRoot(s,label,elementIndex,debug,terminalOptions={}) ::= <<
 <if(label)>
 <label> = self.input.LT(1)<\n>
 <endif>
@@ -162,7 +164,7 @@
 
 // WILDCARD AST
 
-wildcard(token,label,elementIndex,terminalOptions) ::= <<
+wildcard(token,label,elementIndex,terminalOptions={}) ::= <<
 <super.wildcard(...)>
 <finishedBacktracking({
 <label>_tree = self._adaptor.createWithPayload(<label>)
@@ -172,7 +174,7 @@
 
 wildcardBang(label,elementIndex) ::= "<super.wildcard(...)>"
 
-wildcardRuleRoot(token,label,elementIndex,terminalOptions) ::= <<
+wildcardRuleRoot(token,label,elementIndex,terminalOptions={}) ::= <<
 <super.wildcard(...)>
 <finishedBacktracking({
 <label>_tree = self._adaptor.createWithPayload(<label>)
@@ -180,7 +182,7 @@
 })>
 >>
 
-createNodeFromToken(label,terminalOptions) ::= <%
+createNodeFromToken(label,terminalOptions={}) ::= <%
 <if(terminalOptions.node)>
 <terminalOptions.node>(<label>) <! new MethodNode(IDLabel) !>
 <else>
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/Python/ASTTreeParser.stg b/tool/src/main/resources/org/antlr/codegen/templates/Python/ASTTreeParser.stg
index 718a55f..996341b 100644
--- a/tool/src/main/resources/org/antlr/codegen/templates/Python/ASTTreeParser.stg
+++ b/tool/src/main/resources/org/antlr/codegen/templates/Python/ASTTreeParser.stg
@@ -114,13 +114,13 @@
 /** ID! and output=AST (same as plain tokenRef) 'cept add
  *  setting of _last
  */
-tokenRefBang(token,label,elementIndex,terminalOptions) ::= <<
+tokenRefBang(token,label,elementIndex,terminalOptions={}) ::= <<
 _last = self.input.LT(1)
 <super.tokenRef(...)>
 >>
 
 /** ID auto construct */
-tokenRef(token,label,elementIndex,terminalOptions) ::= <<
+tokenRef(token,label,elementIndex,terminalOptions={}) ::= <<
 _last = self.input.LT(1)
 <super.tokenRef(...)>
 <if(!rewriteMode)>
@@ -141,13 +141,13 @@
 >>
 
 /** label+=TOKEN auto construct */
-tokenRefAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
+tokenRefAndListLabel(token,label,elementIndex,terminalOptions={}) ::= <<
 <tokenRef(...)>
 <listLabel(elem=label,...)>
 >>
 
 /** ^(ID ...) auto construct */
-tokenRefRuleRoot(token,label,elementIndex,terminalOptions) ::= <<
+tokenRefRuleRoot(token,label,elementIndex,terminalOptions={}) ::= <<
 _last = self.input.LT(1)
 <super.tokenRef(...)>
 <if(!rewriteMode)>
@@ -163,13 +163,13 @@
 >>
 
 /** Match ^(label+=TOKEN ...) auto construct */
-tokenRefRuleRootAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
+tokenRefRuleRootAndListLabel(token,label,elementIndex,terminalOptions={}) ::= <<
 <tokenRefRuleRoot(...)>
 <listLabel(elem=label,...)>
 >>
 
 /** Match . wildcard and auto dup the node/subtree */
-wildcard(token,label,elementIndex,terminalOptions) ::= <<
+wildcard(token,label,elementIndex,terminalOptions={}) ::= <<
 _last = self.input.LT(1)
 <super.wildcard(...)>
 <if(!rewriteMode)>
@@ -186,7 +186,7 @@
 >>
 
 // SET AST
-matchSet(s,label,terminalOptions,elementIndex,postmatchCode) ::= <<
+matchSet(s,label,elementIndex,postmatchCode,terminalOptions={}) ::= <<
 _last = self.input.LT(1)
 <super.matchSet(postmatchCode={
 <if(!rewriteMode)>
@@ -202,17 +202,17 @@
 }, ...)>
 >>
 
-matchRuleBlockSet(s,label,terminalOptions,elementIndex,postmatchCode,treeLevel="0") ::= <<
+matchRuleBlockSet(s,label,elementIndex,postmatchCode,treeLevel="0",terminalOptions={}) ::= <<
 <matchSet(...)>
 <noRewrite(...)> <! set return tree !>
 >>
 
-matchSetBang(s,label,terminalOptions,elementIndex,postmatchCode) ::= <<
+matchSetBang(s,label,elementIndex,postmatchCode,terminalOptions={}) ::= <<
 _last = self.input.LT(1)
 <super.matchSet(...)>
 >>
 
-matchSetRuleRoot(s,label,terminalOptions,elementIndex,debug) ::= <<
+matchSetRuleRoot(s,label,elementIndex,debug,terminalOptions={}) ::= <<
 <super.matchSet(postmatchCode={
 <if(!rewriteMode)>
 <finishedBacktracking({
@@ -293,7 +293,7 @@
 /** Streams for token refs are tree nodes now; override to
  *  change nextToken to nextNode.
  */
-createRewriteNodeFromElement(token,terminalOptions,scope) ::= <<
+createRewriteNodeFromElement(token,scope,terminalOptions={}) ::= <<
 <if(terminalOptions.node)>
 <terminalOptions.node>(stream_<token>.nextNode())
 <else>
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/Python/Python.stg b/tool/src/main/resources/org/antlr/codegen/templates/Python/Python.stg
index 71c324c..cffdf86 100644
--- a/tool/src/main/resources/org/antlr/codegen/templates/Python/Python.stg
+++ b/tool/src/main/resources/org/antlr/codegen/templates/Python/Python.stg
@@ -128,6 +128,8 @@
 
         <grammar.directDelegates:
          {g|self.<g:delegateName()> = <g.recognizerName>(<trunc(g.delegators):{p|<p:delegateName()>, }>self, input, state)}; separator="\n">
+        <grammar.directDelegates:
+         {g|<g.delegates:{h|self.<h:delegateName()> = self.<g:delegateName()>.<h:delegateName()>}; separator="\n">}; separator="\n">
         <grammar.delegators:
          {g|self.<g:delegateName()> = <g:delegateName()>}; separator="\n">
         <last(grammar.delegators):
@@ -266,8 +268,8 @@
          {g|self.<g:delegateName()> = <g:delegateName()>}; separator="\n">
         <grammar.directDelegates:
          {g|self.<g:delegateName()> = <g.recognizerName>(<trunc(g.delegators):{p|<p:delegateName()>, }>self, input, state)}; separator="\n">
-        <grammar.indirectDelegates:
-         {g|<g:delegateName()> = <g.delegator:delegateName()>.<g:delegateName()>}; separator="\n">
+        <grammar.directDelegates:
+         {g|<g.delegates:{h|self.<h:delegateName()> = self.<g:delegateName()>.<h:delegateName()>}; separator="\n">}; separator="\n">
         <last(grammar.delegators):
     	 {g|self.gParent = self.<g:delegateName()>}; separator="\n">
         self.delegates = [<grammar.delegates: {g|self.<g:delegateName()>}; separator = ", ">]
@@ -295,7 +297,7 @@
 
 delegateRule(ruleDescriptor) ::= <<
 def <ruleDescriptor.name>(self, <ruleDescriptor.parameterScope:parameterScope()>):
-<\ >   <if(ruleDescriptor.hasReturnValue)>return <endif>self.<ruleDescriptor.grammar:delegateName()>.<ruleDescriptor.name>(<ruleDescriptor.parameterScope.attributes:{a|<a.name>}; separator=", ">)
+<\ >   <if(ruleDescriptor.hasReturnValue)>return <endif>self.<ruleDescriptor.grammar:delegateName()>.<ruleDescriptor.name>(<if(ruleDescriptor.parameterScope)><ruleDescriptor.parameterScope.attributes:{a|<a.name>}; separator=", "><endif>)
 
 
 >>
@@ -478,7 +480,7 @@
 <if(ruleDescriptor.hasMultipleReturnValues)>
 retval = self.<ruleDescriptor.name>_return()
 retval.start = self.input.LT(1)<\n>
-<else>
+<elseif(ruleDescriptor.returnScope)>
 <ruleDescriptor.returnScope.attributes:{ a |
 <a.name> = <if(a.initValue)><a.initValue><else>None<endif>
 }>
@@ -507,9 +509,7 @@
   ruleDescriptor.wildcardTreeListLabels]
     :{it | list_<it.label.text> = None}; separator="\n"
 >
-<[ruleDescriptor.ruleLabels,ruleDescriptor.ruleListLabels]
-    :ruleLabelDef(); separator="\n"
->
+<ruleDescriptor.ruleLabels:ruleLabelDef(); separator="\n">
 <ruleDescriptor.ruleListLabels:{it | <it.label.text> = None}; separator="\n">
 >>
 
@@ -765,12 +765,12 @@
 >>
 
 /** match a token optionally with a label in front */
-tokenRef(token,label,elementIndex,terminalOptions) ::= <<
+tokenRef(token,label,elementIndex,terminalOptions={}) ::= <<
 <if(label)><label> = <endif>self.match(self.input, <token>, self.FOLLOW_<token>_in_<ruleName><elementIndex>)
 >>
 
 /** ids+=ID */
-tokenRefAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
+tokenRefAndListLabel(token,label,elementIndex,terminalOptions={}) ::= <<
 <tokenRef(token,label,elementIndex,terminalOptions)>
 <listLabel(label, label)>
 >>
@@ -798,7 +798,7 @@
 >>
 
 /** For now, sets are interval tests and must be tested inline */
-matchSet(s,label,elementIndex,terminalOptions,postmatchCode="") ::= <<
+matchSet(s,label,elementIndex,postmatchCode="",terminalOptions={}) ::= <<
 <if(label)>
 <label> = self.input.LT(1)<\n>
 <endif>
@@ -849,14 +849,14 @@
 <endif>
 >>
 
-wildcard(token,label,elementIndex,terminalOptions) ::= <<
+wildcard(token,label,elementIndex,terminalOptions={}) ::= <<
 <if(label)>
 <label> = self.input.LT(1)<\n>
 <endif>
 self.matchAny(self.input)
 >>
 
-wildcardAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
+wildcardAndListLabel(token,label,elementIndex,terminalOptions={}) ::= <<
 <wildcard(...)>
 <listLabel(label,label)>
 >>
@@ -1143,8 +1143,7 @@
 
         _s = s
 
-        <dfa.specialStateSTs:{state |
-if s == <i0>: <! compressed special state numbers 0..n-1 !>
+        <dfa.specialStateSTs:{state | if s == <i0>: <! compressed special state numbers 0..n-1 !>
     <state>}; separator="\nel">
 
 <if(backtracking)>
@@ -1211,7 +1210,7 @@
 
 andPredicates(left,right) ::= "((<left>) and (<right>))"
 
-orPredicates(operands) ::= "(<first(operands)><rest(operands):{o |  or <o>}>)"
+orPredicates(operands) ::= "(<operands; separator=\" or \">)"
 
 notPredicate(pred) ::= "not (<evalPredicate(pred, {})>)"
 
@@ -1237,33 +1236,41 @@
 // A T T R I B U T E S
 
 globalAttributeScopeClass(scope) ::= <<
+<if(scope)>
 <if(scope.attributes)>
 class <scope.name>_scope(object):
     def __init__(self):
         <scope.attributes:{it | self.<it.decl> = None}; separator="\n">
 
 <endif>
+<endif>
 >>
 
 globalAttributeScopeStack(scope) ::= <<
+<if(scope)>
 <if(scope.attributes)>
 self.<scope.name>_stack = []<\n>
 <endif>
+<endif>
 >>
 
 ruleAttributeScopeClass(scope) ::= <<
+<if(scope)>
 <if(scope.attributes)>
 class <scope.name>_scope(object):
     def __init__(self):
         <scope.attributes:{it | self.<it.decl> = None}; separator="\n">
 
 <endif>
+<endif>
 >>
 
 ruleAttributeScopeStack(scope) ::= <<
+<if(scope)>
 <if(scope.attributes)>
 self.<scope.name>_stack = []<\n>
 <endif>
+<endif>
 >>
 
 delegateName(d) ::= <<
@@ -1272,7 +1279,7 @@
 
 /** Define a rule label including default value */
 ruleLabelDef(label) ::= <<
-<label.label.text> = None<\n>
+<label.label.text> = None
 >>
 
 returnStructName(r) ::= "<r.name>_return"
@@ -1287,7 +1294,7 @@
     def __init__(self):
         super(<grammar.recognizerName>.<ruleDescriptor:returnStructName()>, self).__init__()
 
-        <scope.attributes:{it | self.<it.decl> = None}; separator="\n">
+        <if(scope)><scope.attributes:{it | self.<it.decl> = None}; separator="\n"><endif>
         <@ruleReturnInit()>
 
 
@@ -1297,7 +1304,7 @@
 >>
 
 parameterScope(scope) ::= <<
-<scope.attributes:{it | <it.decl>}; separator=", ">
+<if(scope)><scope.attributes:{it | <it.decl>}; separator=", "><endif>
 >>
 
 parameterAttributeRef(attr) ::= "<attr.name>"
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/Python3/AST.stg b/tool/src/main/resources/org/antlr/codegen/templates/Python3/AST.stg
new file mode 100644
index 0000000..6d4b68e
--- /dev/null
+++ b/tool/src/main/resources/org/antlr/codegen/templates/Python3/AST.stg
@@ -0,0 +1,452 @@
+/*
+ [The "BSD license"]
+ Copyright (c) 2005-2012 Terence Parr
+ 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.
+*/
+
+finishedBacktracking(block) ::= <<
+<if(backtracking)>
+if <actions.(actionScope).synpredgate>:
+    <block>
+<else>
+<block>
+<endif>
+>>
+
+@outputFile.imports() ::= <<
+<@super.imports()>
+<if(!TREE_PARSER)><! tree parser would already have imported !>
+from antlr3.tree import *<\n>
+<endif>
+>>
+
+/** Add an adaptor property that knows how to build trees */
+@genericParser.init() ::= <<
+self._adaptor = None
+self.adaptor = CommonTreeAdaptor()
+<@super.init()>
+>>
+
+@genericParser.members() ::= <<
+<@super.members()>
+<astAccessor()>
+>>
+
+astAccessor() ::= <<
+def getTreeAdaptor(self):
+    return self._adaptor
+
+def setTreeAdaptor(self, adaptor):
+    self._adaptor = adaptor
+    <grammar.directDelegates:{g|self.<g:delegateName()>.adaptor = adaptor}; separator="\n">
+
+adaptor = property(getTreeAdaptor, setTreeAdaptor)
+>>
+
+@returnScope.ruleReturnInit() ::= <<
+self.tree = None
+>>
+
+
+/** Add a variable to track rule's return AST */
+ruleDeclarations() ::= <<
+<super.ruleDeclarations()>
+root_0 = None<\n>
+>>
+
+ruleLabelDefs() ::= <<
+<super.ruleLabelDefs()>
+<[ruleDescriptor.tokenLabels,ruleDescriptor.wildcardTreeLabels,
+  ruleDescriptor.wildcardTreeListLabels]
+    :{it | <it.label.text>_tree = None}; separator="\n">
+<ruleDescriptor.tokenListLabels:{it | <it.label.text>_tree = None}; separator="\n">
+<ruleDescriptor.allTokenRefsInAltsWithRewrites
+    :{it | stream_<it> = RewriteRule<rewriteElementType>Stream(self._adaptor, "token <it>")}; separator="\n">
+<ruleDescriptor.allRuleRefsInAltsWithRewrites
+    :{it | stream_<it> = RewriteRuleSubtreeStream(self._adaptor, "rule <it>")}; separator="\n">
+>>
+
+/** When doing auto AST construction, we must define some variables;
+ *  These should be turned off if doing rewrites.  This must be a "mode"
+ *  as a rule could have both rewrite and AST within the same alternative
+ *  block.
+ */
+@alt.declarations() ::= <<
+<if(autoAST)>
+<if(outerAlt)>
+<if(!rewriteMode)>
+root_0 = self._adaptor.nil()<\n>
+<endif>
+<endif>
+<endif>
+>>
+
+
+// T r a c k i n g  R u l e  E l e m e n t s
+
+/** ID and track it for use in a rewrite rule */
+tokenRefTrack(token,label,elementIndex,terminalOptions={}) ::= <<
+<tokenRefBang(...)> <! Track implies no auto AST construction!>
+<finishedBacktracking({stream_<token>.add(<label>)})>
+>>
+
+/** ids+=ID and track it for use in a rewrite rule; adds to ids *and*
+ *  to the tracking list stream_ID for use in the rewrite.
+ */
+tokenRefTrackAndListLabel(token,label,elementIndex,terminalOptions={}) ::= <<
+<tokenRefTrack(...)>
+<listLabel(elem=label,...)>
+>>
+
+/** ^(ID ...) track for rewrite */
+tokenRefRuleRootTrack(token,label,elementIndex,terminalOptions={}) ::= <<
+<tokenRefBang(...)>
+<finishedBacktracking({stream_<token>.add(<label>)})>
+>>
+
+/** Match ^(label+=TOKEN ...) track for rewrite */
+tokenRefRuleRootTrackAndListLabel(token,label,elementIndex,terminalOptions={}) ::= <<
+<tokenRefRuleRootTrack(...)>
+<listLabel(elem=label,...)>
+>>
+
+/** rule when output=AST and tracking for rewrite */
+ruleRefTrack(rule,label,elementIndex,args,scope) ::= <<
+<super.ruleRef(...)>
+<finishedBacktracking({stream_<rule.name>.add(<label>.tree)})>
+>>
+
+/** x+=rule when output=AST and tracking for rewrite */
+ruleRefTrackAndListLabel(rule,label,elementIndex,args,scope) ::= <<
+<ruleRefTrack(...)>
+<listLabel(label, {<label>.tree})>
+>>
+
+/** ^(rule ...) rewrite */
+ruleRefRuleRootTrack(rule,label,elementIndex,args,scope) ::= <<
+<ruleRefRuleRoot(...)>
+<finishedBacktracking({stream_<rule.name>.add(<label>.tree)})>
+>>
+
+/** ^(x+=rule ...) rewrite */
+ruleRefRuleRootTrackAndListLabel(rule,label,elementIndex,args,scope) ::= <<
+<ruleRefRuleRootTrack(...)>
+<listLabel(label, {<label>.tree})>
+>>
+
+// R e w r i t e
+
+rewriteCode(
+        alts, description,
+        referencedElementsDeep, // ALL referenced elements to right of ->
+        referencedTokenLabels,
+        referencedTokenListLabels,
+        referencedRuleLabels,
+        referencedRuleListLabels,
+        referencedWildcardLabels,
+        referencedWildcardListLabels,
+        rewriteBlockLevel, enclosingTreeLevel, treeLevel) ::=
+<<
+# AST Rewrite
+# elements: <referencedElementsDeep; separator=", ">
+# token labels: <referencedTokenLabels; separator=", ">
+# rule labels: <referencedRuleLabels; separator=", ">
+# token list labels: <referencedTokenListLabels; separator=", ">
+# rule list labels: <referencedRuleListLabels; separator=", ">
+# wildcard labels: <[referencedWildcardLabels,referencedWildcardListLabels]; separator=", ">
+<finishedBacktracking({
+<prevRuleRootRef()>.tree = root_0
+<rewriteCodeLabels()>
+root_0 = self._adaptor.nil()
+<first(alts):rewriteAltFirst(); anchor>
+
+<rest(alts):{a | el<rewriteAltRest(a)>}; anchor, separator="\n\n">
+
+<! if tree parser and rewrite=true !>
+<if(TREE_PARSER)>
+<if(rewriteMode)>
+<prevRuleRootRef()>.tree = self._adaptor.rulePostProcessing(root_0)
+self.input.replaceChildren(
+    self._adaptor.getParent(retval.start),
+    self._adaptor.getChildIndex(retval.start),
+    self._adaptor.getChildIndex(_last),
+    retval.tree
+    )<\n>
+<endif>
+<endif>
+
+<! if parser or tree-parser and rewrite!=true, we need to set result !>
+<if(!TREE_PARSER)>
+<prevRuleRootRef()>.tree = root_0<\n>
+<else>
+<if(!rewriteMode)>
+<prevRuleRootRef()>.tree = root_0<\n>
+<endif>
+<endif>
+})>
+>>
+
+rewriteCodeLabels() ::= <<
+<referencedTokenLabels
+    :{it | stream_<it> = RewriteRule<rewriteElementType>Stream(self._adaptor, "token <it>", <it>)};
+    separator="\n"
+>
+<referencedTokenListLabels
+    :{it | stream_<it> = RewriteRule<rewriteElementType>Stream(self._adaptor, "token <it>", list_<it>)};
+    separator="\n"
+>
+<referencedWildcardLabels
+    :{it | stream_<it> = RewriteRuleSubtreeStream(self._adaptor, "wildcard <it>", <it>)};
+    separator="\n"
+>
+<referencedWildcardListLabels
+    :{it | stream_<it> = RewriteRuleSubtreeStream(self._adaptor, "wildcard <it>", list_<it>)};
+    separator="\n"
+>
+<referencedRuleLabels
+    :{it |
+if <it> is not None:
+    stream_<it> = RewriteRuleSubtreeStream(self._adaptor, "rule <it>", <it>.tree)
+else:
+    stream_<it> = RewriteRuleSubtreeStream(self._adaptor, "token <it>", None)
+};
+    separator="\n"
+>
+<referencedRuleListLabels
+    :{it| stream_<it> = RewriteRuleSubtreeStream(self._adaptor, "token <it>", list_<it>)};
+    separator="\n"
+>
+>>
+
+/** Generate code for an optional rewrite block; note it uses the deep ref'd element
+  *  list rather shallow like other blocks.
+  */
+rewriteOptionalBlock(
+        alt,rewriteBlockLevel,
+        referencedElementsDeep, // all nested refs
+        referencedElements, // elements in immediately block; no nested blocks
+        description) ::=
+<<
+# <fileName>:<description>
+if <referencedElementsDeep:{el | stream_<el>.hasNext()}; separator=" or ">:
+    <alt>
+
+<referencedElementsDeep:{el | stream_<el>.reset();<\n>}>
+>>
+
+rewriteClosureBlock(
+        alt,rewriteBlockLevel,
+        referencedElementsDeep, // all nested refs
+        referencedElements, // elements in immediately block; no nested blocks
+        description) ::=
+<<
+# <fileName>:<description>
+while <referencedElements:{el | stream_<el>.hasNext()}; separator=" or ">:
+    <alt>
+
+<referencedElements:{el | stream_<el>.reset();<\n>}>
+>>
+
+rewritePositiveClosureBlock(
+        alt,rewriteBlockLevel,
+        referencedElementsDeep, // all nested refs
+        referencedElements, // elements in immediately block; no nested blocks
+        description) ::=
+<<
+# <fileName>:<description>
+if not (<referencedElements:{el | stream_<el>.hasNext()}; separator=" or ">):
+    raise RewriteEarlyExitException()
+
+while <referencedElements:{el | stream_<el>.hasNext()}; separator=" or ">:
+    <alt>
+
+<referencedElements:{el | stream_<el>.reset()<\n>}>
+>>
+
+rewriteAltRest(a) ::= <<
+<if(a.pred)>if <a.pred>:
+    # <a.description>
+    <a.alt>
+<else>se: <! little hack to get if .. elif .. else block right !>
+    # <a.description>
+    <a.alt>
+<endif>
+>>
+
+rewriteAltFirst(a) ::= <<
+<if(a.pred)>
+if <a.pred>:
+    # <a.description>
+    <a.alt>
+<else>
+# <a.description>
+<a.alt>
+<endif>
+>>
+
+/** For empty rewrites: "r : ... -> ;" */
+rewriteEmptyAlt() ::= "root_0 = None"
+
+rewriteTree(root,children,description,enclosingTreeLevel,treeLevel) ::= <<
+# <fileName>:<description>
+root_<treeLevel> = self._adaptor.nil()
+<root:rewriteElement()>
+<children:rewriteElement()>
+self._adaptor.addChild(root_<enclosingTreeLevel>, root_<treeLevel>)<\n>
+>>
+
+rewriteElementList(elements) ::= "<elements:rewriteElement()>"
+
+rewriteElement(e) ::= <<
+<@pregen><@end>
+<e.el>
+>>
+
+/** Gen ID or ID[args] */
+rewriteTokenRef(token,elementIndex,args,terminalOptions={}) ::= <<
+self._adaptor.addChild(root_<treeLevel>, <createRewriteNodeFromElement(...)>)<\n>
+>>
+
+/** Gen $label ... where defined via label=ID */
+rewriteTokenLabelRef(label,elementIndex) ::= <<
+self._adaptor.addChild(root_<treeLevel>, stream_<label>.nextNode())<\n>
+>>
+
+/** Gen $label ... where defined via label+=ID */
+rewriteTokenListLabelRef(label,elementIndex) ::= <<
+self._adaptor.addChild(root_<treeLevel>, stream_<label>.nextNode())<\n>
+>>
+
+/** Gen ^($label ...) */
+rewriteTokenLabelRefRoot(label,elementIndex) ::= <<
+root_<treeLevel> = self._adaptor.becomeRoot(stream_<label>.nextNode(), root_<treeLevel>)<\n>
+>>
+
+/** Gen ^($label ...) where label+=... */
+rewriteTokenListLabelRefRoot ::= rewriteTokenLabelRefRoot
+
+/** Gen ^(ID ...) or ^(ID[args] ...) */
+rewriteTokenRefRoot(token,elementIndex,args,terminalOptions={}) ::= <<
+root_<treeLevel> = self._adaptor.becomeRoot(<createRewriteNodeFromElement(...)>, root_<treeLevel>)<\n>
+>>
+
+rewriteImaginaryTokenRef(args,token,elementIndex,terminalOptions={}) ::= <<
+self._adaptor.addChild(root_<treeLevel>, <createImaginaryNode(token, args, terminalOptions)>)<\n>
+>>
+
+rewriteImaginaryTokenRefRoot(args,token,elementIndex,terminalOptions={}) ::= <<
+root_<treeLevel> = self._adaptor.becomeRoot(<createImaginaryNode(token, args, terminalOptions)>, root_<treeLevel>)<\n>
+>>
+
+/** plain -> {foo} action */
+rewriteAction(action) ::= <<
+<!FIXME(96,untested)!>
+root_0 = <action><\n>
+>>
+
+/** What is the name of the previous value of this rule's root tree?  This
+ *  let's us refer to $rule to mean previous value.  I am reusing the
+ *  variable 'tree' sitting in retval struct to hold the value of root_0 right
+ *  before I set it during rewrites.  The assign will be to retval.tree.
+ */
+prevRuleRootRef() ::= "retval"
+
+rewriteRuleRef(rule) ::= <<
+self._adaptor.addChild(root_<treeLevel>, stream_<rule>.nextTree())<\n>
+>>
+
+rewriteRuleRefRoot(rule) ::= <<
+root_<treeLevel> = self._adaptor.becomeRoot(stream_<rule>.nextNode(), root_<treeLevel>)<\n>
+>>
+
+rewriteNodeAction(action) ::= <<
+self._adaptor.addChild(root_<treeLevel>, <action>)<\n>
+>>
+
+rewriteNodeActionRoot(action) ::= <<
+root_<treeLevel> = self._adaptor.becomeRoot(<action>, root_<treeLevel>)<\n>
+>>
+
+/** Gen $ruleLabel ... where defined via ruleLabel=rule */
+rewriteRuleLabelRef(label) ::= <<
+self._adaptor.addChild(root_<treeLevel>, stream_<label>.nextTree())<\n>
+>>
+
+/** Gen $ruleLabel ... where defined via ruleLabel+=rule */
+rewriteRuleListLabelRef(label) ::= <<
+self._adaptor.addChild(root_<treeLevel>, stream_<label>.nextTree())<\n>
+>>
+
+/** Gen ^($ruleLabel ...) where ruleLabel=rule */
+rewriteRuleLabelRefRoot(label) ::= <<
+root_<treeLevel> = self._adaptor.becomeRoot(stream_<label>.nextNode(), root_<treeLevel>)<\n>
+>>
+
+/** Gen ^($ruleLabel ...) where ruleLabel+=rule */
+rewriteRuleListLabelRefRoot(label) ::= <<
+root_<treeLevel> = self._adaptor.becomeRoot(stream_<label>.nextNode(), root_<treeLevel>)<\n>
+>>
+
+rewriteWildcardLabelRef(label) ::= <<
+self._adaptor.addChild(root_<treeLevel>, stream_<label>.nextTree())<\n>
+>>
+
+createImaginaryNode(tokenType,args,terminalOptions={}) ::= <<
+<if(terminalOptions.node)>
+<! new MethodNode(IDLabel, args) !>
+<terminalOptions.node>(<tokenType><if(args)>, <args; separator=", "><endif>)
+<else>
+<if (!args)>self._adaptor.createFromType(<tokenType>, "<tokenType>")
+<else>self._adaptor.create(<tokenType>, <args; separator=", ">)
+<endif>
+<endif>
+>>
+
+//<! need to call different adaptor.create*() methods depending of argument count !>
+//<if (!args)>self._adaptor.createFromType(<tokenType>, "<tokenType>")
+//<else><if (!rest(args))>self._adaptor.createFromType(<tokenType>, <first(args)>)
+//<else><if (!rest(rest(args)))>self._adaptor.createFromToken(<tokenType>, <first(args)>, <first(rest(args))>)
+//<endif>
+//<endif>
+//<endif>
+
+
+createRewriteNodeFromElement(token,args,terminalOptions={}) ::= <<
+<if(terminalOptions.node)>
+<terminalOptions.node>(stream_<token>.nextToken()<if(args)>, <args; separator=", "><endif>)
+<else>
+<if(args)> <! must create new node from old !>
+<! need to call different adaptor.create*() methods depending of argument count !>
+<if (!args)>self._adaptor.createFromType(<token>, "<token>")
+<else><if (!rest(args))>self._adaptor.createFromToken(<token>, <first(args)>)
+<else><if (!rest(rest(args)))>self._adaptor.createFromToken(<token>, <first(args)>, <first(rest(args))>)
+<endif>
+<endif>
+<endif>
+<else>
+stream_<token>.nextNode()
+<endif>
+<endif>
+>>
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/Python3/ASTDbg.stg b/tool/src/main/resources/org/antlr/codegen/templates/Python3/ASTDbg.stg
new file mode 100644
index 0000000..187db39
--- /dev/null
+++ b/tool/src/main/resources/org/antlr/codegen/templates/Python3/ASTDbg.stg
@@ -0,0 +1,59 @@
+/*
+ [The "BSD license"]
+ Copyright (c) 2005-2012 Terence Parr
+ 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.
+*/
+
+/** Template overrides to add debugging to AST stuff.  Dynamic inheritance
+ *  hierarchy is set up as ASTDbg : AST : Dbg : Python by code generator.
+ */
+group ASTDbg;
+
+astAccessor() ::= <<
+def setTreeAdaptor(self, adaptor):
+<if(grammar.grammarIsRoot)>
+    self._adaptor = DebugTreeAdaptor(self.dbg, adaptor)
+<else>
+    self._adaptor = adaptor # delegator sends dbg adaptor
+<endif>
+    <grammar.directDelegates:{g|<g:delegateName()>.setTreeAdaptor(self._adaptor)}>
+
+def getTreeAdaptor(self):
+    return self._adaptor
+
+adaptor = property(getTreeAdaptor, setTreeAdaptor)<\n>
+>>
+
+createListenerAndHandshake() ::= <<
+proxy = DebugEventSocketProxy(self, adaptor=<if(TREE_PARSER)>self.input.getTreeAdaptor()<else>self._adaptor<endif>,
+                              debug=debug_socket, port=port)
+self.setDebugListener(proxy)
+self.adaptor.setDebugListener(proxy)
+self.input.setDebugListener(proxy)
+#self.set<inputStreamType>(Debug<inputStreamType>(self.input, proxy))
+proxy.handshake()
+>>
+
+@rewriteElement.pregen() ::= "self._dbg.location(<e.line>, <e.pos>)"
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/Python3/ASTParser.stg b/tool/src/main/resources/org/antlr/codegen/templates/Python3/ASTParser.stg
new file mode 100644
index 0000000..cf1ab0f
--- /dev/null
+++ b/tool/src/main/resources/org/antlr/codegen/templates/Python3/ASTParser.stg
@@ -0,0 +1,199 @@
+/*
+ [The "BSD license"]
+ Copyright (c) 2005-2012 Terence Parr
+ 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.
+*/
+
+/** Templates for building ASTs during normal parsing.
+ *
+ *  Deal with many combinations.  Dimensions are:
+ *  Auto build or rewrite
+ *    no label, label, list label  (label/no-label handled together)
+ *    child, root
+ *    token, set, rule, wildcard
+ *
+ *  The situation is not too bad as rewrite (->) usage makes ^ and !
+ *  invalid. There is no huge explosion of combinations.
+ */
+
+finishedBacktracking(block) ::= <<
+<if(!ruleDescriptor.isSynPred)>
+<if(backtracking)>
+if <actions.(actionScope).synpredgate>:
+    <block>
+<else>
+<block>
+<endif>
+<endif>
+>>
+
+@ruleBody.setErrorReturnValue() ::= <<
+retval.tree = self._adaptor.errorNode(self.input, retval.start, self.input.LT(-1), re)
+>>
+
+// TOKEN AST STUFF
+
+/** ID and output=AST */
+tokenRef(token,label,elementIndex,terminalOptions={}) ::= <<
+<super.tokenRef(...)>
+<finishedBacktracking({
+<label>_tree = <createNodeFromToken(...)>
+self._adaptor.addChild(root_0, <label>_tree)
+})>
+>>
+
+/** ID! and output=AST (same as plain tokenRef) */
+tokenRefBang(token,label,elementIndex,terminalOptions={}) ::= "<super.tokenRef(...)>"
+
+/** ID^ and output=AST */
+tokenRefRuleRoot(token,label,elementIndex,terminalOptions={}) ::= <<
+<super.tokenRef(...)>
+<finishedBacktracking({
+<label>_tree = <createNodeFromToken(...)>
+root_0 = self._adaptor.becomeRoot(<label>_tree, root_0)
+})>
+>>
+
+/** ids+=ID! and output=AST */
+tokenRefBangAndListLabel(token,label,elementIndex,terminalOptions={}) ::= <<
+<tokenRefBang(...)>
+<listLabel(elem=label,...)>
+>>
+
+/** label+=TOKEN when output=AST but not rewrite alt */
+tokenRefAndListLabel(token,label,elementIndex,terminalOptions={}) ::= <<
+<tokenRef(...)>
+<listLabel(elem=label,...)>
+>>
+
+/** Match label+=TOKEN^ when output=AST but not rewrite alt */
+tokenRefRuleRootAndListLabel(token,label,elementIndex,terminalOptions={}) ::= <<
+<tokenRefRuleRoot(...)>
+<listLabel(elem=label,...)>
+>>
+
+// SET AST
+
+// the match set stuff is interesting in that it uses an argument list
+// to pass code to the default matchSet; another possible way to alter
+// inherited code.  I don't use the region stuff because I need to pass
+// different chunks depending on the operator.  I don't like making
+// the template name have the operator as the number of templates gets
+// large but this is the most flexible--this is as opposed to having
+// the code generator call matchSet then add root code or ruleroot code
+// plus list label plus ...  The combinations might require complicated
+// rather than just added on code.  Investigate that refactoring when
+// I have more time.
+
+matchSet(s,label,elementIndex,postmatchCode,terminalOptions={}) ::= <%
+<super.matchSet(postmatchCode={<finishedBacktracking({self._adaptor.addChild(root_0, <createNodeFromToken(...)>)})>}, ...)>
+%>
+
+matchRuleBlockSet(s,label,elementIndex,postmatchCode,treeLevel="0",terminalOptions={}) ::= <<
+<matchSet(...)>
+>>
+
+matchSetBang(s,label,elementIndex,postmatchCode,terminalOptions={}) ::= "<super.matchSet(...)>"
+
+// note there is no matchSetTrack because -> rewrites force sets to be
+// plain old blocks of alts: (A|B|...|C)
+
+matchSetRuleRoot(s,label,elementIndex,debug,terminalOptions={}) ::= <<
+<if(label)>
+<label> = self.input.LT(1)<\n>
+<endif>
+<super.matchSet(postmatchCode={<finishedBacktracking({root_0 = self._adaptor.becomeRoot(<createNodeFromToken(...)>, root_0)})>}, ...)>
+>>
+
+// RULE REF AST
+
+/** rule when output=AST */
+ruleRef(rule,label,elementIndex,args,scope) ::= <<
+<super.ruleRef(...)>
+<finishedBacktracking({self._adaptor.addChild(root_0, <label>.tree)})>
+>>
+
+/** rule! is same as normal rule ref */
+ruleRefBang(rule,label,elementIndex,args,scope) ::= "<super.ruleRef(...)>"
+
+/** rule^ */
+ruleRefRuleRoot(rule,label,elementIndex,args,scope) ::= <<
+<super.ruleRef(...)>
+<finishedBacktracking({root_0 = self._adaptor.becomeRoot(<label>.tree, root_0)})>
+>>
+
+/** x+=rule when output=AST */
+ruleRefAndListLabel(rule,label,elementIndex,args,scope) ::= <<
+<ruleRef(...)>
+<listLabel(label, {<label>.tree})>
+>>
+
+/** x+=rule! when output=AST is a rule ref with list addition */
+ruleRefBangAndListLabel(rule,label,elementIndex,args,scope) ::= <<
+<ruleRefBang(...)>
+<listLabel(label, {<label>.tree})>
+>>
+
+/** x+=rule^ */
+ruleRefRuleRootAndListLabel(rule,label,elementIndex,args,scope) ::= <<
+<ruleRefRuleRoot(...)>
+<listLabel(label, {<label>.tree})>
+>>
+
+// WILDCARD AST
+
+wildcard(token,label,elementIndex,terminalOptions={}) ::= <<
+<super.wildcard(...)>
+<finishedBacktracking({
+<label>_tree = self._adaptor.createWithPayload(<label>)
+self._adaptor.addChild(root_0, <label>_tree)
+})>
+>>
+
+wildcardBang(label,elementIndex) ::= "<super.wildcard(...)>"
+
+wildcardRuleRoot(token,label,elementIndex,terminalOptions={}) ::= <<
+<super.wildcard(...)>
+<finishedBacktracking({
+<label>_tree = self._adaptor.createWithPayload(<label>)
+root_0 = self._adaptor.becomeRoot(<label>_tree, root_0)
+})>
+>>
+
+createNodeFromToken(label,terminalOptions={}) ::= <%
+<if(terminalOptions.node)>
+<terminalOptions.node>(<label>) <! new MethodNode(IDLabel) !>
+<else>
+self._adaptor.createWithPayload(<label>)
+<endif>
+%>
+
+ruleCleanUp() ::= <<
+<super.ruleCleanUp()>
+<finishedBacktracking({
+retval.tree = self._adaptor.rulePostProcessing(root_0)
+self._adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop)
+})>
+>>
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/Python3/ASTTreeParser.stg b/tool/src/main/resources/org/antlr/codegen/templates/Python3/ASTTreeParser.stg
new file mode 100644
index 0000000..0a8d268
--- /dev/null
+++ b/tool/src/main/resources/org/antlr/codegen/templates/Python3/ASTTreeParser.stg
@@ -0,0 +1,311 @@
+/*
+ [The "BSD license"]
+ Copyright (c) 2005-2012 Terence Parr
+ 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.
+*/
+
+/** Templates for building ASTs during tree parsing.
+ *
+ *  Deal with many combinations.  Dimensions are:
+ *  Auto build or rewrite
+ *    no label, label, list label  (label/no-label handled together)
+ *    child, root
+ *    token, set, rule, wildcard
+ *
+ *  Each combination has its own template except that label/no label
+ *  is combined into tokenRef, ruleRef, ...
+ */
+
+finishedBacktracking(block) ::= <<
+<if(backtracking)>
+if <actions.(actionScope).synpredgate>:
+    <block>
+<else>
+<block>
+<endif>
+>>
+
+/** Add a variable to track last element matched */
+ruleDeclarations() ::= <<
+<super.ruleDeclarations()>
+_first_0 = None
+_last = None<\n>
+>>
+
+/** What to emit when there is no rewrite rule.  For auto build
+ *  mode, does nothing.
+ */
+noRewrite(rewriteBlockLevel, treeLevel) ::= <<
+<finishedBacktracking({
+<if(rewriteMode)>
+retval.tree = _first_0
+if self._adaptor.getParent(retval.tree) is not None and self._adaptor.isNil(self._adaptor.getParent(retval.tree)):
+    retval.tree = self._adaptor.getParent(retval.tree)
+<endif>
+})>
+>>
+
+/** match ^(root children) in tree parser; override here to
+ *  add tree construction actions.
+ */
+tree(root, actionsAfterRoot, children, nullableChildList,
+     enclosingTreeLevel, treeLevel) ::= <<
+_last = self.input.LT(1)
+_save_last_<treeLevel> = _last
+_first_<treeLevel> = None
+<if(!rewriteMode)>
+root_<treeLevel> = self._adaptor.nil()<\n>
+<endif>
+<root:element()>
+<if(rewriteMode)>
+<finishedBacktracking({
+<if(root.el.rule)>
+if _first_<enclosingTreeLevel> is None:
+    _first_<enclosingTreeLevel> = <root.el.label>.tree<\n>
+<else>
+if _first_<enclosingTreeLevel> is None:
+    _first_<enclosingTreeLevel> = <root.el.label><\n>
+<endif>
+})>
+<endif>
+<actionsAfterRoot:element()>
+<if(nullableChildList)>
+if self.input.LA(1) == DOWN:
+    self.match(self.input, DOWN, None)
+    <children:element()>
+    self.match(self.input, UP, None)
+
+<else>
+self.match(self.input, DOWN, None)
+<children:element()>
+self.match(self.input, UP, None)<\n>
+<endif>
+<if(!rewriteMode)>
+self._adaptor.addChild(root_<enclosingTreeLevel>, root_<treeLevel>)<\n>
+<endif>
+_last = _save_last_<treeLevel>
+
+>>
+
+// TOKEN AST STUFF
+
+/** ID! and output=AST (same as plain tokenRef) 'cept add
+ *  setting of _last
+ */
+tokenRefBang(token,label,elementIndex,terminalOptions={}) ::= <<
+_last = self.input.LT(1)
+<super.tokenRef(...)>
+>>
+
+/** ID auto construct */
+tokenRef(token,label,elementIndex,terminalOptions={}) ::= <<
+_last = self.input.LT(1)
+<super.tokenRef(...)>
+<if(!rewriteMode)>
+<finishedBacktracking({
+<if(terminalOptions.node)>
+<label>_tree = <terminalOptions.node>(<label>)
+<else>
+<label>_tree = self._adaptor.dupNode(<label>)
+<endif><\n>
+self._adaptor.addChild(root_<treeLevel>, <label>_tree)
+})>
+<else> <! rewrite mode !>
+<finishedBacktracking({
+if _first_<treeLevel> is None:
+    _first_<treeLevel> = <label><\n>
+})>
+<endif>
+>>
+
+/** label+=TOKEN auto construct */
+tokenRefAndListLabel(token,label,elementIndex,terminalOptions={}) ::= <<
+<tokenRef(...)>
+<listLabel(elem=label,...)>
+>>
+
+/** ^(ID ...) auto construct */
+tokenRefRuleRoot(token,label,elementIndex,terminalOptions={}) ::= <<
+_last = self.input.LT(1)
+<super.tokenRef(...)>
+<if(!rewriteMode)>
+<finishedBacktracking({
+<if(terminalOptions.node)>
+<label>_tree = <terminalOptions.node>(<label>)
+<else>
+<label>_tree = self._adaptor.dupNode(<label>)
+<endif><\n>
+root_<treeLevel> = self._adaptor.becomeRoot(<label>_tree, root_<treeLevel>)
+})>
+<endif>
+>>
+
+/** Match ^(label+=TOKEN ...) auto construct */
+tokenRefRuleRootAndListLabel(token,label,elementIndex,terminalOptions={}) ::= <<
+<tokenRefRuleRoot(...)>
+<listLabel(elem=label,...)>
+>>
+
+/** Match . wildcard and auto dup the node/subtree */
+wildcard(token,label,elementIndex,terminalOptions={}) ::= <<
+_last = self.input.LT(1)
+<super.wildcard(...)>
+<if(!rewriteMode)>
+<finishedBacktracking({
+<label>_tree = self._adaptor.dupTree(<label>)
+self._adaptor.addChild(root_<treeLevel>, <label>_tree)
+})>
+<else> <! rewrite mode !>
+<finishedBacktracking({
+if _first_<treeLevel> is None:
+    _first_<treeLevel> = <label>
+})>
+<endif>
+>>
+
+// SET AST
+matchSet(s,label,elementIndex,postmatchCode,terminalOptions={}) ::= <<
+_last = self.input.LT(1)
+<super.matchSet(postmatchCode={
+<if(!rewriteMode)>
+<finishedBacktracking({
+<if(terminalOptions.node)>
+<label>_tree = <terminalOptions.node>(<label>)
+<else>
+<label>_tree = self._adaptor.dupNode(<label>)
+<endif><\n>
+self._adaptor.addChild(root_<treeLevel>, <label>_tree)
+})>
+<endif>
+}, ...)>
+>>
+
+matchRuleBlockSet(s,label,elementIndex,postmatchCode,treeLevel="0",terminalOptions={}) ::= <<
+<matchSet(...)>
+<noRewrite(...)> <! set return tree !>
+>>
+
+matchSetBang(s,label,elementIndex,postmatchCode,terminalOptions={}) ::= <<
+_last = self.input.LT(1)
+<super.matchSet(...)>
+>>
+
+matchSetRuleRoot(s,label,elementIndex,debug,terminalOptions={}) ::= <<
+<super.matchSet(postmatchCode={
+<if(!rewriteMode)>
+<finishedBacktracking({
+<if(terminalOptions.node)>
+<label>_tree = <terminalOptions.node>(<label>)
+<else>
+<label>_tree = self._adaptor.dupNode(<label>)
+<endif><\n>
+root_<treeLevel> = self._adaptor.becomeRoot(<label>_tree, root_<treeLevel>)
+})>
+<endif>
+}, ...)>
+>>
+
+// RULE REF AST
+
+/** rule auto construct */
+ruleRef(rule,label,elementIndex,args,scope) ::= <<
+_last = self.input.LT(1)
+<super.ruleRef(...)>
+<finishedBacktracking({
+<if(!rewriteMode)>
+self._adaptor.addChild(root_<treeLevel>, <label>.tree)
+<else> <! rewrite mode !>
+if _first_<treeLevel> is None:
+    _first_<treeLevel> = <label>.tree<\n>
+<endif>
+})>
+>>
+
+/** x+=rule auto construct */
+ruleRefAndListLabel(rule,label,elementIndex,args,scope) ::= <<
+<ruleRef(...)>
+<listLabel(label, {<label>.tree})>
+>>
+
+/** ^(rule ...) auto construct */
+ruleRefRuleRoot(rule,label,elementIndex,args,scope) ::= <<
+_last = self.input.LT(1)
+<super.ruleRef(...)>
+<if(!rewriteMode)>
+<finishedBacktracking({
+root_<treeLevel> = self._adaptor.becomeRoot(<label>.tree, root_<treeLevel>)
+})>
+<endif>
+>>
+
+/** ^(x+=rule ...) auto construct */
+ruleRefRuleRootAndListLabel(rule,label,elementIndex,args,scope) ::= <<
+<ruleRefRuleRoot(...)>
+<listLabel(label, {<label>.tree})>
+>>
+
+/** rule when output=AST and tracking for rewrite */
+ruleRefTrack(rule,label,elementIndex,args,scope) ::= <<
+_last = self.input.LT(1)
+<super.ruleRefTrack(...)>
+>>
+
+/** x+=rule when output=AST and tracking for rewrite */
+ruleRefTrackAndListLabel(rule,label,elementIndex,args,scope) ::= <<
+_last = self.input.LT(1)
+<super.ruleRefTrackAndListLabel(...)>
+>>
+
+/** ^(rule ...) rewrite */
+ruleRefRuleRootTrack(rule,label,elementIndex,args,scope) ::= <<
+_last = self.input.LT(1)
+<super.ruleRefRootTrack(...)>
+>>
+
+/** ^(x+=rule ...) rewrite */
+ruleRefRuleRootTrackAndListLabel(rule,label,elementIndex,args,scope) ::= <<
+_last = self.input.LT(1)
+<super.ruleRefRuleRootTrackAndListLabel(...)>
+>>
+
+/** Streams for token refs are tree nodes now; override to
+ *  change nextToken to nextNode.
+ */
+createRewriteNodeFromElement(token,scope,terminalOptions={}) ::= <<
+<if(terminalOptions.node)>
+<terminalOptions.node>(stream_<token>.nextNode())
+<else>
+stream_<token>.nextNode()
+<endif>
+>>
+
+ruleCleanUp() ::= <<
+<super.ruleCleanUp()>
+<if(!rewriteMode)>
+<finishedBacktracking({
+retval.tree = self._adaptor.rulePostProcessing(root_0)
+})>
+<endif>
+>>
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/Python3/Dbg.stg b/tool/src/main/resources/org/antlr/codegen/templates/Python3/Dbg.stg
new file mode 100644
index 0000000..4892cf4
--- /dev/null
+++ b/tool/src/main/resources/org/antlr/codegen/templates/Python3/Dbg.stg
@@ -0,0 +1,325 @@
+/*
+ [The "BSD license"]
+ Copyright (c) 2005-2012 Terence Parr
+ 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.
+*/
+/** Template overrides to add debugging to normal Python output;
+ *  If ASTs are built, then you'll also get ASTDbg.stg loaded.
+ */
+
+@outputFile.imports() ::= <<
+<@super.imports()>
+from antlr3.debug import *
+>>
+
+@genericParser.args() ::= <<
+debug_socket = kwargs.pop('debug_socket', None)
+port = kwargs.pop('port', None)
+>>
+
+@genericParser.init() ::= <<
+self.ruleLevel = 0
+
+if self._dbg is None:
+    <createListenerAndHandshake()>
+
+>>
+
+createListenerAndHandshake() ::= <<
+<if(TREE_PARSER)>
+proxy = DebugEventSocketProxy(self, adaptor=self.input.getTreeAdaptor(),
+                              debug=debug_socket, port=port)<\n>
+<else>
+proxy = DebugEventSocketProxy(self, debug=debug_socket, port=port)<\n>
+<endif>
+self.setDebugListener(proxy)
+proxy.handshake()
+
+>>
+
+@genericParser.members() ::= <<
+<if(grammar.grammarIsRoot)>
+ruleNames = [
+    "invalidRule", <grammar.allImportedRules:{rST | "<rST.name>"}; wrap="\n    ", separator=", ">
+    ]<\n>
+<endif>
+decisionCanBacktrack = [
+    False, # invalid decision
+    <grammar.decisions:{d | <if(d.dfa.hasSynPred)>True<else>False<endif>}; wrap="\n    ", separator=", ">
+    ]
+<if(grammar.grammarIsRoot)> <! grammar imports other grammar(s) !>
+def getRuleLevel(self):
+    return self.ruleLevel
+
+def incRuleLevel(self):
+    self.ruleLevel += 1
+
+def decRuleLevel(self):
+    self.ruleLevel -= 1
+
+<if(profile)>
+    <ctorForProfilingRootGrammar()>
+<else>
+    <ctorForRootGrammar()>
+<endif>
+<ctorForPredefinedListener()>
+<else> <! imported grammar !>
+def getRuleLevel(self):
+    return <grammar.delegators:{g| <g:delegateName()>}>.getRuleLevel()
+
+def incRuleLevel(self):
+    <grammar.delegators:{g| <g:delegateName()>}>.incRuleLevel()
+
+def decRuleLevel(self):
+    <grammar.delegators:{g| <g:delegateName()>}>.decRuleLevel()
+
+<ctorForDelegateGrammar()>
+<endif>
+<if(profile)>
+FIXME(2)
+public boolean alreadyParsedRule(IntStream input, int ruleIndex) {
+    ((Profiler)self._dbg).examineRuleMemoization(input, ruleIndex, <grammar.composite.rootGrammar.recognizerName>.ruleNames[ruleIndex]);
+    return super.alreadyParsedRule(input, ruleIndex);
+}<\n>
+FIXME(3)
+public void memoize(IntStream input,
+                    int ruleIndex,
+                    int ruleStartIndex)
+{
+    ((Profiler)self._dbg).memoize(input, ruleIndex, ruleStartIndex, <grammar.composite.rootGrammar.recognizerName>.ruleNames[ruleIndex]);
+    super.memoize(input, ruleIndex, ruleStartIndex);
+}<\n>
+<endif>
+def evalPredicate(self, result, predicate):
+    self._dbg.semanticPredicate(result, predicate)
+    return result
+<\n>
+>>
+
+ctorForRootGrammar() ::= <<
+<! bug: can't use <@super.members()> cut-n-paste instead !>
+<! Same except we add port number and profile stuff if root grammar !>
+<!
+public <name>(<inputStreamType> input) {
+    this(input, DebugEventSocketProxy.DEFAULT_DEBUGGER_PORT, new RecognizerSharedState());
+}
+public <name>(<inputStreamType> input, int port, RecognizerSharedState state) {
+    super(input, state);
+    <parserCtorBody()>
+    <createListenerAndHandshake()>
+    <grammar.directDelegates:{g|<g:delegateName()> = new <g.recognizerName>(input, self._dbg, this.state, this<grammar.delegators:{g|, <g:delegateName()>}>);}; separator="\n">
+    <@finally()>
+}<\n>
+!>
+>>
+
+ctorForProfilingRootGrammar() ::= <<
+<! bug: can't use <@super.members()> cut-n-paste instead !>
+public <name>(<inputStreamType> input) {
+    this(input, new Profiler(null), new RecognizerSharedState());
+}
+public <name>(<inputStreamType> input, DebugEventListener self.dbg, RecognizerSharedState state) {
+    super(input, self.dbg, state);
+    Profiler p = (Profiler)self.dbg;
+    p.setParser(this);
+    <parserCtorBody()>
+    <grammar.directDelegates:
+     {g|<g:delegateName()> = new <g.recognizerName>(input, self.dbg, this.state, this<grammar.delegators:{g|, <g:delegateName()>}>);}; separator="\n">
+    <@finally()>
+}
+<\n>
+>>
+
+/** Basically we don't want to set any dbg listeners are root will have it. */
+ctorForDelegateGrammar() ::= <<
+<!
+public <name>(<inputStreamType> input, DebugEventListener self.dbg, RecognizerSharedState state<grammar.delegators:{g|, <g.recognizerName> <g:delegateName()>}>) {
+    super(input, dbg, state);
+    <parserCtorBody()>
+    <grammar.directDelegates:
+     {g|<g:delegateName()> = new <g.recognizerName>(input, this, this.state<grammar.delegators:{g|, <g:delegateName()>}>);}; separator="\n">
+}<\n>
+!>
+>>
+
+ctorForPredefinedListener() ::= <<
+<!
+public <name>(<inputStreamType> input, DebugEventListener dbg) {
+    <@superClassRef>super(input, dbg, new RecognizerSharedState());<@end>
+<if(profile)>
+    Profiler p = (Profiler)dbg;
+    p.setParser(this);
+<endif>
+    <parserCtorBody()>
+    <grammar.directDelegates:{g|<g:delegateName()> = new <g.recognizerName>(input, self._dbg, this.state, this<grammar.delegators:{g|, <g:delegateName()>}>);}; separator="\n">
+    <@finally()>
+}<\n>
+!>
+>>
+
+@genericParser.superClassName() ::= "Debug<@super.superClassName()>"
+
+@rule.body() ::= <<
+try:
+    self._dbg.enterRule(self.getGrammarFileName(), "<ruleName>")
+    if self.getRuleLevel() == 0:
+        self._dbg.commence()
+    self.incRuleLevel()
+    <! ST uses zero-based columns, we want one-base !>
+    self._dbg.location(<ruleDescriptor.tree.line>, <ruleDescriptor.tree.charPositionInLine>+1)
+
+    <@super.body()>
+
+    self._dbg.location(<ruleDescriptor.EORNode.line>, <ruleDescriptor.EORNode.charPositionInLine>+1)
+finally:
+    self._dbg.exitRule(self.getGrammarFileName(), "<ruleName>")
+    self.decRuleLevel()
+    if self.getRuleLevel() == 0:
+         self._dbg.terminate()
+
+>>
+
+@synpred.start() ::= "self._dbg.beginBacktrack(self._state.backtracking)"
+
+@synpred.stop() ::= "self._dbg.endBacktrack(self._state.backtracking, success)"
+
+// Common debug event triggers used by region overrides below
+
+enterSubRule() ::=
+    "try { self._dbg.enterSubRule(<decisionNumber>);<\n>"
+
+exitSubRule() ::=
+    "} finally {self._dbg.exitSubRule(<decisionNumber>);}<\n>"
+
+enterDecision() ::=
+    "try { self._dbg.enterDecision(<decisionNumber>);<\n>"
+
+exitDecision() ::=
+    "} finally {self._dbg.exitDecision(<decisionNumber>);}<\n>"
+
+enterAlt(n) ::= "self._dbg.enterAlt(<n>)<\n>"
+
+// Region overrides that tell various constructs to add debugging triggers
+
+@block.body() ::= <<
+try:
+    self._dbg.enterSubRule(<decisionNumber>)
+    <@super.body()>
+finally:
+    self._dbg.exitSubRule(<decisionNumber>)
+>>
+
+@blockBody.decision() ::= <<
+try:
+    self._dbg.enterDecision(
+        <decisionNumber>, self.decisionCanBacktrack[<decisionNumber>])
+    <@super.decision()>
+finally:
+    self._dbg.exitDecision(<decisionNumber>)
+>>
+
+@ruleBlock.decision() ::= <<
+try:
+    self._dbg.enterDecision(
+        <decisionNumber>, self.decisionCanBacktrack[<decisionNumber>])
+    <@super.decision()>
+finally:
+    self._dbg.exitDecision(<decisionNumber>)
+>>
+
+@ruleBlockSingleAlt.prealt() ::= "<enterAlt(n=\"1\")>"
+
+@blockSingleAlt.prealt() ::= "<enterAlt(n=\"1\")>"
+
+@positiveClosureBlock.loopBody() ::= <<
+try:
+    self._dbg.enterSubRule(<decisionNumber>)
+    <@super.loopBody()>
+finally:
+    self._dbg.exitSubRule(<decisionNumber>)<\n>
+>>
+
+@positiveClosureBlockLoop.decisionBody() ::= <<
+try:
+    self._dbg.enterDecision(
+        <decisionNumber>, self.decisionCanBacktrack[<decisionNumber>])
+    <@super.decisionBody()>
+finally:
+    self._dbg.exitDecision(<decisionNumber>)
+>>
+
+@positiveClosureBlockLoop.earlyExitException() ::=
+    "self._dbg.recognitionException(eee)<\n>"
+
+@closureBlock.loopBody() ::= <<
+try:
+    self._dbg.enterSubRule(<decisionNumber>)
+    <@super.loopBody()>
+finally:
+    self._dbg.exitSubRule(<decisionNumber>)<\n>
+>>
+
+@closureBlockLoop.decisionBody() ::= <<
+try:
+    self._dbg.enterDecision(
+        <decisionNumber>, self.decisionCanBacktrack[<decisionNumber>])
+    <@super.decisionBody()>
+finally:
+    self._dbg.exitDecision(<decisionNumber>)
+>>
+
+@altSwitchCase.prealt() ::= "<enterAlt(altNum)>"
+
+@element.prematch() ::=
+    "self._dbg.location(<e.line>, <e.pos>)"
+
+@matchSet.mismatchedSetException() ::=
+    "self._dbg.recognitionException(mse)"
+
+@dfaState.noViableAltException() ::= "self._dbg.recognitionException(nvae)"
+
+@dfaStateSwitch.noViableAltException() ::= "self._dbg.recognitionException(nvae)"
+
+dfaDecision(decisionNumber,description) ::= <<
+try:
+    self.isCyclicDecision = True
+    <super.dfaDecision(...)>
+
+except NoViableAltException as nvae:
+    self._dbg.recognitionException(nvae)
+    raise
+
+>>
+
+@cyclicDFA.errorMethod() ::= <<
+def error(self, nvae):
+    self._dbg.recognitionException(nvae)
+
+>>
+
+/** Force predicate validation to trigger an event */
+evalPredicate(pred,description) ::= <<
+self.evalPredicate(<pred>,"<description>")
+>>
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/Python3/Python3.stg b/tool/src/main/resources/org/antlr/codegen/templates/Python3/Python3.stg
new file mode 100644
index 0000000..ad2e2ab
--- /dev/null
+++ b/tool/src/main/resources/org/antlr/codegen/templates/Python3/Python3.stg
@@ -0,0 +1,1499 @@
+/*
+ [The "BSD license"]
+ Copyright (c) 2005-2012 Terence Parr
+ 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.
+*/
+
+/** The API version of the runtime that recognizers generated by this runtime
+ *  need.
+ */
+apiVersion() ::= "1"
+
+/** The overall file structure of a recognizer; stores methods for rules
+ *  and cyclic DFAs plus support code.
+ */
+outputFile(LEXER,PARSER,TREE_PARSER, actionScope, actions,
+           docComment, recognizer,
+           name, tokens, tokenNames, rules, cyclicDFAs,
+           bitsets, buildTemplate, buildAST, rewriteMode, profile,
+           backtracking, synpreds, memoize, numRules,
+           fileName, ANTLRVersion, generatedTimestamp, trace,
+           scopes, superClass, literals) ::=
+<<
+# $ANTLR <ANTLRVersion> <fileName> <generatedTimestamp>
+
+<@imports>
+import sys
+from antlr3 import *
+<if(TREE_PARSER)>
+from antlr3.tree import *<\n>
+<endif>
+<@end>
+
+<actions.(actionScope).header>
+
+<! <docComment> !>
+
+# for convenience in actions
+HIDDEN = BaseRecognizer.HIDDEN
+
+# token types
+<tokens:{it | <it.name>=<it.type>}; separator="\n">
+
+# token names
+tokenNamesMap = {
+    0: "\<invalid>", 1: "\<EOR>", 2: "\<DOWN>", 3: "\<UP>",
+    <tokens:{it | <it.type>: "<it.name>"}; wrap, separator=", ">
+}
+Token.registerTokenNamesMap(tokenNamesMap)
+
+<recognizer>
+
+<if(actions.(actionScope).main)>
+<actions.(actionScope).main>
+<else>
+def main(argv, stdin=sys.stdin, stdout=sys.stdout, stderr=sys.stderr):
+<if(LEXER)>
+    from antlr3.main import LexerMain
+    main = LexerMain(<recognizer.name>)<\n>
+<endif>
+<if(PARSER)>
+    from antlr3.main import ParserMain
+    main = ParserMain("<recognizer.grammar.name>Lexer", <recognizer.name>)<\n>
+<endif>
+<if(TREE_PARSER)>
+    from antlr3.main import WalkerMain
+    main = WalkerMain(<recognizer.name>)<\n>
+<endif>
+    main.stdin = stdin
+    main.stdout = stdout
+    main.stderr = stderr
+    main.execute(argv)<\n>
+<endif>
+
+<actions.(actionScope).footer>
+
+if __name__ == '__main__':
+    main(sys.argv)
+
+>>
+
+lexer(grammar, name, tokens, scopes, rules, numRules, filterMode,
+      labelType="CommonToken", superClass="Lexer") ::= <<
+<if(grammar.directDelegates)>
+# path hack to allow absolute import of related grammars.
+from os.path import dirname
+__path__ = [dirname(__file__)]
+del dirname
+
+<grammar.directDelegates:
+ {g|from .<g.recognizerName> import <g.recognizerName>}; separator="\n">
+<endif>
+
+class <grammar.recognizerName>(<@superClassName><superClass><@end>):
+    <scopes:{it|<if(it.isDynamicGlobalScope)><globalAttributeScope(scope=it)><endif>}>
+
+    grammarFileName = "<fileName>"
+    api_version = <apiVersion()>
+
+    def __init__(self<grammar.delegators:{g|, <g:delegateName()>}>, input=None, state=None):
+        if state is None:
+            state = RecognizerSharedState()
+        super().__init__(input, state)
+
+<if(memoize)>
+<if(grammar.grammarIsRoot)>
+        self._state.ruleMemo = {}
+<endif>
+<endif>
+
+        <grammar.directDelegates:
+         {g|self.<g:delegateName()> = <g.recognizerName>(<trunc(g.delegators):{p|<p:delegateName()>, }>self, input, state)}; separator="\n">
+        <grammar.directDelegates:
+         {g|<g.delegates:{h|self.<h:delegateName()> = self.<g:delegateName()>.<h:delegateName()>}; separator="\n">}; separator="\n">
+        <grammar.delegators:
+         {g|self.<g:delegateName()> = <g:delegateName()>}; separator="\n">
+        <last(grammar.delegators):
+         {g|self.gParent = <g:delegateName()>}; separator="\n">
+        self.delegates = [<grammar.delegates: {g|self.<g:delegateName()>}; separator = ", ">]
+
+        <cyclicDFAs:{dfa | <cyclicDFAInit(dfa)>}; separator="\n">
+
+        <actions.lexer.init>
+
+
+    <actions.lexer.members>
+
+
+<if(filterMode)>
+    <filteringNextToken()>
+<endif>
+    <rules; separator="\n\n">
+
+    <synpreds:{p | <lexerSynpred(p)>}>
+
+    <cyclicDFAs:cyclicDFA()> <! dump tables for all DFA !>
+
+
+>>
+
+/** A override of Lexer.nextToken() that backtracks over mTokens() looking
+ *  for matches.  No error can be generated upon error; just rewind, consume
+ *  a token and then try again.  backtracking needs to be set as well.
+ *  Make rule memoization happen only at levels above 1 as we start mTokens
+ *  at backtracking==1.
+ */
+filteringNextToken() ::= <<
+def nextToken(self):
+    while True:
+        if self.input.LA(1) == EOF:
+            return self.makeEOFToken()
+
+        self._state.token = None
+        self._state.channel = DEFAULT_CHANNEL
+        self._state.tokenStartCharIndex = self.input.index()
+        self._state.tokenStartCharPositionInLine = self.input.charPositionInLine
+        self._state.tokenStartLine = self.input.line
+        self._state._text = None
+        try:
+            m = self.input.mark()
+            try:
+                # means we won't throw slow exception
+                self._state.backtracking = 1
+                try:
+                    self.mTokens()
+                finally:
+                    self._state.backtracking = 0
+
+            except BacktrackingFailed:
+                # mTokens backtracks with synpred at backtracking==2
+                # and we set the synpredgate to allow actions at level 1.
+                self.input.rewind(m)
+                self.input.consume() # advance one char and try again
+
+            else:
+                self.emit()
+                return self._state.token
+
+        except RecognitionException as re:
+            # shouldn't happen in backtracking mode, but...
+            self.reportError(re)
+            self.recover(re)
+
+
+def memoize(self, input, ruleIndex, ruleStartIndex, success):
+    if self._state.backtracking > 1:
+        # is Lexer always superclass?
+        super().memoize(input, ruleIndex, ruleStartIndex, success)
+
+
+def alreadyParsedRule(self, input, ruleIndex):
+    if self._state.backtracking > 1:
+        return super().alreadyParsedRule(input, ruleIndex)
+    return False
+
+
+>>
+
+actionGate() ::= "self._state.backtracking == 0"
+
+filteringActionGate() ::= "self._state.backtracking == 1"
+
+/** How to generate a parser */
+
+genericParser(grammar, name, scopes, tokens, tokenNames, rules, numRules,
+              bitsets, inputStreamType, superClass, labelType, members,
+              rewriteElementType, filterMode, init, ASTLabelType="Object") ::= <<
+# token names
+tokenNames = [
+    "\<invalid>", "\<EOR>", "\<DOWN>", "\<UP>",
+    <tokenNames; wrap, separator=", ">
+]
+
+<scopes:{it|<if(it.isDynamicGlobalScope)><globalAttributeScopeClass(scope=it)><endif>}>
+
+<if(grammar.directDelegates)>
+# path hack to allow absolute import of related grammars.
+from os.path import dirname
+__path__ = [dirname(__file__)]
+del dirname
+
+<grammar.directDelegates:
+ {g|from .<g.recognizerName> import <g.recognizerName>}; separator="\n">
+<endif>
+
+<rules:{it|<ruleAttributeScopeClass(scope=it.ruleDescriptor.ruleScope)>}>
+
+class <grammar.recognizerName>(<@superClassName><superClass><@end>):
+    grammarFileName = "<fileName>"
+    api_version = <apiVersion()>
+    tokenNames = tokenNames
+
+    def __init__(self<grammar.delegators:{g|, <g:delegateName()>}>, input, state=None, *args, **kwargs):
+        if state is None:
+            state = RecognizerSharedState()
+
+        <@args()>
+        super().__init__(input, state, *args, **kwargs)
+
+<if(memoize)>
+<if(grammar.grammarIsRoot)>
+        self._state.ruleMemo = {}
+<endif>
+<endif>
+
+        <cyclicDFAs:{dfa | <cyclicDFAInit(dfa)>}; separator="\n">
+
+        <scopes:{it | <if(it.isDynamicGlobalScope)><globalAttributeScopeStack(scope=it)><endif>}>
+        <rules:{it | <ruleAttributeScopeStack(scope=it.ruleDescriptor.ruleScope)>}>
+
+        <init>
+
+        <grammar.delegators:
+         {g|self.<g:delegateName()> = <g:delegateName()>}; separator="\n">
+        <grammar.directDelegates:
+         {g|self.<g:delegateName()> = <g.recognizerName>(<trunc(g.delegators):{p|<p:delegateName()>, }>self, input, state)}; separator="\n">
+        <grammar.directDelegates:
+         {g|<g.delegates:{h|self.<h:delegateName()> = self.<g:delegateName()>.<h:delegateName()>}; separator="\n">}; separator="\n">
+        <last(grammar.delegators):
+         {g|self.gParent = self.<g:delegateName()>}; separator="\n">
+        self.delegates = [<grammar.delegates: {g|self.<g:delegateName()>}; separator = ", ">]
+
+        <@init><@end>
+
+
+    <@members><@end>
+
+    <members>
+
+    <rules; separator="\n\n">
+
+    <! generate rule/method definitions for imported rules so they
+       appear to be defined in this recognizer. !>
+    <grammar.delegatedRules:{ruleDescriptor| <delegateRule(ruleDescriptor)> }; separator="\n">
+
+    <synpreds:{p | <synpred(p)>}>
+
+    <cyclicDFAs:cyclicDFA()> <! dump tables for all DFA !>
+
+    <bitsets:{it | FOLLOW_<it.name>_in_<it.inName><it.tokenIndex> = frozenset([<it.tokenTypes:{it | <it>};separator=", ">])<\n>}>
+
+>>
+
+delegateRule(ruleDescriptor) ::= <<
+def <ruleDescriptor.name>(self, <ruleDescriptor.parameterScope:parameterScope()>):
+<\ >   <if(ruleDescriptor.hasReturnValue)>return <endif>self.<ruleDescriptor.grammar:delegateName()>.<ruleDescriptor.name>(<if(ruleDescriptor.parameterScope)><ruleDescriptor.parameterScope.attributes:{a|<a.name>}; separator=", "><endif>)
+
+
+>>
+
+parser(grammar, name, scopes, tokens, tokenNames, rules, numRules, bitsets,
+       ASTLabelType="Object", superClass="Parser", labelType="Token",
+       members={<actions.parser.members>},
+       init={<actions.parser.init>}
+       ) ::= <<
+<genericParser(grammar, name, scopes, tokens, tokenNames, rules, numRules,
+              bitsets, "TokenStream", superClass,
+              labelType, members, "Token",
+              false, init, ASTLabelType)>
+>>
+
+/** How to generate a tree parser; same as parser except the input
+ *  stream is a different type.
+ */
+treeParser(grammar, name, scopes, tokens, tokenNames, globalAction, rules,
+           numRules, bitsets, filterMode, labelType={<ASTLabelType>}, ASTLabelType="Object",
+           superClass={<if(filterMode)><if(buildAST)>TreeRewriter<else>TreeFilter<endif><else>TreeParser<endif>},
+           members={<actions.treeparser.members>},
+           init={<actions.treeparser.init>}
+           ) ::= <<
+<genericParser(grammar, name, scopes, tokens, tokenNames, rules, numRules,
+              bitsets, "TreeNodeStream", superClass,
+              labelType, members, "Node",
+              filterMode, init, ASTLabelType)>
+>>
+
+/** A simpler version of a rule template that is specific to the imaginary
+ *  rules created for syntactic predicates.  As they never have return values
+ *  nor parameters etc..., just give simplest possible method.  Don't do
+ *  any of the normal memoization stuff in here either; it's a waste.
+ *  As predicates cannot be inlined into the invoking rule, they need to
+ *  be in a rule by themselves.
+ */
+synpredRule(ruleName, ruleDescriptor, block, description, nakedBlock) ::=
+<<
+# $ANTLR start "<ruleName>"
+def <ruleName>_fragment(self, <ruleDescriptor.parameterScope:parameterScope()>):
+    <ruleLabelDefs()>
+<if(trace)>
+    self.traceIn("<ruleName>_fragment", <ruleDescriptor.index>)
+    try:
+        <block>
+
+    finally:
+        self.traceOut("<ruleName>_fragment", <ruleDescriptor.index>)
+
+<else>
+    <block>
+<endif>
+# $ANTLR end "<ruleName>"
+
+
+>>
+
+synpred(name) ::= <<
+def <name>(self):
+    self._state.backtracking += 1
+    <@start()>
+    start = self.input.mark()
+    try:
+        self.<name>_fragment()
+    except BacktrackingFailed:
+        success = False
+    else:
+        success = True
+    self.input.rewind(start)
+    <@stop()>
+    self._state.backtracking -= 1
+    return success
+
+
+>>
+
+lexerSynpred(name) ::= <<
+<synpred(name)>
+>>
+
+ruleMemoization(name) ::= <<
+<if(memoize)>
+if self._state.backtracking > 0 and self.alreadyParsedRule(self.input, <ruleDescriptor.index>):
+    # for cached failed rules, alreadyParsedRule will raise an exception
+    success = True
+    return <ruleReturnValue()>
+
+<endif>
+>>
+
+/** This rule has failed, exit indicating failure during backtrack */
+ruleBacktrackFailure() ::= <<
+<if(backtracking)>
+if self._state.backtracking > 0:
+    raise BacktrackingFailed
+
+<endif>
+>>
+
+/** How to generate code for a rule.  This includes any return type
+ *  data aggregates required for multiple return values.
+ */
+rule(ruleName,ruleDescriptor,block,emptyRule,description,exceptions,finally,memoize) ::= <<
+<returnScope(scope=ruleDescriptor.returnScope)>
+
+# $ANTLR start "<ruleName>"
+# <fileName>:<description>
+<ruleDescriptor.actions.decorate>
+def <ruleName>(self, <ruleDescriptor.parameterScope:parameterScope()>):
+<if(trace)>
+    self.traceIn("<ruleName>", <ruleDescriptor.index>)<\n>
+<endif>
+    <ruleScopeSetUp()>
+    <ruleDeclarations()>
+    <ruleLabelDefs()>
+    <ruleDescriptor.actions.init>
+    <@preamble()>
+    <@body><ruleBody()><@end>
+    <@postamble()>
+    return <ruleReturnValue()>
+
+# $ANTLR end "<ruleName>"
+>>
+
+ruleBody() ::= <<
+<if(memoize)>
+<if(backtracking)>
+success = False<\n>
+<endif>
+<endif>
+try:
+    try:
+        <ruleMemoization(name=ruleName)>
+        <block>
+        <ruleCleanUp()>
+        <(ruleDescriptor.actions.after):execAction()>
+
+<if(memoize)>
+<if(backtracking)>
+        success = True<\n>
+<endif>
+<endif>
+<if(exceptions)>
+    <exceptions:{e|<catch(decl=e.decl,action=e.action)><\n>}>
+<else>
+<if(!emptyRule)>
+<if(actions.(actionScope).rulecatch)>
+    <actions.(actionScope).rulecatch>
+<else>
+    except RecognitionException as re:
+        self.reportError(re)
+        self.recover(self.input, re)
+        <@setErrorReturnValue()>
+
+<endif>
+<else>
+    finally:
+        pass
+
+<endif>
+<endif>
+finally:
+<if(trace)>
+    self.traceOut("<ruleName>", <ruleDescriptor.index>)<\n>
+<endif>
+    <memoize()>
+    <ruleScopeCleanUp()>
+    <finally>
+    pass
+>>
+
+catch(decl,action) ::= <<
+except <e.decl>:
+    <e.action>
+
+>>
+
+ruleDeclarations() ::= <<
+<if(ruleDescriptor.hasMultipleReturnValues)>
+retval = self.<ruleDescriptor.name>_return()
+retval.start = self.input.LT(1)<\n>
+<elseif(ruleDescriptor.returnScope)>
+<ruleDescriptor.returnScope.attributes:{ a |
+<a.name> = <if(a.initValue)><a.initValue><else>None<endif>
+}>
+<endif>
+<if(memoize)>
+<ruleDescriptor.name>_StartIndex = self.input.index()
+<endif>
+>>
+
+ruleScopeSetUp() ::= <<
+<ruleDescriptor.useScopes:{it | self.<it>_stack.append(<it>_scope())}; separator="\n">
+<ruleDescriptor.ruleScope:{it | self.<it.name>_stack.append(<it.name>_scope())}; separator="\n">
+>>
+
+ruleScopeCleanUp() ::= <<
+<ruleDescriptor.useScopes:{it | self.<it>_stack.pop()}; separator="\n">
+<ruleDescriptor.ruleScope:{it | self.<it.name>_stack.pop()}; separator="\n">
+>>
+
+ruleLabelDefs() ::= <<
+<[ruleDescriptor.tokenLabels,ruleDescriptor.tokenListLabels,
+  ruleDescriptor.wildcardTreeLabels,ruleDescriptor.wildcardTreeListLabels]
+    :{it | <it.label.text> = None}; separator="\n"
+>
+<[ruleDescriptor.tokenListLabels,ruleDescriptor.ruleListLabels,
+  ruleDescriptor.wildcardTreeListLabels]
+    :{it | list_<it.label.text> = None}; separator="\n"
+>
+<ruleDescriptor.ruleLabels:ruleLabelDef(); separator="\n">
+<ruleDescriptor.ruleListLabels:{it | <it.label.text> = None}; separator="\n">
+>>
+
+lexerRuleLabelDefs() ::= <<
+<[ruleDescriptor.tokenLabels,
+  ruleDescriptor.tokenListLabels,
+  ruleDescriptor.ruleLabels]
+    :{it | <it.label.text> = None}; separator="\n"
+>
+<ruleDescriptor.charLabels:{it | <it.label.text> = None}; separator="\n">
+<[ruleDescriptor.tokenListLabels,
+  ruleDescriptor.ruleListLabels]
+    :{it | list_<it.label.text> = None}; separator="\n"
+>
+>>
+
+ruleReturnValue() ::= <%
+<if(!ruleDescriptor.isSynPred)>
+<if(ruleDescriptor.hasReturnValue)>
+<if(ruleDescriptor.hasSingleReturnValue)>
+<ruleDescriptor.singleValueReturnName>
+<else>
+retval
+<endif>
+<endif>
+<endif>
+%>
+
+ruleCleanUp() ::= <<
+<if(ruleDescriptor.hasMultipleReturnValues)>
+<if(!TREE_PARSER)>
+retval.stop = self.input.LT(-1)<\n>
+<endif>
+<endif>
+>>
+
+memoize() ::= <<
+<if(memoize)>
+<if(backtracking)>
+if self._state.backtracking > 0:
+    self.memoize(self.input, <ruleDescriptor.index>, <ruleDescriptor.name>_StartIndex, success)
+
+<endif>
+<endif>
+>>
+
+/** How to generate a rule in the lexer; naked blocks are used for
+ *  fragment rules.
+ */
+lexerRule(ruleName,nakedBlock,ruleDescriptor,block,memoize) ::= <<
+# $ANTLR start "<ruleName>"
+def m<ruleName>(self, <ruleDescriptor.parameterScope:parameterScope()>):
+<if(trace)>
+    self.traceIn("<ruleName>", <ruleDescriptor.index>)<\n>
+<endif>
+    <ruleScopeSetUp()>
+    <ruleDeclarations()>
+<if(memoize)>
+<if(backtracking)>
+    success = False<\n>
+<endif>
+<endif>
+    try:
+<if(nakedBlock)>
+        <ruleMemoization(name=ruleName)>
+        <lexerRuleLabelDefs()>
+        <ruleDescriptor.actions.init>
+        <block><\n>
+<else>
+        _type = <ruleName>
+        _channel = DEFAULT_CHANNEL
+
+        <ruleMemoization(name=ruleName)>
+        <lexerRuleLabelDefs()>
+        <ruleDescriptor.actions.init>
+        <block>
+        <ruleCleanUp()>
+        self._state.type = _type
+        self._state.channel = _channel
+        <(ruleDescriptor.actions.after):execAction()>
+<endif>
+<if(memoize)>
+<if(backtracking)>
+        success = True<\n>
+<endif>
+<endif>
+
+    finally:
+<if(trace)>
+        self.traceOut("<ruleName>", <ruleDescriptor.index>)<\n>
+<endif>
+        <ruleScopeCleanUp()>
+        <memoize()>
+        pass
+
+# $ANTLR end "<ruleName>"
+
+
+>>
+
+/** How to generate code for the implicitly-defined lexer grammar rule
+ *  that chooses between lexer rules.
+ */
+tokensRule(ruleName,nakedBlock,args,block,ruleDescriptor) ::= <<
+def mTokens(self):
+    <block><\n>
+
+
+>>
+
+// S U B R U L E S
+
+/** A (...) subrule with multiple alternatives */
+block(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,maxK,maxAlt,description) ::= <<
+# <fileName>:<description>
+alt<decisionNumber> = <maxAlt>
+<decls>
+<@body><blockBody()><@end>
+>>
+
+blockBody() ::= <<
+<@predecision()>
+<@decision><decision><@end>
+<@postdecision()>
+<@prebranch()>
+<alts:{a | <altSwitchCase(i, a)>}; separator="\nel">
+<@postbranch()>
+>>
+
+/** A rule block with multiple alternatives */
+ruleBlock(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,maxK,maxAlt,description) ::= <<
+# <fileName>:<description>
+alt<decisionNumber> = <maxAlt>
+<decls>
+<@predecision()>
+<@decision><decision><@end>
+<@postdecision()>
+<alts:{a | <altSwitchCase(i, a)>}; separator="\nel">
+>>
+
+ruleBlockSingleAlt(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,description) ::= <<
+# <fileName>:<description>
+<decls>
+<@prealt()>
+<alts>
+<@postalt()>
+>>
+
+/** A special case of a (...) subrule with a single alternative */
+blockSingleAlt(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,description) ::= <<
+# <fileName>:<description>
+<decls>
+<@prealt()>
+<alts>
+<@postalt()>
+>>
+
+/** A (..)+ block with 1 or more alternatives */
+positiveClosureBlock(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,maxK,maxAlt,description) ::= <<
+# <fileName>:<description>
+cnt<decisionNumber> = 0
+<decls>
+<@preloop()>
+<@loopBody>
+<positiveClosureBlockLoop()>
+<@end>
+<@postloop()>
+>>
+
+positiveClosureBlockLoop() ::= <<
+while True: #loop<decisionNumber>
+    alt<decisionNumber> = <maxAlt>
+    <@predecision()>
+    <@decisionBody><decision><@end>
+    <@postdecision()>
+    <alts:{a | <altSwitchCase(i, a)>}; separator="\nel">
+    else:
+        if cnt<decisionNumber> >= 1:
+            break #loop<decisionNumber>
+
+        <ruleBacktrackFailure()>
+        eee = EarlyExitException(<decisionNumber>, self.input)
+        <@earlyExitException()>
+        raise eee
+
+    cnt<decisionNumber> += 1
+>>
+
+positiveClosureBlockSingleAlt ::= positiveClosureBlock
+
+/** A (..)* block with 1 or more alternatives */
+closureBlock(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,maxK,maxAlt,description) ::= <<
+# <fileName>:<description>
+<decls>
+<@preloop()>
+<@loopBody>
+<closureBlockLoop()>
+<@end>
+<@postloop()>
+>>
+
+closureBlockLoop() ::= <<
+while True: #loop<decisionNumber>
+    alt<decisionNumber> = <maxAlt>
+    <@predecision()>
+    <@decisionBody><decision><@end>
+    <@postdecision()>
+    <alts:{a | <altSwitchCase(i, a)>}; separator="\nel">
+    else:
+        break #loop<decisionNumber>
+>>
+
+closureBlockSingleAlt ::= closureBlock
+
+/** Optional blocks (x)? are translated to (x|) by before code generation
+ *  so we can just use the normal block template
+ */
+optionalBlock ::= block
+
+optionalBlockSingleAlt ::= block
+
+/** A case in a switch that jumps to an alternative given the alternative
+ *  number.  A DFA predicts the alternative and then a simple switch
+ *  does the jump to the code that actually matches that alternative.
+ */
+altSwitchCase(altNum,alt) ::= <<
+if alt<decisionNumber> == <altNum>:
+    <@prealt()>
+    <alt>
+>>
+
+/** An alternative is just a list of elements; at outermost level */
+alt(elements,altNum,description,autoAST,outerAlt, treeLevel,rew) ::= <<
+# <fileName>:<description>
+pass <! so empty alternatives are a valid block !>
+<@declarations()>
+<elements:element()>
+<rew>
+<@cleanup()>
+>>
+
+/** What to emit when there is no rewrite.  For auto build
+ *  mode, does nothing.
+ */
+noRewrite(rewriteBlockLevel, treeLevel) ::= ""
+
+// E L E M E N T S
+
+/** Dump the elements one per line */
+element(e) ::= <<
+<@prematch()>
+<e.el><\n>
+>>
+
+/** match a token optionally with a label in front */
+tokenRef(token,label,elementIndex,terminalOptions={}) ::= <<
+<if(label)><label> = <endif>self.match(self.input, <token>, self.FOLLOW_<token>_in_<ruleName><elementIndex>)
+>>
+
+/** ids+=ID */
+tokenRefAndListLabel(token,label,elementIndex,terminalOptions={}) ::= <<
+<tokenRef(token,label,elementIndex,terminalOptions)>
+<listLabel(label, label)>
+>>
+
+listLabel(label, elem) ::= <<
+if list_<label> is None:
+    list_<label> = []
+list_<label>.append(<elem>)<\n>
+>>
+
+/** match a character */
+charRef(char,label) ::= <<
+<if(label)>
+<label> = self.input.LA(1)<\n>
+<endif>
+self.match(<char>)
+>>
+
+/** match a character range */
+charRangeRef(a,b,label) ::= <<
+<if(label)>
+<label> = self.input.LA(1)<\n>
+<endif>
+self.matchRange(<a>, <b>)
+>>
+
+/** For now, sets are interval tests and must be tested inline */
+matchSet(s,label,elementIndex,postmatchCode="",terminalOptions={}) ::= <<
+<if(label)>
+<label> = self.input.LT(1)<\n>
+<endif>
+if <s>:
+    self.input.consume()
+    <postmatchCode>
+<if(!LEXER)>
+    self._state.errorRecovery = False<\n>
+<endif>
+
+else:
+    <ruleBacktrackFailure()>
+    mse = MismatchedSetException(None, self.input)
+    <@mismatchedSetException()>
+<if(LEXER)>
+    self.recover(mse)
+    raise mse
+<else>
+    raise mse
+    <! use following code to make it recover inline; remove throw mse;
+    self.recoverFromMismatchedSet(
+        self.input, mse, self.FOLLOW_set_in_<ruleName><elementIndex>
+        )
+    !>
+<endif>
+<\n>
+>>
+
+matchRuleBlockSet ::= matchSet
+
+matchSetAndListLabel(s,label,elementIndex,postmatchCode) ::= <<
+<matchSet(...)>
+<listLabel(label, label)>
+>>
+
+/** Match a string literal */
+lexerStringRef(string,label,elementIndex="0") ::= <<
+<if(label)>
+<label>Start = self.getCharIndex()
+self.match(<string>)
+<label>StartLine<elementIndex> = self.getLine()
+<label>StartCharPos<elementIndex> = self.getCharPositionInLine()
+<label> = <labelType>(input=self.input, type=INVALID_TOKEN_TYPE, channel=DEFAULT_CHANNEL, start=<label>Start, stop=self.getCharIndex()-1)
+<label>.line = <label>StartLine<elementIndex>
+<label>.charPositionInLine = <label>StartCharPos<elementIndex>
+<else>
+self.match(<string>)
+<endif>
+>>
+
+wildcard(token,label,elementIndex,terminalOptions={}) ::= <<
+<if(label)>
+<label> = self.input.LT(1)<\n>
+<endif>
+self.matchAny()
+>>
+
+wildcardAndListLabel(token,label,elementIndex,terminalOptions={}) ::= <<
+<wildcard(...)>
+<listLabel(label,label)>
+>>
+
+/** Match . wildcard in lexer */
+wildcardChar(label, elementIndex) ::= <<
+<if(label)>
+<label> = self.input.LA(1)<\n>
+<endif>
+self.matchAny()
+>>
+
+wildcardCharListLabel(label, elementIndex) ::= <<
+<wildcardChar(label, elementIndex)>
+<listLabel(label, label)>
+>>
+
+/** Match a rule reference by invoking it possibly with arguments
+ *  and a return value or values. The 'rule' argument was the
+ *  target rule name, but now is type Rule, whose toString is
+ *  same: the rule name.  Now though you can access full rule
+ *  descriptor stuff.
+ */
+ruleRef(rule,label,elementIndex,args,scope) ::= <<
+self._state.following.append(self.FOLLOW_<rule.name>_in_<ruleName><elementIndex>)
+<if(label)><label> = <endif>self.<if(scope)><scope:delegateName()>.<endif><rule.name>(<args; separator=", ">)<\n>
+self._state.following.pop()
+>>
+
+/** ids+=rule */
+ruleRefAndListLabel(rule,label,elementIndex,args,scope) ::= <<
+<ruleRef(rule,label,elementIndex,args,scope)>
+<listLabel(label, label)>
+>>
+
+/** A lexer rule reference
+ *  The 'rule' argument was the target rule name, but now
+ *  is type Rule, whose toString is same: the rule name.
+ *  Now though you can access full rule descriptor stuff.
+ */
+lexerRuleRef(rule,label,args,elementIndex,scope) ::= <<
+<if(label)>
+<label>Start<elementIndex> = self.getCharIndex()
+self.<if(scope)><scope:delegateName()>.<endif>m<rule.name>(<args; separator=", ">)
+<label>StartLine<elementIndex> = self.getLine()
+<label>StartCharPos<elementIndex> = self.getCharPositionInLine()
+<label> = <labelType>(
+    input=self.input,
+    type=INVALID_TOKEN_TYPE,
+    channel=DEFAULT_CHANNEL,
+    start=<label>Start<elementIndex>,
+    stop=self.getCharIndex()-1)
+<label>.line = <label>StartLine<elementIndex>
+<label>.charPositionInLine = <label>StartCharPos<elementIndex>
+<else>
+self.<if(scope)><scope:delegateName()>.<endif>m<rule.name>(<args; separator=", ">)
+<endif>
+>>
+
+/** i+=INT in lexer */
+lexerRuleRefAndListLabel(rule,label,args,elementIndex,scope) ::= <<
+<lexerRuleRef(rule,label,args,elementIndex,scope)>
+<listLabel(label, label)>
+>>
+
+/** EOF in the lexer */
+lexerMatchEOF(label,elementIndex) ::= <<
+<if(label)>
+<label>Start<elementIndex> = self.getCharIndex()
+<label>StartLine<elementIndex> = self.getLine()
+<label>StartCharPos<elementIndex> = self.getCharPositionInLine()
+self.match(EOF)
+<label> = <labelType>(input=self.input, type=EOF, channel=DEFAULT_CHANNEL, start=<label>Start<elementIndex>, stop=self.getCharIndex()-1)
+<label>.line = <label>StartLine<elementIndex>
+<label>.charPositionInLine = <label>StartCharPos<elementIndex>
+<else>
+self.match(EOF)
+<endif>
+>>
+
+// used for left-recursive rules
+recRuleDefArg()                       ::= "<recRuleArg()>"
+recRuleArg()                          ::= "_p"
+recRuleAltPredicate(ruleName, opPrec) ::= "<recRuleArg()> \<= <opPrec>"
+recRuleSetResultAction()              ::= "root_0 = $<ruleName>_primary.tree"
+recRuleSetReturnAction(src, name)     ::= "$<name> = $<src>.<name>"
+
+/** match ^(root children) in tree parser */
+tree(root, actionsAfterRoot, children, nullableChildList,
+     enclosingTreeLevel, treeLevel) ::= <<
+<root:element()>
+<actionsAfterRoot:element()>
+<if(nullableChildList)>
+if self.input.LA(1) == DOWN:
+    self.match(self.input, DOWN, None)
+    <children:element()>
+    self.match(self.input, UP, None)
+
+<else>
+self.match(self.input, DOWN, None)
+<children:element()>
+self.match(self.input, UP, None)
+<endif>
+>>
+
+/** Every predicate is used as a validating predicate (even when it is
+ *  also hoisted into a prediction expression).
+ */
+validateSemanticPredicate(pred,description) ::= <<
+if not (<evalPredicate(pred, description)>):
+    <ruleBacktrackFailure()>
+    raise FailedPredicateException(self.input, "<ruleName>", "<description>")
+
+>>
+
+// F i x e d  D F A  (if-then-else)
+
+dfaState(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
+LA<decisionNumber>_<stateNumber> = self.input.LA(<k>)<\n>
+<edges; separator="\nel">
+else:
+<if(eotPredictsAlt)>
+    alt<decisionNumber> = <eotPredictsAlt>
+<else>
+    <ruleBacktrackFailure()>
+    nvae = NoViableAltException("<description>", <decisionNumber>, <stateNumber>, self.input)<\n>
+    <@noViableAltException()>
+    raise nvae<\n>
+<endif>
+>>
+
+/** Same as a normal DFA state except that we don't examine lookahead
+ *  for the bypass alternative.  It delays error detection but this
+ *  is faster, smaller, and more what people expect.  For (X)? people
+ *  expect "if ( LA(1)==X ) match(X);" and that's it.
+ */
+dfaOptionalBlockState(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
+LA<decisionNumber>_<stateNumber> = self.input.LA(<k>)<\n>
+<edges; separator="\nel">
+>>
+
+/** A DFA state that is actually the loopback decision of a closure
+ *  loop.  If end-of-token (EOT) predicts any of the targets then it
+ *  should act like a default clause (i.e., no error can be generated).
+ *  This is used only in the lexer so that for ('a')* on the end of a rule
+ *  anything other than 'a' predicts exiting.
+ */
+dfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
+LA<decisionNumber>_<stateNumber> = self.input.LA(<k>)<\n>
+<edges; separator="\nel"><\n>
+<if(eotPredictsAlt)>
+<if(!edges)>
+alt<decisionNumber> = <eotPredictsAlt> <! if no edges, don't gen ELSE !>
+<else>
+else:
+    alt<decisionNumber> = <eotPredictsAlt>
+<\n>
+<endif>
+<endif>
+>>
+
+/** An accept state indicates a unique alternative has been predicted */
+dfaAcceptState(alt) ::= "alt<decisionNumber> = <alt>"
+
+/** A simple edge with an expression.  If the expression is satisfied,
+ *  enter to the target state.  To handle gated productions, we may
+ *  have to evaluate some predicates for this edge.
+ */
+dfaEdge(labelExpr, targetState, predicates) ::= <<
+if (<labelExpr>) <if(predicates)>and (<predicates>)<endif>:
+    <targetState>
+>>
+
+// F i x e d  D F A  (switch case)
+
+/** A DFA state where a SWITCH may be generated.  The code generator
+ *  decides if this is possible: CodeGenerator.canGenerateSwitch().
+ */
+dfaStateSwitch(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
+<!
+  FIXME: this is one of the few occasion, where I miss a switch statement
+  in Python. ATM this is implemented as a list of if .. elif ..
+  This may be replaced by faster a dictionary lookup, when I find a solution
+  for the cases when an edge is not a plain dfaAcceptState.
+!>
+LA<decisionNumber> = self.input.LA(<k>)
+<edges; separator="\nel">
+else:
+<if(eotPredictsAlt)>
+    alt<decisionNumber> = <eotPredictsAlt>
+<else>
+    <ruleBacktrackFailure()>
+    nvae = NoViableAltException("<description>", <decisionNumber>, <stateNumber>, self.input)<\n>
+    <@noViableAltException()>
+    raise nvae<\n>
+<endif>
+
+>>
+
+dfaOptionalBlockStateSwitch(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
+LA<decisionNumber> = self.input.LA(<k>)
+<edges; separator="\nel">
+>>
+
+dfaLoopbackStateSwitch(k, edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
+LA<decisionNumber> = self.input.LA(<k>)
+<edges; separator="\nel">
+<if(eotPredictsAlt)>
+else:
+    alt<decisionNumber> = <eotPredictsAlt>
+<endif>
+>>
+
+dfaEdgeSwitch(labels, targetState) ::= <<
+if LA<decisionNumber> in {<labels; separator=", ">}:
+    <targetState>
+>>
+
+// C y c l i c  D F A
+
+/** The code to initiate execution of a cyclic DFA; this is used
+ *  in the rule to predict an alt just like the fixed DFA case.
+ *  The <name> attribute is inherited via the parser, lexer, ...
+ */
+dfaDecision(decisionNumber,description) ::= <<
+alt<decisionNumber> = self.dfa<decisionNumber>.predict(self.input)
+>>
+
+/* Dump DFA tables as run-length-encoded Strings of octal values.
+ * Can't use hex as compiler translates them before compilation.
+ * These strings are split into multiple, concatenated strings.
+ * Java puts them back together at compile time thankfully.
+ * Java cannot handle large static arrays, so we're stuck with this
+ * encode/decode approach.  See analysis and runtime DFA for
+ * the encoding methods.
+ */
+cyclicDFA(dfa) ::= <<
+# lookup tables for DFA #<dfa.decisionNumber>
+
+DFA<dfa.decisionNumber>_eot = DFA.unpack(
+    "<dfa.javaCompressedEOT; wrap="\"\n    \"">"
+    )
+
+DFA<dfa.decisionNumber>_eof = DFA.unpack(
+    "<dfa.javaCompressedEOF; wrap="\"\n    \"">"
+    )
+
+DFA<dfa.decisionNumber>_min = DFA.unpack(
+    "<dfa.javaCompressedMin; wrap="\"\n    \"">"
+    )
+
+DFA<dfa.decisionNumber>_max = DFA.unpack(
+    "<dfa.javaCompressedMax; wrap="\"\n    \"">"
+    )
+
+DFA<dfa.decisionNumber>_accept = DFA.unpack(
+    "<dfa.javaCompressedAccept; wrap="\"\n    \"">"
+    )
+
+DFA<dfa.decisionNumber>_special = DFA.unpack(
+    "<dfa.javaCompressedSpecial; wrap="\"\n    \"">"
+    )
+
+
+DFA<dfa.decisionNumber>_transition = [
+    <dfa.javaCompressedTransition:{s|DFA.unpack("<s; wrap="\"\n\"">")}; separator=",\n">
+]
+
+# class definition for DFA #<dfa.decisionNumber>
+
+class DFA<dfa.decisionNumber>(DFA):
+    pass
+
+    <@errorMethod()>
+
+<if(dfa.specialStateSTs)>
+    def specialStateTransition(self_, s, input):
+        # convince pylint that my self_ magic is ok ;)
+        # pylint: disable-msg=E0213
+
+        # pretend we are a member of the recognizer
+        # thus semantic predicates can be evaluated
+        self = self_.recognizer
+
+        _s = s
+
+        <dfa.specialStateSTs:{state | if s == <i0>: <! compressed special state numbers 0..n-1 !>
+    <state>}; separator="\nel">
+
+<if(backtracking)>
+        if self._state.backtracking > 0:
+            raise BacktrackingFailed
+
+<endif>
+        nvae = NoViableAltException(self_.getDescription(), <dfa.decisionNumber>, _s, input)
+        self_.error(nvae)
+        raise nvae<\n>
+<endif>
+
+>>
+
+cyclicDFAInit(dfa) ::= <<
+self.dfa<dfa.decisionNumber> = self.DFA<dfa.decisionNumber>(
+    self, <dfa.decisionNumber>,
+    eot = self.DFA<dfa.decisionNumber>_eot,
+    eof = self.DFA<dfa.decisionNumber>_eof,
+    min = self.DFA<dfa.decisionNumber>_min,
+    max = self.DFA<dfa.decisionNumber>_max,
+    accept = self.DFA<dfa.decisionNumber>_accept,
+    special = self.DFA<dfa.decisionNumber>_special,
+    transition = self.DFA<dfa.decisionNumber>_transition
+    )<\n>
+>>
+
+/** A state in a cyclic DFA; it's a special state and part of a big switch on
+ *  state.
+ */
+cyclicDFAState(decisionNumber,stateNumber,edges,needErrorClause,semPredState) ::= <<
+LA<decisionNumber>_<stateNumber> = input.LA(1)<\n>
+<if(semPredState)> <! get next lookahead symbol to test edges, then rewind !>
+index<decisionNumber>_<stateNumber> = input.index()
+input.rewind()<\n>
+<endif>
+s = -1
+<edges; separator="\nel">
+<if(semPredState)> <! return input cursor to state before we rewound !>
+input.seek(index<decisionNumber>_<stateNumber>)<\n>
+<endif>
+if s >= 0:
+    return s
+>>
+
+/** Just like a fixed DFA edge, test the lookahead and indicate what
+ *  state to jump to next if successful.
+ */
+cyclicDFAEdge(labelExpr, targetStateNumber, edgeNumber, predicates) ::= <<
+if (<labelExpr>)<if(predicates)> and (<predicates>)<endif>:
+    s = <targetStateNumber><\n>
+>>
+
+/** An edge pointing at end-of-token; essentially matches any char;
+ *  always jump to the target.
+ */
+eotDFAEdge(targetStateNumber,edgeNumber, predicates) ::= <<
+se:
+    s = <targetStateNumber><\n>
+>>
+
+
+// D F A  E X P R E S S I O N S
+
+andPredicates(left,right) ::= "((<left>) and (<right>))"
+
+orPredicates(operands) ::= "(<operands; separator=\" or \">)"
+
+notPredicate(pred) ::= "not (<evalPredicate(pred, {})>)"
+
+evalPredicate(pred,description) ::= "(<pred>)"
+
+evalSynPredicate(pred,description) ::= "self.<pred>()"
+
+lookaheadTest(atom,k,atomAsInt) ::= "LA<decisionNumber>_<stateNumber> == <atom>"
+
+/** Sometimes a lookahead test cannot assume that LA(k) is in a temp variable
+ *  somewhere.  Must ask for the lookahead directly.
+ */
+isolatedLookaheadTest(atom,k,atomAsInt) ::= "self.input.LA(<k>) == <atom>"
+
+lookaheadRangeTest(lower,upper,k,rangeNumber,lowerAsInt,upperAsInt) ::= <%
+(<lower> \<= LA<decisionNumber>_<stateNumber> \<= <upper>)
+%>
+
+isolatedLookaheadRangeTest(lower,upper,k,rangeNumber,lowerAsInt,upperAsInt) ::= "(<lower> \<= self.input.LA(<k>) \<= <upper>)"
+
+lookaheadSetTest(values,k,valuesAsInt) ::= <%
+LA<decisionNumber>_<stateNumber> in {<values; separator=", ">}
+%>
+
+isolatedLookaheadSetTest(values,k,valuesAsInt) ::= <%
+self.input.LA(<k>) in {<values; separator=", ">}
+%>
+
+lookaheadVarName(k) ::= "LA<decisionNumber>_<stateNumber>"
+isolatedLookaheadVarName(k) ::= "self.input.LA(<k>)"
+
+setTest(ranges) ::= "<ranges; separator=\" or \">"
+
+// A T T R I B U T E S
+
+globalAttributeScopeClass(scope) ::= <<
+<if(scope)>
+<if(scope.attributes)>
+class <scope.name>_scope(object):
+    def __init__(self):
+        <scope.attributes:{it | self.<it.decl> = None}; separator="\n">
+
+<endif>
+<endif>
+>>
+
+globalAttributeScopeStack(scope) ::= <<
+<if(scope)>
+<if(scope.attributes)>
+self.<scope.name>_stack = []<\n>
+<endif>
+<endif>
+>>
+
+ruleAttributeScopeClass(scope) ::= <<
+<if(scope)>
+<if(scope.attributes)>
+class <scope.name>_scope(object):
+    def __init__(self):
+        <scope.attributes:{it | self.<it.decl> = None}; separator="\n">
+
+<endif>
+<endif>
+>>
+
+ruleAttributeScopeStack(scope) ::= <<
+<if(scope)>
+<if(scope.attributes)>
+self.<scope.name>_stack = []<\n>
+<endif>
+<endif>
+>>
+
+delegateName(d) ::= <<
+<if(d.label)><d.label><else>g<d.name><endif>
+>>
+
+/** Define a rule label including default value */
+ruleLabelDef(label) ::= <<
+<label.label.text> = None
+>>
+
+returnStructName(r) ::= "<r.name>_return"
+
+/** Define a return struct for a rule if the code needs to access its
+ *  start/stop tokens, tree stuff, attributes, ...  Leave a hole for
+ *  subgroups to stick in members.
+ */
+returnScope(scope) ::= <<
+<if(ruleDescriptor.hasMultipleReturnValues)>
+class <ruleDescriptor:returnStructName()>(<if(TREE_PARSER)>Tree<else>Parser<endif>RuleReturnScope):
+    def __init__(self):
+        super().__init__()
+
+        <if(scope)><scope.attributes:{it | self.<it.decl> = None}; separator="\n"><endif>
+        <@ruleReturnInit()>
+
+
+    <@ruleReturnMembers()>
+
+<endif>
+>>
+
+parameterScope(scope) ::= <<
+<if(scope)><scope.attributes:{it | <it.decl>}; separator=", "><endif>
+>>
+
+parameterAttributeRef(attr) ::= "<attr.name>"
+parameterSetAttributeRef(attr,expr) ::= "<attr.name> = <expr>"
+
+scopeAttributeRef(scope,attr,index,negIndex) ::= <%
+<if(negIndex)>
+self.<scope>_stack[-<negIndex>].<attr.name>
+<else>
+<if(index)>
+self.<scope>_stack[<index>].<attr.name>
+<else>
+self.<scope>_stack[-1].<attr.name>
+<endif>
+<endif>
+%>
+
+/* not applying patch because of bug in action parser!
+
+<if(negIndex)>
+((len(self.<scope>_stack) - <negIndex> - 1) >= 0 and [self.<scope>_stack[-<negIndex>].<attr.name>] or [None])[0]
+<else>
+<if(index)>
+((<index> \< len(self.<scope>_stack)) and [self.<scope>_stack[<index>].<attr.name>] or [None])[0]
+<else>
+((len(self.<scope>_stack) > 0) and [self.<scope>_stack[-1].<attr.name>] or [None])[0]
+<endif>
+<endif>
+
+*/
+
+scopeSetAttributeRef(scope,attr,expr,index,negIndex) ::= <%
+<if(negIndex)>
+<!FIXME: this seems not to be used by ActionTranslator...!>
+self.<scope>_stack[-<negIndex>].<attr.name> = <expr>
+<else>
+<if(index)>
+<!FIXME: this seems not to be used by ActionTranslator...!>
+self.<scope>_stack[<index>].<attr.name> = <expr>
+<else>
+self.<scope>_stack[-1].<attr.name> = <expr>
+<endif>
+<endif>
+%>
+
+/** $x is either global scope or x is rule with dynamic scope; refers
+ *  to stack itself not top of stack.  This is useful for predicates
+ *  like {$function.size()>0 && $function::name.equals("foo")}?
+ */
+isolatedDynamicScopeRef(scope) ::= "self.<scope>_stack"
+
+/** reference an attribute of rule; might only have single return value */
+ruleLabelRef(referencedRule,scope,attr) ::= <%
+<if(referencedRule.hasMultipleReturnValues)>
+((<scope> is not None) and [<scope>.<attr.name>] or [None])[0]
+<else>
+<scope>
+<endif>
+%>
+
+returnAttributeRef(ruleDescriptor,attr) ::= <%
+<if(ruleDescriptor.hasMultipleReturnValues)>
+retval.<attr.name>
+<else>
+<attr.name>
+<endif>
+%>
+
+returnSetAttributeRef(ruleDescriptor,attr,expr) ::= <%
+<if(ruleDescriptor.hasMultipleReturnValues)>
+retval.<attr.name> = <expr>
+<else>
+<attr.name> = <expr>
+<endif>
+%>
+
+/** How to translate $tokenLabel */
+tokenLabelRef(label) ::= "<label>"
+
+/** ids+=ID {$ids} or e+=expr {$e} */
+listLabelRef(label) ::= "list_<label>"
+
+
+// not sure the next are the right approach; and they are evaluated early;
+// they cannot see TREE_PARSER or PARSER attributes for example. :(
+
+tokenLabelPropertyRef_text(scope,attr) ::= "<scope>.text"
+tokenLabelPropertyRef_type(scope,attr) ::= "<scope>.type"
+tokenLabelPropertyRef_line(scope,attr) ::= "<scope>.line"
+tokenLabelPropertyRef_pos(scope,attr) ::= "<scope>.charPositionInLine"
+tokenLabelPropertyRef_channel(scope,attr) ::= "<scope>.channel"
+tokenLabelPropertyRef_index(scope,attr) ::= "<scope>.index"
+tokenLabelPropertyRef_tree(scope,attr) ::= "<scope>_tree"
+
+ruleLabelPropertyRef_start(scope,attr) ::= "<scope>.start"
+ruleLabelPropertyRef_stop(scope,attr) ::= "<scope>.stop"
+ruleLabelPropertyRef_tree(scope,attr) ::= "<scope>.tree"
+ruleLabelPropertyRef_text(scope,attr) ::= <%
+<if(TREE_PARSER)>
+((<scope> is not None) and [self.input.getTokenStream().toString(
+    self.input.getTreeAdaptor().getTokenStartIndex(<scope>.start),
+    self.input.getTreeAdaptor().getTokenStopIndex(<scope>.start)
+    )] or [None])[0]
+<else>
+((<scope> is not None) and [self.input.toString(<scope>.start,<scope>.stop)] or [None])[0]
+<endif>
+%>
+ruleLabelPropertyRef_st(scope,attr) ::= "((<scope> is not None) and [<scope>.st] or [None])[0]"
+
+/** Isolated $RULE ref ok in lexer as it's a Token */
+lexerRuleLabel(label) ::= "<label>"
+
+lexerRuleLabelPropertyRef_type(scope,attr) ::= "((<scope> is not None) and [<scope>.type] or [0])[0]"
+lexerRuleLabelPropertyRef_line(scope,attr) ::= "((<scope> is not None) and [<scope>.line] or [0])[0]"
+lexerRuleLabelPropertyRef_pos(scope,attr) ::= "((<scope> is not None) and [<scope>.charPositionInLine] or [0])[0]"
+lexerRuleLabelPropertyRef_channel(scope,attr) ::= "((<scope> is not None) and [<scope>.channel] or [0])[0]"
+lexerRuleLabelPropertyRef_index(scope,attr) ::= "((<scope> is not None) and [<scope>.index] or [0])[0]"
+lexerRuleLabelPropertyRef_text(scope,attr) ::= "((<scope> is not None) and [<scope>.text] or [None])[0]"
+lexerRuleLabelPropertyRef_int(scope,attr) ::= "((<scope> is not None) and [int(<scope>.text)] or [0])[0]"
+
+// Somebody may ref $template or $tree or $stop within a rule:
+rulePropertyRef_start(scope,attr) ::= "retval.start"
+rulePropertyRef_stop(scope,attr) ::= "retval.stop" //mmm... or input.LT(-1)??
+rulePropertyRef_tree(scope,attr) ::= "retval.tree"
+rulePropertyRef_text(scope,attr) ::= "self.input.toString(retval.start, self.input.LT(-1))"
+rulePropertyRef_st(scope,attr) ::= "retval.st"
+
+lexerRulePropertyRef_text(scope,attr) ::= "self.text"
+lexerRulePropertyRef_type(scope,attr) ::= "_type"
+lexerRulePropertyRef_line(scope,attr) ::= "self._state.tokenStartLine"
+lexerRulePropertyRef_pos(scope,attr) ::= "self._state.tokenStartCharPositionInLine"
+lexerRulePropertyRef_index(scope,attr) ::= "-1" // undefined token index in lexer
+lexerRulePropertyRef_channel(scope,attr) ::= "_channel"
+lexerRulePropertyRef_start(scope,attr) ::= "self._state.tokenStartCharIndex"
+lexerRulePropertyRef_stop(scope,attr) ::= "(self.getCharIndex()-1)"
+lexerRulePropertyRef_int(scope,attr) ::= "int(<scope>.text)"
+
+// setting $st and $tree is allowed in local rule. everything else
+// is flagged as error
+ruleSetPropertyRef_tree(scope,attr,expr) ::= "retval.tree =<expr>"
+ruleSetPropertyRef_st(scope,attr,expr) ::= "retval.st =<expr>"
+
+
+/** How to execute an action (only when not backtracking) */
+execAction(action) ::= <<
+<if(backtracking)>
+<if(actions.(actionScope).synpredgate)>
+if <actions.(actionScope).synpredgate>:
+    pass
+    <action>
+
+<else>
+if <actions.(actionScope).synpredgate>:
+    pass
+    <action>
+
+<endif>
+<else>
+#action start
+<action>
+#action end
+<endif>
+>>
+
+/** How to always execute an action even when backtracking */
+execForcedAction(action) ::= "<action>"
+
+
+// M I S C (properties, etc...)
+
+codeFileExtension() ::= ".py"
+
+true_value() ::= "True"
+false_value() ::= "False"
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/Python3/ST.stg b/tool/src/main/resources/org/antlr/codegen/templates/Python3/ST.stg
new file mode 100644
index 0000000..718a1bd
--- /dev/null
+++ b/tool/src/main/resources/org/antlr/codegen/templates/Python3/ST.stg
@@ -0,0 +1,171 @@
+/*
+ [The "BSD license"]
+ Copyright (c) 2005-2012 Terence Parr
+ 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.
+*/
+/** Template subgroup to add template rewrite output
+ *  If debugging, then you'll also get STDbg.stg loaded.
+ */
+
+@outputFile.imports() ::= <<
+<@super.imports()>
+import stringtemplate3
+>>
+
+/** Add this to each rule's return value struct */
+@returnScope.ruleReturnInit() ::= <<
+self.st = None
+>>
+
+@returnScope.ruleReturnMembers() ::= <<
+def getTemplate(self):
+    return self.st
+
+def toString(self):
+    if self.st is not None:
+        return self.st.toString()
+    return None
+__str__ = toString
+
+>>
+
+@genericParser.init() ::= <<
+<@super.init()>
+self.templateLib = stringtemplate3.StringTemplateGroup(
+    '<name>Templates', lexer='angle-bracket'
+    )
+
+>>
+
+@genericParser.members() ::= <<
+<@super.members()>
+def setTemplateLib(self, templateLib):
+    self.templateLib = templateLib
+
+def getTemplateLib(self):
+    return self.templateLib
+
+>>
+
+/** x+=rule when output=template */
+ruleRefAndListLabel(rule,label,elementIndex,args,scope) ::= <<
+<ruleRef(...)>
+<listLabel(label, {<label>.st})>
+>>
+
+rewriteTemplate(alts) ::= <<
+# TEMPLATE REWRITE
+<if(backtracking)>
+if <actions.(actionScope).synpredgate>:
+    <first(alts):rewriteTemplateAltFirst()>
+    <rest(alts):{it | el<rewriteTemplateAlt(it)>}>
+    <if(rewriteMode)><replaceTextInLine()><endif>
+
+<else>
+<first(alts):rewriteTemplateAltFirst()>
+<rest(alts):{it | el<rewriteTemplateAlt(it)>}>
+<if(rewriteMode)><replaceTextInLine()><endif>
+<endif>
+>>
+
+replaceTextInLine() ::= <<
+<if(TREE_PARSER)>
+self.input.getTokenStream().replace(
+    self.input.getTreeAdaptor().getTokenStartIndex(retval.start),
+    self.input.getTreeAdaptor().getTokenStopIndex(retval.start),
+    retval.st
+    )
+<else>
+self.input.replace(
+    retval.start.getTokenIndex(),
+    self.input.LT(-1).getTokenIndex(),
+    retval.st
+    )
+<endif>
+>>
+
+rewriteTemplateAltFirst(alt) ::= <<
+<if(alt.pred)>
+if <alt.pred>:
+    # <alt.description>
+    retval.st = <alt.alt>
+<\n>
+<else>
+# <alt.description>
+retval.st = <alt.alt>
+<\n>
+<endif>
+>>
+
+rewriteTemplateAlt(alt) ::= <<
+<if(alt.pred)>if <alt.pred>:
+    # <alt.description>
+    retval.st = <alt.alt>
+<\n>
+<else>se:
+    # <alt.description>
+    retval.st = <alt.alt>
+<\n>
+<endif>
+>>
+
+rewriteEmptyTemplate(alts) ::= <<
+None
+>>
+
+/** Invoke a template with a set of attribute name/value pairs.
+ *  Set the value of the rule's template *after* having set
+ *  the attributes because the rule's template might be used as
+ *  an attribute to build a bigger template; you get a self-embedded
+ *  template.
+ */
+rewriteExternalTemplate(name,args) ::= <%
+self.templateLib.getInstanceOf("<name>"<if(args)>, attributes={<args:{a | "<a.name>": <a.value>}; separator=", ">}<endif>)
+%>
+
+/** expr is a string expression that says what template to load */
+rewriteIndirectTemplate(expr,args) ::= <%
+self.templateLib.getInstanceOf(<expr><if(args)>, attributes={<args:{a | "<a.name>": <a.value>}; separator=", ">}<endif>)
+%>
+
+/** Invoke an inline template with a set of attribute name/value pairs */
+rewriteInlineTemplate(args, template) ::= <%
+stringtemplate3.StringTemplate("<template>", group=self.templateLib<if(args)>, attributes={<args:{a | "<a.name>": <a.value>}; separator=", ">}<endif>)
+%>
+
+/** plain -> {foo} action */
+rewriteAction(action) ::= <<
+<action>
+>>
+
+/** An action has %st.attrName=expr; or %{st}.attrName=expr; */
+actionSetAttribute(st,attrName,expr) ::= <<
+(<st>)["<attrName>"] = <expr>
+>>
+
+/** Translate %{stringExpr} */
+actionStringConstructor(stringExpr) ::= <<
+stringtemplate3.StringTemplate(<stringExpr>, group=self.templateLib)
+>>
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/Ruby/Ruby.stg b/tool/src/main/resources/org/antlr/codegen/templates/Ruby/Ruby.stg
index dd26c0b..d743623 100644
--- a/tool/src/main/resources/org/antlr/codegen/templates/Ruby/Ruby.stg
+++ b/tool/src/main/resources/org/antlr/codegen/templates/Ruby/Ruby.stg
@@ -996,7 +996,7 @@
 
 andPredicates(left,right) ::= "( <left> ) and ( <right> )"
 
-orPredicates(operands) ::= "( <first(operands)> )<rest(operands):{o|  or ( <o> )}>"
+orPredicates(operands) ::= "<operands:{o|( <o> )}; separator=\" or \">"
 
 notPredicate(pred) ::= "not ( <pred> )"
 
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/Scala/Scala.stg b/tool/src/main/resources/org/antlr/codegen/templates/Scala/Scala.stg
index cd3f92e..bfd7c44 100644
--- a/tool/src/main/resources/org/antlr/codegen/templates/Scala/Scala.stg
+++ b/tool/src/main/resources/org/antlr/codegen/templates/Scala/Scala.stg
@@ -1114,7 +1114,7 @@
 
 andPredicates(left,right) ::= "(<left>&&<right>)"
 
-orPredicates(operands) ::= "(<first(operands)><rest(operands):{o | ||<o>}>)"
+orPredicates(operands) ::= "(<operands; separator=\"||\">)"
 
 notPredicate(pred) ::= "!(<evalPredicate(pred,\"\")>)"
 
diff --git a/tool/src/main/resources/org/antlr/tool/templates/dot/action-edge.st b/tool/src/main/resources/org/antlr/tool/templates/dot/action-edge.st
deleted file mode 100644
index 1bb8e96..0000000
--- a/tool/src/main/resources/org/antlr/tool/templates/dot/action-edge.st
+++ /dev/null
@@ -1 +0,0 @@
-<src> -> <target> [fontsize=11, fontname="Courier", arrowsize=.7, label = "<label>"<if(arrowhead)>, arrowhead = <arrowhead><endif>];
diff --git a/tool/src/main/resources/org/antlr/tool/templates/dot/decision-rank.st b/tool/src/main/resources/org/antlr/tool/templates/dot/decision-rank.st
deleted file mode 100644
index d5142f6..0000000
--- a/tool/src/main/resources/org/antlr/tool/templates/dot/decision-rank.st
+++ /dev/null
@@ -1 +0,0 @@
-{rank=same; rankdir=TB; <states; separator="; ">}
diff --git a/tool/src/main/resources/org/antlr/tool/templates/dot/dfa.st b/tool/src/main/resources/org/antlr/tool/templates/dot/dfa.st
deleted file mode 100644
index 5b81e70..0000000
--- a/tool/src/main/resources/org/antlr/tool/templates/dot/dfa.st
+++ /dev/null
@@ -1,7 +0,0 @@
-digraph NFA {
-<if(rankdir)>rankdir=<rankdir>;<endif>
-<decisionRanks; separator="\n">
-<states; separator="\n">
-<edges; separator="\n">
-}
-
diff --git a/tool/src/main/resources/org/antlr/tool/templates/dot/dot.stg b/tool/src/main/resources/org/antlr/tool/templates/dot/dot.stg
index 96981dc..efcac2c 100644
--- a/tool/src/main/resources/org/antlr/tool/templates/dot/dot.stg
+++ b/tool/src/main/resources/org/antlr/tool/templates/dot/dot.stg
@@ -48,7 +48,7 @@
 }
 >>
 
-decision_rank(states) ::= <<
+decision-rank(states) ::= <<
 {rank=same; rankdir=TB; <states; separator="; ">}
 >>
 
@@ -56,11 +56,11 @@
 <src> -> <target> [fontsize=11, fontname="Courier", arrowsize=.7, label = "<label>"<if(arrowhead)>, arrowhead = <arrowhead><endif>];
 >>
 
-action_edge(src,target,label,arrowhead) ::= <<
+action-edge(src,target,label,arrowhead) ::= <<
 <src> -> <target> [fontsize=11, fontname="Courier", arrowsize=.7, label = "<label>"<if(arrowhead)>, arrowhead = <arrowhead><endif>];
 >>
 
-epsilon_edge(src,target,label,arrowhead) ::= <<
+epsilon-edge(src,target,label,arrowhead) ::= <<
 <src> -> <target> [fontname="Times-Italic", label = "e"];
 >>
 
diff --git a/tool/src/main/resources/org/antlr/tool/templates/dot/edge.st b/tool/src/main/resources/org/antlr/tool/templates/dot/edge.st
deleted file mode 100644
index 1bb8e96..0000000
--- a/tool/src/main/resources/org/antlr/tool/templates/dot/edge.st
+++ /dev/null
@@ -1 +0,0 @@
-<src> -> <target> [fontsize=11, fontname="Courier", arrowsize=.7, label = "<label>"<if(arrowhead)>, arrowhead = <arrowhead><endif>];
diff --git a/tool/src/main/resources/org/antlr/tool/templates/dot/epsilon-edge.st b/tool/src/main/resources/org/antlr/tool/templates/dot/epsilon-edge.st
deleted file mode 100644
index 2a49b2b..0000000
--- a/tool/src/main/resources/org/antlr/tool/templates/dot/epsilon-edge.st
+++ /dev/null
@@ -1 +0,0 @@
-<src> -> <target> [fontname="Times-Italic", label = "e"];
diff --git a/tool/src/main/resources/org/antlr/tool/templates/dot/nfa.st b/tool/src/main/resources/org/antlr/tool/templates/dot/nfa.st
deleted file mode 100644
index 280ced2..0000000
--- a/tool/src/main/resources/org/antlr/tool/templates/dot/nfa.st
+++ /dev/null
@@ -1,6 +0,0 @@
-digraph NFA {
-rankdir=LR;
-<decisionRanks; separator="\n">
-<states; separator="\n">
-<edges; separator="\n">
-}
diff --git a/tool/src/main/resources/org/antlr/tool/templates/dot/state.st b/tool/src/main/resources/org/antlr/tool/templates/dot/state.st
deleted file mode 100644
index f68e3a8..0000000
--- a/tool/src/main/resources/org/antlr/tool/templates/dot/state.st
+++ /dev/null
@@ -1 +0,0 @@
-node [fontsize=11, shape = <if(useBox)>box<else>circle, fixedsize=true, width=.4<endif>]; <name>
diff --git a/tool/src/main/resources/org/antlr/tool/templates/dot/stopstate.st b/tool/src/main/resources/org/antlr/tool/templates/dot/stopstate.st
deleted file mode 100644
index 572d460..0000000
--- a/tool/src/main/resources/org/antlr/tool/templates/dot/stopstate.st
+++ /dev/null
@@ -1 +0,0 @@
-node [fontsize=11, shape = <if(useBox)>polygon,sides=4,peripheries=2<else>doublecircle, fixedsize=true, width=.6<endif>]; <name>
diff --git a/tool/src/main/resources/org/antlr/tool/templates/messages/languages/en.stg b/tool/src/main/resources/org/antlr/tool/templates/messages/languages/en.stg
index ea27ddc..b5e42d5 100644
--- a/tool/src/main/resources/org/antlr/tool/templates/messages/languages/en.stg
+++ b/tool/src/main/resources/org/antlr/tool/templates/messages/languages/en.stg
@@ -83,6 +83,8 @@
 	"at least one code generation template missing for language <arg>"
 CANNOT_CREATE_TARGET_GENERATOR(arg,exception,stackTrace) ::=
 	"cannot create target <arg> code generator: <exception>"
+STRING_TEMPLATE_ERROR(arg,exception,stackTrace) ::=
+	"template error: <arg>"
 CANNOT_COMPUTE_SAMPLE_INPUT_SEQ() ::=
 	"cannot generate a sample input sequence from lookahead DFA"
 
@@ -228,6 +230,7 @@
 CONFLICTING_OPTION_IN_TREE_FILTER(arg,arg2) ::= "option <arg>=<arg2> conflicts with tree grammar filter mode"
 ILLEGAL_OPTION_VALUE(arg, arg2) ::= "value '<arg2>' invalid for option <arg>"
 ALL_OPS_NEED_SAME_ASSOC(arg) ::= "all operators of alt <alt> of left-recursive rule must have same associativity"
+RANGE_OP_ILLEGAL(arg) ::= "the .. range operator isn't allowed in parser rules"
 
 // GRAMMAR WARNINGS
 
diff --git a/tool/src/test/java/org/antlr/test/BaseTest.java b/tool/src/test/java/org/antlr/test/BaseTest.java
index aae0560..12c88ac 100644
--- a/tool/src/test/java/org/antlr/test/BaseTest.java
+++ b/tool/src/test/java/org/antlr/test/BaseTest.java
@@ -39,21 +39,37 @@
 import org.antlr.tool.ErrorManager;
 import org.antlr.tool.GrammarSemanticsMessage;
 import org.antlr.tool.Message;
-import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
+import org.junit.Rule;
+import org.junit.rules.TestRule;
+import org.junit.rules.TestWatcher;
+import org.junit.runner.Description;
 
 import javax.tools.*;
 import java.io.*;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
 import java.util.*;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
+import static org.junit.Assert.*;
 
 public abstract class BaseTest {
+	// -J-Dorg.antlr.test.BaseTest.level=FINE
+	private static final Logger LOGGER = Logger.getLogger(BaseTest.class.getName());
+
 	public static final String newline = System.getProperty("line.separator");
 
 	public static final String jikes = null;//"/usr/bin/jikes";
 	public static final String pathSep = System.getProperty("path.separator");
 
+	public static final boolean TEST_IN_SAME_PROCESS = Boolean.parseBoolean(System.getProperty("antlr.testinprocess"));
+
    /**
     * When runnning from Maven, the junit tests are run via the surefire plugin. It sets the
     * classpath for the test environment into the following property. We need to pick this up
@@ -68,17 +84,24 @@
 
 	public String tmpdir = null;
 
-    /** reset during setUp and set to true if we find a problem */
-    protected boolean lastTestFailed = false;
-
 	/** If error during parser execution, store stderr here; can't return
      *  stdout and stderr.  This doesn't trap errors from running antlr.
      */
 	protected String stderrDuringParse;
 
+	@Rule
+	public final TestRule testWatcher = new TestWatcher() {
+
+		@Override
+		protected void succeeded(Description description) {
+			// remove tmpdir if no error.
+			eraseTempDir();
+		}
+
+	};
+
     @Before
 	public void setUp() throws Exception {
-        lastTestFailed = false; // hope for the best, but set to true in asserts that fail
         // new output dir for each test
         tmpdir = new File(System.getProperty("java.io.tmpdir"),
 						  "antlr-"+getClass().getName()+"-"+
@@ -87,13 +110,6 @@
         STGroup.defaultGroup = new STGroup();
     }
 
-    @After
-    public void tearDown() throws Exception {
-        // remove tmpdir if no error.
-        if ( !lastTestFailed ) eraseTempDir();
-
-    }
-
     protected Tool newTool(String[] args) {
 		Tool tool = new Tool(args);
 		tool.setOutputDirectory(tmpdir);
@@ -150,7 +166,7 @@
 		mkdir(tmpdir);
 		writeFile(tmpdir, fileName, grammarStr);
 		try {
-			final List options = new ArrayList();
+			final List<String> options = new ArrayList<String>();
 			if ( debug ) {
 				options.add("-debug");
 			}
@@ -174,7 +190,7 @@
 					allIsWell = false;
 					System.err.println("antlr reports errors from "+options);
 					for (int i = 0; i < equeue.errors.size(); i++) {
-						Message msg = (Message) equeue.errors.get(i);
+						Message msg = equeue.errors.get(i);
 						System.err.println(msg);
 					}
                     System.out.println("!!!\ngrammar:");
@@ -197,11 +213,13 @@
 							   String input,
 							   boolean debug)
 	{
-		rawGenerateAndBuildRecognizer(grammarFileName,
+		boolean compiled = rawGenerateAndBuildRecognizer(grammarFileName,
 									  grammarStr,
 									  null,
 									  lexerName,
 									  debug);
+		Assert.assertTrue(compiled);
+
 		writeFile(tmpdir, "input", input);
 		return rawExecRecognizer(null,
 								 null,
@@ -221,11 +239,13 @@
 								String startRuleName,
 								String input, boolean debug)
 	{
-		rawGenerateAndBuildRecognizer(grammarFileName,
+		boolean compiled = rawGenerateAndBuildRecognizer(grammarFileName,
 									  grammarStr,
 									  parserName,
 									  lexerName,
 									  debug);
+		Assert.assertTrue(compiled);
+
 		writeFile(tmpdir, "input", input);
 		boolean parserBuildsTrees =
 			grammarStr.indexOf("output=AST")>=0 ||
@@ -281,18 +301,20 @@
 									boolean debug)
 	{
 		// build the parser
-		rawGenerateAndBuildRecognizer(parserGrammarFileName,
+		boolean compiled = rawGenerateAndBuildRecognizer(parserGrammarFileName,
 									  parserGrammarStr,
 									  parserName,
 									  lexerName,
 									  debug);
+		Assert.assertTrue(compiled);
 
 		// build the tree parser
-		rawGenerateAndBuildRecognizer(treeParserGrammarFileName,
+		compiled = rawGenerateAndBuildRecognizer(treeParserGrammarFileName,
 									  treeParserGrammarStr,
 									  treeParserName,
 									  lexerName,
 									  debug);
+		Assert.assertTrue(compiled);
 
 		writeFile(tmpdir, "input", input);
 
@@ -327,6 +349,10 @@
 		//System.out.println(grammarStr);
 		boolean allIsWell =
 			antlr(grammarFileName, grammarFileName, grammarStr, debug);
+		if (!allIsWell) {
+			return false;
+		}
+
 		if ( lexerName!=null ) {
 			boolean ok;
 			if ( parserName!=null ) {
@@ -360,11 +386,77 @@
 	}
 
 	public String execRecognizer() {
+		return execClass("Test");
+	}
+
+	public String execClass(String className) {
+		if (TEST_IN_SAME_PROCESS) {
+			try {
+				ClassLoader loader = new URLClassLoader(new URL[] { new File(tmpdir).toURI().toURL() }, ClassLoader.getSystemClassLoader());
+                final Class<?> mainClass = (Class<?>)loader.loadClass(className);
+				final Method mainMethod = mainClass.getDeclaredMethod("main", String[].class);
+				PipedInputStream stdoutIn = new PipedInputStream();
+				PipedInputStream stderrIn = new PipedInputStream();
+				PipedOutputStream stdoutOut = new PipedOutputStream(stdoutIn);
+				PipedOutputStream stderrOut = new PipedOutputStream(stderrIn);
+				String inputFile = new File(tmpdir, "input").getAbsolutePath();
+				StreamVacuum stdoutVacuum = new StreamVacuum(stdoutIn, inputFile);
+				StreamVacuum stderrVacuum = new StreamVacuum(stderrIn, inputFile);
+
+				PrintStream originalOut = System.out;
+				System.setOut(new PrintStream(stdoutOut));
+				try {
+					PrintStream originalErr = System.err;
+					try {
+						System.setErr(new PrintStream(stderrOut));
+						stdoutVacuum.start();
+						stderrVacuum.start();
+						mainMethod.invoke(null, (Object)new String[] { inputFile });
+					}
+					finally {
+						System.setErr(originalErr);
+					}
+				}
+				finally {
+					System.setOut(originalOut);
+				}
+
+				stdoutOut.close();
+				stderrOut.close();
+				stdoutVacuum.join();
+				stderrVacuum.join();
+				String output = stdoutVacuum.toString();
+				if ( stderrVacuum.toString().length()>0 ) {
+					this.stderrDuringParse = stderrVacuum.toString();
+					System.err.println("exec stderrVacuum: "+ stderrVacuum);
+				}
+				return output;
+			} catch (MalformedURLException ex) {
+				LOGGER.log(Level.SEVERE, null, ex);
+			} catch (IOException ex) {
+				LOGGER.log(Level.SEVERE, null, ex);
+			} catch (InterruptedException ex) {
+				LOGGER.log(Level.SEVERE, null, ex);
+			} catch (IllegalAccessException ex) {
+				LOGGER.log(Level.SEVERE, null, ex);
+			} catch (IllegalArgumentException ex) {
+				LOGGER.log(Level.SEVERE, null, ex);
+			} catch (InvocationTargetException ex) {
+				LOGGER.log(Level.SEVERE, null, ex);
+			} catch (NoSuchMethodException ex) {
+				LOGGER.log(Level.SEVERE, null, ex);
+			} catch (SecurityException ex) {
+				LOGGER.log(Level.SEVERE, null, ex);
+			} catch (ClassNotFoundException ex) {
+				LOGGER.log(Level.SEVERE, null, ex);
+			}
+		}
+
 		try {
 			String inputFile = new File(tmpdir, "input").getAbsolutePath();
 			String[] args = new String[] {
 				"java", "-classpath", tmpdir+pathSep+CLASSPATH,
-				"Test", inputFile
+				className, inputFile
 			};
 			//String cmdLine = "java -classpath "+CLASSPATH+pathSep+tmpdir+" Test " + new File(tmpdir, "input").getAbsolutePath();
 			//System.out.println("execParser: "+cmdLine);
@@ -377,7 +469,7 @@
 			process.waitFor();
 			stdoutVacuum.join();
 			stderrVacuum.join();
-			String output = null;
+			String output;
 			output = stdoutVacuum.toString();
 			if ( stderrVacuum.toString().length()>0 ) {
 				this.stderrDuringParse = stderrVacuum.toString();
@@ -440,7 +532,7 @@
 						   */
 		Message foundMsg = null;
 		for (int i = 0; i < equeue.errors.size(); i++) {
-			Message m = (Message)equeue.errors.get(i);
+			Message m = equeue.errors.get(i);
 			if (m.msgID==expectedMessage.msgID ) {
 				foundMsg = m;
 			}
@@ -460,7 +552,7 @@
 	{
 		Message foundMsg = null;
 		for (int i = 0; i < equeue.warnings.size(); i++) {
-			Message m = (Message)equeue.warnings.get(i);
+			Message m = equeue.warnings.get(i);
 			if (m.msgID==expectedMessage.msgID ) {
 				foundMsg = m;
 			}
@@ -478,7 +570,7 @@
         //System.out.println("errors="+equeue);
         Message foundMsg = null;
         for (int i = 0; i < equeue.errors.size(); i++) {
-            Message m = (Message)equeue.errors.get(i);
+            Message m = equeue.errors.get(i);
             if (m.msgID==expectedMessage.msgID ) {
                 foundMsg = m;
             }
@@ -508,6 +600,7 @@
 			sucker = new Thread(this);
 			sucker.start();
 		}
+		@Override
 		public void run() {
 			try {
 				String line = in.readLine();
@@ -527,6 +620,7 @@
 		public void join() throws InterruptedException {
 			sucker.join();
 		}
+		@Override
 		public String toString() {
 			return buf.toString();
 		}
@@ -535,6 +629,7 @@
     public static class FilteringTokenStream extends CommonTokenStream {
         public FilteringTokenStream(TokenSource src) { super(src); }
         Set<Integer> hide = new HashSet<Integer>();
+		@Override
         protected void sync(int i) {
             super.sync(i);
             if ( hide.contains(get(i).getType()) ) get(i).setChannel(Token.HIDDEN_CHANNEL);
@@ -819,10 +914,10 @@
 		return lines[0].substring(prefix.length(),lines[0].length());
 	}
 
-	public List realElements(List elements) {
-		List n = new ArrayList();
+	public <T> List<T> realElements(List<T> elements) {
+		List<T> n = new ArrayList<T>();
 		for (int i = Label.NUM_FAUX_LABELS+Label.MIN_TOKEN_TYPE - 1; i < elements.size(); i++) {
-			Object o = (Object) elements.get(i);
+			T o = elements.get(i);
 			if ( o!=null ) {
 				n.add(o);
 			}
@@ -831,12 +926,11 @@
 	}
 
 	public List<String> realElements(Map<String, Integer> elements) {
-		List n = new ArrayList();
-		Iterator iterator = elements.keySet().iterator();
-		while (iterator.hasNext()) {
-			String tokenID = (String) iterator.next();
-			if ( elements.get(tokenID) >= Label.MIN_TOKEN_TYPE ) {
-				n.add(tokenID+"="+elements.get(tokenID));
+		List<String> n = new ArrayList<String>();
+		for (Map.Entry<String, Integer> entry : elements.entrySet()) {
+			String tokenID = entry.getKey();
+			if ( entry.getValue() >= Label.MIN_TOKEN_TYPE ) {
+				n.add(tokenID+"="+entry.getValue());
 			}
 		}
 		Collections.sort(n);
@@ -847,7 +941,7 @@
         String lines[] = s.split("\n");
         Arrays.sort(lines);
         List<String> linesL = Arrays.asList(lines);
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         for (String l : linesL) {
             buf.append(l);
             buf.append('\n');
@@ -866,7 +960,7 @@
      * @param m The Map that contains keys we wish to return in sorted order
      * @return A string that represents all the keys in sorted order.
      */
-    public String sortMapToString(Map m) {
+    public <K, V> String sortMapToString(Map<K, V> m) {
 
         System.out.println("Map toString looks like: " + m.toString());
         // Pass in crap, and get nothing back
@@ -877,28 +971,9 @@
 
         // Sort the keys in the Map
         //
-        TreeMap nset = new TreeMap(m);
+        TreeMap<K, V> nset = new TreeMap<K, V>(m);
 
         System.out.println("Tree map looks like: " + nset.toString());
         return nset.toString();
     }
-
-    // override to track errors
-
-    public void assertEquals(String msg, Object a, Object b) { try {Assert.assertEquals(msg,a,b);} catch (Error e) {lastTestFailed=true; throw e;} }
-    public void assertEquals(Object a, Object b) { try {Assert.assertEquals(a,b);} catch (Error e) {lastTestFailed=true; throw e;} }
-    public void assertEquals(String msg, long a, long b) { try {Assert.assertEquals(msg,a,b);} catch (Error e) {lastTestFailed=true; throw e;} }
-    public void assertEquals(long a, long b) { try {Assert.assertEquals(a,b);} catch (Error e) {lastTestFailed=true; throw e;} }
-
-    public void assertTrue(String msg, boolean b) { try {Assert.assertTrue(msg,b);} catch (Error e) {lastTestFailed=true; throw e;} }
-    public void assertTrue(boolean b) { try {Assert.assertTrue(b);} catch (Error e) {lastTestFailed=true; throw e;} }
-
-    public void assertFalse(String msg, boolean b) { try {Assert.assertFalse(msg,b);} catch (Error e) {lastTestFailed=true; throw e;} }
-    public void assertFalse(boolean b) { try {Assert.assertFalse(b);} catch (Error e) {lastTestFailed=true; throw e;} }
-
-    public void assertNotNull(String msg, Object p) { try {Assert.assertNotNull(msg, p);} catch (Error e) {lastTestFailed=true; throw e;} }
-    public void assertNotNull(Object p) { try {Assert.assertNotNull(p);} catch (Error e) {lastTestFailed=true; throw e;} }
-
-    public void assertNull(String msg, Object p) { try {Assert.assertNull(msg, p);} catch (Error e) {lastTestFailed=true; throw e;} }
-    public void assertNull(Object p) { try {Assert.assertNull(p);} catch (Error e) {lastTestFailed=true; throw e;} }
 }
diff --git a/tool/src/test/java/org/antlr/test/ErrorQueue.java b/tool/src/test/java/org/antlr/test/ErrorQueue.java
index 90c7b65..8546f3c 100644
--- a/tool/src/test/java/org/antlr/test/ErrorQueue.java
+++ b/tool/src/test/java/org/antlr/test/ErrorQueue.java
@@ -35,22 +35,26 @@
 import java.util.List;
 
 public class ErrorQueue implements ANTLRErrorListener {
-	List infos = new LinkedList();
-	List errors = new LinkedList();
-	List warnings = new LinkedList();
+	List<String> infos = new LinkedList<String>();
+	List<Message> errors = new LinkedList<Message>();
+	List<Message> warnings = new LinkedList<Message>();
 
+	@Override
 	public void info(String msg) {
 		infos.add(msg);
 	}
 
+	@Override
 	public void error(Message msg) {
 		errors.add(msg);
 	}
 
+	@Override
 	public void warning(Message msg) {
 		warnings.add(msg);
 	}
 
+	@Override
 	public void error(ToolMessage msg) {
 		errors.add(msg);
 	}
@@ -59,6 +63,7 @@
 		return infos.size() + errors.size() + warnings.size();
 	}
 
+	@Override
 	public String toString() {
 		return "infos: "+infos+
 			"errors: "+errors+
diff --git a/tool/src/test/java/org/antlr/test/TestASTConstruction.java b/tool/src/test/java/org/antlr/test/TestASTConstruction.java
index 88df12a..8a652a2 100644
--- a/tool/src/test/java/org/antlr/test/TestASTConstruction.java
+++ b/tool/src/test/java/org/antlr/test/TestASTConstruction.java
@@ -30,6 +30,8 @@
 import org.antlr.tool.Grammar;
 import org.junit.Test;
 
+import static org.junit.Assert.*;
+
 public class TestASTConstruction extends BaseTest {
 
     /** Public default constructor used by TestRig */
@@ -364,7 +366,7 @@
 				"options { backtrack=true; }\n" +
 				"a : ({blort} 'x')* ;\n");  // bug: the synpred had nothing in it
 		String expecting =
-			"(rule synpred1_Expr ARG RET scope (BLOCK (ALT blort 'x' <end-of-alt>) <end-of-block>) <end-of-rule>)";
+			"(rule synpred1_Expr ARG RET scope (BLOCK (ALT 'x' <end-of-alt>) <end-of-block>) <end-of-rule>)";
 		String found = g.getRule("synpred1_Expr").tree.toStringTree();
 		assertEquals(expecting, found);
 	}
diff --git a/tool/src/test/java/org/antlr/test/TestAttributes.java b/tool/src/test/java/org/antlr/test/TestAttributes.java
index 5a6ffb6..acef5f2 100644
--- a/tool/src/test/java/org/antlr/test/TestAttributes.java
+++ b/tool/src/test/java/org/antlr/test/TestAttributes.java
@@ -41,6 +41,8 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import static org.junit.Assert.*;
+
 /** Check the $x, $x.y attributes.  For checking the actual
  *  translation, assume the Java target.  This is still a great test
  *  for the semantics of the $x.y stuff regardless of the target.
@@ -368,7 +370,7 @@
 	 */
 	@Test public void testRefToReturnValueBeforeRefToPredefinedAttr() throws Exception {
 		String action = "$x.foo";
-		String expecting = "(x!=null?x.foo:0)";
+		String expecting = "(x!=null?((t.b_return)x).foo:0)";
 
 		ErrorQueue equeue = new ErrorQueue();
 		ErrorManager.setErrorListener(equeue);
@@ -633,9 +635,9 @@
 
 	@Test public void testRuleLabels() throws Exception {
 		String action = "$r.x; $r.start;\n $r.stop;\n $r.tree; $a.x; $a.stop;";
-		String expecting = "(r!=null?r.x:0); (r!=null?((Token)r.start):null);" + newline +
-			"             (r!=null?((Token)r.stop):null);" + newline +
-			"             (r!=null?((Object)r.tree):null); (r!=null?r.x:0); (r!=null?((Token)r.stop):null);";
+		String expecting = "(r!=null?((t.a_return)r).x:0); (r!=null?(r.start):null);" + newline +
+			"\t\t\t (r!=null?(r.stop):null);" + newline +
+			"\t\t\t (r!=null?((Object)r.getTree()):null); (r!=null?((t.a_return)r).x:0); (r!=null?(r.stop):null);";
 
 		ErrorQueue equeue = new ErrorQueue();
 		ErrorManager.setErrorListener(equeue);
@@ -677,7 +679,7 @@
 
 	@Test public void testRuleLabelsWithSpecialToken() throws Exception {
 		String action = "$r.x; $r.start; $r.stop; $r.tree; $a.x; $a.stop;";
-		String expecting = "(r!=null?r.x:0); (r!=null?((MYTOKEN)r.start):null); (r!=null?((MYTOKEN)r.stop):null); (r!=null?((Object)r.tree):null); (r!=null?r.x:0); (r!=null?((MYTOKEN)r.stop):null);";
+		String expecting = "(r!=null?((t.a_return)r).x:0); (r!=null?((MYTOKEN)r.start):null); (r!=null?((MYTOKEN)r.stop):null); (r!=null?((Object)r.getTree()):null); (r!=null?((t.a_return)r).x:0); (r!=null?((MYTOKEN)r.stop):null);";
 
 		ErrorQueue equeue = new ErrorQueue();
 		ErrorManager.setErrorListener(equeue);
@@ -705,7 +707,7 @@
 
 	@Test public void testForwardRefRuleLabels() throws Exception {
 		String action = "$r.x; $r.start; $r.stop; $r.tree; $a.x; $a.tree;";
-		String expecting = "(r!=null?r.x:0); (r!=null?((Token)r.start):null); (r!=null?((Token)r.stop):null); (r!=null?((Object)r.tree):null); (r!=null?r.x:0); (r!=null?((Object)r.tree):null);";
+		String expecting = "(r!=null?((t.a_return)r).x:0); (r!=null?(r.start):null); (r!=null?(r.stop):null); (r!=null?((Object)r.getTree()):null); (r!=null?((t.a_return)r).x:0); (r!=null?((Object)r.getTree()):null);";
 
 		ErrorQueue equeue = new ErrorQueue();
 		ErrorManager.setErrorListener(equeue);
@@ -921,7 +923,7 @@
 
 	@Test public void testBasicGlobalScope() throws Exception {
 		String action = "$Symbols::names.add($id.text);";
-		String expecting = "((Symbols_scope)Symbols_stack.peek()).names.add((id!=null?id.getText():null));";
+		String expecting = "Symbols_stack.peek().names.add((id!=null?id.getText():null));";
 
 		ErrorQueue equeue = new ErrorQueue();
 		ErrorManager.setErrorListener(equeue);
@@ -975,7 +977,7 @@
 	@Test public void testIndexedGlobalScope() throws Exception {
 		String action = "$Symbols[-1]::names.add($id.text);";
 		String expecting =
-			"((Symbols_scope)Symbols_stack.elementAt(Symbols_stack.size()-1-1)).names.add((id!=null?id.getText():null));";
+			"Symbols_stack.elementAt(Symbols_stack.size()-1-1).names.add((id!=null?id.getText():null));";
 
 		ErrorQueue equeue = new ErrorQueue();
 		ErrorManager.setErrorListener(equeue);
@@ -1003,7 +1005,7 @@
 	@Test public void test0IndexedGlobalScope() throws Exception {
 		String action = "$Symbols[0]::names.add($id.text);";
 		String expecting =
-			"((Symbols_scope)Symbols_stack.elementAt(0)).names.add((id!=null?id.getText():null));";
+			"Symbols_stack.elementAt(0).names.add((id!=null?id.getText():null));";
 
 		ErrorQueue equeue = new ErrorQueue();
 		ErrorManager.setErrorListener(equeue);
@@ -1031,7 +1033,7 @@
 	@Test public void testAbsoluteIndexedGlobalScope() throws Exception {
 		String action = "$Symbols[3]::names.add($id.text);";
 		String expecting =
-			"((Symbols_scope)Symbols_stack.elementAt(3)).names.add((id!=null?id.getText():null));";
+			"Symbols_stack.elementAt(3).names.add((id!=null?id.getText():null));";
 
 		ErrorQueue equeue = new ErrorQueue();
 		ErrorManager.setErrorListener(equeue);
@@ -1058,7 +1060,7 @@
 
 	@Test public void testScopeAndAttributeWithUnderscore() throws Exception {
 		String action = "$foo_bar::a_b;";
-		String expecting = "((foo_bar_scope)foo_bar_stack.peek()).a_b;";
+		String expecting = "foo_bar_stack.peek().a_b;";
 
 		ErrorQueue equeue = new ErrorQueue();
 		ErrorManager.setErrorListener(equeue);
@@ -1084,7 +1086,7 @@
 
 	@Test public void testSharedGlobalScope() throws Exception {
 		String action = "$Symbols::x;";
-		String expecting = "((Symbols_scope)Symbols_stack.peek()).x;";
+		String expecting = "Symbols_stack.peek().x;";
 
 		ErrorQueue equeue = new ErrorQueue();
 		ErrorManager.setErrorListener(equeue);
@@ -1114,7 +1116,7 @@
 
 	@Test public void testGlobalScopeOutsideRule() throws Exception {
 		String action = "public void foo() {$Symbols::names.add('foo');}";
-		String expecting = "public void foo() {((Symbols_scope)Symbols_stack.peek()).names.add('foo');}";
+		String expecting = "public void foo() {Symbols_stack.peek().names.add('foo');}";
 
 		ErrorQueue equeue = new ErrorQueue();
 		ErrorManager.setErrorListener(equeue);
@@ -1141,7 +1143,7 @@
 
 	@Test public void testRuleScopeOutsideRule() throws Exception {
 		String action = "public void foo() {$a::name;}";
-		String expecting = "public void foo() {((a_scope)a_stack.peek()).name;}";
+		String expecting = "public void foo() {a_stack.peek().name;}";
 
 		ErrorQueue equeue = new ErrorQueue();
 		ErrorManager.setErrorListener(equeue);
@@ -1166,7 +1168,7 @@
 
 	@Test public void testBasicRuleScope() throws Exception {
 		String action = "$a::n;";
-		String expecting = "((a_scope)a_stack.peek()).n;";
+		String expecting = "a_stack.peek().n;";
 
 		ErrorQueue equeue = new ErrorQueue();
 		ErrorManager.setErrorListener(equeue);
@@ -1244,7 +1246,7 @@
 
 	@Test public void testDynamicRuleScopeRefInSubrule() throws Exception {
 		String action = "$a::n;";
-		String expecting = "((a_scope)a_stack.peek()).n;";
+		String expecting = "a_stack.peek().n;";
 
 		ErrorQueue equeue = new ErrorQueue();
 		ErrorManager.setErrorListener(equeue);
@@ -1300,7 +1302,7 @@
 
 	@Test public void testRuleScopeFromAnotherRule() throws Exception {
 		String action = "$a::n;"; // must be qualified
-		String expecting = "((a_scope)a_stack.peek()).n;";
+		String expecting = "a_stack.peek().n;";
 
 		ErrorQueue equeue = new ErrorQueue();
 		ErrorManager.setErrorListener(equeue);
@@ -1510,7 +1512,7 @@
 
 	@Test public void testRuleRefWhenRuleHasScope() throws Exception {
 		String action = "$b.start;";
-		String expecting = "(b1!=null?((Token)b1.start):null);";
+		String expecting = "(b1!=null?(b1.start):null);";
 
 		ErrorQueue equeue = new ErrorQueue();
 		ErrorManager.setErrorListener(equeue);
@@ -1537,7 +1539,7 @@
 
 	@Test public void testDynamicScopeRefOkEvenThoughRuleRefExists() throws Exception {
 		String action = "$b::n;";
-		String expecting = "((b_scope)b_stack.peek()).n;";
+		String expecting = "b_stack.peek().n;";
 
 		ErrorQueue equeue = new ErrorQueue();
 		ErrorManager.setErrorListener(equeue);
@@ -1607,7 +1609,7 @@
 
 	@Test public void testRefToStartAttributeForCurrentRule() throws Exception {
 		String action = "$start;";
-		String expecting = "((Token)retval.start);";
+		String expecting = "(retval.start);";
 
 		ErrorQueue equeue = new ErrorQueue();
 		ErrorManager.setErrorListener(equeue);
@@ -1973,7 +1975,7 @@
 
 	@Test public void testImplicitRuleLabel() throws Exception {
 		String action = "$r.start;";
-		String expecting = "(r1!=null?((Token)r1.start):null);";
+		String expecting = "(r1!=null?(r1.start):null);";
 
 		ErrorQueue equeue = new ErrorQueue();
 		ErrorManager.setErrorListener(equeue);
@@ -1997,7 +1999,7 @@
 
 	@Test public void testReuseExistingLabelWithImplicitRuleLabel() throws Exception {
 		String action = "$r.start;";
-		String expecting = "(x!=null?((Token)x.start):null);";
+		String expecting = "(x!=null?(x.start):null);";
 
 		ErrorQueue equeue = new ErrorQueue();
 		ErrorManager.setErrorListener(equeue);
@@ -2021,7 +2023,7 @@
 
 	@Test public void testReuseExistingListLabelWithImplicitRuleLabel() throws Exception {
 		String action = "$r.start;";
-		String expecting = "(x!=null?((Token)x.start):null);";
+		String expecting = "(x!=null?(x.start):null);";
 
 		ErrorQueue equeue = new ErrorQueue();
 		ErrorManager.setErrorListener(equeue);
@@ -2196,7 +2198,7 @@
 
 		Rule r = g.getRule("r");
 		AttributeScope retScope = r.returnScope;
-		List parameters = retScope.getAttributes();
+		List<Attribute> parameters = retScope.getAttributes();
 		assertNotNull("missing return action", parameters);
 		assertEquals(1, parameters.size());
 		String found = parameters.get(0).toString();
@@ -2215,7 +2217,7 @@
 
 		Rule r = g.getRule("r");
 		AttributeScope retScope = r.returnScope;
-		List parameters = retScope.getAttributes();
+		List<Attribute> parameters = retScope.getAttributes();
 		assertNotNull("missing return action", parameters);
 		assertEquals(3, parameters.size());
 		assertEquals("int x=0", parameters.get(0).toString());
@@ -2234,7 +2236,7 @@
 
 		Rule r = g.getRule("r");
 		AttributeScope retScope = r.returnScope;
-		List parameters = retScope.getAttributes();
+		List<Attribute> parameters = retScope.getAttributes();
 		assertNotNull("missing return action", parameters);
 		assertEquals(1, parameters.size());
 		String found = parameters.get(0).toString();
@@ -2684,7 +2686,7 @@
 
 	@Test public void testRuleRefWithDynamicScope() throws Exception {
 		String action = "$field::x = $field.st;";
-		String expecting = "((field_scope)field_stack.peek()).x = retval.st;";
+		String expecting = "field_stack.peek().x = retval.st;";
 
 		ErrorQueue equeue = new ErrorQueue();
 		ErrorManager.setErrorListener(equeue);
@@ -2801,7 +2803,7 @@
 			translator.translate();
 
 		int expectedMsgID = ErrorManager.MSG_WRITE_TO_READONLY_ATTR;
-		ArrayList expectedErrors = new ArrayList(3);
+		ArrayList<Message> expectedErrors = new ArrayList<Message>(3);
 		GrammarSemanticsMessage expectedMessage =
 			new GrammarSemanticsMessage(expectedMsgID, g, null, "start", "");
 		expectedErrors.add(expectedMessage);
@@ -2881,7 +2883,7 @@
 
 	@Test public void testAssignToTreeNodeAttribute() throws Exception {
 		String action = "$tree.scope = localScope;";
-		String expecting = "((Object)retval.tree).scope = localScope;";
+		String expecting = "retval.tree.scope = localScope;";
 		ErrorQueue equeue = new ErrorQueue();
 		ErrorManager.setErrorListener(equeue);
 		Grammar g = new Grammar(
@@ -2934,7 +2936,7 @@
 
 	@Test public void testDoNotTranslateScopeAttributeCompare() throws Exception {
 		String action = "if ($rule::foo == \"foo\" || 1) { System.out.println(\"ouch\"); }";
-		String expecting = "if (((rule_scope)rule_stack.peek()).foo == \"foo\" || 1) { System.out.println(\"ouch\"); }";
+		String expecting = "if (rule_stack.peek().foo == \"foo\" || 1) { System.out.println(\"ouch\"); }";
 		ErrorQueue equeue = new ErrorQueue();
 		ErrorManager.setErrorListener(equeue);
 		Grammar g = new Grammar(
@@ -2980,7 +2982,7 @@
 
 	@Test public void testTreeRuleStopAttributeIsInvalid() throws Exception {
 		String action = "$r.x; $r.start; $r.stop";
-		String expecting = "(r!=null?r.x:0); (r!=null?((CommonTree)r.start):null); $r.stop";
+		String expecting = "(r!=null?((t.a_return)r).x:0); (r!=null?((CommonTree)r.start):null); $r.stop";
 
 		ErrorQueue equeue = new ErrorQueue();
 		ErrorManager.setErrorListener(equeue);
@@ -3041,7 +3043,7 @@
 
 	@Test public void testTypeOfGuardedAttributeRefIsCorrect() throws Exception {
 		String action = "int x = $b::n;";
-		String expecting = "int x = ((b_scope)b_stack.peek()).n;";
+		String expecting = "int x = b_stack.peek().n;";
 
 		ErrorQueue equeue = new ErrorQueue();
 		ErrorManager.setErrorListener(equeue);
@@ -3078,7 +3080,7 @@
 		*/
 		Message foundMsg = null;
 		for (int i = 0; i < equeue.errors.size(); i++) {
-			Message m = (Message)equeue.errors.get(i);
+			Message m = equeue.errors.get(i);
 			if (m.msgID==expectedMessage.msgID ) {
 				foundMsg = m;
 			}
@@ -3093,15 +3095,15 @@
 
 	/** Allow checking for multiple errors in one test */
 	protected void checkErrors(ErrorQueue equeue,
-							   ArrayList expectedMessages)
+							   ArrayList<Message> expectedMessages)
 		throws Exception
 	{
-		ArrayList messageExpected = new ArrayList(equeue.errors.size());
+		ArrayList<Boolean> messageExpected = new ArrayList<Boolean>(equeue.errors.size());
 		for (int i = 0; i < equeue.errors.size(); i++) {
-			Message m = (Message)equeue.errors.get(i);
+			Message m = equeue.errors.get(i);
 			boolean foundMsg = false;
 			for (int j = 0; j < expectedMessages.size(); j++) {
-				Message em = (Message)expectedMessages.get(j);
+				Message em = expectedMessages.get(j);
 				if (m.msgID==em.msgID && m.arg.equals(em.arg) && m.arg2.equals(em.arg2)) {
 					foundMsg = true;
 				}
@@ -3112,7 +3114,7 @@
 				messageExpected.add(i, Boolean.FALSE);
 		}
 		for (int i = 0; i < equeue.errors.size(); i++) {
-			assertTrue("unexpected error:" + equeue.errors.get(i), ((Boolean)messageExpected.get(i)).booleanValue());
+			assertTrue("unexpected error:" + equeue.errors.get(i), messageExpected.get(i));
 		}
 	}
 }
diff --git a/tool/src/test/java/org/antlr/test/TestAutoAST.java b/tool/src/test/java/org/antlr/test/TestAutoAST.java
index b6c7ede..14aeed0 100644
--- a/tool/src/test/java/org/antlr/test/TestAutoAST.java
+++ b/tool/src/test/java/org/antlr/test/TestAutoAST.java
@@ -30,6 +30,8 @@
 import org.junit.Ignore;
 import org.junit.Test;
 
+import static org.junit.Assert.*;
+
 public class TestAutoAST extends BaseTest {
 	protected boolean debug = false;
 
@@ -365,9 +367,7 @@
 		assertEquals("(+ abc)\n", found);
 	}
 
-	@Ignore
-    // TODO: FAILS until I rebuild the antlr.g in v3
-    //
+	@Test
     public void testSetRootWithLabel() throws Exception {
 		
 		String grammar =
diff --git a/tool/src/test/java/org/antlr/test/TestBufferedTreeNodeStream.java b/tool/src/test/java/org/antlr/test/TestBufferedTreeNodeStream.java
index 834a737..58e5b4b 100644
--- a/tool/src/test/java/org/antlr/test/TestBufferedTreeNodeStream.java
+++ b/tool/src/test/java/org/antlr/test/TestBufferedTreeNodeStream.java
@@ -34,13 +34,17 @@
 import org.antlr.runtime.tree.TreeNodeStream;
 import org.junit.Test;
 
+import static org.junit.Assert.*;
+
 public class TestBufferedTreeNodeStream extends TestTreeNodeStream {
     // inherits tests; these methods make it use a new buffer
 
+	@Override
 	public TreeNodeStream newStream(Object t) {
 		return new BufferedTreeNodeStream(t);
 	}
 
+	@Override
     public String toTokenTypeString(TreeNodeStream stream) {
         return ((BufferedTreeNodeStream)stream).toTokenTypeString();
     }
diff --git a/tool/src/test/java/org/antlr/test/TestCharDFAConversion.java b/tool/src/test/java/org/antlr/test/TestCharDFAConversion.java
index 15e1100..c1af910 100644
--- a/tool/src/test/java/org/antlr/test/TestCharDFAConversion.java
+++ b/tool/src/test/java/org/antlr/test/TestCharDFAConversion.java
@@ -35,6 +35,8 @@
 
 import java.util.List;
 
+import static org.junit.Assert.*;
+
 public class TestCharDFAConversion extends BaseTest {
 
 	/** Public default constructor used by TestRig */
@@ -167,7 +169,7 @@
 
 		assertEquals("unexpected number of expected problems",
 				    1, equeue.size());
-		Message msg = (Message)equeue.errors.get(0);
+		Message msg = equeue.errors.get(0);
 		assertTrue("warning must be an unreachable alt",
 				    msg instanceof GrammarUnreachableAltsMessage);
 		GrammarUnreachableAltsMessage u = (GrammarUnreachableAltsMessage)msg;
@@ -347,7 +349,7 @@
 
 		assertEquals("unexpected number of expected problems",
 				    1, equeue.size());
-		Message msg = (Message)equeue.errors.get(0);
+		Message msg = equeue.errors.get(0);
 		assertTrue("warning must be an unreachable alt",
 				   msg instanceof GrammarUnreachableAltsMessage);
 		GrammarUnreachableAltsMessage u = (GrammarUnreachableAltsMessage)msg;
@@ -526,12 +528,12 @@
 		FASerializer serializer = new FASerializer(g);
 		String result = serializer.serialize(dfa.startState);
 		//System.out.print(result);
-		List nonDetAlts = dfa.getUnreachableAlts();
+		List<Integer> nonDetAlts = dfa.getUnreachableAlts();
 		//System.out.println("alts w/o predict state="+nonDetAlts);
 
 		// first make sure nondeterministic alts are as expected
 		if ( expectingUnreachableAlts==null ) {
-			if ( nonDetAlts!=null && nonDetAlts.size()!=0 ) {
+			if ( nonDetAlts!=null && !nonDetAlts.isEmpty() ) {
 				System.err.println("nondeterministic alts (should be empty): "+nonDetAlts);
 			}
 			assertEquals("unreachable alts mismatch", 0, nonDetAlts!=null?nonDetAlts.size():0);
diff --git a/tool/src/test/java/org/antlr/test/TestCommonTokenStream.java b/tool/src/test/java/org/antlr/test/TestCommonTokenStream.java
index 67b1fb8..3a85a1f 100644
--- a/tool/src/test/java/org/antlr/test/TestCommonTokenStream.java
+++ b/tool/src/test/java/org/antlr/test/TestCommonTokenStream.java
@@ -33,6 +33,8 @@
 import org.antlr.tool.Interpreter;
 import org.junit.Test;
 
+import static org.junit.Assert.*;
+
 /** This actually tests new (12/4/09) buffered but on-demand fetching stream */
 public class TestCommonTokenStream extends BaseTest {
     @Test public void testFirstToken() throws Exception {
@@ -191,9 +193,11 @@
                     tokens[6].setChannel(Lexer.HIDDEN);
                     tokens[8].setChannel(Lexer.HIDDEN);
                 }
+			@Override
                 public Token nextToken() {
                     return tokens[i++];
                 }
+			@Override
                 public String getSourceName() { return "test"; }
             };
 
diff --git a/tool/src/test/java/org/antlr/test/TestCompositeGrammars.java b/tool/src/test/java/org/antlr/test/TestCompositeGrammars.java
index cb13bff..cad4add 100644
--- a/tool/src/test/java/org/antlr/test/TestCompositeGrammars.java
+++ b/tool/src/test/java/org/antlr/test/TestCompositeGrammars.java
@@ -33,6 +33,8 @@
 
 import java.io.File;
 
+import static org.junit.Assert.*;
+
 public class TestCompositeGrammars extends BaseTest {
 	protected boolean debug = false;
 
diff --git a/tool/src/test/java/org/antlr/test/TestDFAConversion.java b/tool/src/test/java/org/antlr/test/TestDFAConversion.java
index 387b328..b30bd20 100644
--- a/tool/src/test/java/org/antlr/test/TestDFAConversion.java
+++ b/tool/src/test/java/org/antlr/test/TestDFAConversion.java
@@ -30,6 +30,7 @@
 import org.antlr.Tool;
 import org.antlr.analysis.DFA;
 import org.antlr.analysis.DecisionProbe;
+import org.antlr.analysis.Label;
 import org.antlr.codegen.CodeGenerator;
 import org.antlr.misc.BitSet;
 import org.antlr.tool.*;
@@ -37,6 +38,8 @@
 
 import java.util.*;
 
+import static org.junit.Assert.*;
+
 public class TestDFAConversion extends BaseTest {
 
 	@Test public void testA() throws Exception {
@@ -93,7 +96,7 @@
 			"parser grammar t;\n"+
 			"s : a ;\n" +
 			"a : A a X | A a Y;");
-		List altsWithRecursion = Arrays.asList(new Object[] {1,2});
+		List<Integer> altsWithRecursion = Arrays.asList(1, 2);
 		assertNonLLStar(g, altsWithRecursion);
 	}
 
@@ -102,7 +105,7 @@
 			"parser grammar t;\n"+
 			"s : a Y | A A A A A X ;\n" + // force recursion past m=4
 			"a : A a | Q;");
-		List expectedTargetRules = Arrays.asList(new Object[] {"a"});
+		List<String> expectedTargetRules = Arrays.asList("a");
 		int expectedAlt = 1;
 		assertRecursionOverflow(g, expectedTargetRules, expectedAlt);
 	}
@@ -112,7 +115,7 @@
 			"parser grammar t;\n"+
 			"s : a Y | A+ X ;\n" + // force recursion past m=4
 			"a : A a | Q;");
-		List expectedTargetRules = Arrays.asList(new Object[] {"a"});
+		List<String> expectedTargetRules = Arrays.asList("a");
 		int expectedAlt = 1;
 		assertRecursionOverflow(g, expectedTargetRules, expectedAlt);
 	}
@@ -184,7 +187,7 @@
 			"y   : L y R\n" +
 			"    | B\n" +
 			"    ;");
-		List altsWithRecursion = Arrays.asList(new Object[] {1,2});
+		List<Integer> altsWithRecursion = Arrays.asList(1, 2);
 		assertNonLLStar(g, altsWithRecursion);
 	}
 
@@ -550,19 +553,19 @@
 		ErrorManager.setErrorListener(equeue);
 
 		Set<Rule> leftRecursive = g.getLeftRecursiveRules();
-		Set expectedRules =
-			new HashSet() {{add("a"); add("b");}};
+		Set<String> expectedRules =
+			new HashSet<String>() {{add("a"); add("b");}};
 		assertEquals(expectedRules, ruleNames(leftRecursive));
 
 		assertEquals(1, equeue.errors.size());
-		Message msg = (Message)equeue.errors.get(0);
+		Message msg = equeue.errors.get(0);
 		assertTrue("expecting left recursion cycles; found "+msg.getClass().getName(),
 				    msg instanceof LeftRecursionCyclesMessage);
 		LeftRecursionCyclesMessage cyclesMsg = (LeftRecursionCyclesMessage)msg;
 
 		// cycle of [a, b]
-		Collection result = cyclesMsg.cycles;
-		Set expecting = new HashSet() {{add("a"); add("b");}};
+		Collection<? extends Collection<? extends Rule>> result = cyclesMsg.cycles;
+		Set<String> expecting = new HashSet<String>() {{add("a"); add("b");}};
 		assertEquals(expecting, ruleNames2(result));
 	}
 
@@ -578,20 +581,20 @@
 		ErrorQueue equeue = new ErrorQueue();
 		ErrorManager.setErrorListener(equeue);
 
-		Set leftRecursive = g.getLeftRecursiveRules();
-		Set expectedRules =
-			new HashSet() {{add("a"); add("b");}};
+		Set<Rule> leftRecursive = g.getLeftRecursiveRules();
+		Set<String> expectedRules =
+			new HashSet<String>() {{add("a"); add("b");}};
 		assertEquals(expectedRules, ruleNames(leftRecursive));
 
 		assertEquals(1, equeue.errors.size());
-		Message msg = (Message)equeue.errors.get(0);
+		Message msg = equeue.errors.get(0);
 		assertTrue("expecting left recursion cycles; found "+msg.getClass().getName(),
 				    msg instanceof LeftRecursionCyclesMessage);
 		LeftRecursionCyclesMessage cyclesMsg = (LeftRecursionCyclesMessage)msg;
 
 		// cycle of [a, b]
-		Collection result = cyclesMsg.cycles;
-		Set expecting = new HashSet() {{add("a"); add("b");}};
+		Collection<? extends Collection<? extends Rule>> result = cyclesMsg.cycles;
+		Set<String> expecting = new HashSet<String>() {{add("a"); add("b");}};
 		assertEquals(expecting, ruleNames2(result));
 	}
 
@@ -609,20 +612,20 @@
 		ErrorQueue equeue = new ErrorQueue();
 		ErrorManager.setErrorListener(equeue);
 
-		Set leftRecursive = g.getLeftRecursiveRules();
-		Set expectedRules =
-			new HashSet() {{add("a"); add("b"); add("e"); add("d");}};
+		Set<Rule> leftRecursive = g.getLeftRecursiveRules();
+		Set<String> expectedRules =
+			new HashSet<String>() {{add("a"); add("b"); add("e"); add("d");}};
 		assertEquals(expectedRules, ruleNames(leftRecursive));
 
 		assertEquals(1, equeue.errors.size());
-		Message msg = (Message)equeue.errors.get(0);
+		Message msg = equeue.errors.get(0);
 		assertTrue("expecting left recursion cycles; found "+msg.getClass().getName(),
 				    msg instanceof LeftRecursionCyclesMessage);
 		LeftRecursionCyclesMessage cyclesMsg = (LeftRecursionCyclesMessage)msg;
 
 		// cycle of [a, b]
-		Collection result = cyclesMsg.cycles;
-		Set expecting = new HashSet() {{add("a"); add("b"); add("d"); add("e");}};
+		Collection<? extends Collection<? extends Rule>> result = cyclesMsg.cycles;
+		Set<String> expecting = new HashSet<String>() {{add("a"); add("b"); add("d"); add("e");}};
 		assertEquals(expecting, ruleNames2(result));
 	}
 
@@ -758,7 +761,7 @@
 		g.setCodeGenerator(generator);
 		generator.genRecognizer();
 
-		Message msg = (Message)equeue.warnings.get(0);
+		Message msg = equeue.warnings.get(0);
 		assertTrue("expecting no start rules; found "+msg.getClass().getName(),
 				   msg instanceof GrammarSemanticsMessage);
 	}
@@ -787,8 +790,8 @@
 			"parser grammar t;\n"+
 			"s : a ;\n" +
 			"a : a A | B;");
-		Set leftRecursive = g.getLeftRecursiveRules();
-		Set expectedRules = new HashSet() {{add("a");}};
+		Set<Rule> leftRecursive = g.getLeftRecursiveRules();
+		Set<String> expectedRules = new HashSet<String>() {{add("a");}};
 		assertEquals(expectedRules, ruleNames(leftRecursive));
 	}
 
@@ -799,8 +802,8 @@
 			"a : b | A ;\n" +
 			"b : c ;\n" +
 			"c : a | C ;\n");
-		Set leftRecursive = g.getLeftRecursiveRules();
-		Set expectedRules = new HashSet() {{add("a"); add("b"); add("c");}};
+		Set<Rule> leftRecursive = g.getLeftRecursiveRules();
+		Set<String> expectedRules = new HashSet<String>() {{add("a"); add("b"); add("c");}};
 		assertEquals(expectedRules, ruleNames(leftRecursive));
 	}
 
@@ -813,9 +816,9 @@
 				"c : a | C ;\n" +
 				"x : y | X ;\n" +
 				"y : x ;\n");
-		Set leftRecursive = g.getLeftRecursiveRules();
-		Set expectedRules =
-			new HashSet() {{add("a"); add("b"); add("c"); add("x"); add("y");}};
+		Set<Rule> leftRecursive = g.getLeftRecursiveRules();
+		Set<String> expectedRules =
+			new HashSet<String>() {{add("a"); add("b"); add("c"); add("x"); add("y");}};
 		assertEquals(expectedRules, ruleNames(leftRecursive));
 	}
 
@@ -826,8 +829,8 @@
 			"a : (A|)+ B;\n");
 		// before I added a visitedStates thing, it was possible to loop
 		// forever inside of a rule if there was an epsilon loop.
-		Set leftRecursive = g.getLeftRecursiveRules();
-		Set expectedRules = new HashSet();
+		Set<Rule> leftRecursive = g.getLeftRecursiveRules();
+		Set<Rule> expectedRules = new HashSet<Rule>();
 		assertEquals(expectedRules, leftRecursive);
 	}
 
@@ -1352,7 +1355,7 @@
 			"b : A\n" +
 			"  | A b\n" +
 			"  ;\n");
-		List altsWithRecursion = Arrays.asList(new Object[] {1,2});
+		List<Integer> altsWithRecursion = Arrays.asList(1, 2);
 		assertNonLLStar(g, altsWithRecursion);
 	}
 
@@ -1492,7 +1495,7 @@
 			"y   : L y R\n" +
 			"    | B\n" +
 			"    ;");
-		List altsWithRecursion = Arrays.asList(new Object[] {1,2});
+		List<Integer> altsWithRecursion = Arrays.asList(1, 2);
 		assertNonLLStar(g, altsWithRecursion);
 	}
 
@@ -1501,7 +1504,7 @@
 			"parser grammar t;\n"+
 			"s : (options {greedy=true;} : a Y | A A A A A X) ;\n" + // force recursion past m=4
 			"a : A a | Q;");
-		List expectedTargetRules = Arrays.asList(new Object[] {"a"});
+		List<String> expectedTargetRules = Arrays.asList("a");
 		int expectedAlt = 1;
 		assertRecursionOverflow(g, expectedTargetRules, expectedAlt);
 	}
@@ -1530,7 +1533,7 @@
 		checkDecision(g, 1, expecting, null, null, null, null, 0);
 	}
 
-	protected void assertNonLLStar(Grammar g, List expectedBadAlts) {
+	protected void assertNonLLStar(Grammar g, List<Integer> expectedBadAlts) {
 		DecisionProbe.verbose=true; // make sure we get all error info
 		ErrorQueue equeue = new ErrorQueue();
 		ErrorManager.setErrorListener(equeue);
@@ -1542,14 +1545,13 @@
 		}
 		NonRegularDecisionMessage msg = getNonRegularDecisionMessage(equeue.errors);
 		assertTrue("expected fatal non-LL(*) msg", msg!=null);
-		List<Integer> alts = new ArrayList();
-		alts.addAll(msg.altsWithRecursion);
+		List<Integer> alts = new ArrayList<Integer>(msg.altsWithRecursion);
 		Collections.sort(alts);
 		assertEquals(expectedBadAlts,alts);
 	}
 
 	protected void assertRecursionOverflow(Grammar g,
-										   List expectedTargetRules,
+										   List<String> expectedTargetRules,
 										   int expectedAlt) {
 		DecisionProbe.verbose=true; // make sure we get all error info
 		ErrorQueue equeue = new ErrorQueue();
@@ -1642,7 +1644,7 @@
 		FASerializer serializer = new FASerializer(g);
 		String result = serializer.serialize(dfa.startState);
 
-		List unreachableAlts = dfa.getUnreachableAlts();
+		List<Integer> unreachableAlts = dfa.getUnreachableAlts();
 
 		// make sure unreachable alts are as expected
 		if ( expectingUnreachableAlts!=null ) {
@@ -1660,12 +1662,12 @@
 		// check conflicting input
 		if ( expectingAmbigInput!=null ) {
 			// first, find nondet message
-			Message msg = (Message)equeue.warnings.get(0);
+			Message msg = equeue.warnings.get(0);
 			assertTrue("expecting nondeterminism; found "+msg.getClass().getName(),
 					    msg instanceof GrammarNonDeterminismMessage);
 			GrammarNonDeterminismMessage nondetMsg =
 				getNonDeterminismMessage(equeue.warnings);
-			List labels =
+			List<Label> labels =
 				nondetMsg.probe.getSampleNonDeterministicInputSequence(nondetMsg.problemState);
 			String input = nondetMsg.probe.getInputSequenceDisplay(labels);
 			assertEquals(expectingAmbigInput, input);
@@ -1676,7 +1678,7 @@
 			RecursionOverflowMessage recMsg = null;
 			GrammarNonDeterminismMessage nondetMsg =
 				getNonDeterminismMessage(equeue.warnings);
-			List nonDetAlts = null;
+			List<Integer> nonDetAlts = null;
 			if ( nondetMsg!=null ) {
 				nonDetAlts =
 					nondetMsg.probe.getNonDeterministicAltsForState(nondetMsg.problemState);
@@ -1707,9 +1709,9 @@
 		assertEquals(expecting, result);
 	}
 
-	protected GrammarNonDeterminismMessage getNonDeterminismMessage(List warnings) {
+	protected GrammarNonDeterminismMessage getNonDeterminismMessage(List<Message> warnings) {
 		for (int i = 0; i < warnings.size(); i++) {
-			Message m = (Message) warnings.get(i);
+			Message m = warnings.get(i);
 			if ( m instanceof GrammarNonDeterminismMessage ) {
 				return (GrammarNonDeterminismMessage)m;
 			}
@@ -1717,9 +1719,9 @@
 		return null;
 	}
 
-	protected NonRegularDecisionMessage getNonRegularDecisionMessage(List errors) {
+	protected NonRegularDecisionMessage getNonRegularDecisionMessage(List<Message> errors) {
 		for (int i = 0; i < errors.size(); i++) {
-			Message m = (Message) errors.get(i);
+			Message m = errors.get(i);
 			if ( m instanceof NonRegularDecisionMessage ) {
 				return (NonRegularDecisionMessage)m;
 			}
@@ -1727,9 +1729,9 @@
 		return null;
 	}
 
-	protected RecursionOverflowMessage getRecursionOverflowMessage(List warnings) {
+	protected RecursionOverflowMessage getRecursionOverflowMessage(List<Message> warnings) {
 		for (int i = 0; i < warnings.size(); i++) {
-			Message m = (Message) warnings.get(i);
+			Message m = warnings.get(i);
 			if ( m instanceof RecursionOverflowMessage ) {
 				return (RecursionOverflowMessage)m;
 			}
@@ -1737,9 +1739,9 @@
 		return null;
 	}
 
-	protected LeftRecursionCyclesMessage getLeftRecursionCyclesMessage(List warnings) {
+	protected LeftRecursionCyclesMessage getLeftRecursionCyclesMessage(List<Message> warnings) {
 		for (int i = 0; i < warnings.size(); i++) {
-			Message m = (Message) warnings.get(i);
+			Message m = warnings.get(i);
 			if ( m instanceof LeftRecursionCyclesMessage ) {
 				return (LeftRecursionCyclesMessage)m;
 			}
@@ -1747,9 +1749,9 @@
 		return null;
 	}
 
-	protected GrammarDanglingStateMessage getDanglingStateMessage(List warnings) {
+	protected GrammarDanglingStateMessage getDanglingStateMessage(List<Message> warnings) {
 		for (int i = 0; i < warnings.size(); i++) {
-			Message m = (Message) warnings.get(i);
+			Message m = warnings.get(i);
 			if ( m instanceof GrammarDanglingStateMessage ) {
 				return (GrammarDanglingStateMessage)m;
 			}
@@ -1758,7 +1760,7 @@
 	}
 
 	protected String str(int[] elements) {
-		StringBuffer buf = new StringBuffer();
+		StringBuilder buf = new StringBuilder();
 		for (int i = 0; i < elements.length; i++) {
 			if ( i>0 ) {
 				buf.append(", ");
@@ -1769,7 +1771,7 @@
 		return buf.toString();
 	}
 
-	protected Set<String> ruleNames(Set<Rule> rules) {
+	protected Set<String> ruleNames(Collection<? extends Rule> rules) {
 		Set<String> x = new HashSet<String>();
 		for (Rule r : rules) {
 			x.add(r.name);
@@ -1777,9 +1779,9 @@
 		return x;
 	}
 
-	protected Set<String> ruleNames2(Collection<HashSet> rules) {
+	protected Set<String> ruleNames2(Collection<? extends Collection<? extends Rule>> rules) {
 		Set<String> x = new HashSet<String>();
-		for (HashSet s : rules) {
+		for (Collection<? extends Rule> s : rules) {
 			x.addAll(ruleNames(s));
 		}
 		return x;
diff --git a/tool/src/test/java/org/antlr/test/TestDFAMatching.java b/tool/src/test/java/org/antlr/test/TestDFAMatching.java
index a4fb2fb..6b8dc7a 100644
--- a/tool/src/test/java/org/antlr/test/TestDFAMatching.java
+++ b/tool/src/test/java/org/antlr/test/TestDFAMatching.java
@@ -33,6 +33,8 @@
 import org.antlr.tool.Grammar;
 import org.junit.Test;
 
+import static org.junit.Assert.*;
+
 public class TestDFAMatching extends BaseTest {
 
     /** Public default constructor used by TestRig */
diff --git a/tool/src/test/java/org/antlr/test/TestFastQueue.java b/tool/src/test/java/org/antlr/test/TestFastQueue.java
index 9a3c717..fce3019 100644
--- a/tool/src/test/java/org/antlr/test/TestFastQueue.java
+++ b/tool/src/test/java/org/antlr/test/TestFastQueue.java
@@ -32,7 +32,7 @@
 
 import java.util.NoSuchElementException;
 
-import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.*;
 
 public class TestFastQueue {
     @Test public void testQueueNoRemove() throws Exception {
@@ -54,7 +54,7 @@
         q.add("c");
         q.add("d");
         q.add("e");
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         while ( q.size()>0 ) {
             String o = q.remove();
             buf.append(o);
@@ -67,7 +67,7 @@
     }
 
     @Test public void testQueueThenRemoveOneByOne() throws Exception {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         FastQueue<String> q = new FastQueue<String>();
         q.add("a");
         buf.append(q.remove());
diff --git a/tool/src/test/java/org/antlr/test/TestHeteroAST.java b/tool/src/test/java/org/antlr/test/TestHeteroAST.java
index 4078421..a9f694f 100644
--- a/tool/src/test/java/org/antlr/test/TestHeteroAST.java
+++ b/tool/src/test/java/org/antlr/test/TestHeteroAST.java
@@ -29,6 +29,8 @@
 
 import org.junit.Test;
 
+import static org.junit.Assert.*;
+
 /** Test hetero trees in parsers and tree parsers */
 public class TestHeteroAST extends BaseTest {
 	protected boolean debug = false;
diff --git a/tool/src/test/java/org/antlr/test/TestInterpretedLexing.java b/tool/src/test/java/org/antlr/test/TestInterpretedLexing.java
index f0de1ce..6a3ab1e 100644
--- a/tool/src/test/java/org/antlr/test/TestInterpretedLexing.java
+++ b/tool/src/test/java/org/antlr/test/TestInterpretedLexing.java
@@ -35,6 +35,8 @@
 import org.antlr.tool.Interpreter;
 import org.junit.Test;
 
+import static org.junit.Assert.*;
+
 public class TestInterpretedLexing extends BaseTest {
 
 	/*
diff --git a/tool/src/test/java/org/antlr/test/TestInterpretedParsing.java b/tool/src/test/java/org/antlr/test/TestInterpretedParsing.java
index a575139..1e2e910 100644
--- a/tool/src/test/java/org/antlr/test/TestInterpretedParsing.java
+++ b/tool/src/test/java/org/antlr/test/TestInterpretedParsing.java
@@ -34,6 +34,8 @@
 import org.antlr.tool.Interpreter;
 import org.junit.Test;
 
+import static org.junit.Assert.*;
+
 public class TestInterpretedParsing extends BaseTest {
     /** Public default constructor used by TestRig */
     public TestInterpretedParsing() {
diff --git a/tool/src/test/java/org/antlr/test/TestIntervalSet.java b/tool/src/test/java/org/antlr/test/TestIntervalSet.java
index 9acc37f..0e92a52 100644
--- a/tool/src/test/java/org/antlr/test/TestIntervalSet.java
+++ b/tool/src/test/java/org/antlr/test/TestIntervalSet.java
@@ -31,9 +31,7 @@
 import org.antlr.misc.IntervalSet;
 import org.junit.Test;
 
-import java.util.ArrayList;
-import java.util.List;
-
+import static org.junit.Assert.*;
 
 public class TestIntervalSet extends BaseTest {
 
@@ -218,13 +216,13 @@
     @Test public void testSimpleEquals() throws Exception {
         IntervalSet s = IntervalSet.of(10,20);
         IntervalSet s2 = IntervalSet.of(10,20);
-        Boolean expecting = new Boolean(true);
-        Boolean result = new Boolean(s.equals(s2));
+        Boolean expecting = true;
+        Boolean result = s.equals(s2);
         assertEquals(result, expecting);
 
         IntervalSet s3 = IntervalSet.of(15,55);
-        expecting = new Boolean(false);
-        result = new Boolean(s.equals(s3));
+        expecting = false;
+        result = s.equals(s3);
         assertEquals(result, expecting);
     }
 
@@ -235,14 +233,14 @@
         IntervalSet s2 = IntervalSet.of(10,20);
         s2.add(2);
         s2.add(499,501);
-        Boolean expecting = new Boolean(true);
-        Boolean result = new Boolean(s.equals(s2));
+        Boolean expecting = true;
+        Boolean result = s.equals(s2);
         assertEquals(result, expecting);
 
         IntervalSet s3 = IntervalSet.of(10,20);
         s3.add(2);
-        expecting = new Boolean(false);
-        result = new Boolean(s.equals(s3));
+        expecting = false;
+        result = s.equals(s3);
         assertEquals(result, expecting);
     }
 
@@ -344,6 +342,23 @@
         assertEquals(result, expecting);
     }
 
+	/**
+	 * This case is responsible for antlr/antlr4#153.
+	 * https://github.com/antlr/antlr4/issues/153
+	 * <p>
+	 * Resolution back-ported from V4.</p>
+	 */
+	@Test public void testMergeWhereAdditionMergesThreeExistingIntervals() throws Exception {
+		IntervalSet s = new IntervalSet();
+		s.add(0);
+		s.add(3);
+		s.add(5);
+		s.add(0, 7);
+		String expecting = "0..7";
+		String result = s.toString();
+		assertEquals(expecting, result);
+	}
+
 	@Test public void testMergeWithDoubleOverlap() throws Exception {
 		IntervalSet s = IntervalSet.of(1,10);
 		s.add(20,30);
@@ -367,13 +382,12 @@
 		s.add(50,55);
 		s.add(5,5);
 		String expecting = "[5, 20, 21, 22, 23, 24, 25, 50, 51, 52, 53, 54, 55]";
-		List foo = new ArrayList();
 		String result = String.valueOf(s.toList());
 		assertEquals(result, expecting);
 	}
 
 	/** The following was broken:
-	    {'\u0000'..'s', 'u'..'\uFFFE'} & {'\u0000'..'q', 's'..'\uFFFE'}=
+	    {'\u0000'..'s', 'u'..'\uFFFE'} &amp; {'\u0000'..'q', 's'..'\uFFFE'}=
 	    {'\u0000'..'q', 's'}!!!! broken...
 	 	'q' is 113 ascii
 	 	'u' is 117
diff --git a/tool/src/test/java/org/antlr/test/TestJavaCodeGeneration.java b/tool/src/test/java/org/antlr/test/TestJavaCodeGeneration.java
index f18a6d0..5a189cd 100644
--- a/tool/src/test/java/org/antlr/test/TestJavaCodeGeneration.java
+++ b/tool/src/test/java/org/antlr/test/TestJavaCodeGeneration.java
@@ -29,6 +29,8 @@
 
 import org.junit.Test;
 
+import static org.junit.Assert.*;
+
 /** General code generation testing; compilation and/or execution.
  *  These tests are more about avoiding duplicate var definitions
  *  etc... than testing a particular ANTLR feature.
@@ -137,4 +139,23 @@
 		boolean expecting = true; // should be ok
 		assertEquals(expecting, found);
 	}
+
+	/**
+	 * This is a regression test for antlr/antlr3#20: StackOverflow error when
+	 * compiling grammar with backtracking.
+	 * https://github.com/antlr/antlr3/issues/20
+	 */
+	@Test
+	public void testSemanticPredicateAnalysisStackOverflow() throws Exception {
+		String grammar =
+			"grammar T;\n"
+			+ "\n"
+			+ "options {\n"
+			+ "  backtrack=true;\n"
+			+ "}\n"
+			+ "\n"
+			+ "main : ('x'*)*;\n";
+		boolean success = rawGenerateAndBuildRecognizer("T.g", grammar, "TParser", "TLexer", false);
+		assertTrue(success);
+	}
 }
diff --git a/tool/src/test/java/org/antlr/test/TestLeftRecursion.java b/tool/src/test/java/org/antlr/test/TestLeftRecursion.java
index a01b66a..bf2f798 100644
--- a/tool/src/test/java/org/antlr/test/TestLeftRecursion.java
+++ b/tool/src/test/java/org/antlr/test/TestLeftRecursion.java
@@ -1,8 +1,12 @@
 package org.antlr.test;
 
+import org.junit.Ignore;
 import org.junit.Test;
 
+import static org.junit.Assert.*;
+
 /** */
+@Ignore
 public class TestLeftRecursion extends BaseTest {
 	protected boolean debug = false;
 
diff --git a/tool/src/test/java/org/antlr/test/TestLexer.java b/tool/src/test/java/org/antlr/test/TestLexer.java
index 0b2651f..2e3265d 100644
--- a/tool/src/test/java/org/antlr/test/TestLexer.java
+++ b/tool/src/test/java/org/antlr/test/TestLexer.java
@@ -33,6 +33,8 @@
 import org.antlr.tool.Grammar;
 import org.junit.Test;
 
+import static org.junit.Assert.*;
+
 public class TestLexer extends BaseTest {
 	protected boolean debug = false;
 
diff --git a/tool/src/test/java/org/antlr/test/TestMessages.java b/tool/src/test/java/org/antlr/test/TestMessages.java
index e135f54..bede62d 100644
--- a/tool/src/test/java/org/antlr/test/TestMessages.java
+++ b/tool/src/test/java/org/antlr/test/TestMessages.java
@@ -37,6 +37,8 @@
 import org.antlr.tool.GrammarSemanticsMessage;
 import org.junit.Test;
 
+import static org.junit.Assert.*;
+
 public class TestMessages extends BaseTest {
 
 	/** Public default constructor used by TestRig */
diff --git a/tool/src/test/java/org/antlr/test/TestNFAConstruction.java b/tool/src/test/java/org/antlr/test/TestNFAConstruction.java
index 4ff774e..05909f5 100644
--- a/tool/src/test/java/org/antlr/test/TestNFAConstruction.java
+++ b/tool/src/test/java/org/antlr/test/TestNFAConstruction.java
@@ -32,6 +32,8 @@
 import org.antlr.tool.Grammar;
 import org.junit.Test;
 
+import static org.junit.Assert.*;
+
 public class TestNFAConstruction extends BaseTest {
 
 	/** Public default constructor used by TestRig */
diff --git a/tool/src/test/java/org/antlr/test/TestRewriteAST.java b/tool/src/test/java/org/antlr/test/TestRewriteAST.java
index f50c36d..7cd8341 100644
--- a/tool/src/test/java/org/antlr/test/TestRewriteAST.java
+++ b/tool/src/test/java/org/antlr/test/TestRewriteAST.java
@@ -35,6 +35,8 @@
 import org.junit.Ignore;
 import org.junit.Test;
 
+import static org.junit.Assert.*;
+
 public class TestRewriteAST extends BaseTest {
 	protected boolean debug = false;
 
@@ -1018,10 +1020,7 @@
 		assertEquals("2\n", found);
 	}
 
-	@Ignore 
-    // TODO: FAILS. The should probably generate a warning from antlr
-    // See http://www.antlr.org:8888/browse/ANTLR-162
-    //
+	@Test
     public void testSetWithLabel() throws Exception {
 		
 		String grammar =
@@ -1456,4 +1455,18 @@
 		assertEquals("<unexpected: [@0,0:0='*',<6>,1:0], resync=*>\n", found);
 	}
 
+	@Test public void testRewriteEmptyRule() throws Exception {
+		String grammar =
+			"grammar T;\n" +
+			"options {output=AST;}\n" +
+			"tokens {IMAGINARY;}\n" +
+			"a : empty EOF! ;\n" +
+			"empty : -> IMAGINARY;\n" +
+			"WS : ' ';\n";
+		String result = execParser("T.g", grammar, "TParser", "TLexer",
+				   "a", "", debug);
+		assertEquals("IMAGINARY\n", result);
+		assertNull(stderrDuringParse);
+	}
+
 }
diff --git a/tool/src/test/java/org/antlr/test/TestRewriteTemplates.java b/tool/src/test/java/org/antlr/test/TestRewriteTemplates.java
index 4dc89f2..af0e1de 100644
--- a/tool/src/test/java/org/antlr/test/TestRewriteTemplates.java
+++ b/tool/src/test/java/org/antlr/test/TestRewriteTemplates.java
@@ -32,6 +32,8 @@
 import org.antlr.tool.*;
 import org.junit.Test;
 
+import static org.junit.Assert.*;
+
 public class TestRewriteTemplates extends BaseTest {
 	protected boolean debug = false;
 
diff --git a/tool/src/test/java/org/antlr/test/TestSemanticPredicateEvaluation.java b/tool/src/test/java/org/antlr/test/TestSemanticPredicateEvaluation.java
index 72f8d02..6da7f31 100644
--- a/tool/src/test/java/org/antlr/test/TestSemanticPredicateEvaluation.java
+++ b/tool/src/test/java/org/antlr/test/TestSemanticPredicateEvaluation.java
@@ -29,6 +29,8 @@
 
 import org.junit.Test;
 
+import static org.junit.Assert.*;
+
 public class TestSemanticPredicateEvaluation extends BaseTest {
 	@Test public void testSimpleCyclicDFAWithPredicate() throws Exception {
 		String grammar =
diff --git a/tool/src/test/java/org/antlr/test/TestSemanticPredicates.java b/tool/src/test/java/org/antlr/test/TestSemanticPredicates.java
index 7b2d77b..0ad540c 100644
--- a/tool/src/test/java/org/antlr/test/TestSemanticPredicates.java
+++ b/tool/src/test/java/org/antlr/test/TestSemanticPredicates.java
@@ -29,6 +29,7 @@
 
 import org.antlr.analysis.DFA;
 import org.antlr.analysis.DecisionProbe;
+import org.antlr.analysis.Label;
 import org.antlr.codegen.CodeGenerator;
 import org.antlr.misc.BitSet;
 import org.antlr.runtime.Token;
@@ -39,6 +40,8 @@
 import java.util.Map;
 import java.util.Set;
 
+import static org.junit.Assert.*;
+
 public class TestSemanticPredicates extends BaseTest {
 
 	/** Public default constructor used by TestRig */
@@ -119,7 +122,7 @@
 			"a : {p1}? {p1a}? A | {p2}? A ;");
 		String expecting =
 			".s0-A->.s1\n" +
-			".s1-{(p1&&p1a)}?->:s2=>1\n" +
+			".s1-{(p1a&&p1)}?->:s2=>1\n" +
 			".s1-{p2}?->:s3=>2\n";
 		checkDecision(g, 1, expecting, null, null, null, null, null, 0, false);
 	}
@@ -268,7 +271,7 @@
 		*/
 
 		assertEquals("unexpected number of expected problems", 1, equeue.size());
-		Message msg = (Message)equeue.errors.get(0);
+		Message msg = equeue.errors.get(0);
 		assertTrue("warning must be a left recursion msg",
 				    msg instanceof LeftRecursionCyclesMessage);
 	}
@@ -530,7 +533,7 @@
 			"  ;\n");
 		String expecting =
 			".s0-B->.s1\n" +
-			".s0-C&&{(q&&r)}?->:s3=>2\n" +
+			".s0-C&&{(r&&q)}?->:s3=>2\n" +
 			".s1-{p}?->:s2=>1\n" +
 			".s1-{q}?->:s3=>2\n";
 		checkDecision(g, 1, expecting, null, null, null, null, null, 0, false);
@@ -547,8 +550,8 @@
 			"  ;\n");
 		String expecting =
 			".s0-B->.s1\n" +
-			".s0-C&&{(q&&r)}?->:s3=>2\n" +
-			".s1-{(q&&s)}?->:s3=>2\n" +
+			".s0-C&&{(r&&q)}?->:s3=>2\n" +
+			".s1-{(s&&q)}?->:s3=>2\n" +
 			".s1-{p}?->:s2=>1\n";
 		checkDecision(g, 1, expecting, null, null, null, null, null, 0, false);
 	}
@@ -633,7 +636,7 @@
 	 *  "pinching" together into a single NFA state.
 	 *
 	 *  This test also demonstrates that just because B D could predict
-	 *  alt 1 in rule 'a', it is unnecessary to continue NFA->DFA
+	 *  alt 1 in rule 'a', it is unnecessary to continue NFA&rarr;DFA
 	 *  conversion to include an edge for D.  Alt 1 is the only possible
 	 *  prediction because we resolve the ambiguity by choosing alt 1.
 	 */
@@ -731,7 +734,7 @@
 			"  ;\n");
 		String expecting =
 			".s0-X->.s1\n" +
-            ".s1-{((a&&c)||(b&&c))}?->:s2=>1\n" +
+            ".s1-{((b||a)&&c)}?->:s2=>1\n" +
             ".s1-{c}?->:s3=>2\n";
 		int[] unreachableAlts = null;
 		int[] nonDetAlts = null;
@@ -816,7 +819,7 @@
 		FASerializer serializer = new FASerializer(g);
 		String result = serializer.serialize(dfa.startState);
 		//System.out.print(result);
-		List unreachableAlts = dfa.getUnreachableAlts();
+		List<Integer> unreachableAlts = dfa.getUnreachableAlts();
 
 		// make sure unreachable alts are as expected
 		if ( expectingUnreachableAlts!=null ) {
@@ -840,7 +843,7 @@
 			msg instanceof GrammarNonDeterminismMessage);
 			GrammarNonDeterminismMessage nondetMsg =
 				getNonDeterminismMessage(equeue.warnings);
-			List labels =
+			List<Label> labels =
 				nondetMsg.probe.getSampleNonDeterministicInputSequence(nondetMsg.problemState);
 			String input = nondetMsg.probe.getInputSequenceDisplay(labels);
 			assertEquals(expectingAmbigInput, input);
@@ -852,7 +855,7 @@
 				getNonDeterminismMessage(equeue.warnings);
 			assertNotNull("found no nondet alts; expecting: "+
 										str(expectingNonDetAlts), nondetMsg);
-			List nonDetAlts =
+			List<Integer> nonDetAlts =
 				nondetMsg.probe.getNonDeterministicAltsForState(nondetMsg.problemState);
 			// compare nonDetAlts with expectingNonDetAlts
 			BitSet s = new BitSet();
@@ -876,7 +879,7 @@
 			assertNotNull("found no GrammarInsufficientPredicatesMessage alts; expecting: "+
 										str(expectingNonDetAlts), insuffPredMsg);
 			Map<Integer, Set<Token>> locations = insuffPredMsg.altToLocations;
-			Set actualAlts = locations.keySet();
+			Set<Integer> actualAlts = locations.keySet();
 			BitSet s = new BitSet();
 			s.addAll(expectingInsufficientPredAlts);
 			BitSet s2 = new BitSet();
@@ -898,9 +901,9 @@
 		assertEquals(expecting, result);
 	}
 
-	protected GrammarNonDeterminismMessage getNonDeterminismMessage(List warnings) {
+	protected GrammarNonDeterminismMessage getNonDeterminismMessage(List<? extends Message> warnings) {
 		for (int i = 0; i < warnings.size(); i++) {
-			Message m = (Message) warnings.get(i);
+			Message m = warnings.get(i);
 			if ( m instanceof GrammarNonDeterminismMessage ) {
 				return (GrammarNonDeterminismMessage)m;
 			}
@@ -908,9 +911,9 @@
 		return null;
 	}
 
-	protected GrammarInsufficientPredicatesMessage getGrammarInsufficientPredicatesMessage(List warnings) {
+	protected GrammarInsufficientPredicatesMessage getGrammarInsufficientPredicatesMessage(List<? extends Message> warnings) {
 		for (int i = 0; i < warnings.size(); i++) {
-			Message m = (Message) warnings.get(i);
+			Message m = warnings.get(i);
 			if ( m instanceof GrammarInsufficientPredicatesMessage ) {
 				return (GrammarInsufficientPredicatesMessage)m;
 			}
@@ -919,7 +922,7 @@
 	}
 
 	protected String str(int[] elements) {
-		StringBuffer buf = new StringBuffer();
+		StringBuilder buf = new StringBuilder();
 		for (int i = 0; i < elements.length; i++) {
 			if ( i>0 ) {
 				buf.append(", ");
diff --git a/tool/src/test/java/org/antlr/test/TestSets.java b/tool/src/test/java/org/antlr/test/TestSets.java
index 6f21bd3..8a57af2 100644
--- a/tool/src/test/java/org/antlr/test/TestSets.java
+++ b/tool/src/test/java/org/antlr/test/TestSets.java
@@ -29,6 +29,8 @@
 
 import org.junit.Test;
 
+import static org.junit.Assert.*;
+
 /** Test the set stuff in lexer and parser */
 public class TestSets extends BaseTest {
 	protected boolean debug = false;
diff --git a/tool/src/test/java/org/antlr/test/TestSymbolDefinitions.java b/tool/src/test/java/org/antlr/test/TestSymbolDefinitions.java
index dcf87b9..43bf93e 100644
--- a/tool/src/test/java/org/antlr/test/TestSymbolDefinitions.java
+++ b/tool/src/test/java/org/antlr/test/TestSymbolDefinitions.java
@@ -36,6 +36,8 @@
 
 import java.util.*;
 
+import static org.junit.Assert.*;
+
 public class TestSymbolDefinitions extends BaseTest {
 
 	/** Public default constructor used by TestRig */
@@ -176,7 +178,7 @@
 		Grammar g = new Grammar(
 				"grammar t;\n"+
 				"a : '\\n';\n");
-		Set literals = g.getStringLiterals();
+		Set<String> literals = g.getStringLiterals();
 		// must store literals how they appear in the antlr grammar
 		assertEquals("'\\n'", literals.toArray()[0]);
 	}
@@ -842,18 +844,18 @@
 		// make sure expected += labels are there
 		Rule r = g.getRule(ruleName);
 		StringTokenizer st = new StringTokenizer(tokenLabelsStr, ", ");
-		Set tokenLabels = null;
+		Set<String> tokenLabels = null;
 		while ( st.hasMoreTokens() ) {
 			if ( tokenLabels==null ) {
-				tokenLabels = new HashSet();
+				tokenLabels = new HashSet<String>();
 			}
 			String labelName = st.nextToken();
 			tokenLabels.add(labelName);
 		}
-		Set ruleLabels = null;
+		Set<String> ruleLabels = null;
 		if ( ruleLabelsStr!=null ) {
 			st = new StringTokenizer(ruleLabelsStr, ", ");
-			ruleLabels = new HashSet();
+			ruleLabels = new HashSet<String>();
 			while ( st.hasMoreTokens() ) {
 				String labelName = st.nextToken();
 				ruleLabels.add(labelName);
@@ -878,7 +880,7 @@
 								String tokensStr)
 		throws Exception
 	{
-		Set tokens = g.getTokenDisplayNames();
+		Set<String> tokens = g.getTokenDisplayNames();
 
 		// make sure expected tokens are there
 		StringTokenizer st = new StringTokenizer(tokensStr, ", ");
@@ -889,8 +891,7 @@
 			tokens.remove(tokenName);
 		}
 		// make sure there are not any others (other than <EOF> etc...)
-		for (Iterator iter = tokens.iterator(); iter.hasNext();) {
-			String tokenName = (String) iter.next();
+		for (String tokenName : tokens) {
 			assertTrue("unexpected token name "+tokenName,
 					   g.getTokenType(tokenName)<Label.MIN_TOKEN_TYPE);
 		}
@@ -903,7 +904,7 @@
 			assertNotNull("rule "+ruleName+" expected", g.getRule(ruleName));
 			n++;
 		}
-		Collection rules = g.getRules();
+		Collection<Rule> rules = g.getRules();
 		//System.out.println("rules="+rules);
 		// make sure there are no extra rules
 		assertEquals("number of rules mismatch; expecting "+n+"; found "+rules.size(), n, rules.size());
diff --git a/tool/src/test/java/org/antlr/test/TestSyntacticPredicateEvaluation.java b/tool/src/test/java/org/antlr/test/TestSyntacticPredicateEvaluation.java
index 9080726..894ffa3 100644
--- a/tool/src/test/java/org/antlr/test/TestSyntacticPredicateEvaluation.java
+++ b/tool/src/test/java/org/antlr/test/TestSyntacticPredicateEvaluation.java
@@ -29,6 +29,8 @@
 
 import org.junit.Test;
 
+import static org.junit.Assert.*;
+
 public class TestSyntacticPredicateEvaluation extends BaseTest {
 	@Test public void testTwoPredsWithNakedAlt() throws Exception {
 		String grammar =
diff --git a/tool/src/test/java/org/antlr/test/TestSyntaxErrors.java b/tool/src/test/java/org/antlr/test/TestSyntaxErrors.java
index 31ad9f2..9e391e5 100644
--- a/tool/src/test/java/org/antlr/test/TestSyntaxErrors.java
+++ b/tool/src/test/java/org/antlr/test/TestSyntaxErrors.java
@@ -28,8 +28,13 @@
 
 package org.antlr.test;
 
+import org.antlr.tool.ErrorManager;
 import org.junit.Test;
 
+import static org.junit.Assert.*;
+
+import java.io.File;
+
 /** test runtime parse errors */
 public class TestSyntaxErrors extends BaseTest {
 	@Test public void testLL2() throws Exception {
@@ -84,7 +89,7 @@
 			"  ;\n";
 		System.out.println(grammar);
 		String found = execParser("T.g", grammar, "TParser", "TLexer", "a", "((i))z", false);
-		String expecting = "line 1:0 no viable alternative at input '('\n";
+		String expecting = "line 1:1 no viable alternative at input '('\n";
 		String result = stderrDuringParse;
 		assertEquals(expecting, result);
 	}
@@ -109,4 +114,52 @@
 		String expecting = "{HARDWARE,SOFTWARE}\n";
 		assertEquals(expecting, result);
 	}
+
+	@Test public void testStrayBracketRecovery() {
+		String grammar =
+			"grammar T;\n" +
+			"options {output = AST;}\n" +
+			"tokens{NODE;}\n" +
+			"s : a=ID INT -> ^(NODE[$a]] INT);\n" +
+			"ID: 'a'..'z'+;\n" +
+			"INT: '0'..'9'+;\n";
+
+		ErrorQueue errorQueue = new ErrorQueue();
+		ErrorManager.setErrorListener(errorQueue);
+
+		boolean found =
+			rawGenerateAndBuildRecognizer(
+				"T.g", grammar, "TParser", "TLexer", false);
+
+		assertFalse(found);
+		assertEquals(
+			"[error(100): :4:27: syntax error: antlr: dangling ']'? make sure to escape with \\]]",
+			errorQueue.errors.toString());
+	}
+
+	/**
+	 * This is a regression test for antlr/antlr3#61.
+	 * https://github.com/antlr/antlr3/issues/61
+	 */
+	@Test public void testMissingAttributeAccessPreventsCodeGeneration() throws Exception {
+		String grammar =
+			"grammar T;\n" +
+			"options {\n" +
+			"    backtrack = true; \n" +
+			"}\n" +
+			"// if b is rule ref, gens bad void x=null code\n" +
+			"a : x=b {Object o = $x; System.out.println(\"alt1\");}\n" +
+			"  | y=b\n" +
+			"  ;\n" +
+			"\n" +
+			"b : 'a' ;\n" ;
+
+		ErrorQueue errorQueue = new ErrorQueue();
+		ErrorManager.setErrorListener(errorQueue);
+		boolean success = rawGenerateAndBuildRecognizer("T.g", grammar, "TParser", "TLexer", false);
+		assertFalse(success);
+		assertEquals(
+			"[error(117): "+tmpdir.toString()+File.separatorChar+"T.g:6:9: missing attribute access on rule scope: x]",
+			errorQueue.errors.toString());
+	}
 }
diff --git a/tool/src/test/java/org/antlr/test/TestTemplates.java b/tool/src/test/java/org/antlr/test/TestTemplates.java
index 8026319..fd41c7a 100644
--- a/tool/src/test/java/org/antlr/test/TestTemplates.java
+++ b/tool/src/test/java/org/antlr/test/TestTemplates.java
@@ -40,6 +40,8 @@
 import org.antlr.tool.Message;
 import org.junit.Test;
 
+import static org.junit.Assert.*;
+
 /** Test templates in actions; %... shorthands */
 public class TestTemplates extends BaseTest {
 	private static final String LINE_SEP = System.getProperty("line.separator");
@@ -353,7 +355,7 @@
 		*/
 		Message foundMsg = null;
 		for (int i = 0; i < equeue.errors.size(); i++) {
-			Message m = (Message)equeue.errors.get(i);
+			Message m = equeue.errors.get(i);
 			if (m.msgID==expectedMessage.msgID ) {
 				foundMsg = m;
 			}
@@ -369,6 +371,6 @@
 
 	// S U P P O R T
 	private void assertNoErrors(ErrorQueue equeue) {
-		assertTrue("unexpected errors: "+equeue, equeue.errors.size()==0);
+		assertTrue("unexpected errors: "+equeue, equeue.errors.isEmpty());
 	}
 }
diff --git a/tool/src/test/java/org/antlr/test/TestTokenRewriteStream.java b/tool/src/test/java/org/antlr/test/TestTokenRewriteStream.java
index cc864ee..81a736b 100644
--- a/tool/src/test/java/org/antlr/test/TestTokenRewriteStream.java
+++ b/tool/src/test/java/org/antlr/test/TestTokenRewriteStream.java
@@ -34,6 +34,8 @@
 import org.antlr.tool.Interpreter;
 import org.junit.Test;
 
+import static org.junit.Assert.*;
+
 public class TestTokenRewriteStream extends BaseTest {
 
     /** Public default constructor used by TestRig */
diff --git a/tool/src/test/java/org/antlr/test/TestTopologicalSort.java b/tool/src/test/java/org/antlr/test/TestTopologicalSort.java
index 43ffbee..62cfebd 100644
--- a/tool/src/test/java/org/antlr/test/TestTopologicalSort.java
+++ b/tool/src/test/java/org/antlr/test/TestTopologicalSort.java
@@ -32,11 +32,13 @@
 
 import java.util.List;
 
+import static org.junit.Assert.*;
+
 /** Test topo sort in GraphNode. */
 public class TestTopologicalSort extends BaseTest {
     @Test
     public void testFairlyLargeGraph() throws Exception {
-        Graph g = new Graph();
+        Graph<String> g = new Graph<String>();
         g.addEdge("C", "F");
         g.addEdge("C", "G");
         g.addEdge("C", "A");
@@ -50,63 +52,63 @@
         g.addEdge("E", "F");
 
         String expecting = "[H, F, E, D, G, A, B, C]";
-        List nodes = g.sort();
+        List<String> nodes = g.sort();
         String result = nodes.toString();
         assertEquals(expecting, result);
     }
 
     @Test
     public void testCyclicGraph() throws Exception {
-        Graph g = new Graph();
+        Graph<String> g = new Graph<String>();
         g.addEdge("A", "B");
         g.addEdge("B", "C");
         g.addEdge("C", "A");
         g.addEdge("C", "D");
 
         String expecting = "[D, C, B, A]";
-        List nodes = g.sort();
+        List<String> nodes = g.sort();
         String result = nodes.toString();
         assertEquals(expecting, result);
     }
 
     @Test
     public void testRepeatedEdges() throws Exception {
-        Graph g = new Graph();
+        Graph<String> g = new Graph<String>();
         g.addEdge("A", "B");
         g.addEdge("B", "C");
         g.addEdge("A", "B"); // dup
         g.addEdge("C", "D");
 
         String expecting = "[D, C, B, A]";
-        List nodes = g.sort();
+        List<String> nodes = g.sort();
         String result = nodes.toString();
         assertEquals(expecting, result);
     }
 
     @Test
     public void testSimpleTokenDependence() throws Exception {
-        Graph g = new Graph();
+        Graph<String> g = new Graph<String>();
         g.addEdge("Java.g", "MyJava.tokens"); // Java feeds off manual token file
         g.addEdge("Java.tokens", "Java.g");        
         g.addEdge("Def.g", "Java.tokens");    // walkers feed off generated tokens
         g.addEdge("Ref.g", "Java.tokens");
 
         String expecting = "[MyJava.tokens, Java.g, Java.tokens, Ref.g, Def.g]";
-        List nodes = g.sort();
+        List<String> nodes = g.sort();
         String result = nodes.toString();
         assertEquals(expecting, result);
     }
 
     @Test
     public void testParserLexerCombo() throws Exception {
-        Graph g = new Graph();
+        Graph<String> g = new Graph<String>();
         g.addEdge("JavaLexer.tokens", "JavaLexer.g");
         g.addEdge("JavaParser.g", "JavaLexer.tokens");
         g.addEdge("Def.g", "JavaLexer.tokens");
         g.addEdge("Ref.g", "JavaLexer.tokens");
 
         String expecting = "[JavaLexer.g, JavaLexer.tokens, JavaParser.g, Ref.g, Def.g]";
-        List nodes = g.sort();
+        List<String> nodes = g.sort();
         String result = nodes.toString();
         assertEquals(expecting, result);
     }
diff --git a/tool/src/test/java/org/antlr/test/TestTreeGrammarRewriteAST.java b/tool/src/test/java/org/antlr/test/TestTreeGrammarRewriteAST.java
index 518e48a..746fddc 100644
--- a/tool/src/test/java/org/antlr/test/TestTreeGrammarRewriteAST.java
+++ b/tool/src/test/java/org/antlr/test/TestTreeGrammarRewriteAST.java
@@ -33,9 +33,10 @@
 import org.antlr.tool.ErrorManager;
 import org.antlr.tool.Grammar;
 import org.antlr.tool.GrammarSyntaxMessage;
-import org.junit.Ignore;
 import org.junit.Test;
 
+import static org.junit.Assert.*;
+
 /** Tree rewrites in tree parsers are basically identical to rewrites
  *  in a normal grammar except that the atomic element is a node not
  *  a Token.  Tests here ensure duplication of nodes occurs properly
@@ -870,7 +871,6 @@
         assertEquals("(12 (abc 34))\n", found);
     }
 
-    @Ignore
     @Test public void testRewriteOfRuleRefRootListLabeled() throws Exception {
         String grammar =
             "grammar T;\n" +
diff --git a/tool/src/test/java/org/antlr/test/TestTreeIterator.java b/tool/src/test/java/org/antlr/test/TestTreeIterator.java
index 33bfb2d..0803bc3 100644
--- a/tool/src/test/java/org/antlr/test/TestTreeIterator.java
+++ b/tool/src/test/java/org/antlr/test/TestTreeIterator.java
@@ -30,7 +30,7 @@
 import org.antlr.runtime.tree.*;
 import org.junit.Test;
 
-import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.*;
 
 public class TestTreeIterator {
     static final String[] tokens = new String[] {
diff --git a/tool/src/test/java/org/antlr/test/TestTreeNodeStream.java b/tool/src/test/java/org/antlr/test/TestTreeNodeStream.java
index 747fc3a..f0ddcd1 100644
--- a/tool/src/test/java/org/antlr/test/TestTreeNodeStream.java
+++ b/tool/src/test/java/org/antlr/test/TestTreeNodeStream.java
@@ -32,6 +32,8 @@
 import org.antlr.runtime.tree.*;
 import org.junit.Test;
 
+import static org.junit.Assert.*;
+
 /** Test the tree node stream. */
 public class TestTreeNodeStream extends BaseTest {
 
@@ -359,7 +361,7 @@
 
 	public String toNodesOnlyString(TreeNodeStream nodes) {
         TreeAdaptor adaptor = nodes.getTreeAdaptor();
-		StringBuffer buf = new StringBuffer();
+		StringBuilder buf = new StringBuilder();
         Object o = nodes.LT(1);
         int type = adaptor.getType(o);
         while ( o!=null && type!=Token.EOF ) {
diff --git a/tool/src/test/java/org/antlr/test/TestTreeParsing.java b/tool/src/test/java/org/antlr/test/TestTreeParsing.java
index 9664dcb..4e81ebb 100644
--- a/tool/src/test/java/org/antlr/test/TestTreeParsing.java
+++ b/tool/src/test/java/org/antlr/test/TestTreeParsing.java
@@ -29,6 +29,8 @@
 
 import org.junit.Test;
 
+import static org.junit.Assert.*;
+
 public class TestTreeParsing extends BaseTest {
 	@Test public void testFlatList() throws Exception {
 		String grammar =
diff --git a/tool/src/test/java/org/antlr/test/TestTreeWizard.java b/tool/src/test/java/org/antlr/test/TestTreeWizard.java
index 3f2bd1b..dc52f64 100644
--- a/tool/src/test/java/org/antlr/test/TestTreeWizard.java
+++ b/tool/src/test/java/org/antlr/test/TestTreeWizard.java
@@ -38,6 +38,7 @@
 import java.util.List;
 import java.util.Map;
 
+import static org.junit.Assert.*;
 
 public class TestTreeWizard extends BaseTest {
 	protected static final String[] tokens =
@@ -87,7 +88,7 @@
 	@Test public void testInvalidListTree() throws Exception {
 		TreeWizard wiz = new TreeWizard(adaptor, tokens);
 		CommonTree t = (CommonTree)wiz.create("A B C");
-		assertTrue(t==null);
+		assertNull(t);
 	}
 
 	@Test public void testDoubleLevelTree() throws Exception {
@@ -101,7 +102,7 @@
 	@Test public void testSingleNodeIndex() throws Exception {
 		TreeWizard wiz = new TreeWizard(adaptor, tokens);
 		CommonTree t = (CommonTree)wiz.create("ID");
-		Map m = wiz.index(t);
+		Map<Integer, List<Object>> m = wiz.index(t);
 		String found = m.toString();
 		String expecting = "{10=[ID]}";
 		assertEquals(expecting, found);
@@ -110,7 +111,7 @@
 	@Test public void testNoRepeatsIndex() throws Exception {
 		TreeWizard wiz = new TreeWizard(adaptor, tokens);
 		CommonTree t = (CommonTree)wiz.create("(A B C D)");
-		Map m = wiz.index(t);
+		Map<Integer, List<Object>> m = wiz.index(t);
 		String found = sortMapToString(m);
         String expecting = "{5=[A], 6=[B], 7=[C], 8=[D]}";
 		assertEquals(expecting, found);
@@ -119,7 +120,7 @@
 	@Test public void testRepeatsIndex() throws Exception {
 		TreeWizard wiz = new TreeWizard(adaptor, tokens);
 		CommonTree t = (CommonTree)wiz.create("(A B (A C B) B D D)");
-		Map m = wiz.index(t);
+		Map<Integer, List<Object>> m = wiz.index(t);
 		String found =  sortMapToString(m);
         String expecting = "{5=[A, A], 6=[B, B, B], 7=[C], 8=[D, D]}";
 		assertEquals(expecting, found);
@@ -128,8 +129,9 @@
 	@Test public void testNoRepeatsVisit() throws Exception {
 		TreeWizard wiz = new TreeWizard(adaptor, tokens);
 		CommonTree t = (CommonTree)wiz.create("(A B C D)");
-		final List elements = new ArrayList();
+		final List<Object> elements = new ArrayList<Object>();
 		wiz.visit(t, wiz.getTokenType("B"), new TreeWizard.Visitor() {
+			@Override
 			public void visit(Object t) {
 				elements.add(t);
 			}
@@ -142,9 +144,10 @@
 	@Test public void testNoRepeatsVisit2() throws Exception {
 		TreeWizard wiz = new TreeWizard(adaptor, tokens);
 		CommonTree t = (CommonTree)wiz.create("(A B (A C B) B D D)");
-		final List elements = new ArrayList();
+		final List<Object> elements = new ArrayList<Object>();
 		wiz.visit(t, wiz.getTokenType("C"),
 					   new TreeWizard.Visitor() {
+							@Override
 							public void visit(Object t) {
 								elements.add(t);
 							}
@@ -157,9 +160,10 @@
 	@Test public void testRepeatsVisit() throws Exception {
 		TreeWizard wiz = new TreeWizard(adaptor, tokens);
 		CommonTree t = (CommonTree)wiz.create("(A B (A C B) B D D)");
-		final List elements = new ArrayList();
+		final List<Object> elements = new ArrayList<Object>();
 		wiz.visit(t, wiz.getTokenType("B"),
 					   new TreeWizard.Visitor() {
+							@Override
 							public void visit(Object t) {
 								elements.add(t);
 							}
@@ -172,9 +176,10 @@
 	@Test public void testRepeatsVisit2() throws Exception {
 		TreeWizard wiz = new TreeWizard(adaptor, tokens);
 		CommonTree t = (CommonTree)wiz.create("(A B (A C B) B D D)");
-		final List elements = new ArrayList();
+		final List<Object> elements = new ArrayList<Object>();
 		wiz.visit(t, wiz.getTokenType("A"),
 					   new TreeWizard.Visitor() {
+							@Override
 							public void visit(Object t) {
 								elements.add(t);
 							}
@@ -187,10 +192,11 @@
 	@Test public void testRepeatsVisitWithContext() throws Exception {
 		TreeWizard wiz = new TreeWizard(adaptor, tokens);
 		CommonTree t = (CommonTree)wiz.create("(A B (A C B) B D D)");
-		final List elements = new ArrayList();
+		final List<String> elements = new ArrayList<String>();
 		wiz.visit(t, wiz.getTokenType("B"),
 		   new TreeWizard.ContextVisitor() {
-			   public void visit(Object t, Object parent, int childIndex, Map labels) {
+			   @Override
+			   public void visit(Object t, Object parent, int childIndex, Map<String, Object> labels) {
 				   elements.add(adaptor.getText(t)+"@"+
 								(parent!=null?adaptor.getText(parent):"nil")+
 								"["+childIndex+"]");
@@ -204,10 +210,11 @@
 	@Test public void testRepeatsVisitWithNullParentAndContext() throws Exception {
 		TreeWizard wiz = new TreeWizard(adaptor, tokens);
 		CommonTree t = (CommonTree)wiz.create("(A B (A C B) B D D)");
-		final List elements = new ArrayList();
+		final List<String> elements = new ArrayList<String>();
 		wiz.visit(t, wiz.getTokenType("A"),
 		   new TreeWizard.ContextVisitor() {
-			   public void visit(Object t, Object parent, int childIndex, Map labels) {
+			   @Override
+			   public void visit(Object t, Object parent, int childIndex, Map<String, Object> labels) {
 				   elements.add(adaptor.getText(t)+"@"+
 								(parent!=null?adaptor.getText(parent):"nil")+
 								"["+childIndex+"]");
@@ -221,9 +228,10 @@
 	@Test public void testVisitPattern() throws Exception {
 		TreeWizard wiz = new TreeWizard(adaptor, tokens);
 		CommonTree t = (CommonTree)wiz.create("(A B C (A B) D)");
-		final List elements = new ArrayList();
+		final List<Object> elements = new ArrayList<Object>();
 		wiz.visit(t, "(A B)",
 					   new TreeWizard.Visitor() {
+							@Override
 							public void visit(Object t) {
 								elements.add(t);
 							}
@@ -236,10 +244,11 @@
 	@Test public void testVisitPatternMultiple() throws Exception {
 		TreeWizard wiz = new TreeWizard(adaptor, tokens);
 		CommonTree t = (CommonTree)wiz.create("(A B C (A B) (D (A B)))");
-		final List elements = new ArrayList();
+		final List<String> elements = new ArrayList<String>();
 		wiz.visit(t, "(A B)",
 					   new TreeWizard.ContextVisitor() {
-						   public void visit(Object t, Object parent, int childIndex, Map labels) {
+						   @Override
+						   public void visit(Object t, Object parent, int childIndex, Map<String, Object> labels) {
 							   elements.add(adaptor.getText(t)+"@"+
 											(parent!=null?adaptor.getText(parent):"nil")+
 											"["+childIndex+"]");
@@ -253,10 +262,11 @@
 	@Test public void testVisitPatternMultipleWithLabels() throws Exception {
 		TreeWizard wiz = new TreeWizard(adaptor, tokens);
 		CommonTree t = (CommonTree)wiz.create("(A B C (A[foo] B[bar]) (D (A[big] B[dog])))");
-		final List elements = new ArrayList();
+		final List<String> elements = new ArrayList<String>();
 		wiz.visit(t, "(%a:A %b:B)",
 					   new TreeWizard.ContextVisitor() {
-						   public void visit(Object t, Object parent, int childIndex, Map labels) {
+						   @Override
+						   public void visit(Object t, Object parent, int childIndex, Map<String, Object> labels) {
 							   elements.add(adaptor.getText(t)+"@"+
 											(parent!=null?adaptor.getText(parent):"nil")+
 											"["+childIndex+"]"+labels.get("a")+"&"+labels.get("b"));
@@ -323,7 +333,7 @@
 	@Test public void testParseLabels() throws Exception {
 		TreeWizard wiz = new TreeWizard(adaptor, tokens);
 		CommonTree t = (CommonTree)wiz.create("(A B C)");
-		Map labels = new HashMap();
+		Map<String, Object> labels = new HashMap<String, Object>();
 		boolean valid = wiz.parse(t, "(%a:A %b:B %c:C)", labels);
 		assertTrue(valid);
 		assertEquals("A", labels.get("a").toString());
@@ -334,7 +344,7 @@
 	@Test public void testParseWithWildcardLabels() throws Exception {
 		TreeWizard wiz = new TreeWizard(adaptor, tokens);
 		CommonTree t = (CommonTree)wiz.create("(A B C)");
-		Map labels = new HashMap();
+		Map<String, Object> labels = new HashMap<String, Object>();
 		boolean valid = wiz.parse(t, "(A %b:. %c:.)", labels);
 		assertTrue(valid);
 		assertEquals("B", labels.get("b").toString());
@@ -344,7 +354,7 @@
 	@Test public void testParseLabelsAndTestText() throws Exception {
 		TreeWizard wiz = new TreeWizard(adaptor, tokens);
 		CommonTree t = (CommonTree)wiz.create("(A B[foo] C)");
-		Map labels = new HashMap();
+		Map<String, Object> labels = new HashMap<String, Object>();
 		boolean valid = wiz.parse(t, "(%a:A %b:B[foo] %c:C)", labels);
 		assertTrue(valid);
 		assertEquals("A", labels.get("a").toString());
@@ -355,7 +365,7 @@
 	@Test public void testParseLabelsInNestedTree() throws Exception {
 		TreeWizard wiz = new TreeWizard(adaptor, tokens);
 		CommonTree t = (CommonTree)wiz.create("(A (B C) (D E))");
-		Map labels = new HashMap();
+		Map<String, Object> labels = new HashMap<String, Object>();
 		boolean valid = wiz.parse(t, "(%a:A (%b:B %c:C) (%d:D %e:E) )", labels);
 		assertTrue(valid);
 		assertEquals("A", labels.get("a").toString());
@@ -392,8 +402,8 @@
 	@Test public void testFindPattern() throws Exception {
 		TreeWizard wiz = new TreeWizard(adaptor, tokens);
 		CommonTree t = (CommonTree)wiz.create("(A B C (A[foo] B[bar]) (D (A[big] B[dog])))");
-		final List subtrees = wiz.find(t, "(A B)");
-		List elements = subtrees;
+		final List<? extends Object> subtrees = wiz.find(t, "(A B)");
+		List<? extends Object> elements = subtrees;
 		String found = elements.toString();
 		String expecting = "[foo, big]";
 		assertEquals(expecting, found);
diff --git a/tool/src/test/java/org/antlr/test/TestTrees.java b/tool/src/test/java/org/antlr/test/TestTrees.java
index ad3e479..0dd54b4 100644
--- a/tool/src/test/java/org/antlr/test/TestTrees.java
+++ b/tool/src/test/java/org/antlr/test/TestTrees.java
@@ -35,6 +35,8 @@
 import org.antlr.runtime.tree.TreeAdaptor;
 import org.junit.Test;
 
+import static org.junit.Assert.*;
+
 public class TestTrees extends BaseTest {
 	TreeAdaptor adaptor = new CommonTreeAdaptor();
 	protected boolean debug = false;
@@ -44,6 +46,7 @@
 		public V(Token t) { this.token = t;}
 		public V(int ttype, int x) { this.x=x; token=new CommonToken(ttype); }
 		public V(int ttype, Token t, int x) { token=t; this.x=x;}
+		@Override
 		public String toString() { return (token!=null?token.getText():"")+"<V>";}
 	}
 
@@ -235,17 +238,11 @@
 
 	// Test replaceChildren
 
-	@Test public void testReplaceWithNoChildren() throws Exception {
+	@Test(expected = IllegalArgumentException.class)
+	public void testReplaceWithNoChildren() throws Exception {
 		CommonTree t = new CommonTree(new CommonToken(101));
 		CommonTree newChild = new CommonTree(new CommonToken(5));
-		boolean error = false;
-		try {
-			t.replaceChildren(0, 0, newChild);
-		}
-		catch (IllegalArgumentException iae) {
-			error = true;
-		}
-		assertTrue(error);
+		t.replaceChildren(0, 0, newChild);
 	}
 
 	@Test public void testReplaceWithOneChildren() throws Exception {
